Merge "Revert "New Hook rc/watchlist hook ChangesListBegin""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 26 Mar 2014 14:36:29 +0000 (14:36 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 26 Mar 2014 14:36:29 +0000 (14:36 +0000)
131 files changed:
.jscsrc [new file with mode: 0644]
.jshintignore
.jshintrc
RELEASE-NOTES-1.23
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Skin.php
includes/WebResponse.php
includes/Wiki.php
includes/WikiPage.php
includes/objectcache/BagOStuff.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllmessages.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMostrevisions.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialMyRedirectPages.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialPermanentLink.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialResetTokens.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUncategorizedimages.php
includes/specials/SpecialUncategorizedpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnusedimages.php
includes/specials/SpecialUnusedtemplates.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedcategories.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWantedtemplates.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/SpecialWithoutinterwiki.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBr.php
languages/messages/MessagesCs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesHak.php
languages/messages/MessagesHe.php
languages/messages/MessagesJa.php
languages/messages/MessagesQqq.php
languages/messages/MessagesSa.php
languages/messages/MessagesSco.php
languages/messages/MessagesSv.php
languages/messages/MessagesTl.php
languages/messages/MessagesTt_cyrl.php
resources/jquery/jquery.autoEllipsis.js
resources/jquery/jquery.byteLimit.js
resources/jquery/jquery.colorUtil.js
resources/jquery/jquery.highlightText.js
resources/jquery/jquery.localize.js
resources/jquery/jquery.placeholder.js
resources/jquery/jquery.qunit.completenessTest.js
resources/jquery/jquery.suggestions.js
resources/jquery/jquery.tablesorter.js
resources/jquery/jquery.textSelection.js
resources/mediawiki.action/mediawiki.action.edit.editWarning.js
resources/mediawiki.action/mediawiki.action.edit.js
resources/mediawiki.action/mediawiki.action.history.js
resources/mediawiki.action/mediawiki.action.view.metadata.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.language/languages/fi.js
resources/mediawiki.language/languages/hy.js
resources/mediawiki.language/languages/la.js
resources/mediawiki.language/languages/os.js
resources/mediawiki.language/languages/uk.js
resources/mediawiki.language/mediawiki.language.js
resources/mediawiki.page/mediawiki.page.gallery.js
resources/mediawiki.page/mediawiki.page.image.pagination.js
resources/mediawiki.special/mediawiki.special.block.js
resources/mediawiki.special/mediawiki.special.javaScriptTest.js
resources/mediawiki.special/mediawiki.special.preferences.js
resources/mediawiki.special/mediawiki.special.upload.js
resources/mediawiki/mediawiki.Title.js
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.feedback.js
resources/mediawiki/mediawiki.jqueryMsg.js
skins/common/IEFixes.js
skins/common/ajax.js
skins/common/commonContent.css
skins/common/config.js
skins/common/upload.js
skins/common/wikibits.js
skins/monobook/main.css
skins/vector/vector.js
tests/frontend/Gruntfile.js [new file with mode: 0644]
tests/frontend/package.json [new file with mode: 0644]
tests/parser/parserTests.txt
tests/phpunit/includes/media/DjVuTest.php
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/mediawiki.jqueryMsg.data.js
tests/qunit/suites/resources/jquery/jquery.color.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.placeholder.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/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js

diff --git a/.jscsrc b/.jscsrc
new file mode 100644 (file)
index 0000000..b5481ea
--- /dev/null
+++ b/.jscsrc
@@ -0,0 +1,30 @@
+{
+       "requireCurlyBraces": ["if", "else", "for", "while", "do"],
+       "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "function"],
+       "requireParenthesesAroundIIFE": true,
+       "requireSpacesInFunctionExpression": {
+               "beforeOpeningCurlyBrace": true
+       },
+       "requireMultipleVarDecl": true,
+       "disallowEmptyBlocks": true,
+       "requireSpacesInsideObjectBrackets": "all",
+       "disallowSpaceAfterObjectKeys": true,
+       "requireCommaBeforeLineBreak": true,
+       "disallowLeftStickedOperators": ["?", ">", ">=", "<", "<="],
+       "disallowRightStickedOperators": ["?", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
+       "requireRightStickedOperators": ["!"],
+       "requireLeftStickedOperators": [","],
+       "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~"],
+       "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+       "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+       "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+       "disallowKeywords": [ "with" ],
+       "disallowMultipleLineBreaks": true,
+       "validateLineBreaks": "LF",
+       "validateQuoteMarks": "'",
+       "disallowMixedSpacesAndTabs": "smart",
+       "disallowTrailingWhitespace": true,
+       "requireLineFeedAtFileEnd": true,
+       "requireCapitalizedConstructors": true,
+       "requireDotNotation": true
+}
index a44a4d4..627f7ab 100644 (file)
@@ -1,14 +1,14 @@
 # Generated documentation
-docs/html/
-docs/js/
-resources/mediawiki.ui/docs
+docs/html/**
+docs/js/**
+resources/mediawiki.ui/docs/**
 
 # kss template for mediawiki ui documentation
-resources/styleguide-template
+resources/styleguide-template/**
 
 # third-party libs
-extensions/
-node_modules/
+extensions/**
+node_modules/**
 resources/jquery/jquery.appear.js
 resources/jquery/jquery.async.js
 resources/jquery/jquery.ba-throttle-debounce.js
@@ -26,14 +26,15 @@ resources/jquery/jquery.qunit.js
 resources/jquery/jquery.validate.js
 resources/jquery/jquery.xmldom.js
 resources/jquery.chosen/chosen.jquery.js
-resources/jquery.effects/
-resources/jquery.tipsy/
-resources/jquery.ui/
-resources/mediawiki.libs/
-resources/oojs/
-resources/oojs-ui/
-resources/sinonjs/
-resources/moment/
+resources/jquery.effects/**
+resources/jquery.tipsy/**
+resources/jquery.ui/**
+resources/mediawiki.libs/**
+resources/moment/**
+resources/oojs-ui/**
+resources/oojs/**
+resources/sinonjs/**
+tests/frontend/node_modules/**
 
 # github.com/jshint/jshint/issues/729
 tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
index c4e265a..9d6c4d2 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -2,24 +2,20 @@
        /* Common */
 
        // Enforcing
-       "camelcase": true,
-       "curly": true,
        "eqeqeq": true,
-       "immed": true,
        "latedef": true,
-       "newcap": true,
        "noarg": true,
-       "noempty": true,
        "nonew": true,
-       "quotmark": "single",
-       "trailing": true,
        "undef": true,
        "unused": true,
-       // Legacy
-       "onevar": true,
 
        /* Local */
 
+       // FIXME: Deprecated, handle these with node-jscs instead.
+       // Handled here because we still have inline overrides in some places.
+       "camelcase": true,
+       "nomen": true,
+
        // Enforcing
        "bitwise": true,
        "forin": false,
@@ -31,8 +27,6 @@
        "multistr": true,
        // Environment
        "browser": true,
-       // Legacy
-       "nomen": true,
 
        "predef": [
                "mediaWiki",
index 340aa50..9633edd 100644 (file)
@@ -50,6 +50,7 @@ production.
   prepended to the start of this array.
 * $wgQueryPages has been removed. Query Pages should be added to by using the
   wgQueryPages hook.
+* $wgHttpOnlyBlacklist has been removed.
 
 === New features in 1.23 ===
 * ResourceLoader can utilize the Web Storage API to cache modules client-side.
index 71851d5..612acb9 100644 (file)
@@ -4870,17 +4870,6 @@ $wgCookiePrefix = false;
  */
 $wgCookieHttpOnly = true;
 
-/**
- * If the requesting browser matches a regex in this blacklist, we won't
- * send it cookies with HttpOnly mode, even if $wgCookieHttpOnly is on.
- */
-$wgHttpOnlyBlacklist = array(
-       // Internet Explorer for Mac; sometimes the cookies work, sometimes
-       // they don't. It's difficult to predict, as combinations of path
-       // and expiration options affect its parsing.
-       '/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/',
-);
-
 /**
  * A list of cookies that vary the cache (for use by extensions)
  */
index d4b06fe..8f5b31e 100644 (file)
@@ -2082,9 +2082,9 @@ class EditPage {
                }
                # Try to add a custom edit intro, or use the standard one if this is not possible.
                if ( !$this->showCustomIntro() && !$this->mTitle->exists() ) {
-                       $helpLink = Skin::makeInternalOrExternalUrl(
+                       $helpLink = wfExpandUrl( Skin::makeInternalOrExternalUrl(
                                wfMessage( 'helppage' )->inContentLanguage()->text()
-                       );
+                       ) );
                        if ( $wgUser->isLoggedIn() ) {
                                $wgOut->wrapWikiMsg(
                                        // Suppress the external link icon, consider the help url an internal one
index 981a556..2314cb2 100644 (file)
@@ -1027,10 +1027,8 @@ function wfDebugMem( $exact = false ) {
  *
  * @since 1.23 support for sampling log messages via $wgDebugLogGroups.
  *
- * @param $logGroup String
- * @param $text String
- * @param bool $public whether to log the event in the public log if no private
- *                     log file is specified, (default true)
+ * @param string $logGroup
+ * @param string $text
  * @param string|bool $dest Destination of the message:
  *     - 'all': both to the log and HTML (debug toolbar or HTML comments)
  *     - 'log': only to the log and not in HTML
@@ -3443,23 +3441,6 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
        return str_pad( $result, $pad, '0', STR_PAD_LEFT );
 }
 
-/**
- * @return bool
- */
-function wfHttpOnlySafe() {
-       global $wgHttpOnlyBlacklist;
-
-       if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
-               foreach ( $wgHttpOnlyBlacklist as $regex ) {
-                       if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
-                               return false;
-                       }
-               }
-       }
-
-       return true;
-}
-
 /**
  * Check if there is sufficient entropy in php's built-in session generation
  * @return bool true = there is sufficient entropy
@@ -3532,16 +3513,8 @@ function wfSetupSession( $sessionId = false ) {
                # hasn't already been set to the desired value (that causes errors)
                ini_set( 'session.save_handler', $wgSessionHandler );
        }
-       $httpOnlySafe = wfHttpOnlySafe() && $wgCookieHttpOnly;
-       wfDebugLog( 'cookie',
-               'session_set_cookie_params: "' . implode( '", "',
-                       array(
-                               0,
-                               $wgCookiePath,
-                               $wgCookieDomain,
-                               $wgCookieSecure,
-                               $httpOnlySafe ) ) . '"' );
-       session_set_cookie_params( 0, $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $httpOnlySafe );
+       session_set_cookie_params(
+               0, $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $wgCookieHttpOnly );
        session_cache_limiter( 'private, must-revalidate' );
        if ( $sessionId ) {
                session_id( $sessionId );
index 9312a0d..38c3623 100644 (file)
@@ -960,9 +960,10 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $desc
-        * @param $page
-        * @return string
+        * Returns an HTML link for use in the footer
+        * @param string $desc i18n message key for the link text
+        * @param string $page i18n message key for the page to link to
+        * @return string HTML anchor
         */
        public function footerLink( $desc, $page ) {
                // if the link description has been set to "-" in the default language,
index ab7524c..a3dadd0 100644 (file)
@@ -88,12 +88,6 @@ class WebResponse {
                        $expire = time() + $wgCookieExpiration;
                }
 
-               // Don't mark the cookie as httpOnly if the requesting user-agent is
-               // known to have trouble with httpOnly cookies.
-               if ( !wfHttpOnlySafe() ) {
-                       $options['httpOnly'] = false;
-               }
-
                $func = $options['raw'] ? 'setrawcookie' : 'setcookie';
 
                if ( wfRunHooks( 'WebResponseSetCookie', array( &$name, &$value, &$expire, $options ) ) ) {
index 4bf8fd3..6cf718c 100644 (file)
@@ -655,7 +655,10 @@ class MediaWiki {
                        $info['host'],
                        isset( $info['port'] ) ? $info['port'] : 80,
                        $errno,
-                       $errstr
+                       $errstr,
+                       // If it takes more than 100ms to connect to ourselves there
+                       // is a problem elsewhere.
+                       0.1
                );
                wfRestoreWarnings();
                if ( !$sock ) {
index b4aa303..af74f47 100644 (file)
@@ -104,9 +104,10 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Create a WikiPage object of the appropriate class for the given title.
         *
-        * @param $title Title
+        * @param Title $title
+        *
         * @throws MWException
-        * @return WikiPage object of the appropriate type
+        * @return WikiPage Object of the appropriate type
         */
        public static function factory( Title $title ) {
                $ns = $title->getNamespace();
@@ -1468,12 +1469,13 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
-        * @param string $text new text of the section
-        * @param string $sectionTitle new section's subject, only if $section is 'new'
-        * @param string $edittime revision timestamp or null to use the current revision
+        * @param mixed $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
+        * @param string $text New text of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $edittime Revision timestamp or null to use the current revision.
+        *
         * @throws MWException
-        * @return String new complete article text, or null if error
+        * @return string New complete article text, or null if error.
         *
         * @deprecated since 1.21, use replaceSectionContent() instead
         */
@@ -1486,13 +1488,15 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( !$this->supportsSections() ) {
-                       throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
+                       throw new MWException( "sections not supported for content model " .
+                               $this->getContentHandler()->getModelID() );
                }
 
                // could even make section title, but that's not required.
                $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
 
-               $newContent = $this->replaceSectionContent( $section, $sectionContent, $sectionTitle, $edittime );
+               $newContent = $this->replaceSectionContent( $section, $sectionContent, $sectionTitle,
+                       $edittime );
 
                return ContentHandler::getContentText( $newContent );
        }
@@ -1500,7 +1504,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Returns true if this page's content model supports sections.
         *
-        * @return boolean whether sections are supported.
+        * @return bool
         *
         * @todo The skin should check this and not offer section functionality if sections are not supported.
         * @todo The EditPage should check this and not offer section functionality if sections are not supported.
@@ -1510,17 +1514,18 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
-        * @param $sectionContent Content: new content of the section
-        * @param string $sectionTitle new section's subject, only if $section is 'new'
-        * @param string $edittime revision timestamp or null to use the current revision
+        * @param mixed $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
+        * @param Content $sectionContent New content of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $edittime Revision timestamp or null to use the current revision.
         *
         * @throws MWException
-        * @return Content new complete article content, or null if error
+        * @return Content New complete article content, or null if error.
         *
         * @since 1.21
         */
-       public function replaceSectionContent( $section, Content $sectionContent, $sectionTitle = '', $edittime = null ) {
+       public function replaceSectionContent( $section, Content $sectionContent, $sectionTitle = '',
+               $edittime = null ) {
                wfProfileIn( __METHOD__ );
 
                if ( strval( $section ) == '' ) {
@@ -1529,7 +1534,8 @@ class WikiPage implements Page, IDBAccessObject {
                } else {
                        if ( !$this->supportsSections() ) {
                                wfProfileOut( __METHOD__ );
-                               throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
+                               throw new MWException( "sections not supported for content model " .
+                                       $this->getContentHandler()->getModelID() );
                        }
 
                        // Bug 30711: always use current version when adding a new section
@@ -2612,9 +2618,11 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Take an array of page restrictions and flatten it to a string
         * suitable for insertion into the page_restrictions field.
-        * @param $limit Array
+        *
+        * @param string[] $limit
+        *
         * @throws MWException
-        * @return String
+        * @return string
         */
        protected static function flattenRestrictions( $limit ) {
                if ( !is_array( $limit ) ) {
index 4a27692..217142c 100644 (file)
@@ -142,7 +142,7 @@ abstract class BagOStuff {
         * @return bool success
         */
        protected function mergeViaLock( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
-               if ( !$this->lock( $key, 60 ) ) {
+               if ( !$this->lock( $key, 6 ) ) {
                        return false;
                }
 
@@ -168,7 +168,7 @@ abstract class BagOStuff {
         * @param $timeout integer [optional]
         * @return bool success
         */
-       public function lock( $key, $timeout = 60 ) {
+       public function lock( $key, $timeout = 6 ) {
                $timestamp = microtime( true ); // starting UNIX timestamp
                if ( $this->add( "{$key}:lock", 1, $timeout ) ) {
                        return true;
index 654e7ea..c4b840a 100644 (file)
@@ -50,28 +50,28 @@ class SpecialPageFactory {
        private static $list = array(
                // Maintenance Reports
                'BrokenRedirects'           => 'BrokenRedirectsPage',
-               'Deadendpages'              => 'DeadendpagesPage',
+               'Deadendpages'              => 'DeadendPagesPage',
                'DoubleRedirects'           => 'DoubleRedirectsPage',
-               'Longpages'                 => 'LongpagesPage',
-               'Ancientpages'              => 'AncientpagesPage',
-               'Lonelypages'               => 'LonelypagesPage',
+               'Longpages'                 => 'LongPagesPage',
+               'Ancientpages'              => 'AncientPagesPage',
+               'Lonelypages'               => 'LonelyPagesPage',
                'Fewestrevisions'           => 'FewestrevisionsPage',
-               'Withoutinterwiki'          => 'WithoutinterwikiPage',
+               'Withoutinterwiki'          => 'WithoutInterwikiPage',
                'Protectedpages'            => 'SpecialProtectedpages',
                'Protectedtitles'           => 'SpecialProtectedtitles',
                'Shortpages'                => 'ShortpagesPage',
-               'Uncategorizedcategories'   => 'UncategorizedcategoriesPage',
-               'Uncategorizedimages'       => 'UncategorizedimagesPage',
-               'Uncategorizedpages'        => 'UncategorizedpagesPage',
-               'Uncategorizedtemplates'    => 'UncategorizedtemplatesPage',
-               'Unusedcategories'          => 'UnusedcategoriesPage',
+               'Uncategorizedcategories'   => 'UncategorizedCategoriesPage',
+               'Uncategorizedimages'       => 'UncategorizedImagesPage',
+               'Uncategorizedpages'        => 'UncategorizedPagesPage',
+               'Uncategorizedtemplates'    => 'UncategorizedTemplatesPage',
+               'Unusedcategories'          => 'UnusedCategoriesPage',
                'Unusedimages'              => 'UnusedimagesPage',
                'Unusedtemplates'           => 'UnusedtemplatesPage',
                'Unwatchedpages'            => 'UnwatchedpagesPage',
-               'Wantedcategories'          => 'WantedcategoriesPage',
-               'Wantedfiles'               => 'WantedfilesPage',
-               'Wantedpages'               => 'WantedpagesPage',
-               'Wantedtemplates'           => 'WantedtemplatesPage',
+               'Wantedcategories'          => 'WantedCategoriesPage',
+               'Wantedfiles'               => 'WantedFilesPage',
+               'Wantedpages'               => 'WantedPagesPage',
+               'Wantedtemplates'           => 'WantedTemplatesPage',
 
                // List of pages
                'Allpages'                  => 'SpecialAllpages',
@@ -128,7 +128,7 @@ class SpecialPageFactory {
 
                // Redirecting special pages
                'LinkSearch'                => 'LinkSearchPage',
-               'Randompage'                => 'Randompage',
+               'Randompage'                => 'RandomPage',
                'RandomInCategory'          => 'SpecialRandomInCategory',
                'Randomredirect'            => 'SpecialRandomredirect',
 
@@ -146,7 +146,7 @@ class SpecialPageFactory {
                'Export'                    => 'SpecialExport',
                'Import'                    => 'SpecialImport',
                'Undelete'                  => 'SpecialUndelete',
-               'Whatlinkshere'             => 'SpecialWhatlinkshere',
+               'Whatlinkshere'             => 'SpecialWhatLinksHere',
                'MergeHistory'              => 'SpecialMergeHistory',
                'ExpandTemplates'           => 'SpecialExpandTemplates',
 
@@ -187,7 +187,7 @@ class SpecialPageFactory {
                        wfProfileIn( __METHOD__ );
 
                        if ( !$wgDisableCounters ) {
-                               self::$list['Popularpages'] = 'PopularpagesPage';
+                               self::$list['Popularpages'] = 'PopularPagesPage';
                        }
 
                        if ( !$wgDisableInternalSearch ) {
index 1fed516..dd6bec2 100644 (file)
@@ -291,6 +291,7 @@ class SpecialActiveUsers extends SpecialPage {
                                self::doQueryCacheUpdate( $dbw, $window );
                        }
                }
+
                return ( time() -
                        ( $cTime ? wfTimestamp( TS_UNIX, $cTime ) : $wgActiveUserDays * 86400 ) );
        }
@@ -383,7 +384,7 @@ class SpecialActiveUsers extends SpecialPage {
                        $newRows = array();
                        foreach ( $names as $name => $lastEditTime ) {
                                $newRows[] = array(
-                                       'qcc_type'  => 'activeusers',
+                                       'qcc_type' => 'activeusers',
                                        'qcc_namespace' => NS_USER,
                                        'qcc_title' => $name,
                                        'qcc_value' => wfTimestamp( TS_UNIX, $lastEditTime ),
index 71bb27a..6cef130 100644 (file)
@@ -352,7 +352,7 @@ class AllmessagesTablePager extends TablePager {
                                                'grouppath' => 'mediawiki',
                                                'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' .
                                                        'messageid:"MediaWiki:' . $value . '"^10 "' .
-                                                       $this->msg ( $value )->inLanguage ( 'en' )->plain() . '"'
+                                                       $this->msg( $value )->inLanguage( 'en' )->plain() . '"'
                                        ) ),
                                        $this->msg( 'allmessages-filter-translate' )->text()
                                );
index 1e2d557..97e7238 100644 (file)
@@ -216,6 +216,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                // since generating it will cause a lot of scanning
                if ( $count > $this->maxTopLevelPages ) {
                        $this->showChunk( $namespace, $from, $to, $hideredirects );
+
                        return;
                }
 
index d19968f..79636b1 100644 (file)
@@ -125,6 +125,7 @@ class SpecialBookSources extends SpecialPage {
                $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
                $form .= Html::closeElement( 'form' ) . "\n";
                $form .= Html::closeElement( 'fieldset' ) . "\n";
+
                return $form;
        }
 
index 2bd14c7..0356d45 100644 (file)
@@ -167,6 +167,7 @@ class SpecialChangePassword extends FormSpecialPage {
                        }
                        $query = $request->getVal( 'returntoquery' );
                        $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
+
                        return true;
                }
 
index 3642750..af4f852 100644 (file)
@@ -26,7 +26,6 @@
  *
  * @ingroup SpecialPage
  */
-
 class SpecialContributions extends IncludableSpecialPage {
        protected $opts;
 
@@ -66,6 +65,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        if ( !$this->including() ) {
                                $out->addHTML( $this->getForm() );
                        }
+
                        return;
                }
 
@@ -951,8 +951,12 @@ class ContribsPager extends ReverseChronologicalPager {
                 * to extensions to subscribe to the hook to parse the row.
                 */
                wfSuppressWarnings();
-               $rev = new Revision( $row );
-               $validRevision = (bool)$rev->getId();
+               try {
+                       $rev = new Revision( $row );
+                       $validRevision = (bool)$rev->getId();
+               } catch ( MWException $e ) {
+                       $validRevision = false;
+               }
                wfRestoreWarnings();
 
                if ( $validRevision ) {
index 63d4ec9..d781e6d 100644 (file)
@@ -27,7 +27,6 @@
  *
  * @ingroup SpecialPage
  */
-
 class SpecialCreateAccount extends SpecialRedirectToSpecial {
        function __construct() {
                parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'returnto', 'returntoquery', 'uselang' ) );
index 6c3cb95..3115215 100644 (file)
@@ -276,7 +276,7 @@ class DeletedContribsPager extends IndexPager {
 class DeletedContributionsPage extends SpecialPage {
        function __construct() {
                parent::__construct( 'DeletedContributions', 'deletedhistory',
-               /*listed*/true, /*function*/false, /*file*/false );
+                       /*listed*/true, /*function*/false, /*file*/false );
        }
 
        /**
index 98d5fea..68e8703 100644 (file)
@@ -162,14 +162,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        }
 
                        if ( count( $toWatch ) > 0 ) {
-                               $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-added'
-                               )->numParams( count( $toWatch ) )->parse();
+                               $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-added' )
+                                       ->numParams( count( $toWatch ) )->parse();
                                $this->showTitles( $toWatch, $this->successMessage );
                        }
 
                        if ( count( $toUnwatch ) > 0 ) {
-                               $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
-                               )->numParams( count( $toUnwatch ) )->parse();
+                               $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed' )
+                                       ->numParams( count( $toUnwatch ) )->parse();
                                $this->showTitles( $toUnwatch, $this->successMessage );
                        }
                } else {
index 7241105..61925cf 100644 (file)
@@ -125,9 +125,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        }
 
                        $this->showHtmlPreview( $title, $rawhtml, $out );
-
                }
-
        }
 
        /**
index e7ced52..eb1c139 100644 (file)
@@ -36,6 +36,7 @@ class SpecialFilepath extends RedirectSpecialPage {
        // implement by redirecting through Special:Redirect/file
        function getRedirect( $par ) {
                $file = $par ?: $this->getRequest()->getText( 'file' );
+
                return SpecialPage::getSafeTitleFor( 'Redirect', 'file/' . $file );
        }
 
index ba3e73f..9f0d127 100644 (file)
@@ -129,7 +129,7 @@ class ImageListPager extends TablePager {
                $conds = array();
 
                if ( !is_null( $this->mUserName ) ) {
-                       $conds[ $prefix . '_user_text' ] = $this->mUserName;
+                       $conds[$prefix . '_user_text'] = $this->mUserName;
                }
 
                if ( $this->mSearch !== '' ) {
@@ -215,6 +215,7 @@ class ImageListPager extends TablePager {
                // for two different tables, without reimplementing
                // the pager class.
                $qi = $this->getQueryInfoReal( $this->mTableName );
+
                return $qi;
        }
 
@@ -338,7 +339,7 @@ class ImageListPager extends TablePager {
                $topRes2 = $res2->next();
                $resultArray = array();
                for ( $i = 0; $i < $limit && $topRes1 && $topRes2; $i++ ) {
-                       if ( strcmp( $topRes1->{ $this->mIndexField }, $topRes2->{ $this->mIndexField } ) > 0 ) {
+                       if ( strcmp( $topRes1->{$this->mIndexField}, $topRes2->{$this->mIndexField} ) > 0 ) {
                                if ( !$ascending ) {
                                        $resultArray[] = $topRes1;
                                        $topRes1 = $res1->next();
@@ -364,6 +365,7 @@ class ImageListPager extends TablePager {
                        $resultArray[] = $topRes2;
                        $topRes2 = $res2->next();
                }
+
                return new FakeResultWrapper( $resultArray );
        }
 
@@ -409,6 +411,7 @@ class ImageListPager extends TablePager {
                                // If statement for paranoia
                                if ( $file ) {
                                        $thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
+
                                        return $thumb->toHtml( array( 'desc-link' => true ) );
                                } else {
                                        return htmlspecialchars( $value );
@@ -493,6 +496,7 @@ class ImageListPager extends TablePager {
                        'checked' => $this->mShowAll,
                        'tabindex' => 4,
                ) );
+
                return Html::openElement( 'form',
                        array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' )
                ) .
index dd78c4c..50af915 100644 (file)
@@ -84,6 +84,7 @@ class MIMEsearchPage extends QueryPage {
                                ),
                        ),
                );
+
                return $qi;
        }
 
index ad6b788..0471caf 100644 (file)
@@ -23,6 +23,7 @@
  * @ingroup SpecialPage
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
+
 class MostrevisionsPage extends FewestrevisionsPage {
        function __construct( $name = 'Mostrevisions' ) {
                parent::__construct( $name );
index c054ef7..91ef797 100644 (file)
@@ -593,8 +593,8 @@ class MovePageForm extends UnlistedSpecialPage {
                $dbr = wfGetDB( DB_MASTER );
                if ( $this->moveSubpages && (
                        MWNamespace::hasSubpages( $nt->getNamespace() ) || (
-                               $this->moveTalk &&
-                                       MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
+                               $this->moveTalk
+                                       && MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
                        )
                ) ) {
                        $conds = array(
index 41119f9..9b8d52b 100644 (file)
@@ -108,6 +108,7 @@ class SpecialAllMyUploads extends RedirectSpecialPage {
 
        function getRedirect( $subpage ) {
                $this->mAddedRedirectParams['ilshowall'] = 1;
+
                return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
        }
 }
index 37d2973..c10a618 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+
 class SpecialNewFiles extends IncludableSpecialPage {
        public function __construct() {
                parent::__construct( 'Newimages' );
index 6c2ffe9..17115e8 100644 (file)
@@ -39,6 +39,7 @@ class SpecialPermanentLink extends RedirectSpecialPage {
                        throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
                }
                $this->mAddedRedirectParams['oldid'] = $subpage;
+
                return true;
        }
 }
index 4e2f0e7..e877b4e 100644 (file)
@@ -207,6 +207,7 @@ class SpecialRandomInCategory extends SpecialPage {
                        $qi['conds'][] = 'cl_timestamp ' . $op . ' ' .
                                $dbr->addQuotes( $dbr->timestamp( $minClTime ) );
                }
+
                return $qi;
        }
 
@@ -229,6 +230,7 @@ class SpecialRandomInCategory extends SpecialPage {
                }
 
                $ts = ( $this->maxTimestamp - $this->minTimestamp ) * $rand + $this->minTimestamp;
+
                return intval( $ts );
        }
 
@@ -258,6 +260,7 @@ class SpecialRandomInCategory extends SpecialPage {
                if ( !$res ) {
                        throw new MWException( 'No entries in category' );
                }
+
                return array( wfTimestamp( TS_UNIX, $res->low ), wfTimestamp( TS_UNIX, $res->high ) );
        }
 
index 720d0a8..2c563c6 100644 (file)
@@ -45,6 +45,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $query = $this->getFeedQuery();
                        $query['feedformat'] = $feedFormat === 'atom' ? 'atom' : 'rss';
                        $this->getOutput()->redirect( wfAppendQuery( wfScript( 'api' ), $query ) );
+
                        return;
                }
 
@@ -272,6 +273,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                if ( $query['limit'] > $wgFeedLimit ) {
                        $query['limit'] = $wgFeedLimit;
                }
+
                return $query;
        }
 
@@ -492,6 +494,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        public function checkLastModified() {
                $dbr = $this->getDB();
                $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
+
                return $lastmod;
        }
 
index c4f40be..526e949 100644 (file)
@@ -38,6 +38,7 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                $opts = parent::getDefaultOptions();
                $opts->add( 'target', '' );
                $opts->add( 'showlinkedto', false );
+
                return $opts;
        }
 
@@ -58,6 +59,7 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                if ( !$title || $title->isExternal() ) {
                        $outputPage->addHtml( '<div class="errorbox">' . $this->msg( 'allpagesbadtitle' )
                                        ->parse() . '</div>' );
+
                        return false;
                }
 
@@ -91,7 +93,7 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                                'wl_user' => $uid,
                                'wl_title=rc_title',
                                'wl_namespace=rc_namespace'
-                       ));
+                       ) );
                }
                if ( $this->getUser()->isAllowed( 'rollback' ) ) {
                        $tables[] = 'page';
@@ -256,6 +258,7 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                                $this->rclTargetTitle = false;
                        }
                }
+
                return $this->rclTargetTitle;
        }
 }
index 8ec6f85..4926d6d 100644 (file)
@@ -78,6 +78,7 @@ class SpecialRedirect extends FormSpecialPage {
                        return null;
                }
                $userpage = Title::makeTitle( NS_USER, $username );
+
                return $userpage->getFullURL( '', false, PROTO_CURRENT );
        }
 
@@ -89,7 +90,7 @@ class SpecialRedirect extends FormSpecialPage {
        function dispatchFile() {
                $title = Title::makeTitleSafe( NS_FILE, $this->mValue );
 
-               if ( ! $title instanceof Title ) {
+               if ( !$title instanceof Title ) {
                        return null;
                }
                $file = wfFindFile( $title );
@@ -112,6 +113,7 @@ class SpecialRedirect extends FormSpecialPage {
                                $url = $mto->getURL();
                        }
                }
+
                return $url;
        }
 
@@ -130,6 +132,7 @@ class SpecialRedirect extends FormSpecialPage {
                if ( $oldid === 0 ) {
                        return null;
                }
+
                return wfAppendQuery( wfScript( 'index' ), array(
                        'oldid' => $oldid
                ) );
@@ -149,6 +152,7 @@ class SpecialRedirect extends FormSpecialPage {
                if ( $curid === 0 ) {
                        return null;
                }
+
                return wfAppendQuery( wfScript( 'index' ), array(
                        'curid' => $curid
                ) );
@@ -165,33 +169,36 @@ class SpecialRedirect extends FormSpecialPage {
        function dispatch() {
                // the various namespaces supported by Special:Redirect
                switch ( $this->mType ) {
-               case 'user':
-                       $url = $this->dispatchUser();
-                       break;
-               case 'file':
-                       $url = $this->dispatchFile();
-                       break;
-               case 'revision':
-                       $url = $this->dispatchRevision();
-                       break;
-               case 'page':
-                       $url = $this->dispatchPage();
-                       break;
-               default:
-                       $this->getOutput()->setStatusCode( 404 );
-                       $url = null;
-                       break;
+                       case 'user':
+                               $url = $this->dispatchUser();
+                               break;
+                       case 'file':
+                               $url = $this->dispatchFile();
+                               break;
+                       case 'revision':
+                               $url = $this->dispatchRevision();
+                               break;
+                       case 'page':
+                               $url = $this->dispatchPage();
+                               break;
+                       default:
+                               $this->getOutput()->setStatusCode( 404 );
+                               $url = null;
+                               break;
                }
                if ( $url ) {
                        $this->getOutput()->redirect( $url );
+
                        return true;
                }
                if ( !is_null( $this->mValue ) ) {
                        $this->getOutput()->setStatusCode( 404 );
                        // Message: redirect-not-exists
                        $msg = $this->getMessagePrefix() . '-not-exists';
+
                        return Status::newFatal( $msg );
                }
+
                return false;
        }
 
@@ -228,6 +235,7 @@ class SpecialRedirect extends FormSpecialPage {
                if ( !empty( $this->mValue ) ) {
                        $a['value']['default'] = $this->mValue;
                }
+
                return $a;
        }
 
@@ -235,6 +243,7 @@ class SpecialRedirect extends FormSpecialPage {
                if ( !empty( $data['type'] ) && !empty( $data['value'] ) ) {
                        $this->setParameter( $data['type'] . '/' . $data['value'] );
                }
+
                /* if this returns false, will show the form */
                return $this->dispatch();
        }
index db98bea..864485c 100644 (file)
@@ -90,7 +90,7 @@ class SpecialResetTokens extends FormSpecialPage {
                                        ->rawParams( $this->msg( $tok['label-message'] )->parse() )
                                        ->params( $user->getTokenFromOption( $tok['preference'] ) )
                                        ->escaped();
-                               $tokensForForm[ $label ] = $tok['preference'];
+                               $tokensForForm[$label] = $tok['preference'];
                        }
 
                        $desc = array(
index 05c8872..780da7c 100644 (file)
@@ -137,6 +137,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->token = $request->getVal( 'token' );
                if ( $this->archiveName && $this->targetObj ) {
                        $this->tryShowFile( $this->archiveName );
+
                        return;
                }
 
@@ -156,6 +157,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                # We need a target page!
                if ( is_null( $this->targetObj ) ) {
                        $output->addWikiMsg( 'undelete-header' );
+
                        return;
                }
                # Give a link to the logs/hist for this page
@@ -257,6 +259,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $conds['log_action'] = $this->getList()->getLogAction();
                $conds['ls_field'] = RevisionDeleter::getRelationType( $this->typeName );
                $conds['ls_value'] = $this->ids;
+
                return $conds;
        }
 
@@ -271,6 +274,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // Check if user is allowed to see this file
                if ( !$oimage->exists() ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-no-file' );
+
                        return;
                }
                $user = $this->getUser();
@@ -300,6 +304,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                Xml::submitButton( $this->msg( 'revdelete-show-file-submit' )->text() ) .
                                '</form>'
                        );
+
                        return;
                }
                $this->getOutput()->disable();
@@ -325,6 +330,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $this->typeName, $this->getContext(), $this->targetObj, $this->ids
                        );
                }
+
                return $this->list;
        }
 
@@ -467,8 +473,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
                                $html .= "<tr>$line</tr>\n";
                        }
-               // Otherwise, use tri-state radios
                } else {
+                       // Otherwise, use tri-state radios
                        $html .= '<tr>';
                        $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
                        $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
@@ -495,6 +501,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                }
 
                $html .= '</table>';
+
                return $html;
        }
 
@@ -508,6 +515,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $token = $this->getRequest()->getVal( 'wpEditToken' );
                if ( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
                        $this->getOutput()->addWikiMsg( 'sessionfailure' );
+
                        return false;
                }
                $bitParams = $this->extractBitParams();
@@ -527,11 +535,13 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $status = $this->save( $bitParams, $comment, $this->targetObj );
                if ( $status->isGood() ) {
                        $this->success();
+
                        return true;
-               # ...otherwise, bounce back to form...
                } else {
+                       # ...otherwise, bounce back to form...
                        $this->failure( $status );
                }
+
                return false;
        }
 
@@ -573,6 +583,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                if ( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
                        $bitfield[Revision::DELETED_RESTRICTED] = 0;
                }
+
                return $bitfield;
        }
 
index ab2b16e..0c45281 100644 (file)
@@ -38,10 +38,12 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                if ( wfReadOnly() ) {
                        header( "HTTP/1.0 423 Locked" );
                        print 'Wiki is in read-only mode';
+
                        return;
                } elseif ( !$this->getRequest()->wasPosted() ) {
                        header( "HTTP/1.0 400 Bad Request" );
                        print 'Request must be POSTed';
+
                        return;
                }
 
@@ -53,6 +55,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                if ( count( $missing ) ) {
                        header( "HTTP/1.0 400 Bad Request" );
                        print 'Missing parameters: ' . implode( ', ', array_keys( $missing ) );
+
                        return;
                }
 
@@ -76,6 +79,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                if ( !$verified || $params['sigexpiry'] < time() ) {
                        header( "HTTP/1.0 400 Bad Request" );
                        print 'Invalid or stale signature provided';
+
                        return;
                }
 
@@ -132,7 +136,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                                $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE );
                                if ( $job ) {
                                        $output = $job->toString() . "\n";
-                                       $t = - microtime( true );
+                                       $t = -microtime( true );
                                        wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
                                        $success = $job->run();
                                        wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
index aea8f17..129f8b7 100644 (file)
@@ -179,6 +179,7 @@ class SpecialSearch extends SpecialPage {
                # If the string cannot be used to create a title
                if ( is_null( $t ) ) {
                        $this->showResults( $term );
+
                        return;
                }
                # If there's an exact or very near match, jump right there.
@@ -191,6 +192,7 @@ class SpecialSearch extends SpecialPage {
 
                if ( !is_null( $t ) ) {
                        $this->getOutput()->redirect( $t->getFullURL() );
+
                        return;
                }
                # No match, generate an edit URL
@@ -203,6 +205,7 @@ class SpecialSearch extends SpecialPage {
                        # If the feature is enabled, go straight to the edit page
                        if ( $wgGoToEdit ) {
                                $this->getOutput()->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
+
                                return;
                        }
                }
@@ -247,6 +250,7 @@ class SpecialSearch extends SpecialPage {
                                        Xml::closeElement( 'fieldset' )
                                );
                        }
+
                        return;
                }
 
@@ -328,6 +332,7 @@ class SpecialSearch extends SpecialPage {
                // Sometimes the search engine knows there are too many hits
                if ( $titleMatches instanceof SearchResultTooMany ) {
                        $out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
+
                        return;
                }
 
@@ -336,6 +341,7 @@ class SpecialSearch extends SpecialPage {
                        $out->addHTML( $this->formHeader( $term, 0, 0 ) );
                        $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
                        $out->addHTML( '</form>' );
+
                        // Empty query -- straight view of search form
                        return;
                }
@@ -438,12 +444,14 @@ class SpecialSearch extends SpecialPage {
                // show direct page/create link if applicable
 
                // Check DBkey !== '' in case of fragment link only.
-               if ( is_null( $t ) || $t->getDBkey() === '' ||
-                               ( $titleMatches !== null && $titleMatches->searchContainedSyntax() ) ||
-                               ( $textMatches !== null && $textMatches->searchContainedSyntax() ) ) {
+               if ( is_null( $t ) || $t->getDBkey() === ''
+                       || ( $titleMatches !== null && $titleMatches->searchContainedSyntax() )
+                       || ( $textMatches !== null && $textMatches->searchContainedSyntax() )
+               ) {
                        // invalid title
                        // preserve the paragraph for margins etc...
                        $this->getOutput()->addHtml( '<p></p>' );
+
                        return;
                }
 
@@ -517,6 +525,7 @@ class SpecialSearch extends SpecialPage {
                                $opt['ns' . $n] = 1;
                        }
                }
+
                return $opt + $this->extraParams;
        }
 
@@ -573,7 +582,7 @@ class SpecialSearch extends SpecialPage {
                $link_t = clone $t;
 
                wfRunHooks( 'ShowSearchHitTitle',
-                                       array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
+                       array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
 
                $link = Linker::linkKnown(
                        $link_t,
@@ -850,6 +859,7 @@ class SpecialSearch extends SpecialPage {
                }
 
                $out .= "<li>{$link} {$redirect}</li>\n";
+
                return $out;
        }
 
@@ -869,6 +879,7 @@ class SpecialSearch extends SpecialPage {
                } else {
                        $form = '';
                        wfRunHooks( 'SpecialSearchProfileForm', array( $this, &$form, $profile, $term, $opts ) );
+
                        return $form;
                }
        }
@@ -943,11 +954,12 @@ class SpecialSearch extends SpecialPage {
                foreach ( $opts as $key => $value ) {
                        $hidden .= Html::hidden( $key, $value );
                }
+
                // Return final output
                return Xml::openElement(
-                               'fieldset',
-                               array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
-                       ) .
+                       'fieldset',
+                       array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
+               ) .
                        Xml::element( 'legend', null, $this->msg( 'powersearch-legend' )->text() ) .
                        Xml::tags( 'h4', null, $this->msg( 'powersearch-ns' )->parse() ) .
                        Html::element( 'div', array( 'id' => 'mw-search-togglebox' ) ) .
@@ -1103,6 +1115,7 @@ class SpecialSearch extends SpecialPage {
                        $this->msg( 'searchbutton' )->text(),
                        array( 'class' => array( 'mw-ui-button', 'mw-ui-progressive' ) )
                ) . "\n";
+
                return $out . $this->didYouMeanHtml;
        }
 
@@ -1154,6 +1167,7 @@ class SpecialSearch extends SpecialPage {
                if ( count( $p ) > 1 ) {
                        return $wgContLang->getNsIndex( $p[0] ) == NS_FILE;
                }
+
                return false;
        }
 
@@ -1171,6 +1185,7 @@ class SpecialSearch extends SpecialPage {
                if ( count( $p ) > 1 ) {
                        return $p[0] == $allkeyword;
                }
+
                return false;
        }
 
@@ -1184,6 +1199,7 @@ class SpecialSearch extends SpecialPage {
                        $this->searchEngine = $this->searchEngineType ?
                                SearchEngine::create( $this->searchEngineType ) : SearchEngine::create();
                }
+
                return $this->searchEngine;
        }
 
index 9b50875..dffa7de 100644 (file)
@@ -40,12 +40,15 @@ class ShortPagesPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_len' ),
-                       'conds' => array( 'page_namespace' =>
-                                       MWNamespace::getContentNamespaces(),
-                                       'page_is_redirect' => 0 ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_len'
+                       ),
+                       'conds' => array(
+                               'page_namespace' => MWNamespace::getContentNamespaces(),
+                               'page_is_redirect' => 0
+                       ),
                        'options' => array( 'USE INDEX' => 'page_redirect_namespace_len' )
                );
        }
@@ -111,8 +114,8 @@ class ShortPagesPage extends QueryPage {
                $size = $this->msg( 'nbytes' )->numParams( $result->value )->escaped();
 
                return $exists
-                               ? "${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]"
-                               : "<del>${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]</del>";
+                       ? "${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]"
+                       : "<del>${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]</del>";
        }
 
        protected function getGroupName() {
index 56f3f41..c3a11f3 100644 (file)
@@ -30,7 +30,7 @@
 class SpecialStatistics extends SpecialPage {
 
        private $views, $edits, $good, $images, $total, $users,
-                       $activeUsers = 0;
+               $activeUsers = 0;
 
        public function __construct() {
                parent::__construct( 'Statistics' );
@@ -123,6 +123,7 @@ class SpecialStatistics extends SpecialPage {
                                        " $descriptionText" );
                        }
                }
+
                return Html::rawElement( 'tr', $trExtraParams,
                        Html::rawElement( 'td', array(), $text ) .
                        Html::rawElement( 'td', array( 'class' => 'mw-statistics-numbers' ), $number )
@@ -166,6 +167,7 @@ class SpecialStatistics extends SpecialPage {
 
        private function getUserStats() {
                global $wgActiveUserDays;
+
                return Xml::openElement( 'tr' ) .
                        Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-users' )->parse() ) .
                        Xml::closeElement( 'tr' ) .
@@ -225,6 +227,7 @@ class SpecialStatistics extends SpecialPage {
                                $this->getLanguage()->formatNum( $countUsers ),
                                array( 'class' => 'statistics-group-' . Sanitizer::escapeClass( $group ) . $classZero ) );
                }
+
                return $text;
        }
 
@@ -245,36 +248,39 @@ class SpecialStatistics extends SpecialPage {
                $text = '';
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select(
-                               'page',
-                               array(
-                                       'page_namespace',
-                                       'page_title',
-                                       'page_counter',
-                               ),
-                               array(
-                                       'page_is_redirect' => 0,
-                                       'page_counter > 0',
-                               ),
-                               __METHOD__,
-                               array(
-                                       'ORDER BY' => 'page_counter DESC',
-                                       'LIMIT' => 10,
-                               )
-                       );
-                       if ( $res->numRows() > 0 ) {
-                               $text .= Xml::openElement( 'tr' );
-                               $text .= Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-mostpopular' )->parse() );
-                               $text .= Xml::closeElement( 'tr' );
-                               foreach ( $res as $row ) {
-                                       $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                                       if ( $title instanceof Title ) {
-                                               $text .= $this->formatRow( Linker::link( $title ),
-                                                               $this->getLanguage()->formatNum( $row->page_counter ) );
-
-                                       }
+                       'page',
+                       array(
+                               'page_namespace',
+                               'page_title',
+                               'page_counter',
+                       ),
+                       array(
+                               'page_is_redirect' => 0,
+                               'page_counter > 0',
+                       ),
+                       __METHOD__,
+                       array(
+                               'ORDER BY' => 'page_counter DESC',
+                               'LIMIT' => 10,
+                       )
+               );
+
+               if ( $res->numRows() > 0 ) {
+                       $text .= Xml::openElement( 'tr' );
+                       $text .= Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-mostpopular' )->parse() );
+                       $text .= Xml::closeElement( 'tr' );
+
+                       foreach ( $res as $row ) {
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+
+                               if ( $title instanceof Title ) {
+                                       $text .= $this->formatRow( Linker::link( $title ),
+                                               $this->getLanguage()->formatNum( $row->page_counter ) );
                                }
-                               $res->free();
                        }
+                       $res->free();
+               }
+
                return $text;
        }
 
index 077e7cb..b762728 100644 (file)
@@ -46,11 +46,11 @@ class SpecialTags extends SpecialPage {
 
                // Write the headers
                $html = Xml::tags( 'tr', null, Xml::tags( 'th', null, $this->msg( 'tags-tag' )->parse() ) .
-                               Xml::tags( 'th', null, $this->msg( 'tags-display-header' )->parse() ) .
-                               Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
-                               Xml::tags( 'th', null, $this->msg( 'tags-active-header' )->parse() ) .
-                               Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
-                       );
+                       Xml::tags( 'th', null, $this->msg( 'tags-display-header' )->parse() ) .
+                       Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
+                       Xml::tags( 'th', null, $this->msg( 'tags-active-header' )->parse() ) .
+                       Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
+               );
 
                // Used in #doTagRow()
                $this->definedTags = array_fill_keys( ChangeTags::listDefinedTags(), true );
index fbc8e91..3a2b0c6 100644 (file)
@@ -107,7 +107,6 @@ class SpecialUnblock extends SpecialPage {
                        if ( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
                                $fields['Target']['default'] = $this->target;
                                unset( $fields['Name'] );
-
                        } else {
                                $fields['Target']['default'] = $target;
                                $fields['Target']['type'] = 'hidden';
@@ -133,11 +132,11 @@ class SpecialUnblock extends SpecialPage {
                                                break;
                                }
                        }
-
                } else {
                        $fields['Target']['default'] = $this->target;
                        unset( $fields['Name'] );
                }
+
                return $fields;
        }
 
@@ -181,6 +180,7 @@ class SpecialUnblock extends SpecialPage {
                list( $target, $type ) = SpecialBlock::getTargetAndType( $target );
                if ( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
                        $range = $block->getTarget();
+
                        return array( array( 'ipb_blocked_as_range', $target, $range ) );
                }
 
index 3bfcede..17de679 100644 (file)
@@ -50,13 +50,13 @@ class UncategorizedImagesPage extends ImageQueryPage {
                return array(
                        'tables' => array( 'page', 'categorylinks' ),
                        'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_title' ),
+                               'title' => 'page_title',
+                               'value' => 'page_title' ),
                        'conds' => array( 'cl_from IS NULL',
-                                       'page_namespace' => NS_FILE,
-                                       'page_is_redirect' => 0 ),
+                               'page_namespace' => NS_FILE,
+                               'page_is_redirect' => 0 ),
                        'join_conds' => array( 'categorylinks' => array(
-                                       'LEFT JOIN', 'cl_from=page_id' ) )
+                               'LEFT JOIN', 'cl_from=page_id' ) )
                );
        }
 
index 8bc9e48..c6a4215 100644 (file)
@@ -49,16 +49,21 @@ class UncategorizedPagesPage extends PageQueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'categorylinks' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_title' ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title'
+                       ),
                        // default for page_namespace is all content namespaces (if requestedNamespace is false)
                        // otherwise, page_namespace is requestedNamespace
-                       'conds' => array( 'cl_from IS NULL',
-                                       'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
-                                       'page_is_redirect' => 0 ),
-                       'join_conds' => array( 'categorylinks' => array(
-                                       'LEFT JOIN', 'cl_from = page_id' ) )
+                       'conds' => array(
+                               'cl_from IS NULL',
+                               'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
+                               'page_is_redirect' => 0
+                       ),
+                       'join_conds' => array(
+                               'categorylinks' => array( 'LEFT JOIN', 'cl_from = page_id' )
+                       )
                );
        }
 
@@ -68,6 +73,7 @@ class UncategorizedPagesPage extends PageQueryPage {
                if ( $this->requestedNamespace === false && count( MWNamespace::getContentNamespaces() ) > 1 ) {
                        return array( 'page_namespace', 'page_title' );
                }
+
                return array( 'page_title' );
        }
 
index 0dd5a0c..acfeb37 100644 (file)
@@ -58,6 +58,7 @@ class PageArchive {
         */
        public static function listAllPages() {
                $dbr = wfGetDB( DB_SLAVE );
+
                return self::listPages( $dbr, '' );
        }
 
@@ -137,7 +138,7 @@ class PageArchive {
                }
 
                $conds = array( 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey() );
+                       'ar_title' => $this->title->getDBkey() );
 
                $options = array( 'ORDER BY' => 'ar_timestamp DESC' );
 
@@ -406,6 +407,7 @@ class PageArchive {
                                ->inContentLanguage()->text();
                } else {
                        wfDebug( "Undelete: nothing undeleted...\n" );
+
                        return false;
                }
 
@@ -545,6 +547,7 @@ class PageArchive {
 
                        $status = Status::newGood( 0 );
                        $status->warning( "undelete-no-results" );
+
                        return $status;
                }
 
@@ -765,6 +768,7 @@ class SpecialUndelete extends SpecialPage {
                        if ( $user->isAllowed( 'browsearchive' ) ) {
                                $this->showSearchForm();
                        }
+
                        return;
                }
 
@@ -844,6 +848,7 @@ class SpecialUndelete extends SpecialPage {
 
                if ( $result->numRows() == 0 ) {
                        $out->addWikiMsg( 'undelete-no-results' );
+
                        return false;
                }
 
@@ -897,6 +902,7 @@ class SpecialUndelete extends SpecialPage {
 
                if ( !$rev ) {
                        $out->addWikiMsg( 'undeleterevision-missing' );
+
                        return;
                }
 
@@ -906,6 +912,7 @@ class SpecialUndelete extends SpecialPage {
                                        "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                        'rev-deleted-text-permission'
                                );
+
                                return;
                        }
 
@@ -1269,32 +1276,31 @@ class SpecialUndelete extends SpecialPage {
                                $unsuppressBox = '';
                        }
 
-                       $table =
-                               Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) .
-                                       Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
-                                       "<tr>
-                                               <td colspan='2' class='mw-undelete-extrahelp'>" .
-                                       $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
-                                       "</td>
-                               </tr>
-                               <tr>
-                                       <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
-                                       "</td>
-                                       <td class='mw-input'>" .
-                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment', 'autofocus' => true ) ) .
-                                       "</td>
-                               </tr>
-                               <tr>
-                                       <td>&#160;</td>
-                                       <td class='mw-submit'>" .
-                                       Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
-                                       Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
-                                       "</td>
-                               </tr>" .
-                                       $unsuppressBox .
-                                       Xml::closeElement( 'table' ) .
-                                       Xml::closeElement( 'fieldset' );
+                       $table = Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) .
+                               Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
+                               "<tr>
+                                       <td colspan='2' class='mw-undelete-extrahelp'>" .
+                               $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
+                               "</td>
+                       </tr>
+                       <tr>
+                               <td class='mw-label'>" .
+                               Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
+                               "</td>
+                               <td class='mw-input'>" .
+                               Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment', 'autofocus' => true ) ) .
+                               "</td>
+                       </tr>
+                       <tr>
+                               <td>&#160;</td>
+                               <td class='mw-submit'>" .
+                               Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
+                               Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
+                               "</td>
+                       </tr>" .
+                               $unsuppressBox .
+                               Xml::closeElement( 'table' ) .
+                               Xml::closeElement( 'fieldset' );
 
                        $out->addHTML( $table );
                }
index b686a5b..c897332 100644 (file)
@@ -41,14 +41,17 @@ class UnusedCategoriesPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'categorylinks' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_title' ),
-                       'conds' => array( 'cl_from IS NULL',
-                                       'page_namespace' => NS_CATEGORY,
-                                       'page_is_redirect' => 0 ),
-                       'join_conds' => array( 'categorylinks' => array(
-                                       'LEFT JOIN', 'cl_to = page_title' ) )
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title'
+                       ),
+                       'conds' => array(
+                               'cl_from IS NULL',
+                               'page_namespace' => NS_CATEGORY,
+                               'page_is_redirect' => 0
+                       ),
+                       'join_conds' => array( 'categorylinks' => array( 'LEFT JOIN', 'cl_to = page_title' ) )
                );
        }
 
@@ -67,6 +70,7 @@ class UnusedCategoriesPage extends QueryPage {
         */
        function formatResult( $skin, $result ) {
                $title = Title::makeTitle( NS_CATEGORY, $result->title );
+
                return Linker::link( $title, htmlspecialchars( $title->getText() ) );
        }
 
index d332db7..743c587 100644 (file)
@@ -47,28 +47,30 @@ class UnusedimagesPage extends ImageQueryPage {
                global $wgCountCategorizedImagesAsUsed;
                $retval = array(
                        'tables' => array( 'image', 'imagelinks' ),
-                       'fields' => array( 'namespace' => NS_FILE,
-                                       'title' => 'img_name',
-                                       'value' => 'img_timestamp',
-                                       'img_user', 'img_user_text',
-                                       'img_description' ),
+                       'fields' => array(
+                               'namespace' => NS_FILE,
+                               'title' => 'img_name',
+                               'value' => 'img_timestamp',
+                               'img_user', 'img_user_text',
+                               'img_description'
+                       ),
                        'conds' => array( 'il_to IS NULL' ),
-                       'join_conds' => array( 'imagelinks' => array(
-                                       'LEFT JOIN', 'il_to = img_name' ) )
+                       'join_conds' => array( 'imagelinks' => array( 'LEFT JOIN', 'il_to = img_name' ) )
                );
 
                if ( $wgCountCategorizedImagesAsUsed ) {
                        // Order is significant
                        $retval['tables'] = array( 'image', 'page', 'categorylinks',
-                                       'imagelinks' );
+                               'imagelinks' );
                        $retval['conds']['page_namespace'] = NS_FILE;
                        $retval['conds'][] = 'cl_from IS NULL';
                        $retval['conds'][] = 'img_name = page_title';
                        $retval['join_conds']['categorylinks'] = array(
-                                       'LEFT JOIN', 'cl_from = page_id' );
+                               'LEFT JOIN', 'cl_from = page_id' );
                        $retval['join_conds']['imagelinks'] = array(
-                                       'LEFT JOIN', 'il_to = page_title' );
+                               'LEFT JOIN', 'il_to = page_title' );
                }
+
                return $retval;
        }
 
index 1dc9f42..f7e7a31 100644 (file)
@@ -50,12 +50,16 @@ class UnusedtemplatesPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'templatelinks' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_title' ),
-                       'conds' => array( 'page_namespace' => NS_TEMPLATE,
-                                       'tl_from IS NULL',
-                                       'page_is_redirect' => 0 ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title'
+                       ),
+                       'conds' => array(
+                               'page_namespace' => NS_TEMPLATE,
+                               'tl_from IS NULL',
+                               'page_is_redirect' => 0
+                       ),
                        'join_conds' => array( 'templatelinks' => array(
                                'LEFT JOIN', array( 'tl_title = page_title',
                                        'tl_namespace = page_namespace' ) ) )
@@ -79,6 +83,7 @@ class UnusedtemplatesPage extends QueryPage {
                        SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() ),
                        $this->msg( 'unusedtemplateswlh' )->escaped()
                );
+
                return $this->getLanguage()->specialList( $pageLink, $wlhLink );
        }
 
index 954e3ff..ec2e7f5 100644 (file)
@@ -46,13 +46,16 @@ class UnwatchedpagesPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'watchlist' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_namespace' ),
-                       'conds' => array( 'wl_title IS NULL',
-                                       'page_is_redirect' => 0,
-                                       "page_namespace != '" . NS_MEDIAWIKI .
-                                       "'" ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_namespace'
+                       ),
+                       'conds' => array(
+                               'wl_title IS NULL',
+                               'page_is_redirect' => 0,
+                               "page_namespace != '" . NS_MEDIAWIKI . "'"
+                       ),
                        'join_conds' => array( 'watchlist' => array(
                                'LEFT JOIN', array( 'wl_title = page_title',
                                        'wl_namespace = page_namespace' ) ) )
index 4dbbdad..521b361 100644 (file)
@@ -179,6 +179,7 @@ class SpecialUpload extends SpecialPage {
                        # Backwards compatibility hook
                        if ( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) ) {
                                wfDebug( "Hook 'UploadForm:initial' broke output of the upload form" );
+
                                return;
                        }
                        $this->showUploadForm( $this->getUploadForm() );
@@ -206,7 +207,6 @@ class SpecialUpload extends SpecialPage {
                } else {
                        $this->getOutput()->addHTML( $form );
                }
-
        }
 
        /**
@@ -401,6 +401,7 @@ class SpecialUpload extends SpecialPage {
                $status = $this->mUpload->fetchFile();
                if ( !$status->isOK() ) {
                        $this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
+
                        return;
                }
 
@@ -418,6 +419,7 @@ class SpecialUpload extends SpecialPage {
                $details = $this->mUpload->verifyUpload();
                if ( $details['status'] != UploadBase::OK ) {
                        $this->processVerificationError( $details );
+
                        return;
                }
 
@@ -426,6 +428,7 @@ class SpecialUpload extends SpecialPage {
                if ( $permErrors !== true ) {
                        $code = array_shift( $permErrors[0] );
                        $this->showRecoverableUploadError( $this->msg( $code, $permErrors[0] )->parse() );
+
                        return;
                }
 
@@ -449,6 +452,7 @@ class SpecialUpload extends SpecialPage {
                $status = $this->mUpload->performUpload( $this->mComment, $pageText, $this->mWatchthis, $this->getUser() );
                if ( !$status->isGood() ) {
                        $this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
+
                        return;
                }
 
@@ -500,6 +504,7 @@ class SpecialUpload extends SpecialPage {
                                $pageText = $comment;
                        }
                }
+
                return $pageText;
        }
 
@@ -629,6 +634,7 @@ class SpecialUpload extends SpecialPage {
                $success = $this->mUpload->unsaveUploadedFile();
                if ( !$success ) {
                        $this->getOutput()->showFileDeleteError( $this->mUpload->getTempPath() );
+
                        return false;
                } else {
                        return true;
@@ -707,6 +713,7 @@ class SpecialUpload extends SpecialPage {
                foreach ( $dupes as $file ) {
                        $gallery->add( $file->getTitle() );
                }
+
                return '<li>' .
                        wfMessage( 'file-exists-duplicate' )->numParams( count( $dupes ) )->parse() .
                        $gallery->toHtml() . "</li>\n";
@@ -741,8 +748,7 @@ class UploadForm extends HTMLForm {
        public function __construct( array $options = array(), IContextSource $context = null ) {
                $this->mWatch = !empty( $options['watch'] );
                $this->mForReUpload = !empty( $options['forreupload'] );
-               $this->mSessionKey = isset( $options['sessionkey'] )
-                               ? $options['sessionkey'] : '';
+               $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
                $this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
                $this->mDestWarningAck = !empty( $options['destwarningack'] );
                $this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
@@ -778,7 +784,6 @@ class UploadForm extends HTMLForm {
                                $this->mSourceIds[] = $field['id'];
                        }
                }
-
        }
 
        /**
@@ -839,8 +844,8 @@ class UploadForm extends HTMLForm {
                        'upload-type' => 'File',
                        'radio' => &$radio,
                        'help' => $this->msg( 'upload-maxfilesize',
-                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] ) )
-                               ->parse() .
+                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
+                       )->parse() .
                                $this->msg( 'word-separator' )->escaped() .
                                $this->msg( 'upload_source_file' )->escaped(),
                        'checked' => $selectedSourceType == 'file',
@@ -857,8 +862,8 @@ class UploadForm extends HTMLForm {
                                'upload-type' => 'url',
                                'radio' => &$radio,
                                'help' => $this->msg( 'upload-maxfilesize',
-                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] ) )
-                                       ->parse() .
+                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
+                               )->parse() .
                                        $this->msg( 'word-separator' )->escaped() .
                                        $this->msg( 'upload_source_url' )->escaped(),
                                'checked' => $selectedSourceType == 'url',
@@ -872,6 +877,7 @@ class UploadForm extends HTMLForm {
                        'default' => $this->getExtensionsMessage(),
                        'raw' => true,
                );
+
                return $descriptor;
        }
 
@@ -884,7 +890,7 @@ class UploadForm extends HTMLForm {
                # Print a list of allowed file extensions, if so configured.  We ignore
                # MIME type here, it's incomprehensible to most people and too long.
                global $wgCheckFileExtensions, $wgStrictFileExtensions,
-               $wgFileExtensions, $wgFileBlacklist;
+                  $wgFileExtensions, $wgFileBlacklist;
 
                if ( $wgCheckFileExtensions ) {
                        if ( $wgStrictFileExtensions ) {
@@ -907,6 +913,7 @@ class UploadForm extends HTMLForm {
                        # Everything is permitted.
                        $extensionsList = '';
                }
+
                return $extensionsList;
        }
 
@@ -1102,7 +1109,6 @@ class UploadForm extends HTMLForm {
        function trySubmit() {
                return false;
        }
-
 }
 
 /**
index 37bfa39..16c348f 100644 (file)
@@ -66,6 +66,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                if ( $subPage === null || $subPage === '' ) {
                        return $this->showUploads();
                }
+
                return $this->showUpload( $subPage );
        }
 
@@ -136,10 +137,11 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                        $handler = $file->getHandler();
                        if ( $handler ) {
                                $params = $handler->parseParamString( $paramString );
+
                                return array( 'file' => $file, 'type' => $type, 'params' => $params );
                        } else {
                                throw new UploadStashBadPathException( 'No handler found for ' .
-                                               "mime {$file->getMimeType()} of file {$file->getPath()}" );
+                                       "mime {$file->getMimeType()} of file {$file->getPath()}" );
                        }
                }
 
@@ -204,7 +206,6 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                }
 
                return $this->outputLocalFile( $thumbFile );
-
        }
 
        /**
@@ -214,9 +215,9 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * Note: We rely on NFS to have propagated the file contents to the scaler. However, we do not rely on the thumbnail being created in NFS and then
         *   propagated back to our filesystem. Instead we take the results of the HTTP request instead.
         * Note: no caching is being done here, although we are instructing the client to cache it forever.
-        * @param $file: File object
-        * @param $params: scaling parameters ( e.g. array( width => '50' ) );
-        * @param $flags: scaling flags ( see File:: constants )
+        * @param File $file
+        * @param array $params Scaling parameters ( e.g. array( width => '50' ) );
+        * @param $flags Scaling flags ( see File:: constants )
         * @throws MWException
         * @return boolean success
         */
@@ -248,16 +249,17 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                );
                $req = MWHttpRequest::factory( $scalerThumbUrl, $httpOptions );
                $status = $req->execute();
-               if ( ! $status->isOK() ) {
+               if ( !$status->isOK() ) {
                        $errors = $status->getErrorsArray();
                        $errorStr = "Fetching thumbnail failed: " . print_r( $errors, 1 );
                        $errorStr .= "\nurl = $scalerThumbUrl\n";
                        throw new MWException( $errorStr );
                }
                $contentType = $req->getResponseHeader( "content-type" );
-               if ( ! $contentType ) {
+               if ( !$contentType ) {
                        throw new MWException( "Missing content-type header" );
                }
+
                return $this->outputContents( $req->getContent(), $contentType );
        }
 
@@ -273,6 +275,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                if ( $file->getSize() > self::MAX_SERVE_BYTES ) {
                        throw new SpecialUploadStashTooLargeException();
                }
+
                return $file->getRepo()->streamFile( $file->getPath(),
                        array( 'Content-Transfer-Encoding: binary',
                                'Expires: Sun, 17-Jan-2038 19:14:07 GMT' )
@@ -294,6 +297,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                }
                self::outputFileHeaders( $contentType, $size );
                print $content;
+
                return true;
        }
 
@@ -301,8 +305,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * Output headers for streaming
         * XXX unsure about encoding as binary; if we received from HTTP perhaps we should use that encoding, concatted with semicolon to mimeType as it usually is.
         * Side effect: preps PHP to write headers to STDOUT.
-        * @param string $contentType : string suitable for content-type header
-        * @param string $size: length in bytes
+        * @param string $contentType String suitable for content-type header
+        * @param string $size Length in bytes
         */
        private static function outputFileHeaders( $contentType, $size ) {
                header( "Content-Type: $contentType", true );
@@ -325,10 +329,12 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                if ( isset( $formData['Clear'] ) ) {
                        $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
                        wfDebug( "stash has: " . print_r( $stash->listFiles(), true ) );
-                       if ( ! $stash->clear() ) {
+
+                       if ( !$stash->clear() ) {
                                return Status::newFatal( 'uploadstash-errclear' );
                        }
                }
+
                return Status::newGood();
        }
 
@@ -390,4 +396,6 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        }
 }
 
-class SpecialUploadStashTooLargeException extends MWException {};
+class SpecialUploadStashTooLargeException extends MWException {
+}
+
index 1c9fed7..ec7bfa4 100644 (file)
@@ -101,7 +101,7 @@ class LoginForm extends SpecialPage {
                $this->mCookieCheck = $request->getVal( 'wpCookieCheck' );
                $this->mPosted = $request->wasPosted();
                $this->mCreateaccountMail = $request->getCheck( 'wpCreateaccountMail' )
-                                                                       && $wgEnableEmail;
+                       && $wgEnableEmail;
                $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' ) && !$this->mCreateaccountMail;
                $this->mLoginattempt = $request->getCheck( 'wpLoginattempt' );
                $this->mAction = $request->getVal( 'action' );
@@ -134,9 +134,10 @@ class LoginForm extends SpecialPage {
                # 2. Do not return to PasswordReset after a successful password change
                #    but goto Wiki start page (Main_Page) instead ( bug 33997 )
                $returnToTitle = Title::newFromText( $this->mReturnTo );
-               if ( is_object( $returnToTitle ) && (
-                       $returnToTitle->isSpecial( 'Userlogout' )
-                       || $returnToTitle->isSpecial( 'PasswordReset' ) ) ) {
+               if ( is_object( $returnToTitle )
+                       && ( $returnToTitle->isSpecial( 'Userlogout' )
+                               || $returnToTitle->isSpecial( 'PasswordReset' ) )
+               ) {
                        $this->mReturnTo = '';
                        $this->mReturnToQuery = '';
                }
@@ -183,6 +184,7 @@ class LoginForm extends SpecialPage {
                                $this->getOutput()->redirect( $url );
                                // Since we only do this redir to change proto, always vary
                                $this->getOutput()->addVaryHeader( 'X-Forwarded-Proto' );
+
                                return;
                        } else {
                                // A wiki without HTTPS login support should set $wgServer to
@@ -196,16 +198,20 @@ class LoginForm extends SpecialPage {
 
                if ( !is_null( $this->mCookieCheck ) ) {
                        $this->onCookieRedirectCheck( $this->mCookieCheck );
+
                        return;
                } elseif ( $this->mPosted ) {
                        if ( $this->mCreateaccount ) {
                                $this->addNewAccount();
+
                                return;
                        } elseif ( $this->mCreateaccountMail ) {
                                $this->addNewAccountMailPassword();
+
                                return;
                        } elseif ( ( 'submitlogin' == $this->mAction ) || $this->mLoginattempt ) {
                                $this->processLogin();
+
                                return;
                        }
                }
@@ -218,6 +224,7 @@ class LoginForm extends SpecialPage {
        function addNewAccountMailPassword() {
                if ( $this->mEmail == '' ) {
                        $this->mainLoginForm( $this->msg( 'noemailcreate' )->escaped() );
+
                        return;
                }
 
@@ -225,6 +232,7 @@ class LoginForm extends SpecialPage {
                if ( !$status->isGood() ) {
                        $error = $status->getMessage();
                        $this->mainLoginForm( $error->toString() );
+
                        return;
                }
 
@@ -261,6 +269,7 @@ class LoginForm extends SpecialPage {
                if ( !$status->isGood() ) {
                        $error = $status->getMessage();
                        $this->mainLoginForm( $error->toString() );
+
                        return false;
                }
 
@@ -324,6 +333,7 @@ class LoginForm extends SpecialPage {
                        wfRunHooks( 'AddNewAccount', array( $u, false ) );
                        $u->addNewUserLogEntry( 'create2', $this->mReason );
                }
+
                return true;
        }
 
@@ -366,6 +376,7 @@ class LoginForm extends SpecialPage {
                # Request forgery checks.
                if ( !self::getCreateaccountToken() ) {
                        self::setCreateaccountToken();
+
                        return Status::newFatal( 'nocookiesfornew' );
                }
 
@@ -387,6 +398,7 @@ class LoginForm extends SpecialPage {
                } elseif ( $creationBlock instanceof Block ) {
                        // Throws an ErrorPageError.
                        $this->userBlockedMessage( $creationBlock );
+
                        // This should never be reached.
                        return false;
                }
@@ -394,7 +406,7 @@ class LoginForm extends SpecialPage {
                # Include checks that will include GlobalBlocking (Bug 38333)
                $permErrors = $this->getPageTitle()->getUserPermissionsErrors( 'createaccount', $currentUser, true );
                if ( count( $permErrors ) ) {
-                               throw new PermissionsError( 'createaccount', $permErrors );
+                       throw new PermissionsError( 'createaccount', $permErrors );
                }
 
                $ip = $this->getRequest()->getIP();
@@ -432,6 +444,7 @@ class LoginForm extends SpecialPage {
                                if ( !is_array( $valid ) ) {
                                        $valid = array( $valid, $wgMinimalPasswordLength );
                                }
+
                                return call_user_func_array( 'Status::newFatal', $valid );
                        }
                }
@@ -463,6 +476,7 @@ class LoginForm extends SpecialPage {
                                // To return a different error code, return a Status object.
                                $abortError = new Message( 'createaccount-hook-aborted', array( $abortError ) );
                                $abortError->text();
+
                                return Status::newFatal( $abortError );
                        } else {
                                // For MediaWiki 1.23+ and updated hooks, return the Status object
@@ -493,6 +507,7 @@ class LoginForm extends SpecialPage {
                }
 
                self::clearCreateaccountToken();
+
                return $this->initUser( $u, false );
        }
 
@@ -560,6 +575,7 @@ class LoginForm extends SpecialPage {
                // If the user doesn't have a login token yet, set one.
                if ( !self::getLoginToken() ) {
                        self::setLoginToken();
+
                        return self::NEED_TOKEN;
                }
                // If the user didn't pass a login token, tell them we need one
@@ -585,6 +601,7 @@ class LoginForm extends SpecialPage {
                // will effectively be using stale data.
                if ( $this->getUser()->getName() === $this->mUsername ) {
                        wfDebug( __METHOD__ . ": already logged in as {$this->mUsername}\n" );
+
                        return self::SUCCESS;
                }
 
@@ -610,6 +627,7 @@ class LoginForm extends SpecialPage {
                $msg = null;
                if ( !wfRunHooks( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$msg ) ) ) {
                        $this->mAbortLoginErrorMsg = $msg;
+
                        return $abort;
                }
 
@@ -674,6 +692,7 @@ class LoginForm extends SpecialPage {
                        $retval = self::SUCCESS;
                }
                wfRunHooks( 'LoginAuthenticateAudit', array( $u, $this->mPassword, $retval ) );
+
                return $retval;
        }
 
@@ -732,17 +751,23 @@ class LoginForm extends SpecialPage {
 
                if ( $this->getUser()->isBlockedFromCreateAccount() ) {
                        wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
+
                        return self::CREATE_BLOCKED;
                }
+
                if ( !$wgAuth->autoCreate() ) {
                        return self::NOT_EXISTS;
                }
+
                if ( !$wgAuth->userExists( $user->getName() ) ) {
                        wfDebug( __METHOD__ . ": user does not exist\n" );
+
                        return self::NOT_EXISTS;
                }
+
                if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
                        wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
+
                        return self::WRONG_PLUGIN_PASS;
                }
 
@@ -751,6 +776,7 @@ class LoginForm extends SpecialPage {
                        // Hook point to add extra creation throttles and blocks
                        wfDebug( "LoginForm::attemptAutoCreate: a hook blocked creation: $abortError\n" );
                        $this->mAbortLoginErrorMsg = $abortError;
+
                        return self::ABORTED;
                }
 
@@ -760,6 +786,7 @@ class LoginForm extends SpecialPage {
                if ( !$status->isOK() ) {
                        $errors = $status->getErrorsByType( 'error' );
                        $this->mAbortLoginErrorMsg = $errors[0]['message'];
+
                        return self::ABORTED;
                }
 
@@ -768,7 +795,7 @@ class LoginForm extends SpecialPage {
 
        function processLogin() {
                global $wgMemc, $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle,
-                       $wgInvalidPasswordReset;
+                          $wgInvalidPasswordReset;
 
                switch ( $this->authenticateUserData() ) {
                        case self::SUCCESS:
@@ -870,8 +897,8 @@ class LoginForm extends SpecialPage {
                        case self::THROTTLED:
                                $error = $this->mAbortLoginErrorMsg ?: 'login-throttled';
                                $this->mainLoginForm( $this->msg( $error )
-                               ->params ( $this->getLanguage()->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) )
-                               ->text()
+                                       ->params( $this->getLanguage()->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) )
+                                       ->text()
                                );
                                break;
                        case self::USER_BLOCKED:
@@ -1133,6 +1160,7 @@ class LoginForm extends SpecialPage {
                                throw new PermissionsError( 'createaccount', $permErrors );
                        } elseif ( $user->isBlockedFromCreateAccount() ) {
                                $this->userBlockedMessage( $user->isBlockedFromCreateAccount() );
+
                                return;
                        } elseif ( wfReadOnly() ) {
                                throw new ReadOnlyError;
@@ -1324,6 +1352,7 @@ class LoginForm extends SpecialPage {
         */
        function hasSessionCookie() {
                global $wgDisableCookieCheck;
+
                return $wgDisableCookieCheck ? true : $this->getRequest()->checkSessionCookie();
        }
 
@@ -1333,6 +1362,7 @@ class LoginForm extends SpecialPage {
         */
        public static function getLoginToken() {
                global $wgRequest;
+
                return $wgRequest->getSessionData( 'wsLoginToken' );
        }
 
@@ -1360,6 +1390,7 @@ class LoginForm extends SpecialPage {
         */
        public static function getCreateaccountToken() {
                global $wgRequest;
+
                return $wgRequest->getSessionData( 'wsCreateaccountToken' );
        }
 
@@ -1442,6 +1473,7 @@ class LoginForm extends SpecialPage {
                                        $links[] = $this->makeLanguageSelectorLink( $parts[0], trim( $parts[1] ) );
                                }
                        }
+
                        return count( $links ) > 0 ? $this->msg( 'loginlanguagelabel' )->rawParams(
                                $this->getLanguage()->pipeList( $links ) )->escaped() : '';
                } else {
index 3ef8f8b..e0878f1 100644 (file)
@@ -55,6 +55,7 @@ class UserrightsPage extends SpecialPage {
                if ( $user->getId() == 0 ) {
                        return false;
                }
+
                return !empty( $available['add'] )
                        || !empty( $available['remove'] )
                        || ( ( $this->isself || !$checkIfSelf ) &&
@@ -118,6 +119,7 @@ class UserrightsPage extends SpecialPage {
                                $out = $this->getOutput();
                                $out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
                                $out->returnToMain();
+
                                return;
                        }
 
@@ -148,6 +150,7 @@ class UserrightsPage extends SpecialPage {
                        $status = $this->fetchUser( $this->mTarget );
                        if ( !$status->isOK() ) {
                                $this->getOutput()->addWikiText( $status->getWikiText() );
+
                                return;
                        }
 
@@ -166,6 +169,7 @@ class UserrightsPage extends SpecialPage {
                                );
 
                                $out->redirect( $this->getSuccessURL() );
+
                                return;
                        }
                }
@@ -266,6 +270,7 @@ class UserrightsPage extends SpecialPage {
                if ( $newGroups != $oldGroups ) {
                        $this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
                }
+
                return array( $add, $remove );
        }
 
@@ -293,6 +298,7 @@ class UserrightsPage extends SpecialPage {
                $status = $this->fetchUser( $username );
                if ( !$status->isOK() ) {
                        $this->getOutput()->addWikiText( $status->getWikiText() );
+
                        return;
                } else {
                        $user = $status->value;
@@ -486,10 +492,10 @@ class UserrightsPage extends SpecialPage {
                }
 
                $userToolLinks = Linker::userToolLinks(
-                               $user->getId(),
-                               $user->getName(),
-                               false, /* default for redContribsWhenNoEdits */
-                               Linker::TOOL_LINKS_EMAIL /* Add "send e-mail" link */
+                       $user->getId(),
+                       $user->getName(),
+                       false, /* default for redContribsWhenNoEdits */
+                       Linker::TOOL_LINKS_EMAIL /* Add "send e-mail" link */
                );
 
                $this->getOutput()->addHTML(
@@ -640,6 +646,7 @@ class UserrightsPage extends SpecialPage {
        private function canRemove( $group ) {
                // $this->changeableGroups()['remove'] doesn't work, of course. Thanks, PHP.
                $groups = $this->changeableGroups();
+
                return in_array( $group, $groups['remove'] ) || ( $this->isself && in_array( $group, $groups['remove-self'] ) );
        }
 
@@ -649,6 +656,7 @@ class UserrightsPage extends SpecialPage {
         */
        private function canAdd( $group ) {
                $groups = $this->changeableGroups();
+
                return in_array( $group, $groups['add'] ) || ( $this->isself && in_array( $group, $groups['add-self'] ) );
        }
 
index d509f21..98b30b7 100644 (file)
@@ -255,6 +255,7 @@ class SpecialVersion extends SpecialPage {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $version;
        }
 
@@ -283,6 +284,7 @@ class SpecialVersion extends SpecialPage {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $v;
        }
 
@@ -323,6 +325,7 @@ class SpecialVersion extends SpecialPage {
                        preg_match( "/^(\d+\.\d+)/", $wgVersion, $versionParts );
                        $versionUrl = "https://www.mediawiki.org/wiki/MediaWiki_{$versionParts[1]}";
                }
+
                return "[$versionUrl $wgVersion]";
        }
 
@@ -396,6 +399,7 @@ class SpecialVersion extends SpecialPage {
         */
        public static function getExtensionTypeName( $type ) {
                $types = self::getExtensionTypes();
+
                return isset( $types[$type] ) ? $types[$type] : $types['other'];
        }
 
@@ -469,7 +473,7 @@ class SpecialVersion extends SpecialPage {
                                )
                        );
 
-                       array_walk( $tags, function( &$value ) {
+                       array_walk( $tags, function ( &$value ) {
                                $value = '&lt;' . htmlentities( $value ) . '&gt;';
                        } );
                        $out .= $this->listToText( $tags );
@@ -633,9 +637,9 @@ class SpecialVersion extends SpecialPage {
 
                        if ( $vcsDate ) {
                                $vcsTimeString = Html::element( 'span',
-                                               array( 'class' => 'mw-version-ext-vcs-timestamp' ),
-                                               $this->getLanguage()->timeanddate( $vcsDate )
-                                       );
+                                       array( 'class' => 'mw-version-ext-vcs-timestamp' ),
+                                       $this->getLanguage()->timeanddate( $vcsDate )
+                               );
                                $versionString .= " {$vcsTimeString}";
                        }
                        $versionString = Html::rawElement( 'span',
@@ -784,6 +788,7 @@ class SpecialVersion extends SpecialPage {
         */
        private function IPInfo() {
                $ip = str_replace( '--', ' - ', htmlspecialchars( $this->getRequest()->getIP() ) );
+
                return "<!-- visited from $ip -->\n<span style='display:none'>visited from $ip</span>";
        }
 
@@ -824,13 +829,11 @@ class SpecialVersion extends SpecialPage {
                                        $text = $this->msg( 'version-poweredby-others' )->text();
                                }
                                $list[] = $text;
-
                        } elseif ( substr( $item, -5 ) == ' ...]' ) {
                                $hasOthers = true;
                                $list[] = $this->getOutput()->parseInline(
                                        substr( $item, 0, -4 ) . $this->msg( 'version-poweredby-others' )->text() . "]"
                                );
-
                        } else {
                                $list[] = $this->getOutput()->parseInline( $item );
                        }
@@ -850,7 +853,7 @@ class SpecialVersion extends SpecialPage {
         * Obtains the full path of an extensions authors or credits file if
         * one exists.
         *
-        * @param string $extDir: Path to the extensions root directory
+        * @param string $extDir Path to the extensions root directory
         *
         * @since 1.23
         *
@@ -879,7 +882,7 @@ class SpecialVersion extends SpecialPage {
         * Obtains the full path of an extensions copying or license file if
         * one exists.
         *
-        * @param string $extDir: Path to the extensions root directory
+        * @param string $extDir Path to the extensions root directory
         *
         * @since 1.23
         *
@@ -924,6 +927,7 @@ class SpecialVersion extends SpecialPage {
                        if ( $sort ) {
                                sort( $list );
                        }
+
                        return $this->getLanguage()->listToText( array_map( array( __CLASS__, 'arrayToString' ), $list ) );
                }
        }
@@ -942,6 +946,7 @@ class SpecialVersion extends SpecialPage {
                }
                if ( is_object( $list ) ) {
                        $class = wfMessage( 'parentheses' )->params( get_class( $list ) )->escaped();
+
                        return $class;
                } elseif ( !is_array( $list ) ) {
                        return $list;
@@ -951,6 +956,7 @@ class SpecialVersion extends SpecialPage {
                        } else {
                                $class = $list[0];
                        }
+
                        return wfMessage( 'parentheses' )->params( "$class, {$list[1]}" )->escaped();
                }
        }
@@ -1063,6 +1069,7 @@ class SpecialVersion extends SpecialPage {
         */
        public static function getGitHeadSha1( $dir ) {
                $repo = new GitInfo( $dir );
+
                return $repo->getHeadSHA1();
        }
 
@@ -1111,11 +1118,11 @@ class SpecialVersion extends SpecialPage {
                }
 
                $out .= Html::closeElement( 'table' );
+
                return $out;
        }
 
        protected function getGroupName() {
                return 'wiki';
        }
-
 }
index 51d9af3..b8c0bb2 100644 (file)
@@ -38,9 +38,11 @@ class WantedCategoriesPage extends WantedQueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'categorylinks', 'page' ),
-                       'fields' => array( 'namespace' => NS_CATEGORY,
-                                       'title' => 'cl_to',
-                                       'value' => 'COUNT(*)' ),
+                       'fields' => array(
+                               'namespace' => NS_CATEGORY,
+                               'title' => 'cl_to',
+                               'value' => 'COUNT(*)'
+                       ),
                        'conds' => array( 'page_title IS NULL' ),
                        'options' => array( 'GROUP BY' => 'cl_to' ),
                        'join_conds' => array( 'page' => array( 'LEFT JOIN',
@@ -73,7 +75,7 @@ class WantedCategoriesPage extends WantedQueryPage {
                        __METHOD__
                );
                foreach ( $categoryRes as $row ) {
-                       $this->currentCategoryCounts[ $row->cat_title ] = intval( $row->cat_pages );
+                       $this->currentCategoryCounts[$row->cat_title] = intval( $row->cat_pages );
                }
 
                // Back to start for display
@@ -104,8 +106,8 @@ class WantedCategoriesPage extends WantedQueryPage {
                } else {
                        $plink = Linker::link( $nt, $text );
 
-                       $currentValue = isset( $this->currentCategoryCounts[ $result->title ] )
-                               ? $this->currentCategoryCounts[ $result->title ]
+                       $currentValue = isset( $this->currentCategoryCounts[$result->title] )
+                               ? $this->currentCategoryCounts[$result->title]
                                : 0;
 
                        // If the category has been created or emptied since the list was refreshed, strike it
index b5c1fdb..fa68504 100644 (file)
@@ -75,9 +75,11 @@ class WantedFilesPage extends WantedQueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'imagelinks', 'image' ),
-                       'fields' => array( 'namespace' => NS_FILE,
-                                       'title' => 'il_to',
-                                       'value' => 'COUNT(*)' ),
+                       'fields' => array(
+                               'namespace' => NS_FILE,
+                               'title' => 'il_to',
+                               'value' => 'COUNT(*)'
+                       ),
                        'conds' => array( 'img_name IS NULL' ),
                        'options' => array( 'GROUP BY' => 'il_to' ),
                        'join_conds' => array( 'image' =>
index acec4ea..c54d9f4 100644 (file)
@@ -69,8 +69,7 @@ class WantedPagesPage extends WantedQueryPage {
                        ),
                        'conds' => array(
                                'pg1.page_namespace IS NULL',
-                               "pl_namespace NOT IN ( '" . NS_USER .
-                                       "', '" . NS_USER_TALK . "' )",
+                               "pl_namespace NOT IN ( '" . NS_USER . "', '" . NS_USER_TALK . "' )",
                                "pg2.page_namespace != '" . NS_MEDIAWIKI . "'"
                        ),
                        'options' => array(
@@ -89,6 +88,7 @@ class WantedPagesPage extends WantedQueryPage {
                );
                // Replacement for the WantedPages::getSQL hook
                wfRunHooks( 'WantedPages::getQueryInfo', array( &$this, &$query ) );
+
                return $query;
        }
 
index d13fa03..550e2e3 100644 (file)
@@ -40,16 +40,19 @@ class WantedTemplatesPage extends WantedQueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'templatelinks', 'page' ),
-                       'fields' => array( 'namespace' => 'tl_namespace',
-                                       'title' => 'tl_title',
-                                       'value' => 'COUNT(*)' ),
-                       'conds' => array( 'page_title IS NULL',
-                                       'tl_namespace' => NS_TEMPLATE ),
-                       'options' => array(
-                               'GROUP BY' => array( 'tl_namespace', 'tl_title' ) ),
+                       'fields' => array(
+                               'namespace' => 'tl_namespace',
+                               'title' => 'tl_title',
+                               'value' => 'COUNT(*)'
+                       ),
+                       'conds' => array(
+                               'page_title IS NULL',
+                               'tl_namespace' => NS_TEMPLATE
+                       ),
+                       'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) ),
                        'join_conds' => array( 'page' => array( 'LEFT JOIN',
-                                       array( 'page_namespace = tl_namespace',
-                                               'page_title = tl_title' ) ) )
+                               array( 'page_namespace = tl_namespace',
+                                       'page_title = tl_title' ) ) )
                );
        }
 
index 4c3f17b..68a514c 100644 (file)
@@ -58,6 +58,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        }
 
                        $output->redirect( $title->getLocalURL() );
+
                        return;
                }
 
@@ -66,11 +67,13 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $user = $this->getUser();
                $opts = $this->getOptions();
 
-               if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
-                       $request->wasPosted() )
-               {
+               if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker )
+                       && $request->getVal( 'reset' )
+                       && $request->wasPosted()
+               ) {
                        $user->clearAllNotifications();
                        $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) );
+
                        return;
                }
 
@@ -145,6 +148,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                // methods defined on WebRequest and removing this dependency would cause some code duplication.
                $request = new DerivativeRequest( $this->getRequest(), $params );
                $opts->fetchValuesFromRequest( $request );
+
                return $opts;
        }
 
@@ -379,7 +383,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( $opts['days'] > 0 ) {
                        $timestamp = wfTimestampNow();
                        $wlInfo = $this->msg( 'wlnote2' )->numParams( round( $opts['days'] * 24 ) )->params(
-                               $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
+                               $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user )
+                       )->parse() . "<br />\n";
                }
 
                $nondefaults = $opts->getChangedValues();
@@ -557,6 +562,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                foreach ( $days as $d ) {
                        $days[$i++] = $this->daysLink( $d, $options );
                }
+
                return $this->msg( 'wlshowlast' )->rawParams(
                        $this->getLanguage()->pipeList( $hours ),
                        $this->getLanguage()->pipeList( $days ),
index 176fbd4..2e07309 100644 (file)
@@ -79,6 +79,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $this->target = Title::newFromURL( $opts->getValue( 'target' ) );
                if ( !$this->target ) {
                        $out->addHTML( $this->whatlinkshereForm() );
+
                        return;
                }
 
@@ -158,7 +159,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        'rd_namespace' => $target->getNamespace(),
                        'rd_title' => $target->getDBkey(),
                        'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
-               )));
+               ) ) );
 
                if ( $fetchlinks ) {
                        $options['ORDER BY'] = 'pl_from';
@@ -197,6 +198,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                                        $out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
                                }
                        }
+
                        return;
                }
 
@@ -270,7 +272,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $out->addHTML( $this->listEnd() );
 
                if ( $level == 0 ) {
-                       if( !$this->including() ){
+                       if ( !$this->including() ) {
                                $out->addHTML( $prevnext );
                        }
                }
@@ -414,7 +416,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                # Target input
                $f .= Xml::inputLabel( $this->msg( 'whatlinkshere-page' )->text(), 'target',
-                               'mw-whatlinkshere-target', 40, $target );
+                       'mw-whatlinkshere-target', 40, $target );
 
                $f .= ' ';
 
@@ -469,6 +471,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        $links[] = $this->msg( "whatlinkshere-{$type}" )->rawParams(
                                $this->makeSelfLink( $msg, array_merge( $changed, $overrides ) ) )->escaped();
                }
+
                return Xml::fieldset( $this->msg( 'whatlinkshere-filters' )->text(), $this->getLanguage()->pipeList( $links ) );
        }
 
index 2ddde43..edb1558 100644 (file)
@@ -80,19 +80,23 @@ class WithoutInterwikiPage extends PageQueryPage {
        function getQueryInfo() {
                $query = array(
                        'tables' => array( 'page', 'langlinks' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_title' ),
-                       'conds' => array( 'll_title IS NULL',
-                                       'page_namespace' => MWNamespace::getContentNamespaces(),
-                                       'page_is_redirect' => 0 ),
-                       'join_conds' => array( 'langlinks' => array(
-                                       'LEFT JOIN', 'll_from = page_id' ) )
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title'
+                       ),
+                       'conds' => array(
+                               'll_title IS NULL',
+                               'page_namespace' => MWNamespace::getContentNamespaces(),
+                               'page_is_redirect' => 0
+                       ),
+                       'join_conds' => array( 'langlinks' => array( 'LEFT JOIN', 'll_from = page_id' ) )
                );
                if ( $this->prefix ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        $query['conds'][] = 'page_title ' . $dbr->buildLike( $this->prefix, $dbr->anyString() );
                }
+
                return $query;
        }
 
index 006f2da..7aee48e 100644 (file)
@@ -111,7 +111,7 @@ $messages = array(
 'tog-previewontop' => 'Папярэдні паказ — над рэдактарскім полем',
 'tog-previewonfirst' => 'Папярэдні паказ пры першай праўцы',
 'tog-enotifwatchlistpages' => 'Слаць мне эл.пошту, калі мяняецца старонка ў маім спісе назірання',
-'tog-enotifusertalkpages' => 'СлаÑ\86Ñ\8c Ñ\8dл.поÑ\88Ñ\82Ñ\83 Ð¿Ñ\80а Ð¼ÐµÐ½Ñ\8b Ñ\9e Ð¼Ð°Ñ\91й Ñ\80азмоÑ\9eнай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b',
+'tog-enotifusertalkpages' => 'Ð\9fаведамлÑ\8fÑ\86Ñ\8c Ð¼Ð½Ðµ Ð½Ð° Ñ\8dл.поÑ\88Ñ\82Ñ\83 Ð°Ð± Ð·Ð¼ÐµÐ½Ð°Ñ\85 Ð½Ð° Ð¼Ð°Ñ\91й Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ñ\80азмоÑ\9e',
 'tog-enotifminoredits' => 'Паведамяць мне на эл.пошту пра дробныя праўкі старонак і файлаў',
 'tog-enotifrevealaddr' => 'Не скрываць майго адрасу эл.пошты ў паведамленнях',
 'tog-shownumberswatching' => 'Паказваць колькасць назіральнікаў',
@@ -1342,7 +1342,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|змена|змены|змен}}',
 'recentchanges' => 'Апошнія змены',
 'recentchanges-legend' => 'Магчымасці паказу',
-'recentchanges-summary' => 'Гэта апошнія мены на пляцоўцы {{SITENAME}}.',
+'recentchanges-summary' => 'Ð\93Ñ\8dÑ\82а Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\8f Ð·Ð¼ÐµÐ½Ñ\8b Ð½Ð° Ð¿Ð»Ñ\8fÑ\86оÑ\9eÑ\86Ñ\8b {{SITENAME}}.',
 'recentchanges-feed-description' => 'Сачыць за найбольш актуальнымі змяненнямі ў віксе праз гэты струмень навін.',
 'recentchanges-label-newpage' => 'Гэтай праўкай была створана новая старонка',
 'recentchanges-label-minor' => 'Гэта дробная па значэнні праўка',
@@ -1987,7 +1987,7 @@ $1',
 'enotif_mailer' => 'Апавяшчальнік {{SITENAME}}',
 'enotif_reset' => 'Пазначыць усе старонкі як наведаныя',
 'enotif_impersonal_salutation' => 'Шаноўны ўдзельнік {{SITENAME}}',
-'enotif_lastvisited' => 'Гл. $1 каб бачыць усе мены пасля вашага апошняга наведвання.',
+'enotif_lastvisited' => 'Ð\93л. $1 ÐºÐ°Ð± Ð±Ð°Ñ\87Ñ\8bÑ\86Ñ\8c Ñ\83Ñ\81е Ð·Ð¼ÐµÐ½Ñ\8b Ð¿Ð°Ñ\81лÑ\8f Ð²Ð°Ñ\88ага Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ð½Ð°Ð²ÐµÐ´Ð²Ð°Ð½Ð½Ñ\8f.',
 'enotif_lastdiff' => 'Гл. $1 каб бачыць гэтую мену.',
 'enotif_anon_editor' => 'ананімны ўдзельнік $1',
 'enotif_body' => 'Паважаны(ая) $WATCHINGUSERNAME,
@@ -2612,7 +2612,7 @@ $1',
 'tooltip-n-randompage' => 'Паказаць выпадковую старонку',
 'tooltip-n-help' => 'Дзе можна атрымаць тлумачэнні.',
 'tooltip-t-whatlinkshere' => 'Спіс вікі-старонак, што спасылаюцца сюды',
-'tooltip-t-recentchangeslinked' => 'Нядаўнія мены ў старонках, на якія спасылаецца гэтая старонка',
+'tooltip-t-recentchangeslinked' => 'Ð\9dÑ\8fдаÑ\9eнÑ\96Ñ\8f Ð·Ð¼ÐµÐ½Ñ\8b Ñ\9e Ñ\81Ñ\82аÑ\80онкаÑ\85, Ð½Ð° Ñ\8fкÑ\96Ñ\8f Ñ\81паÑ\81Ñ\8bлаеÑ\86Ñ\86а Ð³Ñ\8dÑ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка',
 'tooltip-feed-rss' => 'RSS-струмень гэтай старонкі',
 'tooltip-feed-atom' => 'Струмень навін Atom для гэтай старонкі',
 'tooltip-t-contributions' => 'Паказаць пералік укладаў гэтага ўдзельніка',
@@ -3298,8 +3298,8 @@ $5
 'livepreview-error' => 'Не ўдалося далучыцца: $1 "$2". Паспрабуйце звычайны перадпаказ.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Ð\9cенÑ\8b, Ð½Ð°Ð²ÐµÐ¹Ñ\88Ñ\8bÑ\8f Ð·Ð° $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}}, Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ð½Ðµ Ñ\82Ñ\80апÑ\96Ñ\86Ñ\8c Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¿Ð°ÐºÐ°Ð·.',
-'lag-warn-high' => 'Ð\97 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ð¼Ð¾Ñ\86нÑ\8bÑ\85 Ð·Ð°Ñ\82Ñ\80Ñ\8bмак Ð½Ð° Ñ\81еÑ\80веÑ\80Ñ\8b Ð±Ð°Ð· Ð´Ð°Ð½Ñ\8bÑ\85, Ð¼ÐµÐ½Ñ\8b, Ð½Ð°Ð²ÐµÐ¹Ñ\88Ñ\8bÑ\8f Ð·Ð° $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}}, Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ð½Ðµ Ñ\82Ñ\80апÑ\96Ñ\86Ñ\8c Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¿Ð°ÐºÐ°Ð·.',
+'lag-warn-normal' => 'Ð\97менÑ\8b, Ð·Ñ\80обленÑ\8bÑ\8f Ð¼ÐµÐ½Ñ\88 Ð·Ð° $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}} Ð½Ð°Ð·Ð°Ð´, Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ð½Ðµ Ñ\82Ñ\80апÑ\96Ñ\86Ñ\8c Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ñ\81пÑ\96Ñ\81.',
+'lag-warn-high' => 'Ð\97 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b Ð¼Ð¾Ñ\86нÑ\8bÑ\85 Ð·Ð°Ñ\82Ñ\80Ñ\8bмак Ð½Ð° Ñ\81еÑ\80веÑ\80Ñ\8b Ð±Ð°Ð· Ð´Ð°Ð½Ñ\8bÑ\85, Ð·Ð¼ÐµÐ½Ñ\8b, Ð·Ñ\80обленÑ\8bÑ\8f Ð¿Ð°Ð·Ð½ÐµÐ¹ Ñ\87Ñ\8bм $1 {{PLURAL:$1|Ñ\81ек.|Ñ\81ек.}} Ð½Ð°Ð·Ð°Ð´, Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ð½Ðµ Ñ\82Ñ\80апÑ\96Ñ\86Ñ\8c Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ñ\81пÑ\96Ñ\81.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'У назіраным {{PLURAL:$1|1 складнік|$1 складнікаў}}, без уліку размоўных старонак.',
index a862b4a..3761af8 100644 (file)
@@ -2075,6 +2075,7 @@ $1',
 
 # List duplicated files special page
 'listduplicatedfiles' => 'Сьпіс файлаў з дублікатамі',
+'listduplicatedfiles-summary' => 'Гэта сьпіс файлаў, дзе самая апошняя вэрсія файла зьяўляецца дублікатам самай апошняй вэрсіі нейкага іншага файла. Улічваюцца толькі лякальныя файлы.',
 
 # Unused templates
 'unusedtemplates' => 'Шаблёны, якія не выкарыстоўваюцца',
index a00db24..c19026a 100644 (file)
@@ -621,6 +621,7 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'gotaccountlink' => 'Kevreañ',
 'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
 'userlogin-resetpassword-link' => 'Ankouaet ho peus ho ker-tremen ?',
+'userlogin-helplink2' => 'Skoazell evit kevreañ',
 'userlogin-loggedin' => "Kevreet oc'h dija evel {{GENDER:$1|$1}}.
 Implijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
 'userlogin-createanother' => 'Krouiñ ur gont all',
@@ -1377,6 +1378,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'prefs-tokenwatchlist' => 'Jedouer',
 'prefs-diffs' => "Diforc'hioù",
 'prefs-help-prefershttps' => "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
+'prefs-tabs-navigation-hint' => 'Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => "Reizh eo ar chomlec'h postel war a seblant",
@@ -1563,7 +1565,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'recentchanges-label-plusminus' => 'Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù',
 'recentchanges-legend-heading' => "'''Alc'hwez :'''",
 'recentchanges-legend-newpage' => '(gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])',
-'rcnotefrom' => "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an '''$2''' ('''$1''' d'ar muiañ).",
+'rcnotefrom' => "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
 'rclistfrom' => "Diskouez ar c'hemmoù diwezhañ abaoe an $1.",
 'rcshowhideminor' => "$1 ar c'hemmoù dister",
 'rcshowhideminor-show' => 'Diskouez',
@@ -1706,6 +1708,7 @@ Mar fell deoc'h enporzhiañ ar restr-mañ da vat, kit war ho kiz hag enporzhiit
 'uploaddisabledtext' => 'Diweredekaet eo an enporzhiañ restroù.',
 'php-uploaddisabledtext' => 'Diweredekaet eo bet ar pellgargañ e PHP. Gwiriit an dibarzh arventennoù file_uploads.',
 'uploadscripted' => "Er restr-mañ ez eus kodoù HTML pe skriptoù a c'hallfe bezañ kammgomprenet gant ur merdeer Kenrouedad.",
+'uploadinvalidxml' => "N'eus ket bet gallet dielfennañ an XML er restr ezporzhiet.",
 'uploadvirus' => 'Viruzet eo ar restr! Titouroù : $1',
 'uploadjava' => "Ur restr ZIP a ra gant Java .class eo homañ.
 N'haller ket enporzhiañ restroù Java peogwir e c'haller mont dreist da vevennoù surentez ganto.",
@@ -2536,8 +2539,10 @@ $1',
 'sp-contributions-blocked-notice-anon' => "Stanket eo ar chomlec'h IP-mañ evit ar mare.
 Dindan emañ merket enmont diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'sp-contributions-search' => 'Klask degasadennoù',
+'sp-contributions-suppresslog' => 'degasadennoù diverket un implijer',
 'sp-contributions-username' => "Anv implijer pe chomlec'h IP :",
 'sp-contributions-toponly' => 'Na ziskouez nemet an adweladennoù diwezhañ',
+'sp-contributions-newonly' => 'Diskouez an aozadennoù a zo krouidigezhioù pajennoù hepken',
 'sp-contributions-submit' => 'Klask',
 
 # What links here
@@ -2657,7 +2662,7 @@ Setu amañ perak $1 : "$2"',
 'range_block_disabled' => "Diweredekaet eo bet ar stankañ stuc'hadoù IP.",
 'ipb_expiry_invalid' => 'amzer termen direizh.',
 'ipb_expiry_temp' => "Peurbadus e rank bezañ bloc'hadoù an implijerien guzh.",
-'ipb_hide_invalid' => 'Dibosupl diverkañ ar gont-mañ; evit doare ez eus bet graet re a gemmoù enni.',
+'ipb_hide_invalid' => "Ne c'haller ket dilemel ar gont-mañ : Ouzhpenn {{PLURAL:$1|ur c'hemm|$1 kemm}} zo enni.",
 'ipb_already_blocked' => 'Stanket eo "$1" dija',
 'ipb-needreblock' => "Stanket eo $1 c'hoazh. Kemmañ an arventennoù a fell deoc'h ?",
 'ipb-otherblocks-header' => '{{PLURAL:$1|Stankadenn|Stankadnenoù}} all',
@@ -3034,6 +3039,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-length' => 'Ment ar bajenn (en oktedoù)',
 'pageinfo-article-id' => 'Niverenn ar bajenn',
 'pageinfo-language' => 'Yezh ar bajenn',
+'pageinfo-content-model' => "Patrom endalc'had ar bajenn",
 'pageinfo-robot-policy' => 'Menegeriñ gant robotoù',
 'pageinfo-robot-index' => 'Aotreet',
 'pageinfo-robot-noindex' => 'Diaotreet',
@@ -4033,14 +4039,18 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'rotate-comment' => 'Skeudenn troet eus $1 {{PLURAL:$1|derez}} a-du gant an heol',
 
 # Limit report
+'limitreport-title' => 'Roadennoù da wellekaat an dielfenner :',
 'limitreport-cputime' => 'Amzer implij ar CPU',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|eiladenn}}',
 'limitreport-walltime' => 'Amzer implij gwirion',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|eiladenn}}',
+'limitreport-ppvisitednodes' => 'Niver a skoulmoù rakprosesor gweladennet',
+'limitreport-ppgeneratednodes' => 'Niver a skoulmoù rakprosesor ganet',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|okted}}',
 'limitreport-templateargumentsize' => 'Ment arguzenn ar patrom',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|okted}}',
 'limitreport-expansiondepth' => 'Donder astenn brasañ',
+'limitreport-expensivefunctioncount' => "Niver a arc'hwelioù dielfennañ koustus",
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Emled ar patromoù',
@@ -4052,6 +4062,7 @@ Astenn a ra ivez an arc'hwelioù parser evel
 'expand_templates_input' => 'Merkañ ho testenn amañ :',
 'expand_templates_output' => "Disoc'h",
 'expand_templates_xml_output' => 'Ezvont XML',
+'expand_templates_html_output' => "Disoc'h HTML kriz",
 'expand_templates_ok' => 'Mat eo',
 'expand_templates_remove_comments' => 'Lemel an notennoù kuit',
 'expand_templates_remove_nowiki' => "Diverkañ a ra ar balizennoù <nowiki> en disoc'h",
index 1419b00..3fcf383 100644 (file)
@@ -2177,6 +2177,11 @@ Vstup: <code>typ obsahu/podtyp</code>, např. <code>image/jpeg</code>.',
 # List redirects
 'listredirects' => 'Seznam přesměrování',
 
+# List duplicated files special page
+'listduplicatedfiles' => 'Seznam souborů s duplikáty',
+'listduplicatedfiles-summary' => 'Toto je seznam souborů, u kterých je aktuální revize duplikátem aktuální revize nějakého jiného souboru. Do úvahy se berou jen lokální soubory.',
+'listduplicatedfiles-entry' => '[[:File:$1|$1]] má [[$3|$2 {{PLURAL:$2|duplikát|duplikáty|duplikátů}}]].',
+
 # Unused templates
 'unusedtemplates' => 'Nepoužívané šablony',
 'unusedtemplatestext' => 'Tato stránka obsahuje seznam všech stran ve jmenném prostoru {{ns:template}}, které nejsou vloženy do žádné jiné strany. Před jejich smazáním nezapomeňte zkontrolovat ostatní odkazy.',
index 18ca978..55bfc91 100644 (file)
@@ -2101,6 +2101,11 @@ Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
 # List redirects
 'listredirects' => 'Ümbersuunamised',
 
+# List duplicated files special page
+'listduplicatedfiles' => 'Duplikaatfailide loend',
+'listduplicatedfiles-summary' => 'Siin on loetletud failid, mille viimane versioon on mõne teise faili viimase versiooni duplikaat. Arvesse võetakse ainult kohalikke faile.',
+'listduplicatedfiles-entry' => 'Failil [[:File:$1|$1]] on [[$3|{{PLURAL:$2|üks duplikaat|$2 duplikaati}}]].',
+
 # Unused templates
 'unusedtemplates' => 'Kasutamata mallid',
 'unusedtemplatestext' => 'See lehekülg loetleb kõik leheküljed nimeruumis {{ns:template}}, mida teistel lehekülgedel ei kasutata. Enne kustutamist palun kontrollige, kas siia pole muid linke.',
index d909ee6..5dd9160 100644 (file)
@@ -1351,9 +1351,9 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 'mergelogpagetext' => 'Alla on loki viimeisimmistä muutoshistorioiden yhdistämisistä.',
 
 # Diffs
-'history-title' => 'Sivun "$1" muutoshistoria',
-'difference-title' => 'Ero sivun "$1" versioiden välillä',
-'difference-title-multipage' => 'Erot sivujen "$1" ja "$2" välillä',
+'history-title' => 'Sivun ”$1” muutoshistoria',
+'difference-title' => 'Ero sivun ”$1” versioiden välillä',
+'difference-title-multipage' => 'Erot sivujen ”$1” ja ”$2” välillä',
 'difference-multipage' => '(Sivujen välinen eroavaisuus)',
 'lineno' => 'Rivi $1:',
 'compareselectedversions' => 'Vertaile valittuja versioita',
@@ -2548,7 +2548,7 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'modifiedarticleprotection' => 'muutti sivun [[$1]] suojaustasoa',
 'unprotectedarticle' => 'poisti suojauksen sivulta [[$1]]',
 'movedarticleprotection' => 'siirsi suojausasetukset sivulta [[$2]] sivulle [[$1]]',
-'protect-title' => 'Sivun $1 suojaus',
+'protect-title' => 'Muuta suojausta sivulla ”$1”',
 'protect-title-notallowed' => 'Sivun $1 suojaustaso',
 'prot_1movedto2' => 'siirsi sivun [[$1]] uudelle nimelle [[$2]]',
 'protect-badnamespace-title' => 'Nimiavaruus ei suojattavissa',
index 4ba0ae6..b4bcc7b 100644 (file)
@@ -2832,7 +2832,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => "Cette adresse IP est actuellement bloquée.
 La dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
 'sp-contributions-search' => 'Rechercher les contributions',
-'sp-contributions-suppresslog' => 'contributions des utilisateurs supprimées',
+'sp-contributions-suppresslog' => 'contributions masquées',
 'sp-contributions-username' => "Adresse IP ou nom d'utilisateur :",
 'sp-contributions-toponly' => 'Ne montrer que les contributions qui sont les dernières des articles',
 'sp-contributions-newonly' => 'Afficher uniquement les modifications qui sont des créations de page',
index 7605a2d..01f6931 100644 (file)
@@ -404,6 +404,10 @@ $2',
 'namespaceprotected' => "汝還無權限編輯'''$1'''名字空間嘅頁面。",
 'customcssprotected' => '汝還無權限編輯邇隻CSS頁面,因為其包含矣其他用戶嘅個人設置。',
 'customjsprotected' => '汝還無權限去編輯邇隻JavaScript頁面,因為其包含矣另一用戶嘅個人設定。',
+'mycustomcssprotected' => '汝無權限修改邇頁CSS。',
+'mycustomjsprotected' => '汝無編輯邇頁JavaScript之權限。',
+'myprivateinfoprotected' => '汝無權限編輯汝个個人信息。',
+'mypreferencesprotected' => '汝無權限編輯汝个個人設定。',
 'ns-specialprotected' => '邇兜特殊頁面係毋做得編輯嘅。',
 'titleprotected' => "邇隻標題已經分[[User:$1|$1]]保護來防止建立。理由係''$2''。",
 'filereadonlyerror' => '無辦法修改文件「$1」因為文件庫「$2」處於唯讀模式。 !
@@ -428,6 +432,7 @@ $2',
 'yourname' => '用戶名:',
 'userlogin-yourname' => '用戶名',
 'userlogin-yourname-ph' => '輸入汝嘅用戶名',
+'createacct-another-username-ph' => '輸入用戶名:',
 'yourpassword' => '密碼:',
 'userlogin-yourpassword' => '密碼',
 'userlogin-yourpassword-ph' => '輸入汝嘅密碼',
@@ -458,10 +463,14 @@ $2',
 'gotaccountlink' => '登入',
 'userlogin-resetlink' => '毋記得汝嘅登入信息?',
 'userlogin-resetpassword-link' => '添忘訖汝嘅密碼?',
+'userlogin-loggedin' => '汝已作為{{GENDER:$1|$1}}登錄。
+利用以下表單以作為另一賬戶登錄。',
 'createacct-join' => '輸入汝嘅基本資料:',
+'createacct-another-join' => '在下方輸入新帳號个資訊。',
 'createacct-emailrequired' => '電郵地址:',
 'createacct-emailoptional' => '電郵地址(可選)',
 'createacct-email-ph' => '設置電郵地址',
+'createacct-another-email-ph' => '輸入電郵地址',
 'createaccountmail' => '使用一隻臨時嘅隨機密碼,並將其發送到指定嘅電子郵件地址',
 'createacct-realname' => '實名(可選)',
 'createaccountreason' => '原因:',
@@ -520,20 +529,22 @@ $2',
 'acct_creation_throttle_hit' => '在邇隻wiki上係話訪客利用汝个IP地址在昨天創建矣$1個賬戶,係在邇段時間肚的上限。
 結果利用這個IP地址个訪客在邇段時間中無辦法創建更多个賬戶。',
 'emailauthenticated' => '汝嘅電郵地址已經於$2 $3確認。',
-'emailnotauthenticated' => '汝嘅郵箱地址<strong>還無分認証</strong>。以下功能將毋會發送任何郵件。',
+'emailnotauthenticated' => '汝个電郵位址還㬟確認。
+將收毋到以下功能相關个電郵。',
 'noemailprefs' => '在嘅嘅偏好設定肚指定一隻電子郵件地址來使用邇隻功能。',
 'emailconfirmlink' => '確認汝嘅郵箱地址',
 'invalidemailaddress' => '郵箱地址格式不正確,請輸入正確个郵箱位址或清空該輸入框。',
+'cannotchangeemail' => '本Wiki毋允許對帳號个電子郵件位址進行變更。',
 'emaildisabled' => '邇隻網站毋可以發送電子郵件。',
 'accountcreated' => '已建立賬戶',
-'accountcreatedtext' => '$1嘅賬戶已經分建立。',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])的賬戶已經畀建立。',
 'createaccount-title' => '在{{SITENAME}}肚建立新賬戶',
 'createaccount-text' => '有人在{{SITENAME}}肚利用汝嘅電郵創建矣一隻喊做 "$2" 嘅新賬戶($4),密碼係 "$3" 。汝應該立即登入並更改密碼。
 
 如果該賬戶建立錯誤嘅話,汝可以忽略邇條訊息。',
 'usernamehasherror' => '用戶名毋可以包含Hash字符',
 'login-throttled' => '汝已經嘗試多次登入動作。
-請等再試。',
+請等$1後再試。',
 'login-abort-generic' => '登入錯誤 - 中止',
 'loginlanguagelabel' => '語言:$1',
 'suspicious-userlogout' => '汝登出嘅要求已經分拒絕,因為其可能係由已損壞嘅瀏覽器或者緩存代理傳送。',
@@ -863,7 +874,7 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
 'search-section' => '(段落 $1)',
 'search-suggest' => '汝係毋係尋:$1',
 'search-interwiki-caption' => '姊妹計劃',
-'search-interwiki-default' => '$1é \85çµ\90æ\9e\9c:',
+'search-interwiki-default' => 'ä¾\86è\87ª$1å\98\85çµ\90æ\9e\9c:',
 'search-interwiki-more' => '(還較多)',
 'searchrelated' => '相關',
 'searchall' => '全部',
@@ -1367,7 +1378,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 下背係'''$1'''今下嘅保護級別:",
 'protect-locked-access' => "汝嘅賬戶權限做毋得修改保護級別。
 下背係'''$1'''今下嘅保護級別:",
-'protect-cascadeon' => '下背嘅{{PLURAL:$1|一個|多個}}頁面包含緊本頁面嘅同時,啟動矣連鎖保護,故所本頁面目前也分保護,還吂做得編寫。汝做得設定本頁面嘅保護級別,毋過邇並不會對連鎖保護有所影響。',
+'protect-cascadeon' => '下背嘅$1嘅頁面包含緊本頁面嘅同時,還啟動矣連鎖保護,故所本頁面目前也分保護,還㬟做得編寫。汝做得設定本頁面嘅保護級別,毋過邇影響毋到連鎖保護。',
 'protect-default' => '容許所有用戶',
 'protect-fallback' => 'Sî-yeu "$1" ke hí-khó',
 'protect-level-autoconfirmed' => 'Kim-chṳ́  sîn-ke lâu hàn-mò chu-chhak ke yung-fu',
index d86771f..779f707 100644 (file)
@@ -1116,8 +1116,8 @@ $2
 'userpage-userdoesnotexist' => 'חשבון המשתמש "$1" אינו רשום.
 אנא בדקו אם ברצונכם ליצור/לערוך דף זה.',
 'userpage-userdoesnotexist-view' => 'חשבון המשתמש "$1" אינו רשום.',
-'blocked-notice-logextract' => '{{GENDER:$1|×\94×\9eשת×\9eש ×\94×\96×\94 ×\97ס×\95×\9d\94×\9eשת×\9eשת ×\94×\96×\90ת חסומה}} כרגע.
-הפעולה האחרונה ביומן החסימות מוצגת להלן לעיון:',
+'blocked-notice-logextract' => '{{GENDER:$1|×\94×\9eשת×\9eש ×\94×\96×\94 ×\97ס×\95×\9d\94×\9eשת×\9eשת ×\94×\96×\95 חסומה}} כרגע.
+הפעולה האחרונה ביומן החסימות מוצגת להלן:',
 'clearyourcache' => "'''הערה:''' לאחר השמירה, עליכם לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
 * '''פיירפוקס / ספארי:''' לחצו על Shift בעת לחיצתכם על '''העלה מחדש''' (Reload), או הקישו על ''Ctrl-F5'' או על ''Ctrl-R'' (או על ''<span dir=\"ltr\">⌘-R</span>'' במחשב מק)
 * '''גוגל כרום:''' לחצו על ''Ctrl-Shift-R'' (או על ''<span dir=\"ltr\">⌘-Shift-R</span>'' במק)
@@ -2798,8 +2798,8 @@ $1',
 'sp-contributions-logs' => 'יומנים',
 'sp-contributions-talk' => 'שיחה',
 'sp-contributions-userrights' => 'ניהול הרשאות משתמש',
-'sp-contributions-blocked-notice' => '{{GENDER:$1|×\94×\9eשת×\9eש ×\94×\96×\94 ×\97ס×\95×\9d\94×\9eשת×\9eשת ×\94×\96×\90ת חסומה}} כרגע.
-הפעולה האחרונה ביומן החסימות מוצגת להלן לעיון:',
+'sp-contributions-blocked-notice' => '{{GENDER:$1|×\94×\9eשת×\9eש ×\94×\96×\94 ×\97ס×\95×\9d\94×\9eשת×\9eשת ×\94×\96×\95 חסומה}} כרגע.
+הפעולה האחרונה ביומן החסימות מוצגת להלן:',
 'sp-contributions-blocked-notice-anon' => 'כתובת IP זו חסומה כרגע.
 הפעולה האחרונה ביומן החסימות מוצגת להלן:',
 'sp-contributions-search' => 'חיפוש תרומות',
index 8ae043d..27cd8ec 100644 (file)
@@ -2257,6 +2257,9 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 # List redirects
 'listredirects' => '転送ページの一覧',
 
+# List duplicated files special page
+'listduplicatedfiles-entry' => '[[:File:$1|$1]] には [[$3|{{PLURAL:$2|$2 件の重複ファイル}}]]があります。',
+
 # Unused templates
 'unusedtemplates' => '使われていないテンプレート',
 'unusedtemplatestext' => 'このページでは{{ns:template}}名前空間にあって他のページに読み込まれていないページを一覧にしています。
index 8f070e4..ee4b790 100644 (file)
@@ -4898,7 +4898,10 @@ See also:
 # List duplicated files special page
 'listduplicatedfiles' => '{{doc-special|ListDuplicatedFiles}}',
 'listduplicatedfiles-summary' => 'Summary at top of Special:ListDuplicatedFiles',
-'listduplicatedfiles-entry' => 'A list item on Special:ListDuplicatedFiles. $1 is the file name (no namespace prefix). $2 is the number of duplicates this file has. $3 is the name of the duplicate search page (aka "Special:FileDuplicateSearch/Foo.png" or "Spécial:Recherche_fichier_en_double/Firefox.png")',
+'listduplicatedfiles-entry' => 'A list item on [[Special:ListDuplicatedFiles]]. Parameters:
+* $1 - the file name (no namespace prefix)
+* $2 - the number of duplicates this file has
+* $3 - the name of the duplicate search page (aka "Special:FileDuplicateSearch/Foo.png" or "Spécial:Recherche_fichier_en_double/Firefox.png")',
 
 # Unused templates
 'unusedtemplates' => '{{doc-special|UnusedTemplates}}',
index 538ac44..020c31a 100644 (file)
@@ -381,9 +381,18 @@ $messages = array(
 'oct' => 'ओक्टो.',
 'nov' => 'नवे.',
 'dec' => 'डिस.',
+'january-date' => 'जनवरी $1',
 'february-date' => 'फरवरी $1',
+'march-date' => 'मार्च $1',
+'april-date' => 'अप्रैल $1',
+'may-date' => 'मई $1',
+'june-date' => 'जुन $1',
 'july-date' => 'जूलाई $1',
+'august-date' => 'अगस्त $1',
+'september-date' => 'March $1',
 'october-date' => 'अक्तूबर $1',
+'november-date' => 'नवम्बर $1',
+'december-date' => 'दिसम्बर $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|वर्गः|वर्गाः}}',
@@ -396,10 +405,10 @@ $messages = array(
 'category-subcat-count' => '$2 इत्येषु {{PLURAL:$2|वर्गेऽस्मिन् अधो लिखिताः उपवर्गाः विद्यन्ते |वर्गेऽस्मिन् {{PLURAL:$1|अधो लिखितः उपवर्गः अस्ति|अधो लिखिताः $1 उपवर्गाः सन्ति}}}}',
 'category-subcat-count-limited' => 'अस्मिन् वर्गे {{PLURAL:$1|अधो लिखितः $1 वर्गः अस्ति|अधो लिखिताः $1 वर्गाः सन्ति}}',
 'category-article-count' => '$2 इत्येषु {{PLURAL:$2|वर्गेऽस्मिन् अधो लिखितानि पृष्ठानि विद्यन्ते |वर्गेऽस्मिन् {{PLURAL:$1|अधो लिखितं पृष्ठम् अस्ति|अधो लिखितानि $1 पृष्ठानि सन्ति}}}}',
-'category-article-count-limited' => 'à¤\85धà¥\8bलिà¤\96ितà¤\82 {{PLURAL:$1|पà¥\83षà¥\8dठमà¥\8d à¤\85सà¥\8dमिनà¥\8d à¤¶à¥\8dरà¥\87णà¥\8dयामà¥\8d à¤\85सà¥\8dति|$1 à¤ªà¥\83षà¥\8dठाणि à¤\85सà¥\8dमिनà¥\8d à¤¶à¥\8dरà¥\87णà¥\8dयाà¤\82 à¤¸à¤¨à¥\8dति}}।',
+'category-article-count-limited' => 'निमà¥\8dनà¥\8bलà¥\8dलिà¤\96ित{{PLURAL:$1|पà¥\83षà¥\8dठà¤\82|$1 à¤ªà¥\83षà¥\8dठानि}} à¤µà¤°à¥\8dà¤\97à¥\87ऽसà¥\8dमिनà¥\8d {{PLURAL:$1|à¤\85सà¥\8dति|$1 à¤¸à¤¨à¥\8dति}}',
 'category-file-count' => '$2 इत्येषु {{PLURAL:$2|वर्गेऽस्मिन् अधो उल्लिखिताः सञ्चिकाः विद्यन्ते |वर्गेऽस्मिन् {{PLURAL:$1|अधो उल्लिखिता सञ्चिका अस्ति|अधो उल्लिखिताः $1 सञ्चिकाः सन्ति}}}}',
 'category-file-count-limited' => 'निम्नोल्लिखित{{PLURAL:$1|सञ्चिका|$1 सञ्चिकाः}} वर्गेऽस्मिन् {{PLURAL:$1|अस्ति|$1 सन्ति}}',
-'listingcontinuesabbrev' => 'à¤\86à¤\97ामि.',
+'listingcontinuesabbrev' => 'à¤\85नà¥\81वरà¥\8dततà¥\87',
 'index-category' => 'अनुक्रमणिकापृष्ठानि',
 'noindex-category' => 'नानुक्रमणिकपृष्ठानि',
 'broken-file-category' => 'अविद्यानानां सञ्चिकानाम् आवलिः',
@@ -434,7 +443,7 @@ $messages = array(
 'vector-action-unprotect' => 'संरक्षणं परिवर्तयतु',
 'vector-view-create' => 'सृज्यताम्',
 'vector-view-edit' => 'सम्पाद्यताम्',
-'vector-view-history' => 'à¤\87तिहासà¤\83 à¤¦à¤°à¥\8dश्यताम्',
+'vector-view-history' => 'à¤\87तिहासà¤\83 à¤¦à¥\83श्यताम्',
 'vector-view-view' => 'पठ्यताम्',
 'vector-view-viewsource' => 'स्रोतः दृश्यताम्',
 'actions' => 'क्रियाः',
@@ -525,10 +534,10 @@ $messages = array(
 
 'badaccess' => 'अनुमतिदोषः',
 'badaccess-group0' => 'यस्याः क्रियायाः कृते भवान्/भवती उद्युक्ता, तस्यै क्रियायै अनुमति नास्ति ।',
-'badaccess-groups' => 'यस्याः क्रियायाः कृते भवान्/भवती उद्युक्ता, तस्यै क्रियायै $1 {{PLURAL:$2|अस्मिन् समूहे|एतेषु समूहेषु}} अनुमति नास्ति ।',
+'badaccess-groups' => 'यस्याः क्रियायाः कृते भवान्/भवती उद्युक्ता, तस्यै क्रियायै $1 {{PLURAL:$2|अस्मिन् समूहे|एतेषु समूहेषु}} अनुमति नास्ति ।',
 
 'versionrequired' => 'मीडीयाविक इत्यस्य $1 संस्करणम् आवश्यकम् ।',
-'versionrequiredtext' => 'अस्य पृष्ठस्य उपयोगार्थं मीडीयाविकि इत्यस्य $1 संस्करणम् आवश्यकम् । पश्यतु [[Special:संस्करणम्|संस्करणानि]].',
+'versionrequiredtext' => 'अस्य पृष्ठस्य उपयोगार्थं मीडीयाविकि इत्यस्य $1 संस्करणम् आवश्यकम् । पश्यतु [[Special:संस्करणम्|संस्करणानि]] ।',
 
 'ok' => 'अस्तु',
 'pagetitle' => '$1 - {{SITENAME}}',
@@ -536,9 +545,9 @@ $messages = array(
 'youhavenewmessages' => '{{PLURAL:$3|भवतः/भवत्याः कृते}} $1 ($2).',
 'youhavenewmessagesfromusers' => '{{PLURAL:$4|भवतः/भवत्याः कृते}} $1  {{PLURAL:$3|अन्यस्मात् योजकात्|$3 अन्येभ्यः योजकेभ्यः}} अस्ति ($2)।',
 'youhavenewmessagesmanyusers' => 'नैकेभ्यः योजकेभ्यः ते $1 सन्ति ($2) ।',
-'newmessageslinkplural' => '{{PLURAL:$1|नूतनः सन्देशः|नूतनसन्देशाः}}',
+'newmessageslinkplural' => '{{PLURAL:$1|नà¥\82तनà¤\83 à¤¸à¤¨à¥\8dदà¥\87शà¤\83|नà¥\82तनाà¤\83 à¤¸à¤¨à¥\8dदà¥\87शाà¤\83}}',
 'newmessagesdifflinkplural' => 'सद्यः {{PLURAL:$1|परिवर्तनम्| परिवर्तनानि}}',
-'youhavenewmessagesmulti' => '$1 अत्र भवते नूतनसन्देशाः सन्ति',
+'youhavenewmessagesmulti' => 'भवते नूतनसन्देशाः सन्ति अत्र $1',
 'editsection' => 'सम्पाद्यताम्',
 'editold' => 'सम्पाद्यताम्',
 'viewsourceold' => 'स्रोतः दृश्यताम्',
@@ -578,18 +587,22 @@ $messages = array(
 
 # Main script and global functions
 'nosuchaction' => 'तादृशं कार्यं न विद्यते',
-'nosuchactiontext' => 'अनेन समरूप-संसाधन-अवस्थापकेन (URL इति) वर्णिता क्रिया अमान्याऽस्ति।
-भवता समरूप-संसाधन-अवस्थापकं अपटंकितं स्यात्, अथवा असुष्ठु संबंधनम् अनुसृतम् स्यात्।
-इदम् {{SITENAME}} इत्यनेन प्रयुक्ते क्रमादेशे त्रुटिर्वा स्यात्।',
-'nosuchspecialpage' => 'तादृशं विशेषपृष्टं न विद्यते',
-'nospecialpagetext' => '<strong>भवता एकम् अमान्यं विशिष्टपृष्ठं याचितम्। </strong>
-मान्यानां विशिष्टपृष्ठाणां सूचिका [[Special:SpecialPages|{{int:specialpages}}]] इत्यत्र प्राप्तुं शक्यते।',
+'nosuchactiontext' => 'अनेन सार्वसङ्केन (URL) दर्शिता क्रिया अयोग्या अस्ति । अयोग्यं त्रुटियुक्तं वा सार्वसङ्केतं भवता/भवत्या लिखितं स्यात् ।',
+'nosuchspecialpage' => 'तादृशं विशेषपृष्ठं न विद्यते',
+'nospecialpagetext' => '<strong>अयोग्यं विशिष्टपृष्ठं भवता/भवत्या ईप्सितम् ।</strong> विद्यमानानि विशिष्टपृष्ठानि [[Special:SpecialPages|{{int:specialpages}}]] अत्र प्राप्यन्ते ।',
 
 # General errors
 'error' => 'दोषः',
-'databaseerror' => 'दत्ताधारे दोषः',
-'laggedslavemode' => 'प्राक्प्रबोधनम्:अस्मिन् पृष्ठे सद्योजातानि परिशोधनानि न स्युः ।',
-'readonly' => 'दत्तधारः कीलितः',
+'databaseerror' => 'दत्तांशनिधौ (database) दोषः',
+'databaseerror-text' => 'दत्तांश-प्रश्नस्य (database query) दोषः प्राप्तः ।
+एषः दोषः तन्त्रांशस्य त्रुटिः स्यात् ।',
+'databaseerror-textcl' => 'दत्तांश-प्रश्नस्य (database query) दोषः प्राप्तः ।',
+'databaseerror-query' => 'प्रश्नः: $1',
+'databaseerror-function' => 'नियोज्यम्: $1',
+'databaseerror-error' => 'दोषः: $1',
+'laggedslavemode' => '<strong>पूर्वसूचना :</strong>
+सद्यः परिवर्तनानि अत्र न स्युः ।',
+'readonly' => 'दत्तांशनिधिः कीलितः',
 'enterlockreason' => 'तन्त्रितीकरणस्य कारणं ददातु, अपि च आकलितं ददातु यत् तन्त्रणं कदा उद्घाट्यिष्यते।',
 'readonlytext' => 'समंकाधारं वर्तमानकाले तन्त्रितमस्ति नूतनान् प्रविष्टीन् विरुध्य तथा च अन्यानि परिवर्तनानि विरुध्य। इदं नियमिततया समंकाधार परिचर्याऽर्थं तथा स्यात्। तत्पश्चादिदं सामान्यतां संप्राप्स्यति।
 तन्त्रितीकारकेन प्रबन्धकेन इदं कारणं प्रदत्तम्: $1',
@@ -597,7 +610,7 @@ $messages = array(
 
 प्रायः अपाकृतस्य पृष्ठस्य इतिहासदर्शनस्य चेष्टाकाले एवं भवति ।
 
-तादृशी स्थितिः यदि नास्ति, तर्हि तन्त्रांशे वद्यमाना त्रुटिः भवेत् । कृपया कमपि [[Special:ListUsers/sysop|प्रबन्धकम्]] अस्य पृष्ठस्य सार्वसङ्केतं (U.R.L.) सूच्यताम् ।',
+तादà¥\83शà¥\80 à¤¸à¥\8dथितिà¤\83 à¤¯à¤¦à¤¿ à¤¨à¤¾à¤¸à¥\8dति, à¤¤à¤°à¥\8dहि à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शà¥\87 à¤µà¤¿à¤¦à¥\8dयमाना à¤¤à¥\8dरà¥\81à¤\9fिà¤\83 à¤­à¤µà¥\87तà¥\8d à¥¤ à¤\95à¥\83पया à¤\95मपि [[Special:ListUsers/sysop|पà¥\8dरबनà¥\8dधà¤\95मà¥\8d]] à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤¾à¤°à¥\8dवसà¤\99à¥\8dà¤\95à¥\87तà¤\82 (U.R.L.) à¤¸à¥\82à¤\9aà¥\8dयतामà¥\8d à¥¤',
 'missingarticle-rev' => '(संस्करणं# :$1)',
 'missingarticle-diff' => '(व्यतिरेक: $1, $2)',
 'readonly_lag' => 'मुख्य-समंकाधार-परिवेशकं उपमुख्य-समंकाधार-परिवेशकस्य संप्रापणात् पूर्वे एव स्वतः तन्त्रितम् अस्ति।',
@@ -619,7 +632,7 @@ $messages = array(
 'cannotdelete-title' => ' "$1" पृष्ठं निर्मार्जयितुम् अशक्यम्',
 'delete-hook-aborted' => 'आलम्बेन अपमार्जनम् अपनीतम् । अनेन विवरणं न दत्तम् ।',
 'badtitle' => 'अशुद्धं शिरोनाम',
-'badtitletext' => 'à¤\87पà¥\8dसितà¤\82 à¤¶à¥\80रà¥\8dषà¤\95मà¥\8d à¤\85मानà¥\8dयà¤\82, à¤°à¤¿à¤\95à¥\8dतमà¥\8d, à¤\85यà¥\8bà¤\97à¥\8dयà¤\82, à¤\85नà¥\8dयभाषà¥\80यà¤\82, à¤µà¤¿à¤\95ि-à¤\9cालविहाय च अस्ति । पृष्ठशीर्षकाय अयोग्यानि अक्षराणि चिह्नानि वा तस्मिन् भवेयुः ।',
+'badtitletext' => 'à¤\88पà¥\8dसितà¤\82 à¤¶à¥\80रà¥\8dषà¤\95मà¥\8d à¤\85मानà¥\8dयà¤\82, à¤°à¤¿à¤\95à¥\8dतमà¥\8d, à¤\85यà¥\8bà¤\97à¥\8dयमà¥\8d, à¤\85नà¥\8dयभाषà¥\80यà¤\82, à¤­à¤¾à¤·à¤¾à¤¨à¥\8dतरातà¥\8d à¤µà¤¿à¤\95ि-à¤\9cालसà¥\8dथलातà¥\8d च अस्ति । पृष्ठशीर्षकाय अयोग्यानि अक्षराणि चिह्नानि वा तस्मिन् भवेयुः ।',
 'perfcached' => 'अनुपदोक्तं लेखः कैश् इत्येतस्माद् अस्ति, अतः अद्यतनं न स्यात्।  {{PLURAL:$1|one result is|$1 results are}}',
 'perfcachedts' => 'अधोनिदेशितलेखः सञ्चितः । पूर्वपदोन्नतिः $1 । $4 {{PLURAL:}} अधिकाधिकपरिणामः सञ्चये उपलब्धः ।',
 'querypage-no-updates' => 'अस्य पृष्ठस्य परिशोधनं विफलीकृतमस्ति । 
@@ -752,7 +765,7 @@ $2',
 'emaildisabled' => 'स्थानमेतत् विद्युन्मनपत्रं न प्रेषयति ।',
 'accountcreated' => 'सदस्यता प्राप्ता',
 'accountcreatedtext' => '$1 इत्येतस्य सदस्यता प्राप्ता अस्ति।',
-'createaccount-title' => '{{SITENAME}} à¤\87तà¥\8dयà¥\87तदरà¥\8dथà¤\82 à¤²à¥\87à¤\96ासà¥\83à¤\9cनम्',
+'createaccount-title' => '{{SITENAME}} à¤\87तà¥\8dयतà¥\8dर à¤¸à¤¦à¤¸à¥\8dयता à¤ªà¥\8dरापà¥\8dयताम्',
 'createaccount-text' => 'भवतः विद्युत्संदेशसंकेतार्थं केनचित् $2 इति जनेन {{SITENAME}} ($4) इत्यत्र  $3 इति कूटशब्दं दत्वा लेखा सृष्टाऽस्ति।
 भवता अधुना प्रवेशं कृत्वा कूटशब्दः परिवर्तितव्यः।
 
@@ -770,6 +783,7 @@ You may ignore this message, if this account was created in error.',
 'loginlanguagelabel' => 'भाषा : $1',
 'suspicious-userlogout' => 'भवतः सत्राद् बहिर्गमनस्य अनुरोधः अस्वीकृतोऽस्ति, यस्मादेतत् भग्नादेकस्मात् ब्राउज़र्तः अथवा स्वल्पसञ्चयि-प्रॉक्सितः प्रेषित आसीत्।',
 'pt-login-button' => 'प्रविश्यताम्',
+'pt-userlogout' => 'निर्गमनम्',
 
 # Email sending
 'php-mail-error-unknown' => 'पीएच्पी इत्येतस्य mail() फलने अज्ञाता काऽपि त्रुटिर्जाता।',
@@ -849,13 +863,13 @@ $2
 'image_tip' => 'अन्तर्निहिता सञ्चिका',
 'media_sample' => 'उदाहरणम्.ogg',
 'media_tip' => 'सञ्चिकासम्बन्धः',
-'sig_tip' => 'समयà¥\8bलà¥\8dलà¥\87न à¤¸à¤¹ à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरà¤\83',
+'sig_tip' => 'समयà¥\8bलà¥\8dलà¥\87à¤\96à¥\87न à¤¸à¤¹ à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरमà¥\8d',
 'hr_tip' => 'क्षैतिज-रेखा (न्यूनतया प्रयोक्तव्या)',
 
 # Edit pages
 'summary' => 'सारांशः:',
 'subject' => 'विषयः/शीर्षकम् :',
-'minoredit' => 'à¤\87दà¤\82 à¤²à¤\98à¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनम्',
+'minoredit' => 'à¤\87दà¤\82 à¤²à¤\98à¥\81 à¤¸à¤®à¥\8dपादनम्',
 'watchthis' => 'इदं पृष्ठं निरीक्षताम्',
 'savearticle' => 'पृष्ठं रक्ष्यताम्',
 'preview' => 'प्राग्दृश्यम्',
@@ -912,9 +926,8 @@ $2
 सत्रारम्भपश्चात् नूतनायाः अस्याः लेखायाः कूटशब्दः  '''[[Special:ChangePassword|कूटशब्दं परिवर्तताम्]]'' इति पृष्ठे परिवर्तितुं शक्यते।",
 'newarticle' => '(नूतनम्)',
 'newarticletext' => 'भवान्/भवती अनिर्मिते पृष्ठे अस्ति । 
-
-पृष्ठं स्रष्टुम् अधः प्रदत्तायां पेटिकायां टङ्कनं प्रारभतु (साहाय्यार्थं [$1 अत्र] नुदतु ।
-भवान्/भवती यदि क्षतिकारणात् एतत् पृष्ठं प्रति आगच्छत्, तर्हि अस्य गवेषकस्य (browser) "बैक्" इति नुदतु ।',
+पृष्ठं स्रष्टुम् अधः प्रदत्तायां पेटिकायां टङ्कनं प्रारभतु (साहाय्यार्थं [$1 अत्र]) नुदतु ।
+भवान्/भवती यदि क्षतिकारणात् एतत् पृष्ठं प्रति आगच्छत्, तर्हि अस्य गवेषकस्य (browser) Back नुदतु ।',
 'anontalkpagetext' => 'तस्य अनामकयोजकस्य, अथवा अनुपयोजकस्य च परिचर्चापुटम् येन एतावति काले स्वस्थनं  न निर्मितम् । 
 अतः तस्य अभिज्ञानार्थं ऐ.पि.सङ्गेतसङ्ख्या प्रयोजनीया । 
 सा समाना सङ्ख्याः अन्ययोजकैः अपि विभक्ता । यदि भवान् अनामकयोजकः, भवता असम्बद्धटीकाः श्रुताः, कृपया स्वस्थनं निर्मीय नामाभिलेखं करोतु ।  [[Special:UserLogin/signup|create an account]], [[Special:UserLogin|log in]] अन्यानामकयोजकैः सह सम्भूयमनभ्रमैः विमुक्तः भवतु ।',
@@ -952,7 +965,7 @@ $2
 'updated' => '(अद्यतनीकृतः)',
 'note' => "'''सूचना:'''",
 'previewnote' => "'''एतत् केवलं प्राग्दृश्यं वर्तते इति स्मरतु'''
-भवता/भवतà¥\8dया à¤\95à¥\83तानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤\8fतवातà¥\8d न रक्षितानि ।",
+भवता/भवतà¥\8dया à¤\95à¥\83तानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤\8fतवता न रक्षितानि ।",
 'continue-editing' => 'सम्पादनम् अनुवर्तताम्',
 'previewconflict' => 'अस्मिन् प्राग्दृश्ये दर्शितमस्ति यत् उपरिवर्ति पाठ क्षेत्रस्य पाठः रक्षणपश्चात् कीदृशः दृष्टिगोचरः भविष्यति।',
 'session_fail_preview' => "'''क्षम्यताम्! अस्माभिः भवतः सम्पादनस्य संसाधनं न कर्तुं शक्तम् यस्माद्धि सत्रस्य सूचनाः लुप्ताः।'''
@@ -999,14 +1012,15 @@ $2
 'templatesusedsection' => '{{PLURAL:$1|Template|Templates}} अस्मिन् विभागे उपयुक्तम् ।',
 'template-protected' => '(संरक्षितम्)',
 'template-semiprotected' => 'अर्धसंरक्षितम्',
-'hiddencategories' => 'à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 {{PLURAL:$1|1 à¤¨à¤¿à¤\97à¥\82ढà¥\87 à¤µà¤°à¥\8dà¤\97à¥\87 |$1 à¤¨à¤¿à¤\97à¥\82ढà¥\87षà¥\81 à¤µà¤°à¥\8dà¤\97à¥\87षà¥\81}} à¤\85नà¥\8dयतमà¤\82 à¤µà¤¿à¤¦à¥\8dयतà¥\87 :',
+'hiddencategories' => 'à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 {{PLURAL:$1|1 à¤¨à¤¿à¤\97à¥\82ढà¥\87 à¤µà¤°à¥\8dà¤\97à¥\87 |$1 à¤¨à¤¿à¤\97à¥\82ढà¥\87षà¥\81 à¤µà¤°à¥\8dà¤\97à¥\87षà¥\81}} à¤\85नà¥\8dतरà¥\8dभवति :',
 'nocreatetext' => '{{SITENAME}} नूतनपुटनिर्माणस्य क्षमता नियता । वर्तमानापुटानां सम्पादनार्थं निर्गच्छतु । अथवा [[Special:UserLogin|log in or create an account]].',
 'nocreate-loggedin' => 'नूतनपुटनिर्मार्थम् अनुमतिः नास्ति ।',
 'sectioneditnotsupported-title' => 'विभागसम्पादनं न पोषितम् ।',
 'sectioneditnotsupported-text' => 'अस्मिन् पुटे विभागसम्पादनण् न पोषितम् ।',
 'permissionserrors' => 'अनुज्ञा-विभ्रमाः',
 'permissionserrorstext' => 'भवान् तत् कर्तुं अनुज्ञां न धारयति {{PLURAL:$1|अधोऽङ्कितात् कारणात् |अधोऽङ्कितेभ्यः कारणेभ्यः:}}',
-'permissionserrorstext-withaction' => '$1 निम्नकारणत्वात्  $2 सम्पादनस्य अनुमतिः नास्ति ।',
+'permissionserrorstext-withaction' => '$1 निम्नकारणत्वात्  $2 सम्पादनस्य अनुमतिः नास्ति ।
+{{PLURAL:$1|कारणम्|कारणानि}}:',
 'recreate-moveddeleted-warn' => "'''पूर्वसूचना: पूर्वम् अपाकृतं पृष्टं भवता रच्यमानम् अस्ति ।'''
 अस्य पृष्ठस्य सम्पादनं करणात् प्राक् गभीरतया चिन्तनं करोतु ।
 अस्य पृष्ठस्य निर्माणं न्यायसङ्गतम् इति भवतः/भवत्याः मतमस्ति चेत् अत्र परिवर्तनं करोतु । सौकर्यार्थं पृष्ठ-अपाकरणस्य प्राक्तनसम्पादनस्य आवलिः अत्र वर्तते ।",
@@ -1039,8 +1053,8 @@ $2
 अत्र $2 संख्यातः  {{PLURAL:$2|न्यूनं आह्वानं|न्यूनानि आह्वानानि}} भवितव्यानि, सद्यः तत्र {{PLURAL:$1 $1 आह्वानं विद्यते|$1 आह्वानानि विद्यन्ते}}।",
 'expensive-parserfunction-category' => 'प्रभूतेभ्यः जटिलेभ्यः पार्सर्-फंक्शन्-आह्वानेभ्यः युक्तानि पृष्ठाणि।',
 'post-expand-template-inclusion-warning' => "'''पूर्वसूचना:''' फलकस्य आकारः बृहत् वर्तते । कानिचन फलकानि नान्तर्भविष्यन्ति ।",
-'post-expand-template-inclusion-category' => 'माहितà¥\80फलकस्य अपेक्षया पृष्ठं बृहत् वर्तते ।',
-'post-expand-template-argument-warning' => "'''पà¥\82रà¥\8dवसà¥\82à¤\9aना''' à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 à¤¸à¥\8dथितसà¥\8dय à¤«à¤²à¤\95सà¥\8dय à¤\8fà¤\95à¤\83 à¤µà¤¿à¤\95लà¥\8dपà¤\83 à¤¬à¤¹à¥\81 à¤¬à¥\83हतà¥\8d à¤­à¤µà¥\87तà¥\8d । तस्य विकल्पस्य अंशाः अपाकृताः ।",
+'post-expand-template-inclusion-category' => 'सà¥\82à¤\9aनाफलकस्य अपेक्षया पृष्ठं बृहत् वर्तते ।',
+'post-expand-template-argument-warning' => "'''पà¥\82रà¥\8dवसà¥\82à¤\9aना''' à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 à¤¸à¥\8dथितसà¥\8dय à¤«à¤²à¤\95सà¥\8dय à¤\8fà¤\95à¤\83 à¤µà¤¿à¤\95लà¥\8dपà¤\83 à¤¬à¤¹à¥\81 à¤¬à¥\83हतà¥\8d à¤µà¤°à¥\8dततà¥\87 । तस्य विकल्पस्य अंशाः अपाकृताः ।",
 'post-expand-template-argument-category' => 'येषु पृष्ठेषु फलके स्थिताः विकल्पाः न पूरिताः तेषां पृष्ठानाम् आवलिः',
 'parser-template-loop-warning' => 'बिम्बधर-पाशः प्राप्तः: [[$1]]',
 'parser-template-recursion-depth-warning' => 'बिम्बधर-पुनरावर्तनार्थं गहनतायाः सीमा अतिक्रान्ताऽस्ति ($1)',
@@ -1071,20 +1085,20 @@ $2
 'currentrev' => 'सद्यःकालीना आवृत्तिः',
 'currentrev-asof' => '$1 समयस्य संस्करणम्',
 'revisionasof' => '$1 इत्यस्य संस्करणं',
-'revision-info' => '$1 à¤ªà¤°à¥\8dयनà¥\8dतà¤\82 $2 à¤¦à¥\8dवारा à¤\9cातानि परिवर्तनानाम् आवलिः',
-'previousrevision' => 'â\86\90 à¤ªà¥\81रातनानि à¤¸à¤\82सà¥\8dà¤\95रणानि',
+'revision-info' => '$1 à¤ªà¤°à¥\8dयनà¥\8dतà¤\82 $2 à¤¦à¥\8dवारा à¤\9cातानाà¤\82 परिवर्तनानाम् आवलिः',
+'previousrevision' => 'â\86\90 à¤ªà¥\81रातनà¤\82 à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d',
 'nextrevision' => 'नूतनतरा आवृत्तिः →',
-'currentrevisionlink' => 'सदà¥\8dयà¤\83à¤\95ालà¥\80ना आवृत्तिः',
+'currentrevisionlink' => 'नà¥\82तनतमा आवृत्तिः',
 'cur' => 'वर्तमानः',
 'next' => 'आगामि',
 'last' => 'पूर्वतनम्',
 'page_first' => 'प्रथमम्',
 'page_last' => 'अन्तिमम्',
 'histlegend' => 'भेदस्य चयनम्: आवृत्तिभेदस्य दर्शनाय अग्रे प्रदत्ता रेडियोमञ्जूषा नुद्यताम्, एण्टर्-कुड्मलं नुद्यताम्, अधः दत्तं कुड्मलं वा नुद्यताम् । <br />
-à¤\87तिहासà¤\83: (सदà¥\8dयà¥\8bà¤\9cातमà¥\8d) = नूतनासु आवृत्तिषु भेदः, 
-(पà¥\82रà¥\8dवतनमà¥\8d) = à¤ªà¥\82रà¥\8dवतनासà¥\81 à¤\86वà¥\83तà¥\8dतिषà¥\81 à¤­à¥\87दà¤\83, (लà¤\98à¥\81) = à¤²à¤\98à¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनम्',
-'history-fieldset-title' => 'à¤\97वà¥\87षणसà¥\8dय (browser) इतिहासः',
-'history-show-deleted' => 'मातà¥\8dरम् अपाकृतम्',
+नà¥\82तनसà¤\82सà¥\8dà¤\95रणमà¥\8d = नूतनासु आवृत्तिषु भेदः, 
+(पà¥\82रà¥\8dवतनमà¥\8d) = à¤ªà¥\82रà¥\8dवतनासà¥\81 à¤\86वà¥\83तà¥\8dतिषà¥\81 à¤­à¥\87दà¤\83, (लà¤\98à¥\81) = à¤²à¤\98à¥\81 à¤¸à¤®à¥\8dपादनम्',
+'history-fieldset-title' => 'à¤\85नà¥\8dवà¥\87षणसà¥\8dय (browse) इतिहासः',
+'history-show-deleted' => 'à¤\95à¥\87वलम् अपाकृतम्',
 'histfirst' => 'पुरातनतमम्',
 'histlast' => 'नूतनतमम्',
 'historysize' => '({{PLURAL:$1|1 बैटम्|$1 बैटानि}})',
@@ -1205,12 +1219,12 @@ You can still [$1 view this revision]",
 'mergelogpagetext' => 'अतिनूतनविलीनस्य आवली अधो दत्ता यस्य इतिहासः अन्यस्मिन् अस्ति ।',
 
 # Diffs
-'history-title' => '"$1" इत्यस्य आवर्तनेतिहासः :',
+'history-title' => '"$1" इत्यस्य आवर्तनेतिहासः',
 'difference-title' => '"$1" इत्यस्य अवतरणमध्ये व्यत्यासः ।',
 'difference-title-multipage' => '"$1" तथा "$2" पुटयोः मध्ये व्यत्यासः ।',
 'difference-multipage' => 'पुटेषु व्यत्यासः ।',
 'lineno' => 'पङ्क्तिः $1:',
-'compareselectedversions' => 'à¤\9aितानामà¥\8d à¤\86वà¥\83तà¥\8dतà¥\80नाà¤\82 à¤¤à¥\8bलनà¤\82 क्रियताम्',
+'compareselectedversions' => 'à¤\9aितानामà¥\8d à¤\86वà¥\83तà¥\8dतà¥\80नाà¤\82 à¤¤à¥\81लना क्रियताम्',
 'showhideselectedversions' => 'चितावतरणानि दर्शयतु/गोपयतु ।',
 'editundo' => 'पूर्ववत्',
 'diff-multi-manyusers' => '({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)',
@@ -1224,25 +1238,25 @@ You can still [$1 view this revision]",
 'titlematches' => 'पुटशीर्षिकामेलाः ।',
 'textmatches' => 'पुटपाठस्य मेलाः',
 'notextmatches' => 'न कस्यापि पृष्ठस्य पाठः अस्य सममस्ति',
-'prevn' => 'पà¥\81रसà¥\8dतात् {{PLURAL:$1|$1}}',
-'nextn' => 'परसà¥\8dतात् {{PLURAL:$1|$1}}',
-'prevn-title' => 'पà¥\81रसà¥\8dतातà¥\8d {{PLURAL:$1|परिणामः|परिणामाः}}',
-'nextn-title' => 'परसà¥\8dतातà¥\8d {{PLURAL:$1|परिणामः|परिणामाः}}',
+'prevn' => 'पà¥\82रà¥\8dवतनम् {{PLURAL:$1|$1}}',
+'nextn' => 'à¤\85à¤\97à¥\8dरिमम् {{PLURAL:$1|$1}}',
+'prevn-title' => 'पà¥\82रà¥\8dवतन{{PLURAL:$1|परिणामः|परिणामाः}}',
+'nextn-title' => 'à¤\85à¤\97à¥\8dरिम{{PLURAL:$1|परिणामः|परिणामाः}}',
 'shown-title' => 'प्रत्येकस्मिन् पृष्ठे $1 {{PLURAL:$1|फलितम्|फलितानि}} दर्श्यताम्',
-'viewprevnext' => 'दरà¥\8dश्यताम् ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists' => "'''विकि-जालस्थानेऽस्मिन् \"[[:\$1]]\" नामकं पृष्ठं विद्यते । '''",
+'viewprevnext' => 'दà¥\83श्यताम् ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => '<strong>अस्मिन् विकि-जालस्थाने "[[:$1]]" नामकं पृष्ठं विद्यते ।</strong> {{PLURAL:$2|0=|अन्यपरिणामाः दृश्यन्ताम्}}',
 'searchmenu-new' => '<strong> अस्मिन् विकिजालस्थाने "[[:$1]]" इदं पृष्ठं सृज्यताम् ।
 </strong>
-{{PLURAL:$2|0=|तव अन्वेषणस्य परिणामोपि दृश्यताम् ।|तव अन्वेषणस्य परिणामाः अपि दृश्यन्ताम्}}',
-'searchprofile-articles' => 'à¤\86नà¥\8dतरà¥\8dविषà¤\95à¤\82 à¤ªà¥\83षà¥\8dठà¤\82',
+{{PLURAL:$2|0=|तव à¤\85नà¥\8dवà¥\87षणसà¥\8dय à¤ªà¤°à¤¿à¤£à¤¾à¤®à¥\8bऽपि à¤¦à¥\83शà¥\8dयतामà¥\8d à¥¤|तव à¤\85नà¥\8dवà¥\87षणसà¥\8dय à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤¾à¤\83 à¤\85पि à¤¦à¥\83शà¥\8dयनà¥\8dतामà¥\8d}}',
+'searchprofile-articles' => 'विषयसहितानि à¤ªà¥\83षà¥\8dठानि',
 'searchprofile-project' => 'साहाय्यं, प्रकल्पपृष्ठानि च',
 'searchprofile-images' => 'माध्यमसमुच्चयः',
 'searchprofile-everything' => 'सर्वम्',
 'searchprofile-advanced' => 'प्रगतम्',
 'searchprofile-articles-tooltip' => '$1 स्थले अन्विष्यताम्',
 'searchprofile-project-tooltip' => '$1 स्थले अन्विष्यताम्',
-'searchprofile-images-tooltip' => 'सञ्चिका अन्विष्यताम्',
-'searchprofile-everything-tooltip' => '(चर्चापृष्ठानि अविहाय) सर्वत्र अन्विष्यताम्',
+'searchprofile-images-tooltip' => 'सञ्चिकाः अन्विष्यन्ताम्',
+'searchprofile-everything-tooltip' => 'सर्वत्र अन्विष्यताम् (चर्चापृष्ठानि अपि)',
 'searchprofile-advanced-tooltip' => 'नामाकाशेषु अन्विष्यताम्',
 'search-result-size' => '$1 ({{PLURAL:$2|1 शब्दः|$2 शब्दाः}})',
 'search-result-category-size' => '{{PLURAL:$1|1 योजकः|$1 योजकाः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपवर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})',
@@ -1280,7 +1294,7 @@ You can still [$1 view this revision]",
 'skin-preview' => 'प्राग्दृश्यम्',
 'datedefault' => 'वरीयांसि नास्ति',
 'prefs-beta' => 'आवर्णलक्षणानि ।',
-'prefs-datetime' => 'दिनाà¤\82à¤\95 à¤¤à¤¥à¤¾ à¤¸à¤®à¤¯',
+'prefs-datetime' => 'दिनाà¤\99à¥\8dà¤\95à¤\83, à¤¸à¤®à¤¯à¤\83 à¤\9a',
 'prefs-labs' => 'प्रयोगशालालक्षणानि ।',
 'prefs-user-pages' => 'योजकपुटानि ।',
 'prefs-personal' => 'योजकः व्यक्तिरेखा',
@@ -1360,7 +1374,7 @@ You can still [$1 view this revision]",
 'email' => 'विद्युत्पत्रव्यवस्था',
 'prefs-help-realname' => 'निजनामधेयस्य उल्लेखः आवश्यकः नास्ति । 
 यदि ददाति तर्हि अस्य प्रयोगः भवतः योगदानार्थं भवते श्रेयं दातुम् उपयुक्तः भवति ।',
-'prefs-help-email' => 'à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85निवारà¥\8dयà¤\83 à¤¨à¤¾à¤¸à¥\8dति à¥¤ à¤\95िनà¥\8dतà¥\81 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 à¤µà¤¿à¤¸à¥\8dमरà¥\8dयतà¥\87 à¤\9aà¥\87तà¥\8d à¤¤à¤¸à¥\8dय à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनाय à¤\85वश्यकः भवति ।',
+'prefs-help-email' => 'à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85निवारà¥\8dयà¤\83 à¤¨à¤¾à¤¸à¥\8dति à¥¤ à¤\95िनà¥\8dतà¥\81 à¤\95à¥\82à¤\9fशबà¥\8dदà¤\83 à¤µà¤¿à¤¸à¥\8dमरà¥\8dयतà¥\87 à¤\9aà¥\87तà¥\8d à¤¤à¤¸à¥\8dय à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनाय à¤\86वश्यकः भवति ।',
 'prefs-help-email-others' => 'योजकपृष्ठ-सम्भाषणपृष्ठयोः माध्यमेन,  ई-पत्रमाध्यमेन वा अन्ये योजकाः भवतः/भवत्याः सम्पर्कं कर्तुं शक्नुयुः ।
 सम्पर्केऽस्मिन् भवतः/भवत्याः ई-पत्रसङ्केतम् अन्ययोजकाः ज्ञातुं न प्रभवतन्ति ।',
 'prefs-help-email-required' => 'विद्युन्मानपत्रसङ्केतः आवश्यकः ।',
@@ -1538,15 +1552,15 @@ You can still [$1 view this revision]",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
-'recentchanges' => 'सदà¥\8dयपरिवर्तनानि',
-'recentchanges-legend' => 'सद्योजातानां परिवर्तनानां विकल्पाः',
+'recentchanges' => 'नà¥\82तनपरिवर्तनानि',
+'recentchanges-legend' => 'सद्यो जातानां परिवर्तनानां विकल्पाः',
 'recentchanges-summary' => 'अस्मिन् विकि-प्रकल्पे सद्योजातानि परिवर्तनानि दृश्यन्ताम्',
-'recentchanges-feed-description' => 'अस्मिन् विकि-प्रकल्पे सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
+'recentchanges-feed-description' => 'अस्मिन् विकि-प्रकल्पे सद्यो जातानि परिवर्तनानि दर्श्यन्ताम्',
 'recentchanges-label-newpage' => 'अनेन सम्पादनेन नूतनपृष्ठस्य रचना अभूत् ।',
-'recentchanges-label-minor' => 'à¤\87दà¤\82 à¤²à¤\98à¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनम्',
+'recentchanges-label-minor' => 'à¤\87दà¤\82 à¤²à¤\98à¥\81 à¤¸à¤®à¥\8dपादनम्',
 'recentchanges-label-bot' => 'बोट्-द्वारा कृतं सम्पादनमेतत्',
 'recentchanges-label-unpatrolled' => 'एतावता अस्य सम्पादनस्य परिशीलिनं नाभूत् ।',
-'rcnotefrom' => '<strong>$2</strong> तः आरभ्य (<strong>$1</strong> पर्यन्तं) जातानि परिवर्तनानि अधः प्रदर्शिता ।',
+'rcnotefrom' => '<strong>$2</strong> तः आरभ्य (<strong>$1</strong> पर्यन्तं) जातानि परिवर्तनानि अधः प्रदर्शितानि ।',
 'rclistfrom' => '$1 पश्चात् जातानि नूतनानि परिवर्तनानि दृश्यन्ताम्',
 'rcshowhideminor' => '$1 लघुसम्पादनानि',
 'rcshowhidebots' => '$1 बोट् इत्येतानि',
@@ -1560,7 +1574,7 @@ You can still [$1 view this revision]",
 'hide' => 'गोप्यताम्',
 'show' => 'दृश्यताम्',
 'minoreditletter' => '(लघु)',
-'newpageletter' => '(नवीनम्)',
+'newpageletter' => '<font color="green">(नवीनम्)</font>',
 'boteditletter' => '(बोट्)',
 'number_of_watching_users_pageview' => '[$1 अवलोकयति {{PLURAL:$1|योजकः|योजकाः}}]',
 'rc_categories' => 'वर्गान् नियतीकरोतु ।',
@@ -1576,11 +1590,11 @@ You can still [$1 view this revision]",
 'recentchangeslinked-feed' => 'पृष्ठ-सम्बन्धितानि परिवर्तनानि',
 'recentchangeslinked-toolbox' => 'पृष्ठसम्बद्धानि परिवर्तनानि',
 'recentchangeslinked-title' => '"$1" इत्यस्मिन् जातानि परिवर्तनानि',
-'recentchangeslinked-summary' => "विशेषपृष्ठेषु वर्गान्तर्गतपृष्ठेषु वा सद्योजातानां परिवर्तनानाम् एषा आवलिः ।
+'recentchangeslinked-summary' => "विशेषपृष्ठेषु वर्गान्तर्गतपृष्ठेषु वा सद्यो जातानां परिवर्तनानाम् एषा आवलिः ।
 
-[[Special:Watchlist|भवतà¤\83/भवतà¥\8dयाà¤\83 à¤\85वà¥\87à¤\95à¥\8dषणावलिà¤\83]] à¤\85तà¥\8dर à¤µà¤¿à¤¦à¥\8dयमानानि à¤ªà¥\83षà¥\8dठानि '''स्थूलाक्षरैः''' दर्शितानि।",
+[[Special:Watchlist|भवतà¤\83/भवतà¥\8dयाà¤\83 à¤\85वà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\82]] à¤µà¤¿à¤¦à¥\8dयमानानि à¤ªà¥\83षà¥\8dठानि à¤\85तà¥\8dर '''स्थूलाक्षरैः''' दर्शितानि।",
 'recentchangeslinked-page' => 'पृष्ठनाम:',
-'recentchangeslinked-to' => 'à¤\85सà¥\8dमिनà¥\8d à¤¸à¥\8dथानà¥\87 à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤\82बद्धानां पृष्ठानां परिवर्तनानि दर्श्यन्ताम्',
+'recentchangeslinked-to' => 'à¤\85सà¥\8dमिनà¥\8d à¤¸à¥\8dथानà¥\87 à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤®à¥\8dबद्धानां पृष्ठानां परिवर्तनानि दर्श्यन्ताम्',
 
 # Upload
 'upload' => 'सञ्चिका आरोप्यताम्',
@@ -1852,7 +1866,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'filehist-comment' => 'टिप्पणी',
 'filehist-missing' => 'सञ्चिका विनष्टा ।',
 'imagelinks' => 'सञ्चिकायाः उपयोगः',
-'linkstoimage' => '{{PLURAL:$1|अधो निर्दिष्टपृष्ठस्य परिसन्धयः|$1 अधो निर्दिष्टपृष्ठानां परिसन्धिः} अत्र {{PLURAL:$1|संलग्नाः सन्ति|सल्लग्ना अस्ति}} :',
+'linkstoimage' => '{{PLURAL:$1|अधो निर्दिष्टपृष्ठस्य परिसन्धयः संलग्नाः सन्ति|$1 अधो निर्दिष्टपृष्ठानां परिसन्धिः संलग्ना अस्ति}}:',
 'linkstoimage-more' => '{{PLURAL:$1|$1}} तः अधिकपुटानि अस्यां सञ्चिकायां योज्यन्ते । 
 अधोनिदेशितसूची सञ्चिकाभिः योजनीयपुटानि पश्यति ।{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठ}} 
 [[Special:WhatLinksHere/$2|पूर्णसूची]] अपि लभ्यते ।',
@@ -1934,7 +1948,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'randomredirect-nopages' => '$1नामस्थाने चालनानि न सन्ति ।',
 
 # Statistics
-'statistics' => 'साङ्ख्यकी',
+'statistics' => 'साà¤\99à¥\8dà¤\96à¥\8dयिà¤\95à¥\80',
 'statistics-header-pages' => 'पुटसाङ्ख्यिकाः ।',
 'statistics-header-edits' => 'सङ्ख्यिकाः सम्पादयतु ।',
 'statistics-header-views' => 'साङ्ख्यिकाः अवलोकयतु ।',
@@ -2032,7 +2046,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'newpages' => 'नवीनपृष्ठानि',
 'newpages-username' => 'योजकनामन्:',
 'ancientpages' => 'प्राचीनतमानि पृष्ठानि',
-'move' => 'à¤\9aाल्यताम्',
+'move' => 'शà¥\80रà¥\8dषà¤\95à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dत्यताम्',
 'movethispage' => 'इदं पृष्ठं चाल्यताम्',
 'unusedimagestext' => 'अधो दत्तसञ्चिकाः सन्ति किन्तु कस्मिंश्चिदपि पुटे न न्यस्ताः ।',
 'unusedcategoriestext' => 'निम्नलिखितवर्गाः सन्ति तथापि अन्यपुटं वर्गः वा न उपयुङ्क्ते ।',
@@ -2270,7 +2284,7 @@ Feedback and further assistance:
 'historywarning' => "' पूर्वसूचना ''' भवता अपमर्जनसिद्धपुटे बहुशः  $1 इतिहासयुक्तः अस्ति ।{{PLURAL:$1|revision|revisions}}:",
 'confirmdeletetext' => 'भवान् एकं पृष्ठं तस्य अखिलेन इतिहासेन सहितं अपाकर्तुं प्रवृत्तोऽस्ति। कृपया सुपुष्टीकरोतु यत् भवतः एतदेव आशयः, यद् भवता अस्य परिणामाः सुविज्ञाताः सन्ति तथा च भवता क्रियैषा [[{{MediaWiki:Policy-url}}| यथानीति]] सम्पाद्यते।',
 'actioncomplete' => 'कार्यं सम्पन्नम्',
-'actionfailed' => 'à¤\95ारà¥\8dयà¤\82 à¤°à¤¿à¤·à¥\8dà¤\9fà¤\82 (failed)',
+'actionfailed' => 'à¤\95ारà¥\8dयà¤\82 à¤°à¤¿à¤·à¥\8dà¤\9fमà¥\8d (failed)',
 'deletedtext' => '"$1" इत्येतद् अपाकृतमस्ति।
 सद्यःकृतानां अपाकरणानाम् अभिलेखः $2 इत्यस्मिन् पश्यतु।',
 'dellogpage' => 'अपाकरणानाम् आवलिः',
@@ -2432,11 +2446,11 @@ $2 द्वारा सम्पादितां अन्तिमावृ
 'tooltip-invert' => 'चितनामस्थाने परिवर्तनं गोपयितुं मञ्जूषाम् अर्गलयतु ।',
 'namespace_association' => 'सम्बद्धं नामस्थानम् ।',
 'tooltip-namespace_association' => 'चितनामस्थानेन सह सम्बद्धं विषयनामस्थानम् अथवा सम्भाषणम् अपि उपादातुम् इमां मञ्जूषाम् अर्गलयतु ।',
-'blanknamespace' => '(मà¥\81à¤\96à¥\8dयà¤\83)',
+'blanknamespace' => '(मà¥\81à¤\96à¥\8dयमà¥\8d)',
 
 # Contributions
 'contributions' => '{{GENDER:$1|प्रयोक्तॄणां}} योगदानानि',
-'contributions-title' => '$1 à¤\95à¥\83तà¥\87 à¤¯à¥\8bà¤\97दानà¤\82',
+'contributions-title' => '$1 à¤\95à¥\83तà¥\87 à¤¯à¥\8bà¤\9cà¤\95सà¥\8dय à¤¯à¥\8bà¤\97दानानि',
 'mycontris' => 'योगदानानि',
 'contribsub2' => '($2) कृते {{GENDER:$3|$1}}',
 'nocontribs' => 'एतादृशयोग्यताभिः समं परिवर्तनानि न दृष्टानि ।',
@@ -2459,25 +2473,25 @@ $2 द्वारा सम्पादितां अन्तिमावृ
 नूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति:',
 'sp-contributions-search' => 'योगदानानि अन्विष्यन्ताम्',
 'sp-contributions-username' => 'अन्तर्जालसंविद् (I P address) योजकनाम वा :',
-'sp-contributions-toponly' => 'समà¥\8dपादनानाà¤\82 à¤\95à¥\87वलà¤\82 à¤¨à¥\82तनातमा आवलिः दृश्यताम्',
+'sp-contributions-toponly' => 'समà¥\8dपादनानाà¤\82 à¤¨à¥\82तनतमा आवलिः दृश्यताम्',
 'sp-contributions-submit' => 'अन्विष्यताम्',
 
 # What links here
 'whatlinkshere' => 'अनेन सह सम्बद्धाः',
 'whatlinkshere-title' => '"$1" सम्बद्धानि पृष्ठानि',
 'whatlinkshere-page' => 'पृष्ठम्:',
-'linkshere' => "'''[[:$1]]''' इत्यनेन सह अधोलिखितानां पृष्ठानां परिसन्धिं करोतु:",
+'linkshere' => "'''[[:$1]]''' इत्यनेन सह अधो लिखितानां पृष्ठानां परिसन्धिं करोतु:",
 'nolinkshere' => "'''[[:$1]]''' इत्यनेन सह न किमपि पृष्ठं परिसन्धितम्",
 'nolinkshere-ns' => "चितनामस्थानात्  '''[[:$1]]''' इत्येनं योजनयोग्यं पुटं नास्ति  ।",
 'isredirect' => 'अनुप्रेषण-पृष्ठम्',
 'istemplate' => 'अन्यलेखभागः (transclusion)',
 'isimage' => 'सञ्चिकासम्बन्धः',
 'whatlinkshere-prev' => '{{PLURAL:$1|पुरस्तात् (previous) $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|परसà¥\8dतात् $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|à¤\85à¤\97à¥\8dरिमम् $1}}',
 'whatlinkshere-links' => '← परिसन्धयः',
-'whatlinkshere-hideredirs' => '$1 पुनर्निर्दिष्टानि',
-'whatlinkshere-hidetrans' => '$1 अन्यलेखभागः (transclusions)',
-'whatlinkshere-hidelinks' => '$1 à¤ªà¤°à¤¿à¤¸à¤¨à¥\8dधिः',
+'whatlinkshere-hideredirs' => '$1 पुनर्निर्दिष्टानि पृष्ठानि',
+'whatlinkshere-hidetrans' => '$1 à¤\85नà¥\8dयलà¥\87à¤\96भाà¤\97ाà¤\83 (transclusions)',
+'whatlinkshere-hidelinks' => '$1 à¤ªà¤°à¤¿à¤¸à¤¨à¥\8dधयः',
 'whatlinkshere-hideimages' => '$1 चित्रपरिसन्धिः',
 'whatlinkshere-filters' => 'शोधनी',
 
@@ -2558,7 +2572,7 @@ $2 द्वारा सम्पादितां अन्तिमावृ
 'blocklink' => 'अवरुद्ध्यताम्',
 'unblocklink' => 'अवरोधः निरस्त्यताम्',
 'change-blocklink' => 'अवरोधः परिवर्त्यताम्',
-'contribslink' => 'यà¥\8bà¤\97दानमà¥\8d',
+'contribslink' => 'यà¥\8bà¤\97दानानि',
 'emaillink' => 'विद्युन्मानपत्रं प्रेषयतु ।',
 'autoblocker' => 'भवतः ऐपि सङ्केतः स्वयम् अवरुद्धः यः सद्यः काले एव [[User:$1|$1]]" इत्यनेन उपयुक्तः । 
 $1 इत्यस्य अवरोधस्य कारणं तु "$2" अस्ति ।',
@@ -2836,34 +2850,34 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'tooltip-pt-anontalk' => 'एतस्मात् ऐपिसङ्केतात् सम्पादनस्य परिचर्चा ।',
 'tooltip-pt-preferences' => 'भवतः/भवत्याः इष्टतमानि',
 'tooltip-pt-watchlist' => 'भवतः/भवत्याः निरीक्षासूच्यां विद्यमानानां पृष्ठानाम् आवलिः',
-'tooltip-pt-mycontris' => 'भवतà¤\83/भवतà¥\8dयाà¤\83 à¤¯à¥\8bà¤\97दानसà¥\8dय आवलिः',
+'tooltip-pt-mycontris' => 'भवतà¤\83/भवतà¥\8dयाà¤\83 à¤¯à¥\8bà¤\97दानानामà¥\8d आवलिः',
 'tooltip-pt-login' => 'सम्प्रवेशाय प्रोत्सहामहे । परन्तु सम्प्रवेशः ऐच्छिकः ।',
 'tooltip-pt-logout' => 'निर्गमनम्',
-'tooltip-ca-talk' => 'पà¥\83षà¥\8dठाऽनà¥\8dतरà¥\8dà¤\97ताय à¤µà¤¿à¤·à¤¯à¤¾à¤¯ चर्चा',
+'tooltip-ca-talk' => 'विषयसहितानाà¤\82 à¤ªà¥\83षà¥\8dठानाà¤\82 चर्चा',
 'tooltip-ca-edit' => 'इदं पृष्ठं सम्पादयितुं शक्यते । रक्षणात्पूर्वं कृपया प्राग्दृश्यं दृश्यताम् ।',
 'tooltip-ca-addsection' => 'नूतनविभागः आरभ्यताम्',
-'tooltip-ca-viewsource' => 'à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤\82रà¤\95à¥\8dषितà¤\82 à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ à¤\85सà¥\8dय à¤¸à¥\8dरà¥\8bतà¤\82 द्रष्टुं शक्यते ।',
+'tooltip-ca-viewsource' => 'à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤\82रà¤\95à¥\8dषितà¤\82 à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ à¤\85सà¥\8dय à¤¸à¥\8dरà¥\8bतà¤\83 द्रष्टुं शक्यते ।',
 'tooltip-ca-history' => 'अस्य पृष्ठस्य पुरातनाऽऽवृत्तिः',
 'tooltip-ca-protect' => 'इदं पृष्ठं संरक्ष्यताम्',
 'tooltip-ca-unprotect' => 'अस्य पुटास्य सुरक्षां परिवर्तयतु ।',
 'tooltip-ca-delete' => 'इदं पृष्ठम् अपाक्रियताम्',
 'tooltip-ca-undelete' => 'अस्य पुटस्य अपमर्जनात् पूर्वम् अस्य सम्पादनानि पुनस्थापयतु ।',
-'tooltip-ca-move' => 'à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¨à¤¾à¤® परिवर्त्यताम्',
+'tooltip-ca-move' => 'à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¶à¥\80रà¥\8dषà¤\95à¤\82 परिवर्त्यताम्',
 'tooltip-ca-watch' => 'इदं पृष्ठं भवतः/भवत्याः अवेक्षणावल्यां योज्यताम्',
 'tooltip-ca-unwatch' => 'भवतः/भवत्याः अवेक्षणसूच्याः इदं पृष्ठं निष्कास्यताम्',
 'tooltip-search' => '{{SITENAME}} अन्विष्यताम्',
 'tooltip-search-go' => 'समानशिरोनामयुक्तं पृष्ठं विद्यते चेत् तत्र गम्यताम्',
-'tooltip-search-fulltext' => 'à¤\8fनà¤\82 à¤µà¤¾à¤\95à¥\8dयाà¤\82शà¤\82 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 अन्विष्यताम्',
+'tooltip-search-fulltext' => 'पà¥\83षà¥\8dठà¥\87षà¥\81 à¤\8fषà¤\83 à¤µà¤¾à¤\95à¥\8dयाà¤\82शà¤\83 अन्विष्यताम्',
 'tooltip-p-logo' => 'मुख्यपृष्ठं गम्यताम्',
 'tooltip-n-mainpage' => 'मुख्यपृष्ठं गम्यताम्',
 'tooltip-n-mainpage-description' => 'मुख्यपृष्ठं गम्यताम्',
-'tooltip-n-portal' => 'तà¥\8dवया à¤ªà¥\8dरà¤\95लà¥\8dपविषयà¥\87 à¤\95िà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87, à¤\95à¥\81तà¤\83 साहाय्यं प्राप्तव्यम्',
+'tooltip-n-portal' => 'तà¥\8dवया à¤ªà¥\8dरà¤\95लà¥\8dपविषयà¥\87 à¤\95िà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87, à¤\95à¥\81थà¤\82 साहाय्यं प्राप्तव्यम्',
 'tooltip-n-currentevents' => 'वर्तमानप्रसङ्गानां पृष्ठभूमिका प्राप्यताम्',
-'tooltip-n-recentchanges' => 'सदà¥\8dयपरिवर्तनानाम् आवलिः',
+'tooltip-n-recentchanges' => 'नवà¥\80नपरिवर्तनानाम् आवलिः',
 'tooltip-n-randompage' => 'अशृङ्खलं (random) पृष्ठं गम्यताम्',
-'tooltip-n-help' => 'à¤\85नà¥\8dवà¥\87षणसà¥\8dथानम्',
+'tooltip-n-help' => 'à¤\85नà¥\8dवà¥\87षणसà¥\8dथलम्',
 'tooltip-t-whatlinkshere' => 'अत्र सम्बद्धानां परिसन्धितानां विकि-पृष्ठानाम् आवलिः',
-'tooltip-t-recentchangeslinked' => 'à¤\8fततà¥\8dपà¥\83षà¥\8dठसमà¥\8dबदà¥\8dधà¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤¸à¤¦à¥\8dयà¤\9cातानि परिवर्तनानि',
+'tooltip-t-recentchangeslinked' => 'à¤\8fततà¥\8dपà¥\83षà¥\8dठसमà¥\8dबदà¥\8dधà¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤\9cातानि à¤¨à¤µà¥\80नपरिवर्तनानि',
 'tooltip-feed-rss' => 'अस्मै पृष्ठाय आर-एस-एस-पूरणम्',
 'tooltip-feed-atom' => 'अस्मै पृष्ठाय अणुपूरणम्',
 'tooltip-t-contributions' => 'अस्य योजकस्य योगदानानाम् आवलिः',
@@ -2872,20 +2886,20 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'tooltip-t-specialpages' => 'सर्वेषां विशिष्टपृष्ठानाम् आवलिः',
 'tooltip-t-print' => 'अस्य पृष्ठस्य मुद्रणयोग्या आवृत्तिः',
 'tooltip-t-permalink' => 'पृष्ठस्यास्य स्थायिपरिसन्धिः',
-'tooltip-ca-nstab-main' => 'à¤\86नà¥\8dतरà¥\8dविषयà¤\95ं पृष्ठं पश्यतु',
+'tooltip-ca-nstab-main' => 'विषययà¥\81à¤\95à¥\8dतं पृष्ठं पश्यतु',
 'tooltip-ca-nstab-user' => 'योजकपृष्ठं दृश्यताम्',
 'tooltip-ca-nstab-media' => 'माध्यमपुटम् अवलोकयतु ।',
-'tooltip-ca-nstab-special' => 'à¤\87दमà¥\87à¤\95à¤\82 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fà¤\82 à¤ªà¥\83षà¥\8dठमà¥\8d, भवान्/भवती इदं पृष्ठं सम्पादयितुं नार्हति ।',
+'tooltip-ca-nstab-special' => 'à¤\87दमà¥\87à¤\95à¤\82 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fà¤\82 à¤ªà¥\83षà¥\8dठà¤\82, भवान्/भवती इदं पृष्ठं सम्पादयितुं नार्हति ।',
 'tooltip-ca-nstab-project' => 'प्रकल्पपृष्ठं दृश्यताम्',
 'tooltip-ca-nstab-image' => 'सञ्चिकापृष्ठं दृश्यताम्',
 'tooltip-ca-nstab-mediawiki' => 'तन्त्रसन्देशान् अवलोकयतु ।',
 'tooltip-ca-nstab-template' => 'फलकं दृश्यताम्',
 'tooltip-ca-nstab-help' => 'साहाय्यपुटम् अवलोकयतु ।',
 'tooltip-ca-nstab-category' => 'वर्गाणां पृष्ठं दृश्यताम्',
-'tooltip-minoredit' => 'लà¤\98à¥\81परिवरà¥\8dतनतà¥\8dवà¥\87न à¤\87दà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनम् अङ्क्यताम्',
+'tooltip-minoredit' => 'लà¤\98à¥\81समà¥\8dपादनतà¥\8dवà¥\87न à¤\87दà¤\82 à¤¸à¤®à¥\8dपादनम् अङ्क्यताम्',
 'tooltip-save' => 'परिवर्तनानि रक्ष्यन्ताम्',
 'tooltip-preview' => 'भवता/भवत्या कृतानां परिवर्तनानां प्राग्दृश्यं दृश्यताम्, रक्षणात्पूर्वं कृपया इदम् उपयुज्यताम्।',
-'tooltip-diff' => 'भवता/भवतà¥\8dया à¤\85तà¥\8dर à¤\95à¥\83तानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि द्रष्टुं शक्यते',
+'tooltip-diff' => 'भवता/भवतà¥\8dया à¤\95à¥\83तानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤\85तà¥\8dर द्रष्टुं शक्यते',
 'tooltip-compareselectedversions' => 'पृष्ठस्य द्वयोः चितयोः आवृत्त्योः भेदः दृश्यताम्',
 'tooltip-watch' => 'इदं पृष्ठं भवतः/भवत्याः अवेक्षणावल्यां योज्यताम्',
 'tooltip-watchlistedit-normal-submit' => 'शीर्षकानि अपनयतु ।',
@@ -2893,9 +2907,9 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'tooltip-recreate' => 'एतत्पुटं पूर्वमेव अपमर्जितः अतः पुन सृजतु ।',
 'tooltip-upload' => 'उत्तारणम् आरभताम्',
 'tooltip-rollback' => '"प्रत्याहरणम् (roll back)" इत्येतत् अन्तिमसम्पादकस्य अन्तिमयोगदानं निराकरोति ।',
-'tooltip-undo' => '"पूर्ववत्" इति अन्तिमसम्पादनम् अपाकरोति, सम्पादनप्रारूपं प्राग्दृश्यरूपेण उद्घाटयति, नवीनसम्पादनान्तरं सम्पादनपृष्ठं प्राग्दृश्यत्वेन प्रदर्शयति च । 
+'tooltip-undo' => '\'"पूर्ववत्"\' इति अन्तिमसम्पादनम् अपाकरोति, सम्पादनप्रारूपं प्राग्दृश्यरूपेण उद्घाटयति, नवीनसम्पादनानन्तरं सम्पादनपृष्ठं प्राग्दृश्यत्वेन प्रदर्शयति च । 
 
-à¤\85सà¥\8dय à¤¸à¤¾à¤°à¤¾à¤\82शà¥\87 à¤\85पाà¤\95रणसà¥\8dय à¤\95ारणमपि à¤²à¥\87खितुं शक्यते ।',
+à¤\85सà¥\8dय à¤¸à¤¾à¤°à¤¾à¤\82शà¥\87 à¤\85पाà¤\95रणसà¥\8dय à¤\95ारणमपि à¤²à¤¿खितुं शक्यते ।',
 'tooltip-preferences-save' => 'आद्यताः रक्षतु ।',
 'tooltip-summary' => 'सङ्क्षिप्तसारांशः योज्यताम्',
 
@@ -3053,13 +3067,13 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 # Bad image list
 'bad_image_list' => 'अत्र प्रारूपं एवं भवेत् -
 
-à¤\95à¥\87वलमà¥\8d à¤\86वलà¥\8dयनà¥\8dतरà¥\8dà¤\97ताà¤\83 à¤µà¤¿à¤·à¤¯à¤¾à¤\83 (* à¤\87ति à¤\9aिनà¥\8dहात् आरभमाणाः पङ्क्तयः) आकलिताः ।
+à¤\95à¥\87वलमà¥\8d à¤\86वलà¥\8dयनà¥\8dतरà¥\8dà¤\97ताà¤\83 à¤µà¤¿à¤·à¤¯à¤¾à¤\83 (* à¤\87ति à¤\9aिहà¥\8dनात् आरभमाणाः पङ्क्तयः) आकलिताः ।
 
 पङ्क्त्यां विद्यमाना प्रथमा परिसन्धिः (link) दोषपूर्णया सञ्चिकया सह परिसन्धिता (linked) स्यादेव । तस्यामेव पङ्क्तौ उत्तरोत्तरं विद्यमानाः परिसन्धयः अपवादिताः ज्ञेयाः, अर्थात् अत्र तेषां पृष्ठानाम् आवलिरेव भविष्यति, येषु एषा सञ्चिका विद्यते ।',
 
 # Metadata
 'metadata' => 'प्रदत्तांशः (दत्तांशविषयकदत्तांशः अयम्)',
-'metadata-help' => 'à¤\85नà¥\87न à¤¸à¤¹ à¤µà¤¿à¤¸à¥\8dतà¥\83तमाहितà¥\80 सल्लग्ना अस्ति, प्रतिबिम्बग्राहकेन (scanner) अङ्कीयछायाचित्रग्राहकेन (digital camera ) वा अस्याः सञ्चिकायाः रचना जाता स्यात् । 
+'metadata-help' => 'à¤\85नà¥\87न à¤¸à¤¹ à¤µà¤¿à¤¸à¥\8dतà¥\83तसà¥\82à¤\9aना सल्लग्ना अस्ति, प्रतिबिम्बग्राहकेन (scanner) अङ्कीयछायाचित्रग्राहकेन (digital camera ) वा अस्याः सञ्चिकायाः रचना जाता स्यात् । 
 
 एषा सञ्चिका यदि मूलावस्थात् परिवर्त्यते, तर्हि अत्रस्थानि कानिचित् विवरणानि परिवर्तितसञ्चिकायां पूर्णतया न दृश्यन्ते ।',
 'metadata-expand' => 'विस्तारितानि विवरणानि दर्शयतु',
@@ -3617,14 +3631,14 @@ $5
 # Watchlist editing tools
 'watchlisttools-view' => 'योग्यपरिवर्तनानि दृश्यन्ताम्',
 'watchlisttools-edit' => 'अवेक्षणाऽऽवलिः दृश्यतां, सम्पाद्यतां च',
-'watchlisttools-raw' => 'à¤\85पà¤\95à¥\8dवामà¥\8d à¤\85वलà¥\8bà¤\95नावलà¥\80à¤\82 à¤¸à¤®à¥\8dपादयतà¥\81 à¥¤',
+'watchlisttools-raw' => 'विवरणरहिता à¤\85वलà¥\8bà¤\95नावलिà¤\83 à¤¸à¤®à¥\8dपादà¥\8dयतामà¥\8d',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|अम्भाषणम्]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'अज्ञातं वर्तमानसूत्रम् $1',
-'duplicate-defaultsort' => '\'\'\'पà¥\82रà¥\8dवसà¥\82à¤\9aना\'\'\' "$1" à¤\87ति à¤ªà¥\81रातनà¤\82 à¤®à¥\82लà¤\95à¥\8dरमाà¤\99à¥\8dà¤\95नà¤\82 à¤\95à¥\81डà¥\8dमलà¤\82 à¤µà¤¿à¤¹à¤¾à¤¯  "$2" à¤\87ति à¤¨à¤µà¥\80नà¤\82 à¤®à¥\82लà¤\95à¥\8dरमाà¤\99à¥\8dà¤\95नà¤\95à¥\81णà¥\8dडलतà¥\8dवà¥\87न à¤¸à¥\8dवयमà¥\87व à¤¨à¤¯à¤¤à¤¿ à¤\8fततà¥\8d à¥¤',
+'duplicate-defaultsort' => '\'\'\'पूर्वसूचना\'\'\' "$1" इति पुरातनं मूलक्रमाङ्कनकुड्मलं विहाय  "$2" इति नवीनं मूलक्रमाङ्कनकुण्डलत्वेन स्वयमेव नयति एतत् ।',
 
 # Special:Version
 'version' => 'आवृत्तिः',
@@ -3693,10 +3707,10 @@ $5
 # External image whitelist
 'external_image_whitelist' => '# एषा पङ्क्तिः न परिवर्त्यताम् <pre>
 # अत्र केवलं सामान्यचिह्नानाम् उपयोगः क्रियताम् (यथा // इत्यनयोः मध्ये स्थापनीयः भागः)
-# à¤\87तà¥\8dयसà¥\8dय à¤¬à¤¹à¤¿à¤¸à¥\8dतातà¥\8d à¤\86à¤\97तानाà¤\82 à¤\9aितà¥\8dराणाà¤\82 à¤¸à¤¾à¤°à¥\8dवसà¤\99à¥\8dà¤\95à¥\87तà¥\88à¤\83 (U R L) à¤¸à¤¹ तुलना भवति
+# à¤¬à¤¹à¤¿à¤¸à¥\8dतातà¥\8d à¤\86à¤\97तानाà¤\82 à¤\9aितà¥\8dराणाà¤\82 à¤¸à¤¾à¤°à¥\8dवसà¤\99à¥\8dà¤\95à¥\87तà¥\88à¤\83 (U R L) à¤¸à¤¹ à¤\8fतà¥\87षाà¤\82 तुलना भवति
 # यत् चित्रम् अनुकूलं भवति तत् योज्यते, अन्यथा तस्य चित्रस्य परिसन्धिः योज्यते । 
-# à¤ªà¤\99à¥\8dà¤\95तयà¤\83 # à¤\87तसà¥\8dमातà¥\8d à¤\86रभनà¥\8dतà¥\87 à¥¤ à¤\8fततà¥\8d à¤¸à¥\82à¤\9aना à¤\87ति à¤\89à¤\9aà¥\8dयतà¥\87 à¥¤ 
-# अत्र सर्वं पक्षविगुणं case-insensitive वर्तते 
+# à¤¯à¤¾à¤\83 à¤ªà¤\99à¥\8dà¤\95à¥\8dतयà¤\83 # à¤\87तà¥\8dयसà¥\8dमातà¥\8d à¤\86रभनà¥\8dतà¥\87, à¤¤à¤¾à¤\83 à¤¸à¥\82à¤\9aनाà¤\83
+# अत्र सर्वं पक्षविगुणं (case-insensitive) वर्तते 
 # सर्वान् regex भागान् अस्याः पङ्क्तेः उपरि स्थापयतु । एतां पङ्क्तिम् एवमेव स्थापयतु </pre>',
 
 # Special:Tags
index 136a516..236ec4c 100644 (file)
@@ -1818,6 +1818,11 @@ Input: contenttype/subtype, e.g. <code>image/jpeg</code>.',
 # List redirects
 'listredirects' => 'Leet o reguidals',
 
+# List duplicated files special page
+'listduplicatedfiles' => 'Leet o files wi dupleecates',
+'listduplicatedfiles-summary' => 'This is ae leet o files whaur the maist recynt version o the file is ae duplicate o the maist recynt version o some ither file. Yinlie local files ar conseederit.',
+'listduplicatedfiles-entry' => '[[:File:$1|$1]] haes [[$3|{{PLURAL:$2|ae dupleecate|$2 dupleecates}}]].',
+
 # Unused templates
 'unusedtemplates' => 'Templates that arena uised',
 'unusedtemplatestext' => "This page leets aw pages in the {{ns:template}} namespace that's naw incuidit in anither page. Mynd n check fer ither links til the templates afore delytin thaim.",
index 4de2191..2633718 100644 (file)
@@ -2155,6 +2155,11 @@ Kanske vill du redigera beskrivningen på dess [$2 filbeskrivningssida] där.',
 # List redirects
 'listredirects' => 'Lista över omdirigeringar',
 
+# List duplicated files special page
+'listduplicatedfiles' => 'Lista över filer med dubbletter',
+'listduplicatedfiles-summary' => 'Detta är en lista över filer där den senaste versionen av filen är en dubblett av den senaste versionen av någon annan fil. Endast lokala filer behandlas.',
+'listduplicatedfiles-entry' => '[[:File:$1|$1]] har [[$3|{{PLURAL:$2|en dubblett|$2 dubbletter}}]].',
+
 # Unused templates
 'unusedtemplates' => 'Oanvända mallar',
 'unusedtemplatestext' => 'Denna sida listar alla sidor i {{ns:template}}-namnrymden som inte inkluderas på någon annan sida.
index c63bd5b..05ef03f 100644 (file)
@@ -478,6 +478,8 @@ Matatagpuan ang isang tala ng mga tamang natatanging pahina sa [[Special:Special
 'databaseerror' => 'Kamalian sa kalipunan ng datos',
 'databaseerror-text' => 'Mayroong kamalian sa pagtanong o pag-query sa database.
 Maaring ipinapahiwatig nito ang depekto o bug sa software.',
+'databaseerror-textcl' => 'May nangyaring depekto sa pag-query ng database.',
+'databaseerror-error' => 'Depekto: $1',
 'laggedslavemode' => "'''Babala:''' Maaaring hindi naglalaman ang pahina ng mga huling dagdag.",
 'readonly' => 'Nakakandado ang kalipunan ng datos',
 'enterlockreason' => 'Maglagay ng dahilan sa pagkakandado, kasama ang taya kung kailan magtatapos ang pagkakandado',
@@ -511,6 +513,7 @@ Maaaring ibinura na ito ng iba.',
 'cannotdelete-title' => 'Hindi maibura ang pahinang "$1"',
 'delete-hook-aborted' => 'Pinigil ng sungkit ang pagbura.
 Walang ibinigay na paliwanag.',
+'no-null-revision' => 'Hindi makalikha ng bagong "null" para sa pahina na "$1"',
 'badtitle' => 'Hindi kanais-nais na pamagat',
 'badtitletext' => 'Ang hiniling na pamagat ng pahina ay hindi katanggap-tanggap, wala, o isang may-maling kawing na pamagat na pangugnayang-wika (interwika) o pangugnayang wiki (interwiki).
 Maaaring naglalaman ito ng isa o higit pang mga panitik (karakter) na hindi maaaring gamitin para sa mga pamagat.',
@@ -523,10 +526,11 @@ Ang mga dato dito ay hindi pa masasariwa sa kasalukuyan.',
 'actionthrottled' => 'Hinadlangan ang gawain',
 'actionthrottledtext' => "Bilang paraang panglaban sa ''spam'', pinigalan kang magawa ang galaw na ito nang maraming ulit sa loob ng maikling panahon, at lumabis ka na sa limitasyong ito.
 Pakisubok na lang ulit pagkaraan ng kaunting mga minuto.",
-'protectedpagetext' => 'Kinandado ang pahinang ito upang mahadlangang ang pagbago.',
+'protectedpagetext' => 'Kinandado ang pahinang ito upang mahadlangang ang pagbago o ibang aksyon.',
 'viewsourcetext' => 'Maaari mong tingnan at kopyahin ang pinagmulan ng pahinang ito:',
 'viewyourtext' => "Matitingnan at makukopya mo ang pinagmulan ng '''mga pagbabago''' papunta sa pahinang ito:",
-'protectedinterface' => "Nagbibigay ang pahinang ito ng tekstong panghangganan (''interface'') para sa sopwer, at ikinandado para maiwasan ang pangaabuso.",
+'protectedinterface' => 'Nagbibigay ang pahinang ito ng tekstong interface para sa software, at ikinandado para maiwasan ang pangaabuso.
+Upang dagdagan o baguhin ang mga salin para sa lahat ng mga wiki, pakigamit ang [//translatewiki.net/ translatewiki.net], ang proyekto para sa lokalisasyon ng MediaWiki.',
 'editinginterface' => "'''Babala:''' Binabago mo ang isang pahinang ginagamit sa pagbibigay ng tekstong panghangganan para sa sopwer.
 Makaaapekto ang mga pagbago sa pahinang ito sa anyo ng hangganang (''interface'') pantagagamit na para sa ibang mga tagagamit sa wiking ito.
 Upang magdagag o magbago ng mga salinwika, isaaalang-alang na lang po ang paggamit ng [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang proyekto para sa lokalisasyon ng MediaWiki.",
@@ -537,6 +541,8 @@ $2',
 'customjsprotected' => 'Wala kang pahintulot na baguhin ang pahina ng JavaScript na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
 'mycustomcssprotected' => 'Wala kang pahintulot na baguhin itong pahinang CSS.',
 'mycustomjsprotected' => 'Wala kang pahintulot na baguhin itong pahinang JavaScript.',
+'myprivateinfoprotected' => 'Wala kang pahintulot na baguhin ang iyong pribadong impormasyon.',
+'mypreferencesprotected' => 'Wala kang pahintulot na baguhin ang iyong mga kagustuhan.',
 'ns-specialprotected' => 'Hindi pwedeng baguhin ang mga natatanging pahina.',
 'titleprotected' => "Nakasanggalang ang pamagat na ito mula sa paglikha ni [[User:$1|$1]].
 Ang ibinigay na dahilan ay ''$2''.",
@@ -546,7 +552,8 @@ Ang tagapangasiwang nagkandado nito ay nag-alok ng ganitong paliwanag: "$3".',
 'invalidtitle-knownnamespace' => 'Hindi katanggap-tanggap na pamagat na may puwang na pampangalang "$2" at tekstong "$3"',
 'invalidtitle-unknownnamespace' => 'Hindi katanggap-tanggap na pamagat na mayroong hindi nalalamang bilang na pampuwang ng pangalan na $1 at tekstong "$2"',
 'exception-nologin' => 'Hindi nakalagda',
-'exception-nologin-text' => 'Ang pahina o kilos na ito ay nangangailangan ng paglagda mo sa wiking ito.',
+'exception-nologin-text' => '[[Natatangi:Paglagda_ng_tagagamit|Mag-login]] upang ma-access ang aksyon o pahinang ito.',
+'exception-nologin-text-manual' => '$1 upang ma-access ang pahina o aksyong ito.',
 
 # Virus scanner
 'virus-badscanner' => "Masamang kompigurasyon: hindi kilalang tagahagilap (iskaner) ng birus: ''$1''",
@@ -554,10 +561,9 @@ Ang tagapangasiwang nagkandado nito ay nag-alok ng ganitong paliwanag: "$3".',
 'virus-unknownscanner' => 'hindi kilalang panlaban sa birus:',
 
 # Login and logout pages
-'logouttext' => "'''Nakaalis ka na sa pagkakalagda.'''
+'logouttext' => '<strong>Nakaalis ka na sa pagkaka-login.</strong>
 
-Maaari kang tumuloy sa paggamit ng {{SITENAME}} nang hindi nakikilala (anonimo), o maaaring kang <span class='plainlinks'>[$1 lumagda/tumala muli]</span> bilang kapareho o ibang tagagamit.
-Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakalagda ka pa rin, hanggang sa linisin mo ang iyong baunang pambasa-basa (''browser cache'').",
+Tandaan na may ilang mga pahina na patuloy na nagpapakita na parang hindi ka naka-login, hanggang alisin mo ang iyong <i>browser cache</i>.',
 'welcomeuser' => 'Mabuhay, $1!',
 'welcomecreation-msg' => 'Nilikha na ang iyong kuwenta.
 Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
@@ -565,18 +571,18 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'userlogin-yourname' => 'Pangngalan',
 'userlogin-yourname-ph' => 'Ilagay ang iyong Pangalan',
 'createacct-another-username-ph' => 'Ilagay ang Pangalan',
-'yourpassword' => 'Hudyat:',
+'yourpassword' => 'Password:',
 'userlogin-yourpassword' => 'Hudyat',
 'userlogin-yourpassword-ph' => 'Ipasok ang iyong hudyat',
 'createacct-yourpassword-ph' => 'Ilagay ang hudyat (password)',
-'yourpasswordagain' => 'Hudyat mo uli:',
+'yourpasswordagain' => 'Password mo uli:',
 'createacct-yourpasswordagain' => 'Tiyakin ang hudyat',
 'createacct-yourpasswordagain-ph' => 'Muling ilagay ang hudyat (password)',
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
 'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
 'userlogin-signwithsecure' => 'Gumamit ng ligtas na koneksyon',
 'yourdomainname' => 'Dominyo mo:',
-'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
+'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga password sa wiking ito.',
 'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
 'login' => 'Lumagda',
 'nav-login-createaccount' => 'Lumagda / lumikha ng kuwenta',
@@ -595,18 +601,29 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'gotaccountlink' => 'Lumagda',
 'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
 'userlogin-resetpassword-link' => 'Nakalimutan ba ang iyong hudyat (password)?',
+'userlogin-helplink2' => 'Tulong sa pag-login',
+'userlogin-loggedin' => 'Naka-login ka na bilang {{GENDER:$1|$1}}. Gamitin ang form sa ibaba upang maka-login bilang ibang tagagamit o user.',
 'userlogin-createanother' => 'Lumikha ng iba pang akawnt',
 'createacct-join' => 'Ilagay ang iyong impormasyon sa ibaba.',
 'createacct-another-join' => 'Ilagay ang impormasyon ng bagong akawnt sa ibaba.',
 'createacct-emailrequired' => 'Direksiyong e-liham:',
-'createaccountmail' => 'Gumamit ng pansamantalang walang-piling hudyat at ipadala ito sa direksiyong e-liham na nakasaad sa ibaba',
+'createacct-emailoptional' => 'Email (hindi kailangan)',
+'createacct-email-ph' => 'Ipasok ang iyong email address',
+'createacct-another-email-ph' => 'Ipasok ang email address',
+'createaccountmail' => 'Gumamit ng pansamantalang random na password at ipadala ito sa email na nakasaad sa ibaba',
 'createacct-realname' => 'Tunay na pangalan (maaaring wala)',
 'createaccountreason' => 'Dahilan:',
 'createacct-reason' => 'Dahilan',
 'createacct-reason-ph' => 'Bakit ka gagawa ng isa pang akawnt?',
+'createacct-captcha' => 'Siyasatin ang seguridad',
 'createacct-imgcaptcha-ph' => 'Ilagay ang tekstong makikita sa itaas.',
+'createacct-submit' => 'Likhain ang iyong akawnt',
+'createacct-another-submit' => 'Lumikha ng ibang akawnt',
 'createacct-benefit-heading' => '{{SITENAME}} ay nilikha ng mga taong iyong katulad.',
-'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
+'createacct-benefit-body1' => '{{PLURAL:$1|pagbabago|mga pagbabago}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pahina|mga pahina}}',
+'createacct-benefit-body3' => 'kamakailang {{PLURAL:$1|nag-ambag|mga nag-ambag}}',
+'badretype' => 'Hindi magkatugma ang ipinasok mong mga password.',
 'userexists' => 'May gumagamit na ng ipinasok na bansag.
 Pumili po ng ibang pangalan.',
 'loginerror' => 'Kamalian sa paglagda',
@@ -632,15 +649,15 @@ Suriin ang iyong pagbabaybay, o [[Special:UserLogin/signup|lumikha ng bagong kuw
 Pakitingnan ang iyong pagbabaybay.',
 'nouserspecified' => 'Kailangang tukuyin mo ang isang pangalang pantagagamit.',
 'login-userblocked' => 'Hinarang ang tagagamit na ito.  Hindi pinahihintulutan ang paglalagda.',
-'wrongpassword' => 'Mali ang ipinasok na hudyat.
+'wrongpassword' => 'Mali ang ipinasok na password.
 Pakisubok muli.',
-'wrongpasswordempty' => 'Walang laman ang ipinasok na hudyat.
+'wrongpasswordempty' => 'Walang laman ang ipinasok na password.
 Pakisubok muli.',
 'passwordtooshort' => 'Ang mga hudyat ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).',
-'password-name-match' => 'Dapat magkaiba ang hudyat mo sa bansag mo.',
-'password-login-forbidden' => 'Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at hudyat.',
-'mailmypassword' => 'Baguhin ang hudyat',
-'passwordremindertitle' => 'Bagong pansamantalang hudyat para sa {{SITENAME}}',
+'password-name-match' => 'Dapat magkaiba ang password mo sa bansag o username mo.',
+'password-login-forbidden' => 'Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at password.',
+'mailmypassword' => 'Baguhin ang password',
+'passwordremindertitle' => 'Bagong pansamantalang password para sa {{SITENAME}}',
 'passwordremindertext' => 'Mayroong (na maaaring ikaw, mula sa adres ng IP na $1) humiling ng isang bagong
 hudyat para sa {{SITENAME}} ($4). Isang pansamantalang hudyat ang nilikha
 para sa tagagamit na "$2" at itinakda sa "$3".  Kung ito ang iyong pakay,
@@ -655,16 +672,16 @@ magpatuloy sa paggamit ng iyong lumang hudyat.',
 'passwordsent' => 'Isang bagong hudyat ang ipinadala sa adres ng e-liham na nakatala para kay "$1".
 Lumagda/Tumala lang po muli pagkaraan mong matanggap ito.',
 'blocked-mailpassword' => 'Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.',
-'eauthentsent' => 'Nagpadala ng isang e-liham na pangkompirmasyon doon sa iniharap na direksiyong e-liham.
-Bago magpadala ng iba pang e-liham sa kuwenta, kailangan mong sundin ang mga tagubiling nasa loob ng e-liham, para mapatunayang iyo talaga ang kuwenta.',
-'throttled-mailpassword' => 'Nagpadala na ng isang paalalang panghudyat, nitong huling {{PLURAL:$1|oras|$1 oras}}.
-Para maiwasin ang pangaabuso, isang paalalang panghudyat lang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.',
+'eauthentsent' => 'Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.
+Bago magpadala ng iba email sa akawnt, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang akawnt.',
+'throttled-mailpassword' => 'Nagpadala na ng isang paalalang pang-password, nitong huling {{PLURAL:$1|oras|$1 oras}}.
+Para maiwasin ang pangaabuso, isang paalalang pang-password lamang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.',
 'mailerror' => 'Kamalian sa pagpapadala ng liham: $1',
 'acct_creation_throttle_hit' => 'Ang mga panauhin sa wiking ito na gumagamit ng direksiyong IP mo ay nakalikha na ng {{PLURAL:$1|1 kuwenta|$1 kuwenta}} sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.
 Bilang kinalabasan, ang mga panauhing gumagamit ng ganitong direksiyong IP ay hindi na muna makakalikha ng anumang karagdagang kuwenta sa ngayon.',
-'emailauthenticated' => 'Napatunayan na ang iyong direksiyong e-liham sa $2 noong $3.',
-'emailnotauthenticated' => 'Hindi pa napapatunayan ang iyong direksiyong e-liham.
-Walang e-liham na ipapadala para sa anumang sumusunod na tampok na kasangkapang-katangian.',
+'emailauthenticated' => 'Napatunayan na ang iyong email address sa $2 noong $3.',
+'emailnotauthenticated' => 'Hindi pa napapatunayan ang iyong email address.
+Walang email na ipapadala para sa anumang sumusunod na mga tampok o features.',
 'noemailprefs' => 'Tumukoy ng isang direksiyong e-liham sa loob ng mga nais mo upang gumana ang mga kasangkapang-katangiang ito.',
 'emailconfirmlink' => 'Pakikompirma ang iyong direksiyong e-liham.',
 'invalidemailaddress' => 'Hindi matatanggap ang direksiyong e-liham na ito dahil tila mayroon itong maling anyo.
@@ -679,56 +696,71 @@ Dapat kang tumala at baguhin ang hudyat mo ngayon.
 
 Maaari mong huwag pansinin ang mensaheng ito, kung mali ang paglikha ng kuwentang ito.',
 'usernamehasherror' => 'Hindi maaaring maglaman ng mga panitik na pantadtad ang pangalan ng tagagamit',
-'login-throttled' => 'Masyadong marami ang ginawa mong kamakailan lang na mga pagsubok sa paglagdang papasok.
-Maghintay po muna bago subukan uli.',
+'login-throttled' => 'Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.
+Maghintay po muna ng $1 bago subukan uli.',
 'login-abort-generic' => 'Bigo ang paglagda mo - Pinigil',
 'loginlanguagelabel' => 'Wika: $1',
 'suspicious-userlogout' => "Tinanggihan ang inyong kahilingang umalis sa pagkalagda dahil tila ito ay ipinadala ng sirang pambasa-basa o apoderadong pambaon (''caching proxy'')",
+'createacct-another-realname-tip' => 'Hindi kinakailangan ang tunay na pangalan.
+Kung nais mo na ibigay ito, gagamitin ito para sa pagbibigay ng atribusyon para sa kanilang gawa.',
+'pt-login' => 'Mag-login',
+'pt-login-button' => 'Mag-login',
 'pt-createaccount' => 'Lumikha ng akawnt',
 'pt-userlogout' => 'Umalis sa pagkakatala',
 
 # Email sending
 'php-mail-error-unknown' => 'Hindi malamang kamalian sa tungkulin ng liham ng PHP ()',
 'user-mail-no-addy' => 'Sinubukang magpadala ng e-liham na walang tirahan na para sa e-liham.',
+'user-mail-no-body' => 'Sinubukan na magpadala ng email na walang laman o maikling laman.',
 
 # Change password dialog
-'changepassword' => 'Baguhin ang hudyat',
+'changepassword' => 'Baguhin ang password',
 'resetpass_announce' => 'Para sa ganap na pagtala, magtalaga ng panibagong password.',
 'resetpass_text' => '<!-- Magdagdag ng teksto rito -->',
-'resetpass_header' => 'Baguhin ang hudyat ng kuwenta',
-'oldpassword' => 'Lumang hudyat:',
-'newpassword' => 'Bagong hudyat:',
-'retypenew' => 'Ipasok muli ang bagong hudyat:',
-'resetpass_submit' => 'Itakda ang hudyat at lumagda',
-'changepassword-success' => 'Matagumpay na nabago ang iyong hudyat!  Inilalagda ka na ngayon...',
-'resetpass_forbidden' => 'Hindi mababago ang mga hudyat',
+'resetpass_header' => 'Baguhin ang password ng akawnt',
+'oldpassword' => 'Lumang password:',
+'newpassword' => 'Bagong password:',
+'retypenew' => 'Ipasok muli ang bagong password:',
+'resetpass_submit' => 'Itakda ang password at mag-login',
+'changepassword-success' => 'Matagumpay na nabago ang iyong password!',
+'changepassword-throttled' => 'Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.
+Maghintay po muna ng $1 bago subukan uli.',
+'resetpass_forbidden' => 'Hindi mababago ang mga password',
 'resetpass-no-info' => 'Nakalagda ka dapat para tuwirang mapuntahan ang pahina ito.',
-'resetpass-submit-loggedin' => 'Baguhin ang hudyat',
+'resetpass-submit-loggedin' => 'Baguhin ang password',
 'resetpass-submit-cancel' => 'Kanselahin',
-'resetpass-wrong-oldpass' => 'Hindi tanggap na pansamantala o pangkasalukuyang hudyat.
-Maaaring matagumpay mo nang nabago ang iyong hudyat o nakahiling na ng isang bagong pansamantalang hudyat.',
+'resetpass-wrong-oldpass' => 'Hindi balido na pansamantala o pangkasalukuyang password.
+Maaaring matagumpay mo nang nabago ang iyong password o nakahiling na ng isang bagong pansamantalang password.',
 'resetpass-recycled' => 'Ireset ang iyong password sa pamamagitan ng paggamit ng iba pa maliban sa iyong ginagamit sa kasalukuyan.',
 'resetpass-temp-emailed' => 'Nakapagtala sa pamamagitan ng pansamantalang email code.
 Para sa ganap na pagtatala, magtakda ng panibagong password dito:',
-'resetpass-temp-password' => 'Pansamantalang hudyat:',
-'resetpass-expired-soft' => 'Napaso na ang iyong password at kailangan ireset. Pumili ng bagong password o iklik ang cancel upang i-reset sa ibang pagkakataon.',
+'resetpass-temp-password' => 'Pansamantalang password:',
+'resetpass-abort-generic' => 'Inuurong sa pamamagitan ng isan extensyon ang pagpalit ng password.',
+'resetpass-expired' => 'Paso na ang iyong password. Pakipalit ng bagong password upang maka-login.',
+'resetpass-expired-soft' => 'Napaso na ang iyong password at kailangan i-reset. Pumili ng bagong password o i-klik ang "{{int:resetpass-submit-cancel}}" upang i-reset sa ibang pagkakataon.',
+'resetpass-validity-soft' => 'Hindi matanggap ang iyong password: $1
+
+Pumili ng bagong password ngayon, o i-klik ang "{{int:resetpass-submit-cancel}}" para i-reset ito sa ibang pagkakataon.',
 
 # Special:PasswordReset
-'passwordreset' => 'Muling pagtatakda ng hudyat',
-'passwordreset-legend' => 'Itakdang muli ang hudyat',
+'passwordreset' => 'Muling pagtatakda ng password',
+'passwordreset-text-one' => 'Ikumpleto ang form na ito upang makatanggap ng pansamantalang password sa pamamagitan ng email.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ipasok sa isa sa mga field upang makatanggap ng isang pansamantalang password sa pamamagitan ng email.}}',
+'passwordreset-legend' => 'Itakdang muli ang password',
 'passwordreset-disabled' => 'Hindi pinagagana sa wiking ito ang muling mga pagtatakda ng hudyat.',
+'passwordreset-emaildisabled' => 'Hindi pinagana ang email features sa wiking ito.',
 'passwordreset-username' => 'Pangalan ng tagagamit:',
 'passwordreset-domain' => 'Nasasakupan:',
 'passwordreset-capture' => 'Tingnan ang lumabas na e-liham?',
 'passwordreset-capture-help' => 'Kapag tsetsekan mo ang kahong ito, ang e-liham (may pansamantalang hudyat) ay ipapakita sa iyo at ipapadala rin sa tagagamit.',
 'passwordreset-email' => 'Direksiyong e-liham:',
 'passwordreset-emailtitle' => 'Mga detalye ng kuwenta sa {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Isang tao (marahil ay ikaw, mula sa direksiyong IP na $1) ang humiling ng isang paalala sa iyong mga detalye ng kuwenta para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|kuwenta ng tagagamit ay|mga kuwenta ng tagagamit ay}} may kaugnayan sa direksiyong e-liham na ito:
+'passwordreset-emailtext-ip' => 'Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng kuwenta para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|akawant ng tagagamit ay|mga akawnt ng tagagamit ay}} may kaugnayan sa email address na ito:
 
 $2
 
-{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang mga pansamantalang hudyat na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.
-Dapat kang lumagda at pumili ng isang bagong hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong hudyat, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong hudyat.',
+{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang mga pansamantalang hudyat na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.
+Dapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.',
 'passwordreset-emailtext-user' => 'Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang paalala ng iyong mga akawnt ng detalye para sa {{SITENAME}}
 ($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:
 
@@ -737,7 +769,7 @@ $2
 {{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang pansamantalang mga hudyat na ito}} mawawalan ng bias sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.
 Dapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang iyong orihinal na hudyat, at hindi mo na nais palitan pa ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng iyong lumang hudyat.',
 'passwordreset-emailelement' => 'Pangalan ng tagagamit: $1
-Pansamantalang hudyat: $2',
+Pansamantalang password: $2',
 'passwordreset-emailsent' => 'Naipadala na ang isang e-liham na pampaalala.',
 'passwordreset-emailsent-capture' => 'Naipadala na ang isang e-liham na paalala, na ipinapakita sa ibaba.',
 'passwordreset-emailerror-capture' => 'Nalikha na ang isang e-liham na paalala, na ipinapakita sa ibaba, subalit nabigo ang pagpapadala sa tagagamit: $1',
@@ -750,8 +782,14 @@ Pansamantalang hudyat: $2',
 'changeemail-oldemail' => 'Kasalukuyang direksiyong e-liham:',
 'changeemail-newemail' => 'Bagong direksiyong e-liham:',
 'changeemail-none' => '(wala)',
+'changeemail-password' => 'Ang iyong {{SITENAME}} password:',
 'changeemail-submit' => 'Baguhin ang e-liham',
 'changeemail-cancel' => 'Kanselahin',
+'changeemail-throttled' => 'Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.
+Maghintay po muna ng $1 bago subukan uli.',
+
+# Special:ResetTokens
+'resettokens' => 'I-reset ang mga token o susi',
 
 # Edit page toolbar
 'bold_sample' => 'Makapal na panitik',
@@ -832,7 +870,7 @@ Maaaring inilipat o ibinura ito habang tinitingnan mo ang pahina.',
 'loginreqtitle' => 'Paglagda/Pagtala Kailangan',
 'loginreqlink' => 'lumagda/tumala',
 'loginreqpagetext' => 'Kailangan mong $1 para matanaw ang ibang mga pahina.',
-'accmailtitle' => 'Ipinadala na ang hudyat.',
+'accmailtitle' => 'Ipinadala na ang password.',
 'accmailtext' => "Ipinadala na sa $2 ang isang hudyat na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ng hudyat]]'' kapag lumagdang papasok.",
 'newarticle' => '(Bago)',
 'newarticletext' => "Sinundan mo ang isang kawing para sa isang pahinang hindi pa umiiral.
@@ -961,6 +999,7 @@ Walang ibinigay na paliwanag.',
 Tila binura na ito.',
 'edit-conflict' => 'Alitan sa pagbabago.',
 'edit-no-change' => 'Binalewala ang pagbabago mo, dahil walang pagbabagong ginawa sa teksto.',
+'postedit-confirmation' => 'Naitala na ang iyong pagbabago.',
 'edit-already-exists' => 'Hindi makalikha ng isang bagong pahina.
 Umiiral na ito.',
 'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
@@ -1246,7 +1285,7 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
 'prefs-watchlist-edits-max' => 'Pinakamataas na bilang: 1000',
 'prefs-watchlist-token' => 'Balap ng talaan ng mga binabantayan:',
 'prefs-misc' => 'Bala-balaki',
-'prefs-resetpass' => 'Baguhin ang hudyat',
+'prefs-resetpass' => 'Baguhin ang password',
 'prefs-changeemail' => 'Baguhin ang direksiyong e-liham',
 'prefs-setemail' => 'Magtakda ng direksiyong e-liham',
 'prefs-email' => 'Mga pagpipilian para sa e-liham',
@@ -1328,6 +1367,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'prefs-dateformat' => 'Anyo ng petsa',
 'prefs-timeoffset' => 'Pagtatama ng oras',
 'prefs-advancedediting' => 'Masulong na mga mapagpipilian',
+'prefs-preview' => 'Paunang tingin',
 'prefs-advancedrc' => 'Masulong na mga mapagpipilian',
 'prefs-advancedrendering' => 'Masulong na mga mapagpipilian',
 'prefs-advancedsearchoptions' => 'Masulong na mga mapagpipilian',
@@ -1335,6 +1375,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'prefs-displayrc' => 'Ipakita ang mga pagpipilian',
 'prefs-displaysearchoptions' => 'Ipakita ang mga pagpipilian',
 'prefs-displaywatchlist' => 'Ipakita ang mga pagpipilian',
+'prefs-tokenwatchlist' => 'Token o susi',
 'prefs-diffs' => 'Mga pagkakaiba',
 
 # User preference: email validation using jQuery
@@ -1448,7 +1489,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'right-siteadmin' => 'Ikandado at alisin ang pagkakakandado ng kalipunan ng dato',
 'right-override-export-depth' => 'Iluwas ang mga pahina na kabilang ang mga pahinang nakakawing magpahanggang sa isang lalim na 5',
 'right-sendemail' => 'Magpadala ng e-liham sa ibang mga tagagamit',
-'right-passwordreset' => 'Tingnan ang mga e-liham ng muling pagtatakda ng hudyat',
+'right-passwordreset' => 'Tingnan ang mga email ng muling pagtatakda ng password',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Talaan ng paglikha ng tagagamit',
@@ -1509,11 +1550,23 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'rcnotefrom' => "Nasa ibaba ang mga pagbabago mula pa noong '''$2''' (ipinapakita ang magpahanggang sa '''$1''').",
 'rclistfrom' => 'Ipakita ang bagong mga pagbabago simula sa $1',
 'rcshowhideminor' => '$1 maliliit na mga pagbabago',
+'rcshowhideminor-show' => 'Ipakita',
+'rcshowhideminor-hide' => 'Itago',
 'rcshowhidebots' => "$1 mga ''bot''",
-'rcshowhideliu' => '$1 nakalagdang mga tagagamit',
+'rcshowhidebots-show' => 'Ipakita',
+'rcshowhidebots-hide' => 'Itago',
+'rcshowhideliu' => '$1 nakatalang mga tagagamit',
+'rcshowhideliu-show' => 'Ipakita',
+'rcshowhideliu-hide' => 'Itago',
 'rcshowhideanons' => '$1 hindi kilalang mga tagagamit',
+'rcshowhideanons-show' => 'Ipakita',
+'rcshowhideanons-hide' => 'Itago',
 'rcshowhidepatr' => '$1 napatrolyang mga pagbabago',
+'rcshowhidepatr-show' => 'Ipakita',
+'rcshowhidepatr-hide' => 'Itago',
 'rcshowhidemine' => '$1 mga pagbabago ko',
+'rcshowhidemine-show' => 'Ipakita',
+'rcshowhidemine-hide' => 'Itago',
 'rclinks' => 'Ipakita ang huling $1 mga pagbabago sa loob ng huling $2 mga araw<br />$3',
 'diff' => 'pagkakaiba',
 'hist' => 'kasaysayan',
@@ -1529,7 +1582,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'rc-change-size' => '$1',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|mga byte}} pagkaraan ng pagbabago',
 'newsectionsummary' => '/* $1 */ bagong seksyon',
-'rc-enhanced-expand' => 'Ipakita ang mga detalye (kailangan ng JavaScript)',
+'rc-enhanced-expand' => 'Ipakita ang mga detalye',
 'rc-enhanced-hide' => 'Itago ang mga detalye',
 'rc-old-title' => 'dating nalikha bilang "$1"',
 
@@ -1548,8 +1601,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'reuploaddesc' => 'Kanselahin/Iurong ang pagkarga at magbalik sa pormularyo ng pagkakarga',
 'upload-tryagain' => 'Ipasa ang binagong paglalarawan ng talaksan',
 'uploadnologin' => 'Hindi nakalagda',
-'uploadnologintext' => 'Dapat ikaw ay [[Special:UserLogin|nakalagda]]
-upang makapagkarga ng talaksan.',
+'uploadnologintext' => '$1 upang makapag-upload ng files.',
 'upload_directory_missing' => 'Nawawala ang direktoryo ng pagkarga ($1) at hindi na mailikha ng webserver.',
 'upload_directory_read_only' => 'Ang direktoryo ng pagkarga ($1) ay hindi maisulat ng webserver.',
 'uploaderror' => 'Kamalian sa pagkarga',
@@ -1806,6 +1858,8 @@ Kapag sinala ng tagagamit, tanging mga talaksan lang kung saan nagkarga ang taga
 'listfiles_size' => 'Sukat',
 'listfiles_description' => 'Paglalarawan',
 'listfiles_count' => 'Mga bersiyon',
+'listfiles-latestversion-yes' => 'Oo',
+'listfiles-latestversion-no' => 'Hindi',
 
 # File description page
 'file-anchor-link' => 'Talaksan',
@@ -1902,6 +1956,9 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
 'randompage' => 'Pahinang walang-pili',
 'randompage-nopages' => 'Walang mga pahina sa sumusunod na {{PLURAL:$2|ngalan-espasyo|mga ngalan-espasyo}}: $1.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Gawin',
+
 # Random redirect
 'randomredirect' => 'Pagkargang walang-pili',
 'randomredirect-nopages' => 'Walang mga pagkarga sa ngalan-espasyong "$1".',
@@ -1990,6 +2047,10 @@ Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
 'protectedpages-indef' => 'Mga walang katiyakang proteksyon lamang',
 'protectedpages-cascade' => 'Baita-baitang na mga panananggalang lamang',
 'protectedpagesempty' => 'Sa kasalukuyan, walang mga pahinang nakasanggalang na may ganitong mga parametro.',
+'protectedpages-page' => 'Pahina',
+'protectedpages-reason' => 'Dahilan',
+'protectedpages-unknown-timestamp' => 'Hindi alam',
+'protectedpages-unknown-performer' => 'Hindi alam na tagagamit o user',
 'protectedtitles' => 'Nakasanggalang na mga pamagat',
 'protectedtitlesempty' => 'Walang pamagat ang kasalukuyang nakaprotekta sa binigay na parametro.',
 'listusers' => 'Tala ng tagagamit',
@@ -2152,7 +2213,7 @@ Ang ipinasok mong direksiyong e-liham sa [[Special:Preferences|iyong mga kagustu
 'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
-'watchlist' => 'Mga binabantayan ko',
+'watchlist' => 'Talaan ng mga binabantayan',
 'mywatchlist' => 'Bantayan',
 'watchlistfor2' => 'Para sa $1 $2',
 'nowatchlist' => 'Wala kang pahinang binabantayan.',
@@ -3864,7 +3925,7 @@ Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangk
 * <span class="mw-specialpagerestricted">Pinaghihigpitang natatanging mga pahina.</span>',
 'specialpages-group-maintenance' => 'Mga pagpapanatiling ulat',
 'specialpages-group-other' => 'Iba pang natatanging mga pahina',
-'specialpages-group-login' => 'Lumagda / lumikha ng kuwenta',
+'specialpages-group-login' => 'Mag-login / lumikha ng akawnt',
 'specialpages-group-changes' => 'Mga huling binago at mga tala',
 'specialpages-group-media' => 'Mga ulat ng midya at mga pagkarga',
 'specialpages-group-users' => 'Mga tagagamit at mga karapatan',
index 404d52e..23e5dc7 100644 (file)
@@ -1355,7 +1355,7 @@ $1",
 'rcshowhidebots' => 'ботларны $1',
 'rcshowhidebots-show' => 'күрсәт',
 'rcshowhidebots-hide' => 'яшер',
-'rcshowhideliu' => 'Теркәлгән кулланучыларны $1',
+'rcshowhideliu' => 'теркәлгән кулланучыларны $1',
 'rcshowhideliu-show' => 'күрсәт',
 'rcshowhideliu-hide' => 'яшер',
 'rcshowhideanons' => 'кермәгән кулланучыларны $1',
index 49a932a..a473f61 100644 (file)
@@ -146,4 +146,4 @@ $.fn.autoEllipsis = function ( options ) {
        } );
 };
 
-}( jQuery ) );
\ No newline at end of file
+}( jQuery ) );
index a8c0b06..b398fdd 100644 (file)
                                $el.attr( 'maxlength', elLimit );
                        }
 
-
                        // Safe base value, used to determine the path between the previous state
                        // and the state that triggered the event handler below - and enforce the
                        // limit approppiately (e.g. don't chop from the end if text was inserted
index 9c6f9ec..37bf176 100644 (file)
@@ -12,7 +12,7 @@
                // By Blair Mitchelmore
                // http://jquery.offput.ca/highlightFade/
                // Parse strings looking for color tuples [255,255,255]
-               getRGB : function ( color ) {
+               getRGB: function ( color ) {
                        /*jshint boss:true */
                        var result;
 
@@ -28,7 +28,7 @@
 
                        // 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)) {
-                               return [parseFloat(result[1],10)*2.55, parseFloat(result[2],10)*2.55, parseFloat(result[3])*2.55];
+                               return [parseFloat(result[1],10) * 2.55, parseFloat(result[2],10) * 2.55, parseFloat(result[3]) * 2.55];
                        }
 
                        // Look for #a0b1c2
@@ -38,7 +38,7 @@
 
                        // Look for #fff
                        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)];
+                               return [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 ( t > 1 ) {
                                                t -= 1;
                                        }
-                                       if ( t < 1/6 ) {
+                                       if ( t < 1 / 6 ) {
                                                return p + (q - p) * 6 * t;
                                        }
-                                       if ( t < 1/2 ) {
+                                       if ( t < 1 / 2 ) {
                                                return q;
                                        }
-                                       if ( t < 2/3 ) {
-                                               return p + (q - p) * (2/3 - t) * 6;
+                                       if ( t < 2 / 3 ) {
+                                               return p + (q - p) * (2 / 3 - t) * 6;
                                        }
                                        return p;
                                };
 
                                q = l < 0.5 ? l * (1 + s) : l + s - l * s;
                                p = 2 * l - q;
-                               r = hue2rgb( p, q, h + 1/3 );
+                               r = hue2rgb( p, q, h + 1 / 3 );
                                g = hue2rgb( p, q, h );
-                               b = hue2rgb( p, q, h - 1/3 );
+                               b = hue2rgb( p, q, h - 1 / 3 );
                        }
 
                        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);
+                       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( ',' ) +
index e0d9de2..8c8fb56 100644 (file)
@@ -146,12 +146,12 @@ $.fn.localize = function ( options ) {
        } );
 
        // HTML, Text for elements which cannot have children e.g. OPTION
-       $target.find( '[data-msg-text]' ).each( function() {
+       $target.find( '[data-msg-text]' ).each( function () {
                var $el = $( this );
                $el.text( msg( options, $el.attr( 'data-msg-text' ) ) );
        } );
 
-       $target.find( '[data-msg-html]' ).each( function() {
+       $target.find( '[data-msg-html]' ).each( function () {
                var $el = $( this );
                $el.html( msg( options, $el.attr( 'data-msg-html' ) ) );
        } );
index 5020b37..6f7ada3 100644 (file)
@@ -13,7 +13,7 @@
  * @version 2.1.0
  * @license MIT
  */
-(function($) {
+(function ($) {
 
        var isInputSupported = 'placeholder' in document.createElement('input'),
                isTextareaSupported = 'placeholder' in document.createElement('textarea'),
 
        if (isInputSupported && isTextareaSupported) {
 
-               placeholder = prototype.placeholder = function(text) {
+               placeholder = prototype.placeholder = function (text) {
                        var hasArgs = arguments.length;
 
-                       if( hasArgs ) {
+                       if (hasArgs) {
                                changePlaceholder.call(this, text);
                        }
 
 
        } else {
 
-               placeholder = prototype.placeholder = function(text) {
+               placeholder = prototype.placeholder = function (text) {
                        var $this = this,
                                hasArgs = arguments.length;
 
-                       if(hasArgs) {
+                       if (hasArgs) {
                                changePlaceholder.call(this, text);
                        }
 
-
                        $this
                                .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
-                               .filter(function() {
+                               .filter(function () {
                                        return !$(this).data('placeholder-enabled');
                                })
                                .bind({
@@ -66,7 +65,7 @@
                placeholder.textarea = isTextareaSupported;
 
                hooks = {
-                       'get': function(element) {
+                       'get': function (element) {
                                var $element = $(element),
                                        $passwordInput = $element.data('placeholder-password');
                                if ($passwordInput) {
@@ -75,7 +74,7 @@
 
                                return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
                        },
-                       'set': function(element, value) {
+                       'set': function (element, value) {
                                var $element = $(element),
                                        $passwordInput = $element.data('placeholder-password');
                                if ($passwordInput) {
@@ -95,7 +94,7 @@
                                                setPlaceholder.call(element);
                                        }
                                } else if ($element.hasClass('placeholder')) {
-                                       if(!clearPlaceholder.call(element, true, value)) {
+                                       if (!clearPlaceholder.call(element, true, value)) {
                                                element.value = value;
                                        }
                                } else {
                        propHooks.value = hooks;
                }
 
-               $(function() {
+               $(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);
-                               setTimeout(function() {
+                               setTimeout(function () {
                                        $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 = '';
                        });
                });
                // Return an object of element attributes
                var newAttrs = {},
                        rinlinejQuery = /^jQuery\d+$/;
-               $.each(elem.attributes, function(i, attr) {
+               $.each(elem.attributes, function (i, attr) {
                        if (attr.specified && !rinlinejQuery.test(attr.name)) {
                                newAttrs[attr.name] = attr.value;
                        }
                        } else {
                                input.value = '';
                                $input.removeClass('placeholder');
-                               if(input === safeActiveElement()) {
+                               if (input === safeActiveElement()) {
                                        input.select();
                                }
                        }
        function changePlaceholder(text) {
                var hasArgs = arguments.length,
                        $input = this;
-               if(hasArgs) {
-                       if($input.attr('placeholder') !== text) {
+               if (hasArgs) {
+                       if ($input.attr('placeholder') !== text) {
                                $input.prop('placeholder', text);
-                               if($input.hasClass('placeholder')) {
+                               if ($input.hasClass('placeholder')) {
                                        $input[0].value = text;
                                }
                        }
index 20e6678..86fcaea 100644 (file)
@@ -79,7 +79,6 @@
                isEmptyObject: $.isEmptyObject
        };
 
-
        /**
         * CompletenessTest
         * @constructor
index f967a1d..f9a225f 100644 (file)
@@ -142,7 +142,7 @@ $.suggestions = {
                        i, expWidth, matchedText, maxWidth, text;
 
                // Validate creation using fallback values
-               switch( property ) {
+               switch ( property ) {
                        case 'fetch':
                        case 'cancel':
                        case 'special':
@@ -281,7 +281,7 @@ $.suggestions = {
                                                }
                                                // Apply new width for results box, if any
                                                if ( expWidth > context.data.$container.width() ) {
-                                                       maxWidth = context.config.maxExpandFactor*context.data.$textbox.width();
+                                                       maxWidth = context.config.maxExpandFactor * context.data.$textbox.width();
                                                        context.data.$container.width( Math.min( expWidth, maxWidth ) );
                                                }
                                                // autoEllipse the results. Has to be done after changing the width
index f9ee268..af0d897 100644 (file)
@@ -68,8 +68,6 @@
  */
 
 ( function ( $, mw ) {
-       /*jshint onevar:false */
-
        /* Local scope */
 
        var ts,
@@ -78,8 +76,9 @@
        /* Parser utility functions */
 
        function getParserById( name ) {
-               var len = parsers.length;
-               for ( var i = 0; i < len; i++ ) {
+               var i,
+                       len = parsers.length;
+               for ( i = 0; i < len; i++ ) {
                        if ( parsers[i].id.toLowerCase() === name.toLowerCase() ) {
                                return parsers[i];
                        }
        }
 
        function appendToTable( table, cache ) {
-               var row = cache.row,
+               var i, pos, l, j,
+                       row = cache.row,
                        normalized = cache.normalized,
                        totalRows = normalized.length,
                        checkCell = ( normalized[0].length - 1 ),
                        fragment = document.createDocumentFragment();
 
-               for ( var i = 0; i < totalRows; i++ ) {
-                       var pos = normalized[i][checkCell];
+               for ( i = 0; i < totalRows; i++ ) {
+                       pos = normalized[i][checkCell];
 
-                       var l = row[pos].length;
+                       l = row[pos].length;
 
-                       for ( var j = 0; j < l; j++ ) {
+                       for ( j = 0; j < l; j++ ) {
                                fragment.appendChild( row[pos][j] );
                        }
 
         * @param $table jQuery object for a <table>
         */
        function emulateTHeadAndFoot( $table ) {
-               var $rows = $table.find( '> tbody > tr' );
-               if( !$table.get(0).tHead ) {
-                       var $thead = $( '<thead>' );
+               var $thead, $tfoot, i, len,
+                       $rows = $table.find( '> tbody > tr' );
+               if ( !$table.get(0).tHead ) {
+                       $thead = $( '<thead>' );
                        $rows.each( function () {
-                               if ( $(this).children( 'td' ).length > 0 ) {
+                               if ( $(this).children( 'td' ).length ) {
                                        // This row contains a <td>, so it's not a header row
                                        // Stop here
                                        return false;
                        } );
                        $table.find(' > tbody:first').before( $thead );
                }
-               if( !$table.get(0).tFoot ) {
-                       var $tfoot = $( '<tfoot>' );
-                       var len = $rows.length;
-                       for ( var i = len-1; i >= 0; i-- ) {
-                               if( $( $rows[i] ).children( 'td' ).length > 0 ){
+               if ( !$table.get(0).tFoot ) {
+                       $tfoot = $( '<tfoot>' );
+                       len = $rows.length;
+                       for ( i = len - 1; i >= 0; i-- ) {
+                               if ( $( $rows[i] ).children( 'td' ).length ){
                                        break;
                                }
                                $tfoot.prepend( $( $rows[i] ));
                return false;
        }
 
-
        function uniqueElements( array ) {
                var uniques = [];
                $.each( array, function( index, elem ) {
        }
 
        function multisort( table, sortList, cache ) {
-               var sortFn = [];
-               var len = sortList.length;
-               for ( var i = 0; i < len; i++ ) {
+               var i,
+                       sortFn = [],
+                       len = sortList.length;
+               for ( i = 0; i < len; i++ ) {
                        sortFn[i] = ( sortList[i][1] ) ? sortTextDesc : sortText;
                }
                cache.normalized.sort( function ( array1, array2 ) {
-                       var col, ret;
-                       for ( var i = 0; i < len; i++ ) {
+                       var i, col, ret;
+                       for ( i = 0; i < len; i++ ) {
                                col = sortList[i][0];
                                ret = sortFn[i].call( this, array1[col], array2[col] );
                                if ( ret !== 0 ) {
        }
 
        function buildTransformTable() {
-               var digits = '0123456789,.'.split( '' );
-               var separatorTransformTable = mw.config.get( 'wgSeparatorTransformTable' );
-               var digitTransformTable = mw.config.get( 'wgDigitTransformTable' );
+               var ascii, localised, i, digitClass,
+                       digits = '0123456789,.'.split( '' ),
+                       separatorTransformTable = mw.config.get( 'wgSeparatorTransformTable' ),
+                       digitTransformTable = mw.config.get( 'wgDigitTransformTable' );
+
                if ( separatorTransformTable === null || ( separatorTransformTable[0] === '' && digitTransformTable[2] === '' ) ) {
                        ts.transformTable = false;
                } else {
                        ts.transformTable = {};
 
                        // Unpack the transform table
-                       var ascii = separatorTransformTable[0].split( '\t' ).concat( digitTransformTable[0].split( '\t' ) );
-                       var 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 ( var i = 0; i < ascii.length; i++ ) {
+                       for ( i = 0; i < ascii.length; i++ ) {
                                ts.transformTable[localised[i]] = ascii[i];
                                digits.push( $.escapeRE( localised[i] ) );
                        }
                }
-               var digitClass = '[' + digits.join( '', digits ) + ']';
+               digitClass = '[' + digits.join( '', digits ) + ']';
 
                // We allow a trailing percent sign, which we just strip. This works fine
                // if percents and regular numbers aren't being mixed.
        }
 
        function buildDateTable() {
-               var regex = [];
+               var i, name,
+                       regex = [];
+
                ts.monthNames = {};
 
-               for ( var i = 0; i < 12; i++ ) {
-                       var name = mw.language.months.names[i].toLowerCase();
+               for ( i = 0; i < 12; i++ ) {
+                       name = mw.language.months.names[i].toLowerCase();
                        ts.monthNames[name] = i + 1;
                        regex.push( $.escapeRE( name ) );
                        name = mw.language.months.genitive[i].toLowerCase();
         * @param $table jQuery object for a <table>
         */
        function explodeRowspans( $table ) {
-               var rowspanCells = $table.find( '> tbody > tr > [rowspan]' ).get();
+               var spanningRealCellIndex, rowSpan, colSpan,
+                       cell, i, $tds, $clone, $nextRows,
+                       rowspanCells = $table.find( '> tbody > tr > [rowspan]' ).get();
 
                // Short circuit
                if ( !rowspanCells.length ) {
                // account colspans. We also cache the rowIndex to avoid having to take
                // cell.parentNode.rowIndex in the sorting function below.
                $table.find( '> tbody > tr' ).each( function () {
-                       var col = 0;
-                       var l = this.cells.length;
-                       for ( var i = 0; i < l; i++ ) {
+                       var i,
+                               col = 0,
+                               l = this.cells.length;
+                       for ( i = 0; i < l; i++ ) {
                                this.cells[i].realCellIndex = col;
                                this.cells[i].realRowIndex = this.rowIndex;
                                col += this.cells[i].colSpan;
                }
                resortCells();
 
-               var spanningRealCellIndex, rowSpan, colSpan;
                function filterfunc() {
                        return this.realCellIndex >= spanningRealCellIndex;
                }
                                resortCells();
                        }
 
-                       var cell = rowspanCells.shift();
+                       cell = rowspanCells.shift();
                        rowSpan = cell.rowSpan;
                        colSpan = cell.colSpan;
                        spanningRealCellIndex = cell.realCellIndex;
                        cell.rowSpan = 1;
-                       var $nextRows = $( cell ).parent().nextAll();
-                       for ( var i = 0; i < rowSpan - 1; i++ ) {
-                               var $tds = $( $nextRows[i].cells ).filter( filterfunc );
-                               var $clone = $( cell ).clone();
+                       $nextRows = $( cell ).parent().nextAll();
+                       for ( i = 0; i < rowSpan - 1; i++ ) {
+                               $tds = $( $nextRows[i].cells ).filter( filterfunc );
+                               $clone = $( cell ).clone();
                                $clone[0].realCellIndex = spanningRealCellIndex;
                                if ( $tds.length ) {
                                        $tds.each( fixTdCellIndex );
                ts.collationTable = mw.config.get( 'tableSorterCollation' );
                ts.collationRegex = null;
                if ( ts.collationTable ) {
-                       var keys = [];
+                       var key,
+                               keys = [];
 
                        // Build array of key names
-                       for ( var key in ts.collationTable ) {
-                               if ( ts.collationTable.hasOwnProperty(key) ) { //to be safe
+                       for ( key in ts.collationTable ) {
+                               // Check hasOwn to be safe
+                               if ( ts.collationTable.hasOwnProperty(key) ) {
                                        keys.push(key);
                                }
                        }
-                       if (keys.length) {
+                       if ( keys.length ) {
                                ts.collationRegex = new RegExp( '[' + keys.join( '' ) + ']', 'ig' );
                        }
                }
                        construct: function ( $tables, settings ) {
                                return $tables.each( function ( i, table ) {
                                        // Declare and cache.
-                                       var $headers, cache, config,
+                                       var $headers, cache, config, sortCSS, sortMsg,
                                                $table = $( table ),
                                                firstTime = true;
 
                                        $.data( table, 'tablesorter', { config: config } );
 
                                        // Get the CSS class names, could be done else where.
-                                       var sortCSS = [ config.cssDesc, config.cssAsc ];
-                                       var sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
+                                       sortCSS = [ config.cssDesc, config.cssAsc ];
+                                       sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
 
                                        // Build headers
                                        $headers = buildHeaders( table, sortMsg );
                                                        this.order = this.count % 2;
                                                        this.count++;
 
-                                                       var cell = this;
+                                                       var cell, columns, newSortList, i;
+
+                                                       cell = this;
                                                        // Get current column index
-                                                       var columns = table.headerToColumns[ this.headerIndex ];
-                                                       var newSortList = $.map( columns, function (c) {
+                                                       columns = table.headerToColumns[ this.headerIndex ];
+                                                       newSortList = $.map( columns, function ( c ) {
                                                                // jQuery "helpfully" flattens the arrays...
                                                                return [[c, cell.order]];
                                                        });
                                                        // Index of first column belonging to this header
-                                                       var i = columns[0];
+                                                       i = columns[0];
 
                                                        if ( !e[config.sortMultiSortKey] ) {
                                                                // User only wants to sort on one column set
                                         *
                                         * @param sortList {Array} (optional) List of sort objects.
                                         */
-                                       $table.data( 'tablesorter' ).sort = function( sortList ) {
+                                       $table.data( 'tablesorter' ).sort = function ( sortList ) {
 
                                                if ( firstTime ) {
                                                        setupForFirstSort();
index 2b5a440..7262fe6 100644 (file)
@@ -2,8 +2,6 @@
  * These plugins provide extra functionality for interaction with textareas.
  */
 ( function ( $ ) {
-       /*jshint noempty:false */
-
        if ( document.selection && document.selection.createRange ) {
                // On IE, patch the focus() method to restore the windows' scroll position
                // (bug 32241)
@@ -13,7 +11,7 @@
                                        var $w, state, result;
                                        if ( arguments.length === 0 ) {
                                                $w = $( window );
-                                               state = {top: $w.scrollTop(), left: $w.scrollLeft()};
+                                               state = { top: $w.scrollTop(), left: $w.scrollLeft() };
                                                result = jqFocus.apply( this, arguments );
                                                window.scrollTo( state.top, state.left );
                                                return result;
@@ -73,7 +71,6 @@
                                        el = this.get( 0 );
 
                                if ( $(el).is( ':hidden' ) ) {
-                                       // Do nothing
                                        retval = '';
                                } else if ( document.selection && document.selection.createRange ) {
                                        activateElementOnIE( el );
                                        }
 
                                        isSample = false;
-                                       if ( this.style.display === 'none' ) {
-                                               // Do nothing
-                                       } else if ( document.selection && document.selection.createRange ) {
-                                               // IE
+                                       // Do nothing if display none
+                                       if ( this.style.display !== 'none' ) {
+                                               if ( document.selection && document.selection.createRange ) {
+                                                       // IE
 
-                                               // Note that IE9 will trigger the next section unless we check this first.
-                                               // See bug 35201.
+                                                       // Note that IE9 will trigger the next section unless we check this first.
+                                                       // See bug 35201.
 
-                                               activateElementOnIE( this );
-                                               if ( context ) {
-                                                       context.fn.restoreCursorAndScrollTop();
-                                               }
-                                               if ( options.selectionStart !== undefined ) {
-                                                       $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
-                                               }
+                                                       activateElementOnIE( this );
+                                                       if ( context ) {
+                                                               context.fn.restoreCursorAndScrollTop();
+                                                       }
+                                                       if ( options.selectionStart !== undefined ) {
+                                                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                       }
 
-                                               selText = $(this).textSelection( 'getSelection' );
-                                               scrollTop = this.scrollTop;
-                                               range = document.selection.createRange();
+                                                       selText = $(this).textSelection( 'getSelection' );
+                                                       scrollTop = this.scrollTop;
+                                                       range = document.selection.createRange();
 
-                                               checkSelectedText();
-                                               insertText = pre + selText + post;
-                                               if ( options.splitlines ) {
-                                                       insertText = doSplitLines( selText, pre, post );
-                                               }
-                                               if ( options.ownline && range.moveStart ) {
-                                                       range2 = document.selection.createRange();
-                                                       range2.collapse();
-                                                       range2.moveStart( 'character', -1 );
-                                                       // FIXME: Which check is correct?
-                                                       if ( range2.text !== '\r' && range2.text !== '\n' && range2.text !== '' ) {
-                                                               insertText = '\n' + insertText;
-                                                               pre += '\n';
+                                                       checkSelectedText();
+                                                       insertText = pre + selText + post;
+                                                       if ( options.splitlines ) {
+                                                               insertText = doSplitLines( selText, pre, post );
                                                        }
-                                                       range3 = document.selection.createRange();
-                                                       range3.collapse( false );
-                                                       range3.moveEnd( 'character', 1 );
-                                                       if ( range3.text !== '\r' && range3.text !== '\n' && range3.text !== '' ) {
-                                                               insertText += '\n';
-                                                               post += '\n';
+                                                       if ( options.ownline && range.moveStart ) {
+                                                               range2 = document.selection.createRange();
+                                                               range2.collapse();
+                                                               range2.moveStart( 'character', -1 );
+                                                               // FIXME: Which check is correct?
+                                                               if ( range2.text !== '\r' && range2.text !== '\n' && range2.text !== '' ) {
+                                                                       insertText = '\n' + insertText;
+                                                                       pre += '\n';
+                                                               }
+                                                               range3 = document.selection.createRange();
+                                                               range3.collapse( false );
+                                                               range3.moveEnd( 'character', 1 );
+                                                               if ( range3.text !== '\r' && range3.text !== '\n' && range3.text !== '' ) {
+                                                                       insertText += '\n';
+                                                                       post += '\n';
+                                                               }
                                                        }
-                                               }
 
-                                               range.text = insertText;
-                                               if ( isSample && options.selectPeri && range.moveStart ) {
-                                                       range.moveStart( 'character', - post.length - selText.length );
-                                                       range.moveEnd( 'character', - post.length );
-                                               }
-                                               range.select();
-                                               // Restore the scroll position
-                                               this.scrollTop = scrollTop;
-                                       } else if ( this.selectionStart || this.selectionStart === 0 ) {
-                                               // Mozilla/Opera
-
-                                               $(this).focus();
-                                               if ( options.selectionStart !== undefined ) {
-                                                       $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
-                                               }
+                                                       range.text = insertText;
+                                                       if ( isSample && options.selectPeri && range.moveStart ) {
+                                                               range.moveStart( 'character', -post.length - selText.length );
+                                                               range.moveEnd( 'character', -post.length );
+                                                       }
+                                                       range.select();
+                                                       // Restore the scroll position
+                                                       this.scrollTop = scrollTop;
+                                               } else if ( this.selectionStart || this.selectionStart === 0 ) {
+                                                       // Mozilla/Opera
+
+                                                       $(this).focus();
+                                                       if ( options.selectionStart !== undefined ) {
+                                                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                       }
 
-                                               selText = $(this).textSelection( 'getSelection' );
-                                               startPos = this.selectionStart;
-                                               endPos = this.selectionEnd;
-                                               scrollTop = this.scrollTop;
-                                               checkSelectedText();
-                                               if ( options.selectionStart !== undefined
-                                                               && endPos - startPos !== options.selectionEnd - options.selectionStart )
-                                               {
-                                                       // This means there is a difference in the selection range returned by browser and what we passed.
-                                                       // This happens for Chrome in the case of composite characters. Ref bug #30130
-                                                       // Set the startPos to the correct position.
-                                                       startPos = options.selectionStart;
-                                               }
+                                                       selText = $(this).textSelection( 'getSelection' );
+                                                       startPos = this.selectionStart;
+                                                       endPos = this.selectionEnd;
+                                                       scrollTop = this.scrollTop;
+                                                       checkSelectedText();
+                                                       if ( options.selectionStart !== undefined
+                                                                       && endPos - startPos !== options.selectionEnd - options.selectionStart )
+                                                       {
+                                                               // This means there is a difference in the selection range returned by browser and what we passed.
+                                                               // This happens for Chrome in the case of composite characters. Ref bug #30130
+                                                               // Set the startPos to the correct position.
+                                                               startPos = options.selectionStart;
+                                                       }
 
-                                               insertText = pre + selText + post;
-                                               if ( options.splitlines ) {
-                                                       insertText = doSplitLines( selText, pre, post );
-                                               }
-                                               if ( options.ownline ) {
-                                                       if ( startPos !== 0 && this.value.charAt( startPos - 1 ) !== '\n' && this.value.charAt( startPos - 1 ) !== '\r' ) {
-                                                               insertText = '\n' + insertText;
-                                                               pre += '\n';
+                                                       insertText = pre + selText + post;
+                                                       if ( options.splitlines ) {
+                                                               insertText = doSplitLines( selText, pre, post );
                                                        }
-                                                       if ( this.value.charAt( endPos ) !== '\n' && this.value.charAt( endPos ) !== '\r' ) {
-                                                               insertText += '\n';
-                                                               post += '\n';
+                                                       if ( options.ownline ) {
+                                                               if ( startPos !== 0 && this.value.charAt( startPos - 1 ) !== '\n' && this.value.charAt( startPos - 1 ) !== '\r' ) {
+                                                                       insertText = '\n' + insertText;
+                                                                       pre += '\n';
+                                                               }
+                                                               if ( this.value.charAt( endPos ) !== '\n' && this.value.charAt( endPos ) !== '\r' ) {
+                                                                       insertText += '\n';
+                                                                       post += '\n';
+                                                               }
+                                                       }
+                                                       this.value = this.value.substring( 0, startPos ) + insertText +
+                                                               this.value.substring( endPos, this.value.length );
+                                                       // Setting this.value scrolls the textarea to the top, restore the scroll position
+                                                       this.scrollTop = scrollTop;
+                                                       if ( window.opera ) {
+                                                               pre = pre.replace( /\r?\n/g, '\r\n' );
+                                                               selText = selText.replace( /\r?\n/g, '\r\n' );
+                                                               post = post.replace( /\r?\n/g, '\r\n' );
+                                                       }
+                                                       if ( isSample && options.selectPeri && !options.splitlines ) {
+                                                               this.selectionStart = startPos + pre.length;
+                                                               this.selectionEnd = startPos + pre.length + selText.length;
+                                                       } else {
+                                                               this.selectionStart = startPos + insertText.length;
+                                                               this.selectionEnd = this.selectionStart;
                                                        }
-                                               }
-                                               this.value = this.value.substring( 0, startPos ) + insertText +
-                                                       this.value.substring( endPos, this.value.length );
-                                               // Setting this.value scrolls the textarea to the top, restore the scroll position
-                                               this.scrollTop = scrollTop;
-                                               if ( window.opera ) {
-                                                       pre = pre.replace( /\r?\n/g, '\r\n' );
-                                                       selText = selText.replace( /\r?\n/g, '\r\n' );
-                                                       post = post.replace( /\r?\n/g, '\r\n' );
-                                               }
-                                               if ( isSample && options.selectPeri && !options.splitlines ) {
-                                                       this.selectionStart = startPos + pre.length;
-                                                       this.selectionEnd = startPos + pre.length + selText.length;
-                                               } else {
-                                                       this.selectionStart = startPos + insertText.length;
-                                                       this.selectionEnd = this.selectionStart;
                                                }
                                        }
                                        $(this).trigger( 'encapsulateSelection', [ options.pre, options.peri, options.post, options.ownline,
                        setSelection: function ( options ) {
                                return this.each( function () {
                                        var selection, length, newLines;
-                                       if ( $(this).is( ':hidden' ) ) {
-                                               // Do nothing
-                                       } else if ( this.selectionStart || this.selectionStart === 0 ) {
-                                               // Opera 9.0 doesn't allow setting selectionStart past
-                                               // selectionEnd; any attempts to do that will be ignored
-                                               // Make sure to set them in the right order
-                                               if ( options.start > this.selectionEnd ) {
-                                                       this.selectionEnd = options.end;
-                                                       this.selectionStart = options.start;
-                                               } else {
-                                                       this.selectionStart = options.start;
-                                                       this.selectionEnd = options.end;
-                                               }
-                                       } else if ( document.body.createTextRange ) {
-                                               selection = rangeForElementIE( this );
-                                               length = this.value.length;
-                                               // IE doesn't count \n when computing the offset, so we won't either
-                                               newLines = this.value.match( /\n/g );
-                                               if ( newLines ) {
-                                                       length = length - newLines.length;
+                                       // Do nothing if hidden
+                                       if ( !$(this).is( ':hidden' ) ) {
+                                               if ( this.selectionStart || this.selectionStart === 0 ) {
+                                                       // Opera 9.0 doesn't allow setting selectionStart past
+                                                       // selectionEnd; any attempts to do that will be ignored
+                                                       // Make sure to set them in the right order
+                                                       if ( options.start > this.selectionEnd ) {
+                                                               this.selectionEnd = options.end;
+                                                               this.selectionStart = options.start;
+                                                       } else {
+                                                               this.selectionStart = options.start;
+                                                               this.selectionEnd = options.end;
+                                                       }
+                                               } else if ( document.body.createTextRange ) {
+                                                       selection = rangeForElementIE( this );
+                                                       length = this.value.length;
+                                                       // IE doesn't count \n when computing the offset, so we won't either
+                                                       newLines = this.value.match( /\n/g );
+                                                       if ( newLines ) {
+                                                               length = length - newLines.length;
+                                                       }
+                                                       selection.moveStart( 'character', options.start );
+                                                       selection.moveEnd( 'character', -length + options.end );
+
+                                                       // This line can cause an error under certain circumstances (textarea empty, no selection)
+                                                       // Silence that error
+                                                       try {
+                                                               selection.select();
+                                                       } catch ( e ) { }
                                                }
-                                               selection.moveStart( 'character', options.start );
-                                               selection.moveEnd( 'character', -length + options.end );
-
-                                               // This line can cause an error under certain circumstances (textarea empty, no selection)
-                                               // Silence that error
-                                               try {
-                                                       selection.select();
-                                               } catch ( e ) { }
                                        }
                                });
                        },
                                }
                                return this.each(function () {
                                        var scroll, range, savedRange, pos, oldScrollTop;
-                                       if ( $(this).is( ':hidden' ) ) {
-                                               // Do nothing
-                                       } else if ( this.selectionStart || this.selectionStart === 0 ) {
-                                               // Mozilla
-                                               scroll = getCaretScrollPosition( this );
-                                               if ( options.force || scroll < $(this).scrollTop() ||
-                                                               scroll > $(this).scrollTop() + $(this).height() ) {
-                                                       $(this).scrollTop( scroll );
-                                               }
-                                       } else if ( document.selection && document.selection.createRange ) {
-                                               // IE / Opera
-                                               /*
-                                                * IE automatically scrolls the selected text to the
-                                                * bottom of the textarea at range.select() time, except
-                                                * if it was already in view and the cursor position
-                                                * wasn't changed, in which case it does nothing. To
-                                                * cover that case, we'll force it to act by moving one
-                                                * character back and forth.
-                                                */
-                                               range = document.body.createTextRange();
-                                               savedRange = document.selection.createRange();
-                                               pos = $(this).textSelection( 'getCaretPosition' );
-                                               oldScrollTop = this.scrollTop;
-                                               range.moveToElementText( this );
-                                               range.collapse();
-                                               range.move( 'character', pos + 1);
-                                               range.select();
-                                               if ( this.scrollTop !== oldScrollTop ) {
-                                                       this.scrollTop += range.offsetTop;
-                                               } else if ( options.force ) {
-                                                       range.move( 'character', -1 );
+                                       // Do nothing if hidden
+                                       if ( !$(this).is( ':hidden' ) ) {
+                                               if ( this.selectionStart || this.selectionStart === 0 ) {
+                                                       // Mozilla
+                                                       scroll = getCaretScrollPosition( this );
+                                                       if ( options.force || scroll < $(this).scrollTop() ||
+                                                                       scroll > $(this).scrollTop() + $(this).height() ) {
+                                                               $(this).scrollTop( scroll );
+                                                       }
+                                               } else if ( document.selection && document.selection.createRange ) {
+                                                       // IE / Opera
+                                                       /*
+                                                        * IE automatically scrolls the selected text to the
+                                                        * bottom of the textarea at range.select() time, except
+                                                        * if it was already in view and the cursor position
+                                                        * wasn't changed, in which case it does nothing. To
+                                                        * cover that case, we'll force it to act by moving one
+                                                        * character back and forth.
+                                                        */
+                                                       range = document.body.createTextRange();
+                                                       savedRange = document.selection.createRange();
+                                                       pos = $(this).textSelection( 'getCaretPosition' );
+                                                       oldScrollTop = this.scrollTop;
+                                                       range.moveToElementText( this );
+                                                       range.collapse();
+                                                       range.move( 'character', pos + 1);
                                                        range.select();
+                                                       if ( this.scrollTop !== oldScrollTop ) {
+                                                               this.scrollTop += range.offsetTop;
+                                                       } else if ( options.force ) {
+                                                               range.move( 'character', -1 );
+                                                               range.select();
+                                                       }
+                                                       savedRange.select();
                                                }
-                                               savedRange.select();
                                        }
                                        $(this).trigger( 'scrollToPosition' );
                                } );
index 299fabd..bbffe79 100644 (file)
                        };
                }
                var $image = $( '<img>' ).attr( {
-                       width : 23,
+                       width: 23,
                        height: 22,
-                       src   : b.imageFile,
-                       alt   : b.speedTip,
-                       title : b.speedTip,
-                       id    : b.imageId || undefined,
+                       src: b.imageFile,
+                       alt: b.speedTip,
+                       title: b.speedTip,
+                       id: b.imageId || undefined,
                        'class': 'mw-toolbar-editbutton'
                } ).click( function () {
                        toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText );
index 500a47a..2a02d87 100644 (file)
@@ -70,7 +70,6 @@ jQuery( function ( $ ) {
        // Set initial state
        updateDiffRadios();
 
-
        // Prettify url output for HistoryAction submissions,
        // to cover up action=historysubmit construction.
 
index d23a937..21f40c5 100644 (file)
@@ -44,4 +44,4 @@
                $table.addClass( 'collapsed' );
        } );
 
-}( mediaWiki, jQuery ) );
\ No newline at end of file
+}( mediaWiki, jQuery ) );
index 026052c..4321b1b 100644 (file)
@@ -84,7 +84,6 @@
                                .promise( { abort: apiPromise.abort } );
                },
 
-
                /**
                 * Get the categories that a particular page on the wiki belongs to
                 * @param {mw.Title} title
index 2410091..2382aae 100644 (file)
@@ -34,7 +34,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        break;
                case 'illative':
                        // Double the last letter and add 'n'
-                       word += word.substr(  word.length-1 ) + 'n';
+                       word += word.substr(  word.length - 1 ) + 'n';
                        break;
                case 'inessive':
                        word += ( aou ? 'ssa' : 'ssä' );
index d1ed041..ae16f24 100644 (file)
@@ -15,7 +15,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        switch ( form ) {
                case 'genitive': // սեռական հոլով
                        if ( word.substr( -1 ) === 'ա' ) {
-                               word = word.substr( 0, word.length -1 )  + 'այի';
+                               word = word.substr( 0, word.length - 1 ) + 'այի';
                        } else if ( word.substr( -1 ) === 'ո' ) {
                                word = word.substr( 0, word.length - 1 ) + 'ոյի';
                        } else if ( word.substr( -4 ) === 'գիրք' ) {
index 7fc171d..04b7d0a 100644 (file)
@@ -19,7 +19,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /tio$/i,'tionis' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'ntis' );
                        word = word.replace( /as$/i, 'atis' );
-                       word = word.replace( /es$/i ,'ei' ); // 5th declension singular
+                       word = word.replace( /es$/i'ei' ); // 5th declension singular
                        break;
                case 'accusative':
                        // only a few declensions, and even for those mostly the singular only
@@ -31,7 +31,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        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( /es$/i ,'em' ); // 5th declension singular
+                       word = word.replace( /es$/i'em' ); // 5th declension singular
                        break;
                case 'ablative':
                        // only a few declensions, and even for those mostly the singular only
@@ -43,7 +43,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        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( /es$/i ,'e' ); // 5th declension singular
+                       word = word.replace( /es$/i'e' ); // 5th declension singular
                        break;
        }
        return word;
index 4b50834..bdf59be 100644 (file)
@@ -30,7 +30,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
        // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
        else if ( word.match( /у$/i ) ) {
-               if ( ! word.substring( word.length-2, word.length-1 ).match( /[аæеёиоыэюя]$/i ) ) {
+               if ( !word.substring( word.length - 2, word.length - 1 ).match( /[аæеёиоыэюя]$/i ) ) {
                        jot = 'й';
                }
        } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
index 9b63382..69f7ec5 100644 (file)
@@ -3,33 +3,33 @@
  */
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
-       /*jshint noempty:false */
        var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
                return grammarForms[form][word];
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
-                       if ( ( word.substr( word.length - 4 ) === 'вікі' ) || ( word.substr( word.length - 4 ) === 'Вікі' ) ) {
-                       } else if ( word.substr( word.length - 1 ) === 'ь' ) {
-                               word = word.substr(0, word.length - 1 ) + 'я';
-                       } else if ( word.substr( word.length - 2 ) === 'ія' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ії';
-                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ки';
-                       } else if ( word.substr( word.length - 2 ) === 'ти' ) {
-                               word = word.substr(0, word.length - 2 ) + 'тей';
-                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                               word = word.substr(0, word.length - 2 ) + 'дов';
-                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ника';
+                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
+                               if ( word.substr( word.length - 1 ) === 'ь' ) {
+                                       word = word.substr(0, word.length - 1 ) + 'я';
+                               } else if ( word.substr( word.length - 2 ) === 'ія' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'ії';
+                               } else if ( word.substr( word.length - 2 ) === 'ка' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'ки';
+                               } else if ( word.substr( word.length - 2 ) === 'ти' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'тей';
+                               } else if ( word.substr( word.length - 2 ) === 'ды' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'дов';
+                               } else if ( word.substr( word.length - 3 ) === 'ник' ) {
+                                       word = word.substr(0, word.length - 3 ) + 'ника';
+                               }
                        }
                        break;
                case 'accusative': // знахідний відмінок
-                       if ( ( word.substr( word.length - 4 ) === 'вікі' ) || ( word.substr( word.length - 4 ) === 'Вікі' ) ) {
-                       }
-                       else if ( word.substr( word.length - 2 ) === 'ія' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ію';
+                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
+                               if ( word.substr( word.length - 2 ) === 'ія' ) {
+                                       word = word.substr(0, word.length - 2 ) + 'ію';
+                               }
                        }
                        break;
        }
index 87018f6..a0b5569 100644 (file)
@@ -96,7 +96,7 @@ $.extend( mw.language, {
         */
        preConvertPlural: function ( forms, count ) {
                while ( forms.length < count ) {
-                       forms.push( forms[ forms.length-1 ] );
+                       forms.push( forms[ forms.length - 1 ] );
                }
                return forms;
        },
index 64efbb9..f92d372 100644 (file)
                                        imgHeight = 0;
                                }
 
-                               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,
-                                       aspect: imgWidth / imgHeight, // XXX: can divide by 0 ever happen?
+                                       // XXX: can divide by 0 ever happen?
+                                       aspect: imgWidth / imgHeight,
                                        captionWidth: $this.children().children( 'div.gallerytextwrapper' ).width(),
                                        height: imgHeight
                                };
                                                // Also on the off chance there is a bug in this
                                                // code, would prevent accidentally expanding to
                                                // be 10 billion pixels wide.
-                                               mw.log( 'mw.page.gallery: Cannot fit row, aspect is ' + preferredHeight/curRowHeight );
+                                               mw.log( 'mw.page.gallery: Cannot fit row, aspect is ' + preferredHeight / curRowHeight );
                                                if ( i === rows.length - 1 ) {
                                                        // If its the last row, and we can't fit it,
                                                        // don't make the entire row huge.
                                        }
                                        if ( preferredHeight < 5 ) {
                                                // Well something clearly went wrong...
-                                               mw.log( {maxWidth: maxWidth, combinedPadding: combinedPadding, combinedAspect: combinedAspect, wantedWidth: wantedWidth } );
+                                               mw.log( {
+                                                       maxWidth: maxWidth,
+                                                       combinedPadding: combinedPadding,
+                                                       combinedAspect: combinedAspect,
+                                                       wantedWidth: wantedWidth
+                                               } );
                                                mw.log( 'mw.page.gallery: [BUG!] Fitting row ' + i + ' to too small a size: ' + preferredHeight );
                                                // Skip this row.
                                                continue;
                                                imageElm = $imageElm.length ? $imageElm[0] : null;
                                                $caption = $outerDiv.find( 'div.gallerytextwrapper' );
 
-
                                                // Since we are going to re-adjust the height, the vertical
                                                // centering margins need to be reset.
                                                $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
index 8a4d526..50301bd 100644 (file)
@@ -90,4 +90,4 @@
                        }
                }
        } );
-}( mediaWiki, jQuery ) );
\ No newline at end of file
+}( mediaWiki, jQuery ) );
index 23d7837..2cd27af 100644 (file)
@@ -128,7 +128,7 @@ jQuery( function ( $ ) {
        // make the selected tab visible.
        hash = window.location.hash;
        if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
-               switchPrefTab( hash.replace( '#mw-prefsection-' , '' ) );
+               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
        }
 
        // In browsers that support the onhashchange event we will not bind click
@@ -140,7 +140,7 @@ jQuery( function ( $ ) {
        if ( 'onhashchange' in window &&
                ( document.documentMode === undefined || document.documentMode >= 8 )
        ) {
-               $( window ).on( 'hashchange' , function () {
+               $( window ).on( 'hashchange', function () {
                        var hash = window.location.hash;
                        if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
                                switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
index 4ee3de3..8a5ff59 100644 (file)
                                };
                                img.src = dataURL;
                        }, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
-                               /*jshint camelcase: false, nomen: false */
+                               /*jshint camelcase:false, nomen:false */
                                try {
                                        meta = mw.libs.jpegmeta( data, file.fileName );
                                        meta._binary_data = null;
                        return true;
                }
 
-
                /**
                 * Initialization
                 */
index 32c3f1e..8a7aec2 100644 (file)
                                .replace( rUnderscoreTrim, '' );
                }
 
-
                // Reject illegal characters
                if ( title.match( rInvalid ) ) {
                        return false;
                };
        }() );
 
-
        /* Static members */
 
        /**
         */
        Title.prototype.toString = Title.prototype.getPrefixedDb;
 
-
        /**
         * @alias #getPrefixedText
         * @method
index b6cc2b7..1b183d9 100644 (file)
                        $( '<colgroup>' ).appendTo( $table );
                        $( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
 
-
                        entryTypeText = function ( entryType ) {
                                switch ( entryType ) {
                                        case 'log':
                                .appendTo( $table );
                        }
 
-
                        return $table;
                },
 
index 6dd4f88..90a6425 100644 (file)
                 * The section of the dialog to show.
                 */
                display: function ( s ) {
-                       this.$dialog.dialog( { buttons:{} } ); // hide the buttons
-                       this.$dialog.find( '.feedback-mode' ).hide(); // hide everything
-                       this.$dialog.find( '.feedback-' + s ).show(); // show the desired div
+                       // Hide the buttons
+                       this.$dialog.dialog( { buttons: {} } );
+                       // Hide everything
+                       this.$dialog.find( '.feedback-mode' ).hide();
+                       // Show the desired div
+                       this.$dialog.find( '.feedback-' + s ).show();
                },
 
                /**
index 85669fb..3a6869e 100644 (file)
        var oldParser,
                slice = Array.prototype.slice,
                parserDefaults = {
-                       magic : {
-                               'SITENAME' : mw.config.get( 'wgSiteName' )
+                       magic: {
+                               'SITENAME': mw.config.get( 'wgSiteName' )
                        },
                        // This is a whitelist based on, but simpler than, Sanitizer.php.
                        // Self-closing tags are not currently supported.
-                       allowedHtmlElements : [
+                       allowedHtmlElements: [
                                'b',
                                'i'
                        ],
                        // Key tag name, value allowed attributes for that tag.
                        // See Sanitizer::setupAttributeWhitelist
-                       allowedHtmlCommonAttributes : [
+                       allowedHtmlCommonAttributes: [
                                // HTML
                                'id',
                                'class',
@@ -41,9 +41,9 @@
                        // Attributes allowed for specific elements.
                        // Key is element name in lower case
                        // Value is array of allowed attributes for that element
-                       allowedHtmlAttributesByElement : {},
-                       messages : mw.messages,
-                       language : mw.language,
+                       allowedHtmlAttributesByElement: {},
+                       messages: mw.messages,
+                       language: mw.language,
 
                        // Same meaning as in mediawiki.js.
                        //
index e35fcd1..03f133e 100644 (file)
@@ -91,7 +91,7 @@ relativeforfloats = window.relativeforfloats = function () {
 setrelative = window.setrelative = function ( nodes ) {
        var i = 0;
        while ( i < nodes.length ) {
-               if( ( ( nodes[i].style.float && nodes[i].style.float !== ( 'none' ) ||
+               if ( ( ( nodes[i].style.float && nodes[i].style.float !== ( 'none' ) ||
                        ( nodes[i].align && nodes[i].align !== ( 'none' ) ) ) &&
                        ( !nodes[i].style.position || nodes[i].style.position !== 'relative' ) ) )
                {
@@ -135,7 +135,7 @@ window.onbeforeprint = function () {
        }
 };
 
-window.onafterprint = function() {
+window.onafterprint = function () {
        for ( var i = 0; i < expandedURLs.length; i++ ) {
                if ( expandedURLs[i] ) {
                        expandedURLs[i].removeNode( true );
index ca74b38..c017e3c 100644 (file)
@@ -5,7 +5,7 @@
  * http://www.modernmethod.com/sajax/
  */
 
-/*jshint camelcase:false, onevar:false */
+/*jshint camelcase:false */
 /*global alert */
 ( function ( mw ) {
 
@@ -89,9 +89,7 @@ function createXhr() {
  * with id = showFoo
  */
 function doAjaxRequest( func_name, args, target ) {
-       var i, x;
-       var uri;
-       var post_data;
+       var i, x, uri, post_data;
        uri = mw.util.wikiScript() + '?action=ajax';
        if ( window.sajax_request_type === 'GET' ) {
                if ( uri.indexOf( '?' ) === -1 ) {
@@ -146,7 +144,7 @@ function doAjaxRequest( func_name, args, target ) {
                } else if ( typeof target === 'object' ) {
                        if ( target.tagName === 'INPUT' ) {
                                if ( x.status === 200 ) {
-                                       target.value= x.responseText;
+                                       target.value = x.responseText;
                                }
                                //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
                        } else {
@@ -173,8 +171,9 @@ function doAjaxRequest( func_name, args, target ) {
  * @return {boolean} Whether the browser supports AJAX
  */
 function wfSupportsAjax() {
-       var request = createXhr();
-       var supportsAjax = request ? true : false;
+       var request = createXhr(),
+               supportsAjax = request ? true : false;
+
        request = undefined;
        return supportsAjax;
 }
index a869923..41d20fb 100644 (file)
@@ -149,14 +149,3 @@ div.magnify a, div.magnify img {
 img.thumbborder {
        border: 1px solid #dddddd;
 }
-
-/**
- * Basic styles for the user login and create account forms
- */
-#loginend {
-       margin: 0.5em;
-}
-
-#loginend table {
-       width: 100%;
-}
index fb8edc1..2886e08 100644 (file)
@@ -98,7 +98,7 @@
                // Show/Hide memcached servers when needed
                $( 'input[name$="config_wgMainCacheType"]' ).change( function () {
                        var $memc = $( '#config-memcachewrapper' );
-                       if( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
+                       if ( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
                                $memc.show( 'slow' );
                        } else {
                                $memc.hide( 'slow' );
index d639f63..7933caf 100644 (file)
@@ -85,7 +85,6 @@ function uploadSetup() {
                wpLicenseTbody.insertBefore( row, wpLicenseRow.nextSibling );
        }
 
-
        // fillDestFile setup
        uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
        len = uploadSourceIds.length;
@@ -98,7 +97,7 @@ function uploadSetup() {
 }
 
 wgUploadWarningObj = window.wgUploadWarningObj = {
-       responseCache: { '' : '&nbsp;' },
+       responseCache: { '': '&nbsp;' },
        nameToCheck: '',
        typing: false,
        delay: 500, // ms
@@ -303,7 +302,7 @@ window.toggleFilenameFiller = function () {
 
 wgUploadLicenseObj = window.wgUploadLicenseObj = {
 
-       responseCache: { '' : '' },
+       responseCache: { '': '' },
 
        fetchPreview: function ( license ) {
                var cached, title;
index f0aa943..df5682e 100644 (file)
@@ -240,7 +240,7 @@ win.importStylesheet = function ( page ) {
        return win.importStylesheetURI( uri );
 };
 
-win.importStylesheetURI = function( url, media ) {
+win.importStylesheetURI = function ( url, media ) {
        var l = document.createElement( 'link' );
        l.rel = 'stylesheet';
        l.href = url;
index 4326496..c32e869 100644 (file)
@@ -642,10 +642,6 @@ td.htmlform-tip {
        margin-top: 2em;
 }
 
-#loginend, #signupend {
-       clear: both;
-}
-
 #userloginprompt, #languagelinks {
        font-size: 85%;
 }
index 8420431..0bc114a 100644 (file)
@@ -8,7 +8,7 @@ jQuery( function ( $ ) {
                        .attr( 'tabindex', '0' )
                        // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
                        .on( 'click keypress', function ( e ) {
-                               if( e.type === 'click' || e.which === 13 ) {
+                               if ( e.type === 'click' || e.which === 13 ) {
                                        $el.toggleClass( 'menuForceShow' );
                                        e.preventDefault();
                                }
diff --git a/tests/frontend/Gruntfile.js b/tests/frontend/Gruntfile.js
new file mode 100644 (file)
index 0000000..a8aad41
--- /dev/null
@@ -0,0 +1,51 @@
+/*!
+ * Grunt file
+ */
+
+/*jshint node:true */
+module.exports = function ( grunt ) {
+       grunt.loadNpmTasks( 'grunt-contrib-jshint' );
+       grunt.loadNpmTasks( 'grunt-contrib-watch' );
+       grunt.loadNpmTasks( 'grunt-jscs-checker' );
+
+       grunt.file.setBase(  __dirname + '/../..' );
+
+       grunt.initConfig( {
+               pkg: grunt.file.readJSON( __dirname + '/package.json' ),
+               jshint: {
+                       options: {
+                               jshintrc: '.jshintrc'
+                       },
+                       all: [ '*.js', '{includes,languages,resources,skins,tests}/**/*.js' ]
+               },
+               jscs: {
+                       // Known issues:
+                       // - https://github.com/mdevils/node-jscs/issues/277
+                       // - https://github.com/mdevils/node-jscs/issues/278
+                       all: [
+                               '<%= jshint.all %>',
+                               // Auto-generated file with JSON (double quotes)
+                               '!tests/qunit/data/mediawiki.jqueryMsg.data.js'
+
+                       // Exclude all files ignored by jshint
+                       ].concat( grunt.file.read( '.jshintignore' ).split( '\n' ).reduce( function ( patterns, pattern ) {
+                               // Filter out empty lines
+                               if ( pattern.length && pattern[0] !== '#' ) {
+                                       patterns.push( '!' + pattern );
+                               }
+                               return patterns;
+                       }, [] ) )
+               },
+               watch: {
+                       files: [
+                               '.{jshintrc,jscs.json,jshintignore,csslintrc}',
+                               '<%= jshint.all %>'
+                       ],
+                       tasks: ['test']
+               }
+       } );
+
+       grunt.registerTask( 'lint', ['jshint', 'jscs'] );
+       grunt.registerTask( 'test', ['lint'] );
+       grunt.registerTask( 'default', ['test'] );
+};
diff --git a/tests/frontend/package.json b/tests/frontend/package.json
new file mode 100644 (file)
index 0000000..5eb5c0a
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "name": "mediawiki",
+  "version": "0.0.0",
+  "scripts": {
+    "test": "grunt test"
+  },
+  "devDependencies": {
+    "grunt": "0.4.2",
+    "grunt-contrib-jshint": "0.8.0",
+    "grunt-contrib-watch": "0.5.3",
+    "grunt-jscs-checker": "0.4.0"
+  }
+}
index 1e0f78d..e8e71b8 100644 (file)
@@ -10170,7 +10170,8 @@ parsoid=wt2html,wt2wt,html2html
 # See https://www.mediawiki.org/wiki/Help:Images#Size_and_frame
 # and https://bugzilla.wikimedia.org/show_bug.cgi?id=62258
 # Foobar has actual size of 1941x220
-# 1. Thumbs & frameless always reduce, can't be enlarged
+# 1. Thumbs & frameless always reduce, can't be enlarged unless it's
+#    a scalable format.
 # 2. Framed images ignore width; always render at default size.
 #    If given a height, they respect height but continue to ignore width.
 # 3. "Unspecified format" and border are the only types which can be
@@ -10224,16 +10225,20 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Image: thumbs can't be enlarged past original size
+Image: bitmap thumbs can't be enlarged past original size, but vector can.
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|2000px]]
+
+[[File:Foobar.svg|thumb|2000px]]
 !! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:2002px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
 
 !! html/parsoid
 <figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
+<figure typeof="mw:Image/Thumb"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" height="1500" width="2000"/></a></figure>
 !! end
 
 !! test
@@ -10250,16 +10255,20 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Image: frameless can't be enlarged past original size
+Image: bitmap frameless can't be enlarged past original size, but vector can
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frameless|2000px]]
+
+[[File:Foobar.svg|frameless|2000px]]
 !! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p><p><a href="/wiki/File:Foobar.svg" class="image"><img alt="Foobar.svg" src="http://example.com/images/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png" width="2000" height="1500" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png 2x" /></a>
 </p>
 !! html/parsoid
 <p><span typeof="mw:Image/Frameless"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
+<p><span typeof="mw:Image/Frameless"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" height="1500" width="2000"/></a></span></p>
 !! end
 
 !! test
@@ -10357,153 +10366,191 @@ SVG thumbnails with no language set
 !! options
 !! wikitext
 [[File:Foobar.svg|thumb|caption]]
-!! html
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
 SVG thumbnails with language de
 !! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.svg|thumb|caption|lang=de]]
-!! html
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" lang="de" height="165" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
 SVG thumbnails with invalid language code
 !! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.svg|thumb|caption|lang=invalid.language.code]]
-!! html
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="135" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
 
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" height="165" width="220"/></a><figcaption>lang=invalid.language.code</figcaption></figure>
 !! end
 
 !! test
 BUG 1887: A ISBN with a thumbnail
 !! wikitext
-[[Image:foobar.jpg|thumb|ISBN 1235467890]]
-!! html
+[[File:Foobar.jpg|thumb|ISBN 1235467890]]
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
 
+!! 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/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption><a href="Special:BookSources/1235467890" rel="mw:ExtLink">ISBN 1235467890</a></figcaption></figure>
 !! end
 
 !! test
 BUG 1887: A RFC with a thumbnail
 !! wikitext
-[[Image:foobar.jpg|thumb|This is RFC 12354]]
-!! html
+[[File:Foobar.jpg|thumb|This is RFC 12354]]
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
 
+!! 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/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>This is <a href="//tools.ietf.org/html/rfc12354" rel="mw:ExtLink">RFC 12354</a></figcaption></figure>
 !! end
 
 !! test
 BUG 1887: A mailto link with a thumbnail
 !! wikitext
-[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
-!! html
+[[File:Foobar.jpg|thumb|Please mailto:nobody@example.com]]
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
 
+!! 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/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>Please <a rel="mw:ExtLink" href="mailto:nobody@example.com">mailto:nobody@example.com</a></figcaption></figure>
 !! end
 
 # Pending resolution to bug 368
 !! test
 BUG 648: Frameless image caption with a link
 !! wikitext
-[[Image:foobar.jpg|text with a [[link]] in it]]
-!! html
+[[File:Foobar.jpg|text with a [[link]] in it]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a [[link]] in it"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 BUG 648: Frameless image caption with a link (suffix)
 !! wikitext
-[[Image:foobar.jpg|text with a [[link]]foo in it]]
-!! html
+[[File:Foobar.jpg|text with a [[link]]foo in it]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a [[link]]foo in it"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 BUG 648: Frameless image caption with an interwiki link
 !! wikitext
-[[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]]
-!! html
+[[File:Foobar.jpg|text with a [[MeatBall:Link]] in it]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a [[MeatBall:Link]] in it"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 BUG 648: Frameless image caption with a piped interwiki link
 !! wikitext
-[[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
-!! html
+[[File:Foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a [[MeatBall:Link|link]] in it"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 Escape HTML special chars in image alt text
 !! wikitext
-[[Image:foobar.jpg|& < > "]]
-!! html
+[[File:Foobar.jpg|& < > "]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&amp; &lt; > \""}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 BUG 499: Alt text should have &#1234;, not &amp;1234;
 !! wikitext
-[[Image:foobar.jpg|&#9792;]]
-!! html
+[[File:Foobar.jpg|&#9792;]]
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&amp;#9792;"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
 Broken image caption with link
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link.
-!! html
+!! html/php
 <p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
 </p>
+!! html/parsoid
+<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a rel="mw:WikiLink" href="Main_Page">this</a> is just an ordinary link.</p>
 !! end
 
 !! test
 Image caption containing another image
 !! wikitext
-[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
-!! html
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div>
+[[File:Foobar.jpg|thumb|This is a caption with another [[File:Thumb.png|image]] inside it!]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/wiki/File:Thumb.png" class="image" title="image"><img alt="image" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" /></a> inside it!</div></div></div>
 
+!! 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/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>This is a caption with another <span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"image"}'><a href="File:Thumb.png"><img resource="./File:Thumb.png" src="//example.com/images/e/ea/Thumb.png" height="135" width="135"/></a></span> inside it!</figcaption></figure>
 !! end
 
 !! test
-Image caption containing a newline
+Image: caption containing a newline
 !! wikitext
-[[Image:Foobar.jpg|This
+[[File:Foobar.jpg|This
 *is some text]]
-!! html
+!! html/php
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"This\n*is some text"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !!end
 
 !!test
-Parsoid: Image caption containing leading space
+Image: caption containing leading space
 (The leading space should not trigger nowiki escaping in wt2wt mode)
 !! wikitext
-[[Image:Foobar.jpg|thumb| bar]]
-!! html
+[[File:Foobar.jpg|thumb| bar]]
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>bar</div></div></div>
 
+!! 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/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption> bar</figcaption></figure>
 !!end
 
 !! test
-Images: caption containing a table
+Image: caption containing a table
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[Image:Foobar.jpg|thumb|200px|This is an example image thumbnail caption with a table
 {|
@@ -14712,6 +14759,14 @@ ISBN 3-462-04561-X
 </p>
 !! end
 
+!! test
+ISBN with empty prefix (parsoid test)
+!! wikitext
+ISBN 1234567890
+!! html/parsoid
+<p><a href="Special:BookSources/1234567890" rel="mw:ExtLink">ISBN 1234567890</a></p>
+!! end
+
 !! test
 Bug 22905: <abbr> followed by ISBN followed by </a>
 !! wikitext
@@ -19373,62 +19428,128 @@ parsoid=html2wt
 !! test
 Image: Modifying size of an image (1)
 !! options
-parsoid=html2wt
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["img[height]", "attr", "height", "22"],
+    ["img[width]", "attr", "width", "200"]
+  ]
+}
 !! wikitext
+[[Image:Foobar.jpg|230x230px]]
+!! wikitext/edited
 [[Image:Foobar.jpg|200x200px]]
-!! html
-<p><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"230x230px"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/230px-Foobar.jpg" height="22" width="200" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"26","width":"230"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></span></p>
 !!end
 
 !! test
 Image: Modifying size of an image (2)
 !! options
-parsoid=html2wt
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["img[height]", "attr", "height", "100"],
+    ["img[width]", "attr", "width", "500"]
+  ]
+}
 !! wikitext
+[[Image:Foobar.jpg|230x230px]]
+!! wikitext/edited
 [[Image:Foobar.jpg|500x500px]]
-!! html
-<p><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"230x230px"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/230px-Foobar.jpg" height="100" width="500" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"26","width":"230"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></span></p>
 !!end
 
-# note that the data-parsoid value conflicts with the figure's class
+# Change in size is ignored so long as class='mw-default-size'
+!! test
+Image: Modifying size of an image (3)
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["figure[class]", "removeClass", "mw-default-size"],
+    ["figure img", "attr", "height", "19"],
+    ["figure img", "attr", "width", "170"]
+  ]
+}
+!! wikitext
+[[Image:Foobar.jpg|thumb]]
+!! wikitext/edited
+[[Image:Foobar.jpg|thumb|170x170px]]
+!!end
+
 !! test
 Image: Modifying alignment of an image (bug 48665)
 !! options
-parsoid=html2wt
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["figure[class]", "removeClass", "mw-halign-right"],
+    ["figure[class]", "addClass", "mw-halign-left"]
+  ]
+}
 !! wikitext
+[[Image:Foobar.jpg|thumb|caption|right]]
+!! wikitext/edited
 [[Image:Foobar.jpg|thumb|caption|left]]
-!! html
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"caption"},{"ck":"right","ak":"right"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
+!! end
+
+!! test
+Image: Modifying mw-default-size of an frameless image (bug 62805)
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["figure.mw-default-size", "removeClass", "mw-default-size"]
+  ]
+}
+!! wikitext
+[[Image:Foobar.jpg|frameless|right]]
+!! wikitext/edited
+[[Image:Foobar.jpg|frameless|right|220x220px]]
 !! end
 
 !! test
 Image: Modifying valign of an image (bug 49221)
 !! options
-parsoid=html2wt
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["*[typeof=\"mw:Image\"]", "removeClass", "mw-valign-middle"],
+    ["*[typeof=\"mw:Image\"]", "addClass", "mw-valign-text-top"]
+  ]
+}
 !! wikitext
+[[File:Foobar.jpg|20px|middle]]
+!! wikitext/edited
 [[File:Foobar.jpg|20px|text-top]]
-!! html
-<p><span class="mw-valign-text-top" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"20px"},{"ck":"text_top","ak":"text-top"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" height="2" width="20" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"2","width":"20"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 !! end
 
 !! test
 Image: Modifying alt attribute of an image (bug 56400)
 !! options
-parsoid=html2wt
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["img[alt]", "attr", "alt", "some alternate edited text"]
+  ]
+}
 !! wikitext
+[[File:Foobar.jpg|thumb|some caption|alt=some alternate text]]
+!! wikitext/edited
 [[File:Foobar.jpg|thumb|some caption|alt=some alternate edited text]]
-!! html
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"some caption"},{"ck":"alt","ak":"alt=some alternate text"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img alt="some alternate edited text" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180" data-parsoid='{"a":{"alt":"some alternate edited text","resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"alt":"alt=some alternate edited text","resource":"File:Foobar.jpg"}}'/></a><figcaption>some caption</figcaption></figure>
 !!end
 
 !! test
 Image: Modifying caption of an image
 !! options
-parsoid=html2wt
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["figcaption", "text", "new caption"]
+  ]
+}
 !! wikitext
+[[Image:Foobar.jpg|thumb|original caption]]
+!! wikitext/edited
 [[Image:Foobar.jpg|thumb|new caption]]
-!! html
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"original caption"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a><figcaption>new caption</figcaption></figure>
 !!end
 
 !! test
@@ -19480,7 +19601,7 @@ parsoid
 !!end
 
 !! test
-Images: upright option (parsoid)
+Image: upright option (parsoid)
 !! options
 parsoid
 !! wikitext
@@ -19492,7 +19613,7 @@ parsoid
 !!end
 
 !! test
-Images: upright option is ignored on inline and frame images (parsoid)
+Image: upright option is ignored on inline and frame images (parsoid)
 !! options
 parsoid
 !! wikitext
@@ -19501,6 +19622,48 @@ parsoid
 <p><span typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="57" width="500"/></a></span></p>
 !!end
 
+!! test
+Image: from basic HTML (1)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<span typeof="mw:Image">
+  <img src="File:Foobar.jpg" width=100 height=100 alt="Alt">
+</span>
+!! wikitext
+[[File:Foobar.jpg|link=|alt=Alt|100x100px]]
+!! end
+
+!! test
+Image: from basic HTML (2)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<img src="File:Foobar.jpg" width=100 height=100 alt="Alt">
+!! wikitext
+[[File:Foobar.jpg|link=|alt=Alt|100x100px]]
+!! end
+
+!! test
+Image: from basic HTML (3)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<a href="Main"><img src="File:Foobar.jpg" width=100 height=100 alt="Alt"></a>
+!! wikitext
+[[File:Foobar.jpg|link=Main|alt=Alt|100x100px]]
+!! end
+
+!! test
+Image: from basic HTML (4)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<img src="File:Foobar.jpg">
+!! wikitext
+[[File:Foobar.jpg|link=]]
+!! end
+
 !! test
 Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
 !! options
index e568eaf..aedc23a 100644 (file)
@@ -24,9 +24,9 @@ class DjVuTest extends MediaWikiTestCase {
                parent::setUp();
 
                //cli tool setup
-               $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/local/bin/ddjvu';
-               $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/local/bin/djvudump';
-               $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/local/bin/djvutoxml';
+               $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
+               $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
+               $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
                if (
                        !$this->checkIfToolExists( $wgDjvuRenderer ) ||
                        !$this->checkIfToolExists( $wgDjvuDump ) ||
index 12e5a2d..461ab87 100644 (file)
@@ -135,7 +135,6 @@ class GenerateJqueryMsgData extends Maintenance {
                                . '// Last generated with ' . basename( __FILE__ ) . ' at ' . gmdate( 'r' ) . "\n"
                                // This file will contain unquoted JSON strings as javascript native object literals,
                                // flip the quotemark convention for this file.
-                               . "/*jshint quotmark: double */\n"
                                . "\n"
                                . 'mediaWiki.libs.phpParserData = ' . FormatJson::encode( $phpParserData, true ) . ";\n";
 
index 776ee24..4ab5f14 100644 (file)
 // This file stores the output from the PHP parser for various messages, arguments,
 // languages, and parser modes. Intended for use by a unit test framework by looping
 // through the object and comparing its parser return value with the 'result' property.
-// Last generated with generateJqueryMsgData.php at Sat, 03 Nov 2012 21:32:01 +0000
-/*jshint quotmark: double */
+// Last generated with generateJqueryMsgData.php at Thu, 30 Jan 2014 04:04:41 +0000
 
 mediaWiki.libs.phpParserData = {
-       "messages": {
-               "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-               "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
-               "fr_undelete_short": "Restaurer $1 modification{{PLURAL:$1||s}}",
-               "fr_category-subcat-count": "Cette cat\u00e9gorie comprend {{PLURAL:$2|la sous-cat\u00e9gorie|$2 sous-cat\u00e9gories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
-               "ar_undelete_short": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 {{PLURAL:$1|\u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f|\u062a\u0639\u062f\u064a\u0644\u064a\u0646|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u062a|$1 \u062a\u0639\u062f\u064a\u0644|$1 \u062a\u0639\u062f\u064a\u0644\u0627}}",
-               "ar_category-subcat-count": "{{PLURAL:$2|\u0644\u0627 \u062a\u0635\u0627\u0646\u064a\u0641 \u0641\u0631\u0639\u064a\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 {{PLURAL:$1||\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a|\u0647\u0630\u064a\u0646 \u0627\u0644\u062a\u0635\u0646\u064a\u0641\u064a\u0646 \u0627\u0644\u0641\u0631\u0639\u064a\u064a\u0646|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641\u0627 \u0641\u0631\u0639\u064a\u0627|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641 \u0641\u0631\u0639\u064a}}\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a $2.}}",
-               "jp_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-               "jp_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
-               "zh_undelete_short": "\u6062\u590d$1\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
-               "zh_category-subcat-count": "{{PLURAL:$2|\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002|\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u5217$1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171$2\u4e2a\u5b50\u5206\u7c7b\u3002}}"
-       },
-       "tests": [
-               {
-                       "name": "en undelete_short 0",
-                       "key": "en_undelete_short",
-                       "args": [
-                               0
-                       ],
-                       "result": "Undelete 0 edits",
-                       "lang": "en"
-               },
-               {
-                       "name": "en undelete_short 1",
-                       "key": "en_undelete_short",
-                       "args": [
-                               1
-                       ],
-                       "result": "Undelete one edit",
-                       "lang": "en"
-               },
-               {
-                       "name": "en undelete_short 2",
-                       "key": "en_undelete_short",
-                       "args": [
-                               2
-                       ],
-                       "result": "Undelete 2 edits",
-                       "lang": "en"
-               },
-               {
-                       "name": "en undelete_short 5",
-                       "key": "en_undelete_short",
-                       "args": [
-                               5
-                       ],
-                       "result": "Undelete 5 edits",
-                       "lang": "en"
-               },
-               {
-                       "name": "en undelete_short 21",
-                       "key": "en_undelete_short",
-                       "args": [
-                               21
-                       ],
-                       "result": "Undelete 21 edits",
-                       "lang": "en"
-               },
-               {
-                       "name": "en undelete_short 101",
-                       "key": "en_undelete_short",
-                       "args": [
-                               101
-                       ],
-                       "result": "Undelete 101 edits",
-                       "lang": "en"
-               },
-               {
-                       "name": "en category-subcat-count 0,10",
-                       "key": "en_category-subcat-count",
-                       "args": [
-                               0,
-                               10
-                       ],
-                       "result": "This category has the following 0 subcategories, out of 10 total.",
-                       "lang": "en"
-               },
-               {
-                       "name": "en category-subcat-count 1,1",
-                       "key": "en_category-subcat-count",
-                       "args": [
-                               1,
-                               1
-                       ],
-                       "result": "This category has only the following subcategory.",
-                       "lang": "en"
-               },
-               {
-                       "name": "en category-subcat-count 1,2",
-                       "key": "en_category-subcat-count",
-                       "args": [
-                               1,
-                               2
-                       ],
-                       "result": "This category has the following subcategory, out of 2 total.",
-                       "lang": "en"
-               },
-               {
-                       "name": "en category-subcat-count 3,30",
-                       "key": "en_category-subcat-count",
-                       "args": [
-                               3,
-                               30
-                       ],
-                       "result": "This category has the following 3 subcategories, out of 30 total.",
-                       "lang": "en"
-               },
-               {
-                       "name": "fr undelete_short 0",
-                       "key": "fr_undelete_short",
-                       "args": [
-                               0
-                       ],
-                       "result": "Restaurer 0 modification",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr undelete_short 1",
-                       "key": "fr_undelete_short",
-                       "args": [
-                               1
-                       ],
-                       "result": "Restaurer 1 modification",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr undelete_short 2",
-                       "key": "fr_undelete_short",
-                       "args": [
-                               2
-                       ],
-                       "result": "Restaurer 2 modifications",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr undelete_short 5",
-                       "key": "fr_undelete_short",
-                       "args": [
-                               5
-                       ],
-                       "result": "Restaurer 5 modifications",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr undelete_short 21",
-                       "key": "fr_undelete_short",
-                       "args": [
-                               21
-                       ],
-                       "result": "Restaurer 21 modifications",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr undelete_short 101",
-                       "key": "fr_undelete_short",
-                       "args": [
-                               101
-                       ],
-                       "result": "Restaurer 101 modifications",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr category-subcat-count 0,10",
-                       "key": "fr_category-subcat-count",
-                       "args": [
-                               0,
-                               10
-                       ],
-                       "result": "Cette cat\u00e9gorie comprend 10 sous-cat\u00e9gories, dont celle ci-dessous.",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr category-subcat-count 1,1",
-                       "key": "fr_category-subcat-count",
-                       "args": [
-                               1,
-                               1
-                       ],
-                       "result": "Cette cat\u00e9gorie comprend la sous-cat\u00e9gorie ci-dessous.",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr category-subcat-count 1,2",
-                       "key": "fr_category-subcat-count",
-                       "args": [
-                               1,
-                               2
-                       ],
-                       "result": "Cette cat\u00e9gorie comprend 2 sous-cat\u00e9gories, dont celle ci-dessous.",
-                       "lang": "fr"
-               },
-               {
-                       "name": "fr category-subcat-count 3,30",
-                       "key": "fr_category-subcat-count",
-                       "args": [
-                               3,
-                               30
-                       ],
-                       "result": "Cette cat\u00e9gorie comprend 30 sous-cat\u00e9gories, dont les 3 ci-dessous.",
-                       "lang": "fr"
-               },
-               {
-                       "name": "ar undelete_short 0",
-                       "key": "ar_undelete_short",
-                       "args": [
-                               0
-                       ],
-                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar undelete_short 1",
-                       "key": "ar_undelete_short",
-                       "args": [
-                               1
-                       ],
-                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644\u064a\u0646",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar undelete_short 2",
-                       "key": "ar_undelete_short",
-                       "args": [
-                               2
-                       ],
-                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 2 \u062a\u0639\u062f\u064a\u0644\u0627\u062a",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar undelete_short 5",
-                       "key": "ar_undelete_short",
-                       "args": [
-                               5
-                       ],
-                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 5 \u062a\u0639\u062f\u064a\u0644",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar undelete_short 21",
-                       "key": "ar_undelete_short",
-                       "args": [
-                               21
-                       ],
-                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 21 \u062a\u0639\u062f\u064a\u0644\u0627",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar undelete_short 101",
-                       "key": "ar_undelete_short",
-                       "args": [
-                               101
-                       ],
-                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 101 \u062a\u0639\u062f\u064a\u0644\u0627",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar category-subcat-count 0,10",
-                       "key": "ar_category-subcat-count",
-                       "args": [
-                               0,
-                               10
-                       ],
-                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 10.",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar category-subcat-count 1,1",
-                       "key": "ar_category-subcat-count",
-                       "args": [
-                               1,
-                               1
-                       ],
-                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar category-subcat-count 1,2",
-                       "key": "ar_category-subcat-count",
-                       "args": [
-                               1,
-                               2
-                       ],
-                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 2.",
-                       "lang": "ar"
-               },
-               {
-                       "name": "ar category-subcat-count 3,30",
-                       "key": "ar_category-subcat-count",
-                       "args": [
-                               3,
-                               30
-                       ],
-                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0647 \u0627\u06443 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 30.",
-                       "lang": "ar"
-               },
-               {
-                       "name": "jp undelete_short 0",
-                       "key": "jp_undelete_short",
-                       "args": [
-                               0
-                       ],
-                       "result": "Undelete 0 edits",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp undelete_short 1",
-                       "key": "jp_undelete_short",
-                       "args": [
-                               1
-                       ],
-                       "result": "Undelete one edit",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp undelete_short 2",
-                       "key": "jp_undelete_short",
-                       "args": [
-                               2
-                       ],
-                       "result": "Undelete 2 edits",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp undelete_short 5",
-                       "key": "jp_undelete_short",
-                       "args": [
-                               5
-                       ],
-                       "result": "Undelete 5 edits",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp undelete_short 21",
-                       "key": "jp_undelete_short",
-                       "args": [
-                               21
-                       ],
-                       "result": "Undelete 21 edits",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp undelete_short 101",
-                       "key": "jp_undelete_short",
-                       "args": [
-                               101
-                       ],
-                       "result": "Undelete 101 edits",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp category-subcat-count 0,10",
-                       "key": "jp_category-subcat-count",
-                       "args": [
-                               0,
-                               10
-                       ],
-                       "result": "This category has the following 0 subcategories, out of 10 total.",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp category-subcat-count 1,1",
-                       "key": "jp_category-subcat-count",
-                       "args": [
-                               1,
-                               1
-                       ],
-                       "result": "This category has only the following subcategory.",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp category-subcat-count 1,2",
-                       "key": "jp_category-subcat-count",
-                       "args": [
-                               1,
-                               2
-                       ],
-                       "result": "This category has the following subcategory, out of 2 total.",
-                       "lang": "jp"
-               },
-               {
-                       "name": "jp category-subcat-count 3,30",
-                       "key": "jp_category-subcat-count",
-                       "args": [
-                               3,
-                               30
-                       ],
-                       "result": "This category has the following 3 subcategories, out of 30 total.",
-                       "lang": "jp"
-               },
-               {
-                       "name": "zh undelete_short 0",
-                       "key": "zh_undelete_short",
-                       "args": [
-                               0
-                       ],
-                       "result": "\u6062\u590d0\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh undelete_short 1",
-                       "key": "zh_undelete_short",
-                       "args": [
-                               1
-                       ],
-                       "result": "\u6062\u590d1\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh undelete_short 2",
-                       "key": "zh_undelete_short",
-                       "args": [
-                               2
-                       ],
-                       "result": "\u6062\u590d2\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh undelete_short 5",
-                       "key": "zh_undelete_short",
-                       "args": [
-                               5
-                       ],
-                       "result": "\u6062\u590d5\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh undelete_short 21",
-                       "key": "zh_undelete_short",
-                       "args": [
-                               21
-                       ],
-                       "result": "\u6062\u590d21\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh undelete_short 101",
-                       "key": "zh_undelete_short",
-                       "args": [
-                               101
-                       ],
-                       "result": "\u6062\u590d101\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh category-subcat-count 0,10",
-                       "key": "zh_category-subcat-count",
-                       "args": [
-                               0,
-                               10
-                       ],
-                       "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52170\u4e2a\u5b50\u5206\u7c7b\uff0c\u517110\u4e2a\u5b50\u5206\u7c7b\u3002",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh category-subcat-count 1,1",
-                       "key": "zh_category-subcat-count",
-                       "args": [
-                               1,
-                               1
-                       ],
-                       "result": "\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh category-subcat-count 1,2",
-                       "key": "zh_category-subcat-count",
-                       "args": [
-                               1,
-                               2
-                       ],
-                       "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52171\u4e2a\u5b50\u5206\u7c7b\uff0c\u51712\u4e2a\u5b50\u5206\u7c7b\u3002",
-                       "lang": "zh"
-               },
-               {
-                       "name": "zh category-subcat-count 3,30",
-                       "key": "zh_category-subcat-count",
-                       "args": [
-                               3,
-                               30
-                       ],
-                       "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52173\u4e2a\u5b50\u5206\u7c7b\uff0c\u517130\u4e2a\u5b50\u5206\u7c7b\u3002",
-                       "lang": "zh"
-               }
-       ]
+    "messages": {
+        "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+        "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+        "fr_undelete_short": "Restaurer $1 modification{{PLURAL:$1||s}}",
+        "fr_category-subcat-count": "Cette cat\u00e9gorie comprend {{PLURAL:$2|la sous-cat\u00e9gorie|$2 sous-cat\u00e9gories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
+        "ar_undelete_short": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 {{PLURAL:$1||\u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f|\u062a\u0639\u062f\u064a\u0644\u064a\u0646|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u062a|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u064b|$1 \u062a\u0639\u062f\u064a\u0644}}",
+        "ar_category-subcat-count": "{{PLURAL:$2|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u064a\u062d\u0648\u064a \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u064a\u062d\u0648\u064a {{PLURAL:$1||\u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a|\u062a\u0635\u0646\u064a\u0641\u064a\u0646 \u0641\u0631\u0639\u064a\u064a\u0646|$1 \u062a\u0635\u0646\u064a\u0641\u0627\u062a \u0641\u0631\u0639\u064a\u0629}}\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a $2.}}",
+        "jp_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+        "jp_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+        "zh_undelete_short": "\u8fd8\u539f{{PLURAL:$1|$1\u4e2a\u7f16\u8f91}}",
+        "zh_category-subcat-count": "{{PLURAL:$2|\u672c\u5206\u7c7b\u53ea\u6709\u4ee5\u4e0b\u5b50\u5206\u7c7b\u3002|\u672c\u5206\u7c7b\u6709\u4ee5\u4e0b$1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u6709$2\u4e2a\u5b50\u5206\u7c7b\u3002}}"
+    },
+    "tests": [
+        {
+            "name": "en undelete_short 0",
+            "key": "en_undelete_short",
+            "args": [
+                0
+            ],
+            "result": "Undelete 0 edits",
+            "lang": "en"
+        },
+        {
+            "name": "en undelete_short 1",
+            "key": "en_undelete_short",
+            "args": [
+                1
+            ],
+            "result": "Undelete one edit",
+            "lang": "en"
+        },
+        {
+            "name": "en undelete_short 2",
+            "key": "en_undelete_short",
+            "args": [
+                2
+            ],
+            "result": "Undelete 2 edits",
+            "lang": "en"
+        },
+        {
+            "name": "en undelete_short 5",
+            "key": "en_undelete_short",
+            "args": [
+                5
+            ],
+            "result": "Undelete 5 edits",
+            "lang": "en"
+        },
+        {
+            "name": "en undelete_short 21",
+            "key": "en_undelete_short",
+            "args": [
+                21
+            ],
+            "result": "Undelete 21 edits",
+            "lang": "en"
+        },
+        {
+            "name": "en undelete_short 101",
+            "key": "en_undelete_short",
+            "args": [
+                101
+            ],
+            "result": "Undelete 101 edits",
+            "lang": "en"
+        },
+        {
+            "name": "en category-subcat-count 0,10",
+            "key": "en_category-subcat-count",
+            "args": [
+                0,
+                10
+            ],
+            "result": "This category has the following 0 subcategories, out of 10 total.",
+            "lang": "en"
+        },
+        {
+            "name": "en category-subcat-count 1,1",
+            "key": "en_category-subcat-count",
+            "args": [
+                1,
+                1
+            ],
+            "result": "This category has only the following subcategory.",
+            "lang": "en"
+        },
+        {
+            "name": "en category-subcat-count 1,2",
+            "key": "en_category-subcat-count",
+            "args": [
+                1,
+                2
+            ],
+            "result": "This category has the following subcategory, out of 2 total.",
+            "lang": "en"
+        },
+        {
+            "name": "en category-subcat-count 3,30",
+            "key": "en_category-subcat-count",
+            "args": [
+                3,
+                30
+            ],
+            "result": "This category has the following 3 subcategories, out of 30 total.",
+            "lang": "en"
+        },
+        {
+            "name": "fr undelete_short 0",
+            "key": "fr_undelete_short",
+            "args": [
+                0
+            ],
+            "result": "Restaurer 0 modification",
+            "lang": "fr"
+        },
+        {
+            "name": "fr undelete_short 1",
+            "key": "fr_undelete_short",
+            "args": [
+                1
+            ],
+            "result": "Restaurer 1 modification",
+            "lang": "fr"
+        },
+        {
+            "name": "fr undelete_short 2",
+            "key": "fr_undelete_short",
+            "args": [
+                2
+            ],
+            "result": "Restaurer 2 modifications",
+            "lang": "fr"
+        },
+        {
+            "name": "fr undelete_short 5",
+            "key": "fr_undelete_short",
+            "args": [
+                5
+            ],
+            "result": "Restaurer 5 modifications",
+            "lang": "fr"
+        },
+        {
+            "name": "fr undelete_short 21",
+            "key": "fr_undelete_short",
+            "args": [
+                21
+            ],
+            "result": "Restaurer 21 modifications",
+            "lang": "fr"
+        },
+        {
+            "name": "fr undelete_short 101",
+            "key": "fr_undelete_short",
+            "args": [
+                101
+            ],
+            "result": "Restaurer 101 modifications",
+            "lang": "fr"
+        },
+        {
+            "name": "fr category-subcat-count 0,10",
+            "key": "fr_category-subcat-count",
+            "args": [
+                0,
+                10
+            ],
+            "result": "Cette cat\u00e9gorie comprend 10 sous-cat\u00e9gories, dont celle ci-dessous.",
+            "lang": "fr"
+        },
+        {
+            "name": "fr category-subcat-count 1,1",
+            "key": "fr_category-subcat-count",
+            "args": [
+                1,
+                1
+            ],
+            "result": "Cette cat\u00e9gorie comprend la sous-cat\u00e9gorie ci-dessous.",
+            "lang": "fr"
+        },
+        {
+            "name": "fr category-subcat-count 1,2",
+            "key": "fr_category-subcat-count",
+            "args": [
+                1,
+                2
+            ],
+            "result": "Cette cat\u00e9gorie comprend 2 sous-cat\u00e9gories, dont celle ci-dessous.",
+            "lang": "fr"
+        },
+        {
+            "name": "fr category-subcat-count 3,30",
+            "key": "fr_category-subcat-count",
+            "args": [
+                3,
+                30
+            ],
+            "result": "Cette cat\u00e9gorie comprend 30 sous-cat\u00e9gories, dont les 3 ci-dessous.",
+            "lang": "fr"
+        },
+        {
+            "name": "ar undelete_short 0",
+            "key": "ar_undelete_short",
+            "args": [
+                0
+            ],
+            "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 ",
+            "lang": "ar"
+        },
+        {
+            "name": "ar undelete_short 1",
+            "key": "ar_undelete_short",
+            "args": [
+                1
+            ],
+            "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f",
+            "lang": "ar"
+        },
+        {
+            "name": "ar undelete_short 2",
+            "key": "ar_undelete_short",
+            "args": [
+                2
+            ],
+            "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644\u064a\u0646",
+            "lang": "ar"
+        },
+        {
+            "name": "ar undelete_short 5",
+            "key": "ar_undelete_short",
+            "args": [
+                5
+            ],
+            "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 5 \u062a\u0639\u062f\u064a\u0644\u0627\u062a",
+            "lang": "ar"
+        },
+        {
+            "name": "ar undelete_short 21",
+            "key": "ar_undelete_short",
+            "args": [
+                21
+            ],
+            "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 21 \u062a\u0639\u062f\u064a\u0644\u0627\u064b",
+            "lang": "ar"
+        },
+        {
+            "name": "ar undelete_short 101",
+            "key": "ar_undelete_short",
+            "args": [
+                101
+            ],
+            "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 101 \u062a\u0639\u062f\u064a\u0644",
+            "lang": "ar"
+        },
+        {
+            "name": "ar category-subcat-count 0,10",
+            "key": "ar_category-subcat-count",
+            "args": [
+                0,
+                10
+            ],
+            "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u064a\u062d\u0648\u064a \u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 10.",
+            "lang": "ar"
+        },
+        {
+            "name": "ar category-subcat-count 1,1",
+            "key": "ar_category-subcat-count",
+            "args": [
+                1,
+                1
+            ],
+            "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u064a\u062d\u0648\u064a \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 1.",
+            "lang": "ar"
+        },
+        {
+            "name": "ar category-subcat-count 1,2",
+            "key": "ar_category-subcat-count",
+            "args": [
+                1,
+                2
+            ],
+            "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u064a\u062d\u0648\u064a \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 2.",
+            "lang": "ar"
+        },
+        {
+            "name": "ar category-subcat-count 3,30",
+            "key": "ar_category-subcat-count",
+            "args": [
+                3,
+                30
+            ],
+            "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u064a\u062d\u0648\u064a 3 \u062a\u0635\u0646\u064a\u0641\u0627\u062a \u0641\u0631\u0639\u064a\u0629\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 30.",
+            "lang": "ar"
+        },
+        {
+            "name": "jp undelete_short 0",
+            "key": "jp_undelete_short",
+            "args": [
+                0
+            ],
+            "result": "Undelete 0 edits",
+            "lang": "jp"
+        },
+        {
+            "name": "jp undelete_short 1",
+            "key": "jp_undelete_short",
+            "args": [
+                1
+            ],
+            "result": "Undelete one edit",
+            "lang": "jp"
+        },
+        {
+            "name": "jp undelete_short 2",
+            "key": "jp_undelete_short",
+            "args": [
+                2
+            ],
+            "result": "Undelete 2 edits",
+            "lang": "jp"
+        },
+        {
+            "name": "jp undelete_short 5",
+            "key": "jp_undelete_short",
+            "args": [
+                5
+            ],
+            "result": "Undelete 5 edits",
+            "lang": "jp"
+        },
+        {
+            "name": "jp undelete_short 21",
+            "key": "jp_undelete_short",
+            "args": [
+                21
+            ],
+            "result": "Undelete 21 edits",
+            "lang": "jp"
+        },
+        {
+            "name": "jp undelete_short 101",
+            "key": "jp_undelete_short",
+            "args": [
+                101
+            ],
+            "result": "Undelete 101 edits",
+            "lang": "jp"
+        },
+        {
+            "name": "jp category-subcat-count 0,10",
+            "key": "jp_category-subcat-count",
+            "args": [
+                0,
+                10
+            ],
+            "result": "This category has the following 0 subcategories, out of 10 total.",
+            "lang": "jp"
+        },
+        {
+            "name": "jp category-subcat-count 1,1",
+            "key": "jp_category-subcat-count",
+            "args": [
+                1,
+                1
+            ],
+            "result": "This category has only the following subcategory.",
+            "lang": "jp"
+        },
+        {
+            "name": "jp category-subcat-count 1,2",
+            "key": "jp_category-subcat-count",
+            "args": [
+                1,
+                2
+            ],
+            "result": "This category has the following subcategory, out of 2 total.",
+            "lang": "jp"
+        },
+        {
+            "name": "jp category-subcat-count 3,30",
+            "key": "jp_category-subcat-count",
+            "args": [
+                3,
+                30
+            ],
+            "result": "This category has the following 3 subcategories, out of 30 total.",
+            "lang": "jp"
+        },
+        {
+            "name": "zh undelete_short 0",
+            "key": "zh_undelete_short",
+            "args": [
+                0
+            ],
+            "result": "\u8fd8\u539f0\u4e2a\u7f16\u8f91",
+            "lang": "zh"
+        },
+        {
+            "name": "zh undelete_short 1",
+            "key": "zh_undelete_short",
+            "args": [
+                1
+            ],
+            "result": "\u8fd8\u539f1\u4e2a\u7f16\u8f91",
+            "lang": "zh"
+        },
+        {
+            "name": "zh undelete_short 2",
+            "key": "zh_undelete_short",
+            "args": [
+                2
+            ],
+            "result": "\u8fd8\u539f2\u4e2a\u7f16\u8f91",
+            "lang": "zh"
+        },
+        {
+            "name": "zh undelete_short 5",
+            "key": "zh_undelete_short",
+            "args": [
+                5
+            ],
+            "result": "\u8fd8\u539f5\u4e2a\u7f16\u8f91",
+            "lang": "zh"
+        },
+        {
+            "name": "zh undelete_short 21",
+            "key": "zh_undelete_short",
+            "args": [
+                21
+            ],
+            "result": "\u8fd8\u539f21\u4e2a\u7f16\u8f91",
+            "lang": "zh"
+        },
+        {
+            "name": "zh undelete_short 101",
+            "key": "zh_undelete_short",
+            "args": [
+                101
+            ],
+            "result": "\u8fd8\u539f101\u4e2a\u7f16\u8f91",
+            "lang": "zh"
+        },
+        {
+            "name": "zh category-subcat-count 0,10",
+            "key": "zh_category-subcat-count",
+            "args": [
+                0,
+                10
+            ],
+            "result": "\u672c\u5206\u7c7b\u6709\u4ee5\u4e0b0\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670910\u4e2a\u5b50\u5206\u7c7b\u3002",
+            "lang": "zh"
+        },
+        {
+            "name": "zh category-subcat-count 1,1",
+            "key": "zh_category-subcat-count",
+            "args": [
+                1,
+                1
+            ],
+            "result": "\u672c\u5206\u7c7b\u53ea\u6709\u4ee5\u4e0b\u5b50\u5206\u7c7b\u3002",
+            "lang": "zh"
+        },
+        {
+            "name": "zh category-subcat-count 1,2",
+            "key": "zh_category-subcat-count",
+            "args": [
+                1,
+                2
+            ],
+            "result": "\u672c\u5206\u7c7b\u6709\u4ee5\u4e0b1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u67092\u4e2a\u5b50\u5206\u7c7b\u3002",
+            "lang": "zh"
+        },
+        {
+            "name": "zh category-subcat-count 3,30",
+            "key": "zh_category-subcat-count",
+            "args": [
+                3,
+                30
+            ],
+            "result": "\u672c\u5206\u7c7b\u6709\u4ee5\u4e0b3\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670930\u4e2a\u5b50\u5206\u7c7b\u3002",
+            "lang": "zh"
+        }
+    ]
 };
index b644a3c..839c5d5 100644 (file)
@@ -4,7 +4,7 @@
        QUnit.asyncTest( 'animate', 3, function ( assert ) {
                var $canvas = $( '<div>' ).css( 'background-color', '#fff' );
 
-               $canvas.animate( { backgroundColor: '#000' }, 4 ).promise().then( function() {
+               $canvas.animate( { backgroundColor: '#000' }, 4 ).promise().then( function () {
                        var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
                        assert.strictEqual( endColors[0], 0 );
                        assert.strictEqual( endColors[1], 0 );
index bfb857d..e6a6124 100644 (file)
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
        } );
 
-       QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)' , 2, function ( assert ) {
+       QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', 2, function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' +
                                        '<div class="mw-collapsible-toggle">' +
index ca0ea67..bbea829 100644 (file)
@@ -1,8 +1,8 @@
-(function($) {
+(function ($) {
 
        QUnit.module('jquery.placeholder', QUnit.newMwEnvironment());
 
-       QUnit.test('caches results of feature tests', 2, function(assert) {
+       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');
        });
@@ -20,7 +20,7 @@
                        '<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');
                $el.placeholder(placeholder);
        };
 
-       QUnit.test('emulates placeholder for <input type=text>', 22, function(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) {
+       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) {
+       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) {
+       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) {
+       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) {
+       QUnit.test('emulates placeholder for <input type=password>', 13, function (assert) {
                $('<div>').html(html).appendTo($('#qunit-fixture'));
 
                var selector = '#input-type-password',
 
        });
 
-       QUnit.test('emulates placeholder for <textarea></textarea>', 22, function(assert) {
+       QUnit.test('emulates placeholder for <textarea></textarea>', 22, function (assert) {
                $('<div>').html(html).appendTo($('#qunit-fixture'));
                testElement($('#textarea'), assert);
        });
index 5fe2394..25d9f73 100644 (file)
                }, opt.after );
 
                QUnit.test( opt.description, function ( assert ) {
-                       /*jshint onevar: false */
-                       var tests = 1;
+                       var $textarea, start, end, options, text,
+                               tests = 1;
                        if ( opt.after.selected !== null ) {
                                tests++;
                        }
                        QUnit.expect( tests );
 
-                       var $textarea = $( '<textarea>' );
+                       $textarea = $( '<textarea>' );
 
                        $( '#qunit-fixture' ).append( $textarea );
 
-                       //$textarea.textSelection( 'setContents', opt.before.text); // this method is actually missing atm...
-                       $textarea.val( opt.before.text ); // won't work with the WikiEditor iframe?
+                       // This method is actually missing atm...
+                       //$textarea.textSelection( 'setContents', opt.before.text);
 
-                       var start = opt.before.start,
-                               end = opt.before.end;
+                       // Won't work with the WikiEditor iframe?
+                       $textarea.val( opt.before.text );
 
-                       var options = $.extend( {}, opt.replace ); // Clone opt.replace
+                       start = opt.before.start;
+                       end = opt.before.end;
+
+                       // Clone opt.replace
+                       options = $.extend( {}, opt.replace );
                        options.selectionStart = start;
                        options.selectionEnd = end;
                        $textarea.textSelection( 'encapsulateSelection', options );
 
-                       var text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, '\n' );
+                       text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, '\n' );
 
                        assert.equal( text, opt.after.text, 'Checking full text after encapsulation' );
 
                replace: h2
        } );
 
-
        encapsulateTest( {
                description: 'ownline option: turn a partial line into new h2',
                before: {
                replace: h2
        } );
 
-
        encapsulateTest( {
                description: 'splitlines option: no selection, insert new list item',
                before: {
                replace: ulist
        } );
 
-
        function caretTest( options ) {
                QUnit.test( options.description, 2, function ( assert ) {
-                       var pos, $textarea = $( '<textarea>' ).text( options.text );
+                       var pos,
+                               $textarea = $( '<textarea>' ).text( options.text );
 
                        $( '#qunit-fixture' ).append( $textarea );
 
index 2ad7622..3be3642 100644 (file)
@@ -29,7 +29,6 @@
                } );
        } );
 
-
        QUnit.test( 'API error', function ( assert ) {
                QUnit.expect( 1 );
 
index aeefd64..f49be49 100644 (file)
                        100: 'Penguins'
                },
                wgNamespaceIds: {
-                       /*jshint camelcase: false */
-                       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,
-                       /* testing custom / alias */
-                       penguins: 100,
-                       antarctic_waterfowl: 100
+                       '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
                },
                wgCaseSensitiveNamespaces: []
        },
index 24a7cc9..a2ad50d 100644 (file)
@@ -705,7 +705,6 @@ QUnit.test( 'HTML', 26, function ( assert ) {
                'Escaped attributes are parsed correctly'
        );
 
-
        mw.messages.set( 'jquerymsg-wikitext-contents-parsed', '<i>[http://example.com Example]</i>' );
        assert.htmlEqual(
                formatParse( 'jquerymsg-wikitext-contents-parsed' ),
index 594ae25..441fcbc 100644 (file)
@@ -75,7 +75,7 @@
                assert.strictEqual( conf.get( 'constructor' ), 42, 'Map.get for key "constructor"' );
 
                assert.strictEqual( conf.set( 'ImUndefined', undefined ), true, 'Map.set allows setting value to `undefined`' );
-               assert.equal( conf.get( 'ImUndefined', 'fallback' ), undefined , 'Map.get supports retreiving value of `undefined`' );
+               assert.equal( conf.get( 'ImUndefined', 'fallback' ), undefined, 'Map.get supports retreiving value of `undefined`' );
 
                assert.strictEqual( conf.set( funky, 'Funky' ), false, 'Map.set returns boolean false if key was invalid (Function)' );
                assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
                        'notExist': null
                }, 'Map.get return includes keys that were not found as null values' );
 
-
                // Interacting with globals and accessing the values object
                assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
 
                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' );
 
                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', 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-categorytree-collapse-bullet', '[<b>−</b>]' ), 'mw.messages.set: Register' );
                assert.equal( mw.message( 'mediawiki-test-categorytree-collapse-bullet' ).plain(), mw.messages.get( 'mediawiki-test-categorytree-collapse-bullet' ), 'Single square brackets unchanged in plain mode' );
 
                        'Script escaped when using parse format'
                );
 
-
        } );
 
        QUnit.test( 'mw.msg', 14, function ( assert ) {
                assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
                assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
 
-               assert.ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
+               assert.ok( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
                assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
                assert.equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
                assert.equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );