Merge "ApiQueryDeletedRevisions: Optimize ascending title generation"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 9 Sep 2015 23:59:50 +0000 (23:59 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 9 Sep 2015 23:59:50 +0000 (23:59 +0000)
305 files changed:
.jscsrc
.travis.yml
Gruntfile.js
RELEASE-NOTES-1.26
composer.json
includes/GlobalFunctions.php
includes/Hooks.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/Linker.php
includes/OutputPage.php
includes/User.php
includes/ZhConversion.php
includes/api/ApiFormatRaw.php
includes/api/ApiQueryAllDeletedRevisions.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/lb.json
includes/api/i18n/mr.json [new file with mode: 0644]
includes/api/i18n/pt-br.json
includes/api/i18n/qqq.json
includes/api/i18n/sq.json
includes/api/i18n/zh-hans.json
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/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/aln.json
languages/i18n/an.json
languages/i18n/ar.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/en.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/he.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/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/uz.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
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
mw-config/config.js
package.json
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.accessKeyLabel.js
resources/src/jquery/jquery.autoEllipsis.js
resources/src/jquery/jquery.byteLimit.js
resources/src/jquery/jquery.color.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.farbtastic.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.localize.js
resources/src/jquery/jquery.mwExtension.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.collapsibleFooter.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.js
resources/src/mediawiki.api/mediawiki.api.login.js
resources/src/mediawiki.api/mediawiki.api.options.js
resources/src/mediawiki.api/mediawiki.api.parse.js
resources/src/mediawiki.api/mediawiki.api.upload.js
resources/src/mediawiki.api/mediawiki.api.watch.js
resources/src/mediawiki.language/languages/bs.js
resources/src/mediawiki.language/languages/dsb.js
resources/src/mediawiki.language/languages/fi.js
resources/src/mediawiki.language/languages/ga.js
resources/src/mediawiki.language/languages/he.js
resources/src/mediawiki.language/languages/hsb.js
resources/src/mediawiki.language/languages/hu.js
resources/src/mediawiki.language/languages/hy.js
resources/src/mediawiki.language/languages/la.js
resources/src/mediawiki.language/languages/os.js
resources/src/mediawiki.language/languages/ru.js
resources/src/mediawiki.language/languages/sl.js
resources/src/mediawiki.language/languages/uk.js
resources/src/mediawiki.language/mediawiki.cldr.js
resources/src/mediawiki.language/mediawiki.language.init.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.legacy/wikibits.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.page/mediawiki.page.gallery.js
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.page/mediawiki.page.watch.ajax.js
resources/src/mediawiki.special/mediawiki.special.changeemail.js
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.search.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js [deleted file]
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.toolbar/toolbar.js
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.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js
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.Title.js
resources/src/mediawiki/mediawiki.Upload.Dialog.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.Uri.js
resources/src/mediawiki/mediawiki.confirmCloseWindow.js
resources/src/mediawiki/mediawiki.debug.js
resources/src/mediawiki/mediawiki.errorLogger.js
resources/src/mediawiki/mediawiki.experiments.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.template.js
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.userSuggest.js
resources/src/mediawiki/mediawiki.util.js
resources/src/startup.js
tests/parser/parserTests.txt
tests/phpunit/data/helpers/WellProtectedClass.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/LinkerTest.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.autoEllipsis.test.js
tests/qunit/suites/resources/jquery/jquery.color.test.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.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.mwExtension.test.js
tests/qunit/suites/resources/jquery/jquery.placeholder.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.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.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.cldr.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.errorLogger.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.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 6a3c564..aaa876c 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -1,9 +1,16 @@
 {
        "preset": "wikimedia",
+       "es3": true,
 
-       "disallowQuotedKeysInObjects": null,
-       "requireSpacesInsideParentheses": null,
-       "requireSpacesInsideArrayBrackets": null,
+       "requireVarDeclFirst": 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 e1e5e4a..035a208 100644 (file)
@@ -12,7 +12,7 @@ module.exports = function ( grunt ) {
                wgScriptPath = process.env.MW_SCRIPT_PATH,
                karmaProxy = {};
 
-       karmaProxy[wgScriptPath] = wgServer + wgScriptPath;
+       karmaProxy[ wgScriptPath ] = wgServer + wgScriptPath;
 
        grunt.initConfig( {
                jshint: {
@@ -87,14 +87,14 @@ module.exports = function ( grunt ) {
                }
                if ( !process.env.MW_SCRIPT_PATH ) {
                        grunt.log.error( 'Environment variable MW_SCRIPT_PATH must be set.\n' +
-                               'Set this like $wgScriptPath, e.g. "/w"');
+                               'Set this like $wgScriptPath, e.g. "/w"' );
                }
                return !!( process.env.MW_SERVER && process.env.MW_SCRIPT_PATH );
        } );
 
-       grunt.registerTask( 'lint', ['jshint', 'jscs', 'jsonlint', 'banana'] );
+       grunt.registerTask( 'lint', [ 'jshint', 'jscs', 'jsonlint', 'banana' ] );
        grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );
 
-       grunt.registerTask( 'test', ['lint'] );
+       grunt.registerTask( 'test', [ 'lint' ] );
        grunt.registerTask( 'default', 'test' );
 };
index ff7f884..a532171 100644 (file)
@@ -170,6 +170,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..68e1635 100644 (file)
@@ -404,14 +404,15 @@ function wfRandomString( $length = 32 ) {
  * RFC 1738 says ~ is unsafe, however RFC 3986 considers it an unreserved
  * character which should not be encoded. More importantly, google chrome
  * always converts %7E back to ~, and converting it in this function can
- * cause a redirect loop (T105265).
+ * cause a redirect loop (T105265). Similarly, encoding ' causes a
+ * redirect loop on Opera 12 (T106793).
  *
  * But + is not safe because it's used to indicate a space; &= are only safe in
- * paths and not in queries (and we don't distinguish here); ' seems kind of
- * scary; and urlencode() doesn't touch -_. to begin with.  Plus, although /
+ * paths and not in queries (and we don't distinguish here);
+ * and urlencode() doesn't touch -_. to begin with.  Plus, although /
  * is reserved, we don't care.  So the list we unescape is:
  *
- * ;:@$!*(),/~
+ * ;:@$!*'(),/~
  *
  * However, IIS7 redirects fail when the url contains a colon (Bug 22709),
  * so no fancy : for IIS7.
@@ -430,7 +431,7 @@ function wfUrlencode( $s ) {
        }
 
        if ( is_null( $needle ) ) {
-               $needle = array( '%3B', '%40', '%24', '%21', '%2A', '%28', '%29', '%2C', '%2F', '%7E' );
+               $needle = array( '%3B', '%40', '%24', '%21', '%2A', '%27', '%28', '%29', '%2C', '%2F', '%7E' );
                if ( !isset( $_SERVER['SERVER_SOFTWARE'] ) ||
                        ( strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/7' ) === false )
                ) {
@@ -441,7 +442,7 @@ function wfUrlencode( $s ) {
        $s = urlencode( $s );
        $s = str_ireplace(
                $needle,
-               array( ';', '@', '$', '!', '*', '(', ')', ',', '/', '~', ':' ),
+               array( ';', '@', '$', '!', '*', '\'', '(', ')', ',', '/', '~', ':' ),
                $s
        );
 
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..24c0dfc 100644 (file)
@@ -865,6 +865,50 @@ 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;
+       }
+
        public function execute() {
 
                parent::execute();
@@ -926,13 +970,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 );
 
index d6a4056..4d3f3ce 100644 (file)
@@ -939,7 +939,10 @@ class Linker {
 
                        $href = self::getUploadUrl( $title, $query );
 
-                       return '<a href="' . htmlspecialchars( $href ) . '" class="new" title="' .
+                       // @todo FIXME: If we don't to escape apostrophes (single quotes) here (using ENT_QUOTES),
+                       // then double apostrophes will be parsed as italics somewhere later in the parser,
+                       // and break everything horribly
+                       return '<a href="' . htmlspecialchars( $href, ENT_QUOTES ) . '" class="new" title="' .
                                htmlspecialchars( $title->getPrefixedText(), ENT_QUOTES ) . '">' .
                                $encLabel . '</a>';
                }
index 073762a..75dbd4c 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,9 +2009,11 @@ 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 ) {
                if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
index 9b958f4..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;
        }
 
@@ -3208,10 +3213,10 @@ class User implements IDBAccessObject {
        /**
         * Check if user is allowed to access a feature / make an action
         *
-        * @param string $permissions,... Permissions to test
+        * @param string ... Permissions to test
         * @return bool True if user is allowed to perform *any* of the given actions
         */
-       public function isAllowedAny( /*...*/ ) {
+       public function isAllowedAny() {
                $permissions = func_get_args();
                foreach ( $permissions as $permission ) {
                        if ( $this->isAllowed( $permission ) ) {
@@ -3223,10 +3228,10 @@ class User implements IDBAccessObject {
 
        /**
         *
-        * @param string $permissions,... Permissions to test
+        * @param string ... Permissions to test
         * @return bool True if the user is allowed to perform *all* of the given actions
         */
-       public function isAllowedAll( /*...*/ ) {
+       public function isAllowedAll() {
                $permissions = func_get_args();
                foreach ( $permissions as $permission ) {
                        if ( !$this->isAllowed( $permission ) ) {
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 7bb2453..9dbd4a5 100644 (file)
 class ApiFormatRaw extends ApiFormatBase {
 
        private $errorFallback;
+       private $mFailWithHTTPError = false;
+
 
        /**
         * @param ApiMain $main
-        * @param ApiFormatBase $errorFallback Object to fall back on for errors
+        * @param ApiFormatBase |null $errorFallback Object to fall back on for errors
         */
-       public function __construct( ApiMain $main, ApiFormatBase $errorFallback ) {
+       public function __construct( ApiMain $main, ApiFormatBase $errorFallback = null ) {
                parent::__construct( $main, 'raw' );
-               $this->errorFallback = $errorFallback;
+               if ( $errorFallback === null ) {
+                       $this->errorFallback = $main->createPrinterByName( $main->getParameter( 'format' ) );
+               } else {
+                       $this->errorFallback = $errorFallback;
+               }
        }
 
        public function getMimeType() {
@@ -59,6 +65,9 @@ class ApiFormatRaw extends ApiFormatBase {
                $data = $this->getResult()->getResultData();
                if ( isset( $data['error'] ) ) {
                        $this->errorFallback->initPrinter( $unused );
+                       if ( $this->mFailWithHTTPError ) {
+                               $this->getMain()->getRequest()->response()->statusHeader( 400 );
+                       }
                } else {
                        parent::initPrinter( $unused );
                }
@@ -85,4 +94,17 @@ class ApiFormatRaw extends ApiFormatBase {
                }
                $this->printText( $data['text'] );
        }
+
+       /**
+        * Output HTTP error code 400 when if an error is encountered
+        *
+        * The purpose is for output formats where the user-agent will
+        * not be able to interpret the validity of the content in any
+        * other way. For example subtitle files read by browser video players.
+        *
+        * @param bool $fail
+        */
+       public function setFailWithHTTPError( $fail ) {
+               $this->mFailWithHTTPError = $fail;
+       }
 }
index f802c95..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
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..39d44d2 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.",
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.",
index 5b7b2a1..d9ea21a 100644 (file)
        "apihelp-query+usercontribs-description": "All Ännerunge vun engem Benotzer kréien.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun derÄnnerung derbäi.",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.",
+       "apihelp-query+userinfo-param-prop": "Informatioune fir dranzesetzen:",
        "apihelp-query+userinfo-paramvalue-prop-options": "Lëscht vun allen Astellungen déi den aktuelle Benotzer gemaach huet.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Setzt d'Gesamtzuel vun den Ännerunge vum aktuelle Benotzer derbäi.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Setzt dem Benotzer säi richtegen Numm derbäi.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Setzt de Registréierungsdatum vum Benotzer derbäi.",
        "apihelp-query+users-paramvalue-prop-rights": "Weist all Rechter déi all Benotzer huet.",
        "apihelp-query+watchlist-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
        "apihelp-query+watchlist-param-excludeuser": "Ännerunge vun dësem Benotzer net opzielen.",
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 a476b7a..9c1c623 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Fasouzafreitas",
-                       "Dianakc"
+                       "Dianakc",
+                       "Cainamarques"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
        "apihelp-parse-paramvalue-prop-sections": "Fornece as seções no wikitexto analisado.",
        "apihelp-parse-paramvalue-prop-headitems": "Fornece itens para colocar no <code>&lt;head&gt;</code> da página.",
        "apihelp-parse-paramvalue-prop-headhtml": "Fornece <code>&lt;head&gt;</code> analisado da página.",
-       "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos ResourceLoader usados na página.",
+       "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos do ResourceLoader usados na página. Ou <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> deve ser solicitado conjuntamente com <kbd>modules</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página como uma string JSON.",
        "apihelp-parse-paramvalue-prop-indicators": "Fornece o HTML de indicadores de ''status'' de página utilizados na página.",
        "apihelp-query+imageusage-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+info-paramvalue-prop-readable": "Se o usuário pode ler esta página.",
        "apihelp-query+info-paramvalue-prop-preload": "Fornece o texto retornado por EditFormPreloadText.",
-       "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece a forma como o título da página é exibido atualmente.",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece o modo como o título da página é exibido.",
        "apihelp-query+info-param-testactions": "Testa se o usuário atual pode executar determinadas ações na página.",
        "apihelp-query+info-example-simple": "Obtém informações sobre a página <kbd>Página principal</kbd>.",
        "apihelp-query+iwbacklinks-description": "Encontra todas as páginas que apontam para o determinado link interwiki.\n\nPode ser usado para encontrar todos os links com um prefixo, ou todos os links para um título (com um determinado prefixo). Usar nenhum parâmetro é efetivamente \"todos os links interwiki\".",
index 921cc58..cd8d135 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}}",
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 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 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 4ed68bc..3b8eee3 100644 (file)
@@ -5,7 +5,9 @@
                        "Cradel",
                        "Dardan",
                        "Mdupont",
-                       "아라"
+                       "아라",
+                       "Ammartivari",
+                       "Olsi"
                ]
        },
        "tog-underline": "Nënvizoji vegzat",
@@ -26,7 +28,7 @@
        "tog-previewontop": "Vendose parapamjen përpara kutisë redaktuese",
        "tog-previewonfirst": "Shfaqe parapamjen në redaktimin e parë",
        "tog-enotifwatchlistpages": "Njoftomë me email, kur ndryshojnë faqet e mbikëqyruna",
-       "tog-enotifusertalkpages": "Njoftomë me email kur ndryshon faqja ime e diskutimit",
+       "tog-enotifusertalkpages": "Njoftomë me email kur ndryshon faqja ime e bisedimit",
        "tog-enotifminoredits": "Njoftomë me email për redaktime të vogla të faqeve",
        "tog-enotifrevealaddr": "Shfaqe adresën time në emailat njoftues",
        "tog-shownumberswatching": "Shfaqe numrin e përdoruesve mbikëqyrës",
        "oct": "Tet",
        "nov": "Nan",
        "dec": "Dhe",
+       "january-date": "$1 kallnor",
+       "february-date": "$1 fror",
+       "march-date": "$1 mars",
+       "april-date": "$1 prill",
+       "may-date": "$1 maj",
+       "june-date": "$1 qershor",
+       "july-date": "$1 korrik",
+       "august-date": "$1 gusht",
+       "september-date": "$1 shtator",
+       "october-date": "$1 tetor",
+       "november-date": "$1 nândor",
+       "december-date": "$1 dhetor",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoritë}}",
        "category_header": "Artikuj në kategorinë \"$1\"",
        "subcategories": "Nënkategori",
        "newwindow": "(çelet në nji dritare të re)",
        "cancel": "Harroje",
        "moredotdotdot": "Mâ shumë...",
-       "mypage": "Faqja jeme",
-       "mytalk": "Diskutimet e mija",
-       "anontalk": "Diskutimet për këtë IP",
+       "morenotlisted": "Kjo listë nuk âsht e plotë.",
+       "mypage": "Faqja",
+       "mytalk": "Bisedimet",
+       "anontalk": "Bisedimet për këtë adres IP",
        "navigation": "Lundrimi",
        "and": "&#32;dhe",
        "qbfind": "Kërko",
        "printableversion": "Version për shtyp",
        "permalink": "Vegëz e përhershme",
        "print": "Shtyp",
+       "view": "Shiko",
+       "view-foreign": "Shiko në $1",
        "edit": "Redakto",
+       "edit-local": "Redakto përshkrimin vendor",
        "create": "Krijo",
        "editthispage": "Redaktoje kët faqe",
-       "create-this-page": "Krijo këtë faqe",
-       "delete": "Fshij",
-       "deletethispage": "Fshije këtë faqe",
+       "create-this-page": "Krijo kët faqe",
+       "delete": "Fshije",
+       "deletethispage": "Fshije kët faqe",
        "undelete_short": "Kthe {{PLURAL:$1|redaktimin e fshimë|$1 redaktime të fshime}}",
        "protect": "Mbroj",
        "protect_change": "ndrysho",
        "unprotect": "Hiq mbrojtjen",
        "unprotectthispage": "Hiq mbrojtjen nga kjo faqe",
        "newpage": "Faqe e re",
-       "talkpage": "Diskuto këtë faqe",
+       "talkpage": "Bisedo këtë faqe",
        "talkpagelinktext": "Bisedo",
        "specialpage": "Faqe speciale",
        "personaltools": "Vegla vetjake",
        "articlepage": "Shiko artikullin",
-       "talk": "Diskutimi",
+       "talk": "Bisedimi",
        "views": "Paraqitje",
        "toolbox": "Veglat",
        "userpage": "Shiko faqen e përdoruesit",
        "templatepage": "Shiko faqen e shabllonit",
        "viewhelppage": "Shiko faqen për ndihmë",
        "categorypage": "Shiko faqen e kategorisë",
-       "viewtalkpage": "Shiko diskutimin",
+       "viewtalkpage": "Shiko bisedimin",
        "otherlanguages": "Në gjuhë tjera",
        "redirectedfrom": "(Përcjellë nga $1)",
        "redirectpagesub": "Faqe përcjellëse",
        "right-read": "Lexo faqe",
        "right-edit": "Redakto faqet",
        "right-createpage": "Hap faqe (që nuk janë faqe diskutimi)",
-       "right-createtalk": "Hap faqe diskutimi",
+       "right-createtalk": "Hap faqe bisedimi",
        "right-createaccount": "Hap llogari të re",
        "right-minoredit": "Shëno redaktimet si të vogla",
        "right-move": "Lëviz faqet",
        "action-read": "lexo këtë faqe",
        "action-edit": "redakto këtë faqe",
        "action-createpage": "hapë faqe",
-       "action-createtalk": "hap faqe diskutimi",
+       "action-createtalk": "hap faqe bisedimi",
        "action-createaccount": "hapë këtë llogari",
        "action-minoredit": "shëno këtë redaktim si të vogël",
        "action-move": "lëviz këtë faqe",
        "year": "Prej vjetit (e mâ herët):",
        "sp-contributions-newbies": "Trego sall kontributet e përdoruesve të rij",
        "sp-contributions-blocklog": "regjistri i bllokimeve",
-       "sp-contributions-talk": "Diskuto",
+       "sp-contributions-talk": "Bisedo",
        "sp-contributions-search": "Kërko te kontributet",
        "sp-contributions-username": "Adresa IP ose përdoruesi:",
        "sp-contributions-submit": "Lyp",
        "thumbnail-more": "Zmadho",
        "thumbnail_error": "Gabim gjatë krijimit të figurës përmbledhëse: $1",
        "tooltip-pt-userpage": "Faqja juej e përdoruesit",
-       "tooltip-pt-mytalk": "Faqja juej e diskutimeve",
+       "tooltip-pt-mytalk": "Faqja juej e bisedimeve",
        "tooltip-pt-preferences": "Parapëlqimet tuaja",
        "tooltip-pt-watchlist": "Lista e faqeve nën mbikqyrjen tuej.",
        "tooltip-pt-mycontris": "Lista e kontributeve tueja",
        "tooltip-pt-login": "Të këshillojmë me u kyçë; mirëpo, nuk asht e detyrueshme",
        "tooltip-pt-logout": "Dalje",
-       "tooltip-ca-talk": "Diskuto për përmbajtjen e faqes",
+       "tooltip-ca-talk": "Bisedo për përmbajtjen e faqes",
        "tooltip-ca-edit": "Mund ta redaktosh kët faqe. Përdore pullën >>Shfaqe parapamjen<< para se t'i krysh ndryshimet.",
        "tooltip-ca-addsection": "Nis nji sekcion të ri.",
        "tooltip-ca-viewsource": "Kjo faqe asht e mbrojtun. Mundesh veç me pa burimin e tekstit.",
        "rightsnone": "(asgjë)",
        "revdelete-summary": "përmbledhja redaktimit",
        "searchsuggest-search": "Kërkim",
-       "searchsuggest-containing": "përmban ..."
+       "searchsuggest-containing": "përmban ...",
+       "special-characters-group-latin": "Latinisht",
+       "special-characters-group-latinextended": "Latine zgjeruar",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Simbolet",
+       "special-characters-group-greek": "Grek",
+       "special-characters-group-cyrillic": "I sllavishtes së vjetër",
+       "special-characters-group-arabic": "Arabisht",
+       "special-characters-group-hebrew": "Hebraisht",
+       "special-characters-group-bangla": "Shqip",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Guxharati"
 }
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 66847a3..734acc3 100644 (file)
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-logs": "سجلات",
        "sp-contributions-talk": "نقاش",
-       "sp-contributions-userrights": "صلاحيات المستخدم",
+       "sp-contributions-userrights": "إدارة ØµÙ\84احÙ\8aات Ø§Ù\84Ù\85ستخدÙ\85",
        "sp-contributions-blocked-notice": "هذا المستخدم ممنوع حاليا.\nإن آخر مدخلة في سجل المنع موجودة أدناه كمرجع:",
        "sp-contributions-blocked-notice-anon": "عنوان الأيبي هذا ممنوع حاليا.\nآخر مدخلة لسجل المنع معروضة هنا كمرجع:",
        "sp-contributions-search": "بحث عن مساهمات",
index 6bbfe2d..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": "غير الباسورد",
        "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": "اعرض رسالة النظام",
        "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|برواز|براويز}}",
        "htmlform-submit": "تقديم",
        "htmlform-reset": "الرجوع فى التغييرات",
        "htmlform-selectorother-other": "تانيين",
+       "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 375af4d..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.",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàgines}}",
        "createacct-benefit-body3": "{{PLURAL:$1|col·laborador recent|col·laboradors recents}}",
        "badretype": "Les contrasenyes que heu introduït no coincideixen.",
+       "usernameinprogress": "La creació d'un compte per a aquest usuari ja està en curs. Espereu.",
        "userexists": "El nom que heu entrat ja és en ús.\nEscolliu-ne un de diferent.",
        "loginerror": "Error d'inici de sessió",
        "createacct-error": "Error de creació de compte",
        "columns": "Columnes",
        "searchresultshead": "Preferències de la cerca",
        "stub-threshold": "Límit per a formatar l'enllaç com <a href=\"#\" class=\"stub\">esborrany</a> (en octets):",
+       "stub-threshold-sample-link": "mostra",
        "stub-threshold-disabled": "Inhabilitat",
        "recentchangesdays": "Dies a mostrar en els canvis recents:",
        "recentchangesdays-max": "(màxim $1 {{PLURAL:$1|dia|dies}})",
        "changecontentmodel-nodirectediting": "El model de contingut $1 no permet l'edició directa",
        "log-name-contentmodel": "Registre de canvis del model de contingut",
        "log-description-contentmodel": "Esdeveniments relacionats amb els models de contingut d'una pàgina",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|ha canviat}} el model de contingut de la pàgina $3 de «$4» a «$5»",
        "logentry-contentmodel-change-revertlink": "reverteix",
        "logentry-contentmodel-change-revert": "reverteix",
        "protectlogpage": "Registre de protecció",
        "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ó arxivada|$1 revisions arxivades}}",
+       "undeleterevisions": "{{PLURAL:$1|Una revisió suprimida|$1 revisions suprimides}}",
        "undeletehistory": "Si restaureu la pàgina, totes les revisions seran restaurades a l'historial.\n\nSi s'hagués creat una nova pàgina amb el mateix nom d'ençà que la vàreu esborrar, les versions restaurades apareixeran abans a l'historial.",
        "undeleterevdel": "No es revertirà l'eliminació si això provoca la supressió parcial de la pàgina superior.\n\nEn aqueixos casos, heu de desmarcar o mostrar les revisions eliminades més noves.",
        "undeletehistorynoadmin": "S'ha eliminat la pàgina. El motiu es mostra\nal resum a continuació, juntament amb detalls dels usuaris que l'havien editat abans de la seua eliminació. El text de les revisions eliminades només és accessible als administradors.",
        "sp-contributions-blocked-notice-anon": "En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, la última entrada del registre es mostra a continuació:",
        "sp-contributions-search": "Cerca les contribucions",
        "sp-contributions-username": "Adreça IP o nom d'usuari:",
-       "sp-contributions-toponly": "Mostra només revisions superiors",
+       "sp-contributions-toponly": "Mostra només les darreres revisions",
        "sp-contributions-newonly": "Mostra només modificacions que són creacions de pàgina",
        "sp-contributions-submit": "Cerca",
        "whatlinkshere": "Què hi enllaça",
        "tooltip-ca-nstab-main": "Vegeu el contingut de la pàgina",
        "tooltip-ca-nstab-user": "Vegeu la pàgina d'usuari",
        "tooltip-ca-nstab-media": "Vegeu la pàgina de l'element multimèdia",
-       "tooltip-ca-nstab-special": "Aquesta és una pàgina especial, no podeu modificar-la",
+       "tooltip-ca-nstab-special": "Aquesta és una pàgina especial i no pot modificar-se",
        "tooltip-ca-nstab-project": "Vegeu la pàgina del projecte",
        "tooltip-ca-nstab-image": "Visualitza la pàgina del fitxer",
        "tooltip-ca-nstab-mediawiki": "Vegeu el missatge de sistema",
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 d7a06b6..f4d2aa2 100644 (file)
        "nosuchuser": "Der Benutzername „$1“ existiert nicht.\nÜberprüfe die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|lege ein neues Benutzerkonto an]].",
        "nosuchusershort": "Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfe die Schreibweise.",
        "nouserspecified": "Bitte gib einen Benutzernamen an.",
-       "login-userblocked": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist gesperrt. Die Anmeldung ist nicht erlaubt.",
+       "login-userblocked": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist gesperrt. Die Anmeldung ist nicht erlaubt.",
        "wrongpassword": "Das Passwort ist falsch. Bitte versuche es erneut.",
        "wrongpasswordempty": "Es wurde kein Passwort eingegeben. Bitte versuche es erneut.",
        "passwordtooshort": "Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.",
        "mailmypassword": "Passwort zurücksetzen",
        "passwordremindertitle": "Neues temporäres Passwort für dein {{SITENAME}}-Benutzerkonto",
        "passwordremindertext": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.\n\nDas automatisch generierte Passwort für Benutzer „$2“ lautet nun: $3\n\nFalls du dies wirklich gewünscht hast, solltest du dich jetzt anmelden und das Passwort ändern.\nDas neue Passwort ist {{PLURAL:$5|1 Tag|$5 Tage}} gültig.\n\nBitte ignoriere diese E-Mail, falls du sie nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.",
-       "noemail": "{{GENDER:$1|Benutzer|Benutzerin|Benutzer}} „$1“ hat keine E-Mail-Adresse angegeben.",
+       "noemail": "{{GENDER:$1|Benutzer|Benutzerin}} „$1“ hat keine E-Mail-Adresse angegeben.",
        "noemailcreate": "Du musst eine gültige E-Mail-Adresse angeben.",
        "passwordsent": "Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer „$1“ gesandt.\nBitte melde dich damit an, sobald du es erhalten hast. Das alte Passwort bleibt weiterhin gültig.",
        "blocked-mailpassword": "Die von dir verwendete IP-Adresse ist für das Ändern von Seiten gesperrt. Um einen Missbrauch zu verhindern, wurde die Möglichkeit zur Anforderung eines neuen Passwortes ebenfalls gesperrt.",
        "missing-revision": "Die Version $1 der Seite namens „{{FULLPAGENAME}}“ ist nicht vorhanden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] einsehbar.",
        "userpage-userdoesnotexist": "Das Benutzerkonto „<nowiki>$1</nowiki>“ ist nicht vorhanden. Bitte prüfe, ob du diese Seite wirklich erstellen/bearbeiten willst.",
        "userpage-userdoesnotexist-view": "Das Benutzerkonto „$1“ ist nicht vorhanden.",
-       "blocked-notice-logextract": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist zurzeit gesperrt.\nZur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:",
+       "blocked-notice-logextract": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist zurzeit gesperrt.\nZur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:",
        "clearyourcache": "'''Hinweis:''' Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.\n* '''Firefox/Safari:''' ''Umschalttaste'' drücken und gleichzeitig ''Aktualisieren'' anklicken oder entweder ''Strg+F5'' oder ''Strg+R'' (''⌘+R'' auf dem Mac) drücken\n* '''Google Chrome:''' ''Umschalttaste+Strg+R'' (''⌘+Umschalttaste+R'' auf dem Mac) drücken\n* '''Internet Explorer:''' ''Strg+F5'' drücken oder ''Strg'' drücken und gleichzeitig ''Aktualisieren'' anklicken\n* '''Opera:''' ''Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen''",
        "usercssyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues CSS vor dem Speichern zu testen.",
        "userjsyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues JavaScript vor dem Speichern zu testen.",
        "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 zweite 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.",
        "booksources-text": "Dies ist eine Liste mit Links zu Internetseiten, die neue und gebrauchte Bücher verkaufen. Dort kann es auch weitere Informationen über die Bücher geben. {{SITENAME}} ist mit keinem dieser Anbieter geschäftlich verbunden.",
        "booksources-invalid-isbn": "Vermutlich ist die ISBN ungültig.\nBitte prüfe, ob sie korrekt von der Quelle übertragen wurde.",
        "specialloguserlabel": "Ausführender Benutzer:",
-       "speciallogtitlelabel": "Ziel (Titel oder Benutzer):",
+       "speciallogtitlelabel": "Ziel (Titel oder {{ns:user}}:Benutzername für einen Benutzer):",
        "log": "Logbücher",
        "all-logs-page": "Alle öffentlichen Logbücher",
        "alllogstext": "Dies ist die kombinierte Anzeige aller in {{SITENAME}} geführten Logbücher.\nDie Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels eingeschränkt werden (Groß-/Kleinschreibung muss beachtet werden).",
        "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].",
        "sp-contributions-logs": "Logbücher",
        "sp-contributions-talk": "Diskussion",
        "sp-contributions-userrights": "Benutzerrechte­verwaltung",
-       "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
+       "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
        "sp-contributions-blocked-notice-anon": "Diese IP-Adresse ist zurzeit gesperrt.\nZur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:",
        "sp-contributions-search": "Suche nach Benutzerbeiträgen",
        "sp-contributions-username": "IP-Adresse oder Benutzername:",
        "emaillink": "E-Mail senden",
        "autoblocker": "Automatische Sperre, da du eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzt.\nGrund der Benutzersperre: „$2“",
        "blocklogpage": "Benutzersperr-Logbuch",
-       "blocklog-showlog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde schon früher gesperrt. Es folgt der Eintrag aus dem Benutzersperr-Logbuch:",
-       "blocklog-showsuppresslog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde schon früher gesperrt und versteckt.\nEs folgt der Eintrag aus dem Unterdrückungs-Logbuch:",
+       "blocklog-showlog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} wurde schon früher gesperrt. Es folgt der Eintrag aus dem Benutzersperr-Logbuch:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} wurde schon früher gesperrt und versteckt.\nEs folgt der Eintrag aus dem Unterdrückungs-Logbuch:",
        "blocklogentry": "sperrte „[[$1]]“ für den Zeitraum: $2 $3",
        "reblock-logentry": "änderte die Sperre von „[[$1]]“ für den Zeitraum: $2 $3",
        "blocklogtext": "Dies ist das Logbuch über Sperrungen und Entsperrungen von Benutzern und IP-Adressen.\nAutomatisch gesperrte IP-Adressen werden nicht erfasst.\nSiehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen]] für alle aktiven Sperren.",
        "tooltip-ca-nstab-main": "Seiteninhalt anzeigen",
        "tooltip-ca-nstab-user": "Benutzerseite anzeigen",
        "tooltip-ca-nstab-media": "Mediendateienseite anzeigen",
-       "tooltip-ca-nstab-special": "Dies ist eine Spezialseite. Sie kann nicht bearbeitet werden.",
+       "tooltip-ca-nstab-special": "Dies ist eine Spezialseite und kann nicht bearbeitet werden.",
        "tooltip-ca-nstab-project": "Portalseite anzeigen",
        "tooltip-ca-nstab-image": "Dateiseite anzeigen",
        "tooltip-ca-nstab-mediawiki": "MediaWiki-Systemtext anzeigen",
        "group-sysop.js": "/* Das folgende JavaScript wird nur für Administratoren geladen. */",
        "group-bureaucrat.js": "/* Das folgende JavaScript wird nur für Bürokraten geladen. */",
        "anonymous": "{{PLURAL:$1|Unangemeldeter Benutzer|Unangemeldete Benutzer}} auf {{SITENAME}}",
-       "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin|Benutzer}} $1",
+       "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin}} $1",
        "anonuser": "Anonymer {{SITENAME}}-Benutzer $1",
        "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 geändert.",
        "othercontribs": "Basierend auf der Arbeit von $1.",
index 6eedb8c..70e4dd3 100644 (file)
        "viewyourtext": "यै पानामी रह्याका '''तमरा सम्पादनहरू''' हेद्द या प्रतिलिपी गद्द सक्द्या हौ :",
        "editinginterface": "<strong>चेतावनी:</strong> तमी यै पानालाई सम्पादन गद्द लाग्याछौ, जनले सफ्टवेयरको लागि \nइन्टरफेस सामग्रीहरू प्रदान गरन्छ।\nयै पानामी गरियाको परिवर्तनले यै विकिमी अरु प्रयोगकर्तानको इन्टरफेसको प्रदर्शनमी प्रभाव पडन्छ ।",
        "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": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
        "movenologintext": "पानाको नाम बदल्नको लागि तमी दर्ता गरियाको र [[Special:UserLogin|लगइन गर्याको]] प्रयोगकर्ता हुनुपडन्छ ।",
        "cant-move-user-page": "तमसँग प्रयोगकर्ता पानाहरू साद्या अनुमती नाइथिन् (सहपानाहरू बाहेक)",
        "cant-move-to-user-page": "तमसँग पानाहरूलाई प्रयोगकर्ता पानामी साद्या अनुमती नाइथिन् (प्रयोगकर्ता सहपृष्ठहरूमी बाहेक)",
+       "cant-move-category-page": "तमलाईं श्रेणीको पानाहरू साद्य अनुमति छैन ।",
+       "cant-move-to-category-page": "कुनै श्रेणी पानामी साद्दको लागी तमलाई अनुमति छैन ।",
        "cantmove-titleprotected": "तमी यै ठौरमी पानो साद्द सक्दाइनौ, किनकी यो नौलो शिर्षकलाई सिर्जना हुनबठे जगाइयाको छ",
        "move-subpages": "उप पानाहरू सार्न्या($1 सम्मको)",
        "move-talk-subpages": "कुरडी पानाको सह-पानाहरू साद्य($1 सम्मको )",
        "thumbnail-more": "ठूलो बनौन्या",
        "import-interwiki-history": "यै पामैकोलागि सबै इतिहास संशोधनहरू प्रतिलिपि गद्या",
        "import-noarticle": "आयात गद्दाकी लाई पानाहरू नाइथिन्",
+       "import-error-edit": "तमलाई सम्पादन गद्या अनुमति नभयाको पानो \"$1\" आयात गरिएन ।",
+       "import-error-create": "तमलाई नयाँ बनाउने अनुमति नभयाको पानो \"$1\" आयात गरिएन ।",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} आयात भयो",
        "tooltip-pt-userpage": "तमरो प्रयोगकर्ता पानो",
        "tooltip-pt-anonuserpage": "तमी जो IP ठेगानाको रुपमी सम्पादन गद्दै छौ , त्यैको प्रयोगकर्ता पानो निम्न छ :",
        "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 990d38a..5859365 100644 (file)
        "rfcurl": "//tools.ietf.org/html/rfc$1",
        "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
        "specialloguserlabel": "Performer:",
-       "speciallogtitlelabel": "Target (title or user):",
+       "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Logs",
        "all-logs-page": "All public logs",
        "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
        "tooltip-ca-nstab-main": "View the content page",
        "tooltip-ca-nstab-user": "View the user page",
        "tooltip-ca-nstab-media": "View the media page",
-       "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
+       "tooltip-ca-nstab-special": "This is a special page, and it cannot be edited",
        "tooltip-ca-nstab-project": "View the project page",
        "tooltip-ca-nstab-image": "View the file page",
        "tooltip-ca-nstab-mediawiki": "View the system message",
index 90e96d3..e086317 100644 (file)
        "revdelete-legend": "Establecer restricciones de visibilidad",
        "revdelete-hide-text": "Texto de la revisión",
        "revdelete-hide-image": "Ocultar el contenido del archivo",
-       "revdelete-hide-name": "Ocultar la selección y sus parámetros.",
+       "revdelete-hide-name": "Ocultar la selección y sus parámetros",
        "revdelete-hide-comment": "Resumen de edición",
        "revdelete-hide-user": "Nombre/IP del editor",
        "revdelete-hide-restricted": "Suprimir para todos los usuarios, incluidos administradores",
        "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 04e3623..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).",
        "tooltip-ca-nstab-main": "Voir la page de contenu",
        "tooltip-ca-nstab-user": "Voir la page utilisateur",
        "tooltip-ca-nstab-media": "Voir la page du média",
-       "tooltip-ca-nstab-special": "Ceci est une page spéciale, vous ne pouvez pas la modifier.",
+       "tooltip-ca-nstab-special": "Ceci est une page spéciale, et elle ne peut pas être modifiée.",
        "tooltip-ca-nstab-project": "Voir la page du projet",
        "tooltip-ca-nstab-image": "Voir la page du fichier",
        "tooltip-ca-nstab-mediawiki": "Voir le message système",
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 64ebe0b..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)",
        "badsig": "Dr Syntax vu dr Signatur isch nid giltig; bitte d HTML iberpriefe.",
        "badsiglength": "Dyyni Unterschrift isch z lang. Si derf hegschtens $1 {{PLURAL:$1|Zeiche|Zeiche}} lang syy.",
        "yourgender": "Wie sölle Systemmäldigen über di brichte?",
-       "gender-unknown": "«Der Benutzer», «der {dy Name}», «syni Bearbeitig», «är schrybt» etc. – gschlächtsneutral bzw. generischs Maskulinum",
-       "gender-male": "«Der Benutzer», «der {dy Name}», «syni Bearbeitig», «är schrybt» etc. (Maskulinum)",
-       "gender-female": "«D Benutzerin», «d {dy Name}», «iri Bearbeitig», «si schrybt» etc. (Femininum)",
-       "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.",
+       "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. 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 51d1103..4cdb75e 100644 (file)
        "booksources-text": "להלן רשימת קישורים לאתרים אחרים המוכרים ספרים חדשים ויד־שנייה, ושבהם עשוי להיות מידע נוסף לגבי ספרים שאתם מחפשים:",
        "booksources-invalid-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": "×\96×\94×\95 ×\93×£ ×\9e×\99×\95×\97×\93, ×\95×\9c×\90 × ×\99ת×\9f ×\9cער×\95×\9a ×\90×\95ת×\95",
        "tooltip-ca-nstab-project": "צפייה בדף המיזם",
        "tooltip-ca-nstab-image": "צפייה בדף הקובץ",
        "tooltip-ca-nstab-mediawiki": "צפייה בהודעת המערכת",
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 50d183a..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이 문서를 보는 동안 문단이 이동되었거나 삭제되었을 수 있습니다.",
        "noarticletext": "이 문서가 현재 존재하지 않습니다.\n이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색하거나]],\n이 문서에 관련된 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인하거나,\n문서를 직접 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 편집]</span>할 수 있습니다.",
        "noarticletext-nopermission": "이 문서가 현재 존재하지 않습니다.\n이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색하거나]], 이 문서에 관련된 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인할 수 있습니다.</span> 그러나 이 문서를 만들 수 있는 권한은 없습니다.",
        "missing-revision": "\"{{FULLPAGENAME}}\"이라는 문서의 #$1판이 존재하지 않습니다.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 역사 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
-       "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하려면 계정이 존재하는지 확인해주세요.",
+       "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하기 전에 계정이 존재하는지 확인해주세요.",
        "userpage-userdoesnotexist-view": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
        "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참조하십시오:",
        "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>Firefox / Safari</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em> 을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>Google Chrome</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>Opera</strong>: <em>도구→설정</em>에서 캐시를 비움",
        "powersearch-togglenone": "모두 제외",
        "powersearch-remember": "향후 검색에 선택 기억하기",
        "search-external": "바깥 검색",
-       "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안에는 Google(구글)을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
+       "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안에는 Google을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
        "search-error": "검색하는 동안 오류가 발생했습니다: $1",
        "preferences": "사용자 환경 설정",
        "mypreferences": "환경 설정",
        "imageinvalidfilename": "새 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
        "move-leave-redirect": "옮긴 뒤 넘겨주기를 남기기",
-       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만이 이동할 수 있도록 잠겨 있습니다.\n최근의 기록을 참조용으로 제공합니다:",
-       "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.\n최근 기록 내용을 참고용로 제공합니다:",
+       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만이 이동할 수 있도록 잠겨 있습니다.\n최근의 기록을 참조를 위해 아래에 제공합니다:",
+       "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.\n최근 기록 내용을 참조를 위해 아래에 제공합니다:",
        "move-over-sharedrepo": "== 파일이 존재함 ==\n[[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 옮기면 공용의 파일을 덮어쓰게 될 것입니다.",
        "file-exists-sharedrepo": "선택한 파일 이름은 공용 저장소에서 사용 중입니다.\n다른 이름을 선택하세요.",
        "export": "문서 내보내기",
index 9dd6cc8..a0881dd 100644 (file)
@@ -7,7 +7,8 @@
                        "Reedy",
                        "Rentenirer",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "TTO"
                ]
        },
        "tog-underline": "Dun de Lengks ongerschtriische:",
        "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": "{{PLURAL:$1|$1&nbsp;<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">{{PLURAL:$1|Byte|Bytes|Bytes}}</i>",
+       "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 6dc6910..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",
        "media_tip": "Cullegamente a file multimediale",
        "sig_tip": "Firma cu data e ora",
        "hr_tip": "Linea orizzontale (ausà cu gedizzio)",
-       "summary": "Énnece",
+       "summary": "Innece",
        "subject": "Argomiento/titolo:",
        "minoredit": "Chisto è nu cagnamiénto piccerillo",
        "watchthis": "Tiene d'uocchio chesta paggena",
        "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 dcf2b1c..1468b4e 100644 (file)
        "translateinterface": "सबै विकिहरूको लागी अनुवाद जोड्न वा परिवर्तन गर्नका लागि मीडियाविकि क्षेत्रीयकरण परियोजना [//translatewiki.net/ ट्रान्सलेटविकि.नेट]को प्रयोग गर्नुहोस।",
        "cascadeprotected": "यो पृष्ठ सम्पादन गर्नबाट सुरक्षित गरिएकोछ किनभनें {{PLURAL:$1|पृष्ठ |पृष्ठहरू}}मा सुरक्षित गर्नुका साथै प्रपात (\"cascading\") विकल्प खुल्ला राखिएको छ:\n$2",
        "namespaceprotected": " '''$1'''  नेमस्पेसमा रहेका पृष्ठहरू सम्पादन गर्ने अनुमति यहाँलाई छैन ।",
-       "customcssprotected": "तपाà¤\88लाà¤\88 à¤¯à¤¸  à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\81 संग्रहित छन् ।",
-       "customjsprotected": "तपाà¤\88लाà¤\88 à¤¯à¤¸ à¤\9cाभासà¥\8dà¤\95à¥\83पà¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\81 संग्रहित छन् ।",
+       "customcssprotected": "तपाà¤\88à¤\82लाà¤\88 à¤¯à¥\8b  à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\82 संग्रहित छन् ।",
+       "customjsprotected": "तपाà¤\88à¤\82लाà¤\88 à¤¯à¥\8b à¤\9cाभासà¥\8dà¤\95à¥\83पà¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\82 संग्रहित छन् ।",
        "mycustomcssprotected": "यस CSSपृष्ठ सम्पादन गर्नको लागि लागि तपाईँलाई अनुमति छैन ।",
        "mycustomjsprotected": "यस JavaScript पृष्ठ सम्पादन गर्नको लागि लागि तपाईँलाई अनुमति छैन ।",
        "myprivateinfoprotected": "तपाईँसँग तपाईँको निजी जानकारीहरू सम्पादन गर्ने अनुमती छैन",
        "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": "कसरी वताउन चाहनुहुन्छ ?",
        "movenotallowedfile": "फाइल हटाउने अनुमति तपाईँलाई  छैन।",
        "cant-move-user-page": "तपाईसँग प्रयोगकर्ता पृष्ठहरू सार्न अनुमती छैन (सहपृष्ठहरू बाहेक)",
        "cant-move-to-user-page": "तपाईंलाई पृष्ठहरू प्रयोगकर्ता पृष्ठमा सार्न अनुमती छैन (प्रयोगकर्ता सहपृष्ठहरूमा बाहेक)",
-       "cant-move-category-page": "तपाईलाई श्रेणीको पृष्ठहरू सार्ने अनुमति छैन ।",
-       "cant-move-to-category-page": "कुनै श्रेणी पृष्ठमा सार्नको लागी तपाईलाई अनुमति छैन ।",
+       "cant-move-category-page": "तपाà¤\88à¤\82लाà¤\88 à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤ªà¥\83षà¥\8dठहरà¥\82 à¤¸à¤¾à¤°à¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न à¥¤",
+       "cant-move-to-category-page": "à¤\95à¥\81नà¥\88 à¤¶à¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठमा à¤¸à¤¾à¤°à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82लाà¤\88 à¤\85नà¥\81मति à¤\9bà¥\88न à¥¤",
        "newtitle": "नयाँ शीर्षकमा :",
        "move-watch": "यो पृष्ठ निगरानीमा राख्नुहोस्",
        "movepagebtn": "पृष्ठ सार्नुहोस्",
        "import-upload": "XML डेटा अपलोड गर्ने",
        "import-token-mismatch": "सत्र जानकारी नष्ट भयो\nकृपया पुन: प्रयास गर्नुहोस्।",
        "import-invalid-interwiki": "खुलाइएको विकिबाट आयात गर्न सकिएन",
-       "import-error-edit": "तपाईलाई सम्पादन गर्ने अनुमति नभएको पृष्ठ \"$1\" आयात गरिएन ।",
-       "import-error-create": "तपाà¤\88लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¬à¤¨à¤¾à¤\89नà¥\87 à¤\97रà¥\8dने अनुमति नभएको पृष्ठ \"$1\" आयात गरिएन ।",
+       "import-error-edit": "तपाà¤\88à¤\82लाà¤\88 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤¨à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठ \"$1\" à¤\86यात à¤\97रिà¤\8fन à¥¤",
+       "import-error-create": "तपाà¤\88à¤\82लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¬à¤¨à¤¾à¤\89ने अनुमति नभएको पृष्ठ \"$1\" आयात गरिएन ।",
        "import-error-interwiki": "यसको नाम बाह्य लिङ्क (अन्तरविकि) को लागी जगेडा राखिएको हुँदा  पृष्ठ \"$1\" आयात गरिएन ।",
        "import-error-special": "पृष्ठ \"$1\" आयात गर्न सकिएन किनभने यो एउटा यस्तो विशेष नामस्थान अन्तर्गत आउँछ जसमा पृष्ठ बनाउन सकिंदैन।",
        "import-error-invalid": "पृष्ठ \"$1\" आयात गर्न सकिएन किनभने यसको आयात पश्चात जुन नाम हुन्थ्यो त्यो यस विकिमा मान्य छैन।",
        "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 a5a6e47..9f213d4 100644 (file)
        "tooltip-ca-nstab-main": "Zobacz stronę treści",
        "tooltip-ca-nstab-user": "Zobacz stronę osobistą użytkownika",
        "tooltip-ca-nstab-media": "Zobacz stronę pliku",
-       "tooltip-ca-nstab-special": "To jest strona specjalna. Nie możesz jej edytować.",
+       "tooltip-ca-nstab-special": "To jest strona specjalna i nie można jej edytować.",
        "tooltip-ca-nstab-project": "Zobacz stronę projektu",
        "tooltip-ca-nstab-image": "Zobacz stronę grafiki",
        "tooltip-ca-nstab-mediawiki": "Zobacz komunikat systemowy",
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 fad6182..1df1817 100644 (file)
        "autosumm-new": "The auto summary when creating a new page. $1 are the first X number of characters of the new page.",
        "autosumm-newblank": "The automatic edit summary when creating a blank page. This is not the same as blanking a page.",
        "autoblock_whitelist": "{{notranslate}}",
-       "size-bytes": "{{optional}}\nSize (of a page, typically) in bytes.",
+       "size-bytes": "Size (of a page, typically) in bytes.",
        "size-kilobytes": "{{optional}}\nSize (of a page, typically) in kibibytes (1 kibibyte = 1024 bytes).",
        "size-megabytes": "{{optional}}\nSize (of a file, typically) in mebibytes (1 mebibyte = 1024×1024 bytes).",
        "size-gigabytes": "{{optional}}\nSize (of a file, typically) in gibibytes (1 gibibyte = 1024×1024×1024 bytes).",
        "size-exabytes": "{{optional}}\nSize (of a file, typically) in exbibytes (1 exbibytes = 1024×1024×1024×1024×1024×1024 bytes).",
        "size-zetabytes": "{{optional}}\nSize (of a file, typically) in zebibytes (1 zebibytes = 1024×1024×1024×1024×1024×1024×1024 bytes).",
        "size-yottabytes": "{{optional}}\nSize (of a file, typically) in yobibytes (1 yobibytes = 1024×1024×1024×1024×1024×1024×1024×1024 bytes).",
-       "size-pixel": "{{optional}}\nSize (of a file, typically) in pixel.",
+       "size-pixel": "Size (of a file, typically) in pixel.",
        "size-kilopixel": "{{optional}}\nSize (of a file, typically) in kilopixel (1 kilopixel = 1000 pixel).",
        "size-megapixel": "{{optional}}\nSize (of a file, typically) in megapixel (1 megapixel = 1000×1000 pixel).",
        "size-gigapixel": "{{optional}}\nSize (of a file, typically) in gigapixel (1 gigapixel = 1000×1000×1000 pixel).",
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 208e887..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": "Ваш текст",
        "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|дня|дней}})",
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 bb6ec5e..37b4b30 100644 (file)
        "booksources-text": "Sledi seznam povezav do drugi spletnih strani, ki prodajajo nove in rabljene knjige, in imajo morda nadaljnje informacije o knjigah, ki jih iščete:",
        "booksources-invalid-isbn": "Za dani ISBN se ne zdi, da je veljaven; preverite za morebitne napake pri kopiranju iz prvotnega vira.",
        "specialloguserlabel": "Izvajalec:",
-       "speciallogtitlelabel": "Cilj (naslov ali uporabnik):",
+       "speciallogtitlelabel": "Cilj (naslov ali {{ns:user}}:uporabniškoime za uporabnika):",
        "log": "Dnevniki",
        "all-logs-page": "Vsi javni dnevniki",
        "alllogstext": "Združeno so prikazani dnevniki sprememb uporabniških pravic, preimenovanj uporabnikov, nalaganja predstavnostnih datotek, prestavljanja in zaščite strani, brisanja, registracij uporabnikov, sprememb položaja botov ter blokiranja in deblokiranja uporabnikov na strani {{SITENAME}}. Pogled lahko zožite z izbiro dnevnika, uporabniškega imena ali strani. Vedite, da polje »Uporabnik« razlikuje med malimi in velikimi črkami.",
        "tooltip-ca-nstab-main": "Prikaže članek",
        "tooltip-ca-nstab-user": "Prikaže uporabniško stran",
        "tooltip-ca-nstab-media": "Prikaže stran s predstavnostno vsebino",
-       "tooltip-ca-nstab-special": "Te posebne strani ne morete urejati",
+       "tooltip-ca-nstab-special": "To je posebna stran in je ni mogoče urejati",
        "tooltip-ca-nstab-project": "Prikaže stran projekta",
        "tooltip-ca-nstab-image": "Prikaže stran s sliko ali drugo datoteko",
        "tooltip-ca-nstab-mediawiki": "Prikaže sistemsko sporočilo",
index edc5c9a..9bc946f 100644 (file)
        "sort-ascending": "Radhit në ngjitje",
        "nstab-main": "Artikulli",
        "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Faqja e përdoruesit|Faqja e përdorueses}}",
-       "nstab-media": "Media-faqe",
+       "nstab-media": "Medie",
        "nstab-special": "Faqe speciale",
-       "nstab-project": "Projekt-faqe",
+       "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.",
        "prefs-reset-intro": "Mundeni me përdorë këtë faqe për me i kthy parapëlqimet tueja në ato të paracaktuemet e faqes.\nKjo nuk mundet me u zhbâ.",
        "prefs-emailconfirm-label": "Konfirmimi i emailit:",
        "youremail": "Adresa e email-it*",
-       "username": "Nofka e përdoruesit:",
-       "prefs-memberingroups": "Anëtar i {{PLURAL:$1|grupit|grupeve}}:",
+       "username": "{{GENDER:$1|Emri i përdoruesit|Emri i përdorueses}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Anëtar i|Anëtare e}} {{PLURAL:$1|grupit|grupeve}}:",
        "prefs-registration": "Koha e regjistrimit:",
        "yourrealname": "Emri juaj i vërtetë*",
        "yourlanguage": "Ndërfaqja gjuhësore",
        "prefs-help-signature": "Komentet në faqet e diskutimit duhet të nënshkruhen me \"<nowiki>~~~~</nowiki>\" të cilat do të konvertohen me emrin tuaj të përdoruesit dhe kohën.",
        "badsig": "Sintaksa e signaturës është e pavlefshme, kontrolloni HTML-in.",
        "badsiglength": "Nënshkrimi është tepër i gjatë.\nNuk duhet të jetë më i gjatë se $1 {{PLURAL:$1|karakter|karaktere}}.",
-       "yourgender": "Gjinia:",
-       "gender-unknown": "e pacaktuar",
+       "yourgender": "Si dëshironi të përshkruheni?",
+       "gender-unknown": "Kur ju të përmendeni, softueri do të përdorë fjalë asnjanëse kur është e mundur (në të shumtën e rasteve do të jenë fjalë të gjinisë mashkullore)",
        "gender-male": "Ai redakton faqet wiki",
        "gender-female": "Ajo redakton faqet wiki",
-       "prefs-help-gender": "Sipas dëshirës: përdoret për adresim korrekt në relacion me gjininë nga software-i.\nKjo informatë është publike.",
+       "prefs-help-gender": "Vendosja e këtij parapëlqimi nuk është e detyrueshme.\nSoftueri përdor vlerat e tij për t'ju adresuar dhe për t'ju përmendur ju te të tjerët duke përdorur gjininë e duhur gramatikore.\nKy informacion do të jetë publik.",
        "email": "Email",
        "prefs-help-realname": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jipni do të përmendeni si kontribues për punën që ke bërë.",
        "prefs-help-email": "Posta elektronike është zgjedhore, por ju mundëson që fjalëkalimi i ri të ju dërgohet nëse e harroni atë. Gjithashtu mund të zgjidhni nëse doni të tjerët t'ju shkruajnë ose jo përmes faqes suaj të diskutimit pa patur nevojë të zbulojnë identitetin tuaj.",
        "userrights-lookup-user": "Ndrysho grupet e përdoruesit",
        "userrights-user-editname": "Fusni emrin e përdoruesit:",
        "editusergroup": "Redakto grupet e përdoruesve",
-       "editinguser": "Duke ndryshuar privilegjet e përdoruesit '''[[User:$1|$1]]''' $2",
+       "editinguser": "Duke ndryshuar privilegjet e {{GENDER:$1|përdoruesit|përdorueses}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Anëtarësimi tek grupet",
        "saveusergroups": "Ruaj Grupin e Përdoruesve",
-       "userrights-groupsmember": "Anëtar i:",
-       "userrights-groupsmember-auto": "Anëtar implicit i:",
-       "userrights-groups-help": "Mund të ndryshoni anëtarësimin e këtij përdoruesi në grupe:\n* Kutia e zgjedhur shënon që përdoruesi është anëtar në atë grup\n* Kutia e pazgjedhur shënon që përdoruesi nuk është anëtar në atë grup\n* Një * shënon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).",
+       "userrights-groupsmember": "{{GENDER:$2|Anëtar i|Anëtare e}}:",
+       "userrights-groupsmember-auto": "{{GENDER:$2|Anëtar i nënkuptuar i|Anëtare e nënkuptuar e}}:",
+       "userrights-groups-help": "Mund të ndryshoni anëtarësimin e {{GENDER:$1|këtij përdoruesi|kësaj përdorueseje}} në grupe:\n* Kutia e zgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Kutia e pazgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} nuk është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Një * tregon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).",
        "userrights-reason": "Arsyeja:",
        "userrights-no-interwiki": "Nuk keni leje për të ndryshuar privilegjet e përdoruesve në wiki të tjera.",
        "userrights-nodatabase": "Regjistri $1 nuk ekziston ose nuk është vendor.",
        "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",
        "unusedtemplateswlh": "lidhje",
        "randompage": "Faqe e rastit",
        "randompage-nopages": "Nuk ka faqe në {{PLURLA:$2|hapësirën|hapësirat}} në vijim: $1",
+       "randomincategory-invalidcategory": "\"$1\" nuk është emër i vlefshëm kategorie.",
+       "randomincategory-nopages": "Nuk ka faqe në kategorinë [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategoria:",
+       "randomincategory-legend": "Faqe e rastit në kategori",
+       "randomincategory-submit": "Shko",
        "randomredirect": "Përcjellim i rastit",
        "randomredirect-nopages": "Nuk ka përcjellim në \"$1\".",
        "statistics": "Statistika",
        "statistics-users": "[[Special:ListUsers|Përdoruesit]] e regjistruar",
        "statistics-users-active": "Përdoruesit aktiv",
        "statistics-users-active-desc": "Përdoruesit që kanë së paku një veprim në {{PLURAL:$1|ditën|$1 ditët}} e fundit",
+       "pageswithprop-prop": "Emri i pronës:",
+       "pageswithprop-submit": "Shko",
        "doubleredirects": "Përcjellime dopjo",
        "doubleredirectstext": "Kjo faqe liston faqet përcjellëse tek faqet e tjera përcjellëse.\nSecili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë, gjithashtu synimin e përcjellimit të dytë, që është zakonisht faqja synuese '''e vërtetë''', që faqja w parë duhej të ishte përcjellëse e kësaj faqeje.\n<del>Kalimet nga</del> hyrjet janë zgjidhur.",
-       "double-redirect-fixed-move": "[[$1]] u zhvendos, tani është gjendet në [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] u zhvendos.\n\nËshtë përditësuar automatikisht dhe tani përcjellet tek [[$2]]",
        "double-redirect-fixed-maintenance": "Duke zgjidhur përcjellimin e dyfishtë nga [[$1]] tek [[$2]].",
        "double-redirect-fixer": "Rregullues zhvendosjesh",
        "brokenredirects": "Përcjellime të prishura",
        "fewestrevisions": "Artikuj më të paredaktuar",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|kategori|kategori}}",
+       "ninterwikis": "$1 {{PLURAL:$1|ndërwiki|ndërwikit}}",
        "nlinks": "$1 {{PLURAL:$1|lidhje|lidhje}}",
        "nmembers": "$1 {{PLURAL:$1|antar|antarë}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|anëtar|anëtarët}}",
        "nrevisions": "$1 {{PLURAL:$1|version|versione}}",
        "nimagelinks": "Përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
        "ntransclusions": "përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
        "protectedpages-indef": "Vetëm mbrojtjet pa afat",
        "protectedpages-cascade": "Vetëm mbrojtjet",
        "protectedpagesempty": "Nuk ka faqe të mbrojtura me të dhënat e kërkuara.",
+       "protectedpages-page": "Faqja",
+       "protectedpages-expiry": "Skadon",
        "protectedpages-reason": "Arsyeja",
        "protectedtitles": "Titujt e mbrojtur",
        "protectedtitlesempty": "Asnjë titull i mbrojtur nuk u gjet në këtë hapësirë.",
        "watcherrortext": "Është paraqitur një gabim përderisa ndryshuat parametrat e listës suaj mbikqyrëse për \"$1\".",
        "enotif_reset": "Shëno të gjitha faqet e vizituara",
        "enotif_impersonal_salutation": "Përdorues i {{SITENAME}}",
+       "enotif_subject_created": "{{SITENAME}} faqja $1 është {{GJINIA:$2|krijuar}} nga $2",
        "enotif_lastvisited": "Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.",
        "enotif_lastdiff": "Shikoni $1 për ndryshime.",
        "enotif_anon_editor": "përdorues anonim $1",
        "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",
        "unblocked": "[[User:$1|$1]] është zhbllokuar.",
-       "unblocked-range": "$1 është zhbllokuar",
+       "unblocked-range": "$1 është zhbllokuar.",
        "unblocked-id": "Bllokimi $1 është hequr",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] është zhbllokuar.",
        "blocklist": "Përdorues i Bllokuar",
        "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-edits": "Numri i redaktimeve",
-       "pageinfo-authors": "Numri i autorëve të veçantë",
+       "pageinfo-header-edits": "Historiku i redaktimeve",
+       "pageinfo-watchers": "Numri i mbikqyrësve të faqes",
+       "pageinfo-edits": "Numri total i redaktimeve",
+       "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-move-move_redir-noredirect": "$1 zhvendosi faqen $3 te $4 nëpërmjet një përcjellimi pa lënë një përcjellim",
        "logentry-patrol-patrol": "$1 shënoi versionin $4 të faqes $3 të patrolluar",
        "logentry-patrol-patrol-auto": "$1 automatikisht shënoi versionin $4 të faqes $3 të patrolluar",
-       "logentry-newusers-newusers": "$1 krijoi një llogari",
+       "logentry-newusers-newusers": "Llogaria e përdoruesit $1 është {{GENDER:$2|krijuar}}",
        "logentry-newusers-create": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u krijua.",
-       "logentry-newusers-create2": "$1 krijoi një llogari $3",
-       "logentry-newusers-autocreate": "Llogaria $1 u krijua automatikisht",
+       "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 ad3028e..c295163 100644 (file)
@@ -19,7 +19,7 @@
        "tog-hidepatrolled": "Yangi oʻzgarishlar roʻyxatida tekshirilgan tahrirlarni yashirish",
        "tog-newpageshidepatrolled": "Yangi sahifalar roʻyxatidan tekshirilgan sahifalarni yashirish",
        "tog-extendwatchlist": "Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi",
-       "tog-usenewrc": "Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)",
+       "tog-usenewrc": "Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish",
        "tog-numberheadings": "Sarlavhalarni avtomatik raqamlash",
        "tog-showtoolbar": "Tahrirlash asboblarini koʻrsatish",
        "tog-editondblclick": "Sichqonchaning chap tugmasini ikki marta bosib tahrirlashni boshlash",
@@ -38,7 +38,7 @@
        "tog-shownumberswatching": "Sahifani kuzatuv roʻyxatiga olgan foydalanuvchilar sonini koʻrsatish",
        "tog-oldsig": "Joriy imzo:",
        "tog-fancysig": "Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)",
-       "tog-uselivepreview": "Tez koʻrib chiqish (JavaScript orqali) (sinovda)",
+       "tog-uselivepreview": "Tez koʻrib chiqish",
        "tog-forceeditsummary": "Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatish",
        "tog-watchlisthideown": "Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin",
        "tog-watchlisthidebots": "Botlar qilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin",
        "emailuser": "Foydalanuvchiga maktub",
        "emailuser-title-target": "Ushbu {{GENDER:$1|foydalanuvchi}}ga maktub joʻnatish",
        "emailuser-title-notarget": "Foydalanuvchiga elektron maktub yozish",
-       "emailpage": "Foydalanuvchiga maktub",
        "defemailsubject": "{{SITENAME}} — $1 tomonidan maktub",
        "usermaildisabled": "Foydalanuvchi elektron pochtasi o‘chirilgan",
        "noemailtitle": "Elektron pochta manzili mavjud emas",
        "invert": "Tanlash tartibini almashtirish",
        "namespace_association": "Bogʻliq nomfazo",
        "blanknamespace": "(asosiy)",
-       "contributions": "{{GENDER:$1|Foydalanuvchi}} hissasi",
+       "contributions": "Hissasi",
        "contributions-title": "{{GENDER:$1|Foydalanuvchi}} $1 hissasi",
        "mycontris": "Hissam",
        "contribsub2": "$1 uchun ($2)",
        "sp-contributions-username": "IP-manzil yoki foydalanuvchi nomi:",
        "sp-contributions-toponly": "Faqat oxirgi deb hisoblangan tahrirlarni koʻrsat",
        "sp-contributions-submit": "Qidirish",
-       "whatlinkshere": "Bu sahifaga bog'langan sahifalar",
+       "whatlinkshere": "Bogʻliq sahifalar",
        "whatlinkshere-title": "\"$1\"ga bogʻlangan sahifalar",
        "whatlinkshere-page": "Sahifa:",
        "linkshere": "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bogʻlangan:",
        "tooltip-t-recentchangeslinked": "Bu sahifaga bogʻlangan sahifalardagi yangi oʻzgarishlar",
        "tooltip-feed-rss": "Bu sahifa uchun RSS ta'minot",
        "tooltip-feed-atom": "Bu sahifa uchun Atom ta'minot",
-       "tooltip-t-contributions": "Bu foydalanuvchinig qoʻshgan hissasini koʻrish",
+       "tooltip-t-contributions": "Ushbu foydalanuvchi qoʻshgan hissasini koʻrish",
        "tooltip-t-emailuser": "Ushbu foydalanuvchiga xat jo‘natish",
        "tooltip-t-upload": "Rasmlar yoki media fayllar yuklash",
        "tooltip-t-specialpages": "Maxsus sahifalar ro‘yxati",
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 a875f5c..7113f38 100644 (file)
        "booksources-text": "下面是销售新书和二手书的其他网站的链接的列表,也可能有关于你正在寻找的图书的更多信息:",
        "booksources-invalid-isbn": "提供的ISBN号码并不正确,请检查原始复制来源号码是否有误。",
        "specialloguserlabel": "执行者:",
-       "speciallogtitlelabel": "目标(标题或用户):",
+       "speciallogtitlelabel": "目标(标题,或对于用户使用{{ns:user}}:用户名):",
        "log": "日志",
        "all-logs-page": "所有公开日志",
        "alllogstext": "所有{{SITENAME}}公开日志的联合展示。您可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。",
        "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": "查看系统消息",
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 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 cf17aef..d2dc213 100644 (file)
@@ -3,7 +3,7 @@
                var $label, labelText;
 
                function syncText() {
-                       var value = $(this).val()
+                       var value = $( this ).val()
                                .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
                                .replace( /&/, '&amp;' )
                                .replace( /__+/g, '_' )
@@ -20,7 +20,7 @@
                                .find( '.mw-help-field-hint' )
                                        .show()
                                        .click( function () {
-                                               $(this)
+                                               $( this )
                                                        .closest( '.mw-help-field-container' )
                                                                .find( '.mw-help-field-data' )
                                                                        .slideToggle( 'fast' );
@@ -29,7 +29,7 @@
                // Show/hide code for DB-specific options
                // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here?
                $( '.dbRadio' ).each( function () {
-                       $( document.getElementById( $(this).attr( 'rel' ) ) ).hide();
+                       $( document.getElementById( $( this ).attr( 'rel' ) ) ).hide();
                } );
                $( document.getElementById( $( '.dbRadio:checked' ).attr( 'rel' ) ) ).show();
                $( '.dbRadio' ).click( function () {
 
                // Show/hide random stuff (email, upload)
                $( '.showHideRadio' ).click( function () {
-                       var $wrapper = $( '#' + $(this).attr( 'rel' ) );
-                       if ( $(this).is( ':checked' ) ) {
+                       var $wrapper = $( '#' + $( this ).attr( 'rel' ) );
+                       if ( $( this ).is( ':checked' ) ) {
                                $wrapper.show( 'slow' );
                        } else {
                                $wrapper.hide( 'slow' );
                        }
                } );
                $( '.hideShowRadio' ).click( function () {
-                       var $wrapper = $( '#' + $(this).attr( 'rel' ) );
-                       if ( $(this).is( ':checked' ) ) {
+                       var $wrapper = $( '#' + $( this ).attr( 'rel' ) );
+                       if ( $( this ).is( ':checked' ) ) {
                                $wrapper.hide( 'slow' );
                        } else {
                                $wrapper.show( 'slow' );
@@ -80,9 +80,9 @@
 
                // Enable/disable "other" textboxes
                $( '.enableForOther' ).click( function () {
-                       var $textbox = $( document.getElementById( $(this).attr( 'rel' ) ) );
+                       var $textbox = $( document.getElementById( $( this ).attr( 'rel' ) ) );
                        // FIXME: Ugh, this is ugly
-                       if ( $(this).val() === 'other' ) {
+                       if ( $( this ).val() === 'other' ) {
                                $textbox.removeProp( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
                        } else {
                                $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
index 1958461..7b70048 100644 (file)
@@ -13,7 +13,7 @@
     "grunt-contrib-copy": "0.8.0",
     "grunt-contrib-jshint": "0.11.3",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "1.8.0",
+    "grunt-jscs": "2.1.0",
     "grunt-jsonlint": "1.0.4",
     "grunt-karma": "0.11.0",
     "karma": "0.12.36",
index e056a27..b581485 100644 (file)
@@ -847,10 +847,12 @@ return array(
                        'resources/src/mediawiki/mediawiki.template.mustache.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
+               'dependencies' => 'mediawiki.template',
        ),
        'mediawiki.template.regexp' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.template.regexp.js',
                'targets' => array( 'desktop', 'mobile' ),
+               'dependencies' => 'mediawiki.template',
        ),
        'mediawiki.apipretty' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.apipretty.css',
@@ -1028,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',
@@ -1684,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(
@@ -1881,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 1ac34a5..92f8eb9 100644 (file)
@@ -150,14 +150,14 @@ function updateTooltip( element ) {
                if ( id ) {
                        $label = $( 'label[for="' + id + '"]' );
                        if ( $label.length === 1 ) {
-                               updateTooltipOnElement( element, $label[0] );
+                               updateTooltipOnElement( element, $label[ 0 ] );
                        }
                }
 
                // Search it as parent, because the form control can also be inside the label element itself
                $labelParent = $element.parents( 'label' );
                if ( $labelParent.length === 1 ) {
-                       updateTooltipOnElement( element, $labelParent[0] );
+                       updateTooltipOnElement( element, $labelParent[ 0 ] );
                }
        }
 }
index 9a196b5..e1115d6 100644 (file)
@@ -69,16 +69,16 @@ $.fn.autoEllipsis = function ( options ) {
                // Try cache
                if ( options.matchText ) {
                        if ( !( text in matchTextCache ) ) {
-                               matchTextCache[text] = {};
+                               matchTextCache[ text ] = {};
                        }
-                       if ( !( options.matchText in matchTextCache[text] ) ) {
-                               matchTextCache[text][options.matchText] = {};
+                       if ( !( options.matchText in matchTextCache[ text ] ) ) {
+                               matchTextCache[ text ][ options.matchText ] = {};
                        }
-                       if ( !( w in matchTextCache[text][options.matchText] ) ) {
-                               matchTextCache[text][options.matchText][w] = {};
+                       if ( !( w in matchTextCache[ text ][ options.matchText ] ) ) {
+                               matchTextCache[ text ][ options.matchText ][ w ] = {};
                        }
-                       if ( options.position in matchTextCache[text][options.matchText][w] ) {
-                               $container.html( matchTextCache[text][options.matchText][w][options.position] );
+                       if ( options.position in matchTextCache[ text ][ options.matchText ][ w ] ) {
+                               $container.html( matchTextCache[ text ][ options.matchText ][ w ][ options.position ] );
                                if ( options.tooltip ) {
                                        $container.attr( 'title', text );
                                }
@@ -86,13 +86,13 @@ $.fn.autoEllipsis = function ( options ) {
                        }
                } else {
                        if ( !( text in cache ) ) {
-                               cache[text] = {};
+                               cache[ text ] = {};
                        }
-                       if ( !( w in cache[text] ) ) {
-                               cache[text][w] = {};
+                       if ( !( w in cache[ text ] ) ) {
+                               cache[ text ][ w ] = {};
                        }
-                       if ( options.position in cache[text][w] ) {
-                               $container.html( cache[text][w][options.position] );
+                       if ( options.position in cache[ text ][ w ] ) {
+                               $container.html( cache[ text ][ w ][ options.position ] );
                                if ( options.tooltip ) {
                                        $container.attr( 'title', text );
                                }
@@ -120,19 +120,19 @@ $.fn.autoEllipsis = function ( options ) {
                                        break;
                                case 'center':
                                        // TODO: Use binary search like for 'right'
-                                       i = [Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 )];
+                                       i = [ Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 ) ];
                                        // Begin with making the end shorter
                                        side = 1;
-                                       while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
-                                               $trimmableText.text( trimmableText.slice( 0, i[0] ) + '...' + trimmableText.slice( i[1] ) );
+                                       while ( $trimmableText.outerWidth() + pw > w && i[ 0 ] > 0 ) {
+                                               $trimmableText.text( trimmableText.slice( 0, i[ 0 ] ) + '...' + trimmableText.slice( i[ 1 ] ) );
                                                // Alternate between trimming the end and begining
                                                if ( side === 0 ) {
                                                        // Make the begining shorter
-                                                       i[0]--;
+                                                       i[ 0 ]--;
                                                        side = 1;
                                                } else {
                                                        // Make the end shorter
-                                                       i[1]++;
+                                                       i[ 1 ]++;
                                                        side = 0;
                                                }
                                        }
@@ -152,9 +152,9 @@ $.fn.autoEllipsis = function ( options ) {
                }
                if ( options.matchText ) {
                        $container.highlightText( options.matchText );
-                       matchTextCache[text][options.matchText][w][options.position] = $container.html();
+                       matchTextCache[ text ][ options.matchText ][ w ][ options.position ] = $container.html();
                } else {
-                       cache[text][w][options.position] = $container.html();
+                       cache[ text ][ w ][ options.position ] = $container.html();
                }
 
        } );
index afff463..6203239 100644 (file)
                // until the limit is statisfied.
                if ( fn ) {
                        // stop, when there is nothing to slice - bug 41450
-                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[1].length > 0 ) {
-                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[ 1 ].length > 0 ) {
+                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
                        }
                } else {
                        while ( $.byteLength( inpParts.join( '' ) ) > byteLimit ) {
-                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
                        }
                }
 
index 04f8047..a3cc8fc 100644 (file)
@@ -28,7 +28,7 @@
        }
 
        // We override the animation for all of these color styles
-       $.each([
+       $.each( [
                'backgroundColor',
                'borderBottomColor',
                'borderLeftColor',
                'color',
                'outlineColor'
        ], function ( i, attr ) {
-               $.fx.step[attr] = function ( fx ) {
+               $.fx.step[ attr ] = function ( fx ) {
                        if ( !fx.colorInit ) {
                                fx.start = getColor( fx.elem, attr );
                                fx.end = $.colorUtil.getRGB( fx.end );
                                fx.colorInit = true;
                        }
 
-                       fx.elem.style[attr] = 'rgb(' + [
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10 ), 255 ), 0 )
+                       fx.elem.style[ attr ] = 'rgb(' + [
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 0 ] - fx.start[ 0 ] ) ) + fx.start[ 0 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 1 ] - fx.start[ 1 ] ) ) + fx.start[ 1 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 2 ] - fx.start[ 2 ] ) ) + fx.start[ 2 ], 10 ), 255 ), 0 )
                        ].join( ',' ) + ')';
                };
        } );
index a6ff8bc..c14f2c8 100644 (file)
                        }
 
                        // Look for rgb(num,num,num)
-                       if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) {
+                       if ( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) ) {
                                return [
-                                       parseInt( result[1], 10 ),
-                                       parseInt( result[2], 10 ),
-                                       parseInt( result[3], 10 )
+                                       parseInt( result[ 1 ], 10 ),
+                                       parseInt( result[ 2 ], 10 ),
+                                       parseInt( result[ 3 ], 10 )
                                ];
                        }
 
                        // Look for rgb(num%,num%,num%)
-                       if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) {
+                       if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec( color ) ) {
                                return [
-                                       parseFloat( result[1] ) * 2.55,
-                                       parseFloat( result[2] ) * 2.55,
-                                       parseFloat( result[3] ) * 2.55
+                                       parseFloat( result[ 1 ] ) * 2.55,
+                                       parseFloat( result[ 2 ] ) * 2.55,
+                                       parseFloat( result[ 3 ] ) * 2.55
                                ];
                        }
 
                        // Look for #a0b1c2
-                       if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) {
+                       if ( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) ) {
                                return [
-                                       parseInt( result[1], 16 ),
-                                       parseInt( result[2], 16 ),
-                                       parseInt( result[3], 16 )
+                                       parseInt( result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ], 16 )
                                ];
                        }
 
                        // Look for #fff
-                       if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) {
+                       if ( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) ) {
                                return [
-                                       parseInt( result[1] + result[1], 16 ),
-                                       parseInt( result[2] + result[2], 16 ),
-                                       parseInt( result[3] + result[3], 16)
+                                       parseInt( result[ 1 ] + result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ] + result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ] + result[ 3 ], 16 )
                                ];
                        }
 
                        // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-                       if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) {
+                       if ( result = /rgba\(0, 0, 0, 0\)/.exec( color ) ) {
                                return $.colorUtil.colors.transparent;
                        }
 
                        // Otherwise, we're most likely dealing with a named color
-                       return $.colorUtil.colors[$.trim(color).toLowerCase()];
+                       return $.colorUtil.colors[ $.trim( color ).toLowerCase() ];
                },
 
                /**
                 * @property {Object}
                 */
                colors: {
-                       aqua: [0, 255, 255],
-                       azure: [240, 255, 255],
-                       beige: [245, 245, 220],
-                       black: [0, 0, 0],
-                       blue: [0, 0, 255],
-                       brown: [165, 42, 42],
-                       cyan: [0, 255, 255],
-                       darkblue: [0, 0, 139],
-                       darkcyan: [0, 139, 139],
-                       darkgrey: [169, 169, 169],
-                       darkgreen: [0, 100, 0],
-                       darkkhaki: [189, 183, 107],
-                       darkmagenta: [139, 0, 139],
-                       darkolivegreen: [85, 107, 47],
-                       darkorange: [255, 140, 0],
-                       darkorchid: [153, 50, 204],
-                       darkred: [139, 0, 0],
-                       darksalmon: [233, 150, 122],
-                       darkviolet: [148, 0, 211],
-                       fuchsia: [255, 0, 255],
-                       gold: [255, 215, 0],
-                       green: [0, 128, 0],
-                       indigo: [75, 0, 130],
-                       khaki: [240, 230, 140],
-                       lightblue: [173, 216, 230],
-                       lightcyan: [224, 255, 255],
-                       lightgreen: [144, 238, 144],
-                       lightgrey: [211, 211, 211],
-                       lightpink: [255, 182, 193],
-                       lightyellow: [255, 255, 224],
-                       lime: [0, 255, 0],
-                       magenta: [255, 0, 255],
-                       maroon: [128, 0, 0],
-                       navy: [0, 0, 128],
-                       olive: [128, 128, 0],
-                       orange: [255, 165, 0],
-                       pink: [255, 192, 203],
-                       purple: [128, 0, 128],
-                       violet: [128, 0, 128],
-                       red: [255, 0, 0],
-                       silver: [192, 192, 192],
-                       white: [255, 255, 255],
-                       yellow: [255, 255, 0],
-                       transparent: [255, 255, 255]
+                       aqua: [ 0, 255, 255 ],
+                       azure: [ 240, 255, 255 ],
+                       beige: [ 245, 245, 220 ],
+                       black: [ 0, 0, 0 ],
+                       blue: [ 0, 0, 255 ],
+                       brown: [ 165, 42, 42 ],
+                       cyan: [ 0, 255, 255 ],
+                       darkblue: [ 0, 0, 139 ],
+                       darkcyan: [ 0, 139, 139 ],
+                       darkgrey: [ 169, 169, 169 ],
+                       darkgreen: [ 0, 100, 0 ],
+                       darkkhaki: [ 189, 183, 107 ],
+                       darkmagenta: [ 139, 0, 139 ],
+                       darkolivegreen: [ 85, 107, 47 ],
+                       darkorange: [ 255, 140, 0 ],
+                       darkorchid: [ 153, 50, 204 ],
+                       darkred: [ 139, 0, 0 ],
+                       darksalmon: [ 233, 150, 122 ],
+                       darkviolet: [ 148, 0, 211 ],
+                       fuchsia: [ 255, 0, 255 ],
+                       gold: [ 255, 215, 0 ],
+                       green: [ 0, 128, 0 ],
+                       indigo: [ 75, 0, 130 ],
+                       khaki: [ 240, 230, 140 ],
+                       lightblue: [ 173, 216, 230 ],
+                       lightcyan: [ 224, 255, 255 ],
+                       lightgreen: [ 144, 238, 144 ],
+                       lightgrey: [ 211, 211, 211 ],
+                       lightpink: [ 255, 182, 193 ],
+                       lightyellow: [ 255, 255, 224 ],
+                       lime: [ 0, 255, 0 ],
+                       magenta: [ 255, 0, 255 ],
+                       maroon: [ 128, 0, 0 ],
+                       navy: [ 0, 0, 128 ],
+                       olive: [ 128, 128, 0 ],
+                       orange: [ 255, 165, 0 ],
+                       pink: [ 255, 192, 203 ],
+                       purple: [ 128, 0, 128 ],
+                       violet: [ 128, 0, 128 ],
+                       red: [ 255, 0, 0 ],
+                       silver: [ 192, 192, 192 ],
+                       white: [ 255, 255, 255 ],
+                       yellow: [ 255, 255, 0 ],
+                       transparent: [ 255, 255, 255 ]
                },
 
                /**
                                min = Math.min( r, g, b ),
                                h,
                                s,
-                               l = (max + min) / 2;
+                               l = ( max + min ) / 2;
 
                        if ( max === min ) {
                                // achromatic
                                h = s = 0;
                        } else {
                                d = max - min;
-                               s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+                               s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
                                switch ( max ) {
                                        case r:
-                                               h = (g - b) / d + (g < b ? 6 : 0);
+                                               h = ( g - b ) / d + ( g < b ? 6 : 0 );
                                                break;
                                        case g:
-                                               h = (b - r) / d + 2;
+                                               h = ( b - r ) / d + 2;
                                                break;
                                        case b:
-                                               h = (r - g) / d + 4;
+                                               h = ( r - g ) / d + 4;
                                                break;
                                }
                                h /= 6;
                        }
 
-                       return [h, s, l];
+                       return [ h, s, l ];
                },
 
                /**
                                                t -= 1;
                                        }
                                        if ( t < 1 / 6 ) {
-                                               return p + (q - p) * 6 * t;
+                                               return p + ( q - p ) * 6 * t;
                                        }
                                        if ( t < 1 / 2 ) {
                                                return q;
                                        }
                                        if ( t < 2 / 3 ) {
-                                               return p + (q - p) * (2 / 3 - t) * 6;
+                                               return p + ( q - p ) * ( 2 / 3 - t ) * 6;
                                        }
                                        return p;
                                };
 
-                               q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+                               q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
                                p = 2 * l - q;
                                r = hue2rgb( p, q, h + 1 / 3 );
                                g = hue2rgb( p, q, h );
                                b = hue2rgb( p, q, h - 1 / 3 );
                        }
 
-                       return [r * 255, g * 255, b * 255];
+                       return [ r * 255, g * 255, b * 255 ];
                },
 
                /**
                 */
                getColorBrightness: function ( currentColor, mod ) {
                        var rgbArr = $.colorUtil.getRGB( currentColor ),
-                               hslArr = $.colorUtil.rgbToHsl(rgbArr[0], rgbArr[1], rgbArr[2] );
-                       rgbArr = $.colorUtil.hslToRgb(hslArr[0], hslArr[1], hslArr[2] + mod);
+                               hslArr = $.colorUtil.rgbToHsl( rgbArr[ 0 ], rgbArr[ 1 ], rgbArr[ 2 ] );
+                       rgbArr = $.colorUtil.hslToRgb( hslArr[ 0 ], hslArr[ 1 ], hslArr[ 2 ] + mod );
 
                        return 'rgb(' +
-                               [parseInt( rgbArr[0], 10), parseInt( rgbArr[1], 10 ), parseInt( rgbArr[2], 10 )].join( ',' ) +
+                               [ parseInt( rgbArr[ 0 ], 10 ), parseInt( rgbArr[ 1 ], 10 ), parseInt( rgbArr[ 2 ], 10 ) ].join( ',' ) +
                                ')';
                }
 
index 48341bc..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
-                       context.config[property] = value;
+                       context.config[ property ] = value;
                }
 
        };
                        /* API */
                        // Handle various calling styles
                        if ( args.length > 0 ) {
-                               if ( typeof args[0] === 'object' ) {
+                               if ( typeof args[ 0 ] === 'object' ) {
                                        // Apply set of properties
-                                       for ( key in args[0] ) {
-                                               $.expandableField.configure( context, key, args[0][key] );
+                                       for ( key in args[ 0 ] ) {
+                                               $.expandableField.configure( context, key, args[ 0 ][ key ] );
                                        }
-                               } else if ( typeof args[0] === 'string' ) {
+                               } else if ( typeof args[ 0 ] === 'string' ) {
                                        if ( args.length > 1 ) {
                                                // Set property values
-                                               $.expandableField.configure( context, args[0], args[1] );
+                                               $.expandableField.configure( context, args[ 0 ], args[ 1 ] );
 
                                        // TODO: Do we need to check both null and undefined?
                                        } else if ( returnValue === null || returnValue === undefined ) {
                                                // Get property values, but don't give access to internal data - returns only the first
-                                               returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+                                               returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
                                        }
                                }
                        }
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 64827fb..3064b42 100644 (file)
@@ -8,7 +8,7 @@ function serializeControls( controls ) {
                len = controls.length;
 
        for ( i = 0; i < len; i++ ) {
-               data[ controls[i].name ] = controls[i].value;
+               data[ controls[ i ].name ] = controls[ i ].value;
        }
 
        return data;
@@ -23,7 +23,7 @@ function serializeControls( controls ) {
  * @return {Object}
  */
 jQuery.fn.getAttrs = function () {
-       return serializeControls( this[0].attributes );
+       return serializeControls( this[ 0 ].attributes );
 };
 
 /**
index 8fca056..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.
@@ -106,11 +153,11 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) {
                selectedSrc = null;
        candidates = srcset.split( / *, */ );
        for ( i = 0; i < candidates.length; i++ ) {
-               candidate = candidates[i];
+               candidate = candidates[ i ];
                bits = candidate.split( / +/ );
-               src = bits[0];
-               if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
-                       ratioStr = bits[1].slice( 0, -1 );
+               src = bits[ 0 ];
+               if ( bits.length > 1 && bits[ 1 ].charAt( bits[ 1 ].length - 1 ) === 'x' ) {
+                       ratioStr = bits[ 1 ].slice( 0, -1 );
                        ratio = parseFloat( ratioStr );
                        if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
                                selectedRatio = ratio;
index 1ec4db0..e37f19b 100644 (file)
                        var i,
                                patArray = pat.split( ' ' );
                        for ( i = 0; i < patArray.length; i++ ) {
-                               if ( patArray[i].length === 0 ) {
+                               if ( patArray[ i ].length === 0 ) {
                                        continue;
                                }
-                               $.highlightText.innerHighlight( node, patArray[i] );
+                               $.highlightText.innerHighlight( node, patArray[ i ] );
                        }
                        return node;
                },
@@ -30,7 +30,7 @@
                                // look for an occurrence of our pattern and store the starting position
                                match = node.data.match( new RegExp( '(^|\\s)' + mw.RegExp.escape( pat ), 'i' ) );
                                if ( match ) {
-                                       pos = match.index + match[1].length; // include length of any matched spaces
+                                       pos = match.index + match[ 1 ].length; // include length of any matched spaces
                                        // create the span wrapper for the matched text
                                        spannode = document.createElement( 'span' );
                                        spannode.className = 'highlight';
@@ -55,7 +55,7 @@
                        ) {
                                for ( i = 0; i < node.childNodes.length; ++i ) {
                                        // call the highlight function for each child node
-                                       $.highlightText.innerHighlight( node.childNodes[i], pat );
+                                       $.highlightText.innerHighlight( node.childNodes[ i ], pat );
                                }
                        }
                }
index 0b42354..f5932b2 100644 (file)
@@ -5,16 +5,16 @@
 
 /**
  * Gets a localized message, using parameters from options if present.
- * @ignore
  *
+ * @ignore
  * @param {Object} options
  * @param {string} key
  * @return {string} Localized message
  */
 function msg( options, key ) {
-       var args = options.params[key] || [];
+       var args = options.params[ key ] || [];
        // Format: mw.msg( key [, p1, p2, ...] )
-       args.unshift( options.prefix + ( options.keys[key] || key ) );
+       args.unshift( options.prefix + ( options.keys[ key ] || key ) );
        return mw.msg.apply( mw, args );
 }
 
@@ -108,7 +108,7 @@ function msg( options, key ) {
  */
 $.fn.localize = function ( options ) {
        var $target = this,
-               attributes = ['title', 'alt', 'placeholder'];
+               attributes = [ 'title', 'alt', 'placeholder' ];
 
        // Extend options
        options = $.extend( {
index 5484212..27ceb2b 100644 (file)
                                return false;
                        }
                        for ( var i = 0; i < arrThis.length; i++ ) {
-                               if ( $.isArray( arrThis[i] ) ) {
-                                       if ( !$.compareArray( arrThis[i], arrAgainst[i] ) ) {
+                               if ( $.isArray( arrThis[ i ] ) ) {
+                                       if ( !$.compareArray( arrThis[ i ], arrAgainst[ i ] ) ) {
                                                return false;
                                        }
-                               } else if ( arrThis[i] !== arrAgainst[i] ) {
+                               } else if ( arrThis[ i ] !== arrAgainst[ i ] ) {
                                        return false;
                                }
                        }
                                                        // Check if this property is also present in the other object
                                                        if ( prop in objectB ) {
                                                                // Compare the types of the properties
-                                                               type = typeof objectA[prop];
-                                                               if ( type === typeof objectB[prop] ) {
+                                                               type = typeof objectA[ prop ];
+                                                               if ( type === typeof objectB[ prop ] ) {
                                                                        // Recursively check objects inside this one
                                                                        switch ( type ) {
                                                                                case 'object' :
-                                                                                       if ( !$.compareObject( objectA[prop], objectB[prop] ) ) {
+                                                                                       if ( !$.compareObject( objectA[ prop ], objectB[ prop ] ) ) {
                                                                                                return false;
                                                                                        }
                                                                                        break;
                                                                                case 'function' :
                                                                                        // Functions need to be strings to compare them properly
-                                                                                       if ( objectA[prop].toString() !== objectB[prop].toString() ) {
+                                                                                       if ( objectA[ prop ].toString() !== objectB[ prop ].toString() ) {
                                                                                                return false;
                                                                                        }
                                                                                        break;
                                                                                default:
                                                                                        // Strings, numbers
-                                                                                       if ( objectA[prop] !== objectB[prop] ) {
+                                                                                       if ( objectA[ prop ] !== objectB[ prop ] ) {
                                                                                                return false;
                                                                                        }
                                                                                        break;
index 3d25a93..9c18a91 100644 (file)
  * @version 2.1.0
  * @license MIT
  */
-( function ($) {
+( function ( $ ) {
 
-       var isInputSupported = 'placeholder' in document.createElement('input'),
-               isTextareaSupported = 'placeholder' in document.createElement('textarea'),
+       var isInputSupported = 'placeholder' in document.createElement( 'input' ),
+               isTextareaSupported = 'placeholder' in document.createElement( 'textarea' ),
                prototype = $.fn,
                valHooks = $.valHooks,
                propHooks = $.propHooks,
                // https://github.com/mathiasbynens/jquery-placeholder/pull/99
                try {
                        return document.activeElement;
-               } catch (err) {}
+               } catch ( err ) {}
        }
 
-       function args(elem) {
+       function args( elem ) {
                // Return an object of element attributes
                var newAttrs = {},
                                rinlinejQuery = /^jQuery\d+$/;
-               $.each(elem.attributes, function (i, attr) {
-                       if (attr.specified && !rinlinejQuery.test(attr.name)) {
-                               newAttrs[attr.name] = attr.value;
+               $.each( elem.attributes, function ( i, attr ) {
+                       if ( attr.specified && !rinlinejQuery.test( attr.name ) ) {
+                               newAttrs[ attr.name ] = attr.value;
                        }
-               });
+               } );
                return newAttrs;
        }
 
-       function clearPlaceholder(event, value) {
+       function clearPlaceholder( event, value ) {
                var input = this,
-                               $input = $(input);
-               if (input.value === $input.attr('placeholder') && $input.hasClass('placeholder')) {
-                       if ($input.data('placeholder-password')) {
-                               $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
+                               $input = $( input );
+               if ( input.value === $input.attr( 'placeholder' ) && $input.hasClass( 'placeholder' ) ) {
+                       if ( $input.data( 'placeholder-password' ) ) {
+                               $input = $input.hide().next().show().attr( 'id', $input.removeAttr( 'id' ).data( 'placeholder-id' ) );
                                // If `clearPlaceholder` was called from `$.valHooks.input.set`
-                               if (event === true) {
-                                       $input[0].value = value;
+                               if ( event === true ) {
+                                       $input[ 0 ].value = value;
                                        return value;
                                }
                                $input.focus();
                        } else {
                                input.value = '';
-                               $input.removeClass('placeholder');
-                               if (input === safeActiveElement()) {
+                               $input.removeClass( 'placeholder' );
+                               if ( input === safeActiveElement() ) {
                                        input.select();
                                }
                        }
        function setPlaceholder() {
                var $replacement,
                                input = this,
-                               $input = $(input),
+                               $input = $( input ),
                                id = this.id;
-               if (!input.value) {
-                       if (input.type === 'password') {
-                               if (!$input.data('placeholder-textinput')) {
+               if ( !input.value ) {
+                       if ( input.type === 'password' ) {
+                               if ( !$input.data( 'placeholder-textinput' ) ) {
                                        try {
-                                               $replacement = $input.clone().attr({ 'type': 'text' });
-                                       } catch (e) {
-                                               $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
+                                               $replacement = $input.clone().attr( { type: 'text' } );
+                                       } catch ( e ) {
+                                               $replacement = $( '<input>' ).attr( $.extend( args( this ), { type: 'text' } ) );
                                        }
                                        $replacement
-                                                       .removeAttr('name')
-                                                       .data({
+                                                       .removeAttr( 'name' )
+                                                       .data( {
                                                                'placeholder-password': $input,
                                                                'placeholder-id': id
-                                                       })
-                                                       .bind('focus.placeholder drop.placeholder', clearPlaceholder);
+                                                       } )
+                                                       .bind( 'focus.placeholder drop.placeholder', clearPlaceholder );
                                        $input
-                                                       .data({
+                                                       .data( {
                                                                'placeholder-textinput': $replacement,
                                                                'placeholder-id': id
-                                                       })
-                                                       .before($replacement);
+                                                       } )
+                                                       .before( $replacement );
                                }
-                               $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
+                               $input = $input.removeAttr( 'id' ).hide().prev().attr( 'id', id ).show();
                                // Note: `$input[0] != input` now!
                        }
-                       $input.addClass('placeholder');
-                       $input[0].value = $input.attr('placeholder');
+                       $input.addClass( 'placeholder' );
+                       $input[ 0 ].value = $input.attr( 'placeholder' );
                } else {
-                       $input.removeClass('placeholder');
+                       $input.removeClass( 'placeholder' );
                }
        }
 
-       function changePlaceholder(text) {
+       function changePlaceholder( text ) {
                var hasArgs = arguments.length,
                                $input = this;
-               if (hasArgs) {
-                       if ($input.attr('placeholder') !== text) {
-                               $input.prop('placeholder', text);
-                               if ($input.hasClass('placeholder')) {
-                                       $input[0].value = text;
+               if ( hasArgs ) {
+                       if ( $input.attr( 'placeholder' ) !== text ) {
+                               $input.prop( 'placeholder', text );
+                               if ( $input.hasClass( 'placeholder' ) ) {
+                                       $input[ 0 ].value = text;
                                }
                        }
                }
        }
 
-       if (isInputSupported && isTextareaSupported) {
+       if ( isInputSupported && isTextareaSupported ) {
 
-               placeholder = prototype.placeholder = function (text) {
+               placeholder = prototype.placeholder = function ( text ) {
                        var hasArgs = arguments.length;
 
-                       if (hasArgs) {
-                               changePlaceholder.call(this, text);
+                       if ( hasArgs ) {
+                               changePlaceholder.call( this, text );
                        }
 
                        return this;
 
        } else {
 
-               placeholder = prototype.placeholder = function (text) {
+               placeholder = prototype.placeholder = function ( text ) {
                        var $this = this,
                                hasArgs = arguments.length;
 
-                       if (hasArgs) {
-                               changePlaceholder.call(this, text);
+                       if ( hasArgs ) {
+                               changePlaceholder.call( this, text );
                        }
 
                        $this
-                               .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
+                               .filter( ( isInputSupported ? 'textarea' : ':input' ) + '[placeholder]' )
                                .filter( function () {
-                                       return !$(this).data('placeholder-enabled');
-                               })
-                               .bind({
+                                       return !$( this ).data( 'placeholder-enabled' );
+                               } )
+                               .bind( {
                                        'focus.placeholder drop.placeholder': clearPlaceholder,
                                        'blur.placeholder': setPlaceholder
-                               })
-                               .data('placeholder-enabled', true)
-                               .trigger('blur.placeholder');
+                               } )
+                               .data( 'placeholder-enabled', true )
+                               .trigger( 'blur.placeholder' );
                        return $this;
                };
 
                placeholder.textarea = isTextareaSupported;
 
                hooks = {
-                       'get': function (element) {
-                               var $element = $(element),
-                                       $passwordInput = $element.data('placeholder-password');
-                               if ($passwordInput) {
-                                       return $passwordInput[0].value;
+                       get: function ( element ) {
+                               var $element = $( element ),
+                                       $passwordInput = $element.data( 'placeholder-password' );
+                               if ( $passwordInput ) {
+                                       return $passwordInput[ 0 ].value;
                                }
 
-                               return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
+                               return $element.data( 'placeholder-enabled' ) && $element.hasClass( 'placeholder' ) ? '' : element.value;
                        },
-                       'set': function (element, value) {
-                               var $element = $(element),
-                                       $passwordInput = $element.data('placeholder-password');
-                               if ($passwordInput) {
-                                       $passwordInput[0].value = value;
+                       set: function ( element, value ) {
+                               var $element = $( element ),
+                                       $passwordInput = $element.data( 'placeholder-password' );
+                               if ( $passwordInput ) {
+                                       $passwordInput[ 0 ].value = value;
                                        return value;
                                }
 
-                               if (!$element.data('placeholder-enabled')) {
+                               if ( !$element.data( 'placeholder-enabled' ) ) {
                                        element.value = value;
                                        return value;
                                }
-                               if (!value) {
+                               if ( !value ) {
                                        element.value = value;
                                        // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
-                                       if (element !== safeActiveElement()) {
+                                       if ( element !== safeActiveElement() ) {
                                                // We can't use `triggerHandler` here because of dummy text/password inputs :(
-                                               setPlaceholder.call(element);
+                                               setPlaceholder.call( element );
                                        }
-                               } else if ($element.hasClass('placeholder')) {
-                                       if (!clearPlaceholder.call(element, true, value)) {
+                               } else if ( $element.hasClass( 'placeholder' ) ) {
+                                       if ( !clearPlaceholder.call( element, true, value ) ) {
                                                element.value = value;
                                        }
                                } else {
                        }
                };
 
-               if (!isInputSupported) {
+               if ( !isInputSupported ) {
                        valHooks.input = hooks;
                        propHooks.value = hooks;
                }
-               if (!isTextareaSupported) {
+               if ( !isTextareaSupported ) {
                        valHooks.textarea = hooks;
                        propHooks.value = hooks;
                }
 
                $( function () {
                        // Look for forms
-                       $(document).delegate('form', 'submit.placeholder', function () {
+                       $( document ).delegate( 'form', 'submit.placeholder', function () {
                                // Clear the placeholder values so they don't get submitted
-                               var $inputs = $('.placeholder', this).each(clearPlaceholder);
+                               var $inputs = $( '.placeholder', this ).each( clearPlaceholder );
                                setTimeout( function () {
-                                       $inputs.each(setPlaceholder);
-                               }, 10);
-                       });
-               });
+                                       $inputs.each( setPlaceholder );
+                               }, 10 );
+                       } );
+               } );
 
                // Clear placeholder values upon page reload
-               $(window).bind('beforeunload.placeholder', function () {
-                       $('.placeholder').each( function () {
+               $( window ).bind( 'beforeunload.placeholder', function () {
+                       $( '.placeholder' ).each( function () {
                                this.value = '';
-                       });
-               });
+                       } );
+               } );
 
        }
-}(jQuery));
+}( jQuery ) );
index 8908067..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.
                                elOutputWrapper.appendChild( elContainer );
 
                                util.each( style, function ( key, value ) {
-                                       elOutputWrapper.style[key] = value;
+                                       elOutputWrapper.style[ key ] = value;
                                } );
                                return elOutputWrapper;
                        }
                 * 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 ) {
 
                        if ( currName ) {
                                currPathArray.push( currName );
-                               currVal = currObj[currName];
+                               currVal = currObj[ currName ];
                        } else {
                                currName = '(root)';
                                currVal = currObj;
                 * 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 ) {
                        if ( !( fnName in this.methodCallTracker ) ) {
-                               this.missingTests[fnName] = true;
+                               this.missingTests[ fnName ] = true;
                                return false;
                        }
                        return true;
                 * 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 7c9bec3..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
         */
@@ -246,10 +248,10 @@ $.suggestions = {
                        case 'update':
                        case '$region':
                        case 'expandFrom':
-                               context.config[property] = value;
+                               context.config[ property ] = value;
                                break;
                        case 'suggestions':
-                               context.config[property] = value;
+                               context.config[ property ] = value;
                                // Update suggestions
                                if ( context.data !== undefined ) {
                                        if ( context.data.$textbox.val().length === 0 ) {
@@ -277,7 +279,7 @@ $.suggestions = {
                                                                expandFrom = 'left';
 
                                                        // Catch invalid values, default to 'auto'
-                                                       } else if ( $.inArray( expandFrom, ['left', 'right', 'start', 'end', 'auto'] ) === -1 ) {
+                                                       } else if ( $.inArray( expandFrom, [ 'left', 'right', 'start', 'end', 'auto' ] ) === -1 ) {
                                                                expandFrom = 'auto';
                                                        }
 
@@ -336,11 +338,11 @@ $.suggestions = {
                                                expWidth = -1;
                                                for ( i = 0; i < context.config.suggestions.length; i++ ) {
                                                        /*jshint loopfunc:true */
-                                                       text = context.config.suggestions[i];
+                                                       text = context.config.suggestions[ i ];
                                                        $result = $( '<div>' )
                                                                .addClass( 'suggestions-result' )
                                                                .attr( 'rel', i )
-                                                               .data( 'text', context.config.suggestions[i] )
+                                                               .data( 'text', context.config.suggestions[ i ] )
                                                                .mousemove( function () {
                                                                        context.data.selectedWithMouse = true;
                                                                        $.suggestions.highlight(
@@ -352,7 +354,7 @@ $.suggestions = {
                                                                .appendTo( $results );
                                                        // Allow custom rendering
                                                        if ( typeof context.config.result.render === 'function' ) {
-                                                               context.config.result.render.call( $result, context.config.suggestions[i], context );
+                                                               context.config.result.render.call( $result, context.config.suggestions[ i ], context );
                                                        } else {
                                                                $result.text( text );
                                                        }
@@ -393,28 +395,29 @@ $.suggestions = {
                                }
                                break;
                        case 'maxRows':
-                               context.config[property] = Math.max( 1, Math.min( 100, value ) );
+                               context.config[ property ] = Math.max( 1, Math.min( 100, value ) );
                                break;
                        case 'delay':
-                               context.config[property] = Math.max( 0, Math.min( 1200, value ) );
+                               context.config[ property ] = Math.max( 0, Math.min( 1200, value ) );
                                break;
                        case 'cacheMaxAge':
-                               context.config[property] = Math.max( 1, value );
+                               context.config[ property ] = Math.max( 1, value );
                                break;
                        case 'maxExpandFactor':
-                               context.config[property] = Math.max( 1, value );
+                               context.config[ property ] = Math.max( 1, value );
                                break;
                        case 'cache':
                        case 'submitOnClick':
                        case 'positionFromLeft':
                        case 'highlightInput':
-                               context.config[property] = !!value;
+                               context.config[ property ] = !!value;
                                break;
                }
        },
 
        /**
         * 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 ) {
@@ -595,18 +599,18 @@ $.fn.suggestions = function () {
 
                // Handle various calling styles
                if ( args.length > 0 ) {
-                       if ( typeof args[0] === 'object' ) {
+                       if ( typeof args[ 0 ] === 'object' ) {
                                // Apply set of properties
-                               for ( key in args[0] ) {
-                                       $.suggestions.configure( context, key, args[0][key] );
+                               for ( key in args[ 0 ] ) {
+                                       $.suggestions.configure( context, key, args[ 0 ][ key ] );
                                }
-                       } else if ( typeof args[0] === 'string' ) {
+                       } else if ( typeof args[ 0 ] === 'string' ) {
                                if ( args.length > 1 ) {
                                        // Set property values
-                                       $.suggestions.configure( context, args[0], args[1] );
+                                       $.suggestions.configure( context, args[ 0 ], args[ 1 ] );
                                } else if ( returnValue === null || returnValue === undefined ) {
                                        // Get property values, but don't give access to internal data - returns only the first
-                                       returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+                                       returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
                                }
                        }
                }
index 00fb480..23474c0 100644 (file)
@@ -70,8 +70,8 @@
                var i,
                        len = parsers.length;
                for ( i = 0; i < len; i++ ) {
-                       if ( parsers[i].id.toLowerCase() === name.toLowerCase() ) {
-                               return parsers[i];
+                       if ( parsers[ i ].id.toLowerCase() === name.toLowerCase() ) {
+                               return parsers[ i ];
                        }
                }
                return false;
                        needed = ( rows.length > 4 ) ? 5 : rows.length;
 
                while ( i < l ) {
-                       if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
-                               nodeValue = $.trim( getElementSortKey( rows[rowIndex].cells[cellIndex] ) );
+                       if ( rows[ rowIndex ] && rows[ rowIndex ].cells[ cellIndex ] ) {
+                               nodeValue = $.trim( getElementSortKey( rows[ rowIndex ].cells[ cellIndex ] ) );
                        } else {
                                nodeValue = '';
                        }
 
                        if ( nodeValue !== '' ) {
-                               if ( parsers[i].is( nodeValue, table ) ) {
+                               if ( parsers[ i ].is( nodeValue, table ) ) {
                                        concurrent++;
                                        rowIndex++;
                                        if ( concurrent >= needed ) {
                                                // Confirmed the parser for multiple cells, let's return it
-                                               return parsers[i];
+                                               return parsers[ i ];
                                        }
                                } else {
                                        // Check next parser, reset rows
                }
 
                // 0 is always the generic parser (text)
-               return parsers[0];
+               return parsers[ 0 ];
        }
 
        function buildParserCache( table, $headers ) {
                var sortType, cells, len, i, parser,
-                       rows = table.tBodies[0].rows,
+                       rows = table.tBodies[ 0 ].rows,
                        parsers = [];
 
-               if ( rows[0] ) {
+               if ( rows[ 0 ] ) {
 
-                       cells = rows[0].cells;
+                       cells = rows[ 0 ].cells;
                        len = cells.length;
 
                        for ( i = 0; i < len; i++ ) {
 
        function buildCache( table ) {
                var i, j, $row, cols,
-                       totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
-                       totalCells = ( table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length ) || 0,
+                       totalRows = ( table.tBodies[ 0 ] && table.tBodies[ 0 ].rows.length ) || 0,
+                       totalCells = ( table.tBodies[ 0 ].rows[ 0 ] && table.tBodies[ 0 ].rows[ 0 ].cells.length ) || 0,
                        config = $( table ).data( 'tablesorter' ).config,
                        parsers = config.parsers,
                        cache = {
                for ( i = 0; i < totalRows; ++i ) {
 
                        // Add the table data to main data array
-                       $row = $( table.tBodies[0].rows[i] );
+                       $row = $( table.tBodies[ 0 ].rows[ i ] );
                        cols = [];
 
                        // if this is a child row, add it to the last row's children and
                        // continue to the next row
                        if ( $row.hasClass( config.cssChildRow ) ) {
-                               cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add( $row );
+                               cache.row[ cache.row.length - 1 ] = cache.row[ cache.row.length - 1 ].add( $row );
                                // go to the next for loop
                                continue;
                        }
                        cache.row.push( $row );
 
                        for ( j = 0; j < totalCells; ++j ) {
-                               cols.push( parsers[j].format( getElementSortKey( $row[0].cells[j] ), table, $row[0].cells[j] ) );
+                               cols.push( parsers[ j ].format( getElementSortKey( $row[ 0 ].cells[ j ] ), table, $row[ 0 ].cells[ j ] ) );
                        }
 
                        cols.push( cache.normalized.length ); // add position for rowCache
                        row = cache.row,
                        normalized = cache.normalized,
                        totalRows = normalized.length,
-                       checkCell = ( normalized[0].length - 1 ),
+                       checkCell = ( normalized[ 0 ].length - 1 ),
                        fragment = document.createDocumentFragment();
 
                for ( i = 0; i < totalRows; i++ ) {
-                       pos = normalized[i][checkCell];
+                       pos = normalized[ i ][ checkCell ];
 
-                       l = row[pos].length;
+                       l = row[ pos ].length;
 
                        for ( j = 0; j < l; j++ ) {
-                               fragment.appendChild( row[pos][j] );
+                               fragment.appendChild( row[ pos ][ j ] );
                        }
 
                }
-               table.tBodies[0].appendChild( fragment );
+               table.tBodies[ 0 ].appendChild( fragment );
 
                $( table ).trigger( 'sortEnd.tablesorter' );
        }
         *
         * 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,
                        $tfoot = $( '<tfoot>' );
                        len = $rows.length;
                        for ( i = len - 1; i >= 0; i-- ) {
-                               if ( $( $rows[i] ).children( 'td' ).length ) {
+                               if ( $( $rows[ i ] ).children( 'td' ).length ) {
                                        break;
                                }
-                               $tfoot.prepend( $( $rows[i] ) );
+                               $tfoot.prepend( $( $rows[ i ] ) );
                        }
                        $table.append( $tfoot );
                }
                                        colspan = Number( cell.colSpan );
 
                                        // Skip the spots in the exploded matrix that are already filled
-                                       while ( exploded[rowIndex] && exploded[rowIndex][columnIndex] !== undefined ) {
+                                       while ( exploded[ rowIndex ] && exploded[ rowIndex ][ columnIndex ] !== undefined ) {
                                                ++columnIndex;
                                        }
 
                                        // in the exploded matrix rowspan times colspan times, with the proper offsets
                                        for ( matrixColumnIndex = columnIndex; matrixColumnIndex < columnIndex + colspan; ++matrixColumnIndex ) {
                                                for ( matrixRowIndex = rowIndex; matrixRowIndex < rowIndex + rowspan; ++matrixRowIndex ) {
-                                                       if ( !exploded[matrixRowIndex] ) {
-                                                               exploded[matrixRowIndex] = [];
+                                                       if ( !exploded[ matrixRowIndex ] ) {
+                                                               exploded[ matrixRowIndex ] = [];
                                                        }
-                                                       exploded[matrixRowIndex][matrixColumnIndex] = cell;
+                                                       exploded[ matrixRowIndex ][ matrixColumnIndex ] = cell;
                                                }
                                        }
                                } );
                                }
                        } );
                        // We cannot use $.unique() here because it sorts into dom order, which is undesirable
-                       $tableHeaders = $( uniqueElements( exploded[longestTR] ) ).filter( 'th' );
+                       $tableHeaders = $( uniqueElements( exploded[ longestTR ] ) ).filter( 'th' );
                }
 
                // as each header can span over multiple columns (using colspan=N),
                                        .prop( 'tabIndex', 0 )
                                        .attr( {
                                                role: 'columnheader button',
-                                               title: msg[1]
+                                               title: msg[ 1 ]
                                        } );
                        }
 
                        // add cell to headerList
-                       config.headerList[headerIndex] = this;
+                       config.headerList[ headerIndex ] = this;
                } );
 
                return $tableHeaders;
                var i,
                                len = a.length;
                for ( i = 0; i < len; i++ ) {
-                       if ( a[i][0] === v ) {
+                       if ( a[ i ][ 0 ] === v ) {
                                return true;
                        }
                }
                $.each( headerToColumns, function ( headerIndex, columns ) {
 
                        $.each( columns, function ( i, columnIndex ) {
-                               var header = $headers[headerIndex],
+                               var header = $headers[ headerIndex ],
                                        $header = $( header );
 
                                if ( !isValueInArray( columnIndex, sortList ) ) {
                                } else {
                                        // Column shall be sorted: Apply designated count and order.
                                        $.each( sortList, function ( j, sortColumn ) {
-                                               if ( sortColumn[0] === i ) {
+                                               if ( sortColumn[ 0 ] === i ) {
                                                        $header.data( {
-                                                               order: sortColumn[1],
-                                                               count: sortColumn[1] + 1
+                                                               order: sortColumn[ 1 ],
+                                                               count: sortColumn[ 1 ] + 1
                                                        } );
                                                        return false;
                                                }
 
        function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
                // Remove all header information and reset titles to default message
-               $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
+               $headers.removeClass( css[ 0 ] ).removeClass( css[ 1 ] ).attr( 'title', msg[ 1 ] );
 
                for ( var i = 0; i < list.length; i++ ) {
-                       $headers.eq( columnToHeader[ list[i][0] ] )
-                               .addClass( css[ list[i][1] ] )
-                               .attr( 'title', msg[ list[i][1] ] );
+                       $headers.eq( columnToHeader[ list[ i ][ 0 ] ] )
+                               .addClass( css[ list[ i ][ 1 ] ] )
+                               .attr( 'title', msg[ list[ i ][ 1 ] ] );
                }
        }
 
                        sortFn = [],
                        len = sortList.length;
                for ( i = 0; i < len; i++ ) {
-                       sortFn[i] = ( sortList[i][1] ) ? sortTextDesc : sortText;
+                       sortFn[ i ] = ( sortList[ i ][ 1 ] ) ? sortTextDesc : sortText;
                }
                cache.normalized.sort( function ( array1, array2 ) {
                        var i, col, ret;
                        for ( i = 0; i < len; i++ ) {
-                               col = sortList[i][0];
-                               ret = sortFn[i].call( this, array1[col], array2[col] );
+                               col = sortList[ i ][ 0 ];
+                               ret = sortFn[ i ].call( this, array1[ col ], array2[ col ] );
                                if ( ret !== 0 ) {
                                        return ret;
                                }
                        }
                        // Fall back to index number column to ensure stable sort
-                       return sortText.call( this, array1[array1.length - 1], array2[array2.length - 1] );
+                       return sortText.call( this, array1[ array1.length - 1 ], array2[ array2.length - 1 ] );
                } );
                return cache;
        }
                        separatorTransformTable = mw.config.get( 'wgSeparatorTransformTable' ),
                        digitTransformTable = mw.config.get( 'wgDigitTransformTable' );
 
-               if ( separatorTransformTable === null || ( separatorTransformTable[0] === '' && digitTransformTable[2] === '' ) ) {
+               if ( separatorTransformTable === null || ( separatorTransformTable[ 0 ] === '' && digitTransformTable[ 2 ] === '' ) ) {
                        ts.transformTable = false;
                } else {
                        ts.transformTable = {};
 
                        // Unpack the transform table
-                       ascii = separatorTransformTable[0].split( '\t' ).concat( digitTransformTable[0].split( '\t' ) );
-                       localised = separatorTransformTable[1].split( '\t' ).concat( digitTransformTable[1].split( '\t' ) );
+                       ascii = separatorTransformTable[ 0 ].split( '\t' ).concat( digitTransformTable[ 0 ].split( '\t' ) );
+                       localised = separatorTransformTable[ 1 ].split( '\t' ).concat( digitTransformTable[ 1 ].split( '\t' ) );
 
                        // Construct regex for number identification
                        for ( i = 0; i < ascii.length; i++ ) {
-                               ts.transformTable[localised[i]] = ascii[i];
-                               digits.push( mw.RegExp.escape( localised[i] ) );
+                               ts.transformTable[ localised[ i ] ] = ascii[ i ];
+                               digits.push( mw.RegExp.escape( localised[ i ] ) );
                        }
                }
                digitClass = '[' + digits.join( '', digits ) + ']';
                ts.monthNames = {};
 
                for ( i = 0; i < 12; i++ ) {
-                       name = mw.language.months.names[i].toLowerCase();
-                       ts.monthNames[name] = i + 1;
+                       name = mw.language.months.names[ i ].toLowerCase();
+                       ts.monthNames[ name ] = i + 1;
                        regex.push( mw.RegExp.escape( name ) );
-                       name = mw.language.months.genitive[i].toLowerCase();
-                       ts.monthNames[name] = i + 1;
+                       name = mw.language.months.genitive[ i ].toLowerCase();
+                       ts.monthNames[ name ] = i + 1;
                        regex.push( mw.RegExp.escape( name ) );
-                       name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' );
-                       ts.monthNames[name] = i + 1;
+                       name = mw.language.months.abbrev[ i ].toLowerCase().replace( '.', '' );
+                       ts.monthNames[ name ] = i + 1;
                        regex.push( mw.RegExp.escape( name ) );
                }
 
 
                // Build RegEx
                // Any date formated with . , ' - or /
-               ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i );
+               ts.dateRegex[ 0 ] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i );
 
                // Written Month name, dmy
-               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[ 1 ] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
                // Written Month name, mdy
-               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[ 2 ] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
        }
 
         * 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,
                                col = 0,
                                l = this.cells.length;
                        for ( i = 0; i < l; i++ ) {
-                               $( this.cells[i] ).data( 'tablesorter', {
+                               $( this.cells[ i ] ).data( 'tablesorter', {
                                        realCellIndex: col,
                                        realRowIndex: this.rowIndex
                                } );
-                               col += this.cells[i].colSpan;
+                               col += this.cells[ i ].colSpan;
                        }
                } );
 
                }
 
                while ( rowspanCells.length ) {
-                       if ( $.data( rowspanCells[0], 'tablesorter' ).needResort ) {
+                       if ( $.data( rowspanCells[ 0 ], 'tablesorter' ).needResort ) {
                                resortCells();
                        }
 
                        cell.rowSpan = 1;
                        $nextRows = $( cell ).parent().nextAll();
                        for ( i = 0; i < rowSpan - 1; i++ ) {
-                               $tds = $( $nextRows[i].cells ).filter( filterfunc );
+                               $tds = $( $nextRows[ i ].cells ).filter( filterfunc );
                                $clone = $( cell ).clone();
                                $clone.data( 'tablesorter', {
                                        realCellIndex: spanningRealCellIndex,
                $.each( sortObjects, function ( i, sortObject ) {
                        $.each( sortObject, function ( columnIndex, order ) {
                                var orderIndex = ( order === 'desc' ) ? 1 : 0;
-                               sortList.push( [parseInt( columnIndex, 10 ), orderIndex] );
+                               sortList.push( [ parseInt( columnIndex, 10 ), orderIndex ] );
                        } );
                } );
                return sortList;
                        monthNames: {},
 
                        /**
-                        * @param $tables {jQuery}
-                        * @param settings {Object} (optional)
+                        * @param {jQuery} $tables
+                        * @param {Object} [settings]
                         */
                        construct: function ( $tables, settings ) {
                                return $tables.each( function ( i, table ) {
                                                // cells get event .change() and bubbles up to the <table> here
                                                cache = buildCache( table );
 
-                                               totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
+                                               totalRows = ( $table[ 0 ].tBodies[ 0 ] && $table[ 0 ].tBodies[ 0 ].rows.length ) || 0;
                                                if ( !table.sortDisabled && totalRows > 0 ) {
                                                        cell = this;
                                                        $cell = $( cell );
                                                        columns = config.headerToColumns[ $cell.data( 'headerIndex' ) ];
                                                        newSortList = $.map( columns, function ( c ) {
                                                                // jQuery "helpfully" flattens the arrays...
-                                                               return [[c, $cell.data( 'order' )]];
+                                                               return [ [ c, $cell.data( 'order' ) ] ];
                                                        } );
                                                        // Index of first column belonging to this header
-                                                       i = columns[0];
+                                                       i = columns[ 0 ];
 
-                                                       if ( !e[config.sortMultiSortKey] ) {
+                                                       if ( !e[ config.sortMultiSortKey ] ) {
                                                                // User only wants to sort on one column set
                                                                // Flush the sort list and add new columns
                                                                config.sortList = newSortList;
                                                                        // The user has clicked on an already sorted column.
                                                                        // Reverse the sorting direction for all tables.
                                                                        for ( j = 0; j < config.sortList.length; j++ ) {
-                                                                               s = config.sortList[j];
-                                                                               o = config.headerList[s[0]];
-                                                                               if ( isValueInArray( s[0], newSortList ) ) {
-                                                                                       $( o ).data( 'count', s[1] + 1 );
-                                                                                       s[1] = $( o ).data( 'count' ) % 2;
+                                                                               s = config.sortList[ j ];
+                                                                               o = config.headerList[ s[ 0 ] ];
+                                                                               if ( isValueInArray( s[ 0 ], newSortList ) ) {
+                                                                                       $( o ).data( 'count', s[ 1 ] + 1 );
+                                                                                       s[ 1 ] = $( o ).data( 'count' ) % 2;
                                                                                }
                                                                        }
                                                                } else {
                                                        setHeadersOrder( $headers, config.sortList, config.headerToColumns );
 
                                                        // Set CSS for headers
-                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, config.columnToHeader );
+                                                       setHeadersCss( $table[ 0 ], $headers, config.sortList, sortCSS, sortMsg, config.columnToHeader );
                                                        appendToTable(
-                                                               $table[0], multisort( $table[0], config.sortList, cache )
+                                                               $table[ 0 ], multisort( $table[ 0 ], config.sortList, cache )
                                                        );
 
                                                        // Stop normal event by returning false
                                         * 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 ) {
 
                                        len = parsers.length,
                                        a = true;
                                for ( i = 0; i < len; i++ ) {
-                                       if ( parsers[i].id.toLowerCase() === parser.id.toLowerCase() ) {
+                                       if ( parsers[ i ].id.toLowerCase() === parser.id.toLowerCase() ) {
                                                a = false;
                                        }
                                }
                                        for ( p = 0; p < s.length; p++ ) {
                                                c = s.charAt( p );
                                                if ( c in ts.transformTable ) {
-                                                       out += ts.transformTable[c];
+                                                       out += ts.transformTable[ c ];
                                                } else {
                                                        out += c;
                                                }
                        },
 
                        clearTableBody: function ( table ) {
-                               $( table.tBodies[0] ).empty();
+                               $( table.tBodies[ 0 ] ).empty();
                        },
 
                        getParser: function ( id ) {
                        if ( ts.collationRegex ) {
                                var tsc = ts.collationTable;
                                s = s.replace( ts.collationRegex, function ( match ) {
-                                       var r = tsc[match] ? tsc[match] : tsc[match.toUpperCase()];
+                                       var r = tsc[ match ] ? tsc[ match ] : tsc[ match.toUpperCase() ];
                                        return r.toLowerCase();
                                } );
                        }
        ts.addParser( {
                id: 'IPAddress',
                is: function ( s ) {
-                       return ts.rgx.IPAddress[0].test( s );
+                       return ts.rgx.IPAddress[ 0 ].test( s );
                },
                format: function ( s ) {
                        var i, item,
                                r = '',
                                len = a.length;
                        for ( i = 0; i < len; i++ ) {
-                               item = a[i];
+                               item = a[ i ];
                                if ( item.length === 1 ) {
                                        r += '00' + item;
                                } else if ( item.length === 2 ) {
        ts.addParser( {
                id: 'currency',
                is: function ( s ) {
-                       return ts.rgx.currency[0].test( s );
+                       return ts.rgx.currency[ 0 ].test( s );
                },
                format: function ( s ) {
-                       return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[1], '' ) );
+                       return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[ 1 ], '' ) );
                },
                type: 'numeric'
        } );
        ts.addParser( {
                id: 'url',
                is: function ( s ) {
-                       return ts.rgx.url[0].test( s );
+                       return ts.rgx.url[ 0 ].test( s );
                },
                format: function ( s ) {
-                       return $.trim( s.replace( ts.rgx.url[1], '' ) );
+                       return $.trim( s.replace( ts.rgx.url[ 1 ], '' ) );
                },
                type: 'text'
        } );
        ts.addParser( {
                id: 'isoDate',
                is: function ( s ) {
-                       return ts.rgx.isoDate[0].test( s );
+                       return ts.rgx.isoDate[ 0 ].test( s );
                },
                format: function ( s ) {
                        return $.tablesorter.formatFloat( ( s !== '' ) ? new Date( s.replace(
        ts.addParser( {
                id: 'usLongDate',
                is: function ( s ) {
-                       return ts.rgx.usLongDate[0].test( s );
+                       return ts.rgx.usLongDate[ 0 ].test( s );
                },
                format: function ( s ) {
                        return $.tablesorter.formatFloat( new Date( s ).getTime() );
        ts.addParser( {
                id: 'date',
                is: function ( s ) {
-                       return ( ts.dateRegex[0].test( s ) || ts.dateRegex[1].test( s ) || ts.dateRegex[2].test( s ) );
+                       return ( ts.dateRegex[ 0 ].test( s ) || ts.dateRegex[ 1 ].test( s ) || ts.dateRegex[ 2 ].test( s ) );
                },
                format: function ( s ) {
                        var match, y;
                        s = $.trim( s.toLowerCase() );
 
-                       if ( ( match = s.match( ts.dateRegex[0] ) ) !== null ) {
+                       if ( ( match = s.match( ts.dateRegex[ 0 ] ) ) !== null ) {
                                if ( mw.config.get( 'wgDefaultDateFormat' ) === 'mdy' || mw.config.get( 'wgPageContentLanguage' ) === 'en' ) {
-                                       s = [ match[3], match[1], match[2] ];
+                                       s = [ match[ 3 ], match[ 1 ], match[ 2 ] ];
                                } else if ( mw.config.get( 'wgDefaultDateFormat' ) === 'dmy' ) {
-                                       s = [ match[3], match[2], match[1] ];
+                                       s = [ match[ 3 ], match[ 2 ], match[ 1 ] ];
                                } else {
                                        // If we get here, we don't know which order the dd-dd-dddd
                                        // date is in. So return something not entirely invalid.
                                        return '99999999';
                                }
-                       } else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
-                               s = [ match[3], String( ts.monthNames[match[2]] ), match[1] ];
-                       } else if ( ( match = s.match( ts.dateRegex[2] ) ) !== null ) {
-                               s = [ match[3], String( ts.monthNames[match[1]] ), match[2] ];
+                       } else if ( ( match = s.match( ts.dateRegex[ 1 ] ) ) !== null ) {
+                               s = [ match[ 3 ], String( ts.monthNames[ match[ 2 ] ] ), match[ 1 ] ];
+                       } else if ( ( match = s.match( ts.dateRegex[ 2 ] ) ) !== null ) {
+                               s = [ match[ 3 ], String( ts.monthNames[ match[ 1 ] ] ), match[ 2 ] ];
                        } else {
                                // Should never get here
                                return '99999999';
                        }
 
                        // Pad Month and Day
-                       if ( s[1].length === 1 ) {
-                               s[1] = '0' + s[1];
+                       if ( s[ 1 ].length === 1 ) {
+                               s[ 1 ] = '0' + s[ 1 ];
                        }
-                       if ( s[2].length === 1 ) {
-                               s[2] = '0' + s[2];
+                       if ( s[ 2 ].length === 1 ) {
+                               s[ 2 ] = '0' + s[ 2 ];
                        }
 
-                       if ( ( y = parseInt( s[0], 10 ) ) < 100 ) {
+                       if ( ( y = parseInt( s[ 0 ], 10 ) ) < 100 ) {
                                // Guestimate years without centuries
                                if ( y < 30 ) {
-                                       s[0] = 2000 + y;
+                                       s[ 0 ] = 2000 + y;
                                } else {
-                                       s[0] = 1900 + y;
+                                       s[ 0 ] = 1900 + y;
                                }
                        }
-                       while ( s[0].length < 4 ) {
-                               s[0] = '0' + s[0];
+                       while ( s[ 0 ].length < 4 ) {
+                               s[ 0 ] = '0' + s[ 0 ];
                        }
                        return parseInt( s.join( '' ), 10 );
                },
        ts.addParser( {
                id: 'time',
                is: function ( s ) {
-                       return ts.rgx.time[0].test( s );
+                       return ts.rgx.time[ 0 ].test( s );
                },
                format: function ( s ) {
                        return $.tablesorter.formatFloat( new Date( '2000/01/01 ' + s ).getTime() );
index 5111930..b901642 100644 (file)
                                                        insertText = '',
                                                        selTextArr = selText.split( '\n' );
                                                for ( i = 0; i < selTextArr.length; i++ ) {
-                                                       insertText += pre + selTextArr[i] + post;
+                                                       insertText += pre + selTextArr[ i ] + post;
                                                        if ( i !== selTextArr.length - 1 ) {
                                                                insertText += '\n';
                                                        }
                                                                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)
                        context.fn.restoreSelection();
                        needSave = true;
                }
-               retval = ( alternateFn && alternateFn[command] || fn[command] ).call( this, options );
+               retval = ( alternateFn && alternateFn[ command ] || fn[ command ] ).call( this, options );
                if ( hasWikiEditor && needSave ) {
                        context.fn.saveSelection();
                }
index e181472..011f9c5 100644 (file)
@@ -53,9 +53,9 @@
                for ( i = 0; i < collapsibleLists.length; i++ ) {
                        // Pass to a function for iteration-local variables
                        handleOne(
-                               $editForm.find( collapsibleLists[i].listSel ),
-                               $editForm.find( collapsibleLists[i].togglerSel ),
-                               collapsibleLists[i].cookieName
+                               $editForm.find( collapsibleLists[ i ].listSel ),
+                               $editForm.find( collapsibleLists[ i ].togglerSel ),
+                               collapsibleLists[ i ].cookieName
                        );
                }
        } );
index 5f1058f..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();
 
@@ -36,7 +37,7 @@
                $wikiPreview.show();
 
                // Jump to where the preview will appear
-               $wikiPreview[0].scrollIntoView();
+               $wikiPreview[ 0 ].scrollIntoView();
 
                copySelectors = [
                        // Main
                // 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)
                                        indexpageids: '',
                                        prop: 'revisions',
                                        titles: mw.config.get( 'wgPageName' ),
-                                       rvdifftotext: response.parse.text['*'],
+                                       rvdifftotext: response.parse.text[ '*' ],
                                        rvprop: ''
                                };
                                if ( section !== '' ) {
                                }
                                return api.post( postData ).done( function ( result2 ) {
                                        try {
-                                               var diffHtml = result2.query.pages[result2.query.pageids[0]]
-                                                       .revisions[0].diff['*'];
+                                               var diffHtml = result2.query.pages[ result2.query.pageids[ 0 ] ]
+                                                       .revisions[ 0 ].diff[ '*' ];
                                                $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
                                        } catch ( e ) {
                                                // "result.blah is undefined" error, ignore
                                        );
                                }
                                if ( response.parse.categorieshtml ) {
-                                       $( '#catlinks' ).replaceWith( response.parse.categorieshtml['*'] );
+                                       $( '#catlinks' ).replaceWith( response.parse.categorieshtml[ '*' ] );
                                }
                                if ( response.parse.templates ) {
                                        newList = [];
                                                li = $( '<li>' )
                                                        .append( $( '<a>' )
                                                                .attr( {
-                                                                       'href': mw.util.getUrl( template['*'] ),
+                                                                       href: mw.util.getUrl( template[ '*' ] ),
                                                                        'class': ( template.exists !== undefined ? '' : 'new' )
                                                                } )
-                                                               .text( template['*'] )
+                                                               .text( template[ '*' ] )
                                                        );
                                                newList.push( li );
                                        } );
                                        $editform.find( '.templatesUsed .mw-editfooter-list' ).detach().empty().append( newList ).appendTo( '.templatesUsed' );
                                }
                                if ( response.parse.limitreporthtml ) {
-                                       $( '.limitreport' ).html( response.parse.limitreporthtml['*'] );
+                                       $( '.limitreport' ).html( response.parse.limitreporthtml[ '*' ] );
                                }
                                if ( response.parse.langlinks && mw.config.get( 'skin' ) === 'vector' ) {
                                        newList = [];
                                                        .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 )
                                                        );
                                        $list.detach().empty().append( newList ).prependTo( $parent );
                                }
 
-                               if ( response.parse.text['*'] ) {
+                               if ( response.parse.text[ '*' ] ) {
                                        $content = $wikiPreview.children( '.mw-content-ltr,.mw-content-rtl' );
                                        $content
                                                .detach()
-                                               .html( response.parse.text['*'] );
+                                               .html( response.parse.text[ '*' ] );
 
                                        mw.hook( 'wikipage.content' ).fire( $content );
 
                        var isSubject = ( section === 'new' ),
                                summaryMsg = isSubject ? 'subject-preview' : 'summary-preview',
                                $summaryPreview = $editform.find( '.mw-summary-preview' ).empty();
-                       if ( response.parse.parsedsummary && response.parse.parsedsummary['*'] !== '' ) {
+                       if ( response.parse.parsedsummary && response.parse.parsedsummary[ '*' ] !== '' ) {
                                $summaryPreview.append(
                                        mw.message( summaryMsg ).parse(),
                                        ' ',
                                        $( '<span>' ).addClass( 'comment' ).html(
                                                // There is no equivalent to rawParams
                                                mw.message( 'parentheses' ).escaped()
-                                                       .replace( '$1', response.parse.parsedsummary['*'] )
+                                                       .replace( '$1', response.parse.parsedsummary[ '*' ] )
                                        )
                                );
                        }
                        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 cae65c5..43b20b8 100644 (file)
                        // Handle common MediaWiki API idioms for passing parameters
                        for ( key in parameters ) {
                                // Multiple values are pipe-separated
-                               if ( $.isArray( parameters[key] ) ) {
-                                       parameters[key] = parameters[key].join( '|' );
+                               if ( $.isArray( parameters[ key ] ) ) {
+                                       parameters[ key ] = parameters[ key ].join( '|' );
                                }
                                // Boolean values are only false when not given at all
-                               if ( parameters[key] === false || parameters[key] === undefined ) {
-                                       delete parameters[key];
+                               if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
+                                       delete parameters[ key ];
                                }
                        }
                },
                                formData = new FormData();
 
                                for ( key in parameters ) {
-                                       formData.append( key, parameters[key] );
+                                       formData.append( key, parameters[ key ] );
                                }
                                // If we extracted a token parameter, add it back in.
                                if ( token ) {
 
                                d = apiPromise
                                        .then( function ( data ) {
-                                               if ( data.tokens && data.tokens[type + 'token'] ) {
-                                                       return data.tokens[type + 'token'];
+                                               if ( data.tokens && data.tokens[ type + 'token' ] ) {
+                                                       return data.tokens[ type + 'token' ];
                                                }
 
                                                // If token type is not available for this user,
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 b839fbd..399e6f4 100644 (file)
@@ -14,7 +14,7 @@
                 */
                saveOption: function ( name, value ) {
                        var param = {};
-                       param[name] = value;
+                       param[ name ] = value;
                        return this.saveOptions( param );
                },
 
@@ -38,7 +38,7 @@
                                deferreds = [];
 
                        for ( name in options ) {
-                               value = options[name] === null ? null : String( options[name] );
+                               value = options[ name ] === null ? null : String( options[ name ] );
 
                                // Can we bundle this option, or does it need a separate request?
                                bundleable =
index 2dcf807..bc3d44f 100644 (file)
@@ -21,7 +21,7 @@
 
                        return apiPromise
                                .then( function ( data ) {
-                                       return data.parse.text['*'];
+                                       return data.parse.text[ '*' ];
                                } )
                                .promise( { abort: apiPromise.abort } );
                }
index d05ba57..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 ) {
        /**
         * @private
         * Shortcut for getting hidden inputs
+        *
         * @return {jQuery}
         */
        function getHiddenInput( name, val ) {
-               return $( '<input type="hidden" />')
+               return $( '<input type="hidden" />' )
                        .attr( 'name', name )
                        .val( val );
        }
@@ -58,7 +62,7 @@
         */
        function processIframeResult( iframe ) {
                var json,
-                       doc = iframe.contentDocument || frames[iframe.id].document;
+                       doc = iframe.contentDocument || frames[ iframe.id ].document;
 
                if ( doc.XMLDocument ) {
                        // The response is a document property in IE
                        isFileInput = file && file.nodeType === Node.ELEMENT_NODE;
 
                        if ( formDataAvailable() && isFileInput && file.files ) {
-                               file = file.files[0];
+                               file = file.files[ 0 ];
                        }
 
                        if ( !file ) {
                                $iframe = $( iframe );
 
                        for ( key in data ) {
-                               if ( !fieldsAllowed[key] ) {
-                                       delete data[key];
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
                                }
                        }
 
                                deferred = $.Deferred();
 
                        for ( key in data ) {
-                               if ( !fieldsAllowed[key] ) {
-                                       delete data[key];
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
                                }
                        }
 
                 * 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 40ba136..a2ff129 100644 (file)
@@ -37,7 +37,7 @@
                return apiPromise
                        .then( function ( data ) {
                                // If a single page was given (not an array) respond with a single item as well.
-                               return $.isArray( pages ) ? data.watch : data.watch[0];
+                               return $.isArray( pages ) ? data.watch : data.watch[ 0 ];
                        } )
                        .promise( { abort: apiPromise.abort } );
        }
index b56e4b2..cb9e19e 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'bs', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index 69c36cc..dc4447a 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'dsb', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index d9c2b06..2bbfc6b 100644 (file)
@@ -7,8 +7,8 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms, aou, origWord;
 
        grammarForms = mediaWiki.language.getData( 'fi', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
 
        // vowel harmony flag
index fb4e939..a4c911a 100644 (file)
@@ -5,8 +5,8 @@
 mediaWiki.language.convertGrammar = function ( word, form ) {
        /*jshint onecase:true */
        var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'ainmlae':
index d1eba43..945f02f 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'prefixed':
index 2c0abd3..8e9b129 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'hsb', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index d72a1c0..4f8f74d 100644 (file)
@@ -5,8 +5,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'hu', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'rol':
index c4a1cf7..935d466 100644 (file)
@@ -5,8 +5,8 @@
 mediaWiki.language.convertGrammar = function ( word, form ) {
        /*jshint onecase:true */
        var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
 
        // These rules are not perfect, but they are currently only used for site names so it doesn't
index 52e8dd4..29e04a6 100644 (file)
@@ -5,8 +5,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'la', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'genitive':
@@ -30,7 +30,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
                        word = word.replace( /tio$/i, 'tionem' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'ntem' );
-                       word = word.replace( /as$/i, 'atem');
+                       word = word.replace( /as$/i, 'atem' );
                        word = word.replace( /es$/i, 'em' ); // 5th declension singular
                        break;
                case 'ablative':
@@ -42,7 +42,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
                        word = word.replace( /tio$/i, 'tione' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'nte' );
-                       word = word.replace( /as$/i, 'ate');
+                       word = word.replace( /as$/i, 'ate' );
                        word = word.replace( /es$/i, 'e' ); // 5th declension singular
                        break;
        }
index 554e99d..3e0f279 100644 (file)
@@ -14,8 +14,8 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                // Variable for ending
                ending = '';
 
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        // Checking if the $word is in plural form
        if ( word.match( /тæ$/i ) ) {
index 2077b6b..ee1d6ef 100644 (file)
@@ -10,8 +10,8 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        'use strict';
 
        var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'genitive': // родительный падеж
index d20d0b3..3d8bdfd 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'sl', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'mestnik': // locative
index 550a388..a22874b 100644 (file)
@@ -4,31 +4,31 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
                        if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
                                if ( word.slice( -1 ) === 'ь' ) {
-                                       word = word.slice(0, -1 ) + 'я';
+                                       word = word.slice( 0, -1 ) + 'я';
                                } else if ( word.slice( -2 ) === 'ія' ) {
-                                       word = word.slice(0, -2 ) + 'ії';
+                                       word = word.slice( 0, -2 ) + 'ії';
                                } else if ( word.slice( -2 ) === 'ка' ) {
-                                       word = word.slice(0, -2 ) + 'ки';
+                                       word = word.slice( 0, -2 ) + 'ки';
                                } else if ( word.slice( -2 ) === 'ти' ) {
-                                       word = word.slice(0, -2 ) + 'тей';
+                                       word = word.slice( 0, -2 ) + 'тей';
                                } else if ( word.slice( -2 ) === 'ды' ) {
-                                       word = word.slice(0, -2 ) + 'дов';
+                                       word = word.slice( 0, -2 ) + 'дов';
                                } else if ( word.slice( -3 ) === 'ник' ) {
-                                       word = word.slice(0, -3 ) + 'ника';
+                                       word = word.slice( 0, -3 ) + 'ника';
                                }
                        }
                        break;
                case 'accusative': // знахідний відмінок
                        if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
                                if ( word.slice( -2 ) === 'ія' ) {
-                                       word = word.slice(0, -2 ) + 'ію';
+                                       word = word.slice( 0, -2 ) + 'ію';
                                }
                        }
                        break;
index f6fb8f1..ca4b6fb 100644 (file)
@@ -21,7 +21,7 @@
                getPluralForm: function ( number, pluralRules ) {
                        var i;
                        for ( i = 0; i < pluralRules.length; i++ ) {
-                               if ( mw.libs.pluralRuleParser( pluralRules[i], number ) ) {
+                               if ( mw.libs.pluralRuleParser( pluralRules[ i ], number ) ) {
                                        break;
                                }
                        }
index b3765c8..808f6e5 100644 (file)
@@ -55,8 +55,8 @@
                getData: function ( langCode, dataKey ) {
                        var langData = mw.language.data;
                        langCode = langCode.toLowerCase();
-                       if ( langData && langData[langCode] instanceof mw.Map ) {
-                               return langData[langCode].get( dataKey );
+                       if ( langData && langData[ langCode ] instanceof mw.Map ) {
+                               return langData[ langCode ].get( dataKey );
                        }
                        return undefined;
                },
                setData: function ( langCode, dataKey, value ) {
                        var langData = mw.language.data;
                        langCode = langCode.toLowerCase();
-                       if ( !( langData[langCode] instanceof mw.Map ) ) {
-                               langData[langCode] = new mw.Map();
+                       if ( !( langData[ langCode ] instanceof mw.Map ) ) {
+                               langData[ langCode ] = new mw.Map();
                        }
-                       langData[langCode].set( dataKey, value );
+                       langData[ langCode ].set( dataKey, value );
                }
        };
 
index 78e3919..0d324ed 100644 (file)
@@ -29,8 +29,8 @@ $.extend( mw.language, {
                        return mw.language.convertPlural( parseInt( count, 10 ), template.parameters );
                }
                // Could not process plural return first form or nothing
-               if ( template.parameters[0] ) {
-                       return template.parameters[0];
+               if ( template.parameters[ 0 ] ) {
+                       return template.parameters[ 0 ];
                }
                return '';
        },
@@ -47,8 +47,8 @@ $.extend( mw.language, {
                var pluralRules,
                        pluralFormIndex = 0;
 
-               if ( explicitPluralForms && explicitPluralForms[count] ) {
-                       return explicitPluralForms[count];
+               if ( explicitPluralForms && explicitPluralForms[ count ] ) {
+                       return explicitPluralForms[ count ];
                }
 
                if ( !forms || forms.length === 0 ) {
@@ -58,11 +58,11 @@ $.extend( mw.language, {
                pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
                if ( !pluralRules ) {
                        // default fallback.
-                       return ( count === 1 ) ? forms[0] : forms[1];
+                       return ( count === 1 ) ? forms[ 0 ] : forms[ 1 ];
                }
                pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
                pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
-               return forms[pluralFormIndex];
+               return forms[ pluralFormIndex ];
        },
 
        /**
@@ -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 ) {
@@ -98,12 +98,12 @@ $.extend( mw.language, {
                }
                forms = mw.language.preConvertPlural( forms, 2 );
                if ( gender === 'male' ) {
-                       return forms[0];
+                       return forms[ 0 ];
                }
                if ( gender === 'female' ) {
-                       return forms[1];
+                       return forms[ 1 ];
                }
-               return ( forms.length === 3 ) ? forms[2] : forms[0];
+               return ( forms.length === 3 ) ? forms[ 2 ] : forms[ 0 ];
        },
 
        /**
@@ -119,8 +119,8 @@ $.extend( mw.language, {
         */
        convertGrammar: function ( word, form ) {
                var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
-               if ( grammarForms && grammarForms[form] ) {
-                       return grammarForms[form][word] || word;
+               if ( grammarForms && grammarForms[ form ] ) {
+                       return grammarForms[ form ][ word ] || word;
                }
                return word;
        },
@@ -138,7 +138,7 @@ $.extend( mw.language, {
                        i = 0;
 
                for ( ; i < list.length; i++ ) {
-                       text += list[i];
+                       text += list[ i ];
                        if ( list.length - 2 === i ) {
                                text += mw.msg( 'and' ) + mw.msg( 'word-separator' );
                        } else if ( list.length - 1 !== i ) {
index 1481d2a..268985f 100644 (file)
@@ -74,7 +74,7 @@
                        decimal: '.'
                };
 
-               if ( isNaN( value) ) {
+               if ( isNaN( value ) ) {
                        return value;
                }
 
                        off,
                        remainder,
                        patternParts = pattern.split( '.' ),
-                       maxPlaces = ( patternParts[1] || [] ).length,
+                       maxPlaces = ( patternParts[ 1 ] || [] ).length,
                        valueParts = String( Math.abs( value ) ).split( '.' ),
-                       fractional = valueParts[1] || '',
+                       fractional = valueParts[ 1 ] || '',
                        groupSize = 0,
                        groupSize2 = 0,
                        pieces = [];
 
-               if ( patternParts[1] ) {
+               if ( patternParts[ 1 ] ) {
                        // Pad fractional with trailing zeros
-                       padLength = ( patternParts[1] && patternParts[1].lastIndexOf( '0' ) + 1 );
+                       padLength = ( patternParts[ 1 ] && patternParts[ 1 ].lastIndexOf( '0' ) + 1 );
 
                        if ( padLength > fractional.length ) {
-                               valueParts[1] = pad( fractional, padLength, '0', true );
+                               valueParts[ 1 ] = pad( fractional, padLength, '0', true );
                        }
 
                        // Truncate fractional
                        if ( maxPlaces < fractional.length ) {
-                               valueParts[1] = fractional.slice( 0, maxPlaces );
+                               valueParts[ 1 ] = fractional.slice( 0, maxPlaces );
                        }
                } else {
-                       if ( valueParts[1] ) {
+                       if ( valueParts[ 1 ] ) {
                                valueParts.pop();
                        }
                }
 
                // Pad whole with leading zeros
-               patternDigits = patternParts[0].replace( ',', '' );
+               patternDigits = patternParts[ 0 ].replace( ',', '' );
 
                padLength = patternDigits.indexOf( '0' );
 
                if ( padLength !== -1 ) {
                        padLength = patternDigits.length - padLength;
 
-                       if ( padLength > valueParts[0].length ) {
-                               valueParts[0] = pad( valueParts[0], padLength );
+                       if ( padLength > valueParts[ 0 ].length ) {
+                               valueParts[ 0 ] = pad( valueParts[ 0 ], padLength );
                        }
 
                        // Truncate whole
                        if ( patternDigits.indexOf( '#' ) === -1 ) {
-                               valueParts[0] = valueParts[0].slice( valueParts[0].length - padLength );
+                               valueParts[ 0 ] = valueParts[ 0 ].slice( valueParts[ 0 ].length - padLength );
                        }
                }
 
                // Add group separators
-               index = patternParts[0].lastIndexOf( ',' );
+               index = patternParts[ 0 ].lastIndexOf( ',' );
 
                if ( index !== -1 ) {
-                       groupSize = patternParts[0].length - index - 1;
-                       remainder = patternParts[0].slice( 0, index );
+                       groupSize = patternParts[ 0 ].length - index - 1;
+                       remainder = patternParts[ 0 ].slice( 0, index );
                        index = remainder.lastIndexOf( ',' );
                        if ( index !== -1 ) {
                                groupSize2 = remainder.length - index - 1;
                        }
                }
 
-               for ( whole = valueParts[0]; whole; ) {
+               for ( whole = valueParts[ 0 ]; whole; ) {
                        off = groupSize ? whole.length - groupSize : 0;
                        pieces.push( ( off > 0 ) ? whole.slice( off ) : whole );
                        whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
                                groupSize2 = null;
                        }
                }
-               valueParts[0] = pieces.reverse().join( options.group );
+               valueParts[ 0 ] = pieces.reverse().join( options.group );
 
                return valueParts.join( options.decimal );
        }
 
                        convertedNumber = '';
                        for ( i = 0; i < numberString.length; i++ ) {
-                               if ( transformTable[ numberString[i] ] ) {
-                                       convertedNumber += transformTable[numberString[i]];
+                               if ( transformTable[ numberString[ i ] ] ) {
+                                       convertedNumber += transformTable[ numberString[ i ] ];
                                } else {
-                                       convertedNumber += numberString[i];
+                                       convertedNumber += numberString[ i ];
                                }
                        }
                        return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
                },
 
                /**
-                * 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 () {
                commafy: function ( value, pattern ) {
                        var numberPattern,
                                transformTable = mw.language.getSeparatorTransformTable(),
-                               group = transformTable[','] || ',',
+                               group = transformTable[ ',' ] || ',',
                                numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
-                               decimal = transformTable['.'] || '.',
+                               decimal = transformTable[ '.' ] || '.',
                                patternList = pattern.split( ';' ),
-                               positivePattern = patternList[0];
+                               positivePattern = patternList[ 0 ];
 
-                       pattern = patternList[ ( value < 0 ) ? 1 : 0] || ( '-' + positivePattern );
+                       pattern = patternList[ ( value < 0 ) ? 1 : 0 ] || ( '-' + positivePattern );
                        numberPattern = positivePattern.match( numberPatternRE );
 
                        if ( !numberPattern ) {
                                throw new Error( 'unable to find a number expression in pattern: ' + pattern );
                        }
 
-                       return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[0], {
+                       return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[ 0 ], {
                                decimal: decimal,
                                group: group
                        } ) );
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 3f4b263..6226c90 100644 (file)
@@ -146,7 +146,7 @@ var ProtectionForm = window.ProtectionForm = {
         */
        matchAttribute: function ( objects, attrName ) {
                return $.map( objects, function ( object ) {
-                       return object[attrName];
+                       return object[ attrName ];
                } ).filter( function ( item, index, a ) {
                        return index === a.indexOf( item );
                } ).length === 1;
@@ -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 2dcc772..7d1f6d7 100644 (file)
@@ -85,7 +85,7 @@
 
                // Execute the queued functions
                for ( i = 0; i < functs.length; i++ ) {
-                       functs[i]();
+                       functs[ i ]();
                }
        } );
 
         * @deprecated since 1.17 Use mw.loader instead. Warnings added in 1.25.
         */
        function importScriptURI( url ) {
-               if ( loadedScripts[url] ) {
+               if ( loadedScripts[ url ] ) {
                        return null;
                }
-               loadedScripts[url] = true;
+               loadedScripts[ url ] = true;
                var s = document.createElement( 'script' );
                s.setAttribute( 'src', url );
                s.setAttribute( 'type', 'text/javascript' );
-               document.getElementsByTagName( 'head' )[0].appendChild( s );
+               document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                return s;
        }
 
                if ( media ) {
                        l.media = media;
                }
-               document.getElementsByTagName( 'head' )[0].appendChild( l );
+               document.getElementsByTagName( 'head' )[ 0 ].appendChild( l );
                return l;
        }
 
index ec14f8b..6f9aa02 100644 (file)
         * @param {Function} messagePosterConstructor Constructor for MessagePoster
         */
        MwMessagePosterFactory.prototype.register = function ( contentModel, messagePosterConstructor ) {
-               if ( this.contentModelToClass[contentModel] !== undefined ) {
+               if ( this.contentModelToClass[ contentModel ] !== undefined ) {
                        throw new Error( 'The content model \'' + contentModel + '\' is already registered.' );
                }
 
-               this.contentModelToClass[contentModel] = messagePosterConstructor;
+               this.contentModelToClass[ contentModel ] = messagePosterConstructor;
        };
 
        /**
@@ -38,7 +38,7 @@
         * @param {string} contentModel Content model to unregister
         */
        MwMessagePosterFactory.prototype.unregister = function ( contentModel ) {
-               delete this.contentModelToClass[contentModel];
+               delete this.contentModelToClass[ contentModel ];
        };
 
        /**
@@ -68,8 +68,8 @@
                        titles: title.getPrefixedDb()
                } ).then( function ( result ) {
                        if ( result.query.pageids && result.query.pageids.length > 0 ) {
-                               pageId = result.query.pageids[0];
-                               page = result.query.pages[pageId];
+                               pageId = result.query.pageids[ 0 ];
+                               page = result.query.pages[ pageId ];
 
                                contentModel = page.contentmodel;
                                moduleName = 'mediawiki.messagePoster.' + contentModel;
         *
         */
        MwMessagePosterFactory.prototype.createForContentModel = function ( contentModel, title ) {
-               return new this.contentModelToClass[contentModel]( title );
+               return new this.contentModelToClass[ contentModel ]( title );
        };
 
        mw.messagePoster = {
index 9514070..dfccf21 100644 (file)
@@ -12,6 +12,7 @@
 
        /**
         * Perform the layout justification.
+        *
         * @ignore
         * @context {HTMLElement} A `ul.mw-gallery-*` element
         */
                                $this = $( this );
 
                        if ( top !== lastTop ) {
-                               rows[rows.length] = [];
+                               rows[ rows.length ] = [];
                                lastTop = top;
                        }
 
                        $img = $this.find( 'div.thumb a.image img' );
-                       if ( $img.length && $img[0].height ) {
-                               imgHeight = $img[0].height;
-                               imgWidth = $img[0].width;
+                       if ( $img.length && $img[ 0 ].height ) {
+                               imgHeight = $img[ 0 ].height;
+                               imgWidth = $img[ 0 ].width;
                        } else {
                                // If we don't have a real image, get the containing divs width/height.
                                // Note that if we do have a real image, using this method will generally
@@ -54,7 +55,7 @@
                        }
 
                        captionWidth = $this.children().children( 'div.gallerytextwrapper' ).width();
-                       rows[rows.length - 1][rows[rows.length - 1].length] = {
+                       rows[ rows.length - 1 ][ rows[ rows.length - 1 ].length ] = {
                                $elm: $this,
                                width: $this.outerWidth(),
                                imgWidth: imgWidth,
                                maxWidth = $gallery.width();
                                combinedAspect = 0;
                                combinedPadding = 0;
-                               curRow = rows[i];
+                               curRow = rows[ i ];
                                curRowHeight = 0;
 
                                for ( j = 0; j < curRow.length; j++ ) {
                                        if ( curRowHeight === 0 ) {
-                                               if ( isFinite( curRow[j].height ) ) {
+                                               if ( isFinite( curRow[ j ].height ) ) {
                                                        // Get the height of this row, by taking the first
                                                        // non-out of bounds height
-                                                       curRowHeight = curRow[j].height;
+                                                       curRowHeight = curRow[ j ].height;
                                                }
                                        }
 
-                                       if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
+                                       if ( curRow[ j ].aspect === 0 || !isFinite( curRow[ j ].aspect ) ) {
                                                // One of the dimensions are 0. Probably should
                                                // not try to resize.
-                                               combinedPadding += curRow[j].width;
+                                               combinedPadding += curRow[ j ].width;
                                        } else {
-                                               combinedAspect += curRow[j].aspect;
-                                               combinedPadding += curRow[j].width - curRow[j].imgWidth;
+                                               combinedAspect += curRow[ j ].aspect;
+                                               combinedPadding += curRow[ j ].width - curRow[ j ].imgWidth;
                                        }
                                }
 
                                }
 
                                for ( j = 0; j < curRow.length; j++ ) {
-                                       newWidth = preferredHeight * curRow[j].aspect;
-                                       padding = curRow[j].width - curRow[j].imgWidth;
-                                       $outerDiv = curRow[j].$elm;
+                                       newWidth = preferredHeight * curRow[ j ].aspect;
+                                       padding = curRow[ j ].width - curRow[ j ].imgWidth;
+                                       $outerDiv = curRow[ j ].$elm;
                                        $innerDiv = $outerDiv.children( 'div' ).first();
                                        $imageDiv = $innerDiv.children( 'div.thumb' );
                                        $imageElm = $imageDiv.find( 'img' ).first();
-                                       imageElm = $imageElm.length ? $imageElm[0] : null;
+                                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
                                        $caption = $outerDiv.find( 'div.gallerytextwrapper' );
 
                                        // Since we are going to re-adjust the height, the vertical
                                                $outerDiv.width( newWidth + padding );
                                                $innerDiv.width( newWidth + padding );
                                                $imageDiv.width( newWidth );
-                                               $caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
+                                               $caption.width( curRow[ j ].captionWidth + ( newWidth - curRow[ j ].imgWidth ) );
                                        }
 
                                        if ( imageElm ) {
                        $( this ).find( 'div.gallerytextwrapper' ).width( captionWidth );
 
                        $imageElm = $( this ).find( 'img' ).first();
-                       imageElm = $imageElm.length ? $imageElm[0] : null;
+                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
                        if ( imageElm ) {
                                imageElm.width = imgWidth;
                                imageElm.height = imgHeight;
index 7daf386..49a51df 100644 (file)
                jqXhr = undefined;
 
                // Try the cache
-               if ( cache[url] ) {
+               if ( cache[ url ] ) {
                        // Update access freshness
                        cacheOrder.splice( $.inArray( url, cacheOrder ), 1 );
                        cacheOrder.push( url );
-                       return $.Deferred().resolve( cache[url] ).promise();
+                       return $.Deferred().resolve( cache[ url ] ).promise();
                }
 
                // @todo Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
                        jqXhr = undefined;
 
                        // Cache the newly loaded page
-                       cache[url] = $contents;
+                       cache[ url ] = $contents;
                        cacheOrder.push( url );
 
                        // Remove the oldest entry if we're over the limit
                        if ( cacheOrder.length > 10 ) {
-                               delete cache[ cacheOrder[0] ];
+                               delete cache[ cacheOrder[ 0 ] ];
                                cacheOrder = cacheOrder.slice( 1 );
                        }
                } );
index 9724c56..a3197da 100644 (file)
                actionPaths = mw.config.get( 'wgActionPaths' );
                for ( key in actionPaths ) {
                        if ( actionPaths.hasOwnProperty( key ) ) {
-                               parts = actionPaths[key].split( '$1' );
+                               parts = actionPaths[ key ].split( '$1' );
                                for ( i = 0; i < parts.length; i++ ) {
-                                       parts[i] = mw.RegExp.escape( parts[i] );
+                                       parts[ i ] = mw.RegExp.escape( parts[ i ] );
                                }
                                m = new RegExp( parts.join( '(.+)' ) ).exec( url );
-                               if ( m && m[1] ) {
+                               if ( m && m[ 1 ] ) {
                                        return key;
                                }
 
 
                        api = new mw.Api();
 
-                       api[action]( title )
+                       api[ action ]( title )
                                .done( function ( watchResponse ) {
                                        var otherAction = action === 'watch' ? 'unwatch' : 'watch';
 
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 7f13f29..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 ) {
@@ -134,7 +134,7 @@ jQuery( function ( $ ) {
        // Disable the button to save preferences unless preferences have changed
        $( '#prefcontrol' ).prop( 'disabled', true );
        $( '.prefsection' ).one( 'change keydown mousedown', function () {
-               $( '#prefcontrol' ).prop( 'disabled', false);
+               $( '#prefcontrol' ).prop( 'disabled', false );
        } );
 
        // Enable keyboard users to use left and right keys to switch tabs
@@ -210,15 +210,15 @@ jQuery( function ( $ ) {
                var minutes,
                        arr = hour.split( ':' );
 
-               arr[0] = parseInt( arr[0], 10 );
+               arr[ 0 ] = parseInt( arr[ 0 ], 10 );
 
                if ( arr.length === 1 ) {
                        // Specification is of the form [-]XX
-                       minutes = arr[0] * 60;
+                       minutes = arr[ 0 ] * 60;
                } else {
                        // Specification is of the form [-]XX:XX
-                       minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
-                       if ( arr[0] < 0 ) {
+                       minutes = Math.abs( arr[ 0 ] ) * 60 + parseInt( arr[ 1 ], 10 );
+                       if ( arr[ 0 ] < 0 ) {
                                minutes *= -1;
                        }
                }
@@ -245,7 +245,7 @@ jQuery( function ( $ ) {
                        minuteDiff = hoursToMinutes( $tzTextbox.val() );
                } else {
                        // Grab data from the $tzSelect value
-                       minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
+                       minuteDiff = parseInt( type.split( '|' )[ 1 ], 10 ) || 0;
                        $tzTextbox.val( minutesToHours( minuteDiff ) );
                }
 
index b27fe34..730119e 100644 (file)
                                var parts = $( this ).attr( 'href' ).split( 'search=' ),
                                        lastpart = '',
                                        prefix = 'search=';
-                               if ( parts.length > 1 && parts[1].indexOf( '&' ) !== -1 ) {
-                                       lastpart = parts[1].slice( parts[1].indexOf( '&' ) );
+                               if ( parts.length > 1 && parts[ 1 ].indexOf( '&' ) !== -1 ) {
+                                       lastpart = parts[ 1 ].slice( parts[ 1 ].indexOf( '&' ) );
                                } else {
                                        prefix = '&search=';
                                }
-                               this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
+                               this.href = parts[ 0 ] + prefix + encodeURIComponent( searchterm ) + lastpart;
                        } );
                } ).trigger( 'change' );
 
index 2bacabe..677d26d 100644 (file)
@@ -36,7 +36,7 @@
                        }
                        // Check response cache
                        if ( this.responseCache.hasOwnProperty( this.nameToCheck ) ) {
-                               this.setWarning( this.responseCache[this.nameToCheck] );
+                               this.setWarning( this.responseCache[ this.nameToCheck ] );
                                return;
                        }
 
@@ -72,7 +72,7 @@
                        } ).done( function ( result ) {
                                var resultOut = '';
                                if ( result.query ) {
-                                       resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
+                                       resultOut = result.query.pages[ result.query.pageids[ 0 ] ].imageinfo[ 0 ];
                                }
                                $spinnerDestCheck.remove();
                                uploadWarning.processResult( resultOut, uploadWarning.nameToCheck );
@@ -81,7 +81,7 @@
 
                processResult: function ( result, fileName ) {
                        this.setWarning( result.html );
-                       this.responseCache[fileName] = result.html;
+                       this.responseCache[ fileName ] = result.html;
                },
 
                setWarning: function ( warning ) {
                                return;
                        }
                        if ( this.responseCache.hasOwnProperty( license ) ) {
-                               this.showPreview( this.responseCache[license] );
+                               this.showPreview( this.responseCache[ license ] );
                                return;
                        }
 
                },
 
                processResult: function ( result, license ) {
-                       this.responseCache[license] = result.parse.text['*'];
-                       this.showPreview( this.responseCache[license] );
+                       this.responseCache[ license ] = result.parse.text[ '*' ];
+                       this.showPreview( this.responseCache[ license ] );
                },
 
                showPreview: function ( preview ) {
                                fname = fname.replace( / /g, '_' );
                                // Capitalise first letter if needed
                                if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
-                                       fname = fname[0].toUpperCase() + fname.slice( 1 );
+                                       fname = fname[ 0 ].toUpperCase() + fname.slice( 1 );
                                }
 
                                // Output result
                 * 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'],
+                       var known = [ 'image/png', 'image/gif', 'image/jpeg', 'image/svg+xml' ],
                                tooHuge = 10 * 1024 * 1024;
                        return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
                }
                 * @return {string}
                 */
                function prettySize( s ) {
-                       var sizeMsgs = ['size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes'];
+                       var sizeMsgs = [ 'size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes' ];
                        while ( s >= 1024 && sizeMsgs.length > 1 ) {
                                s /= 1024;
                                sizeMsgs = sizeMsgs.slice( 1 );
                        }
-                       return mw.msg( sizeMsgs[0], Math.round( s ) );
+                       return mw.msg( sizeMsgs[ 0 ], Math.round( s ) );
                }
 
                /**
                                .find( '.thumbinner' ).prepend( $spinner ).end();
 
                        $canvas = $( '<canvas>' ).attr( { width: previewSize, height: previewSize } );
-                       ctx = $canvas[0].getContext( '2d' );
+                       ctx = $canvas[ 0 ].getContext( '2d' );
                        $( '#mw-htmlform-source' ).parent().prepend( thumb );
 
                        fetchPreview( file, function ( dataURL ) {
                                                buffer = new Uint8Array( reader.result ),
                                                string = '';
                                        for ( i = 0; i < buffer.byteLength; i++ ) {
-                                               string += String.fromCharCode( buffer[i] );
+                                               string += String.fromCharCode( buffer[ i ] );
                                        }
                                        callbackBinary( string );
 
                        function getMaxUploadSize( type ) {
                                var sizes = mw.config.get( 'wgMaxUploadSize' );
 
-                               if ( sizes[type] !== undefined ) {
-                                       return sizes[type];
+                               if ( sizes[ type ] !== undefined ) {
+                                       return sizes[ type ];
                                }
-                               return sizes['*'];
+                               return sizes[ '*' ];
                        }
 
                        $( '.mw-upload-source-error' ).remove();
                                clearPreview();
                                if ( this.files && this.files.length ) {
                                        // Note: would need to be updated to handle multiple files.
-                                       var file = this.files[0];
+                                       var file = this.files[ 0 ];
 
                                        if ( !checkMaxUploadSize( file ) ) {
                                                return;
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 a32a790..a0c6ee2 100644 (file)
@@ -65,7 +65,7 @@
                                ususers: username // '|' in usernames is handled below
                        } )
                                .done( function ( resp ) {
-                                       var userinfo = resp.query.users[0];
+                                       var userinfo = resp.query.users[ 0 ];
 
                                        if ( resp.query.users.length !== 1 ) {
                                                // Happens if the user types '|' into the field
index 70d54ce..0469cc5 100644 (file)
                $toolbar = $( '#toolbar' );
 
                for ( i = 0; i < queue.length; i++ ) {
-                       button = queue[i];
+                       button = queue[ i ];
                        if ( $.isArray( button ) ) {
                                // Forwarded arguments array from mw.toolbar.addButton
                                insertButton.apply( toolbar, button );
index f1a08a3..d519c0d 100644 (file)
                }
                this.$oldBody = this.$body.addClass( 'mw-widget-calendarWidget-old-body' );
                // Clone without children
-               this.$body = $( this.$body[0].cloneNode( false ) )
+               this.$body = $( this.$body[ 0 ].cloneNode( false ) )
                        .removeClass( 'mw-widget-calendarWidget-old-body' )
                        .toggleClass( 'mw-widget-calendarWidget-body-month', this.displayLayer === 'month' )
                        .toggleClass( 'mw-widget-calendarWidget-body-year', this.displayLayer === 'year' )
 
        /**
         * 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 8d952e5..c8093bb 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'`.
         */
        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;
                if ( config.placeholder ) {
                } );
 
                // 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
                setTimeout( function () {
                        var $focussed = $( ':focus' );
                        // Deactivate unless the focus moved to something else inside this widget
-                       if ( !OO.ui.contains( widget.$element[ 0 ], $focussed[0], true ) ) {
+                       if ( !OO.ui.contains( widget.$element[ 0 ], $focussed[ 0 ], true ) ) {
                                widget.deactivate();
                        }
                }, 0 );
index cf4d788..167b318 100644 (file)
                                        widget.interwikiPrefixes.indexOf( interwiki ) !== -1
                                ) {
                                        return $.Deferred().resolve( { query: {
-                                               pages: [{
+                                               pages: [ {
                                                        title: widget.value
-                                               }]
+                                               } ]
                                        } } ).promise( promiseAbortObject );
                                } else {
                                        params = {
 
                if ( data.redirects ) {
                        for ( i = 0, len = data.redirects.length; i < len; i++ ) {
-                               redirect = data.redirects[i];
-                               redirectsTo[redirect.to] = redirectsTo[redirect.to] || [];
-                               redirectsTo[redirect.to].push( redirect.from );
+                               redirect = data.redirects[ i ];
+                               redirectsTo[ redirect.to ] = redirectsTo[ redirect.to ] || [];
+                               redirectsTo[ redirect.to ].push( redirect.from );
                        }
                }
 
                for ( index in data.pages ) {
-                       suggestionPage = data.pages[index];
-                       pageData[suggestionPage.title] = {
+                       suggestionPage = data.pages[ index ];
+                       pageData[ suggestionPage.title ] = {
                                missing: suggestionPage.missing !== undefined,
                                redirect: suggestionPage.redirect !== undefined,
                                disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
                                titles.push( suggestionPage.title );
                        }
 
-                       redirects = redirectsTo[suggestionPage.title] || [];
+                       redirects = redirectsTo[ suggestionPage.title ] || [];
                        for ( i = 0, len = redirects.length; i < len; i++ ) {
-                               pageData[redirects[i]] = {
+                               pageData[ redirects[ i ] ] = {
                                        missing: false,
                                        redirect: true,
                                        disambiguation: false,
                                        description: mw.msg( 'mw-widgets-titleinput-description-redirect', suggestionPage.title )
                                };
-                               titles.push( redirects[i] );
+                               titles.push( redirects[ i ] );
                        }
                }
 
                );
 
                if ( !pageExists ) {
-                       pageData[this.value] = {
+                       pageData[ this.value ] = {
                                missing: true, redirect: false, disambiguation: false,
                                description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
                        };
                        titles.push( this.value );
                }
                for ( i = 0, len = titles.length; i < len; i++ ) {
-                       page = pageData[titles[i]] || {};
-                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[i], page ) ) );
+                       page = pageData[ titles[ i ] ] || {};
+                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
                }
 
                return items;
index d540877..0d0fb73 100644 (file)
@@ -80,7 +80,7 @@
                        list: 'allusers',
                        // Prefix of list=allusers is case sensitive. Normalise first
                        // character to uppercase so that "fo" may yield "Foo".
-                       auprefix: inputValue[0].toUpperCase() + inputValue.slice( 1 ),
+                       auprefix: inputValue[ 0 ].toUpperCase() + inputValue.slice( 1 ),
                        aulimit: this.limit
                } );
        };
                        items = [];
 
                for ( i = 0, len = data.length; i < len; i++ ) {
-                       user = data[i] || {};
+                       user = data[ i ] || {};
                        items.push( new OO.ui.MenuOptionWidget( {
                                label: user.name,
                                data: user.name
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 be63936..fe8520b 100644 (file)
 
        /**
         * Add categories to the upload.
+        *
         * @param {string[]} categories Array of categories to which this upload will be added.
         */
        ForeignStructuredUpload.prototype.addCategories = function ( categories ) {
                var i, category;
 
                for ( i = 0; i < categories.length; i++ ) {
-                       category = categories[i];
+                       category = categories[ i ];
                        this.categories.push( category );
                }
        };
 
        /**
         * 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}
         */
                var i, desc, templateCalls = [];
 
                for ( i = 0; i < this.descriptions.length; i++ ) {
-                       desc = this.descriptions[i];
+                       desc = this.descriptions[ i ];
                        templateCalls.push( '{{' + desc.language + '|' + desc.text + '}}' );
                }
 
        /**
         * Fetches the wikitext for the categories to which the upload will
         * be added.
+        *
         * @private
         * @return {string}
         */
                var i, cat, categoryLinks = [];
 
                for ( i = 0; i < this.categories.length; i++ ) {
-                       cat = this.categories[i];
+                       cat = this.categories[ i ];
                        categoryLinks.push( '[[Category:' + cat + ']]' );
                }
 
 
        /**
         * Gets the wikitext for the license of the upload. Abstract for now.
+        *
         * @private
         * @return {string}
         */
 
        /**
         * Get the username.
+        *
         * @private
         * @return {string}
         */
index e9d07ed..d1c5bb5 100644 (file)
                        return false;
                }
                ns = ns.toLowerCase();
-               id = mw.config.get( 'wgNamespaceIds' )[ns];
+               id = mw.config.get( 'wgNamespaceIds' )[ ns ];
                if ( id === undefined ) {
                        return false;
                }
                        .replace( rUnderscoreTrim, '' );
 
                // Process initial colon
-               if ( title !== '' && title[0] === ':' ) {
+               if ( title !== '' && title[ 0 ] === ':' ) {
                        // Initial colon means main namespace instead of specified default
                        namespace = NS_MAIN;
                        title = title
                // Process namespace prefix (if any)
                m = title.match( rSplit );
                if ( m ) {
-                       id = getNsIdByName( m[1] );
+                       id = getNsIdByName( m[ 1 ] );
                        if ( id !== false ) {
                                // Ordinary namespace
                                namespace = id;
-                               title = m[2];
+                               title = m[ 2 ];
 
                                // For Talk:X pages, make sure X has no "namespace" prefix
                                if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
                                        // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
-                                       if ( getNsIdByName( m[1] ) !== false ) {
+                                       if ( getNsIdByName( m[ 1 ] ) !== false ) {
                                                return false;
                                        }
                                }
                }
 
                // Any remaining initial :s are illegal.
-               if ( title[0] === ':' ) {
+               if ( title[ 0 ] === ':' ) {
                        return false;
                }
 
                        rules = sanitationRules;
 
                for ( i = 0, ruleLength = rules.length; i < ruleLength; ++i ) {
-                       rule = rules[i];
+                       rule = rules[ i ];
                        for ( m = 0, filterLength = filter.length; m < filterLength; ++m ) {
-                               if ( rule[filter[m]] ) {
+                               if ( rule[ filter[ m ] ] ) {
                                        s = s.replace( rule.pattern, rule.replace );
                                }
                        }
                title = $.trim( title.replace( rWhitespace, ' ' ) );
 
                // Process initial colon
-               if ( title !== '' && title[0] === ':' ) {
+               if ( title !== '' && title[ 0 ] === ':' ) {
                        // Initial colon means main namespace instead of specified default
                        namespace = NS_MAIN;
                        title = title
                // Process namespace prefix (if any)
                m = title.match( rSplit );
                if ( m ) {
-                       id = getNsIdByName( m[1] );
+                       id = getNsIdByName( m[ 1 ] );
                        if ( id !== false ) {
                                // Ordinary namespace
                                namespace = id;
-                               title = m[2];
+                               title = m[ 2 ];
                        }
                }
 
 
                        recount = regexes.length;
 
-               src = img.jquery ? img[0].src : img.src;
+               src = img.jquery ? img[ 0 ].src : img.src;
 
                matches = src.match( thumbPhpRegex );
 
                decodedSrc = decodeURIComponent( src );
 
                for ( i = 0; i < recount; i++ ) {
-                       regex = regexes[i];
+                       regex = regexes[ i ];
                        matches = decodedSrc.match( regex );
 
-                       if ( matches && matches[1] ) {
-                               return mw.Title.newFromText( 'File:' + matches[1] );
+                       if ( matches && matches[ 1 ] ) {
+                               return mw.Title.newFromText( 'File:' + matches[ 1 ] );
                        }
                }
 
                        obj = Title.exist.pages;
 
                if ( type === 'string' ) {
-                       match = obj[title];
+                       match = obj[ title ];
                } else if ( type === 'object' && title instanceof Title ) {
-                       match = obj[title.toString()];
+                       match = obj[ title.toString() ];
                } else {
                        throw new Error( 'mw.Title.exists: title must be a string or an instance of Title' );
                }
                pages: {},
 
                set: function ( titles, state ) {
-                       titles = $.isArray( titles ) ? titles : [titles];
+                       titles = $.isArray( titles ) ? titles : [ titles ];
                        state = state === undefined ? true : !!state;
                        var i,
                                pages = this.pages,
                                len = titles.length;
 
                        for ( i = 0; i < len; i++ ) {
-                               pages[ titles[i] ] = state;
+                               pages[ titles[ i ] ] = state;
                        }
                        return true;
                }
                        ) {
                                return this.title;
                        }
-                       return this.title[0].toUpperCase() + this.title.slice( 1 );
+                       return this.title[ 0 ].toUpperCase() + this.title.slice( 1 );
                },
 
                /**
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 7563ae4..29b224e 100644 (file)
                                                // Only copy direct properties, not inherited ones
                                                if ( uri.hasOwnProperty( prop ) ) {
                                                        // Deep copy object properties
-                                                       if ( $.isArray( uri[prop] ) || $.isPlainObject( uri[prop] ) ) {
-                                                               this[prop] = $.extend( true, {}, uri[prop] );
+                                                       if ( $.isArray( uri[ prop ] ) || $.isPlainObject( uri[ prop ] ) ) {
+                                                               this[ prop ] = $.extend( true, {}, uri[ prop ] );
                                                        } else {
-                                                               this[prop] = uri[prop];
+                                                               this[ prop ] = uri[ prop ];
                                                        }
                                                }
                                        }
                                        this.port = defaultUri.port;
                                }
                        }
-                       if ( this.path && this.path[0] !== '/' ) {
+                       if ( this.path && this.path[ 0 ] !== '/' ) {
                                // A real relative URL, relative to defaultUri.path. We can't really handle that since we cannot
                                // figure out whether the last path component of defaultUri.path is a directory or a file.
                                throw new Error( 'Bad constructor arguments' );
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 bdff99f..f721009 100644 (file)
                                                className: 'mw-debug-pane',
                                                id: 'mw-debug-pane-' + id
                                        } )
-                                       .append( panes[id] )
+                                       .append( panes[ id ] )
                                        .appendTo( $container );
                        }
 
                        };
 
                        for ( i = 0, length = this.data.log.length; i < length; i += 1 ) {
-                               entry = this.data.log[i];
+                               entry = this.data.log[ i ];
                                entry.typeText = entryTypeText( entry.type );
 
                                $( '<tr>' )
                        .appendTo( $table );
 
                        for ( i = 0, length = this.data.queries.length; i < length; i += 1 ) {
-                               query = this.data.queries[i];
+                               query = this.data.queries[ i ];
 
                                $( '<tr>' )
                                        .append( $( '<td>' ).text( i + 1 ) )
                                        .append( $( '<td>' ).text( query.sql ) )
                                        .append( $( '<td class="stats">' ).text( ( query.time * 1000 ).toFixed( 4 ) + 'ms' ) )
-                                       .append( $( '<td>' ).text( query['function'] ) )
+                                       .append( $( '<td>' ).text( query[ 'function' ] ) )
                                .appendTo( $table );
                        }
 
                        $list = $( '<ul>' );
 
                        for ( i = 0, length = this.data.debugLog.length; i < length; i += 1 ) {
-                               line = this.data.debugLog[i];
+                               line = this.data.debugLog[ i ];
                                $( '<li>' )
                                        .html( mw.html.escape( line ).replace( /\n/g, '<br />\n' ) )
                                        .appendTo( $list );
 
                                        $( '<tr>' )
                                                .append( $( '<th>' ).text( key ) )
-                                               .append( $( '<td>' ).text( data[key] ) )
+                                               .append( $( '<td>' ).text( data[ key ] ) )
                                                .appendTo( $table );
                                }
 
                        $table = $( '<table>' );
 
                        for ( i = 0, length = this.data.includes.length; i < length; i += 1 ) {
-                               file = this.data.includes[i];
+                               file = this.data.includes[ i ];
                                $( '<tr>' )
                                        .append( $( '<td>' ).text( file.name ) )
                                        .append( $( '<td class="nr">' ).text( file.size ) )
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 930bfec..75b1f80 100644 (file)
                        }
 
                        for ( key in buckets ) {
-                               range += buckets[key];
+                               range += buckets[ key ];
                        }
 
                        hash = hashString( experiment.name + ':' + token );
                        max = ( hash / MAX_INT32_UNSIGNED ) * range;
 
                        for ( key in buckets ) {
-                               acc += buckets[key];
+                               acc += buckets[ key ];
 
                                if ( max <= acc ) {
                                        return key;
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 7fdaa6e..8c6f3ab 100644 (file)
@@ -53,7 +53,7 @@
        function hideIfParse( $el, spec ) {
                var op, i, l, v, $field, $fields, fields, func, funcs, getVal;
 
-               op = spec[0];
+               op = spec[ 0 ];
                l = spec.length;
                switch ( op ) {
                        case 'AND':
                                funcs = [];
                                fields = [];
                                for ( i = 1; i < l; i++ ) {
-                                       if ( !$.isArray( spec[i] ) ) {
+                                       if ( !$.isArray( spec[ i ] ) ) {
                                                throw new Error( op + ' parameters must be arrays' );
                                        }
-                                       v = hideIfParse( $el, spec[i] );
-                                       fields = fields.concat( v[0].toArray() );
-                                       funcs.push( v[1] );
+                                       v = hideIfParse( $el, spec[ i ] );
+                                       fields = fields.concat( v[ 0 ].toArray() );
+                                       funcs.push( v[ 1 ] );
                                }
                                $fields = $( fields );
 
@@ -78,7 +78,7 @@
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( !funcs[i]() ) {
+                                                               if ( !funcs[ i ]() ) {
                                                                        return false;
                                                                }
                                                        }
@@ -90,7 +90,7 @@
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( funcs[i]() ) {
+                                                               if ( funcs[ i ]() ) {
                                                                        return true;
                                                                }
                                                        }
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( !funcs[i]() ) {
+                                                               if ( !funcs[ i ]() ) {
                                                                        return true;
                                                                }
                                                        }
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( funcs[i]() ) {
+                                                               if ( funcs[ i ]() ) {
                                                                        return false;
                                                                }
                                                        }
                                if ( l !== 2 ) {
                                        throw new Error( 'NOT takes exactly one parameter' );
                                }
-                               if ( !$.isArray( spec[1] ) ) {
+                               if ( !$.isArray( spec[ 1 ] ) ) {
                                        throw new Error( 'NOT parameters must be arrays' );
                                }
-                               v = hideIfParse( $el, spec[1] );
-                               $fields = v[0];
-                               func = v[1];
+                               v = hideIfParse( $el, spec[ 1 ] );
+                               $fields = v[ 0 ];
+                               func = v[ 1 ];
                                return [ $fields, function () {
                                        return !func();
                                } ];
                                if ( l !== 3 ) {
                                        throw new Error( op + ' takes exactly two parameters' );
                                }
-                               $field = hideIfGetField( $el, spec[1] );
+                               $field = hideIfGetField( $el, spec[ 1 ] );
                                if ( !$field ) {
                                        return [ $(), function () {
                                                return false;
                                        } ];
                                }
-                               v = spec[2];
+                               v = spec[ 2 ];
 
                                if ( $field.first().prop( 'type' ) === 'radio' ||
                                        $field.first().prop( 'type' ) === 'checkbox'
         * 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 ) {
                        }
 
                        v = hideIfParse( $el, spec );
-                       $fields = v[0];
-                       test = v[1];
+                       $fields = v[ 0 ];
+                       test = v[ 1 ];
                        func = function () {
                                if ( test() ) {
                                        $el.hide();
index 31cd6c4..6bebf4d 100644 (file)
@@ -13,7 +13,7 @@
        function sortByProperty( array, prop, descending ) {
                var order = descending ? -1 : 1;
                return array.sort( function ( a, b ) {
-                       return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0;
+                       return a[ prop ] > b[ prop ] ? order : a[ prop ] < b[ prop ] ? -order : 0;
                } );
        }
 
@@ -25,7 +25,7 @@
                for ( ; bytes >= 1024; bytes /= 1024 ) { i++; }
                // Maintain one decimal for kB and above, but don't
                // add ".0" for bytes.
-               return bytes.toFixed( i > 0 ? 1 : 0 ) + units[i];
+               return bytes.toFixed( i > 0 ? 1 : 0 ) + units[ i ];
        }
 
        /**
                                graph = {};
 
                        $.each( modules, function ( moduleIndex, moduleName ) {
-                               var dependencies = mw.loader.moduleRegistry[moduleName].dependencies || [];
+                               var dependencies = mw.loader.moduleRegistry[ moduleName ].dependencies || [];
 
                                if ( !hasOwn.call( graph, moduleName ) ) {
-                                       graph[moduleName] = { requiredBy: [] };
+                                       graph[ moduleName ] = { requiredBy: [] };
                                }
-                               graph[moduleName].requires = dependencies;
+                               graph[ moduleName ].requires = dependencies;
 
                                $.each( dependencies, function ( depIndex, depName ) {
                                        if ( !hasOwn.call( graph, depName ) ) {
-                                               graph[depName] = { requiredBy: [] };
+                                               graph[ depName ] = { requiredBy: [] };
                                        }
-                                       graph[depName].requiredBy.push( moduleName );
+                                       graph[ depName ].requiredBy.push( moduleName );
                                } );
                        } );
                        return graph;
                 * 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
                 */
                                $.map( inspect.reports, function ( v, k ) { return k; } );
 
                        $.each( reports, function ( index, name ) {
-                               inspect.dumpTable( inspect.reports[name]() );
+                               inspect.dumpTable( inspect.reports[ name ]() );
                        } );
                },
 
                                var modules = [];
 
                                $.each( inspect.getLoadedModules(), function ( index, name ) {
-                                       var css, stats, module = mw.loader.moduleRegistry[name];
+                                       var css, stats, module = mw.loader.moduleRegistry[ name ];
 
                                        try {
                                                css = module.style.css.join();
                                                stats.totalSize = humanSize( $.byteLength( raw ) );
                                        } catch ( e ) {}
                                }
-                               return [stats];
+                               return [ stats ];
                        }
                },
 
                        }
 
                        return $.grep( inspect.getLoadedModules(), function ( moduleName ) {
-                               var module = mw.loader.moduleRegistry[moduleName];
+                               var module = mw.loader.moduleRegistry[ moduleName ];
 
                                // Grep module's JavaScript
                                if ( $.isFunction( module.script ) && pattern.test( module.script.toString() ) ) {
index 343d516..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.
                var i, len;
 
                if ( !$.isArray( children ) ) {
-                       children = [children];
+                       children = [ children ];
                }
 
                for ( i = 0, len = children.length; i < len; i++ ) {
-                       if ( typeof children[i] !== 'object' ) {
-                               children[i] = document.createTextNode( children[i] );
+                       if ( typeof children[ i ] !== 'object' ) {
+                               children[ i ] = document.createTextNode( children[ i ] );
                        }
                }
 
         * 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}
 
                return function ( args ) {
                        var fallback,
-                               key = args[0],
-                               argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
+                               key = args[ 0 ],
+                               argsArray = $.isArray( args[ 1 ] ) ? args[ 1 ] : slice.call( args, 1 );
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
                 * 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
                 */
                getAst: function ( key ) {
                        var wikiText,
-                               cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' );
+                               cacheKey = [ key, this.settings.onlyCurlyBraceTransform ].join( ':' );
 
                        if ( this.astCache[ cacheKey ] === undefined ) {
                                wikiText = this.settings.messages.get( key );
 
                        /**
                         * Try parsers until one works, if none work return null
+                        *
                         * @private
                         * @param {Function[]} ps
                         * @return {string|null}
                                return function () {
                                        var i, result;
                                        for ( i = 0; i < ps.length; i++ ) {
-                                               result = ps[i]();
+                                               result = ps[ i ]();
                                                if ( result !== null ) {
                                                        return result;
                                                }
                        /**
                         * 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}
                                        originalPos = pos,
                                        result = [];
                                for ( i = 0; i < ps.length; i++ ) {
-                                       res = ps[i]();
+                                       res = ps[ i ]();
                                        if ( res === null ) {
                                                pos = originalPos;
                                                return 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}
                                        if ( matches === null ) {
                                                return null;
                                        }
-                                       pos += matches[0].length;
-                                       return matches[0];
+                                       pos += matches[ 0 ].length;
+                                       return matches[ 0 ];
                                };
                        }
 
                                        backslash,
                                        anyCharacter
                                ] );
-                               return result === null ? null : result[1];
+                               return result === null ? null : result[ 1 ];
                        }
                        escapedOrLiteralWithoutSpace = choice( [
                                escapedLiteral,
                                if ( result === null ) {
                                        return null;
                                }
-                               return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
+                               return [ 'REPLACE', parseInt( result[ 1 ], 10 ) - 1 ];
                        }
                        openExtlink = makeStringParser( '[' );
                        closeExtlink = makeStringParser( ']' );
                                        closeExtlink
                                ] );
                                if ( parsedResult !== null ) {
-                                       result = [ 'EXTLINK', parsedResult[1] ];
+                                       result = [ 'EXTLINK', parsedResult[ 1 ] ];
                                        // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
                                        // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
-                                       if ( parsedResult[3].length === 1 ) {
-                                               result.push( parsedResult[3][0] );
+                                       if ( parsedResult[ 3 ].length === 1 ) {
+                                               result.push( parsedResult[ 3 ][ 0 ] );
                                        } else {
-                                               result.push( ['CONCAT'].concat( parsedResult[3] ) );
+                                               result.push( [ 'CONCAT' ].concat( parsedResult[ 3 ] ) );
                                        }
                                }
                                return result;
                                if ( result === null ) {
                                        return null;
                                }
-                               return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+                               return [ 'EXTLINKPARAM', parseInt( result[ 2 ], 10 ) - 1, result[ 4 ] ];
                        }
                        openWikilink = makeStringParser( '[[' );
                        closeWikilink = makeStringParser( ']]' );
                                        templateContents,
                                        closeTemplate
                                ] );
-                               return result === null ? null : result[1];
+                               return result === null ? null : result[ 1 ];
                        }
 
                        wikilinkPage = choice( [
                                        pipe,
                                        expression
                                ] );
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
                        }
 
                        wikilinkContents = choice( [
                                        closeWikilink
                                ] );
                                if ( parsedResult !== null ) {
-                                       parsedLinkContents = parsedResult[1];
+                                       parsedLinkContents = parsedResult[ 1 ];
                                        result = [ 'WIKILINK' ].concat( parsedLinkContents );
                                }
                                return result;
                                        htmlDoubleQuoteAttributeValue,
                                        doubleQuote
                                ] );
-                               return parsedResult === null ? null : parsedResult[1];
+                               return parsedResult === null ? null : parsedResult[ 1 ];
                        }
 
                        function singleQuotedHtmlAttributeValue() {
                                        htmlSingleQuoteAttributeValue,
                                        singleQuote
                                ] );
-                               return parsedResult === null ? null : parsedResult[1];
+                               return parsedResult === null ? null : parsedResult[ 1 ];
                        }
 
                        function htmlAttribute() {
                                                singleQuotedHtmlAttributeValue
                                        ] )
                                ] );
-                               return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
+                               return parsedResult === null ? null : [ parsedResult[ 1 ], parsedResult[ 3 ] ];
                        }
 
                        /**
                                }
 
                                for ( i = 0, len = attributes.length; i < len; i += 2 ) {
-                                       attributeName = attributes[i];
+                                       attributeName = attributes[ i ];
                                        if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
-                                               $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+                                               $.inArray( attributeName, settings.allowedHtmlAttributesByElement[ startTagName ] || [] ) === -1 ) {
                                                return false;
                                        }
                                }
                        function htmlAttributes() {
                                var parsedResult = nOrMore( 0, htmlAttribute )();
                                // Un-nest attributes array due to structure of jQueryMsg operations (see emit).
-                               return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
+                               return concat.apply( [ 'HTMLATTRIBUTES' ], parsedResult );
                        }
 
                        // Subset of allowed HTML markup.
                                }
 
                                endOpenTagPos = pos;
-                               startTagName = parsedOpenTagResult[1];
+                               startTagName = parsedOpenTagResult[ 1 ];
 
                                parsedHtmlContents = nOrMore( 0, expression )();
 
                                }
 
                                endCloseTagPos = pos;
-                               endTagName = parsedCloseTagResult[1];
-                               wrappedAttributes = parsedOpenTagResult[2];
+                               endTagName = parsedCloseTagResult[ 1 ];
+                               wrappedAttributes = parsedOpenTagResult[ 2 ];
                                attributes = wrappedAttributes.slice( 1 );
                                if ( isAllowedHtml( startTagName, endTagName, attributes ) ) {
                                        result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ]
                                if ( result === null ) {
                                        return null;
                                }
-                               expr = result[1];
+                               expr = result[ 1 ];
                                // use a CONCAT operator if there are multiple nodes, otherwise return the first node, raw.
-                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
+                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[ 0 ];
                        }
 
                        function templateWithReplacement() {
                                        colon,
                                        replacement
                                ] );
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
                        }
                        function templateWithOutReplacement() {
                                var result = sequence( [
                                        colon,
                                        paramExpression
                                ] );
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
                        }
                        function templateWithOutFirstParameter() {
                                var result = sequence( [
                                        templateName,
                                        colon
                                ] );
-                               return result === null ? null : [ result[0], '' ];
+                               return result === null ? null : [ result[ 0 ], '' ];
                        }
                        colon = makeStringParser( ':' );
                        templateContents = choice( [
                                                choice( [ templateWithReplacement, templateWithOutReplacement, templateWithOutFirstParameter ] ),
                                                nOrMore( 0, templateParam )
                                        ] );
-                                       return res === null ? null : res[0].concat( res[1] );
+                                       return res === null ? null : res[ 0 ].concat( res[ 1 ] );
                                },
                                function () {
                                        var res = sequence( [
                                        if ( res === null ) {
                                                return null;
                                        }
-                                       return [ res[0] ].concat( res[1] );
+                                       return [ res[ 0 ] ].concat( res[ 1 ] );
                                }
                        ] );
                        openTemplate = makeStringParser( '{{' );
                /**
                 * (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
                                        subnodes = $.map( node.slice( 1 ), function ( n ) {
                                                return jmsg.emit( n, replacements );
                                        } );
-                                       operation = node[0].toLowerCase();
-                                       if ( typeof jmsg[operation] === 'function' ) {
+                                       operation = node[ 0 ].toLowerCase();
+                                       if ( typeof jmsg[ operation ] === 'function' ) {
                                                ret = jmsg[ operation ]( subnodes, replacements );
                                        } else {
                                                throw new Error( 'Unknown operation "' + operation + '"' );
                 * 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}
                 */
                 * @return {String} replacement
                 */
                replace: function ( nodes, replacements ) {
-                       var index = parseInt( nodes[0], 10 );
+                       var index = parseInt( nodes[ 0 ], 10 );
 
                        if ( index < replacements.length ) {
-                               return replacements[index];
+                               return replacements[ index ];
                        } else {
                                // index not found, fallback to displaying variable
                                return '$' + ( index + 1 );
                 * 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;
 
-                       page = nodes[0];
+                       page = nodes[ 0 ];
                        url = mw.util.getUrl( page );
 
                        if ( nodes.length === 1 ) {
                                anchor = page;
                        } else {
                                // [[Some Page|anchor text]] or [[Namespace:Some Page|anchor]]
-                               anchor = nodes[1];
+                               anchor = nodes[ 1 ];
                        }
 
                        return $( '<a>' ).attr( {
                htmlattributes: function ( nodes ) {
                        var i, len, mapping = {};
                        for ( i = 0, len = nodes.length; i < len; i += 2 ) {
-                               mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
+                               mapping[ nodes[ i ] ] = decodePrimaryHtmlEntities( nodes[ i + 1 ] );
                        }
                        return mapping;
                },
                 */
                extlink: function ( nodes ) {
                        var $el,
-                               arg = nodes[0],
-                               contents = nodes[1];
+                               arg = nodes[ 0 ],
+                               contents = nodes[ 1 ];
                        if ( arg instanceof jQuery ) {
                                $el = arg;
                        } else {
                 */
                extlinkparam: function ( nodes, replacements ) {
                        var replacement,
-                               index = parseInt( nodes[0], 10 );
+                               index = parseInt( nodes[ 0 ], 10 );
                        if ( index < replacements.length ) {
-                               replacement = replacements[index];
+                               replacement = replacements[ index ];
                        } else {
                                replacement = '$' + ( index + 1 );
                        }
-                       return this.extlink( [ replacement, nodes[1] ] );
+                       return this.extlink( [ replacement, nodes[ 1 ] ] );
                },
 
                /**
                 * 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
                 */
                        var forms, firstChild, firstChildText, explicitPluralFormNumber, formIndex, form, count,
                                explicitPluralForms = {};
 
-                       count = parseFloat( this.language.convertNumber( nodes[0], true ) );
+                       count = parseFloat( this.language.convertNumber( nodes[ 0 ], true ) );
                        forms = nodes.slice( 1 );
                        for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
-                               form = forms[formIndex];
+                               form = forms[ formIndex ];
 
                                if ( form.jquery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                        // This is a nested node, may be an explicit plural form like 5=[$2 linktext]
                                        if ( firstChild && firstChild.nodeType === Node.TEXT_NODE ) {
                                                firstChildText = firstChild.textContent;
                                                if ( /^\d+=/.test( firstChildText ) ) {
-                                                       explicitPluralFormNumber = parseInt( firstChildText.split( /=/ )[0], 10 );
+                                                       explicitPluralFormNumber = parseInt( firstChildText.split( /=/ )[ 0 ], 10 );
                                                        // Use the digit part as key and rest of first text node and
                                                        // rest of child nodes as value.
                                                        firstChild.textContent = firstChildText.slice( firstChildText.indexOf( '=' ) + 1 );
-                                                       explicitPluralForms[explicitPluralFormNumber] = form;
-                                                       forms[formIndex] = undefined;
+                                                       explicitPluralForms[ explicitPluralFormNumber ] = form;
+                                                       forms[ formIndex ] = undefined;
                                                }
                                        }
                                } else if ( /^\d+=/.test( form ) ) {
                                        // Simple explicit plural forms like 12=a dozen
-                                       explicitPluralFormNumber = parseInt( form.split( /=/ )[0], 10 );
-                                       explicitPluralForms[explicitPluralFormNumber] = form.slice( form.indexOf( '=' ) + 1 );
-                                       forms[formIndex] = undefined;
+                                       explicitPluralFormNumber = parseInt( form.split( /=/ )[ 0 ], 10 );
+                                       explicitPluralForms[ explicitPluralFormNumber ] = form.slice( form.indexOf( '=' ) + 1 );
+                                       forms[ formIndex ] = undefined;
                                }
                        }
 
                 */
                gender: function ( nodes ) {
                        var gender,
-                               maybeUser = nodes[0],
+                               maybeUser = nodes[ 0 ],
                                forms = nodes.slice( 1 );
 
                        if ( maybeUser === '' ) {
                /**
                 * 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
                 */
                grammar: function ( nodes ) {
-                       var form = nodes[0],
-                               word = nodes[1];
+                       var form = nodes[ 0 ],
+                               word = nodes[ 1 ];
                        return word && form && this.language.convertGrammar( word, form );
                },
 
                /**
                 * 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
                 */
                'int': function ( nodes ) {
-                       var msg = nodes[0];
+                       var msg = nodes[ 0 ];
                        return mw.jqueryMsg.getMessageFunction()( msg.charAt( 0 ).toLowerCase() + msg.slice( 1 ) );
                },
 
                 * 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
                 */
                formatnum: function ( nodes ) {
-                       var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false,
-                               number = nodes[0];
+                       var isInteger = ( nodes[ 1 ] && nodes[ 1 ] === 'R' ) ? true : false,
+                               number = nodes[ 0 ];
 
                        return this.language.convertNumber( number, isInteger );
                }
                }
 
                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 e110f90..5ba9781 100644 (file)
@@ -69,7 +69,7 @@
 
                                if ( $.isPlainObject( selection ) ) {
                                        for ( s in selection ) {
-                                               setGlobalMapValue( this, s, selection[s] );
+                                               setGlobalMapValue( this, s, selection[ s ] );
                                        }
                                        return true;
                                }
@@ -96,7 +96,7 @@
         * @param {Mixed} value
         */
        function setGlobalMapValue( map, key, value ) {
-               map.values[key] = value;
+               map.values[ key ] = value;
                mw.log.deprecate(
                                window,
                                key,
                                selection = slice.call( selection );
                                results = {};
                                for ( i = 0; i < selection.length; i++ ) {
-                                       results[selection[i]] = this.get( selection[i], fallback );
+                                       results[ selection[ i ] ] = this.get( selection[ i ], fallback );
                                }
                                return results;
                        }
                                if ( !hasOwn.call( this.values, selection ) ) {
                                        return fallback;
                                }
-                               return this.values[selection];
+                               return this.values[ selection ];
                        }
 
                        if ( selection === undefined ) {
 
                        if ( $.isPlainObject( selection ) ) {
                                for ( s in selection ) {
-                                       this.values[s] = selection[s];
+                                       this.values[ s ] = selection[ s ];
                                }
                                return true;
                        }
                        if ( typeof selection === 'string' && arguments.length > 1 ) {
-                               this.values[selection] = value;
+                               this.values[ selection ] = value;
                                return true;
                        }
                        return false;
 
                        if ( $.isArray( selection ) ) {
                                for ( s = 0; s < selection.length; s++ ) {
-                                       if ( typeof selection[s] !== 'string' || !hasOwn.call( this.values, selection[s] ) ) {
+                                       if ( typeof selection[ s ] !== 'string' || !hasOwn.call( this.values, selection[ s ] ) ) {
                                                return false;
                                        }
                                }
                params: function ( parameters ) {
                        var i;
                        for ( i = 0; i < parameters.length; i += 1 ) {
-                               this.parameters.push( parameters[i] );
+                               this.parameters.push( parameters[ i ] );
                        }
                        return this;
                },
                        var parameters = slice.call( arguments, 1 );
                        return formatString.replace( /\$(\d+)/g, function ( str, match ) {
                                var index = parseInt( match, 10 ) - 1;
-                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                               return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
                        } );
                },
 
                 */
                trackUnsubscribe: function ( callback ) {
                        trackHandlers = $.grep( trackHandlers, function ( fns ) {
-                               if ( fns[1] === callback ) {
-                                       trackCallbacks.remove( fns[0] );
+                               if ( fns[ 1 ] === callback ) {
+                                       trackCallbacks.remove( fns[ 0 ] );
                                        // Ensure the tuple is removed to avoid holding on to closures
                                        return false;
                                }
 
                /**
                 * Dummy placeholder for {@link mw.log}
+                *
                 * @method
                 */
                log: ( function () {
                         * @param {string} [msg] Optional text to include in the deprecation message
                         */
                        log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
-                               obj[key] = val;
+                               obj[ key ] = val;
                        } : function ( obj, key, val, msg ) {
                                msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
                                // Support: IE8
                                        } );
                                } catch ( err ) {
                                        // Fallback to creating a copy of the value to the object.
-                                       obj[key] = val;
+                                       obj[ key ] = val;
                                }
                        };
 
                         *    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`:
                                if ( nextnode ) {
                                        $( nextnode ).before( s );
                                } else {
-                                       document.getElementsByTagName( 'head' )[0].appendChild( s );
+                                       document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                                }
                                if ( s.styleSheet ) {
                                        // Support: IE6-10
                         */
                        function getCombinedVersion( modules ) {
                                var hashes = $.map( modules, function ( module ) {
-                                       return registry[module].version;
+                                       return registry[ module ].version;
                                } );
                                // Trim for consistency with server-side ResourceLoader::makeHash. It also helps
                                // save precious space in the limited query string. Otherwise modules are more
                        function allReady( modules ) {
                                var i;
                                for ( i = 0; i < modules.length; i++ ) {
-                                       if ( mw.loader.getState( modules[i] ) !== 'ready' ) {
+                                       if ( mw.loader.getState( modules[ i ] ) !== 'ready' ) {
                                                return false;
                                        }
                                }
                        function anyFailed( modules ) {
                                var i, state;
                                for ( i = 0; i < modules.length; i++ ) {
-                                       state = mw.loader.getState( modules[i] );
+                                       state = mw.loader.getState( modules[ i ] );
                                        if ( state === 'error' || state === 'missing' ) {
                                                return true;
                                        }
                        function handlePending( module ) {
                                var j, job, hasErrors, m, stateChange;
 
-                               if ( registry[module].state === 'error' || registry[module].state === 'missing' ) {
+                               if ( registry[ module ].state === 'error' || registry[ module ].state === 'missing' ) {
                                        // If the current module failed, mark all dependent modules also as failed.
                                        // Iterate until steady-state to propagate the error state upwards in the
                                        // dependency tree.
                                        do {
                                                stateChange = false;
                                                for ( m in registry ) {
-                                                       if ( registry[m].state !== 'error' && registry[m].state !== 'missing' ) {
-                                                               if ( anyFailed( registry[m].dependencies ) ) {
-                                                                       registry[m].state = 'error';
+                                                       if ( registry[ m ].state !== 'error' && registry[ m ].state !== 'missing' ) {
+                                                               if ( anyFailed( registry[ m ].dependencies ) ) {
+                                                                       registry[ m ].state = 'error';
                                                                        stateChange = true;
                                                                }
                                                        }
 
                                // Execute all jobs whose dependencies are either all satisfied or contain at least one failed module.
                                for ( j = 0; j < jobs.length; j += 1 ) {
-                                       hasErrors = anyFailed( jobs[j].dependencies );
-                                       if ( hasErrors || allReady( jobs[j].dependencies ) ) {
+                                       hasErrors = anyFailed( jobs[ j ].dependencies );
+                                       if ( hasErrors || allReady( jobs[ j ].dependencies ) ) {
                                                // All dependencies satisfied, or some have errors
-                                               job = jobs[j];
+                                               job = jobs[ j ];
                                                jobs.splice( j, 1 );
                                                j -= 1;
                                                try {
                                                        if ( hasErrors ) {
                                                                if ( $.isFunction( job.error ) ) {
-                                                                       job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [module] );
+                                                                       job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [ module ] );
                                                                }
                                                        } else {
                                                                if ( $.isFunction( job.ready ) ) {
                                        }
                                }
 
-                               if ( registry[module].state === 'ready' ) {
+                               if ( registry[ module ].state === 'ready' ) {
                                        // The current module became 'ready'. Set it in the module store, and recursively execute all
                                        // dependent modules that are loaded and now have all dependencies satisfied.
-                                       mw.loader.store.set( module, registry[module] );
+                                       mw.loader.store.set( module, registry[ module ] );
                                        for ( m in registry ) {
-                                               if ( registry[m].state === 'loaded' && allReady( registry[m].dependencies ) ) {
+                                               if ( registry[ m ].state === 'loaded' && allReady( registry[ m ].dependencies ) ) {
                                                        execute( m );
                                                }
                                        }
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
 
-                               if ( registry[module].skip !== null ) {
+                               if ( registry[ module ].skip !== null ) {
                                        /*jshint evil:true */
-                                       skip = new Function( registry[module].skip );
-                                       registry[module].skip = null;
+                                       skip = new Function( registry[ module ].skip );
+                                       registry[ module ].skip = null;
                                        if ( skip() ) {
-                                               registry[module].skipped = true;
-                                               registry[module].dependencies = [];
-                                               registry[module].state = 'ready';
+                                               registry[ module ].skipped = true;
+                                               registry[ module ].dependencies = [];
+                                               registry[ module ].state = 'ready';
                                                handlePending( module );
                                                return;
                                        }
                                }
 
                                // Resolves dynamic loader function and replaces it with its own results
-                               if ( $.isFunction( registry[module].dependencies ) ) {
-                                       registry[module].dependencies = registry[module].dependencies();
+                               if ( $.isFunction( registry[ module ].dependencies ) ) {
+                                       registry[ module ].dependencies = registry[ module ].dependencies();
                                        // Ensures the module's dependencies are always in an array
-                                       if ( typeof registry[module].dependencies !== 'object' ) {
-                                               registry[module].dependencies = [registry[module].dependencies];
+                                       if ( typeof registry[ module ].dependencies !== 'object' ) {
+                                               registry[ module ].dependencies = [ registry[ module ].dependencies ];
                                        }
                                }
                                if ( $.inArray( module, resolved ) !== -1 ) {
                                        unresolved = {};
                                }
                                // Tracks down dependencies
-                               deps = registry[module].dependencies;
+                               deps = registry[ module ].dependencies;
                                len = deps.length;
                                for ( n = 0; n < len; n += 1 ) {
-                                       if ( $.inArray( deps[n], resolved ) === -1 ) {
-                                               if ( unresolved[deps[n]] ) {
+                                       if ( $.inArray( deps[ n ], resolved ) === -1 ) {
+                                               if ( unresolved[ deps[ n ] ] ) {
                                                        throw new Error(
                                                                'Circular reference detected: ' + module +
-                                                               ' -> ' + deps[n]
+                                                               ' -> ' + deps[ n ]
                                                        );
                                                }
 
                                                // Add to unresolved
-                                               unresolved[module] = true;
-                                               sortDependencies( deps[n], resolved, unresolved );
-                                               delete unresolved[module];
+                                               unresolved[ module ] = true;
+                                               sortDependencies( deps[ n ], resolved, unresolved );
+                                               delete unresolved[ module ];
                                        }
                                }
-                               resolved[resolved.length] = module;
+                               resolved[ resolved.length ] = module;
                        }
 
                        /**
                         *
                         * @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,
                                                // and their dependencies from the legacyWait (to prevent a circular dependency).
                                                legacyModules = resolve( mw.config.get( 'wgResourceLoaderLegacyModules', [] ) );
                                        try {
-                                               script = registry[module].script;
+                                               script = registry[ module ].script;
                                                markModuleReady = function () {
-                                                       registry[module].state = 'ready';
+                                                       registry[ module ].state = 'ready';
                                                        handlePending( module );
                                                };
                                                nestedAddScript = function ( arr, callback, i ) {
                                                                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 needs to NOT use mw.log because these errors are common in production mode
                                                // and not in debug mode, such as when a symbol that should be global isn't exported
-                                               registry[module].state = 'error';
+                                               registry[ module ].state = 'error';
                                                mw.track( 'resourceloader.exception', { exception: e, module: module, source: 'module-execute' } );
                                                handlePending( module );
                                        }
                                };
 
-                               // 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 );
+                               if ( registry[ module ].messages ) {
+                                       mw.messages.set( registry[ module ].messages );
                                }
 
                                // Initialise templates
-                               if ( registry[module].templates ) {
-                                       mw.templates.set( module, registry[module].templates );
+                               if ( registry[ module ].templates ) {
+                                       mw.templates.set( module, registry[ module ].templates );
                                }
 
                                // Make sure we don't run the scripts until all stylesheet insertions have completed.
                                // * back-compat: { <media>: [url, ..] }
                                // * { "css": [css, ..] }
                                // * { "url": { <media>: [url, ..] } }
-                               if ( registry[module].style ) {
-                                       for ( key in registry[module].style ) {
-                                               value = registry[module].style[key];
+                               if ( registry[ module ].style ) {
+                                       for ( key in registry[ module ].style ) {
+                                               value = registry[ module ].style[ key ];
                                                media = undefined;
 
                                                if ( key !== 'url' && key !== 'css' ) {
                                                        for ( i = 0; i < value.length; i += 1 ) {
                                                                if ( key === 'bc-url' ) {
                                                                        // back-compat: { <media>: [url, ..] }
-                                                                       addLink( media, value[i] );
+                                                                       addLink( media, value[ i ] );
                                                                } else if ( key === 'css' ) {
                                                                        // { "css": [css, ..] }
-                                                                       addEmbeddedCSS( value[i], cssHandle() );
+                                                                       addEmbeddedCSS( value[ i ], cssHandle() );
                                                                }
                                                        }
                                                // Not an array, but a regular object
                                                } else if ( typeof value === 'object' ) {
                                                        // { "url": { <media>: [url, ..] } }
                                                        for ( media in value ) {
-                                                               urls = value[media];
+                                                               urls = value[ media ];
                                                                for ( i = 0; i < urls.length; i += 1 ) {
-                                                                       addLink( media, urls[i] );
+                                                                       addLink( media, urls[ i ] );
                                                                }
                                                        }
                                                }
                        function request( dependencies, ready, error ) {
                                // Allow calling by single module name
                                if ( typeof dependencies === 'string' ) {
-                                       dependencies = [dependencies];
+                                       dependencies = [ dependencies ];
                                }
 
                                // Add ready and error callbacks if they were given
                                if ( ready !== undefined || error !== undefined ) {
-                                       jobs[jobs.length] = {
+                                       jobs[ jobs.length ] = {
                                                dependencies: $.grep( dependencies, function ( module ) {
                                                        var state = mw.loader.getState( module );
                                                        return state === 'registered' || state === 'loaded' || state === 'loading';
                                        if ( state === 'registered' && $.inArray( module, queue ) === -1 ) {
                                                // Private modules must be embedded in the page. Don't bother queuing
                                                // these as the server will deny them anyway (T101806).
-                                               if ( registry[module].group === 'private' ) {
-                                                       registry[module].state = 'error';
+                                               if ( registry[ module ].group === 'private' ) {
+                                                       registry[ module ].state = 'error';
                                                        handlePending( module );
                                                        return;
                                                }
                                }
                                a.sort();
                                for ( key = 0; key < a.length; key += 1 ) {
-                                       sorted[a[key]] = o[a[key]];
+                                       sorted[ a[ key ] ] = o[ a[ key ] ];
                                }
                                return sorted;
                        }
                        /**
                         * 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 ) {
 
                                for ( prefix in moduleMap ) {
                                        p = prefix === '' ? '' : prefix + '.';
-                                       arr.push( p + moduleMap[prefix].join( ',' ) );
+                                       arr.push( p + moduleMap[ prefix ].join( ',' ) );
                                }
                                return arr.join( '|' );
                        }
 
                        /**
                         * 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
                         */
                        function resolveIndexedDependencies( modules ) {
                                $.each( modules, function ( idx, module ) {
-                                       if ( module[2] ) {
-                                               module[2] = $.map( module[2], function ( dep ) {
-                                                       return typeof dep === 'number' ? modules[dep][0] : dep;
+                                       if ( module[ 2 ] ) {
+                                               module[ 2 ] = $.map( module[ 2 ], function ( dep ) {
+                                                       return typeof dep === 'number' ? modules[ dep ][ 0 ] : dep;
                                                } );
                                        }
                                } );
                                        // Appends a list of modules from the queue to the batch
                                        for ( q = 0; q < queue.length; q += 1 ) {
                                                // Only request modules which are registered
-                                               if ( hasOwn.call( registry, queue[q] ) && registry[queue[q]].state === 'registered' ) {
+                                               if ( hasOwn.call( registry, queue[ q ] ) && registry[ queue[ q ] ].state === 'registered' ) {
                                                        // Prevent duplicate entries
-                                                       if ( $.inArray( queue[q], batch ) === -1 ) {
-                                                               batch[batch.length] = queue[q];
+                                                       if ( $.inArray( queue[ q ], batch ) === -1 ) {
+                                                               batch[ batch.length ] = queue[ q ];
                                                                // Mark registered modules as loading
-                                                               registry[queue[q]].state = 'loading';
+                                                               registry[ queue[ q ] ].state = 'loading';
                                                        }
                                                }
                                        }
                                                        // the error) instead of all of them.
                                                        mw.track( 'resourceloader.exception', { exception: err, source: 'store-eval' } );
                                                        origBatch = $.grep( origBatch, function ( module ) {
-                                                               return registry[module].state === 'loading';
+                                                               return registry[ module ].state === 'loading';
                                                        } );
                                                        batch = batch.concat( origBatch );
                                                }
 
                                        // Split batch by source and by group.
                                        for ( b = 0; b < batch.length; b += 1 ) {
-                                               bSource = registry[batch[b]].source;
-                                               bGroup = registry[batch[b]].group;
+                                               bSource = registry[ batch[ b ] ].source;
+                                               bGroup = registry[ batch[ b ] ].group;
                                                if ( !hasOwn.call( splits, bSource ) ) {
-                                                       splits[bSource] = {};
+                                                       splits[ bSource ] = {};
                                                }
-                                               if ( !hasOwn.call( splits[bSource], bGroup ) ) {
-                                                       splits[bSource][bGroup] = [];
+                                               if ( !hasOwn.call( splits[ bSource ], bGroup ) ) {
+                                                       splits[ bSource ][ bGroup ] = [];
                                                }
-                                               bSourceGroup = splits[bSource][bGroup];
-                                               bSourceGroup[bSourceGroup.length] = batch[b];
+                                               bSourceGroup = splits[ bSource ][ bGroup ];
+                                               bSourceGroup[ bSourceGroup.length ] = batch[ b ];
                                        }
 
                                        // Clear the batch - this MUST happen before we append any
 
                                        for ( source in splits ) {
 
-                                               sourceLoadScript = sources[source];
+                                               sourceLoadScript = sources[ source ];
 
-                                               for ( group in splits[source] ) {
+                                               for ( group in splits[ source ] ) {
 
                                                        // Cache access to currently selected list of
                                                        // modules for this group from this source.
-                                                       modules = splits[source][group];
+                                                       modules = splits[ source ][ group ];
 
                                                        currReqBase = $.extend( {
                                                                version: getCombinedVersion( modules )
 
                                                        for ( i = 0; i < modules.length; i += 1 ) {
                                                                // Determine how many bytes this module would add to the query string
-                                                               lastDotIndex = modules[i].lastIndexOf( '.' );
+                                                               lastDotIndex = modules[ i ].lastIndexOf( '.' );
 
                                                                // If lastDotIndex is -1, substr() returns an empty string
-                                                               prefix = modules[i].substr( 0, lastDotIndex );
-                                                               suffix = modules[i].slice( lastDotIndex + 1 );
+                                                               prefix = modules[ i ].substr( 0, lastDotIndex );
+                                                               suffix = modules[ i ].slice( lastDotIndex + 1 );
 
                                                                bytesAdded = hasOwn.call( moduleMap, prefix )
                                                                        ? suffix.length + 3 // '%2C'.length == 3
-                                                                       : modules[i].length + 3; // '%7C'.length == 3
+                                                                       : modules[ i ].length + 3; // '%7C'.length == 3
 
                                                                // If the request would become too long, create a new one,
                                                                // but don't create empty requests
                                                                        mw.track( 'resourceloader.splitRequest', { maxQueryLength: maxQueryLength } );
                                                                }
                                                                if ( !hasOwn.call( moduleMap, prefix ) ) {
-                                                                       moduleMap[prefix] = [];
+                                                                       moduleMap[ prefix ] = [];
                                                                }
-                                                               moduleMap[prefix].push( suffix );
+                                                               moduleMap[ prefix ].push( suffix );
                                                                l += bytesAdded;
                                                        }
                                                        // If there's anything left in moduleMap, request that too
                                        // Allow multiple additions
                                        if ( typeof id === 'object' ) {
                                                for ( source in id ) {
-                                                       mw.loader.addSource( source, id[source] );
+                                                       mw.loader.addSource( source, id[ source ] );
                                                }
                                                return true;
                                        }
                                                loadUrl = loadUrl.loadScript;
                                        }
 
-                                       sources[id] = loadUrl;
+                                       sources[ id ] = loadUrl;
 
                                        return true;
                                },
                                                resolveIndexedDependencies( module );
                                                for ( i = 0, len = module.length; i < len; i++ ) {
                                                        // module is an array of module names
-                                                       if ( typeof module[i] === 'string' ) {
-                                                               mw.loader.register( module[i] );
+                                                       if ( typeof module[ i ] === 'string' ) {
+                                                               mw.loader.register( module[ i ] );
                                                        // module is an array of arrays
-                                                       } else if ( typeof module[i] === 'object' ) {
-                                                               mw.loader.register.apply( mw.loader, module[i] );
+                                                       } else if ( typeof module[ i ] === 'object' ) {
+                                                               mw.loader.register.apply( mw.loader, module[ i ] );
                                                        }
                                                }
                                                return;
                                                throw new Error( 'module already registered: ' + module );
                                        }
                                        // List the module as registered
-                                       registry[module] = {
+                                       registry[ module ] = {
                                                version: version !== undefined ? String( version ) : '',
                                                dependencies: [],
                                                group: typeof group === 'string' ? group : null,
                                        };
                                        if ( typeof dependencies === 'string' ) {
                                                // Allow dependencies to be given as a single module name
-                                               registry[module].dependencies = [ dependencies ];
+                                               registry[ module ].dependencies = [ dependencies ];
                                        } else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
                                                // Allow dependencies to be given as an array of module names
                                                // or a function which returns an array
-                                               registry[module].dependencies = dependencies;
+                                               registry[ module ].dependencies = dependencies;
                                        }
                                },
 
                                                mw.loader.register( module );
                                        }
                                        // Check for duplicate implementation
-                                       if ( hasOwn.call( registry, module ) && registry[module].script !== undefined ) {
+                                       if ( hasOwn.call( registry, module ) && registry[ module ].script !== undefined ) {
                                                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';
-                                               if ( allReady( registry[module].dependencies ) ) {
+                                       if ( $.inArray( registry[ module ].state, [ 'error', 'missing' ] ) === -1 ) {
+                                               registry[ module ].state = 'loaded';
+                                               if ( allReady( registry[ module ].dependencies ) ) {
                                                        execute( module );
                                                }
                                        }
 
                                        if ( typeof module === 'object' ) {
                                                for ( m in module ) {
-                                                       mw.loader.state( m, module[m] );
+                                                       mw.loader.state( m, module[ m ] );
                                                }
                                                return;
                                        }
                                        if ( !hasOwn.call( registry, module ) ) {
                                                mw.loader.register( module );
                                        }
-                                       if ( $.inArray( state, ['ready', 'error', 'missing'] ) !== -1
-                                               && registry[module].state !== state ) {
+                                       if ( $.inArray( state, [ 'ready', 'error', 'missing' ] ) !== -1
+                                               && registry[ module ].state !== state ) {
                                                // Make sure pending modules depending on this one get executed if their
                                                // dependencies are now fulfilled!
-                                               registry[module].state = state;
+                                               registry[ module ].state = state;
                                                handlePending( module );
                                        } else {
-                                               registry[module].state = state;
+                                               registry[ module ].state = state;
                                        }
                                },
 
                                 *  in the registry.
                                 */
                                getVersion: function ( module ) {
-                                       if ( !hasOwn.call( registry, module ) || registry[module].version === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) || registry[ module ].version === undefined ) {
                                                return null;
                                        }
-                                       return registry[module].version;
+                                       return registry[ module ].version;
                                },
 
                                /**
                                 *  in the registry.
                                 */
                                getState: function ( module ) {
-                                       if ( !hasOwn.call( registry, module ) || registry[module].state === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) || registry[ module ].state === undefined ) {
                                                return null;
                                        }
-                                       return registry[module].state;
+                                       return registry[ module ].state;
                                },
 
                                /**
 
                                        /**
                                         * 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 () {
                                         */
                                        getModuleKey: function ( module ) {
                                                return hasOwn.call( registry, module ) ?
-                                                       ( module + '@' + registry[module].version ) : null;
+                                                       ( module + '@' + registry[ module ].version ) : null;
                                        },
 
                                        /**
                                                key = mw.loader.store.getModuleKey( module );
                                                if ( key in mw.loader.store.items ) {
                                                        mw.loader.store.stats.hits++;
-                                                       return mw.loader.store.items[key];
+                                                       return mw.loader.store.items[ key ];
                                                }
                                                mw.loader.store.stats.misses++;
                                                return false;
                                                        ];
                                                        // Attempted workaround for a possible Opera bug (bug T59567).
                                                        // This regex should never match under sane conditions.
-                                                       if ( /^\s*\(/.test( args[1] ) ) {
-                                                               args[1] = 'function' + args[1];
+                                                       if ( /^\s*\(/.test( args[ 1 ] ) ) {
+                                                               args[ 1 ] = 'function' + args[ 1 ];
                                                                mw.track( 'resourceloader.assert', { source: 'bug-T59567' } );
                                                        }
                                                } catch ( e ) {
                                                if ( src.length > mw.loader.store.MODULE_SIZE_MAX ) {
                                                        return false;
                                                }
-                                               mw.loader.store.items[key] = src;
+                                               mw.loader.store.items[ key ] = src;
                                                mw.loader.store.update();
                                        },
 
                                                        module = key.slice( 0, key.indexOf( '@' ) );
                                                        if ( mw.loader.store.getModuleKey( module ) !== key ) {
                                                                mw.loader.store.stats.expired++;
-                                                               delete mw.loader.store.items[key];
-                                                       } else if ( mw.loader.store.items[key].length > mw.loader.store.MODULE_SIZE_MAX ) {
+                                                               delete mw.loader.store.items[ key ];
+                                                       } else if ( mw.loader.store.items[ key ].length > mw.loader.store.MODULE_SIZE_MAX ) {
                                                                // This value predates the enforcement of a size limit on cached modules.
-                                                               delete mw.loader.store.items[key];
+                                                               delete mw.loader.store.items[ key ];
                                                        }
                                                }
                                        },
                                        var v, attrName, s = '<' + name;
 
                                        for ( attrName in attrs ) {
-                                               v = attrs[attrName];
+                                               v = attrs[ attrName ];
                                                // Convert name=true, to name=name
                                                if ( v === true ) {
                                                        v = attrName;
 
                                /**
                                 * 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 function ( name ) {
                                var list = hasOwn.call( lists, name ) ?
-                                       lists[name] :
-                                       lists[name] = $.Callbacks( 'memory' );
+                                       lists[ name ] :
+                                       lists[ name ] = $.Callbacks( 'memory' );
 
                                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 004e710..f361ec8 100644 (file)
                $notifications.each( function () {
                        var notif = $( this ).data( 'mw.notification' );
                        if ( notif ) {
-                               notif[fn]();
+                               notif[ fn ]();
                        }
                } );
        }
        /**
         * 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 a20d7f0..6c7484e 100644 (file)
                // Compatibility map
                map = {
                        // SimpleSearch is broken in Opera < 9.6
-                       opera: [['>=', 9.6]],
+                       opera: [ [ '>=', 9.6 ] ],
                        // Older Konquerors are unable to position the suggestions correctly (bug 50805)
-                       konqueror: [['>=', '4.11']],
+                       konqueror: [ [ '>=', '4.11' ] ],
                        docomo: false,
                        blackberry: false,
                        // Support for iOS 6 or higher. It has not been tested on iOS 5 or lower
-                       ipod: [['>=', 6]],
-                       iphone: [['>=', 6]]
+                       ipod: [ [ '>=', 6 ] ],
+                       iphone: [ [ '>=', 6 ] ]
                };
 
                if ( !$.client.test( map ) ) {
@@ -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() {
                $( searchboxesSelectors.join( ', ' ) )
                        .suggestions( {
                                fetch: function ( query, response, maxRows ) {
-                                       var node = this[0];
+                                       var node = this[ 0 ];
 
                                        api = api || new mw.Api();
 
                                        $.data( node, 'request', mw.searchSuggest.request( api, query, response, maxRows ) );
                                },
                                cancel: function () {
-                                       var node = this[0],
+                                       var node = this[ 0 ],
                                                request = $.data( node, 'request' );
 
                                        if ( request ) {
index 61bbb0d..c3db69e 100644 (file)
@@ -17,7 +17,7 @@
                        if ( !compiler.compile ) {
                                throw new Error( 'Compiler must implement compile method.' );
                        }
-                       compilers[name] = compiler;
+                       compilers[ name ] = compiler;
                },
 
                /**
                        var compiledTemplate,
                                compilerName = this.getCompilerName( templateName );
 
-                       if ( !compiledTemplates[moduleName] ) {
-                               compiledTemplates[moduleName] = {};
+                       if ( !compiledTemplates[ moduleName ] ) {
+                               compiledTemplates[ moduleName ] = {};
                        }
 
                        compiledTemplate = this.compile( templateBody, compilerName );
-                       compiledTemplates[moduleName][ templateName ] = compiledTemplate;
+                       compiledTemplates[ moduleName ][ templateName ] = compiledTemplate;
                        return compiledTemplate;
                },
 
index ec34ce6..b4baa66 100644 (file)
@@ -16,7 +16,7 @@
         */
        function getUserInfo( info ) {
                var api;
-               if ( !deferreds[info] ) {
+               if ( !deferreds[ info ] ) {
 
                        deferreds.rights = $.Deferred();
                        deferreds.groups = $.Deferred();
 
                }
 
-               return deferreds[info].promise();
+               return deferreds[ info ].promise();
        }
 
        // Map from numbers 0-255 to a hex string (with padding)
        for ( i = 0; i < 256; i++ ) {
                // Padding: Add a full byte (0x100, 256) and strip the extra character
-               byteToHex[i] = ( i + 256 ).toString( 16 ).slice( 1 );
+               byteToHex[ i ] = ( i + 256 ).toString( 16 ).slice( 1 );
        }
 
        // mw.user with the properties options and tokens gets defined in mediawiki.js.
                                        if ( ( i & 3 ) === 0 ) {
                                                r = Math.random() * 0x100000000;
                                        }
-                                       rnds[i] = r >>> ( ( i & 3 ) << 3 ) & 255;
+                                       rnds[ i ] = r >>> ( ( i & 3 ) << 3 ) & 255;
                                }
                        }
                        // Convert from number to hex
                        for ( i = 0; i < 8; i++ ) {
-                               hexRnds[i] = byteToHex[rnds[i]];
+                               hexRnds[ i ] = byteToHex[ rnds[ i ] ];
                        }
 
                        // Concatenation of two random integers with entrophy n and m
                        // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
                        if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
                                parts = cookie.split( ':' );
-                               if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
-                                       version = Number( parts[0] );
-                                       bucket = String( parts[1] );
+                               if ( parts.length > 1 && Number( parts[ 0 ] ) === options.version ) {
+                                       version = Number( parts[ 0 ] );
+                                       bucket = String( parts[ 1 ] );
                                }
                        }
 
                                // Find range
                                range = 0;
                                for ( k in options.buckets ) {
-                                       range += options.buckets[k];
+                                       range += options.buckets[ k ];
                                }
 
                                // Select random value within range
                                total = 0;
                                for ( k in options.buckets ) {
                                        bucket = k;
-                                       total += options.buckets[k];
+                                       total += options.buckets[ k ];
                                        if ( total >= rand ) {
                                                break;
                                        }
index df10204..02a90fc 100644 (file)
@@ -6,7 +6,7 @@
 
        config = {
                fetch: function ( userInput, response, maxRows ) {
-                       var node = this[0];
+                       var node = this[ 0 ];
 
                        api = api || new mw.Api();
 
@@ -15,7 +15,7 @@
                                list: 'allusers',
                                // Prefix of list=allusers is case sensitive. Normalise first
                                // character to uppercase so that "fo" may yield "Foo".
-                               auprefix: userInput[0].toUpperCase() + userInput.slice( 1 ),
+                               auprefix: userInput[ 0 ].toUpperCase() + userInput.slice( 1 ),
                                aulimit: maxRows
                        } ).done( function ( data ) {
                                var users = $.map( data.query.allusers, function ( userObj ) {
@@ -25,7 +25,7 @@
                        } ) );
                },
                cancel: function () {
-                       var node = this[0],
+                       var node = this[ 0 ],
                                request = $.data( node, 'request' );
 
                        if ( request ) {
index 93a1b3b..e6c98be 100644 (file)
@@ -33,7 +33,7 @@
                                ];
 
                                for ( i = 0, l = selectors.length; i < l; i++ ) {
-                                       $node = $( selectors[i] );
+                                       $node = $( selectors[ i ] );
                                        if ( $node.length ) {
                                                return $node.first();
                                        }
@@ -78,6 +78,7 @@
                                .replace( /%24/g, '$' )
                                .replace( /%21/g, '!' )
                                .replace( /%2A/g, '*' )
+                               .replace( /%27/g, '\'' )
                                .replace( /%28/g, '(' )
                                .replace( /%29/g, ')' )
                                .replace( /%2C/g, ',' )
                 * 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';
                        if ( m ) {
                                // Beware that decodeURIComponent is not required to understand '+'
                                // by spec, as encodeURIComponent does not produce it.
-                               return decodeURIComponent( m[1].replace( /\+/g, '%20' ) );
+                               return decodeURIComponent( m[ 1 ].replace( /\+/g, '%20' ) );
                        }
                        return null;
                },
                                        // Error: Invalid nextnode
                                        nextnode = undefined;
                                }
-                               if ( nextnode && ( nextnode.length !== 1 || nextnode[0].parentNode !== $ul[0] ) ) {
+                               if ( nextnode && ( nextnode.length !== 1 || nextnode[ 0 ].parentNode !== $ul[ 0 ] ) ) {
                                        // Error: nextnode must resolve to a single node
                                        // Error: nextnode must have the associated <ul> as its parent
                                        nextnode = undefined;
                        // to get a localized access key label (bug 67946).
                        $link.updateTooltipAccessKeys();
 
-                       return $item[0];
+                       return $item[ 0 ];
                },
 
                /**
index 1d1455c..97b4fce 100644 (file)
@@ -35,18 +35,18 @@ function isCompatible( ua ) {
        // Browsers with outdated or limited JavaScript engines get the no-JS experience
        return !(
                // Internet Explorer < 8
-               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 8 ) ||
+               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[ 1 ] ) < 8 ) ||
                // Firefox < 3
-               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[ 1 ] ) < 3 ) ||
                // Opera < 12
                ( ua.indexOf( 'Opera/' ) !== -1 && ( ua.indexOf( 'Version/' ) === -1 ?
                        // "Opera/x.y"
-                       parseFloat( ua.split( 'Opera/' )[1] ) < 10 :
+                       parseFloat( ua.split( 'Opera/' )[ 1 ] ) < 10 :
                        // "Opera/9.80 ... Version/x.y"
-                       parseFloat( ua.split( 'Version/' )[1] ) < 12
+                       parseFloat( ua.split( 'Version/' )[ 1 ] ) < 12
                ) ) ||
                // "Mozilla/0.0 ... Opera x.y"
-               ( ua.indexOf( 'Opera ' ) !== -1 && parseFloat( ua.split( ' Opera ' )[1] ) < 10 ) ||
+               ( ua.indexOf( 'Opera ' ) !== -1 && parseFloat( ua.split( ' Opera ' )[ 1 ] ) < 10 ) ||
                // BlackBerry < 6
                ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
                // Open WebOS < 1.5
@@ -112,5 +112,5 @@ function isCompatible( ua ) {
                        startUp();
                }
        };
-       document.getElementsByTagName( 'head' )[0].appendChild( script );
+       document.getElementsByTagName( 'head' )[ 0 ].appendChild( script );
 }() );
index aa8c9c8..8f83fc6 100644 (file)
@@ -5711,7 +5711,7 @@ Plain ''italic'''s plain
 ###
 ### Tables
 ###
-### some content taken from http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide:_Using_tables
+### some content taken from http://meta.wikimedia.org/wiki/MediaWiki_User's_Guide:_Using_tables
 ###
 
 # This should not produce <table></table> as <table><tr><td></td></tr></table>
@@ -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
@@ -7368,7 +7385,7 @@ Link containing double-single-quotes '' (bug 4598)
 !! wikitext
 [[Lista d''e paise d''o munno]]
 !! html/php
-<p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&amp;action=edit&amp;redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
+<p><a href="/index.php?title=Lista_d''e_paise_d''o_munno&amp;action=edit&amp;redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
 </p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./Lista_d''e_paise_d''o_munno" title="Lista d''e paise d''o munno">Lista d''e paise d''o munno</a></p>
@@ -7405,10 +7422,10 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 
 [[''Pentecoste''|''Pentecoste'']]
 !! html/php
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko &#39;&#39;Pentecoste&#39;&#39;.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
-</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
-</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
-</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a>
+<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Denys_Savchenko_&#39;&#39;Pentecoste&#39;&#39;.jpg" class="new" title="File:Denys Savchenko &#39;&#39;Pentecoste&#39;&#39;.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
+</p><p><a href="/index.php?title=''Pentecoste''&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
+</p><p><a href="/index.php?title=''Pentecoste''&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
+</p><p><a href="/index.php?title=''Pentecoste''&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a>
 </p>
 !! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Denys_Savchenko_''Pentecoste''.jpg"><img resource="./File:Denys_Savchenko_''Pentecoste''.jpg" src="./Special:FilePath/Denys_Savchenko_''Pentecoste''.jpg" height="220" width="220"/></a></span></p>
@@ -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
 ###
@@ -14033,7 +14074,7 @@ Link to category
 !! wikitext
 [[:Category:MediaWiki User's Guide]]
 !! html
-<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
+<p><a href="/wiki/Category:MediaWiki_User's_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
 </p>
 !! end
 
@@ -14044,7 +14085,7 @@ cat
 !! wikitext
 [[Category:MediaWiki User's Guide]]
 !! html
-<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
+<a href="/wiki/Category:MediaWiki_User's_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 !! test
@@ -14063,7 +14104,7 @@ cat
 !! wikitext
 [[Category:MediaWiki User's Guide|Foo]]
 !! html
-<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
+<a href="/wiki/Category:MediaWiki_User's_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 !! test
@@ -14073,7 +14114,7 @@ cat
 !! wikitext
 [[Category:MediaWiki User's Guide|MediaWiki User's Guide]]
 !! html
-<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
+<a href="/wiki/Category:MediaWiki_User's_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 !! test
@@ -19025,7 +19066,7 @@ language=sr cat
 !! wikitext
 [[Category:МедиаWики Усер'с Гуиде]]
 !! html
-<a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User%27s_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
+<a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User's_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 
@@ -20981,7 +21022,7 @@ File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascri
 !! html
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(&#39;malicious_javascript_code!&#39;);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
 <p>caption
 </p>
@@ -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 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 d4df7b0..07dcabc 100644 (file)
@@ -105,8 +105,8 @@ class WfUrlencodeTest extends MediaWikiTestCase {
 
                        // remaining chars do not need encoding
                        array(
-                               ';@$-_.!*',
-                               ';@$-_.!*',
+                               ';@$-_.!*\'',
+                               ';@$-_.!*\'',
                        ),
 
                        ### Other tests
@@ -118,9 +118,6 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                        // Other 'funnies' chars
                        array( '[]', '%5B%5D' ),
                        array( '<>', '%3C%3E' ),
-
-                       // Apostrophe is encoded
-                       array( '\'', '%27' ),
                );
        }
 }
index 823c933..1122ddd 100644 (file)
@@ -232,7 +232,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                                null,
                        ),
                        array(
-                               '<a class="external" rel="nofollow" href="//en.example.org/w/Foo%27bar">Foo\'bar</a>',
+                               '<a class="external" rel="nofollow" href="//en.example.org/w/Foo\'bar">Foo\'bar</a>',
                                "[[Foo'bar]]",
                                'enwiki',
                        ),
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 78771de..01f9625 100644 (file)
@@ -8,12 +8,12 @@
        /**
         * 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'
         */
        QUnit.fixurl = function ( value ) {
-               return value + (/\?/.test( value ) ? '&' : '?')
+               return value + ( /\?/.test( value ) ? '&' : '?' )
                        + String( new Date().getTime() )
                        + String( parseInt( Math.random() * 100000, 10 ) );
        };
@@ -66,7 +66,7 @@
        sinon.config = {
                injectIntoThis: true,
                injectInto: null,
-               properties: ['spy', 'stub', 'mock', 'sandbox'],
+               properties: [ 'spy', 'stub', 'mock', 'sandbox' ],
                // Don't fake timers by default
                useFakeTimers: false,
                useFakeServer: false
        /**
         * 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>
         */
                                                $.each( $.timers, function ( i, timer ) {
                                                        var node = timer.elem;
                                                        mw.log.warn( 'Unfinished animation #' + i + ' in ' + timer.queue + ' queue on ' +
-                                                               mw.html.element( node.nodeName.toLowerCase(), $(node).getAttrs() )
+                                                               mw.html.element( node.nodeName.toLowerCase(), $( node ).getAttrs() )
                                                        );
                                                } );
                                                // Force animations to stop to give the next test a clean start
                        children = $node.contents();
                        processedChildren = [];
                        for ( i = 0, len = children.length; i < len; i++ ) {
-                               el = children[i];
+                               el = children[ i ];
                                if ( el.nodeType === Node.ELEMENT_NODE || el.nodeType === Node.TEXT_NODE ) {
                                        processedChildren.push( getDomStructure( el ) );
                                }
         * @param {string} html HTML markup for one or more nodes.
         */
        function getHtmlStructure( html ) {
-               var el = $( '<div>' ).append( html )[0];
+               var el = $( '<div>' ).append( html )[ 0 ];
                return getDomStructure( el );
        }
 
                        missing = [];
 
                for ( i = 0, len = modules.length; i < len; i++ ) {
-                       state = mw.loader.getState( modules[i] );
+                       state = mw.loader.getState( modules[ i ] );
                        if ( state === 'error' ) {
-                               error.push( modules[i] );
+                               error.push( modules[ i ] );
                        } else if ( state === 'missing' ) {
-                               missing.push( modules[i] );
+                               missing.push( modules[ i ] );
                        }
                }
 
index 4484467..cf34fc1 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
                messages: {
-                       'brackets': '[$1]',
+                       brackets: '[$1]',
                        'word-separator': ' '
                }
        } ) );
@@ -9,23 +9,23 @@
        var getAccessKeyPrefixTestData = [
                        // ua string, platform string, expected prefix
                        // Internet Explorer
-                       ['Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-'],
-                       ['Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-'],
-                       ['Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-'],
+                       [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-' ],
+                       [ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-' ],
+                       [ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-' ],
                        // Firefox
-                       ['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-'],
-                       ['Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-'],
-                       ['Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-'],
+                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-' ],
+                       [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-' ],
+                       [ 'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-' ],
                        // Safari / Konqueror
-                       ['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-alt-'],
-                       ['Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-'],
-                       ['Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-'],
+                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-alt-' ],
+                       [ 'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-' ],
+                       [ 'Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-' ],
                        // Opera
-                       ['Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-'],
-                       ['Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'shift-esc-'],
+                       [ 'Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-' ],
+                       [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'shift-esc-' ],
                        // Chrome
-                       ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-'],
-                       ['Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-']
+                       [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-' ],
+                       [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ]
                ],
                // strings appended to title to make sure updateTooltipAccessKeys handles them correctly
                updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
@@ -39,9 +39,9 @@
                var i;
                for ( i = 0; i < getAccessKeyPrefixTestData.length; i++ ) {
                        assert.equal( $.fn.updateTooltipAccessKeys.getAccessKeyPrefix( {
-                               userAgent: getAccessKeyPrefixTestData[i][0],
-                               platform: getAccessKeyPrefixTestData[i][1]
-                       } ), getAccessKeyPrefixTestData[i][2], 'Correct prefix for ' + getAccessKeyPrefixTestData[i][0] );
+                               userAgent: getAccessKeyPrefixTestData[ i ][ 0 ],
+                               platform: getAccessKeyPrefixTestData[ i ][ 1 ]
+                       } ), getAccessKeyPrefixTestData[ i ][ 2 ], 'Correct prefix for ' + getAccessKeyPrefixTestData[ i ][ 0 ] );
                }
        } );
 
                        // (no browser is known using such a short prefix, though) or "Alt+Umschalt+" in German Firefox.
                        result = /^Title \[(.+)[aA]\]$/.exec( title );
                assert.ok( result, 'title should match expected structure.' );
-               assert.notEqual( result[1], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
+               assert.notEqual( result[ 1 ], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
        } );
 
        QUnit.test( 'updateTooltipAccessKeys - no access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
                var i, oldTitle, $input, newTitle;
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
-                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
                        $input = $( makeInput( oldTitle ) );
                        $( '#qunit-fixture' ).append( $input );
                        newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
@@ -70,7 +70,7 @@
                $.fn.updateTooltipAccessKeys.setTestMode( true );
                var i, oldTitle, $input, newTitle;
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
-                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
                        $input = $( makeInput( oldTitle, 'a' ) );
                        $( '#qunit-fixture' ).append( $input );
                        newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
index e8c5121..a1b2e5c 100644 (file)
@@ -11,7 +11,7 @@
 
        function findDivergenceIndex( a, b ) {
                var i = 0;
-               while ( i < a.length && i < b.length && a[i] === b[i] ) {
+               while ( i < a.length && i < b.length && a[ i ] === b[ i ] ) {
                        i++;
                }
                return i;
@@ -41,7 +41,7 @@
                // Add two characters using scary black magic
                spanText = $span.text();
                d = findDivergenceIndex( origText, spanText );
-               spanTextNew = spanText.slice( 0, d ) + origText[d] + origText[d] + '...';
+               spanTextNew = spanText.slice( 0, d ) + origText[ d ] + origText[ d ] + '...';
 
                assert.gt( spanTextNew.length, spanText.length, 'Verify that the new span-length is indeed greater' );
 
index c8e8ac7..9afd793 100644 (file)
@@ -10,7 +10,7 @@
 
                $canvas.animate( { backgroundColor: '#000' }, 10 ).promise().then( function () {
                        var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
-                       assert.deepEqual( endColors, [0, 0, 0], 'end state' );
+                       assert.deepEqual( endColors, [ 0, 0, 0 ], 'end state' );
                } );
 
                this.clock.tick( 20 );
index 39ae363..00de895 100644 (file)
@@ -4,25 +4,25 @@
        QUnit.test( 'getRGB', 18, function ( assert ) {
                assert.strictEqual( $.colorUtil.getRGB(), undefined, 'No arguments' );
                assert.strictEqual( $.colorUtil.getRGB( '' ), undefined, 'Empty string' );
-               assert.deepEqual( $.colorUtil.getRGB( [0, 100, 255] ), [0, 100, 255], 'Parse array of rgb values' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0,100,255)' ), [0, 100, 255], 'Parse simple rgb string' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [0, 100, 255], 'Parse simple rgb string with spaces' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [0, 51, 102], 'Parse rgb string with percentages' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [0, 51, 102], 'Parse rgb string with percentages and spaces' );
-               assert.deepEqual( $.colorUtil.getRGB( '#f2ddee' ), [242, 221, 238], 'Hex string: 6 char lowercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#f2DDEE' ), [242, 221, 238], 'Hex string: 6 char uppercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#f2DdEe' ), [242, 221, 238], 'Hex string: 6 char mixed' );
-               assert.deepEqual( $.colorUtil.getRGB( '#eee' ), [238, 238, 238], 'Hex string: 3 char lowercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#EEE' ), [238, 238, 238], 'Hex string: 3 char uppercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex string: 3 char mixed' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
+               assert.deepEqual( $.colorUtil.getRGB( [ 0, 100, 255 ] ), [ 0, 100, 255 ], 'Parse array of rgb values' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0,100,255)' ), [ 0, 100, 255 ], 'Parse simple rgb string' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [ 0, 100, 255 ], 'Parse simple rgb string with spaces' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [ 0, 51, 102 ], 'Parse rgb string with percentages' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [ 0, 51, 102 ], 'Parse rgb string with percentages and spaces' );
+               assert.deepEqual( $.colorUtil.getRGB( '#f2ddee' ), [ 242, 221, 238 ], 'Hex string: 6 char lowercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#f2DDEE' ), [ 242, 221, 238 ], 'Hex string: 6 char uppercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#f2DdEe' ), [ 242, 221, 238 ], 'Hex string: 6 char mixed' );
+               assert.deepEqual( $.colorUtil.getRGB( '#eee' ), [ 238, 238, 238 ], 'Hex string: 3 char lowercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#EEE' ), [ 238, 238, 238 ], 'Hex string: 3 char uppercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [ 238, 238, 238 ], 'Hex string: 3 char mixed' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [ 255, 255, 255 ], 'Zero rgba for Safari 3; Transparent (whitespace)' );
 
                // Perhaps this is a bug in colorUtil, but it is the current behavior so, let's keep
                // track of it, so we will know in case it would ever change.
                assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
 
-               assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 'Color names (lightGreen)' );
-               assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [255, 255, 255], 'Color names (transparent)' );
+               assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [ 144, 238, 144 ], 'Color names (lightGreen)' );
+               assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [ 255, 255, 255 ], 'Color names (transparent)' );
                assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
        } );
 
@@ -37,9 +37,9 @@
 
                // Re-create the rgbToHsl return array items, limited to two decimals.
                hsl = $.colorUtil.rgbToHsl( 144, 238, 144 );
-               ret = [ dualDecimals( hsl[0] ), dualDecimals( hsl[1] ), dualDecimals( hsl[2] ) ];
+               ret = [ dualDecimals( hsl[ 0 ] ), dualDecimals( hsl[ 1 ] ), dualDecimals( hsl[ 2 ] ) ];
 
-               assert.deepEqual( ret, [0.33, 0.73, 0.75], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
+               assert.deepEqual( ret, [ 0.33, 0.73, 0.75 ], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
        } );
 
        QUnit.test( 'hslToRgb', 1, function ( assert ) {
@@ -47,9 +47,9 @@
                rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
 
                // Re-create the hslToRgb return array items, rounded to whole numbers.
-               ret = [ Math.round( rgb[0] ), Math.round( rgb[1] ), Math.round( rgb[2] ) ];
+               ret = [ Math.round( rgb[ 0 ] ), Math.round( rgb[ 1 ] ), Math.round( rgb[ 2 ] ) ];
 
-               assert.deepEqual( ret, [183, 240, 168], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
+               assert.deepEqual( ret, [ 183, 240, 168 ], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
        } );
 
        QUnit.test( 'getColorBrightness', 2, function ( assert ) {
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 3ef2790..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' );
 
@@ -88,7 +88,7 @@
                html = '<div><span><html:msg key="foo-welcome" /></span></div>';
                $lc = $( html ).localize( {
                        params: {
-                               'foo-welcome': [sitename, 'yesterday']
+                               'foo-welcome': [ sitename, 'yesterday' ]
                        }
                } ).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 911e9d0..029edd5 100644 (file)
@@ -8,7 +8,7 @@
                teardown: function () {
                        this.restoreWarnings();
                }
-       }) );
+       } ) );
 
        QUnit.test( 'String functions', 7, function ( assert ) {
                assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
@@ -52,9 +52,9 @@
        } );
 
        QUnit.test( 'Comparison functions', 5, function ( assert ) {
-               assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, 'a', [], [2, 'b'] ] ),
+               assert.ok( $.compareArray( [ 0, 'a', [], [ 2, 'b' ] ], [ 0, 'a', [], [ 2, 'b' ] ] ),
                        'compareArray: Two deep arrays that are excactly the same' );
-               assert.ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
+               assert.ok( !$.compareArray( [ 1 ], [ 2 ] ), 'compareArray: Two different arrays (false)' );
 
                assert.ok( $.compareObject( {}, {} ), 'compareObject: Two empty objects' );
                assert.ok( $.compareObject( { foo: 1 }, { foo: 1 } ), 'compareObject: Two the same objects' );
index 78c185f..5d0ddeb 100644 (file)
@@ -1,13 +1,13 @@
-( function ($) {
+( function ( $ ) {
 
-       QUnit.module('jquery.placeholder', QUnit.newMwEnvironment());
+       QUnit.module( 'jquery.placeholder', QUnit.newMwEnvironment() );
 
-       QUnit.test('caches results of feature tests', 2, function (assert) {
-               assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input');
-               assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea');
-       });
+       QUnit.test( 'caches results of feature tests', 2, function ( assert ) {
+               assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input' );
+               assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea' );
+       } );
 
-       if ($.fn.placeholder.input && $.fn.placeholder.textarea) {
+       if ( $.fn.placeholder.input && $.fn.placeholder.textarea ) {
                return;
        }
 
                        '<input id="input-type-password" type="password" placeholder="e.g. hunter2">' +
                        '<textarea id="textarea" name="message" placeholder="Your message goes here"></textarea>' +
                '</form>',
-       testElement = function ($el, assert) {
+       testElement = function ( $el, assert ) {
 
-               var el = $el[0],
-                       placeholder = el.getAttribute('placeholder');
+               var el = $el[ 0 ],
+                       placeholder = el.getAttribute( 'placeholder' );
 
-               assert.strictEqual($el.placeholder(), $el, 'should be chainable');
+               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
                // test on focus
                $el.focus();
-               assert.strictEqual(el.value, '', '`value` should be the empty string on focus');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok(!$el.hasClass('placeholder'), 'should not have `placeholder` class on focus');
+               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
 
                // and unfocus (blur) again
                $el.blur();
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
                // change the value
-               $el.val('lorem ipsum');
-               assert.strictEqual($el.prop('value'), 'lorem ipsum', '`$el.val(string)` should change the `value` property');
-               assert.strictEqual(el.value, 'lorem ipsum', '`$el.val(string)` should change the `value` attribute');
-               assert.ok(!$el.hasClass('placeholder'), '`$el.val(string)` should remove `placeholder` class');
+               $el.val( 'lorem ipsum' );
+               assert.strictEqual( $el.prop( 'value' ), 'lorem ipsum', '`$el.val(string)` should change the `value` property' );
+               assert.strictEqual( el.value, 'lorem ipsum', '`$el.val(string)` should change the `value` attribute' );
+               assert.ok( !$el.hasClass( 'placeholder' ), '`$el.val(string)` should remove `placeholder` class' );
 
                // and clear it again
-               $el.val('');
-               assert.strictEqual($el.prop('value'), '', '`$el.val("")` should change the `value` property');
-               assert.strictEqual(el.value, placeholder, '`$el.val("")` should change the `value` attribute');
-               assert.ok($el.hasClass('placeholder'), '`$el.val("")` should re-enable `placeholder` class');
+               $el.val( '' );
+               assert.strictEqual( $el.prop( 'value' ), '', '`$el.val("")` should change the `value` property' );
+               assert.strictEqual( el.value, placeholder, '`$el.val("")` should change the `value` attribute' );
+               assert.ok( $el.hasClass( 'placeholder' ), '`$el.val("")` should re-enable `placeholder` class' );
 
                // make sure the placeholder property works as expected.
-               assert.strictEqual($el.prop('placeholder'), placeholder, '$el.prop(`placeholder`) should return the placeholder value');
-               $el.placeholder('new placeholder');
-               assert.strictEqual(el.getAttribute('placeholder'), 'new placeholder', '$el.placeholder(<string>) should set the placeholder value');
-               assert.strictEqual(el.value, 'new placeholder', '$el.placeholder(<string>) should update the displayed placeholder value');
-               $el.placeholder(placeholder);
+               assert.strictEqual( $el.prop( 'placeholder' ), placeholder, '$el.prop(`placeholder`) should return the placeholder value' );
+               $el.placeholder( 'new placeholder' );
+               assert.strictEqual( el.getAttribute( 'placeholder' ), 'new placeholder', '$el.placeholder(<string>) should set the placeholder value' );
+               assert.strictEqual( el.value, 'new placeholder', '$el.placeholder(<string>) should update the displayed placeholder value' );
+               $el.placeholder( placeholder );
        };
 
-       QUnit.test('emulates placeholder for <input type=text>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-text'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=text>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-text' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=search>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-search'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=search>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-search' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=email>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-email'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=email>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-email' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=url>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-url'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=url>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-url' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=tel>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-tel'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=tel>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-tel' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=password>', 13, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
+       QUnit.test( 'emulates placeholder for <input type=password>', 13, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
 
                var selector = '#input-type-password',
-                       $el = $(selector),
-                       el = $el[0],
-                       placeholder = el.getAttribute('placeholder');
+                       $el = $( selector ),
+                       el = $el[ 0 ],
+                       placeholder = el.getAttribute( 'placeholder' );
 
-               assert.strictEqual($el.placeholder(), $el, 'should be chainable');
+               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
 
                // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $(selector);
-               el = $el[0];
+               $el = $( selector );
+               el = $el[ 0 ];
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
                // test on focus
                $el.focus();
 
                // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $(selector);
-               el = $el[0];
+               $el = $( selector );
+               el = $el[ 0 ];
 
-               assert.strictEqual(el.value, '', '`value` should be the empty string on focus');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok(!$el.hasClass('placeholder'), 'should not have `placeholder` class on focus');
+               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
 
                // and unfocus (blur) again
                $el.blur();
 
                // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $(selector);
-               el = $el[0];
+               $el = $( selector );
+               el = $el[ 0 ];
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
-       });
+       } );
 
-       QUnit.test('emulates placeholder for <textarea></textarea>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#textarea'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <textarea></textarea>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#textarea' ), assert );
+       } );
 
-}(jQuery));
+}( jQuery ) );
index 00d4a08..032551d 100644 (file)
                setup: function () {
                        this.liveMonths = mw.language.months;
                        mw.language.months = {
-                               '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',
-                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen'],
-                                       'abbrev': ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
-                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
+                               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',
+                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen' ],
+                                       abbrev: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
+                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
-                               'names': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'genitive': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'abbrev': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+                               names: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
@@ -36,8 +36,8 @@
                        /* default date format of the content language */
                        wgDefaultDateFormat: 'dmy',
                        /* These two are important for numeric interpretations */
-                       wgSeparatorTransformTable: ['', ''],
-                       wgDigitTransformTable: ['', '']
+                       wgSeparatorTransformTable: [ '', '' ],
+                       wgDigitTransformTable: [ '', '' ]
                }
        } ) );
 
                QUnit.test( msg, data.length * 2, function ( assert ) {
                        var extractedR, extractedF, parser;
 
-                       if (callback !== undefined ) {
+                       if ( callback !== undefined ) {
                                callback();
                        }
 
                        parser = $.tablesorter.getParser( parserId );
                        $.each( data, function ( index, testcase ) {
-                               extractedR = parser.is( testcase[0] );
-                               extractedF = parser.format( testcase[0] );
+                               extractedR = parser.is( testcase[ 0 ] );
+                               extractedF = parser.format( testcase[ 0 ] );
 
-                               assert.strictEqual( extractedR, testcase[1], 'Detect: ' + testcase[3] );
-                               assert.strictEqual( extractedF, testcase[2], 'Sortkey: ' + testcase[3] );
+                               assert.strictEqual( extractedR, testcase[ 1 ], 'Detect: ' + testcase[ 3 ] );
+                               assert.strictEqual( extractedF, testcase[ 2 ], 'Sortkey: ' + testcase[ 3 ] );
                        } );
 
                } );
 
        ipv4 = [
                // Some randomly generated fake IPs
-               ['0.0.0.0', true, 0, 'An IP address' ],
-               ['255.255.255.255', true, 255255255255, 'An IP address' ],
-               ['45.238.27.109', true, 45238027109, 'An IP address' ],
-               ['1.238.27.1', true, 1238027001, 'An IP address with small numbers' ],
-               ['238.27.1', false, 238027001, 'A malformed IP Address' ],
-               ['1', false, 1, 'A super malformed IP Address' ],
-               ['Just text', false, 0, 'A line with just text' ],
-               ['45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ],
-               ['45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ]
+               [ '0.0.0.0', true, 0, 'An IP address' ],
+               [ '255.255.255.255', true, 255255255255, 'An IP address' ],
+               [ '45.238.27.109', true, 45238027109, 'An IP address' ],
+               [ '1.238.27.1', true, 1238027001, 'An IP address with small numbers' ],
+               [ '238.27.1', false, 238027001, 'A malformed IP Address' ],
+               [ '1', false, 1, 'A super malformed IP Address' ],
+               [ 'Just text', false, 0, 'A line with just text' ],
+               [ '45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ],
+               [ '45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ]
        ];
        parserTest( 'IPv4', 'IPAddress', ipv4 );
 
        simpleMDYDatesInMDY = [
-               ['January 17, 2010',    true, 20100117, 'Long middle endian date'],
-               ['Jan 17, 2010',        true, 20100117, 'Short middle endian date'],
-               ['1/17/2010',           true, 20100117, 'Numeric middle endian date'],
-               ['01/17/2010',          true, 20100117, 'Numeric middle endian date with padding on month'],
-               ['01/07/2010',          true, 20100107, 'Numeric middle endian date with padding on day'],
-               ['01/07/0010',          true, 20100107, 'Numeric middle endian date with padding on year'],
-               ['5.12.1990',           true, 19900512, 'Numeric middle endian date with . separator']
+               [ 'January 17, 2010',   true, 20100117, 'Long middle endian date' ],
+               [ 'Jan 17, 2010',       true, 20100117, 'Short middle endian date' ],
+               [ '1/17/2010',          true, 20100117, 'Numeric middle endian date' ],
+               [ '01/17/2010',         true, 20100117, 'Numeric middle endian date with padding on month' ],
+               [ '01/07/2010',         true, 20100107, 'Numeric middle endian date with padding on day' ],
+               [ '01/07/0010',         true, 20100107, 'Numeric middle endian date with padding on year' ],
+               [ '5.12.1990',          true, 19900512, 'Numeric middle endian date with . separator' ]
        ];
        parserTest( 'MDY Dates using mdy content language', 'date', simpleMDYDatesInMDY );
 
        simpleMDYDatesInDMY = [
-               ['January 17, 2010',    true, 20100117, 'Long middle endian date'],
-               ['Jan 17, 2010',        true, 20100117, 'Short middle endian date'],
-               ['1/17/2010',           true, 20101701, 'Numeric middle endian date'],
-               ['01/17/2010',          true, 20101701, 'Numeric middle endian date with padding on month'],
-               ['01/07/2010',          true, 20100701, 'Numeric middle endian date with padding on day'],
-               ['01/07/0010',          true, 20100701, 'Numeric middle endian date with padding on year'],
-               ['5.12.1990',           true, 19901205, 'Numeric middle endian date with . separator']
+               [ 'January 17, 2010',   true, 20100117, 'Long middle endian date' ],
+               [ 'Jan 17, 2010',       true, 20100117, 'Short middle endian date' ],
+               [ '1/17/2010',          true, 20101701, 'Numeric middle endian date' ],
+               [ '01/17/2010',         true, 20101701, 'Numeric middle endian date with padding on month' ],
+               [ '01/07/2010',         true, 20100701, 'Numeric middle endian date with padding on day' ],
+               [ '01/07/0010',         true, 20100701, 'Numeric middle endian date with padding on year' ],
+               [ '5.12.1990',          true, 19901205, 'Numeric middle endian date with . separator' ]
        ];
        parserTest( 'MDY Dates using dmy content language', 'date', simpleMDYDatesInDMY, function () {
                mw.config.set( {
-                       'wgDefaultDateFormat': 'dmy',
-                       'wgPageContentLanguage': 'de'
+                       wgDefaultDateFormat: 'dmy',
+                       wgPageContentLanguage: 'de'
                } );
        } );
 
        oldMDYDates = [
-               ['January 19, 1400 BC',         false, '99999999', 'BC'],
-               ['January 19, 1400BC',          false, '99999999', 'Connected BC'],
-               ['January, 19 1400 B.C.',       false, '99999999', 'B.C.'],
-               ['January 19, 1400 AD',         false, '99999999', 'AD'],
-               ['January, 19 10',                      true, 20100119, 'AD'],
-               ['January, 19 1',                       false, '99999999', 'AD']
+               [ 'January 19, 1400 BC',                false, '99999999', 'BC' ],
+               [ 'January 19, 1400BC',         false, '99999999', 'Connected BC' ],
+               [ 'January, 19 1400 B.C.',      false, '99999999', 'B.C.' ],
+               [ 'January 19, 1400 AD',                false, '99999999', 'AD' ],
+               [ 'January, 19 10',                     true, 20100119, 'AD' ],
+               [ 'January, 19 1',                      false, '99999999', 'AD' ]
        ];
        parserTest( 'Very old MDY dates', 'date', oldMDYDates );
 
        complexMDYDates = [
-               ['January, 19 2010',    true, 20100119, 'Comma after month'],
-               ['January 19, 2010',    true, 20100119, 'Comma after day'],
-               ['January/19/2010',             true, 20100119, 'Forward slash separator'],
-               ['04 22 1991',                  true, 19910422, 'Month with 0 padding'],
-               ['April 21 1991',               true, 19910421, 'Space separation'],
-               ['04 22 1991',                  true, 19910422, 'Month with 0 padding'],
-               ['December 12 \'10',    true, 20101212, ''],
-               ['Dec 12 \'10',                 true, 20101212, ''],
-               ['Dec. 12 \'10',                true, 20101212, '']
+               [ 'January, 19 2010',   true, 20100119, 'Comma after month' ],
+               [ 'January 19, 2010',   true, 20100119, 'Comma after day' ],
+               [ 'January/19/2010',            true, 20100119, 'Forward slash separator' ],
+               [ '04 22 1991',                 true, 19910422, 'Month with 0 padding' ],
+               [ 'April 21 1991',              true, 19910421, 'Space separation' ],
+               [ '04 22 1991',                 true, 19910422, 'Month with 0 padding' ],
+               [ 'December 12 \'10',   true, 20101212, '' ],
+               [ 'Dec 12 \'10',                        true, 20101212, '' ],
+               [ 'Dec. 12 \'10',               true, 20101212, '' ]
        ];
        parserTest( 'MDY Dates', 'date', complexMDYDates );
 
        clobberedDates = [
-               ['January, 19 2010 - January, 20 2010', false, '99999999', 'Date range with hyphen'],
-               ['January, 19 2010 — January, 20 2010',       false, '99999999', 'Date range with mdash'],
-               ['prefixJanuary, 19 2010',      false, '99999999', 'Connected prefix'],
-               ['prefix January, 19 2010',     false, '99999999', 'Prefix'],
-               ['December 12 2010postfix',     false, '99999999', 'ConnectedPostfix'],
-               ['December 12 2010 postfix',    false, '99999999', 'Postfix'],
-               ['A simple text',               false, '99999999', 'Plain text in date sort'],
-               ['04l22l1991',                  false, '99999999', 'l char as separator'],
-               ['January\\19\\2010',   false, '99999999', 'backslash as date separator']
+               [ 'January, 19 2010 - January, 20 2010',        false, '99999999', 'Date range with hyphen' ],
+               [ 'January, 19 2010 — January, 20 2010',      false, '99999999', 'Date range with mdash' ],
+               [ 'prefixJanuary, 19 2010',     false, '99999999', 'Connected prefix' ],
+               [ 'prefix January, 19 2010',    false, '99999999', 'Prefix' ],
+               [ 'December 12 2010postfix',    false, '99999999', 'ConnectedPostfix' ],
+               [ 'December 12 2010 postfix',   false, '99999999', 'Postfix' ],
+               [ 'A simple text',              false, '99999999', 'Plain text in date sort' ],
+               [ '04l22l1991',                 false, '99999999', 'l char as separator' ],
+               [ 'January\\19\\2010',  false, '99999999', 'backslash as date separator' ]
        ];
        parserTest( 'Clobbered Dates', 'date', clobberedDates );
 
        MYDates = [
-               ['December 2010',       false, '99999999', 'Plain month year'],
-               ['Dec 2010',            false, '99999999', 'Abreviated month year'],
-               ['12 2010',                     false, '99999999', 'Numeric month year']
+               [ 'December 2010',      false, '99999999', 'Plain month year' ],
+               [ 'Dec 2010',           false, '99999999', 'Abreviated month year' ],
+               [ '12 2010',                    false, '99999999', 'Numeric month year' ]
        ];
        parserTest( 'MY Dates', 'date', MYDates );
 
        YDates = [
-               ['2010',        false, '99999999', 'Plain 4-digit year'],
-               ['876',         false, '99999999', '3-digit year'],
-               ['76',          false, '99999999', '2-digit year'],
-               ['\'76',        false, '99999999', '2-digit millenium bug year'],
-               ['2010 BC',     false, '99999999', '4-digit year BC']
+               [ '2010',       false, '99999999', 'Plain 4-digit year' ],
+               [ '876',                false, '99999999', '3-digit year' ],
+               [ '76',         false, '99999999', '2-digit year' ],
+               [ '\'76',       false, '99999999', '2-digit millenium bug year' ],
+               [ '2010 BC',    false, '99999999', '4-digit year BC' ]
        ];
        parserTest( 'Y Dates', 'date', YDates );
 
        currencyData = [
-               ['1.02 $',      true, 1.02, ''],
-               ['$ 3.00',      true, 3, ''],
-               ['€ 2,99',    true, 299, ''],
-               ['$ 1.00',      true, 1, ''],
-               ['$3.50',       true, 3.50, ''],
-               ['$ 1.50',      true, 1.50, ''],
-               ['€ 0.99',    true, 0.99, ''],
-               ['$ 299.99',    true, 299.99, ''],
-               ['$ 2,299.99',  true, 2299.99, ''],
-               ['$ 2,989',     true, 2989, ''],
-               ['$ 2 299.99',  true, 2299.99, ''],
-               ['$ 2 989',     true, 2989, ''],
-               ['$ 2.989',     true, 2.989, '']
+               [ '1.02 $',     true, 1.02, '' ],
+               [ '$ 3.00',     true, 3, '' ],
+               [ '€ 2,99',   true, 299, '' ],
+               [ '$ 1.00',     true, 1, '' ],
+               [ '$3.50',      true, 3.50, '' ],
+               [ '$ 1.50',     true, 1.50, '' ],
+               [ '€ 0.99',   true, 0.99, '' ],
+               [ '$ 299.99',   true, 299.99, '' ],
+               [ '$ 2,299.99', true, 2299.99, '' ],
+               [ '$ 2,989',    true, 2989, '' ],
+               [ '$ 2 299.99', true, 2299.99, '' ],
+               [ '$ 2 989',    true, 2989, '' ],
+               [ '$ 2.989',    true, 2.989, '' ]
        ];
        parserTest( 'Currency', 'currency', currencyData );
 
        transformedCurrencyData = [
-               ['1.02 $',      true, 102, ''],
-               ['$ 3.00',      true, 300, ''],
-               ['€ 2,99',    true, 2.99, ''],
-               ['$ 1.00',      true, 100, ''],
-               ['$3.50',       true, 350, ''],
-               ['$ 1.50',      true, 150, ''],
-               ['€ 0.99',    true, 99, ''],
-               ['$ 299.99',    true, 29999, ''],
-               ['$ 2\'299,99', true, 2299.99, ''],
-               ['$ 2,989',     true, 2.989, ''],
-               ['$ 2 299.99',  true, 229999, ''],
-               ['2 989 $',     true, 2989, ''],
-               ['299.99 $',    true, 29999, ''],
-               ['2\'299,99 $', true, 2299.99, ''],
-               ['2,989 $',     true, 2.989, ''],
-               ['2 299.99 $',  true, 229999, ''],
-               ['2 989 $',     true, 2989, '']
+               [ '1.02 $',     true, 102, '' ],
+               [ '$ 3.00',     true, 300, '' ],
+               [ '€ 2,99',   true, 2.99, '' ],
+               [ '$ 1.00',     true, 100, '' ],
+               [ '$3.50',      true, 350, '' ],
+               [ '$ 1.50',     true, 150, '' ],
+               [ '€ 0.99',   true, 99, '' ],
+               [ '$ 299.99',   true, 29999, '' ],
+               [ '$ 2\'299,99',        true, 2299.99, '' ],
+               [ '$ 2,989',    true, 2.989, '' ],
+               [ '$ 2 299.99', true, 229999, '' ],
+               [ '2 989 $',    true, 2989, '' ],
+               [ '299.99 $',   true, 29999, '' ],
+               [ '2\'299,99 $',        true, 2299.99, '' ],
+               [ '2,989 $',    true, 2.989, '' ],
+               [ '2 299.99 $', true, 229999, '' ],
+               [ '2 989 $',    true, 2989, '' ]
        ];
        parserTest( 'Currency with european separators', 'currency', transformedCurrencyData, function () {
                mw.config.set( {
                        // We expect 22'234.444,22
                        // Map from ascii separators => localized separators
-                       wgSeparatorTransformTable: [',  .       ,', '\' ,       .'],
-                       wgDigitTransformTable: ['', '']
+                       wgSeparatorTransformTable: [ ', .       ,', '\' ,       .' ],
+                       wgDigitTransformTable: [ '', '' ]
                } );
        } );
 
index acd98a6..759322a 100644 (file)
@@ -8,9 +8,9 @@
                b1 = [ 'B', '1' ],
                b2 = [ 'B', '2' ],
                b3 = [ 'B', '3' ],
-               simple = [a2, b3, a1, a3, b2, b1],
-               simpleAsc = [a1, a2, a3, b1, b2, b3],
-               simpleDescasc = [b1, b2, b3, a1, a2, a3],
+               simple = [ a2, b3, a1, a3, b2, b1 ],
+               simpleAsc = [ a1, a2, a3, b1, b2, b3 ],
+               simpleDescasc = [ b1, b2, b3, a1, a2, a3 ],
 
                // Data set "colspan"
                aaa1 = [ 'A', 'A', 'A', '1' ],
@@ -27,9 +27,9 @@
                mars = [ 'Mars', '3390.0' ],
                jupiter = [ 'Jupiter', '69911' ],
                saturn = [ 'Saturn', '58232' ],
-               planets = [mercury, venus, earth, mars, jupiter, saturn],
-               planetsAscName = [earth, jupiter, mars, mercury, saturn, venus],
-               planetsAscRadius = [mercury, mars, venus, earth, saturn, jupiter],
+               planets = [ mercury, venus, earth, mars, jupiter, saturn ],
+               planetsAscName = [ earth, jupiter, mars, mercury, saturn, venus ],
+               planetsAscRadius = [ mercury, mars, venus, earth, saturn, jupiter ],
                planetsRowspan,
                planetsRowspanII,
                planetsAscNameLegacy,
                // Data set "ipv4"
                ipv4 = [
                        // Some randomly generated fake IPs
-                       ['45.238.27.109'],
-                       ['44.172.9.22'],
-                       ['247.240.82.209'],
-                       ['204.204.132.158'],
-                       ['170.38.91.162'],
-                       ['197.219.164.9'],
-                       ['45.68.154.72'],
-                       ['182.195.149.80']
+                       [ '45.238.27.109' ],
+                       [ '44.172.9.22' ],
+                       [ '247.240.82.209' ],
+                       [ '204.204.132.158' ],
+                       [ '170.38.91.162' ],
+                       [ '197.219.164.9' ],
+                       [ '45.68.154.72' ],
+                       [ '182.195.149.80' ]
                ],
                ipv4Sorted = [
                        // Sort order should go octet by octet
-                       ['44.172.9.22'],
-                       ['45.68.154.72'],
-                       ['45.238.27.109'],
-                       ['170.38.91.162'],
-                       ['182.195.149.80'],
-                       ['197.219.164.9'],
-                       ['204.204.132.158'],
-                       ['247.240.82.209']
+                       [ '44.172.9.22' ],
+                       [ '45.68.154.72' ],
+                       [ '45.238.27.109' ],
+                       [ '170.38.91.162' ],
+                       [ '182.195.149.80' ],
+                       [ '197.219.164.9' ],
+                       [ '204.204.132.158' ],
+                       [ '247.240.82.209' ]
                ],
 
                // Data set "umlaut"
                umlautWords = [
-                       ['Günther'],
-                       ['Peter'],
-                       ['Björn'],
-                       ['Bjorn'],
-                       ['Apfel'],
-                       ['Äpfel'],
-                       ['Strasse'],
-                       ['Sträßschen']
+                       [ 'Günther' ],
+                       [ 'Peter' ],
+                       [ 'Björn' ],
+                       [ 'Bjorn' ],
+                       [ 'Apfel' ],
+                       [ 'Äpfel' ],
+                       [ 'Strasse' ],
+                       [ 'Sträßschen' ]
                ],
                umlautWordsSorted = [
-                       ['Äpfel'],
-                       ['Apfel'],
-                       ['Björn'],
-                       ['Bjorn'],
-                       ['Günther'],
-                       ['Peter'],
-                       ['Sträßschen'],
-                       ['Strasse']
+                       [ 'Äpfel' ],
+                       [ 'Apfel' ],
+                       [ 'Björn' ],
+                       [ 'Bjorn' ],
+                       [ 'Günther' ],
+                       [ 'Peter' ],
+                       [ 'Sträßschen' ],
+                       [ 'Strasse' ]
                ],
 
                complexMDYDates = [
-                       ['January, 19 2010'],
-                       ['April 21 1991'],
-                       ['04 22 1991'],
-                       ['5.12.1990'],
-                       ['December 12 \'10']
+                       [ 'January, 19 2010' ],
+                       [ 'April 21 1991' ],
+                       [ '04 22 1991' ],
+                       [ '5.12.1990' ],
+                       [ 'December 12 \'10' ]
                ],
                complexMDYSorted = [
-                       ['5.12.1990'],
-                       ['April 21 1991'],
-                       ['04 22 1991'],
-                       ['January, 19 2010'],
-                       ['December 12 \'10']
+                       [ '5.12.1990' ],
+                       [ 'April 21 1991' ],
+                       [ '04 22 1991' ],
+                       [ 'January, 19 2010' ],
+                       [ 'December 12 \'10' ]
                ],
 
                currencyUnsorted = [
-                       ['1.02 $'],
-                       ['$ 3.00'],
-                       ['€ 2,99'],
-                       ['$ 1.00'],
-                       ['$3.50'],
-                       ['$ 1.50'],
-                       ['€ 0.99']
+                       [ '1.02 $' ],
+                       [ '$ 3.00' ],
+                       [ '€ 2,99' ],
+                       [ '$ 1.00' ],
+                       [ '$3.50' ],
+                       [ '$ 1.50' ],
+                       [ '€ 0.99' ]
                ],
                currencySorted = [
-                       ['€ 0.99'],
-                       ['$ 1.00'],
-                       ['1.02 $'],
-                       ['$ 1.50'],
-                       ['$ 3.00'],
-                       ['$3.50'],
+                       [ '€ 0.99' ],
+                       [ '$ 1.00' ],
+                       [ '1.02 $' ],
+                       [ '$ 1.50' ],
+                       [ '$ 3.00' ],
+                       [ '$3.50' ],
                        // Comma's sort after dots
                        // Not intentional but test to detect changes
-                       ['€ 2,99']
+                       [ '€ 2,99' ]
                ],
 
                numbers = [
-                       [ '12'    ],
-                       [  '7'    ],
-                       [ '13,000'],
-                       [  '9'    ],
-                       [ '14'    ],
-                       [  '8.0'  ]
+                       [ '12' ],
+                       [ '7' ],
+                       [ '13,000' ],
+                       [ '9' ],
+                       [ '14' ],
+                       [ '8.0' ]
                ],
                numbersAsc = [
-                       [  '7'    ],
-                       [  '8.0'  ],
-                       [  '9'    ],
-                       [ '12'    ],
-                       [ '14'    ],
-                       [ '13,000']
+                       [ '7' ],
+                       [ '8.0' ],
+                       [ '9' ],
+                       [ '12' ],
+                       [ '14' ],
+                       [ '13,000' ]
                ],
 
                correctDateSorting1 = [
-                       ['01 January 2010'],
-                       ['05 February 2010'],
-                       ['16 January 2010']
+                       [ '01 January 2010' ],
+                       [ '05 February 2010' ],
+                       [ '16 January 2010' ]
                ],
                correctDateSortingSorted1 = [
-                       ['01 January 2010'],
-                       ['16 January 2010'],
-                       ['05 February 2010']
+                       [ '01 January 2010' ],
+                       [ '16 January 2010' ],
+                       [ '05 February 2010' ]
                ],
 
                correctDateSorting2 = [
-                       ['January 01 2010'],
-                       ['February 05 2010'],
-                       ['January 16 2010']
+                       [ 'January 01 2010' ],
+                       [ 'February 05 2010' ],
+                       [ 'January 16 2010' ]
                ],
                correctDateSortingSorted2 = [
-                       ['January 01 2010'],
-                       ['January 16 2010'],
-                       ['February 05 2010']
+                       [ 'January 01 2010' ],
+                       [ 'January 16 2010' ],
+                       [ 'February 05 2010' ]
                ];
 
        QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment( {
                setup: function () {
                        this.liveMonths = mw.language.months;
                        mw.language.months = {
-                               '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',
-                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen'],
-                                       'abbrev': ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
-                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
+                               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',
+                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen' ],
+                                       abbrev: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
+                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
-                               'names': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'genitive': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'abbrev': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+                               names: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
                },
                config: {
                        wgDefaultDateFormat: 'dmy',
-                       wgSeparatorTransformTable: ['', ''],
-                       wgDigitTransformTable: ['', ''],
+                       wgSeparatorTransformTable: [ '', '' ],
+                       wgDigitTransformTable: [ '', '' ],
                        wgPageContentLanguage: 'en'
                }
        } ) );
         *
         * @param {String[]} header
         * @param {String[][]} data
-        * @return jQuery
+        * @return {jQuery}
         */
        function tableCreate( header, data ) {
                var i,
                for ( i = 0; i < data.length; i++ ) {
                        /*jshint loopfunc: true */
                        $tr = $( '<tr>' );
-                       $.each( data[i], function ( j, str ) {
+                       $.each( data[ i ], function ( j, str ) {
                                var $td = $( '<td>' );
                                $td.text( str ).appendTo( $tr );
                        } );
         * Extract text from table.
         *
         * @param {jQuery} $table
-        * @return String[][]
+        * @return {String[][]}
         */
        function tableExtract( $table ) {
                var data = [];
        }
 
        // Sample data set using planets named and their radius
-       header = [ 'Planet', 'Radius (km)'];
+       header = [ 'Planet', 'Radius (km)' ];
 
        tableTest(
                'Basic planet table: sorting initially - ascending by name',
 
                        // Pretend to click while pressing the multi-sort key
                        var event = $.Event( 'click' );
-                       event[$table.data( 'tablesorter' ).config.sortMultiSortKey] = true;
+                       event[ $table.data( 'tablesorter' ).config.sortMultiSortKey ] = true;
                        $table.find( '.headerSort:eq(1)' ).trigger( event );
                }
        );
        // Regression tests!
        tableTest(
                'Bug 28775: German-style (dmy) short numeric dates',
-               ['Date'],
+               [ 'Date' ],
                [
                        // German-style dates are day-month-year
-                       ['11.11.2011'],
-                       ['01.11.2011'],
-                       ['02.10.2011'],
-                       ['03.08.2011'],
-                       ['09.11.2011']
+                       [ '11.11.2011' ],
+                       [ '01.11.2011' ],
+                       [ '02.10.2011' ],
+                       [ '03.08.2011' ],
+                       [ '09.11.2011' ]
                ],
                [
                        // Sorted by ascending date
-                       ['03.08.2011'],
-                       ['02.10.2011'],
-                       ['01.11.2011'],
-                       ['09.11.2011'],
-                       ['11.11.2011']
+                       [ '03.08.2011' ],
+                       [ '02.10.2011' ],
+                       [ '01.11.2011' ],
+                       [ '09.11.2011' ],
+                       [ '11.11.2011' ]
                ],
                function ( $table ) {
                        mw.config.set( 'wgDefaultDateFormat', 'dmy' );
 
        tableTest(
                'Bug 28775: American-style (mdy) short numeric dates',
-               ['Date'],
+               [ 'Date' ],
                [
                        // American-style dates are month-day-year
-                       ['11.11.2011'],
-                       ['01.11.2011'],
-                       ['02.10.2011'],
-                       ['03.08.2011'],
-                       ['09.11.2011']
+                       [ '11.11.2011' ],
+                       [ '01.11.2011' ],
+                       [ '02.10.2011' ],
+                       [ '03.08.2011' ],
+                       [ '09.11.2011' ]
                ],
                [
                        // Sorted by ascending date
-                       ['01.11.2011'],
-                       ['02.10.2011'],
-                       ['03.08.2011'],
-                       ['09.11.2011'],
-                       ['11.11.2011']
+                       [ '01.11.2011' ],
+                       [ '02.10.2011' ],
+                       [ '03.08.2011' ],
+                       [ '09.11.2011' ],
+                       [ '11.11.2011' ]
                ],
                function ( $table ) {
                        mw.config.set( 'wgDefaultDateFormat', 'mdy' );
 
        tableTest(
                'Bug 17141: IPv4 address sorting',
-               ['IP'],
+               [ 'IP' ],
                ipv4,
                ipv4Sorted,
                function ( $table ) {
        );
        tableTest(
                'Bug 17141: IPv4 address sorting (reverse)',
-               ['IP'],
+               [ 'IP' ],
                ipv4,
                reversed( ipv4Sorted ),
                function ( $table ) {
 
        tableTest(
                'Accented Characters with custom collation',
-               ['Name'],
+               [ 'Name' ],
                umlautWords,
                umlautWordsSorted,
                function ( $table ) {
                        mw.config.set( 'tableSorterCollation', {
-                               'ä': 'ae',
-                               'ö': 'oe',
-                               'ß': 'ss',
-                               'ü': 'ue'
+                               ä: 'ae',
+                               ö: 'oe',
+                               ß: 'ss',
+                               ü: 'ue'
                        } );
 
                        $table.tablesorter();
 
        tableTest(
                'Complex date parsing I',
-               ['date'],
+               [ 'date' ],
                complexMDYDates,
                complexMDYSorted,
                function ( $table ) {
 
        tableTest(
                'Currency parsing I',
-               ['currency'],
+               [ 'currency' ],
                currencyUnsorted,
                currencySorted,
                function ( $table ) {
        );
 
        planetsAscNameLegacy = planetsAscName.slice( 0 );
-       planetsAscNameLegacy[4] = planetsAscNameLegacy[5];
+       planetsAscNameLegacy[ 4 ] = planetsAscNameLegacy[ 5 ];
        planetsAscNameLegacy.pop();
 
        tableTest(
                $table.find( '.headerSort:eq(0)' ).click();
 
                assert.equal(
-                       $table.data( 'tablesorter' ).config.parsers[0].id,
+                       $table.data( 'tablesorter' ).config.parsers[ 0 ].id,
                        'number',
                        'Correctly detected column content skipping sortbottom'
                );
        } );
 
        tableTest( 'bug 8115: sort numbers with commas (ascending)',
-               ['Numbers'], numbers, numbersAsc,
+               [ 'Numbers' ], numbers, numbersAsc,
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click();
        );
 
        tableTest( 'bug 8115: sort numbers with commas (descending)',
-               ['Numbers'], numbers, reversed( numbersAsc ),
+               [ 'Numbers' ], numbers, reversed( numbersAsc ),
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click().click();
 
        tableTest(
                'Correct date sorting I',
-               ['date'],
+               [ 'date' ],
                correctDateSorting1,
                correctDateSortingSorted1,
                function ( $table ) {
 
        tableTest(
                'Correct date sorting II',
-               ['date'],
+               [ 'date' ],
                correctDateSorting2,
                correctDateSortingSorted2,
                function ( $table ) {
                                '</tbody></table>' );
 
                        $table.tablesorter();
-                       assert.equal( $table.find( 'tr:eq(1) th:eq(1)').data('headerIndex'),
+                       assert.equal( $table.find( 'tr:eq(1) th:eq(1)' ).data( 'headerIndex' ),
                                2,
                                'Incorrect index of sort header'
                        );
index 4bf44b0..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( {
                        }
 
                        pos = $textarea.textSelection( 'getCaretPosition', { startAndEnd: true } );
-                       among( pos[0], options.start, 'Caret start should be where we set it.' );
-                       among( pos[1], options.end, 'Caret end should be where we set it.' );
+                       among( pos[ 0 ], options.start, 'Caret start should be where we set it.' );
+                       among( pos[ 1 ], options.end, 'Caret end should be where we set it.' );
                } );
        }
 
index 26b6f57..8033458 100644 (file)
@@ -14,7 +14,7 @@
        function sequence( responses ) {
                var i = 0;
                return function ( request ) {
-                       var response = responses[i];
+                       var response = responses[ i ];
                        if ( response ) {
                                i++;
                                request.respond.apply( request, response );
@@ -24,7 +24,7 @@
 
        function sequenceBodies( status, headers, bodies ) {
                jQuery.each( bodies, function ( i, body ) {
-                       bodies[i] = [ status, headers, body ];
+                       bodies[ i ] = [ status, headers, body ];
                } );
                return sequence( bodies );
        }
                } );
 
                assert.equal( this.server.requests.length, 2, 'Request made' );
-               assert.equal( this.server.requests[0].requestHeaders['X-Foo'], 'Bar', 'Header sent' );
+               assert.equal( this.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
        } );
 
        QUnit.test( 'postWithToken() - badtoken', function ( assert ) {
index 1afbd35..030e703 100644 (file)
@@ -18,7 +18,7 @@
                        return $.Deferred().promise();
                } );
 
-               api.uploadWithIframe( $( '<input>' )[0], { filename: 'Testing API upload.jpg' } );
+               api.uploadWithIframe( $( '<input>' )[ 0 ], { filename: 'Testing API upload.jpg' } );
 
                $iframe = $( 'iframe' );
                $form = $( 'form.mw-api-upload-form' );
index 5965ab7..64a5184 100644 (file)
                } );
 
                api.watch( [ 'Foo' ] ).done( function ( items ) {
-                       assert.equal( items[0].title, 'Foo' );
+                       assert.equal( items[ 0 ].title, 'Foo' );
                } );
 
                api.watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
-                       assert.equal( items[0].title, 'Foo' );
-                       assert.equal( items[1].title, 'Bar' );
+                       assert.equal( items[ 0 ].title, 'Foo' );
+                       assert.equal( items[ 1 ].title, 'Bar' );
                } );
 
                // Requests are POST, match requestBody instead of url
index 284f21a..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: []
                }
        } ) );
        QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
                var i, title;
                for ( i = 0; i < cases.valid.length; i++ ) {
-                       title = new mw.Title( cases.valid[i] );
+                       title = new mw.Title( cases.valid[ i ] );
                }
                for ( i = 0; i < cases.invalid.length; i++ ) {
                        /*jshint loopfunc:true */
-                       title = cases.invalid[i];
+                       title = cases.invalid[ i ];
                        assert.throws( function () {
                                return new mw.Title( title );
-                       }, cases.invalid[i] );
+                       }, cases.invalid[ i ] );
                }
        } );
 
                var i;
                for ( i = 0; i < cases.valid.length; i++ ) {
                        assert.equal(
-                               $.type( mw.Title.newFromText( cases.valid[i] ) ),
+                               $.type( mw.Title.newFromText( cases.valid[ i ] ) ),
                                'object',
-                               cases.valid[i]
+                               cases.valid[ i ]
                        );
                }
                for ( i = 0; i < cases.invalid.length; i++ ) {
                        assert.equal(
-                               $.type( mw.Title.newFromText( cases.invalid[i] ) ),
+                               $.type( mw.Title.newFromText( cases.invalid[ i ] ) ),
                                'null',
-                               cases.invalid[i]
+                               cases.invalid[ i ]
                        );
                }
        } );
                assert.equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
 
                // $wgCapitalLinks = false;
-               mw.config.set( 'wgCaseSensitiveNamespaces', [0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15] );
+               mw.config.set( 'wgCaseSensitiveNamespaces', [ 0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15 ] );
 
                title = new mw.Title( 'article' );
                assert.equal( title.toString(), 'article', '$wgCapitalLinks=false: Article namespace is sensitive, first-letter case stays lowercase' );
                assert.strictEqual( title.exists(), null, 'Return null with empty existance registry' );
 
                // Basic registry, checks default to boolean
-               mw.Title.exist.set( ['Does_exist', 'User_talk:NeilK', 'Wikipedia:Sandbox_rules'], true );
-               mw.Title.exist.set( ['Does_not_exist', 'User:John', 'Foobar'], false );
+               mw.Title.exist.set( [ 'Does_exist', 'User_talk:NeilK', 'Wikipedia:Sandbox_rules' ], true );
+               mw.Title.exist.set( [ 'Does_not_exist', 'User:John', 'Foobar' ], false );
 
                title = new mw.Title( 'Project:Sandbox rules' );
                assert.assertTrue( title.exists(), 'Return true for page titles marked as existing' );
 
                title = new mw.Title( 'Foobar' );
                assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionality, getUrl uses mw.util.getUrl' );
-               assert.equal( title.getUrl({ action: 'edit' }), '/wiki/Foobar?action=edit', 'Basic functionality, \'params\' parameter' );
+               assert.equal( title.getUrl( { action: 'edit' } ), '/wiki/Foobar?action=edit', 'Basic functionality, \'params\' parameter' );
 
                title = new mw.Title( 'John Doe', 3 );
                assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
+                       thisCase = cases[ i ];
                        title = mw.Title.newFromImg( { src: thisCase.url } );
 
                        if ( thisCase.nameText !== undefined ) {
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
+                       thisCase = cases[ i ];
 
                        title = mw.Title.newFromText( thisCase.text );
                        assert.equal( title.getRelativeText( thisCase.relativeTo ), thisCase.expectedResult );
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
+                       thisCase = cases[ i ];
                        title = mw.Title.newFromUserInput( thisCase.title, thisCase.defaultNamespace, thisCase.options );
 
                        if ( thisCase.expected !== undefined ) {
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
+                       thisCase = cases[ i ];
                        title = mw.Title.newFromFileName( thisCase.fileName, thisCase.extensionDesired );
 
                        if ( thisCase.nameText !== undefined ) {
index ba36655..51374bd 100644 (file)
@@ -11,7 +11,7 @@
                }
        } ) );
 
-       $.each( [true, false], function ( i, strictMode ) {
+       $.each( [ true, false ], function ( i, strictMode ) {
                QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', 2, function ( assert ) {
                        var uriString, uri;
                        uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
@@ -76,8 +76,8 @@
                } );
 
                assert.strictEqual( uri.query.n, '1', 'Simple parameter with overrideKeys:false' );
-               assert.strictEqual( uri.query.m[0], 'foo', 'Order of multi-value parameters with overrideKeys:true' );
-               assert.strictEqual( uri.query.m[1], 'bar', 'Order of multi-value parameters with overrideKeys:true' );
+               assert.strictEqual( uri.query.m[ 0 ], 'foo', 'Order of multi-value parameters with overrideKeys:true' );
+               assert.strictEqual( uri.query.m[ 1 ], 'bar', 'Order of multi-value parameters with overrideKeys:true' );
                assert.strictEqual( uri.query.m.length, 2, 'Number of mult-value field is correct' );
 
                uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
 
                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 779a0ed..399db91 100644 (file)
@@ -65,9 +65,9 @@
                QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
                        for ( var i = 0; i < tests.length; i++ ) {
                                assert.equal(
-                                       mw.language.convertPlural( tests[i][0], tests[i][1] ),
-                                       tests[i][2],
-                                       tests[i][3]
+                                       mw.language.convertPlural( tests[ i ][ 0 ], tests[ i ][ 1 ] ),
+                                       tests[ i ][ 2 ],
+                                       tests[ i ][ 3 ]
                                );
                        }
                } );
index f5f199e..7a13f0f 100644 (file)
                } );
 
                call = $.cookie.lastCall.args;
-               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.strictEqual( call[ 0 ], 'myPrefixfoo' );
                assert.deepEqual( call[ 2 ], {
                        expires: expiryDate,
                        domain: 'myDomain',
                } );
 
                call = $.cookie.lastCall.args;
-               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.strictEqual( call[ 0 ], 'myPrefixfoo' );
                assert.deepEqual( call[ 2 ], {
                        expires: date,
                        domain: 'myDomain',
index 7c3f1ec..587c893 100644 (file)
@@ -7,7 +7,7 @@
                        errorUrl = 'http://example.com',
                        errorLine = '123',
                        errorColumn = '45',
-                       errorObject = new Error( 'Foo'),
+                       errorObject = new Error( 'Foo' ),
                        oldHandler = this.sandbox.stub();
 
                this.sandbox.stub( mw, 'track' );
index 7788360..862bb5e 100644 (file)
@@ -70,7 +70,7 @@
         */
        function getMwLanguage( langCode ) {
                if ( !hasOwn.call( mwLanguageCache, langCode ) ) {
-                       mwLanguageCache[langCode] = $.ajax( {
+                       mwLanguageCache[ langCode ] = $.ajax( {
                                url: mw.util.wikiScript( 'load' ),
                                data: {
                                        skin: mw.config.get( 'skin' ),
                                return mw.language;
                        } );
                }
-               return mwLanguageCache[langCode];
+               return mwLanguageCache[ langCode ];
        }
 
        /**
         * @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 */
                        'Bar in anchor'
                );
 
-               expectedSpecialCharacters = '<a title="&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?" href="/wiki/%22Who%22_wants_to_be_a_millionaire_%26_live_on_%27Exotic_Island%27%3F">&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?</a>';
+               expectedSpecialCharacters = '<a title="&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?" href="/wiki/%22Who%22_wants_to_be_a_millionaire_%26_live_on_&#039;Exotic_Island&#039;%3F">&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?</a>';
 
                mw.messages.set( 'special-characters', '[[' + specialCharactersPageName + ']]' );
                assert.htmlEqual(
        QUnit.test( 'Curly brace transformation', 16, function ( assert ) {
                var oldUserLang = mw.config.get( 'wgUserLanguage' );
 
-               assertBothModes( assert, ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
+               assertBothModes( assert, [ 'gender-msg', 'Bob', 'male' ], 'Bob: blue', 'gender is resolved' );
 
-               assertBothModes( assert, ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
+               assertBothModes( assert, [ 'plural-msg', 5 ], 'Found 5 items', 'plural is resolved' );
 
-               assertBothModes( assert, ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
+               assertBothModes( assert, [ 'grammar-msg' ], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
 
                mw.config.set( 'wgUserLanguage', 'en' );
-               assertBothModes( assert, ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
+               assertBothModes( assert, [ 'formatnum-msg', '987654321.654321' ], '987,654,321.654', 'formatnum is resolved' );
 
                // Test non-{{ wikitext, where behavior differs
 
                        '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;
                        outerCalled = false;
                        innerCalled = false;
                        message = mw.message( key );
-                       message[format]();
+                       message[ format ]();
                        assert.strictEqual( outerCalled, shouldCall, 'Outer function called for ' + key );
                        assert.strictEqual( innerCalled, shouldCall, 'Inner function called for ' + key );
                }
        QUnit.test( 'HTML', 26, function ( assert ) {
                mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
 
-               assertBothModes( assert, ['jquerymsg-italics-msg'], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
+               assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
 
                mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
-               assertBothModes( assert, ['jquerymsg-bold-msg'], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
+               assertBothModes( assert, [ 'jquerymsg-bold-msg' ], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
 
                mw.messages.set( 'jquerymsg-bold-italics-msg', 'It is <b><i>key</i></b>' );
-               assertBothModes( assert, ['jquerymsg-bold-italics-msg'], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
+               assertBothModes( assert, [ 'jquerymsg-bold-italics-msg' ], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
 
                mw.messages.set( 'jquerymsg-italics-bold-msg', 'It is <i><b>vital</b></i>' );
-               assertBothModes( assert, ['jquerymsg-italics-bold-msg'], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
+               assertBothModes( assert, [ 'jquerymsg-italics-bold-msg' ], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
 
                mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
 
index 3328ce3..3b5915a 100644 (file)
@@ -61,7 +61,7 @@
                        expected = repeat( '\n', n ) + 'some text';
 
                        $textarea = $( '<textarea>\n' + expected + '</textarea>' );
-                       assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')' );
+                       assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + ( n + 1 ) + ')' );
 
                        $textarea = $( '<textarea>' ).val( expected );
                        assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
index 670914e..399290c 100644 (file)
@@ -11,7 +11,7 @@
                },
                messages: {
                        // mw.language.listToText test
-                       'and': ' and',
+                       and: ' and',
                        'comma-separator': ', ',
                        'word-separator': ' '
                }
@@ -51,9 +51,9 @@
 
                        for ( var i = 0; i < test.length; i++ ) {
                                assert.equal(
-                                       mw.language.convertGrammar( test[i].word, test[i].grammarForm ),
-                                       test[i].expected,
-                                       test[i].description
+                                       mw.language.convertGrammar( test[ i ].word, test[ i ].grammarForm ),
+                                       test[ i ].expected,
+                                       test[ i ].description
                                );
                        }
                } );
 
        QUnit.test( 'List to text test', 4, function ( assert ) {
                assert.equal( mw.language.listToText( [] ), '', 'Blank list' );
-               assert.equal( mw.language.listToText( ['a'] ), 'a', 'Single item' );
-               assert.equal( mw.language.listToText( ['a', 'b'] ), 'a and b', 'Two items' );
-               assert.equal( mw.language.listToText( ['a', 'b', 'c'] ), 'a, b and c', 'More than two items' );
+               assert.equal( mw.language.listToText( [ 'a' ] ), 'a', 'Single item' );
+               assert.equal( mw.language.listToText( [ 'a', 'b' ] ), 'a and b', 'Two items' );
+               assert.equal( mw.language.listToText( [ 'a', 'b', 'c' ] ), 'a, b and c', 'More than two items' );
        } );
 }( mediaWiki, jQuery ) );
index 61bab03..288b527 100644 (file)
@@ -12,7 +12,7 @@
 
                mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
                assert.strictEqual(
-                       mw.messagePoster.factory.contentModelToClass[TEST_MODEL],
+                       mw.messagePoster.factory.contentModelToClass[ TEST_MODEL ],
                        testMessagePosterConstructor,
                        'Constructor is registered'
                );
index fcf6dda..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'
+               assert.deepEqual( conf.get( [ 'foo', 'lorem' ] ), {
+                       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
+               assert.deepEqual( conf.get( [ 'foo', 'notExist' ] ), {
+                       foo: 'bar',
+                       notExist: null
                }, 'Map.get return includes keys that were not found as null values' );
 
                // Interacting with globals and accessing the values object
                this.restoreWarnings();
 
                // Change value via global Map
-               globalConf.set('anotherGlobalMapChecker', 'Again');
+               globalConf.set( 'anotherGlobalMapChecker', 'Again' );
                assert.equal( globalConf.get( 'anotherGlobalMapChecker' ), 'Again', 'Change in global Map reflected via get()' );
                this.suppressWarnings();
                assert.equal( window.anotherGlobalMapChecker, 'Again', 'Change in global Map reflected window object' );
                                len = formats.length;
 
                        for ( i = 0; i < len; i++ ) {
-                               format = formats[i];
-                               assert.equal( mw.message.apply( null, messageArguments )[format](), expectedResult, assertMessage + ' when format is ' + format );
+                               format = formats[ i ];
+                               assert.equal( mw.message.apply( null, messageArguments )[ format ](), expectedResult, assertMessage + ' when format is ' + format );
                        }
                }
 
                assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
 
                assert.ok( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['multiple-curly-brace'], ['text', 'parse'], '"' + siteName + '" is the home of Other Message', 'Curly brace format works correctly' );
+               assertMultipleFormats( [ 'multiple-curly-brace' ], [ 'text', 'parse' ], '"' + siteName + '" is the home of Other Message', 'Curly brace format works correctly' );
                assert.equal( mw.message( 'multiple-curly-brace' ).plain(), mw.messages.get( 'multiple-curly-brace' ), 'Plain format works correctly for curly brace message' );
                assert.equal( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + siteName + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
 
                assert.ok( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['multiple-square-brackets-and-ampersand'], ['plain', 'text'], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
+               assertMultipleFormats( [ 'multiple-square-brackets-and-ampersand' ], [ 'plain', 'text' ], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
                assert.equal( mw.message( 'multiple-square-brackets-and-ampersand' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
                assert.htmlEqual( mw.message( 'multiple-square-brackets-and-ampersand' ).parse(), 'Visit the ' +
                        '<a title="Project:Community portal" href="/wiki/Project:Community_portal">community portal</a>' +
                        ' &amp; <a title="Project:Help desk" href="/wiki/Project:Help_desk">help desk</a>', 'Internal links work with parse' );
 
-               assertMultipleFormats( ['mediawiki-test-version-entrypoints-index-php'], ['plain', 'text', 'escaped'], mw.messages.get( 'mediawiki-test-version-entrypoints-index-php' ), 'External link markup is unprocessed' );
+               assertMultipleFormats( [ 'mediawiki-test-version-entrypoints-index-php' ], [ 'plain', 'text', 'escaped' ], mw.messages.get( 'mediawiki-test-version-entrypoints-index-php' ), 'External link markup is unprocessed' );
                assert.htmlEqual( mw.message( 'mediawiki-test-version-entrypoints-index-php' ).parse(), '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>', 'External link works correctly in parse mode' );
 
-               assertMultipleFormats( ['external-link-replace', 'http://example.org/?x=y&z'], ['plain', 'text'], 'Foo [http://example.org/?x=y&z bar]', 'Parameters are substituted but external link is not processed' );
+               assertMultipleFormats( [ 'external-link-replace', 'http://example.org/?x=y&z' ], [ 'plain', 'text' ], 'Foo [http://example.org/?x=y&z bar]', 'Parameters are substituted but external link is not processed' );
                assert.equal( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).escaped(), 'Foo [http://example.org/?x=y&amp;z bar]', 'In escaped mode, parameters are substituted and ampersand is escaped, but external link is not processed' );
                assert.htmlEqual( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).parse(), 'Foo <a href="http://example.org/?x=y&amp;z">bar</a>', 'External link with replacement works in parse mode without double-escaping' );
 
                goodbye = mw.message( 'goodbye' );
                assert.strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
 
-               assertMultipleFormats( ['goodbye'], ['plain', 'text'], '<goodbye>', 'Message.toString returns <key> if key does not exist' );
+               assertMultipleFormats( [ 'goodbye' ], [ 'plain', 'text' ], '<goodbye>', 'Message.toString returns <key> if key does not exist' );
                // bug 30684
-               assertMultipleFormats( ['goodbye'], ['parse', 'escaped'], '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if key does not exist' );
+               assertMultipleFormats( [ 'goodbye' ], [ 'parse', 'escaped' ], '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if key does not exist' );
 
                assert.ok( mw.messages.set( 'plural-test-msg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['plural-test-msg', 6], ['text', 'parse', 'escaped'], 'There are 6 results', 'plural get resolved' );
+               assertMultipleFormats( [ 'plural-test-msg', 6 ], [ 'text', 'parse', 'escaped' ], 'There are 6 results', 'plural get resolved' );
                assert.equal( mw.message( 'plural-test-msg', 6 ).plain(), 'There {{PLURAL:6|is|are}} 6 {{PLURAL:6|result|results}}', 'Parameter is substituted but plural is not resolved in plain' );
 
                assert.ok( mw.messages.set( 'plural-test-msg-explicit', 'There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}}' ), 'mw.messages.set: Register message with explicit plural forms' );
-               assertMultipleFormats( ['plural-test-msg-explicit', 12], ['text', 'parse', 'escaped'], 'There are a dozen cars', 'explicit plural get resolved' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit', 12 ], [ 'text', 'parse', 'escaped' ], 'There are a dozen cars', 'explicit plural get resolved' );
 
                assert.ok( mw.messages.set( 'plural-test-msg-explicit-beginning', 'Basket has {{plural:$1|0=no eggs|12=a dozen eggs|6=half a dozen eggs|one egg|$1 eggs}}' ), 'mw.messages.set: Register message with explicit plural forms' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 1], ['text', 'parse', 'escaped'], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 4], ['text', 'parse', 'escaped'], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 6], ['text', 'parse', 'escaped'], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 0], ['text', 'parse', 'escaped'], 'Basket has no eggs', 'explicit plural given at beginning get resolved for 0' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 1 ], [ 'text', 'parse', 'escaped' ], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 4 ], [ 'text', 'parse', 'escaped' ], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 6 ], [ 'text', 'parse', 'escaped' ], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 0 ], [ 'text', 'parse', 'escaped' ], 'Basket has no eggs', 'explicit plural given at beginning get resolved for 0' );
 
-               assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary'], ['plain', 'text'], mw.messages.get( 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ), 'Double square brackets with no parameters unchanged' );
+               assertMultipleFormats( [ 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ), 'Double square brackets with no parameters unchanged' );
 
-               assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName], ['plain', 'text'], 'Notifying author of deletion nomination for [[' + specialCharactersPageName + ']]', 'Double square brackets with one parameter' );
+               assertMultipleFormats( [ 'mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName ], [ 'plain', 'text' ], 'Notifying author of deletion nomination for [[' + specialCharactersPageName + ']]', 'Double square brackets with one parameter' );
 
                assert.equal( mw.message( 'mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName ).escaped(), 'Notifying author of deletion nomination for [[' + mw.html.escape( specialCharactersPageName ) + ']]', 'Double square brackets with one parameter, when escaped' );
 
                assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ), 'mw.messages.set: Register' );
                assert.equal( mw.message( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ).plain(), mw.messages.get( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ), 'HTML message with curly braces is not changed in plain mode' );
 
-               assertMultipleFormats( ['gender-plural-msg', 'male', 1], ['text', 'parse', 'escaped'], 'he is awesome', 'Gender and plural are resolved' );
+               assertMultipleFormats( [ 'gender-plural-msg', 'male', 1 ], [ 'text', 'parse', 'escaped' ], 'he is awesome', 'Gender and plural are resolved' );
                assert.equal( mw.message( 'gender-plural-msg', 'male', 1 ).plain(), '{{GENDER:male|he|she|they}} {{PLURAL:1|is|are}} awesome', 'Parameters are substituted, but gender and plural are not resolved in plain mode' );
 
                assert.equal( mw.message( 'grammar-msg' ).plain(), mw.messages.get( 'grammar-msg' ), 'Grammar is not resolved in plain mode' );
-               assertMultipleFormats( ['grammar-msg'], ['text', 'parse'], 'Przeszukaj ' + siteName, 'Grammar is resolved' );
+               assertMultipleFormats( [ 'grammar-msg' ], [ 'text', 'parse' ], 'Przeszukaj ' + siteName, 'Grammar is resolved' );
                assert.equal( mw.message( 'grammar-msg' ).escaped(), 'Przeszukaj ' + siteName, 'Grammar is resolved in escaped mode' );
 
-               assertMultipleFormats( ['formatnum-msg', '987654321.654321'], ['text', 'parse', 'escaped'], '987,654,321.654', 'formatnum is resolved' );
+               assertMultipleFormats( [ 'formatnum-msg', '987654321.654321' ], [ 'text', 'parse', 'escaped' ], '987,654,321.654', 'formatnum is resolved' );
                assert.equal( mw.message( 'formatnum-msg' ).plain(), mw.messages.get( 'formatnum-msg' ), 'formatnum is not resolved in plain mode' );
 
-               assertMultipleFormats( ['int-msg'], ['text', 'parse', 'escaped'], 'Some Other Message', 'int is resolved' );
+               assertMultipleFormats( [ 'int-msg' ], [ 'text', 'parse', 'escaped' ], 'Some Other Message', 'int is resolved' );
                assert.equal( mw.message( 'int-msg' ).plain(), mw.messages.get( 'int-msg' ), 'int is not resolved in plain mode' );
 
                assert.ok( mw.messages.set( 'mediawiki-italics-msg', '<i>Very</i> important' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['mediawiki-italics-msg'], ['plain', 'text', 'parse'], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
+               assertMultipleFormats( [ 'mediawiki-italics-msg' ], [ 'plain', 'text', 'parse' ], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
                assert.htmlEqual(
                        mw.message( 'mediawiki-italics-msg' ).escaped(),
                        '&lt;i&gt;Very&lt;/i&gt; important',
                );
 
                assert.ok( mw.messages.set( 'mediawiki-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['mediawiki-italics-with-link'], ['plain', 'text'], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
+               assertMultipleFormats( [ 'mediawiki-italics-with-link' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
                assert.htmlEqual(
                        mw.message( 'mediawiki-italics-with-link' ).escaped(),
                        'An &lt;i&gt;italicized [[link|wiki-link]]&lt;/i&gt;',
                );
 
                assert.ok( mw.messages.set( 'mediawiki-script-msg', '<script  >alert( "Who put this script here?" );</script>' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['mediawiki-script-msg'], ['plain', 'text'], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
+               assertMultipleFormats( [ 'mediawiki-script-msg' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
                assert.htmlEqual(
                        mw.message( 'mediawiki-script-msg' ).escaped(),
                        '&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
         * 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
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'test.callback', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )] );
+               mw.loader.implement( 'test.callback', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ] );
 
                mw.loader.using( 'test.callback', function () {
 
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'hasOwnProperty', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )], {}, {} );
+               mw.loader.implement( 'hasOwnProperty', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ], {}, {} );
 
                mw.loader.using( 'hasOwnProperty', function () {
 
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'test.promise', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )] );
+               mw.loader.implement( 'test.promise', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ] );
 
                mw.loader.using( 'test.promise' )
                .done( function () {
                                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'
                );
 
                mw.loader.register( [
-                       [ 'test.implement.e', '0', ['test.implement.e2']],
+                       [ 'test.implement.e', '0', [ 'test.implement.e2' ] ],
                        [ 'test.implement.e2', '0' ]
                ] );
 
                                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' );
                this.sandbox.stub( mw, 'track' );
 
                mw.loader.register( [
-                       ['test.module1', '0'],
-                       ['test.module2', '0', ['test.module1']],
-                       ['test.module3', '0', ['test.module2']]
+                       [ 'test.module1', '0' ],
+                       [ 'test.module2', '0', [ 'test.module1' ] ],
+                       [ 'test.module3', '0', [ 'test.module2' ] ]
                ] );
                mw.loader.implement( 'test.module1', function () {
                        throw new Error( 'expected' );
 
        QUnit.test( 'mw.loader out-of-order implementation', 9, function ( assert ) {
                mw.loader.register( [
-                       ['test.module4', '0'],
-                       ['test.module5', '0', ['test.module4']],
-                       ['test.module6', '0', ['test.module5']]
+                       [ 'test.module4', '0' ],
+                       [ 'test.module5', '0', [ 'test.module4' ] ],
+                       [ 'test.module6', '0', [ 'test.module5' ] ]
                ] );
                mw.loader.implement( 'test.module4', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
 
        QUnit.test( 'mw.loader missing dependency', 13, function ( assert ) {
                mw.loader.register( [
-                       ['test.module7', '0'],
-                       ['test.module8', '0', ['test.module7']],
-                       ['test.module9', '0', ['test.module8']]
+                       [ 'test.module7', '0' ],
+                       [ 'test.module8', '0', [ 'test.module7' ] ],
+                       [ 'test.module9', '0', [ 'test.module8' ] ]
                ] );
                mw.loader.implement( 'test.module8', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' );
                assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
                assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
                mw.loader.using(
-                       ['test.module7'],
+                       [ 'test.module7' ],
                        function () {
                                assert.ok( false, 'Success fired despite missing dependency' );
                                assert.ok( true, 'QUnit expected() count dummy' );
                        },
                        function ( e, dependencies ) {
                                assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
-                               assert.deepEqual( dependencies, ['test.module7'], 'Error callback called with module test.module7' );
+                               assert.deepEqual( dependencies, [ 'test.module7' ], 'Error callback called with module test.module7' );
                        }
                );
                mw.loader.using(
-                       ['test.module9'],
+                       [ 'test.module9' ],
                        function () {
                                assert.ok( false, 'Success fired despite missing dependency' );
                                assert.ok( true, 'QUnit expected() count dummy' );
                                dependencies.sort();
                                assert.deepEqual(
                                        dependencies,
-                                       ['test.module7', 'test.module8', 'test.module9'],
+                                       [ 'test.module7', 'test.module8', 'test.module9' ],
                                        'Error callback called with all three modules as dependencies'
                                );
                        }
        QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
                mw.loader.register( [
                        // [module, version, dependencies, group, source]
-                       ['testMissing', '1', [], null, 'testloader'],
-                       ['testUsesMissing', '1', ['testMissing'], null, 'testloader'],
-                       ['testUsesNestedMissing', '1', ['testUsesMissing'], null, 'testloader']
+                       [ 'testMissing', '1', [], null, 'testloader' ],
+                       [ 'testUsesMissing', '1', [ 'testMissing' ], null, 'testloader' ],
+                       [ 'testUsesNestedMissing', '1', [ 'testUsesMissing' ], null, 'testloader' ]
                ] );
 
                function verifyModuleStates() {
                        assert.equal( mw.loader.getState( 'testUsesNestedMissing' ), 'error', 'Module with indirect missing dependency must have state "error"' );
                }
 
-               mw.loader.using( ['testUsesNestedMissing'],
+               mw.loader.using( [ 'testUsesNestedMissing' ],
                        function () {
                                assert.ok( false, 'Error handler should be invoked.' );
                                assert.ok( true ); // Dummy to reach QUnit expect()
                                // As soon as server spits out state('testMissing', 'missing');
                                // it will bubble up and trigger the error callback.
                                // Therefor the badmodules array is not testUsesMissing or testUsesNestedMissing.
-                               assert.deepEqual( badmodules, ['testMissing'], 'Bad modules as expected.' );
+                               assert.deepEqual( badmodules, [ 'testMissing' ], 'Bad modules as expected.' );
 
                                verifyModuleStates();
 
        QUnit.asyncTest( 'mw.loader skin-function handling', 5, function ( assert ) {
                mw.loader.register( [
                        // [module, version, dependencies, group, source, skip]
-                       ['testSkipped', '1', [], null, 'testloader', 'return true;'],
-                       ['testNotSkipped', '1', [], null, 'testloader', 'return false;'],
-                       ['testUsesSkippable', '1', ['testSkipped', 'testNotSkipped'], null, 'testloader']
+                       [ 'testSkipped', '1', [], null, 'testloader', 'return true;' ],
+                       [ 'testNotSkipped', '1', [], null, 'testloader', 'return false;' ],
+                       [ 'testUsesSkippable', '1', [ 'testSkipped', 'testNotSkipped' ], null, 'testloader' ]
                ] );
 
                function verifyModuleStates() {
                        assert.equal( mw.loader.getState( 'testUsesSkippable' ), 'ready', 'Module is ready when skippable dependencies are ready' );
                }
 
-               mw.loader.using( ['testUsesSkippable'],
+               mw.loader.using( [ 'testUsesSkippable' ],
                        function () {
                                assert.ok( true, 'Success handler should be invoked.' );
                                assert.ok( true ); // Dummy to match error handler and reach QUnit expect()
 
                mw.hook( 'test.hook.data' ).add( function ( data1, data2 ) {
                        assert.equal( data1, 'example', 'Fire with data (string param)' );
-                       assert.deepEqual( data2, ['two'], 'Fire with data (array param)' );
+                       assert.deepEqual( data2, [ 'two' ], 'Fire with data (array param)' );
                } );
-               mw.hook( 'test.hook.data' ).fire( 'example', ['two'] );
+               mw.hook( 'test.hook.data' ).fire( 'example', [ 'two' ] );
 
                hook = mw.hook( 'test.hook.chainable' );
                assert.strictEqual( hook.add(), hook, 'hook.add is chainable' );
                add = hook.add;
                fire = hook.fire;
                add( function ( x, y ) {
-                       assert.deepEqual( [x, y], ['x', 'y'], 'Detached (contextless) with data' );
+                       assert.deepEqual( [ x, y ], [ 'x', 'y' ], 'Detached (contextless) with data' );
                } );
                fire( 'x', 'y' );
 
                                assert.equal( chr, 'z', 'Adding callback later invokes right away with last data' );
                        } );
 
-               assert.deepEqual( chars, ['x', 'y', 'z'], 'Multiple callbacks with multiple fires' );
+               assert.deepEqual( chars, [ 'x', 'y', 'z' ], 'Multiple callbacks with multiple fires' );
 
                chars = [];
                callback = function ( chr ) {
 
                assert.deepEqual(
                        chars,
-                       ['x', 'x', 'x', 'x', 'y', 'z'],
+                       [ 'x', 'x', 'x', 'x', 'y', 'z' ],
                        '"add" and "remove" support variadic arguments. ' +
                                '"add" does not filter unique. ' +
                                '"remove" removes all equal by reference. ' +
index b73d2e3..01fa212 100644 (file)
@@ -2,54 +2,54 @@
        var
                // Based on IPTest.php > testisIPv4
                IPV4_CASES = [
-                       [false, false, 'Boolean false is not an IP'],
-                       [false, true, 'Boolean true is not an IP'],
-                       [false, '', 'Empty string is not an IP'],
-                       [false, 'abc', '"abc" is not an IP'],
-                       [false, ':', 'Colon is not an IP'],
-                       [false, '124.24.52', 'IPv4 not enough quads'],
-                       [false, '24.324.52.13', 'IPv4 out of range'],
-                       [false, '.24.52.13', 'IPv4 starts with period'],
-
-                       [true, '124.24.52.13', '124.24.52.134 is a valid IP'],
-                       [true, '1.24.52.13', '1.24.52.13 is a valid IP'],
-                       [false, '74.24.52.13/20', 'IPv4 ranges are not recognized as valid IPs']
+                       [ false, false, 'Boolean false is not an IP' ],
+                       [ false, true, 'Boolean true is not an IP' ],
+                       [ false, '', 'Empty string is not an IP' ],
+                       [ false, 'abc', '"abc" is not an IP' ],
+                       [ false, ':', 'Colon is not an IP' ],
+                       [ false, '124.24.52', 'IPv4 not enough quads' ],
+                       [ false, '24.324.52.13', 'IPv4 out of range' ],
+                       [ false, '.24.52.13', 'IPv4 starts with period' ],
+
+                       [ true, '124.24.52.13', '124.24.52.134 is a valid IP' ],
+                       [ true, '1.24.52.13', '1.24.52.13 is a valid IP' ],
+                       [ false, '74.24.52.13/20', 'IPv4 ranges are not recognized as valid IPs' ]
                ],
 
                // Based on IPTest.php > testisIPv6
                IPV6_CASES = [
-                       [false, ':fc:100::', 'IPv6 starting with lone ":"'],
-                       [false, 'fc:100:::', 'IPv6 ending with a ":::"'],
-                       [false, 'fc:300', 'IPv6 with only 2 words'],
-                       [false, 'fc:100:300', 'IPv6 with only 3 words'],
-
-                       [false, 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"'],
-                       [false, 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"'],
-
-                       [false, ':::'],
-                       [false, '::0:', 'IPv6 ending in a lone ":"'],
-
-                       [true,  '::', 'IPv6 zero address'],
-
-                       [false, '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words'],
-                       [false, '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words'],
-
-                       [false, ':fc::100', 'IPv6 starting with lone ":"'],
-                       [false, 'fc::100:', 'IPv6 ending with lone ":"'],
-                       [false, 'fc:::100', 'IPv6 with ":::" in the middle'],
-
-                       [true,  'fc::100', 'IPv6 with "::" and 2 words'],
-                       [true,  'fc::100:a', 'IPv6 with "::" and 3 words'],
-                       [true,  'fc::100:a:d', 'IPv6 with "::" and 4 words'],
-                       [true,  'fc::100:a:d:1', 'IPv6 with "::" and 5 words'],
-                       [true,  'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words'],
-                       [true,  'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words'],
-                       [true,  '2001::df', 'IPv6 with "::" and 2 words'],
-                       [true,  '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words'],
-                       [true,  '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words'],
-
-                       [false, 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words'],
-                       [false, 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words']
+                       [ false, ':fc:100::', 'IPv6 starting with lone ":"' ],
+                       [ false, 'fc:100:::', 'IPv6 ending with a ":::"' ],
+                       [ false, 'fc:300', 'IPv6 with only 2 words' ],
+                       [ false, 'fc:100:300', 'IPv6 with only 3 words' ],
+
+                       [ false, 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"' ],
+                       [ false, 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"' ],
+
+                       [ false, ':::' ],
+                       [ false, '::0:', 'IPv6 ending in a lone ":"' ],
+
+                       [ true,  '::', 'IPv6 zero address' ],
+
+                       [ false, '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' ],
+                       [ false, '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' ],
+
+                       [ false, ':fc::100', 'IPv6 starting with lone ":"' ],
+                       [ false, 'fc::100:', 'IPv6 ending with lone ":"' ],
+                       [ false, 'fc:::100', 'IPv6 with ":::" in the middle' ],
+
+                       [ true,  'fc::100', 'IPv6 with "::" and 2 words' ],
+                       [ true,  'fc::100:a', 'IPv6 with "::" and 3 words' ],
+                       [ true,  'fc::100:a:d', 'IPv6 with "::" and 4 words' ],
+                       [ true,  'fc::100:a:d:1', 'IPv6 with "::" and 5 words' ],
+                       [ true,  'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' ],
+                       [ true,  'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' ],
+                       [ true,  '2001::df', 'IPv6 with "::" and 2 words' ],
+                       [ true,  '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' ],
+                       [ true,  '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' ],
+
+                       [ false, 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' ],
+                       [ false, 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' ]
                ];
 
        Array.prototype.push.apply( IPV6_CASES,
@@ -70,7 +70,7 @@
                        '::fc:100:a:d:1:e:ac',
                        'fc:100:a:d:1:e:ac:0'
                ], function ( el ) {
-                       return [[ true, el, el + ' is a valid IP' ]];
+                       return [ [ true, el, el + ' is a valid IP' ] ];
                } )
        );
 
@@ -83,7 +83,7 @@
                },
                messages: {
                        // Used by accessKeyLabel in test for addPortletLink
-                       'brackets': '[$1]',
+                       brackets: '[$1]',
                        'word-separator': ' '
                }
        } ) );
@@ -92,7 +92,7 @@
                assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
        } );
 
-       QUnit.test( 'wikiUrlencode', 11, function ( assert ) {
+       QUnit.test( 'wikiUrlencode', 10, function ( assert ) {
                assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
                // See also wfUrlencodeTest.php#provideURLS
                $.each( {
                        '&': '%26',
                        '=': '%3D',
                        ':': ':',
-                       ';@$-_.!*': ';@$-_.!*',
+                       ';@$-_.!*\'': ';@$-_.!*\'',
                        '/': '/',
                        '~': '~',
                        '[]': '%5B%5D',
-                       '<>': '%3C%3E',
-                       '\'': '%27'
+                       '<>': '%3C%3E'
                }, function ( input, output ) {
                        assert.equal( mw.util.wikiUrlencode( input ), output );
                } );
 
        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)' );
        } );
 
                );
 
                assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
-               assert.strictEqual( $tbMW.next()[0], tbRL, 'Link is in the correct position (nextnode as Node object)' );
+               assert.strictEqual( $tbMW.next()[ 0 ], tbRL, 'Link is in the correct position (nextnode as Node object)' );
 
                cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
                tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
 
-               assert.strictEqual( $( tbRLDM ).next()[0], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
+               assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
 
                caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
 
                assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
 
                addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
-               assert.strictEqual( $( addedAfter ).next()[0], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
+               assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
 
                // test case - nonexistent id as next node
                tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
 
-               assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[0], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
+               assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
 
                // test case - empty jquery object as next node
                tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
 
-               assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[0], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
+               assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
        } );
 
        QUnit.test( 'validateEmail', 6, function ( assert ) {
 
        QUnit.test( 'isIPv6Address', 40, function ( assert ) {
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPv4Address', 11, function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPAddress', 51, function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
 
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 }( mediaWiki, jQuery ) );