Merge "Revert "Do not encode "'" as %27 (redirect loop in Opera 12)""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 10 Sep 2015 15:36:10 +0000 (15:36 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 10 Sep 2015 15:36:10 +0000 (15:36 +0000)
237 files changed:
.jscsrc
.travis.yml
RELEASE-NOTES-1.26
composer.json
includes/GlobalFunctions.php
includes/Hooks.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/OutputPage.php
includes/User.php
includes/ZhConversion.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiResult.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fi.json
includes/api/i18n/he.json
includes/api/i18n/ja.json
includes/api/i18n/ksh.json
includes/api/i18n/mr.json [new file with mode: 0644]
includes/api/i18n/qqq.json
includes/api/i18n/sq.json
includes/api/i18n/zh-hans.json
includes/changes/EnhancedChangesList.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/monolog/LineFormatter.php
includes/exception/MWExceptionHandler.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLForm.php
includes/installer/i18n/it.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/sq.json
includes/media/Bitmap.php
includes/media/DjVuImage.php
includes/media/SVGMetadataExtractor.php
includes/media/XMPInfo.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/specials/SpecialListusers.php
includes/specials/SpecialResetTokens.php
includes/specials/SpecialUserlogin.php
languages/Language.php
languages/i18n/af.json
languages/i18n/an.json
languages/i18n/arz.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bho.json
languages/i18n/ca.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/dty.json
languages/i18n/egl.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gsw.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/kn.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/mk.json
languages/i18n/mr.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zh-tw.json
languages/messages/MessagesKo.php
maintenance/interwiki.list
maintenance/interwiki.sql
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/namespaceDupes.php
resources/Resources.php
resources/lib/oojs-ui/i18n/ar.json
resources/lib/oojs-ui/i18n/ast.json
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/es.json
resources/lib/oojs-ui/i18n/et.json
resources/lib/oojs-ui/i18n/eu.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/gl.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/km.json
resources/lib/oojs-ui/i18n/ksh.json
resources/lib/oojs-ui/i18n/lb.json
resources/lib/oojs-ui/i18n/lt.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/ps.json
resources/lib/oojs-ui/i18n/ro.json
resources/lib/oojs-ui/i18n/roa-tara.json
resources/lib/oojs-ui/i18n/ru.json
resources/lib/oojs-ui/i18n/sv.json
resources/lib/oojs-ui/i18n/uk.json
resources/lib/oojs-ui/i18n/vec.json
resources/lib/oojs-ui/i18n/zh-hans.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bright.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfBright.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/moon.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notBright.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.farbtastic.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.localize.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.spinner.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.api/mediawiki.api.edit.js
resources/src/mediawiki.api/mediawiki.api.login.js
resources/src/mediawiki.api/mediawiki.api.upload.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/images/question.png [deleted file]
resources/src/mediawiki.legacy/images/question.svg [deleted file]
resources/src/mediawiki.legacy/protect.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.page/mediawiki.page.gallery.js
resources/src/mediawiki.special/mediawiki.special.changeemail.js
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js [deleted file]
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less
resources/src/mediawiki/images/question.png [new file with mode: 0644]
resources/src/mediawiki/images/question.svg [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.Upload.Dialog.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.confirmCloseWindow.js
resources/src/mediawiki/mediawiki.errorLogger.js
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.htmlform.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.htmlform.js
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.util.js
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/helpers/WellProtectedClass.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/TestingAccessWrapper.php
tests/phpunit/includes/TestingAccessWrapperTest.php
tests/phpunit/includes/api/ApiResultTest.php
tests/phpunit/includes/debug/logger/monolog/LineFormatterTest.php
tests/phpunit/includes/parser/MediaWikiParserTest.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
tests/qunit/suites/resources/jquery/jquery.localize.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js

diff --git a/.jscsrc b/.jscsrc
index 70a404b..aaa876c 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -1,11 +1,16 @@
 {
        "preset": "wikimedia",
+       "es3": true,
 
-       "disallowQuotedKeysInObjects": null,
        "requireVarDeclFirst": null,
-       "jsDoc": null,
 
+       "disallowQuotedKeysInObjects": "allButReserved",
        "requireDotNotation": { "allExcept": [ "keywords" ] },
+       "jsDoc": {
+               "requireNewlineAfterDescription": true,
+               "requireParamTypes": true,
+               "requireReturnTypes": true
+       },
 
        "excludeFiles": [
                "docs/**",
index 512d735..8ba46b5 100644 (file)
@@ -8,19 +8,17 @@
 #
 language: php
 
-php:
-  - hhvm-nightly
-  - 5.3
-
-env:
-  - dbtype=mysql
-  - dbtype=postgres
-
-# TODO: Travis CI's hhvm does not support PostgreSQL at the moment.
 matrix:
-  exclude:
-    - php: hhvm-nightly
-      env: dbtype=postgres
+  fast_finish: true
+  include:
+    - env: dbtype=mysql
+      php: 5.3
+    - env: dbtype=postgres
+      php: 5.3
+    - env: dbtype=mysql
+      php: hhvm
+    - env: dbtype=mysql
+      php: 7
 
 services:
   - mysql
index ff7f884..12b973a 100644 (file)
@@ -105,6 +105,11 @@ production.
   sometimes being numerically-indexed objects with formatversion=2.
 * When errors about users being blocked are returned, they now include
   information about the relevant block.
+* (T99926) list=random has higher limits, in line with other API modules.
+* list=random's rnredirect parameter is deprecated in favor of a new
+  rnfilterredir parameter that also allows for listing both redirects and
+  non-redirects.
+* list=random now supports continuation.
 
 === Action API internal changes in 1.26 ===
 * New metadata item ApiResult::META_KVP_MERGE to allow for merging the KVP key
@@ -170,6 +175,9 @@ changes to languages because of Phabricator reports.
   a lengthy deprecation period.
 * The ScopedPHPTimeout class was removed.
 * Removed maintenance script fixSlaveDesync.php.
+* Watchlist tokens, SpecialResetTokens, and User::getTokenFromOption()
+  are deprecated. Applications using those can work via the OAuth
+  extension instead. New tokens types should not be added.
 
 == Compatibility ==
 
index fcf0464..1fe1e50 100644 (file)
                "leafo/lessphp": "0.5.0",
                "liuggio/statsd-php-client": "1.0.16",
                "mediawiki/at-ease": "1.0.0",
-               "oojs/oojs-ui": "0.12.7",
+               "oojs/oojs-ui": "0.12.8",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
-               "wikimedia/cdb": "1.0.1",
+               "wikimedia/cdb": "1.3.0",
                "wikimedia/composer-merge-plugin": "1.2.1",
                "wikimedia/ip-set": "1.0.1",
                "wikimedia/utfnormal": "1.0.3",
index b853d07..2852561 100644 (file)
@@ -2179,14 +2179,24 @@ function wfResetOutputBuffers( $resetGzipEncoding = true ) {
                $wgDisableOutputCompression = true;
        }
        while ( $status = ob_get_status() ) {
-               if ( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
-                       // Probably from zlib.output_compression or other
-                       // PHP-internal setting which can't be removed.
-                       //
+               if ( isset( $status['flags'] ) ) {
+                       $flags = PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_REMOVABLE;
+                       $deleteable = ( $status['flags'] & $flags ) === $flags;
+               } elseif ( isset( $status['del'] ) ) {
+                       $deleteable = $status['del'];
+               } else {
+                       // Guess that any PHP-internal setting can't be removed.
+                       $deleteable = $status['type'] !== 0; /* PHP_OUTPUT_HANDLER_INTERNAL */
+               }
+               if ( !$deleteable ) {
                        // Give up, and hope the result doesn't break
                        // output behavior.
                        break;
                }
+               if ( $status['name'] === 'MediaWikiTestCase::wfResetOutputBuffersBarrier' ) {
+                       // Unit testing barrier to prevent this function from breaking PHPUnit.
+                       break;
+               }
                if ( !ob_end_clean() ) {
                        // Could not remove output buffer handler; abort now
                        // to avoid getting in some kind of infinite loop.
index 036d65c..a414562 100644 (file)
@@ -231,22 +231,25 @@ class Hooks {
        }
 
        /**
-        * Handle PHP errors issued inside a hook. Catch errors that have to do with
-        * a function expecting a reference, and let all others pass through.
-        *
-        * This REALLY should be protected... but it's public for compatibility
+        * Handle PHP errors issued inside a hook. Catch errors that have to do
+        * with a function expecting a reference, and pass all others through to
+        * MWExceptionHandler::handleError() for default processing.
         *
         * @since 1.18
         *
         * @param int $errno Error number (unused)
         * @param string $errstr Error message
         * @throws MWHookException If the error has to do with the function signature
-        * @return bool Always returns false
+        * @return bool
         */
        public static function hookErrorHandler( $errno, $errstr ) {
                if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
                        throw new MWHookException( $errstr, $errno );
                }
-               return false;
+
+               // Delegate unhandled errors to the default MW handler
+               return call_user_func_array(
+                       'MWExceptionHandler::handleError', func_get_args()
+               );
        }
 }
index b2926d1..221cefb 100644 (file)
@@ -63,7 +63,15 @@ class HtmlFormatter {
         */
        public function getDoc() {
                if ( !$this->doc ) {
-                       $html = mb_convert_encoding( $this->html, 'HTML-ENTITIES', 'UTF-8' );
+                       // DOMDocument::loadHTML apparently isn't very good with encodings, so
+                       // convert input to ASCII by encoding everything above 128 as entities.
+                       if ( function_exists( 'mb_convert_encoding' ) ) {
+                               $html = mb_convert_encoding( $this->html, 'HTML-ENTITIES', 'UTF-8' );
+                       } else {
+                               $html = preg_replace_callback( '/[\x{80}-\x{10ffff}]/u', function ( $m ) {
+                                       return '&#' . UtfNormal\Utils::utf8ToCodepoint( $m[0] ) . ';';
+                               }, $this->html );
+                       }
 
                        // Workaround for bug that caused spaces before references
                        // to disappear during processing:
@@ -244,7 +252,14 @@ class HtmlFormatter {
                        ) );
                }
                $html = $replacements->replace( $html );
-               $html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
+
+               if ( function_exists( 'mb_convert_encoding' ) ) {
+                       // Just in case the conversion in getDoc() above used named
+                       // entities that aren't known to html_entity_decode().
+                       $html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
+               } else {
+                       $html = html_entity_decode( $html, ENT_COMPAT, 'utf-8' );
+               }
                return $html;
        }
 
index 1c79485..bc5a957 100644 (file)
@@ -855,6 +855,8 @@ class CurlHttpRequest extends MWHttpRequest {
 
 class PhpHttpRequest extends MWHttpRequest {
 
+       private $fopenErrors = array();
+
        /**
         * @param string $url
         * @return string
@@ -865,6 +867,60 @@ class PhpHttpRequest extends MWHttpRequest {
                return 'tcp://' . $parsedUrl['host'] . ':' . $parsedUrl['port'];
        }
 
+       /**
+        * Returns an array with a 'capath' or 'cafile' key that is suitable to be merged into the 'ssl' sub-array of a
+        * stream context options array. Uses the 'caInfo' option of the class if it is provided, otherwise uses the system
+        * default CA bundle if PHP supports that, or searches a few standard locations.
+        * @return array
+        * @throws DomainException
+        */
+       protected function getCertOptions() {
+               $certOptions = array();
+               $certLocations = array();
+               if ( $this->caInfo ) {
+                       $certLocations = array( 'manual' => $this->caInfo );
+               } elseif ( version_compare( PHP_VERSION, '5.6.0', '<' ) ) {
+                       // Default locations, based on
+                       // https://www.happyassassin.net/2015/01/12/a-note-about-ssltls-trusted-certificate-stores-and-platforms/
+                       // PHP 5.5 and older doesn't have any defaults, so we try to guess ourselves. PHP 5.6+ gets the CA location
+                       // from OpenSSL as long as it is not set manually, so we should leave capath/cafile empty there.
+                       $certLocations = array_filter( array(
+                               getenv( 'SSL_CERT_DIR' ),
+                               getenv( 'SSL_CERT_PATH' ),
+                               '/etc/pki/tls/certs/ca-bundle.crt', # Fedora et al
+                               '/etc/ssl/certs',  # Debian et al
+                               '/etc/pki/tls/certs/ca-bundle.trust.crt',
+                               '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem',
+                               '/System/Library/OpenSSL', # OSX
+                       ) );
+               }
+
+               foreach( $certLocations as $key => $cert ) {
+                       if ( is_dir( $cert ) ) {
+                               $certOptions['capath'] = $cert;
+                               break;
+                       } elseif ( is_file( $cert ) ) {
+                               $certOptions['cafile'] = $cert;
+                               break;
+                       } elseif ( $key === 'manual' ) {
+                               // fail more loudly if a cert path was manually configured and it is not valid
+                               throw new DomainException( "Invalid CA info passed: $cert" );
+                       }
+               }
+
+               return $certOptions;
+       }
+
+       /**
+        * Custom error handler for dealing with fopen() errors. fopen() tends to fire multiple errors in succession, and the last one
+        * is completely useless (something like "fopen: failed to open stream") so normal methods of handling errors programmatically
+        * like get_last_error() don't work.
+        */
+       public function errorHandler( $errno, $errstr ) {
+               $n = count( $this->fopenErrors ) + 1;
+               $this->fopenErrors += array( "errno$n" => $errno, "errstr$n" => $errstr );
+       }
+
        public function execute() {
 
                parent::execute();
@@ -926,13 +982,7 @@ class PhpHttpRequest extends MWHttpRequest {
                        }
                }
 
-               if ( is_dir( $this->caInfo ) ) {
-                       $options['ssl']['capath'] = $this->caInfo;
-               } elseif ( is_file( $this->caInfo ) ) {
-                       $options['ssl']['cafile'] = $this->caInfo;
-               } elseif ( $this->caInfo ) {
-                       throw new MWException( "Invalid CA info passed: {$this->caInfo}" );
-               }
+               $options['ssl'] += $this->getCertOptions();
 
                $context = stream_context_create( $options );
 
@@ -949,9 +999,10 @@ class PhpHttpRequest extends MWHttpRequest {
                }
                do {
                        $reqCount++;
-                       MediaWiki\suppressWarnings();
+                       $this->fopenErrors = array();
+                       set_error_handler( array( $this, 'errorHandler' ) );
                        $fh = fopen( $url, "r", false, $context );
-                       MediaWiki\restoreWarnings();
+                       restore_error_handler();
 
                        if ( !$fh ) {
                                // HACK for instant commons.
@@ -997,6 +1048,10 @@ class PhpHttpRequest extends MWHttpRequest {
                $this->setStatus();
 
                if ( $fh === false ) {
+                       if ( $this->fopenErrors ) {
+                               LoggerFactory::getInstance( 'http' )->warning( __CLASS__
+                                       . ': error opening connection: {errstr1}', $this->fopenErrors );
+                       }
                        $this->status->fatal( 'http-request-error' );
                        return $this->status;
                }
index 073762a..12651d7 100644 (file)
@@ -142,9 +142,6 @@ class OutputPage extends ContextSource {
        /** @var string Inline CSS styles. Use addInlineStyle() sparingly */
        protected $mInlineStyles = '';
 
-       /** @todo Unused? */
-       private $mLinkColours;
-
        /**
         * @var string Used by skin template.
         * Example: $tpl->set( 'displaytitle', $out->mPageLinkTitle );
@@ -2012,21 +2009,20 @@ class OutputPage extends ContextSource {
         * Add an HTTP header that will influence on the cache
         *
         * @param string $header Header name
-        * @param array|null $option
-        * @todo FIXME: Document the $option parameter; it appears to be for
-        *        X-Vary-Options but what format is acceptable?
+        * @param string[]|null $option Options for X-Vary-Options. Possible options are:
+        *  - "string-contains=$XXX" varies on whether the header value as a string
+        *    contains $XXX as a substring.
+        *  - "list-contains=$XXX" varies on whether the header value as a
+        *    comma-separated list contains $XXX as one of the list items.
         */
-       public function addVaryHeader( $header, $option = null ) {
+       public function addVaryHeader( $header, array $option = null ) {
                if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
-                       $this->mVaryHeader[$header] = (array)$option;
-               } elseif ( is_array( $option ) ) {
-                       if ( is_array( $this->mVaryHeader[$header] ) ) {
-                               $this->mVaryHeader[$header] = array_merge( $this->mVaryHeader[$header], $option );
-                       } else {
-                               $this->mVaryHeader[$header] = $option;
-                       }
+                       $this->mVaryHeader[$header] = array();
+               }
+               if ( !is_array( $option ) ) {
+                       $option = array();
                }
-               $this->mVaryHeader[$header] = array_unique( (array)$this->mVaryHeader[$header] );
+               $this->mVaryHeader[$header] = array_unique( array_merge( $this->mVaryHeader[$header], $option ) );
        }
 
        /**
index da8ff79..605dab6 100644 (file)
@@ -2438,6 +2438,7 @@ class User implements IDBAccessObject {
         */
        public function setInternalPassword( $str ) {
                $this->setToken();
+               $this->setOption( 'watchlisttoken', false );
 
                $passwordFactory = self::getPasswordFactory();
                $this->mPassword = $passwordFactory->newFromPlaintext( $str );
@@ -2715,20 +2716,24 @@ class User implements IDBAccessObject {
         * @return string|bool User's current value for the option, or false if this option is disabled.
         * @see resetTokenFromOption()
         * @see getOption()
+        * @deprecated 1.26 Applications should use the OAuth extension
         */
        public function getTokenFromOption( $oname ) {
                global $wgHiddenPrefs;
-               if ( in_array( $oname, $wgHiddenPrefs ) ) {
+
+               $id = $this->getId();
+               if ( !$id || in_array( $oname, $wgHiddenPrefs ) ) {
                        return false;
                }
 
                $token = $this->getOption( $oname );
                if ( !$token ) {
-                       $token = $this->resetTokenFromOption( $oname );
-                       if ( !wfReadOnly() ) {
-                               $this->saveSettings();
-                       }
+                       // Default to a value based on the user token to avoid space
+                       // wasted on storing tokens for all users. When this option
+                       // is set manually by the user, only then is it stored.
+                       $token = hash_hmac( 'sha1', "$oname:$id", $this->getToken() );
                }
+
                return $token;
        }
 
index 31806b7..893ae04 100644 (file)
@@ -3074,7 +3074,7 @@ $zh2Hant = array(
 '9只' => '9隻',
 '9余' => '9餘',
 '·范' => '·范',
-'’s ' => '’s',
+'’s' => '’s',
 '、面点' => '、麵點',
 '。个中' => '。箇中',
 '〇周后' => '〇周後',
@@ -3201,21 +3201,6 @@ $zh2Hant = array(
 '不好干预' => '不好干預',
 '不嫌母丑' => '不嫌母醜',
 '不寒而栗' => '不寒而慄',
-'不干事' => '不干事',
-'不干他' => '不干他',
-'不干休' => '不干休',
-'不干你' => '不干你',
-'不干她' => '不干她',
-'不干它' => '不干它',
-'不干我' => '不干我',
-'不干扰' => '不干擾',
-'不干擾' => '不干擾',
-'不干涉' => '不干涉',
-'不干牠' => '不干牠',
-'不干犯' => '不干犯',
-'不干預' => '不干預',
-'不干预' => '不干預',
-'不干' => '不幹',
 '不吊' => '不弔',
 '不卷' => '不捲',
 '不采' => '不採',
@@ -3795,7 +3780,6 @@ $zh2Hant = array(
 '佛罗棱萨' => '佛羅稜薩',
 '佛钟' => '佛鐘',
 '作品里' => '作品裡',
-'作奸犯科' => '作姦犯科',
 '作准' => '作準',
 '你夸' => '你誇',
 '佣金' => '佣金',
@@ -4219,6 +4203,7 @@ $zh2Hant = array(
 '千钧一发' => '千鈞一髮',
 '千只' => '千隻',
 '千余' => '千餘',
+'升高后' => '升高後',
 '半制品' => '半制品',
 '半只可' => '半只可',
 '半只够' => '半只夠',
@@ -4422,6 +4407,7 @@ $zh2Hant = array(
 '呼吁' => '呼籲',
 '命中注定' => '命中注定',
 '和奸' => '和姦',
+'和制汉' => '和製漢',
 '咎征' => '咎徵',
 '咕咕钟' => '咕咕鐘',
 '咪表' => '咪錶',
@@ -4591,9 +4577,12 @@ $zh2Hant = array(
 '墓志' => '墓誌',
 '增辟' => '增闢',
 '墨子里' => '墨子里',
+'墨斗' => '墨斗',
 '墨沈沈' => '墨沈沈',
 '墨沈' => '墨瀋',
 '垦辟' => '墾闢',
+'压制出' => '壓製出',
+'压制机' => '壓製機',
 '壮游' => '壯遊',
 '壮面' => '壯麵',
 '壹郁' => '壹鬱',
@@ -5720,6 +5709,7 @@ $zh2Hant = array(
 '采薇' => '採薇',
 '采薪' => '採薪',
 '采药' => '採藥',
+'采血' => '採血',
 '采行' => '採行',
 '采补' => '採補',
 '采访' => '採訪',
@@ -5746,6 +5736,7 @@ $zh2Hant = array(
 '提子干' => '提子乾',
 '提心吊胆' => '提心弔膽',
 '提摩太后书' => '提摩太後書',
+'提高后' => '提高後',
 '插于' => '插於',
 '换签' => '換籤',
 '换只' => '換隻',
@@ -5944,7 +5935,7 @@ $zh2Hant = array(
 '历始' => '曆始',
 '历室' => '曆室',
 '历尾' => '曆尾',
-'历数' => 'æ\9b\86æ\95¸',
+'历数书' => 'æ\9b\86æ\95¸æ\9b¸',
 '历日' => '曆日',
 '历书' => '曆書',
 '历本' => '曆本',
@@ -6005,6 +5996,7 @@ $zh2Hant = array(
 '望后石' => '望后石',
 '朝乾夕惕' => '朝乾夕惕',
 '朝钟' => '朝鐘',
+'朝鲜于' => '朝鮮於',
 '朦胧' => '朦朧',
 '蒙胧' => '朦朧',
 '木偶戏扎' => '木偶戲紮',
@@ -6305,6 +6297,8 @@ $zh2Hant = array(
 '洗发' => '洗髮',
 '洛钟东应' => '洛鐘東應',
 '洞里' => '洞裡',
+'洞里萨' => '洞里薩',
+'洞里薩' => '洞里薩',
 '泄欲' => '洩慾',
 '洪范' => '洪範',
 '洪谷子' => '洪谷子',
@@ -6376,7 +6370,6 @@ $zh2Hant = array(
 '渠冲' => '渠衝',
 '测不准' => '測不準',
 '港制' => '港製',
-'游牧民族' => '游牧民族',
 '游离' => '游離',
 '浑朴' => '渾樸',
 '浑个' => '渾箇',
@@ -6716,7 +6709,6 @@ $zh2Hant = array(
 '癸丑' => '癸丑',
 '发干' => '發乾',
 '发呆' => '發獃',
-'发蒙' => '發矇',
 '发签' => '發籤',
 '发松' => '發鬆',
 '发面' => '發麵',
@@ -6956,7 +6948,6 @@ $zh2Hant = array(
 '谷草' => '穀草',
 '谷贵饿农' => '穀貴餓農',
 '谷贱伤农' => '穀賤傷農',
-'谷道' => '穀道',
 '谷雨' => '穀雨',
 '谷类' => '穀類',
 '谷食' => '穀食',
@@ -7310,6 +7301,7 @@ $zh2Hant = array(
 '胜肽' => '胜肽',
 '胜键' => '胜鍵',
 '胡云' => '胡云',
+'胡子婴' => '胡子嬰',
 '胡子昂' => '胡子昂',
 '胡杰' => '胡杰',
 '胡朴安' => '胡樸安',
@@ -8959,6 +8951,7 @@ $zh2Hant = array(
 '体范' => '體範',
 '体系' => '體系',
 '高几' => '高几',
+'高后' => '高后',
 '高干扰' => '高干擾',
 '高干预' => '高干預',
 '高干' => '高幹',
@@ -9201,8 +9194,8 @@ $zh2Hant = array(
 '魔表' => '魔錶',
 '鱼干' => '魚乾',
 '鱼松' => '魚鬆',
-'鮮于樞' => '鮮于樞',
-'鲜于枢' => '鮮于樞',
+'鮮于' => '鮮于',
+'鲜于' => '鮮于',
 '鲸须' => '鯨鬚',
 '鳥栖' => '鳥栖',
 '鸟栖市' => '鳥栖市',
@@ -9299,6 +9292,7 @@ $zh2Hant = array(
 '黃杰' => '黃杰',
 '黄杰' => '黃杰',
 '黄历史' => '黃歷史',
+'黄白术' => '黃白術',
 '黃詩杰' => '黃詩杰',
 '黄诗杰' => '黃詩杰',
 '黄金表' => '黃金表',
@@ -13846,8 +13840,6 @@ $zh2TW = array(
 '掌上壓' => '伏地挺身',
 '伯明翰' => '伯明罕',
 '服务器' => '伺服器',
-'字節' => '位元組',
-'字节' => '位元組',
 '佛罗伦萨' => '佛羅倫斯',
 '操作系统' => '作業系統',
 '系数' => '係數',
@@ -14062,6 +14054,7 @@ $zh2TW = array(
 '戒烟' => '戒菸',
 '戒煙' => '戒菸',
 '戴克里先' => '戴克里先',
+'打印度' => '打印度',
 '抽烟' => '抽菸',
 '抽煙' => '抽菸',
 '拉普兰' => '拉布蘭',
@@ -14078,7 +14071,7 @@ $zh2TW = array(
 '搜索引擎' => '搜尋引擎',
 '摩根士丹利' => '摩根史坦利',
 '台球' => '撞球',
-'攻打印' => '攻打印',
+'攻打' => '攻打',
 '数字技术' => '數位技術',
 '數碼技術' => '數位技術',
 '数字照相机' => '數位照相機',
@@ -14129,6 +14122,7 @@ $zh2TW = array(
 '撒切尔' => '柴契爾',
 '格林納達' => '格瑞那達',
 '格林纳达' => '格瑞那達',
+'台式电脑' => '桌上型電腦',
 '乒乓' => '桌球',
 '乒乓球' => '桌球',
 '杆弟' => '桿弟',
@@ -14264,6 +14258,8 @@ $zh2TW = array(
 '弗吉尼亚' => '維吉尼亞',
 '佛得角' => '維德角',
 '维特根斯坦' => '維根斯坦',
+'網絡遊戲' => '網路遊戲',
+'网络游戏' => '網路遊戲',
 '互联网' => '網際網路',
 '互联网络' => '網際網路',
 '互聯網' => '網際網路',
@@ -14455,7 +14451,6 @@ $zh2TW = array(
 '链接' => '連結',
 '連結他' => '連結他',
 '进制' => '進位',
-'算子' => '運算元',
 '达·芬奇' => '達·文西',
 '达芬奇' => '達文西',
 '溫納圖萬' => '那杜',
@@ -15651,6 +15646,7 @@ $zh2HK = array(
 '扛著錄' => '扛著錄',
 '找不著' => '找不着',
 '找得著' => '找得着',
+'承宣布政' => '承宣布政',
 '抓著' => '抓着',
 '抓著作' => '抓著作',
 '抓著名' => '抓著名',
@@ -16001,6 +15997,7 @@ $zh2HK = array(
 '葛萊美獎' => '格林美獎',
 '格鲁吉亚' => '格魯吉亞',
 '框里' => '框裏',
+'台式电脑' => '桌上型電腦',
 '台球' => '桌球',
 '撞球' => '桌球',
 '梅鐸' => '梅鐸',
@@ -17174,6 +17171,8 @@ $zh2HK = array(
 '遇著述' => '遇著述',
 '遇著錄' => '遇著錄',
 '遍布' => '遍佈',
+'遍佈著' => '遍佈着',
+'遍布著' => '遍佈着',
 '過著' => '過着',
 '达·芬奇' => '達·文西',
 '达芬奇' => '達文西',
@@ -18023,6 +18022,7 @@ $zh2CN = array(
 '叫著稱' => '叫著称',
 '叫著者' => '叫著者',
 '叫著述' => '叫著述',
+'桌上型電腦' => '台式电脑',
 '撞球' => '台球',
 '台帳' => '台账',
 '叱吒' => '叱咤',
@@ -19937,6 +19937,8 @@ $zh2CN = array(
 '遇著稱' => '遇著称',
 '遇著者' => '遇著者',
 '遇著述' => '遇著述',
+'遍佈著' => '遍布着',
+'遍布著' => '遍布着',
 '部份' => '部分',
 '配合著' => '配合着',
 '配合著名' => '配合著名',
@@ -19982,6 +19984,7 @@ $zh2CN = array(
 '鋪著稱' => '铺著称',
 '鋪著者' => '铺著者',
 '鋪著述' => '铺著述',
+'鏈結' => '链接',
 '銷帳' => '销账',
 '鉲' => '锎',
 '鎝' => '锝',
index 4e4d2af..172ee99 100644 (file)
@@ -55,7 +55,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
 
                $result = $this->getResult();
                $pageSet = $this->getPageSet();
-               $titles = $pageSet->getTitles();
 
                // This module operates in two modes:
                // 'user': List deleted revs by a certain user
@@ -83,6 +82,21 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        }
                }
 
+               // If we're generating titles only, we can use DISTINCT for a better
+               // query. But we can't do that in 'user' mode (wrong index), and we can
+               // only do it when sorting ASC (because MySQL apparently can't use an
+               // index backwards for grouping even though it can for ORDER BY, WTF?)
+               $dir = $params['dir'];
+               $optimizeGenerateTitles = false;
+               if ( $mode === 'all' && $params['generatetitles'] && $resultPageSet !== null ) {
+                       if ( $dir === 'newer' ) {
+                               $optimizeGenerateTitles = true;
+                       } else {
+                               $p = $this->getModulePrefix();
+                               $this->setWarning( "For better performance when generating titles, set {$p}dir=newer" );
+                       }
+               }
+
                $this->addTables( 'archive' );
                if ( $resultPageSet === null ) {
                        $this->parseParameters( $params );
@@ -90,7 +104,12 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addFields( array( 'ar_title', 'ar_namespace' ) );
                } else {
                        $this->limit = $this->getParameter( 'limit' ) ?: 10;
-                       $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp', 'ar_rev_id', 'ar_id' ) );
+                       $this->addFields( array( 'ar_title', 'ar_namespace' ) );
+                       if ( $optimizeGenerateTitles ) {
+                               $this->addOption( 'DISTINCT' );
+                       } else {
+                               $this->addFields( array( 'ar_timestamp', 'ar_rev_id', 'ar_id' ) );
+                       }
                }
 
                if ( $this->fld_tags ) {
@@ -130,7 +149,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        }
                }
 
-               $dir = $params['dir'];
                $miser_ns = null;
 
                if ( $mode == 'all' ) {
@@ -229,7 +247,14 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                if ( !is_null( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $op = ( $dir == 'newer' ? '>' : '<' );
-                       if ( $mode == 'all' ) {
+                       if ( $optimizeGenerateTitles ) {
+                               $this->dieContinueUsageIf( count( $cont ) != 2 );
+                               $ns = intval( $cont[0] );
+                               $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
+                               $title = $db->addQuotes( $cont[1] );
+                               $this->addWhere( "ar_namespace $op $ns OR " .
+                                       "(ar_namespace = $ns AND ar_title $op= $title)" );
+                       } elseif ( $mode == 'all' ) {
                                $this->dieContinueUsageIf( count( $cont ) != 4 );
                                $ns = intval( $cont[0] );
                                $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
@@ -259,7 +284,13 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
 
                $sort = ( $dir == 'newer' ? '' : ' DESC' );
                $orderby = array();
-               if ( $mode == 'all' ) {
+               if ( $optimizeGenerateTitles ) {
+                       // Targeting index name_title_timestamp
+                       if ( $params['namespace'] === null || count( array_unique( $params['namespace'] ) ) > 1 ) {
+                               $orderby[] = "ar_namespace $sort";
+                       }
+                       $orderby[] = "ar_title $sort";
+               } elseif ( $mode == 'all' ) {
                        // Targeting index name_title_timestamp
                        if ( $params['namespace'] === null || count( array_unique( $params['namespace'] ) ) > 1 ) {
                                $orderby[] = "ar_namespace $sort";
@@ -283,7 +314,9 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                foreach ( $res as $row ) {
                        if ( ++$count > $this->limit ) {
                                // We've had enough
-                               if ( $mode == 'all' ) {
+                               if ( $optimizeGenerateTitles ) {
+                                       $this->setContinueEnumParameter( 'continue', "$row->ar_namespace|$row->ar_title" );
+                               } elseif ( $mode == 'all' ) {
                                        $this->setContinueEnumParameter( 'continue',
                                                "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
                                        );
index a2c2844..8e7031c 100644 (file)
@@ -31,8 +31,6 @@
  * @ingroup API
  */
 class ApiQueryRandom extends ApiQueryGeneratorBase {
-       private $pageIDs;
-
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rn' );
        }
@@ -46,102 +44,131 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param string $randstr
-        * @param int $limit
-        * @param int $namespace
-        * @param ApiPageSet $resultPageSet
-        * @param bool $redirect
-        * @return void
+        * Actually perform the query and add pages to the result.
+        * @param ApiPageSet|null $resultPageSet
+        * @param int $limit Number of pages to fetch
+        * @param string|null $start Starting page_random
+        * @param int|null $startId Starting page_id
+        * @param string|null $end Ending page_random
+        * @return array (int, string|null) Number of pages left to query and continuation string
         */
-       protected function prepareQuery( $randstr, $limit, $namespace, &$resultPageSet, $redirect ) {
+       protected function runQuery( $resultPageSet, $limit, $start, $startId, $end ) {
+               $params = $this->extractRequestParams();
+
                $this->resetQueryParams();
                $this->addTables( 'page' );
-               $this->addOption( 'LIMIT', $limit );
-               $this->addWhereFld( 'page_namespace', $namespace );
-               $this->addWhereRange( 'page_random', 'newer', $randstr, null );
-               $this->addWhereFld( 'page_is_redirect', $redirect );
+               $this->addFields( array( 'page_id', 'page_random' ) );
                if ( is_null( $resultPageSet ) ) {
-                       $this->addFields( array( 'page_id', 'page_title', 'page_namespace' ) );
+                       $this->addFields( array( 'page_title', 'page_namespace' ) );
                } else {
                        $this->addFields( $resultPageSet->getPageTableFields() );
                }
-       }
+               $this->addWhereFld( 'page_namespace', $params['namespace'] );
+               if ( $params['redirect'] || $params['filterredir'] === 'redirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 1 );
+               } elseif ( $params['filterredir'] === 'nonredirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 0 );
+               } elseif ( is_null( $resultPageSet ) ) {
+                       $this->addFields( array( 'page_is_redirect' ) );
+               }
+               $this->addOption( 'LIMIT', $limit + 1 );
+
+               if ( $start !== null ) {
+                       $start = $this->getDB()->addQuotes( $start );
+                       if ( $startId !== null ) {
+                               $startId = (int)$startId;
+                               $this->addWhere( "page_random = $start AND page_id >= $startId OR page_random > $start" );
+                       } else {
+                               $this->addWhere( "page_random >= $start" );
+                       }
+               }
+               if ( $end !== null ) {
+                       $this->addWhere( 'page_random < ' . $this->getDB()->addQuotes( $end ) );
+               }
+               $this->addOption( 'ORDER BY', array( 'page_random', 'page_id' ) );
+
+               $result = $this->getResult();
+               $path = array( 'query', $this->getModuleName() );
 
-       /**
-        * @param ApiPageSet $resultPageSet
-        * @return int
-        */
-       protected function runQuery( $resultPageSet = null ) {
                $res = $this->select( __METHOD__ );
                $count = 0;
                foreach ( $res as $row ) {
-                       $count++;
+                       if ( $count++ >= $limit ) {
+                               return array( 0, "{$row->page_random}|{$row->page_id}" );
+                       }
                        if ( is_null( $resultPageSet ) ) {
-                               // Prevent duplicates
-                               if ( !in_array( $row->page_id, $this->pageIDs ) ) {
-                                       $fit = $this->getResult()->addValue(
-                                               array( 'query', $this->getModuleName() ),
-                                               null, $this->extractRowInfo( $row ) );
-                                       if ( !$fit ) {
-                                               // We can't really query-continue a random list.
-                                               // Return an insanely high value so
-                                               // $count < $limit is false
-                                               return 1E9;
-                                       }
-                                       $this->pageIDs[] = $row->page_id;
+                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                               $page = array(
+                                       'id' => (int)$row->page_id,
+                               );
+                               ApiQueryBase::addTitleInfo( $page, $title );
+                               if ( isset( $row->page_is_redirect ) ) {
+                                       $page['redirect'] = (bool)$row->page_is_redirect;
+                               }
+                               $fit = $result->addValue( $path, null, $page );
+                               if ( !$fit ) {
+                                       return array( 0, "{$row->page_random}|{$row->page_id}" );
                                }
                        } else {
                                $resultPageSet->processDbRow( $row );
                        }
                }
 
-               return $count;
+               return array( $limit - $count, null );
        }
 
        /**
-        * @param ApiPageSet $resultPageSet
-        * @return void
+        * @param ApiPageSet|null $resultPageSet
         */
        public function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
-               $result = $this->getResult();
-               $this->pageIDs = array();
-
-               $this->prepareQuery(
-                       wfRandom(),
-                       $params['limit'],
-                       $params['namespace'],
-                       $resultPageSet,
-                       $params['redirect']
-               );
-               $count = $this->runQuery( $resultPageSet );
-               if ( $count < $params['limit'] ) {
-                       /* We got too few pages, we probably picked a high value
-                        * for page_random. We'll just take the lowest ones, see
-                        * also the comment in Title::getRandomTitle()
-                        */
-                       $this->prepareQuery(
-                               0,
-                               $params['limit'] - $count,
-                               $params['namespace'],
-                               $resultPageSet,
-                               $params['redirect']
-                       );
-                       $this->runQuery( $resultPageSet );
+
+               // Since 'filterredir" will always be set in $params, we have to dig
+               // into the WebRequest to see if it was actually passed.
+               $request = $this->getMain()->getRequest();
+               if ( $request->getCheck( $this->encodeParamName( 'filterredir' ) ) ) {
+                       $this->requireMaxOneParameter( $params, 'filterredir', 'redirect' );
                }
 
-               if ( is_null( $resultPageSet ) ) {
-                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
+               if ( $params['redirect'] ) {
+                       $this->logFeatureUsage( "list=random&rnredirect=" );
+               }
+
+               if ( isset( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 4 );
+                       $rand = $cont[0];
+                       $start = $cont[1];
+                       $startId = (int)$cont[2];
+                       $end = $cont[3] ? $rand : null;
+                       $this->dieContinueUsageIf( !preg_match( '/^0\.\d+$/', $rand ) );
+                       $this->dieContinueUsageIf( !preg_match( '/^0\.\d+$/', $start ) );
+                       $this->dieContinueUsageIf( $cont[2] !== (string)$startId );
+                       $this->dieContinueUsageIf( $cont[3] !== '0' && $cont[3] !== '1' );
+               } else {
+                       $rand = wfRandom();
+                       $start = $rand;
+                       $startId = null;
+                       $end = null;
                }
-       }
 
-       private function extractRowInfo( $row ) {
-               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-               $vals = array();
-               $vals['id'] = intval( $row->page_id );
-               ApiQueryBase::addTitleInfo( $vals, $title );
+               list( $left, $continue ) = $this->runQuery( $resultPageSet, $params['limit'], $start, $startId, $end );
+               if ( $end === null && $continue === null ) {
+                       // Wrap around. We do this even if $left === 0 for continuation
+                       // (saving a DB query in this rare case probably isn't worth the
+                       // added code complexity it would require).
+                       $end = $rand;
+                       list( $left, $continue ) = $this->runQuery( $resultPageSet, $left, null, null, $end );
+               }
+
+               if ( $continue !== null ) {
+                       $endFlag = $end === null ? 0 : 1;
+                       $this->setContinueEnumParameter( 'continue', "$rand|$continue|$endFlag" );
+               }
 
-               return $vals;
+               if ( is_null( $resultPageSet ) ) {
+                       $this->getResult()->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
+               }
        }
 
        public function getCacheMode( $params ) {
@@ -154,14 +181,24 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_TYPE => 'namespace',
                                ApiBase::PARAM_ISMULTI => true
                        ),
+                       'filterredir' => array(
+                               ApiBase::PARAM_TYPE => array( 'all', 'redirects', 'nonredirects' ),
+                               ApiBase::PARAM_DFLT => 'nonredirects', // for BC
+                       ),
+                       'redirect' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
+                               ApiBase::PARAM_DFLT => false,
+                       ),
                        'limit' => array(
                                ApiBase::PARAM_TYPE => 'limit',
                                ApiBase::PARAM_DFLT => 1,
                                ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => 10,
-                               ApiBase::PARAM_MAX2 => 20
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'continue' => array(
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue'
                        ),
-                       'redirect' => false,
                );
        }
 
index 75a0adb..251c42b 100644 (file)
@@ -78,7 +78,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
        protected function getCurrentUserInfo() {
                $user = $this->getUser();
-               $result = $this->getResult();
                $vals = array();
                $vals['id'] = intval( $user->getId() );
                $vals['name'] = $user->getName();
index 014ca85..608e9e1 100644 (file)
@@ -288,7 +288,7 @@ class ApiResult implements ApiSerializable {
         * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
         */
        public static function setValue( array &$arr, $name, $value, $flags = 0 ) {
-               if ( !( $flags & ApiResult::NO_VALIDATE ) ) {
+               if ( ( $flags & ApiResult::NO_VALIDATE ) !== ApiResult::NO_VALIDATE ) {
                        $value = self::validateValue( $value );
                }
 
@@ -402,6 +402,11 @@ class ApiResult implements ApiSerializable {
                $arr = &$this->path( $path, ( $flags & ApiResult::ADD_ON_TOP ) ? 'prepend' : 'append' );
 
                if ( $this->checkingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) {
+                       // self::valueSize needs the validated value. Then flag
+                       // to not re-validate later.
+                       $value = self::validateValue( $value );
+                       $flags |= ApiResult::NO_VALIDATE;
+
                        $newsize = $this->size + self::valueSize( $value );
                        if ( $this->maxSize !== false && $newsize > $this->maxSize ) {
                                /// @todo Add i18n message when replacing calls to ->setWarning()
@@ -1079,14 +1084,12 @@ class ApiResult implements ApiSerializable {
         * or the sum of the strlen()s of the elements if the item is an array.
         * @note Once the deprecated public self::size is removed, we can rename
         *       this back to a less awkward name.
-        * @param mixed $value
+        * @param mixed $value Validated value (see self::validateValue())
         * @return int
         */
        private static function valueSize( $value ) {
                $s = 0;
-               if ( is_array( $value ) ||
-                       is_object( $value ) && !is_callable( array( $value, '__toString' ) )
-               ) {
+               if ( is_array( $value ) ) {
                        foreach ( $value as $k => $v ) {
                                if ( !self::isMetadataKey( $s ) ) {
                                        $s += self::valueSize( $v );
@@ -1488,7 +1491,7 @@ class ApiResult implements ApiSerializable {
         */
        public static function size( $value ) {
                wfDeprecated( __METHOD__, '1.25' );
-               return self::valueSize( $value );
+               return self::valueSize( self::validateValue( $value ) );
        }
 
        /**
index aa456f0..7bdf29a 100644 (file)
@@ -4,7 +4,8 @@
                        "Meno25",
                        "أحمد المحمودي",
                        "Khaled",
-                       "Fatz"
+                       "Fatz",
+                       "Hiba Alshawi"
                ]
        },
        "apihelp-main-param-format": "صيغة الخرج.",
@@ -24,5 +25,6 @@
        "apihelp-edit-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
        "apihelp-emailuser-description": "مراسلة المستخدم",
        "apihelp-patrol-example-rcid": "ابحث عن تغيير جديد",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "إضافة هوية المستخدم الذي قام بتحميل كل إصدار ملف.",
        "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
 }
index 01f07ff..0b6c167 100644 (file)
@@ -12,7 +12,8 @@
                        "Purodha",
                        "Andreasburmeister",
                        "Anomie",
-                       "Duder"
+                       "Duder",
+                       "Ljonka"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokumentation]]\n* [[mw:API:FAQ/de|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].",
        "apihelp-query+alldeletedrevisions-param-namespace": "Nur Seiten in diesem Namensraum auflisten.",
        "apihelp-query+allfileusages-param-from": "Titel der Datei, bei der die Aufzählung beginnen soll.",
        "apihelp-query+allfileusages-param-to": "Titel der Datei, bei der die Aufzählung enden soll.",
+       "apihelp-query+allfileusages-param-prop": "Informationsteile zum Einbinden:",
        "apihelp-query+allfileusages-param-limit": "Wie viele Gesamtobjekte zurückgegeben werden sollen.",
        "apihelp-query+allfileusages-param-dir": "Aufzählungsrichtung.",
        "apihelp-query+allfileusages-example-unique": "Einheitliche Dateititel auflisten",
        "apihelp-query+filearchive-param-from": "Der Bildertitel, bei dem die Auflistung beginnen soll.",
        "apihelp-query+filearchive-param-to": "Der Bildertitel, bei dem die Auflistung enden soll.",
        "apihelp-query+filearchive-param-limit": "Wie viele Bilder insgesamt zurückgegeben werden sollen.",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Ergänzt die SHA-1-Prüfsumme für das Bild.",
        "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten",
        "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
        "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
        "apihelp-query+tags-description": "Änderungs-Tags auflisten.",
        "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten",
        "apihelp-query+usercontribs-description": "Alle Bearbeitungen von einem Benutzer abrufen.",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "Ergänzt die Seiten- und Versionskennung.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Fügt den bürgerlichen Namen des Benutzers hinzu.",
        "apihelp-query+userinfo-example-simple": "Informationen über den aktuellen Benutzer abrufen",
        "apihelp-query+users-description": "Informationen über eine Liste von Benutzern abrufen.",
        "apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.",
index 396f5da..43df9ea 100644 (file)
        "apihelp-query+imageinfo-param-prop": "Which file information to get:",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Adds timestamp for the uploaded version.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Adds the user who uploaded each file version.",
-       "apihelp-query+imageinfo-paramvalue-prop-userid": "Add the user ID that uploaded each file version.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Add the ID of the user that uploaded each file version.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "Comment on the version.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Parse the comment on the version.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Adds the canonical title of the file.",
        "apihelp-query+logevents-paramvalue-prop-details": "Lists additional details about the log event.",
        "apihelp-query+logevents-paramvalue-prop-tags": "Lists tags for the log event.",
        "apihelp-query+logevents-param-type": "Filter log entries to only this type.",
-       "apihelp-query+logevents-param-action": "Filter log actions to only this action. Overrides <var>$1type</var>. Wildcard actions like <kbd>action/*</kbd> allows to specify any string for the asterisk.",
+       "apihelp-query+logevents-param-action": "Filter log actions to only this action. Overrides <var>$1type</var>. In the list of possible values, values with the asterisk wildcard such as <kbd>action/*</kbd> can have different strings after the slash (/).",
        "apihelp-query+logevents-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+logevents-param-end": "The timestamp to end enumerating.",
        "apihelp-query+logevents-param-user": "Filter entries to those made by the given user.",
        "apihelp-query+querypage-param-limit": "Number of results to return.",
        "apihelp-query+querypage-example-ancientpages": "Return results from [[Special:Ancientpages]].",
 
-       "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, <samp>Main Page</samp> is the first random page in the list, <samp>List of fictional monkeys</samp> will <em>always</em> be second, <samp>List of people on stamps of Vanuatu</samp> third, etc.\n\nIf the number of pages in the namespace is lower than <var>$1limit</var>, fewer pages will be returned. The same page will not be returned twice.",
+       "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, <samp>Main Page</samp> is the first random page in the list, <samp>List of fictional monkeys</samp> will <em>always</em> be second, <samp>List of people on stamps of Vanuatu</samp> third, etc.",
        "apihelp-query+random-param-namespace": "Return pages in these namespaces only.",
        "apihelp-query+random-param-limit": "Limit how many random pages will be returned.",
-       "apihelp-query+random-param-redirect": "Load a random redirect instead of a random page.",
+       "apihelp-query+random-param-redirect": "Use <kbd>$1filterredir=redirects</kbd> instead.",
+       "apihelp-query+random-param-filterredir": "How to filter for redirects.",
        "apihelp-query+random-example-simple": "Return two random pages from the main namespace.",
        "apihelp-query+random-example-generator": "Return page info about two random pages from the main namespace.",
 
index 1d04304..edc5b7a 100644 (file)
        "apihelp-query+categoryinfo-description": "Devuelve información acerca de las categorías dadas.",
        "apihelp-query+categoryinfo-example-simple": "Obtener información acerca de <kbd>Category:Foo</kbd> y <kbd>Category:Bar</kbd>",
        "apihelp-query+categorymembers-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Añade el identificador de página.",
        "apihelp-query+categorymembers-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+categorymembers-param-startsortkey": "Utilizar $1starthexsortkey en su lugar.",
        "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.",
        "apihelp-query+usercontribs-param-prop": "Incluir piezas adicionales de información:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Añade el identificador de página y el de revisión.",
        "apihelp-query+usercontribs-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "Añade el comentario de la edición.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista las etiquetas para la edición.",
        "apihelp-query+usercontribs-example-user": "Mostrar contribuciones del usuario <kbd>Ejemplo</kbd>.",
index 829be6d..ac46637 100644 (file)
@@ -3,9 +3,12 @@
                "authors": [
                        "Nike",
                        "MrTapsa",
-                       "Pitke"
+                       "Pitke",
+                       "Stryn"
                ]
        },
+       "apihelp-block-description": "Estä käyttäjä.",
+       "apihelp-block-param-reason": "Eston syy.",
        "apihelp-emailuser-example-email": "Lähetä käyttäjälle <kbd>WikiSysop</kbd> sähköposti, jossa lukee <kbd>Content</kbd>.",
        "apihelp-query+linkshere-param-show": "Näytä vain kohteet, jotka täyttävät nämä kriteerit:\n;redirect:Näytä vain uudelleenohjaukset.\n;!redirect:Näytä vain ei-uudelleenohjaukset",
        "apihelp-tag-example-rev": "Lisää tunniste <kbd>vandalism</kbd> versioon 123 antamatta perustelua.",
index de8e83d..b41f2fa 100644 (file)
        "apihelp-query+logevents-paramvalue-prop-details": "הוספת פרטים נוספים על האירוע.",
        "apihelp-query+logevents-paramvalue-prop-tags": "רשימת התגים של האירוע.",
        "apihelp-query+logevents-param-type": "סינון עיולי יומן רק לסוג הזה.",
-       "apihelp-query+logevents-param-action": "ס×\99× ×\95×\9f ×¤×¢×\95×\9c×\95ת ×\99×\95×\9e×\9f ×¨×§ ×\9cפע×\95×\9c×\94 ×\94×\96×\90ת. ×\93×\95רס ×\90ת <var>$1type</var>. ×¤×¢×\95×\9c×\95ת ×¢×\9d ×ª×\95Ö¾×\9b×\95×\9c×\99×\9d ×\9b×\92×\95×\9f <kbd>action/*</kbd> ×\9e×\90פשר×\95ת ×\9cתת ×\9b×\9c ×\9e×\97ר×\95×\96ת ×\91×\9eק×\95×\9d ×\94×\9b×\95×\9b×\91×\99ת.",
+       "apihelp-query+logevents-param-action": "ס×\99× ×\95×\9f ×¤×¢×\95×\9c×\95ת ×\99×\95×\9e×\9f ×¨×§ ×\9cפע×\95×\9c×\94 ×\94×\96×\90ת. ×\93×\95רס ×\90ת <var>$1type</var>. ×\91רש×\99×\9eת ×\94ער×\9b×\99×\9d ×\94×\90פשר×\99×\99×\9d, ×¢×¨×\9b×\99×\9d ×¢×\9d ×ª×\95Ö¾×\9b×\9c ×\9b×\95×\9b×\91×\99ת ×\9b×\92×\95×\9f <kbd>action/*</kbd> ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\9e×\97ר×\95×\96×\95ת ×©×\95× ×\95ת ×\90×\97ר×\99 ×\94ק×\95 ×\94× ×\98×\95×\99 (/).",
        "apihelp-query+logevents-param-start": "מאיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+logevents-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+logevents-param-user": "לסנן את העיולים שעשה המשתמש הנתון.",
index 83a25fd..8dac7e0 100644 (file)
        "apihelp-query+alldeletedrevisions-param-user": "この利用者による版のみを一覧表示する。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+alldeletedrevisions-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
-       "apihelp-query+alldeletedrevisions-param-generatetitles": "ã\82¸ã\82§ã\83\8dã\83¬ã\83¼ã\82¿ã\83¼ã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81\99ã\82\8bå ´å\90\88ã\80\81ç\89\88IDã\81§ã\81¯ã\81ªã\81\8fã\82¿ã\82¤ã\83\88ã\83«を生成します。",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "ã\82¸ã\82§ã\83\8dã\83¬ã\83¼ã\82¿ã\83¼ã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81\99ã\82\8bå ´å\90\88ã\80\81ç\89\88IDã\81§ã\81¯ã\81ªã\81\8fã\83\9aã\83¼ã\82¸å\90\8dを生成します。",
        "apihelp-query+alldeletedrevisions-example-user": "利用者 <kbd>Example</kbd> による削除された直近の50版を一覧表示する。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "標準名前空間にある削除された最初の50版を一覧表示する。",
        "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのタイトル。",
        "apihelp-query+allimages-example-generator": "<kbd>T</kbd> で始まる4つのファイルに関する情報を表示する。",
        "apihelp-query+alllinks-description": "与えられた名前空間へのすべてのリンクを一覧表示します。",
        "apihelp-query+alllinks-param-from": "列挙を開始するリンクのタイトル。",
-       "apihelp-query+alllinks-param-to": "å\88\97æ\8c\99ã\82\92çµ\82äº\86ã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\82¿ã\82¤ã\83\88ã\83«。",
+       "apihelp-query+alllinks-param-to": "å\88\97æ\8c\99ã\82\92çµ\82äº\86ã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\83\9aã\83¼ã\82¸å\90\8d。",
        "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。",
        "apihelp-query+alllinks-example-B": "<kbd>B</kbd> で始まるリンクされたページ (存在しないページも含む)を、リンク元のページIDとともに表示する。",
        "apihelp-query+allmessages-param-args": "メッセージ中に展開される引数。",
        "apihelp-query+allpages-example-B": "<kbd>B</kbd> で始まるページの一覧を表示する。",
        "apihelp-query+allpages-example-generator": "<kbd>T</kbd> で始まる4つのページに関する情報を表示する。",
        "apihelp-query+allpages-example-generator-revisions": "<kbd>Re</kbd> で始まる最初の非リダイレクトの2ページの内容を表示する。",
-       "apihelp-query+allredirects-param-from": "å\88\97æ\8c\99ã\82\92é\96\8bå§\8bã\81\99ã\82\8bã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\82¿ã\82¤ã\83\88ã\83«。",
-       "apihelp-query+allredirects-param-to": "å\88\97æ\8c\99ã\82\92çµ\82äº\86ã\81\99ã\82\8bã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\82¿ã\82¤ã\83\88ã\83«。",
+       "apihelp-query+allredirects-param-from": "å\88\97æ\8c\99ã\82\92é\96\8bå§\8bã\81\99ã\82\8bã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\83\9aã\83¼ã\82¸å\90\8d。",
+       "apihelp-query+allredirects-param-to": "å\88\97æ\8c\99ã\82\92çµ\82äº\86ã\81\99ã\82\8bã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\83\9aã\83¼ã\82¸å\90\8d。",
        "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべてのトランスクルードされているページを検索する。",
        "apihelp-query+allusers-description": "すべての登録利用者を一覧表示します。",
        "apihelp-query+allusers-param-from": "列挙を開始する利用者名。",
index 438cd64..a263e09 100644 (file)
        "apihelp-query+allredirects-param-to": "De Övverschreff vun dä Sigg, woh et Zälle ophühre sull.",
        "apihelp-query+allredirects-param-prefix": "Söhk not Sigge, di esu aanfange.",
        "apihelp-query+allredirects-param-unique": "Zeijsch blohß de ongerscheidlijje Zihl_Sigg. Kam_mer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids|fragment|interwiki</code>“ bruche. Wam_mer et als ene  Jenerahtor bruche deiht, kritt mer Zihlsiggge anschtatt vun Quällesigge.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Deiht dä Ömleijdong ehr Övverschreff derbei.",
        "apihelp-query+allredirects-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+allredirects-param-limit": "Wi vill sulle överhoup aanjezeisch wääde?",
        "apihelp-query+allredirects-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+allusers-param-dir": "De Reijefollsch zum Zotehre.",
        "apihelp-query+allusers-param-group": "Donn blohß Metmaacher uß dä aanjejovve Jroppe enschlehße.",
        "apihelp-query+allusers-param-excludegroup": "Donn keine Metmaacher uß dä aanjejovve Jroppe enschlehße.",
+       "apihelp-query+allusers-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+allusers-paramvalue-prop-rights": "De Rääschde vn däm Memaacher.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Donn de Aanzahl Änderonge derbei, di dä Metmaacher em Wikki jemaat hät.",
        "apihelp-query+allusers-param-limit": "Wi vill Nahme Metmaacher sulle mer krijje?",
        "apihelp-query+allusers-param-witheditsonly": "Blohß Metmahcher, di och ens jät verändert han.",
        "apihelp-query+allusers-param-activeusers": "Donn blohß Metmaacher opleßte, di  {{PLURAL:$1|der läzde Daach|en de läzde $1 Dääsch|keine läzde Daach}} aktihf wohre.",
        "apihelp-query+backlinks-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+backlinks-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+backlinks-param-limit": "Wi vill Sigge ensjesamp ußjävve. Wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1redirect</var>“ ennjeschalld es, weed di Beschrängkong op jehden Nivoh äxtra aanjwandt, wat bedügg, dat bes op 2 * „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> ußjejovve wähde künne.",
-       "apihelp-query+backlinks-param-redirect": "Wann de Sigg emt dämm Lengk dren en Ömlijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.",
+       "apihelp-query+backlinks-param-redirect": "Wann de Sigg met dämm Lengk dren en Ömleijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.",
        "apihelp-query+backlinks-example-simple": "Zeijsch Lengks op de Sigg <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main page<kbd>.",
        "apihelp-query+backlinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</code>“ lengke donn.",
        "apihelp-query+blocks-description": "Donn alle jeschpächte Metmaacher un <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße opleßte.",
        "apihelp-query+categorymembers-description": "Donn alle Sigge en ener aanjejove saachjrobb opleste.",
        "apihelp-query+categorymembers-param-title": "Wat för en Sachjropp opzälle. Moß aanjejovve sin. Moß der Vörsaz „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">{{ns:category}}:</kbd>“ änthallde. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
        "apihelp-query+categorymembers-param-pageid": "De Kännong vun dä Sigg zom opzälle. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
+       "apihelp-query+categorymembers-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Deiht de Kännong vun de Sigge derbei.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Deihd et Dattum un de Uhrzigg derbei, wann di Sigg opjenumme wohd.",
        "apihelp-query+categorymembers-param-limit": "De jrüüßte Zahl Sigge för ußzejävve.",
        "apihelp-query+categorymembers-param-sort": "De Eijeschavv öm dernoh ze zottehre.",
        "apihelp-query+categorymembers-param-dir": "En wälsche Reihjefollsch opleßte.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Der Zoteerschlößel för de Leß opzehühre, wi mer en met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=sortkey</kbd>“ kritt. Kann blohß met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sort=sortkey</kbd>“ jebruch wähde.",
        "apihelp-query+categorymembers-param-endhexsortkey": "Der Zoteerschlößel för de Leß opzehühre, wi mer en met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=sortkey</kbd>“ kritt. Kann blohß met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sort=sortkey</kbd>“ jebruch wähde.",
        "apihelp-query+categorymembers-param-endsortkeyprefix": "Der Aanfang vun däm Zoteerschlößel för de Leß opzehühre. Opühre deiht se <strong>för</strong>, un nit <strong>met</strong> däm. Wann dä Wäät opdouch, weed hä nit med ußjejovve. Kann blohß met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sort=sortkey</code>“ jebruch wähde un överjeihd „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1endhexsortkey</code>“.",
        "apihelp-query+categorymembers-param-startsortkey": "Söhk „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1starthexsortkey</code>“ schtatt dämm.",
        "apihelp-query+contributors-description": "Holl de Leß met de ennjelogg Schrihver un de Aanzahl nahmelohse Metschrihver aan ene Sigg.",
        "apihelp-query+contributors-param-limit": "Wi vill Metschrihver ze livvere?",
        "apihelp-query+contributors-example-simple": "Donn de Metschrihver aan dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">KMain PageBD</kbd>“ aanzeije.",
+       "apihelp-query+deletedrevisions-param-start": "Et Dattom un de Uhrzigg, von woh aan opzälle. Weed nit jebruch, wam_mer en Leß met Kännonge vun Väsjohne aam beärbeijde sin.",
+       "apihelp-query+deletedrevisions-param-end": "Et Dattom un de Uhrzigg, bes woh hen opzälle. Weed nit jebruch, wam_mer en Leß met Kännonge vun Väsjohne aam beärbeijde sin.",
        "apihelp-query+deletedrevisions-param-tag": "Donn blohß Väsjohne met heh dä Makkehrong opleßte.",
        "apihelp-query+deletedrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+extlinks-example-simple": "Holl en Leß met Lengks noh ußerhallef vum Wikki uß dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“.",
        "apihelp-query+exturlusage-description": "Donn alle Sigge upzälle med däm aanjejovve<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> dren.",
        "apihelp-query+exturlusage-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Donn dä Sigg ier Kännong derbei.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Donn dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> derbei, dä en dä Sigg jebruch weed.",
        "apihelp-query+exturlusage-param-protocol": "Dat Schehma uß däm <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i>. Wann et läddesch jelohße es un „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1query</var>“ aanjejogge es, es dat Schehma „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">http</kbd>“. Lohß beeds dat un „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">1query</var>“ läddesch, öm alle Lengks noh ußerhallef opzeleßte.",
        "apihelp-query+exturlusage-param-namespace": "Dat appachtemang met dä Sigge zom opzälle.",
        "apihelp-query+exturlusage-param-limit": "Wi vill Sigge zem ußjävve?",
        "apihelp-query+filearchive-example-simple": "Zeijsch en leß met alle fottjeschmeße Datteije.",
        "apihelp-query+filerepoinfo-example-simple": "Holl ennfommazjuhne övver de Reppossetohreje met Datteije.",
        "apihelp-query+fileusage-description": "Fengk alle Sigge, di de aanjejovve Datteije bruche.",
+       "apihelp-query+fileusage-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "De Kännong för jehde Sigg.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "De Övverschreff för jehde Sigg.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Zeijsch aan, wann di Sigge en Ömleijdong es.",
        "apihelp-query+fileusage-param-namespace": "Donn blohß Sigge en heh dä Appachtemangs metnämme.",
        "apihelp-query+fileusage-param-limit": "Wi vill holle?",
        "apihelp-query+fileusage-example-simple": "Holl Aanjahbe övver Sigge, di de Dattei „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[:File:Example.jpg]].</code>“ bruche.",
        "apihelp-query+imageinfo-param-prop": "Wat för en Schtöker aan Ennfommazjuhne holle:",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Deihd en dattom un en Zigg aan de huhjelahde Väsjohn.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä jehde Väsjohn vun dä Dattei huhjelahde hät.",
-       "apihelp-query+imageinfo-paramvalue-prop-userid": "Deiht de Kännong vun däm Metmaacher derbei, dä jehde Väsohn vun dä Dattei.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Deiht de Kännong vun jehdem Metmaacher derbei, dä en Väsohn vun dä Dattei huh jelaahde hät.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "Aanmärkonge bei dä Väsjohn.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Donn di Aanmärkonge bei dä Väsjohn paase.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Deiht de kannohnesche Överschreff vun dä Dattei derbei.",
        "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Deiht de Mehdijje_Zoot vun dä Dattei derbei.",
        "apihelp-query+imageinfo-paramvalue-prop-metadata": "Deiht de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Exchangeable image file format\">EXIF</i>-Mettadahte för di Väsjohn vun dä Dattei oplesßte.",
        "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Deiht de Mettadahte för heh di Väsjohn vun dä Dattei oplesßte, di alld schtandattmähßesch en däm Datteifommaht änthallde sin.",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "Deiht dä Nahme vun dä Dattei vun dä Aschihf_Väsjohn för alle Väsjohne, bes op de läzde, derbei.",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "deiht de bit depth för di Väsjohn derbei.",
        "apihelp-query+imageinfo-param-limit": "Wi vill Väsjohne för jehde Dattei ußjävve.",
        "apihelp-query+imageinfo-param-start": "Et Dattom un de Zigg, vun woh aan opleßte.",
        "apihelp-query+imageinfo-param-end": "Et Dattom un de Zigg, vun woh aan opleßte.",
        "apihelp-query+imageusage-param-pageid": "De Känong vun dä Sigg zom noh Söhke. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
        "apihelp-query+imageusage-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+imageusage-param-dir": "En wälsche Reijefollsch opleßte.",
+       "apihelp-query+imageusage-param-limit": "Wi vill Sigge ensjesamp ußjävve. Wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1redirect</var>“ ennjeschalld es, weed di Beschrängkong op jehden Nivoh äxtra aanjwandt, wat bedügg, dat bes op 2 * „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> ußjejovve wähde künne.",
+       "apihelp-query+imageusage-param-redirect": "Wann de Sigg met dämm Lengk dren en Ömleijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.",
        "apihelp-query+imageusage-example-simple": "Zeijsch Sigge, di di Dattei „<code lang=\"mul\" xml:lang=\"mul\" dir=\"ltr\">[[:File:Albert Einstein Head.jpg]]</code>“ bruche.",
        "apihelp-query+imageusage-example-generator": "Holl Enformazjuhne övver de Sigge, di di Dattei „<code lang=\"mul\" xml:lang=\"mul\" dir=\"ltr\">[[:File:Albert Einstein Head.jpg]]</code>“ bruche.",
        "apihelp-query+info-description": "Holl jrondlähje Ennfommazjuhne övver di Sigg.",
diff --git a/includes/api/i18n/mr.json b/includes/api/i18n/mr.json
new file mode 100644 (file)
index 0000000..30cf75b
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Rahuldeshmukh101"
+               ]
+       },
+       "apihelp-main-param-action": "कोणति कारवाई करायचि",
+       "apihelp-main-param-curtimestamp": "निकालात आताच्या वेळेचि नोन्द घ्या",
+       "apihelp-block-description": "सदस्यास ब्यान करा",
+       "apihelp-block-param-user": "सदस्याचे नाव, अंक पत्त्ता अथवा अंकपत्यांनचि मालिका प्रतिबांधित करा"
+}
index 921cc58..51811f8 100644 (file)
@@ -10,7 +10,8 @@
                        "Anomie",
                        "Nemo bis",
                        "Amire80",
-                       "Siebrand"
+                       "Siebrand",
+                       "Purodha"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "apihelp-query+imageinfo-param-prop": "{{doc-apihelp-param|query+imageinfo|prop|paramvalues=1}}",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+imageinfo|prop|timestamp}}",
        "apihelp-query+imageinfo-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+imageinfo|prop|user}}",
-       "apihelp-query+imageinfo-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+imageinfo|prop|userid}}",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Imageinfo returns information about file revisions (normally the last revision since <code>iilimit</code> defaults to 1). <code>userid</code> includes the ID of the user who made the (re)upload which created that revision. So there will be one user ID per imageinfo item; if you set the limit high enough, you will get all revisions of all files as separate imageinfo items.\n\n{{doc-apihelp-paramvalue|query+imageinfo|prop|userid}}",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+imageinfo|prop|comment}}",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+imageinfo|prop|parsedcomment}}",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "{{doc-apihelp-paramvalue|query+imageinfo|prop|canonicaltitle}}",
        "apihelp-query+random-description": "{{doc-apihelp-description|query+random}}",
        "apihelp-query+random-param-namespace": "{{doc-apihelp-param|query+random|namespace}}",
        "apihelp-query+random-param-limit": "{{doc-apihelp-param|query+random|limit}}",
+       "apihelp-query+random-param-filterredir": "{{apihelp-param|query+random|filterredir}}",
        "apihelp-query+random-param-redirect": "{{doc-apihelp-param|query+random|redirect}}",
        "apihelp-query+random-example-simple": "{{doc-apihelp-example|query+random}}",
        "apihelp-query+random-example-generator": "{{doc-apihelp-example|query+random}}",
index cac12c2..34d55af 100644 (file)
@@ -5,7 +5,8 @@
                ]
        },
        "apihelp-block-param-reason": "Arsyeja për bllokim.",
-       "apihelp-move-param-reason": "Arsyeja për riemërim.",
+       "apihelp-move-param-reason": "Arsyeja për riemërtim.",
        "apihelp-tag-param-reason": "Arsyeja për ndërrimin.",
-       "apihelp-unblock-description": "Zhblloko një përdorues."
+       "apihelp-unblock-description": "Zhblloko një përdorues.",
+       "apihelp-userrights-description": "Ndërro anëtarësinë e grupit e një përdoruesit."
 }
index 9458fb2..316c811 100644 (file)
        "apihelp-query+info-paramvalue-prop-watchers": "监视人员数,如果允许。",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "每个页面的监视列表通知时间戳。",
        "apihelp-query+info-paramvalue-prop-subjectid": "每个讨论页的母页面的页面ID。",
+       "apihelp-query+info-paramvalue-prop-url": "为每个页面提供一个完整URL、一个编辑URL和规范URL。",
        "apihelp-query+info-paramvalue-prop-readable": "用户是否可以阅读此页面。",
        "apihelp-query+info-paramvalue-prop-preload": "提供由EditFormPreloadText返回的文本。",
        "apihelp-query+info-paramvalue-prop-displaytitle": "在页面标题实际显示的地方提供方式。",
        "apihelp-query+logevents-paramvalue-prop-details": "列举有关日志事件的额外详细信息。",
        "apihelp-query+logevents-paramvalue-prop-tags": "列举用于日志活动的标签。",
        "apihelp-query+logevents-param-type": "过滤日志记录至仅限此类型。",
-       "apihelp-query+logevents-param-action": "过滤日志操作为仅限此操作。覆盖<var>$1type</var>。类似<kbd>action/*</kbd>的通配符操作允许指定用于星号的任意字符串。",
+       "apihelp-query+logevents-param-action": "过滤日志操作为仅限此操作。覆盖<var>$1type</var>。在可用值列表中,带星号通配符的值例如<kbd>action/*</kbd>可在斜线(/)后拥有不同字符串。",
        "apihelp-query+logevents-param-start": "枚举的起始时间戳。",
        "apihelp-query+logevents-param-end": "枚举的结束时间戳。",
        "apihelp-query+logevents-param-user": "过滤记录为这些由指定用户做出的。",
        "apihelp-undelete-description": "恢复一个被删除页面的修订。\n\n被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。",
        "apihelp-undelete-param-title": "要恢复的页面标题。",
        "apihelp-undelete-param-reason": "恢复的原因。",
+       "apihelp-undelete-param-timestamps": "要回复的修订的时间戳。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-undelete-param-fileids": "要恢复的文件修订ID。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-undelete-example-page": "恢复页面<kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "恢复<kbd>Main Page</kbd>的两个修订。",
index e5916bd..3f106bd 100644 (file)
@@ -270,6 +270,17 @@ class EnhancedChangesList extends ChangesList {
 
                $queryParams['curid'] = $curId;
 
+               # Sub-entries
+               $lines = '';
+               foreach ( $block as $i => $rcObj ) {
+                       $line = $this->getLineData( $block, $rcObj, $queryParams );
+                       $lines .= $line;
+                       if ( !$line ) {
+                               // completely ignore this RC entry if we don't want to render it
+                               unset( $block[$i] );
+                       }
+               }
+
                $r .= $this->getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden );
 
                $r .= ' <span class="mw-changeslist-separator">. .</span> ';
@@ -299,116 +310,133 @@ class EnhancedChangesList extends ChangesList {
                $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
                $r .= '</td></tr>';
 
-               # Sub-entries
-               foreach ( $block as $rcObj ) {
-                       # Classes to apply -- TODO implement
-                       $classes = array();
-                       $type = $rcObj->mAttribs['rc_type'];
-                       $data = array();
-
-                       $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
-                               ? ' class="mw-enhanced-watched"' : '';
-                       $separator = ' <span class="mw-changeslist-separator">. .</span> ';
-
-                       $data['recentChangesFlags'] = array(
-                               'newpage' => $type == RC_NEW,
-                               'minor' => $rcObj->mAttribs['rc_minor'],
-                               'unpatrolled' => $rcObj->unpatrolled,
-                               'bot' => $rcObj->mAttribs['rc_bot'],
-                       );
+               if ( !$lines ) {
+                       // if there are no lines to be rendered (all aborted by hook), don't render the block
+                       return '';
+               }
 
-                       $params = $queryParams;
+               $r .= $lines;
+               $r .= "</table>\n";
 
-                       if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
-                               $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
-                       }
+               $this->rcCacheIndex++;
+
+               return $r;
+       }
 
-                       # Log timestamp
-                       if ( $type == RC_LOG ) {
-                               $link = $rcObj->timestamp;
+       /**
+        * @param RCCacheEntry[] $block
+        * @param RCCacheEntry $rcObj
+        * @param array $queryParams
+        * @return string
+        * @throws Exception
+        * @throws FatalError
+        * @throws MWException
+        */
+       protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = array() ) {
+               $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
+
+               # Classes to apply -- TODO implement
+               $classes = array();
+               $type = $rcObj->mAttribs['rc_type'];
+               $data = array();
+
+               $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+                       ? ' class="mw-enhanced-watched"' : '';
+               $separator = ' <span class="mw-changeslist-separator">. .</span> ';
+
+               $data['recentChangesFlags'] = array(
+                       'newpage' => $type == RC_NEW,
+                       'minor' => $rcObj->mAttribs['rc_minor'],
+                       'unpatrolled' => $rcObj->unpatrolled,
+                       'bot' => $rcObj->mAttribs['rc_bot'],
+               );
+
+               $params = $queryParams;
+
+               if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
+                       $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
+               }
+
+               # Log timestamp
+               if ( $type == RC_LOG ) {
+                       $link = $rcObj->timestamp;
                        # Revision link
-                       } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                               $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
-                       } else {
-                               $link = Linker::linkKnown(
-                                       $rcObj->getTitle(),
-                                       $rcObj->timestamp,
-                                       array(),
-                                       $params
-                               );
-                               if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
-                                       $link = '<span class="history-deleted">' . $link . '</span> ';
-                               }
+               } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
+               } else {
+                       $link = Linker::linkKnown(
+                               $rcObj->getTitle(),
+                               $rcObj->timestamp,
+                               array(),
+                               $params
+                       );
+                       if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+                               $link = '<span class="history-deleted">' . $link . '</span> ';
                        }
-                       $data['timestampLink'] = $link;
+               }
+               $data['timestampLink'] = $link;
 
-                       $currentAndLastLinks = '';
-                       if ( !$type == RC_LOG || $type == RC_NEW ) {
-                               $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
+               $currentAndLastLinks = '';
+               if ( !$type == RC_LOG || $type == RC_NEW ) {
+                       $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        $rcObj->curlink .
-                                               $this->message['pipe-separator'] .
-                                               $rcObj->lastlink
+                                       $this->message['pipe-separator'] .
+                                       $rcObj->lastlink
                                )->escaped();
-                       }
-                       $data['currentAndLastLinks'] = $currentAndLastLinks;
-                       $data['separatorAfterCurrentAndLastLinks'] = $separator;
-
-                       # Character diff
-                       if ( $RCShowChangedSize ) {
-                               $cd = $this->formatCharacterDifference( $rcObj );
-                               if ( $cd !== '' ) {
-                                       $data['characterDiff'] = $cd;
-                                       $data['separatorAfterCharacterDiff'] = $separator;
-                               }
-                       }
+               }
+               $data['currentAndLastLinks'] = $currentAndLastLinks;
+               $data['separatorAfterCurrentAndLastLinks'] = $separator;
 
-                       if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
-                               $data['logEntry'] = $this->insertLogEntry( $rcObj );
-                       } else {
-                               # User links
-                               $data['userLink'] = $rcObj->userlink;
-                               $data['userTalkLink'] = $rcObj->usertalklink;
-                               $data['comment'] = $this->insertComment( $rcObj );
+               # Character diff
+               if ( $RCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rcObj );
+                       if ( $cd !== '' ) {
+                               $data['characterDiff'] = $cd;
+                               $data['separatorAfterCharacterDiff'] = $separator;
                        }
+               }
 
-                       # Rollback
-                       $data['rollback'] = $this->getRollback( $rcObj );
-
-                       # Tags
-                       $data['tags'] = $this->getTags( $rcObj, $classes );
+               if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
+                       $data['logEntry'] = $this->insertLogEntry( $rcObj );
+               } else {
+                       # User links
+                       $data['userLink'] = $rcObj->userlink;
+                       $data['userTalkLink'] = $rcObj->usertalklink;
+                       $data['comment'] = $this->insertComment( $rcObj );
+               }
 
-                       // give the hook a chance to modify the data
-                       $success = Hooks::run( 'EnhancedChangesListModifyLineData',
-                               array( $this, &$data, $block, $rcObj ) );
-                       if ( !$success ) {
-                               // skip entry if hook aborted it
-                               continue;
-                       }
+               # Rollback
+               $data['rollback'] = $this->getRollback( $rcObj );
 
-                       $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
-                       if ( isset( $data['recentChangesFlags'] ) ) {
-                               $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
-                               unset( $data['recentChangesFlags'] );
-                       }
-                       $line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
-
-                       if ( isset( $data['timestampLink'] ) ) {
-                               $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
-                               unset( $data['timestampLink'] );
-                       }
+               # Tags
+               $data['tags'] = $this->getTags( $rcObj, $classes );
 
-                       // everything else: makes it easier for extensions to add or remove data
-                       $line .= implode( '', $data );
+               // give the hook a chance to modify the data
+               $success = Hooks::run( 'EnhancedChangesListModifyLineData',
+                       array( $this, &$data, $block, $rcObj ) );
+               if ( !$success ) {
+                       // skip entry if hook aborted it
+                       return '';
+               }
 
-                       $line .= "</td></tr>\n";
+               $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
+               if ( isset( $data['recentChangesFlags'] ) ) {
+                       $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
+                       unset( $data['recentChangesFlags'] );
+               }
+               $line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
 
-                       $r .= $line;
+               if ( isset( $data['timestampLink'] ) ) {
+                       $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
+                       unset( $data['timestampLink'] );
                }
-               $r .= "</table>\n";
 
-               $this->rcCacheIndex++;
+               // everything else: makes it easier for extensions to add or remove data
+               $line .= implode( '', $data );
 
-               return $r;
+               $line .= "</td></tr>\n";
+
+               return $line;
        }
 
        /**
index b6439b8..0f4c648 100644 (file)
@@ -21,6 +21,7 @@
 namespace MediaWiki\Logger;
 
 use DateTimeZone;
+use Exception;
 use MWDebug;
 use MWExceptionHandler;
 use Psr\Log\AbstractLogger;
@@ -217,13 +218,22 @@ class LegacyLogger extends AbstractLogger {
                }
 
                // Append stacktrace of exception if available
-               if ( $wgLogExceptionBacktrace &&
-                       isset( $context['exception'] ) &&
-                       $context['exception'] instanceof Exception
-               ) {
-                       $text .= MWExceptionHandler::getRedactedTraceAsString(
-                               $context['exception']
-                       ) . "\n";
+               if ( $wgLogExceptionBacktrace && isset( $context['exception'] ) ) {
+                       $e = $context['exception'];
+                       $backtrace = false;
+
+                       if ( $e instanceof Exception ) {
+                               $backtrace = MWExceptionHandler::getRedactedTrace( $e );
+
+                       } elseif ( is_array( $e ) && isset( $e['trace'] ) ) {
+                               // Exception has already been unpacked as structured data
+                               $backtrace = $e['trace'];
+                       }
+
+                       if ( $backtrace ) {
+                               $text .= MWExceptionHandler::prettyPrintTrace( $backtrace ) .
+                                       "\n";
+                       }
                }
 
                return self::interpolate( $text, $context );
@@ -358,7 +368,7 @@ class LegacyLogger extends AbstractLogger {
                        return $item->format( 'c' );
                }
 
-               if ( $item instanceof \Exception ) {
+               if ( $item instanceof Exception ) {
                        return '[Exception ' . get_class( $item ) . '( ' .
                                $item->getFile() . ':' . $item->getLine() . ') ' .
                                $item->getMessage() . ']';
index e593d63..2ba7a53 100644 (file)
@@ -27,10 +27,14 @@ use MWExceptionHandler;
 /**
  * Formats incoming records into a one-line string.
  *
+ * An 'exeception' in the log record's context will be treated specially.
+ * It will be output for an '%exception%' placeholder in the format and
+ * excluded from '%context%' output if the '%exception%' placeholder is
+ * present.
+ *
  * Exceptions that are logged with this formatter will optional have their
- * stack traces appended. If that is done,
- * MWExceptionHandler::getRedactedTraceAsString() will be used to redact the
- * trace information.
+ * stack traces appended. If that is done, MWExceptionHandler::redactedTrace()
+ * will be used to redact the trace information.
  *
  * @since 1.26
  * @author Bryan Davis <bd808@wikimedia.org>
@@ -57,6 +61,40 @@ class LineFormatter extends MonologLineFormatter {
        }
 
 
+       /**
+        * {@inheritdoc}
+        */
+       public function format( array $record ) {
+               // Drop the 'private' flag from the context
+               unset( $record['context']['private'] );
+
+               // Handle exceptions specially: pretty format and remove from context
+               // Will be output for a '%exception%' placeholder in format
+               $prettyException = '';
+               if ( isset( $record['context']['exception'] ) &&
+                       strpos( $this->format, '%exception%' ) !== false
+               ) {
+                       $e = $record['context']['exception'];
+                       unset( $record['context']['exception'] );
+
+                       if ( $e instanceof Exception ) {
+                               $prettyException = $this->normalizeException( $e );
+                       } elseif ( is_array( $e ) ) {
+                               $prettyException = $this->normalizeExceptionArray( $e );
+                       } else {
+                               $prettyException = $this->stringify( $e );
+                       }
+               }
+
+               $output = parent::format( $record );
+
+               if ( strpos( $output, '%exception%' ) !== false ) {
+                       $output = str_replace( '%exception%', $prettyException, $output );
+               }
+               return $output;
+       }
+
+
        /**
         * Convert an Exception to a string.
         *
@@ -64,24 +102,76 @@ class LineFormatter extends MonologLineFormatter {
         * @return string
         */
        protected function normalizeException( Exception $e ) {
-               $str = '[Exception ' . get_class( $e ) . '] (' .
-                       $e->getFile() . ':' . $e->getLine() . ') ' .
-                       $e->getMessage();
+               return $this->normalizeExceptionArray( $this->exceptionAsArray( $e ) );
+       }
+
+
+       /**
+        * Convert an exception to an array of structured data.
+        *
+        * @param Exception $e
+        * @return array
+        */
+       protected function exceptionAsArray( Exception $e ) {
+               $out = array(
+                       'class' => get_class( $e ),
+                       'message' => $e->getMessage(),
+                       'code' => $e->getCode(),
+                       'file' => $e->getFile(),
+                       'line' => $e->getLine(),
+                       'trace' => MWExceptionHandler::redactTrace( $e->getTrace() ),
+               );
 
                $prev = $e->getPrevious();
-               while ( $prev ) {
-                       $str .= ', [Exception ' . get_class( $prev ) . '] (' .
-                               $prev->getFile() . ':' . $prev->getLine() . ') ' .
-                               $prev->getMessage();
-                       $prev = $prev->getPrevious();
+               if ( $prev ) {
+                       $out['previous'] = $this->exceptionAsArray( $prev );
                }
 
-               if ( $this->includeStacktraces ) {
-                       $str .= "\n[stacktrace]\n" .
-                               MWExceptionHandler::getRedactedTraceAsString( $e ) .
-                               "\n";
+               return $out;
+       }
+
+
+       /**
+        * Convert an array of Exception data to a string.
+        *
+        * @param array $e
+        * @return string
+        */
+       protected function normalizeExceptionArray( array $e ) {
+               $defaults = array(
+                       'class' => 'Unknown',
+                       'file' => 'unknown',
+                       'line' => null,
+                       'message' => 'unknown',
+                       'trace' => array(),
+               );
+               $e = array_merge( $defaults, $e );
+
+               $str = "\n[Exception {$e['class']}] (" .
+                       "{$e['file']}:{$e['line']}) {$e['message']}";
+
+               if ( $this->includeStacktraces && $e['trace'] ) {
+                       $str .= "\n" .
+                               MWExceptionHandler::prettyPrintTrace( $e['trace'], '  ' );
                }
 
+               if ( isset( $e['previous'] ) ) {
+                       $prev = $e['previous'];
+                       while ( $prev ) {
+                               $prev = array_merge( $defaults, $prev );
+                               $str .= "\nCaused by: [Exception {$prev['class']}] (" .
+                                       "{$prev['file']}:{$prev['line']}) {$prev['message']}";
+
+                               if ( $this->includeStacktraces && $prev['trace'] ) {
+                                       $str .= "\n" .
+                                               MWExceptionHandler::prettyPrintTrace(
+                                                       $prev['trace'], '  '
+                                               );
+                               }
+
+                               $prev = isset( $prev['previous'] ) ? $prev['previous'] : null;
+                       }
+               }
                return $str;
        }
 }
index def653f..d4a240f 100644 (file)
@@ -26,24 +26,32 @@ use MediaWiki\Logger\LoggerFactory;
  */
 class MWExceptionHandler {
 
+       /**
+        * @var string $reservedMemory
+        */
        protected static $reservedMemory;
+       /**
+        * @var array $fatalErrorTypes
+        */
        protected static $fatalErrorTypes = array(
                E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR,
                /* HHVM's FATAL_ERROR level */ 16777217,
        );
+       /**
+        * @var bool $handledFatalCallback
+        */
+       protected static $handledFatalCallback = false;
 
        /**
         * Install handlers with PHP.
         */
        public static function installHandler() {
-               set_exception_handler( array( 'MWExceptionHandler', 'handleException' ) );
-               set_error_handler( array( 'MWExceptionHandler', 'handleError' ) );
+               set_exception_handler( 'MWExceptionHandler::handleException' );
+               set_error_handler( 'MWExceptionHandler::handleError' );
 
                // Reserve 16k of memory so we can report OOM fatals
                self::$reservedMemory = str_repeat( ' ', 16384 );
-               register_shutdown_function(
-                       array( 'MWExceptionHandler', 'handleFatalError' )
-               );
+               register_shutdown_function( 'MWExceptionHandler::handleFatalError' );
        }
 
        /**
@@ -176,24 +184,36 @@ class MWExceptionHandler {
        }
 
        /**
+        * Handler for set_error_handler() callback notifications.
+        *
+        * Receive a callback from the interpreter for a raised error, create an
+        * ErrorException, and log the exception to the 'error' logging
+        * channel(s). If the raised error is a fatal error type (only under HHVM)
+        * delegate to handleFatalError() instead.
+        *
         * @since 1.25
+        *
         * @param int $level Error level raised
         * @param string $message
         * @param string $file
         * @param int $line
+        *
+        * @see logError()
         */
-       public static function handleError( $level, $message, $file = null, $line = null ) {
-               // Map error constant to error name (reverse-engineer PHP error reporting)
-               $channel = 'error';
+       public static function handleError(
+               $level, $message, $file = null, $line = null
+       ) {
+               if ( in_array( $level, self::$fatalErrorTypes ) ) {
+                       return call_user_func_array(
+                               'MWExceptionHandler::handleFatalError', func_get_args()
+                       );
+               }
+
+               // Map error constant to error name (reverse-engineer PHP error
+               // reporting)
                switch ( $level ) {
-                       case E_ERROR:
-                       case E_CORE_ERROR:
-                       case E_COMPILE_ERROR:
-                       case E_USER_ERROR:
                        case E_RECOVERABLE_ERROR:
-                       case E_PARSE:
                                $levelName = 'Error';
-                               $channel = 'fatal';
                                break;
                        case E_WARNING:
                        case E_CORE_WARNING:
@@ -212,17 +232,13 @@ class MWExceptionHandler {
                        case E_USER_DEPRECATED:
                                $levelName = 'Deprecated';
                                break;
-                       case /* HHVM's FATAL_ERROR */ 16777217:
-                               $levelName = 'Fatal';
-                               $channel = 'fatal';
-                               break;
                        default:
                                $levelName = 'Unknown error';
                                break;
                }
 
                $e = new ErrorException( "PHP $levelName: $message", 0, $level, $file, $line );
-               self::logError( $e, $channel );
+               self::logError( $e, 'error' );
 
                // This handler is for logging only. Return false will instruct PHP
                // to continue regular handling.
@@ -231,42 +247,101 @@ class MWExceptionHandler {
 
 
        /**
-        * Look for a fatal error as the cause of the request termination and log
-        * as an exception.
+        * Dual purpose callback used as both a set_error_handler() callback and
+        * a registered shutdown function. Receive a callback from the interpreter
+        * for a raised error or system shutdown, check for a fatal error, and log
+        * to the 'fatal' logging channel.
         *
         * Special handling is included for missing class errors as they may
         * indicate that the user needs to install 3rd-party libraries via
         * Composer or other means.
         *
         * @since 1.25
+        *
+        * @param int $level Error level raised
+        * @param string $message Error message
+        * @param string $file File that error was raised in
+        * @param int $line Line number error was raised at
+        * @param array $context Active symbol table point of error
+        * @param array $trace Backtrace at point of error (undocumented HHVM
+        *     feature)
+        * @return bool Always returns false
         */
-       public static function handleFatalError() {
+       public static function handleFatalError(
+               $level = null, $message = null, $file = null, $line = null,
+               $context = null, $trace = null
+       ) {
+               // Free reserved memory so that we have space to process OOM
+               // errors
                self::$reservedMemory = null;
-               $lastError = error_get_last();
 
-               if ( $lastError &&
-                       isset( $lastError['type'] ) &&
-                       in_array( $lastError['type'], self::$fatalErrorTypes )
-               ) {
-                       $msg = "Fatal Error: {$lastError['message']}";
-                       // HHVM: Class undefined: foo
-                       // PHP5: Class 'foo' not found
-                       if ( preg_match( "/Class (undefined: \w+|'\w+' not found)/",
-                               $lastError['message']
-                       ) ) {
-                               // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
-                               $msg = <<<TXT
+               if ( $level === null ) {
+                       // Called as a shutdown handler, get data from error_get_last()
+                       if ( static::$handledFatalCallback ) {
+                               // Already called once (probably as an error handler callback
+                               // under HHVM) so don't log again.
+                               return false;
+                       }
+
+                       $lastError = error_get_last();
+                       if ( $lastError !== null ) {
+                               $level = $lastError['type'];
+                               $message = $lastError['message'];
+                               $file = $lastError['file'];
+                               $line = $lastError['line'];
+                       } else {
+                               $level = 0;
+                               $message = '';
+                       }
+               }
+
+               if ( !in_array( $level, self::$fatalErrorTypes ) ) {
+                       // Only interested in fatal errors, others should have been
+                       // handled by MWExceptionHandler::handleError
+                       return false;
+               }
+
+               $msg = "[{exception_id}] PHP Fatal Error: {$message}";
+
+               // Look at message to see if this is a class not found failure
+               // HHVM: Class undefined: foo
+               // PHP5: Class 'foo' not found
+               if ( preg_match( "/Class (undefined: \w+|'\w+' not found)/", $msg ) ) {
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
+                       $msg = <<<TXT
 {$msg}
 
 MediaWiki or an installed extension requires this class but it is not embedded directly in MediaWiki's git repository and must be installed separately by the end user.
 
 Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> for help on installing the required components.
 TXT;
-                               // @codingStandardsIgnoreEnd
-                       }
-                       $e = new ErrorException( $msg, 0, $lastError['type'] );
-                       self::logError( $e, 'fatal' );
+                       // @codingStandardsIgnoreEnd
                }
+
+               // We can't just create an exception and log it as it is likely that
+               // the interpreter has unwound the stack already. If that is true the
+               // stacktrace we would get would be functionally empty. If however we
+               // have been called as an error handler callback *and* HHVM is in use
+               // we will have been provided with a useful stacktrace that we can
+               // log.
+               $trace = $trace ?: debug_backtrace();
+               $logger = LoggerFactory::getInstance( 'fatal' );
+               $logger->error( $msg, array(
+                       'exception' => array(
+                               'class' => 'ErrorException',
+                               'message' => "PHP Fatal Error: {$message}",
+                               'code' => $level,
+                               'file' => $file,
+                               'line' => $line,
+                               'trace' => static::redactTrace( $trace ),
+                       ),
+                       'exception_id' => wfRandomString( 8 ),
+               ) );
+
+               // Remember call so we don't double process via HHVM's fatal
+               // notifications and the shutdown hook behavior
+               static::$handledFatalCallback = true;
+               return false;
        }
 
        /**
@@ -277,32 +352,32 @@ TXT;
         *
         * @param Exception $e
         * @return string
+        * @see prettyPrintTrace()
         */
        public static function getRedactedTraceAsString( Exception $e ) {
-               return self::prettyPrintRedactedTrace(
-                       self::getRedactedTrace( $e )
-               );
+               return self::prettyPrintTrace( self::getRedactedTrace( $e ) );
        }
 
        /**
-        * Generate a string representation of a structured stack trace generated
-        * by getRedactedTrace().
+        * Generate a string representation of a stacktrace.
         *
         * @param array $trace
+        * @param string $pad Constant padding to add to each line of trace
         * @return string
         * @since 1.26
         */
-       public static function prettyPrintRedactedTrace( array $trace ) {
+       public static function prettyPrintTrace( array $trace, $pad = '' ) {
                $text = '';
 
                foreach ( $trace as $level => $frame ) {
                        if ( isset( $frame['file'] ) && isset( $frame['line'] ) ) {
-                               $text .= "#{$level} {$frame['file']}({$frame['line']}): ";
+                               $text .= "{$pad}#{$level} {$frame['file']}({$frame['line']}): ";
                        } else {
-                               // 'file' and 'line' are unset for calls via call_user_func (bug 55634)
-                               // This matches behaviour of Exception::getTraceAsString to instead
-                               // display "[internal function]".
-                               $text .= "#{$level} [internal function]: ";
+                               // 'file' and 'line' are unset for calls via call_user_func
+                               // (bug 55634) This matches behaviour of
+                               // Exception::getTraceAsString to instead display "[internal
+                               // function]".
+                               $text .= "{$pad}#{$level} [internal function]: ";
                        }
 
                        if ( isset( $frame['class'] ) ) {
@@ -319,7 +394,7 @@ TXT;
                }
 
                $level = $level + 1;
-               $text .= "#{$level} {main}";
+               $text .= "{$pad}#{$level} {main}";
 
                return $text;
        }
@@ -336,6 +411,20 @@ TXT;
         * @return array
         */
        public static function getRedactedTrace( Exception $e ) {
+               return static::redactTrace( $e->getTrace() );
+       }
+
+       /**
+        * Redact a stacktrace generated by Exception::getTrace(),
+        * debug_backtrace() or similar means. Replaces each element in each
+        * frame's argument array with the name of its class (if the element is an
+        * object) or its type (if the element is a PHP primitive).
+        *
+        * @since 1.26
+        * @param array $trace Stacktrace
+        * @return array Stacktrace with arugment values converted to data types
+        */
+       public static function redactTrace( array $trace ) {
                return array_map( function ( $frame ) {
                        if ( isset( $frame['args'] ) ) {
                                $frame['args'] = array_map( function ( $arg ) {
@@ -343,7 +432,7 @@ TXT;
                                }, $frame['args'] );
                        }
                        return $frame;
-               }, $e->getTrace() );
+               }, $trace );
        }
 
        /**
@@ -409,6 +498,7 @@ TXT;
        public static function getLogContext( Exception $e ) {
                return array(
                        'exception' => $e,
+                       'exception_id' => static::getLogId( $e ),
                );
        }
 
@@ -548,7 +638,8 @@ TXT;
        */
        protected static function logError( ErrorException $e, $channel ) {
                // The set_error_handler callback is independent from error_reporting.
-               // Filter out unwanted errors manually (e.g. when MediaWiki\suppressWarnings is active).
+               // Filter out unwanted errors manually (e.g. when
+               // MediaWiki\suppressWarnings is active).
                $suppressed = ( error_reporting() & $e->getSeverity() ) === 0;
                if ( !$suppressed ) {
                        $logger = LoggerFactory::getInstance( $channel );
index 4070553..d2c37e6 100644 (file)
@@ -502,9 +502,17 @@ class LocalFile extends File {
                        $decoded['mime'] = $decoded['major_mime'] . '/' . $decoded['minor_mime'];
                }
 
-               # Trim zero padding from char/binary field
+               // Trim zero padding from char/binary field
                $decoded['sha1'] = rtrim( $decoded['sha1'], "\0" );
 
+               // Normalize some fields to integer type, per their database definition.
+               // Use unary + so that overflows will be upgraded to double instead of
+               // being trucated as with intval(). This is important to allow >2GB
+               // files on 32-bit systems.
+               foreach ( array( 'size', 'width', 'height', 'bits' ) as $field ) {
+                       $decoded[$field] = +$decoded[$field];
+               }
+
                return $decoded;
        }
 
index 38729a5..08fa0a9 100644 (file)
@@ -898,6 +898,7 @@ class HTMLForm extends ContextSource {
                # For good measure (it is the default)
                $this->getOutput()->preventClickjacking();
                $this->getOutput()->addModules( 'mediawiki.htmlform' );
+               $this->getOutput()->addModuleStyles( 'mediawiki.htmlform.styles' );
 
                $html = ''
                        . $this->getErrors( $submitResult )
index cbe64d6..aa24362 100644 (file)
                        "Nemo bis",
                        "Ricordisamoa",
                        "Fpugliajno",
-                       "The Polish"
+                       "The Polish",
+                       "Sannita"
                ]
        },
-       "config-desc": "Il programma di installazione per MediaWiki",
+       "config-desc": "Programma di installazione per MediaWiki",
        "config-title": "Installazione di MediaWiki $1",
        "config-information": "Informazioni",
        "config-localsettings-upgrade": "È stato rilevato un file <code>LocalSettings.php</code>.\nPer aggiornare questa installazione, si prega di inserire il valore di <code>$wgUpgradeKey</code> nella casella qui sotto.\nLo potete trovare in <code>LocalSettings.php</code>.",
index 4d9fa38..27dddd3 100644 (file)
@@ -16,7 +16,8 @@
                        "Marcos dias de oliveira",
                        "Fasouzafreitas",
                        "TheEduGobi",
-                       "Dianakc"
+                       "Dianakc",
+                       "Walesson"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -65,7 +66,7 @@
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
        "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
-       "config-no-db": "Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.\nSão suportados os seguintes tipos de bancos de dados: $1.\n\nSe você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo <code>./configure --with-mysqli</code>.\nSe você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, então será também necessário instalar, por exemplo, o pacote <code>php5-mysql</code>.",
+       "config-no-db": "Não foi possível localizar um driver de banco de dados apropriado! Você precisa instalar um driver de banco de dados para PHP. O banco de dados seguinte {{PLURAL: $ 2 | | tipo é tipos são}} suportado: $ 1. Se você compilou o PHP mesmo, reconfigurá-lo com um cliente de banco de dados ativada, por exemplo, usando <code> ./ configure --with-mysqli </ code>. Se você instalou o PHP a partir de um pacote Debian ou Ubuntu, então você também precisa instalar, por exemplo, o <code> php5-mysql </ code> pacote.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-register-globals-error": "<strong>Erro: a opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.\nA mesma deve ser desativada para continuar a instalação.</strong>\nVeja [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obter ajuda com isto.",
@@ -74,7 +75,7 @@
        "config-magic-quotes-sybase": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-mbstring": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-safe-mode": "<strong>Aviso:</strong> O [http://www.php.net/features.safe-mode safe mode] do PHP está ativado.\nEste modo pode causar problemas, especialmente no upload de arquivos e no suporte a <code>math</code>.",
-       "config-xml-bad": "O módulo XML do PHP está ausente.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está utilizando o Mandrake, instale o pacote php-xml.",
+       "config-xml-bad": "Módulo XML do PHP está faltando. MediaWiki requer funções deste módulo e não vai funcionar nesta configuração. Pode ser necessário instalar o pacote RPM php-xml.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "<strong>Erro fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte a PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
        "config-db-install-account": "Conta de usuário para instalação",
        "config-db-username": "Nome de usuário do banco de dados:",
        "config-db-password": "Senha do banco de dados:",
-       "config-db-password-empty": "Por favor digite uma senha para o novo usuário do banco de dados: $1. Embora seja possível criar usuários sem senha, isto não é seguro.",
-       "config-db-username-empty": "É necessário entrar um valor para \"{{int:config-db-username}}\".",
        "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua base de dados.",
        "config-db-install-password": "Digite a senha que será utilizada para conectar com o banco de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha para seu banco de dados.",
        "config-db-install-help": "Digite o nome de usuário e a senha que serão utilizados para conectar com o banco de dados durante o processo de instalação.",
index ee68882..7f0ad67 100644 (file)
@@ -4,9 +4,40 @@
                        "Ammartivari"
                ]
        },
+       "config-desc": "Instaluesi për MediaWiki",
+       "config-title": "Instalimi MediaWiki $1",
+       "config-information": "Të dhëna",
+       "config-your-language": "Gjuha juaj:",
+       "config-your-language-help": "Zgjidhni një gjuhë për ta përdorur gjatë procesit të instalimit.",
+       "config-wiki-language": "Gjuha wiki:",
+       "config-wiki-language-help": "Zgjidhni gjuhën në të cilën wiki do të jetë kryesisht e shkruar.",
+       "config-back": "← Prapa",
+       "config-continue": "Para →",
+       "config-page-language": "Gjuha",
+       "config-page-welcome": "Mirë se vini në MediaWiki!",
+       "config-page-dbconnect": "Lidhuni me bazën e të dhënave",
+       "config-page-dbsettings": "Cilësimet e bazës së të dhënave",
+       "config-page-name": "Emri",
+       "config-page-options": "Opcionet",
+       "config-page-install": "Instalo",
+       "config-page-complete": "Përfundoi!",
+       "config-page-restart": "Rinisni instalimin",
+       "config-page-copying": "Duke kopjuar",
+       "config-restart": "Po, rinisni",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] u instalua",
+       "config-apc": "[http://www.php.net/apc APC] u instalua",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] u instalua",
+       "config-diff3-bad": "GNU diff3 nuk u gjet.",
+       "config-db-wiki-settings": "Identifikoni këtë wiki",
+       "config-db-name": "Emri i bazës së të dhënave:",
        "config-admin-box": "Llogari administruesi",
        "config-admin-name-blank": "Shkruani nofkën e një administruesi.",
        "config-admin-password-blank": "Shkruani një fjalëkalim për llogarinë e administruesit.",
+       "config-admin-email": "Email adresa:",
+       "config-license-pd": "Domeni publik",
+       "config-logo": "URL-ja i logos:",
+       "config-install-tables": "Duke krijuar tabela",
+       "config-help": "ndihmë",
        "mainpagetext": "'''MediaWiki software u instalua me sukses.'''",
        "mainpagedocfooter": "Për më shumë informata rreth përdorimit të softwerit wiki , ju lutem shikoni [//meta.wikimedia.org/wiki/Help:Contents dokumentacionin përkatës].\n\n== Sa për fillim==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Parazgjedhjet e MediaWiki-t]\n* [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWiki-t]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]"
 }
index 4be20b2..1f00650 100644 (file)
@@ -70,8 +70,7 @@ class BitmapHandler extends TransformationalImageHandler {
        protected function transformImageMagick( $image, $params ) {
                # use ImageMagick
                global $wgSharpenReductionThreshold, $wgSharpenParameter, $wgMaxAnimatedGifArea,
-                       $wgImageMagickTempDir, $wgImageMagickConvertCommand, $wgResourceBasePath,
-                       $wgUseTinyRGBForJPGThumbnails;
+                       $wgImageMagickTempDir, $wgImageMagickConvertCommand;
 
                $quality = array();
                $sharpen = array();
index dbbe991..dac76fa 100644 (file)
@@ -150,7 +150,7 @@ class DjVuImage {
                                wfDebug( __METHOD__ . ": not a DjVu file\n" );
                        } elseif ( $subtype == 'DJVU' ) {
                                // Single-page document
-                               $info = $this->getPageInfo( $file, $formLength );
+                               $info = $this->getPageInfo( $file );
                        } elseif ( $subtype == 'DJVM' ) {
                                // Multi-page document
                                $info = $this->getMultiPageInfo( $file, $formLength );
@@ -202,7 +202,7 @@ class DjVuImage {
                                if ( $subtype == 'DJVU' ) {
                                        wfDebug( __METHOD__ . ": found first subpage\n" );
 
-                                       return $this->getPageInfo( $file, $length );
+                                       return $this->getPageInfo( $file );
                                }
                                $this->skipChunk( $file, $length - 4 );
                        } else {
@@ -216,7 +216,7 @@ class DjVuImage {
                return false;
        }
 
-       private function getPageInfo( $file, $formLength ) {
+       private function getPageInfo( $file ) {
                list( $chunk, $length ) = $this->readChunk( $file );
                if ( $chunk != 'INFO' ) {
                        wfDebug( __METHOD__ . ": expected INFO chunk, got '$chunk'\n" );
index 8afa31b..1ec2f81 100644 (file)
@@ -319,16 +319,6 @@ class SVGReader {
                }
        }
 
-       // @todo FIXME: Unused, remove?
-       private function warn( $data ) {
-               wfDebug( "SVGReader: $data\n" );
-       }
-
-       // @todo FIXME: Unused, remove?
-       private function notice( $data ) {
-               wfDebug( "SVGReader WARN: $data\n" );
-       }
-
        /**
         * Parse the attributes of an SVG element
         *
index 97aa796..1d8d777 100644 (file)
@@ -34,8 +34,6 @@ class XMPInfo {
                return self::$items;
        }
 
-       static private $ranHooks = false;
-
        /**
         * XMPInfo::$items keeps a list of all the items
         * we are interested to extract, as well as
index 664f0a4..ab5c586 100644 (file)
@@ -3326,7 +3326,8 @@ class Parser {
         */
        public function replaceVariables( $text, $frame = false, $argsOnly = false ) {
                # Is there any text? Also, Prevent too big inclusions!
-               if ( strlen( $text ) < 1 || strlen( $text ) > $this->mOptions->getMaxIncludeSize() ) {
+               $textSize = strlen( $text );
+               if ( $textSize < 1 || $textSize > $this->mOptions->getMaxIncludeSize() ) {
                        return $text;
                }
 
index 4459047..1073aed 100644 (file)
@@ -802,6 +802,10 @@ class ParserOptions {
 
                $confstr .= $wgRenderHashAppend;
 
+               // @note: as of Feb 2015, core never sets the editsection flag, since it uses
+               // <mw:editsection> tags to inject editsections on the fly. However, extensions
+               // may be using it by calling ParserOption::optionUsed resp. ParserOutput::registerOption
+               // directly. At least Wikibase does at this point in time.
                if ( !in_array( 'editsection', $forOptions ) ) {
                        $confstr .= '!*';
                } elseif ( !$this->mEditSection ) {
index 3224b13..4a4a828 100644 (file)
@@ -591,10 +591,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
                $options = array();
                foreach ( array(
-                       // T104950: Do not include localBasePath or remoteBasePath!
-                       // Those paths may vary over time and needlessly invalidate cache. If the path changes
-                       // in a way that makes relative file paths point to something else, getFileHashes() will
-                       // account for that already.
+                       // The following properties are omitted because they don't affect the module reponse:
+                       // - localBasePath (Per T104950; Changes when absolute directory name changes. If
+                       //    this affects 'scripts' and other file paths, getFileHashes accounts for that.)
+                       // - remoteBasePath (Per T104950)
+                       // - dependencies (provided via startup module)
+                       // - targets
+                       // - group (provided via startup module)
+                       // - position (only used by OutputPage)
                        'scripts',
                        'debugScripts',
                        'loaderScripts',
@@ -602,12 +606,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        'languageScripts',
                        'skinScripts',
                        'skinStyles',
-                       'dependencies',
                        'messages',
-                       'targets',
                        'templates',
-                       'group',
-                       'position',
                        'skipFunction',
                        'debugRaw',
                        'raw',
index 9e7dc00..31200c8 100644 (file)
@@ -263,6 +263,8 @@ class UsersPager extends AlphabeticPager {
        function getPageHeader() {
                list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
 
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+
                # Form tag
                $out = Xml::openElement(
                        'form',
@@ -271,13 +273,14 @@ class UsersPager extends AlphabeticPager {
                        Xml::fieldset( $this->msg( 'listusers' )->text() ) .
                        Html::hidden( 'title', $self );
 
-               # Username field
+               # Username field (with autocompletion support)
                $out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' .
                        Html::input(
                                'username',
                                $this->requestedUser,
                                'text',
                                array(
+                                       'class' => 'mw-autocomplete-user',
                                        'id' => 'offset',
                                        'size' => 20,
                                        'autofocus' => $this->requestedUser === ''
index 27a3a69..cba5a44 100644 (file)
@@ -25,6 +25,7 @@
  * Let users reset tokens like the watchlist token.
  *
  * @ingroup SpecialPage
+ * @deprecated 1.26
  */
 class SpecialResetTokens extends FormSpecialPage {
        private $tokensList;
index 5b6d22b..0410ef0 100644 (file)
@@ -1367,9 +1367,6 @@ class LoginForm extends SpecialPage {
                        'mediawiki.ui.input',
                        'mediawiki.special.userlogin.common.styles'
                ) );
-               $out->addModules( array(
-                       'mediawiki.special.userlogin.common.js'
-               ) );
 
                if ( $this->mType == 'signup' ) {
                        // XXX hack pending RL or JS parse() support for complex content messages
index b47442d..1613536 100644 (file)
@@ -167,9 +167,11 @@ class Language {
         * Generated by UnicodeJS (see tools/strongDir) from the UCD; see
         * https://git.wikimedia.org/summary/unicodejs.git .
         */
+       // @codingStandardsIgnoreStart
        // @codeCoverageIgnoreStart
        static private $strongDirRegex = '/(?:([\x{41}-\x{5a}\x{61}-\x{7a}\x{aa}\x{b5}\x{ba}\x{c0}-\x{d6}\x{d8}-\x{f6}\x{f8}-\x{2b8}\x{2bb}-\x{2c1}\x{2d0}\x{2d1}\x{2e0}-\x{2e4}\x{2ee}\x{370}-\x{373}\x{376}\x{377}\x{37a}-\x{37d}\x{37f}\x{386}\x{388}-\x{38a}\x{38c}\x{38e}-\x{3a1}\x{3a3}-\x{3f5}\x{3f7}-\x{482}\x{48a}-\x{52f}\x{531}-\x{556}\x{559}-\x{55f}\x{561}-\x{587}\x{589}\x{903}-\x{939}\x{93b}\x{93d}-\x{940}\x{949}-\x{94c}\x{94e}-\x{950}\x{958}-\x{961}\x{964}-\x{980}\x{982}\x{983}\x{985}-\x{98c}\x{98f}\x{990}\x{993}-\x{9a8}\x{9aa}-\x{9b0}\x{9b2}\x{9b6}-\x{9b9}\x{9bd}-\x{9c0}\x{9c7}\x{9c8}\x{9cb}\x{9cc}\x{9ce}\x{9d7}\x{9dc}\x{9dd}\x{9df}-\x{9e1}\x{9e6}-\x{9f1}\x{9f4}-\x{9fa}\x{a03}\x{a05}-\x{a0a}\x{a0f}\x{a10}\x{a13}-\x{a28}\x{a2a}-\x{a30}\x{a32}\x{a33}\x{a35}\x{a36}\x{a38}\x{a39}\x{a3e}-\x{a40}\x{a59}-\x{a5c}\x{a5e}\x{a66}-\x{a6f}\x{a72}-\x{a74}\x{a83}\x{a85}-\x{a8d}\x{a8f}-\x{a91}\x{a93}-\x{aa8}\x{aaa}-\x{ab0}\x{ab2}\x{ab3}\x{ab5}-\x{ab9}\x{abd}-\x{ac0}\x{ac9}\x{acb}\x{acc}\x{ad0}\x{ae0}\x{ae1}\x{ae6}-\x{af0}\x{af9}\x{b02}\x{b03}\x{b05}-\x{b0c}\x{b0f}\x{b10}\x{b13}-\x{b28}\x{b2a}-\x{b30}\x{b32}\x{b33}\x{b35}-\x{b39}\x{b3d}\x{b3e}\x{b40}\x{b47}\x{b48}\x{b4b}\x{b4c}\x{b57}\x{b5c}\x{b5d}\x{b5f}-\x{b61}\x{b66}-\x{b77}\x{b83}\x{b85}-\x{b8a}\x{b8e}-\x{b90}\x{b92}-\x{b95}\x{b99}\x{b9a}\x{b9c}\x{b9e}\x{b9f}\x{ba3}\x{ba4}\x{ba8}-\x{baa}\x{bae}-\x{bb9}\x{bbe}\x{bbf}\x{bc1}\x{bc2}\x{bc6}-\x{bc8}\x{bca}-\x{bcc}\x{bd0}\x{bd7}\x{be6}-\x{bf2}\x{c01}-\x{c03}\x{c05}-\x{c0c}\x{c0e}-\x{c10}\x{c12}-\x{c28}\x{c2a}-\x{c39}\x{c3d}\x{c41}-\x{c44}\x{c58}-\x{c5a}\x{c60}\x{c61}\x{c66}-\x{c6f}\x{c7f}\x{c82}\x{c83}\x{c85}-\x{c8c}\x{c8e}-\x{c90}\x{c92}-\x{ca8}\x{caa}-\x{cb3}\x{cb5}-\x{cb9}\x{cbd}-\x{cc4}\x{cc6}-\x{cc8}\x{cca}\x{ccb}\x{cd5}\x{cd6}\x{cde}\x{ce0}\x{ce1}\x{ce6}-\x{cef}\x{cf1}\x{cf2}\x{d02}\x{d03}\x{d05}-\x{d0c}\x{d0e}-\x{d10}\x{d12}-\x{d3a}\x{d3d}-\x{d40}\x{d46}-\x{d48}\x{d4a}-\x{d4c}\x{d4e}\x{d57}\x{d5f}-\x{d61}\x{d66}-\x{d75}\x{d79}-\x{d7f}\x{d82}\x{d83}\x{d85}-\x{d96}\x{d9a}-\x{db1}\x{db3}-\x{dbb}\x{dbd}\x{dc0}-\x{dc6}\x{dcf}-\x{dd1}\x{dd8}-\x{ddf}\x{de6}-\x{def}\x{df2}-\x{df4}\x{e01}-\x{e30}\x{e32}\x{e33}\x{e40}-\x{e46}\x{e4f}-\x{e5b}\x{e81}\x{e82}\x{e84}\x{e87}\x{e88}\x{e8a}\x{e8d}\x{e94}-\x{e97}\x{e99}-\x{e9f}\x{ea1}-\x{ea3}\x{ea5}\x{ea7}\x{eaa}\x{eab}\x{ead}-\x{eb0}\x{eb2}\x{eb3}\x{ebd}\x{ec0}-\x{ec4}\x{ec6}\x{ed0}-\x{ed9}\x{edc}-\x{edf}\x{f00}-\x{f17}\x{f1a}-\x{f34}\x{f36}\x{f38}\x{f3e}-\x{f47}\x{f49}-\x{f6c}\x{f7f}\x{f85}\x{f88}-\x{f8c}\x{fbe}-\x{fc5}\x{fc7}-\x{fcc}\x{fce}-\x{fda}\x{1000}-\x{102c}\x{1031}\x{1038}\x{103b}\x{103c}\x{103f}-\x{1057}\x{105a}-\x{105d}\x{1061}-\x{1070}\x{1075}-\x{1081}\x{1083}\x{1084}\x{1087}-\x{108c}\x{108e}-\x{109c}\x{109e}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1360}-\x{137c}\x{1380}-\x{138f}\x{13a0}-\x{13f5}\x{13f8}-\x{13fd}\x{1401}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16f8}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1735}\x{1736}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17b6}\x{17be}-\x{17c5}\x{17c7}\x{17c8}\x{17d4}-\x{17da}\x{17dc}\x{17e0}-\x{17e9}\x{1810}-\x{1819}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191e}\x{1923}-\x{1926}\x{1929}-\x{192b}\x{1930}\x{1931}\x{1933}-\x{1938}\x{1946}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19b0}-\x{19c9}\x{19d0}-\x{19da}\x{1a00}-\x{1a16}\x{1a19}\x{1a1a}\x{1a1e}-\x{1a55}\x{1a57}\x{1a61}\x{1a63}\x{1a64}\x{1a6d}-\x{1a72}\x{1a80}-\x{1a89}\x{1a90}-\x{1a99}\x{1aa0}-\x{1aad}\x{1b04}-\x{1b33}\x{1b35}\x{1b3b}\x{1b3d}-\x{1b41}\x{1b43}-\x{1b4b}\x{1b50}-\x{1b6a}\x{1b74}-\x{1b7c}\x{1b82}-\x{1ba1}\x{1ba6}\x{1ba7}\x{1baa}\x{1bae}-\x{1be5}\x{1be7}\x{1bea}-\x{1bec}\x{1bee}\x{1bf2}\x{1bf3}\x{1bfc}-\x{1c2b}\x{1c34}\x{1c35}\x{1c3b}-\x{1c49}\x{1c4d}-\x{1c7f}\x{1cc0}-\x{1cc7}\x{1cd3}\x{1ce1}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf3}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{200e}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{214f}\x{2160}-\x{2188}\x{2336}-\x{237a}\x{2395}\x{249c}-\x{24e9}\x{26ac}\x{2800}-\x{28ff}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d70}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{302e}\x{302f}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{3190}-\x{31ba}\x{31f0}-\x{321c}\x{3220}-\x{324f}\x{3260}-\x{327b}\x{327f}-\x{32b0}\x{32c0}-\x{32cb}\x{32d0}-\x{32fe}\x{3300}-\x{3376}\x{337b}-\x{33dd}\x{33e0}-\x{33fe}\x{3400}-\x{4db5}\x{4e00}-\x{9fd5}\x{a000}-\x{a48c}\x{a4d0}-\x{a60c}\x{a610}-\x{a62b}\x{a640}-\x{a66e}\x{a680}-\x{a69d}\x{a6a0}-\x{a6ef}\x{a6f2}-\x{a6f7}\x{a722}-\x{a787}\x{a789}-\x{a7ad}\x{a7b0}-\x{a7b7}\x{a7f7}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a824}\x{a827}\x{a830}-\x{a837}\x{a840}-\x{a873}\x{a880}-\x{a8c3}\x{a8ce}-\x{a8d9}\x{a8f2}-\x{a8fd}\x{a900}-\x{a925}\x{a92e}-\x{a946}\x{a952}\x{a953}\x{a95f}-\x{a97c}\x{a983}-\x{a9b2}\x{a9b4}\x{a9b5}\x{a9ba}\x{a9bb}\x{a9bd}-\x{a9cd}\x{a9cf}-\x{a9d9}\x{a9de}-\x{a9e4}\x{a9e6}-\x{a9fe}\x{aa00}-\x{aa28}\x{aa2f}\x{aa30}\x{aa33}\x{aa34}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa4d}\x{aa50}-\x{aa59}\x{aa5c}-\x{aa7b}\x{aa7d}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aaeb}\x{aaee}-\x{aaf5}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{ab30}-\x{ab65}\x{ab70}-\x{abe4}\x{abe6}\x{abe7}\x{abe9}-\x{abec}\x{abf0}-\x{abf9}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{e000}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}\x{10000}-\x{1000b}\x{1000d}-\x{10026}\x{10028}-\x{1003a}\x{1003c}\x{1003d}\x{1003f}-\x{1004d}\x{10050}-\x{1005d}\x{10080}-\x{100fa}\x{10100}\x{10102}\x{10107}-\x{10133}\x{10137}-\x{1013f}\x{101d0}-\x{101fc}\x{10280}-\x{1029c}\x{102a0}-\x{102d0}\x{10300}-\x{10323}\x{10330}-\x{1034a}\x{10350}-\x{10375}\x{10380}-\x{1039d}\x{1039f}-\x{103c3}\x{103c8}-\x{103d5}\x{10400}-\x{1049d}\x{104a0}-\x{104a9}\x{10500}-\x{10527}\x{10530}-\x{10563}\x{1056f}\x{10600}-\x{10736}\x{10740}-\x{10755}\x{10760}-\x{10767}\x{11000}\x{11002}-\x{11037}\x{11047}-\x{1104d}\x{11066}-\x{1106f}\x{11082}-\x{110b2}\x{110b7}\x{110b8}\x{110bb}-\x{110c1}\x{110d0}-\x{110e8}\x{110f0}-\x{110f9}\x{11103}-\x{11126}\x{1112c}\x{11136}-\x{11143}\x{11150}-\x{11172}\x{11174}-\x{11176}\x{11182}-\x{111b5}\x{111bf}-\x{111c9}\x{111cd}\x{111d0}-\x{111df}\x{111e1}-\x{111f4}\x{11200}-\x{11211}\x{11213}-\x{1122e}\x{11232}\x{11233}\x{11235}\x{11238}-\x{1123d}\x{11280}-\x{11286}\x{11288}\x{1128a}-\x{1128d}\x{1128f}-\x{1129d}\x{1129f}-\x{112a9}\x{112b0}-\x{112de}\x{112e0}-\x{112e2}\x{112f0}-\x{112f9}\x{11302}\x{11303}\x{11305}-\x{1130c}\x{1130f}\x{11310}\x{11313}-\x{11328}\x{1132a}-\x{11330}\x{11332}\x{11333}\x{11335}-\x{11339}\x{1133d}-\x{1133f}\x{11341}-\x{11344}\x{11347}\x{11348}\x{1134b}-\x{1134d}\x{11350}\x{11357}\x{1135d}-\x{11363}\x{11480}-\x{114b2}\x{114b9}\x{114bb}-\x{114be}\x{114c1}\x{114c4}-\x{114c7}\x{114d0}-\x{114d9}\x{11580}-\x{115b1}\x{115b8}-\x{115bb}\x{115be}\x{115c1}-\x{115db}\x{11600}-\x{11632}\x{1163b}\x{1163c}\x{1163e}\x{11641}-\x{11644}\x{11650}-\x{11659}\x{11680}-\x{116aa}\x{116ac}\x{116ae}\x{116af}\x{116b6}\x{116c0}-\x{116c9}\x{11700}-\x{11719}\x{11720}\x{11721}\x{11726}\x{11730}-\x{1173f}\x{118a0}-\x{118f2}\x{118ff}\x{11ac0}-\x{11af8}\x{12000}-\x{12399}\x{12400}-\x{1246e}\x{12470}-\x{12474}\x{12480}-\x{12543}\x{13000}-\x{1342e}\x{14400}-\x{14646}\x{16800}-\x{16a38}\x{16a40}-\x{16a5e}\x{16a60}-\x{16a69}\x{16a6e}\x{16a6f}\x{16ad0}-\x{16aed}\x{16af5}\x{16b00}-\x{16b2f}\x{16b37}-\x{16b45}\x{16b50}-\x{16b59}\x{16b5b}-\x{16b61}\x{16b63}-\x{16b77}\x{16b7d}-\x{16b8f}\x{16f00}-\x{16f44}\x{16f50}-\x{16f7e}\x{16f93}-\x{16f9f}\x{1b000}\x{1b001}\x{1bc00}-\x{1bc6a}\x{1bc70}-\x{1bc7c}\x{1bc80}-\x{1bc88}\x{1bc90}-\x{1bc99}\x{1bc9c}\x{1bc9f}\x{1d000}-\x{1d0f5}\x{1d100}-\x{1d126}\x{1d129}-\x{1d166}\x{1d16a}-\x{1d172}\x{1d183}\x{1d184}\x{1d18c}-\x{1d1a9}\x{1d1ae}-\x{1d1e8}\x{1d360}-\x{1d371}\x{1d400}-\x{1d454}\x{1d456}-\x{1d49c}\x{1d49e}\x{1d49f}\x{1d4a2}\x{1d4a5}\x{1d4a6}\x{1d4a9}-\x{1d4ac}\x{1d4ae}-\x{1d4b9}\x{1d4bb}\x{1d4bd}-\x{1d4c3}\x{1d4c5}-\x{1d505}\x{1d507}-\x{1d50a}\x{1d50d}-\x{1d514}\x{1d516}-\x{1d51c}\x{1d51e}-\x{1d539}\x{1d53b}-\x{1d53e}\x{1d540}-\x{1d544}\x{1d546}\x{1d54a}-\x{1d550}\x{1d552}-\x{1d6a5}\x{1d6a8}-\x{1d6da}\x{1d6dc}-\x{1d714}\x{1d716}-\x{1d74e}\x{1d750}-\x{1d788}\x{1d78a}-\x{1d7c2}\x{1d7c4}-\x{1d7cb}\x{1d800}-\x{1d9ff}\x{1da37}-\x{1da3a}\x{1da6d}-\x{1da74}\x{1da76}-\x{1da83}\x{1da85}-\x{1da8b}\x{1f110}-\x{1f12e}\x{1f130}-\x{1f169}\x{1f170}-\x{1f19a}\x{1f1e6}-\x{1f202}\x{1f210}-\x{1f23a}\x{1f240}-\x{1f248}\x{1f250}\x{1f251}\x{20000}-\x{2a6d6}\x{2a700}-\x{2b734}\x{2b740}-\x{2b81d}\x{2b820}-\x{2cea1}\x{2f800}-\x{2fa1d}\x{f0000}-\x{ffffd}\x{100000}-\x{10fffd}])|([\x{590}\x{5be}\x{5c0}\x{5c3}\x{5c6}\x{5c8}-\x{5ff}\x{7c0}-\x{7ea}\x{7f4}\x{7f5}\x{7fa}-\x{815}\x{81a}\x{824}\x{828}\x{82e}-\x{858}\x{85c}-\x{89f}\x{200f}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb4f}\x{10800}-\x{1091e}\x{10920}-\x{10a00}\x{10a04}\x{10a07}-\x{10a0b}\x{10a10}-\x{10a37}\x{10a3b}-\x{10a3e}\x{10a40}-\x{10ae4}\x{10ae7}-\x{10b38}\x{10b40}-\x{10e5f}\x{10e7f}-\x{10fff}\x{1e800}-\x{1e8cf}\x{1e8d7}-\x{1edff}\x{1ef00}-\x{1efff}\x{608}\x{60b}\x{60d}\x{61b}-\x{64a}\x{66d}-\x{66f}\x{671}-\x{6d5}\x{6e5}\x{6e6}\x{6ee}\x{6ef}\x{6fa}-\x{710}\x{712}-\x{72f}\x{74b}-\x{7a5}\x{7b1}-\x{7bf}\x{8a0}-\x{8e2}\x{fb50}-\x{fd3d}\x{fd40}-\x{fdcf}\x{fdf0}-\x{fdfc}\x{fdfe}\x{fdff}\x{fe70}-\x{fefe}\x{1ee00}-\x{1eeef}\x{1eef2}-\x{1eeff}]))/u';
        // @codeCoverageIgnoreEnd
+       // @codingStandardsIgnoreEnd
 
        /**
         * Get a cached or new language object for a given language code
index d2faa93..f31a36e 100644 (file)
@@ -39,6 +39,7 @@
        "tog-watchdefault": "Voeg bladsye en lêers wat ek wysig by my dophoulys",
        "tog-watchmoves": "Voeg bladsye en lêers wat ek skuif by my dophoulys",
        "tog-watchdeletion": "Voeg bladsye en lêers wat ek skrap by my dophoulys",
+       "tog-watchrollback": "Voeg bladsye wat ek teruggerol het by my dophoulys",
        "tog-minordefault": "Merk alle wysigings automaties as klein by verstek.",
        "tog-previewontop": "Wys voorskou bo wysigingsboks.",
        "tog-previewonfirst": "Wys voorskou met eerste wysiging",
        "listgrouprights-removegroup-self-all": "Alle groepe verwyder van eie gebruiker",
        "listgrouprights-namespaceprotection-header": "Naamruimtebeperkings",
        "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+       "trackingcategories": "Volg kategorieë",
        "trackingcategories-msg": "Volg kategorie",
        "trackingcategories-name": "Boodskapnaam",
        "trackingcategories-nodesc": "Geen beskrywing beskikbaar nie.",
        "log-name-pagelang": "Logboek van taalwysigings",
        "log-description-pagelang": "Hierdie is 'n logboek van wysigings van die taal van bladsye.",
        "logentry-pagelang-pagelang": "$1 wysig die taal van bladsy '$3' van $4 na $5.",
+       "mediastatistics": "Mediastatistieke",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 greep|$1 grepe}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-tipe",
        "mediastatistics-table-extensions": "Moontlike uitbreidings",
index a3d10dc..31a6016 100644 (file)
@@ -12,7 +12,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Carlos Cristia"
+                       "Carlos Cristia",
+                       "MarcoAurelio"
                ]
        },
        "tog-underline": "Subrayar os vinclos:",
        "prefs-reset-intro": "Puet emplegar ista pachina ta restaurar as suyas preferencias a las valuras por defecto d'o sitio.\nNo se podrá desfer iste cambio.",
        "prefs-emailconfirm-label": "Confirmación de correu electronico:",
        "youremail": "Adreza de correu electronico:",
-       "username": "Nombre d'usuario:",
+       "username": "{{GENDER:$1|Nombre d'usuario|Nombre d'usuaria|Nombre d'usuario}}:",
        "prefs-memberingroups": "Miembro {{PLURAL:$1|d'a colla|d'as collas}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Tiempo de rechistro:",
        "mailnologin": "No ninviar l'adreza",
        "mailnologintext": "Ha d'haber [[Special:UserLogin|encetato una sesión]] y tener una adreza conforme de correu-e en as suyas [[Special:Preferences|preferencias]] ta ninviar un correu electronico ta atros usuarios.",
        "emailuser": "Ninviar un correu electronico ta iste usuario",
-       "emailpage": "Ninviar correu ta l'usuario",
        "emailpagetext": "Puede fer servir o formulario que bi ye contino ta ninviar un correu electronico a iste usuario.\nL'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias d'usuario]] amaneixerá en o campo \"Remitent\" ta que o destinatario pueda responder-le.",
        "defemailsubject": "Correu de {{SITENAME}} de l'usuario $1",
        "usermaildisabled": "S'ha desactivau o ninvío de correus electronicos a os usuarios",
index 01564b0..301dcc8 100644 (file)
        "deletethispage": "امسح الصفحه دى",
        "undeletethispage": "استرجاع الصفحه دى",
        "undelete_short": "استرجاع {{PLURAL:$1|تعديل واحد|تعديلان|$1 تعديلات|$1 تعديل|$1 تعديلا}}",
-       "viewdeleted_short": "عرض {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديل}}",
+       "viewdeleted_short": "عرض {{PLURAL:$1||تعديل واحد ملغى|تعديلين ملغيين|$1 تعديلات  ملغيه}}",
        "protect": "حمايه",
        "protect_change": "غيّر",
        "protectthispage": "احمى الصفحه دى",
        "disclaimers": "تنازل عن مسئوليه",
        "disclaimerpage": "Project:تنازل عن مسئوليه عمومى",
        "edithelp": "مساعده فى التعديل",
+       "helppage-top-gethelp": "مساعده",
        "mainpage": "الصفحه الرئيسيه",
        "mainpage-description": "الصفحه الرئيسيه",
        "policy-url": "Project:سياسة",
        "hidetoc": "تخبية",
        "collapsible-collapse": "خبى",
        "collapsible-expand": "اتوسع",
+       "confirmable-confirm": "انت متأكد{{GENDER:$1||ه}}؟",
+       "confirmable-yes": "ايوه",
+       "confirmable-no": "لا",
        "thisisdeleted": "عرض او استرجاع $1؟",
        "viewdeleted": "عرض $1؟",
        "restorelink": "{{PLURAL:$1|تعديل واحد ملغي|تعديلين ملغيين|$1 تعديلات ملغية|$1 تعديل ملغي|$1 تعديل ملغي}}",
        "readonly_lag": "قاعدة البيانات (الـ database) اتقفلت اوتوماتيكى علشان تقدر السيرڤرات الـ slave تلحق السيرڤر الـ master",
        "internalerror": "غلط جوّانى",
        "internalerror_info": "غلط جوّانى: $1",
+       "internalerror-fatal-exception": "استثناء مميت من النوع \"$1\"",
        "filecopyerror": "ما نفع ش  يتنسخ الفايل \"$1\" لـ \"$2\".",
        "filerenameerror": "ما نفع ش يتغير اسم الفايل \"$1\" لـ \"$2\".",
        "filedeleteerror": "ما نفع ش يتمسح الفايل \"$1\".",
        "protectedpagetext": "الصفحة دى اتحمت من التعديل.",
        "viewsourcetext": "ممكن تشوف وتنسخ مصدر الصفحه دى",
        "protectedinterface": "الصفحة دى هى اللى بتوفر نص الواجهة بتاعة البرنامج،وهى مقفولة لمنع التخريب.\nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [//translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
-       "editinginterface": "'''تحذير''': أنت بتعدل صفحة بتستخدم فى الواجهة النصية  بتاعة البرنامج. \nالتغييرات فى الصفحة دى ها تأثر على مظهر واجهة اليوزر لليوزرز التانيين. \nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [//translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
-       "cascadeprotected": "الصفحة دى محمية من التعديل، بسبب انها مدمجة فى {{PLURAL:$1|الصفحة|الصفحات}} دي، اللى مستعمل فيها خاصية \"حماية الصفحات المدمجة\" :\n$2",
+       "editinginterface": "<strong>تحذير</strong> : أنت بتعدل صفحة بتستخدم فى الواجهة النصية  بتاعة البرنامج. \nالتغييرات فى الصفحة دى ها تأثر على مظهر واجهة اليوزر لليوزرز التانيين. \nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [//translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
+       "cascadeprotected": "اÙ\84صÙ\81حة Ø¯Ù\89 Ù\85Ø­Ù\85Ù\8aØ© Ù\85Ù\86 Ø§Ù\84تعدÙ\8aÙ\84Ø\8c Ø¨Ø³Ø¨Ø¨ Ø§Ù\86Ù\87ا Ù\85دÙ\85جة Ù\81Ù\89 {{PLURAL:$1|اÙ\84صÙ\81حة|اÙ\84صÙ\81حتÙ\8aÙ\86|اÙ\84صÙ\81حات}} Ø¯Ù\8aØ\8c Ø§Ù\84Ù\84Ù\89 Ù\85ستعÙ\85Ù\84 Ù\81Ù\8aÙ\87ا Ø®Ø§ØµÙ\8aØ© \"Ø­Ù\85اÙ\8aØ© Ø§Ù\84صÙ\81حات Ø§Ù\84Ù\85دÙ\85جة\" :\n$2",
        "namespaceprotected": "ما عندكش صلاحية تعديل الصفحات  اللى فى نطاق '''$1'''.",
        "ns-specialprotected": "الصفحات المخصوصة مش ممكن تعديلها.",
        "titleprotected": "العنوان دا محمى من الإنشاء بـ[[User:$1|$1]]. السبب هو ''$2''.",
        "yourpassword": "الباسوورد:",
        "userlogin-yourpassword": "الباسورد:",
        "yourpasswordagain": "اكتب الباسورد تاني:",
+       "createacct-yourpasswordagain": "أكد كلمه السر",
        "remembermypassword": " (لمدة   $1 {{PLURAL:$1|يوم|يوم}})خليك فاكر دخولى على الكمبيوتر دا",
        "yourdomainname": "النطاق بتاعك:",
        "externaldberror": "يا إما فى حاجة غلط فى الدخول على قاعدة البيانات الخارجية أو انت مش مسموح لك تعمل تحديث لحسابك الخارجي.",
        "gotaccount": "عندك حساب؟ '''$1'''.",
        "gotaccountlink": "دخول",
        "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
+       "userlogin-helplink2": "مساعده ف الدخول",
        "createacct-email-ph": "أكتب عنوان الإيميل بتاعك",
        "createaccountmail": "استخدم باسورد مؤقته و إبعتها ع الايميل المحدد ده",
        "createaccountreason": "السبب:",
+       "createacct-reason": "سبب:",
        "createacct-submit": "افتح حسابك",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|تعديل|تعديلات}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحه|صفحات}}",
        "pt-createaccount": "افتح حساب",
        "pt-userlogout": "خروج",
        "changepassword": "غير الباسورد",
-       "resetpass_announce": "اتسجل دخولك دلوقتى بالكود اللى اتبعتلك فى الايميل. علشان تخلص عملية الدخول ،لازم تعملك باسورد جديدة هنا:",
+       "resetpass_announce": " علشان تخلص عملية  تسجيل الدخول ،لازم تعملك باسورد جديده:",
        "resetpass_text": "<!-- أضف نصا هنا -->",
        "resetpass_header": "غيّر الباسورد بتاعة الحساب",
        "oldpassword": "الباسورد القديمة:",
        "retypenew": "اكتب الباسورد الجديده تانى:",
        "resetpass_submit": "اظبط الباسورد و ادخل",
        "changepassword-success": "الباسورد بتاعتك اتغيرت بنجاح!",
+       "changepassword-throttled": "انت عملت  محاولات لوجين كتيره  ع الحساب ده.\nمن فضلك استنى $1 قبل المحاولة مرة تانيه.",
        "resetpass_forbidden": "مش ممكن تغيير الباسورد",
        "resetpass-no-info": "لازم تسجل دخولك علشان تقدر توصل للصفحة دى على طول.",
        "resetpass-submit-loggedin": "غير الباسورد",
        "file-nohires": "مافيش  ريزوليوشن اعلى متوفر.",
        "svg-long-desc": "ملف SVG، اساسا $1 × $2 بكسل، حجم الملف: $3",
        "show-big-image": "الصوره الاصليه",
+       "show-big-image-other": "{{PLURAL:$2||البعد التانى|البعدان التانيين|الأبعاد التانيه}}: $1.",
        "show-big-image-size": "$1 × $2 بكسل",
        "file-info-gif-looped": "ملفوف",
        "file-info-gif-frames": "$1 {{PLURAL:$1|برواز|براويز}}",
        "logentry-delete-delete": "{{GENDER:$2|مسح|مسحت}} $1 صفحة $3",
        "revdelete-restricted": "طبق التعليمات على السيسوبات",
        "revdelete-unrestricted": "شيل الضوابط من على السيسوبات",
+       "logentry-newusers-create": "تم فتح حساب {{GENDER:$2|اليوزر|اليوزره}} $1",
        "logentry-upload-upload": " {{GENDER:$2|رفع|اترفعت}} $1 $3",
        "rightsnone": "(فاضى)",
        "revdelete-summary": "ملخص التعديل",
index cf9d6dd..4113221 100644 (file)
@@ -16,7 +16,8 @@
                        "Baloch Afghanistan",
                        "Macofe",
                        "Sadiqr",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Alp Er Tunqa"
                ]
        },
        "tog-underline": "باغلانتی‌لارین آلتینی خطله:",
@@ -88,7 +89,7 @@
        "june": "ژوئن",
        "july": "ژولای",
        "august": "آقوست",
-       "september": "سئپتامبر",
+       "september": "سپتامبر",
        "october": "اوْکتوبر",
        "november": "نوْوامبر",
        "december": "دئسامبر",
        "june-gen": "ژوئن",
        "july-gen": "جولای",
        "august-gen": "آقوست",
-       "september-gen": "سئپتامبر",
+       "september-gen": "سپتامبر",
        "october-gen": "اوکتوبر",
        "november-gen": "نووامبر",
        "december-gen": "دئسامبر",
        "jun": "ژوئن",
        "jul": "ژولای",
        "aug": "آقوست",
-       "sep": "سئپتامبر",
+       "sep": "سپتامبر",
        "oct": "اوْکتوبر",
        "nov": "نوْوامبر",
        "dec": "دئسامبر",
        "prefs-advancedrendering": "گلیشمیش سئچَنکلر",
        "prefs-advancedsearchoptions": "گلیشمیش سئچَنکلر",
        "prefs-advancedwatchlist": "گلیشمیش سئچَنکلر",
-       "prefs-displayrc": "گؤرونتو سئچَنکلری",
-       "prefs-displaywatchlist": "گؤرونتو سئچَنکلری",
+       "prefs-displayrc": "عکس سئچَنکلری",
+       "prefs-displaywatchlist": "عکس سئچَنکلری",
        "prefs-tokenwatchlist": "آدرس",
        "prefs-diffs": "فرق‌لر",
        "prefs-help-prefershttps": "سیزین بو ترجیحینیزین اثری سیزین سونراکی گیریشینیز دن سونرا اولاجاق.",
        "recentchanges-label-minor": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
        "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
-       "recentchanges-label-plusminus": "صحیفه‌نین اؤلچوسو بایت میقداری ایله تعیین ائدیلیر",
-       "recentchanges-legend-heading": "'''ایختیصارلار:'''",
+       "recentchanges-label-plusminus": "صفحه‌نین اؤلچوسو بایت میقداری ایله تعیین ائدیلیر",
+       "recentchanges-legend-heading": "'''قیسالتمالار:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)",
        "rcnotefrom": "آشاغی داکی دَییشیک لرده <strong>$3, $4</strong> (دن <strong>$1</strong> {{PLURAL:$5|چان گوستریلیب|چان گوستریلیب دیر}}).",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideliu": "یازیلمیش ایستفاده‌چیلری $1",
        "rcshowhideliu-show": "گؤستر",
        "rcshowhideliu-hide": "گیزلت",
-       "rcshowhideanons": "تاÙ\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÛ\8c $1",
+       "rcshowhideanons": "تاÙ\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ Ø§Û\8cØ´Ù\84دÙ\86â\80\8cÙ\84رÛ\8c $1",
        "rcshowhideanons-show": "گؤستر",
        "rcshowhideanons-hide": "گیزلت",
        "rcshowhidepatr": "نظارت ائدیلن دَییشیکلیکلری $1",
        "notvisiblerev": "باشقا ایستیفادی‌چی‌نین سون دییشیک‌لیگی سیلینیب",
        "watchlist-details": "دانیشیق صفحه‌لرینی آیری سایمایاراق، {{PLURAL:$1|$1 صفحه‌نی}} ایزله‌ییرسینیز.",
        "wlheader-enotif": "ایمیل ایله بیلدیریش آچیلیب‌دیر.",
-       "wlheader-showupdated": "سÙ\88Ù\86 Ú¯Ø¤Ø±Ù\88Ø´Ù\88Ù\86Ù\88زدÙ\86 Ø³Ù\88Ù\86را Ø§Ø¦Ø¯Û\8cÙ\84Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ر '''Ù\82اÙ\84Û\8cÙ\86''' Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Û\8cبدÛ\8cÙ\84ر.",
+       "wlheader-showupdated": "سÙ\88Ù\86 Ú¯Ø¤Ø±Ù\88Ø´Ù\88Ù\86Ù\88زدÙ\86 Ø³Ù\88Ù\92Ù\86را Ø§Ø¦Ø¯Û\8cÙ\84Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ر '''Ù\82اÙ\84Û\8cÙ\86''' Ú¯Ø¤Ø±Ø³Ø¯Û\8cÙ\84Û\8cبâ\80\8cدÛ\8cر.",
        "wlnote": "آشاغیداکی {{PLURAL:$1|بیر ديَیشیک‌لیک|<strong>$1</strong> ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|<strong>$2</strong> ساعتدا}} ائدیلمیشدیر. $3، $4",
        "wlshowlast": "سون $1 ساعات $2 گون گؤستر",
        "watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
        "watching": "ایزله‌نیلیر...",
        "unwatching": "ایزله‌مه...",
        "watcherrortext": "ایزلئمئ سیاهی‌سی ترجیحلرینیزی \"$1\" اوچون دییشدیررکن بیر خطا میدانا گلدی.",
-       "enotif_reset": "باخیلمیش بوتون صحیفه‌لری ایشاره‌له.",
+       "enotif_reset": "باخیلمیش بۆتون صفحه‌لری علامت‌له.",
        "enotif_impersonal_salutation": "{{SITENAME}} ایستیفاده‌چی‌سی",
        "enotif_subject_deleted": "{{SITENAME}} $1 صحیفه‌سی، {{gender:$2|$2}} ایله سیلینیب‌دیر",
        "enotif_subject_created": "{{SITENAME}} $1 صحیفه‌سی، {{gender:$2|$2}} ایله یارانیب‌دیر",
        "previousdiff": "اسکی دَییشدیرمه",
        "nextdiff": "یئنی دَییشدیرمه",
        "mediawarning": "'''خبردارلیق: بو ​​فایل نوعو پیس نیت‌لی کودلار اولا بیلر.\nبونو ایشلتمک، سیستئمینیزی تهلوکه‌یه آتا بیلر.",
-       "imagemaxsize": "گؤرونتو ماکسیمال توتومو:<br />(فایلین تصویری صفحه‌لری اۆچون)'",
+       "imagemaxsize": "عکس ماکسیمال توتومو:<br />(فایلین تصویری صفحه‌لری اۆچون)'",
        "thumbsize": "کیچیک اؤلچو:",
        "widthheightpage": "$1 × $2، $3 {{PLURAL:$3|صحیف|صحیفه‌لر}}",
        "file-info": "فایلین اؤلچوسو: $1، MIME تیپی: $2",
index dda6e08..b03bc8d 100644 (file)
        "booksources-text": "Ніжэй знаходзіцца сьпіс спасылак на іншыя сайты, якія прадаюць новыя і патрыманыя кнігі, і могуць таксама мець інфармацыю пра кнігі, якія Вы шукаеце:",
        "booksources-invalid-isbn": "Пададзены няслушны ISBN; праверце, магчыма ўзьніклі памылкі пры пераносе нумару з арыгінальнай крыніцы.",
        "specialloguserlabel": "Выканаўца:",
-       "speciallogtitlelabel": "Мэта (назва ці удзельнік):",
+       "speciallogtitlelabel": "Мэта (назва ці {{ns:user}}:імя_ўдзельніка для ўдзельніка):",
        "log": "Журналы падзеяў",
        "all-logs-page": "Усе публічныя журналы падзеяў",
        "alllogstext": "Сумесны паказ усіх журналаў падзеяў {{GRAMMAR:родны|{{SITENAME}}}}.\nВы можаце адфільтраваць вынікі па тыпе журналу, удзельніку ці старонцы.",
        "tooltip-ca-nstab-main": "Паказаць зьмест старонкі",
        "tooltip-ca-nstab-user": "Паказаць старонку ўдзельніка",
        "tooltip-ca-nstab-media": "Паказаць старонку мэдыяфайла",
-       "tooltip-ca-nstab-special": "Гэта спэцыяльная старонка, і Вы ня можаце яе рэдагаваць",
+       "tooltip-ca-nstab-special": "Гэта спэцыяльная старонка і яе нельга рэдагаваць",
        "tooltip-ca-nstab-project": "Паказаць старонку праекту",
        "tooltip-ca-nstab-image": "Паказаць старонку файла",
        "tooltip-ca-nstab-mediawiki": "Паказаць сыстэмнае паведамленьне",
        "blankpage": "Пустая старонка",
        "intentionallyblankpage": "Гэтая старонка наўмысна пакінутая пустой",
        "external_image_whitelist": " #Пакіньце гэты радок такім, які ён ёсьць<pre>\n#Зьмясьціце часткі рэгулярных выразаў (толькі частку якая знаходзіцца паміж //) ніжэй\n#Яны будуць суаднесеныя з URL-адрасамі вонкавых выяваў\n#Тыя, якія будуць пасаваць будуць паказвацца як выявы, астатнія толькі як спасылкі\n#Радкі, пазначаныя #, лічыцца камэнтарамі\n#Рэгістар сымбаляў ня ўлічваецца\n\n#Зьмясьціце ўсе часткі рэгулярных выразаў над гэтым радком. Сам радок пакіньце ў такім жа выглядзе</pre>",
-       "tags": "СлÑ\83Ñ\88нÑ\8bÑ\8f Ñ\82Ñ\8dгі зьменаў",
+       "tags": "Ð\94зейнÑ\8bÑ\8f Ð¼ÐµÑ\82кі зьменаў",
        "tag-filter": "Фільтар [[Special:Tags|тэгаў]]:",
        "tag-filter-submit": "Фільтар",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Тэг|Тэгі}}]]: $2)",
-       "tags-title": "ТÑ\8dгі",
-       "tags-intro": "На гэтай старонцы знаходзіцца сьпіс тэгаў, якімі праграмнае забесьпячэньне можа пазначыць рэдагаваньне, і іх значэньне.",
+       "tags-title": "Ð\9cеÑ\82кі",
+       "tags-intro": "На гэтай старонцы знаходзіцца сьпіс метак, якімі праграмнае забесьпячэньне можа пазначыць рэдагаваньне, і іх значэньне.",
        "tags-tag": "Назва тэга",
        "tags-display-header": "Новыя запісы ў сьпісе зьменаў",
        "tags-description-header": "Поўнае апісаньне значэньня",
        "tags-deactivate-submit": "Адключыць",
        "tags-apply-no-permission": "Вы ня маеце права прымяняць меткі да вашых рэдагаваньняў.",
        "tags-apply-not-allowed-one": "Метка «$1» ня можа быць прызначаная ўручную.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Наступную метку|Наступныя меткі}} нельга дадаваць уручную: $1",
+       "tags-update-no-permission": "Вы ня маеце права на дадаваньне ці выдаленьне метак зьменаў для асобных вэрсіяў ці запісаў журналаў.",
+       "tags-update-add-not-allowed-one": "Метка «$1» ня можа быць дададзеная ўручную.",
        "tags-edit-title": "Рэдагаваньне метак",
        "tags-edit-manage-link": "Кіраваньне меткамі",
        "tags-edit-revision-selected": "{{PLURAL:$1|1=Абраная вэрсія|Абраныя вэрсіі}} [[:$2]]:",
index b0a7ed1..c0f328b 100644 (file)
@@ -8,25 +8,25 @@
                        "SatyamMishra"
                ]
        },
-       "tog-underline": "लिà¤\82à¤\95 à¤\95à¥\87 à¤¨à¥\80à¤\9aà¥\87 à¤°à¥\87à¤\96ा",
-       "tog-hideminor": "हाल à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤®à¥\87à¤\82 à¤®à¤¾à¤®à¥\82लà¥\80 à¤¸à¤\82पादन à¤\9bà¥\81पाईं",
-       "tog-hidepatrolled": "हाल à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤®à¥\87à¤\82 à¤®à¤¾à¤®à¥\82लà¥\80 à¤¸à¤\82पादन à¤\9bà¥\81पाईं",
-       "tog-newpageshidepatrolled": "नयà¤\95ा à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aल à¤ªà¥\83षà¥\8dà¤\95 à¤\95à¥\87 à¤\9bà¥\81पाà¤\81à¤\88",
-       "tog-extendwatchlist": "मातà¥\8dर à¤¹à¤¾à¤² à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\80 à¤¨à¤¾à¤¹à¥\80,बलà¥\8dà¤\95ि à¤¸à¤¬ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¦à¥\87à¤\96ावà¥\87 à¤\96ातिर à¤§à¥\8dयान à¤¸à¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤µिस्तारित करीं",
-       "tog-usenewrc": "तà¥\81रà¤\82त à¤­à¤\87ल à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤®à¥\87à¤\82 à¤\86 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤­à¤\87ल à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनन à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤\85नà¥\81सार à¤¸à¤®à¥\82ह में बांटी",
-       "tog-numberheadings": "सà¥\8dवयà¤\82-साà¤\82à¤\96à¥\8dयिà¤\95à¥\80 à¤¶à¤¿à¤°à¥\8dषà¤\95",
-       "tog-showtoolbar": "समà¥\8dपादन à¤\94à¤\9cारपà¤\9fà¥\8dà¤\9fà¥\80 à¤\95à¥\87 à¤¦à¤¿खावल जाव",
-       "tog-editondblclick": "दà¥\81à¤\88 à¤\95à¥\8dलिà¤\95 à¤ªà¤° à¤ªà¤¨à¥\8dना संपादन करीं",
-       "tog-editsectiononrightclick": "à¤\85नà¥\81भाà¤\97 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95र à¤\85नà¥\81भाà¤\97 सम्पादित करीं",
-       "tog-watchcreations": "हमरा à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dमित à¤ªà¥\83षà¥\8dठ à¤\86 à¤¹à¤®à¤°à¤¾ à¤¦à¥\8dवारा à¤²à¤¾à¤¦à¤² à¤«à¤¼à¤¾à¤\87लन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80",
-       "tog-watchdefault": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
-       "tog-watchmoves": "हमरा à¤¦à¥\8dवारा à¤¸à¥\8dथानाà¤\82तरित à¤ªà¥\83षà¥\8dठ à¤\86 à¤²à¤¾à¤¦à¤² à¤«à¤¾à¤\88ल à¤\95à¥\87 à¤¹à¤®à¤°à¤¾ à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80",
-       "tog-watchdeletion": "हमरा à¤¦à¥\8dवारा à¤®à¤¿à¤\9fावल à¤ªà¥\83षà¥\8dठ à¤«à¤¼à¤¾à¤\87लन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80",
-       "tog-watchrollback": "हमरा à¤¦à¥\8dवारा à¤ªà¥\8dरतà¥\8dयापनà¥\8dन (रà¥\8bलबà¥\88à¤\95) à¤\95रल à¤\97à¤\87ल à¤ªà¤¨à¥\8dनन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80à¤\82।",
-       "tog-minordefault": "सारा à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\9aिनà¥\8dहित à¤\95रà¥\80à¤\82",
-       "tog-previewontop": "समà¥\8dपादन à¤¬à¤\95à¥\8dसा à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤ªà¥\81रà¥\8dवदरà¥\8dशन à¤¦à¤¿à¤\96ाà¤\88à¤\82।",
-       "tog-previewonfirst": "पहिलà¤\95ा à¤¸à¤®à¥\8dपादन à¤ªà¤° à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96à¥\80à¤\82",
-       "tog-enotifwatchlistpages": "हमार à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\88ल à¤®à¥\87à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन होखला पर हमके ई-मेल करल जाव",
+       "tog-underline": "à¤\95ड़à¥\80 à¤\85à¤\82डरलाà¤\87न à¤\95à¤\87ल:",
+       "tog-hideminor": "हाल à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन à¤\9bिपाईं",
+       "tog-hidepatrolled": "हाल à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aल à¤¸à¤\82पादन à¤\9bिपाईं",
+       "tog-newpageshidepatrolled": "नया à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aल à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\95à¥\87 à¤\9bिपाà¤\88à¤\82",
+       "tog-extendwatchlist": "à¤\96ालà¥\80 à¤¹à¤¾à¤²à¥\87 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤¨à¤¾ à¤¬à¤¾à¤²à¥\81à¤\95, à¤¸à¤\97रà¥\80 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤¦à¥\87à¤\96ावà¥\87 à¤\96ातिर à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤¬िस्तारित करीं",
+       "tog-usenewrc": "तà¥\81रà¤\82त à¤­à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87à¤\82 à¤\86 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤­à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ à¤¸à¤­ à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤\85नà¥\81सार à¤\9dà¥\81à¤\82ड में बांटी",
+       "tog-numberheadings": "हà¥\87डिà¤\82à¤\97 à¤\95à¥\87 à¤\91à¤\9fà¥\8b-नà¤\82बरिà¤\82à¤\97",
+       "tog-showtoolbar": "समà¥\8dपादन à¤\94à¤\9cारपà¤\9fà¥\8dà¤\9fà¥\80 à¤\95à¥\87 à¤¦à¥\87खावल जाव",
+       "tog-editondblclick": "दà¥\81à¤\87 à¤\95à¥\8dलिà¤\95 à¤ªà¤° à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\95à¥\87 संपादन करीं",
+       "tog-editsectiononrightclick": "à¤\96à¤\82ड à¤\95à¥\80 à¤¹à¥\87डिà¤\82à¤\97 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95à¤\87 à¤\95à¥\87 à¤\96à¤\82ड à¤\95à¥\87 सम्पादित करीं",
+       "tog-watchcreations": "हमार à¤¬à¤¨à¤¾à¤µà¤² à¤ªà¤¨à¥\8dना à¤\86 à¤¹à¤®à¤¾à¤° à¤\85पलà¥\8bड à¤\95à¤\87ल à¤«à¤¾à¤\87ल à¤¸à¤­ à¤\95à¥\87 à¤¹à¤®à¤°à¥\80 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-watchdefault": "हम जौना पन्ना आ फाइलन के संपादित करीं उनहन के हमरी धियानसूची में जोड़ दिहल जाव",
+       "tog-watchmoves": "हमरा à¤¦à¥\8dवारा à¤¸à¥\8dथानाà¤\82तरित à¤ªà¤¨à¥\8dना à¤\86 à¤«à¤¾à¤\87लन à¤\95à¥\87 à¤¹à¤®à¤°à¤¾ à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-watchdeletion": "हमरा à¤¦à¥\8dवारा à¤¹à¤\9fावल à¤ªà¤¨à¥\8dना à¤\86 à¤«à¤¾à¤\87ल à¤¸à¤­ à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-watchrollback": "हमरा à¤¦à¥\8dवारा à¤°à¥\8bलबà¥\88à¤\95 à¤\95à¤\87ल à¤\97à¤\87ल à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-minordefault": "डिफालà¥\8dà¤\9f à¤°à¥\82प à¤¸à¥\87 à¤¸à¤\97रà¥\80 à¤¸à¤\82पादन à¤\95à¥\81ल à¤\95à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन à¤\95à¥\80 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\9aिनà¥\8dहित à¤\95à¤\87ल à¤\9cाव",
+       "tog-previewontop": "नमà¥\82ना (preview) à¤¸à¤\82पादन à¤¬à¤\95à¥\8dसा à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¦à¥\87à¤\96ावल à¤\9cाय",
+       "tog-previewonfirst": "पहिला à¤¸à¤\82पादन à¤ªà¤° à¤¨à¤®à¥\82ना à¤¦à¥\87à¤\96ावल à¤\9cाय",
+       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ होखला पर हमके ई-मेल करल जाव",
        "tog-enotifusertalkpages": "यदि हमार वार्तालाप पन्ना पर कौनो परिवर्तन होखे त हमके ई मेल करल जाव",
        "tog-enotifminoredits": "पन्ना आ फाईल पर छोटो परिवर्तन होखे त हमके ई मेल करल जाव",
        "tog-enotifrevealaddr": "अधिसूचना ई-मेल में हमार ई मेल पता दिखावल जाव",
        "no-null-revision": "पन्ना \"$1\" खातिर नया अशक्त संशोधन ना बन सकल",
        "badtitle": "खराब टाइटिल",
        "badtitletext": "रउआ द्वारा अनुरोधित शीर्षक अयोग्य, ख़ाली या गलत जुड़ल अंतर-भाषीय या अंतर-विकि शीर्षक बा।\nए में एक या एक से ढेर अइसन कॅरेक्टर हो सकत बा जवन शीर्षक में प्रयोग नइखे कइल जा सकत।",
+       "title-invalid-empty": "माँगल जा रहल पन्ना टाइटिल या त खाली बा या फिर खाली कौनों नाँवस्थान के नाँव भर दिहल गइल बाटे।",
+       "title-invalid-utf8": "माँगल जा रहल पन्ना टाइटिल में अइसन UTF-8 सीक्वेंस बा जेवन मान्य नइखे।",
+       "title-invalid-interwiki": "माँगल जा रहल पन्ना टाइटिल में इंटरविकि कड़ी बा जेवन टाइटिल में ना प्रयोग कइल जा सकत बा।",
+       "title-invalid-talk-namespace": "माँगल जा रहल पन्ना टाइटिल एगो अइसन वार्ता पन्ना के रेफर करत बा जेवना के होखल संभव नइखे।",
+       "title-invalid-characters": "माँगल जा रहल पन्ना टाइटिल में अमान्य अक्षर बा:\"$1\"।",
+       "title-invalid-relative": "टाइटिल के पाथ रिलेटिव (सापेक्षिक) बा। सापेक्षिक पन्ना टाइटिल (./, ../) मान्य नइखे, काहें से कि ई उपयोग करे वाला की ब्राउसर द्वारा लिहल जात समय अक्सरहा पहुँच से बाहर रहि जाला।",
+       "title-invalid-magic-tilde": "माँगल जा रहल पन्ना टाइटिल में अमान्य जादुई टिल्ड सीक्वेंस (<nowiki>~~~</nowiki>) बाटे।",
+       "title-invalid-too-long": "माँगल जा रहल पन्ना टाइटिल बहुत ढेर लंबा बा। ई UTF-8 की एनकोडिंग में $1 {{PLURAL:$1|बाइट|बाइट्स}} से ढेर ना होखे के चाहीं।",
+       "title-invalid-leading-colon": "माँगल जा रहल पन्ना टाइटिल में सुरुआते में अमान्य कोलन (:) बाटे।",
        "perfcached": "नीचे दिहल गइल डेटा कैशे मेमोरी से लिहल गइल बा, अतः हो सकता बा कि इ के पूर्ण अद्यतन ना भइल होखे। कैशे मेमोरी में अधिकतम {{PLURAL:$1|एक  नतीजा|$1 नतीजं}} उपलब्ध बाड़े।",
        "perfcachedts": "नीचे दिहल गइल डेटा कैशे मेमोरी से बा, आ एकर अंतिम अपडेट $1 के भइल रहल। कैश मेमोरी में अधिकतम {{PLURAL:$4|एक  नतीजा|$4 नतीजां}} उपलब्ध बा।",
        "querypage-no-updates": "इ पृष्ठ के अपडेट करल अयोग्य बा। अभी अहिजा के डाटा के ताज़ा नइखे करल जा सकत।",
        "actionthrottled": "कार्य समाप्त कर दिहल गइल बा",
        "actionthrottledtext": "स्पैम के रोकथाम खातिर, इ क्रिया एतना कम समय में एक सीमा से अधिक बार करे के मना बा, आ रउआ इ सीमा के पार कर चुकल बानी।\nकृपया कुछ समय बाद पुन: यत्न करीं।",
        "protectedpagetext": "इ पन्ना संपादन आ अन्य कार्यं से बचाव खातिर सुरक्षित कर दिहल गइल बा।",
-       "viewsourcetext": "रउआ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
-       "viewyourtext": "रà¤\89à¤\86 à¤\87 à¤ªà¤¨à¥\8dना à¤®à¥\87à¤\82 ''à¤\86पन à¤¸à¤®à¥\8dपादन'' à¤\95à¥\87 à¤¸à¥\8dरà¥\8bत à¤¦à¥\87à¤\96 à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80 à¤\86 à¤\93à¤\95र à¤¨à¤\95ल à¤\89तार à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80:",
+       "viewsourcetext": "रउआ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
+       "viewyourtext": "à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° <strong>राà¤\89र à¤\86पन à¤¸à¤\82पादन à¤¸à¤¬</strong>à¤\95à¥\87 à¤¸à¥\8dरà¥\8bत à¤¦à¥\87à¤\96 à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80 à¤\86 à¤\93à¤\95र à¤¨à¤\95ल à¤²à¥\87 à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।",
        "protectedinterface": "इ पन्ना इ विकी के सॉफ़्टवेयर के इंटरफ़ेस पाठ्य के देवेला, आ इ के गलत प्रयोग से बचावे खातिर सुरक्षित कर दिहल गइल बा।\nसभन विकियन खातिर अनुवाद जोड़े या बदले खातिर कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
        "editinginterface": "<strong>चेतावनी:</strong> आप एगो अइसन पन्ना के बदल बदल रहल बानी जवन सॉफ़्टवेयर के इंटरफ़ेस पाठ प्रदान करेला। इ पृष्ठ के बदले से अन्य सदस्यवन के प्रदर्शित इंटरफ़ेस के शक्लोसूरत में बदलाव आई।",
        "translateinterface": "सभन विकियन खातिर अनुवाद जोड़े या बदले खातिर मीडियाविकि क्षेत्रीयकरण परियोजना [//translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
-       "cascadeprotected": "à¤\87 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤®à¥\8dपादन à¤\95रà¥\87 à¤\95à¥\87 à¤\85धिà¤\95ार à¤\96तà¥\8dम à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾ à¤\95ाहà¥\87 à¤\95ि à¤\87 à¤¨à¤¿à¤®à¥\8dन à¤®à¥\87à¤\82 à¤¶à¤¾à¤®à¤¿à¤² à¤¬à¤¾ {{PLURAL:$1|पनà¥\8dना, à¤\9cà¤\89न|पनà¥\8dनाà¤\82, à¤\9cà¤\89न}} \"वà¥\8dयापà¤\95\" à¤µà¤¿à¤\95लà¥\8dप à¤\95à¥\87 à¤\9aालà¥\82 à¤\95à¤\87ला à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤¸à¥\81रà¤\95à¥\8dषित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾:\n$2",
+       "cascadeprotected": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\95à¤\87ल à¤¸à¥\81रà¤\95à¥\8dषित à¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾ à¤\95ाहà¥\87à¤\82 à¤\95ि à¤\88 {{PLURAL:$1|पनà¥\8dना à¤®à¥\87à¤\82, à¤\9cà¥\8cना à¤\95à¥\87|पनà¥\8dना à¤¸à¤¬ à¤®à¥\87à¤\82, à¤\9cिनà¥\8dहन à¤\95à¥\87}} \"à¤\95à¥\88सà¥\8dà¤\95à¥\87डिà¤\82à¤\97\" (बिसà¥\8dतारित) à¤¸à¥\81रà¤\95à¥\8dषा à¤\9aालà¥\82 à¤\95 à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95à¤\87ल à¤\97à¤\87ल à¤¬à¤¾, à¤®à¥\87à¤\82 à¤¸à¤®à¤¾à¤\87ल à¤¬à¤¾à¤\9fà¥\87:\n$2",
        "namespaceprotected": "रउआ के '''$1''' नामस्थान के पन्नं में सम्पादन करे के अधिकार नइखे दिहल गइल।",
        "customcssprotected": "रउआ के इ CSS पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।",
        "customjsprotected": "रउआ इ जावास्क्रिप्ट पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।",
        "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}",
        "createacct-benefit-body3": "हाल के {{PLURAL:$1|योगदानकर्ता}}",
        "badretype": "रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।",
+       "usernameinprogress": "एही सदस्यनाँव खातिर खाता खोले के काम पहिलहीं चालू बा।\nइंतजार करीं।",
        "userexists": "लिखल गईल सदस्य नाम पहिले से प्रयोग में बा। कृपया कौनो दोसर नाम चुनीं।",
        "loginerror": "खाता प्रवेश में त्रुटि",
        "createacct-error": "खाता निर्माण त्रुटि",
        "userpage-userdoesnotexist-view": "सदस्य खाता \"$1\" पंजीकृत नईखे भईल।",
        "blocked-notice-logextract": "ई प्रयोगकर्ता के ई समय निष्क्रीय कर दिहल गईल बा।\nनविनतम नष्ट लौग प्रविष्टी उद्धरण खातिर निचे दिहल बा:",
        "clearyourcache": "'''ध्यान दिं:'''  पन्ना सुरक्षित कइला के बाद बदलाव देखे खातिर आपके आपन ब्राउज़र के कैश खाली करे के पड़ सकत बा।\n* '''फ़ायरफ़ॉक्स / सफ़ारी:''' ''Reload'' (रीलोड) दबाते समय ''Shift'' (शिफ़्ट) दबा के रखीं, या फिर ''Ctrl-F5'' (कंट्रोल-F5) या ''Ctrl-R'' (कंट्रोल-R) दबाईं (मैक पर ''⌘-R'')\n* '''गूगल क्रोम:''' ''Ctrl-Shift-R'' (कंट्रोल-शिफ़्ट-R) दबाईं (मैक पर ''⌘-Shift-R'')\n* '''इन्टर्नेट एक्सप्लोरर:''' ''Ctrl'' (कंट्रोल) दबाके ''Refresh'' (रिफ़्रेश) करीं या ''Ctrl-F5'' (कंट्रोल-F5) दबाईं\n* '''ऑपेरा:''' ''Tools → Preferences'' (उपकरण → पसन्द) में कैश साफ़ करीं",
+       "usercssyoucanpreview": "<strong>टिप:</strong> आपन नया CSS के टेस्ट करे खातिर सहेजे से पहिले \"{{int:showpreview}}\" बटन के प्रयोग करीं।",
+       "userjsyoucanpreview": "<strong>टिप:</strong> आपन नया जावास्क्रिप्ट के टेस्ट करे खातिर सहेजे से पहिले \"{{int:showpreview}}\" बटन के प्रयोग करीं।",
+       "usercsspreview": "<strong>याद रहे की आप अपनी सदस्य CSS के खाली नमूना भर देखत बानी।\nई अबहिन ले सहेजल ना गइल बाटे।</strong>",
+       "userjspreview": "<strong>याद रहे की आप अपनी सदस्य जावास्क्रिप्ट के खाली टेस्ट करत बानी/नमूना देखत बानी।\nई अबहिन सहेजल ना गइल बाटे।</strong>",
+       "sitecsspreview": "<strong>याद रहे की आप ए CSS क खाली नमूना देखत बानी।\nई अबहिन ले सहेजल ना गइल बा!</strong>",
+       "sitejspreview": "<strong>याद रहे की आप ए जावास्क्रिप्ट कोड क खाली नमूना देखत बानी।\nई अबहिन ले सहेजल ना गइल बा!</strong>",
+       "userinvalidcssjstitle": "<strong>चेतावनी:</strong> कौनों skin \"$1\"नइखे।\nCustom .css आ .js पन्ना सभ छोटका अक्षर में टाइटिल इस्तेमाल करे लें जइसे की, {{ns:user}}:Foo/vector.css ना की {{ns:user}}:Foo/Vector.css।",
        "updated": "(अपडेट करल गईल)",
        "note": "'''सूचना:'''",
        "previewnote": "'''याद रखीं, इ एगो झलक मात्र हो।'''\nराउर बदलाव अभी तक सुरक्षित नईखे करल गईल!",
        "continue-editing": "संपादन क्षेत्र में जाईं",
+       "previewconflict": "ई नमूना ई देखावत बा की अगर रउआँ ए संपादन बक्सा में मौजूद पाठ के सहेजब त ऊ कइसन देखाई पड़ी।",
+       "session_fail_preview": "<strong>माफ करीं! एह सत्र के आँकड़ा के गायब हो गइला की कारण आपके संपादन के प्रॉसेस करे में हमनी के असमर्थ बाणी।</strong>\nदोबारा से कोसिस करीं।\nअगर तबो काम ना होखे तब [[Special:UserLogout|लॉग आउट करीं]] आ दोबारा लॉग इन कइ के कोसिस करी।",
+       "session_fail_preview_html": "<strong>माफ करीं! सत्र आँकड़ा के गायब होखला की कारन आपके संपादन सहेजल नइखे जा सकत।</strong>\n\n<em>चूँकि, {{SITENAME}} में मूल HTML सक्षम कइल बाटे, जावास्क्रिप्ट हमला से बचाव की खातिर नमूना देखावे के छिपावल गइल बा।</em>\n\n<strong>अगर ई एगो वैध संपादन बाटे तब एक बेर फिर से कोसिस करीं।</strong>\nअगर तबो पर काम नइखे हो पावत त [[Special:UserLogout|लॉग आउट करीं]] आ दुबारा लॉगिन क के कोसिस करीं।",
+       "edit_form_incomplete": "<strong>संपादन के कुछ हिस्सा सर्वर ले ना पहुँच पावल ह; दोहरा के चेक करीं की राउर संपादन बदलल न होखे आ एक बेर फिर से सहेजे के कोसिस करीं।</strong>",
        "editing": "$1 संपादन",
        "creating": "$1 बनावे जा रहल बानी",
        "editingsection": "$1 संपादन (खंड)",
        "editingcomment": "$1 सम्पादन (नया अनुभाग)",
        "editconflict": "संपादन अंतर्विरोध: $1",
+       "explainconflict": "आपकी संपादन शुरू कइला की बाद से केहू अउरी ए पन्ना में बदलाव क चुकल बाटे।\nऊपर के पाठ हिस्सा में लेख की पाठ के वर्तमान स्थिति देखावल जात बा।\nराउर संपादन नीचे की पाठ हिस्सा में देखावल गइल बा।\nरउआँ के आपन बदलाव एह पहिले से मौजूद पाठ में मिलावे के परी।\n<strong>खाली</strong> ऊपर की पाठ हिस्सा में लउकत पाठ सहेजल जाई अगर आप \"{{int:savearticle}}\" बटन दबाइब।",
        "yourtext": "राउर पाठ्य",
        "storedversion": "सुरक्षित करल गईल संशोधन",
+       "nonunicodebrowser": "<strong>चेतावनी: राउर ब्राउसर युनिकोड समर्थ नइखे।</strong>\nपन्ना सभ के सुरक्षित संपादित करे के एगो तरीका सुझावल जात बा: गैर-ASCII अक्षर सभ संपादन बॉक्स में हेक्साडेसिमल कोड की रूप में देखावल जाई।",
+       "editingold": "<strong>चेतावनी: रउआँ ए पन्ना क एगो पुरान अवतरण के संपादन करत बानी।</strong>\nअगर आप एकरा के सहेज देइब, त एकरी बाद के सगरी बदलाव गायब हो जाई।",
        "yourdiff": "अंतर",
+       "copyrightwarning": "ई नोट कर लीं की {{SITENAME}} पर राउर सगरी योगदान $2 की तहत रिलीज कइल मानल जाई (ढेर जानकारी खातिर $1 देखल जाय)।\nअगर रउआँ ई नइखीं चाहत की राउर लिखल चीज के केहू दूसर बेकति बे मोह-छोह के संपादित क दे या कहीं भी बाँट दे तब अइसन चीज इहाँ मत डालीं।<br />\nरउआँ इहो सकारत बानी आ वादा करत बानी की ई चीज रउआँ खुद लिखले बानी, या फिर पब्लिक पहुँच में मौजूद या कौनों अइसने फ्री स्रोत से नकल कइले बानी।\n<strong>कौनों भी कॉपीराइट वाली चीज बिना परमीशन के इहाँ कब्बो मत डालीं!</strong>",
+       "copyrightwarning2": "ई नोट कर लीं कि {{SITENAME}} पर सगरी योगदान के दुसरा योगदानकर्ता लोगन द्वारा संपादित कइल जा सकेला, बदलल या हटावल जा सकेला।\nअगर आप ई नइखीं चाहत की राउर लिखल चीज के केहू भी बे-मोहछोह के संपादित क दे, तब ए के इहाँ मत डालीं।<br />\nरउआँ इहो वादा करत बानी की आप ई खुद लिखले बानी या फिर पब्लिक पहुँच में मौजूद या अइसने कौनों फ्री स्रोत से नकल कइले बानी (ढेर जानकारी खातिर $1 देखीं)।\n<strong>बिना परमीशन के कॉपीराइट वाली चीज इहाँ कब्बो मत डालीं!</strong>",
+       "editpage-cannot-use-custom-model": "ए पन्ना के सामग्री के मॉडल के ना बदलल जा सकत बा।",
+       "longpageerror": "<strong>खराबी: आप जवन पाठ लिख के दिहले बानी ऊ {{PLURAL:$1|एक किलोबाइट|$1 किलोबाइट्स}} के बाटे, जेवन अधिकतम सीमा {{PLURAL:$2|एक किलोबाइट|$2 किलोबाइट्स}} से ढेर बा।</strong>\nई सहेजल ना जा सकेला।",
+       "readonlywarning": "<strong>चेतावनी: डेटाबेस ए समय मरम्मत खातिर लॉक कइल गइल बा, आ एही कारण आप तुरंते एही समय आपन सम्पादन ना सहेज पाइब।</strong>\nरउआँ अपनी पाठ (text) के कौनों पाठ फाइल (text file) में बाद खातिर सहेज के रख लीं।\n\nजे एडमिनिस्ट्रेटर एकरा के लॉक कइले बा ऊ नीचे लिखल कारण दिहले बा: $1",
+       "protectedpagewarning": "<strong>चेतावनी: ई पन्ना सुरक्षित कइल गइल बा जेवना से कि एकरा के खाली प्रबंधक (Admin) विशेषाधिकार वाला सदस्य लोग संपादित क सकत बा।</strong>\nप्रसंग बूझे खातिर सबसे नया लॉग एंट्री नीचे दिहल जात बा:",
+       "semiprotectedpagewarning": "<strong>नोट:</strong> ई पन्ना सुरक्षित कइल गइल बा कि एकरा के खाली रजिस्टर्ड सदस्य लोग संपादित क सकत बा।\nसभसे नया लॉग एंट्री नीचे प्रसंग बतावे खातिर दिहल जात बा:",
+       "cascadeprotectedwarning": "<strong>चेतावनी:</strong> ई पन्ना सुरक्षित क दिहल गइल बा कि एकरा के खाली प्रबंधक (Admin) विशेषाधिकार वाला सदस्य लोग संपादित क सकेला काहें से की ई नीचे दिहल बिस्तारित(कैस्केडिंग)-सुरक्षा वाला {{PLURAL:$1|पन्ना|पन्नवन}} में समाइल बाटे:",
+       "titleprotectedwarning": "<strong>चेतावनी: ई पन्ना सुरक्षित कइल गइल बा की एकरा के बनावे खातिर [[Special:ListGroupRights|विशेष अधिकार]] होखल जरूरी बा।</strong>\nसंदर्भ खातिर नीचे सबसे नया लॉग एंट्री दिहल जात बा:",
        "templatesused": "ए पन्ना पर इस्तेमाल {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
        "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
        "templatesusedsection": "एह खण्ड में इस्तेमाल {{PLURAL:$1|टेम्पलेट|कुल}}:",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(कुछ-सुरक्षित)",
        "hiddencategories": "ई पन्ना {{PLURAL:$1|1 छिपल श्रेणी|$1 छिपल श्रेणीसभ}} के सदस्य बा:",
+       "nocreatetext": "{{SITENAME}} नया पन्ना बनावे पर रोक लगवले बा।\nपीछे जाईं आ पहिले से बनल पन्ना संपादित करीं या फिर [[Special:UserLogin|लॉगिन करीं या नया खाता बनाईं]]।",
        "nocreate-loggedin": "नया पन्ना बनावे रउआ अधिकार नइखे।",
        "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नइखे",
        "sectioneditnotsupported-text": "इ पन्ना पर अनुभाग सम्पादन समर्थित नइखे",
        "permissionserrors": "अनुमति त्रुटी",
        "permissionserrorstext": "निम्नलिखित {{PLURAL:$1|कारण|कारणन}} के चलते आपके अइसन करे के अनुमति नइखे:",
        "permissionserrorstext-withaction": "नीचे दिहल {{PLURAL:$1|कारण|कारणन}} से रउआँ के $2 के परमीशन नइखे:",
+       "recreate-moveddeleted-warn": "<strong>चेतावनी: रउआँ एगो अइसन पन्ना दुबारा बनावे जा रहल बानी जेवन पहिले हटावल जा चुकल बा</strong>\n\nआपके ई बिचार क लेवे के चाहीं की आगे संपादन कइल ठीक बा की ना।\n\nसुविधा खातिर, ए पन्ना के हटवले आ स्थानांतरण के लॉग नीचे दिहल जात बा:",
        "moveddeleted-notice": "ई पन्ना हटा दिहल गइल बा।\nसंदर्भ खातिर हटावे आ स्थानांतरण के लॉग नीचे दिहल जात बाटे।",
        "log-fulllog": "पूरा लॉग देखीं",
+       "edit-hook-aborted": "संपादन के हुक निरस्त क दिहलस।\nई कौनों कारन ना बतवलस।",
+       "edit-gone-missing": "पन्ना अपडेट ना हो पावल।\nबुझात बा कि ई हटा दिहल गइल बा।",
        "edit-conflict": "संपादन अंतर्विरोध",
+       "edit-no-change": "आपके सम्पादन पर धियान ना दिहल गइल काहें से की पाठ में कौनों बदलाव ना कइल गइल रहल।",
        "postedit-confirmation-created": "पन्ना बना दिहल गईल।",
+       "postedit-confirmation-restored": "पन्ना के दुबारा अस्थापित कइल गइल।",
        "postedit-confirmation-saved": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
+       "edit-already-exists": "नया पन्ना ना बनावल जा सकत बा।\nई पहिलहीं से मौजूद बाटे।",
        "defaultmessagetext": "संदेश के डिफ़ॉल्ट पाठ्य",
+       "content-failed-to-parse": "$2 के सामग्री, $1 मॉडल खातिर पार्स (parse) ना हो पावल: $3",
        "invalid-content-data": "अवैध डाटा सामग्री",
+       "content-not-allowed-here": "\"$1\" सामग्री, पन्ना [[$2]] पर ना डालल जा सकेला।",
+       "editwarning-warning": "ए पन्ना के छोड़ के हटला पर आपके कइल बदलाव गायब हो जाई।\nअगर आप लॉगिन कइले बानी तब ए चेतावनी के अपनी सेटिंग में \"{{int:prefs-editing}}\" खंड में जा के बन्द क सकत बानीं।",
+       "editpage-notsupportedcontentformat-title": "सामग्री के फॉरमैट सपोर्टेड नइखे।",
+       "editpage-notsupportedcontentformat-text": "सामग्री फॉरमैट $1 के सामग्री मॉडल $2 सपोर्ट नइखे करत।",
        "content-model-wikitext": "विकीपाठ्य",
        "content-model-text": "सामान्य पाठ",
        "content-model-javascript": "जावास्क्रिप्ट",
        "content-model-css": "सी॰एस॰एस",
+       "content-json-empty-object": "खाली चीज (Empty object)",
+       "content-json-empty-array": "खाली अरे (Empty array)",
+       "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]], [[:$2]] के \"$3\" पैरामीटर खातिर एक से अधिका वैल्यू की संघे काल करत बाटे। दिहल गइल वैल्यू में से खाली सबसे आखिरी वैल्यू के प्रयोग कइल जाई।",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क के उपयोग करते हुए पन्नासभ",
+       "duplicate-args-category-desc": "पन्ना पर अइसन टेम्पलेट काल मौजूद बा जेवन डुप्लीकेट (दोहरा) आर्गुमेंट इस्तेमाल करत बाटे, जइसे की <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> या <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>चेतावनी:</strong> ई पन्ना बहुत ढेर सारा  खर्चीला पार्सर फंक्शन काल के इस्तेमाल करत बा।\n\nए पन्ना पर $2 {{PLURAL:$2|काल|काल कुल}} से कम संख्या में काल होखे के चाहीं, बाकी इहाँ ए समय {{PLURAL:$1|$1 काल बा|$1 काल कुल बाड़ी}}।",
+       "expensive-parserfunction-category": "बहुत ढेर खर्चीला पार्सर फंक्शन काल वाला पन्ना सभ",
        "post-expand-template-inclusion-warning": "'''चेतावनी:''' खाँचा जोड़े के सीमा पार हो चुकल बा।\nकुछ खाँचा ना जोड़ल जाई।",
        "post-expand-template-inclusion-category": "अइसन पृष्ठ जे पर साँचा जोडे के सीमा पार हो गइल बा",
+       "post-expand-template-argument-warning": "<strong>चेतावनी:</strong> ए पन्ना पर कम से कम एक ठो अइसन टेम्पलेट आर्गुमेंट बा जेवन बहुत बड़ खर्चीला साइज के बा।\nअइसन आर्गुमेंट के लोप कइ दिहल गइल बा।",
+       "post-expand-template-argument-category": "पन्ना जिनहन में लोप कइल गइल टेम्पलेट आर्गुमेंट बा",
+       "parser-template-loop-warning": "टेम्पलेट लूप पकड़ में आइल बा:[[$1]]",
+       "parser-template-recursion-depth-warning": "टेम्पलेट रिकरसन (recursion) के गहिराइ सीमा पार ($1)",
+       "language-converter-depth-warning": "भाषा बदलावक (language converter) के गहिराइ सीमा पार ($1)",
+       "node-count-exceeded-category": "पन्ना जहाँ नोड गिनती पार हो गइल बा",
+       "node-count-exceeded-category-desc": "पन्ना अधिकतम नोड गिनती (node count) के पार क गइल बा।",
+       "node-count-exceeded-warning": "पन्ना नोड गिनती (node count) के पार क गइल",
+       "expansion-depth-exceeded-category": "पन्ना जहाँ बिस्तार के गहिराई पार हो गइल बा",
+       "expansion-depth-exceeded-category-desc": "पन्ना अधिकतम बिस्तार गहिराई के पार क गइल बा।",
+       "expansion-depth-exceeded-warning": "पन्ना अधिकतम बिस्तार गहिराई के पार क गइल",
        "cantcreateaccounttitle": "खाता खुल नईखे सकत",
        "viewpagelogs": "ए पन्ना खातिर लॉग कुल देखीं",
        "nohistory": "ए पन्ना के कौनों संपादन इतिहास नइखे",
        "rev-suppressed-text-permission": "ए पन्ना के बदलाव<strong>दबा दिहल गइल बा</strong>।\nबिस्तृत जानकारी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दबावल चीज के लॉग] पर मिल जाई।",
        "rev-delundel": "देखाईं/छिपाईं",
        "rev-showdeleted": "देखाईं",
+       "revisiondelete": "रिवीजन हटाईं/हटावल लौटाईं",
+       "revdelete-nooldid-title": "अमान्य टारगेट रिवीजन",
        "revdelete-show-file-submit": "जी",
        "revdelete-hide-text": "संशोधन पाठ्य",
        "revdelete-hide-image": "फाइल के सामग्री छुपाँईं",
        "export": "पन्ना निर्यात करीं",
        "thumbnail-more": "बढ़ाईं",
        "filemissing": "फाईल गायब",
+       "import": "पन्ना आयात करीं",
+       "importinterwiki": "दुसरा विकि से आयात करीं",
+       "import-interwiki-text": "आयात करे खातिर एगो विकि आ पन्ना टाइटिल चुनल जाय।\nअवतरण के तारीख आ सम्पादक लोगन के नांव सुरक्षित रखल जाई।\nदुसरा विकि कुल से सगरी आयात कुल के लॉग [[Special:Log/import|आयात लॉग]] पर मौजूद बा।",
+       "import-interwiki-sourcewiki": "विकि, जहाँ से आयात होखी:",
+       "import-interwiki-sourcepage": "पन्ना जौन आयत होखी:",
+       "import-interwiki-history": "सगरी इतिहास के सब अवतरण कॉपी करीं",
+       "import-interwiki-templates": "सगरी टेम्पलेट कुल भी शामिल करीं",
+       "import-interwiki-submit": "आयात",
+       "import-mapping-default": "डिफाल्ट स्थान पर आयात करीं",
+       "import-mapping-namespace": "एगो नाँवस्थान पर आयात करीं:",
+       "import-mapping-subpage": "ए पन्ना की उप-पन्ना की रूप में आयात करीं:",
+       "import-upload-filename": "फाइलनाँव:",
+       "import-comment": "टिप्पणी:",
+       "importstart": "पन्ना आयात कइल जाता...",
+       "import-revision-count": "$1 {{PLURAL:$1|रिवीजन|रिवीजन कुल}}",
+       "importnopages": "आयत करे खातिर कौनों पन्ना नइखे।",
        "imported-log-entries": "लावल गइल $1 {{PLURAL:$1|लॉग प्रविष्टि|लॉग प्रविष्टिसभ}}",
+       "importfailed": "आयात फेल हो गइल: <nowiki>$1</nowiki>",
+       "importunknownsource": "नामालूम आयात स्रोत प्रकार",
+       "importcantopen": "आयात फाइल के खोले में असमर्थ",
+       "importbadinterwiki": "खराब इंटरविकि कड़ी",
+       "importsuccess": "आयात पूरा भइल!",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनसभ}} लावल गइल",
        "tooltip-pt-userpage": "हमार सदस्य पन्ना",
        "tooltip-pt-mytalk": "हमार बातचीत पन्ना",
index ff7e383..87c29a5 100644 (file)
        "actionthrottled": "Acció limitada",
        "actionthrottledtext": "Com a mesura per a prevenir la propaganda indiscriminada (spam), no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d'ací uns minuts.",
        "protectedpagetext": "S'ha protegit la pàgina per evitar-hi modificacions.",
-       "viewsourcetext": "Podeu visualitzar i copiar el codi font d’aquesta pàgina:",
+       "viewsourcetext": "Podeu veure i copiar el codi font d’aquesta pàgina.",
        "viewyourtext": "Vostè pot veure i copiar la font de <strong>les teves modificacions</strong> d'aquesta pàgina.",
        "protectedinterface": "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.\nPer afegir o canviar les traduccions per a tots els wikis, feu servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
        "editinginterface": "'''Avís:''' esteu editant una pàgina que s'utilitza per proporcionar text d'interfície per al programari. Els canvis que es facin a la pàgina afectaran l'aparença de la interfície d'altres usuaris del wiki.",
        "undeletepage": "Mostra i restaura pàgines esborrades",
        "undeletepagetitle": "'''A continuació teniu revisions eliminades de [[:$1]]'''.",
        "viewdeletedpage": "Visualitza les pàgines eliminades",
-       "undeletepagetext": "S'ha eliminat {{PLURAL:|la pàgina $1, però encara és a l'arxiu i pot ser restaurada|les pàgines $1, però encara són a l'arxiu i poden ser restaurades}}. Es Pot netejar l'arxiu periòdicament.",
+       "undeletepagetext": "{{PLURAL:|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.",
        "undelete-fieldset-title": "Restaura revisions",
        "undeleteextrahelp": "Per a restaurar l'historial sencer de la pàgina, deixeu totes les caselles sense seleccionar i feu clic a '''''{{int:undeletebtn}}'''''.\nPer a realitzar una restauració selectiva, marqueu les caselles que corresponguin a les revisions que voleu recuperar, i feu clic a '''''{{int:undeletebtn}}'''''.",
        "undeleterevisions": "{{PLURAL:$1|Una revisió suprimida|$1 revisions suprimides}}",
index 66df60b..9c1c3a4 100644 (file)
        "booksources-text": "Níže je seznam odkazů na servery prodávající knihy, nebo které mohou mít další informace o knihách, které hledáte.",
        "booksources-invalid-isbn": "Zadané ISBN se zdá být neplatné. Zkontrolujte jej s originálním zdrojem.",
        "specialloguserlabel": "Původce:",
-       "speciallogtitlelabel": "Cíl (název nebo uživatel):",
+       "speciallogtitlelabel": "Cíl (název nebo {{ns:user}}:Jméno pro uživatele):",
        "log": "Protokolovací záznamy",
        "all-logs-page": "Všechny veřejné záznamy",
        "alllogstext": "Společné zobrazení všech dostupných protokolovacích záznamů pro {{grammar:4sg|{{SITENAME}}}}.\nZobrazení můžete zúžit výběrem typu záznamu, uživatelského jména (záleží na velikosti písmen) nebo dotčené stránky (také záleží na velikosti písmen).",
index 16cdc41..f4d2aa2 100644 (file)
        "prefs-help-signature": "Beiträge auf Diskussionsseiten sollten mit „<nowiki>~~~~</nowiki>“ signiert werden, was dann in die Signatur mit Zeitstempel umgewandelt wird.",
        "badsig": "Die Syntax der Signatur ist ungültig; bitte HTML überprüfen.",
        "badsiglength": "Die Signatur darf maximal $1 {{PLURAL:$1|Zeichen}} lang sein.",
-       "yourgender": "Wie möchtest du angesprochen werden?",
-       "gender-unknown": "„Der Benutzer“, „seine Diskussion“, „er bearbeitet“ usw. – generisches Maskulinum oder geschlechtsneutral",
-       "gender-male": "„Der Benutzer“, „seine Diskussion“, „er bearbeitet“ usw. (Maskulinum)",
-       "gender-female": "„Die Benutzerin“, „ihre Diskussion“, „sie bearbeitet“ usw. (Femininum)",
-       "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um dich anzureden sowie als Hinweis für andere durch Verwendung des zutreffenden grammatikalischen Geschlechts.\nDiese Information ist öffentlich zugänglich.\nDie erste Option verwendet in den meisten Fällen das generische Maskulinum, so dass sie dasselbe Resultat ergibt wie die dritte Option.",
+       "yourgender": "Form der Anrede",
+       "gender-unknown": "„Der Benutzer“, „seine Diskussion“, „er bearbeitet“ usw.",
+       "gender-male": "„Der Benutzer“, „seine Diskussion“, „er bearbeitet“ usw. (männlich)",
+       "gender-female": "„Die Benutzerin“, „ihre Diskussion“, „sie bearbeitet“ usw. (weiblich)",
+       "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um dich mit dem zutreffenden grammatikalischen Geschlecht anzureden oder gegenüber anderen zu erwähnen.\nDiese Information ist öffentlich zugänglich.\n\nBei der ersten Option wird das generische Maskulinum verwendet, so dass sich das gleiche Resultat ergibt wie bei der dritten Option.",
        "email": "E-Mail",
        "prefs-help-realname": "Der bürgerliche Name ist optional.\nFalls angegeben, kann er verwendet werden, um dir eine Zuordnung für deine Beiträge zu geben.",
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.",
        "listgrouprights-namespaceprotection-namespace": "Namensraum",
        "listgrouprights-namespaceprotection-restrictedto": "Rechte, die dem Benutzer die Bearbeitung erlauben",
        "trackingcategories": "Tracking-Kategorien",
-       "trackingcategories-summary": "Diese Seite listet Tracking-Kategorien auf, die von der MediaWiki-Software automatisch eingepflegt werden. Ihre Namen können durch Änderung der entsprechenden Systemnachrichten im {{ns:8}}-Namensraum angepasst werden.",
+       "trackingcategories-summary": "Diese Seite listet Tracking-Kategorien auf, die von der MediaWiki-Software automatisch gefüllt werden. Ihre Namen können durch Änderung der entsprechenden Systemnachrichten im {{ns:8}}-Namensraum angepasst werden.",
        "trackingcategories-msg": "Tracking-Kategorie",
        "trackingcategories-name": "Name der Nachricht",
        "trackingcategories-desc": "Kategorieeinbindungskriterien",
        "noindex-category-desc": "Die Seite wird nicht von Bots indexiert, da sie das magische Wort <code><nowiki>__NOINDEX__</nowiki></code> enthält und sich in einem Namensraum befindet, wo dieses Flag erlaubt ist.",
-       "index-category-desc": "Die Seite enthält ein <code><nowiki>__INDEX__</nowiki></code> und befindet sich in einem Namensraum, in dem dieses Flag nicht erlaubt ist und wird daher von Bots ausnahmsweise indexiert.",
+       "index-category-desc": "Die Seite enthält ein <code><nowiki>__INDEX__</nowiki></code> und befindet sich in einem Namensraum, in dem dieses Flag erlaubt ist. Daher wird sie ausnahmsweise von Bots indiziert.",
        "post-expand-template-inclusion-category-desc": "Die Seitengröße ist nach dem Expandieren aller Vorlagen größer als <code>$wgMaxArticleSize</code>, so dass einige Vorlagen nicht expandiert wurden.",
        "post-expand-template-argument-category-desc": "Die Seite ist nach dem Expandieren eines Vorlagenargumentes größer als <code>$wgMaxArticleSize</code> (etwas in dreifachen Klammern, wie <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "Die Seite verwendet zu viele aufwändige Parserfunktionen (wie <code>#ifexist</code>). Siehe das [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Benutzerhandbuch].",
index 5b592f8..70e4dd3 100644 (file)
        "namespaceprotected": "तमलाई '''$1'''  नेमस्पेसमी रह्याका पानाहरू सम्पादन गद्या अनुमति छैन ।",
        "customcssprotected": "तमलाई यो  पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
        "customjsprotected": "तमलाई यो जाभास्कृप्ट पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
+       "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन अद्दु नाइँ सकिनो।",
+       "titleprotected": "[[User:$1|$1]]द्वारा ये शीर्षक निर्माणहुनबठे जोगाइया छ।\nकारण \"<em>$2</em>\" हो ।",
+       "filereadonlyerror": "फाइल \"$1\" लाई परिवर्तन अद्दु नाइँ सकिनो क्याईकि फाइल भण्डार  \"$2\" केवल पढ्ने स्थिति (read-only mode)मी छ।\n\nयेलाई सुरक्षित गर्ने प्रवन्धकले  यो कारण दियाकाछन् : ''$3''।",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "loginreqpagetext": "अरु पाना हेद्द तमले $1 गद्दु पडन्छ ।",
        "accmailtitle": "पासवर्ड पठाइयो",
        "newarticle": "(नयाँ)",
-       "newarticletext": "तमलà¥\87 à¤\90लसमà¥\8dम à¤¨à¤­à¤¯à¤¾à¤\95ा à¤ªà¤¾à¤¨à¤¾à¤\95à¥\8b à¤²à¤¿à¤\82à¤\99à¥\8dà¤\95 à¤ªà¤¹à¤¿à¤²à¥\8dयाà¤\89नà¥\81 à¤­à¤¯à¤¾à¤\95à¥\8b à¤\9b।\nयà¥\8b à¤ªà¤¾à¤¨à¥\8b à¤¬à¤¨à¥\8cनाà¤\96à¥\80 à¤¤à¤²à¥\8dतिरà¤\95à¥\8b à¤\95à¥\8bषà¥\8dठमा à¤\9fाà¤\87प à¤\97रिदिय à¥¤(à¤\94र à¤\9cाणà¥\8dणाà¤\96à¥\80लà¥\87à¤\96ा [$1 help page] à¤¹à¥\87रिदिय )।\nताखाइ सुधिसार आइपुग्या हौ भण्या, ब्राउजरको  '''back''' बटन थिचिहाल ।",
+       "newarticletext": "तमलà¥\87 à¤\85हिलसमà¥\8dम à¤¨à¤­à¤¯à¤¾à¤\95ा à¤ªà¤¾à¤¨à¤¾à¤\95à¥\8b à¤²à¤¿à¤\82à¤\99à¥\8dà¤\95 à¤ªà¤¹à¤¿à¤²à¥\8dयायाà¤\95ा à¤\9bà¥\8c à¥¤\nयà¥\8b à¤ªà¤¾à¤¨à¥\8b à¤¬à¤¨à¥\8cनाà¤\96à¥\80 à¤¤à¤²à¥\8dतिरà¤\95à¥\8b à¤\95à¥\8bषà¥\8dठमà¥\80 à¤\9fाà¤\87प à¤\97रि à¥¤ (à¤\94र à¤\9cाणà¥\8dणाà¤\96à¥\80लà¥\87à¤\96ा [$1 help page] à¤¹à¥\87र )।\nताखाइ सुधिसार आइपुग्या हौ भण्या, ब्राउजरको  '''back''' बटन थिचिहाल ।",
        "anontalkpagetext": "----''यो कुरडी पानो अज्ञात प्रयोगकर्ताको हो जनले अहिलसम्म खाता बनायाकै छैन, अथवा जनले यै पानाको उपयोग गर्दैन।\nयस कारण हामीले उनलाई उनरो आइ पी (IP) ठेगानाले चिन्न सकन्छौ। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्तानको साझा हुनसकन्छ ।\nयदि तमी अज्ञात प्रयोगकर्ता हौ र तमलाई अचाहिँदो टिप्पणी भयाको अनुभव गद्दा छौ भण्या भविष्यमी अन्य अज्ञात प्रयोगकर्तासँगको भ्रमबाट बाँच्न कृपया [[Special:UserLogin/signup|खाता खोल]] अथवा [[Special:UserLogin|प्रवेश गर]] ''",
        "noarticletext": "यै लेखमी अहिल क्यै पन पाठ नाइथी  ।\nतमले और पृष्ठमी\n[[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्या]</span>.",
        "noarticletext-nopermission": "यै लेखमी अहिल केइ पन पाठ नाइथी  ।\nतमले और पानामी\n[[Special:Search/{{PAGENAME}}|यै पानाको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज्न],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्द] सकन्छौ</span>.",
        "timezoneregion-australia": "अष्ट्रेलिया",
        "timezoneregion-indian": "हिन्द महासागर",
        "prefs-files": "फाइलहरू",
+       "prefs-help-signature": "कुरडी पानाका टिप्पणीहरू \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपडन्छ ,त्यो पछि तमरो दस्तखत र समयरेखामी रुपान्तरित हुनेछ ।",
        "badsiglength": "तमरो दस्तखत मैथै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
        "prefs-help-realname": "वास्तविक नाम ऐच्छिक हो ।\nतमीले खुलायौ भण्या तमरो कामको श्रेय दिनको लेखा यैको प्रयोग गरिन्या छ ।",
        "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
        "tooltip-t-permalink": "पृष्ठको यो पुनरावलोकनकि लेखा स्थाई लिङ्क",
        "tooltip-ca-nstab-main": "सामाग्री पानो हेरिदिय",
        "tooltip-ca-nstab-user": "प्रयोगकर्ता पानो हेरिदिय",
-       "tooltip-ca-nstab-special": "यो खास पानो हो , तमलाईँ आफै सम्पादन गद्द सकन्छौ",
+       "tooltip-ca-nstab-special": "यो खास पानो हो ,तमी यैलाई आफै सम्पादन गद्द सक्दाइन",
        "tooltip-ca-nstab-project": "आयोजना पानो हेरिदिय",
        "tooltip-ca-nstab-image": "चित्र पानो हेर",
        "tooltip-ca-nstab-template": "टेम्प्लेट(नमूना) हेरिदिय",
        "watchlistedit-clear-explain": "तमरा ध्यान सूचीबठे सम्पूर्ण पाना हटाइया",
        "watchlistedit-clear-done": "तमरो ध्यान सूची खाली गरीयाको छ।",
        "watchlisttools-view": "आधारित फेरबदलीहरू हेर",
-       "signature": "[[{{ns:प्रयोगकर्ता}}:$1|$2]][[{{ns:प्रयोगकर्ता_कुरडी}}:$1|कुरडी]]",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|कुरडी]])",
        "specialpages": "खास पानो",
        "specialpages-note": "* साधारण खास पानाहरू।\n* <span class=\"mw-specialpagerestricted\">निषेधित खास पानाहरू।</span>",
        "specialpages-group-changes": "अल्लैका परिवर्तन लगहरू",
index 9b109f5..6c2ff8a 100644 (file)
        "actionthrottledtext": "Cme mişûra 'd sicurèsa cûnt'r al spam soquânti operasiòun a vînen limitêdi a 'n nómer mâsim ed vôlti in un precîş peréiod ed tèimp, in cól chêş ché a s'é bèle andê d'ed là 'd cól lémit. A se dmânda ed turnêr a pruvêr tra soquânt minût.",
        "protectedpagetext": "Cla pàgina ché l'é stêda prutèta per impidîr la mudéfica o êtri operasiòun.",
        "viewsourcetext": "L'é pusébil vèder e cupiêr al côdis surzéia ed cla pàgina ché.",
-       "viewyourtext": "L'é pusébil vèder e cupiêr al côdis surzéia dal \"tō mudéfichi\" ed cla pàgina ché:",
+       "viewyourtext": "L'é pusébil vèder e cupiêr al côdis surzéia dal <strong>tō mudéfichi</strong> ed cla pàgina ché.",
        "protectedinterface": "Cla pàgina ché la gh'à 'n elemèint ch' al fa pêrt dal colegamèint tra utèint e al progrâma 'd cól sît ché e l'é prutèta per schivşêr pusébil abûş. Per zuntêr o mudufichêr tradusiòun per tót i sistēma wiki druvêr [//translatewiki.net/ translatewiki.net], al prugèt 'd adatamèint a ògni léngva 'd MediaWiki.",
        "editinginterface": "<strong>Atèinti:</strong> Al tèst ed cla pàgina ché 'l fa pêrt dal colegamèint tra utèint e 'l prugrâma dal sît.  Tót' al modéfichi fâti a cla pàgina ché a se spècen in sém a i mesâg vést per tót j utèint ed cól wiki ché.",
        "translateinterface": "Per zuntêr o mudifichêr al tradusiòun vâlidi in sém a tót i wiki, drōva [//translatewiki.net/ translatewiki.net], al prugèt Media Wiki p'r al léngui di divêrs pôst.",
index f51db9f..e086317 100644 (file)
        "booksources-text": "Abajo hay una lista de enlaces a otros sitios que venden libros nuevos y usados, puede que contengan más información sobre los libros que estás buscando.",
        "booksources-invalid-isbn": "El número de ISBN no parece ser válido; comprueba los errores copiándolo de la fuente original.",
        "specialloguserlabel": "Usuario:",
-       "speciallogtitlelabel": "Objetivo (título o usuario):",
+       "speciallogtitlelabel": "Objetivo (título o {{ns:user}}:nombre de usuario):",
        "log": "Registros",
        "all-logs-page": "Todos los registros públicos",
        "alllogstext": "Vista combinada de todos los registros de {{SITENAME}}.\nPuedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario o la página afectada. Se distinguen mayúsculas de minúsculas.",
        "tooltip-ca-nstab-main": "Ver la página de contenido",
        "tooltip-ca-nstab-user": "Ver la página del usuario",
        "tooltip-ca-nstab-media": "Ver la página de multimedia",
-       "tooltip-ca-nstab-special": "Esta es una página especial, no se puede editar la página en sí",
+       "tooltip-ca-nstab-special": "Esta es una página especial, y no puede editarse",
        "tooltip-ca-nstab-project": "Ver la página del proyecto",
        "tooltip-ca-nstab-image": "Ver la página del archivo",
        "tooltip-ca-nstab-mediawiki": "Ver el mensaje de sistema",
index e8cb188..d419556 100644 (file)
        "rows": "Ridu:",
        "columns": "Veerge:",
        "searchresultshead": "Otsingutulemite sätted",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Nii</a> lingitud lehekülje suuruse ülempiir (baitides):",
+       "stub-threshold": "Nupukese suurus lingivormistusel ($1):",
+       "stub-threshold-sample-link": "näide",
        "stub-threshold-disabled": "Välja lülitatud",
        "recentchangesdays": "Mitu päeva näidata viimastes muudatustes:",
        "recentchangesdays-max": "Ülemmäär $1 {{PLURAL:$1|päev|päeva}}",
        "booksources-text": "Allpool on linke teistele lehekülgedele, kus müüakse uusi ja kasutatud raamatuid. Lehekülgedel võib olla ka lisainfot raamatute kohta:",
        "booksources-invalid-isbn": "Antud ISBN-number ei ole korrektne; kontrolli algallikast kopeerides vigu.",
        "specialloguserlabel": "Täitja:",
-       "speciallogtitlelabel": "Objekt (pealkiri või kasutaja):",
+       "speciallogtitlelabel": "Objekt (pealkiri või {{ns:user}}:kasutajanimi):",
        "log": "Logid",
        "all-logs-page": "Kõik avalikud logid",
        "alllogstext": "See on {{GRAMMAR:genitive|{{SITENAME}}}} kõigi olemasolevate logide ühendkuva.\nValiku kitsendamiseks vali logitüüp, sisesta kasutajanimi (tõstutundlik) või huvipakkuva lehekülje pealkiri (samuti tõstutundlik).",
        "tooltip-ca-nstab-main": "Vaata sisulehekülge",
        "tooltip-ca-nstab-user": "Näita kasutaja lehte",
        "tooltip-ca-nstab-media": "Näita pildi lehte",
-       "tooltip-ca-nstab-special": "See on erilehekülg, sa ei saa seda lehekülge ennast redigeerida.",
+       "tooltip-ca-nstab-special": "See on erilehekülg ja seda ei saa redigeerida.",
        "tooltip-ca-nstab-project": "Näita projekti lehte",
        "tooltip-ca-nstab-image": "Näita pildi lehte",
        "tooltip-ca-nstab-mediawiki": "Näita süsteemi sõnumit",
index e0b0ee9..bc6514a 100644 (file)
        "largefileserver": "Fitxategi hau zerbitzariak baimentzen duena baino handiagoa da.",
        "emptyfile": "Badirudi igotzen ari zaren fitxategia hutsik dagoela. Mesedez, egiaztatu fitxategi hori dela igo nahi duzuna.",
        "windows-nonascii-filename": "Wiki honek ez du baimentzen letra bereziak dituzten fitxategi izenak.",
-       "fileexists": "Badago izen hori daukan fitxategi bat; mesedez, ikusi existitzen den <strong>[[:$1]]</strong> fitxategia aldatu nahi duzun egiaztatzeko.\n[[$1|thumb]]",
+       "fileexists": "Badago izen hori daukan fitxategi bat; mesedez, ikusi existitzen den <strong>[[:$1]]</strong> ziur {{GENDER:|ez bazaude}} eta fitxategia aldatu nahi duzun egiaztatzeko.\n[[$1|thumb]]",
        "filepageexists": "Fitxategi honen deskribapen orria dagoeneko sortuta dago <strong>[[:$1]]</strong>-en, baina, ez da existitzen izen hori duen fitxategirik.\nIdazten duzun laburpena ez da deskribapen orrian agertuko.\nZure laburpena agertzeko, eskuz aldatu beharko duzu.\n[[$1|thumb]]",
-       "fileexists-extension": "Badago antzeko izena duen fitxategi bat: [[$2|thumb]]\n* Igotako fitxategiaren izena: <strong>[[:$1]]</strong>\n* Aurretik dagoen fitxategiaren izena: <strong>[[:$2]]</strong>\nHautatu beste izen bat.",
+       "fileexists-extension": "Badago antzeko izena duen fitxategi bat: [[$2|thumb]]\n* Igotako fitxategiaren izena: <strong>[[:$1]]</strong>\n* Aurretik dagoen fitxategiaren izena: <strong>[[:$2]]</strong>\nAgian izen esanguratsuago bat erabili nahi duzu?",
        "fileexists-thumbnail-yes": "Badirudi neurri txikiko irudia dela ''(irudi txikia)''. [[$1|thumb]]\nEgiaztatu <strong>[[:$1]]</strong> fitxategia.\nEgiaztatutako fitxategia eta jatorrizkoa berdinak badira ez dago irudi txikia igo beharrik.",
        "file-thumbnail-no": "Fitxategiaren izena <strong>$1</strong>-(r)ekin hasten da.\nBadirudi tamaina txikiko irudia ''(thumbnail)'' dela.\nIrudi hau bereizmen handiagoan izango bazenu igo ezazu, bestela, fitxategiaren izena aldatu mesedez.",
        "fileexists-forbidden": "Badago izen hori daukan fitxategia, eta ezin da gainidatzi.\nOraindik fitxategia igo nahi baduzu, mesedez atzera itzuli eta igo fitxategia izen ezberdin batekin. [[File:$1|thumb|center|$1]]",
index c498ae3..3529566 100644 (file)
@@ -8,7 +8,8 @@
                        "Xuacu",
                        "아라",
                        "Babanwalia",
-                       "Henares"
+                       "Henares",
+                       "MarcoAurelio"
                ]
        },
        "tog-underline": "Surrayal atihus:",
        "prefs-custom-css": "CSS pressonalizau",
        "prefs-custom-js": "JS pressonalizau",
        "youremail": "Email:",
-       "username": "Nombri d'usuáriu:",
+       "username": "{{GENDER:$1|Nombri d'usuáriu|Nombri d'usuária}}:",
        "prefs-memberingroups": "Miembru de {{PLURAL:$1|grupu|groupus}}:",
        "yourrealname": "Nombri verdaeru:",
        "yourlanguage": "Palra:",
        "nlinks": "$1 {{PLURAL:$1|atihu|atihus}}",
        "nmembers": "$1 {{PLURAL:$1|miembru|miembrus}}",
        "nrevisions": "$1 {{PLURAL:$1|revisión|revisionis}}",
-       "nviews": "$1 {{PLURAL:$1|vesita|vesitas}}",
        "specialpage-empty": "Esta páhina está vacia.",
        "lonelypages": "Páhinas güérfanas",
        "lonelypagestext": "Las siguientis páginas nu están atijás (dendi otras páginas) ena {{SITENAME}}.",
        "mailnologin": "Nu envial direción",
        "mailnologintext": "Ebis estal [[Special:UserLogin|rutrau]]\ni tenel una direción d´email correta enas tus [[Special:Preferences|preferéncias]]\npa envial correus a otrus usuárius.",
        "emailuser": "Envial un email a esti usuáriu",
-       "emailpage": "E-mail el usuáriu",
        "emailpagetext": "Si esti usuáriu á escrebiu una direción email enas sus preferéncias, con el hormulariu d'embahu se l'enviará un mensahi.\nLa direción email qu'aigas escrebiu enas tus preferéncias apaicirá cumu remitenti el mensahi, d'esta horma, el destinatariu pudrá contestalti.",
        "defemailsubject": "E-mail de {{SITENAME}}",
        "noemailtitle": "Nu ai direción d´e-mail",
index f7c712e..efe544f 100644 (file)
        "booksources-text": "Alla linkkejä ulkopuolisiin sivustoihin, joilla myydään uusia ja käytettyjä kirjoja. Sivuilla voi myös olla lisätietoa kirjoista.",
        "booksources-invalid-isbn": "Annettu ISBN-numero ei ole kelvollinen. Tarkista alkuperäisestä lähteestä kirjoitusvirheiden varalta.",
        "specialloguserlabel": "Suorittaja:",
-       "speciallogtitlelabel": "Kohde (sivu tai käyttäjä):",
+       "speciallogtitlelabel": "Kohde (sivu tai {{ns:user}}:käyttäjänimi käyttäjää varten):",
        "log": "Lokit",
        "all-logs-page": "Kaikki julkiset lokit",
        "alllogstext": "Tämä on yhdistetty lokien näyttö.\nVoit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muutos on kohdistunut. Jälkimmäiset ovat kirjainkokoherkkiä.",
        "tooltip-ca-nstab-main": "Näytä sisältösivu",
        "tooltip-ca-nstab-user": "Näytä käyttäjäsivu",
        "tooltip-ca-nstab-media": "Näytä mediasivu",
-       "tooltip-ca-nstab-special": "Tämä on toimintosivu",
+       "tooltip-ca-nstab-special": "Tämä on toimintosivu, eikä sitä voi muokata",
        "tooltip-ca-nstab-project": "Näytä projektisivu",
        "tooltip-ca-nstab-image": "Näytä tiedostosivu",
        "tooltip-ca-nstab-mediawiki": "Näytä järjestelmäviesti",
index 500d73d..8114837 100644 (file)
        "booksources-text": "Voici une liste indicative de liens vers d’autres sites vendant des livres neufs et d’occasion et sur lesquels vous trouverez peut-être des informations sur les ouvrages que vous cherchez :",
        "booksources-invalid-isbn": "L’ISBN donné ne semble pas être correct ; vérifiez si vous avez fait une erreur en copiant la source originale.",
        "specialloguserlabel": "Auteur :",
-       "speciallogtitlelabel": "Cible (titre ou utilisateur):",
+       "speciallogtitlelabel": "Cible (titre ou {{ns:user}}:nom d'utilisateur) :",
        "log": "Journaux d’opérations",
        "all-logs-page": "Tous les journaux publics",
        "alllogstext": "Affichage combiné de tous les journaux disponibles sur {{SITENAME}}.<br />\nVous pouvez personnaliser l'affichage en sélectionnant le type de journal, le nom d'utilisateur ou la page concernée (ces deux derniers étant sensibles à la casse).",
index 5757455..ae7f1c9 100644 (file)
        "booksources-text": "A continuación aparece unha lista de ligazóns cara a outros sitios web que venden libros novos e usados, neles tamén pode obter máis información sobre as obras que está a buscar:",
        "booksources-invalid-isbn": "O ISBN inserido parece non ser válido; comprobe que non haxa erros ao copialo da fonte orixinal.",
        "specialloguserlabel": "Executante:",
-       "speciallogtitlelabel": "Obxectivo (título ou usuario):",
+       "speciallogtitlelabel": "Obxectivo (título ou {{ns:user}}:nome de usuario):",
        "log": "Rexistros",
        "all-logs-page": "Todos os rexistros públicos",
        "alllogstext": "Vista combinada de todos os rexistros dipoñibles en {{SITENAME}}.\nPode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario ou o título da páxina afectada.",
        "tooltip-ca-nstab-main": "Ver o contido da páxina",
        "tooltip-ca-nstab-user": "Ver a páxina {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}",
        "tooltip-ca-nstab-media": "Ver a páxina con contido multimedia",
-       "tooltip-ca-nstab-special": "Esta é unha páxina especial, polo que non a pode editar",
+       "tooltip-ca-nstab-special": "Esta é unha páxina especial, e non pode editarse",
        "tooltip-ca-nstab-project": "Ver a páxina do proxecto",
        "tooltip-ca-nstab-image": "Ver a páxina do ficheiro",
        "tooltip-ca-nstab-mediawiki": "Ver a mensaxe do sistema",
index 54a2975..ae1d22b 100644 (file)
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
        "htmlform-title-not-exists": "[[:$1]] अस्तित्वांत ना.",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
-       "logentry-move-move": "$1 à¤¨ $3 à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87र $4 {{GENDER:$2|हालयला}}",
+       "logentry-move-move": "$1 à¤¹à¤¾à¤£à¥\87à¤\82 $3 à¤ªà¤¾à¤¨à¤¾à¤\95 $4 {{GENDER:$2|हालयला}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड केला}} $3",
        "searchsuggest-search": "सोद",
index 2c90716..1c1652d 100644 (file)
        "tooltip-namespace_association": "Vinchlele nanvthollache sombondhit bhasabhas vo vixoiacho nanvthollakui gheupak hem boks khunnai",
        "blanknamespace": "(Mukhel)",
        "contributions": "{{GENDER:$1|Vapuddpi}} yogdanam",
-       "contributions-title": "$1 hea vapuddpean kelelim borovpam",
-       "mycontris": "Borovpam",
+       "contributions-title": "$1 hea vapuddpean kelelim yogdanam",
+       "mycontris": "Yogdanam",
        "contribsub2": "{{GENDER:$3|$1}} hacheo ($2)",
        "uctop": "(atachem)",
        "month": "Mhoinea savn (ani adichem):",
        "year": "Hea vorsa savn (ani adichem):",
-       "sp-contributions-newbies": "Fokot novea khateachim borovpam dakhoi",
+       "sp-contributions-newbies": "Fokot novea khateachim yogdanam dakhoi",
        "sp-contributions-blocklog": "addavnniache sotr",
        "sp-contributions-uploads": "upload",
        "sp-contributions-logs": "sotr",
        "sp-contributions-talk": "bhasabhas",
-       "sp-contributions-search": "Borovpam sod",
+       "sp-contributions-search": "Yogdanam sod",
        "sp-contributions-username": "Antorzall namo vo vapuddpeachem nanv:",
        "sp-contributions-toponly": "Fokot halincheo uzollnneo dakhoi",
        "sp-contributions-submit": "Sod",
        "tooltip-t-whatlinkshere": "Hanga zoddlelea sogllea wiki pananchi volleri",
        "tooltip-t-recentchangeslinked": "Hea panak-sun zoddlelea panachim halinche bodol",
        "tooltip-feed-atom": "Hea panak Atom purovnni",
-       "tooltip-t-contributions": "Hea vapuddpeachea borovpanchi suchi",
+       "tooltip-t-contributions": "Hea vapuddpeachea yogdanachi suchi",
        "tooltip-t-emailuser": "Hea vapuddpeak email patthoi",
        "tooltip-t-upload": "Faili upload kor",
        "tooltip-t-specialpages": "Sogllea khaxelim pananchi volleri",
        "tooltip-t-permalink": "Hea panache hea uzollnnek togpi zoddni",
        "tooltip-ca-nstab-main": "Mozkur pan polloi",
        "tooltip-ca-nstab-user": "Vapuddpeachem pan polloi",
-       "tooltip-ca-nstab-special": "Hem ek kherit pan, tujeam hem pan bodlunk zaina",
+       "tooltip-ca-nstab-special": "Hem ek kherit pan, ani hem bodlunk zaina",
        "tooltip-ca-nstab-project": "Prokolpachem pan polloi",
        "tooltip-ca-nstab-image": "Failichem pan polloi",
        "tooltip-ca-nstab-template": "Saacho polloi",
        "tooltip-diff": "Tumi hea mozkurant kelelo bodol dakhoiat",
        "tooltip-compareselectedversions": "Hea panacheo don nivoddleleo uzollneo modem forok polloi",
        "tooltip-watch": "Hem pan tujea xadurvollerint zodd",
-       "tooltip-rollback": "\"Kovllop\" hea panachea xevttachea borovpa kodde kea kollant portota.",
+       "tooltip-rollback": "\"Kovllop\" hea panak nimannea yogdan korpean kello (kelle) bodol eka kollant portota.",
        "tooltip-undo": "\"Rodd' kor\" sudharop portita ani sudharopak Zholok ritin ukodta. Tem saran karon zoddunk dita.",
        "tooltip-summary": "Mottvo sar ghal",
        "simpleantispam-label": "Spam-virudh topasni.\nHem bhori <strong>nakai</strong>!",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Kurvechit|Kurvechiti}}]]: $2)",
        "htmlform-title-not-exists": "[[:$1]] ostitvant na.",
        "logentry-delete-delete": "$1-an {{GENDER:$2|kadun udoile}} pan $3",
-       "logentry-move-move": "$1{{GENDER:$2|-an}} $3 panak $4 haloilea",
+       "logentry-move-move": "$1-an $3 panak $4 {{GENDER:$2|haloilea}}",
        "logentry-newusers-create": "Vapurpeacho kont $1 {{GENDER:$2|rochlam}}",
        "logentry-upload-upload": "$1-an $3 {{GENDER:$2|upload kela}}",
        "searchsuggest-search": "Sod",
index f0bb14a..29a474e 100644 (file)
                        "아라"
                ]
        },
-       "tog-underline": "Links unterstryche",
+       "tog-underline": "Links unterstryche:",
        "tog-hideminor": "Keini «chlyni Änderige» aazeige",
-       "tog-hidepatrolled": "Vum Fäldhieter aagluegti Änderige in dr „Letschte Änderige“ usblände",
-       "tog-newpageshidepatrolled": "Aagluegti Syten uf dr Lischt „Neiji Syte“ verstecke",
+       "tog-hidepatrolled": "Vu Fäldhieter/inne aagluegti Änderige in dr „Letschte Änderige“ usblände",
+       "tog-newpageshidepatrolled": "Vu Fäldhieter/inne aagluegti Änderige in dr Lischt „Neiji Syte“ usblände",
        "tog-extendwatchlist": "Beobachtungslischte erwytere go alli Änderige aazeige, nit numme di letschte",
        "tog-usenewrc": "Änderigen uf „Letschte Änderige“ un dr Beobachtigslischt no Syte gruppiere",
        "tog-numberheadings": "Überschrifte outomatisch numeriere",
        "tog-watchdeletion": "Sälber gleschti Sytene un Dateie automatisch beobachte",
        "tog-watchrollback": "Syte, wun i zruckgsetzt haa, automatisch beobachte",
        "tog-minordefault": "Alli dyni Änderigen als «chlyni Änderige» markiere",
-       "tog-previewontop": "Vorschou vor em Editierfänschter aazeige",
-       "tog-previewonfirst": "Vorschou aazeige bim erschten Editiere",
+       "tog-previewontop": "Vorschou oberhalb vom Editierfänschter aazeige",
+       "tog-previewonfirst": "Vorschou scho bim ersten Editieren azeige",
        "tog-enotifwatchlistpages": "Schick mer e Mail, wänn e Syte oder e Datei gänderet wird, wun i beobachte due",
-       "tog-enotifusertalkpages": "Benachrichtigungsmails bi Änderigen a dyne Benutzersyte",
+       "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het g’änderet",
        "tog-enotifminoredits": "Au bi chlaine Änderige an Syte oder Dateie ne Mail schicke",
        "tog-enotifrevealaddr": "Dyni E-Mail-Adrässe wird i Benachrichtigungsmails zeigt",
        "tog-shownumberswatching": "Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)",
        "gender-unknown": "«Der Benutzer», «der {dy Name}», «syni Bearbeitig», «är schrybt» etc.",
        "gender-male": "«Der Benutzer», «der {dy Name}», «syni Bearbeitig», «är schrybt» etc.",
        "gender-female": "«D Benutzerin», «d {dy Name}», «iri Bearbeitig», «si schrybt» etc.",
-       "prefs-help-gender": "Die Agab isch freiwillig.\nD Software bruucht se, für im korräkte grammatische Genus vo dir z rede.\nDas isch öffetlech z gseh.\nBy der ersten Option wird normalerwys ds generische Maskulinum azeigt. Es chunt also uf ds glychen use, wi we me di zwöüti Option wählt.",
+       "prefs-help-gender": "* Die Agab isch freiwillig. D Software bruucht se, für di mit em korräkte grammatische Genus azrede oder gägenüber anderne z erwähne. Die Information isch öffetlech z gseh.\n\n* By der ersten Option wird ds generische Maskulinum azeigt. Es chunt also uf ds Glychen use, wi we me di dritti Option wählt.",
        "email": "E-Mail",
        "prefs-help-realname": "Der ächt Namen isch optional.\nWe d’nen agisch, de lö sech dyni Byträg uf di la zrüggfüere.",
        "prefs-help-email": "D Aagab vun ere E-Mail isch optional, macht aber s Zueschicke vun eme Ersatzpasswort meglig, wänn Du dyy Passwort vergässe hesch.",
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]",
-       "rc_categories": "Nume Syten us dr Kategorie (trennt mit „|“):",
+       "rc_categories": "Nume Syten us bestimmte Kategorie (mit «|» trenne):",
        "rc_categories_any": "Beliebigi vo den usgwählte",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig",
        "newsectionsummary": "Neje Abschnitt /* $1 */",
        "pageswithprop-prop": "Eigeschaftsname:",
        "pageswithprop-submit": "Gang ane",
        "pageswithprop-prophidden-long": "Syteneigeschaften über $1 kB sy nid azeigt",
-       "pageswithprop-prophidden-binary": "Syteneigeschafte mit Binär-Date sy nid azeigt",
+       "pageswithprop-prophidden-binary": "Eigeschaftswärte mit Binärdate sy versteckt ($1)",
        "doubleredirects": "Doppleti Wyterleitige (Redirects)",
        "doubleredirectstext": "Die Lischt zeigt Wyterleitige, wu uf anderi Wyterleitige verwyyse.\nIn jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu dr zwote Wyterleitig, wu normalerwys di gwinscht Ziilsyten isch. Do sott eigetli scho di erscht Wyterleitig druf zeige.\n<del>Durgstricheni</del> Yytreg sin scho erledigt wore.",
        "double-redirect-fixed-move": "D Syte [[$1]] isch verschobe.\nUnder irem Namen isch automatisch e Wyterleitig uf [[$2]] agleit worde.",
        "booksources-text": "Des isch e Lischt mit Link zue Netzsyte, wu neiji un bruchti Biecher verchaufe. S cha syy, ass es dert au meh Informatione zue dr Biecher git. {{SITENAME}} isch mit keinem vu däne Aabieter gschäftli verbunde.",
        "booksources-invalid-isbn": "D ISBN isch schyyns falsch. Lueg no Fähler in dr Kopii.",
        "specialloguserlabel": "Benutzer, wu des gmacht het:",
-       "speciallogtitlelabel": "Ziil (Titel oder Benutzer):",
+       "speciallogtitlelabel": "Zil (Titel oder «{{ns:user}}:Name» für Benutzer/inne):",
        "log": "Logbiecher",
        "all-logs-page": "Alli effetligi Logbüecher",
        "alllogstext": "Kombinierti Aasicht vu alle in {{SITENAME}} gfierte Protokoll.\nD Aazeig cha dur d Uuswahl vun eme Protokoll, eme Benutzername oder eme Sytename yygschränkt wäre (Acht gee uf d Gross- un Chleischrybig).",
        "listgrouprights-namespaceprotection-namespace": "Namensruum",
        "listgrouprights-namespaceprotection-restrictedto": "Rächt zum Bearbeite",
        "trackingcategories": "Tracking-Kategorië",
+       "trackingcategories-summary": "Das isch e Liste vo Tracking-Kategorië, wo d MediaWiki-Software automatisch füllt. Iri Näme cha men ändere, we me di entsprächende Systemmäldigen im {{ns:8}}-Namensruum apasst.",
+       "trackingcategories-msg": "Tracking-Kategorië",
+       "trackingcategories-name": "Name vor Nachricht",
+       "trackingcategories-desc": "Kriterje für d Ybindig vo Kategorië",
+       "noindex-category-desc": "Die Syte wird nid vo Bots indiziert, wil ds magische Wort <code><nowiki>__NOINDEX__</nowiki></code> uf ere steit und wil si zumene Namensruum ghört, wo die Flag erloubt isch.",
+       "index-category-desc": "Uf dere Syte steit <code><nowiki>__INDEX__</nowiki></code> (u si ghört zumene Namensruum wo die Flag erloubt isch). Drum wird si usnahmswys vo Bots indiziert.",
+       "post-expand-template-inclusion-category-desc": "Nach em Expandiere vo allne Vorlagen übertrifft d Sytegröössi <code>$wgMaxArticleSize</code>. Drum sy es paar Vorlage nid expandiert.",
+       "post-expand-template-argument-category-desc": "Nach em Expandiere vomene Vorlagenargumänt (öppis i dreifache gschweiffte Chlammere wie <code>{{{Foo}}}</code>) isch d Syte gröser als <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Uf dere Syte het’s z vil ufwändigi Parserfunktione (wi <code>#ifexist</code>), vgl. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Uf der Syte het’s e defäkte Dateilink (e Link zu’neren y’bundnige Datei, wo’s nid git).",
+       "hidden-category-category-desc": "Im Syteninhalt vor Kategorie steit <code><nowiki>__HIDDENCAT__</nowiki></code>. Das verhinderet, das si standardmäässig im Chaste mit de Kategorielinks azeigt wird.",
+       "trackingcategories-nodesc": "Kei Beschrybig verfüegbar.",
+       "trackingcategories-disabled": "Kategorie isch deaktiviert",
        "mailnologin": "Du bisch nid aagmäldet oder hesch keis Mail aaggä",
        "mailnologintext": "Du muesch [[Special:UserLogin|aagmäldet syy]] un e bstätigti E-Mail-Adräss in Dyyne [[Special:Preferences|Yystellige]] aagee ha, fir dass epper anderem es E-Mail chasch schicke.",
        "emailuser": "Es Mail schrybe",
        "emailccsubject": "Kopii vu Dyynere Nochricht an $1: $2",
        "emailsent": "E-Mail furtgschickt",
        "emailsenttext": "Dys E-Mail isch verschickt worde.",
-       "emailuserfooter": "Die E-Mail isch vum {{SITENAME}}-Benutzer „$1“ an „$2“ gschickt wore.",
+       "emailuserfooter": "$1 het das E-mail a $2 gschickt über d Funktion «{{int:emailuser}}» uf {{SITENAME}}.",
        "usermessage-summary": "Systemnochricht gspycheret.",
        "usermessage-editor": "System-Messenger",
        "watchlist": "Beobachtigslischte",
        "mywatchlist": "Beobachtigslischte",
        "watchlistfor2": "Fir $1 $2",
        "nowatchlist": "Du hesch ke Yträg uf dyre Beobachtigslischte.",
-       "watchlistanontext": "Du muesch Di $1 go Dyyni Beobachtungslischt z säh oder go Yytreg uf ere bearbeite.",
+       "watchlistanontext": "Du muesch di amälde, für dyni Beobachtigslisten azluegen oder z bearbeite.",
        "watchnologin": "Du bisch nit aagmäldet",
        "addwatch": "zue de Beobachtigslischte derzue tue",
-       "addedwatchtext": "D Syte \"[[:$1]]\" stoht jetz uf Dyyre [[Special:Watchlist|Beobachtigslischt]].\nNeji Änderige an dr Syte oder dr Diskussionssyte drvo chasch jetz dert säh.",
+       "addedwatchtext": "«[[:$1]]» steit itz mitsamt Diskussionssyten uf dyre [[Special:Watchlist|Beobachtigsliste]].",
+       "addedwatchtext-short": "D Syte «$1» steit itz uf dyre Beobachtigsliste.",
        "removewatch": "Us der Beobachtigsliste usegnuu",
-       "removedwatchtext": "D Syte «[[:$1]]» isch us dyre [[Special:Watchlist|Beobachtigsliste]] glösche worde.",
+       "removedwatchtext": "«[[:$1]]» isch mitsamt Diskussionssyte us dyre [[Special:Watchlist|Beobachtigsliste]] gstriche.",
+       "removedwatchtext-short": "D Syte «$1» isch us dyre Beobachtigsliste gstriche.",
        "watch": "Beobachte",
        "watchthispage": "Die Syte beobachte",
        "unwatch": "nümm beobachte",
        "unwatchthispage": "Nimmi beobachte",
        "notanarticle": "Kei Syte",
        "notvisiblerev": "Version isch glescht wore",
-       "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Sytene wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).",
-       "wlheader-enotif": "Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.",
-       "wlheader-showupdated": "Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
-       "wlnote": "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}. Stand: $3, $4 Uhr.",
-       "wlshowlast": "Zeig di letschte $1 Stunde $2 Tage",
+       "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Syte wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).",
+       "wlheader-enotif": "E-Mail-Benachrichtigung isch aktiviert.",
+       "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei g’änderet, sy <strong>fett</strong> dargstellt.",
+       "wlnote": "Unde {{PLURAL:$1|steit di letsti Änderig|stöh di letste <strong>$1</strong> Änderigen}} us {{PLURAL:$2|der letste Stund|de letste <strong>$2</strong> Stunde}}. Stand: $3, $4 Uhr.",
+       "wlshowlast": "Zeig di letste $1 Stunden und $2 Täg",
        "watchlist-options": "Aazeigoptione",
        "watching": "Am beobachte …",
        "unwatching": "Nümm am beobachten …",
        "exbeforeblank": "Inhalt voreb d Syte gläärt woren isch: '$1'",
        "delete-confirm": "„$1“ lesche",
        "delete-legend": "Lesche",
-       "historywarning": "'''Warnig:'''  Die Syte, wu Du wit lesche, het e Versionsgschicht mit schetzigswyys $1 {{PLURAL:$1|Version|Versione}}:",
+       "historywarning": "<strong>Warnig:</strong> Die Syte, wu Du wit lesche, het e Versionsgschicht mit $1 {{PLURAL:$1|Version|Versione}}:",
        "confirmdeletetext": "Du bisch dra, e Artikel oder e Bild mitsamt dr Versionsgschicht fir immer us der Datebank z lesche.\nBitte bi Dir iber d Konsequänze bewusst, un bi sicher, dass Du Di an unsri [[{{MediaWiki:Policy-url}}|Leitlinie]] haltsch.",
        "actioncomplete": "Uftrag usgfiert.",
        "actionfailed": "Aktion fählgschlaa",
        "delete-edit-reasonlist": "Leschgrind bearbeite",
        "delete-toobig": "Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche vu sonige Syte isch yygschränkt wore go verhindere, ass dr Server vu {{SITENAME}} us Versäh zytwys iberlaschtet wird.",
        "delete-warning-toobig": "Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche cha dr Datebankbetriib vu {{SITENAME}} stere.",
+       "deleteprotected": "Du chasch die Syte nid lösche, wil si isch gschützt worde.",
+       "deleting-backlinks-warning": "'''Obacht:''' D Syte, wo du wosch lösche, isch uf [[Special:WhatLinksHere/{{FULLPAGENAME}}|anderne Syte]] verlinkt oder y’bunde.",
        "rollback": "Zrucksetze vu dr Änderige",
        "rollbacklink": "Zrüggsetze",
        "rollbacklinkcount": "{{PLURAL:$1|Ei Version|$1 Versione}} zrucksetze",
        "rollback-success": "D Änderige vu $1 sin ruckgängig gmacht wore un di letscht Version vu $2 isch widerhärgstellt wore.",
        "sessionfailure-title": "Sitzigsfähler",
        "sessionfailure": "S het e Probläm mit em Ibertrage vu Dyyne Benutzerdate gee.\nDie Aktion isch wäge däm us Sicherheitsgrind abbroche wore go ne falschi Zueornig vu Dyyne Änderige zuen eme andere Benutzer verhindere.\nBitte gang zruck, tue d Syte nej lade un versuech s nomol.",
+       "changecontentmodel": "Inhaltsmodäll von ere Syten ändere",
+       "changecontentmodel-legend": "Inhaltsmodäll ändere",
+       "changecontentmodel-title-label": "Sytetitel",
+       "changecontentmodel-model-label": "Nöüs Inhaltsmodäll",
+       "changecontentmodel-reason-label": "Grund:",
        "protectlogpage": "Syteschutz-Logbuech",
        "protectlogtext": "Des isch s Syteschutz-Logbuech.\nLueg d [[Special:ProtectedPages|Lischt vu dr gschitzte Syte]] fir alli zurzyt gschitzte Syte.",
        "protectedarticle": "het „[[$1]]“ gschitzt",
        "htmlform-chosen-placeholder": "Wehl en Option",
        "sqlite-has-fts": "$1 mit Unterstitzig vu dr Volltextsuechi",
        "sqlite-no-fts": "$1 ohni Unterstitzig vu dr Volltextsuechi",
-       "logentry-delete-delete": "{{GENDER:$2|Dr|D|Dr}} $1 het d Syte $3 glöscht",
+       "logentry-delete-delete": "{{GENDER:$2|Dr|D|}} $1 het d Syte $3 glöscht",
        "logentry-delete-restore": "$1 het d Syte $3 wiiderhergstellt",
        "logentry-delete-event": "$1 het die Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} uff $3: $4 gänderet",
        "logentry-delete-revision": "$1 het die Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} uff $3: $4 gänderet",
index 0b9fd87..ab23553 100644 (file)
        "enotif_reset": "Az összes lap megjelölése felkeresettként",
        "enotif_impersonal_salutation": "{{SITENAME}} felhasználó",
        "enotif_subject_deleted": "$2 törölte a(z) $1 {{SITENAME}}-oldalt",
-       "enotif_subject_created": "$2 létrehozta a(z) $1 {{SITENAME}} oldalt",
-       "enotif_subject_moved": "$2 átmozgatta a $1 {{SITENAME}} oldalt.",
-       "enotif_subject_restored": "$2 visszaállította a $1 {{SITENAME}} oldalt.",
+       "enotif_subject_created": "$2 létrehozta a(z) $1 {{SITENAME}}-oldalt",
+       "enotif_subject_moved": "$2 átmozgatta a(z) $1 {{SITENAME}}-oldalt",
+       "enotif_subject_restored": "$2 visszaállította a(z) $1 {{SITENAME}}-oldalt",
        "enotif_subject_changed": "$2 megváltoztatta a(z) $1 {{SITENAME}}-oldalt",
-       "enotif_body_intro_deleted": "$2 törölte a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd $3.",
-       "enotif_body_intro_created": "$2 létrehozta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
-       "enotif_body_intro_moved": "$2 átmozgatta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
-       "enotif_body_intro_restored": "$2 visszaállította a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
-       "enotif_body_intro_changed": "$2 megváltoztatta a $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, az aktuális verziót lásd itt: $3.",
+       "enotif_body_intro_deleted": "$2 törölte a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd $3.",
+       "enotif_body_intro_created": "$2 létrehozta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
+       "enotif_body_intro_moved": "$2 átmozgatta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
+       "enotif_body_intro_restored": "$2 visszaállította a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
+       "enotif_body_intro_changed": "$2 megváltoztatta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, az aktuális verziót lásd itt: $3.",
        "enotif_lastvisited": "Lásd a $1 lapot az utolsó látogatásod óta történt változtatásokért.",
        "enotif_lastdiff": "Lásd a $1 lapot ezen változtatás megtekintéséhez.",
        "enotif_anon_editor": "$1 névtelen felhasználó",
index bf277d3..70d8aa0 100644 (file)
        "exif-lightsource-19": "Lumine standard C",
        "exif-lightsource-24": "Tungsten de studio ISO",
        "exif-lightsource-255": "Altere origine de lumine",
-       "exif-flash-fired-0": "Flash non fulgurava",
-       "exif-flash-fired-1": "Flash fulgurava",
+       "exif-flash-fired-0": "Flash non ha fulgurate",
+       "exif-flash-fired-1": "Flash ha fulgurate",
        "exif-flash-return-0": "nulle function pro deteger stroboscopio",
        "exif-flash-return-2": "stroboscopio non detegite",
        "exif-flash-return-3": "stroboscopio detegite",
-       "exif-flash-mode-1": "fulguration flash compulsori",
-       "exif-flash-mode-2": "suppression del flash compulsori",
+       "exif-flash-mode-1": "activation del flash fortiate",
+       "exif-flash-mode-2": "suppression del flash fortiate",
        "exif-flash-mode-3": "modo automatic",
        "exif-flash-function-1": "Nulle function de flash",
        "exif-flash-redeye-1": "modo de reduction de oculos rubie",
index 265bb2d..2c0aa8d 100644 (file)
@@ -39,7 +39,8 @@
                        "Ahdan",
                        "Macofe",
                        "Totosunarto",
-                       "Mirws"
+                       "Mirws",
+                       "Ilham"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "booksources-text": "Di bawah ini adalah daftar pranala ke situs lain yang menjual buku baru dan bekas, dan mungkin juga mempunyai informasi lebih lanjut mengenai buku yang sedang Anda cari:",
        "booksources-invalid-isbn": "ISBN yang diberikan tampaknya tidak valid; periksa kesalahan penyalinan dari sumber asli.",
        "specialloguserlabel": "Pengguna:",
-       "speciallogtitlelabel": "Target (judul atau pengguna):",
+       "speciallogtitlelabel": "Target (judul atau{{ns:pengguna}}:nama pengguna untuk pengguna)",
        "log": "Catatan (Log)",
        "all-logs-page": "Semua log publik",
        "alllogstext": "Gabungan tampilan semua log yang tersedia di {{SITENAME}}.\nAnda dapat melakukan pembatasan tampilan dengan memilih jenis log, nama pengguna (sensitif kapitalisasi), atau judul halaman (juga sensitif kapitalisasi).",
        "tooltip-ca-nstab-main": "Lihat halaman isi",
        "tooltip-ca-nstab-user": "Lihat halaman pengguna",
        "tooltip-ca-nstab-media": "Lihat halaman media",
-       "tooltip-ca-nstab-special": "Ini adalah halaman istimewa yang tidak dapat disunting.",
+       "tooltip-ca-nstab-special": "Ini adalah halaman istimewa, dan tidak dapat disunting.",
        "tooltip-ca-nstab-project": "Lihat halaman proyek",
        "tooltip-ca-nstab-image": "Lihat halaman berkas",
        "tooltip-ca-nstab-mediawiki": "Lihat pesan sistem",
index bc8ce8f..6ea2d0c 100644 (file)
        "tooltip-ca-nstab-main": "Vedi la voce",
        "tooltip-ca-nstab-user": "Vedi la pagina utente",
        "tooltip-ca-nstab-media": "Vedi la pagina del file multimediale",
-       "tooltip-ca-nstab-special": "Questa è una pagina speciale, non può essere modificata",
+       "tooltip-ca-nstab-special": "Questa è una pagina speciale e non può essere modificata",
        "tooltip-ca-nstab-project": "Vedi la pagina di servizio",
        "tooltip-ca-nstab-image": "Vedi la pagina del file",
        "tooltip-ca-nstab-mediawiki": "Vedi il messaggio di sistema",
index 6663ba0..33a4652 100644 (file)
        "booksources-text": "お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:",
        "booksources-invalid-isbn": "指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。",
        "specialloguserlabel": "実行者:",
-       "speciallogtitlelabel": "対象 (ページまたは利用者):",
+       "speciallogtitlelabel": "対象 (ページまたは{{ns:user}}:利用者のための利用者名):",
        "log": "記録",
        "all-logs-page": "すべての公開記録",
        "alllogstext": "{{SITENAME}}の取得できる記録をまとめて表示しています。\n記録の種類、実行した利用者 (大文字小文字は区別)、影響を受けたページ (大文字小文字は区別) による絞り込みができます。",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
        "changecontentmodel": "ページのコンテント・モデルの変更",
        "changecontentmodel-legend": "コンテンツモデルを変更",
-       "changecontentmodel-title-label": "ページ タイトル",
+       "changecontentmodel-title-label": "ページ",
        "changecontentmodel-model-label": "新しい コンテンツ モデル",
        "changecontentmodel-reason-label": "理由:",
        "changecontentmodel-success-title": "コンテント・モデルは変更されました",
        "tooltip-ca-nstab-main": "本文を閲覧",
        "tooltip-ca-nstab-user": "利用者ページを表示",
        "tooltip-ca-nstab-media": "メディアページを表示",
-       "tooltip-ca-nstab-special": "ã\81\93ã\82\8cã\81¯ç\89¹å\88¥ã\83\9aã\83¼ã\82¸ã\81§ã\81\99ã\80\82編集はできません。",
+       "tooltip-ca-nstab-special": "ã\81\93ã\82\8cã\81¯ç\89¹å\88¥ã\83\9aã\83¼ã\82¸ã\81§ã\81\99ã\81®ã\81§ã\80\81編集はできません。",
        "tooltip-ca-nstab-project": "プロジェクトページを表示",
        "tooltip-ca-nstab-image": "ファイルページを表示",
        "tooltip-ca-nstab-mediawiki": "システムメッセージを表示",
index 2a748b4..a70f42d 100644 (file)
        "qbedit": "Өңдеу",
        "qbpageoptions": "Бұл бет",
        "qbmyoptions": "Беттерім",
-       "faq": "Жиі қойылатын сұрақтар",
+       "faq": "ЖҚС",
        "faqpage": "Project:Жиі қойылатын сұрақтар",
        "actions": "Әрекеттер",
        "namespaces": "Есім кеңістіктері",
        "file-info": "файл өлшемі: $1, MIME түрі: $2",
        "file-info-size": "$1 × $2 нүкте, файл өлшемі: $3, MIME түрі: $4",
        "file-info-size-pages": "$1 × $2 нүкте (пиксел), Файл өлшемі: $3, MIME түрі: $4, $5 {{PLURAL:$5|бет|бет}}",
-       "file-nohires": "Ð\96оÒ\93аÑ\80Ñ\8b ÐºÐµÒ£ÐµÐ¹Ñ\82Ñ\96лÑ\96мдегÑ\96 нұсқалары жоқ.",
+       "file-nohires": "Ð\96оÒ\93аÑ\80Ñ\8b Ð°Ð¶Ñ\8bÑ\80аÑ\82Ñ\8bлÑ\8bмдÑ\8b нұсқалары жоқ.",
        "svg-long-desc": "SVG файлы, кесімді $1 × $2 (пиксел) нүкте, файл өлшемі: $3",
        "svg-long-desc-animated": "SVG қозғалысты файлы, кесімді $1 × $2 нүкте, файл өлшемі: $3",
        "svg-long-error": "жарамсыз SVG файлы: $1",
index d4d1ce9..8176256 100644 (file)
@@ -24,7 +24,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Pavanaja",
-                       "Ananth subray"
+                       "Ananth subray",
+                       "MarcoAurelio"
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "prefs-custom-js": "ಕಸ್ಟಮ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
        "prefs-emailconfirm-label": "ಮಿಂಚಂಚೆ ದೃಢೀಕರಣ",
        "youremail": "ಇ-ಅಂಚೆ:",
-       "username": "{{ಲಿಂಗ:$1|ಸದಸ್ಯತ್ವದ ಹೆಸರು}}:",
+       "username": "{{GENDER:$1|ಸದಸ್ಯತ್ವದ ಹೆಸರು}}:",
        "prefs-memberingroups": "ಈ {{PLURAL:$1|ಗುಂಪಿನ|ಗುಂಪುಗಳ}} ಸದಸ್ಯ:",
        "prefs-registration": "ನೋಂದಣಿ ಸಮಯ:",
        "yourrealname": "ನಿಜ ಹೆಸರು:",
        "mailnologintext": "ಇತರ ಬಳಕೆದಾರರಿಗೆ ಇ-ಅಂಚೆ ಕಳುಹಿಸಲು ನೀವು [[Special:UserLogin|ಲಾಗ್ ಇನ್]] ಆಗಿರಬೇಕು ಮತ್ತು ನಿಮ್ಮ [[Special:Preferences|ಪ್ರಾಶಸ್ತ್ಯಗಳ ಪುಟದಲ್ಲಿ]] ಒಂದು ಧೃಡೀಕೃತ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿರಬೇಕು.",
        "emailuser": "ಈ ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆ ಕಳಿಸಿ",
        "emailuser-title-notarget": "ಸದಸ್ಯರಿಗೆ ವಿ-ಅ೦ಚೆ ಕಳಿಸಿ",
-       "emailpage": "ಸದಸ್ಯರಿಗೆ ವಿ-ಅ೦ಚೆ ಕಳಿಸಿ",
        "defemailsubject": "ವಿಕಿಪೀಡಿಯ ವಿ-ಅ೦ಚೆ",
        "usermaildisabled": "ಬಳಕೆದಾರರ ಮಿಂಚಂಚೆಯನ್ನು ನಿಷ್ಕ್ತಿಯಗೊಳಿಸಲಾಗಿದೆ",
        "noemailtitle": "ಯಾವುದೇ ಇ-ಅಂಚೆ ವಿಳಾಸ ಇಲ್ಲ",
index b32d9fd..fcd116d 100644 (file)
        "blockedtext": "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''\n\n차단한 사람은 $1입니다.\n차단한 이유는 다음과 같습니다: $2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "autoblockedtext": "당신의 IP 주소는 $1 사용자가 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "blockednoreason": "이유를 입력하지 않음",
-       "whitelistedittext": "문서를 편집하기 전에  $1 해야 합니다.",
+       "whitelistedittext": "문서를 편집하기 전에  $1해야 합니다.",
        "confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
        "nosuchsectiontitle": "문단을 찾을 수 없음",
        "nosuchsectiontext": "존재하지 않는 문단을 편집하려 했습니다.\n이 문서를 보는 동안 문단이 이동되었거나 삭제되었을 수 있습니다.",
index 1e4edaf..a0881dd 100644 (file)
        "autoredircomment": "Leit öm op „[[$1]]“",
        "autosumm-new": "De Sigg wood neu aanjelaat met däm Aanfang: $1",
        "autosumm-newblank": "En läddijje Sigg wood aanjelaat",
-       "size-bytes": "$1 {{PLURAL:$1|Byte|Bytes}}",
+       "size-bytes": "$1&nbsp;<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Binary Digit\">{{PLURAL:$1|Byte|Bytes|Byte}}</i>",
        "size-kilobytes": "$1&nbsp;KB",
        "size-megabytes": "$1&nbsp;MB",
        "size-gigabytes": "$1&nbsp;GB",
index 535804e..12a3699 100644 (file)
@@ -60,7 +60,7 @@
        "editfont-monospace": "Tipografía que cuvre lugar fikso",
        "editfont-sansserif": "Tipografía sans-serif",
        "editfont-serif": "Tipografía serif",
-       "sunday": "Aladh",
+       "sunday": "Alhadh",
        "monday": "Lunes",
        "tuesday": "Martes",
        "wednesday": "Miércoles",
index 32c6992..a2ac898 100644 (file)
        "rows": "Zeilen",
        "columns": "Kolonnen",
        "searchresultshead": "Sichen",
-       "stub-threshold": "Maximum (a Byte) bei deem e Link nach ëmmer am <a href=\"#\" class=\"stub\">Skizze-Format</a> gewise gëtt:",
+       "stub-threshold": "Maximum bei deem e Link nach ëmmer am Skizze-Format ($1) gewise gëtt:",
        "stub-threshold-sample-link": "Beispill",
        "stub-threshold-disabled": "Desaktivéiert",
        "recentchangesdays": "Deeg déi an de Rezenten Ännerungen ugewise ginn:",
        "booksources-text": "Hei ass eng Lëscht mat Linken op Internetsäiten, déi nei a gebraucht Bicher verkafen. Do kann et sinn datt Dir méi Informatiounen iwwer déi Bicher fannt déi Dir sicht.",
        "booksources-invalid-isbn": "D'ISBN-Nummer déi Dir uginn hutt schéngt net gëlteg ze sinn. Kuckt w.e.g. no ob beim Kopéiere kee Feeler geschitt ass.",
        "specialloguserlabel": "Aktive Benotzer:",
-       "speciallogtitlelabel": "Zil (Titel oder Benotzer):",
+       "speciallogtitlelabel": "Zil (Titel oder {{ns:user}}:Benotzernumm fir e Benotzer):",
        "log": "Logbicher",
        "all-logs-page": "All ëffentlech Logbicher",
        "alllogstext": "Dëst ass eng kombinéiert Lëscht vu Logbicher op {{SITENAME}}.\nDir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisitive) oder déi gefrote Säit (och case-senisitive) agitt.",
        "tooltip-ca-nstab-main": "Contenu vun der Säit weisen",
        "tooltip-ca-nstab-user": "Benotzersäit weisen",
        "tooltip-ca-nstab-media": "Mediesäit weisen",
-       "tooltip-ca-nstab-special": "Dëst ass eng Spezialsäit. Si kann net geännert ginn.",
+       "tooltip-ca-nstab-special": "Dëst ass eng Spezialsäit a si kann net geännert ginn",
        "tooltip-ca-nstab-project": "Portalsäit weisen",
        "tooltip-ca-nstab-image": "Billersäit weisen",
        "tooltip-ca-nstab-mediawiki": "Systemmessage weisen",
index 3ec3268..6f9da7d 100644 (file)
        "booksources-text": "Ова е список на врски кон други мрежни места кои продаваат нови и користени книги, и тие може\nда имаат повеќе информации за книгите што ги баравте:",
        "booksources-invalid-isbn": "Наведениот ISBN се чини неправилен. Проверете да не настанала некоја грешка при копирањето од изворот.",
        "specialloguserlabel": "Изведувач:",
-       "speciallogtitlelabel": "Цел (наслов или корисник):",
+       "speciallogtitlelabel": "Цел (наслов или {{ns:user}}:корисничко име на корисникот):",
        "log": "Дневници",
        "all-logs-page": "Сите јавни дневници",
        "alllogstext": "Комбиниран приказ на сите расположиви дневници на {{SITENAME}}.\nМожете да го ограничите прикажаното избирајќи тип на дневник, корисничко име (разликува големи и мали букви), или страница (разликува големи и мали букви).",
index 3dc9089..88e10c1 100644 (file)
        "pool-timeout": "ताळ्यासाठी वाट पाहण्याची वेळ संपली",
        "pool-queuefull": "सर्व्हरवर ताण आहे.",
        "pool-errorunknown": "अपरिचित त्रुटी",
+       "poolcounter-usage-error": "वापर करतांना त्रूटी $1",
        "aboutsite": "{{SITENAME}}बद्दल",
        "aboutpage": "Project:माहितीपृष्ठ",
        "copyright": "येथील मजकूर $1च्या अंतर्गत उपलब्ध आहे जोपर्यंत इतर नोंदी केलेल्या नाहीत.",
        "hidetoc": "लपवा",
        "collapsible-collapse": "निपात करा",
        "collapsible-expand": "विस्तार",
+       "confirmable-confirm": " {{GENDER:$1|तिम्हाला}} खात्रिआहे का ?",
        "confirmable-yes": "होय",
        "confirmable-no": "नाही",
        "thisisdeleted": "$1चे अवलोकन किंवा पुनर्स्थापन करायचे ?",
        "filerenameerror": "\"$1\" संचिकेचे \"$2\" असे नामांतर करता आले नाही.",
        "filedeleteerror": "\"$1\" संचिका वगळता आली नाही.",
        "directorycreateerror": "\"$1\" कार्यधारीका (डिरेक्टरी) तयार केली जाऊ शकली नाही.",
+       "directoryreadonlyerror": " \"$1\" हा कोश फक्त वाचण्या साठि आहे.",
+       "directorynotreadableerror": " \"$1\" ह्या कोशाला वाचता आणी लिहिता येते.",
        "filenotfound": "\"$1\" ही संचिका सापडत नाही.",
        "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\"",
        "formerror": "त्रुटी: आवेदन सादर करता आले नाही.",
        "no-null-revision": "\"$1\" या पानाची नविन रिक्त आवृत्ती निर्मिता आली नाही.",
        "badtitle": "खराब शीर्षक",
        "badtitletext": "आपण विनंती केलेले पानाचे शीर्षक अयोग्य, रिकामे अथवा चुकिने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात,शीर्षकास अयोग्य अशी एक किंवा अधिक चिन्हे आहेत.",
+       "title-invalid-empty": "आपण विनंति केलेले पान हे रिकामे आहे किंवा त्यास केवळ नामविश्वाचे नाव दिलेले आहे.",
+       "title-invalid-utf8": "आपण विनंति केलेले पानाच्या नवात अवैध यु टि ऐफ अक्षरे आहेत",
+       "title-invalid-interwiki": "आपण विनंति केलेले पाना मध्ये आन्तर विकि दुवे आहेत जे षिर्शकात वपरण्यास मनाइ आहे",
+       "title-invalid-talk-namespace": "आपण विनंति केलेले पान उपलब्ध नसलेल्या चर्च्या पानास संबोधित करते",
        "perfcached": "खालील माहिती सयीमधील (कॅशे) असल्यामुळे ती अद्ययावत् नाही.जास्तीतजास्त {{PLURAL:$1|एक प्रतिफळ |$1 प्रतिफळे }} सयीमध्ये असतात.",
        "perfcachedts": "खालील माहिती सयीमधील (कॅशे) आहे व ती  $1 पर्यंत अद्ययावत् आहे. जास्तीतजास्त {{PLURAL:$4|एक प्रतिफळ |$4 प्रतिफळे}} सयीमध्ये असतात.",
        "querypage-no-updates": "सध्या या पानाकरिता नवी अद्यतने अनुपलब्ध केली आहेत.आत्ताच येथील विदा तरोताजा होणार नाही.",
index 6fcf35f..ef0f3f7 100644 (file)
        "navigation-heading": "Menu 'e navigazzione",
        "errorpagetitle": "Sbaglio",
        "returnto": "Torna a $1.",
-       "tagline": "Dda {{SITENAME}}.",
+       "tagline": "'A {{SITENAME}}.",
        "help": "Ajùto",
        "search": "Truova",
        "searchbutton": "Truova",
        "toolbox": "Strumiente",
        "userpage": "Vere a paggena utente",
        "projectpage": "Vere a paggena 'e servizio",
-       "imagepage": "Vere a paggena ddo file",
+       "imagepage": "Vere a paggena d' 'o file",
        "mediawikipage": "Vere 'a mmasciata",
        "templatepage": "Vere 'o template",
        "viewhelppage": "Vere 'a paggena 'e ajùto",
        "bold_tip": "Grassetto",
        "italic_sample": "Corsivo",
        "italic_tip": "Corsivo",
-       "link_sample": "Titulo ddo cullegamente",
+       "link_sample": "Titulo d' 'o cullegamento",
        "link_tip": "Jonte nterne",
-       "extlink_sample": "http://www.example.com titulo ddo cullegamente",
+       "extlink_sample": "http://www.example.com titulo d' 'o cullegamento",
        "extlink_tip": "Link esterno (arricuordate 'o prefisso http:// )",
        "headline_sample": "Testate",
        "headline_tip": "Testate 'e 2° livello",
        "recentchangeslinked-toolbox": "Cagnamiénte cullegate",
        "recentchangeslinked-title": "Cagnamiénte cullegate a \"$1\"",
        "recentchangeslinked-summary": "Chest'è n'alenco d' 'e cagnamiente fatte mò a 'e paggene cullegate 'a chilla specificata (o pe' cuntenute dint'a na categurìa specificata). 'E paggene cuntenute dint' 'o proprio elenco 'e l'[[Special:Watchlist|Paggene cuntrullate]] songo mmustate 'n '''grassetto'''.",
-       "recentchangeslinked-page": "Nomme dda paggena",
+       "recentchangeslinked-page": "Nomme d' 'a paggena",
        "recentchangeslinked-to": "Mmusta sulamente 'e cagnamiente a 'e paggene cullegate a chilla specificata",
        "upload": "Carreca file",
        "uploadbtn": "Carreca file",
        "whatlinkshere-hideredirs": "$1 redirects",
        "whatlinkshere-hidetrans": "$1 'nclusione",
        "whatlinkshere-hidelinks": "$1 jonte",
-       "whatlinkshere-hideimages": "$1 links ddo file",
+       "whatlinkshere-hideimages": "$1 links d' 'o file",
        "whatlinkshere-filters": "Filtre",
        "autoblockid": "Autoblocco #$1",
        "block": "Blocca l'utente",
        "tooltip-n-mainpage-description": "Visita a paggena prencepale",
        "tooltip-n-portal": "Descrizione d' 'o prugietto, che po' ffa, addò truvà 'e ccose",
        "tooltip-n-currentevents": "Ascìa 'e nfurmaziune ncopp' 'e fatte succiesse mò mò",
-       "tooltip-n-recentchanges": "Ennece dde urdeme cagnamiénte ddo sito",
+       "tooltip-n-recentchanges": "Ennece dde urdeme cagnamiénte d' 'o sito",
        "tooltip-n-randompage": "Na paggena qualsiase",
        "tooltip-n-help": "Paggena 'e ajùto",
        "tooltip-t-whatlinkshere": "'Na lista 'e tutte e paggene ca song cullegate a chista",
        "tooltip-ca-nstab-main": "Vere a paggena e contenuto",
        "tooltip-ca-nstab-user": "Vere a paggena utente",
        "tooltip-ca-nstab-media": "Vide 'a pàggena d' 'e media",
-       "tooltip-ca-nstab-special": "Chista è 'na paggena speciale, nun può essere càgnata",
+       "tooltip-ca-nstab-special": "Chista è 'na paggena speciale e nun può essere càgnata",
        "tooltip-ca-nstab-project": "Vere a paggena 'e servizio",
        "tooltip-ca-nstab-image": "Vere a paggena ddo file",
        "tooltip-ca-nstab-mediawiki": "Vide 'a mmasciata d' 'o sistema",
index d4048dc..388a3f4 100644 (file)
        "actionthrottledtext": "For å beskytte mot spam, kan du ikke utføre denne handlingen for mange ganger i løpet av et kort tidssrom, og du har overskredet denne grensen. Prøv igjen om noen minutter.",
        "protectedpagetext": "Denne siden har blitt låst for endringer.",
        "viewsourcetext": "Du kan se og kopiere kilden til denne siden:",
-       "viewyourtext": "Du kan se og kopiere kilden til '''dine endringer''' på denne siden:",
+       "viewyourtext": "Du kan se og kopiere kilden til <strong>dine endringer</strong> på denne siden.",
        "protectedinterface": "Denne siden kontrollerer brukergrensesnittekst for programvaren, og er låst for å hindre misbruk.",
        "editinginterface": "<strong>Advarsel:</strong> Du redigerer en side som brukes til å kontrollere grensesnittekst for programvaren.\nEndringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere på denne wikien.",
        "translateinterface": "For å legge til eller endre oversettelser for alle wikier bruk [//translatewiki.net/ translatewiki.net], MediaWikis lokaliseringsprosjekt.",
-       "cascadeprotected": "Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->\n$2",
+       "cascadeprotected": "Denne siden er låst for redigering fordi den inkluderes på følgende {{PLURAL:$1|side som har|sider som har}} som har dypbeskyttelse slått på:\n$2",
        "namespaceprotected": "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
        "customcssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "customjsprotected": "Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "createacct-benefit-body3": "{{PLURAL:$1|aktiv bidragsyter|aktive bidragsytere}}",
        "badretype": "Passordene samsvarte ikke.",
+       "usernameinprogress": "Opprettelsesprosessen for dette brukernavnet er igang.\nVennligst vent.",
        "userexists": "Brukernavnet er allerede i bruk.\nVelg et annet brukernavn.",
        "loginerror": "Innloggingsfeil",
        "createacct-error": "Feil med kontoppretting",
        "readonlywarning": "'''ADVARSEL: Databasen er låst på grunn av vedlikehold,\nså du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å\nkopiere teksten din til en tekstfil, så du kan lagre den til senere.'''\n\nSystemadministratoren som låste databasen oppga følgende årsak: $1",
        "protectedpagewarning": "'''Advarsel: Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den.'''\nDet siste loggelementet er oppgitt under som referanse:",
        "semiprotectedpagewarning": "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.\nDet siste loggelementet er oppgitt under som referanse:",
-       "cascadeprotectedwarning": "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede {{PLURAL:$1|sider}}:",
+       "cascadeprotectedwarning": "<strong>Advarsel:</strong> Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede {{PLURAL:$1|side|sider}}:",
        "titleprotectedwarning": "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|bestemte rettigheter]] kreves for å opprette den.'''\nTil orientering vises den siste loggoppføringen under:",
        "templatesused": "{{PLURAL:$1|Mal|Maler}} som brukes på denne siden:",
        "templatesusedpreview": "{{PLURAL:$1|Mal|Maler}} brukt i denne forhåndsvisningen:",
        "search-category": "(kategori $1)",
        "search-file-match": "(matcher filinnhold)",
        "search-suggest": "Mente du: $1",
+       "search-rewritten": "Viser resultatet for $1. Søk i stedet for $2.",
        "search-interwiki-caption": "Søsterprosjekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mer)",
        "searchrelated": "relatert",
        "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}} fra og med nummer <strong>$2</strong> til og med nummer <strong>$3</strong>.",
+       "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultater}} fra og med nummer <strong>$2</strong> til og med nummer <strong>$3</strong>.",
        "search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
        "search-nonefound": "Ingen resultater passet til søket.",
        "powersearch-legend": "Avansert søk",
        "rows": "Rader:",
        "columns": "Kolonner",
        "searchresultshead": "Søk",
-       "stub-threshold": "Grense for <span class=\"mw-stub-example\">stubblenkeformatering</span>:",
+       "stub-threshold": "Grense for stubblenkeformatering ($1):",
+       "stub-threshold-sample-link": "eksempel",
        "stub-threshold-disabled": "Deaktivert",
        "recentchangesdays": "Antall dager som skal vises i siste endringer:",
        "recentchangesdays-max": "Maks $1 {{PLURAL:$1|dag|dager}}",
index 9a369a6..1468b4e 100644 (file)
        "deletedhist": "मेटाएका इतिहास",
        "revdelete-hide-current": "$2, $1: मिति गरिएका वस्तुहरु लुकाउन मिलेन यो नै सबैभन्दा नयाँ संस्करण हो ।\nयसलाई लुकाउन मिल्दैन ।",
        "revdelete-show-no-access": "  $2समय र $1 मिति भएको वस्तु देखाउन सकिएन: यसलाई \"निषेधित\"भनि चिनो लगाइएको छ।\nयसलाई हेर्न तपाईसँग अनुमती छैन ।",
-       "revdelete-modify-no-access": "  $2समय र $1 मिति भएको वस्तु परिवर्तन गर्न सकिएन यसलाई \"निषेधित\"भनि चिनो लगाइएको छ।\nयसलाई परिवर्तन गर्न तपाईसँग अनुमती छैन ।",
+       "revdelete-modify-no-access": "  $2, $1 भएको वस्तु परिवर्तन गर्न सकिएन यसलाई \"निषेधित\"भनि चिनो लगाइएको छ।\nयसलाई परिवर्तन गर्न तपाईंसँग अनुमती छैन ।",
        "revdelete-modify-missing": "आइडी  $1 रहेको वस्तु परिवर्तन गर्दा त्रुटी भएको छ: यस वस्तु डेटावेसबाट हराइरहेको छ !",
        "revdelete-no-change": "'''चेतावनी:''' $2, $1मिति भइको वस्तुको पहिले नै अनुरोध गरे अनुसारको दृश्य सेटिङ्गहरु छन् ।",
        "revdelete-concurrent-change": " $2, $1 मिति गरिएको वस्तु परिवर्तन गर्न सकिएन: यसको स्थितीले तपाईंले परिवर्तन गर्नलाग्नुहुँदा कोहीअरुले नै परिवर्तन गरेजस्तो देखाउँछ\nकृपया लगहरू हेर्नुहोला ।",
        "yourvariant": "लेखको भाषा संस्करण:",
        "prefs-help-variant": "तपाईंको मनपरेको संस्करण वा हिज्जे यस विकि भित्र सामग्री पृष्ठहरू प्रदर्शित गर्नका निमित्त।",
        "yournick": "नयाँ हस्ताक्षर:",
-       "prefs-help-signature": "वारà¥\8dतालाप à¤ªà¥\83षà¥\8dठà¤\95ा à¤\9fिपà¥\8dपणà¥\80हरà¥\81 \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपर्छ ,जुन पछि तपाईँको दस्तखत र समयरेखामा रुपान्तरित हुनेछ ।",
+       "prefs-help-signature": "वारà¥\8dतालाप à¤ªà¥\83षà¥\8dठà¤\95ा à¤\9fिपà¥\8dपणà¥\80हरà¥\82 \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपर्छ ,जुन पछि तपाईँको दस्तखत र समयरेखामा रुपान्तरित हुनेछ ।",
        "badsig": "अमान्य कच्चा दस्तखत।\nHTML ट्यागहरु जाँच्नुहोस् ।",
        "badsiglength": "तपाईंको दस्तखत धेरै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
        "yourgender": "कसरी वताउन चाहनुहुन्छ ?",
        "hebrew-calendar-m10-gen": "तामुज",
        "hebrew-calendar-m11-gen": "अभ्",
        "hebrew-calendar-m12-gen": "एलल्",
-       "signature": "[[{{ns:user}}:$1|$2]]",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
        "timezone-utc": "युटिसी(UTC)",
        "duplicate-defaultsort": "'''चेतावनी:''' पूर्व निर्धारित छोटकरी \"$2\" ले पुरानो पूर्वनिर्धारित छोटकरी\"$1\"लाई विस्थापन गरेको छ ।",
        "duplicate-displaytitle": "<strong>चेतावनी:</strong> शीर्षक देखाउने \"$2\" पूर्व देखाइएको शीर्षक \"$1\" मा ओभररेड गरिंदै छ।",
index aa7aae5..2e42327 100644 (file)
@@ -82,7 +82,8 @@
                        "Macofe",
                        "TheEduGobi",
                        "Araceletorres",
-                       "L"
+                       "L",
+                       "Walesson"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "protectedinterface": "Esta página fornece texto de interface ao software deste wiki, se encontrando protegida para prevenir abusos.\n\nPara adicionar ou alterar traduções em todos os wikis, utilize o [//translatewiki.net/ translatewiki.net], projeto de traduções do MediaWiki.",
        "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.\nPara alterar ou adicionar traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
        "translateinterface": "Para adicionar ou modificar traduções para todas as wikis, por favor use  [//translatewiki.net/ translatewiki.net], o projeto de localização do MediaWiki.",
-       "cascadeprotected": "Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de \"proteção progressiva\" ativada):\n$2",
+       "cascadeprotected": "Esta página foi protegida contra edições porque é transcluída na seguinte {{PLURAL: $1, | página, que é | páginas, que estão protegidas}} com a \"cascata\" opção ativada: $2",
        "namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
        "customcssprotected": "Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.",
        "customjsprotected": "Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuidor|contribuidores}} recentes",
        "badretype": "As senhas que você digitou não são iguais.",
+       "usernameinprogress": "Uma criação da conta para este nome de usuário já está em andamento. Por favor, aguarde.",
        "userexists": "O nome de usuário fornecido já está em uso.\nEscolha um nome diferente.",
        "loginerror": "Erro de autenticação",
        "createacct-error": "Erro ao criar a conta",
        "yourdiff": "Diferenças",
        "copyrightwarning": "Por favor, note que todas as suas contribuições em {{SITENAME}} são consideradas como lançadas nos termos da licença $2 (veja $1 para detalhes). Se não deseja que o seu texto seja inexoravelmente editado e redistribuído de tal forma, não o envie.<br />\nVocê está, ao mesmo tempo, garantindo-nos que isto é algo escrito por você mesmo ou algo copiado de uma fonte de textos em domínio público ou similarmente de teor livre.\n'''NÃO ENVIE TRABALHO PROTEGIDO POR DIREITOS AUTORAIS SEM A DEVIDA PERMISSÃO!'''",
        "copyrightwarning2": "Por favor, note que todas as suas contribuições em {{SITENAME}} podem ser editadas, alteradas ou removidas por outros contribuidores. Se você não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />\nVocê está, ao mesmo tempo, a garantir-nos que isto é algo escrito por si, ou algo copiado de alguma fonte de textos em domínio público ou similarmente de teor livre (veja $1 para detalhes).\n'''NÃO ENVIE TRABALHO PROTEGIDO POR DIREITOS DE AUTOR SEM A DEVIDA PERMISSÃO!'''",
+       "editpage-cannot-use-custom-model": "O modelo de conteúdo desta página não pode ser alterado.",
        "longpageerror": "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''\nA página não pode ser salva.",
        "readonlywarning": "'''Aviso: O banco de dados foi bloqueado para manutenção, por isso você não poderá salvar a sua edição neste momento.'''\nTalvez você queira copiar o seu texto num editor externo e guardá-lo, para posterior envio.\n\nQuem bloqueou o banco de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrador possam editá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida, sendo que apenas usuários registrados poderão editá-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "cascadeprotectedwarning": "'''Atenção:''' Esta página se encontra protegida; apenas {{int:group-sysop}} podem editá-la, uma vez que se encontra incluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} com a \"proteção progressiva\":",
+       "cascadeprotectedwarning": "<strong> Aviso: </ strong> Esta página foi protegida para que somente os usuários com privilégios de administrador pode editá-lo porque ele é transcluída na seguinte protegido por cascata {{PLURAL: $1 | página | páginas}}:",
        "titleprotectedwarning": "'''Atenção: esta página foi protegida; [[Special:ListGroupRights|privilégios específicos]] são necessários para criá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "templatesused": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta previsão:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vazio",
        "content-json-empty-array": "Array vazia",
+       "duplicate-args-warning": "<strong> Aviso: </ strong> [[:$1]] está chamando [[:$2]] com mais de um valor para o parâmetro \"$3\". Será utilizado apenas o último valor fornecido.",
        "duplicate-args-category": "Páginas que utilizam argumentos duplicados ao chamar predefinições",
        "duplicate-args-category-desc": "A pagina contem modelos que usam argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Aviso: Esta página contém muitas chamadas a funções do analisador \"parser\".\n\nDeveria ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento {{PLURAL:$1|há $1 chamada|existem $1 chamadas}}.",
        "search-category": "(categoria $1)",
        "search-file-match": "(coincide com o conteúdo do arquivo)",
        "search-suggest": "Você quis dizer: $1?",
+       "search-rewritten": "Mostrando resultados por $1. Pesquisar em vez de $2.",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Links para páginas de conteúdo aparecerão <a href=\"#\" class=\"stub\">desta forma</a> se elas possuírem menos de (bytes):",
+       "stub-threshold": "Limiar para a formatação ligação stub (US $1):",
+       "stub-threshold-sample-link": "amostra",
        "stub-threshold-disabled": "Desabilitado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "recentchangesdays-max": "(máximo: $1 {{PLURAL:$1|dia|dias}})",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 usuário|$1 usuários}} vigiando]",
-       "rc_categories": "Limite para categorias (separar com \"|\")",
-       "rc_categories_any": "Qualquer",
+       "rc_categories": "Limite para categorias (separar com \"|\"):",
+       "rc_categories_any": "Qualquer dos escolhidos",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após alterações",
        "newsectionsummary": "/* $1 */ nova seção",
        "rc-enhanced-expand": "Exibir detalhes",
        "uploaddisabledtext": "O envio de arquivos encontra-se desativado.",
        "php-uploaddisabledtext": "O envio de arquivos via PHP está desativado.\nVerifique a configuração file_uploads.",
        "uploadscripted": "Este arquivo contém HTML ou código que pode ser erroneamente interpretado por um navegador web.",
+       "upload-scripted-pi-callback": "Não é possível fazer upload de um arquivo que contém a instrução de processamento XML-estilo.",
+       "uploaded-script-svg": "Elemento encontrado programável \"$1\" no arquivo SVG carregado.",
+       "uploaded-hostile-svg": "Encontrado CSS inseguro no elemento de estilo do arquivo SVG carregado.",
+       "uploaded-event-handler-on-svg": "Configuração de manipulador de eventos atribui <code> $1 = \"$2\" </ code> não é permitido em arquivos SVG.",
        "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"",
        "uploadinvalidxml": "O XML no arquivo enviado não pôde ser analisado.",
        "uploadvirus": "O arquivo contém vírus!\nDetalhes: $1",
        "upload-too-many-redirects": "A URL contém redirecionamentos demais",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar envios remotos neste domínio.",
+       "upload-dialog-button-cancel": "Cancelar",
+       "upload-dialog-button-done": "Feito",
+       "upload-dialog-button-save": "Salvar",
+       "upload-dialog-button-upload": "Enviar",
+       "upload-dialog-label-select-file": "Selecionar arquivo",
+       "upload-dialog-label-infoform-title": "Detalhes",
+       "upload-dialog-label-infoform-name": "Nome",
+       "upload-dialog-label-infoform-description": "Descrição",
+       "upload-dialog-label-usage-title": "uso",
+       "upload-dialog-label-usage-filename": "Nome do arquivo",
        "backend-fail-stream": "Não foi possível transmitir o arquivo  $1.",
        "backend-fail-backup": "Não foi possível fazer backup do arquivo  $1 .",
        "backend-fail-notexists": "O arquivo $1 não existe.",
        "unusedimages": "Arquivos não utilizados",
        "wantedcategories": "Categorias pedidas",
        "wantedpages": "Páginas pedidas",
-       "wantedpages-summary": "Lista de páginas não-existentes com mais links para elas, excluindo páginas que apenas têm redirecionamentos para elas. Para obter uma lista de páginas inexistentes com redirecionamentos para elas, veja [[{{#special: Brokenredirects}}]].",
+       "wantedpages-summary": "Lista de páginas não-existentes com mais links para eles, excluindo páginas que apenas têm redirecionamentos links para eles. Para obter uma lista de páginas não-existentes que têm redirecionamentos links para eles, veja [[{{#special: Brokenredirects}} | lista de redirecionamentos quebrados]].",
        "wantedpages-badtitle": "Título inválido no conjunto de resultados: $1",
        "wantedfiles": "Arquivos pedidos",
        "wantedfiletext-cat": "Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].",
        "booksources-text": "É exibida a seguir uma listagem de links para outros sites que vendem livros novos e usados e que possam possuir informações adicionais sobre os livros que você está pesquisando:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique se houve erros ao copiar da fonte original.",
        "specialloguserlabel": "Executor:",
-       "speciallogtitlelabel": "Destino (título ou usuário):",
+       "speciallogtitlelabel": "Alvo (título ou {{ns: user}}: nome de usuário para usuário):",
        "log": "Registros",
        "all-logs-page": "Todos os registros públicos",
        "alllogstext": "Exibição combinada de todos registros disponíveis para o {{SITENAME}}.\nVocê pode diminuir a lista escolhendo um tipo de registro, um nome de usuário (sensível a maiúsculas e minúsculas), ou uma página afetada (também sensível a maiúsculas e minúsculas).",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detetados problemas com a sua sessão;\nEsta ação foi cancelada como medida de proteção contra a intercepção de sessões.\nExperimente usar o botão \"Voltar\" e atualizar a página de onde veio e tente novamente.",
+       "changecontentmodel": "Mudar modelo de conteúdo de uma página",
+       "changecontentmodel-legend": "Mudar modelo de conteúdo",
        "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-reason-label": "Motivo:",
        "logentry-contentmodel-change-revertlink": "reverter",
        "special-characters-title-emdash": "travessão",
        "special-characters-title-minus": "sinal de menos",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-titleinput-description-redirect": "Direto para $1"
 }
index 9093a52..47bebf8 100644 (file)
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Limite para a formatação de <a href=\"#\" class=\"stub\">ligações para esboços</a> (bytes):",
+       "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
+       "stub-threshold-sample-link": "amostra",
        "stub-threshold-disabled": "Desativado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "recentchangesdays-max": "Máximo: $1 {{PLURAL:$1|dia|dias}}",
        "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "specialloguserlabel": "Executante:",
-       "speciallogtitlelabel": "Alvo (página ou utilizador):",
+       "speciallogtitlelabel": "Alvo (título ou página ou {{ns:user}}:nome de utilizador):",
        "log": "Registos",
        "all-logs-page": "Todos os registos públicos",
        "alllogstext": "Apresentação combinada de todos os registos disponíveis na wiki {{SITENAME}}.\nPode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um título de página. Respeite maiúsculas e minúsculas.",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de utilizador",
        "tooltip-ca-nstab-media": "Ver a página de multimédia",
-       "tooltip-ca-nstab-special": "Esta é uma página especial, não pode ser editada.",
+       "tooltip-ca-nstab-special": "Esta é uma página especial e não pode ser editada.",
        "tooltip-ca-nstab-project": "Ver a página de projeto",
        "tooltip-ca-nstab-image": "Ver a página de ficheiro",
        "tooltip-ca-nstab-mediawiki": "Ver a mensagem de sistema",
index 0980b6f..a71f4d1 100644 (file)
        "rows": "Rânduri:",
        "columns": "Coloane:",
        "searchresultshead": "Parametri căutare",
-       "stub-threshold": "Valoarea minimă pentru un <a href=\"#\" class=\"stub\">ciot</a> (octeți):",
+       "stub-threshold": "Pragul pentru formatarea legăturilor către cioturi ($1):",
+       "stub-threshold-sample-link": "exemplu",
        "stub-threshold-disabled": "Dezactivat",
        "recentchangesdays": "Numărul de zile afișate în schimbări recente:",
        "recentchangesdays-max": "(maxim {{PLURAL:$1|o zi|$1 zile}})",
        "booksources-text": "Mai jos se află o listă de legături înspre alte situri care vând cărți noi sau vechi și care pot oferi informații suplimentare despre cărțile pe care le căutați:",
        "booksources-invalid-isbn": "Codul ISBN oferit nu este valid; verificați dacă a fost copiat corect de la sursa originală.",
        "specialloguserlabel": "Executant:",
-       "speciallogtitlelabel": "Destinație (titlu sau utilizator):",
+       "speciallogtitlelabel": "Destinație (titlu sau {{ns:user}}:numeutilizator pentru utilizator):",
        "log": "Jurnale",
        "all-logs-page": "Toate jurnalele publice",
        "alllogstext": "Afișare combinată a tuturor jurnalelor {{SITENAME}}.\nPuteți limita vizualizarea selectând tipul jurnalului, numele de utilizator sau pagina afectată.",
        "tooltip-ca-nstab-main": "Vedeți conținutul paginii",
        "tooltip-ca-nstab-user": "Vezi pagina de utilizator",
        "tooltip-ca-nstab-media": "Vezi pagina media",
-       "tooltip-ca-nstab-special": "Aceasta este o pagină specială, nu o puteți modifica direct.",
+       "tooltip-ca-nstab-special": "Aceasta este o pagină specială și nu poate fi modificată",
        "tooltip-ca-nstab-project": "Vezi pagina proiectului",
        "tooltip-ca-nstab-image": "Vezi pagina fişierului",
        "tooltip-ca-nstab-mediawiki": "Vedeți mesajul de sistem",
index fa1ef9e..2a741d9 100644 (file)
        "session_fail_preview_html": "'''К сожалению, сервер не смог обработать вашу правку из-за потери данных сессии.'''\n\n''Так как {{SITENAME}} разрешает использовать чистый HTML, предварительный просмотр отключён в качестве меры предотвращения JavaScript-атак.''\n\n'''Если это добросовестная попытка редактирования, пожалуйста, попробуйте ещё раз.\nЕсли не получается повторная правка, попробуйте [[Special:UserLogout|завершить сеанс]] работы и заново представиться.'''",
        "token_suffix_mismatch": "'''Ваша правка была отклонена, так как ваша программа неправильно обрабатывает знаки пунктуации\nв окне редактирования. Правка была отменена для предотвращения искажения текста статьи.\nПодобные проблемы могут возникать при использовании анонимизирующих веб-прокси, содержащих ошибки.'''",
        "edit_form_incomplete": "'''Некоторые части формы редактирования не достигли сервера. Внимательно проверьте, что ваши правки не повреждены, и попробуйте ещё раз.'''",
-       "editing": "Редактирование $1",
+       "editing": "Редактирование: $1",
        "creating": "Создание страницы «$1»",
        "editingsection": "Редактирование: $1 (раздел)",
-       "editingcomment": "Редактирование $1 (новый раздел)",
+       "editingcomment": "Редактирование: $1 (новый раздел)",
        "editconflict": "Конфликт редактирования: $1",
        "explainconflict": "Пока вы редактировали эту страницу, кто-то внёс в неё изменения.\nВ верхнем окне для редактирования вы видите текущий текст страницы.\nВ нижнем окне находится ваш вариант.\nПеренесите сделанные вами изменения из нижнего окна в верхнее.\nПри нажатии на кнопку «{{int:savearticle}}» будет сохранён текст верхнего окна.",
        "yourtext": "Ваш текст",
index 305250b..6e2ded1 100644 (file)
        "rows": "Строкаалара:",
        "columns": "Колонкалара:",
        "searchresultshead": "Көрдөөһүн түмүгэ",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">омооннорго ыйынньыктары</a> оҥоруу боруога:",
+       "stub-threshold": "Омооннорго ыйынньыктары оҥоруу боруога ($1):",
+       "stub-threshold-sample-link": "холобур",
        "stub-threshold-disabled": "Арахсыбыт",
        "recentchangesdays": "Хас хонук иһинэн уларытыылары көрдөрөргө:",
        "recentchangesdays-max": "(улааппыта $1 күн)",
index c44e0d6..fba0585 100644 (file)
        "createacct-benefit-body2": "{{PLURAL:$1|pàggina|pàggini}}",
        "createacct-benefit-body3": "{{PLURAL:$1|cuntribbuturi ricenti|cuntribbutura ricenti}}",
        "badretype": "Li password chi' mittisti nun currispùnnunu tra d'iddi.",
+       "usernameinprogress": "Un cuntu cu’ stu nomu utenti già si sta’ criannu.\nPi’ favuri spetta.",
        "userexists": "Lu nomu utenti nziritu è già usatu.\nTi prijamu pirciò di vuliri scègghîri nu nomu utenti diffirenti.",
        "loginerror": "Erruri ntâ trasuta",
        "createacct-error": "Erruri ntâ criazzioni dû cuntu",
        "rows": "Righi:",
        "columns": "Culonni:",
        "searchresultshead": "Risciduta",
-       "stub-threshold": "Valuri minimu pî <a href=\"#\" class=\"stub\">liami a li stub</a>:",
+       "stub-threshold": "Sogghia pi’ furmattari na liami comu bozza ($1):",
+       "stub-threshold-sample-link": "esempiu",
        "stub-threshold-disabled": "Disattivatu",
        "recentchangesdays": "Nùmmiru di jorna a' ammustrari nta l'ùrtimi cancaiamenti:",
        "recentchangesdays-max": "(màssimu $1 {{PLURAL:$1|jornu|jorna}})",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[taliata di {{PLURAL:$1|nu utenti|$1 utenti}}]",
-       "rc_categories": "Lìmita a li catigurìi (siparati di \"|\")",
-       "rc_categories_any": "Quali è jè",
+       "rc_categories": "Lìmita a li catigurìi (spartuti cu’ «|»)",
+       "rc_categories_any": "Quali è jè tra chiddi scigghiuti",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} appressu dû canciamentu",
        "newsectionsummary": "/* $1 */ sizzioni nova",
        "rc-enhanced-expand": "Ammustra li dittagghî",
        "upload-too-many-redirects": "L'URL cuntineva troppi redirect",
        "upload-http-error": "Mmattìu n'erruri HTTP: $1",
        "upload-copy-upload-invalid-domain": "Lu carricamentu di copî nun è cunsintutu di stu duminiu.",
+       "upload-dialog-title": "Carricamentu dûn file",
+       "upload-dialog-error": "Mmattìu n’erruri",
+       "upload-dialog-warning": "Mmattìu n’avvirtimentu",
+       "upload-dialog-button-cancel": "Annulla",
+       "upload-dialog-button-done": "Finutu",
+       "upload-dialog-button-save": "Sarva",
+       "upload-dialog-button-upload": "Càrrica",
+       "upload-dialog-label-select-file": "Scègghî lu file",
+       "upload-dialog-label-infoform-title": "Dittagghî",
+       "upload-dialog-label-infoform-name": "Nomu",
+       "upload-dialog-label-infoform-description": "Discrizzioni",
+       "upload-dialog-label-usage-title": "Usu",
+       "upload-dialog-label-usage-filename": "Nomu dû file",
        "backend-fail-stream": "Nun fu pussìbbili trasmèttiri lu file \"$1\".",
        "backend-fail-backup": "Nun fu' pussìbbili fari na copia di riserva dû file \"$1\".",
        "backend-fail-notexists": "Lu file $1 nun esisti.",
        "booksources-text": "Ccassutta cc'è n'elencu di lijami versu autri siti ca vìnninu libbra novi e usati, e ponnu aviri majuri nfurmazzioni a' prupòsitu dî libbra ca stai circannu:",
        "booksources-invalid-isbn": "Lu còdici ISBN chi' spicificasti nun pari bonu; cuntrolla si' nun cci furu sbagghî di ricupiatura.",
        "specialloguserlabel": "Fattu di l'utenti:",
-       "speciallogtitlelabel": "Oggettu (tìtulu o utenti):",
+       "speciallogtitlelabel": "Oggettu (tìtulu o {{ns:user}}:nomuutenti):",
        "log": "Riggistra",
        "all-logs-page": "Tutti li riggistra pubblici",
        "alllogstext": "Prisintazzioni cumminata di tutti li riggistra dispunìbbili di {{SITENAME}}.\nPoi ristrìnciri la visuali silizziunannu nu tipu di riggistru, l'utenti ca fici l'azzioni (cuntunu majusculi e minusculi), o la pàggina ntirissata (cuntunu majusculi e minusculi puru).",
        "undeletepagetext": "{{PLURAL:$1|La siguenti pàggina fu' cancillata|Li siguenti $1 pàggini foru cancillati}}, però {{PLURAL:$1|è|sunnu}} ancora nta l'archiviu e pi' chistu si {{PLURAL:$1|po|ponnu}} ancora ricupirari.\nPiriudicamenti l'archìviu po' vèniri svacantatu.",
        "undelete-fieldset-title": "Ricùpira virsioni",
        "undeleteextrahelp": "Pi' ricupirari la storia sana dâ pàggina, cliccari <strong><em>{{int:undeletebtn}}</em></strong> senza scegghîri nudda casedda.\nPi' fari nu ricùpiru silittivu, scegghîri li caseddi currispunnenti ê virsioni di ripigghiari, e cliccari <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|virsioni|virsioni}} nta l'archiviu",
+       "undeleterevisions": "$1 {{PLURAL:$1|virsioni}} scancillati",
        "undeletehistory": "Siddu ricùpiri sta pàggina, tutti li so virsioni vèninu ricupirati ntâ crunuluggìa.\nSiddu na pàggina nova havi statu criata cû stissu tìtulu di chidda di ricupirari doppu dâ so cancillazzioni, li virsioni ricupirati vannu a' finiri ntâ crunuluggìa passata.",
        "undeleterevdel": "Lu ricùpiru nun veni fattu siddu pròvuca la cancillazzioni parziali dâ virsioni currenti dâ pàggina o dû file.\nNta stu casu, hai a' livari lu signu di spunta o l'ammucciamentu dâ virsioni cancillata cchiu' ricenti.",
        "undeletehistorynoadmin": "Sta pàggina fu' cancillata.\nLu mutivu dâ cancillazzioni è ammustratu ccà sutta, nzèmmula ê dittagghî di l'utenti ca canciaru sta pàggina prima dâ so cancillazzioni.\nLu testu cuntinutu ntê virsioni cancillati è dispunìbbili sulu a' l'amministratura.",
        "tooltip-ca-nstab-main": "Vidi l'artìculu",
        "tooltip-ca-nstab-user": "Vidi la pàggina utenti",
        "tooltip-ca-nstab-media": "Vidi la pàggina dû file multimidiali",
-       "tooltip-ca-nstab-special": "Chista è na pàggina spiciali, nun pò èssiri canciata",
+       "tooltip-ca-nstab-special": "Chista è na pàggina spiciali, e nun si po’ canciari",
        "tooltip-ca-nstab-project": "Vidi la pàggina di sirvizziu",
        "tooltip-ca-nstab-image": "Vidi la pàggina dâ mmàggini",
        "tooltip-ca-nstab-mediawiki": "Vidi lu missaggiu di sistema",
        "spam_reverting": "Ripristinata l'ùrtima virsioni priva di lijami versu $1",
        "spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìunu lijami versu $1",
        "spam_deleting": "Pàggina cancillata, tutti li virsioni cuntinìunu lijami versu $1",
-       "simpleantispam-label": "Cuntrollu anti spam.\n<strong>NUN</strong> jìnchiri stu campu!",
+       "simpleantispam-label": "Cuntrollu anti-spam.\n<strong>NUN JÌNCHIRI</strong> stu campu!",
        "pageinfo-title": "Nfurmazzioni supra a' \"$1\"",
        "pageinfo-not-current": "Sfurtunatamenti, nun è pussìbbili furnìri sti nfurmazzioni pî virsioni vecchî.",
        "pageinfo-header-basic": "Nfurmazzioni essinziali",
        "logentry-newusers-create2": "U cuntu di l'utenti $3 fu' {{GENDER:$2|criatu}} di $1",
        "logentry-newusers-byemail": "U cuntu di l'utenti $3 fu' {{GENDER:$2|criatu}} di $1 e a password fu' mannata via posta elittrònica",
        "logentry-newusers-autocreate": "U cuntu di l'utenti $1 fu' {{GENDER:$2|criatu}} di manera autumàtica",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|spustàu}} li mpustazzioni di prutizzioni di $4 a’ $3",
        "logentry-rights-rights": "$1 {{GENDER:$2|canciau}} l'appartinenza di $3 dû gruppu $4 ô gruppu $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|canciau}} l'appartinenza a' gruppi di $3",
        "logentry-rights-autopromote": "$1 fu' {{GENDER:$2|prumuvutu|prumuvuta}} di manera autumatica di $4 a' $5",
        "special-characters-title-endash": "liniedda enni",
        "special-characters-title-emdash": "liniedda emmi",
        "special-characters-title-minus": "signu menu",
+       "mw-widgets-dateinput-no-date": "Nudda data scigghiuta",
        "mw-widgets-titleinput-description-new-page": "sta pàggina ancora nun esisti",
        "mw-widgets-titleinput-description-redirect": "rimannu a’ $1"
 }
index 7fb2155..9bc946f 100644 (file)
        "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Faqja e përdoruesit|Faqja e përdorueses}}",
        "nstab-media": "Medie",
        "nstab-special": "Faqe speciale",
-       "nstab-project": "Faqe projekti",
+       "nstab-project": "Projekti",
        "nstab-image": "Skedë",
        "nstab-mediawiki": "Mesazh",
        "nstab-template": "Stampa",
        "updated": "(E ndryshuar)",
        "note": "'''Shënim:'''",
        "previewnote": "'''Vini re! Kjo faqe është vetëm për shqyrtim.'''\nNdryshimet tuaja nuk janë ruajtur ende!",
-       "continue-editing": "Vazhdo ndryshimin",
+       "continue-editing": "Shko në pjesën për redaktim",
        "previewconflict": "Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.",
        "session_fail_preview": "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''\nJu lutemi, provojeni përsëri.\nNëse përsëri nuk punon, provoni të [[Special:UserLogout|dilni nga faqja]] dhe të identifikoheni serish.",
        "session_fail_preview_html": "'''Ju kërkojmë ndjesë! I pamundur përpunimi i redaktimeve tuaja për shkak të humbjes së të dhënave të seancës.'''\n'' Për shkak se {{SITENAME}} ka të aktivizuar përdorimin e HTML-së së papërpunuar, teksti për shqyrtim është fshehur si masë parandaluese kundër sulmeve JavaScript.''\n'''Nëse kjo është një përpjekje e sinqertë për redaktim, ju lutemi, provojeni përsëri.'''\nNëse përsëri nuk funksiono, provoni [[Special:UserLogout|të dilni nga faqja]] dhe të identifikoheni sërish.",
        "history-feed-empty": "Faqja që kërkuat nuk ekziston. Ajo mund të jetë grisur nga wiki ose mund të jetë zhvendosur nën një emër tjetër. Mund të provoni ta gjeni duke e [[Special:Search|kërkuar]].",
        "rev-deleted-comment": "(Edit përmbledhje larguar)",
        "rev-deleted-user": "(përdoruesi u largua)",
-       "rev-deleted-event": "(veprimi në regjistër është hequr)",
+       "rev-deleted-event": "(detajet e regjistrit janë hequr)",
        "rev-deleted-user-contribs": "[Përdoruesi ose adresa IP u hoq - redaktimet e  fshehura nga kontribuesit]",
        "rev-deleted-text-permission": "Versioni i kësaj faqeje është '''fshirë'''.\nDetajet mund të gjenden tek [{{fullurl:{{#Special:Log}}/delete={{FULLPAGENAME}}}} regjistri i grisjeve].",
        "rev-deleted-text-unhide": "Ky version i faqes është '''grisur'''.\nDetajet mund të gjenden tek [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAME}}}} regjistri i grisjeve].\nJu akoma mund ta [$1 shikoni këtë version] nëse doni të vazhdoni.",
        "recentchanges-summary": "Ndiqni ndryshime së fundmi tek kjo faqe.",
        "recentchanges-feed-description": "Ndjek ndryshimet më të fundit në wiki tek kjo fushë.",
        "recentchanges-label-newpage": "Ky redaktim krijoi një faqe të re",
-       "recentchanges-label-minor": "Ky është një editim i vogël",
+       "recentchanges-label-minor": "Ky është një redaktim i vogël",
        "recentchanges-label-bot": "Ky redaktim u krye nga një robot",
        "recentchanges-label-unpatrolled": "Ky editim ende nuk është patrolluar",
        "recentchanges-label-plusminus": "Madhësia e faqes ndryshoi me këtë numër bajtësh",
        "delete-warning-toobig": "Kjo faqe ka një historik të madh redaktimesh, më shumë se $1 {{PLURAL:$1|version|versione}}.\nGrisja e saj mund të ndërpresë operacionet e bazës së të dhënave të {{SITENAME}};\nvazhdoni me kujdes.",
        "rollback": "Riktheji mbrapsh redaktimet",
        "rollbacklink": "riktheje",
-       "rollbacklinkcount": "riktheni $1 {{PLURAL:$1|ndryshimin|ndryshiemt}}",
+       "rollbacklinkcount": "riktheni $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbacklinkcount-morethan": "riktheni më tepër $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbackfailed": "Rikthimi dështoi",
        "cantrollback": "Redaktimi nuk mund të kthehej;\nredaktori i fundit është i vetmi autor i këtij artikulli.",
        "ipb-unblock-addr": "Zhblloko $1",
        "ipb-unblock": "Çblloko përdorues dhe IP të bllokuara",
        "ipb-blocklist": "Përdorues dhe IP adresa të bllokuara",
-       "ipb-blocklist-contribs": "Kontributet për $1",
+       "ipb-blocklist-contribs": "Kontributet për {{GENDER:$1|$1}}",
        "unblockip": "Zhblloko përdoruesin",
        "unblockiptext": "Përdor formularin e më poshtëm për t'i ridhënë leje shkrimi\nnjë përdoruesi ose IP adreseje të bllokuar.",
        "ipusubmit": "Hiqni këtë bllokim",
        "unlockbtn": "Çblloko regjistrin",
        "locknoconfirm": "Nuk vendose kryqin tek kutia konfirmuese.",
        "lockdbsuccesssub": "Regjistri u bllokua me sukses",
-       "unlockdbsuccesssub": "Regjistri u çbllokua me sukses",
+       "unlockdbsuccesssub": "Regjistri u zhbllokua me sukses",
        "lockdbsuccesstext": "Regjistri është bllokuar.<br />\nKujtohuni ta [[Special:UnlockDB|çbllokoni]] pasi të keni mbaruar mirëmbajtjen.",
-       "unlockdbsuccesstext": "Regjistri i {{SITENAME}} është çbllokuar.",
+       "unlockdbsuccesstext": "Regjistri i {{SITENAME}} është zhbllokuar.",
        "lockfilenotwritable": "Skeda për bllokimin e regjistrit s'mund të shkruhet.\nShërbyesi i rrjetit duhet të jetë në gjendje të shkruaj këtë skedë për të bllokuar ose çbllokuar regjistrin.",
        "databasenotlocked": "Regjistri nuk është bllokuar.",
        "lockedbyandtime": "(nga {{GENDER:$1|$1}} më $2 në $3)",
        "spam_deleting": "Të gjitha inspektimet përmbanin lidhje në $1, duke fshirë",
        "simpleantispam-label": "Kontrolli anti-spam.\n<strong>Mos</strong> e plotëso këtë!",
        "pageinfo-title": "Informacion për \" $1 \"",
-       "pageinfo-header-edits": "Redaktimet",
-       "pageinfo-watchers": "Numri i mbikqyrësve",
+       "pageinfo-header-edits": "Historiku i redaktimeve",
+       "pageinfo-watchers": "Numri i mbikqyrësve të faqes",
        "pageinfo-edits": "Numri total i redaktimeve",
-       "pageinfo-authors": "Numri i autorëve të veçantë",
+       "pageinfo-authors": "Numri i përgjithshëm i autorëve të veçantë",
        "pageinfo-toolboxlink": "Informacioni i faqes",
+       "pageinfo-category-total": "Numri i përgjithshëm i anëtarëve",
        "markaspatrolleddiff": "Shënoje si të patrulluar",
        "markaspatrolledtext": "Shënoje këtë artikull të patrulluar",
        "markedaspatrolled": "Shënoje të patrulluar",
        "exif-compression-3": "CCITT Grupi 3 faks kodimi",
        "exif-compression-4": "CCITT Grupi 4 faks kodimi",
        "exif-copyrighted-true": "E drejtë e autorit",
-       "exif-copyrighted-false": "Sferë publike",
+       "exif-copyrighted-false": "Statusi i së drejtës së autorit nuk u caktua",
        "exif-unknowndate": "E dhënë e pa njohur",
        "exif-orientation-1": "Normale",
        "exif-orientation-2": "E kthyer horizontalisht",
        "duplicate-defaultsort": "'''Kujdes:''' Renditja kryesore e çelësit \"$2\" refuzon renditjen e mëparshme kryesore të çelësit \"$1\".",
        "version": "Versioni",
        "version-extensions": "Zgjerime të instaluara",
-       "version-skins": "Pamjet",
+       "version-skins": "Pamjet e instaluara",
        "version-specialpages": "Faqe speciale",
        "version-parserhooks": "Parser goditje",
        "version-variables": "Variabël",
        "version-hook-name": "Emri i goditjes",
        "version-hook-subscribedby": "Abonuar nga",
        "version-version": "($1)",
-       "version-license": "Licensa",
+       "version-license": " Liçenca MediaWiki",
        "version-poweredby-credits": "Ky wiki është mundësuar nga '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "të tjerë",
        "version-license-info": "MediaWiki është një softuer i lirë; ju mund ta shpërndani dhe redakatoni atë nën kushtet GNU General Public License si e publikuar nga fondacioni Free Software; ose versioni 2 i licensës, ose çdo version më i vonshëm.\n\nMediaWiki është shpërndarë me shpresën se do të jetë i dobishëm, por PA ASNJË GARANCI; as garancinë e shprehur të SHITJES apo PËRDORIMIT PËR NJË QËLLIM TË CAKTUAR. Shikoni GNU General Public License  për më shumë detaje.\n\nJu duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU General Public License] së bashku me këtë program; nëse jo, shkruani tek Free Software Foundation, Inc., 51 Rruga Franklin, Kati i pestë, Boston, MA 02110-1301, ShBA ose [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lexojeni atë online].",
        "sqlite-has-fts": "$1 me mbështetje të kërkimit me teskt të plotë",
        "sqlite-no-fts": "$1 pa mbështetje të kërkimit me teskt të plotë",
        "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3",
-       "logentry-delete-restore": "$1 riktheu faqen $3",
-       "logentry-delete-event": "$1 ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
-       "logentry-delete-revision": "$1 ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4",
-       "logentry-delete-event-legacy": "$1 ndryshoi dukshmërinë e ngjarjeve të regjistrit në $3",
-       "logentry-delete-revision-legacy": "$1 ndryshoi dukshmërinë e versioneve në $3",
-       "logentry-suppress-delete": "$1 shtypi faqen $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjitri}} në $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|një rishikimi|$5 rishikimeve}} në faqen $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e ngjarjeve të regjistit në $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ndryshpi}} dukshmërinë e rishikimeve në faqen $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|shtypi}} faqen $3",
        "logentry-suppress-event": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
        "logentry-suppress-revision": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4",
        "logentry-suppress-event-legacy": "$1 në mënyrë sekrete ndryshoi dukshmërinë e ngjarjeve të regjistrit në $3",
        "logentry-newusers-create": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u krijua.",
        "logentry-newusers-create2": "Llogaria e përdoruesit $3 është {{GENDER:$2|krijuar}} nga $1",
        "logentry-newusers-autocreate": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u {{GENDER:$2|krijua}} automatikisht",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ndërroi}} anëtarësinë e grupit për $3 nga $4 në $5",
+       "logentry-rights-autopromote": "$1 është {{GENDER:$2|promovuar}} automatikisht nga $4 në $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngarkoi}} $3",
        "rightsnone": "(asgjë)",
        "revdelete-summary": "përmbledhja redaktimit",
index f2d71b2..5dd040c 100644 (file)
        "revdelete-legend": "Ограничења видљивости",
        "revdelete-hide-text": "Текст измене",
        "revdelete-hide-image": "Сакриј садржај датотеке",
-       "revdelete-hide-name": "СакÑ\80иÑ\98 Ñ\86иљ и параметре",
+       "revdelete-hide-name": "Ð¦иљ и параметре",
        "revdelete-hide-comment": "Опис измене",
        "revdelete-hide-user": "Корисничко име/ИП адреса",
        "revdelete-hide-restricted": "Сакриј податке од администратора и других корисника",
        "group-autoconfirmed-member": "{{GENDER:$1|аутоматски потврђен корисник|аутоматски потврђена корисница}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|администратор|администраторка|администратор}}",
-       "group-bureaucrat-member": "{{GENDER:$1|бирократа|бирократкиња|бирократа}}",
+       "group-bureaucrat-member": "{{GENDER:$1|бирократа}}",
        "group-suppress-member": "{{GENDER:$1|ревизор|ревизорка}}",
        "grouppage-user": "{{ns:project}}:Корисници",
        "grouppage-autoconfirmed": "{{ns:project}}:Аутоматски потврђени корисници",
        "enotif_subject_moved": "Страницу $1 на {{SITENAME}} {{GENDER:$2|преместио је|преместила је}} $2",
        "enotif_subject_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио је|вратила је|вратио је}} $2",
        "enotif_subject_changed": "Страницу $1 на {{SITENAME}} {{GENDER:$2|променио је|променила је|променио је}} $2",
-       "enotif_body_intro_deleted": "Страницу $1 на {{SITENAME}} {{GENDER:$2|обрисао је|обрисала је|обрисао је}} $2 дана $PAGEEDITDATE. Погледајте $3.",
+       "enotif_body_intro_deleted": "Страницу $1 на {{SITENAME}} {{GENDER:$2|обрисао|обрисала}} је $2 дана $PAGEEDITDATE Погледајте $3.",
        "enotif_body_intro_created": "Страницу $1 на {{SITENAME}} {{GENDER:$2|направио|направила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.",
        "enotif_body_intro_moved": "Страницу $1 на {{SITENAME}} {{GENDER:$2|преместио|преместила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на  $3.",
        "enotif_body_intro_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио|вратила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.",
        "protect-locked-dblock": "Степени заштите се не могу мењати јер је активна база података закључана.\nОво су поставке странице '''$1''':",
        "protect-locked-access": "Немате овлашћења за мењање степена заштите странице.\nОво су тренутне поставке странице '''$1''':",
        "protect-cascadeon": "Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|страници која има|страницама које имају}} преносиву заштиту.\nМожете да промените степен заштите, али то неће утицати на преносиву заштиту.",
-       "protect-default": "Допуштено свим корисницима",
+       "protect-default": "Допуштено свима",
        "protect-fallback": "Дозвољено само корисницима са дозволом „$1“",
        "protect-level-autoconfirmed": "Допуштено само аутоматски потврђеним корисницима",
        "protect-level-sysop": "Допуштено само администраторима",
        "imagetypemismatch": "Екстензија нове датотеке се не поклапа с њеном врстом",
        "imageinvalidfilename": "Циљани назив датотеке је неисправан",
        "fix-double-redirects": "Ажурирајте сва преусмерења која воде до првобитног наслова",
-       "move-leave-redirect": "Ð\9dапÑ\80ави преусмерење",
+       "move-leave-redirect": "Ð\9eÑ\81Ñ\82ави преусмерење",
        "protectedpagemovewarning": "'''Упозорење:''' ова страница је заштићена, тако да само корисници с администраторским овлашћењима могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
        "semiprotectedpagemovewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
        "move-over-sharedrepo": "== Датотека постоји ==\n[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.",
        "import-interwiki-history": "Копирај све верзије историје за ову страницу",
        "import-interwiki-templates": "Укључи све шаблоне",
        "import-interwiki-submit": "Увези",
+       "import-mapping-default": "Исто као и изворне странице",
        "import-mapping-namespace": "Увези у именски простор:",
+       "import-mapping-subpage": "Увези као подстранице следеће странице:",
        "import-upload-filename": "Назив датотеке:",
        "import-comment": "Коментар:",
        "importtext": "Извезите датотеку с изворног викија користећи [[Special:Export|извоз]].\nСачувајте је на рачунар и пошаљите овде.",
index c75c894..282cdc8 100644 (file)
        "revdelete-legend": "Ograničenja vidljivosti",
        "revdelete-hide-text": "Tekst izmene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij cilj i parametre",
+       "revdelete-hide-name": "Cilj i parametre",
        "revdelete-hide-comment": "Opis izmene",
        "revdelete-hide-user": "Korisničko ime/IP adresa",
        "revdelete-hide-restricted": "Sakrij podatke od administratora i drugih korisnika",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
-       "group-bureaucrat-member": "{{GENDER:$1|birokrata|birokratkinja}}",
+       "group-bureaucrat-member": "{{GENDER:$1|birokrata}}",
        "group-suppress-member": "{{GENDER:$1|revizor|revizorka}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatski potvrđeni korisnici",
        "enotif_subject_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio je|premestila je}} $2",
        "enotif_subject_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio je|vratila je}} $2",
        "enotif_subject_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio je|promenila je}} $2",
-       "enotif_body_intro_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao je|obrisala je}} $2 dana $PAGEEDITDATE. Pogledajte $3.",
+       "enotif_body_intro_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je $2 dana $PAGEEDITDATE Pogledajte $3.",
        "enotif_body_intro_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio|napravila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
        "enotif_body_intro_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio|premestila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na  $3.",
        "enotif_body_intro_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio|vratila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
        "protect-locked-dblock": "Stepeni zaštite se ne mogu menjati jer je aktivna baza podataka zaključana.\nOvo su postavke stranice '''$1''':",
        "protect-locked-access": "Nemate ovlašćenja za menjanje stepena zaštite stranice.\nOvo su trenutne postavke stranice '''$1''':",
        "protect-cascadeon": "Ova stranica je trenutno zaštićena jer se nalazi na {{PLURAL:$1|stranici koja ima|stranicama koje imaju}} prenosivu zaštitu.\nMožete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu.",
-       "protect-default": "Dopušteno svim korisnicima",
+       "protect-default": "Dopušteno svima",
        "protect-fallback": "Dozvoljeno samo korisnicima sa dozvolom „$1“",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-level-sysop": "Dopušteno samo administratorima",
        "imagetypemismatch": "Ekstenzija nove datoteke se ne poklapa s njenom vrstom",
        "imageinvalidfilename": "Ciljani naziv datoteke je neispravan",
        "fix-double-redirects": "Ažurirajte sva preusmerenja koja vode do prvobitnog naslova",
-       "move-leave-redirect": "Napravi preusmerenje",
+       "move-leave-redirect": "Ostavi preusmerenje",
        "protectedpagemovewarning": "'''Upozorenje:''' ova stranica je zaštićena, tako da samo korisnici s administratorskim ovlašćenjima mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
        "semiprotectedpagemovewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
        "move-over-sharedrepo": "== Datoteka postoji ==\n[[:$1]] se nalazi na deljenom skladištu. Ako premestite datoteku na ovaj naslov, to će zameniti deljenu datoteku.",
index a823cbc..74014ed 100644 (file)
        "protectedpages-noredirect": "Scondi rimandi",
        "protectedpagesempty": "Al momento no ghe xe pagine protete",
        "protectedpages-timestamp": "Data e ora",
+       "protectedpages-page": "Pàjina",
+       "protectedpages-expiry": "Scade",
        "protectedpages-reason": "Motivo",
        "protectedpages-unknown-timestamp": "Sconossùa",
        "protectedpages-unknown-performer": "Utente sconossùo",
        "pager-older-n": "{{PLURAL:$1|quel pi vecio|i $1 pi vèci}}",
        "suppress": "Supervision",
        "querypage-disabled": "Sta pàjina speciałe ła xe dixativà par motivi de prestasion.",
+       "apihelp-no-such-module": "Modulo \"$1\" mia catà.",
        "booksources": "Fonti librarie",
        "booksources-search-legend": "Riserca de fonti librarie",
        "booksources-search": "Serca",
        "listgrouprights-addgroup-self-all": "Pol xontarse a tuti i grupi",
        "listgrouprights-removegroup-self-all": "Pol cavarse da tuti i grupi",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "trackingcategories-name": "Nome del messajo",
        "mailnologin": "Nissun indirizo a cui mandarghe el messagio",
        "mailnologintext": "Par inviare messagi e-mail ad altri utenti bisogna [[Special:UserLogin|acedere al sito]] e aver registrà un indirisso vałido ne łe proprie [[Special:Preferences|preferense]].",
        "emailuser": "Scrìveghe a sto utente",
        "rollback-success": "Anułàe łe modifighe de $1; riportà a ła version de prima de $2.",
        "sessionfailure-title": "Eròr de session",
        "sessionfailure": "Se gà verificà un problema ne la session che identifica l'acesso; el sistema, par precauzion, no'l gà mìa eseguìo el comando che te ghè dato. Torna a la pagina precedente col boton 'Indrìo' del to browser, ricarica la pagina e ripróa da novo.",
+       "changecontentmodel-title-label": "Tìtoło de ła pàjina",
        "changecontentmodel-reason-label": "Motivo:",
        "protectlogpage": "Protesion",
        "protectlogtext": "De seguito xe elencade łe modifeghe ałe protesion dełe pajine.\nVedi ła [[Special:ProtectedPages|lista dełe pajine protete]] pa l'elenco de łe protesion de pajina atualmente ative.",
        "version-entrypoints": "URL de aceso",
        "version-entrypoints-header-entrypoint": "Punti de aceso",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Librarie instalà",
        "version-libraries-library": "Libraria",
        "version-libraries-version": "Version",
        "version-libraries-license": "Licensa",
        "tags-activate-reason": "Motivo:",
        "tags-activate-submit": "Intaca",
        "tags-deactivate-reason": "Motivo:",
+       "tags-edit-existing-tags-none": "''Nissuna''",
+       "tags-edit-new-tags": "Etichete nove:",
+       "tags-edit-add": "Zonta ste etichete:",
+       "tags-edit-remove": "Cava ste etichete:",
+       "tags-edit-remove-all-tags": "(cava tute le etichete)",
        "tags-edit-reason": "Motivo:",
        "comparepages": "Confronta le pagine",
        "compare-page1": "Pagina 1",
        "rightsnone": "(nissun)",
        "revdelete-summary": "modifica ogeto",
        "feedback-adding": "Inserimento del feedback inte ła pàjina...",
+       "feedback-back": "Indrìo",
        "feedback-bugcheck": "Otimo! Verifega che nó 'l sia xà infrà i [$1 bug conosui].",
        "feedback-bugnew": "Controło efetuà. Segnała un novo bug",
        "feedback-bugornote": "Se se xe in grado de descrivare el problema tenico riscontrà in maniera precixa, [$1 segnałare el bug]. In alternadiva, se pol doparar el moduło senplifegà cuà soto. El comento inserio el sarà xontà a ła pàjina \"[$3 $2]\", insieme al propio nome utente.",
        "feedback-cancel": "Anuła",
        "feedback-close": "Fato",
+       "feedback-error-title": "Eròr",
        "feedback-error1": "Eror: Da ła API xe rivà un rexultà nó riconosùo",
        "feedback-error2": "Eror: Nó xe sta posibiłe exeguir ła modifega",
        "feedback-error3": "Errore: Nisuna risposta da ła API",
        "feedback-subject": "Ogeto:",
        "feedback-submit": "Manda",
        "feedback-thanks": "Grasie! El to feedback el xe sta publicà a ła pàjina \"[$2 $1]\".",
+       "feedback-thanks-title": "Grassie!",
        "searchsuggest-search": "Serca",
        "searchsuggest-containing": "che contien...",
        "api-error-badaccess-groups": "Nó te si autorixà a cargar documenti so sta wiki.",
        "duration-centuries": "$1 {{PLURAL:$1|secolo|secoli}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenio|mileni}}",
        "rotate-comment": "Imagine girà de $1 {{PLURAL:$1|grado|gradi}} in senso orario",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|secondo|secondi}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$1|byte}}",
        "expandtemplates": "Espansion dei template",
        "expand_templates_intro": "Sta pagina speciale la elabora un testo espandendo tuti i template presenti. La calcola inoltre el risultato de le funzion suportàe dal parser come <nowiki>{{</nowiki>#language:...}} e de le variabili de sistema quali <nowiki>{{</nowiki>CURRENTDAY}}, overo in pratica tuto quel che se cata tra dopie parentesi grafe. La funsiona riciamando le oportune funzion del parser de MediaWiki.",
        "expand_templates_title": "Contesto (par {{FULLPAGENAME}} ecc.):",
        "expand_templates_remove_nowiki": "Cava i tag <nowiki> dal risultato",
        "expand_templates_generate_xml": "Mostra àlbaro sintàtico XML",
        "expand_templates_preview": "Anteprima",
+       "pagelang-name": "Pàjina",
+       "pagelang-language": "Lengua",
+       "mediastatistics-header-unknown": "Sconossùo",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-executable": "File eseguibili",
        "special-characters-group-latin": "Latìn",
        "special-characters-group-latinextended": "Latìn estexo",
        "special-characters-group-ipa": "IPA",
        "special-characters-title-emdash": "lineeta eme",
        "special-characters-title-minus": "segno meno",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-titleinput-description-redirect": "rimando a $1"
 }
index 471fda9..0d1f70f 100644 (file)
        "rows": "Số hàng:",
        "columns": "Số cột:",
        "searchresultshead": "Tìm kiếm",
-       "stub-threshold": "Định dạng <a href=\"#\" class=\"stub\">liên kết đến sơ khai</a> cho các trang ngắn hơn (byte):",
+       "stub-threshold": "Định dạng liên kết đến sơ khai ($1) cho các trang ngắn hơn:",
+       "stub-threshold-sample-link": "ví dụ",
        "stub-threshold-disabled": "Tắt",
        "recentchangesdays": "Số ngày hiển thị trong thay đổi gần đây:",
        "recentchangesdays-max": "(tối đa $1 {{PLURAL:$1|ngày|ngày}})",
        "booksources-text": "Dưới đây là danh sách những trang bán sách mới và cũ, đồng thời có thể có thêm thông tin về những cuốn sách bạn đang tìm:",
        "booksources-invalid-isbn": "ISBN mà bạn cung cấp dường như không đúng; xin hãy kiểm tra lại xem có lỗi gì khi sao chép từ nội dung gốc hay không.",
        "specialloguserlabel": "Người thực hiện:",
-       "speciallogtitlelabel": "Mục tiêu (tiêu đề hoặc người dùng):",
+       "speciallogtitlelabel": "Mục tiêu (tiêu đề hoặc {{ns:user}}:Tên-người-dùng đối với người dùng):",
        "log": "Nhật trình",
        "all-logs-page": "Tất cả các nhật trình công khai",
        "alllogstext": "Hiển thị tất cả các nhật trình đang có của {{SITENAME}} chung với nhau.\nBạn có thể thu hẹp kết quả bằng cách chọn loại nhật trình, tên thành viên (phân biệt chữ hoa-chữ thường), hoặc các trang bị ảnh hưởng (cũng phân biệt chữ hoa-chữ thường).",
        "autoredircomment": "Đổi hướng đến [[$1]]",
        "autosumm-new": "Tạo trang mới với nội dung “$1”",
        "autosumm-newblank": "Đã tạo trang trống",
+       "size-bytes": "$1 byte",
        "size-kilobytes": "$1 kB",
+       "size-pixel": "$1 điểm ảnh",
        "size-kilopixel": "$1 kP",
        "bitrate-bits": "$1 bit/s",
        "bitrate-kilobits": "$1 kbit/s",
index 66ac477..ca1295a 100644 (file)
@@ -8,7 +8,8 @@
                        "Wiki indio",
                        "לערי ריינהארט",
                        "Kolega2357",
-                       "아라"
+                       "아라",
+                       "MarcoAurelio"
                ]
        },
        "tog-underline": "Bagisa ha ilarom an mga sumpay:",
        "prefs-reset-intro": "Puydi nimo ini gamiton nga pakli para makareset han imo mga preperensya nga ginbutang nga daan han sityo. Diri ini puydi mapawaray-buhat.",
        "prefs-emailconfirm-label": "Kompirmasyon han email:",
        "youremail": "E-mail:",
-       "username": "{{HENERO:$1|Agnay hit gumaramit}}:",
+       "username": "{{GENDER:$1|Agnay hit gumaramit}}:",
        "prefs-memberingroups": "{{GENDER:$2|Api}} han {{PLURAL:$1|grupo|mga grupo}}:",
        "prefs-registration": "Oras han pagrehistro:",
        "yourrealname": "Tinuod nga ngaran:",
        "pageinfo-category-subcats": "Ihap han mga ubos-kaarangay",
        "pageinfo-category-files": "Ihap han mga paypay",
        "markaspatrolleddiff": "Igmarka komo ginpatrolya na",
-       "markaspatrolledtext": "Markaha ini nga pakli komo ginpatrolya na",
+       "markaspatrolledtext": "Markaha ini nga pakli nga napatrolyahan na",
        "markedaspatrolled": "Igmarka komo ginpatrolya na",
        "markedaspatrollederror": "Diri nakakamarka komo ginpatrolya na",
        "patrol-log-page": "Talaan han pagpatrolya",
index bdd8d9a..91c13e1 100644 (file)
        "tooltip-ca-nstab-main": "Xool jukki bi",
        "tooltip-ca-nstab-user": "Xool xëtu jëfandikukat wi",
        "tooltip-ca-nstab-media": "Xool xëtu dencukaay wi",
-       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu kaa soppi.",
+       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu koo soppi.",
        "tooltip-ca-nstab-project": "Xool xëtu sémb wi",
        "tooltip-ca-nstab-image": "Xool xëtu dencukaay wi",
        "tooltip-ca-nstab-mediawiki": "Xool bataaxalu noste bi",
        "metadata-help": "Bii dencukaay dafa ami xibaar yees ci yokk, xéj-na nataalukaay bu waaraame walla waaraamalekaay bees jëfandikoo moo leen ci yokk. Su fekkee soppees na xar-kanamu dencukaay bi, yenn ci fàramfacce ñeel ko manees nañoo bañ a dëppook li am.",
        "metadata-expand": "Wone faramfacce yi",
        "metadata-collapse": "Nëbb faramfacce yi",
-       "metadata-fields": "Tool yi ñu jagleel jégginjoxe yu EXIF yi ñu lim ci wii xët di nañu leen wone ci xëtu nataal wi suñu waññee àlliwa bu jegginjoxe yi.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Tooli jégginjoxe yu nataal yi ñu lim ci bii bataaxal dañ leen di wone ci xëtu faramfàcce wu nataal bi su fekkee dañoo lem àlliwab jégginjoxe bi.\nYeneen tool yi dañ leen di nëbb.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Yaatuwaay",
        "exif-imagelength": "Kawewaay",
        "exif-usercomment": "Kadduy jëfëndikookat bi",
index 5149a64..007a852 100644 (file)
        "tooltip-ca-nstab-main": "זעט דעם אינהאַלט בלאַט",
        "tooltip-ca-nstab-user": "זעט דעם באניצער בלאט",
        "tooltip-ca-nstab-media": "קוקט אין דעם מעדיע בלאט",
-       "tooltip-ca-nstab-special": "×\93×\90ס ×\90×\99×\96 ×\90 ×¡×¤×¢×¦×\99×¢×\9cער ×\91×\9c×\90×\98, ×\9e'קע×\9f ×\90×\99×\9d × ×\99ש×\98 ×¢× ×\93×¢רן",
+       "tooltip-ca-nstab-special": "×\93×\90ס ×\90×\99×\96 ×\90 ×¡×¤×¢×¦×\99×¢×\9cער ×\91×\9c×\90×\98, ×\9e'קע×\9f ×\90×\99×\9d × ×\99ש×\98 ×¨×¢×\93×\90ק×\98×\99רן",
        "tooltip-ca-nstab-project": "באקוקט דעם פראיעקט בלאט",
        "tooltip-ca-nstab-image": "באקוקט דעם טעקע בלאט",
        "tooltip-ca-nstab-mediawiki": "באקוקט די סיסטעם מעלדונגען",
index 2476846..7113f38 100644 (file)
        "booksources-text": "下面是销售新书和二手书的其他网站的链接的列表,也可能有关于你正在寻找的图书的更多信息:",
        "booksources-invalid-isbn": "提供的ISBN号码并不正确,请检查原始复制来源号码是否有误。",
        "specialloguserlabel": "执行者:",
-       "speciallogtitlelabel": "目标(标题或用户):",
+       "speciallogtitlelabel": "目标(标题,或对于用户使用{{ns:user}}:用户名):",
        "log": "日志",
        "all-logs-page": "所有公开日志",
        "alllogstext": "所有{{SITENAME}}公开日志的联合展示。您可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。",
index b795821..a56e266 100644 (file)
        "rows": "列數:",
        "columns": "欄數:",
        "searchresultshead": "搜尋",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
+       "stub-threshold": "短頁面連結格式門檻值 ($1):",
+       "stub-threshold-sample-link": "樣本",
        "stub-threshold-disabled": "已停用",
        "recentchangesdays": "近期變更顯示的天數:",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "booksources-text": "下列清單包含其他銷售新書籍或二手書籍的網站連結,可會有你想尋找書籍的進一部資訊:",
        "booksources-invalid-isbn": "您提供的 ISBN 不正確,請檢查複製的來源是否有誤。",
        "specialloguserlabel": "執行者:",
-       "speciallogtitlelabel": "目標 (標題或使用者):",
+       "speciallogtitlelabel": "ç\9b®æ¨\99 (æ¨\99é¡\8cæ\88\96以 {{ns:user}}:使ç\94¨è\80\85 è¡¨ç¤ºä½¿ç\94¨è\80\85)ï¼\9a",
        "log": "日誌",
        "all-logs-page": "所有公開日誌",
        "alllogstext": "合併顯示所有 {{SITENAME}} 中所有類型的日誌。\n您可以點選下拉式選單選擇日誌的類型,指定使用者名稱 (區分大小寫) 或影響的頁面 (區分大小寫)。",
index 81e0605..8e5704e 100644 (file)
     "sp-contributions-blocklog": "封鎖記錄",
     "sp-contributions-userrights": "使用者權限管理",
     "sp-contributions-username": "IP位址或使用者名稱:",
-    "whatlinkshere-title": "鏈接到$1的頁面",
     "blockip": "封鎖使用者",
     "ipadressorusername": "IP地址或使用者名:",
     "ipbreason-dropdown": "*一般的封鎖理由\n** 屢次增加不實資料\n** 刪除頁面內容\n** 外部連結廣告\n** 在頁面中增加無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 不能接受的使用者名",
index abe287a..38265ae 100644 (file)
@@ -35,6 +35,7 @@
  * @author Pi.C.Noizecehx
  * @author Priviet
  * @author PuzzletChung
+ * @author Revi
  * @author TheAlpha for knowledge
  * @author ToePeu
  * @author Yjs5497
@@ -338,7 +339,7 @@ $magicWords = array(
        'numberingroup'             => array( '1', '권한별사용자수', '그룹별사용자수', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
-       'cascadingsources'          => array( '1', '계단식원본', 'CASCADINGSOURCES' ),
+       'cascadingsources'          => array( '1', '연쇄식원본', '계단식원본', 'CASCADINGSOURCES' ),
        'formatdate'                => array( '0', '날짜형식', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', '경로', 'PATH' ),
        'url_wiki'                  => array( '0', '위키', 'WIKI' ),
index 91c60c1..4899143 100644 (file)
@@ -46,7 +46,6 @@ s23wiki|http://s23.org/wiki/$1|0|http://s23.org/w/api.php
 seattlewireless|http://seattlewireless.net/$1|0|
 senseislibrary|http://senseis.xmp.net/?$1|0|
 shoutwiki|http://www.shoutwiki.com/wiki/$1|0|http://www.shoutwiki.com/w/api.php
-sourceforge|http://sourceforge.net/$1|0|
 sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0|http://www.sourcewatch.org/api.php
 squeak|http://wiki.squeak.org/squeak/$1|0|
 tejo|http://www.tejo.org/vikio/$1|0|
index 0628773..12352e7 100644 (file)
@@ -48,7 +48,6 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local,iw_api) VALUES
 ('seattlewireless','http://seattlewireless.net/$1',0,''),
 ('senseislibrary','http://senseis.xmp.net/?$1',0,''),
 ('shoutwiki','http://www.shoutwiki.com/wiki/$1',0,'http://www.shoutwiki.com/w/api.php'),
-('sourceforge','http://sourceforge.net/$1',0,''),
 ('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0,'http://www.sourcewatch.org/api.php'),
 ('squeak','http://wiki.squeak.org/squeak/$1',0,''),
 ('tejo','http://www.tejo.org/vikio/$1',0,''),
index 2d3a922..3a00bd4 100644 (file)
 分佈著      分布着
 散布著      散布着
 散佈著      散布着
+遍佈著      遍布着
+遍布著      遍布着
 三十六著   三十六着
 走為上著   走为上着
 記憶體      内存
 數位照相機        数码照相机
 單眼相機   单反相机
 單鏡反光機        单反相机
+桌上型電腦        台式电脑
 韌體 固件
 唯讀 只读
 作業系統   操作系统
@@ -2512,6 +2515,7 @@ IP位址  IP地址
 結他 吉他
 了結他      了结他
 連結他      连结他
+鏈結 链接
 已開發國家        发达国家
 太空飛行員        宇航员
 太空衣      宇航服
index 69bce98..525100e 100644 (file)
@@ -41,6 +41,7 @@
 分布 分佈
 分布于      分佈於
 宣布 宣佈
+承宣布政   承宣布政
 公布 公佈
 摆布 擺佈
 擺布 擺佈
 分佈著      分佈着
 散布著      散佈着
 散佈著      散佈着
+遍佈著      遍佈着
+遍布著      遍佈着
 三十六著   三十六着
 走為上著   走為上着
 鬧著 鬧着
@@ -2884,6 +2887,7 @@ IP地址  IP位址
 数字照相机        数碼照相機
 單眼相機   單鏡反光機
 单反相机   單鏡反光機
+台式电脑   桌上型電腦
 形上學      形而上學
 吉尼斯世界纪录  健力士世界紀錄
 吉他 結他
index 6c93bb5..22456a7 100644 (file)
 磁盘 磁碟
 磁道 磁軌
 端口 埠
-算子 運算元
 芯片 晶片
 译码 解碼
 软驱 軟碟機
 数据库      資料庫
 打印机      印表機
 打印機      印表機
-字节 位元組
-字節 位元組
 打印 列印
-攻打印      攻打印
+攻打 攻打 #分詞用
+打印度      打印度
 硬件 硬體
 二极管      二極體
 二極管      二極體
@@ -650,6 +648,7 @@ IP地址    IP位址
 数码照相机        數位照相機
 數碼照相機        數位照相機
 单反相机   單眼相機
+台式电脑   桌上型電腦
 形而上學   形上學
 形而上学   形上學
 当且仅当   若且唯若
@@ -733,6 +732,8 @@ IP地址    IP位址
 數碼訊號   數位訊號
 移动网络   行動網路
 流動網絡   行動網路
+网络游戏   網路遊戲
+網絡遊戲   網路遊戲
 咪高峰      麥克風
 電單車      機車
 搜索引擎   搜尋引擎
index b23faef..13a0b98 100644 (file)
@@ -2,7 +2,7 @@
 “    「
 ‘    『
 ’    』
-’s   ’s
+’s   ’s
 手塚治虫   手塚治虫
 無言不仇   無言不讎
 視如寇仇   視如寇讎
@@ -69,9 +69,6 @@
 乾象曆      乾象曆
 乾象历      乾象曆
 不好干預   不好干預
-不干預      不干預
-不干擾      不干擾
-不干牠      不干牠
 范文瀾      范文瀾
 機械系      機械系
 頂多 頂多
 員山庄      員山庄
 昵称 暱稱
 單于 單于
-鮮于樞      鮮于樞
+鮮于 鮮于
 賦范 賦范
 茅于軾      茅于軾
 陳有后      陳有后
 水里高級商工     水里高級商工
 水里鳳林   水里鳳林
 水里濁水溪        水里濁水溪
+洞里薩      洞里薩
 划不來      划不來
 划來划去   划來划去
 划動 划動
index c7e4eca..b97ca6e 100644 (file)
 採區
 採運
 採風
+採血
 官地為寀
 寮寀
 蔘綏
 不占算
 不好干涉
 不好干預
-不干預
-不干涉
-不干休
-不干犯
-不干擾
-不干你
-不干我
-不干他
-不干她
-不干它
-不干事
 不斗膽
 不每只
 不采聲
 好斗篷
 好斗膽
 好斗蓬
+墨斗
 小几
 尸利
 尸祿
 這裡
 中文裡
 洞裡
+洞里薩
 界裡
 眼睛裡
 百科裡
 有只用
 葉叶琹
 胡子昂
+胡子嬰
 包括
 特别致
 分别致
 舞后
 甄后
 郭后
+高后
+升高後
+提高後
 0年 # 協助分詞
 1年
 2年
 于再清
 茅于軾
 張樂于張徐
-鮮于樞
+鮮于
+朝鮮於
 于寶軒
 于震
 於震前
 羅馬曆
 羅馬歷史
 羅馬歷代
+曆數書
 你誇
 誇你
 誇我
 蒸製
 烹製
 醃製
+和製漢
+壓製機
+壓製出
 體徵
 綜合徵
 价川
 腌臢
 風颳
 颳大風
+黃白術
index 96e01fe..088f677 100644 (file)
@@ -39,9 +39,12 @@ class NamespaceConflictChecker extends Maintenance {
         */
        protected $db;
 
-       private $resolvableCount = 0;
+       private $resolvablePages = 0;
        private $totalPages = 0;
 
+       private $resolvableLinks = 0;
+       private $totalLinks = 0;
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "";
@@ -172,7 +175,43 @@ class NamespaceConflictChecker extends Maintenance {
                }
 
                $this->output( "{$this->totalPages} pages to fix, " .
-                       "{$this->resolvableCount} were resolvable.\n" );
+                       "{$this->resolvablePages} were resolvable.\n\n" );
+
+               foreach ( $spaces as $name => $ns ) {
+                       if ( $ns != 0 ) {
+                               // Fix up link destinations for non-interwiki links only.
+                               //
+                               // For example if a page has [[Foo:Bar]] and then a Foo namespace
+                               // is introduced, pagelinks needs to be updated to have
+                               // page_namespace = NS_FOO.
+                               //
+                               // If instead an interwiki prefix was introduced called "Foo",
+                               // the link should instead be moved to the iwlinks table. If a new
+                               // language is introduced called "Foo", or if there is a pagelink
+                               // [[fr:Bar]] when interlanguage magic links are turned on, the
+                               // link would have to be moved to the langlinks table. Let's put
+                               // those cases in the too-hard basket for now. The consequences are
+                               // not especially severe.
+                               //
+                               // @fixme Handle interwiki links, and pagelinks to Category:, File:
+                               // which probably need reparsing.
+
+                               $this->checkLinkTable( 'pagelinks', 'pl', $ns, $name, $options );
+                               $this->checkLinkTable( 'templatelinks', 'tl', $ns, $name, $options );
+
+                               // The redirect table has interwiki links randomly mixed in, we
+                               // need to filter those out. For example [[w:Foo:Bar]] would
+                               // have rd_interwiki=w and rd_namespace=0, which would match the
+                               // query for a conflicting namespace "Foo" if filtering wasn't done.
+                               $this->checkLinkTable( 'redirect', 'rd', $ns, $name, $options,
+                                       array( 'rd_interwiki' => null ) );
+                               $this->checkLinkTable( 'redirect', 'rd', $ns, $name, $options,
+                                       array( 'rd_interwiki' => '' ) );
+                       }
+               }
+
+               $this->output( "{$this->totalLinks} links to fix, " .
+                       "{$this->resolvableLinks} were resolvable.\n" );
 
                return $ok;
        }
@@ -215,7 +254,8 @@ class NamespaceConflictChecker extends Maintenance {
 
                        // Find the new title and determine the action to take
 
-                       $newTitle = $this->getDestinationTitle( $ns, $name, $row, $options );
+                       $newTitle = $this->getDestinationTitle( $ns, $name,
+                               $row->page_namespace, $row->page_title, $options );
                        $logStatus = false;
                        if ( !$newTitle ) {
                                $logStatus = 'invalid title';
@@ -271,26 +311,101 @@ class NamespaceConflictChecker extends Maintenance {
                                                $newTitle->getPrefixedDBkey() . " (merge)$dryRunNote\n" );
 
                                        if ( $options['fix'] ) {
-                                               $pageOK = $this->mergePage( $row->page_id, $newTitle );
+                                               $pageOK = $this->mergePage( $row, $newTitle );
                                        }
                                        break;
                        }
 
                        if ( $pageOK ) {
-                               $this->resolvableCount++;
+                               $this->resolvablePages++;
                        } else {
                                $ok = false;
                        }
                }
 
-               // @fixme Also needs to do like self::getTargetList() on the
-               // *_namespace and *_title fields of pagelinks, templatelinks, and
-               // redirects, and schedule a LinksUpdate job or similar for each found
-               // *_from.
-
                return $ok;
        }
 
+       /**
+        * Check and repair the destination fields in a link table
+        * @param string $table The link table name
+        * @param string $fieldPrefix The field prefix in the link table
+        * @param int $ns Destination namespace id
+        * @param string $name
+        * @param array $options Associative array of validated command-line options
+        * @param array $extraConds Extra conditions for the SQL query
+        */
+       private function checkLinkTable( $table, $fieldPrefix, $ns, $name, $options,
+               $extraConds = array()
+       ) {
+               $batchConds = array();
+               $fromField = "{$fieldPrefix}_from";
+               $namespaceField = "{$fieldPrefix}_namespace";
+               $titleField = "{$fieldPrefix}_title";
+               $batchSize = 500;
+               while ( true ) {
+                       $res = $this->db->select(
+                               $table,
+                               array( $fromField, $namespaceField, $titleField ),
+                               array_merge( $batchConds, $extraConds, array(
+                                       $namespaceField => 0,
+                                       $titleField . $this->db->buildLike( "$name:", $this->db->anyString() )
+                               ) ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => array( $titleField, $fromField ),
+                                       'LIMIT' => $batchSize
+                               )
+                       );
+
+                       if ( $res->numRows() == 0 ) {
+                               break;
+                       }
+                       foreach ( $res as $row ) {
+                               $logTitle = "from={$row->$fromField} ns={$row->$namespaceField} " .
+                                       "dbk={$row->$titleField}";
+                               $destTitle = $this->getDestinationTitle( $ns, $name,
+                                       $row->$namespaceField, $row->$titleField, $options );
+                               $this->totalLinks++;
+                               if ( !$destTitle ) {
+                                       $this->output( "$table $logTitle *** INVALID\n" );
+                                       continue;
+                               }
+                               $this->resolvableLinks++;
+                               if ( !$options['fix'] ) {
+                                       $this->output( "$table $logTitle -> " .
+                                               $destTitle->getPrefixedDBkey() . " DRY RUN\n" );
+                                       continue;
+                               }
+
+                               $this->db->update( $table,
+                                       // SET
+                                       array(
+                                               $namespaceField => $destTitle->getNamespace(),
+                                               $titleField => $destTitle->getDBkey()
+                                       ),
+                                       // WHERE
+                                       array(
+                                               $namespaceField => 0,
+                                               $titleField => $row->$titleField,
+                                               $fromField => $row->$fromField
+                                       ),
+                                       __METHOD__
+                               );
+                               $this->output( "$table $logTitle -> " .
+                                       $destTitle->getPrefixedDBkey() . "\n" );
+                       }
+                       $encLastTitle = $this->db->addQuotes( $row->$titleField );
+                       $encLastFrom = $this->db->addQuotes( $row->$fromField );
+
+                       $batchConds = array(
+                               "$titleField > $encLastTitle " .
+                               "OR ($titleField = $encLastTitle AND $fromField > $encLastFrom)" );
+
+                       wfWaitForSlaves();
+               }
+       }
+
        /**
         * Move the given pseudo-namespace, either replacing the colon with a hyphen
         * (useful for pseudo-namespaces that conflict with interwiki links) or move
@@ -338,21 +453,22 @@ class NamespaceConflictChecker extends Maintenance {
        }
 
        /**
-        * Get the preferred destination title for a given target page row.
+        * Get the preferred destination title for a given target page.
         * @param integer $ns The destination namespace ID
         * @param string $name The conflicting prefix
-        * @param stdClass $row
+        * @param integer $sourceNs The source namespace
+        * @param integer $sourceDbk The source DB key (i.e. page_title)
         * @param array $options Associative array of validated command-line options
         * @return Title|false
         */
-       private function getDestinationTitle( $ns, $name, $row, $options ) {
-               $dbk = substr( $row->page_title, strlen( "$name:" ) );
+       private function getDestinationTitle( $ns, $name, $sourceNs, $sourceDbk, $options ) {
+               $dbk = substr( $sourceDbk, strlen( "$name:" ) );
                if ( $ns == 0 ) {
                        // An interwiki; try an alternate encoding with '-' for ':'
                        $dbk = "$name-" . $dbk;
                }
                $destNS = $ns;
-               if ( $row->page_namespace == NS_TALK && MWNamespace::isSubject( $ns ) ) {
+               if ( $sourceNs == NS_TALK && MWNamespace::isSubject( $ns ) ) {
                        // This is an associated talk page moved with the --move-talk feature.
                        $destNS = MWNamespace::getTalk( $destNS );
                }
@@ -392,8 +508,6 @@ class NamespaceConflictChecker extends Maintenance {
        /**
         * Move a page
         *
-        * @fixme Update pl_from_namespace etc.
-        *
         * @param integer $id The page_id
         * @param Title $newTitle The new title
         * @return bool
@@ -409,8 +523,20 @@ class NamespaceConflictChecker extends Maintenance {
                        ),
                        __METHOD__ );
 
-               // @fixme Needs updating the *_from_namespace fields in categorylinks,
-               // pagelinks, templatelinks and imagelinks.
+               // Update *_from_namespace in links tables
+               $fromNamespaceTables = array(
+                       array( 'pagelinks', 'pl' ),
+                       array( 'templatelinks', 'tl' ),
+                       array( 'imagelinks', 'il' ) );
+               foreach ( $fromNamespaceTables as $tableInfo ) {
+                       list( $table, $fieldPrefix ) = $tableInfo;
+                       $this->db->update( $table,
+                               // SET
+                               array( "{$fieldPrefix}_from_namespace" => $newTitle->getNamespace() ),
+                               // WHERE
+                               array( "{$fieldPrefix}_from" => $id ),
+                               __METHOD__ );
+               }
 
                return true;
        }
@@ -444,7 +570,17 @@ class NamespaceConflictChecker extends Maintenance {
         * @param integer $id The page_id
         * @param Title $newTitle The new title
         */
-       private function mergePage( $id, Title $newTitle ) {
+       private function mergePage( $row, Title $newTitle ) {
+               $id = $row->page_id;
+
+               // Construct the WikiPage object we will need later, while the
+               // page_id still exists. Note that this cannot use makeTitleSafe(),
+               // we are deliberately constructing an invalid title.
+               $sourceTitle = Title::makeTitle( $row->page_namespace, $row->page_title );
+               $sourceTitle->resetArticleID( $id );
+               $wikiPage = new WikiPage( $sourceTitle );
+               $wikiPage->loadPageData( 'fromdbmaster' );
+
                $destId = $newTitle->getArticleId();
                $this->db->begin( __METHOD__ );
                $this->db->update( 'revision',
@@ -456,10 +592,18 @@ class NamespaceConflictChecker extends Maintenance {
 
                $this->db->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
 
-               // @fixme Need WikiPage::doDeleteUpdates() or similar to avoid orphan
-               // rows in the links tables.
-
+               // Call LinksDeletionUpdate to delete outgoing links from the old title,
+               // and update category counts.
+               //
+               // Calling external code with a fake broken Title is a fairly dubious
+               // idea. It's necessary because it's quite a lot of code to duplicate,
+               // but that also makes it fragile since it would be easy for someone to
+               // accidentally introduce an assumption of title validity to the code we
+               // are calling.
+               $update = new LinksDeletionUpdate( $wikiPage );
+               $update->doUpdate();
                $this->db->commit( __METHOD__ );
+
                return true;
        }
 }
index 5ad349a..b581485 100644 (file)
@@ -1030,6 +1030,10 @@ return array(
                        'colon-separator',
                ),
        ),
+       'mediawiki.htmlform.styles' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.htmlform.css',
+               'position' => 'top',
+       ),
        'mediawiki.htmlform.ooui.styles' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.css',
                'position' => 'top',
@@ -1686,15 +1690,6 @@ return array(
                        'resources/src/mediawiki.special/mediawiki.special.userlogin.login.css',
                ),
        ),
-       'mediawiki.special.userlogin.common.js' => array(
-               'scripts' => array(
-                       'resources/src/mediawiki.special/mediawiki.special.userlogin.common.js',
-               ),
-               'messages' => array(
-                       'createacct-captcha',
-                       'createacct-imgcaptcha-ph',
-               ),
-       ),
        'mediawiki.special.userlogin.signup.js' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js',
                'messages' => array(
@@ -1883,6 +1878,7 @@ return array(
                        'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
                ),
                'skinStyles' => array(
                        'default' => array(
index 493920d..610e1ee 100644 (file)
@@ -11,7 +11,8 @@
                        "مشعل الحربي",
                        "ترجمان05",
                        "Abanima",
-                       "محمد أحمد عبد الفتاح"
+                       "محمد أحمد عبد الفتاح",
+                       "Hiba Alshawi"
                ]
        },
        "ooui-outline-control-move-down": "انقل العنصر للأسفل",
@@ -26,6 +27,8 @@
        "ooui-dialog-process-dismiss": "أغلق",
        "ooui-dialog-process-retry": "حاول مرة أخرى",
        "ooui-dialog-process-continue": "استمر",
+       "ooui-selectfile-button-select": "أختر ملف",
        "ooui-selectfile-not-supported": "تحديد الملفات غير مدعوم",
-       "ooui-selectfile-placeholder": "لم يختر أي ملف"
+       "ooui-selectfile-placeholder": "لم يختر أي ملف",
+       "ooui-selectfile-dragdrop-placeholder": "ترك ملف هنا"
 }
index 3ecbe50..11761c6 100644 (file)
@@ -18,7 +18,8 @@
        "ooui-dialog-process-dismiss": "Descartar",
        "ooui-dialog-process-retry": "Vuelvi a intentalo",
        "ooui-dialog-process-continue": "Siguir",
+       "ooui-selectfile-button-select": "Seleicionar un ficheru",
        "ooui-selectfile-not-supported": "Nun hai encontu pa la seleición de ficheros",
        "ooui-selectfile-placeholder": "Nun se seleicionó nengún ficheru",
-       "ooui-selectfile-dragdrop-placeholder": "Soltar el ficheru equí (o facer clic pa restolar)"
+       "ooui-selectfile-dragdrop-placeholder": "Soltar el ficheru equí"
 }
index 9481a2c..02d57e0 100644 (file)
@@ -24,6 +24,8 @@
        "ooui-dialog-process-dismiss": "বাতিল করুন",
        "ooui-dialog-process-retry": "আবার চেষ্টা করুন",
        "ooui-dialog-process-continue": "অগ্রসর হোন",
+       "ooui-selectfile-button-select": "একটি ফাইল নির্বাচন করুন",
        "ooui-selectfile-not-supported": "চিত্র নির্বাচন সমর্থন করছে না।",
-       "ooui-selectfile-placeholder": " কোন চিত্র নির্বাচিত হয়নি।"
+       "ooui-selectfile-placeholder": " কোন চিত্র নির্বাচিত হয়নি।",
+       "ooui-selectfile-dragdrop-placeholder": "এখানে ফাইল ছাড়ুন"
 }
index 3f690fc..fa11a36 100644 (file)
@@ -30,7 +30,8 @@
        "ooui-dialog-process-dismiss": "Descartar",
        "ooui-dialog-process-retry": "Intentar de nuevo",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selecciona un archivo",
        "ooui-selectfile-not-supported": "No se admite la selección de archivos",
        "ooui-selectfile-placeholder": "Ningún archivo seleccionado",
-       "ooui-selectfile-dragdrop-placeholder": "Soltar el archivo aquí (o pulsa para examinar)"
+       "ooui-selectfile-dragdrop-placeholder": "Suelta el archivo aquí"
 }
index 1283c8d..59b7ccd 100644 (file)
@@ -18,7 +18,8 @@
        "ooui-dialog-process-dismiss": "Hülga",
        "ooui-dialog-process-retry": "Proovi uuesti",
        "ooui-dialog-process-continue": "Jätka",
+       "ooui-selectfile-button-select": "Vali fail",
        "ooui-selectfile-not-supported": "Faili valiku tugi puudub",
        "ooui-selectfile-placeholder": "Faili ei ole valitud",
-       "ooui-selectfile-dragdrop-placeholder": "Lohista fail siia (või klõpsa, et sirvida)"
+       "ooui-selectfile-dragdrop-placeholder": "Lohista fail siia"
 }
index 93c66c5..e507325 100644 (file)
@@ -20,6 +20,7 @@
        "ooui-dialog-process-dismiss": "Utzi",
        "ooui-dialog-process-retry": "Saiatu berriro",
        "ooui-dialog-process-continue": "Jarraitu",
+       "ooui-selectfile-button-select": "Fitxategi bat aukeratu",
        "ooui-selectfile-not-supported": "Fitxategi aukeraketa ez da onartzen",
        "ooui-selectfile-placeholder": "Ez da fitxategirik hautatu"
 }
index fe8ec04..92015a4 100644 (file)
@@ -44,7 +44,8 @@
        "ooui-dialog-process-dismiss": "Rejeter",
        "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
+       "ooui-selectfile-button-select": "Sélectionner un fichier",
        "ooui-selectfile-not-supported": "La sélection de fichier n’est pas prise en charge",
        "ooui-selectfile-placeholder": "Aucun fichier sélectionné",
-       "ooui-selectfile-dragdrop-placeholder": "Déposer le fichier ici (ou cliquez pour parcourir)"
+       "ooui-selectfile-dragdrop-placeholder": "Déposer le fichier ici"
 }
index 0f7ac78..4cb2839 100644 (file)
@@ -19,7 +19,8 @@
        "ooui-dialog-process-dismiss": "Agochar",
        "ooui-dialog-process-retry": "Inténteo de novo",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Seleccionar un ficheiro",
        "ooui-selectfile-not-supported": "Non está soportada a selección de ficheiros",
        "ooui-selectfile-placeholder": "Non se seleccionou ningún ficheiro",
-       "ooui-selectfile-dragdrop-placeholder": "Solte un ficheiro aquí (ou prema para buscalo)"
+       "ooui-selectfile-dragdrop-placeholder": "Solte un ficheiro aquí"
 }
index 631b3f5..d0df027 100644 (file)
@@ -6,7 +6,8 @@
                        "Penn Station",
                        "Shirayuki",
                        "Takot",
-                       "Los688"
+                       "Los688",
+                       "Sujiniku"
                ]
        },
        "ooui-outline-control-move-down": "項目を下に移動させる",
@@ -21,6 +22,8 @@
        "ooui-dialog-process-dismiss": "閉じる",
        "ooui-dialog-process-retry": "もう一度お試しください",
        "ooui-dialog-process-continue": "続行",
+       "ooui-selectfile-button-select": "ファイルを選択",
        "ooui-selectfile-not-supported": "ファイルの選択はサポートされていません",
-       "ooui-selectfile-placeholder": "ファイルが選択されていません"
+       "ooui-selectfile-placeholder": "ファイルが選択されていません",
+       "ooui-selectfile-dragdrop-placeholder": "ファイルをここにドロップ"
 }
index e54099d..e64889f 100644 (file)
@@ -17,7 +17,8 @@
        "ooui-dialog-process-dismiss": "បិទ",
        "ooui-dialog-process-retry": "ព្យាយាមម្ដងទៀត",
        "ooui-dialog-process-continue": "បន្ត",
+       "ooui-selectfile-button-select": "ជ្រើសរើសឯកសារ",
        "ooui-selectfile-not-supported": "ការជ្រើសរើសឯកសារមិនអាចប្រើបានទេ",
        "ooui-selectfile-placeholder": "គ្មានឯកសារណាមួយត្រូវបានជ្រើសរើស",
-       "ooui-selectfile-dragdrop-placeholder": "ទម្លាក់ឯកសារនៅទីនេះ(ឬចុចដើម្បីរាវរក)"
+       "ooui-selectfile-dragdrop-placeholder": "ទម្លាក់ឯកសារនៅទីនេះ"
 }
index 792b6fc..f99c29f 100644 (file)
@@ -16,6 +16,7 @@
        "ooui-dialog-process-dismiss": "Maach fott, ha_sch jelässe",
        "ooui-dialog-process-retry": "Norr_ens versöhke",
        "ooui-dialog-process-continue": "Wigger maache",
+       "ooui-selectfile-button-select": "Söhg en Dattei uß",
        "ooui-selectfile-not-supported": "Mer ogerschtözze et Datteij_Ußwähle nit.",
        "ooui-selectfile-placeholder": "Kein Dattei es ußjewählt"
 }
index 65bce10..39bc670 100644 (file)
@@ -22,6 +22,7 @@
        "ooui-dialog-process-dismiss": "Verwerfen",
        "ooui-dialog-process-retry": "Nach eng Kéier probéieren",
        "ooui-dialog-process-continue": "Virufueren",
+       "ooui-selectfile-button-select": "E Fichier eraussichen",
        "ooui-selectfile-placeholder": "Et ass kee Fichier erausgesicht",
-       "ooui-selectfile-dragdrop-placeholder": "Fichier hei deposéieren (oder klickt fir ze sichen)"
+       "ooui-selectfile-dragdrop-placeholder": "Fichier hei ofleeën"
 }
index 20aa2f1..fbd22d0 100644 (file)
@@ -19,7 +19,8 @@
        "ooui-dialog-process-dismiss": "Paslėpti",
        "ooui-dialog-process-retry": "Bandykite dar kartą",
        "ooui-dialog-process-continue": "Tęsti",
+       "ooui-selectfile-button-select": "Pasirinkti failą",
        "ooui-selectfile-not-supported": "Failų pasirinkimas nepalaikomas",
        "ooui-selectfile-placeholder": "Nėra pasirinktų failų",
-       "ooui-selectfile-dragdrop-placeholder": "Atitempkite failą čia (arba paspauskite paieškai)"
+       "ooui-selectfile-dragdrop-placeholder": "Atitempkite failą čia"
 }
index 9dd84b0..486e87f 100644 (file)
@@ -32,7 +32,8 @@
        "ooui-dialog-process-dismiss": "Ukryj",
        "ooui-dialog-process-retry": "Spróbuj ponownie",
        "ooui-dialog-process-continue": "Kontynuuj",
+       "ooui-selectfile-button-select": "Wybierz plik",
        "ooui-selectfile-not-supported": "Wybór pliku nie jest obsługiwany",
        "ooui-selectfile-placeholder": "Nie wybrano pliku",
-       "ooui-selectfile-dragdrop-placeholder": "Umieść plik tutaj (lub kliknij, aby je przeglądać)"
+       "ooui-selectfile-dragdrop-placeholder": "Umieść plik tutaj"
 }
index c371bbc..228291a 100644 (file)
@@ -16,6 +16,7 @@
        "ooui-dialog-process-dismiss": "تړل",
        "ooui-dialog-process-retry": "بيا هڅه",
        "ooui-dialog-process-continue": "پرله پورې",
+       "ooui-selectfile-button-select": "يوه دوتنه وټاکئ",
        "ooui-selectfile-not-supported": "د دوتنې د ټاکنې ملاتړ نه دی شوی",
        "ooui-selectfile-placeholder": "کومه دوتنه نه ده ټاکل شوې"
 }
index bf44621..69daa18 100644 (file)
@@ -20,7 +20,8 @@
        "ooui-dialog-process-dismiss": "Renunțare",
        "ooui-dialog-process-retry": "Reîncearcă",
        "ooui-dialog-process-continue": "Continuă",
+       "ooui-selectfile-button-select": "Alege un fișier",
        "ooui-selectfile-not-supported": "Selecția de fișiere nu este acceptată",
        "ooui-selectfile-placeholder": "Niciun fișier selectat",
-       "ooui-selectfile-dragdrop-placeholder": "Trageți fișierul aici (sau faceți clic pentru a răsfoi)"
+       "ooui-selectfile-dragdrop-placeholder": "Trageți fișierul aici"
 }
index 42005fe..73a5a6c 100644 (file)
@@ -16,6 +16,8 @@
        "ooui-dialog-process-dismiss": "Scitte",
        "ooui-dialog-process-retry": "Pruève arrete",
        "ooui-dialog-process-continue": "Condinue",
+       "ooui-selectfile-button-select": "Scacchie 'nu file",
        "ooui-selectfile-not-supported": "'U scacchiamende d'u file non g'è supportate",
-       "ooui-selectfile-placeholder": "Nisciune file scacchiate"
+       "ooui-selectfile-placeholder": "Nisciune file scacchiate",
+       "ooui-selectfile-dragdrop-placeholder": "Scitte 'u file aqquà"
 }
index 7435416..6c62d36 100644 (file)
@@ -32,6 +32,8 @@
        "ooui-dialog-process-dismiss": "Закрыть",
        "ooui-dialog-process-retry": "Попробовать ещё раз",
        "ooui-dialog-process-continue": "Продолжить",
+       "ooui-selectfile-button-select": "Выберите файл",
        "ooui-selectfile-not-supported": "Выбор файла не поддерживается",
-       "ooui-selectfile-placeholder": "Не выбран файл"
+       "ooui-selectfile-placeholder": "Не выбран файл",
+       "ooui-selectfile-dragdrop-placeholder": "Перетащите файл сюда"
 }
index 41c2646..3ffbc48 100644 (file)
@@ -27,7 +27,8 @@
        "ooui-dialog-process-dismiss": "Stäng",
        "ooui-dialog-process-retry": "Försök igen",
        "ooui-dialog-process-continue": "Fortsätt",
+       "ooui-selectfile-button-select": "Välj en fil",
        "ooui-selectfile-not-supported": "Filval stöds inte",
        "ooui-selectfile-placeholder": "Ingen fil är vald",
-       "ooui-selectfile-dragdrop-placeholder": "Släpp filen här (eller klicka för att bläddra)"
+       "ooui-selectfile-dragdrop-placeholder": "Släpp filen här"
 }
index 9e727e4..a38afbf 100644 (file)
@@ -32,7 +32,8 @@
        "ooui-dialog-process-dismiss": "Приховати",
        "ooui-dialog-process-retry": "Спробуйте ще раз",
        "ooui-dialog-process-continue": "Продовжити",
+       "ooui-selectfile-button-select": "Оберіть файл",
        "ooui-selectfile-not-supported": "Вибір файлу не підтримується",
        "ooui-selectfile-placeholder": "Жодного файлу не вибрано",
-       "ooui-selectfile-dragdrop-placeholder": "Помістіть файл сюди (або натисніть, щоб переглянути)"
+       "ooui-selectfile-dragdrop-placeholder": "Помістіть файл сюди"
 }
index 4de584b..1ccc67b 100644 (file)
@@ -9,5 +9,9 @@
        "ooui-outline-control-move-down": "Sposta in baso",
        "ooui-outline-control-move-up": "Sposta in sima",
        "ooui-toolbar-more": "Altro",
-       "ooui-dialog-message-accept": "Va ben"
+       "ooui-dialog-message-accept": "Va ben",
+       "ooui-dialog-process-error": "Xe 'ndà storto calcossa",
+       "ooui-dialog-process-dismiss": "Scondi",
+       "ooui-dialog-process-retry": "Proa da novo",
+       "ooui-dialog-process-continue": "Và vanti"
 }
index b5b51a0..9934d9d 100644 (file)
@@ -32,7 +32,8 @@
        "ooui-dialog-process-dismiss": "关闭",
        "ooui-dialog-process-retry": "重试",
        "ooui-dialog-process-continue": "继续",
+       "ooui-selectfile-button-select": "选择一个文件",
        "ooui-selectfile-not-supported": "文件选择不受支持",
        "ooui-selectfile-placeholder": "没有选定文件",
-       "ooui-selectfile-dragdrop-placeholder": "将文件拖动至此(或点击以浏览)"
+       "ooui-selectfile-dragdrop-placeholder": "将文件拖动至此"
 }
index 195bb3a..f70efe1 100644 (file)
@@ -30,6 +30,8 @@
        "ooui-dialog-process-dismiss": "關閉",
        "ooui-dialog-process-retry": "再試一次",
        "ooui-dialog-process-continue": "繼續",
+       "ooui-selectfile-button-select": "選擇一個檔案",
        "ooui-selectfile-not-supported": "無法支援所選擇的檔案",
-       "ooui-selectfile-placeholder": "未選擇檔案"
+       "ooui-selectfile-placeholder": "未選擇檔案",
+       "ooui-selectfile-dragdrop-placeholder": "拖曳檔案到此處"
 }
index 880648e..ede6ea9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.7
+ * OOjs UI v0.12.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-01T23:25:39Z
+ * Date: 2015-09-08T20:56:08Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity 200ms);*/
+       /*.oo-ui-transition(opacity @medium-ease);*/
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
        border-radius: 0.3em;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
        border: 1px #c9c9c9 solid;
-       -webkit-transition: border-color 100ms ease-in-out;
-          -moz-transition: border-color 100ms ease-in-out;
-           -ms-transition: border-color 100ms ease-in-out;
-            -o-transition: border-color 100ms ease-in-out;
-               transition: border-color 100ms ease-in-out;
+       -webkit-transition: border-color 100ms ease;
+          -moz-transition: border-color 100ms ease;
+           -ms-transition: border-color 100ms ease;
+            -o-transition: border-color 100ms ease;
+               transition: border-color 100ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
        position: absolute;
-       -webkit-transition: all ease-in-out 200ms;
-          -moz-transition: all ease-in-out 200ms;
-           -ms-transition: all ease-in-out 200ms;
-            -o-transition: all ease-in-out 200ms;
-               transition: all ease-in-out 200ms;
+       -webkit-transition: all 200ms ease;
+          -moz-transition: all 200ms ease;
+           -ms-transition: all 200ms ease;
+            -o-transition: all 200ms ease;
+               transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
        height: 18em;
        margin: 0.375em;
        border-radius: 0.3125em;
        border: 1px solid transparent;
-       -webkit-transition: border-color 300ms ease-in-out;
-          -moz-transition: border-color 300ms ease-in-out;
-           -ms-transition: border-color 300ms ease-in-out;
-            -o-transition: border-color 300ms ease-in-out;
-               transition: border-color 300ms ease-in-out;
+       -webkit-transition: border-color 250ms ease;
+          -moz-transition: border-color 250ms ease;
+           -ms-transition: border-color 250ms ease;
+            -o-transition: border-color 250ms ease;
+               transition: border-color 250ms ease;
 }
 .oo-ui-toolGroup-empty {
        display: none;
        bottom: -9px;
        height: 9px;
        opacity: 0.5;
-       -webkit-transition: opacity 500ms ease-in-out;
-          -moz-transition: opacity 500ms ease-in-out;
-           -ms-transition: opacity 500ms ease-in-out;
-            -o-transition: opacity 500ms ease-in-out;
-               transition: opacity 500ms ease-in-out;
+       -webkit-transition: opacity 500ms ease;
+          -moz-transition: opacity 500ms ease;
+           -ms-transition: opacity 500ms ease;
+            -o-transition: opacity 500ms ease;
+               transition: opacity 500ms ease;
 }
 .oo-ui-optionWidget {
        position: relative;
        border-radius: 1em;
        box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
        border: 1px #c9c9c9 solid;
-       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       -webkit-transition: left 250ms ease, margin-left 250ms ease;
+          -moz-transition: left 250ms ease, margin-left 250ms ease;
+           -ms-transition: left 250ms ease, margin-left 250ms ease;
+            -o-transition: left 250ms ease, margin-left 250ms ease;
+               transition: left 250ms ease, margin-left 250ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
 .oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
        border-radius: 1em;
        box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       -webkit-transition: opacity 200ms ease-in-out;
-          -moz-transition: opacity 200ms ease-in-out;
-           -ms-transition: opacity 200ms ease-in-out;
-            -o-transition: opacity 200ms ease-in-out;
-               transition: opacity 200ms ease-in-out;
+       -webkit-transition: opacity 250ms ease;
+          -moz-transition: opacity 250ms ease;
+           -ms-transition: opacity 250ms ease;
+            -o-transition: opacity 250ms ease;
+               transition: opacity 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
 .oo-ui-progressBarWidget-bar {
        height: 1em;
        border-right: 1px solid #cccccc;
-       -webkit-transition: width 200ms, margin-left 200ms;
-          -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
-               transition: width 200ms, margin-left 200ms;
+       -webkit-transition: width 250ms ease, margin-left 250ms ease;
+          -moz-transition: width 250ms ease, margin-left 250ms ease;
+           -ms-transition: width 250ms ease, margin-left 250ms ease;
+            -o-transition: width 250ms ease, margin-left 250ms ease;
+               transition: width 250ms ease, margin-left 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
        border-width: 6px;
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+       -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+          -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+           -ms-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+            -o-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+               transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
        height: 2.5em;
        border: 1px solid #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
-       -webkit-transition: border-color 200ms, box-shadow 200ms;
-          -moz-transition: border-color 200ms, box-shadow 200ms;
-           -ms-transition: border-color 200ms, box-shadow 200ms;
-            -o-transition: border-color 200ms, box-shadow 200ms;
-               transition: border-color 200ms, box-shadow 200ms;
+       -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
+          -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
+           -ms-transition: border-color 250ms ease, box-shadow 250ms ease;
+            -o-transition: border-color 250ms ease, box-shadow 250ms ease;
+               transition: border-color 250ms ease, box-shadow 250ms ease;
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       text-overflow: ellipsis;
+}
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        height: 2.4em;
        border: 1px solid rgba(0, 0, 0, 0.1);
        border-radius: 0.25em;
-       padding: 0 0.5em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        right: 0;
        line-height: 2.3em;
        margin: 0;
        overflow: hidden;
-       width: 100%;
        white-space: nowrap;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        text-overflow: ellipsis;
+       left: 0.5em;
+       right: 0.5em;
 }
 .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        top: 0;
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-label {
        color: #cccccc;
 }
-.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info {
-       padding-left: 3em;
+.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       left: 2.75em;
 }
-.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info {
-       padding-right: 3em;
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 3em;
 }
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
-.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info {
-       padding-right: 5em;
+.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 5em;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 2em;
 }
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info {
-       padding-right: 1em;
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 1em;
 }
-.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info {
-       padding-right: 2em;
+.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 2em;
 }
 .oo-ui-selectFileWidget-dropTarget {
        line-height: 3.5em;
 .oo-ui-windowManager-modal > .oo-ui-dialog {
        background-color: rgba(255, 255, 255, 0.5);
        opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
+       -webkit-transition: opacity 250ms ease;
+          -moz-transition: opacity 250ms ease;
+           -ms-transition: opacity 250ms ease;
+            -o-transition: opacity 250ms ease;
+               transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        top: 1em;
            -ms-transform: scale(0.5);
             -o-transform: scale(0.5);
                transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
+       -webkit-transition: all 250ms ease;
+          -moz-transition: all 250ms ease;
+           -ms-transition: all 250ms ease;
+            -o-transition: all 250ms ease;
+               transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
        /* Fade window overlay */
index dc0103e..83452d0 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.7
+ * OOjs UI v0.12.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-01T23:25:30Z
+ * Date: 2015-09-08T20:55:55Z
  */
 /**
  * @class
index b2e5813..87ae9a5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.7
+ * OOjs UI v0.12.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-01T23:25:39Z
+ * Date: 2015-09-08T20:56:08Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        margin: 0.1em 0;
        padding: 0.2em 0.8em;
        border-radius: 2px;
-       -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-          -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-           -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-            -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-               transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+       -webkit-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
+          -moz-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
+           -ms-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
+            -o-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
+               transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
        position: absolute;
-       -webkit-transition: all ease-in-out 200ms;
-          -moz-transition: all ease-in-out 200ms;
-           -ms-transition: all ease-in-out 200ms;
-            -o-transition: all ease-in-out 200ms;
-               transition: all ease-in-out 200ms;
+       -webkit-transition: all 200ms ease;
+          -moz-transition: all 200ms ease;
+           -ms-transition: all 200ms ease;
+            -o-transition: all 200ms ease;
+               transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
        height: 18em;
        border-radius: 1em;
        border: 1px #555555 solid;
        background: #ffffff;
-       -webkit-transition: background-color 0.1s ease-in-out;
-          -moz-transition: background-color 0.1s ease-in-out;
-           -ms-transition: background-color 0.1s ease-in-out;
-            -o-transition: background-color 0.1s ease-in-out;
-               transition: background-color 0.1s ease-in-out;
+       -webkit-transition: background-color 100ms ease;
+          -moz-transition: background-color 100ms ease;
+           -ms-transition: background-color 100ms ease;
+            -o-transition: background-color 100ms ease;
+               transition: background-color 100ms ease;
        margin-right: 0.5em;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        margin-top: -1px;
        border-radius: 1em;
        background: #555555;
-       -webkit-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-          -moz-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-           -ms-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-            -o-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-               transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+       -webkit-transition: left 100ms ease, margin-left 100ms ease;
+          -moz-transition: left 100ms ease, margin-left 100ms ease;
+           -ms-transition: left 100ms ease, margin-left 100ms ease;
+            -o-transition: left 100ms ease, margin-left 100ms ease;
+               transition: left 100ms ease, margin-left 100ms ease;
 }
 .oo-ui-toggleSwitchWidget-glow {
        display: none;
        border-width: 9px;
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-          -moz-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-           -ms-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-            -o-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-               transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
+       -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+          -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+           -ms-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+            -o-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+               transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
        height: 2.5em;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
        cursor: pointer;
-       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span {
        cursor: pointer;
-       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #347bff;
        border-radius: 0.1em;
-       -webkit-transition: box-shadow 0.1s ease-in-out;
-          -moz-transition: box-shadow 0.1s ease-in-out;
-           -ms-transition: box-shadow 0.1s ease-in-out;
-            -o-transition: box-shadow 0.1s ease-in-out;
-               transition: box-shadow 0.1s ease-in-out;
+       -webkit-transition: box-shadow 100ms ease;
+          -moz-transition: box-shadow 100ms ease;
+           -ms-transition: box-shadow 100ms ease;
+            -o-transition: box-shadow 100ms ease;
+               transition: box-shadow 100ms ease;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
-       -webkit-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-          -moz-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-           -ms-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-            -o-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-               transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+       -webkit-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+          -moz-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+           -ms-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+            -o-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+               transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       text-overflow: ellipsis;
+}
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        height: 2.4em;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
-       padding: 0 1em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        right: 0;
        line-height: 2.3em;
        margin: 0;
        overflow: hidden;
-       width: 100%;
        white-space: nowrap;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        text-overflow: ellipsis;
+       left: 1em;
+       right: 1em;
 }
 .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        top: 0;
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-label {
        color: #cccccc;
 }
-.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info {
-       padding-left: 3em;
+.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       left: 2.75em;
 }
-.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info {
-       padding-right: 3em;
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 3em;
 }
 .oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
-.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info {
-       padding-right: 5em;
+.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 5em;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 2em;
 }
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info {
-       padding-right: 1em;
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 1em;
 }
-.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info {
-       padding-right: 2em;
+.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 2em;
 }
 .oo-ui-selectFileWidget-dropTarget {
        line-height: 3.5em;
 .oo-ui-windowManager-modal > .oo-ui-dialog {
        background-color: rgba(255, 255, 255, 0.5);
        opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
+       -webkit-transition: opacity 250ms ease;
+          -moz-transition: opacity 250ms ease;
+           -ms-transition: opacity 250ms ease;
+            -o-transition: opacity 250ms ease;
+               transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        top: 1em;
            -ms-transform: scale(0.5);
             -o-transform: scale(0.5);
                transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
+       -webkit-transition: all 250ms ease;
+          -moz-transition: all 250ms ease;
+           -ms-transition: all 250ms ease;
+            -o-transition: all 250ms ease;
+               transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
        /* Fade window overlay */
index 669fcf9..a291570 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.7
+ * OOjs UI v0.12.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-01T23:25:30Z
+ * Date: 2015-09-08T20:55:55Z
  */
 /**
  * @class
index df68873..81677ed 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.7
+ * OOjs UI v0.12.8
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-01T23:25:30Z
+ * Date: 2015-09-08T20:55:55Z
  */
 ( function ( OO ) {
 
@@ -7559,10 +7559,12 @@ OO.ui.Toolbar.prototype.onWindowResize = function () {
  * This must be called after it is attached to a visible document and before doing anything else.
  */
 OO.ui.Toolbar.prototype.initialize = function () {
-       this.initialized = true;
-       this.narrowThreshold = this.$group.width() + this.$actions.width();
-       $( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
-       this.onWindowResize();
+       if ( !this.initialized ) {
+               this.initialized = true;
+               this.narrowThreshold = this.$group.width() + this.$actions.width();
+               $( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
+               this.onWindowResize();
+       }
 };
 
 /**
index 1414c99..df95976 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3032"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <path d="M13.3 6.3l6.3 5.7-6.3 5.7v-3.8H12c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9V6.3z" id="path3034"/>
 </svg>
index 266bc2a..9abef4f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3032">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M13.3 6.3l6.3 5.7-6.3 5.7v-3.8H12c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9V6.3z" id="path3034"/>
 </svg>
index d577dde..d957f70 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3032"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <path d="M10.7 6.3L4.4 12l6.3 5.7v-3.8H12c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9V6.3z" id="path3034"/>
 </svg>
index 7c4779c..6ec2fcc 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3032">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M10.7 6.3L4.4 12l6.3 5.7v-3.8H12c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9V6.3z" id="path3034"/>
 </svg>
index 576e89d..2717b5a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M18.1 5.1c0 .3-.1.6-.3.9l-1.4 1.4-.9-.8 2.2-2.2c.3.1.4.4.4.7zm-.5 5.3h3.2c0 .3-.1.6-.4.9-.3.3-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4.3.3.4.5.4.8v2h-1.3zm6.4 11.7c-.3 0-.6-.1-.8-.3l-1.4-1.4.8-.8 2.2 2.2c-.2.2-.5.3-.8.3zM6.2 4.9c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4-.3-.3-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9.3-.3.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8 0-.3.1-.6.3-.8z"/>
     <g>
         <path d="M12 8c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3m0-1c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z"/>
index b97eae3..fff92e7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M11.4 5.4V2.2c.3 0 .6.1.9.4.3.3.4.5.4.8v2h-1.3zm-5.2-.5c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4-.3-.3-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9.3-.3.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8 0-.3.1-.6.3-.8zM12 7c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm-3 4c0-1.7 1.3-3 3-3v6c-1.7 0-3-1.3-3-3z"/>
 </svg>
index 99d6f01..166ce47 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <path d="M20.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
     </g>
index 99d6f01..166ce47 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <path d="M20.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
     </g>
index 705645c..9cf9d28 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3095"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="g3097">
         <path d="M15.387 4.33c-2.1 0-3.6 1.9-5.1 3.3.2 0 .5-.1.8-.1.5 0 1 .1 1.5.3.8-.8 1.6-1.7 2.8-1.7.6 0 1.3.3 1.8.7 1 1 1 2.6 0 3.6l-2.6 2.6c-.4.4-1.2.7-1.8.7-1.4 0-2.1-.9-2.6-2l-1.3 1.3c.8 1.5 2 2.6 3.8 2.6 1.2 0 2.3-.5 3-1.3l2.6-2.6c.9-.9 1.5-2 1.5-3.3-.2-2.2-2.2-4.1-4.4-4.1zm-4.3 12.1l-.9.9c-.4.4-1.2.7-1.8.7-.6 0-1.3-.3-1.8-.7-1-1-1-2.7 0-3.6l2.6-2.6c.4-.4 1.2-.7 1.8-.7 1.4 0 2.1 1 2.6 2l1.3-1.3c-.8-1.5-2-2.6-3.8-2.6-1.2 0-2.3.5-3 1.3l-2.6 2.6c-1.7 1.7-1.7 4.4 0 6 1.6 1.6 4.4 1.7 5.9 0l1.9-1.9c-.3.1-.6.1-.9.1-.5 0-.9 0-1.3-.2z" id="path3099"/>
     </g>
index 86f3ede..dd3df73 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3095">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="g3097">
         <path d="M15.387 4.33c-2.1 0-3.6 1.9-5.1 3.3.2 0 .5-.1.8-.1.5 0 1 .1 1.5.3.8-.8 1.6-1.7 2.8-1.7.6 0 1.3.3 1.8.7 1 1 1 2.6 0 3.6l-2.6 2.6c-.4.4-1.2.7-1.8.7-1.4 0-2.1-.9-2.6-2l-1.3 1.3c.8 1.5 2 2.6 3.8 2.6 1.2 0 2.3-.5 3-1.3l2.6-2.6c.9-.9 1.5-2 1.5-3.3-.2-2.2-2.2-4.1-4.4-4.1zm-4.3 12.1l-.9.9c-.4.4-1.2.7-1.8.7-.6 0-1.3-.3-1.8-.7-1-1-1-2.7 0-3.6l2.6-2.6c.4-.4 1.2-.7 1.8-.7 1.4 0 2.1 1 2.6 2l1.3-1.3c-.8-1.5-2-2.6-3.8-2.6-1.2 0-2.3.5-3 1.3l-2.6 2.6c-1.7 1.7-1.7 4.4 0 6 1.6 1.6 4.4 1.7 5.9 0l1.9-1.9c-.3.1-.6.1-.9.1-.5 0-.9 0-1.3-.2z" id="path3099"/>
     </g>
index b104fab..3bda245 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3165"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="menu">
         <path id="lines" d="M6 15.5h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1H6c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1z"/>
     </g>
index ec17daf..b84ab86 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3165">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="menu">
         <path id="lines" d="M6 15.5h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1H6c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1z"/>
     </g>
index 55e5ac7..45b0050 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M19.1 17.5c-3.3 1.4-7.1-.2-8.5-3.5-1.4-3.3.2-7.1 3.5-8.5.2-.1.5-.2.7-.3-1.6-.4-3.2-.3-4.8.4C6 7.3 4 12 5.7 16c1.7 4.1 6.4 6 10.5 4.3 1.7-.7 3-1.9 3.8-3.4-.3.3-.6.4-.9.6z"/>
 </svg>
index 04139da..dedbc2d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8z"/>
 </svg>
index db8484e..9304bdb 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3224"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="g3226">
         <path d="M18.1 8.65c.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.7c-1 .2-1.5.2-2.6.6-.7.4-1.2.9-1.7 1.4-.5.5-1.9 2.6-1.9 5.8v3.1h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.1zm-11.2-.1c-.5.5-1.9 2.9-1.9 6v2.9h4.7c.9 0 1.6-.7 1.6-1.6v-4.7H8.2s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.2.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.6c-1 .2-1.5.2-2.6.6-.6.4-1.2.9-1.7 1.4z" id="path3228"/>
     </g>
index c9f7d01..4885f43 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3224">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="g3226">
         <path d="M18.1 8.65c.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.7c-1 .2-1.5.2-2.6.6-.7.4-1.2.9-1.7 1.4-.5.5-1.9 2.6-1.9 5.8v3.1h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.1zm-11.2-.1c-.5.5-1.9 2.9-1.9 6v2.9h4.7c.9 0 1.6-.7 1.6-1.6v-4.7H8.2s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.2.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.6c-1 .2-1.5.2-2.6.6-.6.4-1.2.9-1.7 1.4z" id="path3228"/>
     </g>
index e085452..f5dcce5 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3224"><style>* { fill: #FFFFFF }</style>
-    <g id="g3226">
-        <path d="M5.9 8.65c-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.7c1 .2 1.5.2 2.6.6.7.4 1.2.9 1.7 1.4.5.5 1.9 2.6 1.9 5.8v3.1H6.6c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.1zm11.2-.1c.5.5 1.9 2.9 1.9 6v2.9h-4.7c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.2-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.6c1 .2 1.5.2 2.6.6.6.4 1.2.9 1.7 1.4z" id="path3228"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g>
+        <path d="M5.9 8.65c-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.7c1 .2 1.5.2 2.6.6.7.4 1.2.9 1.7 1.4.5.5 1.9 2.6 1.9 5.8v3.1H6.6c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.1zm11.2-.1c.5.5 1.9 2.9 1.9 6v2.9h-4.7c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.2-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.6c1 .2 1.5.2 2.6.6.6.4 1.2.9 1.7 1.4z"/>
     </g>
 </svg>
index cf8a7a7..91fe300 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" id="svg3224">
-    <g id="g3226">
-        <path d="M5.9 8.65c-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.7c1 .2 1.5.2 2.6.6.7.4 1.2.9 1.7 1.4.5.5 1.9 2.6 1.9 5.8v3.1H6.6c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.1zm11.2-.1c.5.5 1.9 2.9 1.9 6v2.9h-4.7c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.2-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.6c1 .2 1.5.2 2.6.6.6.4 1.2.9 1.7 1.4z" id="path3228"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g>
+        <path d="M5.9 8.65c-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.7c1 .2 1.5.2 2.6.6.7.4 1.2.9 1.7 1.4.5.5 1.9 2.6 1.9 5.8v3.1H6.6c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.1zm11.2-.1c.5.5 1.9 2.9 1.9 6v2.9h-4.7c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.2-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.6c1 .2 1.5.2 2.6.6.6.4 1.2.9 1.7 1.4z"/>
     </g>
 </svg>
index fb025f3..b3d2e94 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <path d="M17.6 20h-5.4v-.5c.2 0 .5-.1.9-.1.3-.1.5-.2.5-.3V19s0-.1-.1-.2l-.8-2H9.3c-.1.2-.2.4-.3.7-.1.3-.2.5-.2.7-.1.3-.1.4-.2.6v.2c0 .1.1.3.3.4.2.1.6.2 1.1.2v.4H6v-.5c.2 0 .3 0 .5-.1.2 0 .3-.1.5-.2s.4-.2.5-.4l.3-.6c.5-1.3 1.1-2.6 1.6-3.9.5-1.3 1.1-2.7 1.8-4.3h1.4c.9 2.2 1.6 4 2.1 5.3.5 1.3 1 2.4 1.3 3.2.1.1.1.3.2.4.1.1.2.2.4.3.1.1.3.1.5.2s.3.1.5.1v.5zm-5.2-4L11 12.4 9.6 16h2.8z"/>
     </g>
index bd995db..34d46bc 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <path d="M6 19.5c.1 0 .3 0 .5-.1s.3-.1.5-.2.3-.2.4-.3c.1-.1.2-.2.2-.4.4-.9.8-1.9 1.3-3.2.5-1.3 1.2-3.1 2.1-5.3h1.4c.7 1.6 1.2 3 1.8 4.3.5 1.3 1.1 2.6 1.6 3.9l.3.6c.1.2.3.3.5.4.1.1.3.1.5.2.2 0 .4.1.5.1v.5h-4v-.5c.5 0 .9-.1 1.1-.2.2-.1.3-.2.3-.4v-.2c0-.1-.1-.3-.2-.6-.1-.2-.2-.4-.2-.7-.1-.3-.2-.5-.3-.7h-3.4l-.8 2c0 .1-.1.1-.1.2v.1c0 .1.2.2.5.3.3.1.6.1.9.1v.6H6v-.5zm8-3.5l-1.4-3.6-1.4 3.6H14z"/>
     </g>
index dbf1c03..7567b5d 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="down">
         <path id="arrow" d="M1 4h10L6 9 1 4"/>
     </g>
index 9fbb784..f5c76f3 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="down">
         <path id="arrow" d="M1 4h10L6 9 1 4"/>
     </g>
index 708161e..63384fa 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="ltr">
         <path id="arrow" d="M4 1v10l5-5-5-5"/>
     </g>
index 8618466..059372d 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="ltr">
         <path id="arrow" d="M4 1v10l5-5-5-5"/>
     </g>
index 6c34aa2..a9e9ce3 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="rtl">
         <path id="arrow" d="M8 11V1L3 6l5 5"/>
     </g>
index 5d389cc..c6498e8 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="rtl">
         <path id="arrow" d="M8 11V1L3 6l5 5"/>
     </g>
index 66c712b..2d11d4f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="up">
         <path id="arrow" d="M1 8h10L6 3 1 8"/>
     </g>
index 5ebef4b..5eada07 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="up">
         <path id="arrow" d="M1 8h10L6 3 1 8"/>
     </g>
index 10d814c..221e6bb 100644 (file)
@@ -23,7 +23,7 @@
                expandField: function ( e, context ) {
                        context.config.beforeExpand.call( context.data.$field, context );
                        context.data.$field
-                               .animate( { 'width': context.data.expandedWidth }, 'fast', function () {
+                               .animate( { width: context.data.expandedWidth }, 'fast', function () {
                                        context.config.afterExpand.call( this, context );
                                } );
                },
                condenseField: function ( e, context ) {
                        context.config.beforeCondense.call( context.data.$field, context );
                        context.data.$field
-                               .animate( { 'width': context.data.condensedWidth }, 'fast', function () {
+                               .animate( { width: context.data.condensedWidth }, 'fast', function () {
                                        context.config.afterCondense.call( this, context );
                                } );
                },
                /**
                 * Sets the value of a property, and updates the widget accordingly
-                * @param property String Name of property
-                * @param value Mixed Value to set property with
+                *
+                * @param {String} property Name of property
+                * @param {Mixed} value Value to set property with
                 */
                configure: function ( context, property, value ) {
                        // TODO: Validate creation using fallback values
index d7024cc..f70913f 100644 (file)
@@ -52,10 +52,10 @@ jQuery._farbtastic = function (container, callback) {
                        if (this.currentStyle.backgroundImage != 'none') {
                                var image = this.currentStyle.backgroundImage;
                                image = this.currentStyle.backgroundImage.slice(5, image.length - 2);
-                               $(this).css({
-                                       'backgroundImage': 'none',
-                                       'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
-                               });
+                               $(this).css( {
+                                       backgroundImage: 'none',
+                                       filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
+                               } );
                        }
                });
        }
index 2b9bf7a..aa6590b 100644 (file)
 $.devicePixelRatio = function () {
        if ( window.devicePixelRatio !== undefined ) {
                // Most web browsers:
-               // * WebKit (Safari, Chrome, Android browser, etc)
+               // * WebKit/Blink (Safari, Chrome, Android browser, etc)
                // * Opera
                // * Firefox 18+
+               // * Microsoft Edge (Windows 10)
                return window.devicePixelRatio;
        } else if ( window.msMatchMedia !== undefined ) {
                // Windows 8 desktops / tablets, probably Windows Phone 8
                //
-               // IE 10 doesn't report pixel ratio directly, but we can get the
+               // IE 10/11 doesn't report pixel ratio directly, but we can get the
                // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
                // simplicity, but you may get different values depending on zoom
                // factor, size of screen and orientation in Metro IE.
@@ -52,6 +53,52 @@ $.devicePixelRatio = function () {
        }
 };
 
+/**
+ * Bracket a given device pixel ratio to one of [1, 1.5, 2].
+ *
+ * This is useful for grabbing images on the fly with sizes based on the display
+ * density, without causing slowdown and extra thumbnail renderings on devices
+ * that are slightly different from the most common sizes.
+ *
+ * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
+ * so will be consistent with default renderings.
+ *
+ * @static
+ * @inheritable
+ * @return {number} Device pixel ratio
+ */
+$.bracketDevicePixelRatio = function ( baseRatio ) {
+       if ( baseRatio > 1.5 ) {
+               return 2;
+       } else if ( baseRatio > 1 ) {
+               return 1.5;
+       } else {
+               return 1;
+       }
+};
+
+/**
+ * Get reported or approximate device pixel ratio, bracketed to [1, 1.5, 2].
+ *
+ * This is useful for grabbing images on the fly with sizes based on the display
+ * density, without causing slowdown and extra thumbnail renderings on devices
+ * that are slightly different from the most common sizes.
+ *
+ * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
+ * so will be consistent with default renderings.
+ *
+ * - 1.0 means 1 CSS pixel is 1 hardware pixel
+ * - 1.5 means 1 CSS pixel is 1.5 hardware pixels
+ * - 2.0 means 1 CSS pixel is 2 hardware pixels
+ *
+ * @static
+ * @inheritable
+ * @return {number} Device pixel ratio
+ */
+$.bracketedDevicePixelRatio = function () {
+       return $.bracketDevicePixelRatio( $.devicePixelRatio() );
+};
+
 /**
  * Implement responsive images based on srcset attributes, if browser has no
  * native srcset support.
index 2122146..f5932b2 100644 (file)
@@ -5,8 +5,8 @@
 
 /**
  * Gets a localized message, using parameters from options if present.
- * @ignore
  *
+ * @ignore
  * @param {Object} options
  * @param {string} key
  * @return {string} Localized message
index e385089..9c18a91 100644 (file)
@@ -74,9 +74,9 @@
                        if ( input.type === 'password' ) {
                                if ( !$input.data( 'placeholder-textinput' ) ) {
                                        try {
-                                               $replacement = $input.clone().attr( { 'type': 'text' } );
+                                               $replacement = $input.clone().attr( { type: 'text' } );
                                        } catch ( e ) {
-                                               $replacement = $( '<input>' ).attr( $.extend( args( this ), { 'type': 'text' } ) );
+                                               $replacement = $( '<input>' ).attr( $.extend( args( this ), { type: 'text' } ) );
                                        }
                                        $replacement
                                                        .removeAttr( 'name' )
                placeholder.textarea = isTextareaSupported;
 
                hooks = {
-                       'get': function ( element ) {
+                       get: function ( element ) {
                                var $element = $( element ),
                                        $passwordInput = $element.data( 'placeholder-password' );
                                if ( $passwordInput ) {
 
                                return $element.data( 'placeholder-enabled' ) && $element.hasClass( 'placeholder' ) ? '' : element.value;
                        },
-                       'set': function ( element, value ) {
+                       set: function ( element, value ) {
                                var $element = $( element ),
                                        $passwordInput = $element.data( 'placeholder-password' );
                                if ( $passwordInput ) {
index e34592c..785b273 100644 (file)
 
        /**
         * CompletenessTest
-        * @constructor
         *
+        * @constructor
         * @example
         *  var myTester = new CompletenessTest( myLib );
-        * @param masterVariable {Object} The root variable that contains all object
+        * @param {Object} masterVariable The root variable that contains all object
         *  members. CompletenessTest will recursively traverse objects and keep track
         *  of all methods.
-        * @param ignoreFn {Function} Optionally pass a function to filter out certain
+        * @param {Function} [ignoreFn] Optionally pass a function to filter out certain
         *  methods. Example: You may want to filter out instances of jQuery or some
         *  other constructor. Otherwise "missingTests" will include all methods that
         *  were not called from that instance.
                 * Depending on the action it either injects our listener into the methods, or
                 * reads from our tracker and records which methods have not been called by the test suite.
                 *
-                * @param currName {String|Null} Name of the given object member (Initially this is null).
-                * @param currVar {mixed} The variable to check (initially an object,
+                * @param {String|Null} currName Name of the given object member (Initially this is null).
+                * @param {mixed} currVar The variable to check (initially an object,
                 *  further down it could be anything).
-                * @param masterVariable {Object} Throughout our interation, always keep track of the master/root.
+                * @param {Object} masterVariable Throughout our interation, always keep track of the master/root.
                 *  Initially this is the same as currVar.
-                * @param parentPathArray {Array} Array of names that indicate our breadcrumb path starting at
+                * @param {Array} parentPathArray Array of names that indicate our breadcrumb path starting at
                 *  masterVariable. Not including currName.
                 */
                walkTheObject: function ( currObj, currName, masterVariable, parentPathArray ) {
                 * was called during the test suite (as far as the tracker knows).
                 * If not it adds it to missingTests.
                 *
-                * @param fnName {String}
+                * @param {String} fnName
                 * @return {Boolean}
                 */
                hasTest: function ( fnName ) {
                 * Injects a function (such as a spy that updates methodCallTracker when
                 * it's called) inside another function.
                 *
-                * @param masterVariable {Object}
-                * @param objectPathArray {Array}
-                * @param injectFn {Function}
+                * @param {Object} masterVariable
+                * @param {Array} objectPathArray
+                * @param {Function} injectFn
                 */
                injectCheck: function ( obj, key, injectFn ) {
                        var spy,
index 361d3e0..41c555b 100644 (file)
@@ -67,7 +67,7 @@
 
                        opts = $.extend( {}, defaults, opts );
 
-                       var $spinner = $( '<div>', { 'class': 'mw-spinner', 'title': '...' } );
+                       var $spinner = $( '<div>', { 'class': 'mw-spinner', title: '...' } );
                        if ( opts.id !== undefined ) {
                                $spinner.attr( 'id', 'mw-spinner-' + opts.id );
                        }
index c43e0ff..dc1c779 100644 (file)
@@ -142,6 +142,7 @@ $.suggestions = {
         * call to this function still pending will be canceled. If the value in the
         * textbox is empty or hasn't changed since the last time suggestions were fetched,
         * this function does nothing.
+        *
         * @param {boolean} delayed Whether or not to delay this by the currently configured amount of time
         */
        update: function ( context, delayed ) {
@@ -229,6 +230,7 @@ $.suggestions = {
 
        /**
         * Sets the value of a property, and updates the widget accordingly
+        *
         * @param {string} property Name of property
         * @param {Mixed} value Value to set property with
         */
@@ -415,6 +417,7 @@ $.suggestions = {
 
        /**
         * Highlight a result in the results table
+        *
         * @param {jQuery|string} result `<tr>` to highlight, or 'prev' or 'next'
         * @param {boolean} updateTextbox If true, put the suggestion in the textbox
         */
@@ -484,6 +487,7 @@ $.suggestions = {
 
        /**
         * Respond to keypress event
+        *
         * @param {number} key Code of key pressed
         */
        keypress: function ( e, context, key ) {
index 40c828a..23474c0 100644 (file)
         *
         * After this, it will look at all rows at the bottom for footer rows
         * And place these in a tfoot using similar rules.
-        * @param $table jQuery object for a <table>
+        *
+        * @param {jQuery} $table jQuery object for a <table>
         */
        function emulateTHeadAndFoot( $table ) {
                var $thead, $tfoot, i, len,
         * Replace all rowspanned cells in the body with clones in each row, so sorting
         * need not worry about them.
         *
-        * @param $table jQuery object for a <table>
+        * @param {jQuery} $table jQuery object for a <table>
         */
        function explodeRowspans( $table ) {
                var spanningRealCellIndex, rowSpan, colSpan,
                        monthNames: {},
 
                        /**
-                        * @param $tables {jQuery}
-                        * @param settings {Object} (optional)
+                        * @param {jQuery} $tables
+                        * @param {Object} [settings]
                         */
                        construct: function ( $tables, settings ) {
                                return $tables.each( function ( i, table ) {
                                         * Passing an empty array will reset sorting (basically just reset the headers
                                         * making the table appear unsorted).
                                         *
-                                        * @param sortList {Array} (optional) List of sort objects.
+                                        * @param {Array} [sortList] List of sort objects.
                                         */
                                        $table.data( 'tablesorter' ).sort = function ( sortList ) {
 
index 367c78e..b901642 100644 (file)
                                                                context.fn.restoreCursorAndScrollTop();
                                                        }
                                                        if ( options.selectionStart !== undefined ) {
-                                                               $( this ).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                               $( this ).textSelection( 'setSelection', { start: options.selectionStart, end: options.selectionEnd } );
                                                        }
 
                                                        selText = $( this ).textSelection( 'getSelection' );
 
                                                        $( this ).focus();
                                                        if ( options.selectionStart !== undefined ) {
-                                                               $( this ).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                               $( this ).textSelection( 'setSelection', { start: options.selectionStart, end: options.selectionEnd } );
                                                        }
 
                                                        selText = $( this ).textSelection( 'getSelection' );
                         *
                         * Scroll a textarea to the current cursor position. You can set the cursor
                         * position with setSelection()
-                        * @param options boolean Whether to force a scroll even if the caret position
+                        *
+                        * @param {boolean} options Whether to force a scroll even if the caret position
                         *  is already visible. Defaults to false
                         *
                         * @fixme document the options parameters (function body suggests options.force is a boolean, not options itself)
index ce627f5..ab4535b 100644 (file)
@@ -17,6 +17,7 @@
                $editform = $( '#editform' );
                $textbox = $editform.find( '#wpTextbox1' );
                $summary = $editform.find( '#wpSummary' );
+               $spinner = $( '.mw-spinner-preview' );
                $errorBox = $( '.errorbox' );
                section = $editform.find( '[name="wpSection"]' ).val();
 
                // Not shown during normal preview, to be removed if present
                $( '.mw-newarticletext' ).remove();
 
-               $spinner = $.createSpinner( {
-                       size: 'large',
-                       type: 'block'
-               } );
-               $wikiPreview.before( $spinner );
-               $spinner.css( {
-                       marginTop: $spinner.height()
-               } );
+               if ( $spinner.length === 0 ) {
+                       $spinner = $.createSpinner( {
+                               size: 'large',
+                               type: 'block'
+                       } )
+                               .addClass( 'mw-spinner-preview' )
+                               .css( 'margin-top', '1em' );
+                       $wikiPreview.before( $spinner );
+               } else {
+                       $spinner.show();
+               }
 
                // Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
                // (e.g. empty #catlinks)
                                                li = $( '<li>' )
                                                        .append( $( '<a>' )
                                                                .attr( {
-                                                                       'href': mw.util.getUrl( template[ '*' ] ),
+                                                                       href: mw.util.getUrl( template[ '*' ] ),
                                                                        'class': ( template.exists !== undefined ? '' : 'new' )
                                                                } )
                                                                .text( template[ '*' ] )
                                                        .addClass( 'interlanguage-link interwiki-' + langlink.lang )
                                                        .append( $( '<a>' )
                                                                .attr( {
-                                                                       'href': langlink.url,
-                                                                       'title': langlink[ '*' ] + ' - ' + langlink.langname,
-                                                                       'lang': langlink.lang,
-                                                                       'hreflang': langlink.lang
+                                                                       href: langlink.url,
+                                                                       title: langlink[ '*' ] + ' - ' + langlink.langname,
+                                                                       lang: langlink.lang,
+                                                                       hreflang: langlink.lang
                                                                } )
                                                                .text( langlink.autonym )
                                                        );
                        mw.hook( 'wikipage.editform' ).fire( $editform );
                } );
                request.always( function () {
-                       $spinner.remove();
+                       $spinner.hide();
                        $copyElements.animate( {
                                opacity: 1
                        }, 'fast' );
                        $( '.portal:last' ).after(
                                $( '<div>' ).attr( {
                                        'class': 'portal',
-                                       'id': 'p-lang',
-                                       'role': 'navigation',
-                                       'title': mw.msg( 'tooltip-p-lang' ),
+                                       id: 'p-lang',
+                                       role: 'navigation',
+                                       title: mw.msg( 'tooltip-p-lang' ),
                                        'aria-labelledby': 'p-lang-label'
                                } )
                                .append( $( '<h3>' ).attr( 'id', 'p-lang-label' ).text( mw.msg( 'otherlanguages' ) ) )
index 2ebfe92..077d5e3 100644 (file)
@@ -9,7 +9,7 @@ jQuery( function ( $ ) {
        /**
         * @ignore
         * @context {Element} input
-        * @param e {jQuery.Event}
+        * @param {jQuery.Event} e
         */
        function updateDiffRadios() {
                var nextState = 'before',
index 31250c9..168a1c1 100644 (file)
@@ -68,7 +68,7 @@
                        // postedit-confirmation-saved
                        // postedit-confirmation-created
                        // postedit-confirmation-restored
-                       'message': mw.msg(
+                       message: mw.msg(
                                'postedit-confirmation-' + cookieVal,
                                mw.user
                        )
index e6161e4..e43285f 100644 (file)
@@ -31,6 +31,7 @@
 
                /**
                 * Post a new section to the page.
+                *
                 * @see #postWithEditToken
                 * @param {mw.Title|String} title Target page
                 * @param {string} header
index 2525792..2b709aa 100644 (file)
@@ -1,5 +1,6 @@
 /**
  * Make the two-step login easier.
+ *
  * @author Niklas Laxström
  * @class mw.Api.plugin.login
  * @since 1.22
index cc0bef0..4abff28 100644 (file)
@@ -1,5 +1,6 @@
 /**
  * Provides an interface for uploading files to MediaWiki.
+ *
  * @class mw.Api.plugin.upload
  * @singleton
  */
@@ -18,6 +19,7 @@
        /**
         * @private
         * Get nonce for iframe IDs on the page.
+        *
         * @return {number}
         */
        function getNonce() {
@@ -27,6 +29,7 @@
        /**
         * @private
         * Get new iframe object for an upload.
+        *
         * @return {HTMLIframeElement}
         */
        function getNewIframe( id ) {
@@ -39,6 +42,7 @@
        /**
         * @private
         * Shortcut for getting hidden inputs
+        *
         * @return {jQuery}
         */
        function getHiddenInput( name, val ) {
                 * This function will return a promise, which when resolved, will pass back a function
                 * to finish the stash upload. You can call that function with an argument containing
                 * more, or conflicting, data to pass to the server. For example:
+                *
                 *     // upload a file to the stash with a placeholder filename
                 *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
                 *         // finish is now the function we can use to finalize the upload
                 *             // the upload is complete, data holds the API response
                 *         } );
                 *     } );
+                *
                 * @param {File|HTMLInputElement} file
                 * @param {Object} [data]
                 * @return {jQuery.Promise}
index 81baebe..0d324ed 100644 (file)
@@ -90,7 +90,7 @@ $.extend( mw.language, {
         *
         * @param {string} gender 'male', 'female', or anything else for neutral.
         * @param {Array} forms List of gender forms
-        * @return string
+        * @return {string}
         */
        gender: function ( gender, forms ) {
                if ( !forms || forms.length === 0 ) {
index 32df68c..268985f 100644 (file)
                },
 
                /**
-                * Get the  digit transform table for current UI language.
+                * Get the digit transform table for current UI language.
+                *
                 * @return {Object|Array}
                 */
                getDigitTransformTable: function () {
                },
 
                /**
-                * Get the  separator transform table for current UI language.
+                * Get the separator transform table for current UI language.
+                *
                 * @return {Object|Array}
                 */
                getSeparatorTransformTable: function () {
diff --git a/resources/src/mediawiki.legacy/images/question.png b/resources/src/mediawiki.legacy/images/question.png
deleted file mode 100644 (file)
index f7405d2..0000000
Binary files a/resources/src/mediawiki.legacy/images/question.png and /dev/null differ
diff --git a/resources/src/mediawiki.legacy/images/question.svg b/resources/src/mediawiki.legacy/images/question.svg
deleted file mode 100644 (file)
index 98fbe8d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
index d76b707..6226c90 100644 (file)
@@ -177,6 +177,7 @@ var ProtectionForm = window.ProtectionForm = {
 
        /**
         * Find the highest protection level in any selector
+        *
         * @return {number}
         */
        getMaxLevel: function () {
index 019d339..f55d2a8 100644 (file)
@@ -218,56 +218,10 @@ td.mw-label {
        width: auto;
 }
 
-.mw-icon-question {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG).
-        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-       background-image: url(images/question.png);
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
-       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
-       background-repeat: no-repeat;
-       background-size: 13px 13px;
-       display: inline-block;
-       height: 13px;
-       width: 13px;
-       margin-left: 4px;
-}
-
-.mw-icon-question:lang(ar),
-.mw-icon-question:lang(fa),
-.mw-icon-question:lang(ur) {
-       -webkit-transform: scaleX(-1);
-       -ms-transform: scaleX(-1);
-       transform: scaleX(-1);
-}
-
 td.mw-submit {
        white-space: nowrap;
 }
 
-table.mw-htmlform-nolabel td.mw-label {
-       width: 1px;
-}
-
-tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
-}
-
-.mw-htmlform-invalid-input td.mw-input input {
-       border-color: red;
-}
-
-.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
-       display: inline;
-       margin-right: 1em;
-       white-space: nowrap;
-}
-
-.mw-htmlform-matrix td {
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-}
-
 input#wpSummary {
        width: 80%;
        margin-bottom: 1em;
index bf34dec..dfccf21 100644 (file)
@@ -12,6 +12,7 @@
 
        /**
         * Perform the layout justification.
+        *
         * @ignore
         * @context {HTMLElement} A `ul.mw-gallery-*` element
         */
index 67531f7..06851b9 100644 (file)
@@ -4,6 +4,7 @@
 ( function ( mw, $ ) {
        /**
         * Given an email validity status (true, false, null) update the label CSS class
+        *
         * @ignore
         */
        function updateMailValidityLabel( mail ) {
index 57489fa..bad1c08 100644 (file)
@@ -51,8 +51,8 @@ jQuery( function ( $ ) {
         * It uses document.getElementById for security reasons (HTML injections in $()).
         *
         * @ignore
-        * @param String name: the name of a tab without the prefix ("mw-prefsection-")
-        * @param String mode: [optional] A hash will be set according to the current
+        * @param {String} name the name of a tab without the prefix ("mw-prefsection-")
+        * @param {String} [mode] A hash will be set according to the current
         *  open section. Set mode 'noHash' to surpress this.
         */
        function switchPrefTab( name, mode ) {
index 33548d7..677d26d 100644 (file)
                 * TODO: Put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
                 *
                 * @param {File} file
-                * @return boolean
+                * @return {boolean}
                 */
                function fileIsPreviewable( file ) {
                        var known = [ 'image/png', 'image/gif', 'image/jpeg', 'image/svg+xml' ],
diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.common.js b/resources/src/mediawiki.special/mediawiki.special.userlogin.common.js
deleted file mode 100644 (file)
index f5289de..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*!
- * JavaScript for login and signup forms.
- */
-( function ( mw, $ ) {
-       // Move the FancyCaptcha image into a more attractive container.
-       // The CAPTCHA is in a <div class="captcha"> at the top of the form. If it's a FancyCaptcha,
-       // then we remove it and insert it lower down, in a customized div with just what we need (e.g.
-       // no 'fancycaptcha-createaccount' message).
-       function adjustFancyCaptcha( $content, buttonSubmit ) {
-               var $submit = $content.find( buttonSubmit ),
-                       tabIndex,
-                       $captchaStuff,
-                       $captchaImageContainer,
-                       // JavaScript can't yet parse the message 'createacct-imgcaptcha-help' when it
-                       // contains a MediaWiki transclusion, so PHP parses it and sends the HTML.
-                       // This is only set for the signup form (and undefined for login).
-                       helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
-                       helpHtml = '';
-
-               if ( !$submit.length ) {
-                       return;
-               }
-               tabIndex = $submit.prop( 'tabIndex' ) - 1;
-               $captchaStuff = $content.find( '.captcha' );
-
-               if ( $captchaStuff.length ) {
-                       // The FancyCaptcha has this class in the ConfirmEdit extension since 2013-04-18.
-                       $captchaImageContainer = $captchaStuff.find( '.fancycaptcha-image-container' );
-                       if ( $captchaImageContainer.length !== 1 ) {
-                               return;
-                       }
-
-                       $captchaStuff.remove();
-
-                       if ( helpMsg ) {
-                               helpHtml = '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>';
-                       }
-
-                       // Insert another div before the submit button that will include the
-                       // repositioned FancyCaptcha div, an input field, and possible help.
-                       $submit.closest( 'div' ).before( [
-                               '<div>',
-                                       '<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
-                                       '<div class="mw-createacct-captcha-container">',
-                                               '<div class="mw-createacct-captcha-and-reload" />',
-                                               '<input id="wpCaptchaWord" class="mw-ui-input" name="wpCaptchaWord" type="text" placeholder="' +
-                                                       mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
-                                                       '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
-                                                       helpHtml,
-                                       '</div>',
-                               '</div>'
-                       ].join( '' ) );
-
-                       // Stick the FancyCaptcha container inside our bordered and framed parents.
-                       $captchaImageContainer
-                               .prependTo( $content.find( '.mw-createacct-captcha-and-reload' ) );
-
-                       // Find the input field, add the text (if any) of the existing CAPTCHA
-                       // field (although usually it's blanked out on every redisplay),
-                       // and after it move over the hidden field that tells the CAPTCHA
-                       // what to do.
-                       $content.find( '#wpCaptchaWord' )
-                               .val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
-                               .after( $captchaStuff.find( '#wpCaptchaId' ) );
-               }
-       }
-
-       $( function () {
-               // Work with both login and signup form
-               adjustFancyCaptcha( $( '#mw-content-text' ), '#wpCreateaccount, #wpLoginAttempt' );
-       } );
-}( mediaWiki, jQuery ) );
index b914f36..d519c0d 100644 (file)
 
        /**
         * Handle click events on the "up" button, switching to less precise view.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onUpButtonClick = function () {
 
        /**
         * Handle click events on the "previous" button, switching to previous pane.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onPrevButtonClick = function () {
 
        /**
         * Handle click events on the "next" button, switching to next pane.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onNextButtonClick = function () {
         * Handle click events anywhere in the body of the widget, which contains the matrix of days,
         * months or years to choose. Maybe change the pane or switch to more precise view, depending on
         * what gets clicked.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onBodyClick = function ( e ) {
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js b/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
new file mode 100644 (file)
index 0000000..09ac7b2
--- /dev/null
@@ -0,0 +1,102 @@
+/*!
+ * MediaWiki Widgets - CategorySelector class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Category selector widget. Displays an OO.ui.CapsuleMultiSelectWidget
+        * and autocompletes with available categories.
+        *
+        * @class
+        * @uses mw.Api
+        * @extends OO.ui.CapsuleMultiSelectWidget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        */
+       mw.widgets.CategorySelector = function ( config ) {
+               // Parent constructor
+               mw.widgets.CategorySelector.parent.call( this, config );
+
+               // Event handler to call the autocomplete methods
+               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.CategorySelector, OO.ui.CapsuleMultiSelectWidget );
+
+       /* Methods */
+
+       /**
+        * Gets new items based on the input by calling
+        * {@link #getNewMenuItems getNewItems} and updates the menu
+        * after removing duplicates based on the data value.
+        *
+        * @private
+        * @method
+        */
+       mw.widgets.CategorySelector.prototype.updateMenuItems = function () {
+               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
+                       var existingItems, filteredItems,
+                               menu = this.getMenu();
+
+                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
+                       existingItems = menu.getItems().map( function ( item ) {
+                               return item.data;
+                       } );
+
+                       // Remove if items' data already exists
+                       filteredItems = items.filter( function ( item ) {
+                               return existingItems.indexOf( item.data ) === -1;
+                       } );
+
+                       // Map to an array of OO.ui.MenuOptionWidgets
+                       filteredItems = filteredItems.map( function ( item ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: item.data,
+                                       label: item.label
+                               } );
+                       } );
+
+                       menu.addItems( filteredItems ).updateItemVisibility();
+               }.bind( this ) );
+       };
+
+       /**
+        * Searches for categories based on the input.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       mw.widgets.CategorySelector.prototype.getNewMenuItems = function ( input ) {
+               var deferred = new $.Deferred(),
+                       catNsId = mw.config.get( 'wgNamespaceIds' ).category,
+                       api = new mw.Api();
+
+               api.get( {
+                       action: 'opensearch',
+                       namespace: catNsId,
+                       limit: 10,
+                       search: input
+               } ).done( function ( res ) {
+                       var categoryNames = res[ 1 ].map( function ( name ) {
+                               return mw.Title.newFromText( name, catNsId ).getMainText();
+                       } );
+
+                       deferred.resolve( categoryNames.map( function ( category ) {
+                               return {
+                                       data: category,
+                                       label: category
+                               };
+                       } ) );
+               } );
+
+               return deferred.promise();
+       };
+}( jQuery, mediaWiki ) );
index 6b7f860..357e72e 100644 (file)
         *     field when it's empty. Should be the same as `inputFormat`, but translated to the user's
         *     language. When not given, defaults to a translated version of 'YYYY-MM-DD' or 'YYYY-MM',
         *     depending on `precision`.
+        * @cfg {boolean} [required=false] Mark the field as required. Implies `indicator: 'required'`.
+        * @cfg {string} mustBeAfter Validates the date to be after this. Should be `YYYY-MM-DD` format.
+        * @cfg {string} mustBeBefore Validates the date to be before this. Should be `YYYY-MM-DD` format.
         */
        mw.widgets.DateInputWidget = function MWWDateInputWidget( config ) {
                // Config initialization
                config = $.extend( { precision: 'day' }, config );
+               if ( config.required ) {
+                       if ( config.indicator === undefined ) {
+                               config.indicator = 'required';
+                       }
+               }
 
-               var placeholder;
+               var placeholder, mustBeAfter, mustBeBefore;
                if ( config.placeholder ) {
                        placeholder = config.placeholder;
                } else if ( config.inputFormat ) {
                this.inputFormat = config.inputFormat;
                this.displayFormat = config.displayFormat;
 
+               // Validate and set min and max dates as properties
+               mustBeAfter = moment( config.mustBeAfter, 'YYYY-MM-DD' );
+               mustBeBefore = moment( config.mustBeBefore, 'YYYY-MM-DD' );
+               if (
+                       config.mustBeAfter !== undefined &&
+                       mustBeAfter.isValid()
+               ) {
+                       this.mustBeAfter = mustBeAfter;
+               }
+
+               if (
+                       config.mustBeBefore !== undefined &&
+                       mustBeBefore.isValid()
+               ) {
+                       this.mustBeBefore = mustBeBefore;
+               }
+
                // Parent constructor
                mw.widgets.DateInputWidget.parent.call( this, config );
 
                } );
 
                // Initialization
+               if ( config.required ) {
+                       this.$input.attr( 'required', 'required' );
+                       this.$input.attr( 'aria-required', 'true' );
+               }
                // Move 'tabindex' from this.$input (which is invisible) to the visible handle
                this.setTabIndexedElement( this.handle.$element );
                this.handle.$element
         * @private
         */
        mw.widgets.DateInputWidget.prototype.onTextInputChange = function () {
-               var
+               var mom,
                        widget = this,
-                       value = this.textInput.getValue();
+                       value = this.textInput.getValue(),
+                       valid = this.isValidDate( value );
                this.inTextInput++;
-               this.textInput.isValid().done( function ( valid ) {
-                       if ( value === '' ) {
-                               // No date selected
-                               widget.setValue( '' );
-                       } else if ( valid ) {
-                               // Well-formed date value, parse and set it
-                               var mom = moment( value, widget.getInputFormat() );
-                               // Use English locale to avoid number formatting
-                               widget.setValue( mom.locale( 'en' ).format( widget.getInternalFormat() ) );
-                       } else {
-                               // Not well-formed, but possibly partial? Try updating the calendar, but do not set the
-                               // internal value. Generally this only makes sense when 'inputFormat' is little-endian (e.g.
-                               // 'YYYY-MM-DD'), but that's hard to check for, and might be difficult to handle the parsing
-                               // right for weird formats. So limit this trick to only when we're using the default
-                               // 'inputFormat', which is the same as the internal format, 'YYYY-MM-DD'.
-                               if ( widget.getInputFormat() === widget.getInternalFormat() ) {
-                                       widget.calendar.setDate( widget.textInput.getValue() );
-                               }
+
+               if ( value === '' ) {
+                       // No date selected
+                       widget.setValue( '' );
+               } else if ( valid ) {
+                       // Well-formed date value, parse and set it
+                       mom = moment( value, widget.getInputFormat() );
+                       // Use English locale to avoid number formatting
+                       widget.setValue( mom.locale( 'en' ).format( widget.getInternalFormat() ) );
+               } else {
+                       // Not well-formed, but possibly partial? Try updating the calendar, but do not set the
+                       // internal value. Generally this only makes sense when 'inputFormat' is little-endian (e.g.
+                       // 'YYYY-MM-DD'), but that's hard to check for, and might be difficult to handle the parsing
+                       // right for weird formats. So limit this trick to only when we're using the default
+                       // 'inputFormat', which is the same as the internal format, 'YYYY-MM-DD'.
+                       if ( widget.getInputFormat() === widget.getInternalFormat() ) {
+                               widget.calendar.setDate( widget.textInput.getValue() );
                        }
-                       widget.inTextInput--;
-               } );
+               }
+               widget.inTextInput--;
+
        };
 
        /**
         * @private
         * @param {string} date Date string, to be valid, must be empty (no date selected) or in
         *     'YYYY-MM-DD' or 'YYYY-MM' format to be valid
+        * @returns {boolean}
         */
        mw.widgets.DateInputWidget.prototype.validateDate = function ( date ) {
                if ( date === '' ) {
                        return true;
                }
 
+               var isValid = this.isValidDate( date ) && this.isInRange( date );
+               this.setValidityFlag( isValid );
+               return isValid;
+       };
+
+       /**
+        * @private
+        * @param {string} date Date string, to be valid, must be empty (no date selected) or in
+        *     'YYYY-MM-DD' or 'YYYY-MM' format to be valid
+        * @returns {boolean}
+        */
+       mw.widgets.DateInputWidget.prototype.isValidDate = function ( date ) {
                // "Half-strict mode": for example, for the format 'YYYY-MM-DD', 2015-1-3 instead of 2015-01-03
                // is okay, but 2015-01 isn't, and neither is 2015-01-foo. Use Moment's "fuzzy" mode and check
                // parsing flags for the details (stoled from implementation of #isValid).
                return mom.isValid() && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0;
        };
 
+       /**
+        * Validates if the date is within the range configured with {@link #cfg-mustBeAfter}
+        * and {@link #cfg-mustBeBefore}.
+        *
+        * @private
+        * @param {string} date Date string, to be valid, must be empty (no date selected) or in
+        *     'YYYY-MM-DD' or 'YYYY-MM' format to be valid
+        * @returns {boolean}
+        */
+       mw.widgets.DateInputWidget.prototype.isInRange = function ( date ) {
+               var momentDate = moment( date, 'YYYY-MM-DD' ),
+                       isAfter = ( this.mustBeAfter === undefined || momentDate.isAfter( this.mustBeAfter ) ),
+                       isBefore = ( this.mustBeBefore === undefined || momentDate.isBefore( this.mustBeBefore ) );
+
+               return isAfter && isBefore;
+       };
+
+       /**
+        * Get the validity of current value.
+        *
+        * This method returns a promise that resolves if the value is valid and rejects if
+        * it isn't. Uses {@link #validateDate}.
+        *
+        * @return {jQuery.Promise} A promise that resolves if the value is valid, rejects if not.
+        */
+       mw.widgets.DateInputWidget.prototype.getValidity = function () {
+               var isValid = this.validateDate( this.getValue() );
+
+               if ( isValid ) {
+                       return $.Deferred().resolve().promise();
+               } else {
+                       return $.Deferred().reject().promise();
+               }
+       };
+
+       /**
+        * Sets the 'invalid' flag appropriately.
+        *
+        * @param {boolean} [isValid] Optionally override validation result
+        */
+       mw.widgets.DateInputWidget.prototype.setValidityFlag = function ( isValid ) {
+               var widget = this,
+                       setFlag = function ( valid ) {
+                               if ( !valid ) {
+                                       widget.$input.attr( 'aria-invalid', 'true' );
+                               } else {
+                                       widget.$input.removeAttr( 'aria-invalid' );
+                               }
+                               widget.setFlags( { invalid: !valid } );
+                       };
+
+               if ( isValid !== undefined ) {
+                       setFlag( isValid );
+               } else {
+                       this.getValidity().then( function () {
+                               setFlag( true );
+                       }, function () {
+                               setFlag( false );
+                       } );
+               }
+       };
+
 }( jQuery, mediaWiki ) );
index 1feb8f0..f78a18d 100644 (file)
                }
        }
 
+       &.oo-ui-flaggedElement-invalid {
+               .mw-widget-dateInputWidget-handle {
+                       border-color: red;
+                       box-shadow: inset 0 0 0 0 red;
+               }
+       }
+
        &-empty {
                .mw-widget-dateInputWidget-handle {
                        color: #ccc;
diff --git a/resources/src/mediawiki/images/question.png b/resources/src/mediawiki/images/question.png
new file mode 100644 (file)
index 0000000..f7405d2
Binary files /dev/null and b/resources/src/mediawiki/images/question.png differ
diff --git a/resources/src/mediawiki/images/question.svg b/resources/src/mediawiki/images/question.svg
new file mode 100644 (file)
index 0000000..98fbe8d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
index 0c06a83..fe8520b 100644 (file)
@@ -28,6 +28,7 @@
 
        /**
         * Add categories to the upload.
+        *
         * @param {string[]} categories Array of categories to which this upload will be added.
         */
        ForeignStructuredUpload.prototype.addCategories = function ( categories ) {
@@ -41,6 +42,7 @@
 
        /**
         * Add a description to the upload.
+        *
         * @param {string} language The language code for the description's language. Must have a template on the target wiki to work properly.
         * @param {string} description The description of the file.
         */
@@ -53,6 +55,7 @@
 
        /**
         * Set the date of creation for the upload.
+        *
         * @param {Date} date
         */
        ForeignStructuredUpload.prototype.setDate = function ( date ) {
@@ -62,6 +65,7 @@
        /**
         * Get the text of the file page, to be created on upload. Brings together
         * several different pieces of information to create useful text.
+        *
         * @return {string}
         */
        ForeignStructuredUpload.prototype.getText = function () {
@@ -85,6 +89,7 @@
 
        /**
         * Gets the wikitext for the creation date of this upload.
+        *
         * @private
         * @return {string}
         */
        /**
         * Gets the name of the template to use for creating the file metadata.
         * Override in subclasses for other templates.
+        *
         * @private
         * @return {string}
         */
        /**
         * Fetches the wikitext for any descriptions that have been added
         * to the upload.
+        *
         * @private
         * @return {string}
         */
        /**
         * Fetches the wikitext for the categories to which the upload will
         * be added.
+        *
         * @private
         * @return {string}
         */
 
        /**
         * Gets the wikitext for the license of the upload. Abstract for now.
+        *
         * @private
         * @return {string}
         */
 
        /**
         * Get the username.
+        *
         * @private
         * @return {string}
         */
index 96db7cc..596e777 100644 (file)
 
                // Validation
                function checkValidity() {
-                       var validityPromises = [
-                               dialog.filenameWidget.isValid(),
-                               dialog.descriptionWidget.isValid()
-                       ];
-
-                       $.when.apply( $, validityPromises ).done( function () {
-                               var allValid,
-                                       values = Array.prototype.slice.apply( arguments );
-                               allValid = values.every( function ( value ) {
-                                       return value;
-                               } );
-
-                               dialog.actions.setAbilities( { save: allValid } );
+                       $.when(
+                               dialog.filenameWidget.getValidity(),
+                               dialog.descriptionWidget.getValidity()
+                       ).done( function () {
+                               dialog.actions.setAbilities( { save: true } );
+                       } ).fail( function () {
+                               dialog.actions.setAbilities( { save: false } );
                        } );
                }
                this.filenameWidget.on( 'change', checkValidity );
index 07a0b75..79628de 100644 (file)
@@ -64,6 +64,7 @@
 
        /**
         * Set the text of the file page, to be created on file upload.
+        *
         * @param {string} text
         */
        UP.setText = function ( text ) {
@@ -72,6 +73,7 @@
 
        /**
         * Set the filename, to be finalized on upload.
+        *
         * @param {string} filename
         */
        UP.setFilename = function ( filename ) {
@@ -94,6 +96,7 @@
 
        /**
         * Set the file to be uploaded.
+        *
         * @param {HTMLInputElement|File} file
         */
        UP.setFile = function ( file ) {
 
        /**
         * Set whether the file should be watchlisted after upload.
+        *
         * @param {boolean} watchlist
         */
        UP.setWatchlist = function ( watchlist ) {
 
        /**
         * Set the edit comment for the upload.
+        *
         * @param {string} comment
         */
        UP.setComment = function ( comment ) {
 
        /**
         * Get the text of the file page, to be created on file upload.
+        *
         * @return {string}
         */
        UP.getText = function () {
 
        /**
         * Get the filename, to be finalized on upload.
+        *
         * @return {string}
         */
        UP.getFilename = function () {
 
        /**
         * Get the file being uploaded.
+        *
         * @return {HTMLInputElement|File}
         */
        UP.getFile = function () {
 
        /**
         * Get the boolean for whether the file will be watchlisted after upload.
+        *
         * @return {boolean}
         */
        UP.getWatchlist = function () {
 
        /**
         * Get the current value of the edit comment for the upload.
+        *
         * @return {string}
         */
        UP.getComment = function () {
 
        /**
         * Gets the base filename from a path name.
+        *
         * @param {string} path
         * @return {string}
         */
 
        /**
         * Gets the state of the upload.
+        *
         * @return {mw.Upload.State}
         */
        UP.getState = function () {
         * Get the imageinfo object for the finished upload.
         * Only available once the upload is finished! Don't try to get it
         * beforehand.
+        *
         * @return {Object|undefined}
         */
        UP.getImageInfo = function () {
 
        /**
         * Upload the file directly.
+        *
         * @return {jQuery.Promise}
         */
        UP.upload = function () {
 
        /**
         * Upload the file to the stash to be completed later.
+        *
         * @return {jQuery.Promise}
         */
        UP.uploadToStash = function () {
 
        /**
         * Finish a stash upload.
+        *
         * @return {jQuery.Promise}
         */
        UP.finishStashUpload = function () {
index 8d1faa6..4d0c135 100644 (file)
 
                /**
                 * Return the object with functions to release and manually trigger the confirm alert
+                *
                 * @ignore
                 */
                return {
                        /**
                         * Remove all event listeners and don't show an alert anymore, if the user wants to leave
                         * the page.
+                        *
                         * @ignore
                         */
                        release: function () {
@@ -92,8 +94,9 @@
                         * Trigger the module's function manually: Check, if options.test() returns true and show
                         * an alert to the user if he/she want to leave this page. Returns false, if options.test() returns
                         * false or the user cancelled the alert window (~don't leave the page), true otherwise.
+                        *
                         * @ignore
-                        * @return boolean
+                        * @return {boolean}
                         */
                        trigger: function () {
                                // use confirm to show the message to the user (if options.text() is true)
index 9f4f19d..46b8479 100644 (file)
@@ -1,5 +1,6 @@
 /**
  * Try to catch errors in modules which don't do their own error handling.
+ *
  * @class mw.errorLogger
  * @singleton
  */
@@ -24,6 +25,7 @@
                /**
                 * Install a window.onerror handler that will report via mw.track, while preserving
                 * any previous handler.
+                *
                 * @param {Object} window
                 */
                installGlobalHandler: function ( window ) {
@@ -35,6 +37,7 @@
 
                        /**
                         * Dumb window.onerror handler which forwards the errors via mw.track.
+                        *
                         * @fires global_error
                         */
                        window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
index d90ca4b..d226ed9 100644 (file)
@@ -86,6 +86,7 @@
         * Respond to dialog submit event. If the information was
         * submitted, either successfully or with an error, open
         * a MessageDialog to thank the user.
+        *
         * @param {string} [status] A status of the end of operation
         *  of the main feedback dialog. Empty if the dialog was
         *  dismissed with no action or the user followed the button
 
        /**
         * Set the bug report link
+        *
         * @param {string} link Link to the external bug report form
         */
        mw.Feedback.Dialog.prototype.setBugReportLink = function ( link ) {
 
        /**
         * Get the bug report link
+        *
         * @returns {string} Link to the external bug report form
         */
        mw.Feedback.Dialog.prototype.getBugReportLink = function () {
diff --git a/resources/src/mediawiki/mediawiki.htmlform.css b/resources/src/mediawiki/mediawiki.htmlform.css
new file mode 100644 (file)
index 0000000..e41248c
--- /dev/null
@@ -0,0 +1,51 @@
+/* HTMLForm styles */
+
+table.mw-htmlform-nolabel td.mw-label {
+       width: 1px;
+}
+
+.mw-htmlform-invalid-input td.mw-input input {
+       border-color: red;
+}
+
+.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
+       display: inline;
+       margin-right: 1em;
+       white-space: nowrap;
+}
+
+/* HTMLCheckMatrix */
+
+.mw-htmlform-matrix td {
+       padding-left: 0.5em;
+       padding-right: 0.5em;
+}
+
+tr.mw-htmlform-vertical-label td.mw-label {
+       text-align: left !important;
+}
+
+.mw-icon-question {
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG).
+        * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
+       background-image: url(images/question.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
+       background-repeat: no-repeat;
+       background-size: 13px 13px;
+       display: inline-block;
+       height: 13px;
+       width: 13px;
+       margin-left: 4px;
+}
+
+.mw-icon-question:lang(ar),
+.mw-icon-question:lang(fa),
+.mw-icon-question:lang(ur) {
+       -webkit-transform: scaleX(-1);
+       -ms-transform: scaleX(-1);
+       transform: scaleX(-1);
+}
index adc0b07..8c6f3ab 100644 (file)
         * jQuery plugin to fade or snap to hiding state.
         *
         * @param {boolean} [instantToggle=false]
-        * @return jQuery
+        * @return {jQuery}
         * @chainable
         */
        $.fn.goOut = function ( instantToggle ) {
         * @param {Function} callback
         * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
         *  an event object when triggered from an event.
-        * @return jQuery
+        * @return {jQuery}
         * @chainable
         */
        mw.log.deprecate( $.fn, 'liveAndTestAtStart', function ( callback ) {
index 9a18c72..6bebf4d 100644 (file)
                 * document.
                 *
                 * @param {string} css CSS source
-                * @return Selector counts
+                * @return {Object} Selector counts
                 * @return {number} return.selectors Total number of selectors
                 * @return {number} return.matched Number of matched selectors
                 */
index bd9ad02..ce92423 100644 (file)
@@ -15,7 +15,7 @@
                slice = Array.prototype.slice,
                parserDefaults = {
                        magic: {
-                               'SITENAME': mw.config.get( 'wgSiteName' )
+                               SITENAME: mw.config.get( 'wgSiteName' )
                        },
                        // Whitelist for allowed HTML elements in wikitext.
                        // Self-closing tags are not currently supported.
         * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
         * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
         * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
+        *
         * @private
         * @param {Object} options Parser options
         * @return {Function}
                 * Where the magic happens.
                 * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
                 * If an error is thrown, returns original key, and logs the error
+                *
                 * @param {string} key Message key.
                 * @param {Array} replacements Variable replacements for $1, $2... $n
                 * @return {jQuery}
                /**
                 * Fetch the message string associated with a key, return parsed structure. Memoized.
                 * Note that we pass '[' + key + ']' back for a missing message here.
+                *
                 * @param {string} key
                 * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
 
                        /**
                         * Try parsers until one works, if none work return null
+                        *
                         * @private
                         * @param {Function[]} ps
                         * @return {string|null}
                        /**
                         * Try several ps in a row, all must succeed or return null.
                         * This is the only eager one.
+                        *
                         * @private
                         * @param {Function[]} ps
                         * @return {string|null}
                        /**
                         * Run the same parser over and over until it fails.
                         * Must succeed a minimum of n times or return null.
+                        *
                         * @private
                         * @param {number} n
                         * @param {Function} p
 
                        /**
                         * Just make parsers out of simpler JS builtin types
+                        *
                         * @private
                         * @param {string} s
                         * @return {Function}
                /**
                 * (We put this method definition here, and not in prototype, to make sure it's not overwritten by any magic.)
                 * Walk entire node structure, applying replacements and template functions when appropriate
+                *
                 * @param {Mixed} node Abstract syntax tree (top node or subnode)
                 * @param {Array} replacements for $1, $2, ... $n
                 * @return {Mixed} single-string node or array of nodes suitable for jQuery appending
                 * Parsing has been applied depth-first we can assume that all nodes here are single nodes
                 * Must return a single node to parents -- a jQuery with synthetic span
                 * However, unwrap any other synthetic spans in our children and pass them upwards
+                *
                 * @param {Mixed[]} nodes Some single nodes, some arrays of nodes
                 * @return {jQuery}
                 */
                 * from the server, since the replacement is done at save time.
                 * It may, though, if the wikitext appears in extension-controlled content.
                 *
-                * @param nodes
+                * @param {String[]} nodes
                 */
                wikilink: function ( nodes ) {
                        var page, anchor, url;
                 * Transform parsed structure into pluralization
                 * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
                 * So convert it back with the current language's convertNumber.
+                *
                 * @param {Array} nodes List of nodes, [ {string|number}, {string}, {string} ... ]
                 * @return {string} selected pluralized form according to current language
                 */
                /**
                 * Transform parsed structure into grammar conversion.
                 * Invoked by putting `{{grammar:form|word}}` in a message
+                *
                 * @param {Array} nodes List of nodes [{Grammar case eg: genitive}, {string word}]
                 * @return {string} selected grammatical form according to current language
                 */
                /**
                 * Tranform parsed structure into a int: (interface language) message include
                 * Invoked by putting `{{int:othermessage}}` into a message
+                *
                 * @param {Array} nodes List of nodes
                 * @return {string} Other message
                 */
                 * Takes an unformatted number (arab, no group separators and . as decimal separator)
                 * and outputs it in the localized digit script and formatted with decimal
                 * separator, according to the current language.
+                *
                 * @param {Array} nodes List of nodes
                 * @return {number|string} Formatted number
                 */
                }
 
                messageFunction = mw.jqueryMsg.getMessageFunction( {
-                       'messages': this.map,
+                       messages: this.map,
                        // For format 'escaped', escaping part is handled by mediawiki.js
-                       'format': this.format
+                       format: this.format
                } );
                return messageFunction( this.key, this.parameters );
        };
index ef6080b..5ba9781 100644 (file)
 
                /**
                 * Dummy placeholder for {@link mw.log}
+                *
                 * @method
                 */
                log: ( function () {
                         *    The module is known to the system but not yet requested.
                         *    Meta data is registered via mw.loader#register. Calls to that method are
                         *    generated server-side by the startup module.
-                        * - `loading` (1):
+                        * - `loading`:
                         *    The module is requested through mw.loader (either directly or as dependency of
                         *    another module). The client will be fetching module contents from the server.
                         *    The contents are then stashed in the registry via mw.loader#implement.
                         *    The module has been requested from the server and stashed via mw.loader#implement.
                         *    If the module has no more dependencies in-fight, the module will be executed
                         *    right away. Otherwise execution is deferred, controlled via #handlePending.
-                        * - `loading` (2):
+                        * - `executing`:
                         *    The module is being executed.
-                        *    TODO: Create a new state instead of re-using the "loading" state.
                         * - `ready`:
                         *    The module has been successfully executed.
                         * - `error`:
                         *
                         * @private
                         * @param {string} src URL to script, will be used as the src attribute in the script tag
-                        * @param {Function} [callback] Callback which will be run when the script is done
+                        * @return {jQuery.Promise}
                         */
-                       function addScript( src, callback ) {
-                               $.ajax( {
+                       function addScript( src ) {
+                               return $.ajax( {
                                        url: src,
                                        dataType: 'script',
                                        // Force jQuery behaviour to be for crossDomain. Otherwise jQuery would use
                                        // text, so we'd need to $.globalEval, which then messes up line numbers.
                                        crossDomain: true,
                                        cache: true
-                               } ).always( callback );
+                               } );
+                       }
+
+                       /**
+                        * Utility function for execute()
+                        *
+                        * @ignore
+                        */
+                       function addLink( media, url ) {
+                               var el = document.createElement( 'link' );
+                               // Support: IE
+                               // Insert in document *before* setting href
+                               getMarker().before( el );
+                               el.rel = 'stylesheet';
+                               if ( media && media !== 'all' ) {
+                                       el.media = media;
+                               }
+                               // If you end up here from an IE exception "SCRIPT: Invalid property value.",
+                               // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
+                               el.href = url;
                        }
 
                        /**
                                if ( !hasOwn.call( registry, module ) ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
                                }
-                               if ( registry[ module ].state === 'registered' ) {
-                                       throw new Error( 'Module has not been requested from the server yet: ' + module );
-                               }
-                               if ( registry[ module ].state === 'loading' ) {
-                                       throw new Error( 'Module has not completed loading yet: ' + module );
-                               }
-                               if ( registry[ module ].state === 'ready' ) {
-                                       throw new Error( 'Module has already been executed: ' + module );
+                               if ( registry[ module ].state !== 'loaded' ) {
+                                       throw new Error( 'Module in state "' + registry[ module ].state + '" may not be executed: ' + module );
                                }
 
-                               /**
-                                * Define loop-function here for efficiency
-                                * and to avoid re-using badly scoped variables.
-                                * @ignore
-                                */
-                               function addLink( media, url ) {
-                                       var el = document.createElement( 'link' );
-                                       // Support: IE
-                                       // Insert in document *before* setting href
-                                       getMarker().before( el );
-                                       el.rel = 'stylesheet';
-                                       if ( media && media !== 'all' ) {
-                                               el.media = media;
-                                       }
-                                       // If you end up here from an IE exception "SCRIPT: Invalid property value.",
-                                       // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
-                                       el.href = url;
-                               }
+                               registry[ module ].state = 'executing';
 
                                runScript = function () {
                                        var script, markModuleReady, nestedAddScript, legacyWait,
                                                                return;
                                                        }
 
-                                                       addScript( arr[ i ], function () {
+                                                       addScript( arr[ i ] ).always( function () {
                                                                nestedAddScript( arr, callback, i + 1 );
                                                        } );
                                                };
                                                                        $.globalEval( script );
                                                                        markModuleReady();
                                                                }
+                                                       } else {
+                                                               // Module without script
+                                                               markModuleReady();
                                                        }
                                                } );
                                        } catch ( e ) {
                                        }
                                };
 
-                               // This used to be inside runScript, but since that is now fired asychronously
-                               // (after CSS is loaded) we need to set it here right away. It is crucial that
-                               // when execute() is called this is set synchronously, otherwise modules will get
-                               // executed multiple times as the registry will state that it isn't loading yet.
-                               registry[ module ].state = 'loading';
-
                                // Add localizations to message system
                                if ( registry[ module ].messages ) {
                                        mw.messages.set( registry[ module ].messages );
                        /**
                         * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
                         * to a query string of the form foo.bar,baz|bar.baz,quux
+                        *
                         * @private
                         */
                        function buildModulesString( moduleMap ) {
 
                        /**
                         * Load modules from load.php
+                        *
                         * @private
                         * @param {Object} moduleMap Module map, see #buildModulesString
                         * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
                                                throw new Error( 'module already implemented: ' + module );
                                        }
                                        // Attach components
-                                       registry[ module ].script = script || [];
-                                       registry[ module ].style = style || {};
-                                       registry[ module ].messages = messages || {};
-                                       registry[ module ].templates = templates || {};
+                                       registry[ module ].script = script || null;
+                                       registry[ module ].style = style || null;
+                                       registry[ module ].messages = messages || null;
+                                       registry[ module ].templates = templates || null;
                                        // The module may already have been marked as erroneous
                                        if ( $.inArray( registry[ module ].state, [ 'error', 'missing' ] ) === -1 ) {
                                                registry[ module ].state = 'loaded';
 
                                        /**
                                         * Construct a JSON-serializable object representing the content of the store.
+                                        *
                                         * @return {Object} Module store contents.
                                         */
                                        toJSON: function () {
 
                                        /**
                                         * Get a key on which to vary the module cache.
+                                        *
                                         * @return {string} String of concatenated vary conditions.
                                         */
                                        getVary: function () {
 
                                /**
                                 * Wrapper object for raw HTML passed to mw.html.element().
+                                *
                                 * @class mw.html.Raw
                                 */
                                Raw: function ( value ) {
 
                                /**
                                 * Wrapper object for CDATA element contents passed to mw.html.element()
+                                *
                                 * @class mw.html.Cdata
                                 */
                                Cdata: function ( value ) {
                                return {
                                        /**
                                         * Register a hook handler
+                                        *
                                         * @param {Function...} handler Function to bind.
                                         * @chainable
                                         */
 
                                        /**
                                         * Unregister a hook handler
+                                        *
                                         * @param {Function...} handler Function to unbind.
                                         * @chainable
                                         */
 
                                        /**
                                         * Run a hook.
+                                        *
                                         * @param {Mixed...} data
                                         * @chainable
                                         */
                }
        }
 
-       // subscribe to error streams
+       // Subscribe to error streams
        mw.trackSubscribe( 'resourceloader.exception', log );
        mw.trackSubscribe( 'resourceloader.assert', log );
 
+       /**
+        * Fired when all modules associated with the page have finished loading.
+        *
+        * @event resourceloader_loadEnd
+        * @member mw.hook
+        */
+       $( function () {
+               var loading = $.grep( mw.loader.getModuleNames(), function ( module ) {
+                       return mw.loader.getState( module ) === 'loading';
+               } );
+               // In order to use jQuery.when (which stops early if one of the promises got rejected)
+               // cast any loading failures into successes. We only need a callback, not the module.
+               loading = $.map( loading, function ( module ) {
+                       return mw.loader.using( module ).then( null, function () {
+                               return $.Deferred().resolve();
+                       } );
+               } );
+               $.when.apply( $, loading ).then( function () {
+                       performance.mark( 'mwLoadEnd' );
+                       mw.hook( 'resourceloader.loadEnd' ).fire();
+               } );
+       } );
+
        // Attach to window and globally alias
        window.mw = window.mediaWiki = mw;
 }( jQuery ) );
index b5e8dae..f361ec8 100644 (file)
        /**
         * Initialisation.
         * Must only be called once, and not before the document is ready.
+        *
         * @ignore
         */
        function init() {
                /**
                 * Pause auto-hide timers for all notifications.
                 * Notifications will not auto-hide until resume is called.
+                *
                 * @see mw.Notification#pause
                 */
                pause: function () {
index 3c4f32e..6c7484e 100644 (file)
@@ -72,6 +72,7 @@
                /**
                 * Callback that's run when the user changes the search input text
                 * 'this' is the search input box (jQuery object)
+                *
                 * @ignore
                 */
                function onBeforeUpdate() {
@@ -88,6 +89,7 @@
                /**
                 * Callback that's run when suggestions have been updated either from the cache or the API
                 * 'this' is the search input box (jQuery object)
+                *
                 * @ignore
                 */
                function onAfterUpdate() {
index 2a3542c..50fd0b4 100644 (file)
                 * For index.php use `mw.config.get( 'wgScript' )`.
                 *
                 * @since 1.18
-                * @param str string Name of script (eg. 'api'), defaults to 'index'
-                * @return string Address to script (eg. '/w/api.php' )
+                * @param {string} str Name of script (e.g. 'api'), defaults to 'index'
+                * @return {string} Address to script (e.g. '/w/api.php' )
                 */
                wikiScript: function ( str ) {
                        str = str || 'index';
index aa8c9c8..fdd2579 100644 (file)
@@ -6934,6 +6934,23 @@ foo
 </tbody></table>
 !!end
 
+!! test
+Tables: Digest broken attributes on table and tr tag
+!! options
+parsoid=wt2html
+!! wikitext
+{| || |} ++
+|- || || ++ --
+|- > [
+|}
+!! html
+<table>
+<tbody>
+<tr></tr>
+<tr></tr>
+</tbody></table>
+!! end
+
 !! test
 Strip unsupported table tags
 !! options
@@ -13838,9 +13855,9 @@ bar
 bar</p>
 !! end
 
-## Edge case bug in Parsoid
+## Edge case bugs in Parsoid from T93580
 !! test
-T93580: Templated <ref> inside images
+T93580: 1. Templated <ref> inside block images
 !! wikitext
 [[File:Foobar.jpg|thumb|Caption with templated ref: {{echo|<ref>foo</ref>}}]]
 
@@ -13851,6 +13868,30 @@ T93580: Templated <ref> inside images
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
+!! test
+T93580: 2. <ref> inside inline images
+!! wikitext
+[[File:Foobar.jpg|Undisplayed caption in inline image with ref: <ref>foo</ref>]]
+
+<references />
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: &lt;ref>foo&lt;/ref>"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[64,78,5,6]}\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;mw-reference-text-cite_note-1&amp;quot;},&amp;quot;attrs&amp;quot;:{}}\">&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\">&lt;span class=\"mw-reflink-text\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=\"{&amp;quot;group&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;foo&amp;quot;,&amp;quot;hasRefInRef&amp;quot;:false,&amp;quot;dsr&amp;quot;:[64,78,5,6],&amp;quot;tmp&amp;quot;:{}}\" data-mw=\"{}\">"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+!! end
+
+!! test
+T93580: 3. Templated <ref> inside inline images
+!! wikitext
+[[File:Foobar.jpg|Undisplayed caption in inline image with ref: {{echo|<ref>{{echo|foo}}</ref>}}]]
+
+<references />
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|&lt;ref>{{echo|foo}}&lt;/ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion  mw:Extension/ref\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[64,96,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;&lt;ref>{{echo|foo}}&lt;/ref>&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\">&lt;span class=\"mw-reflink-text\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=\"{&amp;quot;group&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;foo&amp;quot;,&amp;quot;hasRefInRef&amp;quot;:false,&amp;quot;dsr&amp;quot;:[64,96,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;tmp&amp;quot;:{}}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;&lt;ref>{{echo|foo}}&lt;/ref>&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+!! end
+
 ###
 ### Subpages
 ###
@@ -21889,23 +21930,23 @@ Empty TR nodes should not be stripped if they have any attributes set
 !! test
 Headings: 0. Unnested
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<p>=foo=</p>
+
+<p> =foo=
+<!--cmt-->
+=foo=</p>
+
+<p>=foo<i>a</i>=</p>
 !! wikitext
 <nowiki>=foo=</nowiki>
 
-<nowiki> =foo= </nowiki>
+<nowiki> </nowiki>=foo=
 <!--cmt-->
 <nowiki>=foo=</nowiki>
 
 =foo''a''<nowiki>=</nowiki>
-!! html
-<p><span typeof="mw:Nowiki">=foo=</span></p>
-
-<p><span typeof="mw:Nowiki"> =foo= </span>
-<!--cmt-->
-<span typeof="mw:Nowiki">=foo=</span></p>
-
-<p>=foo<i>a</i><span typeof="mw:Nowiki">=</span></p>
 !!end
 
 # New headings and existing headings are handled differently
@@ -21962,15 +22003,26 @@ parsoid=html2wt
 !! test
 Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-parsoid=html2wt,wt2wt
-!! wikitext
-= ='''bold'''<nowiki>foo=</nowiki> =
+parsoid=html2wt
 !! html/parsoid
 <h1>=<b>bold</b>foo=</h1>
+!! wikitext
+= ='''bold'''<nowiki>foo=</nowiki> =
 !!end
 
 !! test
 Headings: 4a. No escaping needed (testing just h1 and h2)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<h1>=foo</h1>
+<h1>foo=</h1>
+<h1> =foo= </h1>
+<h1>=foo= bar</h1>
+<h2>=foo</h2>
+<h2>foo=</h2>
+<h1>=</h1>
+<h1><i>=</i>foo=</h1>
 !! wikitext
 = =foo =
 
@@ -21987,15 +22039,6 @@ Headings: 4a. No escaping needed (testing just h1 and h2)
 = = =
 
 = ''=''foo= =
-!! html/parsoid
-<h1>=foo</h1>
-<h1>foo=</h1>
-<h1> =foo= </h1>
-<h1>=foo= bar</h1>
-<h2>=foo</h2>
-<h2>foo=</h2>
-<h1>=</h1>
-<h1><i>=</i>foo=</h1>
 !!end
 
 !! test
@@ -22015,6 +22058,20 @@ parsoid=html2wt
 
 !! test
 Headings: 5. Empty headings
+!! options
+parsoid=html2wt
+!! html/parsoid
+<h1 data-parsoid='{}'></h1>
+
+<h2 data-parsoid='{}'></h2>
+
+<h3 data-parsoid='{}'></h3>
+
+<h4 data-parsoid='{}'></h4>
+
+<h5 data-parsoid='{}'></h5>
+
+<h6 data-parsoid='{}'></h6>
 !! wikitext
 =<nowiki/>=
 
@@ -22027,112 +22084,74 @@ Headings: 5. Empty headings
 =====<nowiki/>=====
 
 ======<nowiki/>======
-!! html/parsoid
-<h1 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h1>
-
-<h2 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h2>
-
-<h3 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h3>
-
-<h4 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h4>
-
-<h5 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h5>
-
-<h6 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h6>
 !!end
 
 !! test
 Headings: 6a. Heading chars in SOL context (with trailing spaces)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>=a=</p>
+
+<p>=a=</p> 
+
+<p>=a=</p>     
 !! wikitext
 <nowiki>=a=</nowiki>
 
 <nowiki>=a=</nowiki> 
 
 <nowiki>=a=</nowiki>   
-
-<nowiki>=a=</nowiki>   
-!! html/php
-<p>=a=
-</p><p>=a= 
-</p><p>=a=     
-</p><p>=a=     
-</p>
-!! html/parsoid
-<p><span typeof="mw:Nowiki">=a=</span></p>
-
-<p><span typeof="mw:Nowiki">=a=</span></p> 
-
-<p><span typeof="mw:Nowiki">=a=</span></p>     
-
-<p><span typeof="mw:Nowiki">=a=</span></p>     
 !!end
 
 !! test
 Headings: 6b. Heading chars in SOL context (with trailing newlines)
-!! wikitext
-<nowiki>=a=
-b</nowiki>
-
-<nowiki>=a= 
-b</nowiki>
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>=a=
+b</p>
 
-<nowiki>=a=    
-b</nowiki>
+<p>=a= 
+b</p>
 
-<nowiki>=a=     
-b</nowiki>
-!! html/php
-<p>=a=
-b
-</p><p>=a= 
-b
-</p><p>=a=     
-b
-</p><p>=a=      
+<p>=a= 
+b</p>
+!! wikitext
+<nowiki>=a=</nowiki>
 b
-</p>
-!! html/parsoid
-<p><span typeof="mw:Nowiki">=a=
-b</span></p>
 
-<p><span typeof="mw:Nowiki">=a= 
-b</span></p>
-
-<p><span typeof="mw:Nowiki">=a=        
-b</span></p>
+<nowiki>=a=</nowiki> 
+b
 
-<p><span typeof="mw:Nowiki">=a=         
-b</span></p>
+<nowiki>=a=</nowiki>   
+b
 !!end
 
 !! test
 Headings: 6c. Heading chars in SOL context (leading newline break)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>a
+=b=</p>
 !! wikitext
 a
 <nowiki>=b=</nowiki>
-!! html/php
-<p>a
-=b=
-</p>
-!! html/parsoid
-<p>a
-<span typeof="mw:Nowiki">=b=</span>
 !!end
 
 !! test
 Headings: 6d. Heading chars in SOL context (with interspersed comments)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<!--c0--><p>=a=</p>
+
+<!--c1--><p>=a=</p> <!--c2-->   <!--c3-->
 !! wikitext
 <!--c0--><nowiki>=a=</nowiki>
 
 <!--c1--><nowiki>=a=</nowiki> <!--c2-->         <!--c3-->
-!! html/php
-<p>=a=
-</p><p>=a=      
-</p>
-!! html/parsoid
-<!--c0--><p><span typeof="mw:Nowiki">=a=</span></p>
-
-<!--c1--><p><span typeof="mw:Nowiki">=a=</span></p> <!--c2-->   <!--c3-->
 !!end
 
 !! test
 
 !! test
 Lists: 0. Outside nests
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>*foo</p>
+
+<p>#foo</p>
+
+<p>;Foo:bar</p>
 !! wikitext
 <nowiki>*</nowiki>foo
 
 <nowiki>#</nowiki>foo
 
-<nowiki>;Foo:</nowiki>bar
-!! html/php
-<p>*foo
-</p><p>#foo
-</p><p>;Foo:bar
-</p>
-!! html/parsoid
-<p><span typeof="mw:Nowiki">*</span>foo</p>
-
-<p><span typeof="mw:Nowiki">#</span>foo</p>
-
-<p><span typeof="mw:Nowiki">;Foo:</span>bar</p>
+<nowiki>;</nowiki>Foo<nowiki>:</nowiki>bar
 !!end
 
 !! test
 Lists: 1. Nested inside html
+!! options
+parsoid=html2wt
+!! html/parsoid
+<ul><li>*foo</li></ul>
+<ul><li>#foo</li></ul>
+<ul><li>:foo</li></ul>
+<ul><li>;foo</li></ul>
+<ol><li>*foo</li></ol>
+<ol><li>#foo</li></ol>
+<ol><li>:foo</li></ol>
+<ol><li>;foo</li></ol>
+
 !! wikitext
 *<nowiki>*foo</nowiki>
 
@@ -22213,20 +22241,19 @@ Lists: 1. Nested inside html
 #<nowiki>:foo</nowiki>
 
 #<nowiki>;foo</nowiki>
-!! html
-<ul><li>*foo</li></ul>
-<ul><li>#foo</li></ul>
-<ul><li>:foo</li></ul>
-<ul><li>;foo</li></ul>
-<ol><li>*foo</li></ol>
-<ol><li>#foo</li></ol>
-<ol><li>:foo</li></ol>
-<ol><li>;foo</li></ol>
-
 !!end
 
 !! test
 Lists: 2. Inside definition lists
+!! options
+parsoid=html2wt
+!! html/parsoid
+<dl><dt>;foo</dt></dl>
+<dl><dt>:foo</dt></dl>
+<dl><dt>:foo</dt>
+<dd>bar</dd></dl>
+<dl><dd>:foo</dd></dl>
+
 !! wikitext
 ;<nowiki>;foo</nowiki>
 
@@ -22236,40 +22263,27 @@ Lists: 2. Inside definition lists
 :bar
 
 :<nowiki>:foo</nowiki>
-!! html
-<dl><dt>;foo</dt></dl>
-<dl><dt>:foo</dt></dl>
-<dl><dt>:foo</dt>
-<dd>bar</dd></dl>
-<dl><dd>:foo</dd></dl>
-
 !!end
 
 !! test
 Lists: 3. Only bullets at start of text should be escaped
+!! options
+parsoid=html2wt
+!! html/parsoid
+<ul><li>*foo*bar</li></ul>
+<ul><li>*foo<i>it</i>*bar</li></ul>
+
 !! wikitext
 *<nowiki>*foo*bar</nowiki>
 
 *<nowiki>*foo</nowiki>''it''*bar
-!! html
-<ul><li>*foo*bar</li></ul>
-<ul><li>*foo<i>it</i>*bar</li></ul>
-
 !!end
 
 !! test
 Lists: 4. No escapes needed
 !! options
-parsoid
-!! wikitext
-*foo*bar
-
-*''foo''*bar
-
-*[[Foo]]: bar
-
-*[[Foo]]*bar
-!! html
+parsoid=html2wt
+!! html/parsoid
 <ul>
 <li>foo*bar
 </li>
@@ -22286,10 +22300,29 @@ parsoid
 <li><a rel="mw:WikiLink" href="Foo" title="Foo">Foo</a>*bar
 </li>
 </ul>
+!! wikitext
+*foo*bar
+
+*''foo''*bar
+
+*[[Foo]]: bar
+
+*[[Foo]]*bar
 !!end
 
 !! test
 Lists: 5. No unnecessary escapes
+!! options
+parsoid=html2wt
+!! html/parsoid
+<ul><li> bar <span>[[foo]]</span></li></ul>
+<ul><li> =bar <span>[[foo]]</span></li></ul>
+<ul><li> [[bar <span>[[foo]]</span></li></ul>
+<ul><li> ]]bar <span>[[foo]]</span></li></ul>
+<ul><li> =bar <span>foo]]</span>=</li></ul>
+<ul><li> <s></s>: a</li></ul>
+<ul><li> <i>* foo</i></li></ul>
+
 !! wikitext
 * bar <span><nowiki>[[foo]]</nowiki></span>
 
@@ -22304,15 +22337,6 @@ Lists: 5. No unnecessary escapes
 * <s></s>: a
 
 * ''* foo''
-!! html
-<ul><li> bar <span>[[foo]]</span></li></ul>
-<ul><li> =bar <span>[[foo]]</span></li></ul>
-<ul><li> [[bar <span>[[foo]]</span></li></ul>
-<ul><li> ]]bar <span>[[foo]]</span></li></ul>
-<ul><li> =bar <span>foo]]</span>=</li></ul>
-<ul><li> <s></s>: a</li></ul>
-<ul><li> <i>* foo</i></li></ul>
-
 !!end
 
 !! test
@@ -22327,13 +22351,15 @@ parsoid=html2wt
 
 !! test
 Lists: 7. Escape bullets in a multi-line context
-!! wikitext
-a
-<nowiki>*</nowiki>b
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>a
 *b
 </p>
+!! wikitext
+a
+<nowiki>*</nowiki>b
 !!end
 
 !! test
@@ -22352,17 +22378,16 @@ parsoid=html2wt
 
 !! test
 HRs: 1. Single line
+!! options
+parsoid=html2wt
+!! html/parsoid
+<hr />----
+<hr />=foo=
+<hr />*foo
 !! wikitext
 ----<nowiki>----</nowiki>
 ----=foo=
 ----*foo
-!! html+tidy
-<hr />
-<p>----</p>
-<hr />
-<p>=foo=</p>
-<hr />
-<p>*foo</p>
 !! end
 
 #### --------------- Tables ---------------
@@ -22386,40 +22411,48 @@ HRs: 1. Single line
 
 !! test
 Tables: 1a. Simple example
-!! wikitext
-<nowiki>{|
-|}</nowiki>
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>{|
 |}
 </p>
+!! wikitext
+<nowiki>{|
+|}</nowiki>
 !! end
 
 !! test
 Tables: 1b. No escaping needed
-!! wikitext
-!foo
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>!foo
 </p>
+!! wikitext
+!foo
 !! end
 
 !! test
 Tables: 1c. No escaping needed
-!! wikitext
-|foo
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>|foo
 </p>
+!! wikitext
+|foo
 !! end
 
 !! test
 Tables: 1d. No escaping needed
-!! wikitext
-|}foo
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>|}foo
 </p>
+!! wikitext
+|}foo
 !! end
 
 !! test
@@ -22480,11 +22513,8 @@ parsoid=html2wt
 
 !! test
 Tables: 2c. Nested in td -- no escaping needed
-!! wikitext
-{|
-
-|foo!!bar
-|}
+!! options
+parsoid=html2wt
 !! html/*
 <table>
 
@@ -22492,15 +22522,17 @@ Tables: 2c. Nested in td -- no escaping needed
 <td>foo!!bar
 </td></tr></table>
 
-!! end
-
-!! test
-Tables: 3a. Nested in th
 !! wikitext
 {|
 
-!foo!bar
+|foo!!bar
 |}
+!! end
+
+!! test
+Tables: 3a. Nested in th
+!! options
+parsoid=html2wt
 !! html/*
 <table>
 
@@ -22508,6 +22540,11 @@ Tables: 3a. Nested in th
 <th>foo!bar
 </th></tr></table>
 
+!! wikitext
+{|
+
+!foo!bar
+|}
 !! end
 
 !! test
@@ -22616,6 +22653,19 @@ parsoid=html2wt
 
 !! test
 Tables: 4c. No escaping needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table><tbody>
+<tr><td>foo-bar</td><td>foo+bar</td></tr>
+<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
+<tr><td>foo
+<p>bar|baz
++bar
+-bar</p></td></tr>
+<tr><td>x
+<div>a|b</div></td>
+</tbody></table>
 !! wikitext
 {|
 |foo-bar
@@ -22656,21 +22706,18 @@ bar|baz
 <div>a|b</div>
 </td></tr></table>
 
-!! html/parsoid
-<table><tbody>
-<tr><td>foo-bar</td><td>foo+bar</td></tr>
-<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
-<tr><td>foo
-<p>bar|baz
-+bar
--bar</p></td></tr>
-<tr><td>x
-<div>a|b</div></td>
-</tbody></table>
 !! end
 
 !! test
 Tables: 4d. No escaping needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table>
+<tbody><tr><td><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>-bar</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>-2</td></tr>
+</tbody></table>
 !! wikitext
 {|
 |[[Foo]]-bar
@@ -22687,29 +22734,6 @@ Tables: 4d. No escaping needed
 <td>-2
 </td></tr></table>
 
-!! html/parsoid
-<table>
-<tbody><tr><td><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>-bar</td>
-<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
-<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>-2</td></tr>
-</tbody></table>
-!! end
-
-!! test
-Tables: Digest broken attributes on table and tr tag
-!! options
-parsoid=wt2html
-!! wikitext
-{| || |} ++
-|- || || ++ --
-|- > [
-|}
-!! html
-<table>
-<tbody>
-<tr></tr>
-<tr></tr>
-</tbody></table>
 !! end
 
 !! test
@@ -22726,6 +22750,13 @@ parsoid=html2wt
 
 !! test
 Unclosed xmlish element in table line shouldn't eat end delimiters
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table>
+<tbody><tr><td> &lt;foo</td>
+<td> bar></td></tr>
+</tbody></table>
 !! wikitext
 {|
 | <foo
@@ -22739,11 +22770,6 @@ Unclosed xmlish element in table line shouldn't eat end delimiters
 <td> bar&gt;
 </td></tr></table>
 
-!! html/parsoid
-<table>
-<tbody><tr><td> &lt;foo</td>
-<td> bar></td></tr>
-</tbody></table>
 !! end
 
 #### --------------- Links ----------------
@@ -22755,6 +22781,12 @@ Unclosed xmlish element in table line shouldn't eat end delimiters
 #### --------------------------------------
 !! test
 Links 1. WikiLinks: No escapes needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Foo" title="Foo">Foo<i>boo</i></a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">[Foobar]</a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">x [Foobar] x</a></p>
 !! wikitext
 [[Foo|Foo''boo'']]
 [[Foo|[Foobar]]]
@@ -22764,10 +22796,6 @@ Links 1. WikiLinks: No escapes needed
 <a href="/wiki/Foo" title="Foo">[Foobar]</a>
 <a href="/wiki/Foo" title="Foo">x [Foobar] x</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:WikiLink" href="Foo" title="Foo">Foo<i>boo</i></a>
-<a rel="mw:WikiLink" href="Foo" title="Foo">[Foobar]</a>
-<a rel="mw:WikiLink" href="Foo" title="Foo">x [Foobar] x</a></p>
 !! end
 
 !! test
@@ -22812,6 +22840,11 @@ parsoid=html2wt
 
 !! test
 Links 3. WikiLinks: No escapes needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Foo">[Foobar</a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">foo|bar</a></p>
 !! wikitext
 [[Foo|[Foobar]]
 [[Foo|foo|bar]]
@@ -22819,9 +22852,6 @@ Links 3. WikiLinks: No escapes needed
 <p><a href="/wiki/Foo" title="Foo">[Foobar</a>
 <a href="/wiki/Foo" title="Foo">foo|bar</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:WikiLink" href="Foo">[Foobar</a>
-<a rel="mw:WikiLink" href="Foo" title="Foo">foo|bar</a></p>
 !! end
 
 !! test
@@ -22851,17 +22881,21 @@ parsoid=html2wt
 
 !! test
 Links 5. ExtLinks: No escapes needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://google.com">[google</a></p>
 !! wikitext
 [http://google.com [google]
 !! html/php
 <p><a rel="nofollow" class="external text" href="http://google.com">[google</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:ExtLink" href="http://google.com">[google</a></p>
 !! end
 
 !! test
 Links 6. Add <nowiki/>s between text-nodes and url-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p>x<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>y
 <a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>?x
@@ -22895,6 +22929,8 @@ http://example.com(x<nowiki/>)
 
 !! test
 Links 7a. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p>x
 <a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>
 
 !! test
 Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>.,;:!?\
 -<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>:</p>
@@ -22942,6 +22980,8 @@ http://example.com.,;:!?\
 
 !! test
 Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>4
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y
@@ -22954,6 +22994,8 @@ X<nowiki/>RFC 123<nowiki/>y
 
 !! test
 Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>?foo
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>&amp;foo
@@ -22972,6 +23014,8 @@ RFC 123&foo
 
 !! test
 Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>4
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
@@ -22984,6 +23028,8 @@ X<nowiki/>PMID 123<nowiki/>y
 
 !! test
 Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>?foo
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>&foo
@@ -23002,6 +23048,8 @@ PMID 123&foo
 
 !! test
 Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>1
 <a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>x
@@ -23015,6 +23063,8 @@ a<nowiki/>ISBN 1234567890<nowiki/>b
 
 !! test
 Links 13. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p>-<a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>'s
 !! wikitext
@@ -23039,13 +23089,14 @@ parsoid=html2wt
 Links 15. Link trails can't become link prefixes.
 !! options
 language=is
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður" data-parsoid='{"stx":"simple","tail":"-"}'>Söfnuður-</a><a rel="mw:WikiLink" href="00" title="00">00</a></p>
 !! wikitext
 [[Söfnuður]]-[[00]]
 !! html/php
 <p><a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">Söfnuður-</a><a href="/wiki/00" title="00">00</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður" data-parsoid='{"stx":"simple","tail":"-"}'>Söfnuður-</a><a rel="mw:WikiLink" href="00" title="00">00</a></p>
 !! end
 
 #### --------------- Quotes ---------------
@@ -23057,28 +23108,7 @@ language=is
 !! test
 1a. Quotes inside <b> and <i>
 !! options
-parsoid=html2wt,wt2wt
-!! wikitext
-''<nowiki/>'foo'''
-''<nowiki>''foo''</nowiki>''
-''<nowiki>'''foo'''</nowiki>''
-''foo''<nowiki/>'s
-'''<nowiki/>'foo''''
-'''<nowiki>''foo''</nowiki>'''
-'''<nowiki>'''foo'''</nowiki>'''
-'''foo'<nowiki/>''bar'<nowiki/>''baz'''
-'''foo'''<nowiki/>'s
-'''foo''
-''foo''<nowiki/>'
-''foo'''<nowiki/>'
-'''foo''<nowiki/>'
-''''foo'''
-'''foo'''<nowiki/>'
-''''foo'''<nowiki/>'
-''fools'<span> errand</span>''
-''<span>fool</span>'s errand''
-'<nowiki/>''foo'' bar '''baz''
-a|!*#-:;+-~[]{}b'''x''
+parsoid=html2wt
 !! html/*
 <p><i>'foo'</i>
 <i>''foo''</i>
@@ -23101,22 +23131,34 @@ a|!*#-:;+-~[]{}b'''x''
 '<i>foo</i> bar '<i>baz</i>
 a|!*#-:;+-~[]{}b'<i>x</i>
 </p>
+!! wikitext
+''<nowiki/>'foo'''
+''<nowiki>''foo''</nowiki>''
+''<nowiki>'''foo'''</nowiki>''
+''foo''<nowiki/>'s
+'''<nowiki/>'foo''''
+'''<nowiki>''foo''</nowiki>'''
+'''<nowiki>'''foo'''</nowiki>'''
+'''foo'<nowiki/>''bar'<nowiki/>''baz'''
+'''foo'''<nowiki/>'s
+'''foo''
+''foo''<nowiki/>'
+''foo'''<nowiki/>'
+'''foo''<nowiki/>'
+''''foo'''
+'''foo'''<nowiki/>'
+''''foo'''<nowiki/>'
+''fools'<span> errand</span>''
+''<span>fool</span>'s errand''
+'<nowiki/>''foo'' bar '''baz''
+a|!*#-:;+-~[]{}b'''x''
 !! end
 
 !! test
 1b. Quotes inside <b> and <i> with other tags on same line
 !! options
-parsoid=html2wt,wt2wt
-!! wikitext
-'''a'' foo ''[[bar]]''
-''a''' foo ''[[bar]]''
-''a''' foo '''{{echo|[[bar]]}}'''
-[[foo]] x'''[[bar]]''
-'''foo'' <ref>test</ref>
-'''foo'' <div title="name">test</div>
-'''foo'' and <br> bar
-<references />
-!! html
+parsoid=html2wt
+!! html/parsoid
 '<i>a</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
 <i>a'</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
 <i>a'</i> foo <b><a rel="mw:WikiLink" href="Bar" title="Bar" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[bar]]"}},"i":0}}]}'>bar</a></b>
@@ -23127,45 +23169,58 @@ parsoid=html2wt,wt2wt
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">test</span></li>
 </ol>
+!! wikitext
+'''a'' foo ''[[bar]]''
+''a''' foo ''[[bar]]''
+''a''' foo '''{{echo|[[bar]]}}'''
+[[foo]] x'''[[bar]]''
+'''foo'' <ref>test</ref>
+'''foo'' <div title="name">test</div>
+'''foo'' and <br> bar
+<references />
 !! end
 
 !! test
 2. Link fragments separated by <i> and <b> tags
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>[[<i>foo</i>hello]]</p>
+<p>[[<b>foo</b>hello]]</p>
 !! wikitext
 [[''foo''<nowiki>hello]]</nowiki>
 
 [['''foo'''<nowiki>hello]]</nowiki>
-!! html
-<p>[[<i>foo</i>hello]]
-</p><p>[[<b>foo</b>hello]]
-</p>
 !! end
 
 # FIXME: Escaping one or both of [[ and ]] is also acceptable --
 #        this is one of the shortcomings of this format
 !! test
 3. Link fragments inside <i> and <b>
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><i>[[foo</i>]]</p>
+<p><b>[[foo</b>]]</p>
 !! wikitext
 ''[[foo''<nowiki>]]</nowiki>
 
 '''[[foo'''<nowiki>]]</nowiki>
-!! html
-<p><i>[[foo</i>]]
-</p><p><b>[[foo</b>]]
-</p>
 !! end
 
 !! test
 4. No escaping needed
-!! wikitext
-'<span>''bar''</span>'
-'<span>'''bar'''</span>'
-'a:b'foo
-!! html
+!! options
+options=html2wt
+!! html/parsoid
 <p>'<span><i>bar</i></span>'
 '<span><b>bar</b></span>'
 'a:b'foo
 </p>
+!! wikitext
+'<span>''bar''</span>'
+'<span>'''bar'''</span>'
+'a:b'foo
 !! end
 
 #### ----------- Paragraphs ---------------
@@ -23174,6 +23229,15 @@ parsoid=html2wt,wt2wt
 
 !! test
 1. No unnecessary escapes
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>bar <span>[[foo]]</span>
+</p><p>=bar <span>[[foo]]</span>
+</p><p>[[bar <span>[[foo]]</span>
+</p><p>]]bar <span>[[foo]]</span>
+</p><p>=bar <span>foo]]</span>=
+</p>
 !! wikitext
 bar <span><nowiki>[[foo]]</nowiki></span>
 
@@ -23184,13 +23248,6 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 ]]bar <span><nowiki>[[foo]]</nowiki></span>
 
 =bar <span>foo]]</span><nowiki>=</nowiki>
-!! html
-<p>bar <span>[[foo]]</span>
-</p><p>=bar <span>[[foo]]</span>
-</p><p>[[bar <span>[[foo]]</span>
-</p><p>]]bar <span>[[foo]]</span>
-</p><p>=bar <span>foo]]</span>=
-</p>
 !!end
 
 #### ----------------------- PRE --------------------------
@@ -23199,20 +23256,7 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 !! test
 1. Leading whitespace in SOL context should be escaped
 !! options
-parsoid=html2wt,wt2wt
-!! html/php
-<p> a
-</p><p>  a
-</p><p>        a(tab)
-</p><p>        a
-  a
-</p><p>a
- b
-</p><p>a
-       b
-</p><p>a
-        b
-</p>
+parsoid=html2wt
 !! html/parsoid
 <p> a</p>
 
 
 a
         b
+!! html/php
+<p> a
+</p><p>  a
+</p><p>        a(tab)
+</p><p>        a
+  a
+</p><p>a
+ b
+</p><p>a
+       b
+</p><p>a
+        b
+</p>
 !! end
 
 !! test
 2. Leading whitespace in non-indent-pre contexts should not be escaped
 !! options
-parsoid
-!! wikitext
-foo <ref>''a''
- b</ref>
-<references />
-!! html
+parsoid=htm2wt
+!! html/parsoid
 <p>foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i data-parsoid='{"dsr":[9,14,2,2]}'>a</i>
  b</span></li>
 </ol>
+!! wikitext
+foo <ref>''a''
+ b</ref>
+<references />
 !! end
 
 !! test
 3. Leading whitespace in indent-pre suppressing contexts should not be escaped
 !! options
-parsoid
-!! wikitext
+parsoid=html2wt
+!! html/parsoid
 <blockquote>
+<p>
  a
  <span>b</span>
- c
+ c</p>
 </blockquote>
-!! html
+!! wikitext
 <blockquote>
-<p>
  a
  <span>b</span>
- c</p>
+ c
 </blockquote>
 !! end
 
 !! test
 4. Leading whitespace in indent-pre suppressing contexts should not be escaped
 !! options
-parsoid
-!! wikitext
- [[File:Foobar.jpg|thumb|caption]]
+options=html2wt
 !! html/parsoid
  <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+!! wikitext
+ [[File:Foobar.jpg|thumb|caption]]
 !! end
 
 !! test
@@ -23311,15 +23368,15 @@ parsoid=html2wt
 !!test
 T95794: nowiki escaping should account for leading space at start-of-line in an indent-pre block
 !! options
-parsoid
-!! wikitext
- * foo
- * bar
-!! html
+parsoid=html2wt
+!! html/parsoid
 <pre>
 * foo
 * bar
 </pre>
+!! wikitext
+ * foo
+ * bar
 !! end
 
 #### --------------- Behavior Switches --------------------
@@ -23351,15 +23408,8 @@ __|__
 # We use indent-pre as an indirect way to test for sol-transparent behavior.
 !! test
 Behavior switches should be SOL-transparent
-!! wikitext
- __TOC__
-
- <!-- this one's bogus -->
- __TOO__
-
- __TOC__ foo
-
-__TOC__ bar
+!! options
+parsoid=html2wt
 !! html/parsoid
  <meta property="mw:PageProp/toc" />
 
@@ -23369,6 +23419,15 @@ __TOC__ bar
 <pre data-parsoid='{}'><meta property="mw:PageProp/toc" data-parsoid='{"src":"__TOC__","magicSrc":"__TOC__"}'/> foo</pre>
 
 <meta property="mw:PageProp/toc" data-parsoid='{"src":"__TOC__","magicSrc":"__TOC__"}'/><pre data-parsoid='{}'>bar</pre>
+!! wikitext
+ __TOC__
+
+ <!-- this one's bogus -->
+ __TOO__
+
+ __TOC__ foo
+
+__TOC__ bar
 !! end
 
 #### --------------- HTML tags ---------------
@@ -23380,75 +23439,85 @@ __TOC__ bar
 !! test
 1. a tags
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+&lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
 !! wikitext
 <a href="http://google.com">google</a>
-!! html
-&lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
 !! end
 
 !! test
 2. other tags
-!! wikitext
-* <nowiki><div>foo</div></nowiki>
-* <nowiki><div style="color:red">foo</div></nowiki>
-* <nowiki><td></nowiki>
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <ul><li> &lt;div&gt;foo&lt;/div&gt;</li>
 <li> &lt;div style=&quot;color:red&quot;&gt;foo&lt;/div&gt;</li>
 <li> &lt;td&gt;</li></ul>
 
+!! wikitext
+* <nowiki><div>foo</div></nowiki>
+* <nowiki><div style="color:red">foo</div></nowiki>
+* <nowiki><td></nowiki>
 !! end
 
 !! test
 3. multi-line html tag
-!! wikitext
-<nowiki><div
->foo</div
-></nowiki>
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>&lt;div
 &gt;foo&lt;/div
 &gt;
 </p>
+!! wikitext
+<nowiki><div
+>foo</div
+></nowiki>
 !! end
 
 !! test
 4. extension tags
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>&lt;ref&gt;foo&lt;/ref&gt;
+</p><p>&lt;ref&gt;bar
+</p><p>baz&lt;/ref&gt;
+</p>
 !! wikitext
 <nowiki><ref>foo</ref></nowiki>
 
 <nowiki><ref>bar</nowiki>
 
 baz<nowiki></ref></nowiki>
-!! html
-<p>&lt;ref&gt;foo&lt;/ref&gt;
-</p><p>&lt;ref&gt;bar
-</p><p>baz&lt;/ref&gt;
-</p>
 !! end
 
 #### --------------- Others ---------------
 !! test
 Escaping nowikis
-!! wikitext
-&lt;nowiki&gt;foo&lt;/nowiki&gt;
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>&lt;nowiki&gt;foo&lt;/nowiki&gt;
 </p>
+!! wikitext
+&lt;nowiki&gt;foo&lt;/nowiki&gt;
 !! end
 
 ## The quote-char in the input is necessary for triggering the bug
 !! test
 (Bug 52035) Nowiki-escaping should not get tripped by " :" in text
 !! options
-parsoid=wt2wt,html2wt
+parsoid=html2wt
+!! html/parsoid
+<p>foo's bar :</p>
 !! wikitext
 foo's bar :
-!! html
-<p>foo's bar :</p>
 !! end
 
+#----------- End of wikitext escaping tests --------------
+
 !! test
 
 Tag-like HTML structures are passed through as text
index 43d8ce8..ac214a2 100644 (file)
@@ -208,6 +208,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                DeferredUpdates::clearPendingUpdates();
 
+               ob_start( 'MediaWikiTestCase::wfResetOutputBuffersBarrier' );
        }
 
        protected function addTmpFiles( $files ) {
@@ -215,6 +216,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        protected function tearDown() {
+               $status = ob_get_status();
+               if ( isset( $status['name'] ) && $status['name'] === 'MediaWikiTestCase::wfResetOutputBuffersBarrier' ) {
+                       ob_end_flush();
+               }
+
                $this->called['tearDown'] = true;
                // Cleaning up temporary files
                foreach ( $this->tmpFiles as $fileName ) {
@@ -1174,4 +1180,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                self::assertFalse( self::tagMatch( $matcher, $actual, $isHtml ), $message );
        }
+
+       /**
+        * Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
+        * @return string
+        */
+       public static function wfResetOutputBuffersBarrier( $buffer ) {
+               return $buffer;
+       }
 }
index 99c7f64..a45cfbb 100644 (file)
@@ -1,20 +1,47 @@
 <?php
 
-class WellProtectedClass {
+class WellProtectedParentClass {
+       private $privateParentProperty;
+
+       public function __construct() {
+               $this->privateParentProperty = 9000;
+       }
+
+       private function incrementPrivateParentPropertyValue() {
+               $this->privateParentProperty++;
+       }
+
+       public function getPrivateParentProperty() {
+               return $this->privateParentProperty;
+       }
+}
+
+class WellProtectedClass extends WellProtectedParentClass {
        protected $property;
+       private $privateProperty;
 
        public function __construct() {
+               parent::__construct();
                $this->property = 1;
+               $this->privateProperty = 42;
        }
 
        protected function incrementPropertyValue() {
                $this->property++;
        }
 
+       private function incrementPrivatePropertyValue() {
+               $this->privateProperty++;
+       }
+
        public function getProperty() {
                return $this->property;
        }
 
+       public function getPrivateProperty() {
+               return $this->privateProperty;
+       }
+
        protected function whatSecondArg( $a, $b = false ) {
                return $b;
        }
index ee2b278..f0d905e 100644 (file)
@@ -259,6 +259,86 @@ class OutputPageTest extends MediaWikiTestCase {
                $actualHtml = implode( "\n", $links['html'] );
                $this->assertEquals( $expectedHtml, $actualHtml );
        }
+
+       /**
+        * @dataProvider provideVaryHeaders
+        * @covers OutputPage::addVaryHeader
+        * @covers OutputPage::getVaryHeader
+        * @covers OutputPage::getXVO
+        */
+       public function testVaryHeaders( $calls, $vary, $xvo ) {
+               // get rid of default Vary fields
+               $outputPage = $this->getMockBuilder( 'OutputPage' )
+                       ->setConstructorArgs( array( new RequestContext() ) )
+                       ->setMethods( array( 'getCacheVaryCookies' ) )
+                       ->getMock();
+               $outputPage->expects( $this->any() )
+                       ->method( 'getCacheVaryCookies' )
+                       ->will( $this->returnValue( array() ) );
+               TestingAccessWrapper::newFromObject( $outputPage )->mVaryHeader = array();
+
+               foreach ( $calls as $call ) {
+                       call_user_func_array( array( $outputPage, 'addVaryHeader' ), $call );
+               }
+               $this->assertEquals( $vary, $outputPage->getVaryHeader(), 'Vary:' );
+               $this->assertEquals( $xvo, $outputPage->getXVO(), 'X-Vary-Options:' );
+       }
+
+       public function provideVaryHeaders() {
+               // note: getXVO() automatically adds Vary: Cookie
+               return array(
+                       array( // single header
+                               array(
+                                       array( 'Cookie' ),
+                               ),
+                               'Vary: Cookie',
+                               'X-Vary-Options: Cookie',
+                       ),
+                       array( // non-unique headers
+                               array(
+                                       array( 'Cookie' ),
+                                       array( 'Accept-Language' ),
+                                       array( 'Cookie' ),
+                               ),
+                               'Vary: Cookie, Accept-Language',
+                               'X-Vary-Options: Cookie,Accept-Language',
+                       ),
+                       array( // two headers with single options
+                               array(
+                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
+                                       array( 'Accept-Language', array( 'string-contains=en' ) ),
+                               ),
+                               'Vary: Cookie, Accept-Language',
+                               'X-Vary-Options: Cookie;string-contains=phpsessid,Accept-Language;string-contains=en',
+                       ),
+                       array( // one header with multiple options
+                               array(
+                                       array( 'Cookie', array( 'string-contains=phpsessid', 'string-contains=userId' ) ),
+                               ),
+                               'Vary: Cookie',
+                               'X-Vary-Options: Cookie;string-contains=phpsessid;string-contains=userId',
+                       ),
+                       array( // Duplicate option
+                               array(
+                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
+                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
+                                       array( 'Accept-Language', array( 'string-contains=en', 'string-contains=en' ) ),
+
+
+                               ),
+                               'Vary: Cookie, Accept-Language',
+                               'X-Vary-Options: Cookie;string-contains=phpsessid,Accept-Language;string-contains=en',
+                       ),
+                       array( // Same header, different options
+                               array(
+                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
+                                       array( 'Cookie', array( 'string-contains=userId' ) ),
+                               ),
+                               'Vary: Cookie',
+                               'X-Vary-Options: Cookie;string-contains=phpsessid;string-contains=userId',
+                       ),
+               );
+       }
 }
 
 /**
index 84c0f9b..63d8971 100644 (file)
@@ -34,16 +34,42 @@ class TestingAccessWrapper {
                return $methodReflection->invokeArgs( $this->object, $args );
        }
 
-       public function __set( $name, $value ) {
+       /**
+        * ReflectionClass::getProperty() fails if the private property is defined
+        * in a parent class. This works more like ReflectionClass::getMethod().
+        */
+       private function getProperty( $name ) {
                $classReflection = new ReflectionClass( $this->object );
-               $propertyReflection = $classReflection->getProperty( $name );
+               try {
+                       return $classReflection->getProperty( $name );
+               } catch ( ReflectionException $ex ) {
+                       while ( true ) {
+                               $classReflection = $classReflection->getParentClass();
+                               if ( !$classReflection ) {
+                                       throw $ex;
+                               }
+                               try {
+                                       $propertyReflection = $classReflection->getProperty( $name );
+                               } catch ( ReflectionException $ex2 ) {
+                                       continue;
+                               }
+                               if ( $propertyReflection->isPrivate() ) {
+                                       return $propertyReflection;
+                               } else {
+                                       throw $ex;
+                               }
+                       }
+               }
+       }
+
+       public function __set( $name, $value ) {
+               $propertyReflection = $this->getProperty( $name );
                $propertyReflection->setAccessible( true );
                $propertyReflection->setValue( $this->object, $value );
        }
 
        public function __get( $name ) {
-               $classReflection = new ReflectionClass( $this->object );
-               $propertyReflection = $classReflection->getProperty( $name );
+               $propertyReflection = $this->getProperty( $name );
                $propertyReflection->setAccessible( true );
                return $propertyReflection->getValue( $this->object );
        }
index 7e5b91a..fc54afa 100644 (file)
@@ -14,18 +14,36 @@ class TestingAccessWrapperTest extends MediaWikiTestCase {
 
        function testGetProperty() {
                $this->assertSame( 1, $this->wrapped->property );
+               $this->assertSame( 42, $this->wrapped->privateProperty );
+               $this->assertSame( 9000, $this->wrapped->privateParentProperty );
        }
 
        function testSetProperty() {
                $this->wrapped->property = 10;
                $this->assertSame( 10, $this->wrapped->property );
                $this->assertSame( 10, $this->raw->getProperty() );
+
+               $this->wrapped->privateProperty = 11;
+               $this->assertSame( 11, $this->wrapped->privateProperty );
+               $this->assertSame( 11, $this->raw->getPrivateProperty() );
+
+               $this->wrapped->privateParentProperty = 12;
+               $this->assertSame( 12, $this->wrapped->privateParentProperty );
+               $this->assertSame( 12, $this->raw->getPrivateParentProperty() );
        }
 
        function testCallMethod() {
                $this->wrapped->incrementPropertyValue();
                $this->assertSame( 2, $this->wrapped->property );
                $this->assertSame( 2, $this->raw->getProperty() );
+
+               $this->wrapped->incrementPrivatePropertyValue();
+               $this->assertSame( 43, $this->wrapped->privateProperty );
+               $this->assertSame( 43, $this->raw->getPrivateProperty() );
+
+               $this->wrapped->incrementPrivateParentPropertyValue();
+               $this->assertSame( 9001, $this->wrapped->privateParentProperty );
+               $this->assertSame( 9001, $this->raw->getPrivateParentProperty() );
        }
 
        function testCallMethodTwoArgs() {
index affb0fa..cff2328 100644 (file)
@@ -181,6 +181,19 @@ class ApiResultTest extends MediaWikiTestCase {
                        );
                }
 
+               ApiResult::setValue( $arr, null, NAN, ApiResult::NO_VALIDATE );
+
+               try {
+                       ApiResult::setValue( $arr, null, NAN, ApiResult::NO_SIZE_CHECK );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
                $arr = array();
                $result2 = new ApiResult( 8388608 );
                $result2->addValue( null, 'foo', 'bar' );
@@ -408,6 +421,19 @@ class ApiResultTest extends MediaWikiTestCase {
                        );
                }
 
+               $result->addValue( null, null, NAN, ApiResult::NO_VALIDATE );
+
+               try {
+                       $result->addValue( null, null, NAN, ApiResult::NO_SIZE_CHECK );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
                $result->reset();
                $result->addParsedLimit( 'foo', 12 );
                $this->assertSame( array(
@@ -444,6 +470,12 @@ class ApiResultTest extends MediaWikiTestCase {
                $result->removeValue( null, 'foo' );
                $this->assertTrue( $result->addValue( null, 'foo', '1' ) );
 
+               $result = new ApiResult( 10 );
+               $obj = new ApiResultTestSerializableObject( 'ok' );
+               $obj->foobar = 'foobaz';
+               $this->assertTrue( $result->addValue( null, 'foo', $obj ) );
+               $this->assertSame( 2, $result->getSize() );
+
                $result = new ApiResult( 8388608 );
                $result2 = new ApiResult( 8388608 );
                $result2->addValue( null, 'foo', 'bar' );
index f12cf5b..6ee54d3 100644 (file)
@@ -48,10 +48,10 @@ class LineFormatterTest extends MediaWikiTestCase {
                        )
                );
                $out = $fixture->normalizeException( $boom );
-               $this->assertContains( '[Exception InvalidArgumentException]', $out );
-               $this->assertContains( ', [Exception LengthException]', $out );
-               $this->assertContains( ', [Exception LogicException]', $out );
-               $this->assertNotContains( '[stacktrace]', $out );
+               $this->assertContains( "\n[Exception InvalidArgumentException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LengthException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LogicException]", $out );
+               $this->assertNotContains( "\n  #0", $out );
        }
 
        /**
@@ -67,9 +67,9 @@ class LineFormatterTest extends MediaWikiTestCase {
                        )
                );
                $out = $fixture->normalizeException( $boom );
-               $this->assertContains( '[Exception InvalidArgumentException', $out );
-               $this->assertContains( ', [Exception LengthException]', $out );
-               $this->assertContains( ', [Exception LogicException]', $out );
-               $this->assertContains( '[stacktrace]', $out );
+               $this->assertContains( "\n[Exception InvalidArgumentException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LengthException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LogicException]", $out );
+               $this->assertContains( "\n  #0", $out );
        }
 }
index df891f5..96ae3be 100644 (file)
@@ -91,7 +91,7 @@ class MediaWikiParserTest {
                        // enough to cause there to be separate names for different
                        // things, which is good enough for our purposes.
                        $extensionName = basename( dirname( $fileName ) );
-                       $testsName = $extensionName . '' . basename( $fileName, '.txt' );
+                       $testsName = $extensionName . '__' . basename( $fileName, '.txt' );
                        $escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
                        $parserTestClassName = ucfirst( $testsName );
                        // Official spec for class names: http://php.net/manual/en/language.oop5.basic.php
index fb4667a..01f9625 100644 (file)
@@ -8,7 +8,7 @@
        /**
         * Add bogus to url to prevent IE crazy caching
         *
-        * @param value {String} a relative path (eg. 'data/foo.js'
+        * @param {String} value a relative path (eg. 'data/foo.js'
         * or 'data/test.php?foo=bar').
         * @return {String} Such as 'data/foo.js?131031765087663960'
         */
        /**
         * Reset mw.config and others to a fresh copy of the live config for each test(),
         * and restore it back to the live one afterwards.
-        * @param localEnv {Object} [optional]
+        *
+        * @param {Object} [localEnv]
         * @example (see test suite at the bottom of this file)
         * </code>
         */
index bd622d9..cf34fc1 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
                messages: {
-                       'brackets': '[$1]',
+                       brackets: '[$1]',
                        'word-separator': ' '
                }
        } ) );
index 906369e..8c62876 100644 (file)
@@ -6,6 +6,22 @@
                assert.equal( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
        } );
 
+       QUnit.test( 'bracketedDevicePixelRatio', 1, function ( assert ) {
+               var devicePixelRatio = $.devicePixelRatio();
+               assert.equal( typeof devicePixelRatio, 'number', '$.bracketedDevicePixelRatio() returns a number' );
+       } );
+
+       QUnit.test( 'bracketDevicePixelRatio', 8, function ( assert ) {
+               assert.equal( $.bracketDevicePixelRatio( 0.75 ), 1, '0.75 gives 1' );
+               assert.equal( $.bracketDevicePixelRatio( 1 ), 1, '1 gives 1' );
+               assert.equal( $.bracketDevicePixelRatio( 1.25 ), 1.5, '1.25 gives 1.5' );
+               assert.equal( $.bracketDevicePixelRatio( 1.5 ), 1.5, '1.5 gives 1.5' );
+               assert.equal( $.bracketDevicePixelRatio( 1.75 ), 2, '1.75 gives 2' );
+               assert.equal( $.bracketDevicePixelRatio( 2 ), 2, '2 gives 2' );
+               assert.equal( $.bracketDevicePixelRatio( 2.5 ), 2, '2.5 gives 2' );
+               assert.equal( $.bracketDevicePixelRatio( 3 ), 2, '3 gives 2' );
+       } );
+
        QUnit.test( 'matchSrcSet', 6, function ( assert ) {
                var srcset = 'onefive.png 1.5x, two.png 2x';
 
index 786b9f6..c503fc9 100644 (file)
@@ -76,8 +76,8 @@
                html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
                $lc = $( html ).localize( {
                        keys: {
-                               'title': 'foo-' + x + '-title',
-                               'label': 'foo-' + x + '-label'
+                               title: 'foo-' + x + '-title',
+                               label: 'foo-' + x + '-label'
                        }
                } ).find( 'span' );
 
                $lc = $( html ).localize( {
                        prefix: 'foo-',
                        keys: {
-                               'title': x + '-title',
-                               'label': x + '-label'
+                               title: x + '-title',
+                               label: x + '-label'
                        },
                        params: {
-                               'title': [ sitename, '3 minutes ago' ],
-                               'label': [ sitename, '3 minutes ago' ]
+                               title: [ sitename, '3 minutes ago' ],
+                               label: [ sitename, '3 minutes ago' ]
 
                        }
                } ).find( 'span' );
index c0da824..032551d 100644 (file)
                setup: function () {
                        this.liveMonths = mw.language.months;
                        mw.language.months = {
-                               'keys': {
-                                       'names': [ 'january', 'february', 'march', 'april', 'may_long', 'june',
+                               keys: {
+                                       names: [ 'january', 'february', 'march', 'april', 'may_long', 'june',
                                                'july', 'august', 'september', 'october', 'november', 'december' ],
-                                       'genitive': [ 'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
+                                       genitive: [ 'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
                                                'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen' ],
-                                       'abbrev': [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
+                                       abbrev: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
                                                'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
-                               'names': [ 'January', 'February', 'March', 'April', 'May', 'June',
+                               names: [ 'January', 'February', 'March', 'April', 'May', 'June',
                                                'July', 'August', 'September', 'October', 'November', 'December' ],
-                               'genitive': [ 'January', 'February', 'March', 'April', 'May', 'June',
+                               genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
                                                'July', 'August', 'September', 'October', 'November', 'December' ],
-                               'abbrev': [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+                               abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                                                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
        ];
        parserTest( 'MDY Dates using dmy content language', 'date', simpleMDYDatesInDMY, function () {
                mw.config.set( {
-                       'wgDefaultDateFormat': 'dmy',
-                       'wgPageContentLanguage': 'de'
+                       wgDefaultDateFormat: 'dmy',
+                       wgPageContentLanguage: 'de'
                } );
        } );
 
index e9ae8c0..759322a 100644 (file)
                setup: function () {
                        this.liveMonths = mw.language.months;
                        mw.language.months = {
-                               'keys': {
-                                       'names': [ 'january', 'february', 'march', 'april', 'may_long', 'june',
+                               keys: {
+                                       names: [ 'january', 'february', 'march', 'april', 'may_long', 'june',
                                                'july', 'august', 'september', 'october', 'november', 'december' ],
-                                       'genitive': [ 'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
+                                       genitive: [ 'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
                                                'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen' ],
-                                       'abbrev': [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
+                                       abbrev: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
                                                'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
-                               'names': [ 'January', 'February', 'March', 'April', 'May', 'June',
+                               names: [ 'January', 'February', 'March', 'April', 'May', 'June',
                                                'July', 'August', 'September', 'October', 'November', 'December' ],
-                               'genitive': [ 'January', 'February', 'March', 'April', 'May', 'June',
+                               genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
                                                'July', 'August', 'September', 'October', 'November', 'December' ],
-                               'abbrev': [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+                               abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                                                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
         *
         * @param {String[]} header
         * @param {String[][]} data
-        * @return jQuery
+        * @return {jQuery}
         */
        function tableCreate( header, data ) {
                var i,
         * Extract text from table.
         *
         * @param {jQuery} $table
-        * @return String[][]
+        * @return {String[][]}
         */
        function tableExtract( $table ) {
                var data = [];
                umlautWordsSorted,
                function ( $table ) {
                        mw.config.set( 'tableSorterCollation', {
-                               'ä': 'ae',
-                               'ö': 'oe',
-                               'ß': 'ss',
-                               'ü': 'ue'
+                               ä: 'ae',
+                               ö: 'oe',
+                               ß: 'ss',
+                               ü: 'ue'
                        } );
 
                        $table.tablesorter();
index ad229ac..2e6f05e 100644 (file)
@@ -5,13 +5,13 @@
        /**
         * Test factory for $.fn.textSelection( 'encapsulateText' )
         *
-        * @param options {object} associative array containing:
-        *   description {string}
-        *   input {string}
-        *   output {string}
-        *   start {int} starting char for selection
-        *   end {int} ending char for selection
-        *   params {object} add'l parameters for $().textSelection( 'encapsulateText' )
+        * @param {Object} options Associative configuration array
+        * @param {string} options.description Description
+        * @param {string} options.input Input
+        * @param {string} options.output Output
+        * @param {int} options.start Starting char for selection
+        * @param {int} options.end Ending char for selection
+        * @param {object} options.params Additional parameters for $().textSelection( 'encapsulateText' )
         */
        function encapsulateTest( options ) {
                var opt = $.extend( {
index 225b5f1..d5425a1 100644 (file)
                                // testing custom / localized namespace
                                100: 'Penguins'
                        },
+                       // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
                        wgNamespaceIds: {
-                               'media': -2,
-                               'special': -1,
+                               media: -2,
+                               special: -1,
                                '': 0,
-                               'talk': 1,
-                               'user': 2,
-                               'user_talk': 3,
-                               'wikipedia': 4,
-                               'wikipedia_talk': 5,
-                               'file': 6,
-                               'file_talk': 7,
-                               'mediawiki': 8,
-                               'mediawiki_talk': 9,
-                               'template': 10,
-                               'template_talk': 11,
-                               'help': 12,
-                               'help_talk': 13,
-                               'category': 14,
-                               'category_talk': 15,
-                               'image': 6,
-                               'image_talk': 7,
-                               'project': 4,
-                               'project_talk': 5,
+                               talk: 1,
+                               user: 2,
+                               user_talk: 3,
+                               wikipedia: 4,
+                               wikipedia_talk: 5,
+                               file: 6,
+                               file_talk: 7,
+                               mediawiki: 8,
+                               mediawiki_talk: 9,
+                               template: 10,
+                               template_talk: 11,
+                               help: 12,
+                               help_talk: 13,
+                               category: 14,
+                               category_talk: 15,
+                               image: 6,
+                               image_talk: 7,
+                               project: 4,
+                               project_talk: 5,
                                // Testing custom namespaces and aliases
-                               'penguins': 100,
-                               'antarctic_waterfowl': 100
+                               penguins: 100,
+                               antarctic_waterfowl: 100
                        },
+                       // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
                        wgCaseSensitiveNamespaces: []
                }
        } ) );
index aa66907..51374bd 100644 (file)
 
                assert.deepEqual(
                        original.query,
-                       { 'one': '1', 'two': '2' },
+                       { one: '1', two: '2' },
                        'Properties is deep cloned (bug 37708)'
                );
        } );
                                host: 'example.com',
                                port: undefined,
                                path: '/wiki/Foo',
-                               query: { 'v': '2' },
+                               query: { v: '2' },
                                fragment: undefined
                        },
                        'basic object properties'
index a105022..e7f4517 100644 (file)
@@ -95,7 +95,6 @@
         * @param {Function[]} tasks List of functions that perform tasks
         *  that may be asynchronous. Invoke the callback parameter when done.
         * @param {Function} complete Called when all tasks are done, or when the sequence is aborted.
-        * @return
         */
        function process( tasks, complete ) {
                /*jshint latedef:false */
                        'curly-brace': '{{int:message}}',
                        'single-square-bracket': '[https://www.mediawiki.org/ MediaWiki]',
                        'double-square-bracket': '[[Some page]]',
-                       'regular': 'Other message'
+                       regular: 'Other message'
                } );
 
                oldGMF = mw.jqueryMsg.getMessageFunction;
index 6615bfa..399290c 100644 (file)
@@ -11,7 +11,7 @@
                },
                messages: {
                        // mw.language.listToText test
-                       'and': ' and',
+                       and: ' and',
                        'comma-separator': ', ',
                        'word-separator': ' '
                }
index fd3f990..86c2eb8 100644 (file)
 
                // Multiple values at once
                someValues = {
-                       'foo': 'bar',
-                       'lorem': 'ipsum',
-                       'MediaWiki': true
+                       foo: 'bar',
+                       lorem: 'ipsum',
+                       MediaWiki: true
                };
                assert.strictEqual( conf.set( someValues ), true, 'Map.set returns boolean true if multiple values were set by passing an object' );
                assert.deepEqual( conf.get( [ 'foo', 'lorem' ] ), {
-                       'foo': 'bar',
-                       'lorem': 'ipsum'
+                       foo: 'bar',
+                       lorem: 'ipsum'
                }, 'Map.get returns multiple values correctly as an object' );
 
                assert.deepEqual( conf, new mw.Map( conf.values ), 'new mw.Map maps over existing values-bearing object' );
 
                assert.deepEqual( conf.get( [ 'foo', 'notExist' ] ), {
-                       'foo': 'bar',
-                       'notExist': null
+                       foo: 'bar',
+                       notExist: null
                }, 'Map.get return includes keys that were not found as null values' );
 
                // Interacting with globals and accessing the values object
         * The sync style load test (for @import). This is, in a way, also an open bug for
         * ResourceLoader ("execute js after styles are loaded"), but browsers don't offer a
         * way to get a callback from when a stylesheet is loaded (that is, including any
-        * @import rules inside). To work around this, we'll have a little time loop to check
+        * `@import` rules inside). To work around this, we'll have a little time loop to check
         * if the styles apply.
+        *
         * Note: This test originally used new Image() and onerror to get a callback
         * when the url is loaded, but that is fragile since it doesn't monitor the
         * same request as the css @import, and Safari 4 has issues with
                                QUnit.start();
                        },
                        {
-                               'all': '.mw-test-implement-a { float: right; }'
+                               all: '.mw-test-implement-a { float: right; }'
                        }
                );
 
                                } );
                        },
                        {
-                               'url': {
-                                       'print': [ urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' ) ],
-                                       'screen': [
+                               url: {
+                                       print: [ urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' ) ],
+                                       screen: [
                                                // bug 40834: Make sure it actually works with more than 1 stylesheet reference
                                                urlStyleTest( '.mw-test-implement-b2', 'float', 'left' ),
                                                urlStyleTest( '.mw-test-implement-b3', 'float', 'right' )
                                QUnit.start();
                        },
                        {
-                               'all': '.mw-test-implement-c { float: right; }'
+                               all: '.mw-test-implement-c { float: right; }'
                        }
                );
 
                                } );
                        },
                        {
-                               'all': [ urlStyleTest( '.mw-test-implement-d', 'float', 'right' ) ],
-                               'print': [ urlStyleTest( '.mw-test-implement-d2', 'text-align', 'center' ) ]
+                               all: [ urlStyleTest( '.mw-test-implement-d', 'float', 'right' ) ],
+                               print: [ urlStyleTest( '.mw-test-implement-d2', 'text-align', 'center' ) ]
                        }
                );
 
                                assert.strictEqual( isJsExecuted, undefined, 'script not executed multiple times' );
                                isJsExecuted = true;
 
-                               assert.equal( mw.loader.getState( 'test.implement.import' ), 'loading', 'module state during implement() script execution' );
+                               assert.equal( mw.loader.getState( 'test.implement.import' ), 'executing', 'module state during implement() script execution' );
 
                                $element = $( '<div class="mw-test-implement-import">Foo bar</div>' ).appendTo( '#qunit-fixture' );
 
                                } );
                        },
                        {
-                               'css': [
+                               css: [
                                        '@import url(\''
                                                + urlStyleTest( '.mw-test-implement-import', 'float', 'right' )
                                                + '\');\n'
                                QUnit.start();
                        },
                        {
-                               'all': '.mw-test-implement-e { float: right; }'
+                               all: '.mw-test-implement-e { float: right; }'
                        }
                );
 
                                );
                        },
                        {
-                               'all': '.mw-test-implement-e2 { float: left; }'
+                               all: '.mw-test-implement-e2 { float: left; }'
                        }
                );
 
        QUnit.asyncTest( 'mw.loader.implement( only messages )', 2, function ( assert ) {
                assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
 
-               mw.loader.implement( 'test.implement.msgs', [], {}, { 'bug_29107': 'loaded' } );
+               // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
+               mw.loader.implement( 'test.implement.msgs', [], {}, { bug_29107: 'loaded' } );
+               // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
                mw.loader.using( 'test.implement.msgs', function () {
                        QUnit.start();
                        assert.ok( mw.messages.exists( 'bug_29107' ), 'Bug 29107: messages-only module should implement ok' );
index 450f0f5..c1f1484 100644 (file)
@@ -83,7 +83,7 @@
                },
                messages: {
                        // Used by accessKeyLabel in test for addPortletLink
-                       'brackets': '[$1]',
+                       brackets: '[$1]',
                        'word-separator': ' '
                }
        } ) );
 
        QUnit.test( 'wikiScript', 4, function ( assert ) {
                mw.config.set( {
-                       'wgScript': '/w/i.php', // customized wgScript for bug 39103
-                       'wgLoadScript': '/w/l.php', // customized wgLoadScript for bug 39103
-                       'wgScriptPath': '/w',
-                       'wgScriptExtension': '.php'
+                       wgScript: '/w/i.php', // customized wgScript for bug 39103
+                       wgLoadScript: '/w/l.php', // customized wgLoadScript for bug 39103
+                       wgScriptPath: '/w',
+                       wgScriptExtension: '.php'
                } );
 
                assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ),
                url = 'http://example.org/#&foo=bad';
                assert.strictEqual( mw.util.getParamValue( 'foo', url ), null, 'Ignore hash if param is not in querystring but in hash (bug 27427)' );
 
-               url = 'example.org?' + $.param( { 'TEST': 'a b+c' } );
+               url = 'example.org?' + $.param( { TEST: 'a b+c' } );
                assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c', 'Bug 30441: getParamValue must understand "+" encoding of space' );
 
-               url = 'example.org?' + $.param( { 'TEST': 'a b+c d' } ); // check for sloppy code from r95332 :)
+               url = 'example.org?' + $.param( { TEST: 'a b+c d' } ); // check for sloppy code from r95332 :)
                assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
        } );