Merge "Bug 39524 - action=info uses untranslated (raw) protection permissions"
authorSiebrand <siebrand@wikimedia.org>
Wed, 22 Aug 2012 17:08:01 +0000 (17:08 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 22 Aug 2012 17:08:01 +0000 (17:08 +0000)
126 files changed:
RELEASE-NOTES-1.20
includes/DefaultSettings.php
includes/Exception.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/ImagePage.php
includes/Linker.php
includes/SkinTemplate.php
includes/api/ApiQueryDuplicateFiles.php
includes/filebackend/FSFileBackend.php
includes/filerepo/FileRepo.php
includes/filerepo/file/File.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/media/Bitmap.php
includes/media/DjVu.php
includes/media/FormatMetadata.php
includes/media/GIF.php
includes/media/ImageHandler.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/parser/StripState.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
languages/Language.php
languages/messages/MessagesAr.php
languages/messages/MessagesCs.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFr.php
languages/messages/MessagesGl.php
languages/messages/MessagesHe.php
languages/messages/MessagesHsb.php
languages/messages/MessagesIa.php
languages/messages/MessagesJa.php
languages/messages/MessagesKo.php
languages/messages/MessagesMk.php
languages/messages/MessagesNb.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSah.php
languages/messages/MessagesTl.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTru.php
languages/messages/MessagesZh_hant.php
maintenance/backupTextPass.inc
maintenance/fileOpPerfTest.php
maintenance/fuzz-tester.php
maintenance/language/messages.inc
resources/jquery.effects/jquery.effects.blind.js
resources/jquery.effects/jquery.effects.bounce.js
resources/jquery.effects/jquery.effects.clip.js
resources/jquery.effects/jquery.effects.core.js
resources/jquery.effects/jquery.effects.drop.js
resources/jquery.effects/jquery.effects.explode.js
resources/jquery.effects/jquery.effects.fade.js
resources/jquery.effects/jquery.effects.fold.js
resources/jquery.effects/jquery.effects.highlight.js
resources/jquery.effects/jquery.effects.pulsate.js
resources/jquery.effects/jquery.effects.scale.js
resources/jquery.effects/jquery.effects.shake.js
resources/jquery.effects/jquery.effects.slide.js
resources/jquery.effects/jquery.effects.transfer.js
resources/jquery.ui/jquery.ui.accordion.js
resources/jquery.ui/jquery.ui.autocomplete.js
resources/jquery.ui/jquery.ui.button.js
resources/jquery.ui/jquery.ui.core.js
resources/jquery.ui/jquery.ui.datepicker.js
resources/jquery.ui/jquery.ui.dialog.js
resources/jquery.ui/jquery.ui.draggable.js
resources/jquery.ui/jquery.ui.droppable.js
resources/jquery.ui/jquery.ui.mouse.js
resources/jquery.ui/jquery.ui.position.js
resources/jquery.ui/jquery.ui.progressbar.js
resources/jquery.ui/jquery.ui.resizable.js
resources/jquery.ui/jquery.ui.selectable.js
resources/jquery.ui/jquery.ui.slider.js
resources/jquery.ui/jquery.ui.sortable.js
resources/jquery.ui/jquery.ui.tabs.js
resources/jquery.ui/jquery.ui.widget.js
resources/jquery.ui/themes/default/jquery.ui.accordion.css
resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
resources/jquery.ui/themes/default/jquery.ui.button.css
resources/jquery.ui/themes/default/jquery.ui.core.css
resources/jquery.ui/themes/default/jquery.ui.datepicker.css
resources/jquery.ui/themes/default/jquery.ui.dialog.css
resources/jquery.ui/themes/default/jquery.ui.progressbar.css
resources/jquery.ui/themes/default/jquery.ui.resizable.css
resources/jquery.ui/themes/default/jquery.ui.selectable.css
resources/jquery.ui/themes/default/jquery.ui.slider.css
resources/jquery.ui/themes/default/jquery.ui.tabs.css
resources/jquery.ui/themes/default/jquery.ui.theme.css
resources/jquery/jquery.form.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.util.js
tests/parser/parserTests.txt
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js

index ac456bf..759e19f 100644 (file)
@@ -127,6 +127,10 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * Allow importing pages as subpage.
 * Add lang and hreflang attributes to language links on Login page.
 * (bug 22749) Create Special:MostInterwikis.
+* Show change tags when transclude Special:Recentchanges(linked) or Special:Newpages.
+* (bug 23226) Add |class= parameter to image links in order to add class(es) to HTML img tag.
+* (bug 39431) SVG animated status is now shown in long description
+* (bug 39376) jquery.form upgraded to 3.14
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -210,6 +214,9 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 36524) "Show" options on Special:RecentChanges and Special:RecentChangesLinked
   are now remembered between successive clicks.
 * (bug 26069) Page title is no longer "Error" for all error pages
+* (bug 39297) Show warning if thumbnail of animated image will not be animated.
+* (bug 38249) Parser will throw an exception instead of outputting gibberish if
+  PCRE is compiled without support for unicode properties.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
index 20c97a0..3ea35d5 100644 (file)
@@ -385,7 +385,9 @@ $wgImgAuthPublicTest = true;
  *                      some remote repos.
  *   - thumbDir         The base thumbnail directory. Defaults to "<directory>/thumb".
  *   - thumbUrl         The base thumbnail URL. Defaults to "<url>/thumb".
- *
+ *   - isPrivate        Set this if measures should always be taken to keep the files private.
+ *                      One should not trust this to assure that the files are not web readable;
+ *                      the server configuration should be done manually depending on the backend.
  *
  * These settings describe a foreign MediaWiki installation. They are optional, and will be ignored
  * for local repositories:
@@ -2323,7 +2325,7 @@ $wgVariantArticlePath = false;
 $wgLoginLanguageSelector = false;
 
 /**
- * When translating messages with wfMessage(), it is not always clear what 
+ * When translating messages with wfMessage(), it is not always clear what
  * should be considered UI messages and what should be content messages.
  *
  * For example, for the English Wikipedia, there should be only one 'mainpage',
index d5cf543..25f90e6 100644 (file)
@@ -45,7 +45,7 @@ class MWException extends Exception {
        }
 
        /**
-        * Can the extension use wfMsg() to get i18n messages?
+        * Can the extension use the Message class/wfMessage to get i18n-ed messages?
         *
         * @return bool
         */
@@ -109,7 +109,7 @@ class MWException extends Exception {
                $args = array_slice( func_get_args(), 2 );
 
                if ( $this->useMessageCache() ) {
-                       return wfMsgNoTrans( $key, $args );
+                       return wfMessage( $key, $args )->plain();
                } else {
                        return wfMsgReplaceArgs( $fallback, $args );
                }
@@ -325,7 +325,7 @@ class ErrorPageError extends MWException {
         *
         * @param $title A title
         * @param $msg String|Message . In string form, should be a message key
-        * @param $params Array Array to wfMsg()
+        * @param $params Array Array to wfMessage()
         */
        function __construct( $title, $msg, $params = null ) {
                $this->title = $title;
@@ -335,7 +335,7 @@ class ErrorPageError extends MWException {
                if( $msg instanceof Message ){
                        parent::__construct( $msg );
                } else {
-                       parent::__construct( wfMsg( $msg ) );
+                       parent::__construct( wfMessage( $msg )->text() );
                }
        }
 
@@ -359,7 +359,7 @@ class BadTitleError extends ErrorPageError {
 
        /**
         * @param $msg string A message key (default: 'badtitletext')
-        * @param $params Array parameter to wfMsg()
+        * @param $params Array parameter to wfMessage()
         */
        function __construct( $msg = 'badtitletext', $params = null ) {
                parent::__construct( 'badtitle', $msg, $params );
@@ -477,7 +477,7 @@ class UserBlockedError extends ErrorPageError {
 
                $reason = $block->mReason;
                if( $reason == '' ) {
-                       $reason = wfMsg( 'blockednoreason' );
+                       $reason = wfMessage( 'blockednoreason' )->text();
                }
 
                /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
@@ -536,7 +536,7 @@ class UserNotLoggedIn extends ErrorPageError {
         *        Optional, default: 'exception-nologin-text'
         * @param $titleMsg A message key to set the page title.
         *        Optional, default: 'exception-nologin'
-        * @param $params Parameters to wfMsg().
+        * @param $params Parameters to wfMessage().
         *        Optiona, default: null
         */
        public function __construct(
index 16eba66..11b2675 100644 (file)
@@ -129,22 +129,22 @@ class FeedUtils {
                if( $oldid ) {
                        wfProfileIn( __METHOD__."-dodiff" );
 
-                       #$diffText = $de->getDiff( wfMsg( 'revisionasof',
+                       #$diffText = $de->getDiff( wfMessage( 'revisionasof',
                        #       $wgLang->timeanddate( $timestamp ),
                        #       $wgLang->date( $timestamp ),
-                       #       $wgLang->time( $timestamp ) ),
-                       #       wfMsg( 'currentrev' ) );
+                       #       $wgLang->time( $timestamp ) )->text(),
+                       #       wfMessage( 'currentrev' )->text() );
 
                        $diffText = '';
                        // Don't bother generating the diff if we won't be able to show it
                        if ( $wgFeedDiffCutoff > 0 ) {
                                $de = new DifferenceEngine( $title, $oldid, $newid );
                                $diffText = $de->getDiff(
-                                       wfMsg( 'previousrevision' ), // hack
-                                       wfMsg( 'revisionasof',
+                                       wfMessage( 'previousrevision' )->text(), // hack
+                                       wfMessage( 'revisionasof',
                                        $wgLang->timeanddate( $timestamp ),
                                        $wgLang->date( $timestamp ),
-                                       $wgLang->time( $timestamp ) ) );
+                                       $wgLang->time( $timestamp ) )->text() );
                        }
 
                        if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) {
@@ -170,7 +170,7 @@ class FeedUtils {
                                // Omit large new page diffs, bug 29110
                                $diffText = self::getDiffLink( $title, $newid );
                        } else {
-                               $diffText = '<p><b>' . wfMsg( 'newpage' ) . '</b></p>' .
+                               $diffText = '<p><b>' . wfMessage( 'newpage' )->text() . '</b></p>' .
                                        '<div>' . nl2br( htmlspecialchars( $newtext ) ) . '</div>';
                        }
                }
@@ -196,7 +196,7 @@ class FeedUtils {
                $diffUrl = $title->getFullUrl( $queryParameters );
 
                $diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
-                       wfMsgForContent( 'showdiff' ) );
+                       wfMessage( 'showdiff' )->inContentLanguage()->text() );
 
                return $diffLink;
        }
index 1f0c195..e75ad72 100644 (file)
@@ -101,7 +101,8 @@ class FileDeleteForm {
                                $reason = $deleteReason;
                        } elseif ( $deleteReason != '' ) {
                                // Entry from drop down menu + additional comment
-                               $reason = $deleteReasonList . wfMsgForContent( 'colon-separator' ) . $deleteReason;
+                               $reason = $deleteReasonList . wfMessage( 'colon-separator' )
+                                       ->inContentLanguage()->text() . $deleteReason;
                        } else {
                                $reason = $deleteReasonList;
                        }
@@ -156,9 +157,10 @@ class FileDeleteForm {
                        $status = $file->deleteOld( $oldimage, $reason, $suppress );
                        if( $status->ok ) {
                                // Need to do a log item
-                               $logComment = wfMsgForContent( 'deletedrevision', $oldimage );
+                               $logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
                                if( trim( $reason ) != '' ) {
-                                       $logComment .= wfMsgForContent( 'colon-separator' ) . $reason;
+                                       $logComment .= wfMessage( 'colon-separator' )
+                                               ->inContentLanguage()->text() . $reason;
                                }
 
                                $logtype = $suppress ? 'suppress' : 'delete';
@@ -214,7 +216,7 @@ class FileDeleteForm {
                        $suppress = "<tr id=\"wpDeleteSuppressRow\">
                                        <td></td>
                                        <td class='mw-input'><strong>" .
-                                               Xml::checkLabel( wfMsg( 'revdelete-suppress' ),
+                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
                                                        'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '3' ) ) .
                                        "</strong></td>
                                </tr>";
@@ -226,23 +228,28 @@ class FileDeleteForm {
                $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getAction(),
                        'id' => 'mw-img-deleteconfirm' ) ) .
                        Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, wfMsg( 'filedelete-legend' ) ) .
+                       Xml::element( 'legend', null, wfMessage( 'filedelete-legend' )->text() ) .
                        Html::hidden( 'wpEditToken', $wgUser->getEditToken( $this->oldimage ) ) .
                        $this->prepareMessage( 'filedelete-intro' ) .
                        Xml::openElement( 'table', array( 'id' => 'mw-img-deleteconfirm-table' ) ) .
                        "<tr>
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'filedelete-comment' ), 'wpDeleteReasonList' ) .
+                                       Xml::label( wfMessage( 'filedelete-comment' )->text(), 'wpDeleteReasonList' ) .
                                "</td>
                                <td class='mw-input'>" .
-                                       Xml::listDropDown( 'wpDeleteReasonList',
-                                               wfMsgForContent( 'filedelete-reason-dropdown' ),
-                                               wfMsgForContent( 'filedelete-reason-otherlist' ), '', 'wpReasonDropDown', 1 ) .
+                                       Xml::listDropDown(
+                                               'wpDeleteReasonList',
+                                               wfMessage( 'filedelete-reason-dropdown' )->inContentLanguage()->text(),
+                                               wfMessage( 'filedelete-reason-otherlist' )->inContentLanguage()->text(),
+                                               '',
+                                               'wpReasonDropDown',
+                                               1
+                                       ) .
                                "</td>
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'filedelete-otherreason' ), 'wpReason' ) .
+                                       Xml::label( wfMessage( 'filedelete-otherreason' )->text(), 'wpReason' ) .
                                "</td>
                                <td class='mw-input'>" .
                                        Xml::input( 'wpReason', 60, $wgRequest->getText( 'wpReason' ),
@@ -255,7 +262,7 @@ class FileDeleteForm {
                        <tr>
                                <td></td>
                                <td class='mw-input'>" .
-                                       Xml::checkLabel( wfMsg( 'watchthis' ),
+                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
                                                'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
                                "</td>
                        </tr>";
@@ -264,7 +271,7 @@ class FileDeleteForm {
                        <tr>
                                <td></td>
                                <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMsg( 'filedelete-submit' ),
+                                       Xml::submitButton( wfMessage( 'filedelete-submit' )->text(),
                                                array( 'name' => 'mw-filedelete-submit', 'id' => 'mw-filedelete-submit', 'tabindex' => '4' ) ) .
                                "</td>
                        </tr>" .
@@ -276,7 +283,7 @@ class FileDeleteForm {
                                $title = Title::makeTitle( NS_MEDIAWIKI, 'Filedelete-reason-dropdown' );
                                $link = Linker::link(
                                        $title,
-                                       wfMsgHtml( 'filedelete-edit-reasonlist' ),
+                                       wfMessage( 'filedelete-edit-reasonlist' )->escaped(),
                                        array(),
                                        array( 'action' => 'edit' )
                                );
@@ -307,19 +314,17 @@ class FileDeleteForm {
        private function prepareMessage( $message ) {
                global $wgLang;
                if( $this->oldimage ) {
-                       return wfMsgExt(
+                       return wfMessage(
                                "{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
-                               'parse',
                                wfEscapeWikiText( $this->title->getText() ),
                                $wgLang->date( $this->getTimestamp(), true ),
                                $wgLang->time( $this->getTimestamp(), true ),
-                               wfExpandUrl( $this->file->getArchiveUrl( $this->oldimage ), PROTO_CURRENT ) );
+                               wfExpandUrl( $this->file->getArchiveUrl( $this->oldimage ), PROTO_CURRENT ) )->parseAsBlock();
                } else {
-                       return wfMsgExt(
+                       return wfMessage(
                                $message,
-                               'parse',
                                wfEscapeWikiText( $this->title->getText() )
-                       );
+                       )->parseAsBlock();
                }
        }
 
index 391d11d..4252f55 100644 (file)
@@ -1684,7 +1684,7 @@ function wfMsgExt( $key, $options ) {
  * looked up didn't exist but a XHTML string, this function checks for the
  * nonexistance of messages by checking the MessageCache::get() result directly.
  *
- * @deprecated since 1.18
+ * @deprecated since 1.18. Use Message::isDisabled().
  *
  * @param $key      String: the message key looked up
  * @return Boolean True if the message *doesn't* exist.
@@ -3590,13 +3590,20 @@ function wfQueriesMustScale() {
 /**
  * Get the path to a specified script file, respecting file
  * extensions; this is a wrapper around $wgScriptExtension etc.
+ * except for 'index' and 'load' which use $wgScript/$wgLoadScript
  *
  * @param $script String: script filename, sans extension
  * @return String
  */
 function wfScript( $script = 'index' ) {
-       global $wgScriptPath, $wgScriptExtension;
-       return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
+       global $wgScriptPath, $wgScriptExtension, $wgScript, $wgLoadScript;
+       if ( $script === 'index' ) {
+               return $wgScript;
+       } else if ( $script === 'load' ) {
+               return $wgLoadScript;
+       } else {
+               return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
+       }
 }
 
 /**
index ab12377..4fc4338 100644 (file)
@@ -424,7 +424,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Set a message to display on a validation error.
-        * @param $msg Mixed String or Array of valid inputs to wfMsgExt()
+        * @param $msg Mixed String or Array of valid inputs to wfMessage()
         *       (so each entry can be either a String or Array)
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -700,7 +700,7 @@ class HTMLForm extends ContextSource {
                                'input',
                                array(
                                        'type' => 'reset',
-                                       'value' => wfMsg( 'htmlform-reset' )
+                                       'value' => $this->msg( 'htmlform-reset' )->text()
                                )
                        ) . "\n";
                }
@@ -776,7 +776,7 @@ class HTMLForm extends ContextSource {
                        $errorstr .= Html::rawElement(
                                'li',
                                array(),
-                               wfMsgExt( $msg, array( 'parseinline' ), $error )
+                               wfMessage( $msg, $error )->parse()
                        );
                }
 
@@ -813,7 +813,7 @@ class HTMLForm extends ContextSource {
        function getSubmitText() {
                return $this->mSubmitText
                        ? $this->mSubmitText
-                       : wfMsg( 'htmlform-submit' );
+                       : $this->msg( 'htmlform-submit' )->text();
        }
 
        /**
@@ -1051,7 +1051,7 @@ class HTMLForm extends ContextSource {
         * @return String
         */
        public function getLegend( $key ) {
-               return wfMsg( "{$this->mMessagePrefix}-$key" );
+               return $this->msg( "{$this->mMessagePrefix}-$key" )->text();
        }
 
        /**
@@ -1110,7 +1110,7 @@ abstract class HTMLFormField {
         */
        function validate( $value, $alldata ) {
                if ( isset( $this->mParams['required'] ) && $this->mParams['required'] !== false && $value === '' ) {
-                       return wfMsgExt( 'htmlform-required', 'parseinline' );
+                       return $this->mParent->msg( 'htmlform-required' )->parse();
                }
 
                if ( isset( $this->mValidationCallback ) ) {
@@ -1170,7 +1170,7 @@ abstract class HTMLFormField {
                                $msgInfo = array();
                        }
 
-                       $this->mLabel = wfMsgExt( $msg, 'parseinline', $msgInfo );
+                       $this->mLabel = wfMessage( $msg, $msgInfo )->parse();
                } elseif ( isset( $params['label'] ) ) {
                        $this->mLabel = $params['label'];
                }
@@ -1371,13 +1371,13 @@ abstract class HTMLFormField {
                if ( isset( $this->mParams['help-messages'] ) ) {
                        foreach ( $this->mParams['help-messages'] as $name ) {
                                $helpMessage = (array)$name;
-                               $msg = wfMessage( array_shift( $helpMessage ), $helpMessage );
+                               $msg = $this->mParent->msg( array_shift( $helpMessage ), $helpMessage );
 
                                if ( $msg->exists() ) {
                                        if ( is_null( $helptext ) ) {
                                                $helptext = '';
                                        } else {
-                                               $helptext .= wfMessage( 'word-separator' )->escaped(); // some space
+                                               $helptext .= $this->mParent->msg( 'word-separator' )->escaped(); // some space
                                        }
                                        $helptext .= $msg->parse(); // Append message
                                }
@@ -1642,7 +1642,7 @@ class HTMLFloatField extends HTMLTextField {
                # http://dev.w3.org/html5/spec/common-microsyntaxes.html#real-numbers
                # with the addition that a leading '+' sign is ok.
                if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
-                       return wfMsgExt( 'htmlform-float-invalid', 'parse' );
+                       return $this->mParent->msg( 'htmlform-float-invalid' )->parseAsBlock();
                }
 
                # The "int" part of these message names is rather confusing.
@@ -1651,7 +1651,7 @@ class HTMLFloatField extends HTMLTextField {
                        $min = $this->mParams['min'];
 
                        if ( $min > $value ) {
-                               return wfMsgExt( 'htmlform-int-toolow', 'parse', array( $min ) );
+                               return $this->mParent->msg( 'htmlform-int-toolow', $min )->parseAsBlock();
                        }
                }
 
@@ -1659,7 +1659,7 @@ class HTMLFloatField extends HTMLTextField {
                        $max = $this->mParams['max'];
 
                        if ( $max < $value ) {
-                               return wfMsgExt( 'htmlform-int-toohigh', 'parse', array( $max ) );
+                               return $this->mParent->msg( 'htmlform-int-toohigh', $max )->parseAsBlock();
                        }
                }
 
@@ -1686,7 +1686,7 @@ class HTMLIntField extends HTMLFloatField {
                # value to, eg, save in the DB, clean it up with intval().
                if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) )
                ) {
-                       return wfMsgExt( 'htmlform-int-invalid', 'parse' );
+                       return $this->mParent->msg( 'htmlform-int-invalid' )->parseAsBlock();
                }
 
                return true;
@@ -1770,7 +1770,7 @@ class HTMLSelectField extends HTMLFormField {
                if ( in_array( $value, $validOptions ) )
                        return true;
                else
-                       return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+                       return $this->mParent->msg( 'htmlform-select-badoption' )->parse();
        }
 
        function getInputHTML( $value ) {
@@ -1808,7 +1808,9 @@ class HTMLSelectOrOtherField extends HTMLTextField {
 
        function __construct( $params ) {
                if ( !in_array( 'other', $params['options'], true ) ) {
-                       $msg = isset( $params['other'] ) ? $params['other'] : wfMsg( 'htmlform-selectorother-other' );
+                       $msg = isset( $params['other'] ) ?
+                               $params['other'] :
+                               wfMessage( 'htmlform-selectorother-other' )->text();
                        $params['options'][$msg] = 'other';
                }
 
@@ -1912,7 +1914,7 @@ class HTMLMultiSelectField extends HTMLFormField {
                if ( count( $validValues ) == count( $value ) ) {
                        return true;
                } else {
-                       return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+                       return $this->mParent->msg( 'htmlform-select-badoption' )->parse();
                }
        }
 
@@ -2114,7 +2116,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        } elseif ( $text == '' ) {
                                $final = $list;
                        } else {
-                               $final = $list . wfMsgForContent( 'colon-separator' ) . $text;
+                               $final = $list . $this->mParent->msg( 'colon-separator' )->inContentLanguage()->text() . $text;
                        }
 
                } else {
@@ -2123,7 +2125,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $list = 'other';
                        $text = $final;
                        foreach ( $this->mFlatOptions as $option ) {
-                               $match = $option . wfMsgForContent( 'colon-separator' );
+                               $match = $option . $this->mParent->msg( 'colon-separator' )->inContentLanguage()->text();
                                if ( strpos( $text, $match ) === 0 ) {
                                        $list = $option;
                                        $text = substr( $text, strlen( $match ) );
@@ -2151,7 +2153,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                }
 
                if ( isset( $this->mParams['required'] ) && $this->mParams['required'] !== false && $value[1] === '' ) {
-                       return wfMsgExt( 'htmlform-required', 'parseinline' );
+                       return $this->mParent->msg( 'htmlform-required' )->parse();
                }
 
                return true;
@@ -2180,7 +2182,7 @@ class HTMLRadioField extends HTMLFormField {
                if ( in_array( $value, $validOptions ) ) {
                        return true;
                } else {
-                       return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+                       return $this->mParent->msg( 'htmlform-select-badoption' )->parse();
                }
        }
 
@@ -2390,11 +2392,11 @@ class HTMLEditTools extends HTMLFormField {
 
        protected function formatMsg() {
                if ( empty( $this->mParams['message'] ) ) {
-                       $msg = wfMessage( 'edittools' );
+                       $msg = $this->mParent->msg( 'edittools' );
                } else {
-                       $msg = wfMessage( $this->mParams['message'] );
+                       $msg = $this->mParent->msg( $this->mParams['message'] );
                        if ( $msg->isDisabled() ) {
-                               $msg = wfMessage( 'edittools' );
+                               $msg = $this->mParent->msg( 'edittools' );
                        }
                }
                $msg->inContentLanguage();
index ab3e2e3..7aed392 100644 (file)
@@ -181,7 +181,7 @@ class ImagePage extends Article {
 
                $out->addHTML( Xml::element( 'h2',
                        array( 'id' => 'filelinks' ),
-                       wfMsg( 'imagelinks' ) ) . "\n" );
+                       wfMessage( 'imagelinks' )->text() ) . "\n" );
                $this->imageDupes();
                # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
                # Yet we return metadata about the target. Definitely an issue in the FileRepo
@@ -195,7 +195,10 @@ class ImagePage extends Article {
                }
 
                if ( $showmeta ) {
-                       $out->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
+                       $out->addHTML( Xml::element(
+                               'h2',
+                               array( 'id' => 'metadata' ),
+                               wfMessage( 'metadata' )->text() ) . "\n" );
                        $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
                        $out->addModules( array( 'mediawiki.action.view.metadata' ) );
                }
@@ -227,12 +230,12 @@ class ImagePage extends Article {
         */
        protected function showTOC( $metadata ) {
                $r = array(
-                       '<li><a href="#file">' . wfMsgHtml( 'file-anchor-link' ) . '</a></li>',
-                       '<li><a href="#filehistory">' . wfMsgHtml( 'filehist' ) . '</a></li>',
-                       '<li><a href="#filelinks">' . wfMsgHtml( 'imagelinks' ) . '</a></li>',
+                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
+                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
+                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
                );
                if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . wfMsgHtml( 'metadata' ) . '</a></li>';
+                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
                }
 
                wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
@@ -250,7 +253,7 @@ class ImagePage extends Article {
         */
        protected function makeMetadataTable( $metadata ) {
                $r = "<div class=\"mw-imagepage-section-metadata\">";
-               $r .= wfMsgNoTrans( 'metadata-help' );
+               $r .= wfMessage( 'metadata-help' )->plain();
                $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
                foreach ( $metadata as $type => $stuff ) {
                        foreach ( $stuff as $v ) {
@@ -322,7 +325,7 @@ class ImagePage extends Article {
                        $height_orig = $this->displayImg->getHeight( $page );
                        $height = $height_orig;
 
-                       $longDesc = wfMsg( 'parentheses', $this->displayImg->getLongDesc() );
+                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
 
                        wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
 
@@ -330,7 +333,7 @@ class ImagePage extends Article {
                                # image
 
                                # "Download high res version" link below the image
-                               # $msgsize = wfMsgHtml( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime );
+                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
                                # We'll show a thumbnail of this image
                                if ( $width > $maxWidth || $height > $maxHeight ) {
                                        # Calculate the thumbnail size.
@@ -346,7 +349,7 @@ class ImagePage extends Article {
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
                                        }
-                                       $msgbig = wfMsgHtml( 'show-big-image' );
+                                       $msgbig = wfMessage( 'show-big-image' )->escaped();
                                        if ( $this->displayImg->getRepo()->canTransformVia404() ) {
                                                $thumbSizes = $wgImageLimits;
                                        } else {
@@ -411,7 +414,7 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $out->parse( wfMsg( 'imgmultipageprev' ), false );
+                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
                                                $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
@@ -425,7 +428,7 @@ class ImagePage extends Article {
                                        }
 
                                        if ( $page < $count ) {
-                                               $label = wfMsg( 'imgmultipagenext' );
+                                               $label = wfMessage( 'imgmultipagenext' )->text();
                                                $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
@@ -457,8 +460,8 @@ class ImagePage extends Article {
                                                '</td><td><div class="multipageimagenavbox">' .
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                                               wfMsgExt( 'imgmultigoto', array( 'parseinline', 'replaceafter' ), $select ) .
-                                               Xml::submitButton( wfMsg( 'imgmultigo' ) ) .
+                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
                                                Xml::closeElement( 'form' ) .
                                                "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
                                        );
@@ -485,7 +488,7 @@ class ImagePage extends Article {
                                $medialink = "[[Media:$filename|$linktext]]";
 
                                if ( !$this->displayImg->isSafeFile() ) {
-                                       $warning = wfMsgNoTrans( 'mediawarning' );
+                                       $warning = wfMessage( 'mediawarning' )->plain();
                                        // dirmark is needed here to separate the file name, which
                                        // most likely ends in Latin characters, from the description,
                                        // which may begin with the file type. In RTL environment
@@ -507,6 +510,25 @@ EOT
                                }
                        }
 
+                       // Add cannot animate thumbnail warning
+                       if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
+                               // Include the extension so wiki admins can
+                               // customize it on a per file-type basis
+                               // (aka say things like use format X instead).
+                               // additionally have a specific message for
+                               // file-no-thumb-animation-gif
+                               $ext = $this->displayImg->getExtension();
+                               $noAnimMesg = wfMessageFallback(
+                                       'file-no-thumb-animation-' . $ext,
+                                       'file-no-thumb-animation'
+                               )->plain();
+
+                               $out->addWikiText( <<<EOT
+<div class="mw-noanimatethumb">{$noAnimMesg}</div>
+EOT
+                               );
+                       }
+
                        if ( !$this->displayImg->isLocal() ) {
                                $this->printSharedImageText();
                        }
@@ -593,9 +615,9 @@ EOT
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
-               if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-'  ) {
+               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-'  ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
+               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
@@ -632,19 +654,22 @@ EOT
                }
 
                $out = $this->getContext()->getOutput();
-               $out->addHTML( "<br /><ul>\n" );
+               $out->addHTML( "<ul>\n" );
 
                # "Upload a new version of this file" link
-               if ( UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
-                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
+               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
+               if ( $canUpload && UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
+                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMessage( 'uploadnewversion-linktext' )->text() );
                        $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+               } else {
+                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
                }
 
                # External editing link
                if ( $wgUseExternalEditor ) {
                        $elink = Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'edit-externally' ),
+                               wfMessage( 'edit-externally' )->escaped(),
                                array(),
                                array(
                                        'action' => 'edit',
@@ -654,8 +679,8 @@ EOT
                        );
                        $out->addHTML(
                                '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
-                               wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) .
-                               "</small></li>\n"
+                                       wfMessage( 'edit-externally-help' )->parse() .
+                                       "</small></li>\n"
                        );
                }
 
@@ -829,7 +854,7 @@ EOT
                        } else {
                                $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
                                        $file->getTitle()->getPrefixedText() );
-                               $fromSrc = wfMsg( 'shared-repo-from', $file->getRepo()->getDisplayName() );
+                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
                        }
                        $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
index 3a4f7c3..632cf43 100644 (file)
@@ -345,7 +345,7 @@ class Linker {
                } elseif ( in_array( 'known', $options ) ) {
                        $defaults['title'] = $target->getPrefixedText();
                } else {
-                       $defaults['title'] = wfMsg( 'red-link-title', $target->getPrefixedText() );
+                       $defaults['title'] = wfMessage( 'red-link-title', $target->getPrefixedText() )->text();
                }
 
                # Finally, merge the custom attribs with the default ones, and iterate
@@ -536,6 +536,7 @@ class Linker {
         *          valign          Vertical alignment (baseline, sub, super, top, text-top, middle,
         *                          bottom, text-bottom)
         *          alt             Alternate text for image (i.e. alt attribute). Plain text.
+        *          class           HTML for image classes. Plain text.
         *          caption         HTML for image caption.
         *          link-url        URL to link to
         *          link-title      Title object to link to
@@ -580,6 +581,9 @@ class Linker {
                if ( !isset( $fp['title'] ) ) {
                        $fp['title'] = '';
                }
+               if ( !isset( $fp['class'] ) ) {
+                       $fp['class'] = '';
+               }
 
                $prefix = $postfix = '';
 
@@ -663,8 +667,11 @@ class Linker {
                        $params = array(
                                'alt' => $fp['alt'],
                                'title' => $fp['title'],
-                               'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false ,
-                               'img-class' => isset( $fp['border'] ) ? 'thumbborder' : false );
+                               'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false,
+                               'img-class' => $fp['class'] );
+                       if ( isset( $fp['border'] ) ) {
+                               $params['img-class'] .= ( $params['img-class'] !== '' ) ? ' thumbborder' : 'thumbborder';
+                       }
                        $params = self::getImageLinkMTOParams( $fp, $query, $parser ) + $params;
 
                        $s = $thumb->toHtml( $params );
@@ -825,13 +832,14 @@ class Linker {
                        $s .= self::makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
                        $zoomIcon = '';
                } elseif ( !$thumb ) {
-                       $s .= htmlspecialchars( wfMsg( 'thumbnail_error', '' ) );
+                       $s .= wfMessage( 'thumbnail_error', '' )->escaped();
                        $zoomIcon = '';
                } else {
                        $params = array(
                                'alt' => $fp['alt'],
                                'title' => $fp['title'],
-                               'img-class' => 'thumbimage' );
+                               'img-class' => ( isset( $fp['class'] ) && $fp['class'] !== '' ) ? $fp['class'] . ' thumbimage' : 'thumbimage'
+                       );
                        $params = self::getImageLinkMTOParams( $fp, $query ) + $params;
                        $s .= $thumb->toHtml( $params );
                        if ( isset( $fp['framed'] ) ) {
@@ -841,7 +849,7 @@ class Linker {
                                        Html::rawElement( 'a', array(
                                                'href' => $url,
                                                'class' => 'internal',
-                                               'title' => wfMsg( 'thumbnail-more' ) ),
+                                               'title' => wfMessage( 'thumbnail-more' )->text() ),
                                                Html::element( 'img', array(
                                                        'src' => $wgStylePath . '/common/images/magnify-clip' . ( $wgContLang->isRTL() ? '-rtl' : '' ) . '.png',
                                                        'width' => 15,
@@ -971,7 +979,7 @@ class Linker {
                        $key = strtolower( $name );
                }
 
-               return self::linkKnown( SpecialPage::getTitleFor( $name ) , wfMsg( $key ) );
+               return self::linkKnown( SpecialPage::getTitleFor( $name ) , wfMessage( $key )->text() );
        }
 
        /**
@@ -1063,7 +1071,7 @@ class Linker {
                        }
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $userText );
 
-                       $items[] = self::link( $contribsPage, wfMsgHtml( 'contribslink' ), $attribs );
+                       $items[] = self::link( $contribsPage, wfMessage( 'contribslink' )->escaped(), $attribs );
                }
                if ( $blockable && $wgUser->isAllowed( 'block' ) ) {
                        $items[] = self::blockLink( $userId, $userText );
@@ -1104,7 +1112,7 @@ class Linker {
         */
        public static function userTalkLink( $userId, $userText ) {
                $userTalkPage = Title::makeTitle( NS_USER_TALK, $userText );
-               $userTalkLink = self::link( $userTalkPage, wfMsgHtml( 'talkpagelinktext' ) );
+               $userTalkLink = self::link( $userTalkPage, wfMessage( 'talkpagelinktext' )->escaped() );
                return $userTalkLink;
        }
 
@@ -1115,7 +1123,7 @@ class Linker {
         */
        public static function blockLink( $userId, $userText ) {
                $blockPage = SpecialPage::getTitleFor( 'Block', $userText );
-               $blockLink = self::link( $blockPage, wfMsgHtml( 'blocklink' ) );
+               $blockLink = self::link( $blockPage, wfMessage( 'blocklink' )->escaped() );
                return $blockLink;
        }
 
@@ -1126,7 +1134,7 @@ class Linker {
         */
        public static function emailLink( $userId, $userText ) {
                $emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
-               $emailLink = self::link( $emailPage, wfMsgHtml( 'emaillink' ) );
+               $emailLink = self::link( $emailPage, wfMessage( 'emaillink' )->escaped() );
                return $emailLink;
        }
 
@@ -1138,12 +1146,12 @@ class Linker {
         */
        public static function revUserLink( $rev, $isPublic = false ) {
                if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                } elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
                        $link = self::userLink( $rev->getUser( Revision::FOR_THIS_USER ),
                                $rev->getUserText( Revision::FOR_THIS_USER ) );
                } else {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                }
                if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
                        return '<span class="history-deleted">' . $link . '</span>';
@@ -1159,7 +1167,7 @@ class Linker {
         */
        public static function revUserTools( $rev, $isPublic = false ) {
                if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                } elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
                        $userId = $rev->getUser( Revision::FOR_THIS_USER );
                        $userText = $rev->getUserText( Revision::FOR_THIS_USER );
@@ -1167,7 +1175,7 @@ class Linker {
                                . wfMessage( 'word-separator' )->plain()
                                . self::userToolLinks( $userId, $userText );
                } else {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                }
                if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
                        return ' <span class="history-deleted">' . $link . '</span>';
@@ -1281,11 +1289,11 @@ class Linker {
                        }
                        if ( $pre ) {
                                # written summary $presep autocomment (summary /* section */)
-                               $pre .= wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) );
+                               $pre .= wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
                        }
                        if ( $post ) {
                                # autocomment $postsep written summary (/* section */ summary)
-                               $auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
+                               $auto .= wfMessage( 'colon-separator' )->inContentLanguage()->escaped();
                        }
                        $auto = '<span class="autocomment">' . $auto . '</span>';
                        $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
@@ -1507,12 +1515,12 @@ class Linker {
                        return "";
                }
                if ( $rev->isDeleted( Revision::DELETED_COMMENT ) && $isPublic ) {
-                       $block = " <span class=\"comment\">" . wfMsgHtml( 'rev-deleted-comment' ) . "</span>";
+                       $block = " <span class=\"comment\">" . wfMessage( 'rev-deleted-comment' )->escaped() . "</span>";
                } elseif ( $rev->userCan( Revision::DELETED_COMMENT ) ) {
                        $block = self::commentBlock( $rev->getComment( Revision::FOR_THIS_USER ),
                                $rev->getTitle(), $local );
                } else {
-                       $block = " <span class=\"comment\">" . wfMsgHtml( 'rev-deleted-comment' ) . "</span>";
+                       $block = " <span class=\"comment\">" . wfMessage( 'rev-deleted-comment' )->escaped() . "</span>";
                }
                if ( $rev->isDeleted( Revision::DELETED_COMMENT ) ) {
                        return " <span class=\"history-deleted\">$block</span>";
@@ -1526,13 +1534,11 @@ class Linker {
         */
        public static function formatRevisionSize( $size ) {
                if ( $size == 0 ) {
-                       $stxt = wfMsgExt( 'historyempty', 'parsemag' );
+                       $stxt = wfMessage( 'historyempty' )->escaped();
                } else {
-                       global $wgLang;
-                       $stxt = wfMsgExt( 'nbytes', 'parsemag', $wgLang->formatNum( $size ) );
+                       $stxt = wfMessage( 'nbytes' )->numParams( $size )->escaped();
                        $stxt = wfMessage( 'parentheses' )->rawParams( $stxt )->escaped();
                }
-               $stxt = htmlspecialchars( $stxt );
                return "<span class=\"history-size\">$stxt</span>";
        }
 
@@ -1588,7 +1594,7 @@ class Linker {
         * @return String: full html of the TOC
         */
        public static function tocList( $toc, $lang = false ) {
-               $title = wfMsgExt( 'toc', array( 'language' => $lang, 'escape' ) );
+               $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
                return
                   '<table id="toc" class="toc"><tr><td>'
                 . '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
@@ -1803,11 +1809,14 @@ class Linker {
                        # Construct the HTML
                        $outText = '<div class="mw-templatesUsedExplanation">';
                        if ( $preview ) {
-                               $outText .= wfMsgExt( 'templatesusedpreview', array( 'parse' ), count( $templates ) );
+                               $outText .= wfMessage( 'templatesusedpreview' )->numParams( count( $templates ) )
+                                       ->parseAsBlock();
                        } elseif ( $section ) {
-                               $outText .= wfMsgExt( 'templatesusedsection', array( 'parse' ), count( $templates ) );
+                               $outText .= wfMessage( 'templatesusedsection' )->numParams( count( $templates ) )
+                                       ->parseAsBlock();
                        } else {
-                               $outText .= wfMsgExt( 'templatesused', array( 'parse' ), count( $templates ) );
+                               $outText .= wfMessage( 'templatesused' )->numParams( count( $templates ) )
+                                       ->parseAsBlock();
                        }
                        $outText .= "</div><ul>\n";
 
@@ -1815,23 +1824,23 @@ class Linker {
                        foreach ( $templates as $titleObj ) {
                                $r = $titleObj->getRestrictions( 'edit' );
                                if ( in_array( 'sysop', $r ) ) {
-                                       $protected = wfMsgExt( 'template-protected', array( 'parseinline' ) );
+                                       $protected = wfMessage( 'template-protected' )->parse();
                                } elseif ( in_array( 'autoconfirmed', $r ) ) {
-                                       $protected = wfMsgExt( 'template-semiprotected', array( 'parseinline' ) );
+                                       $protected = wfMessage( 'template-semiprotected' )->parse();
                                } else {
                                        $protected = '';
                                }
                                if ( $titleObj->quickUserCan( 'edit' ) ) {
                                        $editLink = self::link(
                                                $titleObj,
-                                               wfMsg( 'editlink' ),
+                                               wfMessage( 'editlink' )->text(),
                                                array(),
                                                array( 'action' => 'edit' )
                                        );
                                } else {
                                        $editLink = self::link(
                                                $titleObj,
-                                               wfMsg( 'viewsourcelink' ),
+                                               wfMessage( 'viewsourcelink' )->text(),
                                                array(),
                                                array( 'action' => 'edit' )
                                        );
@@ -1859,7 +1868,7 @@ class Linker {
                if ( count( $hiddencats ) > 0 ) {
                        # Construct the HTML
                        $outText = '<div class="mw-hiddenCategoriesExplanation">';
-                       $outText .= wfMsgExt( 'hiddencategories', array( 'parse' ), $wgLang->formatnum( count( $hiddencats ) ) );
+                       $outText .= wfMessage( 'hiddencategories' )->numParams( count( $hiddencats ) )->parseAsBlock();
                        $outText .= "</div><ul>\n";
 
                        foreach ( $hiddencats as $titleObj ) {
@@ -2019,7 +2028,8 @@ class Linker {
         */
        public static function revDeleteLink( $query = array(), $restricted = false, $delete = true ) {
                $sp = SpecialPage::getTitleFor( 'Revisiondelete' );
-               $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
+               $msgKey = $delete ? 'rev-delundel' : 'rev-showdeleted';
+               $html = wfMessage( $msgKey )->escaped();
                $tag = $restricted ? 'strong' : 'span';
                $link = self::link( $sp, $html, array(), $query, array( 'known', 'noclasses' ) );
                return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $link )->escaped() );
@@ -2034,8 +2044,10 @@ class Linker {
         * of appearance with CSS
         */
        public static function revDeleteLinkDisabled( $delete = true ) {
-               $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
-               return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $html )->escaped() );
+               $msgKey = $delete ? 'rev-delundel' : 'rev-showdeleted';
+               $html = wfMessage( $msgKey )->escaped();
+               $htmlParentheses = wfMessage( 'parentheses' )->rawParams( $html )->escaped();
+               return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), $htmlParentheses );
        }
 
        /* Deprecated methods */
index 92df4a3..3c5a263 100644 (file)
@@ -563,7 +563,8 @@ class SkinTemplate extends Skin {
                                'text' => $this->username,
                                'href' => &$this->userpageUrlDetails['href'],
                                'class' => $this->userpageUrlDetails['exists'] ? false : 'new',
-                               'active' => ( $this->userpageUrlDetails['href'] == $pageurl )
+                               'active' => ( $this->userpageUrlDetails['href'] == $pageurl ),
+                               'dir' => 'auto'
                        );
                        $usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage );
                        $personal_urls['mytalk'] = array(
index a4efc4c..8f0fd3b 100644 (file)
@@ -118,8 +118,8 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        }
                        foreach ( $dupFiles as $dupFile ) {
                                $dupName = $dupFile->getName();
-                               if( $image == $dupName ) {
-                                       continue; //ignore the file itself
+                               if( $image == $dupName && $dupFile->isLocal() ) {
+                                       continue; //ignore the local file itself
                                }
                                if( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
                                        continue; //skip to pos after the image from continue param
@@ -140,6 +140,9 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                                'user' => $dupFile->getUser( 'text' ),
                                                'timestamp' => wfTimestamp( TS_ISO_8601, $dupFile->getTimestamp() )
                                        );
+                                       if( !$dupFile->isLocal() ) {
+                                               $r['shared'] = '';
+                                       }
                                        $fit = $this->addPageSubItem( $pageId, $r );
                                        if ( !$fit ) {
                                                $this->setContinueEnumParameter( 'continue', $image . '|' . $dupName );
@@ -191,7 +194,8 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        '' => array(
                                'name' => 'string',
                                'user' => 'string',
-                               'timestamp' => 'timestamp'
+                               'timestamp' => 'timestamp',
+                               'shared' => 'boolean',
                        )
                );
        }
index c953d77..a0befd6 100644 (file)
@@ -43,6 +43,8 @@ class FSFileBackend extends FileBackendStore {
        /** @var Array Map of container names to root paths */
        protected $containerPaths = array(); // for custom container paths
        protected $fileMode; // integer; file permission mode
+       protected $fileOwner; // string; required OS username to own files
+       protected $currentUser; // string; OS username running this script
 
        protected $hadWarningErrors = array();
 
@@ -71,9 +73,12 @@ class FSFileBackend extends FileBackendStore {
                        }
                }
 
-               $this->fileMode = isset( $config['fileMode'] )
-                       ? $config['fileMode']
-                       : 0644;
+               $this->fileMode = isset( $config['fileMode'] ) ? $config['fileMode'] : 0644;
+               if ( isset( $config['fileOwner'] ) && function_exists( 'posix_getuid' ) ) {
+                       $this->fileOwner = $config['fileOwner'];
+                       $info = posix_getpwuid( posix_getuid() );
+                       $this->currentUser = $info['name']; // cache this, assuming it doesn't change
+               }
        }
 
        /**
@@ -164,6 +169,11 @@ class FSFileBackend extends FileBackendStore {
                        $ok = is_dir( $parentDir ) && is_writable( $parentDir );
                }
 
+               if ( $this->fileOwner !== null && $this->currentUser !== $this->fileOwner ) {
+                       $ok = false;
+                       trigger_error( __METHOD__ . ": PHP process owner is not '{$this->fileOwner}'." );
+               }
+
                return $ok;
        }
 
index 1563a58..3159077 100644 (file)
@@ -113,10 +113,9 @@ class FileRepo {
                        ? $info['deletedHashLevels']
                        : $this->hashLevels;
                $this->transformVia404 = !empty( $info['transformVia404'] );
-               $this->zones = isset( $info['zones'] )
-                       ? $info['zones']
-                       : array();
+               $this->isPrivate = !empty( $info['isPrivate'] );
                // Give defaults for the basic zones...
+               $this->zones = isset( $info['zones'] ) ? $info['zones'] : array();
                foreach ( array( 'public', 'thumb', 'temp', 'deleted' ) as $zone ) {
                        if ( !isset( $this->zones[$zone]['container'] ) ) {
                                $this->zones[$zone]['container'] = "{$this->name}-{$zone}";
@@ -1163,7 +1162,7 @@ class FileRepo {
                list( $b, $container, $r ) = FileBackend::splitStoragePath( $path );
 
                $params = array( 'dir' => $path );
-               if ( $container === $this->zones['deleted']['container'] ) {
+               if ( $this->isPrivate || $container === $this->zones['deleted']['container'] ) {
                        # Take all available measures to prevent web accessibility of new deleted
                        # directories, in case the user has not configured offline storage
                        $params = array( 'noAccess' => true, 'noListing' => true ) + $params;
index 133a956..dd54455 100644 (file)
@@ -464,6 +464,39 @@ abstract class File {
                }
        }
 
+       /**
+        * Will the thumbnail be animated if one would expect it to be.
+        *
+        * Currently used to add a warning to the image description page
+        *
+        * @return bool false if the main image is both animated
+        *   and the thumbnail is not. In all other cases must return
+        *   true. If image is not renderable whatsoever, should
+        *   return true.
+        */
+       public function canAnimateThumbIfAppropriate() {
+               $handler = $this->getHandler();
+               if ( !$handler ) {
+                       // We cannot handle image whatsoever, thus
+                       // one would not expect it to be animated
+                       // so true.
+                       return true;
+               } else {
+                       if ( $this->allowInlineDisplay()
+                               && $handler->isAnimatedImage( $this )
+                               && !$handler->canAnimateThumbnail( $this )
+                       ) {
+                               // Image is animated, but thumbnail isn't.
+                               // This is unexpected to the user.
+                               return false;
+                       } else {
+                               // Image is not animated, so one would
+                               // not expect thumb to be
+                               return true;
+                       }
+               }
+       }
+
        /**
         * Get handler-specific metadata
         * Overridden by LocalFile, UnregisteredLocalFile
index 6483c4e..d411a27 100644 (file)
@@ -253,9 +253,9 @@ abstract class DatabaseUpdater {
 
        /**
         * Add a maintenance script to be run after the database updates are complete.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param $class string Name of a Maintenance subclass
         */
        public function addPostDatabaseUpdateMaintenance( $class ) {
@@ -273,7 +273,7 @@ abstract class DatabaseUpdater {
 
        /**
         * @since 1.17
-        * 
+        *
         * @return array
         */
        public function getPostDatabaseUpdateMaintenance() {
@@ -463,13 +463,20 @@ abstract class DatabaseUpdater {
         * Applies a SQL patch
         * @param $path String Path to the patch file
         * @param $isFullPath Boolean Whether to treat $path as a relative or not
+        * @param $msg String Description of the patch
         */
-       protected function applyPatch( $path, $isFullPath = false ) {
-               if ( $isFullPath ) {
-                       $this->db->sourceFile( $path );
-               } else {
-                       $this->db->sourceFile( $this->db->patchPath( $path ) );
+       protected function applyPatch( $path, $isFullPath = false, $msg = null ) {
+               if ( $msg === null ) {
+                       $msg = "Applying $path patch";
                }
+
+               if ( !$isFullPath ) {
+                       $path = $this->db->patchPath( $path );
+               }
+
+               $this->output( "$msg ..." );
+               $this->db->sourceFile( $path );
+               $this->output( "done.\n" );
        }
 
        /**
@@ -482,9 +489,7 @@ abstract class DatabaseUpdater {
                if ( $this->db->tableExists( $name, __METHOD__ ) ) {
                        $this->output( "...$name table already exists.\n" );
                } else {
-                       $this->output( "Creating $name table..." );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Creating $name table" );
                }
        }
 
@@ -501,9 +506,7 @@ abstract class DatabaseUpdater {
                } elseif ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
                        $this->output( "...have $field field in $table table.\n" );
                } else {
-                       $this->output( "Adding $field field to table $table..." );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
                }
        }
 
@@ -518,9 +521,7 @@ abstract class DatabaseUpdater {
                if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
                        $this->output( "...index $index already set on $table table.\n" );
                } else {
-                       $this->output( "Adding index $index to table $table... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
                }
        }
 
@@ -534,9 +535,7 @@ abstract class DatabaseUpdater {
         */
        protected function dropField( $table, $field, $patch, $fullpath = false ) {
                if ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
-                       $this->output( "Table $table contains $field field. Dropping... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Table $table contains $field field. Dropping" );
                } else {
                        $this->output( "...$table table does not contain $field field.\n" );
                }
@@ -552,9 +551,7 @@ abstract class DatabaseUpdater {
         */
        protected function dropIndex( $table, $index, $patch, $fullpath = false ) {
                if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
-                       $this->output( "Dropping $index index from table $table... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Dropping $index index from table $table" );
                } else {
                        $this->output( "...$index key doesn't exist.\n" );
                }
@@ -567,9 +564,7 @@ abstract class DatabaseUpdater {
         */
        protected function dropTable( $table, $patch, $fullpath = false ) {
                if ( $this->db->tableExists( $table, __METHOD__ ) ) {
-                       $this->output( "Dropping table $table... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Dropping table $table" );
                } else {
                        $this->output( "...$table doesn't exist.\n" );
                }
@@ -592,10 +587,8 @@ abstract class DatabaseUpdater {
                } elseif( $this->updateRowExists( $updateKey ) ) {
                        $this->output( "...$field in table $table already modified by patch $patch.\n" );
                } else {
-                       $this->output( "Modifying $field field of table $table..." );
-                       $this->applyPatch( $patch, $fullpath );
+                       $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
                        $this->insertUpdateRow( $updateKey );
-                       $this->output( "done.\n" );
                }
        }
 
@@ -688,9 +681,7 @@ abstract class DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Converting tc_time from UNIX epoch to MediaWiki timestamp... " );
-               $this->applyPatch( 'patch-tc-timestamp.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-tc-timestamp.sql', false, "Converting tc_time from UNIX epoch to MediaWiki timestamp" );
        }
 
        /**
index d87f294..2cad7d1 100644 (file)
@@ -788,6 +788,10 @@ abstract class Installer {
 
        /**
         * Environment check for the PCRE module.
+        *
+        * @note If this check were to fail, the parser would
+        *   probably throw an exception before the result
+        *   of this check is shown to the user.
         * @return bool
         */
        protected function envCheckPCRE() {
@@ -797,8 +801,13 @@ abstract class Installer {
                }
                wfSuppressWarnings();
                $regexd = preg_replace( '/[\x{0430}-\x{04FF}]/iu', '', '-АБВГД-' );
+               // Need to check for \p support too, as PCRE can be compiled
+               // with utf8 support, but not unicode property support.
+               // check that \p{Zs} (space separators) matches
+               // U+3000 (Ideographic space)
+               $regexprop = preg_replace( '/\p{Zs}/u', '', "-\xE3\x80\x80-" );
                wfRestoreWarnings();
-               if ( $regexd != '--' ) {
+               if ( $regexd != '--' || $regexprop != '--' ) {
                        $this->showError( 'config-pcre-no-utf8' );
                        return false;
                }
index e453b01..d93dba6 100644 (file)
@@ -232,9 +232,7 @@ class MysqlUpdater extends DatabaseUpdater {
                if ( in_array( 'binary', $flags ) ) {
                        $this->output( "...$table table has correct $field encoding.\n" );
                } else {
-                       $this->output( "Fixing $field encoding on $table table... " );
-                       $this->applyPatch( $patchFile );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patchFile, false, "Fixing $field encoding on $table table" );
                }
        }
 
@@ -271,12 +269,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( 'Creating interwiki table...' );
-               $this->applyPatch( 'patch-interwiki.sql' );
-               $this->output( "done.\n" );
-               $this->output( 'Adding default interwiki definitions...' );
-               $this->applyPatch( "$IP/maintenance/interwiki.sql", true );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-interwiki.sql', false, 'Creating interwiki table' );
+               $this->applyPatch( "$IP/maintenance/interwiki.sql", true, 'Adding default interwiki definitions' );
        }
 
        /**
@@ -292,9 +286,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Updating indexes to 20031107..." );
-               $this->applyPatch( 'patch-indexes.sql', true );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-indexes.sql', true, "Updating indexes to 20031107" );
        }
 
        protected function doOldLinksUpdate() {
@@ -309,10 +301,9 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Fixing ancient broken imagelinks table.\n" );
-               $this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this.\n" );
-               $this->applyPatch( 'patch-fix-il_from.sql' );
-               $this->output( "done.\n" );
+               if( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) {
+                       $this->output("NOTE: you will have to run maintenance/refreshLinks.php after this." );
+               }
        }
 
        /**
@@ -534,9 +525,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Converting links and brokenlinks tables to pagelinks... " );
-               $this->applyPatch( 'patch-pagelinks.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-pagelinks.sql', false, "Converting links and brokenlinks tables to pagelinks" );
 
                global $wgContLang;
                foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) {
@@ -572,9 +561,7 @@ class MysqlUpdater extends DatabaseUpdater {
                if ( !$duper->clearDupes() ) {
                        $this->output( "WARNING: This next step will probably fail due to unfixed duplicates...\n" );
                }
-               $this->output( "Adding unique index on user_name... " );
-               $this->applyPatch( 'patch-user_nameindex.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-user_nameindex.sql', false, "Adding unique index on user_name" );
        }
 
        protected function doUserGroupsUpdate() {
@@ -587,9 +574,7 @@ class MysqlUpdater extends DatabaseUpdater {
                                $this->db->query( "ALTER TABLE $oldug RENAME TO $newug", __METHOD__ );
                                $this->output( "done.\n" );
 
-                               $this->output( "Re-adding fresh user_groups table... " );
-                               $this->applyPatch( 'patch-user_groups.sql' );
-                               $this->output( "done.\n" );
+                               $this->applyPatch( 'patch-user_groups.sql', false, "Re-adding fresh user_groups table" );
 
                                $this->output( "***\n" );
                                $this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" );
@@ -601,15 +586,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Adding user_groups table... " );
-               $this->applyPatch( 'patch-user_groups.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-user_groups.sql', false, "Adding user_groups table" );
 
                if ( !$this->db->tableExists( 'user_rights', __METHOD__ ) ) {
                        if ( $this->db->fieldExists( 'user', 'user_rights', __METHOD__ ) ) {
-                               $this->output( "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion..." );
-                               $this->db->applyPatch( 'patch-user_rights.sql' );
-                               $this->output( "done.\n" );
+                               $this->db->applyPatch( 'patch-user_rights.sql', false, "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion" );
                        } else {
                                $this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
                                $this->output( "*** You may need to manually configure some sysops by manipulating\n" );
@@ -651,9 +632,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Making wl_notificationtimestamp nullable... " );
-               $this->applyPatch( 'patch-watchlist-null.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-watchlist-null.sql', false, "Making wl_notificationtimestamp nullable" );
        }
 
        /**
@@ -679,8 +658,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Creating templatelinks table...\n" );
-               $this->applyPatch( 'patch-templatelinks.sql' );
+               $this->applyPatch( 'patch-templatelinks.sql', false, "Creating templatelinks table" );
+
                $this->output( "Populating...\n" );
                if ( wfGetLB()->getServerCount() > 1 ) {
                        // Slow, replication-friendly update
@@ -721,8 +700,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        !$this->indexHasField( 'templatelinks', 'tl_namespace', 'tl_from' ) ||
                        !$this->indexHasField( 'imagelinks', 'il_to', 'il_from' ) )
                {
-                       $this->applyPatch( 'patch-backlinkindexes.sql' );
-                       $this->output( "...backlinking indices updated\n" );
+                       $this->applyPatch( 'patch-backlinkindexes.sql', false, "Updating backlinking indices" );
                }
        }
 
@@ -737,9 +715,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Creating page_restrictions table..." );
-               $this->applyPatch( 'patch-page_restrictions.sql' );
-               $this->applyPatch( 'patch-page_restrictions_sortkey.sql' );
+               $this->applyPatch( 'patch-page_restrictions.sql', false, "Creating page_restrictions table (1/2)" );
+               $this->applyPatch( 'patch-page_restrictions_sortkey.sql', false, "Creating page_restrictions table (2/2)" );
                $this->output( "done.\n" );
 
                $this->output( "Migrating old restrictions to new table...\n" );
@@ -749,8 +726,7 @@ class MysqlUpdater extends DatabaseUpdater {
 
        protected function doCategorylinksIndicesUpdate() {
                if ( !$this->indexHasField( 'categorylinks', 'cl_sortkey', 'cl_from' ) ) {
-                       $this->applyPatch( 'patch-categorylinksindex.sql' );
-                       $this->output( "...categorylinks indices updated\n" );
+                       $this->applyPatch( 'patch-categorylinksindex.sql', false, "Updating categorylinks Indices" );
                }
        }
 
@@ -789,18 +765,14 @@ class MysqlUpdater extends DatabaseUpdater {
                } elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
                        $this->output( "...profiling table has pf_memory field.\n" );
                } else {
-                       $this->output( "Adding pf_memory field to table profiling..." );
-                       $this->applyPatch( 'patch-profiling-memory.sql' );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
                }
        }
 
        protected function doFilearchiveIndicesUpdate() {
                $info = $this->db->indexInfo( 'filearchive', 'fa_user_timestamp', __METHOD__ );
                if ( !$info ) {
-                       $this->output( "Updating filearchive indices..." );
-                       $this->applyPatch( 'patch-filearchive-user-index.sql' );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
                }
        }
 
@@ -811,9 +783,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Making pl_namespace, tl_namespace and il_to indices UNIQUE... " );
-               $this->applyPatch( 'patch-pl-tl-il-unique.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
        }
 
        protected function renameEuWikiId() {
@@ -822,9 +792,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Renaming eu_wiki_id -> eu_local_id... " );
-               $this->applyPatch( 'patch-eu_local_id.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-eu_local_id.sql', false, "Renaming eu_wiki_id -> eu_local_id" );
        }
 
        protected function doUpdateMimeMinorField() {
@@ -833,9 +801,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Altering all *_mime_minor fields to 100 bytes in size ... " );
-               $this->applyPatch( 'patch-mime_minor_length.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-mime_minor_length.sql', false, "Altering all *_mime_minor fields to 100 bytes in size" );
        }
 
        protected function doClFieldsUpdate() {
@@ -844,9 +810,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( 'Updating categorylinks (again)...' );
-               $this->applyPatch( 'patch-categorylinks-better-collation2.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-categorylinks-better-collation2.sql', false, 'Updating categorylinks (again)' );
        }
 
        protected function doLangLinksLengthUpdate() {
@@ -855,9 +819,7 @@ class MysqlUpdater extends DatabaseUpdater {
                $row = $this->db->fetchObject( $res );
 
                if ( $row && $row->Type == "varbinary(10)" ) {
-                       $this->output( 'Updating length of ll_lang in langlinks...' );
-                       $this->applyPatch( 'patch-langlinks-ll_lang-20.sql' );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( 'patch-langlinks-ll_lang-20.sql', false, 'Updating length of ll_lang in langlinks' );
                } else {
                        $this->output( "...ll_lang is up-to-date.\n" );
                }
@@ -870,8 +832,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Making user_last_timestamp nullable... " );
-               $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" );
        }
 }
index 8a93b45..a741f26 100644 (file)
@@ -83,40 +83,32 @@ class OracleUpdater extends DatabaseUpdater {
         * Oracle inserts NULL, so namespace fields should have a default value
         */
        protected function doNamespaceDefaults() {
-               $this->output( "Altering namespace fields with default value ... " );
                $meta = $this->db->fieldInfo( 'page', 'page_namespace' );
                if ( $meta->defaultValue() != null ) {
-                       $this->output( "defaults seem to present on namespace fields\n" );
                        return;
                }
 
-               $this->applyPatch( 'patch_namespace_defaults.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_namespace_defaults.sql', false, "Altering namespace fields with default value" );
        }
 
        /**
         * Uniform FK names + deferrable state
         */
        protected function doFKRenameDeferr() {
-               $this->output( "Altering foreign keys ... " );
                $meta = $this->db->query( 'SELECT COUNT(*) cnt FROM user_constraints WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' );
                $row = $meta->fetchRow();
                if ( $row && $row['cnt'] > 0 ) {
-                       $this->output( "at least one FK is deferrable, considering up to date\n" );
                        return;
                }
 
-               $this->applyPatch( 'patch_fk_rename_deferred.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_fk_rename_deferred.sql', false, "Altering foreign keys ... " );
        }
 
        /**
         * Recreate functions to 17 schema layout
         */
        protected function doFunctions17() {
-               $this->output( "Recreating functions ... " );
-               $this->applyPatch( 'patch_create_17_functions.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_create_17_functions.sql', false, "Recreating functions" );
        }
 
        /**
@@ -124,14 +116,11 @@ class OracleUpdater extends DatabaseUpdater {
         * there are no incremental patches prior to this
         */
        protected function doSchemaUpgrade17() {
-               $this->output( "Updating schema to 17 ... " );
                // check if iwlinks table exists which was added in 1.17
                if ( $this->db->tableExists( 'iwlinks' ) ) {
-                       $this->output( "schema seem to be up to date.\n" );
                        return;
                }
-               $this->applyPatch( 'patch_16_17_schema_changes.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_16_17_schema_changes.sql', false, "Updating schema to 17" );
        }
 
        /**
@@ -160,24 +149,19 @@ class OracleUpdater extends DatabaseUpdater {
         * converted to NULL in Oracle
         */
        protected function doRemoveNotNullEmptyDefaults() {
-               $this->output( "Removing not null empty constraints ... " );
                $meta = $this->db->fieldInfo( 'categorylinks' , 'cl_sortkey_prefix' );
                if ( $meta->isNullable() ) {
-                       $this->output( "constraints seem to be removed\n" );
                        return;
                }
-               $this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false, "Removing not null empty constraints" );
        }
+
        protected function doRemoveNotNullEmptyDefaults2() {
-               $this->output( "Removing not null empty constraints ... " );
                $meta = $this->db->fieldInfo( 'ipblocks' , 'ipb_by_text' );
                if ( $meta->isNullable() ) {
-                       $this->output( "constraints seem to be removed\n" );
                        return;
                }
-               $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false, "Removing not null empty constraints" );
        }
 
        /**
@@ -185,17 +169,13 @@ class OracleUpdater extends DatabaseUpdater {
         * cascading taken in account in the deleting function
         */
        protected function doRecentchangesFK2Cascade() {
-               $this->output( "Altering RECENTCHANGES_FK2 ... " );
-
                $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \''.strtoupper($this->db->getDBname()).'\' AND constraint_name = \''.$this->db->tablePrefix().'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\'' );
                $row = $meta->fetchRow();
                if ( $row ) {
-                       $this->output( "FK up to date\n" );
                        return;
                }
 
-               $this->applyPatch( 'patch_recentchanges_fk2_cascade.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_recentchanges_fk2_cascade.sql', false, "Altering RECENTCHANGES_FK2" );
        }
 
        /**
@@ -219,9 +199,7 @@ class OracleUpdater extends DatabaseUpdater {
         * rebuilding of the function that duplicates tables for tests
         */
        protected function doRebuildDuplicateFunction() {
-               $this->output( "Rebuilding duplicate function ... " );
-               $this->applyPatch( 'patch_rebuild_dupfunc.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_rebuild_dupfunc.sql', false, "Rebuilding duplicate function" );
        }
 
        /**
index 9aa1a13..499a2d6 100644 (file)
@@ -613,11 +613,11 @@ END;
                if ( $this->db->indexExists( $table, $index ) ) {
                        $this->output( "...index '$index' on table '$table' already exists\n" );
                } else {
-                       $this->output( "Creating index '$index' on table '$table'\n" );
                        if ( preg_match( '/^\(/', $type ) ) {
+                               $this->output( "Creating index '$index' on table '$table'\n" );
                                $this->db->query( "CREATE INDEX $index ON $table $type" );
                        } else {
-                               $this->applyPatch( $type, true );
+                               $this->applyPatch( $type, true, "Creating index '$index' on table '$table'" );
                        }
                }
        }
@@ -647,7 +647,6 @@ END;
 
        protected function convertArchive2() {
                if ( $this->db->tableExists( "archive2" ) ) {
-                       $this->output( "Converting 'archive2' back to normal archive table\n" );
                        if ( $this->db->ruleExists( 'archive', 'archive_insert' ) ) {
                                $this->output( "Dropping rule 'archive_insert'\n" );
                                $this->db->query( 'DROP RULE archive_insert ON archive' );
@@ -656,7 +655,7 @@ END;
                                $this->output( "Dropping rule 'archive_delete'\n" );
                                $this->db->query( 'DROP RULE archive_delete ON archive' );
                        }
-                       $this->applyPatch( 'patch-remove-archive2.sql' );
+                       $this->applyPatch( 'patch-remove-archive2.sql', false, "Converting 'archive2' back to normal archive table" );
                } else {
                        $this->output( "...obsolete table 'archive2' does not exist\n" );
                }
@@ -691,8 +690,7 @@ END;
 
        protected function checkPageDeletedTrigger() {
                if ( !$this->db->triggerExists( 'page', 'page_deleted' ) ) {
-                       $this->output( "Adding function and trigger 'page_deleted' to table 'page'\n" );
-                       $this->applyPatch( 'patch-page_deleted.sql' );
+                       $this->applyPatch( 'patch-page_deleted.sql', false, "Adding function and trigger 'page_deleted' to table 'page'" );
                } else {
                        $this->output( "...table 'page' has 'page_deleted' trigger\n" );
                }
@@ -727,35 +725,30 @@ END;
                if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
                        $this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
                } else {
-                       $this->output( "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT\n" );
-                       $this->applyPatch( 'patch-revision_rev_user_fkey.sql' );
+                       $this->applyPatch( 'patch-revision_rev_user_fkey.sql', false, "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" );
                }
        }
 
        protected function checkIwlPrefix() {
                if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
-                       $this->output( "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'...\n" );
-                       $this->applyPatch( 'patch-rename-iwl_prefix.sql' );
+                       $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'" );
                }
        }
 
        protected function addInterwikiType() {
-               $this->output( "Refreshing add_interwiki()...\n" );
-               $this->applyPatch( 'patch-add_interwiki.sql' );
+               $this->applyPatch( 'patch-add_interwiki.sql', false, "Refreshing add_interwiki()" );
        }
 
        protected function tsearchFixes() {
                # Tweak the page_title tsearch2 trigger to filter out slashes
                # This is create or replace, so harmless to call if not needed
-               $this->output( "Refreshing ts2_page_title()...\n" );
-               $this->applyPatch( 'patch-ts2pagetitle.sql' );
+               $this->applyPatch( 'patch-ts2pagetitle.sql', false, "Refreshing ts2_page_title()" );
 
                # If the server is 8.3 or higher, rewrite the tsearch2 triggers
                # in case they have the old 'default' versions
                # Gather version numbers in case we need them
                if ( $this->db->getServerVersion() >= 8.3 ) {
-                       $this->output( "Rewriting tsearch2 triggers...\n" );
-                       $this->applyPatch( 'patch-tsearch2funcs.sql' );
+                       $this->applyPatch( 'patch-tsearch2funcs.sql', false, "Rewriting tsearch2 triggers" );
                }
        }
 }
index 8146274..9ba9eab 100644 (file)
@@ -101,22 +101,16 @@ class SqliteUpdater extends DatabaseUpdater {
                        $this->output( "...have initial indexes\n" );
                        return;
                }
-               $this->output( "Adding initial indexes..." );
-               $this->applyPatch( 'initial-indexes.sql' );
-               $this->output( "done\n" );
+               $this->applyPatch( 'initial-indexes.sql', false, "Adding initial indexes" );
        }
 
        protected function sqliteSetupSearchindex() {
                $module = DatabaseSqlite::getFulltextSearchModule();
                $fts3tTable = $this->updateRowExists( 'fts3' );
                if ( $fts3tTable &&  !$module ) {
-                       $this->output( '...PHP is missing FTS3 support, downgrading tables...' );
-                       $this->applyPatch( 'searchindex-no-fts.sql' );
-                       $this->output( "done\n" );
+                       $this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
                } elseif ( !$fts3tTable && $module == 'FTS3' ) {
-                       $this->output( '...adding FTS3 search capabilities...' );
-                       $this->applyPatch( 'searchindex-fts3.sql' );
-                       $this->output( "done\n" );
+                       $this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" );
                } else {
                        $this->output( "...fulltext search table appears to be in order.\n" );
                }
index 8d2219a..7586bb6 100644 (file)
@@ -171,7 +171,7 @@ class LogFormatter {
                        if ( $actionComment == '' ) {
                                $actionComment = $comment;
                        } else {
-                               $actionComment .= wfMsgForContent( 'colon-separator' ) . $comment;
+                               $actionComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
                        }
                }
 
@@ -191,7 +191,6 @@ class LogFormatter {
                $entry = $this->entry;
                $parameters = $entry->getParameters();
                // @see LogPage::actionText()
-               $msgOpts = array( 'parsemag', 'escape', 'replaceafter', 'content' );
                // Text of title the action is aimed at.
                $target = $entry->getTarget()->getPrefixedText() ;
                $text = null;
@@ -200,11 +199,13 @@ class LogFormatter {
                                switch( $entry->getSubtype() ) {
                                        case 'move':
                                                $movesource =  $parameters['4::target'];
-                                               $text = wfMsgExt( '1movedto2', $msgOpts, $target, $movesource );
+                                               $text = wfMessage( '1movedto2' )
+                                                       ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
                                                break;
                                        case 'move_redir':
                                                $movesource =  $parameters['4::target'];
-                                               $text = wfMsgExt( '1movedto2_redir', $msgOpts, $target, $movesource );
+                                               $text = wfMessage( '1movedto2_redir' )
+                                                       ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
                                                break;
                                        case 'move-noredirect':
                                                break;
@@ -216,10 +217,12 @@ class LogFormatter {
                        case 'delete':
                                switch( $entry->getSubtype() ) {
                                        case 'delete':
-                                               $text = wfMsgExt( 'deletedarticle', $msgOpts, $target );
+                                               $text = wfMessage( 'deletedarticle' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'restore':
-                                               $text = wfMsgExt( 'undeletedarticle', $msgOpts, $target );
+                                               $text = wfMessage( 'undeletedarticle' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        //case 'revision': // Revision deletion
                                        //case 'event': // Log deletion
@@ -233,8 +236,10 @@ class LogFormatter {
                                // Create a diff link to the patrolled revision
                                if ( $entry->getSubtype() === 'patrol' ) {
                                        $diffLink = htmlspecialchars(
-                                               wfMsgForContent( 'patrol-log-diff', $parameters['4::curid'] ) );
-                                       $text = wfMsgForContent( 'patrol-log-line', $diffLink, "[[$target]]", "" );
+                                               wfMessage( 'patrol-log-diff', $parameters['4::curid'] )
+                                                       ->inContentLanguage()->text() );
+                                       $text = wfMessage( 'patrol-log-line', $diffLink, "[[$target]]", "" )
+                                               ->inContentLanguage()->text();
                                } else {
                                        // broken??
                                }
@@ -243,14 +248,17 @@ class LogFormatter {
                        case 'protect':
                                switch( $entry->getSubtype() ) {
                                case 'protect':
-                                       $text = wfMsgExt( 'protectedarticle', $msgOpts, $target . ' ' . $parameters[0] );
-                                               break;
+                                       $text = wfMessage( 'protectedarticle' )
+                                               ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                       break;
                                case 'unprotect':
-                                       $text = wfMsgExt( 'unprotectedarticle', $msgOpts, $target );
-                                               break;
+                                       $text = wfMessage( 'unprotectedarticle' )
+                                               ->rawParams( $target )->inContentLanguage()->escaped();
+                                       break;
                                case 'modify':
-                                       $text = wfMsgExt( 'modifiedarticleprotection', $msgOpts, $target . ' ' . $parameters[0] );
-                                               break;
+                                       $text = wfMessage( 'modifiedarticleprotection' )
+                                               ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                       break;
                                }
                                break;
 
@@ -258,13 +266,16 @@ class LogFormatter {
                                switch( $entry->getSubtype() ) {
                                        case 'newusers':
                                        case 'create':
-                                               $text = wfMsgExt( 'newuserlog-create-entry', $msgOpts /* no params */ );
+                                               $text = wfMessage( 'newuserlog-create-entry' )
+                                                       ->inContentLanguage()->escaped();
                                                break;
                                        case 'create2':
-                                               $text = wfMsgExt( 'newuserlog-create2-entry', $msgOpts, $target );
+                                               $text = wfMessage( 'newuserlog-create2-entry' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'autocreate':
-                                               $text = wfMsgExt( 'newuserlog-autocreate-entry', $msgOpts /* no params */ );
+                                               $text = wfMessage( 'newuserlog-autocreate-entry' )
+                                                       ->inContentLanguage()->escaped();
                                                break;
                                }
                                break;
@@ -272,10 +283,12 @@ class LogFormatter {
                        case 'upload':
                                switch( $entry->getSubtype() ) {
                                        case 'upload':
-                                               $text = wfMsgExt( 'uploadedimage', $msgOpts, $target );
+                                               $text = wfMessage( 'uploadedimage' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'overwrite':
-                                               $text = wfMsgExt( 'overwroteimage', $msgOpts, $target );
+                                               $text = wfMessage( 'overwroteimage' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                }
                                break;
index 2521ae8..d96a5ea 100644 (file)
@@ -133,7 +133,8 @@ class LogPage {
                        if ( $rcComment == '' ) {
                                $rcComment = $this->comment;
                        } else {
-                               $rcComment .= wfMsgForContent( 'colon-separator' ) . $this->comment;
+                               $rcComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() .
+                                       $this->comment;
                        }
                }
 
@@ -152,7 +153,8 @@ class LogPage {
                        if ( $rcComment == '' ) {
                                $rcComment = $this->comment;
                        } else {
-                               $rcComment .= wfMsgForContent( 'colon-separator' ) . $this->comment;
+                               $rcComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() .
+                                       $this->comment;
                        }
                }
 
@@ -197,7 +199,7 @@ class LogPage {
                global $wgLogNames;
 
                if( isset( $wgLogNames[$type] ) ) {
-                       return str_replace( '_', ' ', wfMsg( $wgLogNames[$type] ) );
+                       return str_replace( '_', ' ', wfMessage( $wgLogNames[$type] )->text() );
                } else {
                        // Bogus log types? Perhaps an extension was removed.
                        return $type;
@@ -214,7 +216,7 @@ class LogPage {
         */
        public static function logHeader( $type ) {
                global $wgLogHeaders;
-               return wfMsgExt( $wgLogHeaders[$type], array( 'parseinline' ) );
+               return wfMessage( $wgLogHeaders[$type] )->parse();
        }
 
        /**
@@ -247,12 +249,12 @@ class LogPage {
 
                if( isset( $wgLogActions[$key] ) ) {
                        if( is_null( $title ) ) {
-                               $rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'language' => $langObj ) );
+                               $rv = wfMessage( $wgLogActions[$key] )->inLanguage( $langObj )->escaped();
                        } else {
                                $titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
 
                                if( preg_match( '/^rights\/(rights|autopromote)/', $key ) ) {
-                                       $rightsnone = wfMsgExt( 'rightsnone', array( 'parsemag', 'language' => $langObj ) );
+                                       $rightsnone = wfMessage( 'rightsnone' )->inLanguage( $langObj )->text();
 
                                        if( $skin ) {
                                                $username = $title->getText();
@@ -275,7 +277,7 @@ class LogPage {
                                }
 
                                if( count( $params ) == 0 ) {
-                                       $rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $titleLink );
+                                       $rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )->inLanguage( $langObj )->escaped();
                                } else {
                                        $details = '';
                                        array_unshift( $params, $titleLink );
@@ -302,11 +304,11 @@ class LogPage {
 
                                                // Cascading flag...
                                                if( $params[2] ) {
-                                                       $details .= ' [' . wfMsgExt( 'protect-summary-cascade', array( 'parsemag', 'language' => $langObj ) ) . ']';
+                                                       $details .= ' [' . wfMessage( 'protect-summary-cascade' )->inLanguage( $langObj )->text() . ']';
                                                }
                                        }
 
-                                       $rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $params ) . $details;
+                                       $rv = wfMessage( $wgLogActions[$key] )->rawParams( $params )->inLanguage( $langObj )->escaped() . $details;
                                }
                        }
                } else {
@@ -442,7 +444,7 @@ class LogPage {
         * @param $action String: one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
         * @param $target Title object
         * @param $comment String: description associated
-        * @param $params Array: parameters passed later to wfMsg.* functions
+        * @param $params Array: parameters passed later to wfMessage function
         * @param $doer User object: the user doing the action
         *
         * @return int log_id of the inserted log entry
index 0f30c6f..8a4b943 100644 (file)
@@ -524,7 +524,7 @@ class BitmapHandler extends ImageHandler {
                if ( !isset( $typemap[$params['mimeType']] ) ) {
                        $err = 'Image type not supported';
                        wfDebug( "$err\n" );
-                       $errMsg = wfMsg( 'thumbnail_image-type' );
+                       $errMsg = wfMessage( 'thumbnail_image-type' )->text();
                        return $this->getMediaTransformError( $params, $errMsg );
                }
                list( $loader, $colorStyle, $saveType ) = $typemap[$params['mimeType']];
@@ -532,14 +532,14 @@ class BitmapHandler extends ImageHandler {
                if ( !function_exists( $loader ) ) {
                        $err = "Incomplete GD library configuration: missing function $loader";
                        wfDebug( "$err\n" );
-                       $errMsg = wfMsg( 'thumbnail_gd-library', $loader );
+                       $errMsg = wfMessage( 'thumbnail_gd-library', $loader )->text();
                        return $this->getMediaTransformError( $params, $errMsg );
                }
 
                if ( !file_exists( $params['srcPath'] ) ) {
                        $err = "File seems to be missing: {$params['srcPath']}";
                        wfDebug( "$err\n" );
-                       $errMsg = wfMsg( 'thumbnail_image-missing', $params['srcPath'] );
+                       $errMsg = wfMessage( 'thumbnail_image-missing', $params['srcPath'] )->text();
                        return $this->getMediaTransformError( $params, $errMsg );
                }
 
index 7ee93a1..ea4888a 100644 (file)
@@ -138,7 +138,7 @@ class DjVuHandler extends ImageHandler {
                        $width = isset( $params['width'] ) ? $params['width'] : 0;
                        $height = isset( $params['height'] ) ? $params['height'] : 0;
                        return new MediaTransformError( 'thumbnail_error', $width, $height,
-                               wfMsg( 'djvu_no_xml' ) );
+                               wfMessage( 'djvu_no_xml' )->text() );
                }
 
                if ( !$this->normaliseParams( $image, $params ) ) {
@@ -148,7 +148,12 @@ class DjVuHandler extends ImageHandler {
                $height = $params['height'];
                $page = $params['page'];
                if ( $page > $this->pageCount( $image ) ) {
-                       return new MediaTransformError( 'thumbnail_error', $width, $height, wfMsg( 'djvu_page_error' ) );
+                       return new MediaTransformError(
+                               'thumbnail_error',
+                               $width,
+                               $height,
+                               wfMessage( 'djvu_page_error' )->text()
+                       );
                }
 
                if ( $flags & self::TRANSFORM_LATER ) {
@@ -156,7 +161,12 @@ class DjVuHandler extends ImageHandler {
                }
 
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
-                       return new MediaTransformError( 'thumbnail_error', $width, $height, wfMsg( 'thumbnail_dest_directory' ) );
+                       return new MediaTransformError(
+                               'thumbnail_error',
+                               $width,
+                               $height,
+                               wfMessage( 'thumbnail_dest_directory' )->text()
+                       );
                }
 
                $srcPath = $image->getLocalRefPath();
index 0ae9a05..35305d1 100644 (file)
@@ -233,7 +233,7 @@ class FormatMetadata {
                                case 'dc-date':
                                case 'DateTimeMetadata':
                                        if ( $val == '0000:00:00 00:00:00' || $val == '    :  :     :  :  ' ) {
-                                               $val = wfMsg( 'exif-unknowndate' );
+                                               $val = wfMessage( 'exif-unknowndate' )->text();
                                        } elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d) (?:\d\d):(?:\d\d):(?:\d\d)$/D', $val ) ) {
                                                // Full date.
                                                $time = wfTimestamp( TS_MW, $val );
@@ -591,7 +591,7 @@ class FormatMetadata {
                                case 'Software':
                                        if ( is_array( $val ) ) {
                                                //if its a software, version array.
-                                               $val = wfMsg( 'exif-software-version-value', $val[0], $val[1] );
+                                               $val = wfMessage( 'exif-software-version-value', $val[0], $val[1] )->text();
                                        } else {
                                                $val = self::msg( $tag, '', $val );
                                        }
@@ -599,8 +599,8 @@ class FormatMetadata {
 
                                case 'ExposureTime':
                                        // Show the pretty fraction as well as decimal version
-                                       $val = wfMsg( 'exif-exposuretime-format',
-                                               self::formatFraction( $val ), self::formatNum( $val ) );
+                                       $val = wfMessage( 'exif-exposuretime-format',
+                                               self::formatFraction( $val ), self::formatNum( $val ) )->text();
                                        break;
                                case 'ISOSpeedRatings':
                                        // If its = 65535 that means its at the
@@ -613,13 +613,13 @@ class FormatMetadata {
                                        }
                                        break;
                                case 'FNumber':
-                                       $val = wfMsg( 'exif-fnumber-format',
-                                               self::formatNum( $val ) );
+                                       $val = wfMessage( 'exif-fnumber-format',
+                                               self::formatNum( $val ) )->text();
                                        break;
 
                                case 'FocalLength': case 'FocalLengthIn35mmFilm':
-                                       $val = wfMsg( 'exif-focallength-format',
-                                               self::formatNum( $val ) );
+                                       $val = wfMessage( 'exif-focallength-format',
+                                               self::formatNum( $val ) )->text();
                                        break;
 
                                case 'MaxApertureValue':
@@ -633,10 +633,10 @@ class FormatMetadata {
                                        if ( is_numeric( $val ) ) {
                                                $fNumber = pow( 2, $val / 2 );
                                                if ( $fNumber !== false ) {
-                                                       $val = wfMsg( 'exif-maxaperturevalue-value',
+                                                       $val = wfMessage( 'exif-maxaperturevalue-value',
                                                                self::formatNum( $val ),
                                                                self::formatNum( $fNumber, 2 )
-                                                       );
+                                                       )->text();
                                                }
                                        }
                                        break;
@@ -696,7 +696,7 @@ class FormatMetadata {
                                case 'PixelYDimension':
                                case 'ImageWidth':
                                case 'ImageLength':
-                                       $val = self::formatNum( $val ) . ' ' . wfMsg( 'unit-pixel' );
+                                       $val = self::formatNum( $val ) . ' ' . wfMessage( 'unit-pixel' )->text();
                                        break;
 
                                // Do not transform fields with pure text.
@@ -958,12 +958,12 @@ class FormatMetadata {
 
                if ( $lang === false ) {
                        if ( $noHtml ) {
-                               return wfMsg( 'metadata-langitem-default',
-                                       $wrappedValue ) . "\n\n";
+                               return wfMessage( 'metadata-langitem-default',
+                                       $wrappedValue )->text() . "\n\n";
                        } /* else */
                        return '<li class="mw-metadata-lang-default">'
-                               . wfMsg( 'metadata-langitem-default',
-                                       $wrappedValue )
+                               . wfMessage( 'metadata-langitem-default',
+                                       $wrappedValue )->text()
                                . "</li>\n";
                }
 
@@ -981,8 +981,8 @@ class FormatMetadata {
                // else we have a language specified
 
                if ( $noHtml ) {
-                       return '*' . wfMsg( 'metadata-langitem',
-                               $wrappedValue, $langName, $lang );
+                       return '*' . wfMessage( 'metadata-langitem',
+                               $wrappedValue, $langName, $lang )->text();
                } /* else: */
 
                $item = '<li class="mw-metadata-lang-code-'
@@ -991,8 +991,8 @@ class FormatMetadata {
                        $item .= ' mw-metadata-lang-default';
                }
                $item .= '" lang="' . $lang . '">';
-               $item .= wfMsg( 'metadata-langitem',
-                       $wrappedValue, $langName, $lang );
+               $item .= wfMessage( 'metadata-langitem',
+                       $wrappedValue, $langName, $lang )->text();
                $item .= "</li>\n";
                return $item;
        }
@@ -1006,14 +1006,14 @@ class FormatMetadata {
         * @param $val String: the value of the tag
         * @param $arg String: an argument to pass ($1)
         * @param $arg2 String: a 2nd argument to pass ($2)
-        * @return string A wfMsg of "exif-$tag-$val" in lower case
+        * @return string A wfMessage of "exif-$tag-$val" in lower case
         */
        static function msg( $tag, $val, $arg = null, $arg2 = null ) {
                global $wgContLang;
 
                if ($val === '')
                        $val = 'value';
-               return wfMsg( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 );
+               return wfMessage( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text();
        }
 
        /**
@@ -1214,7 +1214,7 @@ class FormatMetadata {
                $min = self::formatNum( $min );
                $sec = self::formatNum( $sec );
 
-               return wfMsg( 'exif-coordinate-format', $deg, $min, $sec, $ref, $coord );
+               return wfMessage( 'exif-coordinate-format', $deg, $min, $sec, $ref, $coord )->text();
        }
 
        /**
@@ -1335,9 +1335,9 @@ class FormatMetadata {
                                        . htmlspecialchars( $vals['CiUrlWork'] )
                                        . '</span>';
                        }
-                       return wfMsg( 'exif-contact-value', $email, $url,
+                       return wfMessage( 'exif-contact-value', $email, $url,
                                $street, $city, $region, $postal, $country,
-                               $tel );
+                               $tel )->text();
                }
        }
 }
index 028fbb0..84b9b8c 100644 (file)
@@ -93,6 +93,17 @@ class GIFHandler extends BitmapHandler {
                return false;
        }
 
+       /**
+        * We cannot animate thumbnails that are bigger than a particular size
+        * @param File $file
+        * @return bool
+        */
+       function canAnimateThumbnail( $file ) {
+               global $wgMaxAnimatedGifArea;
+               $answer = $this->getImageArea( $file ) <= $wgMaxAnimatedGifArea;
+               return $answer;
+       }
+
        function getMetadataType( $image ) {
                return 'parsed-gif';
        }
index 69f51be..65757c9 100644 (file)
@@ -204,10 +204,6 @@ abstract class ImageHandler extends MediaHandler {
                return $gis;
        }
 
-       function isAnimatedImage( $image ) {
-               return false;
-       }
-
        /**
         * @param $file File
         * @return string
index e883b7f..965099f 100644 (file)
@@ -269,6 +269,19 @@ abstract class MediaHandler {
         * @return bool
         */
        function isVectorized( $file ) { return false; }
+       /**
+        * The material is an image, and is animated.
+        * In particular, video material need not return true.
+        * @note Before 1.20, this was a method of ImageHandler only
+        * @return bool
+        */
+       function isAnimatedImage( $file ) { return false; }
+       /**
+        * If the material is animated, we can animate the thumbnail
+        * @since 1.20
+        * @return bool If material is not animated, handler may return any value.
+        */
+       function canAnimateThumbnail( $file ) { return true; }
        /**
         * False if the handler is disabled for all files
         * @return bool
@@ -372,7 +385,7 @@ abstract class MediaHandler {
         */
        function visibleMetadataFields() {
                $fields = array();
-               $lines = explode( "\n", wfMsgForContent( 'metadata-fields' ) );
+               $lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() );
                foreach( $lines as $line ) {
                        $matches = array();
                        if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
index 00d12bb..80766bb 100644 (file)
@@ -359,6 +359,6 @@ class TransformParameterError extends MediaTransformError {
                parent::__construct( 'thumbnail_error',
                        max( isset( $params['width']  ) ? $params['width']  : 0, 120 ),
                        max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
-                       wfMsg( 'thumbnail_invalid_params' ) );
+                       wfMessage( 'thumbnail_invalid_params' )->text() );
        }
 }
index 8289cd4..1b329e5 100644 (file)
@@ -80,6 +80,14 @@ class PNGHandler extends BitmapHandler {
                }
                return false;
        }
+       /**
+        * We do not support making APNG thumbnails, so always false
+        * @param $image File
+        * @return bool false
+        */
+       function canAnimateThumbnail( $image ) {
+               return false;
+       }
        
        function getMetadataType( $image ) {
                return 'parsed-png';
index 9846c71..a5ce1fa 100644 (file)
@@ -63,6 +63,13 @@ class SvgHandler extends ImageHandler {
                return false;
        }
 
+       /**
+        * We do not support making animated svg thumbnails
+        */
+       function canAnimateThumb( $file ) {
+               return false;
+       }
+
        /**
         * @param $image File
         * @param  $params
@@ -115,7 +122,7 @@ class SvgHandler extends ImageHandler {
 
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
-                               wfMsg( 'thumbnail_dest_directory' ) );
+                               wfMessage( 'thumbnail_dest_directory' )->text() );
                }
 
                $srcPath = $image->getLocalRefPath();
@@ -214,15 +221,30 @@ class SvgHandler extends ImageHandler {
        }
 
        /**
+        * Subtitle for the image. Different from the base
+        * class so it can be denoted that SVG's have
+        * a "nominal" resolution, and not a fixed one,
+        * as well as so animation can be denoted.
+        *
         * @param $file File
         * @return string
         */
        function getLongDesc( $file ) {
                global $wgLang;
-               return wfMsgExt( 'svg-long-desc', 'parseinline',
-                       $wgLang->formatNum( $file->getWidth() ),
-                       $wgLang->formatNum( $file->getHeight() ),
-                       $wgLang->formatSize( $file->getSize() ) );
+               $size = $wgLang->formatSize( $file->getSize() );
+
+               if ( $this->isAnimatedImage( $file ) ) {
+                       $msg = wfMessage( 'svg-long-desc-animated' );
+               } else {
+                       $msg = wfMessage( 'svg-long-desc' );
+               }
+
+               $msg->numParams(
+                       $file->getWidth(),
+                       $file->getHeight()
+               );
+               $msg->Params( $size );
+               return $msg->parse();
        }
 
        function getMetadata( $file, $filename ) {
@@ -257,7 +279,7 @@ class SvgHandler extends ImageHandler {
        }
 
        function visibleMetadataFields() {
-               $fields = array( 'title', 'description', 'animated' );
+               $fields = array( 'objectname', 'imagedescription' );
                return $fields;
        }
 
@@ -278,8 +300,6 @@ class SvgHandler extends ImageHandler {
                if ( !$metadata ) {
                        return false;
                }
-               unset( $metadata['version'] );
-               unset( $metadata['metadata'] ); /* non-formatted XML */
 
                /* TODO: add a formatter
                $format = new FormatSVG( $metadata );
@@ -290,8 +310,9 @@ class SvgHandler extends ImageHandler {
                $visibleFields = $this->visibleMetadataFields();
 
                // Rename fields to be compatible with exif, so that
-               // the labels for these fields work.
-               $conversion = array( 'width' => 'imagewidth',
+               // the labels for these fields work and reuse existing messages.
+               $conversion = array(
+                       'width' => 'imagewidth',
                        'height' => 'imagelength',
                        'description' => 'imagedescription',
                        'title' => 'objectname',
@@ -300,6 +321,9 @@ class SvgHandler extends ImageHandler {
                        $tag = strtolower( $name );
                        if ( isset( $conversion[$tag] ) ) {
                                $tag = $conversion[$tag];
+                       } else {
+                               // Do not output other metadata not in list
+                               continue;
                        }
                        self::addMeta( $result,
                                in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
index 83f531c..89e1e0c 100644 (file)
@@ -139,6 +139,11 @@ class SVGReader {
                                $this->readField( $tag, 'description' );
                        } elseif ( $isSVG && $tag == 'metadata' && $type == XmlReader::ELEMENT ) {
                                $this->readXml( $tag, 'metadata' );
+                       } elseif ( $isSVG && $tag == 'script' ) {
+                               // We normally do not allow scripted svgs.
+                               // However its possible to configure MW to let them
+                               // in, and such files should be considered animated.
+                               $this->metadata['animated'] = true;
                        } elseif ( $tag !== '#text' ) {
                                $this->debug( "Unhandled top-level XML tag $tag" );
 
@@ -219,6 +224,11 @@ class SVGReader {
                                break;
                        } elseif ( $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::ELEMENT ) {
                                switch( $this->reader->localName ) {
+                                       case 'script':
+                                               // Normally we disallow files with
+                                               // <script>, but its possible
+                                               // to configure MW to disable
+                                               // such checks.
                                        case 'animate':
                                        case 'set':
                                        case 'animateMotion':
index 8db5ac9..4c6a22f 100644 (file)
@@ -747,7 +747,7 @@ class CoreParserFunctions {
                        $title = SpecialPage::getTitleFor( $page, $subpage );
                        return $title->getPrefixedText();
                } else {
-                       return wfMsgForContent( 'nosuchspecialpage' );
+                       return wfMessage( 'nosuchspecialpage' )->inContentLanguage()->text();
                }
        }
 
@@ -782,9 +782,7 @@ class CoreParserFunctions {
                        return '';
                } else {
                        return( '<span class="error">' .
-                               wfMsgForContent( 'duplicate-defaultsort',
-                                                htmlspecialchars( $old ),
-                                                htmlspecialchars( $text ) ) .
+                               wfMessage( 'duplicate-defaultsort', $old, $text )->inContentLanguage()->escaped() .
                                '</span>' );
                }
        }
@@ -844,7 +842,7 @@ class CoreParserFunctions {
                $stripList = $parser->getStripList();
                if ( !in_array( $tagName, $stripList ) ) {
                        return '<span class="error">' .
-                               wfMsgForContent( 'unknown_extension_tag', $tagName ) .
+                               wfMessage( 'unknown_extension_tag', $tagName )->inContentLanguage()->text() .
                                '</span>';
                }
 
index b351290..489451a 100644 (file)
@@ -1230,7 +1230,7 @@ class Parser {
                                throw new MWException( __METHOD__.': unrecognised match type "' .
                                        substr( $m[0], 0, 20 ) . '"' );
                        }
-                       $url = wfMsgForContent( $urlmsg, $id );
+                       $url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
                        return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $CssClass );
                } elseif ( isset( $m[5] ) && $m[5] !== '' ) {
                        # ISBN
@@ -1522,6 +1522,9 @@ class Parser {
                wfProfileIn( __METHOD__ );
 
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
+               if ( $bits === false ) {
+                       throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
+               }
                $s = array_shift( $bits );
 
                $i = 0;
@@ -1684,7 +1687,7 @@ class Parser {
                }
                if ( !$text && $this->mOptions->getEnableImageWhitelist()
                         && preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
-                       $whitelist = explode( "\n", wfMsgForContent( 'external_image_whitelist' ) );
+                       $whitelist = explode( "\n", wfMessage( 'external_image_whitelist' )->inContentLanguage()->text() );
                        foreach ( $whitelist as $entry ) {
                                # Sanitize the regex fragment, make it case-insensitive, ignore blank entries/comments
                                if ( strpos( $entry, '#' ) === 0 || $entry === '' ) {
@@ -1749,7 +1752,7 @@ class Parser {
                if ( $useLinkPrefixExtension ) {
                        # Match the end of a line for a word that's not followed by whitespace,
                        # e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched
-                       $e2 = wfMsgForContent( 'linkprefix' );
+                       $e2 = wfMessage( 'linkprefix' )->inContentLanguage()->text();
                }
 
                if ( is_null( $this->mTitle ) ) {
@@ -3085,7 +3088,8 @@ class Parser {
         */
        function limitationWarn( $limitationType, $current = null, $max = null) {
                # does no harm if $current and $max are present but are unnecessary for the message
-               $warning = wfMsgExt( "$limitationType-warning", array( 'parsemag', 'escape' ), $current, $max );
+               $warning = wfMessage( "$limitationType-warning" )->numParams( $current, $max )
+                       ->inContentLanguage()->escaped();
                $this->mOutput->addWarning( $warning );
                $this->addTrackingCategory( "$limitationType-category" );
        }
@@ -3290,7 +3294,8 @@ class Parser {
                                if ( $frame->depth >= $limit ) {
                                        $found = true;
                                        $text = '<span class="error">'
-                                               . wfMsgForContent( 'parser-template-recursion-depth-warning', $limit )
+                                               . wfMessage( 'parser-template-recursion-depth-warning' )
+                                                       ->numParams( $limit )->inContentLanguage()->text()
                                                . '</span>';
                                }
                        }
@@ -3370,7 +3375,9 @@ class Parser {
                        # This has to be done after redirect resolution to avoid infinite loops via redirects
                        if ( !$frame->loopCheck( $title ) ) {
                                $found = true;
-                               $text = '<span class="error">' . wfMsgForContent( 'parser-template-loop-warning', $titleText ) . '</span>';
+                               $text = '<span class="error">'
+                                       . wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text()
+                                       . '</span>';
                                wfDebug( __METHOD__.": template loop broken at '$titleText'\n" );
                        }
                        wfProfileOut( __METHOD__ . '-loadtpl' );
@@ -3660,13 +3667,13 @@ class Parser {
                global $wgEnableScaryTranscluding;
 
                if ( !$wgEnableScaryTranscluding ) {
-                       return wfMsgForContent('scarytranscludedisabled');
+                       return wfMessage('scarytranscludedisabled')->inContentLanguage()->text();
                }
 
                $url = $title->getFullUrl( "action=$action" );
 
                if ( strlen( $url ) > 255 ) {
-                       return wfMsgForContent( 'scarytranscludetoolong' );
+                       return wfMessage( 'scarytranscludetoolong' )->inContentLanguage()->text();
                }
                return $this->fetchScaryTemplateMaybeFromCache( $url );
        }
@@ -3687,7 +3694,7 @@ class Parser {
 
                $text = Http::get( $url );
                if ( !$text ) {
-                       return wfMsgForContent( 'scarytranscludefailed', $url );
+                       return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
                }
 
                $dbw = wfGetDB( DB_MASTER );
@@ -4412,7 +4419,7 @@ class Parser {
                $text = $this->replaceVariables( $text );
 
                # This works almost by chance, as the replaceVariables are done before the getUserSig(),
-               # which may corrupt this parser instance via its wfMsgExt( parsemag ) call-
+               # which may corrupt this parser instance via its wfMessage()->text() call-
 
                # Signatures
                $sigText = $this->getUserSig( $user );
@@ -4955,7 +4962,7 @@ class Parser {
                                'vertAlign' => array( 'baseline', 'sub', 'super', 'top', 'text-top', 'middle',
                                        'bottom', 'text-bottom' ),
                                'frame' => array( 'thumbnail', 'manualthumb', 'framed', 'frameless',
-                                       'upright', 'border', 'link', 'alt' ),
+                                       'upright', 'border', 'link', 'alt', 'class' ),
                        );
                        static $internalParamMap;
                        if ( !$internalParamMap ) {
@@ -5005,6 +5012,7 @@ class Parser {
                #  * upright    reduce width for upright images, rounded to full __0 px
                #  * border     draw a 1px border around the image
                #  * alt        Text for HTML alt attribute (defaults to empty)
+               #  * class      Set a class for img node
                #  * link       Set the target of the image link. Can be external, interwiki, or local
                # vertical-align values (no % or length right now):
                #  * baseline
@@ -5073,6 +5081,7 @@ class Parser {
                                                switch( $paramName ) {
                                                case 'manualthumb':
                                                case 'alt':
+                                               case 'class':
                                                        # @todo FIXME: Possibly check validity here for
                                                        # manualthumb? downstream behavior seems odd with
                                                        # missing manual thumbs.
index b08aa14..ad95d5f 100644 (file)
@@ -134,11 +134,14 @@ class StripState {
                $marker = $m[1];
                if ( isset( $this->data[$this->tempType][$marker] ) ) {
                        if ( isset( $this->circularRefGuard[$marker] ) ) {
-                               return '<span class="error">' . wfMsgForContent( 'parser-unstrip-loop-warning' ) . '</span>';
+                               return '<span class="error">'
+                                       . wfMessage( 'parser-unstrip-loop-warning' )->inContentLanguage()->text()
+                                       . '</span>';
                        }
                        if ( $this->recursionLevel >= self::UNSTRIP_RECURSION_LIMIT ) {
                                return '<span class="error">' . 
-                                       wfMsgForContent( 'parser-unstrip-recursion-limit', self::UNSTRIP_RECURSION_LIMIT ) . 
+                                       wfMessage( 'parser-unstrip-recursion-limit' )
+                                               ->numParams( self::UNSTRIP_RECURSION_LIMIT )->inContentLanguage()->text() .
                                        '</span>';
                        }
                        $this->circularRefGuard[$marker] = true;
index 19ea171..8e15d55 100644 (file)
@@ -360,8 +360,8 @@ class SpecialNewpages extends IncludableSpecialPage {
                        $classes[] = 'mw-newpages-zero-byte-page';
                }
 
-               # Tags, if any. check for including due to bug 23293
-               if ( !$this->including() ) {
+               # Tags, if any.
+               if( isset( $result->ts_tags ) ) {
                        list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
                        $classes = array_merge( $classes, $newClasses );
                } else {
@@ -530,7 +530,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                $fields = array(
                        'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text',
                        'rc_comment', 'rc_timestamp', 'rc_patrolled','rc_id', 'rc_deleted',
-                       'length' => 'page_len', 'rev_id' => 'page_latest', 'ts_tags', 'rc_this_oldid',
+                       'length' => 'page_len', 'rev_id' => 'page_latest', 'rc_this_oldid',
                        'page_namespace', 'page_title'
                );
                $join_conds = array( 'page' => array( 'INNER JOIN', 'page_id=rc_cur_id' ) );
@@ -546,13 +546,10 @@ class NewPagesPager extends ReverseChronologicalPager {
                        'join_conds' => $join_conds
                );
 
-               // Empty array for fields, it'll be set by us anyway.
-               $fields = array();
-
                // Modify query for tags
                ChangeTags::modifyDisplayQuery(
                        $info['tables'],
-                       $fields,
+                       $info['fields'],
                        $info['conds'],
                        $info['join_conds'],
                        $info['options'],
index ec8f93b..2bd8b0a 100644 (file)
@@ -396,14 +396,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $fields[] = 'page_latest';
                        $join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
                }
-               if ( !$this->including() ) {
-                       // Tag stuff.
-                       // Doesn't work when transcluding. See bug 23293
-                       ChangeTags::modifyDisplayQuery(
-                               $tables, $fields, $conds, $join_conds, $query_options,
-                               $opts['tagfilter']
-                       );
-               }
+               // Tag stuff.
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $query_options,
+                       $opts['tagfilter']
+               );
 
                if ( !wfRunHooks( 'SpecialRecentChangesQuery',
                        array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) ) )
index 9010e10..862736d 100644 (file)
@@ -110,10 +110,14 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        $join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
                        $select[] = 'page_latest';
                }
-               if ( !$this->including() ) { // bug 23293
-                       ChangeTags::modifyDisplayQuery( $tables, $select, $conds, $join_conds,
-                               $query_options, $opts['tagfilter'] );
-               }
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $select,
+                       $conds,
+                       $join_conds,
+                       $query_options,
+                       $opts['tagfilter']
+               );
 
                if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) ) {
                        return false;
index b22c144..98727f1 100644 (file)
@@ -169,9 +169,10 @@ class UsercreateTemplate extends QuickTemplate {
                        <td></td>
                        <td class="mw-input">
                                <?php
-                               global $wgCookieExpiration, $wgLang;
+                               global $wgCookieExpiration;
+                               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
                                echo Xml::checkLabel(
-                                       wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+                                       wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
                                        'wpRemember',
                                        'wpRemember',
                                        $this->data['remember'],
index 5a2c633..a3f6a38 100644 (file)
@@ -108,9 +108,10 @@ class UserloginTemplate extends QuickTemplate {
                        <td></td>
                        <td class="mw-input">
                                <?php
-                               global $wgCookieExpiration, $wgLang;
+                               global $wgCookieExpiration;
+                               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
                                echo Xml::checkLabel(
-                                       wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+                                       wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
                                        'wpRemember',
                                        'wpRemember',
                                        $this->data['remember'],
@@ -126,7 +127,7 @@ class UserloginTemplate extends QuickTemplate {
                        <td class="mw-input">
                        <?php
                        echo Xml::checkLabel(
-                               wfMsg( 'securelogin-stick-https' ),
+                               wfMessage( 'securelogin-stick-https' )->text(),
                                'wpStickHTTPS',
                                'wpStickHTTPS',
                                $this->data['stickHTTPS'],
@@ -140,7 +141,7 @@ class UserloginTemplate extends QuickTemplate {
                        <td></td>
                        <td class="mw-submit">
                                <?php
-               echo Html::input( 'wpLoginAttempt', wfMsg( 'login' ), 'submit', array(
+               echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
                        'id' => 'wpLoginAttempt',
                        'tabindex' => '9'
                ) );
@@ -153,10 +154,14 @@ class UserloginTemplate extends QuickTemplate {
                                );
                        } elseif( $this->data['resetlink'] === null ) {
                                echo '&#160;';
-                               echo Html::input( 'wpMailmypassword', wfMsg( 'mailmypassword' ), 'submit', array(
-                                       'id' => 'wpMailmypassword',
-                                       'tabindex' => '10'
-                               ) );
+                               echo Html::input(
+                                       'wpMailmypassword',
+                                       wfMessage( 'mailmypassword' )->text(),
+                                       'submit', array(
+                                               'id' => 'wpMailmypassword',
+                                               'tabindex' => '10'
+                                       )
+                               );
                        }
                } ?>
 
index 6ef3be2..d40b53d 100644 (file)
@@ -1227,7 +1227,7 @@ abstract class UploadBase {
 
                        if ( $wgAntivirusRequired ) {
                                wfProfileOut( __METHOD__ );
-                               return wfMsg( 'virus-scanfailed', array( $exitCode ) );
+                               return wfMessage( 'virus-scanfailed', array( $exitCode ) )->text();
                        } else {
                                wfProfileOut( __METHOD__ );
                                return null;
index 06f4073..ae66d7c 100644 (file)
@@ -3032,10 +3032,7 @@ class Language {
         */
        function commaList( array $list ) {
                return implode(
-                       wfMsgExt(
-                               'comma-separator',
-                               array( 'parsemag', 'escapenoentities', 'language' => $this )
-                       ),
+                       wfMessage( 'comma-separator' )->inLanguage( $this )->escaped(),
                        $list
                );
        }
@@ -3048,10 +3045,7 @@ class Language {
         */
        function semicolonList( array $list ) {
                return implode(
-                       wfMsgExt(
-                               'semicolon-separator',
-                               array( 'parsemag', 'escapenoentities', 'language' => $this )
-                       ),
+                       wfMessage( 'semicolon-separator' )->inLanguage( $this )->escaped(),
                        $list
                );
        }
@@ -3063,10 +3057,7 @@ class Language {
         */
        function pipeList( array $list ) {
                return implode(
-                       wfMsgExt(
-                               'pipe-separator',
-                               array( 'escapenoentities', 'language' => $this )
-                       ),
+                       wfMessage( 'pipe-separator' )->inLanguage( $this )->escaped(),
                        $list
                );
        }
@@ -3091,7 +3082,7 @@ class Language {
        function truncate( $string, $length, $ellipsis = '...', $adjustLength = true ) {
                # Use the localized ellipsis character
                if ( $ellipsis == '...' ) {
-                       $ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
+                       $ellipsis = wfMessage( 'ellipsis' )->inLanguage( $this )->escaped();
                }
                # Check if there is no need to truncate
                if ( $length == 0 ) {
@@ -3189,7 +3180,7 @@ class Language {
        function truncateHtml( $text, $length, $ellipsis = '...' ) {
                # Use the localized ellipsis character
                if ( $ellipsis == '...' ) {
-                       $ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
+                       $ellipsis = wfMessage( 'ellipsis' )->inLanguage( $this )->escaped();
                }
                # Check if there is clearly no need to truncate
                if ( $length <= 0 ) {
@@ -4116,7 +4107,7 @@ class Language {
                $dirmark = ( $oppositedm ? $this->getDirMark( true ) : '' ) .
                        $this->getDirMark();
                $details = $details ? $dirmark . $this->getMessageFromDB( 'word-separator' ) .
-                       wfMsgExt( 'parentheses', array( 'escape', 'replaceafter', 'language' => $this ), $details ) : '';
+                       wfMessage( 'parentheses' )->rawParams( $details )->inLanguage( $this )->escaped() : '';
                return $page . $details;
        }
 
index 0632537..588eb8d 100644 (file)
@@ -1275,7 +1275,7 @@ $2
 
 # "Undo" feature
 'undo-success' => 'يمكن استرجاع التعديل.
-من فضلك تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، وبعد ذلك احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.',
+تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، ثم احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.',
 'undo-failure' => 'لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.',
 'undo-norev' => 'فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.',
 'undo-summary' => 'الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])',
index 494dcf6..1772c3f 100644 (file)
@@ -2513,10 +2513,10 @@ Současné nastavení pro tuto stránku je: '''$1''':",
 'pagesize' => '(bajtů)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'editace',
-'restriction-move' => 'přesunutí',
-'restriction-create' => 'vytvoření',
-'restriction-upload' => 'Nahrávání souborů',
+'restriction-edit' => 'Editace',
+'restriction-move' => 'Přesunutí',
+'restriction-create' => 'Vytvoření',
+'restriction-upload' => 'Načtení souboru',
 
 # Restriction levels
 'restriction-level-sysop' => 'zamčeno',
@@ -3100,7 +3100,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'spam_deleting' => 'Všechny verze obsahovaly odkazy na $1, smazáno',
 
 # Info page
-'pageinfo-title' => 'Informace o "$1"',
+'pageinfo-title' => 'Informace o stránce „$1“',
 'pageinfo-header-basic' => 'Základní údaje',
 'pageinfo-header-edits' => 'Historie editací',
 'pageinfo-header-restrictions' => 'Zámek stránky',
@@ -3110,6 +3110,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-length' => 'Velikost stránky (v bajtech)',
 'pageinfo-article-id' => 'ID stránky',
 'pageinfo-robot-policy' => 'Nastavení pro vyhledávače',
+'pageinfo-robot-index' => 'Indexovatelná',
+'pageinfo-robot-noindex' => 'Neindexovatelná',
 'pageinfo-views' => 'Počet zobrazení',
 'pageinfo-watchers' => 'Počet sledujících',
 'pageinfo-redirects-name' => 'Přesměrování na tuto stránku',
@@ -3121,7 +3123,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-lasttime' => 'Datum nejnovější editace',
 'pageinfo-edits' => 'Celkový počet editací',
 'pageinfo-authors' => 'Celkový počet různých autorů',
-'pageinfo-recent-edits' => 'Počet nedávných editací (za posledních $1)',
+'pageinfo-recent-edits' => 'Počet nedávných ($1) editací',
 'pageinfo-recent-authors' => 'Nedávný počet různých autorů',
 'pageinfo-restriction' => 'Zámek stránky (<code>$1</code>)',
 'pageinfo-magic-words' => '{{PLURAL:$1|Kouzelné slovo|Kouzelná slova}} ($1)',
index c4b107e..9912b1a 100644 (file)
@@ -2144,9 +2144,9 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 
 'disambiguations' => 'Seiten die auf Begriffsklärungsseiten verlinken',
 'disambiguationspage' => 'Template:Begriffsklärung',
-'disambiguations-text' => "Die folgenden Seiten enthalten mindestens einen Link zur einer '''Begriffsklärungsseite'''. Sie sollten möglicherweise auf die eigentlich gemeinte Seite verlinken.
+'disambiguations-text' => "Die folgenden Seiten enthalten mindestens einen Link zur einer '''Begriffsklärungsseite'''. Stattdessen sollten sie möglicherweise auf die eigentlich gemeinte Seite verlinken.
 
-Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf [[MediaWiki:Disambiguationspage]] aufgeführten Vorlagen enthält.",
+Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf der Seite [[MediaWiki:Disambiguationspage|Disambiguationspage]] aufgeführten Vorlagen enthält.",
 
 'doubleredirects' => 'Doppelte Weiterleitungen',
 'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.
@@ -2178,7 +2178,7 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'nviews' => '{{PLURAL:$1|1 Abfrage|$1 Abfragen}}',
 'nimagelinks' => 'Verwendet auf {{PLURAL:$1|einer Seite|$1 Seiten}}',
 'ntransclusions' => 'verwendet auf {{PLURAL:$1|einer Seite|$1 Seiten}}',
-'specialpage-empty' => 'Die Seite enthält aktuell keine Einträge.',
+'specialpage-empty' => 'Es sind aktuell keine zutreffenden Einträge vorhanden.',
 'lonelypages' => 'Verwaiste Seiten',
 'lonelypagestext' => 'Die folgenden Seiten werden nicht eingebunden oder es wird nicht auf sie in {{SITENAME}} verwiesen.',
 'uncategorizedpages' => 'Nicht kategorisierte Seiten',
index 690d312..9718162 100644 (file)
@@ -599,11 +599,11 @@ Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:spe
 # General errors
 'error' => 'Xırab',
 'databaseerror' => 'Xeta serveri',
-'dberrortext' => 'Rêzê vateyê database de xeta bı.
+'dberrortext' => 'Rêzê vateyê malumati de xeta bı.
 No xeta belka software ra yo.
-"<tt>$2</tt>" ra pers kerdışê peyin:
-<blockquote><tt>$1</tt></blockquote>.
-Database yo ke xeta dayo "<tt>$3: $4</tt>".',
+"<blockquote><tt>$1</tt></blockquote>.
+<tt>$2</tt>" ra pers kerdışê peyin:
+Malumatê yo ke xeta dayo "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'Persê rêzê vateyê database de xeta bı.
 Persê databaseyê peyin:
 "$1"
@@ -946,8 +946,9 @@ Kerem ke, tı ke wazenay na pele bafernê/bıvurnê, qontrol ke.',
 'blocked-notice-logextract' => 'No karber/na karbere emanet blokekerdeyo/blokekediya.
 Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo.
-*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,
-*'''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
+*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,
+*'''IE:''' ''Ctrl-F5' piya pıploxnê ke wa newe bo', 
+* '''Operar:'''hacetan ra şı rê →tercihan ra bıvurnen",
 'usercssyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'userjsyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'usercsspreview' => "'''şıma tena verqaydê dosyayê CSS vineni.''' '''Dosyayê Karberi CSS hema qayd nebiyo!'''",
@@ -2053,6 +2054,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayti}}',
 'ncategories' => '$1 {{PLURAL:$1|Kategoriye|Kategoriy}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikiy}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linkî}}',
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
 'nrevisions' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
@@ -2081,6 +2083,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'mostlinkedtemplates' => 'Şablonê ke tewr zafî pela re gıre bîye.',
 'mostcategories' => 'Pelan ke tewr zaf kategorî estê.',
 'mostimages' => 'Dosyayan ke tewr zaf link estê.',
+'mostinterwikis' => 'Pelan ke tewr zaf interwiki biyê.',
 'mostrevisions' => 'Pelan ke tewr zaf revizyonî biyê.',
 'prefixindex' => 'Veroleya peley pêro',
 'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
@@ -2228,6 +2231,8 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'mailnologin' => 'adresa erşawıtışi/ruşnayişi çina.',
 'mailnologintext' => 'qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.',
 'emailuser' => 'Ena karberi rê mesac bırse',
+'emailuser-title-target' => 'Na E-postaya {{GENDER:$1|karberi}}ya',
+'emailuser-title-notarget' => 'E-postaya karberi',
 'emailpage' => 'karberi re e-mail bışaw',
 'emailpagetext' => 'no/na karberi re e-posta erşawıtışi de şıma pê forma cêrıni eşkeni kar bıkerî.
 [[Special:Preferences|tercihanê şıma ye karberi]] de adresa e-posta ya ke şıma dayo, na adres qısmê adresa e-postayi de "From (kam ra)" asena, no sebebi ra gırewtox/e eşkeno/a direk cewab bıdo şıma.',
@@ -3025,11 +3030,34 @@ Tı eşkeno yew sebeb bınus.',
 
 # Info page
 'pageinfo-title' => 'Heq tê "$1"\'i',
-'pageinfo-header-edits' => 'Vurnayışi',
+'pageinfo-header-basic' => 'Seron zanayış',
+'pageinfo-header-edits' => 'Vurnayışi verêni',
+'pageinfo-header-restrictions' => 'Xısusiyetê pela',
+'pageinfo-header-properties' => 'Xısusiyetê pela',
+'pageinfo-display-title' => 'Asenge sernuşte',
+'pageinfo-default-sort' => 'Hesıbyaye mırfeyo kılm',
+'pageinfo-length' => 'Derdeya pela (bayti heta)',
+'pageinfo-article-id' => 'Nımrey pela',
+'pageinfo-robot-policy' => 'Weziyetê motor de cıgeyrayışi',
+'pageinfo-robot-index' => 'İIndeksbiyayen',
+'pageinfo-robot-noindex' => 'İndeksnêbiyayen',
 'pageinfo-views' => 'Amarina mocnayışan',
-'pageinfo-watchers' => 'Amariya serykeran',
-'pageinfo-edits' => 'Amarina vurnayışan',
-'pageinfo-authors' => 'Amarina nuştekaran',
+'pageinfo-watchers' => 'Amariya pela serykeran',
+'pageinfo-redirects-name' => 'Hetenayışê na pela',
+'pageinfo-subpages-name' => 'Bınpelê na pela',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|hetenayış|hetenayışi}}; $3 {{PLURAL:$3|raykerdışt|raykerdışi}})',
+'pageinfo-firstuser' => 'Pela vıraşter',
+'pageinfo-firsttime' => 'Demê pela vıraştışi',
+'pageinfo-lastuser' => 'Vurnayeno peyên',
+'pageinfo-lasttime' => 'Deme u vurnayışo peyên',
+'pageinfo-edits' => 'Amarina vurnayışan pêro',
+'pageinfo-authors' => 'Amarina nuştekaran pêro',
+'pageinfo-recent-edits' => 'Amariya vurnayışan ($1 ra nata)',
+'pageinfo-recent-authors' => 'Amarina nuştekaran pêro',
+'pageinfo-restriction' => 'Xısusiyetê pela da  (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
+'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
 
 # Skin names
 'skinname-standard' => 'Klasik',
index b587492..a5e8d74 100644 (file)
@@ -2857,6 +2857,8 @@ W zespominanju dajo se pśicyna pódaś.',
 'pageinfo-length' => 'Dłujkosć boka (w bajtach)',
 'pageinfo-article-id' => 'ID boka',
 'pageinfo-robot-policy' => 'Status pytawy',
+'pageinfo-robot-index' => 'Indeksěrujobny',
+'pageinfo-robot-noindex' => 'Njeindeksěrujobny',
 'pageinfo-views' => 'Licba zwobraznjenjow',
 'pageinfo-watchers' => 'Licba  wobglědowarjow boka',
 'pageinfo-redirects-name' => 'Dalejpósrědnjenja k toś tomu bokoju',
index 31eb8f1..0828bbe 100644 (file)
@@ -282,6 +282,7 @@ $magicWords = array(
        'img_text_bottom'         => array( 1,    'text-bottom' ),
        'img_link'                => array( 1,    'link=$1' ),
        'img_alt'                 => array( 1,    'alt=$1' ),
+       'img_class'               => array( 1,    'class=$1' ),
        'int'                     => array( 0,    'INT:' ),
        'sitename'                => array( 1,    'SITENAME' ),
        'ns'                      => array( 0,    'NS:' ),
@@ -2458,6 +2459,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'shared-repo'                       => 'a shared repository',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons', # only translate this message to other languages if you have to change it
 'filepage.css'                      => '/* CSS placed here is included on the file description page, also included on foreign client wikis */', # only translate this message to other languages if you have to change it
+'upload-disallowed-here'            => 'Unfortunately you cannot overwrite this image.',
 
 # File reversion
 'filerevert'                => 'Revert $1',
@@ -3818,6 +3820,7 @@ By executing it, your system may be compromised.",
 'file-info-size-pages'   => '$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}',
 'file-nohires'           => 'No higher resolution available.',
 'svg-long-desc'          => 'SVG file, nominally $1 × $2 pixels, file size: $3',
+'svg-long-desc-animated' => 'Animated SVG file, nominally $1 × $2 pixels, file size: $3',
 'show-big-image'         => 'Full resolution',
 'show-big-image-preview' => 'Size of this preview: $1.',
 'show-big-image-other'   => 'Other {{PLURAL:$2|resolution|resolutions}}: $1.',
@@ -3827,6 +3830,8 @@ By executing it, your system may be compromised.",
 'file-info-png-looped'   => 'looped',
 'file-info-png-repeat'   => 'played $1 {{PLURAL:$1|time|times}}',
 'file-info-png-frames'   => '$1 {{PLURAL:$1|frame|frames}}',
+'file-no-thumb-animation'=> '\'\'\'Note: Due to technical limitations, thumbnails of this file will not be animated.\'\'\'',
+'file-no-thumb-animation-gif' => '\'\'\'Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.\'\'\'',
 
 # Special:NewFiles
 'newimages'             => 'Gallery of new files',
index 6aed22c..a8e8a24 100644 (file)
@@ -3145,6 +3145,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-length' => 'Longitud de la página (en bytes)',
 'pageinfo-article-id' => 'Identificador ID de la página',
 'pageinfo-robot-policy' => 'Estado del motor de búsqueda',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'No indexable',
 'pageinfo-views' => 'Número de vistas',
 'pageinfo-watchers' => 'Número de usuarios que vigilan la página',
 'pageinfo-redirects-name' => 'Redirecciones a esta página',
index f32d056..b201e0f 100644 (file)
@@ -610,9 +610,9 @@ Käibel olevad erileheküljed on loetletud leheküljel [[Special:SpecialPages|{{
 'dberrortext' => 'Andmebaasipäringus oli süntaksiviga.
 Selle võis tingida tarkvaraviga.
 Viimane andmebaasipäring oli:
-<blockquote><tt>$1</tt></blockquote>
-ja see kutsuti funktsioonist "<tt>$2</tt>".
-Andmebaas tagastas veateate "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+ja see ilmnes funktsiooniga "<code>$2</code>".
+Andmebaas tagastas veateate "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Andmebaasipäringus oli süntaksiviga.
 Viimane andmebaasipäring oli:
 "$1"
@@ -954,7 +954,6 @@ Allpool on toodud viimane blokeerimislogi sissekanne:',
 * '''Firefox / Safari:''' Hoia all ''Shift''-klahvi ja klõpsa ''Laadi uuesti'' või vajuta kas ''Ctrl-F5'' või ''Ctrl-R'' (Macis ''⌘-R'').
 * '''Google Chrome:''' Vajuta ''Ctrl-Shift-R'' (Macis ''⌘-Shift-R'').
 * '''Internet Explorer:''' Hoia all ''Ctrl''-klahvi ja klõpsa ''Värskenda'' või vajuta ''Ctrl-F5''.
-* '''Konqueror:''' Klõpsa ''Reload'' või vajuta ''F5''.
 * '''Opera:''' Tühjenda puhver asukohas ''Seaded → Eelistused''.",
 'usercssyoucanpreview' => "'''Vihje:''' Enne salvestamist kasuta oma uue CSSi proovimiseks nuppu \"{{int:showpreview}}\".",
 'userjsyoucanpreview' => "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".",
@@ -3031,6 +3030,8 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'pageinfo-length' => 'Lehekülje pikkus (baitides)',
 'pageinfo-article-id' => 'Lehekülje identifikaator',
 'pageinfo-robot-policy' => 'Otsimootori olek',
+'pageinfo-robot-index' => 'Indekseeritav',
+'pageinfo-robot-noindex' => 'Indekseerimatu',
 'pageinfo-views' => 'Vaatamiste arv',
 'pageinfo-watchers' => 'Lehekülje jälgijate arv',
 'pageinfo-redirects-name' => 'Ümbersuunamisi sellele leheküljele',
@@ -3044,9 +3045,9 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'pageinfo-authors' => 'Erinevate autorite koguarv',
 'pageinfo-recent-edits' => 'Viimaste redigeerimiste arv (viimase $1 jooksul)',
 'pageinfo-recent-authors' => 'Erinevate viimaste toimetajate arv',
-'pageinfo-restriction' => 'Lehekülje kaitse ($1)',
-'pageinfo-magic-words' => 'Võlusõnad ($1)',
-'pageinfo-hidden-categories' => 'Peidetud kategooriad ($1)',
+'pageinfo-restriction' => 'Lehekülje kaitse (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Võlusõna|Võlusõnad}} ($1)',
+'pageinfo-hidden-categories' => 'Peidetud {{PLURAL:$1|kategooria|kategooriad}} ($1)',
 'pageinfo-templates' => 'Kasutatud {{PLURAL:$1|mall|mallid}} ($1)',
 
 # Skin names
index 5fae770..f8398e3 100644 (file)
@@ -2681,7 +2681,7 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 'ipbreason-dropdown' => '* Motifs de blocage les plus fréquents
 ** Insertion de fausses informations
 ** Suppression injustifiée de contenu des pages
-** Insertion répétée de liens externes publicitaires (spam)
+** Insertion répétée de liens externes publicitaires (pollupostage)
 ** Insertion de contenu sans aucun sens et de déchets dans les pages
 ** Tentative d’intimidation ou harcèlement
 ** Abus d’utilisation de comptes multiples
@@ -3164,6 +3164,8 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'pageinfo-length' => 'Taille de la page (en octets)',
 'pageinfo-article-id' => 'Numéro de la page',
 'pageinfo-robot-policy' => 'Statut de moteur de recherche',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'Non indexable',
 'pageinfo-views' => 'Nombre de vues',
 'pageinfo-watchers' => 'Nombre de contributeurs ayant la page dans leur liste de suivi',
 'pageinfo-redirects-name' => 'Redirections vers cette page',
@@ -3177,9 +3179,9 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'pageinfo-authors' => "Nombre total d'auteurs distincts",
 'pageinfo-recent-edits' => 'Nombre de modifications récentes (dans les derniers $1)',
 'pageinfo-recent-authors' => "Nombre d'auteurs distincts récents",
-'pageinfo-restriction' => 'Protection de la page ($1)',
-'pageinfo-magic-words' => 'Mots magiques ($1)',
-'pageinfo-hidden-categories' => 'Catégories cachées ($1)',
+'pageinfo-restriction' => 'Protection de la page (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Mot magique|Mots magiques}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)',
 
 # Skin names
index 65f531c..4fdf6de 100644 (file)
@@ -3057,6 +3057,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-length' => 'Lonxitude da páxina (en bytes)',
 'pageinfo-article-id' => 'ID da páxina',
 'pageinfo-robot-policy' => 'Estado do motor de procuras',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'Non indexable',
 'pageinfo-views' => 'Número de visitas',
 'pageinfo-watchers' => 'Número de vixiantes da páxina',
 'pageinfo-redirects-name' => 'Redireccións cara a esta páxina',
index 10fb729..bf7f73c 100644 (file)
@@ -675,7 +675,7 @@ $1',
 'databaseerror' => 'שגיאת בסיס נתונים',
 'dberrortext' => 'אירעה שגיאת תחביר בשאילתה לבסיס הנתונים.
 שגיאה זו עלולה להעיד על באג בתוכנה.
\94ש×\90×\99×\9cת×\94 ×\94×\90×\97ר×\95× ×\94 ×\9c×\91ס×\99ס ×\94נת×\95× ×\99×\9d ×©×\94ת×\9b×\95נה ניסתה להריץ הייתה:
\94ש×\90×\99×\9cת×\94 ×\94×\90×\97ר×\95× ×\94 ×\9c×\91ס×\99ס ×\94נת×\95× ×\99×\9d ×©×\94ת×\95×\9bנה ניסתה להריץ הייתה:
 <blockquote lang="en" dir="ltr"><code>$1</code></blockquote>
 מתוך הפונקציה "<code lang="en" dir="ltr">$2</code>".
 בסיס הנתונים החזיר את השגיאה הבאה: "<samp lang="en" dir="ltr">$3: $4</samp>".',
@@ -2288,7 +2288,7 @@ $1',
 'linksearch-ok' => 'חיפוש',
 'linksearch-text' => 'ניתן להשתמש בתווים כלליים, לדוגמה <span dir="ltr">"*.wikipedia.org"</span>.
 נדרשת לפחות סיומת אינטרנט (TLD), למשל <span dir="ltr">"*.org"</span>.<br />
-פרוטוקולים נתמכים: <tt dir="ltr">$1</code> (אין להוסיף אותם בחיפוש).',
+פרוטוקולים נתמכים: <code dir="ltr">$1</code> (אין להוסיף אותם בחיפוש).',
 'linksearch-line' => '$1 מקושר מהדף $2',
 'linksearch-error' => 'תווים כלליים יכולים להופיע רק בתחילת שם השרת.',
 
@@ -2334,7 +2334,7 @@ $1',
 'mailnologin' => 'אין כתובת לשליחה',
 'mailnologintext' => 'עליכם [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר לעצמכם כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] שלכם כדי לשלוח דואר למשתמש אחר.',
 'emailuser' => 'שליחת דואר אלקטרוני למשתמש זה',
-'emailuser-title-target' => 'ש×\9c×\99×\97ת ×\93×\95×\90\9c {{GENDER:$1|×\9c×\9eשת×\9eש ×\94×\96×\94\9c×\9eשת×\9eשת ×\94×\96×\90ת}}',
+'emailuser-title-target' => 'ש×\9c×\99×\97ת ×\93×\95×\90\9c {{GENDER:$1|×\9c×\9eשת×\9eש ×\96×\94\9c×\9eשת×\9eשת ×\96×\95}}',
 'emailuser-title-notarget' => 'שליחת דוא"ל למשתמש',
 'emailpage' => 'שליחת דואר למשתמש',
 'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני למשתמש זה.
@@ -3166,29 +3166,31 @@ $1',
 'pageinfo-header-basic' => 'מידע בסיסי',
 'pageinfo-header-edits' => 'היסטוריית עריכות',
 'pageinfo-header-restrictions' => 'הגנה על הדף',
-'pageinfo-header-properties' => 'מאפייני דף',
-'pageinfo-display-title' => '×\94×\9b×\95תרת ×\94×\9e×\95צ×\92ת',
-'pageinfo-default-sort' => '×\9eפת×\97 ×\9e×\99×\95×\9f רגיל',
+'pageinfo-header-properties' => '×\9e×\90פ×\99×\99× ×\99 ×\94×\93×£',
+'pageinfo-display-title' => '×\9b×\95תרת ×\94תצ×\95×\92×\94',
+'pageinfo-default-sort' => '×\9eפת×\97 ×\94×\9e×\99×\95×\9f ×\94רגיל',
 'pageinfo-length' => 'אורך הדף (בבתים)',
-'pageinfo-article-id' => 'מזהה דף',
+'pageinfo-article-id' => '×\9e×\96×\94×\94 ×\94×\93×£',
 'pageinfo-robot-policy' => 'מצב מנוע חיפוש',
-'pageinfo-views' => 'מספר צפיות',
+'pageinfo-robot-index' => 'יכול להיאסף למפתחות חיפוש',
+'pageinfo-robot-noindex' => 'לא יכול להיאסף למפתחות חיפוש',
+'pageinfo-views' => 'מספר הצפיות',
 'pageinfo-watchers' => 'מספר העוקבים אחר הדף',
-'pageinfo-redirects-name' => '×\94פנ×\99×\95ת ×\9c×\93×£ ×\94×\96×\94',
-'pageinfo-subpages-name' => 'דפי־משנה',
+'pageinfo-redirects-name' => 'הפניות לדף זה',
+'pageinfo-subpages-name' => 'דפי־משנה של דף זה',
 'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|הפניה אחת|$2 הפניות}}; {{PLURAL:$3|דף רגיל אחד|$3 דפים רגילים}})',
 'pageinfo-firstuser' => 'יוצר הדף',
 'pageinfo-firsttime' => 'תאריך יצירת הדף',
 'pageinfo-lastuser' => 'העורך האחרון',
 'pageinfo-lasttime' => 'תאריך העריכה האחרונה',
-'pageinfo-edits' => 'מספר העריכות',
-'pageinfo-authors' => '×\9b×\95ת×\91×\99×\9d ×\99×\99×\97×\95×\93×\99ים',
+'pageinfo-edits' => 'מספר העריכות הכולל',
+'pageinfo-authors' => '×\94×\9eספר ×\94×\9b×\95×\9c×\9c ×©×\9c ×\9b×\95ת×\91×\99×\9d ×©×\95× ים',
 'pageinfo-recent-edits' => 'מספר העריכות לאחרונה ($1)',
 'pageinfo-recent-authors' => 'מספר הכותבים הייחודיים לאחרונה',
-'pageinfo-restriction' => 'הגנה על דף (<code>$1</code>)',
-'pageinfo-magic-words' => '{{PLURAL:$1|מילת קסם|מילות קסם ($1)}}',
-'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות ($1)}}',
-'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות ($1)}}',
+'pageinfo-restriction' => '×\94×\92× ×\94 ×¢×\9c ×\94×\93×£ (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|מילת קסם|מילות קסם}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות}} ($1)',
 
 # Skin names
 'skinname-standard' => 'קלאסי',
index c907cc0..7707dd4 100644 (file)
@@ -2853,6 +2853,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'pageinfo-length' => 'Dołhosć strony (w bajtach)',
 'pageinfo-article-id' => 'ID strony',
 'pageinfo-robot-policy' => 'Status pytawy',
+'pageinfo-robot-index' => 'Indeksujomny',
+'pageinfo-robot-noindex' => 'Njeindeksujomny',
 'pageinfo-views' => 'Ličba zwobraznjenjow',
 'pageinfo-watchers' => 'Ličba wobkedźbowarjow strony',
 'pageinfo-redirects-name' => 'Dalesposrědkowanja k tutej stronje',
index 07ea8f7..a33ba68 100644 (file)
@@ -3007,6 +3007,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-length' => 'Dimension del pagina (in bytes)',
 'pageinfo-article-id' => 'ID del pagina',
 'pageinfo-robot-policy' => 'Stato del motor de recerca',
+'pageinfo-robot-index' => 'Indexabile',
+'pageinfo-robot-noindex' => 'Non indexabile',
 'pageinfo-views' => 'Numero de visitas',
 'pageinfo-watchers' => 'Numero de observatores del pagina',
 'pageinfo-redirects-name' => 'Redirectiones verso iste pagina',
index 45d6ca6..bcf9fc6 100644 (file)
@@ -2169,9 +2169,9 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 
 'disambiguations' => '曖昧さ回避ページにリンクしているページ',
 'disambiguationspage' => 'Template:曖昧回避',
-'disambiguations-text' => "以下のページには、'''曖昧さ回避ページ'''へのリンクが1個以上あります。
\81\9dã\81®ã\82\88ã\81\86ã\81ªリンクは、より適切なページへのリンクに変更する必要があります。<br />
-[[MediaWiki:Disambiguationspage]]からリンクされたテンプレートを使用しているページが、曖昧さ回避ページと見なされます。",
+'disambiguations-text' => "以下のページには'''曖昧さ回避ページ'''へのリンクが 1 個以上あります。
\81\93ã\82\8cã\82\89ã\81®リンクは、より適切なページへのリンクに変更する必要があります。<br />
+[[MediaWiki:Disambiguationspage]] にリンクがあるテンプレートを使用しているページを、曖昧さ回避ページと見なします。",
 
 'doubleredirects' => '二重転送',
 'doubleredirectstext' => 'これは他のリダイレクトページへのリダイレクトの一覧です。
@@ -3158,7 +3158,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'tooltip-summary' => '短い要約を入力してください',
 
 # Stylesheets
-'common.css' => '/* ここに書いたCSSはすべての外装に反映されます */',
+'common.css' => '/* ここに記述したCSSはすべての外装に反映されます */',
 'standard.css' => '/* ここに記述したCSSはスタンダード外装の利用者に影響します */',
 'nostalgia.css' => '/* ここに記述したCSSはノスタルジア外装の利用者に影響します */',
 'cologneblue.css' => '/* ここに記述したCSSはケルンブルー外装の利用者に影響します */',
@@ -3188,9 +3188,9 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'modern.js' => '/* ここにあるすべてのJavaScriptは、モダン外装を使用している利用者に対して読み込まれます */',
 'vector.js' => '/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */',
 'group-autoconfirmed.js' => '/* ここにあるすべてのJavaScriptは、自動承認された利用者に対して読み込まれます */',
-'group-bot.js' => '/* ここにあるすべてのJavaScriptは、ボットのみに対して読み込まれます */',
-'group-sysop.js' => '/* ここにあるすべてのJavaScriptは、管理者のみに対して読み込まれます */',
-'group-bureaucrat.js' => '/* ここにあるすべてのJavaScriptは、ビューロクラットのみに対して読み込まれます */',
+'group-bot.js' => '/* ここにあるすべてのJavaScriptは、ボットのみに読み込まれます */',
+'group-sysop.js' => '/* ここにあるすべてのJavaScriptは、管理者のみに読み込まれます */',
+'group-bureaucrat.js' => '/* ここにあるすべてのJavaScriptは、ビューロクラットのみに読み込まれます */',
 
 # Metadata
 'notacceptable' => 'ウィキサーバーは、ご使用中のクライアントが読める形式では情報を提供できません。',
@@ -3226,6 +3226,8 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'pageinfo-default-sort' => '既定のソートキー',
 'pageinfo-length' => 'ページの長さ (バイト単位)',
 'pageinfo-article-id' => 'ページ ID',
+'pageinfo-robot-index' => 'インデックス可能',
+'pageinfo-robot-noindex' => 'インデックス不可',
 'pageinfo-views' => '閲覧回数',
 'pageinfo-watchers' => 'ページをウォッチリストに入れている人数',
 'pageinfo-redirects-name' => 'このページへのリダイレクト',
index a620255..bb46bff 100644 (file)
@@ -3202,6 +3202,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-length' => '문서 길이 (바이트)',
 'pageinfo-article-id' => '문서 ID',
 'pageinfo-robot-policy' => '검색 엔진 통계',
+'pageinfo-robot-index' => '색인 가능',
+'pageinfo-robot-noindex' => '색인 불가능',
 'pageinfo-views' => '읽힌 횟수',
 'pageinfo-watchers' => '문서를 주시하는 사용자 수',
 'pageinfo-redirects-name' => '이 문서로 넘겨주기',
@@ -3216,9 +3218,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-authors' => '총 서로 다른 편집자 수',
 'pageinfo-recent-edits' => '최근 편집 수 (지난 $1일 이내)',
 'pageinfo-recent-authors' => '최근 기여자 수',
-'pageinfo-restriction' => '문서 보호 ($1)',
-'pageinfo-magic-words' => '매직 워드 ($1개)',
-'pageinfo-hidden-categories' => '숨은 분류 ($1개)',
+'pageinfo-restriction' => '문서 보호 (<code>$1</code>)',
+'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
+'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
 'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
 
 # Skin names
index 48a5e96..71c0c04 100644 (file)
@@ -3186,6 +3186,8 @@ $1',
 'pageinfo-length' => 'Должина на страницата (во бајти)',
 'pageinfo-article-id' => 'Назнака на страницата',
 'pageinfo-robot-policy' => 'Статус на прелистувачот',
+'pageinfo-robot-index' => 'Се индексира',
+'pageinfo-robot-noindex' => 'Не се индексира',
 'pageinfo-views' => 'Број на посети',
 'pageinfo-watchers' => 'Број на набљудувачи',
 'pageinfo-redirects-name' => 'Пренасочувања кон страницата',
@@ -3200,9 +3202,9 @@ $1',
 'pageinfo-authors' => 'Број на засебни автори',
 'pageinfo-recent-edits' => 'Број на скорешни уредувања (во последните $1)',
 'pageinfo-recent-authors' => 'Број на скорешни засебни автори',
-'pageinfo-restriction' => 'Заштита на страницата ($1)',
-'pageinfo-magic-words' => 'Волшебни зборови ($1)',
-'pageinfo-hidden-categories' => 'Скриени категории ($1)',
+'pageinfo-restriction' => 'Заштита на страницата (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Волшебен збор|Волшебни зборови}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Скриена категорија|Скриени категории}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Превметнат шаблон|Превметнати шаблони}} ($1)',
 
 # Skin names
index 6a8a941..ec83973 100644 (file)
@@ -2275,6 +2275,8 @@ Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrou
 'mailnologin' => 'Ingen avsenderadresse',
 'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
 'emailuser' => 'E-post til denne brukeren',
+'emailuser-title-target' => 'Send epost til denne {{GENDER:$1|brukeren}}',
+'emailuser-title-notarget' => 'E-post til bruker',
 'emailpage' => 'E-post til bruker',
 'emailpagetext' => 'Du kan bruke skjemaet nedenfor for å sende en e-post til denne brukeren.
 Den e-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil dukke opp i «fra»-feltet på denne e-posten, så mottakeren er i stand til å svare.',
@@ -3078,11 +3080,34 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 
 # Info page
 'pageinfo-title' => 'Informasjon om «$1»',
-'pageinfo-header-edits' => 'Redigeringer',
+'pageinfo-header-basic' => 'Grunnleggende informasjon',
+'pageinfo-header-edits' => 'Redigeringshistorikk',
+'pageinfo-header-restrictions' => 'Sidebeskyttelse',
+'pageinfo-header-properties' => 'Sideegenskaper',
+'pageinfo-display-title' => 'Visningstittel',
+'pageinfo-default-sort' => 'Standardsorteringsnøkkel',
+'pageinfo-length' => 'Sidelengde (i bytes)',
+'pageinfo-article-id' => 'Side-ID',
+'pageinfo-robot-policy' => 'Søkemotorstatus',
+'pageinfo-robot-index' => 'Indekserbar',
+'pageinfo-robot-noindex' => 'Ikke indekserbar',
 'pageinfo-views' => 'Antall visninger',
-'pageinfo-watchers' => 'Antall overvåkere',
-'pageinfo-edits' => 'Antall redigeringer',
-'pageinfo-authors' => 'Antall forskjellige forfattere',
+'pageinfo-watchers' => 'Antall overvåkere av siden',
+'pageinfo-redirects-name' => 'Omdirigeringer til siden',
+'pageinfo-subpages-name' => 'Undersider av siden',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|ikke-omdirigering|ikke-omdirigeringer}})',
+'pageinfo-firstuser' => 'Sideoppretter',
+'pageinfo-firsttime' => 'Dato for opprettelse av siden',
+'pageinfo-lastuser' => 'Siste forfatter',
+'pageinfo-lasttime' => 'Dato for siste redigering',
+'pageinfo-edits' => 'Totalt antall redigeringer',
+'pageinfo-authors' => 'Totalt antall forskjellige forfattere',
+'pageinfo-recent-edits' => 'Antall nylige redigeringer (innen siste $1)',
+'pageinfo-recent-authors' => 'Antall nylige forfattere',
+'pageinfo-restriction' => 'Sidebeskyttelse (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
+'pageinfo-templates' => 'Transkludert {{PLURAL:$1|mal|maler}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Standard',
index dff5001..08d9d37 100644 (file)
@@ -3227,6 +3227,8 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'pageinfo-length' => 'Paginalengte (in bytes)',
 'pageinfo-article-id' => 'Paginanummer',
 'pageinfo-robot-policy' => 'Status voor de zoekmachine',
+'pageinfo-robot-index' => 'Indexeerbaar',
+'pageinfo-robot-noindex' => 'Niet indexeerbaar',
 'pageinfo-views' => 'Aantal weergaven',
 'pageinfo-watchers' => 'Aantal paginavolgers',
 'pageinfo-redirects-name' => 'Doorverwijzingen naar deze pagina',
index c079c6c..c41342f 100644 (file)
@@ -2593,9 +2593,9 @@ I desse falla lyt du flytte eller flette saman sida manuelt.",
 'movereason' => 'Årsak:',
 'revertmove' => 'flytt attende',
 'delete_and_move' => 'Slett og flytt',
-'delete_and_move_text' => '== Sletting påkrevd ==
+'delete_and_move_text' => '== Sletting påkravd ==
 
-Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flytting?',
+Målsida «[[:$1]]» finst alt. Vil du sletta henne for å gjeva rom for flytting?',
 'delete_and_move_confirm' => 'Ja, slett sida',
 'delete_and_move_reason' => 'Sletta for å gje rom for flytting frå «[[$1]]»',
 'selfmove' => 'Kjelde- og måltitlane er like; kan ikkje flytte sida over seg sjølv.',
index ed9dac2..fd6dbce 100644 (file)
@@ -2095,6 +2095,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajty|bajtów}}',
 'ncategories' => '$1 {{PLURAL:$1|kategoria|kategorie|kategorii}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwiki|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linki|linków}}',
 'nmembers' => '$1 {{PLURAL:$1|element|elementy|elementów}}',
 'nrevisions' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
@@ -3103,10 +3104,13 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-length' => 'Długość strony (w bajtach)',
 'pageinfo-article-id' => 'Identyfikator strony',
 'pageinfo-robot-policy' => 'Stan wyszukiwarki',
+'pageinfo-robot-index' => 'Indeksowalne',
+'pageinfo-robot-noindex' => 'Nieindeksowalne',
 'pageinfo-views' => 'Odsłon',
 'pageinfo-watchers' => 'Liczba obserwujących',
 'pageinfo-redirects-name' => 'Liczba przekierowań do tej strony',
 'pageinfo-subpages-name' => 'Liczba podstron tej strony',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|przekierowanie|przekierowania|przekierowań}}; $3 {{PLURAL:$3|bez przekierowania|bez przekierowań|bez przekierowań}})',
 'pageinfo-firstuser' => 'Twórca strony',
 'pageinfo-firsttime' => 'Data utworzenia strony',
 'pageinfo-lastuser' => 'Autor ostatniej edycji',
@@ -3115,9 +3119,9 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-authors' => 'Całkowita liczba autorów',
 'pageinfo-recent-edits' => 'Liczba ostatnich edycji (w przeciągu $1)',
 'pageinfo-recent-authors' => 'Liczba ostatnich autorów',
-'pageinfo-restriction' => 'Zabezpieczenie strony ($1)',
-'pageinfo-magic-words' => 'Magiczne słowa ($1)',
-'pageinfo-hidden-categories' => 'Ukryte kategorie ( $1 )',
+'pageinfo-restriction' => 'Zabezpieczenie strony (<code>$1</code>)',
+'pageinfo-magic-words' => 'Magiczne {{PLURAL:$1|słowo|słowa|słowa}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie|Ukryte kategorie}} ($1)',
 'pageinfo-templates' => 'Transkludowan{{PLURAL:$1|y szablon|e szablony}} ($1)',
 
 # Skin names
index 9a9d602..9cb8296 100644 (file)
@@ -2649,7 +2649,7 @@ Tute j'amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/im
 'import-interwiki-templates' => 'Anserì tùit jë stamp',
 'import-interwiki-submit' => 'Amporté',
 'import-interwiki-namespace' => 'Spassi nominal ëd destinassion:',
-'import-interwiki-rootpage' => 'Pagina prinsipal ëd destinassion (opsional):',
+'import-interwiki-rootpage' => 'Pàgina prinsipal ëd destinassion (opsional):',
 'import-upload-filename' => "Nòm ëd l'archivi:",
 'import-comment' => 'Oget:',
 'importtext' => "Për piasì, che as espòrta l'archivi da 'nt la sorgiss wiki ën dovrand l'[[Special:Export|utiss d'esportassion]]. 
@@ -2684,8 +2684,8 @@ Për piasì, ch'a preuva torna.",
 'import-error-special' => "La pàgina «$1» a l'é pa amportà përchè a ponta a në spassi nominal ch'a përmët pa dle pàgine.",
 'import-error-invalid' => "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é pa bon.",
 'import-options-wrong' => '{{PLURAL:$2|Opsion|Opsion}} sbalià: <nowiki>$1</nowiki>',
-'import-rootpage-invalid' => "La pagina prinsipal dàita a l'é un tìtol pa bon.",
-'import-rootpage-nosubpage' => 'Lë spassi nominal "$1" ëd la pagina prinsipal a përmëtt pa dle sotpagine.',
+'import-rootpage-invalid' => "La pàgina prinsipal dàita a l'é un tìtol pa bon.",
+'import-rootpage-nosubpage' => 'Lë spassi nominal «$1» ëd la pàgina prinsipal a përmët pa dle sot-pagine.',
 
 # Import log
 'importlogpage' => "Registr dj'amportassion",
@@ -2726,8 +2726,8 @@ A peul visualisene la sorgiss",
 'tooltip-ca-protect' => 'Protege costa pàgina',
 'tooltip-ca-unprotect' => 'Cangé la protession ëd costa pàgina-sì',
 'tooltip-ca-delete' => 'Scancelé sta pàgina-sì',
-'tooltip-ca-undelete' => 'Pijé andré le modìfiche faite a sta pàgina-sì, anans che a fussa scancelà.',
-'tooltip-ca-move' => 'Tramudé sta pàgina, visadì cangeje tìtol.',
+'tooltip-ca-undelete' => 'Pijé andré le modìfiche fàite a sta pàgina-sì, anans che a fussa scancelà.',
+'tooltip-ca-move' => "Tramudé sta pàgina, visadì cangeje 'd tìtol.",
 'tooltip-ca-watch' => 'Gionté sta pàgina-sì a la lista dle ròbe che as ten-o sot euj.',
 'tooltip-ca-unwatch' => 'Gavé via sta pàgina da',
 'tooltip-search' => 'Sërca an {{SITENAME}}',
@@ -2821,6 +2821,8 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-length' => 'Lunghëssa ëd pagina (an byte)',
 'pageinfo-article-id' => 'Identificativ ëd la pàgina',
 'pageinfo-robot-policy' => "Stat dël motor d'arserca",
+'pageinfo-robot-index' => 'Andicisàbil',
+'pageinfo-robot-noindex' => 'Pa andicisàbil',
 'pageinfo-views' => 'Nùmer ëd vìsite',
 'pageinfo-watchers' => "Vàire ch'a ten-o sot-euj la pàgina",
 'pageinfo-redirects-name' => 'Rediression a sta pagina-sì',
@@ -2834,9 +2836,9 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-authors' => "Nùmer d'autor diferent",
 'pageinfo-recent-edits' => "Nùmer ëd modìfiche recente (an drinta a j'ùltim $1)",
 'pageinfo-recent-authors' => "Nùmer recent d'autor diferent",
-'pageinfo-restriction' => 'Protession ëd pagina ($1)',
-'pageinfo-magic-words' => 'Paròle màgiche ($1)',
-'pageinfo-hidden-categories' => 'Categorìe stërmà ($1)',
+'pageinfo-restriction' => 'Protession ëd pagina (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Paròla màgic|Paròle màgiche}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
 'pageinfo-templates' => 'Trascludù {{PLURAL:$1|stamp|stamp}} ($1)',
 
 # Patrolling
index 45c2a8c..fc753a0 100644 (file)
@@ -2219,6 +2219,7 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
 * {{msg-mw|sharedupload}}, {{msg-mw|sharedupload-desc-here}}, {{msg-mw|sharedupload-desc-there}}',
 'shared-repo-name-wikimediacommons' => '{{optional}}',
 'filepage.css' => '{{Optional}}',
+'upload-disallowed-here'            => 'This message appears on an image page in place of the normal reupload link if they cannot upload - e.g. if the image page is upload protected and they do not have the right priviledge.',
 
 # File reversion
 'filerevert' => '{{Identical|Revert}}',
@@ -3544,6 +3545,7 @@ Parameters:
 * $5 is the total number of pages in the document.',
 'file-nohires' => 'File info displayed on file description page. For example of message in use see [[:File:Mouse10.gif]].',
 'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:File:Yes check.svg]].',
+'svg-long-desc-animated' => 'Displayed under an SVG image at the image description page if the image is animated. Non-animated images use {{msg-mw|svg-long-desc}}. $1 is width, $2 is height, and $3 is file size, including unit (for example "10 KB").',
 'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
 'show-big-image-size' => '
 Parameters:
@@ -3558,6 +3560,8 @@ Parameters:
 The variable $1 is the number of individual frames in an animated gif file.
 
 For example of message in use see [[:File:Mouse10.gif]].',
+'file-no-thumb-animation' => 'We cannot animate thumbnails of this file. This notice is shown on the image description page on animated svg files just below {{msg-mw|file-info-size}}. This message may be overridden by a more specific message of the form file-no-thumb-animation-&lt;extension&gt; like {{msg-mw|file-no-thumb-animation-gif}}',
+'file-no-thumb-animation-gif' => 'Cannot animate thumbnails of this gif file, because it has to big a resolution. The cut off resolution can vary between wikis ([[mw:manual:$wgMaxAnimatedGifArea|$wgMaxAnimatedGifArea]]). Note that resolution is calculated as width times height times number of frames. See {{msg-mw|file-no-thumb-animation}}.',
 
 # Special:NewFiles
 'newimages' => 'Page title of [[Special:NewImages]].',
index a926bd8..20e66cf 100644 (file)
@@ -3096,6 +3096,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-length' => 'Lungimea paginii (în octeți)',
 'pageinfo-article-id' => 'ID pagină',
 'pageinfo-robot-policy' => 'Statut pentru motorul de căutare',
+'pageinfo-robot-index' => 'Indexabilă',
+'pageinfo-robot-noindex' => 'Neindexabilă',
 'pageinfo-views' => 'Număr de vizualizări',
 'pageinfo-watchers' => 'Număr de utilizatori care urmăresc pagina',
 'pageinfo-redirects-name' => 'Redirecționări către această pagină',
@@ -3109,9 +3111,9 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-authors' => 'Număr total de autori distincți',
 'pageinfo-recent-edits' => 'Număr de modificări recente (în ultima perioadă de $1)',
 'pageinfo-recent-authors' => 'Număr de autori distincți recenți',
-'pageinfo-restriction' => 'Protecție pagină ($1)',
-'pageinfo-magic-words' => 'Cuvinte magice ($1)',
-'pageinfo-hidden-categories' => 'Categorii ascunse ($1)',
+'pageinfo-restriction' => 'Protecție pagină (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Cuvânt magic|Cuvinte magice}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Format inclus|Formate incluse}} ($1)',
 
 # Skin names
index debb68e..78dc240 100644 (file)
@@ -153,6 +153,7 @@ $messages = array(
 'index-category' => 'Pàggene indicizzate',
 'noindex-category' => 'Pàggene none indicizzate',
 'broken-file-category' => 'Pàggene cu collegaminde a le file scuasciate',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -356,9 +357,9 @@ Pe 'na liste de le pàggene speciele cirche aqquà [[Special:SpecialPages|{{int:
 'dberrortext' => "Ha assute n'errore de sindassi de 'na inderrogazione sus a 'u database.
 Quiste pò indicà 'nu bochere jndr'à 'u software.
 L'urteme tendative de inderrogazione sus a 'u database ha state:
-<blockquote><tt>\$1</tt></blockquote>
-cu 'a funzione \"<tt>\$2</tt>\".
-'U database ha returnate l'errore \"<tt>\$3: \$4</tt>\".",
+<blockquote><code>\$1</code></blockquote>
+cu 'a funzione \"<code>\$2</code>\".
+'U database ha returnate l'errore \"<samp>\$3: \$4</samp>\".",
 'dberrortextcl' => 'A assute \'n\'errore de sindasse sus a \'n\'inderrogazione d\'u database.
 L\'urteme tendative de inderrogazione sus a \'u database ha state:
 "$1"
@@ -721,12 +722,11 @@ Pe piacere, condrolle ce tu vuè cu ccreje/cange sta pàgene.',
 'userpage-userdoesnotexist-view' => '\'U cunde utende "$1" non g\'è reggistrate.',
 'blocked-notice-logextract' => "Stu utende jè correndemende bloccate.<br />
 L'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
-'clearyourcache' => "''Vide Bbuene - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.'''
-*'''Mozilla / Firefox / Safari:''' cazze 'u ''Shift'' e condemboraneamende cazze 'u buttone ''Aggiorna'', o cazze 'nzieme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sus a 'nu Mac);
+'clearyourcache' => "'''Vide Bbuene''' - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.
+*'''Firefox / Safari:''' cazze 'u ''Shift'' e condemboraneamende cazze 'u buttone ''Aggiorna'', o cazze 'nzieme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sus a 'nu Mac);
 *'''Google Chrome:''' cazze ''Ctrl-Shift-R'' (''⌘-Shift-R'' sus a 'nu Mac)
 *'''Internet Explorer:''' cazze ''Ctrl'' e condemboraneamende cazze ''Aggiorna,'' o cazze ''Ctrl-F5''.
-*'''Konqueror: '''cazze ''Aggiorna'' o cazze ''F5'';
-*'''Opera:''' pulizze 'a cache da ''Tools → Preferences'' (in inglese) (Struminde - Preferenze in tagliàne);",
+*'''Opera:''' pulizze 'a cache da ''Tools → Preferences'' (in inglese) (Struminde - Preferenze in tarandine);",
 'usercssyoucanpreview' => "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u CSS nuève apprime de reggistrà.",
 'userjsyoucanpreview' => "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u JavaScript nuève apprime de reggistrà.",
 'usercsspreview' => "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tue.'''
@@ -1021,6 +1021,7 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
 'mergehistory-comment' => "Squagghiete [[:$1]] jndr'à [[:$2]]: $3",
 'mergehistory-same-destination' => 'Le pàggene sorgende e de destinazione non ge ponne essere le stesse',
 'mergehistory-reason' => 'Mutive:',
+'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
 'mergelog' => 'Archivije de le scuagghiaminde',
@@ -1870,6 +1871,7 @@ Mò s'avène redirette a [[$2]].",
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categorije|categorije}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interuicchi|interuicchi}}',
 'nlinks' => '$1 {{PLURAL:$1|collegamende|collegaminde}}',
 'nmembers' => '$1 {{PLURAL:$1|membre|membre}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisione|revisiune}}',
@@ -1898,6 +1900,7 @@ Mò s'avène redirette a [[$2]].",
 'mostlinkedtemplates' => 'Template cchiù appundete',
 'mostcategories' => "Pàggene cu 'nu sacche de categorije",
 'mostimages' => 'Fail cchiù appundete',
+'mostinterwikis' => 'Pàggene cu cchiù interuicchi de tutte',
 'mostrevisions' => 'Pàggene cchiù cangete',
 'prefixindex' => "Tutte le pàggene cu 'u prefisse",
 'prefixindex-namespace' => "Tutte le pàggene cu 'u prefisse ($1 namespace)",
@@ -2047,6 +2050,8 @@ Ponne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus
 'mailnologin' => 'Nisciune indirizze de invie',
 'mailnologintext' => "Tu a essere [[Special:UserLogin|collegate]] e a avè 'n'indirizze email valide jndr'à le [[Special:Preferences|preferenze]] tue pe mannà 'na mail a otre utinde.",
 'emailuser' => "Manne n'email a stu utende",
+'emailuser-title-target' => "Manne n'email a quiste {{GENDER:$1|utende}}",
+'emailuser-title-notarget' => "E-mail de l'utende",
 'emailpage' => "E-mail de l'utende",
 'emailpagetext' => "Tu puè ausà 'a schermate aqquà sotte pe mannà 'n'email a stu utende.
 L'indirizze e-mail ca tu è 'nzerite jndr'à le [[Special:Preferences|preferenze tue]] iesse jndr'à 'u cambe \"Da\" de l'e-mail, accussìa ce riceve 'a mail sape a ce addà responnere.",
@@ -2337,6 +2342,7 @@ Pò essere ca già ha state scangellate.",
 $1",
 'undelete-show-file-confirm' => 'Sì secure ca tu vuè ccu vide \'na revisiona scangellate d\'u file "<nowiki>$1</nowiki>" d\'u $2 a le $3?',
 'undelete-show-file-submit' => 'Sine',
+'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'Namespace:',
@@ -2740,6 +2746,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'import-error-interwiki' => 'Pagene "$1" non g\'ha state \'mbortate purcé \'u nome sue jè riservate pe collegaminde esterne (interuicchi).',
 'import-error-special' => "'A pagena \"\$1\" non g'ha state 'mbortate purcé apponde a 'nu namespace speciale ca non g'è permesse a le pàggene normale.",
 'import-error-invalid' => "'A pàgene \"\$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
+'import-options-wrong' => '{{PLURAL:$2|opzione|opziune}} sbagliate: <nowiki>$1</nowiki>',
 
 # Import log
 'importlogpage' => "Archivie de le 'mbortaziune",
@@ -2893,11 +2900,17 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 
 # Info page
 'pageinfo-title' => '\'Mbormaziune pe "$1"',
-'pageinfo-header-edits' => 'Cangiaminde',
+'pageinfo-header-edits' => 'Cunde de le cangiaminde',
+'pageinfo-article-id' => "ID d'a pàgene",
+'pageinfo-robot-index' => 'Indicizzabbele',
+'pageinfo-robot-noindex' => 'None indicizzabbele',
 'pageinfo-views' => 'Numere de visite',
-'pageinfo-watchers' => 'Numere de visitature',
-'pageinfo-edits' => 'Numere de cangiaminde',
-'pageinfo-authors' => 'Numere de autore diverse',
+'pageinfo-watchers' => "Numere de visitature d'a pàgene",
+'pageinfo-redirects-name' => 'Redirezionaminde a sta pàgene',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-firstuser' => "Ccrejatore d'a pàgene",
+'pageinfo-edits' => 'Numere totale de cangiaminde',
+'pageinfo-authors' => 'Numere Totale de autore diverse',
 
 # Skin names
 'skinname-standard' => 'Classeche',
@@ -3613,6 +3626,7 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
 'ellipsis' => '...',
 'percent' => '$1%',
 'parentheses' => '($1)',
+'brackets' => '[$1]',
 
 # Multipage image navigation
 'imgmultipageprev' => '← pàgena precedende',
@@ -3643,6 +3657,22 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
 'size-kilobytes' => '$1 KB',
 'size-megabytes' => '$1 MB',
 'size-gigabytes' => '$1 GB',
+'size-terabytes' => '$1 TB',
+'size-petabytes' => '$1 PB',
+'size-exabytes' => '$1 EB',
+'size-zetabytes' => '$1 ZB',
+'size-yottabytes' => '$1 YB',
+
+# Bitrate units
+'bitrate-bits' => '$1bps',
+'bitrate-kilobits' => '$1kbps',
+'bitrate-megabits' => '$1Mbps',
+'bitrate-gigabits' => '$1Gbps',
+'bitrate-terabits' => '$1Tbps',
+'bitrate-petabits' => '$1Pbps',
+'bitrate-exabits' => '$1Ebps',
+'bitrate-zetabits' => '$1Zbps',
+'bitrate-yottabits' => '$1Ybps',
 
 # Live preview
 'livepreview-loading' => 'Stoche a careche…',
index 01fd40f..8431af1 100644 (file)
@@ -3196,11 +3196,16 @@ The wiki server can't provide data in a format your client can read.",
 
 # Info page
 'pageinfo-title' => 'Сведения по «$1»',
-'pageinfo-header-edits' => 'Правки',
+'pageinfo-header-edits' => 'История изменений',
+'pageinfo-length' => 'Длина страницы (в байтах)',
+'pageinfo-article-id' => 'Идентификатор страницы',
+'pageinfo-robot-policy' => 'Индексация поисковыми службами',
+'pageinfo-robot-index' => 'Индексируется',
+'pageinfo-robot-noindex' => 'Не индексируется',
 'pageinfo-views' => 'Количество просмотров',
 'pageinfo-watchers' => 'Число наблюдающих',
 'pageinfo-edits' => 'Общее число правок',
-'pageinfo-authors' => 'Ð\9aолиÑ\87еÑ\81Ñ\82во различных авторов',
+'pageinfo-authors' => 'Ð\9eбÑ\89ее Ñ\87иÑ\81ло различных авторов',
 
 # Skin names
 'skinname-standard' => 'Классическое',
index 1ff1d7a..85812d3 100644 (file)
@@ -50,7 +50,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ',
 'tog-newpageshidepatrolled' => 'Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ',
 'tog-extendwatchlist' => 'Кэтээһин тупсарыллыбыт испииһэгэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)',
-'tog-usenewrc' => 'Саҥа Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80 Ñ\82Ñ\83пÑ\81аÑ\80Ñ\8bллÑ\8bбÑ\8bÑ\82 Ð¸Ñ\81пииһÑ\8dкÑ\82Ñ\8dÑ\80ин Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83Ñ\83 (JavaScript баар буолуохтаах)',
+'tog-usenewrc' => 'Саҥа Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80 Ñ\83онна ÐºÑ\8dÑ\82Ñ\8dбил Ñ\82иһикÑ\82Ñ\8dÑ\80игÑ\8dÑ\80 Ñ\83лаÑ\80Ñ\8bйÑ\8bÑ\8bлаÑ\80Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ò¯Ò¯Ñ\80гÑ\8d (JavaScript баар буолуохтаах)',
 'tog-numberheadings' => 'Бас тыллары нүөмэрдээ',
 'tog-showtoolbar' => 'Көннөрүү үстүрүмүөннэрин көрдөр (JavaScript)',
 'tog-editondblclick' => 'Хоһулатан иккитэ баттаан сирэйи уларытыы (JavaScript)',
@@ -306,6 +306,8 @@ $1',
 'youhavenewmessages' => '$1 ($2) кэллэ',
 'newmessageslink' => 'саҥа суруктар',
 'newmessagesdifflink' => 'кэлиҥҥи уларытыы',
+'youhavenewmessagesfromusers' => 'Маны $1 {{PLURAL:$3|соҕотох кыттааччыттан|$3 кыттааччыттан}} туппуккун ($2).',
+'youhavenewmessagesmanyusers' => 'Маны $1 элбэх кыттааччыттан туппуккун ($2).',
 'youhavenewmessagesmulti' => '$1, саҥа суруктар кэллилэр',
 'editsection' => 'уларыт',
 'editold' => 'уларыт',
@@ -2781,7 +2783,7 @@ $1',
 'pageinfo-views' => 'Көрүү ахсаана',
 'pageinfo-watchers' => 'Кэтээччилэр ахсааннара',
 'pageinfo-edits' => 'Көннөрүү ахсаана',
-'pageinfo-authors' => 'Ð\90Ñ\80ааÑ\81 ааптардар ахсааннара',
+'pageinfo-authors' => 'Ð\91Ñ\83 Ñ\81иÑ\80Ñ\8dйи Ñ\83лаÑ\80Ñ\8bппÑ\8bÑ\82 ааптардар ахсааннара',
 
 # Skin names
 'skinname-standard' => 'Классика',
index 61d15e8..10435a6 100644 (file)
@@ -2982,6 +2982,8 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 'pageinfo-length' => 'Haba ng pahina (na nasa mga byte)',
 'pageinfo-article-id' => 'ID ng pahina',
 'pageinfo-robot-policy' => 'Katayuan ng makinang panghanap',
+'pageinfo-robot-index' => 'Matataluntunan',
+'pageinfo-robot-noindex' => 'Hindi matataluntunan',
 'pageinfo-views' => 'Bilang ng mga pagtanaw',
 'pageinfo-watchers' => 'Bilang ng mga nagbabantay ng pahina',
 'pageinfo-redirects-name' => 'Napapapunta sa pahinang ito',
@@ -2996,9 +2998,9 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 'pageinfo-authors' => 'Kabuuang bilang ng magkakabukod na mga may-akda',
 'pageinfo-recent-edits' => 'Kamakailang bilang ng mga pamamatnugot (sa loob ng huling $1)',
 'pageinfo-recent-authors' => 'Kamakailang bilang ng magkakabukod na mga may-akda',
-'pageinfo-restriction' => 'Pruteksiyon ng pahina ($1)',
-'pageinfo-magic-words' => 'Mga salitang mahiwaga ($1)',
-'pageinfo-hidden-categories' => 'Nakatagong mga kategorya ($1)',
+'pageinfo-restriction' => 'Pruteksiyon ng pahina (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Salita|Mga salita}}ng mahiwaga ($1)',
+'pageinfo-hidden-categories' => 'Nakatagong {{PLURAL:$1|kategorya|mga kategorya}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Suleras|Mga suleras}} ($1) na nasa transklusyon (kasama sa maraming mga lugar)',
 
 # Skin names
index 0ac589a..3ce9a38 100644 (file)
@@ -54,6 +54,7 @@ $messages = array(
 'tog-minordefault' => 'Makim ol senis mi wokim olsem ol i liklik, sapos mi no makim',
 'tog-previewontop' => 'Soim pes mi senisim (pastaim long raitim) antap long bokis bilong wokim senis',
 'tog-previewonfirst' => 'Soim pes mi senisim pastaim long raitim',
+'tog-nocache' => ' Nogat stoa pes long browser',
 'tog-enotifwatchlistpages' => 'Salim imel long mi taim wanpela pes mi lukautim i senis',
 'tog-enotifusertalkpages' => 'Salim imel long mi wanem taim toktok bilong mi i senis',
 'tog-enotifminoredits' => 'Salim imel long mi tasol long liklik senis long pes na fail',
@@ -62,10 +63,14 @@ $messages = array(
 'tog-oldsig' => 'Olsem wanem yu raitim nem nau',
 'tog-fancysig' => 'Dispela rot yu raitim long nem stap wikitext (i no gat otomatik link)',
 'tog-externaleditor' => 'Yusim long ausait edita oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
+'tog-externaldiff' => 'Yusim long ausait diff oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
+'tog-showjumplinks' => ' Setap ol "Go stret long" links bilong helpim',
 'tog-uselivepreview' => 'Soim ol senis kwiktaim taim mi wokim (i nidim Javascript)',
+'tog-forceeditsummary' => 'Tokim mi long wanem taim raitim mi nating long liklik toksave bilong senis',
 'tog-watchlisthideown' => 'Haitim ol senis mi wokim long lukautbuk bilong mi',
 'tog-watchlisthidebots' => 'Haitim ol senis ol bot i wokim long lukautbuk bilong mi',
 'tog-watchlisthideminor' => 'Haitim ol liklik senis long lukautbuk bilong mi',
+'tog-watchlisthideliu' => ' Haitim senis long olpela yusa husat "logged in" long lukautbuk bilong mi',
 'tog-showhiddencats' => 'Soim ol grup hait',
 
 'underline-always' => 'Olgeta taim',
index c3b8cb9..061e4a8 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** uroyo (Ṫuroyo)
+/** Turoyo (Ṫuroyo)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -15,255 +15,255 @@ $messages = array(
 'tog-oldsig' => 'Imḍa du3do:',
 
 'underline-always' => 'Kulnaqa',
-'underline-never'  => 'Hiç',
+'underline-never' => 'Hiç',
 
 # Dates
-'sunday'        => 'Yawme dḤuşabo',
-'monday'        => 'Yawme dTre',
-'tuesday'       => 'Yawme dTloṭo',
-'wednesday'     => 'Yawme dArb³o',
-'thursday'      => 'Yawme dḤamşo',
-'friday'        => 'Yawme d3rufto',
-'saturday'      => 'Yawme dŞabṭo',
-'sun'           => 'Yawme dḤuşabo',
-'mon'           => 'Yawme dTre',
-'tue'           => 'Yawme dTloṭo',
-'wed'           => 'Yawme dArb³o',
-'thu'           => 'Yawme dḤamşo',
-'fri'           => 'Yawme d3rufto',
-'sat'           => 'Yawme dŞabṭo',
-'january'       => 'Konun ḥroy',
-'february'      => 'Şboṫ',
-'march'         => 'Oḍor',
-'april'         => 'Nison',
-'may_long'      => 'İyor',
-'june'          => 'Ḥziron',
-'july'          => 'Tamuz',
-'august'        => 'Ob',
-'september'     => 'Eylül',
-'october'       => 'Teşrin qḍim',
-'november'      => 'Teşrin ḥroy',
-'december'      => 'Konun qḍim',
-'january-gen'   => 'Konun ḥroy',
-'february-gen'  => 'Şboṫ',
-'march-gen'     => 'Oḍor',
-'april-gen'     => 'Nison',
-'may-gen'       => 'İyor',
-'june-gen'      => 'Ḥziron',
-'july-gen'      => 'Tamuz',
-'august-gen'    => 'Ob',
+'sunday' => 'Yawme dḤuşabo',
+'monday' => 'Yawme dTre',
+'tuesday' => 'Yawme dTloṭo',
+'wednesday' => 'Yawme dArb³o',
+'thursday' => 'Yawme dḤamşo',
+'friday' => 'Yawme d3rufto',
+'saturday' => 'Yawme dŞabṭo',
+'sun' => 'Yawme dḤuşabo',
+'mon' => 'Yawme dTre',
+'tue' => 'Yawme dTloṭo',
+'wed' => 'Yawme dArb³o',
+'thu' => 'Yawme dḤamşo',
+'fri' => 'Yawme d3rufto',
+'sat' => 'Yawme dŞabṭo',
+'january' => 'Konun ḥroy',
+'february' => 'Şboṫ',
+'march' => 'Oḍor',
+'april' => 'Nison',
+'may_long' => 'İyor',
+'june' => 'Ḥziron',
+'july' => 'Tamuz',
+'august' => 'Ob',
+'september' => 'Eylül',
+'october' => 'Teşrin qḍim',
+'november' => 'Teşrin ḥroy',
+'december' => 'Konun qḍim',
+'january-gen' => 'Konun ḥroy',
+'february-gen' => 'Şboṫ',
+'march-gen' => 'Oḍor',
+'april-gen' => 'Nison',
+'may-gen' => 'İyor',
+'june-gen' => 'Ḥziron',
+'july-gen' => 'Tamuz',
+'august-gen' => 'Ob',
 'september-gen' => 'Eylül',
-'october-gen'   => 'Teşrin qḍim',
-'november-gen'  => 'Teşrin ḥroy',
-'december-gen'  => 'Konun qḍim',
-'jan'           => 'Konun II',
-'feb'           => 'Şboṫ',
-'mar'           => 'Oḍor',
-'apr'           => 'Nison',
-'may'           => 'İyor',
-'jun'           => 'Ḥziron',
-'jul'           => 'Tamuz',
-'aug'           => 'Ob',
-'sep'           => 'Eylül',
-'oct'           => 'Teşrin I',
-'nov'           => 'Teşrin II',
-'dec'           => 'Konun I',
+'october-gen' => 'Teşrin qḍim',
+'november-gen' => 'Teşrin ḥroy',
+'december-gen' => 'Konun qḍim',
+'jan' => 'Konun II',
+'feb' => 'Şboṫ',
+'mar' => 'Oḍor',
+'apr' => 'Nison',
+'may' => 'İyor',
+'jun' => 'Ḥziron',
+'jul' => 'Tamuz',
+'aug' => 'Ob',
+'sep' => 'Eylül',
+'oct' => 'Teşrin I',
+'nov' => 'Teşrin II',
+'dec' => 'Konun I',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Sedro|Sedre}}',
-'category_header'        => 'Faṭoṭe bu Sedro "$1"',
-'subcategories'          => 'Sedre na³ime',
-'category-media-header'  => 'Mediya buSedro "$1"',
-'category-empty'         => 'U³do layto Faṭo aw Mediya buSedrano.',
-'hidden-categories'      => '{{PLURAL:$1|Hidden category|Hidden categories}}',
-'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.}}',
+'pagecategories' => '{{PLURAL:$1|Sedro|Sedre}}',
+'category_header' => 'Faṭoṭe bu Sedro "$1"',
+'subcategories' => 'Sedre na³ime',
+'category-media-header' => 'Mediya buSedro "$1"',
+'category-empty' => 'U³do layto Faṭo aw Mediya buSedrano.',
+'hidden-categories' => '{{PLURAL:$1|Hidden category|Hidden categories}}',
+'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.}}',
 'category-article-count' => '{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}',
-'category-file-count'    => '{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}',
+'category-file-count' => '{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}',
 'listingcontinuesabbrev' => 'mdawam',
-'noindex-category'       => 'Noindexed pages',
+'noindex-category' => 'Noindexed pages',
 
-'about'         => '3al',
-'newwindow'     => '(gmıftaḥ bKawṭo ḥaṭto)',
-'cancel'        => 'Mbaṫel',
+'about' => '3al',
+'newwindow' => '(gmıftaḥ bKawṭo ḥaṭto)',
+'cancel' => 'Mbaṫel',
 'moredotdotdot' => 'Heşa...',
-'mypage'        => 'iFaṭayḍi',
-'mytalk'        => 'uMamlayḍi',
-'navigation'    => 'Navigasyon',
-'and'           => '&#32;u',
+'mypage' => 'iFaṭayḍi',
+'mytalk' => 'uMamlayḍi',
+'navigation' => 'Navigasyon',
+'and' => '&#32;u',
 
 # Cologne Blue skin
-'qbfind'         => 'Ḥzay',
-'qbbrowse'       => 'Krax',
-'qbedit'         => 'Mşaḥlaf',
-'qbpageoptions'  => 'iFaṭaṭe',
-'qbmyoptions'    => 'aFaṭoṭayḍi',
+'qbfind' => 'Ḥzay',
+'qbbrowse' => 'Krax',
+'qbedit' => 'Mşaḥlaf',
+'qbpageoptions' => 'iFaṭaṭe',
+'qbmyoptions' => 'aFaṭoṭayḍi',
 'qbspecialpages' => 'Faṭoṭe dilonoye',
-'faq'            => 'Şuwole',
-'faqpage'        => 'Project:FAQ',
+'faq' => 'Şuwole',
+'faqpage' => 'Project:FAQ',
 
 # Vector skin
 'vector-action-addsection' => 'Maḥat Fusoqo ḥaṭo',
-'vector-action-delete'     => 'Slag',
-'vector-action-move'       => 'Mtaxar',
-'vector-action-protect'    => 'Mastar',
-'vector-view-create'       => 'Xlaq',
-'vector-view-edit'         => 'Mşaḥlaf',
-'vector-view-history'      => 'Maktabzabno',
-'vector-view-view'         => 'Qray',
-'vector-view-viewsource'   => 'Maḥway li aMabu³e.',
-'actions'                  => 'Dubore',
-'namespaces'               => 'Dukṭo luIşmo',
-'variants'                 => 'Variants',
-
-'errorpagetitle'    => 'Fawdo',
-'returnto'          => 'D³ar l$1',
-'tagline'           => 'men {{SITENAME}}',
-'help'              => '3udrono',
-'search'            => 'krax',
-'searchbutton'      => 'Krax',
-'go'                => 'Zux',
-'searcharticle'     => 'Zux',
-'history'           => 'Maktabzabno diFaṭo',
-'history_short'     => 'Maktabzabno',
-'updatedmarker'     => 'aŞuḥlofe datsimi miNaqa du3boroayḍi ḥaroyo',
-'printableversion'  => 'Printable version',
-'permalink'         => 'Asiruṭo aminoyto',
-'print'             => 'Ṫba³',
-'view'              => 'Qray',
-'edit'              => 'Mşaḥlaf',
-'create'            => 'Xlaq',
-'editthispage'      => 'Mşaḥlaf iFaṭaṭe',
-'create-this-page'  => 'Xlaq iFaṭaṭe',
-'delete'            => 'Slag',
-'deletethispage'    => 'Slag iFaṭaṭe',
-'protect'           => 'Mastar',
-'protect_change'    => 'mşaḥlaf',
-'protectthispage'   => 'Mastar iFaṭaṭe',
-'newpage'           => 'Faṭo ḥaṭto',
-'talkpage'          => 'Sım Droşo 3al iFaṭaṭe',
-'talkpagelinktext'  => 'Mamlo',
-'specialpage'       => 'Faṭo dilonoyto',
-'personaltools'     => 'aMonayḍi',
-'postcomment'       => 'Fusoqo ḥaṭo',
-'articlepage'       => 'Ḥur baḤbişoṭo',
-'talk'              => 'Droşo',
-'views'             => 'Ḥzayoṭo',
-'toolbox'           => 'Mone',
-'viewtalkpage'      => 'Ḥur buDroşo',
-'otherlanguages'    => 'bLeşone ḥrene',
-'redirectedfrom'    => '(Redirected from $1)',
-'lastmodifiedat'    => 'uŞuḥlofo ḥaroyo diFaṭaṭe bu Zabnano wa:  $1 $2 .',
-'jumpto'            => 'Zux l',
-'jumptonavigation'  => 'Navigasyon',
-'jumptosearch'      => 'Kruxyo',
+'vector-action-delete' => 'Slag',
+'vector-action-move' => 'Mtaxar',
+'vector-action-protect' => 'Mastar',
+'vector-view-create' => 'Xlaq',
+'vector-view-edit' => 'Mşaḥlaf',
+'vector-view-history' => 'Maktabzabno',
+'vector-view-view' => 'Qray',
+'vector-view-viewsource' => 'Maḥway li aMabu³e.',
+'actions' => 'Dubore',
+'namespaces' => 'Dukṭo luIşmo',
+'variants' => 'Variants',
+
+'errorpagetitle' => 'Fawdo',
+'returnto' => 'D³ar l$1',
+'tagline' => 'men {{SITENAME}}',
+'help' => '3udrono',
+'search' => 'krax',
+'searchbutton' => 'Krax',
+'go' => 'Zux',
+'searcharticle' => 'Zux',
+'history' => 'Maktabzabno diFaṭo',
+'history_short' => 'Maktabzabno',
+'updatedmarker' => 'aŞuḥlofe datsimi miNaqa du3boroayḍi ḥaroyo',
+'printableversion' => 'Printable version',
+'permalink' => 'Asiruṭo aminoyto',
+'print' => 'Ṫba³',
+'view' => 'Qray',
+'edit' => 'Mşaḥlaf',
+'create' => 'Xlaq',
+'editthispage' => 'Mşaḥlaf iFaṭaṭe',
+'create-this-page' => 'Xlaq iFaṭaṭe',
+'delete' => 'Slag',
+'deletethispage' => 'Slag iFaṭaṭe',
+'protect' => 'Mastar',
+'protect_change' => 'mşaḥlaf',
+'protectthispage' => 'Mastar iFaṭaṭe',
+'newpage' => 'Faṭo ḥaṭto',
+'talkpage' => 'Sım Droşo 3al iFaṭaṭe',
+'talkpagelinktext' => 'Mamlo',
+'specialpage' => 'Faṭo dilonoyto',
+'personaltools' => 'aMonayḍi',
+'postcomment' => 'Fusoqo ḥaṭo',
+'articlepage' => 'Ḥur baḤbişoṭo',
+'talk' => 'Droşo',
+'views' => 'Ḥzayoṭo',
+'toolbox' => 'Mone',
+'viewtalkpage' => 'Ḥur buDroşo',
+'otherlanguages' => 'bLeşone ḥrene',
+'redirectedfrom' => '(Redirected from $1)',
+'lastmodifiedat' => 'uŞuḥlofo ḥaroyo diFaṭaṭe bu Zabnano wa:  $1 $2 .',
+'jumpto' => 'Zux l',
+'jumptonavigation' => 'Navigasyon',
+'jumptosearch' => 'Kruxyo',
 'pool-errorunknown' => 'Fawdo nuxroyo',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => '3al {{SITENAME}}',
-'aboutpage'            => 'Project: 3al',
-'copyrightpage'        => '{{ns:project}}:Ḥaqat duKaṭowo',
-'currentevents'        => 'Gedşe du³do',
-'currentevents-url'    => 'Project:Gedşe du3do',
-'disclaimers'          => 'Disclaimers',
-'disclaimerpage'       => 'Project: Disclaimer gawonoyo',
-'edithelp'             => 'Editing help',
-'edithelppage'         => 'Help:Mşaḥlaf',
-'helppage'             => 'Help: Ḥbişoṭo',
-'mainpage'             => 'Faṭo rişoyto',
+'aboutsite' => '3al {{SITENAME}}',
+'aboutpage' => 'Project: 3al',
+'copyrightpage' => '{{ns:project}}:Ḥaqat duKaṭowo',
+'currentevents' => 'Gedşe du³do',
+'currentevents-url' => 'Project:Gedşe du3do',
+'disclaimers' => 'Disclaimers',
+'disclaimerpage' => 'Project: Disclaimer gawonoyo',
+'edithelp' => 'Editing help',
+'edithelppage' => 'Help:Mşaḥlaf',
+'helppage' => 'Help: Ḥbişoṭo',
+'mainpage' => 'Faṭo rişoyto',
 'mainpage-description' => 'Faṭo rişoyto',
-'portal'               => 'Portal diJama³a',
-'portal-url'           => 'Project: Portal diJama³a',
-'privacy'              => 'Setoro daMawd³onwoṭo',
-'privacypage'          => 'Project: Setoro daMawd³onwoṭo',
+'portal' => 'Portal diJama³a',
+'portal-url' => 'Project: Portal diJama³a',
+'privacy' => 'Setoro daMawd³onwoṭo',
+'privacypage' => 'Project: Setoro daMawd³onwoṭo',
 
 'badaccess-group0' => 'Hat latlux uFsoso dkolozım dsaymat iḤarakaṭe.',
 
-'ok'                      => 'Tamam',
-'retrievedfrom'           => 'men "$1"',
-'youhavenewmessages'      => 'Kıtlux $1 ($2) .',
-'newmessageslink'         => 'Ṫebe ḥaṭe',
-'newmessagesdifflink'     => 'Degoşo ḥaroyo',
+'ok' => 'Tamam',
+'retrievedfrom' => 'men "$1"',
+'youhavenewmessages' => 'Kıtlux $1 ($2) .',
+'newmessageslink' => 'Ṫebe ḥaṭe',
+'newmessagesdifflink' => 'Degoşo ḥaroyo',
 'youhavenewmessagesmulti' => 'Kitlux Ṫebe ḥaṭe b$1',
-'editsection'             => 'mşaḥlaf',
-'editold'                 => 'mşaḥlaf',
-'viewsourceold'           => 'Maḥway li uMabu³o.',
-'editlink'                => 'mşaḥlaf',
-'viewsourcelink'          => 'Maḥway li uMabu³o.',
-'editsectionhint'         => 'Mşaḥlaf uFusoqano: $1',
-'toc'                     => 'Ḥbişoṭo',
-'showtoc'                 => 'maḥway',
-'hidetoc'                 => 'tlay',
-'collapsible-collapse'    => 'sxar',
-'collapsible-expand'      => 'ftaḥ',
-'feedlinks'               => 'Feed:',
-'site-rss-feed'           => '$1 RSS feed',
-'site-atom-feed'          => '$1 Atom feed',
-'page-rss-feed'           => '"$1" RSS feed',
-'page-atom-feed'          => 'Atom feed l"$1"',
-'red-link-title'          => '$1 (layto iFaṭaṭe)',
+'editsection' => 'mşaḥlaf',
+'editold' => 'mşaḥlaf',
+'viewsourceold' => 'Maḥway li uMabu³o.',
+'editlink' => 'mşaḥlaf',
+'viewsourcelink' => 'Maḥway li uMabu³o.',
+'editsectionhint' => 'Mşaḥlaf uFusoqano: $1',
+'toc' => 'Ḥbişoṭo',
+'showtoc' => 'maḥway',
+'hidetoc' => 'tlay',
+'collapsible-collapse' => 'sxar',
+'collapsible-expand' => 'ftaḥ',
+'feedlinks' => 'Feed:',
+'site-rss-feed' => '$1 RSS feed',
+'site-atom-feed' => '$1 Atom feed',
+'page-rss-feed' => '"$1" RSS feed',
+'page-atom-feed' => 'Atom feed l"$1"',
+'red-link-title' => '$1 (layto iFaṭaṭe)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Faṭo',
-'nstab-user'      => 'Faṭo duHadomo',
-'nstab-media'     => 'Faṭo diMediya',
-'nstab-special'   => 'Faṭo dilonoyto',
-'nstab-project'   => 'Faṭo die Proja',
-'nstab-image'     => 'Fayl',
+'nstab-main' => 'Faṭo',
+'nstab-user' => 'Faṭo duHadomo',
+'nstab-media' => 'Faṭo diMediya',
+'nstab-special' => 'Faṭo dilonoyto',
+'nstab-project' => 'Faṭo diProja',
+'nstab-image' => 'Fayl',
 'nstab-mediawiki' => 'Ṫebo',
-'nstab-template'  => 'Template',
-'nstab-help'      => 'Faṭo d3udrono',
-'nstab-category'  => 'Sedro',
+'nstab-template' => 'Template',
+'nstab-help' => 'Faṭo d3udrono',
+'nstab-category' => 'Sedro',
 
 # General errors
-'error'              => 'Fawdo',
-'missing-article'    => 'uSyomo d$1 $2 lo komaḥwe biDatabase.
+'error' => 'Fawdo',
+'missing-article' => 'uSyomo d$1 $2 lo komaḥwe biDatabase.
 
 iFaṭaṭe belki sligo aw mtaxro merke.
 
 Elo iḍa dlo howe hawxa belki ḥselux Fawdo biSoftware. Bo³o haw Ṫebo l[[Special:ListUsers/sysop|Administrator]] u kṭaw u"URL".',
 'missingarticle-rev' => '(Numara duVersyon: $1)',
-'badtitle'           => 'Bad title',
-'badtitletext'       => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
+'badtitle' => 'Bad title',
+'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
 It may contain one or more characters which cannot be used in titles.',
-'viewsource'         => 'Maḥway li aMabu³e.',
+'viewsource' => 'Maḥway li aMabu³e.',
 'namespaceprotected' => "Hat latlux Ḥaq dımşaḥılfat Faṭoṭe bi'''$1''' Dukṭo xliṭo.",
 
 # Virus scanner
 'virus-unknownscanner' => 'Antivirus nuxroyo:',
 
 # Login and logout pages
-'yourname'                => 'Işme duHadomo:',
-'yourpassword'            => 'Qliḍo:',
-'yourpasswordagain'       => 'Naqla ḥreto kṭaw uQliḍo:',
-'remembermypassword'      => 'Dxar uQliḍayḍi buBrowser (buSowudo $1 {{PLURAL:$1|Yawmo|Yawme}})',
-'login'                   => '3bar',
+'yourname' => 'Işme duHadomo:',
+'yourpassword' => 'Qliḍo:',
+'yourpasswordagain' => 'Naqla ḥreto kṭaw uQliḍo:',
+'remembermypassword' => 'Dxar uQliḍayḍi buBrowser (buSowudo $1 {{PLURAL:$1|Yawmo|Yawme}})',
+'login' => '3bar',
 'nav-login-createaccount' => '3bar / Hway Hadomo',
-'loginprompt'             => 'Glozım maqablat Cookies qanna dqudrat fıtḥat {{SITENAME}}.',
-'userlogin'               => '3bar / Hway Hadomo',
-'userloginnocreate'       => '3bar',
-'logout'                  => 'Nfoqo',
-'userlogout'              => 'Nfoqo',
-'notloggedin'             => 'Heş lo3abirat.',
-'nologin'                 => 'Heş lawit Hadomo? $1',
-'nologinlink'             => 'Hway Hadomo',
-'createaccount'           => 'Hway Hadomo',
-'gotaccount'              => 'Ma hawit ste Hadomo? $1',
-'gotaccountlink'          => '3bar',
-'userlogin-resetlink'     => 'Ṫa³at uQliḍayḍox?',
-'createaccountmail'       => 'buEmail',
-'wrongpassword'           => 'uQliḍayḍux fawdo yo.
+'loginprompt' => 'Glozım maqablat Cookies qanna dqudrat fıtḥat {{SITENAME}}.',
+'userlogin' => '3bar / Hway Hadomo',
+'userloginnocreate' => '3bar',
+'logout' => 'Nfoqo',
+'userlogout' => 'Nfoqo',
+'notloggedin' => 'Heş lo3abirat.',
+'nologin' => 'Heş lawit Hadomo? $1',
+'nologinlink' => 'Hway Hadomo',
+'createaccount' => 'Hway Hadomo',
+'gotaccount' => 'Ma hawit ste Hadomo? $1',
+'gotaccountlink' => '3bar',
+'userlogin-resetlink' => 'Ṫa³at uQliḍayḍox?',
+'createaccountmail' => 'buEmail',
+'wrongpassword' => 'uQliḍayḍux fawdo yo.
 Mjarab Naqla ḥreto.',
-'wrongpasswordempty'      => 'Lo msta³melux uQliḍayḍux.
+'wrongpasswordempty' => 'Lo msta³melux uQliḍayḍux.
 Mjarab Naqla ḥreto.',
-'password-name-match'     => 'Glozım towe Frişuṭo beyn uQliḍo u uIşmayḍux.',
-'mailmypassword'          => 'Mşadar li Qliḍo ḥaṭo',
-'loginlanguagelabel'      => 'Leşono: $1',
+'password-name-match' => 'Glozım towe Frişuṭo beyn uQliḍo u uIşmayḍux.',
+'mailmypassword' => 'Mşadar li Qliḍo ḥaṭo',
+'loginlanguagelabel' => 'Leşono: $1',
 
 # Change password dialog
-'resetpass'                 => 'Mşaḥlaf uQliḍo.',
-'oldpassword'               => 'Qliḍo 3atiqo:',
-'newpassword'               => 'Qliḍo ḥaṭo:',
-'retypenew'                 => 'Qliḍo ḥaṭo (disa):',
+'resetpass' => 'Mşaḥlaf uQliḍo.',
+'oldpassword' => 'Qliḍo 3atiqo:',
+'newpassword' => 'Qliḍo ḥaṭo:',
+'retypenew' => 'Qliḍo ḥaṭo (disa):',
 'resetpass-submit-loggedin' => 'Mşaḥlaf uQliḍo',
 
 # Special:PasswordReset
@@ -273,264 +273,264 @@ Mjarab Naqla ḥreto.',
 'changeemail-newemail' => 'Email-adres ḥaṭo:',
 
 # Edit page toolbar
-'bold_sample'     => 'Ḥarfe ḥlime',
-'bold_tip'        => 'Ḥarfe ḥlime',
-'italic_sample'   => 'Ḥarfe 3wije',
-'italic_tip'      => 'Ḥarfe 3wije',
-'link_sample'     => 'Link title',
-'link_tip'        => 'Internal link',
-'extlink_sample'  => 'http://www.example.com link title',
-'extlink_tip'     => 'External link (remember http:// prefix)',
+'bold_sample' => 'Ḥarfe ḥlime',
+'bold_tip' => 'Ḥarfe ḥlime',
+'italic_sample' => 'Ḥarfe 3wije',
+'italic_tip' => 'Ḥarfe 3wije',
+'link_sample' => 'Link title',
+'link_tip' => 'Internal link',
+'extlink_sample' => 'http://www.example.com link title',
+'extlink_tip' => 'External link (remember http:// prefix)',
 'headline_sample' => 'Headline text',
-'headline_tip'    => 'Level 2 headline',
-'nowiki_sample'   => 'Insert non-formatted text here',
-'nowiki_tip'      => 'uSyomano latyo buFormat',
-'image_tip'       => 'Embedded file',
-'media_tip'       => 'File link',
-'sig_tip'         => 'Mḍay herke u kṭaw iSa³aye muqa yo.',
-'hr_tip'          => 'Horizontal line (use sparingly)',
+'headline_tip' => 'Level 2 headline',
+'nowiki_sample' => 'Insert non-formatted text here',
+'nowiki_tip' => 'uSyomano latyo buFormat',
+'image_tip' => 'Embedded file',
+'media_tip' => 'File link',
+'sig_tip' => 'Mḍay herke u kṭaw iSa³aye muqa yo.',
+'hr_tip' => 'Horizontal line (use sparingly)',
 
 # Edit pages
-'summary'                          => 'Summary:',
-'minoredit'                        => 'This is a minor edit',
-'watchthis'                        => 'Watch this page',
-'savearticle'                      => 'Mqayad iFaṭaṭe',
-'preview'                          => 'Preview',
-'showpreview'                      => 'Show preview',
-'showdiff'                         => 'Maḥway aŞuḥlofe',
-'anoneditwarning'                  => "'''Diqad''' Heş lo 3abirat.
+'summary' => 'Summary:',
+'minoredit' => 'This is a minor edit',
+'watchthis' => 'Watch this page',
+'savearticle' => 'Mqayad iFaṭaṭe',
+'preview' => 'Preview',
+'showpreview' => 'Show preview',
+'showdiff' => 'Maḥway aŞuḥlofe',
+'anoneditwarning' => "'''Diqad''' Heş lo 3abirat.
 uIP-Adresayḍux gmikṭaw buMaktabzabno diFaṭaṭe. Kul Noşo kibe ḥozele u lo komislag.",
-'loginreqtitle'                    => 'Glozım 3obrat',
-'loginreqlink'                     => '3bar',
-'loginreqpagetext'                 => 'Glozım $1 qanna dqudrat ḥozat Faṭoṭe ḥrene.',
-'newarticle'                       => '(Ḥaṭo)',
-'newarticletext'                   => "You have followed a link to a page that does not exist yet.
+'loginreqtitle' => 'Glozım 3obrat',
+'loginreqlink' => '3bar',
+'loginreqpagetext' => 'Glozım $1 qanna dqudrat ḥozat Faṭoṭe ḥrene.',
+'newarticle' => '(Ḥaṭo)',
+'newarticletext' => "You have followed a link to a page that does not exist yet.
 To create the page, start typing in the box below (see the [[{{MediaWiki:Helppage}}|help page]] for more info).
 If you are here by mistake, click your browser's '''back''' button.",
-'noarticletext'                    => 'There is currently no text in this page.
+'noarticletext' => 'There is currently no text in this page.
 You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
 or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
-'noarticletext-nopermission'       => 'There is currently no text in this page.
+'noarticletext-nopermission' => 'There is currently no text in this page.
 You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
 or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
-'previewnote'                      => "'''Remember that this is only a preview.'''
+'previewnote' => "'''Remember that this is only a preview.'''
 Your changes have not yet been saved!",
-'editing'                          => 'Şuḥlofo d$1',
-'editingsection'                   => 'Mşaḥlaf $1 (Fusoqo)',
-'yourtext'                         => 'uSyomayḍux',
-'yourdiff'                         => 'Frişwoṭo',
-'templatesused'                    => '{{PLURAL:$1|Template|Templates}} used on this page:',
-'template-protected'               => '(protected)',
-'template-semiprotected'           => '(semi-protected)',
-'hiddencategories'                 => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
+'editing' => 'Şuḥlofo d$1',
+'editingsection' => 'Mşaḥlaf $1 (Fusoqo)',
+'yourtext' => 'uSyomayḍux',
+'yourdiff' => 'Frişwoṭo',
+'templatesused' => '{{PLURAL:$1|Template|Templates}} used on this page:',
+'template-protected' => '(protected)',
+'template-semiprotected' => '(semi-protected)',
+'hiddencategories' => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
 'permissionserrorstext-withaction' => 'You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:',
-'recreate-moveddeleted-warn'       => "'''Warning: You are recreating a page that was previously deleted.'''
+'recreate-moveddeleted-warn' => "'''Warning: You are recreating a page that was previously deleted.'''
 
 You should consider whether it is appropriate to continue editing this page.
 The deletion and move log for this page are provided here for convenience:",
-'moveddeleted-notice'              => 'iFaṭaṭe sligto yo.
+'moveddeleted-notice' => 'iFaṭaṭe sligto yo.
 The deletion and move log for the page are provided below for reference.',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning'  => "'''Warning:''' Template include size is too large.
+'post-expand-template-inclusion-warning' => "'''Warning:''' Template include size is too large.
 Some templates will not be included.",
 'post-expand-template-inclusion-category' => 'Pages where template include size is exceeded',
-'post-expand-template-argument-warning'   => "'''Warning:''' This page contains at least one template argument which has a too large expansion size.
+'post-expand-template-argument-warning' => "'''Warning:''' This page contains at least one template argument which has a too large expansion size.
 These arguments have been omitted.",
-'post-expand-template-argument-category'  => 'Pages containing omitted template arguments',
+'post-expand-template-argument-category' => 'Pages containing omitted template arguments',
 
 # History pages
-'viewpagelogs'           => 'View logs for this page',
-'currentrev-asof'        => 'Latest revision as of $1',
-'revisionasof'           => 'Versyon 3atiqo diNaqa: $1',
-'revision-info'          => 'Revision as of $1 by $2',
-'previousrevision'       => '←Versyon 3atiqtır',
-'nextrevision'           => 'Versyon ḥaṭtır',
-'currentrevisionlink'    => 'Latest revision',
-'cur'                    => 'du³do',
-'next'                   => 'Ḥreto',
-'last'                   => 'dmeqım',
-'page_first'             => 'Badaye',
-'page_last'              => 'Ḥarayto',
-'histlegend'             => "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />
+'viewpagelogs' => 'View logs for this page',
+'currentrev-asof' => 'Latest revision as of $1',
+'revisionasof' => 'Versyon 3atiqo diNaqa: $1',
+'revision-info' => 'Revision as of $1 by $2',
+'previousrevision' => '←Versyon 3atiqtır',
+'nextrevision' => 'Versyon ḥaṭtır',
+'currentrevisionlink' => 'Latest revision',
+'cur' => 'du³do',
+'next' => 'Ḥreto',
+'last' => 'dmeqım',
+'page_first' => 'Badaye',
+'page_last' => 'Ḥarayto',
+'histlegend' => "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />
 Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})''' = difference with preceding revision, '''{{int:minoreditletter}}''' = minor edit.",
 'history-fieldset-title' => 'Krax buMaktabzabno',
-'history-show-deleted'   => 'Bes aSlige',
-'histfirst'              => 'Meqım kulle',
-'histlast'               => 'Ḥaṭo',
-'historysize'            => '({{PLURAL:$1|1 byte|$1 bytes}})',
-'historyempty'           => '(xalyo)',
+'history-show-deleted' => 'Bes aSlige',
+'histfirst' => 'Meqım kulle',
+'histlast' => 'Ḥaṭo',
+'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
+'historyempty' => '(xalyo)',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1  b$2',
 
 # Revision deletion
-'rev-delundel'               => 'maḥway / tlay',
-'rev-showdeleted'            => 'maḥway',
+'rev-delundel' => 'maḥway / tlay',
+'rev-showdeleted' => 'maḥway',
 'revdelete-show-file-submit' => 'Eh',
-'revdelete-radio-same'       => '(lo mşaḥalfat)',
-'revdelete-radio-set'        => 'Eh',
-'revdelete-radio-unset'      => 'Lo',
-'revdel-restore'             => 'change visibility',
-'revdel-restore-deleted'     => 'deleted revisions',
-'revdel-restore-visible'     => 'visible revisions',
-'pagehist'                   => 'Maktabzabno diFaṭo',
+'revdelete-radio-same' => '(lo mşaḥalfat)',
+'revdelete-radio-set' => 'Eh',
+'revdelete-radio-unset' => 'Lo',
+'revdel-restore' => 'change visibility',
+'revdel-restore-deleted' => 'deleted revisions',
+'revdel-restore-visible' => 'visible revisions',
+'pagehist' => 'Maktabzabno diFaṭo',
 
 # Merge log
 'revertmerge' => 'Unmerge',
 
 # Diffs
-'history-title'           => 'Revision history of "$1"',
-'lineno'                  => 'Serṫo $1:',
+'history-title' => 'Revision history of "$1"',
+'lineno' => 'Serṫo $1:',
 'compareselectedversions' => 'Compare selected revisions',
-'editundo'                => 'slag',
-'diff-multi'              => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
+'editundo' => 'slag',
+'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
 
 # Search results
-'searchresults'                    => 'Nafqe duKruxyayḍux',
-'searchresults-title'              => 'Nafqe duKruxyo l"$1"',
-'searchsubtitleinvalid'            => "Karixat '''$1'''",
-'prevn'                            => '{{PLURAL:$1|$1}} meqımtır',
-'nextn'                            => '{{PLURAL:$1 ḥaṭtır| $1 ḥaṭtır }}',
-'prevn-title'                      => '{{PLURAL:$1 Nafqo meqımtır|$1 Nafqe meqımtır}}',
-'nextn-title'                      => '{{PLURAL:$1|Nafqo ḥreno|$1 Nafqe ḥrene}}',
-'shown-title'                      => 'maḥway $1 {{PLURAL:$1|Nafqo|Nafqe}} bḥḍo Faṭo',
-'viewprevnext'                     => 'Maḥway ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend'                => '3ayar duKruxyo',
-'searchmenu-exists'                => "'''Kito Faṭo herke Işma \"[[:\$1]]\"yo'''",
-'searchmenu-new'                   => 'Kṭaw iFaṭaṭe "[[:$1]]" buWiki.',
-'searchhelp-url'                   => 'Help: Ḥbişoṭo',
-'searchprofile-articles'           => 'Faṭoṭe daḤbişoṭo',
-'searchprofile-project'            => 'Faṭoṭe du3udrono u daProjat',
-'searchprofile-images'             => 'Multimediya',
-'searchprofile-everything'         => 'Kulmede',
-'searchprofile-advanced'           => 'Advanced',
-'searchprofile-articles-tooltip'   => 'Krax b$1',
-'searchprofile-project-tooltip'    => 'Krax b$1',
-'searchprofile-images-tooltip'     => 'Krax Ṥurtoṭe',
+'searchresults' => 'Nafqe duKruxyayḍux',
+'searchresults-title' => 'Nafqe duKruxyo l"$1"',
+'searchsubtitleinvalid' => "Karixat '''$1'''",
+'prevn' => '{{PLURAL:$1|$1}} meqımtır',
+'nextn' => '{{PLURAL:$1 ḥaṭtır| $1 ḥaṭtır }}',
+'prevn-title' => '{{PLURAL:$1 Nafqo meqımtır|$1 Nafqe meqımtır}}',
+'nextn-title' => '{{PLURAL:$1|Nafqo ḥreno|$1 Nafqe ḥrene}}',
+'shown-title' => 'maḥway $1 {{PLURAL:$1|Nafqo|Nafqe}} bḥḍo Faṭo',
+'viewprevnext' => 'Maḥway ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => '3ayar duKruxyo',
+'searchmenu-exists' => "'''Kito Faṭo herke Işma \"[[:\$1]]\"yo'''",
+'searchmenu-new' => 'Kṭaw iFaṭaṭe "[[:$1]]" buWiki.',
+'searchhelp-url' => 'Help: Ḥbişoṭo',
+'searchprofile-articles' => 'Faṭoṭe daḤbişoṭo',
+'searchprofile-project' => 'Faṭoṭe du3udrono u daProjat',
+'searchprofile-images' => 'Multimediya',
+'searchprofile-everything' => 'Kulmede',
+'searchprofile-advanced' => 'Advanced',
+'searchprofile-articles-tooltip' => 'Krax b$1',
+'searchprofile-project-tooltip' => 'Krax b$1',
+'searchprofile-images-tooltip' => 'Krax Ṥurtoṭe',
 'searchprofile-everything-tooltip' => 'Krax baḤbişoṭo (baFaṭoṭe duDroşo ste)',
-'searchprofile-advanced-tooltip'   => 'Search in custom namespaces',
-'search-result-size'               => '$1 ({{PLURAL:$2|1 Melṭo|$2 Mele}})',
-'search-result-category-size'      => '{{PLURAL:$1|1 Hadomo|$1 Hadome}} ({{PLURAL:$2|1 Sedro taḥtoyo|$2 Sedre taḥtoye}}, {{PLURAL:$3|1 file|$3 files}})',
-'search-redirect'                  => '(Asiruṭo men $1)',
-'search-section'                   => '(Fusoqo $1)',
-'search-suggest'                   => 'Ub³atwa dkıṭwat: $1?',
-'search-interwiki-more'            => '(heşa)',
-'searchrelated'                    => 'related',
-'searchall'                        => 'kulle',
-'showingresultsheader'             => "{{PLURAL:$5|Nafqo '''$1''' of '''$3'''|Nafqe '''$1 - $2''' men '''$3'''}} l'''$4'''",
-'search-nonefound'                 => 'Für deine Suchanfrage wurden keine Ergebnisse gefunden.',
-'powersearch-field'                => 'Krax',
-'powersearch-togglelabel'          => 'Sım Qontrol:',
-'powersearch-toggleall'            => 'Kulle',
+'searchprofile-advanced-tooltip' => 'Search in custom namespaces',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Melṭo|$2 Mele}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Hadomo|$1 Hadome}} ({{PLURAL:$2|1 Sedro taḥtoyo|$2 Sedre taḥtoye}}, {{PLURAL:$3|1 file|$3 files}})',
+'search-redirect' => '(Asiruṭo men $1)',
+'search-section' => '(Fusoqo $1)',
+'search-suggest' => 'Ub³atwa dkıṭwat: $1?',
+'search-interwiki-more' => '(heşa)',
+'searchrelated' => 'related',
+'searchall' => 'kulle',
+'showingresultsheader' => "{{PLURAL:$5|Nafqo '''$1''' of '''$3'''|Nafqe '''$1 - $2''' men '''$3'''}} l'''$4'''",
+'search-nonefound' => 'Für deine Suchanfrage wurden keine Ergebnisse gefunden.',
+'powersearch-field' => 'Krax',
+'powersearch-togglelabel' => 'Sım Qontrol:',
+'powersearch-toggleall' => 'Kulle',
 
 # Preferences page
-'preferences'               => '3ayarat',
-'mypreferences'             => 'a3ayaratayḍi',
-'prefs-edits'               => 'Menyono daŞuḥlofe kulle:',
-'prefs-resetpass'           => 'Mşaḥlaf uQliḍo',
-'prefs-email'               => '3ayarat duEmail',
-'saveprefs'                 => 'Mqayad',
-'searchresultshead'         => 'Kruxyo',
-'timezoneregion-africa'     => 'Afriqa',
-'timezoneregion-america'    => 'Ameriqa',
+'preferences' => '3ayarat',
+'mypreferences' => 'a3ayaratayḍi',
+'prefs-edits' => 'Menyono daŞuḥlofe kulle:',
+'prefs-resetpass' => 'Mşaḥlaf uQliḍo',
+'prefs-email' => '3ayarat duEmail',
+'saveprefs' => 'Mqayad',
+'searchresultshead' => 'Kruxyo',
+'timezoneregion-africa' => 'Afriqa',
+'timezoneregion-america' => 'Ameriqa',
 'timezoneregion-antarctica' => 'Antarctica',
-'timezoneregion-arctic'     => 'Arctic',
-'timezoneregion-asia'       => 'Asia',
-'timezoneregion-atlantic'   => 'Yamo atlantikoyo',
-'timezoneregion-australia'  => 'Australia',
-'timezoneregion-europe'     => 'Awrifi',
-'timezoneregion-indian'     => 'Yamo hindoyo',
-'youremail'                 => 'Adres duEmail',
-'username'                  => 'Işme duHadomo:',
-'prefs-memberingroups'      => 'Hadomo d{{PLURAL:$1|Gudo|Gudoṭo}}:',
-'prefs-registration'        => 'Zabno duSugolo:',
-'yourrealname'              => 'Işmo şariro:',
-'yourlanguage'              => 'Leşono',
-'yournick'                  => 'Imḍa ḥaṭto:',
-'yourgender'                => 'Ğenso:',
-'gender-male'               => 'Dekronoyo',
-'gender-female'             => 'Neqıbṭonoyo',
-'email'                     => 'Email',
-'prefs-help-email'          => 'Latat majbur dkıṭwat uEmail-Adresayḍox, elo glozam inaqla ṫo³at uQliḍayḍox u hakka dlozam dmişadar lox Qliḍo ḥaṭo.',
-'prefs-help-email-others'   => 'Kibux mijğolat 3am Hadome ğer biFaṭo duMamlo u luglozam dumat Işmux.',
-'prefs-signature'           => 'Imḍa',
+'timezoneregion-arctic' => 'Arctic',
+'timezoneregion-asia' => 'Asia',
+'timezoneregion-atlantic' => 'Yamo atlantikoyo',
+'timezoneregion-australia' => 'Australia',
+'timezoneregion-europe' => 'Awrifi',
+'timezoneregion-indian' => 'Yamo hindoyo',
+'youremail' => 'Adres duEmail',
+'username' => 'Işme duHadomo:',
+'prefs-memberingroups' => 'Hadomo d{{PLURAL:$1|Gudo|Gudoṭo}}:',
+'prefs-registration' => 'Zabno duSugolo:',
+'yourrealname' => 'Işmo şariro:',
+'yourlanguage' => 'Leşono',
+'yournick' => 'Imḍa ḥaṭto:',
+'yourgender' => 'Ğenso:',
+'gender-male' => 'Dekronoyo',
+'gender-female' => 'Neqıbṭonoyo',
+'email' => 'Email',
+'prefs-help-email' => 'Latat majbur dkıṭwat uEmail-Adresayḍox, elo glozam inaqla ṫo³at uQliḍayḍox u hakka dlozam dmişadar lox Qliḍo ḥaṭo.',
+'prefs-help-email-others' => 'Kibux mijğolat 3am Hadome ğer biFaṭo duMamlo u luglozam dumat Işmux.',
+'prefs-signature' => 'Imḍa',
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => 'uEmail-Adresayḍux m³adlo yo.',
 
 # Groups
 'group-user' => 'Hadome',
-'group-all'  => '(kulle)',
+'group-all' => '(kulle)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'Mşaḥlaf iFaṭaṭe',
 
 # Recent changes
-'nchanges'                        => '$1 {{PLURAL:$1|Şuḥlofo|Şuḥlofe}}',
-'recentchanges'                   => 'Şuḥlofe ḥaroye',
-'recentchanges-legend'            => '3ayar daŞuḥlofe',
-'recentchanges-summary'           => 'biFaṭaṭe kibox ḥozat aŞuḥlofe ḥaroye.',
-'recentchanges-feed-description'  => 'biFaṭaṭe kibox ḥozat aŞuḥlofe ḥaroye.',
-'recentchanges-label-newpage'     => 'Faṭo ḥaṭto',
-'recentchanges-label-minor'       => 'This is a minor edit',
-'recentchanges-label-bot'         => 'uŞuḥlofano sim muBot.',
+'nchanges' => '$1 {{PLURAL:$1|Şuḥlofo|Şuḥlofe}}',
+'recentchanges' => 'Şuḥlofe ḥaroye',
+'recentchanges-legend' => '3ayar daŞuḥlofe',
+'recentchanges-summary' => 'biFaṭaṭe kibox ḥozat aŞuḥlofe ḥaroye.',
+'recentchanges-feed-description' => 'biFaṭaṭe kibox ḥozat aŞuḥlofe ḥaroye.',
+'recentchanges-label-newpage' => 'Faṭo ḥaṭto',
+'recentchanges-label-minor' => 'This is a minor edit',
+'recentchanges-label-bot' => 'uŞuḥlofano sim muBot.',
 'recentchanges-label-unpatrolled' => 'This edit has not yet been patrolled',
-'rcnote'                          => "Below {{PLURAL:$1|is '''1''' change|are the last '''$1''' changes}} in the last {{PLURAL:$2|day|'''$2''' days}}, as of $5, $4.",
-'rcnotefrom'                      => 'Herke komaḥwın aŞuḥlofe ḥaroye men ""$2"" (hul buSowudo ""$1"").',
-'rclistfrom'                      => 'Maḥway li Şuḥlofe ḥaṭe men $1',
-'rcshowhideminor'                 => '$1 minor edits',
-'rcshowhidebots'                  => '$1 bots',
-'rcshowhideliu'                   => '$1 Hadome d3abiri',
-'rcshowhideanons'                 => '$1 Hadomo nuxroyo',
-'rcshowhidepatr'                  => '$1 patrolled edits',
-'rcshowhidemine'                  => 'aMaṫwoṭayḍi ($1)',
-'rclinks'                         => 'Maḥway li $1 aŞuḥlofe ḥaroye men meqım $2 Yawme hul u³do. <br />$3',
-'diff'                            => 'Frişuṭo',
-'hist'                            => 'Maktabzabno',
-'hide'                            => 'Tlay',
-'show'                            => 'Maḥway',
-'minoreditletter'                 => 'm',
-'newpageletter'                   => 'N',
-'boteditletter'                   => 'b',
-'rc-enhanced-expand'              => 'Maḥway aŞelole',
-'rc-enhanced-hide'                => 'Tlay aŞelole',
+'rcnote' => "Below {{PLURAL:$1|is '''1''' change|are the last '''$1''' changes}} in the last {{PLURAL:$2|day|'''$2''' days}}, as of $5, $4.",
+'rcnotefrom' => 'Herke komaḥwın aŞuḥlofe ḥaroye men ""$2"" (hul buSowudo ""$1"").',
+'rclistfrom' => 'Maḥway li Şuḥlofe ḥaṭe men $1',
+'rcshowhideminor' => '$1 minor edits',
+'rcshowhidebots' => '$1 bots',
+'rcshowhideliu' => '$1 Hadome d3abiri',
+'rcshowhideanons' => '$1 Hadomo nuxroyo',
+'rcshowhidepatr' => '$1 patrolled edits',
+'rcshowhidemine' => 'aMaṫwoṭayḍi ($1)',
+'rclinks' => 'Maḥway li $1 aŞuḥlofe ḥaroye men meqım $2 Yawme hul u³do. <br />$3',
+'diff' => 'Frişuṭo',
+'hist' => 'Maktabzabno',
+'hide' => 'Tlay',
+'show' => 'Maḥway',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Maḥway aŞelole',
+'rc-enhanced-hide' => 'Tlay aŞelole',
 
 # Recent changes linked
-'recentchangeslinked'          => 'Şuḥlofe bFaṭoṭe masre',
-'recentchangeslinked-toolbox'  => 'Şuḥlofe bFaṭoṭe masre',
-'recentchangeslinked-title'    => 'Şuḥlofe bFaṭoṭe dkıtne masre b$1',
+'recentchangeslinked' => 'Şuḥlofe bFaṭoṭe masre',
+'recentchangeslinked-toolbox' => 'Şuḥlofe bFaṭoṭe masre',
+'recentchangeslinked-title' => 'Şuḥlofe bFaṭoṭe dkıtne masre b$1',
 'recentchangeslinked-noresult' => 'No changes on linked pages during the given period.',
-'recentchangeslinked-summary'  => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
+'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
 Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
-'recentchangeslinked-page'     => 'Işmo diFaṭo',
-'recentchangeslinked-to'       => 'Maḥway li Şuḥlofe dFaṭoṭe dkitne masre lerke.',
+'recentchangeslinked-page' => 'Işmo diFaṭo',
+'recentchangeslinked-to' => 'Maḥway li Şuḥlofe dFaṭoṭe dkitne masre lerke.',
 
 # Upload
-'upload'        => 'Mosaq Fayl',
+'upload' => 'Mosaq Fayl',
 'uploadlogpage' => 'Upload log',
-'filedesc'      => 'Sfiquṭo',
+'filedesc' => 'Sfiquṭo',
 'uploadedimage' => 'mosaq "[[$1]]"',
 
-'license'        => 'Fsoso',
+'license' => 'Fsoso',
 'license-header' => 'Fsoso',
 
 # File description page
-'file-anchor-link'       => 'Fayl',
-'filehist'               => 'Maktabzabno duFayl',
-'filehist-help'          => 'Click on a date/time to view the file as it appeared at that time.',
-'filehist-revert'        => 'revert',
-'filehist-current'       => 'current',
-'filehist-datetime'      => 'Zabno',
-'filehist-thumb'         => 'Thumbnail',
-'filehist-thumbtext'     => 'Thumbnail for version as of $1',
-'filehist-user'          => 'Hadomo',
-'filehist-dimensions'    => 'Dimensions',
-'filehist-comment'       => 'Comment',
-'imagelinks'             => 'File usage',
-'linkstoimage'           => 'The following {{PLURAL:$1|page links|$1 pages link}} to this file:',
-'nolinkstoimage'         => 'There are no pages that link to this file.',
+'file-anchor-link' => 'Fayl',
+'filehist' => 'Maktabzabno duFayl',
+'filehist-help' => 'Click on a date/time to view the file as it appeared at that time.',
+'filehist-revert' => 'revert',
+'filehist-current' => 'current',
+'filehist-datetime' => 'Zabno',
+'filehist-thumb' => 'Thumbnail',
+'filehist-thumbtext' => 'Thumbnail for version as of $1',
+'filehist-user' => 'Hadomo',
+'filehist-dimensions' => 'Dimensions',
+'filehist-comment' => 'Comment',
+'imagelinks' => 'File usage',
+'linkstoimage' => 'The following {{PLURAL:$1|page links|$1 pages link}} to this file:',
+'nolinkstoimage' => 'There are no pages that link to this file.',
 'sharedupload-desc-here' => 'This file is from $1 and may be used by other projects.
 The description on its [$2 file description page] there is shown below.',
 
@@ -542,44 +542,44 @@ The description on its [$2 file description page] there is shown below.',
 
 'disambiguationspage' => 'Template:disambig',
 
-'brokenredirects-edit'   => 'mşaḥlaf',
+'brokenredirects-edit' => 'mşaḥlaf',
 'brokenredirects-delete' => 'slag',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|byte|bytes}}',
-'nmembers'      => '$1 {{PLURAL:$1|Hadomo|Hadome}}',
-'prefixindex'   => 'aFaṭoṭe kulle dkitte Prefiks',
-'usercreated'   => '{{GENDER:$3|kṭule}}  $1 b$2',
-'newpages'      => 'Faṭoṭe ḥaṭe',
-'move'          => 'Mtaxar',
+'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|Hadomo|Hadome}}',
+'prefixindex' => 'aFaṭoṭe kulle dkitte Prefiks',
+'usercreated' => '{{GENDER:$3|kṭule}}  $1 b$2',
+'newpages' => 'Faṭoṭe ḥaṭe',
+'move' => 'Mtaxar',
 'pager-newer-n' => '{{PLURAL:$1|1 ḥreno |$1 ḥrene}}',
 'pager-older-n' => '{{PLURAL:$1|3atiqo1|3atiqe $1}}',
 
 # Book sources
-'booksources'               => 'Kruxyo baNumarat duISBN',
+'booksources' => 'Kruxyo baNumarat duISBN',
 'booksources-search-legend' => 'Krax Mabu³e me Kṭowe',
-'booksources-go'            => 'Zux',
+'booksources-go' => 'Zux',
 
 # Special:Log
 'log' => 'Logs',
 
 # Special:AllPages
-'allpages'       => 'aFaṭaṭe kulle',
+'allpages' => 'aFaṭaṭe kulle',
 'alphaindexline' => '$1  l$2',
-'allarticles'    => 'aFaṭaṭe kulle',
-'allpagesnext'   => 'Ḥreto',
+'allarticles' => 'aFaṭaṭe kulle',
+'allpagesnext' => 'Ḥreto',
 'allpagessubmit' => 'Zux',
 
 # Special:Categories
 'categories' => 'Sedre',
 
 # Special:DeletedContributions
-'deletedcontributions'             => 'Maṫwoṭo slige',
-'deletedcontributions-title'       => 'Maṫwoṭo slige',
+'deletedcontributions' => 'Maṫwoṭo slige',
+'deletedcontributions-title' => 'Maṫwoṭo slige',
 'sp-deletedcontributions-contribs' => 'Maṫwoṭo',
 
 # Special:LinkSearch
-'linksearch-ok'   => 'Krax',
+'linksearch-ok' => 'Krax',
 'linksearch-line' => '$1 masro yo b$2',
 
 # Special:ListUsers
@@ -589,183 +589,183 @@ The description on its [$2 file description page] there is shown below.',
 'newuserlogpage' => 'User creation log',
 
 # Special:ListGroupRights
-'listgrouprights-group'    => 'Gudo',
-'listgrouprights-rights'   => 'Ḥaqat',
+'listgrouprights-group' => 'Gudo',
+'listgrouprights-rights' => 'Ḥaqat',
 'listgrouprights-helppage' => 'Help: Ḥaqat diGudo',
-'listgrouprights-members'  => '(Lista daHadome)',
+'listgrouprights-members' => '(Lista daHadome)',
 
 # E-mail user
-'emailuser'     => 'Kṭaw Email luHadomano.',
+'emailuser' => 'Kṭaw Email luHadomano.',
 'emailusername' => 'Işme duHadomo:',
-'emailfrom'     => 'Men:',
-'emailto'       => 'Lwoṭ:',
-'emailmessage'  => 'Ṫebo:',
+'emailfrom' => 'Men:',
+'emailto' => 'Lwoṭ:',
+'emailmessage' => 'Ṫebo:',
 
 # Watchlist
-'watchlist'         => 'My watchlist',
-'mywatchlist'       => 'My watchlist',
-'watchlistfor2'     => 'L$1 $2',
-'watch'             => 'Watch',
-'unwatch'           => 'Unwatch',
+'watchlist' => 'My watchlist',
+'mywatchlist' => 'My watchlist',
+'watchlistfor2' => 'L$1 $2',
+'watch' => 'Watch',
+'unwatch' => 'Unwatch',
 'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
-'wlshowlast'        => 'Maḥway li aŞuḥlofe dıtsimi meqım $1 Sa³ayat $2 Yawme $3',
+'wlshowlast' => 'Maḥway li aŞuḥlofe dıtsimi meqım $1 Sa³ayat $2 Yawme $3',
 'watchlist-options' => 'Watchlist options',
 
 # Delete
 'actioncomplete' => 'uDuboro kamıl',
-'actionfailed'   => 'Action failed',
-'dellogpage'     => 'Deletion log',
+'actionfailed' => 'Action failed',
+'dellogpage' => 'Deletion log',
 
 # Rollback
 'rollbacklink' => 'rollback',
 
 # Protect
-'protectlogpage'   => 'Protection log',
+'protectlogpage' => 'Protection log',
 'protectedarticle' => 'mastar "[[$1]]"',
 
 # Undelete
-'undeletelink'              => 'view/restore',
-'undeleteviewlink'          => 'ḥur',
-'undelete-search-submit'    => 'Krax',
+'undeletelink' => 'view/restore',
+'undeleteviewlink' => 'ḥur',
+'undelete-search-submit' => 'Krax',
 'undelete-show-file-submit' => 'Eh',
 
 # Namespace form on various pages
-'namespace'      => 'Dukṭo luIşmo',
-'invert'         => 'Invert selection',
+'namespace' => 'Dukṭo luIşmo',
+'invert' => 'Invert selection',
 'blanknamespace' => '(Rişoyto)',
 
 # Contributions
-'contributions'       => 'Maṫwoṭo duHadomo:',
+'contributions' => 'Maṫwoṭo duHadomo:',
 'contributions-title' => 'Maṫwoṭo d$1',
-'mycontris'           => 'aMaṫwoṭayḍi',
-'contribsub2'         => 'd$1 ($2)',
-'uctop'               => '(ḥaroyo)',
-'month'               => 'muYarḥo',
-'year'                => 'hul iŞato:',
+'mycontris' => 'aMaṫwoṭayḍi',
+'contribsub2' => 'd$1 ($2)',
+'uctop' => '(ḥaroyo)',
+'month' => 'muYarḥo',
+'year' => 'hul iŞato:',
 
-'sp-contributions-newbies'  => 'Bes maḥway Maṫwoṭo dHadome ḥaṭe',
+'sp-contributions-newbies' => 'Bes maḥway Maṫwoṭo dHadome ḥaṭe',
 'sp-contributions-blocklog' => 'Block log',
-'sp-contributions-deleted'  => 'Maṫwoṭo slige',
-'sp-contributions-uploads'  => 'Fayl masalqo',
-'sp-contributions-logs'     => 'logs',
-'sp-contributions-talk'     => 'Mamlo',
-'sp-contributions-search'   => 'Krax Maṫwoṭo',
+'sp-contributions-deleted' => 'Maṫwoṭo slige',
+'sp-contributions-uploads' => 'Fayl masalqo',
+'sp-contributions-logs' => 'logs',
+'sp-contributions-talk' => 'Mamlo',
+'sp-contributions-search' => 'Krax Maṫwoṭo',
 'sp-contributions-username' => 'IP-Adres aw Işme duHadmomo:',
-'sp-contributions-toponly'  => 'Only show edits that are latest revisions',
-'sp-contributions-submit'   => 'Krax',
+'sp-contributions-toponly' => 'Only show edits that are latest revisions',
+'sp-contributions-submit' => 'Krax',
 
 # What links here
-'whatlinkshere'            => 'Asirwoṭo biFaṭaṭe',
-'whatlinkshere-title'      => 'Faṭoṭe dkitte Asiruṭo 3am"$1"',
-'whatlinkshere-page'       => 'Faṭo',
-'linkshere'                => "aFaṭoṭani masre ne 3am '''[[:$1]]''':",
-'nolinkshere'              => "Layto Faṭoṭe dkitte Asiruṭo 3am '''[[:$1]]'''.",
-'isredirect'               => 'redirect page',
-'istemplate'               => 'transclusion',
-'isimage'                  => 'Asiruṭo duFayl',
-'whatlinkshere-prev'       => '{{PLURAL:$1|meqımtır|$1 meqımtır}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|ḥreno|$1 ḥrene}}',
-'whatlinkshere-links'      => '← Asirwoṭo',
+'whatlinkshere' => 'Asirwoṭo biFaṭaṭe',
+'whatlinkshere-title' => 'Faṭoṭe dkitte Asiruṭo 3am"$1"',
+'whatlinkshere-page' => 'Faṭo',
+'linkshere' => "aFaṭoṭani masre ne 3am '''[[:$1]]''':",
+'nolinkshere' => "Layto Faṭoṭe dkitte Asiruṭo 3am '''[[:$1]]'''.",
+'isredirect' => 'redirect page',
+'istemplate' => 'transclusion',
+'isimage' => 'Asiruṭo duFayl',
+'whatlinkshere-prev' => '{{PLURAL:$1|meqımtır|$1 meqımtır}}',
+'whatlinkshere-next' => '{{PLURAL:$1|ḥreno|$1 ḥrene}}',
+'whatlinkshere-links' => '← Asirwoṭo',
 'whatlinkshere-hideredirs' => '$1 redirects',
-'whatlinkshere-hidetrans'  => '$1 transclusions',
-'whatlinkshere-hidelinks'  => '$1 Asirwoṭo',
+'whatlinkshere-hidetrans' => '$1 transclusions',
+'whatlinkshere-hidelinks' => '$1 Asirwoṭo',
 'whatlinkshere-hideimages' => '$1 Asiruṭo duFayl',
-'whatlinkshere-filters'    => 'Filtrat',
+'whatlinkshere-filters' => 'Filtrat',
 
 # Block/unblock
-'ipboptions'               => '2 Sa³ayat:2 hours,1 Yawmo:1 day,3 Yawme:3 days,1 Şabṭo:1 week,2 Şabe:2 weeks,1 Yarḥo:1 month,3 Yarḥe:3 months,6 Yarḥe :6 months,1 Şato:1 year,indefinite:infinite',
-'ipblocklist'              => 'Blocked users',
-'ipblocklist-submit'       => 'Krax',
-'blocklink'                => 'Maḥram',
-'unblocklink'              => 'unblock',
-'change-blocklink'         => 'change block',
-'contribslink'             => 'Maṫwoṭo',
-'blocklogpage'             => 'Block log',
-'blocklogentry'            => 'blocked [[$1]] with an expiry time of $2 $3',
+'ipboptions' => '2 Sa³ayat:2 hours,1 Yawmo:1 day,3 Yawme:3 days,1 Şabṭo:1 week,2 Şabe:2 weeks,1 Yarḥo:1 month,3 Yarḥe:3 months,6 Yarḥe :6 months,1 Şato:1 year,indefinite:infinite',
+'ipblocklist' => 'Blocked users',
+'ipblocklist-submit' => 'Krax',
+'blocklink' => 'Maḥram',
+'unblocklink' => 'unblock',
+'change-blocklink' => 'change block',
+'contribslink' => 'Maṫwoṭo',
+'blocklogpage' => 'Block log',
+'blocklogentry' => 'blocked [[$1]] with an expiry time of $2 $3',
 'block-log-flags-nocreate' => 'account creation disabled',
 
 # Move page
 'movelogpage' => 'Move log',
-'revertmove'  => 'revert',
+'revertmove' => 'revert',
 
 # Export
 'export' => 'Mofaq iFaṭaṭe',
 
 # Namespace 8 related
-'allmessages'               => 'Ṫebo duSistem dMEdiaWiki',
-'allmessagesname'           => 'Işmo',
-'allmessagesdefault'        => 'Syomo standard',
-'allmessages-language'      => 'Leşono',
+'allmessages' => 'Ṫebo duSistem dMEdiaWiki',
+'allmessagesname' => 'Işmo',
+'allmessagesdefault' => 'Syomo standard',
+'allmessages-language' => 'Leşono',
 'allmessages-filter-submit' => 'Zux',
 
 # Thumbnails
-'thumbnail-more'  => 'Rabtır',
+'thumbnail-more' => 'Rabtır',
 'thumbnail_error' => 'Error creating thumbnail: $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'iFaṭaṭyḍox',
-'tooltip-pt-mytalk'               => 'iFaṭayḍux duDroşo',
-'tooltip-pt-preferences'          => 'a3ayaratayḍux',
-'tooltip-pt-watchlist'            => 'Lista dFaṭoṭe dkib³at mşaḥılfat',
-'tooltip-pt-mycontris'            => 'Lista daMaṫwoṭayḍox',
-'tooltip-pt-login'                => 'İnaqa demqaydat ruḥox ṫawo yo, elo letat mejbur',
-'tooltip-pt-logout'               => 'Nfoqo',
-'tooltip-ca-talk'                 => 'Droşo 3al iFaṭo daḤbişoṭo',
-'tooltip-ca-edit'                 => 'Kibux mşaḥılfat iFaṭaṭe, elo bo³o msta³mal uZra³lo duQontrol meqım demqaydat iFaṭo',
-'tooltip-ca-addsection'           => 'Bday Fusoqo ḥaṭo',
-'tooltip-ca-viewsource'           => 'This page is protected.
+'tooltip-pt-userpage' => 'iFaṭaṭyḍox',
+'tooltip-pt-mytalk' => 'iFaṭayḍux duDroşo',
+'tooltip-pt-preferences' => 'a3ayaratayḍux',
+'tooltip-pt-watchlist' => 'Lista dFaṭoṭe dkib³at mşaḥılfat',
+'tooltip-pt-mycontris' => 'Lista daMaṫwoṭayḍox',
+'tooltip-pt-login' => 'İnaqa demqaydat ruḥox ṫawo yo, elo letat mejbur',
+'tooltip-pt-logout' => 'Nfoqo',
+'tooltip-ca-talk' => 'Droşo 3al iFaṭo daḤbişoṭo',
+'tooltip-ca-edit' => 'Kibux mşaḥılfat iFaṭaṭe, elo bo³o msta³mal uZra³lo duQontrol meqım demqaydat iFaṭo',
+'tooltip-ca-addsection' => 'Bday Fusoqo ḥaṭo',
+'tooltip-ca-viewsource' => 'This page is protected.
 You can view its source',
-'tooltip-ca-history'              => 'Past revisions of this page',
-'tooltip-ca-protect'              => 'Mastar iFaṭaṭe',
-'tooltip-ca-delete'               => 'Slag iFaṭaṭe',
-'tooltip-ca-move'                 => 'Mataxar iFaṭaṭe',
-'tooltip-ca-watch'                => 'Add this page to your watchlist',
-'tooltip-ca-unwatch'              => 'Remove this page from your watchlist',
-'tooltip-search'                  => 'Krax{{SITENAME}}',
-'tooltip-search-go'               => 'Zux liFaṭo dkitla tam uIşmano.',
-'tooltip-search-fulltext'         => 'Krax uSyomano baFaṭoṭe',
-'tooltip-p-logo'                  => 'Z³ar iFaṭo rişoyto',
-'tooltip-n-mainpage'              => 'Z³ar iFaṭo rişoyto',
-'tooltip-n-mainpage-description'  => 'Z³ar iFaṭo rişoyto',
-'tooltip-n-portal'                => '3al iProja; mın komisam u ayko u ayko ne a medone.',
-'tooltip-n-currentevents'         => 'Find background information on current events',
-'tooltip-n-recentchanges'         => 'Lista daŞuḥlofe ḥaroye kulle',
-'tooltip-n-randompage'            => 'Ftaḥ Faṭo gedşonoyto',
-'tooltip-n-help'                  => 'Maḥway iFaṭo du3udrono',
-'tooltip-t-whatlinkshere'         => 'Lista daFaṭoṭe kulle dkitte Asiruṭo lerke',
-'tooltip-t-recentchangeslinked'   => 'Şuḥlofe ḥaroye bFaṭoṭe dkitte Asiruṭo lerke',
-'tooltip-feed-atom'               => 'Atom feed diFaṭaṭe',
-'tooltip-t-contributions'         => 'Lista daMaṫwoṭo duHadomano',
-'tooltip-t-emailuser'             => 'Mşadar Email luHadomano',
-'tooltip-t-upload'                => 'Mosaq aFayls',
-'tooltip-t-specialpages'          => 'Lista daFaṭoṭe dilonoye kulle.',
-'tooltip-t-print'                 => 'Printable version of this page',
-'tooltip-t-permalink'             => 'Asiruṭo aminoyto liFaṭaṭe',
-'tooltip-ca-nstab-main'           => 'Maḥway iFaṭo daḤbişoṭo',
-'tooltip-ca-nstab-user'           => 'Maḥway iFaṭo duHadomo',
-'tooltip-ca-nstab-special'        => 'Haṭe Faṭo dilonoyto yo, laybux mşaḥalfatla',
-'tooltip-ca-nstab-project'        => 'Maḥway iFaṭo diProja',
-'tooltip-ca-nstab-image'          => 'Maḥway iFaṭo duFayl',
-'tooltip-ca-nstab-template'       => 'View the template',
-'tooltip-ca-nstab-category'       => 'Maḥway iFaṭo daSedre',
-'tooltip-minoredit'               => 'Mark this as a minor edit',
-'tooltip-save'                    => 'Mqayad uŞuḥlofano',
-'tooltip-preview'                 => 'Preview your changes, please use this before saving!',
-'tooltip-diff'                    => 'Maḥway li aŞuḥlofe buSyomano',
+'tooltip-ca-history' => 'Past revisions of this page',
+'tooltip-ca-protect' => 'Mastar iFaṭaṭe',
+'tooltip-ca-delete' => 'Slag iFaṭaṭe',
+'tooltip-ca-move' => 'Mataxar iFaṭaṭe',
+'tooltip-ca-watch' => 'Add this page to your watchlist',
+'tooltip-ca-unwatch' => 'Remove this page from your watchlist',
+'tooltip-search' => 'Krax{{SITENAME}}',
+'tooltip-search-go' => 'Zux liFaṭo dkitla tam uIşmano.',
+'tooltip-search-fulltext' => 'Krax uSyomano baFaṭoṭe',
+'tooltip-p-logo' => 'Z³ar iFaṭo rişoyto',
+'tooltip-n-mainpage' => 'Z³ar iFaṭo rişoyto',
+'tooltip-n-mainpage-description' => 'Z³ar iFaṭo rişoyto',
+'tooltip-n-portal' => '3al iProja; mın komisam u ayko u ayko ne a medone.',
+'tooltip-n-currentevents' => 'Find background information on current events',
+'tooltip-n-recentchanges' => 'Lista daŞuḥlofe ḥaroye kulle',
+'tooltip-n-randompage' => 'Ftaḥ Faṭo gedşonoyto',
+'tooltip-n-help' => 'Maḥway iFaṭo du3udrono',
+'tooltip-t-whatlinkshere' => 'Lista daFaṭoṭe kulle dkitte Asiruṭo lerke',
+'tooltip-t-recentchangeslinked' => 'Şuḥlofe ḥaroye bFaṭoṭe dkitte Asiruṭo lerke',
+'tooltip-feed-atom' => 'Atom feed diFaṭaṭe',
+'tooltip-t-contributions' => 'Lista daMaṫwoṭo duHadomano',
+'tooltip-t-emailuser' => 'Mşadar Email luHadomano',
+'tooltip-t-upload' => 'Mosaq aFayls',
+'tooltip-t-specialpages' => 'Lista daFaṭoṭe dilonoye kulle.',
+'tooltip-t-print' => 'Printable version of this page',
+'tooltip-t-permalink' => 'Asiruṭo aminoyto liFaṭaṭe',
+'tooltip-ca-nstab-main' => 'Maḥway iFaṭo daḤbişoṭo',
+'tooltip-ca-nstab-user' => 'Maḥway iFaṭo duHadomo',
+'tooltip-ca-nstab-special' => 'Haṭe Faṭo dilonoyto yo, laybux mşaḥalfatla',
+'tooltip-ca-nstab-project' => 'Maḥway iFaṭo diProja',
+'tooltip-ca-nstab-image' => 'Maḥway iFaṭo duFayl',
+'tooltip-ca-nstab-template' => 'View the template',
+'tooltip-ca-nstab-category' => 'Maḥway iFaṭo daSedre',
+'tooltip-minoredit' => 'Mark this as a minor edit',
+'tooltip-save' => 'Mqayad uŞuḥlofano',
+'tooltip-preview' => 'Preview your changes, please use this before saving!',
+'tooltip-diff' => 'Maḥway li aŞuḥlofe buSyomano',
 'tooltip-compareselectedversions' => 'See the differences between the two selected revisions of this page',
-'tooltip-watch'                   => 'Add this page to your watchlist',
-'tooltip-rollback'                => '"Rollback" reverts edit(s) to this page of the last contributor in one click',
-'tooltip-undo'                    => '"Undo" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.',
-'tooltip-summary'                 => 'Enter a short summary',
+'tooltip-watch' => 'Add this page to your watchlist',
+'tooltip-rollback' => '"Rollback" reverts edit(s) to this page of the last contributor in one click',
+'tooltip-undo' => '"Undo" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.',
+'tooltip-summary' => 'Enter a short summary',
 
 # Browsing diffs
 'previousdiff' => '← Şuḥlofo 3atiqo',
-'nextdiff'     => 'Hiç lo mşaḥalfat →',
+'nextdiff' => 'Hiç lo mşaḥalfat →',
 
 # Media information
 'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
-'file-nohires'   => 'No higher resolution available.',
-'svg-long-desc'  => 'SCG Fayl, Rabuṭo $1 × $2 pixel, Rabuṭo duFayl: $3',
+'file-nohires' => 'No higher resolution available.',
+'svg-long-desc' => 'SCG Fayl, Rabuṭo $1 × $2 pixel, Rabuṭo duFayl: $3',
 'show-big-image' => 'Tam faṥiḥ',
 
 # Special:NewFiles
@@ -773,7 +773,7 @@ You can view its source',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|$1 Ṥaniye|$1 Ṥaniyat}}',
-'ago'     => 'meqım $1',
+'ago' => 'meqım $1',
 
 # Bad image list
 'bad_image_list' => 'The format is as follows:
@@ -783,8 +783,8 @@ The first link on a line must be a link to a bad file.
 Any subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.',
 
 # Metadata
-'metadata'        => 'Metadata',
-'metadata-help'   => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.
+'metadata' => 'Metadata',
+'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.
 If the file has been modified from its original state, some details may not fully reflect the modified file.',
 'metadata-fields' => 'Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.
 Others will be hidden by default.
@@ -803,23 +803,23 @@ Others will be hidden by default.
 * gpsaltitude',
 
 # EXIF tags
-'exif-writer'          => 'Kaṭowo',
-'exif-languagecode'    => 'Leşono',
+'exif-writer' => 'Kaṭowo',
+'exif-languagecode' => 'Leşono',
 'exif-cameraownername' => 'uMoro diQamera',
 
 # External editor support
-'edit-externally'      => 'Edit this file using an external application',
+'edit-externally' => 'Edit this file using an external application',
 'edit-externally-help' => '(See the [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'kulle',
 'namespacesall' => 'kulle',
-'monthsall'     => 'kulle',
+'monthsall' => 'kulle',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'View relevant changes',
 'watchlisttools-edit' => 'View and edit watchlist',
-'watchlisttools-raw'  => 'Edit raw watchlist',
+'watchlisttools-raw' => 'Edit raw watchlist',
 
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
@@ -858,24 +858,24 @@ Others will be hidden by default.
 iFaṭaṭe u3do kitla Qaṫre.',
 
 # HTML forms
-'htmlform-submit'              => 'Mqayad',
+'htmlform-submit' => 'Mqayad',
 'htmlform-selectorother-other' => 'Ḥrene',
 
 # Feedback
 'feedback-message' => 'Ṫebo:',
-'feedback-cancel'  => 'Mbaṫel',
+'feedback-cancel' => 'Mbaṫel',
 
 # API errors
 'api-error-unknownerror' => 'Fawdo nuxroyo: $1',
 
 # Durations
-'duration-seconds'   => '$1 {{PLURAL:$1|Ṥaniye|Ṥaniyat}}',
-'duration-minutes'   => '$1 {{PLURAL:$1|Qaṫınto|Qaṫınoṭo}}',
-'duration-hours'     => '$1 {{PLURAL:$1|Sa³aye|Sa³ayat}}',
-'duration-days'      => '$1 {{PLURAL:$1|Yawmo|Yawme}}',
-'duration-weeks'     => '$1 {{PLURAL:$1|Şabṭo|Şabe}}',
-'duration-years'     => '$1 {{PLURAL:$1|Şato|Şnaye}}',
-'duration-decades'   => '$1 {{PLURAL:$1|decade|decades}}',
+'duration-seconds' => '$1 {{PLURAL:$1|Ṥaniye|Ṥaniyat}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Qaṫınto|Qaṫınoṭo}}',
+'duration-hours' => '$1 {{PLURAL:$1|Sa³aye|Sa³ayat}}',
+'duration-days' => '$1 {{PLURAL:$1|Yawmo|Yawme}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Şabṭo|Şabe}}',
+'duration-years' => '$1 {{PLURAL:$1|Şato|Şnaye}}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decades}}',
 'duration-centuries' => '$1 {{PLURAL:$1|Doro|Dore}}',
 
 );
index 26edd44..3c7ef51 100644 (file)
@@ -1941,6 +1941,7 @@ Template:消除歧義',
 # Miscellaneous special pages
 'nbytes' => '$1位元組',
 'ncategories' => '$1個分類',
+'ninterwikis' => '$1 個跨維基',
 'nlinks' => '$1個連結',
 'nmembers' => '$1個成員',
 'nrevisions' => '$1個修訂',
@@ -1969,6 +1970,7 @@ Template:消除歧義',
 'mostlinkedtemplates' => '最多連結模板',
 'mostcategories' => '最多分類頁面',
 'mostimages' => '最多連結檔案',
+'mostinterwikis' => '最多跨維基頁面',
 'mostrevisions' => '最多修訂頁面',
 'prefixindex' => '所有有前綴的頁面',
 'prefixindex-namespace' => '帶有前綴的頁面(屬於$1名字空間)',
@@ -2754,6 +2756,7 @@ $1被封禁的理由是“$2”',
 'import-interwiki-templates' => '包含所有模板',
 'import-interwiki-submit' => '匯入',
 'import-interwiki-namespace' => '目的名字空間:',
+'import-interwiki-rootpage' => '目標根頁(可選):',
 'import-upload-filename' => '檔案名稱:',
 'import-comment' => '註解:',
 'importtext' => '請使用[[Special:Export|匯出功能]]從來源維基匯出檔案,
@@ -2787,6 +2790,8 @@ $1被封禁的理由是“$2”',
 'import-error-special' => '"$1"未能導入因為該頁面使用一個不能創建頁面的特殊名字空間。',
 'import-error-invalid' => '"$1"不能導入,因為名字無效。',
 'import-options-wrong' => '{{PLURAL:$2|選項}}出錯:<nowiki>$1</nowiki>',
+'import-rootpage-invalid' => '指定的根頁標題無效。',
+'import-rootpage-nosubpage' => '名字空間「$1」的根頁面不允許子頁面。',
 
 # Import log
 'importlogpage' => '匯入日誌',
@@ -2943,6 +2948,8 @@ $1被封禁的理由是“$2”',
 'pageinfo-length' => '頁面長度 (以位元組為單位)',
 'pageinfo-article-id' => '頁面編號',
 'pageinfo-robot-policy' => '搜尋引擎狀態',
+'pageinfo-robot-index' => '可索引',
+'pageinfo-robot-noindex' => '不可索引',
 'pageinfo-views' => '觀看次數',
 'pageinfo-watchers' => '頁面監視者數目',
 'pageinfo-redirects-name' => '重定向到此頁',
index ec395eb..3ca3025 100644 (file)
@@ -354,12 +354,12 @@ class TextPassDumper extends BackupDumper {
                                wfDebug( "TextDumpPass::readDump encountered XML parsing error\n" );
 
                                $byte = xml_get_current_byte_index( $parser );
-                               $msg = wfMsgHtml( 'xml-error-string',
+                               $msg = wfMessage( 'xml-error-string',
                                        'XML import parse failure',
                                        xml_get_current_line_number( $parser ),
                                        xml_get_current_column_number( $parser ),
                                        $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte -$offset, 16 ) . '"' ) ),
-                                       xml_error_string( xml_get_error_code( $parser ) ) );
+                                       xml_error_string( xml_get_error_code( $parser ) ) )->escaped();
 
                                xml_parser_free( $parser );
 
index 69a2a78..0f73e88 100644 (file)
@@ -40,6 +40,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->addOption( 'b2', 'Backend 2', false, true );
                $this->addOption( 'srcdir', 'File source directory', true, true );
                $this->addOption( 'maxfiles', 'Max files', false, true );
+               $this->addOption( 'quick', 'Avoid operation pre-checks' );
        }
 
        public function execute() {
@@ -76,11 +77,14 @@ class TestFileOpPerformance extends Maintenance {
                        if ( $file[0] != '.' ) {
                                $this->output( "Using '$dirname/$file' in operations.\n" );
                                $dst = $baseDir . '/' . wfBaseName( $file );
-                               $ops1[] = array( 'op' => 'store', 'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
-                               $ops2[] = array( 'op' => 'copy', 'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1);
-                               $ops3[] = array( 'op' => 'move', 'src' => $dst, 'dst' => "$dst-2", 'overwrite' => 1);
-                               $ops4[] = array( 'op' => 'delete', 'src' => "$dst-1", 'overwrite' => 1 );
-                               $ops5[] = array( 'op' => 'delete', 'src' => "$dst-2", 'overwrite' => 1 );
+                               $ops1[] = array( 'op' => 'store',
+                                       'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
+                               $ops2[] = array( 'op' => 'copy',
+                                       'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1 );
+                               $ops3[] = array( 'op' => 'move',
+                                       'src' => $dst, 'dst' => "$dst-2", 'overwrite' => 1 );
+                               $ops4[] = array( 'op' => 'delete', 'src' => "$dst-1" );
+                               $ops5[] = array( 'op' => 'delete', 'src' => "$dst-2" );
                        }
                        if ( count( $ops1 ) >= $this->getOption( 'maxfiles', 20 ) ) {
                                break; // enough
@@ -89,8 +93,10 @@ class TestFileOpPerformance extends Maintenance {
                closedir( $dir );
                $this->output( "\n" );
 
+               $method = $this->hasOption( 'quick' ) ? 'doQuickOperations' : 'doOperations';
+
                $start = microtime( true );
-               $status = $backend->doOperations( $ops1, array( 'force' => 1 ) );
+               $status = $backend->$method( $ops1, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -99,7 +105,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Stored " . count( $ops1 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops2, array( 'force' => 1 ) );
+               $backend->$method( $ops2, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -108,7 +114,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Copied " . count( $ops2 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops3, array( 'force' => 1 ) );
+               $backend->$method( $ops3, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -117,7 +123,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Moved " . count( $ops3 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops4, array( 'force' => 1 ) );
+               $backend->$method( $ops4, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -126,7 +132,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Deleted " . count( $ops4 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops5, array( 'force' => 1 ) );
+               $backend->$method( $ops5, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
index 216af37..8f3b8e5 100644 (file)
@@ -381,7 +381,6 @@ class wikiFuzz {
                        "br"         => array( "CLASS", "ID", "STYLE", "title", "clear" ),
                        "cite"       => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "var"        => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
-                       "dl"         => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "ruby"       => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "rt"         => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "rp"         => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
@@ -1360,6 +1359,7 @@ class viewPageTest extends pageTest {
                                "rdfrom"         => wikiFuzz::makeFuzz( 2 ),  // things from Article.php from here on:
                                "token"          => wikiFuzz::makeFuzz( 2 ),
                                "tbid"           => wikiFuzz::makeFuzz( 2 ),
+                               // @todo FIXME: Duplicate array key.
                                "action"         => wikiFuzz::chooseInput( array( "purge", wikiFuzz::makeFuzz( 2 ) ) ),
                                "wpReason"       => wikiFuzz::makeFuzz( 2 ),
                                "wpEditToken"    => wikiFuzz::makeFuzz( 2 ),
index f6be347..33c104b 100644 (file)
@@ -1535,6 +1535,7 @@ $wgMessageStructure = array(
                'shared-repo',
                'shared-repo-name-wikimediacommons',
                'filepage.css',
+               'upload-disallowed-here',
        ),
        'filerevert' => array(
                'filerevert',
@@ -2745,6 +2746,7 @@ $wgMessageStructure = array(
                'file-info-size-pages',
                'file-nohires',
                'svg-long-desc',
+               'svg-long-desc-animated',
                'show-big-image',
                'show-big-image-preview',
                'show-big-image-other',
@@ -2754,6 +2756,8 @@ $wgMessageStructure = array(
                'file-info-png-looped',
                'file-info-png-repeat',
                'file-info-png-frames',
+               'file-no-thumb-animation',
+               'file-no-thumb-animation-gif',
        ),
        'newfiles' => array(
                'newimages',
index 0149ed7..1e99769 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Blind 1.8.22
+ * jQuery UI Effects Blind 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index e376cb9..7927a4a 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Bounce 1.8.22
+ * jQuery UI Effects Bounce 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 1ae4209..d8b8218 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Clip 1.8.22
+ * jQuery UI Effects Clip 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index a0efe68..91ac575 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects 1.8.22
+ * jQuery UI Effects 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -307,7 +307,7 @@ $.fn.extend({
 /******************************************************************************/
 
 $.extend($.effects, {
-       version: "1.8.22",
+       version: "1.8.23",
 
        // Saves a set of properties in a data storage
        save: function(element, set) {
@@ -564,210 +564,49 @@ $.fn.extend({
 /*********************************** EASING ***********************************/
 /******************************************************************************/
 
-/*
- * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
- *
- * Uses the built in easing capabilities added In jQuery 1.1
- * to offer multiple easing options
- *
- * TERMS OF USE - jQuery Easing
- *
- * Open source under the BSD License.
- *
- * Copyright 2008 George McGinley Smith
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * Neither the name of the author nor the names of contributors may be used to endorse
- * or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
-*/
+// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
 
-// t: current time, b: begInnIng value, c: change In value, d: duration
-$.easing.jswing = $.easing.swing;
+var baseEasings = {};
 
-$.extend($.easing,
-{
-       def: 'easeOutQuad',
-       swing: function (x, t, b, c, d) {
-               //alert($.easing.default);
-               return $.easing[$.easing.def](x, t, b, c, d);
-       },
-       easeInQuad: function (x, t, b, c, d) {
-               return c*(t/=d)*t + b;
-       },
-       easeOutQuad: function (x, t, b, c, d) {
-               return -c *(t/=d)*(t-2) + b;
-       },
-       easeInOutQuad: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t + b;
-               return -c/2 * ((--t)*(t-2) - 1) + b;
-       },
-       easeInCubic: function (x, t, b, c, d) {
-               return c*(t/=d)*t*t + b;
-       },
-       easeOutCubic: function (x, t, b, c, d) {
-               return c*((t=t/d-1)*t*t + 1) + b;
-       },
-       easeInOutCubic: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t*t + b;
-               return c/2*((t-=2)*t*t + 2) + b;
-       },
-       easeInQuart: function (x, t, b, c, d) {
-               return c*(t/=d)*t*t*t + b;
-       },
-       easeOutQuart: function (x, t, b, c, d) {
-               return -c * ((t=t/d-1)*t*t*t - 1) + b;
-       },
-       easeInOutQuart: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
-               return -c/2 * ((t-=2)*t*t*t - 2) + b;
-       },
-       easeInQuint: function (x, t, b, c, d) {
-               return c*(t/=d)*t*t*t*t + b;
-       },
-       easeOutQuint: function (x, t, b, c, d) {
-               return c*((t=t/d-1)*t*t*t*t + 1) + b;
-       },
-       easeInOutQuint: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
-               return c/2*((t-=2)*t*t*t*t + 2) + b;
-       },
-       easeInSine: function (x, t, b, c, d) {
-               return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
-       },
-       easeOutSine: function (x, t, b, c, d) {
-               return c * Math.sin(t/d * (Math.PI/2)) + b;
-       },
-       easeInOutSine: function (x, t, b, c, d) {
-               return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
-       },
-       easeInExpo: function (x, t, b, c, d) {
-               return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
-       },
-       easeOutExpo: function (x, t, b, c, d) {
-               return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
-       },
-       easeInOutExpo: function (x, t, b, c, d) {
-               if (t==0) return b;
-               if (t==d) return b+c;
-               if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
-               return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
-       },
-       easeInCirc: function (x, t, b, c, d) {
-               return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
-       },
-       easeOutCirc: function (x, t, b, c, d) {
-               return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
-       },
-       easeInOutCirc: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
-               return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
-       },
-       easeInElastic: function (x, t, b, c, d) {
-               var s=1.70158;var p=0;var a=c;
-               if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
-               if (a < Math.abs(c)) { a=c; var s=p/4; }
-               else var s = p/(2*Math.PI) * Math.asin (c/a);
-               return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
-       },
-       easeOutElastic: function (x, t, b, c, d) {
-               var s=1.70158;var p=0;var a=c;
-               if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
-               if (a < Math.abs(c)) { a=c; var s=p/4; }
-               else var s = p/(2*Math.PI) * Math.asin (c/a);
-               return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
-       },
-       easeInOutElastic: function (x, t, b, c, d) {
-               var s=1.70158;var p=0;var a=c;
-               if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
-               if (a < Math.abs(c)) { a=c; var s=p/4; }
-               else var s = p/(2*Math.PI) * Math.asin (c/a);
-               if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
-               return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
-       },
-       easeInBack: function (x, t, b, c, d, s) {
-               if (s == undefined) s = 1.70158;
-               return c*(t/=d)*t*((s+1)*t - s) + b;
-       },
-       easeOutBack: function (x, t, b, c, d, s) {
-               if (s == undefined) s = 1.70158;
-               return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
+       baseEasings[ name ] = function( p ) {
+               return Math.pow( p, i + 2 );
+       };
+});
+
+$.extend( baseEasings, {
+       Sine: function ( p ) {
+               return 1 - Math.cos( p * Math.PI / 2 );
        },
-       easeInOutBack: function (x, t, b, c, d, s) {
-               if (s == undefined) s = 1.70158;
-               if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
-               return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+       Circ: function ( p ) {
+               return 1 - Math.sqrt( 1 - p * p );
        },
-       easeInBounce: function (x, t, b, c, d) {
-               return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+       Elastic: function( p ) {
+               return p === 0 || p === 1 ? p :
+                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
        },
-       easeOutBounce: function (x, t, b, c, d) {
-               if ((t/=d) < (1/2.75)) {
-                       return c*(7.5625*t*t) + b;
-               } else if (t < (2/2.75)) {
-                       return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
-               } else if (t < (2.5/2.75)) {
-                       return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
-               } else {
-                       return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
-               }
+       Back: function( p ) {
+               return p * p * ( 3 * p - 2 );
        },
-       easeInOutBounce: function (x, t, b, c, d) {
-               if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
-               return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+       Bounce: function ( p ) {
+               var pow2,
+                       bounce = 4;
+
+               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
        }
 });
 
-/*
- *
- * TERMS OF USE - EASING EQUATIONS
- *
- * Open source under the BSD License.
- *
- * Copyright 2001 Robert Penner
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * Neither the name of the author nor the names of contributors may be used to endorse
- * or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
+$.each( baseEasings, function( name, easeIn ) {
+       $.easing[ "easeIn" + name ] = easeIn;
+       $.easing[ "easeOut" + name ] = function( p ) {
+               return 1 - easeIn( 1 - p );
+       };
+       $.easing[ "easeInOut" + name ] = function( p ) {
+               return p < .5 ?
+                       easeIn( p * 2 ) / 2 :
+                       easeIn( p * -2 + 2 ) / -2 + 1;
+       };
+});
 
 })(jQuery);
index dc5ce44..6d25bd3 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Drop 1.8.22
+ * jQuery UI Effects Drop 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 6be5582..1caeca8 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Explode 1.8.22
+ * jQuery UI Effects Explode 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c76e6bf..6124979 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fade 1.8.22
+ * jQuery UI Effects Fade 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 1788066..81b15b8 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fold 1.8.22
+ * jQuery UI Effects Fold 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 451b02d..dee0639 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Highlight 1.8.22
+ * jQuery UI Effects Highlight 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index f989174..45cdc88 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Pulsate 1.8.22
+ * jQuery UI Effects Pulsate 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index d5761a5..44ecee1 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Scale 1.8.22
+ * jQuery UI Effects Scale 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 6c2a8db..bc1fd19 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Shake 1.8.22
+ * jQuery UI Effects Shake 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c77fad6..0a43027 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Slide 1.8.22
+ * jQuery UI Effects Slide 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 5a68ae8..64f2a17 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Transfer 1.8.22
+ * jQuery UI Effects Transfer 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index d3dbdec..b3340e0 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Accordion 1.8.22
+ * jQuery UI Accordion 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -518,7 +518,7 @@ $.widget( "ui.accordion", {
 });
 
 $.extend( $.ui.accordion, {
-       version: "1.8.22",
+       version: "1.8.23",
        animations: {
                slide: function( options, additions ) {
                        options = $.extend({
index 501b604..b634cce 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Autocomplete 1.8.22
+ * jQuery UI Autocomplete 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index bdee27c..db2637e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Button 1.8.22
+ * jQuery UI Button 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 40211cc..1285a6d 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI 1.8.22
+ * jQuery UI 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -18,7 +18,7 @@ if ( $.ui.version ) {
 }
 
 $.extend( $.ui, {
-       version: "1.8.22",
+       version: "1.8.23",
 
        keyCode: {
                ALT: 18,
index 58d3ff2..7ea5b07 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Datepicker 1.8.22
+ * jQuery UI Datepicker 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -12,7 +12,7 @@
  */
 (function( $, undefined ) {
 
-$.extend($.ui, { datepicker: { version: "1.8.22" } });
+$.extend($.ui, { datepicker: { version: "1.8.23" } });
 
 var PROP_NAME = 'datepicker';
 var dpuuid = new Date().getTime();
@@ -1408,7 +1408,7 @@ $.extend(Datepicker.prototype, {
         */
        _attachHandlers: function(inst) {
                var stepMonths = this._get(inst, 'stepMonths');
-               var id = '#' + inst.id;
+               var id = '#' + inst.id.replace( /\\\\/g, "\\" );
                inst.dpDiv.find('[data-handler]').map(function () {
                        var handler = {
                                prev: function () {
@@ -1845,7 +1845,7 @@ $.fn.datepicker = function(options){
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.22";
+$.datepicker.version = "1.8.23";
 
 // Workaround for #4055
 // Add another global to avoid noConflict issues with inline event handlers
index bc66af5..082bf2c 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Dialog 1.8.22
+ * jQuery UI Dialog 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -37,18 +37,6 @@ var uiDialogClasses =
                maxWidth: true,
                minHeight: true,
                minWidth: true
-       },
-       // support for jQuery 1.3.2 - handle common attrFn methods for dialog
-       attrFn = $.attrFn || {
-               val: true,
-               css: true,
-               html: true,
-               text: true,
-               data: true,
-               width: true,
-               height: true,
-               offset: true,
-               click: true
        };
 
 $.widget("ui.dialog", {
@@ -397,7 +385,7 @@ $.widget("ui.dialog", {
                                        if ( key === "click" ) {
                                                return;
                                        }
-                                       if ( key in attrFn ) {
+                                       if ( key in button ) {
                                                button[ key ]( value );
                                        } else {
                                                button.attr( key, value );
@@ -702,7 +690,7 @@ $.widget("ui.dialog", {
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.22",
+       version: "1.8.23",
 
        uuid: 0,
        maxZ: 0,
index f93bb0b..6da1aaf 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Draggable 1.8.22
+ * jQuery UI Draggable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -513,7 +513,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 });
 
 $.extend($.ui.draggable, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 $.ui.plugin.add("draggable", "connectToSortable", {
index f4ae96a..4b98b3a 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Droppable 1.8.22
+ * jQuery UI Droppable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -147,7 +147,7 @@ $.widget("ui.droppable", {
 });
 
 $.extend($.ui.droppable, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 $.ui.intersect = function(draggable, droppable, toleranceMode) {
index c7f37d2..e051055 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Mouse 1.8.22
+ * jQuery UI Mouse 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -45,9 +45,11 @@ $.widget("ui.mouse", {
        // other instances of mouse
        _mouseDestroy: function() {
                this.element.unbind('.'+this.widgetName);
-               $(document)
-                       .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-                       .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+               if ( this._mouseMoveDelegate ) {
+                       $(document)
+                               .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                               .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+               }
        },
 
        _mouseDown: function(event) {
index 881dffe..03f2606 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Position 1.8.22
+ * jQuery UI Position 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -257,6 +257,11 @@ if ( !$.offset.setOffset ) {
        };
 }
 
+// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
+if ( !$.curCSS ) {
+       $.curCSS = $.css;
+}
+
 // fraction support test (older versions of jQuery don't support fractions)
 (function () {
        var body = document.getElementsByTagName( "body" )[ 0 ], 
index 70ab985..c1d9f3c 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Progressbar 1.8.22
+ * jQuery UI Progressbar 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -103,7 +103,7 @@ $.widget( "ui.progressbar", {
 });
 
 $.extend( $.ui.progressbar, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 })( jQuery );
index d8f6c88..f6ce694 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Resizable 1.8.22
+ * jQuery UI Resizable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -540,7 +540,7 @@ $.widget("ui.resizable", $.ui.mouse, {
 });
 
 $.extend($.ui.resizable, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 /*
index 9d9e553..ac5bf04 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectable 1.8.22
+ * jQuery UI Selectable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -261,7 +261,7 @@ $.widget("ui.selectable", $.ui.mouse, {
 });
 
 $.extend($.ui.selectable, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 })(jQuery);
index 4b24fb9..5ea589e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Slider 1.8.22
+ * jQuery UI Slider 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -656,7 +656,7 @@ $.widget( "ui.slider", $.ui.mouse, {
 });
 
 $.extend( $.ui.slider, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 }(jQuery));
index 0e11f46..1d87f65 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Sortable 1.8.22
+ * jQuery UI Sortable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -1078,7 +1078,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 });
 
 $.extend($.ui.sortable, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 })(jQuery);
index 7a50626..de453cc 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tabs 1.8.22
+ * jQuery UI Tabs 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -698,7 +698,7 @@ $.widget( "ui.tabs", {
 });
 
 $.extend( $.ui.tabs, {
-       version: "1.8.22"
+       version: "1.8.23"
 });
 
 /*
index 8a9cc3f..befdcc2 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Widget 1.8.22
+ * jQuery UI Widget 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index e15202f..1ce7d5e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Accordion 1.8.22
+ * jQuery UI Accordion 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c697c3d..a9817ce 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Autocomplete 1.8.22
+ * jQuery UI Autocomplete 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -13,7 +13,7 @@
 * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
 
 /*
- * jQuery UI Menu 1.8.22
+ * jQuery UI Menu 1.8.23
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index d4984fb..c1f2600 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Button 1.8.22
+ * jQuery UI Button 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index f8e7e5b..c24627e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI CSS Framework 1.8.22
+ * jQuery UI CSS Framework 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index d543625..0282eee 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Datepicker 1.8.22
+ * jQuery UI Datepicker 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index bd264da..ba50ba5 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Dialog 1.8.22
+ * jQuery UI Dialog 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 8f3774e..c775a33 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Progressbar 1.8.22
+ * jQuery UI Progressbar 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 568b570..420c4af 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Resizable 1.8.22
+ * jQuery UI Resizable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 54d504b..3320274 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectable 1.8.22
+ * jQuery UI Selectable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index e0f7bea..650ad7e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Slider 1.8.22
+ * jQuery UI Slider 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 6da4af3..64ac9bf 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tabs 1.8.22
+ * jQuery UI Tabs 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 36b331c..536c8e0 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI CSS Framework 1.8.22
+ * jQuery UI CSS Framework 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index fdcdd15..13e9a55 100644 (file)
 /*!
  * jQuery Form Plugin
- * version: 2.84 (12-AUG-2011)
+ * version: 3.14 (30-JUL-2012)
  * @requires jQuery v1.3.2 or later
  *
  * Examples and documentation at: http://malsup.com/jquery/form/
+ * Project repository: https://github.com/malsup/form
  * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
+ *    http://malsup.github.com/mit-license.txt
+ *    http://malsup.github.com/gpl-license-v2.txt
  */
+/*global ActiveXObject alert */
 ;(function($) {
+"use strict";
 
 /*
-       Usage Note:
-       -----------
-       Do not use both ajaxSubmit and ajaxForm on the same form.  These
-       functions are intended to be exclusive.  Use ajaxSubmit if you want
-       to bind your own submit handler to the form.  For example,
-
-       $(document).ready(function() {
-               $('#myForm').bind('submit', function(e) {
-                       e.preventDefault(); // <-- important
-                       $(this).ajaxSubmit({
-                               target: '#output'
-                       });
-               });
-       });
-
-       Use ajaxForm when you want the plugin to manage all the event binding
-       for you.  For example,
-
-       $(document).ready(function() {
-               $('#myForm').ajaxForm({
-                       target: '#output'
-               });
-       });
-
-       When using ajaxForm, the ajaxSubmit function will be invoked for you
-       at the appropriate time.
+    Usage Note:
+    -----------
+    Do not use both ajaxSubmit and ajaxForm on the same form.  These
+    functions are mutually exclusive.  Use ajaxSubmit if you want
+    to bind your own submit handler to the form.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').on('submit', function(e) {
+            e.preventDefault(); // <-- important
+            $(this).ajaxSubmit({
+                target: '#output'
+            });
+        });
+    });
+
+    Use ajaxForm when you want the plugin to manage all the event binding
+    for you.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').ajaxForm({
+            target: '#output'
+        });
+    });
+    
+    You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
+    form does not have to exist when you invoke ajaxForm:
+
+    $('#myForm').ajaxForm({
+        delegation: true,
+        target: '#output'
+    });
+    
+    When using ajaxForm, the ajaxSubmit function will be invoked for you
+    at the appropriate time.
 */
 
+/**
+ * Feature detection
+ */
+var feature = {};
+feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
+feature.formdata = window.FormData !== undefined;
+
 /**
  * ajaxSubmit() provides a mechanism for immediately submitting
  * an HTML form using AJAX.
  */
 $.fn.ajaxSubmit = function(options) {
-       // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
-       if (!this.length) {
-               log('ajaxSubmit: skipping submit process - no element selected');
-               return this;
-       }
-       
-       var method, action, url, $form = this;
-
-       if (typeof options == 'function') {
-               options = { success: options };
-       }
-
-       method = this.attr('method');
-       action = this.attr('action');
-       url = (typeof action === 'string') ? $.trim(action) : '';
-       url = url || window.location.href || '';
-       if (url) {
-               // clean url (don't include hash vaue)
-               url = (url.match(/^([^#]+)/)||[])[1];
-       }
-
-       options = $.extend(true, {
-               url:  url,
-               success: $.ajaxSettings.success,
-               type: method || 'GET',
-               iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
-       }, options);
-
-       // hook for manipulating the form data before it is extracted;
-       // convenient for use with rich editors like tinyMCE or FCKEditor
-       var veto = {};
-       this.trigger('form-pre-serialize', [this, options, veto]);
-       if (veto.veto) {
-               log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
-               return this;
-       }
-
-       // provide opportunity to alter form data before it is serialized
-       if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
-               log('ajaxSubmit: submit aborted via beforeSerialize callback');
-               return this;
-       }
-
-       var n,v,a = this.formToArray(options.semantic);
-       if (options.data) {
-               options.extraData = options.data;
-               for (n in options.data) {
-                       if( $.isArray(options.data[n]) ) {
-                               for (var k in options.data[n]) {
-                                       a.push( { name: n, value: options.data[n][k] } );
-                               }
-                       }
-                       else {
-                               v = options.data[n];
-                               v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
-                               a.push( { name: n, value: v } );
-                       }
-               }
-       }
-
-       // give pre-submit callback an opportunity to abort the submit
-       if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
-               log('ajaxSubmit: submit aborted via beforeSubmit callback');
-               return this;
-       }
-
-       // fire vetoable 'validate' event
-       this.trigger('form-submit-validate', [a, this, options, veto]);
-       if (veto.veto) {
-               log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
-               return this;
-       }
-
-       var q = $.param(a);
-
-       if (options.type.toUpperCase() == 'GET') {
-               options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
-               options.data = null;  // data is null for 'get'
-       }
-       else {
-               options.data = q; // data is the query string for 'post'
-       }
-
-       var callbacks = [];
-       if (options.resetForm) {
-               callbacks.push(function() { $form.resetForm(); });
-       }
-       if (options.clearForm) {
-               callbacks.push(function() { $form.clearForm(); });
-       }
-
-       // perform a load on the target only if dataType is not provided
-       if (!options.dataType && options.target) {
-               var oldSuccess = options.success || function(){};
-               callbacks.push(function(data) {
-                       var fn = options.replaceTarget ? 'replaceWith' : 'html';
-                       $(options.target)[fn](data).each(oldSuccess, arguments);
-               });
-       }
-       else if (options.success) {
-               callbacks.push(options.success);
-       }
-
-       options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
-               var context = options.context || options;   // jQuery 1.4+ supports scope context 
-               for (var i=0, max=callbacks.length; i < max; i++) {
-                       callbacks[i].apply(context, [data, status, xhr || $form, $form]);
-               }
-       };
-
-       // are there files to upload?
-       var fileInputs = $('input:file', this).length > 0;
-       var mp = 'multipart/form-data';
-       var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
-
-       // options.iframe allows user to force iframe mode
-       // 06-NOV-09: now defaulting to iframe mode if file input is detected
-   if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
-          // hack to fix Safari hang (thanks to Tim Molendijk for this)
-          // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
-          if (options.closeKeepAlive) {
-                  $.get(options.closeKeepAlive, function() { fileUpload(a); });
-               }
-          else {
-                  fileUpload(a);
-               }
-   }
-   else {
-               // IE7 massage (see issue 57)
-               if ($.browser.msie && method == 'get') { 
-                       var ieMeth = $form[0].getAttribute('method');
-                       if (typeof ieMeth === 'string')
-                               options.type = ieMeth;
-               }
-               $.ajax(options);
-   }
-
-       // fire 'notify' event
-       this.trigger('form-submit-notify', [this, options]);
-       return this;
-
-
-       // private function for handling file uploads (hat tip to YAHOO!)
-       function fileUpload(a) {
-               var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
+    /*jshint scripturl:true */
+
+    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+    if (!this.length) {
+        log('ajaxSubmit: skipping submit process - no element selected');
+        return this;
+    }
+    
+    var method, action, url, $form = this;
+
+    if (typeof options == 'function') {
+        options = { success: options };
+    }
+
+    method = this.attr('method');
+    action = this.attr('action');
+    url = (typeof action === 'string') ? $.trim(action) : '';
+    url = url || window.location.href || '';
+    if (url) {
+        // clean url (don't include hash vaue)
+        url = (url.match(/^([^#]+)/)||[])[1];
+    }
+
+    options = $.extend(true, {
+        url:  url,
+        success: $.ajaxSettings.success,
+        type: method || 'GET',
+        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+    }, options);
+
+    // hook for manipulating the form data before it is extracted;
+    // convenient for use with rich editors like tinyMCE or FCKEditor
+    var veto = {};
+    this.trigger('form-pre-serialize', [this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+        return this;
+    }
+
+    // provide opportunity to alter form data before it is serialized
+    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSerialize callback');
+        return this;
+    }
+
+    var traditional = options.traditional;
+    if ( traditional === undefined ) {
+        traditional = $.ajaxSettings.traditional;
+    }
+    
+    var elements = [];
+    var qx, a = this.formToArray(options.semantic, elements);
+    if (options.data) {
+        options.extraData = options.data;
+        qx = $.param(options.data, traditional);
+    }
+
+    // give pre-submit callback an opportunity to abort the submit
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSubmit callback');
+        return this;
+    }
+
+    // fire vetoable 'validate' event
+    this.trigger('form-submit-validate', [a, this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+        return this;
+    }
+
+    var q = $.param(a, traditional);
+    if (qx) {
+        q = ( q ? (q + '&' + qx) : qx );
+    }    
+    if (options.type.toUpperCase() == 'GET') {
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+        options.data = null;  // data is null for 'get'
+    }
+    else {
+        options.data = q; // data is the query string for 'post'
+    }
+
+    var callbacks = [];
+    if (options.resetForm) {
+        callbacks.push(function() { $form.resetForm(); });
+    }
+    if (options.clearForm) {
+        callbacks.push(function() { $form.clearForm(options.includeHidden); });
+    }
+
+    // perform a load on the target only if dataType is not provided
+    if (!options.dataType && options.target) {
+        var oldSuccess = options.success || function(){};
+        callbacks.push(function(data) {
+            var fn = options.replaceTarget ? 'replaceWith' : 'html';
+            $(options.target)[fn](data).each(oldSuccess, arguments);
+        });
+    }
+    else if (options.success) {
+        callbacks.push(options.success);
+    }
+
+    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+        var context = options.context || this ;    // jQuery 1.4+ supports scope context 
+        for (var i=0, max=callbacks.length; i < max; i++) {
+            callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+        }
+    };
+
+    // are there files to upload?
+    var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113)
+    var hasFileInputs = fileInputs.length > 0;
+    var mp = 'multipart/form-data';
+    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+    var fileAPI = feature.fileapi && feature.formdata;
+    log("fileAPI :" + fileAPI);
+    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
+
+    // options.iframe allows user to force iframe mode
+    // 06-NOV-09: now defaulting to iframe mode if file input is detected
+    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
+        // hack to fix Safari hang (thanks to Tim Molendijk for this)
+        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+        if (options.closeKeepAlive) {
+            $.get(options.closeKeepAlive, function() {
+                fileUploadIframe(a);
+            });
+        }
+          else {
+            fileUploadIframe(a);
+          }
+    }
+    else if ((hasFileInputs || multipart) && fileAPI) {
+        fileUploadXhr(a);
+    }
+    else {
+        $.ajax(options);
+    }
+
+    // clear element array
+    for (var k=0; k < elements.length; k++)
+        elements[k] = null;
+
+    // fire 'notify' event
+    this.trigger('form-submit-notify', [this, options]);
+    return this;
+
+     // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
+    function fileUploadXhr(a) {
+        var formdata = new FormData();
+
+        for (var i=0; i < a.length; i++) {
+            formdata.append(a[i].name, a[i].value);
+        }
+
+        if (options.extraData) {
+            for (var p in options.extraData)
+                if (options.extraData.hasOwnProperty(p))
+                    formdata.append(p, options.extraData[p]);
+        }
+
+        options.data = null;
+
+        var s = $.extend(true, {}, $.ajaxSettings, options, {
+            contentType: false,
+            processData: false,
+            cache: false,
+            type: 'POST'
+        });
+        
+        if (options.uploadProgress) {
+            // workaround because jqXHR does not expose upload property
+            s.xhr = function() {
+                var xhr = jQuery.ajaxSettings.xhr();
+                if (xhr.upload) {
+                    xhr.upload.onprogress = function(event) {
+                        var percent = 0;
+                        var position = event.loaded || event.position; /*event.position is deprecated*/
+                        var total = event.total;
+                        if (event.lengthComputable) {
+                            percent = Math.ceil(position / total * 100);
+                        }
+                        options.uploadProgress(event, position, total, percent);
+                    };
+                }
+                return xhr;
+            };
+        }
+
+        s.data = null;
+            var beforeSend = s.beforeSend;
+            s.beforeSend = function(xhr, o) {
+                o.data = formdata;
+                if(beforeSend)
+                    beforeSend.call(this, xhr, o);
+        };
+        $.ajax(s);
+    }
+
+    // private function for handling file uploads (hat tip to YAHOO!)
+    function fileUploadIframe(a) {
+        var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
         var useProp = !!$.fn.prop;
 
+        if ($(':input[name=submit],:input[id=submit]', form).length) {
+            // if there is an input with a name or id of 'submit' then we won't be
+            // able to invoke the submit fn on the form (at least not x-browser)
+            alert('Error: Form elements must not have name or id of "submit".');
+            return;
+        }
+        
         if (a) {
-               // ensure that every serialized input is still enabled
-               for (i=0; i < a.length; i++) {
-                el = $(form[a[i].name]);
-                el[ useProp ? 'prop' : 'attr' ]('disabled', false);
-               }
-        }
-
-               if ($(':input[name=submit],:input[id=submit]', form).length) {
-                       // if there is an input with a name or id of 'submit' then we won't be
-                       // able to invoke the submit fn on the form (at least not x-browser)
-                       alert('Error: Form elements must not have name or id of "submit".');
-                       return;
-               }
-               
-               s = $.extend(true, {}, $.ajaxSettings, options);
-               s.context = s.context || s;
-               id = 'jqFormIO' + (new Date().getTime());
-               if (s.iframeTarget) {
-                       $io = $(s.iframeTarget);
-                       n = $io.attr('name');
-                       if (n == null)
-                               $io.attr('name', id);
-                       else
-                               id = n;
-               }
-               else {
-                       $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
-                       $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
-               }
-               io = $io[0];
-
-
-               xhr = { // mock object
-                       aborted: 0,
-                       responseText: null,
-                       responseXML: null,
-                       status: 0,
-                       statusText: 'n/a',
-                       getAllResponseHeaders: function() {},
-                       getResponseHeader: function() {},
-                       setRequestHeader: function() {},
-                       abort: function(status) {
-                               var e = (status === 'timeout' ? 'timeout' : 'aborted');
-                               log('aborting upload... ' + e);
-                               this.aborted = 1;
-                               $io.attr('src', s.iframeSrc); // abort op in progress
-                               xhr.error = e;
-                               s.error && s.error.call(s.context, xhr, e, status);
-                               g && $.event.trigger("ajaxError", [xhr, s, e]);
-                               s.complete && s.complete.call(s.context, xhr, e);
-                       }
-               };
-
-               g = s.global;
-               // trigger ajax global events so that activity/block indicators work like normal
-               if (g && ! $.active++) {
-                       $.event.trigger("ajaxStart");
-               }
-               if (g) {
-                       $.event.trigger("ajaxSend", [xhr, s]);
-               }
-
-               if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
-                       if (s.global) {
-                               $.active--;
-                       }
-                       return;
-               }
-               if (xhr.aborted) {
-                       return;
-               }
-
-               // add submitting element to data if we know it
-               sub = form.clk;
-               if (sub) {
-                       n = sub.name;
-                       if (n && !sub.disabled) {
-                               s.extraData = s.extraData || {};
-                               s.extraData[n] = sub.value;
-                               if (sub.type == "image") {
-                                       s.extraData[n+'.x'] = form.clk_x;
-                                       s.extraData[n+'.y'] = form.clk_y;
-                               }
-                       }
-               }
-               
-               var CLIENT_TIMEOUT_ABORT = 1;
-               var SERVER_ABORT = 2;
-
-               function getDoc(frame) {
-                       var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
-                       return doc;
-               }
-               
-               // take a breath so that pending repaints get some cpu time before the upload starts
-               function doSubmit() {
-                       // make sure form attrs are set
-                       var t = $form.attr('target'), a = $form.attr('action');
-
-                       // update form attrs in IE friendly way
-                       form.setAttribute('target',id);
-                       if (!method) {
-                               form.setAttribute('method', 'POST');
-                       }
-                       if (a != s.url) {
-                               form.setAttribute('action', s.url);
-                       }
-
-                       // ie borks in some cases when setting encoding
-                       if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
-                               $form.attr({
-                                       encoding: 'multipart/form-data',
-                                       enctype:  'multipart/form-data'
-                               });
-                       }
-
-                       // support timout
-                       if (s.timeout) {
-                               timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
-                       }
-                       
-                       // look for server aborts
-                       function checkState() {
-                               try {
-                                       var state = getDoc(io).readyState;
-                                       log('state = ' + state);
-                                       if (state.toLowerCase() == 'uninitialized')
-                                               setTimeout(checkState,50);
-                               }
-                               catch(e) {
-                                       log('Server abort: ' , e, ' (', e.name, ')');
-                                       cb(SERVER_ABORT);
-                                       timeoutHandle && clearTimeout(timeoutHandle);
-                                       timeoutHandle = undefined;
-                               }
-                       }
-
-                       // add "extra" data to form if provided in options
-                       var extraInputs = [];
-                       try {
-                               if (s.extraData) {
-                                       for (var n in s.extraData) {
-                                               extraInputs.push(
-                                                       $('<input type="hidden" name="'+n+'" />').attr('value',s.extraData[n])
-                                                               .appendTo(form)[0]);
-                                       }
-                               }
-
-                               if (!s.iframeTarget) {
-                                       // add iframe to doc and submit the form
-                                       $io.appendTo('body');
-                       io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
-                               }
-                               setTimeout(checkState,15);
-                               form.submit();
-                       }
-                       finally {
-                               // reset attrs and remove "extra" input elements
-                               form.setAttribute('action',a);
-                               if(t) {
-                                       form.setAttribute('target', t);
-                               } else {
-                                       $form.removeAttr('target');
-                               }
-                               $(extraInputs).remove();
-                       }
-               }
-
-               if (s.forceSync) {
-                       doSubmit();
-               }
-               else {
-                       setTimeout(doSubmit, 10); // this lets dom updates render
-               }
-
-               var data, doc, domCheckCount = 50, callbackProcessed;
-
-               function cb(e) {
-                       if (xhr.aborted || callbackProcessed) {
-                               return;
-                       }
-                       try {
-                               doc = getDoc(io);
-                       }
-                       catch(ex) {
-                               log('cannot access response document: ', ex);
-                               e = SERVER_ABORT;
-                       }
-                       if (e === CLIENT_TIMEOUT_ABORT && xhr) {
-                               xhr.abort('timeout');
-                               return;
-                       }
-                       else if (e == SERVER_ABORT && xhr) {
-                               xhr.abort('server abort');
-                               return;
-                       }
-
-                       if (!doc || doc.location.href == s.iframeSrc) {
-                               // response not received yet
-                               if (!timedOut)
-                                       return;
-                       }
-            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
-
-                       var status = 'success', errMsg;
-                       try {
-                               if (timedOut) {
-                                       throw 'timeout';
-                               }
-
-                               var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
-                               log('isXml='+isXml);
-                               if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
-                                       if (--domCheckCount) {
-                                               // in some browsers (Opera) the iframe DOM is not always traversable when
-                                               // the onload callback fires, so we loop a bit to accommodate
-                                               log('requeing onLoad callback, DOM not available');
-                                               setTimeout(cb, 250);
-                                               return;
-                                       }
-                                       // let this fall through because server response could be an empty document
-                                       //log('Could not access iframe DOM after mutiple tries.');
-                                       //throw 'DOMException: not available';
-                               }
-
-                               //log('response detected');
+            // ensure that every serialized input is still enabled
+            for (i=0; i < elements.length; i++) {
+                el = $(elements[i]);
+                if ( useProp )
+                    el.prop('disabled', false);
+                else
+                    el.removeAttr('disabled');
+            }
+        }
+
+        s = $.extend(true, {}, $.ajaxSettings, options);
+        s.context = s.context || s;
+        id = 'jqFormIO' + (new Date().getTime());
+        if (s.iframeTarget) {
+            $io = $(s.iframeTarget);
+            n = $io.attr('name');
+            if (!n)
+                 $io.attr('name', id);
+            else
+                id = n;
+        }
+        else {
+            $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
+            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+        }
+        io = $io[0];
+
+
+        xhr = { // mock object
+            aborted: 0,
+            responseText: null,
+            responseXML: null,
+            status: 0,
+            statusText: 'n/a',
+            getAllResponseHeaders: function() {},
+            getResponseHeader: function() {},
+            setRequestHeader: function() {},
+            abort: function(status) {
+                var e = (status === 'timeout' ? 'timeout' : 'aborted');
+                log('aborting upload... ' + e);
+                this.aborted = 1;
+                // #214
+                if (io.contentWindow.document.execCommand) {
+                    try { // #214
+                        io.contentWindow.document.execCommand('Stop');
+                    } catch(ignore) {}
+                }
+                $io.attr('src', s.iframeSrc); // abort op in progress
+                xhr.error = e;
+                if (s.error)
+                    s.error.call(s.context, xhr, e, status);
+                if (g)
+                    $.event.trigger("ajaxError", [xhr, s, e]);
+                if (s.complete)
+                    s.complete.call(s.context, xhr, e);
+            }
+        };
+
+        g = s.global;
+        // trigger ajax global events so that activity/block indicators work like normal
+        if (g && 0 === $.active++) {
+            $.event.trigger("ajaxStart");
+        }
+        if (g) {
+            $.event.trigger("ajaxSend", [xhr, s]);
+        }
+
+        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+            if (s.global) {
+                $.active--;
+            }
+            return;
+        }
+        if (xhr.aborted) {
+            return;
+        }
+
+        // add submitting element to data if we know it
+        sub = form.clk;
+        if (sub) {
+            n = sub.name;
+            if (n && !sub.disabled) {
+                s.extraData = s.extraData || {};
+                s.extraData[n] = sub.value;
+                if (sub.type == "image") {
+                    s.extraData[n+'.x'] = form.clk_x;
+                    s.extraData[n+'.y'] = form.clk_y;
+                }
+            }
+        }
+        
+        var CLIENT_TIMEOUT_ABORT = 1;
+        var SERVER_ABORT = 2;
+
+        function getDoc(frame) {
+            var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
+            return doc;
+        }
+        
+        // Rails CSRF hack (thanks to Yvan Barthelemy)
+        var csrf_token = $('meta[name=csrf-token]').attr('content');
+        var csrf_param = $('meta[name=csrf-param]').attr('content');
+        if (csrf_param && csrf_token) {
+            s.extraData = s.extraData || {};
+            s.extraData[csrf_param] = csrf_token;
+        }
+
+        // take a breath so that pending repaints get some cpu time before the upload starts
+        function doSubmit() {
+            // make sure form attrs are set
+            var t = $form.attr('target'), a = $form.attr('action');
+
+            // update form attrs in IE friendly way
+            form.setAttribute('target',id);
+            if (!method) {
+                form.setAttribute('method', 'POST');
+            }
+            if (a != s.url) {
+                form.setAttribute('action', s.url);
+            }
+
+            // ie borks in some cases when setting encoding
+            if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
+                $form.attr({
+                    encoding: 'multipart/form-data',
+                    enctype:  'multipart/form-data'
+                });
+            }
+
+            // support timout
+            if (s.timeout) {
+                timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
+            }
+            
+            // look for server aborts
+            function checkState() {
+                try {
+                    var state = getDoc(io).readyState;
+                    log('state = ' + state);
+                    if (state && state.toLowerCase() == 'uninitialized')
+                        setTimeout(checkState,50);
+                }
+                catch(e) {
+                    log('Server abort: ' , e, ' (', e.name, ')');
+                    cb(SERVER_ABORT);
+                    if (timeoutHandle)
+                        clearTimeout(timeoutHandle);
+                    timeoutHandle = undefined;
+                }
+            }
+
+            // add "extra" data to form if provided in options
+            var extraInputs = [];
+            try {
+                if (s.extraData) {
+                    for (var n in s.extraData) {
+                        if (s.extraData.hasOwnProperty(n)) {
+                           // if using the $.param format that allows for multiple values with the same name
+                           if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
+                               extraInputs.push(
+                               $('<input type="hidden" name="'+s.extraData[n].name+'">').attr('value',s.extraData[n].value)
+                                   .appendTo(form)[0]);
+                           } else {
+                               extraInputs.push(
+                               $('<input type="hidden" name="'+n+'">').attr('value',s.extraData[n])
+                                   .appendTo(form)[0]);
+                           }
+                        }
+                    }
+                }
+
+                if (!s.iframeTarget) {
+                    // add iframe to doc and submit the form
+                    $io.appendTo('body');
+                    if (io.attachEvent)
+                        io.attachEvent('onload', cb);
+                    else
+                        io.addEventListener('load', cb, false);
+                }
+                setTimeout(checkState,15);
+                form.submit();
+            }
+            finally {
+                // reset attrs and remove "extra" input elements
+                form.setAttribute('action',a);
+                if(t) {
+                    form.setAttribute('target', t);
+                } else {
+                    $form.removeAttr('target');
+                }
+                $(extraInputs).remove();
+            }
+        }
+
+        if (s.forceSync) {
+            doSubmit();
+        }
+        else {
+            setTimeout(doSubmit, 10); // this lets dom updates render
+        }
+
+        var data, doc, domCheckCount = 50, callbackProcessed;
+
+        function cb(e) {
+            if (xhr.aborted || callbackProcessed) {
+                return;
+            }
+            try {
+                doc = getDoc(io);
+            }
+            catch(ex) {
+                log('cannot access response document: ', ex);
+                e = SERVER_ABORT;
+            }
+            if (e === CLIENT_TIMEOUT_ABORT && xhr) {
+                xhr.abort('timeout');
+                return;
+            }
+            else if (e == SERVER_ABORT && xhr) {
+                xhr.abort('server abort');
+                return;
+            }
+
+            if (!doc || doc.location.href == s.iframeSrc) {
+                // response not received yet
+                if (!timedOut)
+                    return;
+            }
+            if (io.detachEvent)
+                io.detachEvent('onload', cb);
+            else    
+                io.removeEventListener('load', cb, false);
+
+            var status = 'success', errMsg;
+            try {
+                if (timedOut) {
+                    throw 'timeout';
+                }
+
+                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+                log('isXml='+isXml);
+                if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
+                    if (--domCheckCount) {
+                        // in some browsers (Opera) the iframe DOM is not always traversable when
+                        // the onload callback fires, so we loop a bit to accommodate
+                        log('requeing onLoad callback, DOM not available');
+                        setTimeout(cb, 250);
+                        return;
+                    }
+                    // let this fall through because server response could be an empty document
+                    //log('Could not access iframe DOM after mutiple tries.');
+                    //throw 'DOMException: not available';
+                }
+
+                //log('response detected');
                 var docRoot = doc.body ? doc.body : doc.documentElement;
                 xhr.responseText = docRoot ? docRoot.innerHTML : null;
-                               xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
-                               if (isXml)
-                                       s.dataType = 'xml';
-                               xhr.getResponseHeader = function(header){
-                                       var headers = {'content-type': s.dataType};
-                                       return headers[header];
-                               };
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+                if (isXml)
+                    s.dataType = 'xml';
+                xhr.getResponseHeader = function(header){
+                    var headers = {'content-type': s.dataType};
+                    return headers[header];
+                };
                 // support for XHR 'status' & 'statusText' emulation :
                 if (docRoot) {
                     xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
                     xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
                 }
 
-                               var dt = s.dataType || '';
-                               var scr = /(json|script|text)/.test(dt.toLowerCase());
-                               if (scr || s.textarea) {
-                                       // see if user embedded response in textarea
-                                       var ta = doc.getElementsByTagName('textarea')[0];
-                                       if (ta) {
-                                               xhr.responseText = ta.value;
+                var dt = (s.dataType || '').toLowerCase();
+                var scr = /(json|script|text)/.test(dt);
+                if (scr || s.textarea) {
+                    // see if user embedded response in textarea
+                    var ta = doc.getElementsByTagName('textarea')[0];
+                    if (ta) {
+                        xhr.responseText = ta.value;
                         // support for XHR 'status' & 'statusText' emulation :
                         xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
                         xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
-                                       }
-                                       else if (scr) {
-                                               // account for browsers injecting pre around json response
-                                               var pre = doc.getElementsByTagName('pre')[0];
-                                               var b = doc.getElementsByTagName('body')[0];
-                                               if (pre) {
-                                                       xhr.responseText = pre.textContent ? pre.textContent : pre.innerHTML;
-                                               }
-                                               else if (b) {
-                                                       xhr.responseText = b.innerHTML;
-                                               }
-                                       }
-                               }
-                               else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
-                                       xhr.responseXML = toXml(xhr.responseText);
-                               }
+                    }
+                    else if (scr) {
+                        // account for browsers injecting pre around json response
+                        var pre = doc.getElementsByTagName('pre')[0];
+                        var b = doc.getElementsByTagName('body')[0];
+                        if (pre) {
+                            xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
+                        }
+                        else if (b) {
+                            xhr.responseText = b.textContent ? b.textContent : b.innerText;
+                        }
+                    }
+                }
+                else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
+                    xhr.responseXML = toXml(xhr.responseText);
+                }
 
                 try {
-                    data = httpData(xhr, s.dataType, s);
+                    data = httpData(xhr, dt, s);
                 }
                 catch (e) {
                     status = 'parsererror';
                     xhr.error = errMsg = (e || status);
                 }
-                       }
-                       catch (e) {
-                               log('error caught: ',e);
-                               status = 'error';
+            }
+            catch (e) {
+                log('error caught: ',e);
+                status = 'error';
                 xhr.error = errMsg = (e || status);
-                       }
+            }
 
-                       if (xhr.aborted) {
-                               log('upload aborted');
-                               status = null;
-                       }
+            if (xhr.aborted) {
+                log('upload aborted');
+                status = null;
+            }
 
             if (xhr.status) { // we've set xhr.status
                 status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
             }
 
-                       // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
-                       if (status === 'success') {
-                               s.success && s.success.call(s.context, data, 'success', xhr);
-                               g && $.event.trigger("ajaxSuccess", [xhr, s]);
-                       }
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+            if (status === 'success') {
+                if (s.success)
+                    s.success.call(s.context, data, 'success', xhr);
+                if (g)
+                    $.event.trigger("ajaxSuccess", [xhr, s]);
+            }
             else if (status) {
-                               if (errMsg == undefined)
-                                       errMsg = xhr.statusText;
-                               s.error && s.error.call(s.context, xhr, status, errMsg);
-                               g && $.event.trigger("ajaxError", [xhr, s, errMsg]);
-            }
-
-                       g && $.event.trigger("ajaxComplete", [xhr, s]);
-
-                       if (g && ! --$.active) {
-                               $.event.trigger("ajaxStop");
-                       }
-
-                       s.complete && s.complete.call(s.context, xhr, status);
-
-                       callbackProcessed = true;
-                       if (s.timeout)
-                               clearTimeout(timeoutHandle);
-
-                       // clean up
-                       setTimeout(function() {
-                               if (!s.iframeTarget)
-                                       $io.remove();
-                               xhr.responseXML = null;
-                       }, 100);
-               }
-
-               var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
-                       if (window.ActiveXObject) {
-                               doc = new ActiveXObject('Microsoft.XMLDOM');
-                               doc.async = 'false';
-                               doc.loadXML(s);
-                       }
-                       else {
-                               doc = (new DOMParser()).parseFromString(s, 'text/xml');
-                       }
-                       return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
-               };
-               var parseJSON = $.parseJSON || function(s) {
-                       return window['eval']('(' + s + ')');
-               };
-
-               var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
-
-                       var ct = xhr.getResponseHeader('content-type') || '',
-                               xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
-                               data = xml ? xhr.responseXML : xhr.responseText;
-
-                       if (xml && data.documentElement.nodeName === 'parsererror') {
-                               $.error && $.error('parsererror');
-                       }
-                       if (s && s.dataFilter) {
-                               data = s.dataFilter(data, type);
-                       }
-                       if (typeof data === 'string') {
-                               if (type === 'json' || !type && ct.indexOf('json') >= 0) {
-                                       data = parseJSON(data);
-                               } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
-                                       $.globalEval(data);
-                               }
-                       }
-                       return data;
-               };
-       }
+                if (errMsg === undefined)
+                    errMsg = xhr.statusText;
+                if (s.error)
+                    s.error.call(s.context, xhr, status, errMsg);
+                if (g)
+                    $.event.trigger("ajaxError", [xhr, s, errMsg]);
+            }
+
+            if (g)
+                $.event.trigger("ajaxComplete", [xhr, s]);
+
+            if (g && ! --$.active) {
+                $.event.trigger("ajaxStop");
+            }
+
+            if (s.complete)
+                s.complete.call(s.context, xhr, status);
+
+            callbackProcessed = true;
+            if (s.timeout)
+                clearTimeout(timeoutHandle);
+
+            // clean up
+            setTimeout(function() {
+                if (!s.iframeTarget)
+                    $io.remove();
+                xhr.responseXML = null;
+            }, 100);
+        }
+
+        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
+            if (window.ActiveXObject) {
+                doc = new ActiveXObject('Microsoft.XMLDOM');
+                doc.async = 'false';
+                doc.loadXML(s);
+            }
+            else {
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+            }
+            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+        };
+        var parseJSON = $.parseJSON || function(s) {
+            /*jslint evil:true */
+            return window['eval']('(' + s + ')');
+        };
+
+        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
+
+            var ct = xhr.getResponseHeader('content-type') || '',
+                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+                data = xml ? xhr.responseXML : xhr.responseText;
+
+            if (xml && data.documentElement.nodeName === 'parsererror') {
+                if ($.error)
+                    $.error('parsererror');
+            }
+            if (s && s.dataFilter) {
+                data = s.dataFilter(data, type);
+            }
+            if (typeof data === 'string') {
+                if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+                    data = parseJSON(data);
+                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+                    $.globalEval(data);
+                }
+            }
+            return data;
+        };
+    }
 };
 
 /**
@@ -560,9 +680,9 @@ $.fn.ajaxSubmit = function(options) {
  * The advantages of using this method instead of ajaxSubmit() are:
  *
  * 1: This method will include coordinates for <input type="image" /> elements (if the element
- *     is used to submit the form).
+ *    is used to submit the form).
  * 2. This method will include the submit element's name/value data (for the element that was
- *     used to submit the form).
+ *    used to submit the form).
  * 3. This method binds the submit() method to the form for you.
  *
  * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
@@ -570,60 +690,83 @@ $.fn.ajaxSubmit = function(options) {
  * the form itself.
  */
 $.fn.ajaxForm = function(options) {
-       // in jQuery 1.3+ we can fix mistakes with the ready state
-       if (this.length === 0) {
-               var o = { s: this.selector, c: this.context };
-               if (!$.isReady && o.s) {
-                       log('DOM not ready, queuing ajaxForm');
-                       $(function() {
-                               $(o.s,o.c).ajaxForm(options);
-                       });
-                       return this;
-               }
-               // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-               log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-               return this;
-       }
-
-       return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
-               if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
-                       e.preventDefault();
-                       $(this).ajaxSubmit(options);
-               }
-       }).bind('click.form-plugin', function(e) {
-               var target = e.target;
-               var $el = $(target);
-               if (!($el.is(":submit,input:image"))) {
-                       // is this a child element of the submit el?  (ex: a span within a button)
-                       var t = $el.closest(':submit');
-                       if (t.length == 0) {
-                               return;
-                       }
-                       target = t[0];
-               }
-               var form = this;
-               form.clk = target;
-               if (target.type == 'image') {
-                       if (e.offsetX != undefined) {
-                               form.clk_x = e.offsetX;
-                               form.clk_y = e.offsetY;
-                       } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
-                               var offset = $el.offset();
-                               form.clk_x = e.pageX - offset.left;
-                               form.clk_y = e.pageY - offset.top;
-                       } else {
-                               form.clk_x = e.pageX - target.offsetLeft;
-                               form.clk_y = e.pageY - target.offsetTop;
-                       }
-               }
-               // clear form vars
-               setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
-       });
+    options = options || {};
+    options.delegation = options.delegation && $.isFunction($.fn.on);
+    
+    // in jQuery 1.3+ we can fix mistakes with the ready state
+    if (!options.delegation && this.length === 0) {
+        var o = { s: this.selector, c: this.context };
+        if (!$.isReady && o.s) {
+            log('DOM not ready, queuing ajaxForm');
+            $(function() {
+                $(o.s,o.c).ajaxForm(options);
+            });
+            return this;
+        }
+        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+        return this;
+    }
+
+    if ( options.delegation ) {
+        $(document)
+            .off('submit.form-plugin', this.selector, doAjaxSubmit)
+            .off('click.form-plugin', this.selector, captureSubmittingElement)
+            .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
+            .on('click.form-plugin', this.selector, options, captureSubmittingElement);
+        return this;
+    }
+
+    return this.ajaxFormUnbind()
+        .bind('submit.form-plugin', options, doAjaxSubmit)
+        .bind('click.form-plugin', options, captureSubmittingElement);
 };
 
+// private event handlers    
+function doAjaxSubmit(e) {
+    /*jshint validthis:true */
+    var options = e.data;
+    if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+        e.preventDefault();
+        $(this).ajaxSubmit(options);
+    }
+}
+    
+function captureSubmittingElement(e) {
+    /*jshint validthis:true */
+    var target = e.target;
+    var $el = $(target);
+    if (!($el.is(":submit,input:image"))) {
+        // is this a child element of the submit el?  (ex: a span within a button)
+        var t = $el.closest(':submit');
+        if (t.length === 0) {
+            return;
+        }
+        target = t[0];
+    }
+    var form = this;
+    form.clk = target;
+    if (target.type == 'image') {
+        if (e.offsetX !== undefined) {
+            form.clk_x = e.offsetX;
+            form.clk_y = e.offsetY;
+        } else if (typeof $.fn.offset == 'function') {
+            var offset = $el.offset();
+            form.clk_x = e.pageX - offset.left;
+            form.clk_y = e.pageY - offset.top;
+        } else {
+            form.clk_x = e.pageX - target.offsetLeft;
+            form.clk_y = e.pageY - target.offsetTop;
+        }
+    }
+    // clear form vars
+    setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+}
+
+
 // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
 $.fn.ajaxFormUnbind = function() {
-       return this.unbind('submit.form-plugin click.form-plugin');
+    return this.unbind('submit.form-plugin click.form-plugin');
 };
 
 /**
@@ -637,56 +780,74 @@ $.fn.ajaxFormUnbind = function() {
  * It is this array that is passed to pre-submit callback functions provided to the
  * ajaxSubmit() and ajaxForm() methods.
  */
-$.fn.formToArray = function(semantic) {
-       var a = [];
-       if (this.length === 0) {
-               return a;
-       }
-
-       var form = this[0];
-       var els = semantic ? form.getElementsByTagName('*') : form.elements;
-       if (!els) {
-               return a;
-       }
-
-       var i,j,n,v,el,max,jmax;
-       for(i=0, max=els.length; i < max; i++) {
-               el = els[i];
-               n = el.name;
-               if (!n) {
-                       continue;
-               }
-
-               if (semantic && form.clk && el.type == "image") {
-                       // handle image inputs on the fly when semantic == true
-                       if(!el.disabled && form.clk == el) {
-                               a.push({name: n, value: $(el).val()});
-                               a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-                       }
-                       continue;
-               }
-
-               v = $.fieldValue(el, true);
-               if (v && v.constructor == Array) {
-                       for(j=0, jmax=v.length; j < jmax; j++) {
-                               a.push({name: n, value: v[j]});
-                       }
-               }
-               else if (v !== null && typeof v != 'undefined') {
-                       a.push({name: n, value: v});
-               }
-       }
-
-       if (!semantic && form.clk) {
-               // input type=='image' are not found in elements array! handle it here
-               var $input = $(form.clk), input = $input[0];
-               n = input.name;
-               if (n && !input.disabled && input.type == 'image') {
-                       a.push({name: n, value: $input.val()});
-                       a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-               }
-       }
-       return a;
+$.fn.formToArray = function(semantic, elements) {
+    var a = [];
+    if (this.length === 0) {
+        return a;
+    }
+
+    var form = this[0];
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;
+    if (!els) {
+        return a;
+    }
+
+    var i,j,n,v,el,max,jmax;
+    for(i=0, max=els.length; i < max; i++) {
+        el = els[i];
+        n = el.name;
+        if (!n) {
+            continue;
+        }
+
+        if (semantic && form.clk && el.type == "image") {
+            // handle image inputs on the fly when semantic == true
+            if(!el.disabled && form.clk == el) {
+                a.push({name: n, value: $(el).val(), type: el.type });
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+            }
+            continue;
+        }
+
+        v = $.fieldValue(el, true);
+        if (v && v.constructor == Array) {
+            if (elements) 
+                elements.push(el);
+            for(j=0, jmax=v.length; j < jmax; j++) {
+                a.push({name: n, value: v[j]});
+            }
+        }
+        else if (feature.fileapi && el.type == 'file' && !el.disabled) {
+            if (elements) 
+                elements.push(el);
+            var files = el.files;
+            if (files.length) {
+                for (j=0; j < files.length; j++) {
+                    a.push({name: n, value: files[j], type: el.type});
+                }
+            }
+            else {
+                // #180
+                a.push({ name: n, value: '', type: el.type });
+            }
+        }
+        else if (v !== null && typeof v != 'undefined') {
+            if (elements) 
+                elements.push(el);
+            a.push({name: n, value: v, type: el.type, required: el.required});
+        }
+    }
+
+    if (!semantic && form.clk) {
+        // input type=='image' are not found in elements array! handle it here
+        var $input = $(form.clk), input = $input[0];
+        n = input.name;
+        if (n && !input.disabled && input.type == 'image') {
+            a.push({name: n, value: $input.val()});
+            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+        }
+    }
+    return a;
 };
 
 /**
@@ -694,8 +855,8 @@ $.fn.formToArray = function(semantic) {
  * in the format: name1=value1&amp;name2=value2
  */
 $.fn.formSerialize = function(semantic) {
-       //hand off to jQuery.param for proper encoding
-       return $.param(this.formToArray(semantic));
+    //hand off to jQuery.param for proper encoding
+    return $.param(this.formToArray(semantic));
 };
 
 /**
@@ -703,36 +864,36 @@ $.fn.formSerialize = function(semantic) {
  * This method will return a string in the format: name1=value1&amp;name2=value2
  */
 $.fn.fieldSerialize = function(successful) {
-       var a = [];
-       this.each(function() {
-               var n = this.name;
-               if (!n) {
-                       return;
-               }
-               var v = $.fieldValue(this, successful);
-               if (v && v.constructor == Array) {
-                       for (var i=0,max=v.length; i < max; i++) {
-                               a.push({name: n, value: v[i]});
-                       }
-               }
-               else if (v !== null && typeof v != 'undefined') {
-                       a.push({name: this.name, value: v});
-               }
-       });
-       //hand off to jQuery.param for proper encoding
-       return $.param(a);
+    var a = [];
+    this.each(function() {
+        var n = this.name;
+        if (!n) {
+            return;
+        }
+        var v = $.fieldValue(this, successful);
+        if (v && v.constructor == Array) {
+            for (var i=0,max=v.length; i < max; i++) {
+                a.push({name: n, value: v[i]});
+            }
+        }
+        else if (v !== null && typeof v != 'undefined') {
+            a.push({name: this.name, value: v});
+        }
+    });
+    //hand off to jQuery.param for proper encoding
+    return $.param(a);
 };
 
 /**
  * Returns the value(s) of the element in the matched set.  For example, consider the following form:
  *
  *  <form><fieldset>
- *       <input name="A" type="text" />
- *       <input name="A" type="text" />
- *       <input name="B" type="checkbox" value="B1" />
- *       <input name="B" type="checkbox" value="B2"/>
- *       <input name="C" type="radio" value="C1" />
- *       <input name="C" type="radio" value="C2" />
+ *      <input name="A" type="text" />
+ *      <input name="A" type="text" />
+ *      <input name="B" type="checkbox" value="B1" />
+ *      <input name="B" type="checkbox" value="B2"/>
+ *      <input name="C" type="radio" value="C1" />
+ *      <input name="C" type="radio" value="C2" />
  *  </fieldset></form>
  *
  *  var v = $(':text').fieldValue();
@@ -759,60 +920,63 @@ $.fn.fieldSerialize = function(successful) {
  * for each element is returned.
  *
  * Note: This method *always* returns an array.  If no valid value can be determined the
- *        array will be empty, otherwise it will contain one or more values.
+ *    array will be empty, otherwise it will contain one or more values.
  */
 $.fn.fieldValue = function(successful) {
-       for (var val=[], i=0, max=this.length; i < max; i++) {
-               var el = this[i];
-               var v = $.fieldValue(el, successful);
-               if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
-                       continue;
-               }
-               v.constructor == Array ? $.merge(val, v) : val.push(v);
-       }
-       return val;
+    for (var val=[], i=0, max=this.length; i < max; i++) {
+        var el = this[i];
+        var v = $.fieldValue(el, successful);
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+            continue;
+        }
+        if (v.constructor == Array)
+            $.merge(val, v);
+        else
+            val.push(v);
+    }
+    return val;
 };
 
 /**
  * Returns the value of the field element.
  */
 $.fieldValue = function(el, successful) {
-       var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
-       if (successful === undefined) {
-               successful = true;
-       }
-
-       if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
-               (t == 'checkbox' || t == 'radio') && !el.checked ||
-               (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
-               tag == 'select' && el.selectedIndex == -1)) {
-                       return null;
-       }
-
-       if (tag == 'select') {
-               var index = el.selectedIndex;
-               if (index < 0) {
-                       return null;
-               }
-               var a = [], ops = el.options;
-               var one = (t == 'select-one');
-               var max = (one ? index+1 : ops.length);
-               for(var i=(one ? index : 0); i < max; i++) {
-                       var op = ops[i];
-                       if (op.selected) {
-                               var v = op.value;
-                               if (!v) { // extra pain for IE...
-                                       v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
-                               }
-                               if (one) {
-                                       return v;
-                               }
-                               a.push(v);
-                       }
-               }
-               return a;
-       }
-       return $(el).val();
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+    if (successful === undefined) {
+        successful = true;
+    }
+
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+        (t == 'checkbox' || t == 'radio') && !el.checked ||
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+        tag == 'select' && el.selectedIndex == -1)) {
+            return null;
+    }
+
+    if (tag == 'select') {
+        var index = el.selectedIndex;
+        if (index < 0) {
+            return null;
+        }
+        var a = [], ops = el.options;
+        var one = (t == 'select-one');
+        var max = (one ? index+1 : ops.length);
+        for(var i=(one ? index : 0); i < max; i++) {
+            var op = ops[i];
+            if (op.selected) {
+                var v = op.value;
+                if (!v) { // extra pain for IE...
+                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+                }
+                if (one) {
+                    return v;
+                }
+                a.push(v);
+            }
+        }
+        return a;
+    }
+    return $(el).val();
 };
 
 /**
@@ -823,54 +987,63 @@ $.fieldValue = function(el, successful) {
  *  - inputs of type submit, button, reset, and hidden will *not* be effected
  *  - button elements will *not* be effected
  */
-$.fn.clearForm = function() {
-       return this.each(function() {
-               $('input,select,textarea', this).clearFields();
-       });
+$.fn.clearForm = function(includeHidden) {
+    return this.each(function() {
+        $('input,select,textarea', this).clearFields(includeHidden);
+    });
 };
 
 /**
  * Clears the selected form elements.
  */
-$.fn.clearFields = $.fn.clearInputs = function() {
-       var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
-       return this.each(function() {
-               var t = this.type, tag = this.tagName.toLowerCase();
-               if (re.test(t) || tag == 'textarea') {
-                       this.value = '';
-               }
-               else if (t == 'checkbox' || t == 'radio') {
-                       this.checked = false;
-               }
-               else if (tag == 'select') {
-                       this.selectedIndex = -1;
-               }
-       });
+$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
+    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
+    return this.each(function() {
+        var t = this.type, tag = this.tagName.toLowerCase();
+        if (re.test(t) || tag == 'textarea') {
+            this.value = '';
+        }
+        else if (t == 'checkbox' || t == 'radio') {
+            this.checked = false;
+        }
+        else if (tag == 'select') {
+            this.selectedIndex = -1;
+        }
+        else if (includeHidden) {
+            // includeHidden can be the value true, or it can be a selector string
+            // indicating a special test; for example:
+            //  $('#myForm').clearForm('.special:hidden')
+            // the above would clean hidden inputs that have the class of 'special'
+            if ( (includeHidden === true && /hidden/.test(t)) ||
+                 (typeof includeHidden == 'string' && $(this).is(includeHidden)) )
+                this.value = '';
+        }
+    });
 };
 
 /**
  * Resets the form data.  Causes all form elements to be reset to their original value.
  */
 $.fn.resetForm = function() {
-       return this.each(function() {
-               // guard against an input with the name of 'reset'
-               // note that IE reports the reset function as an 'object'
-               if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
-                       this.reset();
-               }
-       });
+    return this.each(function() {
+        // guard against an input with the name of 'reset'
+        // note that IE reports the reset function as an 'object'
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+            this.reset();
+        }
+    });
 };
 
 /**
  * Enables or disables any matching elements.
  */
 $.fn.enable = function(b) {
-       if (b === undefined) {
-               b = true;
-       }
-       return this.each(function() {
-               this.disabled = !b;
-       });
+    if (b === undefined) {
+        b = true;
+    }
+    return this.each(function() {
+        this.disabled = !b;
+    });
 };
 
 /**
@@ -878,34 +1051,39 @@ $.fn.enable = function(b) {
  * selects/deselects and matching option elements.
  */
 $.fn.selected = function(select) {
-       if (select === undefined) {
-               select = true;
-       }
-       return this.each(function() {
-               var t = this.type;
-               if (t == 'checkbox' || t == 'radio') {
-                       this.checked = select;
-               }
-               else if (this.tagName.toLowerCase() == 'option') {
-                       var $sel = $(this).parent('select');
-                       if (select && $sel[0] && $sel[0].type == 'select-one') {
-                               // deselect all other options
-                               $sel.find('option').selected(false);
-                       }
-                       this.selected = select;
-               }
-       });
+    if (select === undefined) {
+        select = true;
+    }
+    return this.each(function() {
+        var t = this.type;
+        if (t == 'checkbox' || t == 'radio') {
+            this.checked = select;
+        }
+        else if (this.tagName.toLowerCase() == 'option') {
+            var $sel = $(this).parent('select');
+            if (select && $sel[0] && $sel[0].type == 'select-one') {
+                // deselect all other options
+                $sel.find('option').selected(false);
+            }
+            this.selected = select;
+        }
+    });
 };
 
+// expose debug var
+$.fn.ajaxSubmit.debug = false;
+
 // helper fn for console logging
 function log() {
-       var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
-       if (window.console && window.console.log) {
-               window.console.log(msg);
-       }
-       else if (window.opera && window.opera.postError) {
-               window.opera.postError(msg);
-       }
-};
+    if (!$.fn.ajaxSubmit.debug) 
+        return;
+    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+    if (window.console && window.console.log) {
+        window.console.log(msg);
+    }
+    else if (window.opera && window.opera.postError) {
+        window.opera.postError(msg);
+    }
+}
 
 })(jQuery);
index e0c65e8..f0e464d 100644 (file)
@@ -307,7 +307,7 @@ var mw = ( function ( $, undefined ) {
                },
 
                /**
-                * Gets a message string, similar to wfMsg()
+                * Gets a message string, similar to wfMessage()
                 *
                 * @param key string Key of message to get
                 * @param parameters mixed First argument in a list of variadic arguments,
index d1bfd05..7e2bab8 100644 (file)
                 * @return string Address to script (eg. '/w/api.php' )
                 */
                wikiScript: function ( str ) {
-                       return mw.config.get( 'wgScriptPath' ) + '/' + ( str || 'index' ) +
-                               mw.config.get( 'wgScriptExtension' );
+                       str = str || 'index';
+                       if ( str === 'index' ) {
+                               return mw.config.get( 'wgScript' );
+                       } else if ( str === 'load' ) {
+                               return mw.config.get( 'wgLoadScript' );
+                       } else {
+                               return mw.config.get( 'wgScriptPath' ) + '/' + str +
+                                       mw.config.get( 'wgScriptExtension' );
+                       }
                },
 
                /**
index 23067c1..5036268 100644 (file)
@@ -4984,6 +4984,15 @@ Bug 3090: External links other than http: in image captions
 
 !! end
 
+!! test
+Custom class
+!! input
+[[Image:foobar.jpg|a|class=b]]
+!! result
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a>
+</p>
+!! end
+
 !! article 
 File:Barfoo.jpg
 !! text
index a9088cb..0413b5a 100644 (file)
@@ -146,7 +146,7 @@ class ExtraParserTest extends MediaWikiTestCase {
         */
        function testTrackingCategory() {
                $title = Title::newFromText( __FUNCTION__ );
-               $catName =  wfMsgForContent( 'broken-file-category' );
+               $catName =  wfMessage( 'broken-file-category' )->inContentLanguage()->text();
                $cat = Title::makeTitleSafe( NS_CATEGORY, $catName );
                $expected = array( $cat->getDBkey() );
                $parserOutput = $this->parser->parse( "[[file:nonexistent]]" , $title, $this->options );
index 20199b2..6d82d0c 100644 (file)
@@ -213,6 +213,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testRevText()
        {
+               $this->hideDeprecated( 'Revision::revText' );
                $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
                $rev = Revision::newFromId( $orig->getId() );
 
index d9b2055..ababa8d 100644 (file)
@@ -24,14 +24,17 @@ QUnit.test( 'wikiGetlink', 3, function ( assert ) {
        assert.equal( hrefC, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
 });
 
-QUnit.test( 'wikiScript', 2, function ( assert ) {
+QUnit.test( 'wikiScript', 4, function ( assert ) {
        mw.config.set({
-               'wgScript': '/w/index.php',
+               'wgScript': '/w/i.php', // customized wgScript for bug 39103
+               'wgLoadScript': '/w/l.php', // customized wgLoadScript for bug 39103
                'wgScriptPath': '/w',
                'wgScriptExtension': '.php'
        });
 
-       assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ), 'Defaults to index.php and is equal to wgScript' );
+       assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ), 'wikiScript() returns wgScript' );
+       assert.equal( mw.util.wikiScript( 'index' ), mw.config.get( 'wgScript' ), "wikiScript( 'index' ) returns wgScript" );
+       assert.equal( mw.util.wikiScript( 'load' ), mw.config.get( 'wgLoadScript' ), "wikiScript( 'load' ) returns wgLoadScript" );
        assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
 });