Merge "Add gzdecode fallback to GlobalFunctions"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 18 Sep 2013 20:02:06 +0000 (20:02 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 18 Sep 2013 20:02:06 +0000 (20:02 +0000)
44 files changed:
.jshintignore
RELEASE-NOTES-1.22
docs/hooks.txt
includes/Exception.php
includes/Sanitizer.php
includes/StringUtils.php
includes/Title.php
includes/WebRequest.php
includes/db/DatabaseOracle.php
includes/db/DatabaseSqlite.php
includes/diff/DifferenceEngine.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/Installer.i18n.php
includes/job/jobs/RefreshLinksJob.php
includes/libs/CSSMin.php
includes/resourceloader/ResourceLoader.php
includes/specials/SpecialUploadStash.php
languages/messages/MessagesAr.php
languages/messages/MessagesCkb.php
languages/messages/MessagesFi.php
languages/messages/MessagesHe.php
languages/messages/MessagesId.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLv.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesPms.php
languages/messages/MessagesRu.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesTh.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
maintenance/mctest.php
resources/jquery/jquery.makeCollapsible.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki/mediawiki.user.js
skins/common/protect.js
skins/common/upload.js
tests/phpunit/includes/db/DatabaseTest.php

index ad5e959..bc10ad8 100644 (file)
@@ -28,8 +28,6 @@ resources/jquery.chosen/chosen.jquery.js
 # legacy scripts
 skins/common/IEFixes.js
 skins/common/config.js
-skins/common/protect.js
-skins/common/upload.js
 
 # github.com/jshint/jshint/issues/729
 tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
index 8570646..d0c9d1d 100644 (file)
@@ -212,6 +212,7 @@ production.
 * IPv6 addresses in X-Forwarded-For headers are now normalised before checking
   against allowed proxy lists.
 * Add deferrable update support for callback/closure
+* Add TitleMove hook before page renames
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
index 02413b3..5d6a6e4 100644 (file)
@@ -2419,6 +2419,11 @@ $result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
   Hooks may change this value to override the return value of
   Title::isWikitextPage()
 
+'TitleMove': Before moving an article (title).
+$old: old title
+$nt: new title
+$user: user who does the move
+
 'TitleMoveComplete': After moving an article (title).
 $old: old title
 $nt: new title
index dc1208a..e1bfb2d 100644 (file)
@@ -247,16 +247,9 @@ class MWException extends Exception {
         * It will be either HTML or plain text based on isCommandLine().
         */
        function report() {
-               global $wgLogExceptionBacktrace, $wgMimeType;
-               $log = $this->getLogMessage();
+               global $wgMimeType;
 
-               if ( $log ) {
-                       if ( $wgLogExceptionBacktrace ) {
-                               wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
-                       } else {
-                               wfDebugLog( 'exception', $log );
-                       }
-               }
+               $this->logException();
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
@@ -273,6 +266,22 @@ class MWException extends Exception {
                }
        }
 
+       /**
+        * Log the error message to the exception log (if enabled)
+        */
+       function logException() {
+               global $wgLogExceptionBacktrace;
+
+               $log = $this->getLogMessage();
+               if ( $log ) {
+                       if ( $wgLogExceptionBacktrace ) {
+                               wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
+                       } else {
+                               wfDebugLog( 'exception', $log );
+                       }
+               }
+       }
+
        /**
         * Check whether we are in command line mode or not to report the exception
         * in the correct format.
index 1d20f18..499d821 100644 (file)
@@ -54,7 +54,6 @@ class Sanitizer {
         * List of all named character entities defined in HTML 4.01
         * http://www.w3.org/TR/html4/sgml/entities.html
         * As well as &apos; which is only defined starting in XHTML1.
-        * @private
         */
        private static $htmlEntities = array(
                'Aacute'   => 193,
@@ -322,7 +321,6 @@ class Sanitizer {
 
        /**
         * Lazy-initialised attributes regex, see getAttribsRegex()
-        * @private
         */
        private static $attribsRegex;
 
index 48cde0e..ac08463 100644 (file)
@@ -217,8 +217,8 @@ class StringUtils {
        /**
         * More or less "markup-safe" explode()
         * Ignores any instances of the separator inside <...>
-        * @param $separator String
-        * @param $text String
+        * @param string $separator
+        * @param string $text
         * @return array
         */
        static function explodeMarkup( $separator, $text ) {
@@ -244,8 +244,8 @@ class StringUtils {
         * Escape a string to make it suitable for inclusion in a preg_replace()
         * replacement parameter.
         *
-        * @param $string String
-        * @return String
+        * @param string $string
+        * @return string
         */
        static function escapeRegexReplacement( $string ) {
                $string = str_replace( '\\', '\\\\', $string );
@@ -256,8 +256,8 @@ class StringUtils {
        /**
         * Workalike for explode() with limited memory usage.
         * Returns an Iterator
-        * @param $separator
-        * @param $subject
+        * @param string $separator
+        * @param string $subject
         * @return ArrayIterator|ExplodeIterator
         */
        static function explode( $separator, $subject ) {
@@ -290,14 +290,14 @@ class RegexlikeReplacer extends Replacer {
        var $r;
 
        /**
-        * @param $r string
+        * @param string $r
         */
        function __construct( $r ) {
                $this->r = $r;
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        function replace( $matches ) {
@@ -318,7 +318,7 @@ class DoubleReplacer extends Replacer {
        /**
         * @param $from
         * @param $to
-        * @param $index int
+        * @param int $index
         */
        function __construct( $from, $to, $index = 0 ) {
                $this->from = $from;
@@ -327,7 +327,7 @@ class DoubleReplacer extends Replacer {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return mixed
         */
        function replace( $matches ) {
@@ -343,7 +343,7 @@ class HashtableReplacer extends Replacer {
 
        /**
         * @param $table
-        * @param $index int
+        * @param int $index
         */
        function __construct( $table, $index = 0 ) {
                $this->table = $table;
@@ -351,7 +351,7 @@ class HashtableReplacer extends Replacer {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return mixed
         */
        function replace( $matches ) {
@@ -389,6 +389,7 @@ class ReplacementArray {
 
        /**
         * Set the whole replacement array at once
+        * @param array $data
         */
        function setArray( $data ) {
                $this->data = $data;
@@ -404,8 +405,8 @@ class ReplacementArray {
 
        /**
         * Set an element of the replacement array
-        * @param $from string
-        * @param $to string
+        * @param string $from
+        * @param string $to
         */
        function setPair( $from, $to ) {
                $this->data[$from] = $to;
@@ -413,7 +414,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $data array
+        * @param array $data
         */
        function mergeArray( $data ) {
                $this->data = array_merge( $this->data, $data );
@@ -421,7 +422,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $other
+        * @param ReplacementArray $other
         */
        function merge( $other ) {
                $this->data = array_merge( $this->data, $other->data );
@@ -429,7 +430,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $from string
+        * @param string $from
         */
        function removePair( $from ) {
                unset( $this->data[$from] );
@@ -437,7 +438,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $data array
+        * @param array $data
         */
        function removeArray( $data ) {
                foreach ( $data as $from => $to ) {
@@ -447,7 +448,7 @@ class ReplacementArray {
        }
 
        /**
-        * @param $subject string
+        * @param string $subject
         * @return string
         */
        function replace( $subject ) {
@@ -494,15 +495,15 @@ class ExplodeIterator implements Iterator {
 
        /**
         * Construct a DelimIterator
-        * @param $delim string
-        * @param $s string
+        * @param string $delim
+        * @param string $subject
         */
-       function __construct( $delim, $s ) {
-               $this->subject = $s;
+       function __construct( $delim, $subject ) {
+               $this->subject = $subject;
                $this->delim = $delim;
 
                // Micro-optimisation (theoretical)
-               $this->subjectLength = strlen( $s );
+               $this->subjectLength = strlen( $subject );
                $this->delimLength = strlen( $delim );
 
                $this->rewind();
@@ -530,6 +531,9 @@ class ExplodeIterator implements Iterator {
                return $this->current;
        }
 
+       /**
+        * @return int|bool Current position or boolean false if invalid
+        */
        function key() {
                return $this->curPos;
        }
index 3ad76b9..13350cf 100644 (file)
@@ -3620,6 +3620,8 @@ class Title {
                        $createRedirect = true;
                }
 
+               wfRunHooks( 'TitleMove', array( $this, $nt, $wgUser ) );
+
                // If it is a file, move it first.
                // It is done before all other moving stuff is done because it's hard to revert.
                $dbw = wfGetDB( DB_MASTER );
index 55bddfc..23eee04 100644 (file)
@@ -881,8 +881,9 @@ class WebRequest {
                        return;
                }
 
-               if ( function_exists( 'apache_request_headers' ) ) {
-                       foreach ( apache_request_headers() as $tempName => $tempValue ) {
+               $apacheHeaders = function_exists( 'apache_request_headers' ) ? apache_request_headers() : false;
+               if ( $apacheHeaders ) {
+                       foreach ( $apacheHeaders as $tempName => $tempValue ) {
                                $this->headers[strtoupper( $tempName )] = $tempValue;
                        }
                } else {
index fca979b..fbaa4da 100644 (file)
@@ -694,7 +694,7 @@ class DatabaseOracle extends DatabaseBase {
                                break;
                }
 
-               return parent::tableName( strtoupper( $name ), $format );
+               return strtoupper( parent::tableName( $name, $format ) );
        }
 
        function tableNameInternal( $name ) {
@@ -883,7 +883,7 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Query whether a given table exists (in the given schema, or the default mw one if not given)
-        * @return int
+        * @return bool
         */
        function tableExists( $table, $fname = __METHOD__ ) {
                $table = $this->tableName( $table );
@@ -891,13 +891,14 @@ class DatabaseOracle extends DatabaseBase {
                $owner = $this->addQuotes( strtoupper( $this->mDBname ) );
                $SQL = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
                $res = $this->doQuery( $SQL );
-               if ( $res ) {
-                       $count = $res->numRows();
-                       $res->free();
+               if ( $res && $res->numRows() > 0 ) {
+                       $exists = true;
                } else {
-                       $count = 0;
+                       $exists = false;
                }
-               return $count;
+
+               $res->free();
+               return $exists;
        }
 
        /**
index 6692fa4..a8270bf 100644 (file)
@@ -709,6 +709,8 @@ class DatabaseSqlite extends DatabaseBase {
        function addQuotes( $s ) {
                if ( $s instanceof Blob ) {
                        return "x'" . bin2hex( $s->fetch() ) . "'";
+               } elseif ( is_bool( $s ) ) {
+                       return (int)$s;
                } elseif ( strpos( $s, "\0" ) !== false ) {
                        // SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
                        // This is a known limitation of SQLite's mprintf function which PDO should work around,
index 3ff5c98..0c9086b 100644 (file)
@@ -185,10 +185,14 @@ class DifferenceEngine extends ContextSource {
                $out = $this->getOutput();
 
                $missing = array();
-               if ( $this->mOldRev === null ) {
+               if ( $this->mOldRev === null ||
+                       ( $this->mOldRev && $this->mOldContent === null )
+               ) {
                        $missing[] = $this->deletedIdMarker( $this->mOldid );
                }
-               if ( $this->mNewRev === null ) {
+               if ( $this->mNewRev === null ||
+                       ( $this->mNewRev && $this->mNewContent === null )
+               ) {
                        $missing[] = $this->deletedIdMarker( $this->mNewid );
                }
 
@@ -1181,26 +1185,29 @@ class DifferenceEngine extends ContextSource {
        function loadText() {
                if ( $this->mTextLoaded == 2 ) {
                        return true;
-               } else {
-                       // Whether it succeeds or fails, we don't want to try again
-                       $this->mTextLoaded = 2;
                }
 
+               // Whether it succeeds or fails, we don't want to try again
+               $this->mTextLoaded = 2;
+
                if ( !$this->loadRevisionData() ) {
                        return false;
                }
+
                if ( $this->mOldRev ) {
                        $this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                        if ( $this->mOldContent === null ) {
                                return false;
                        }
                }
+
                if ( $this->mNewRev ) {
                        $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                        if ( $this->mNewContent === null ) {
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -1212,13 +1219,16 @@ class DifferenceEngine extends ContextSource {
        function loadNewText() {
                if ( $this->mTextLoaded >= 1 ) {
                        return true;
-               } else {
-                       $this->mTextLoaded = 1;
                }
+
+               $this->mTextLoaded = 1;
+
                if ( !$this->loadRevisionData() ) {
                        return false;
                }
+
                $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+
                return true;
        }
 }
index 9060731..05cb000 100644 (file)
@@ -842,8 +842,9 @@ abstract class File {
        protected function transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags ) {
                global $wgIgnoreImageErrors;
 
-               if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
-                       return $this->getHandler()->getTransform( $this, $thumbPath, $thumbUrl, $params );
+               $handler = $this->getHandler();
+               if ( $handler && $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
+                       return $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                } else {
                        return new MediaTransformError( 'thumbnail_error',
                                $params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
@@ -1000,7 +1001,7 @@ abstract class File {
        /**
         * Get a MediaHandler instance for this file
         *
-        * @return MediaHandler
+        * @return MediaHandler|boolean Registered MediaHandler for file's mime type or false if none found
         */
        function getHandler() {
                if ( !isset( $this->handler ) ) {
index 39ef62c..91dacf8 100644 (file)
@@ -610,7 +610,11 @@ class LocalFile extends File {
                $this->load();
 
                if ( $this->isMultipage() ) {
-                       $dim = $this->getHandler()->getPageDimensions( $this, $page );
+                       $handler = $this->getHandler();
+                       if ( !$handler ) {
+                               return 0;
+                       }
+                       $dim = $handler->getPageDimensions( $this, $page );
                        if ( $dim ) {
                                return $dim['width'];
                        } else {
@@ -633,7 +637,11 @@ class LocalFile extends File {
                $this->load();
 
                if ( $this->isMultipage() ) {
-                       $dim = $this->getHandler()->getPageDimensions( $this, $page );
+                       $handler = $this->getHandler();
+                       if ( !$handler ) {
+                               return 0;
+                       }
+                       $dim = $handler->getPageDimensions( $this, $page );
                        if ( $dim ) {
                                return $dim['height'];
                        } else {
index 4c7b3e0..f9db670 100644 (file)
@@ -12330,7 +12330,7 @@ Kuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code>  o
        'config-restart' => 'Jo, neistarten',
        'config-welcome' => "=== Iwwerpréifung vum Installatiounsenvironnement ===
 Et gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.
-Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef braucht.",
+Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef braucht.", # Fuzzy
        'config-sidebar' => '* [//www.mediawiki.org MediaWiki Haaptsäit]
 * [//www.mediawiki.org/wiki/Help:Contents Benotzerguide]
 * [//www.mediawiki.org/wiki/Manual:Contents Guide fir Administrateuren]
@@ -12441,7 +12441,7 @@ Dësen Numm gëtt da gebraucht fir sech an d\'Wiki anzeloggen.',
 Spezifizéiert en anere Benotzernumm.',
        'config-admin-password-blank' => 'Gitt e Passwuert fir den Adminstateur-Kont an.',
        'config-admin-password-same' => "D'Passwuert däerf net dat selwecht si wéi de Benotzernumm.",
-       'config-admin-password-mismatch' => 'Déi zwee Passwierder Déi dir aginn stëmmen net iwwerteneen.',
+       'config-admin-password-mismatch' => 'Déi zwee Passwierder Déi Dir aginn hutt stëmmen net iwwereneen.',
        'config-admin-email' => 'E-Mail-Adress:',
        'config-admin-error-user' => 'Interne Feeler beim uleeë vun engem Administrateur mam Numm "<nowiki>$1</nowiki>".',
        'config-admin-error-password' => 'Interne Feeler beim Setze vum Passwuert fir den Admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
index 474212b..4fc8bac 100644 (file)
@@ -48,7 +48,7 @@ class RefreshLinksJob extends Job {
                # Wait for the DB of the current/next slave DB handle to catch up to the master.
                # This way, we get the correct page_latest for templates or files that just changed
                # milliseconds ago, having triggered this job to begin with.
-               if ( !empty( $this->params['masterPos'] ) ) {
+               if ( isset( $this->params['masterPos'] ) && $this->params['masterPos'] !== false ) {
                        wfGetLB()->waitFor( $this->params['masterPos'] );
                }
 
index 8b0e287..17e1258 100644 (file)
@@ -85,7 +85,7 @@ class CSSMin {
         * @param $file string
         * @return bool|string
         */
-       protected static function getMimeType( $file ) {
+       public static function getMimeType( $file ) {
                $realpath = realpath( $file );
                // Try a couple of different ways to get the mime-type of a file, in order of
                // preference
index ff3ea35..704d781 100644 (file)
@@ -177,6 +177,7 @@ class ResourceLoader {
                        // Save filtered text to Memcached
                        $cache->set( $key, $result );
                } catch ( Exception $exception ) {
+                       $exception->logException();
                        wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $exception" );
                        $this->hasErrors = true;
                        // Return exception as a comment
@@ -474,6 +475,7 @@ class ResourceLoader {
                try {
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
+                       $e->logException();
                        wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
                        $this->hasErrors = true;
                        // Add exception to the output as a comment
@@ -493,6 +495,7 @@ class ResourceLoader {
                                // Calculate maximum modified time
                                $mtime = max( $mtime, $module->getModifiedTime( $context ) );
                        } catch ( Exception $e ) {
+                               $e->logException();
                                wfDebugLog( 'resourceloader', __METHOD__ . ": calculating maximum modified time failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -607,15 +610,7 @@ class ResourceLoader {
                                // See also http://bugs.php.net/bug.php?id=51579
                                // To work around this, we tear down all output buffering before
                                // sending the 304.
-                               // On some setups, ob_get_level() doesn't seem to go down to zero
-                               // no matter how often we call ob_get_clean(), so instead of doing
-                               // the more intuitive while ( ob_get_level() > 0 ) ob_get_clean();
-                               // we have to be safe here and avoid an infinite loop.
-                               // Caching the level is not an option, need to allow it to
-                               // shorten the loop on-the-fly (bug 46836)
-                               for ( $i = 0; $i < ob_get_level(); $i++ ) {
-                                       ob_end_clean();
-                               }
+                               wfResetOutputBuffers( /* $resetGzipEncoding = */ true );
 
                                header( 'HTTP/1.0 304 Not Modified' );
                                header( 'Status: 304 Not Modified' );
@@ -727,6 +722,7 @@ class ResourceLoader {
                        try {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
+                               $e->logException();
                                wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -834,6 +830,7 @@ class ResourceLoader {
                                                break;
                                }
                        } catch ( Exception $e ) {
+                               $e->logException();
                                wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
index e7f36ee..002e949 100644 (file)
@@ -134,8 +134,13 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                        $paramString = substr( $thumbPart, 0, $srcNamePos - 1 );
 
                        $handler = $file->getHandler();
-                       $params = $handler->parseParamString( $paramString );
-                       return array( 'file' => $file, 'type' => $type, 'params' => $params );
+                       if ( $handler ) {
+                               $params = $handler->parseParamString( $paramString );
+                               return array( 'file' => $file, 'type' => $type, 'params' => $params );
+                       } else {
+                               throw new UploadStashBadPathException( 'No handler found for ' .
+                                               "mime {$file->getMimeType()} of file {$file->getPath()}" );
+                       }
                }
 
                return array( 'file' => $file, 'type' => $type );
index 5ee8a5a..6f3281c 100644 (file)
@@ -483,8 +483,8 @@ $messages = array(
 'tog-extendwatchlist' => 'مدد قائمة المراقبة لتعرض كل التغييرات، وليس أحدثها فقط',
 'tog-usenewrc' => 'جمّع التغييرات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت)',
 'tog-numberheadings' => 'رقّم العناوين تلقائيًا',
-'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
-'tog-editondblclick' => 'تحرير الصفحات بالنقر المزدوج (جافاسكربت)',
+'tog-showtoolbar' => 'أظهر شريط التحرير',
+'tog-editondblclick' => 'تحرير الصفحات بالنقر المزدوج',
 'tog-editsection' => 'مكن تحرير الأقسام بروابط [عدل]',
 'tog-editsectiononrightclick' => 'فعِّل تحرير الأقسام بالنقر باليمين على عناوين الأقسام (يتطلب جافاسكريبت)',
 'tog-showtoc' => 'اعرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
@@ -504,7 +504,7 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبِين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنصّ ويكي (بلا رابط تلقائي)',
-'tog-uselivepreview' => 'استخدÙ\85 Ø§Ù\84Ù\85عاÙ\8aÙ\86Ø© Ø§Ù\84سرÙ\8aعة (تتطÙ\84ب Ø¬Ø§Ù\81اسÙ\83رÙ\8aبت) (تجريبية)',
+'tog-uselivepreview' => 'إستخدÙ\85 Ø§Ù\84Ù\85عاÙ\8aÙ\86Ø© Ø§Ù\84Ø­Ù\8aØ©(تجريبية)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تحرير فارغ',
 'tog-watchlisthideown' => 'أخف تحريراتي من قائمة المراقبة',
 'tog-watchlisthidebots' => 'أخف تحريرات الروبوتات من قائمة المراقبة',
@@ -597,10 +597,10 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|بلا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
-'category_header' => 'اÙ\84صÙ\81حات Ù\81Ù\8a Ø§Ù\84تصنيف "$1"',
+'category_header' => 'صÙ\81حات تصنيف "$1"',
 'subcategories' => 'تصنيفات فرعية',
-'category-media-header' => 'الوسائط في التصنيف "$1"',
-'category-empty' => "''هذا التصنيف لا يحتوي حاليا على صفحات و لا وسائط.''",
+'category-media-header' => 'ملفات تصنيف "$1"',
+'category-empty' => 'هذا التصنيف لا يحتوي حاليا على صفحات أو ملفات.',
 'hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|تصنيف مخفي|تصنيفان مخفيان|تصنيفات مخفية}}',
 'hidden-category-category' => 'تصنيفات مخفية',
 'category-subcat-count' => '{{PLURAL:$2|هذا التصنيف يحوي التصنيف الفرعي التالي|هذا التصنيف يحوي {{PLURAL:$1||التصنيف الفرعي|تصنيفين فرعيين|$1 تصنيفات فرعية}}، من إجمالي $2.}}',
@@ -1391,7 +1391,7 @@ $2
 'histfirst' => 'الأقدم',
 'histlast' => 'الأحدث',
 'historysize' => '({{PLURAL:$1|1 بايت|$1 بايت}})',
-'historyempty' => '(فارغ)',
+'historyempty' => '(فارغة)',
 
 # Revision feed
 'history-feed-title' => 'تاريخ المراجعة',
@@ -1646,7 +1646,7 @@ $1",
 'prefs-rendering' => 'المظهر',
 'saveprefs' => 'احفظ',
 'resetprefs' => 'أزل التغييرات غير المحفوظة',
-'restoreprefs' => 'استرجع كل الإعدادات الافتراضية',
+'restoreprefs' => 'Ø¥سترجع كل الإعدادات الافتراضية',
 'prefs-editing' => 'التحرير',
 'rows' => 'صفوف:',
 'columns' => 'أعمدة:',
@@ -1734,6 +1734,7 @@ $1",
 'prefs-displaywatchlist' => 'خصائص العرض',
 'prefs-tokenwatchlist' => 'مفتاح',
 'prefs-diffs' => 'فروقات',
+'prefs-help-prefershttps' => 'سيتم تفعيل هذا التفضيل عند ولوجوك في المرة القادمة.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'يبدو أن عنوان البريد الإلكتروني صالح',
@@ -1836,6 +1837,8 @@ $1",
 'right-editmyusercss' => 'تعديل ملفات CSS للمستخدم نفسه',
 'right-editmyuserjs' => 'تعديل ملفات جافاسكربت للمستخدم نفسه',
 'right-viewmywatchlist' => 'عرض قائمة مراقبتك',
+'right-viewmyprivateinfo' => 'إستعرض بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
+'right-editmyprivateinfo' => 'حرر بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
 'right-editmyoptions' => 'تعديل تفضيلاتك',
 'right-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
 'right-markbotedits' => 'التعليم على تعديلات الاسترجاع كتعديلات بوت',
@@ -1905,6 +1908,7 @@ $1",
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|منذ الزيارة الأخيرة}}',
 'enhancedrc-history' => 'تاريخ',
 'recentchanges' => 'أحدث التغييرات',
 'recentchanges-legend' => 'خيارات أحدث التغييرات',
@@ -1937,7 +1941,7 @@ $1",
 'rc_categories_any' => 'أي',
 'rc-change-size-new' => '$1 {{PLURAL:$1|بايت|بايت}} بعد التغيير',
 'newsectionsummary' => '/* $1 */ قسم جديد',
-'rc-enhanced-expand' => 'عرض التفاصيل (يتطلب جافاسكريبت)',
+'rc-enhanced-expand' => 'عرض التفاصيل',
 'rc-enhanced-hide' => 'أخفِ التفاصيل',
 'rc-old-title' => 'تم إنشاؤها أصلا ك"$1"',
 
@@ -2209,8 +2213,7 @@ $1',
 'upload_source_file' => ' (ملف على حاسوبك)',
 
 # Special:ListFiles
-'listfiles-summary' => 'هذه الصفحة الخاصة تعرض كل الملفات المرفوعة.
-عندما ترشحها حسب المستخدم ستعرض فقط الملفات التي رفع آخر نسخة منها ذلك المستخدم.',
+'listfiles-summary' => 'هذه الصفحة الخاصة تعرض كل الملفات المرفوعة.',
 'listfiles_search_for' => 'ابحث عن اسم الميديا:',
 'imgfile' => 'ملف',
 'listfiles' => 'قائمة الملفات',
@@ -2221,6 +2224,10 @@ $1',
 'listfiles_size' => 'الحجم',
 'listfiles_description' => 'الوصف',
 'listfiles_count' => 'نسخ',
+'listfiles-show-all' => 'أدرج النسخ القديمة من الصور',
+'listfiles-latestversion' => 'النسخة الحالية',
+'listfiles-latestversion-yes' => 'نعم',
+'listfiles-latestversion-no' => 'لا',
 
 # File description page
 'file-anchor-link' => 'ملف',
@@ -2323,6 +2330,7 @@ $1',
 # Random page in category
 'randomincategory' => 'صفحة عشوائية في التصنيف',
 'randomincategory-invalidcategory' => '"$1" ليس اسم تصنيف صالح.',
+'randomincategory-nopages' => 'لا توجد صفحات في التصنيف [[:Category:$1|$1]].',
 'randomincategory-selectcategory' => 'عرض صفحة عشوائية من التصنيف:  $1   $2',
 'randomincategory-selectcategory-submit' => 'اذهب',
 
@@ -4370,8 +4378,8 @@ $5
 'compare-selector' => 'قارن مراجعات الصفحة',
 'compare-page1' => 'صفحة 1',
 'compare-page2' => 'صفحة 2',
-'compare-rev1' => 'Ù\85راجعة 1',
-'compare-rev2' => 'Ù\85راجعة 2',
+'compare-rev1' => 'Ù\86سخة 1',
+'compare-rev2' => 'Ù\86سخة 2',
 'compare-submit' => 'قارن',
 'compare-invalid-title' => 'العنوان الذي حددته غير متاح.',
 'compare-title-not-exists' => 'العنوان الذي حددته غير موجود.',
@@ -4382,6 +4390,7 @@ $5
 'dberr-problems' => 'عذرا! هذا الموقع يعاني من صعوبات تقنية.',
 'dberr-again' => 'جرب الانتظار بضع دقائق وإعادة التحميل.',
 'dberr-info' => '(غير قادر على الاتصال بخادوم قاعدة البيانات: $1)',
+'dberr-info-hidden' => '(لا يمكن الإتصال بخادم قاعدة البيانات)',
 'dberr-usegoogle' => 'يمكنك محاولة البحث من خلال جوجل في الوقت الحاضر.',
 'dberr-outofdate' => 'لاحظ أن فهارسهم لمحتوانا ربما تكون غير محدثة.',
 'dberr-cachederror' => 'التالي نسخة مخزنة من الصفحة المطلوبة، وربما لا تكون محدثة.',
@@ -4518,7 +4527,11 @@ $5
 'rotate-comment' => 'تدوير الصورة  {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة',
 
 # Limit report
+'limitreport-cputime' => 'بيانات إستخدام وحدة المعالجة المركزية',
 'limitreport-cputime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}',
+'limitreport-walltime' => 'بيانات الإستخدام الآني',
 'limitreport-walltime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 بايت',
+'limitreport-templateargumentsize-value' => '$1/$2 بايت',
 
 );
index a38cfc7..34db8cb 100644 (file)
@@ -1213,7 +1213,7 @@ $1",
 لەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.',
 
 # Preferences page
-'preferences' => 'ھەڵبەژاردەکان',
+'preferences' => 'ھەڵبژاردەکان',
 'mypreferences' => 'ھەڵبژاردەکان',
 'prefs-edits' => 'ژمارەی گۆڕانکارییەکان:',
 'prefsnologin' => 'لەژوورەوە نیت',
index 18c655b..da53421 100644 (file)
@@ -4108,7 +4108,7 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'limitreport-walltime' => 'Oikea ajankäyttö',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 tavua',
-'limitreport-templateargumentsize' => 'Mallin argumenttikoko',
+'limitreport-templateargumentsize' => 'Mallineen argumenttien koko',
 'limitreport-templateargumentsize-value' => '$1/$2 tavua',
 'limitreport-expansiondepth' => 'Korkein laajennussyvyys',
 
index 9883eee..5f4b120 100644 (file)
@@ -509,7 +509,7 @@ $messages = array(
 'morenotlisted' => 'רשימה זו אינה מלאה.',
 'mypage' => 'דף משתמש',
 'mytalk' => 'שיחה',
-'anontalk' => '×\94ש×\99×\97×\94 ×¢×\91×\95ר IP ×\96×\94',
+'anontalk' => '×\93×£ ×\94ש×\99×\97×\94 ×¢×\91×\95ר ×\9bת×\95×\91ת IP ×\96×\95',
 'navigation' => 'ניווט',
 'and' => '&#32;וגם',
 
@@ -2127,7 +2127,7 @@ $1',
 'linkstoimage-more' => 'יותר {{PLURAL:$1|מדף אחד מקשר|מ־$1 דפים מקשרים}} לקובץ זה.
 הרשימה הבאה מראה רק את {{PLURAL:$1|הדף הראשון שמקשר|$1 הדפים הראשונים שמקשרים}} לקובץ זה.
 ניתן לצפות ב[[Special:WhatLinksHere/$2|רשימה המלאה]].',
-'nolinkstoimage' => '×\90×\99×\9f ×\93פ×\99×\9d ×©משתמשים בקובץ זה.',
+'nolinkstoimage' => '×\90×\99×\9f ×\93פ×\99×\9d ×\94משתמשים בקובץ זה.',
 'morelinkstoimage' => 'ראו [[Special:WhatLinksHere/$1|דפים נוספים]] שמשתמשים בקובץ זה.',
 'linkstoimage-redirect' => '$1 (הפניה של קובץ) $2',
 'duplicatesoffile' => '{{PLURAL:$1|הקובץ הבא זהה|הקבצים הבאים זהים}} לקובץ זה ([[Special:FileDuplicateSearch/$2|לפרטים נוספים]]):',
@@ -2556,7 +2556,7 @@ $UNWATCHURL
 'deletepage' => 'מחיקה',
 'confirm' => 'אישור',
 'excontent' => 'תוכן היה: "$1"',
-'excontentauthor' => "התוכן היה: '$1' וה{{gender:$2|תורם היחיד היה|תורמת היחידה הייתה}} [[Special:Contributions/$2|$2]] ([[User Talk:$2|ש]])",
+'excontentauthor' => 'התוכן היה: "$1" ({{gender:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} [[Special:Contributions/$2|$2]])',
 'exbeforeblank' => 'תוכן לפני שרוקן היה: "$1"',
 'exblank' => 'הדף היה ריק',
 'delete-confirm' => 'מחיקת $1',
@@ -2612,7 +2612,7 @@ $UNWATCHURL
 'protectlogtext' => 'להלן רשימה של שינויי ההגנה על דפים.
 ראו גם את [[Special:ProtectedPages|רשימת הדפים המוגנים]] הנוכחית.',
 'protectedarticle' => 'הפעיל הגנה על [[$1]]',
-'modifiedarticleprotection' => 'ש×\99× ×\94 ×\90ת ×¨×\9eת ×\94×\94×\92× ×\94 ×©×\9c [[$1]]',
+'modifiedarticleprotection' => 'ש×\99× ×\94 ×\90ת ×\94×\92×\93ר×\95ת ×\94×\94×\92× ×\94 ×©×\9c "[[$1]]"',
 'unprotectedarticle' => 'ביטל את ההגנה על [[$1]]',
 'movedarticleprotection' => 'העביר את הגדרות ההגנה מ"[[$2]]" ל"[[$1]]"',
 'protect-title' => 'שינוי רמת ההגנה של "$1"',
@@ -2808,11 +2808,11 @@ $1',
 'ipbenableautoblock' => 'חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד',
 'ipbsubmit' => 'חסימה',
 'ipbother' => 'זמן אחר:',
-'ipboptions' => 'שעת×\99×\99×\9d:2 hours,×\99×\95×\9d:1 day,ש×\9c×\95ש×\94 ×\99×\9e×\99×\9d:3 days,ש×\91×\95×¢:1 week,ש×\91×\95×¢×\99×\99×\9d:2 weeks,×\97×\95×\93ש:1 month,ש×\9c×\95ש×\94 ×\97×\95×\93ש×\99×\9d:3 months,ש×\99ש×\94 ×\97×\95×\93ש×\99×\9d:6 months,שנ×\94:1 year,×\9c×\96×\9e×\9f ×\91×\9cת×\99 ×\9e×\95×\92×\91×\9c:infinite',
+'ipboptions' => 'שעתיים:2 hours,יום:1 day,שלושה ימים:3 days,שבוע:1 week,שבועיים:2 weeks,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year,זמן בלתי מוגבל:infinite',
 'ipbotheroption' => 'אחר',
 'ipbotherreason' => 'סיבה אחרת/נוספת:',
 'ipbhidename' => 'הסתרת שם המשתמש מהעריכות ומהרשימות',
-'ipbwatchuser' => 'מעקב אחרי דפי המשתמש והשיחה של משתמש זה',
+'ipbwatchuser' => 'מעקב אחר דף המשתמש ודף השיחה של משתמש זה',
 'ipb-disableusertalk' => 'ביטול האפשרות של המשתמש לערוך את דף השיחה של עצמו בעת החסימה',
 'ipb-change-block' => 'חסימת המשתמש מחדש עם הגדרות אלה',
 'ipb-confirm' => 'אישור החסימה',
@@ -2869,7 +2869,7 @@ $1',
 'blocklogpage' => 'יומן חסימות',
 'blocklog-showlog' => 'משתמש זה נחסם בעבר. יומן החסימות מוצג למטה:',
 'blocklog-showsuppresslog' => 'משתמש זה נחסם והוסתר בעבר. יומן ההסתרות מוצג למטה:',
-'blocklogentry' => '{{GENDER:$4|חסם|חסמה}} את [[$1]] למשך $2 $3',
+'blocklogentry' => 'חסם את [[$1]] למשך $2 $3',
 'reblock-logentry' => 'שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3',
 'blocklogtext' => 'זהו יומן פעולות החסימה והשחרור של משתמשים.
 כתובות IP שנחסמו אוטומטית אינן מופיעות.
@@ -2971,7 +2971,7 @@ $1',
 'cant-move-user-page' => 'אינכם מורשים להעביר דפי משתמש (למעט דפי משנה).',
 'cant-move-to-user-page' => 'אינכם מורשים להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).',
 'newtitle' => 'לשם החדש:',
-'move-watch' => 'מעקב אחרי דף המקור ואחרי דף היעד',
+'move-watch' => 'מעקב אחר דף המקור ואחר דף היעד',
 'movepagebtn' => 'העברה',
 'pagemovedsub' => 'ההעברה הושלמה בהצלחה',
 'movepage-moved' => 'הדף "$1" הועבר לשם "$2".',
@@ -4213,14 +4213,14 @@ $5
 'logentry-delete-delete' => '$1 {{GENDER:$2|מחק|מחקה}} את הדף $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3',
 'logentry-delete-event' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×©×\9c ×\94דף $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×\91דף $3: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של גרסאות בדף $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|הסתיר|הסתירה}} לחלוטין את הדף $3',
 'logentry-suppress-event' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
-'logentry-suppress-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×©×\9c ×\94דף $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c {{PLURAL:$5|×\92רס×\94|$5 ×\92רס×\90×\95ת}} ×\91דף $3: $4',
 'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות את מצב התצוגה של פעולות יומן של $3',
-'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c ×\92רס×\90×\95ת ×©×\9c ×\94דף $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ש×\99× ×\94|ש×\99נת×\94}} ×\91ס×\95×\93×\99×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c ×\92רס×\90×\95ת ×\91דף $3',
 'revdelete-content-hid' => 'התוכן הוסתר',
 'revdelete-summary-hid' => 'תקציר העריכה הוסתר',
 'revdelete-uname-hid' => 'שם המשתמש הוסתר',
@@ -4229,7 +4229,7 @@ $5
 'revdelete-uname-unhid' => 'הסתרת שם המשתמש בוטלה',
 'revdelete-restricted' => 'נוספו הגבלות למפעילי מערכת',
 'revdelete-unrestricted' => 'הוסרו הגבלות ממפעילי מערכת',
-'logentry-move-move' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל$4',
+'logentry-move-move' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}}',
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להשאיר הפניה',
 'logentry-move-move_redir' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה',
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה ובלי להשאיר הפניה',
@@ -4290,7 +4290,7 @@ $5
 'api-error-invalid-file-key' => 'שגיאה פנימית: הקובץ לא נמצא במאגר הזמני.',
 'api-error-missingparam' => 'שגיאה פנימית: פרמטרים חסרים בבקשה שנשלחה.',
 'api-error-missingresult' => 'שגיאה פנימית: לא ניתן לקבוע אם ההעתקה הצליחה.',
-'api-error-mustbeloggedin' => '×¢×\9c×\99×\9b×\9d ×\9c×\94×\99×\95ת ×\9e×\97×\95×\91ר×\99×\9d לחשבון כדי להעלות קבצים.',
+'api-error-mustbeloggedin' => '×\99ש ×\9c×\94×\99×\9bנס לחשבון כדי להעלות קבצים.',
 'api-error-mustbeposted' => 'שגיאה פנימית: הבקשה דורשת שימוש בשיטת POST של HTTP.',
 'api-error-noimageinfo' => 'ההעלאה הושלמה בהצלחה, אבל השרת לא נתן לנו שום מידע על הקובץ.',
 'api-error-nomodule' => 'שגיאה פנימית: מודול ההעלאה אינו מוגדר.',
index c4d2a28..fa3d96e 100644 (file)
@@ -2693,7 +2693,7 @@ $1',
 'sp-contributions-logs' => 'log',
 'sp-contributions-talk' => 'bicara',
 'sp-contributions-userrights' => 'pengelolaan hak pengguna',
-'sp-contributions-blocked-notice' => 'Pengguna ini sedang di blok. log pemblokiran terakhir ditampilkan berikut untuk referensi:',
+'sp-contributions-blocked-notice' => 'Pengguna ini sedang diblok. Log pemblokiran terakhir ditampilkan berikut untuk referensi:',
 'sp-contributions-blocked-notice-anon' => 'Alamat IP ini diblokir pada saat ini.
 Catatan log pemblokiran terakhir tersedia di bawah ini sebagai rujukan:',
 'sp-contributions-search' => 'Cari kontribusi',
index 8485640..9f9121e 100644 (file)
@@ -484,7 +484,7 @@ Pro indice paginarum specialum validarum, vide [[Special:SpecialPages|{{int:spec
 'badarticleerror' => 'Haec actio non perfici potest in hac pagina.',
 'cannotdelete' => 'Pagina vel fasciculus "$1" deleri non potuit.
 Fortasse usor alius iam deleverat.',
-'cannotdelete-title' => 'Paginam "$1" delere non contigit.',
+'cannotdelete-title' => 'Paginam "$1" delere non contigit',
 'badtitle' => 'Titulus malus',
 'badtitletext' => 'Nomen paginae quaestae fuit invalidum, vacuum, aut praeverbium interlingualem vel intervicialem habuit. Fortasse insunt una aut plus litterarum quae in titulis non possunt inscribier.',
 'wrong_wfQuery_params' => 'Parametri incorrectae pro wfQuery()<br />
@@ -808,7 +808,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 
 # Revision feed
 'history-feed-title' => 'Historia',
-'history-feed-description' => 'Conspectus recensionum huius paginae',
+'history-feed-description' => 'Historia emendationum huius paginae',
 'history-feed-item-nocomment' => '$1 ad $2',
 
 # Revision deletion
@@ -836,7 +836,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'revdel-restore-visible' => 'Recensiones visibiles',
 'pagehist' => 'Historia paginae',
 'deletedhist' => 'Historia deleta',
-'revdelete-otherreason' => 'Aliae/plures causae:',
+'revdelete-otherreason' => 'Causa alia vel explicatio:',
 'revdelete-reasonotherlist' => 'Causa alia',
 'revdelete-edit-reasonlist' => 'Causas deletionum recensere',
 'revdelete-offender' => 'Auctor emendationis:',
@@ -1014,9 +1014,9 @@ Si vis id dare, opera tua tibi ascribentur.',
 'prefs-signature' => 'Subscriptio',
 'prefs-preview' => 'Praevisum',
 'prefs-advancedwatchlist' => 'Praeferentiae monstrare',
-'prefs-displayrc' => 'Praeferentiae monstrare',
-'prefs-displaysearchoptions' => 'Praeferentiae monstrare',
-'prefs-displaywatchlist' => 'Praeferentiae monstrare',
+'prefs-displayrc' => 'Praeferentiae vultus',
+'prefs-displaysearchoptions' => 'Praeferentiae vultus',
+'prefs-displaywatchlist' => 'Praeferentiae vultus',
 'prefs-diffs' => 'Differentiae',
 
 # User rights
index 9fabe18..43af434 100644 (file)
@@ -188,7 +188,7 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Linken ënnersträichen:',
 'tog-justify' => "Ränner vum Text riichten (''justify'')",
-'tog-hideminor' => 'Kleng Ännerungen an de rezenten Ännerungen verstoppen',
+'tog-hideminor' => 'Kleng Ännerungen an de rezenten Ännerunge verstoppen',
 'tog-hidepatrolled' => 'Iwwerkuckten Ännerungen an de "Rezenten Ännerungen" verstoppen',
 'tog-newpageshidepatrolled' => 'Iwwerkuckte Säiten op der Lëscht vun den "Neie Säite" verstoppen',
 'tog-extendwatchlist' => 'Iwwerwaachungslëscht op all Ännerungen ausbreeden, net nëmmen op déi rezentst',
@@ -535,7 +535,7 @@ Dat geschitt normalerweis duerch e Link op eng Säit déi geläscht oder geréck
 Wann dat net de Fall ass, hutt Dir eventuell e Feeler an der Software fonnt.
 Mellt dëst w.e.g. bei engem [[Special:ListUsers/sysop|Administrateur]] a vergiesst net d'URL unzeginn.",
 'missingarticle-rev' => '(Versiounsnummer: $1)',
-'missingarticle-diff' => '(Ënnerscheed tëschent Versiounen: $1, $2)',
+'missingarticle-diff' => '(Ënnerscheed tëscht Versiounen: $1, $2)',
 'readonly_lag' => "D'Datebank gouf automatesch gespaart fir datt d'Zweetserveren (slaves) nees mat dem Haaptserver (master) synchron geschalt kënne ginn.",
 'internalerror' => 'Interne Feeler',
 'internalerror_info' => 'Interne Feeler: $1',
@@ -682,7 +682,7 @@ Vergewëssert Iech datt Dir Cookien zouloosst, luet dës Säit nei a probéiert
 'loginsuccesstitle' => 'Umeldung huet geklappt',
 'loginsuccess' => "'''Dir sidd elo als \"\$1\" op {{SITENAME}} ugemellt.'''",
 'nosuchuser' => 'Et gëtt kee Benotzernumm mam Numm "$1".
-Beim Benotzernumm gëtt tëschent groussen a klenge Buschtawen ënnerscheet (casesensitive).
+Beim Benotzernumm gëtt tëscht groussen a klenge Buschtawen ënnerscheet (casesensitive).
 Kuckt w.e.g. op d\'Schreifweis richteg ass, oder [[Special:UserLogin/signup|maacht en neie Benotzerkont op]].',
 'nosuchusershort' => 'De Benotzernumm "$1" gëtt et net.
 Kuckt w.e.g. op d\'Schreifweis richteg ass.',
@@ -997,7 +997,7 @@ Den Administrateur den d'Datebank gespaart huet, huet dës Erklärung ginn: $1",
 'nocreatetext' => "Op {{SITENAME}} gouf d'Schafe vun neie Säite limitéiert. Dir kënnt Säiten déi scho bestinn änneren oder Iech [[Special:UserLogin|umellen]].",
 'nocreate-loggedin' => 'Dir hutt keng Berechtigung fir nei Säiten unzeleeën.',
 'sectioneditnotsupported-title' => 'Ännere vum Abschnitt gëtt net ënnerstëtzt',
-'sectioneditnotsupported-text' => "D'Ännere vun Abschnitten gëtt op dëser Ännerungssäit net ënnerstetzt.",
+'sectioneditnotsupported-text' => "D'Ännere vun Abschnitte gëtt op dëser Ännerungssäit net ënnerstëtzt.",
 'permissionserrors' => 'Net genuch Rechter',
 'permissionserrorstext' => 'Dir hutt net genuch Rechter fir déi Aktioun auszeféieren. {{PLURAL:$1|Grond|Grënn}}:',
 'permissionserrorstext-withaction' => 'Dir sidd, aus {{PLURAL:$1|dësem Grond|dëse Grënn}}, net berechtegt $2 :',
@@ -1226,9 +1226,9 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 
 # Diffs
 'history-title' => '$1: Historique vun de Versiounen',
-'difference-title' => '$1: Ënnerscheed tëschent de Versiounen',
-'difference-title-multipage' => '$1 a(n) $2: Ënnerscheed tëschent de Säiten',
-'difference-multipage' => '(Ënnerscheed tëschent Säiten)',
+'difference-title' => '$1: Ënnerscheed tëscht de Versiounen',
+'difference-title-multipage' => '$1 a(n) $2: Ënnerscheed tëscht de Säiten',
+'difference-multipage' => '(Ënnerscheed tëscht Säiten)',
 'lineno' => 'Linn $1:',
 'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
 'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
@@ -1501,7 +1501,7 @@ Dës Informatioun ass ëffentlech.",
 'right-deletelogentry' => 'Eenzel Androungen an de Logbicher läschen a restauréieren',
 'right-deleterevision' => 'Spezifesch Versioune vu Säite läschen a restauréieren',
 'right-deletedhistory' => 'Weis geläscht Versiounen am Historique, ouni den associéierten Text',
-'right-deletedtext' => "Geläschten Text an d'Ännerungen tëschent de geläschte Versioune weisen",
+'right-deletedtext' => "Geläschten Text an d'Ännerungen tëscht de geläschte Versioune weisen",
 'right-browsearchive' => 'Geläscht Säite sichen',
 'right-undelete' => 'Eng Säit restauréieren',
 'right-suppressrevision' => 'Virun den Administrateure verstoppte Versiounen nokucken a restauréieren',
@@ -2744,7 +2744,7 @@ Dëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenn
 Dëst kann en drastesche Changement fir eng populär Säit sinn;
 verstitt w.e.g. d'Konsequenze vun ärer Handlung éier Dir dëst maacht.",
 'movepagetalktext' => "D'associéiert Diskussiounssäit, am Fall wou  eng do ass, gëtt automatesch matgeréckelt, '''ausser:'''
-*D'Säit gëtt an een anere Nummraum geréckelt.
+*D'Säit gëtt an een aneren Nummraum geréckelt.
 *Et gëtt schonn eng Diskussiounssäit mat dësem Numm, oder
 *Dir klickt d'Këschtchen ënnendrënner net un.
 
@@ -2767,7 +2767,7 @@ An deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéiere
 'articleexists' => 'Eng Säit mat dësem Numm gëtt et schonns, oder den Numm deen Dir gewielt hutt gëtt net akzeptéiert.
 Wielt w.e.g. en aneren Numm.',
 'cantmove-titleprotected' => "Dir kënnt keng Säit op dës Plaz réckelen, well deen neien Titel fir d'Uleeë gespaart ass.",
-'talkexists' => "D'Säit selwer gouf erfollegräich geréckelt, mä d'Diskussiounssäit konnt net mat eriwwergeholl gi well et schonns eng ënner deem neien Titel gëtt. W.e.g. setzt dës manuell zesummen.",
+'talkexists' => "D'Säit selwer gouf geréckelt, mä d'Diskussiounssäit konnt net mat eriwwergeholl gi well et schonns eng ënner deem neien Titel gëtt. W.e.g. setzt dës manuell zesummen.",
 'movedto' => 'geréckelt op',
 'movetalk' => 'Déi associéiert Diskussiounssäit matréckelen',
 'move-subpages' => 'Ënnersäite (bis zu $1) réckelen',
@@ -2987,7 +2987,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'tooltip-save' => 'Ännerunge späicheren',
 'tooltip-preview' => 'Kuckt är Ännerungen ouni ofzespäicheren, Benotzt dëst w.e.g. virum späicheren!',
 'tooltip-diff' => 'Weist wéi eng Ännerungen Dir beim Text gemaach hutt.',
-'tooltip-compareselectedversions' => "D'Ënnerscheeder op dëser Säit tëschent den zwou gewielte Versioune weisen.",
+'tooltip-compareselectedversions' => "D'Ënnerscheeder op dëser Säit tëscht den zwou gewielte Versioune weisen.",
 'tooltip-watch' => 'Dës Säit op Är Iwwerwaachungslëscht bäisetzen',
 'tooltip-watchlistedit-normal-submit' => 'Säiten erofhuelen',
 'tooltip-watchlistedit-raw-submit' => 'Iwwerwaachungslëscht aktualiséieren',
@@ -3152,7 +3152,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'noimages' => 'Keng Biller fonnt.',
 'ilsubmit' => 'Sichen',
 'bydate' => 'no Datum',
-'sp-newimages-showfrom' => 'Nei Biller weisen, ugefaangen den $1 ëm $2',
+'sp-newimages-showfrom' => 'Nei Biller weisen, ugefaangen de(n) $1 ëm $2',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|enger Sekonn|$1 Sekonnen}}',
@@ -3765,7 +3765,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-poweredby-others' => 'anerer',
 'version-poweredby-translators' => 'translatewiki.net Iwwersetzer',
 'version-credits-summary' => "Mir soen dëse Persoune 'Merci' fir hir Mataarbecht u [[Special:Version|MediaWiki]].",
-'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingungen vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
+'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingunge vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
 
 MediaWiki gëtt verdeelt an der Hoffnung datt se nëtzlech ass, awer OUNI IERGENDENG GARANTIE; ouni eng implizit Garantie vu Commercialisatioun oder Eegnung fir e bestëmmte Gebrauch. Kuckt d'GPL General Public License fir méi Informatiounen.
 
@@ -3825,11 +3825,11 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
 
 # External image whitelist
 'external_image_whitelist' => "#Dës Zeil genee esou loosse wéi se ass<pre>
-#Schreift hei ënnendrënner Fragmenter vu regulären Ausdréck (just den Deel zwëschen den // aginn)
+#Schreift hei ënnendrënner Fragmenter vu regulären Ausdréck (just den Deel zwëscht den // aginn)
 #Dës gi mat den URLe vu Biller aus externe Quelle verglach
 #Wann d'Resultat positiv ass, gëtt d'Bild gewisen, soss gëtt d'Bild just als Link gewisen
 #Zeilen, déi mat engem # ufänken, ginn als Bemierkung behandelt
-#Et gëtt en Ënnerscheed tëschent groussen a klenge Buschtawe gemaach
+#Et gëtt en Ënnerscheed tëscht groussen a klenge Buschtawe gemaach
 
 #All regulär Ausdréck ënner dëser Zeil androen. Dës Zeil genee esou loosse wéi se ass</pre>",
 
index f8f8ba1..a21e022 100644 (file)
@@ -3107,6 +3107,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'tag-filter-submit' => 'Filtrs',
 'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Iezīme|Iezīmes}}]]: $2)',
 'tags-title' => 'Iezīmes',
+'tags-intro' => 'Šajā lapā uzskaitītas iezīmes, ar kurām programmatūra var atzīmēt labojumus, un to nozīme.',
 'tags-tag' => 'Iezīmes nosaukums',
 'tags-display-header' => 'Izmainīto sarakstu izskats',
 'tags-description-header' => 'Nozīmes pilns apraksts',
index 81df40b..fb8ebbb 100644 (file)
@@ -2465,9 +2465,9 @@ Bevestig hieronder dat dit inderdaod de bedoeling is, da'j de gevolgen begriepen
 'deleteotherreason' => 'Aandere/extra reden:',
 'deletereasonotherlist' => 'Aandere reden',
 'deletereason-dropdown' => '*Redens veur t vortdoon van ziejen
-** Op vrage van de auteur
-** Schending van de auteursrechten
-** Vandelisme',
+** Op verzeuk van de auteur
+** Schending van auteursrecht
+** Vandalisme',
 'delete-edit-reasonlist' => 'Redens veur t vortdoon bewarken',
 'delete-toobig' => 'Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.
 t Vortdoon van dit soort ziejen is mit rechten bepark um t per ongelok versteuren van de warking van {{SITENAME}} te veurkoemen.',
@@ -2540,8 +2540,8 @@ Hier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
 'protect-otherreason' => 'Aandere reden:',
 'protect-otherreason-op' => 'aandere reden',
 'protect-dropdown' => '*Veulveurkomende redens veur beveiliging
-** Vandelisme
-** Ongewunste verwiezingen plaotsen
+** Te veul vandalisme
+** Te veul moekreklame
 ** Bewarkingsoorlog
 ** Zied mit veule bezeukers',
 'protect-edit-reasonlist' => 'Redens veur beveiliging bewarken',
@@ -2676,7 +2676,9 @@ De leste regel uut t blokkeerlogboek steet as referensie',
 'blockip' => 'Gebruker blokkeren',
 'blockip-title' => 'Gebruker blokkeren',
 'blockip-legend' => 'n Gebruker of IP-adres blokkeren',
-'blockiptext' => 'Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. t Is bedoeld um vandelisme te veurkoemen en mit in akkerderen mit t [[{{MediaWiki:Policy-url}}|beleid]]. Geef hieronder n reden op (bieveurbeeld op welke ziejen de vandelisme epleeg is)',
+'blockiptext' => 'Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. 
+t Is bedoeld um vandalisme te veurkoemen en mut akkederen mit t [[{{MediaWiki:Policy-url}}|beleid]]. 
+Geef hieronder n reden op (bieveurbeeld op welke ziejen de vandalisme epleegd is).',
 'ipadressorusername' => 'IP-adres of gebrukersnaam',
 'ipbexpiry' => 'Verlöp nao',
 'ipbreason' => 'Reden:',
index 5f51c98..a92629d 100644 (file)
@@ -634,8 +634,8 @@ Ciav provisòria: $2',
 'changeemail-no-info' => 'A dev esse intrà ant ël sistema për andé diretament a costa pàgina.',
 'changeemail-oldemail' => 'Adrëssa ëd pòsta eletrònica atual:',
 'changeemail-newemail' => 'Adrëssa ëd pòsta eletrònica neuva:',
-'changeemail-none' => '(gnun)',
-'changeemail-password' => 'Toa ciav ëd {{SITENAME}}:',
+'changeemail-none' => '(gnun-a)',
+'changeemail-password' => 'Soa ciav su {{SITENAME}}:',
 'changeemail-submit' => "Cangé l'adrëssa ëd pòsta eletrònica",
 'changeemail-cancel' => 'Scancela',
 
index 0266b22..ee39f47 100644 (file)
@@ -1851,7 +1851,7 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
-'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|с последнего посещения}}',
+'enhancedrc-since-last-visit' => '$1 с последнего посещения',
 'enhancedrc-history' => 'история',
 'recentchanges' => 'Свежие правки',
 'recentchanges-legend' => 'Настройки свежих правок',
index adf65a0..1fd526f 100644 (file)
@@ -1297,8 +1297,8 @@ $2
 '''({{int:last}})''' – разлика с претходном изменом, '''{{int:minoreditletter}}''' – мала измена",
 'history-fieldset-title' => 'Преглед историје',
 'history-show-deleted' => 'само обрисано',
-'histfirst' => 'Ð\9dајстарије',
-'histlast' => 'Ð\9dајновије',
+'histfirst' => 'најстарије',
+'histlast' => 'најновије',
 'historysize' => '({{PLURAL:$1|1 бајт|$1 бајта|$1 бајтова}})',
 'historyempty' => '(празно)',
 
@@ -1613,7 +1613,7 @@ $1",
 'badsiglength' => 'Ваш потпис је предугачак.
 Не сме бити дужи од $1 {{PLURAL:$1|знака|знака|знакова}}.',
 'yourgender' => 'Како желите да се представите?',
-'gender-unknown' => 'Ð\9dе Ð¿Ñ\80евиÑ\88е Ð´ÐµÑ\82аÑ\99но',
+'gender-unknown' => 'Ð\9dе Ð¶ÐµÐ»Ð¸Ð¼ Ð´Ð° Ñ\81е Ð¿Ñ\80едÑ\81Ñ\82авим',
 'gender-male' => 'Он уређује вики странице',
 'gender-female' => 'Она уређује вики странице',
 'prefs-help-gender' => 'Необавезно: користи се за исправно обраћање софтвера корисницима, зависно од њиховог пола.
@@ -1628,7 +1628,7 @@ $1",
 'prefs-i18n' => 'Интернационализација',
 'prefs-signature' => 'Потпис',
 'prefs-dateformat' => 'Формат датума',
-'prefs-timeoffset' => 'Ð\92Ñ\80еменÑ\81ко Ð¾Ð´Ñ\81Ñ\82Ñ\83паÑ\9aе',
+'prefs-timeoffset' => 'Ð\92Ñ\80еменÑ\81ка Ñ\80азлика',
 'prefs-advancedediting' => 'Главна подешавања',
 'prefs-editor' => 'Уређивач',
 'prefs-preview' => 'Претпреглед',
index a7068af..fa1085c 100644 (file)
@@ -312,14 +312,14 @@ $messages = array(
 'tog-hidepatrolled' => 'Sakrij pregledane izmene u spisku skorašnjih izmena',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice sa spiska novih stranica',
 'tog-extendwatchlist' => 'Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih',
-'tog-usenewrc' => 'Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica (zahteva javaskript)',
+'tog-usenewrc' => 'Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica',
 'tog-numberheadings' => 'Samostalno numeriši podnaslove',
-'tog-showtoolbar' => 'Traka s alatkama za uređivanje (javaskript)',
-'tog-editondblclick' => 'Uređivanje stranica dvostrukim klikom (potrebna JavaScript-а)',
+'tog-showtoolbar' => 'Prikaži traku s alatkama za uređivanje',
+'tog-editondblclick' => 'Uređivanje stranica dvostrukim klikom',
 'tog-editsection' => 'Veze za uređivanje pojedinačnih odeljaka',
-'tog-editsectiononrightclick' => 'Uređivanje odeljaka desnim klikom na njihove naslove (javaskript)',
+'tog-editsectiononrightclick' => 'Uređivanje odeljaka desnim klikom na njihove naslove',
 'tog-showtoc' => 'Prikaži sadržaj stranica koje imaju više od tri podnaslova',
-'tog-rememberpassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
+'tog-rememberpassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana}})',
 'tog-watchcreations' => 'Dodaj stranice koje napravim i datoteke koje pošaljem u spisak nadgledanja',
 'tog-watchdefault' => 'Dodaj stranice i datoteke koje izmenim u spisak nadgledanja',
 'tog-watchmoves' => 'Dodaj stranice i datoteke koje premestim u spisak nadgledanja',
@@ -335,7 +335,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji nadgledaju',
 'tog-oldsig' => 'Tekući potpis:',
 'tog-fancysig' => 'Smatraj potpis kao vikitekst (bez samopovezivanja)',
-'tog-uselivepreview' => 'Koristi trenutan pregled (javaskript, probna mogućnost)',
+'tog-uselivepreview' => 'Koristi trenutan pregled (eksperimentalno)',
 'tog-forceeditsummary' => 'Opomeni me pri unosu praznog opisa',
 'tog-watchlisthideown' => 'Sakrij moje izmene sa spiska nadgledanja',
 'tog-watchlisthidebots' => 'Sakrij izmene botova sa spiska nadgledanja',
@@ -451,7 +451,7 @@ $messages = array(
 'newwindow' => '(otvara u novom prozoru)',
 'cancel' => 'Otkaži',
 'moredotdotdot' => 'Više…',
-'morenotlisted' => 'Više nije prikazano...',
+'morenotlisted' => 'Ova lista nije kompletna.',
 'mypage' => 'Stranica',
 'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
@@ -987,9 +987,7 @@ Možda je premešten ili obrisan dok ste pregledali stranicu.',
 'loginreqlink' => 'prijavljeni',
 'loginreqpagetext' => 'Morate biti $1 da biste videli druge stranice.',
 'accmailtitle' => 'Lozinka je poslata.',
-'accmailtext' => 'Lozinka za {{GENDER:$1|korisnika|korisnicu|korisnika}} [[User talk:$1|$1]] je poslata na $2.
-
-Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].',
+'accmailtext' => 'Lozika za {{GENDER:$1|korisnika|korisnicu}} [[User talk:$1|$1]] je poslata na $2. Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].',
 'newarticle' => '(novi)',
 'newarticletext' => 'Došli ste na stranicu koja još ne postoji.
 Da biste je napravili, počnite kucati u prozor ispod ovog teksta (pogledajte [[{{MediaWiki:Helppage}}|stranicu za pomoć]]).
@@ -1483,7 +1481,7 @@ Ova radnja se ne može vratiti.',
 'prefs-emailconfirm-label' => 'Potvrda e-adrese:',
 'youremail' => 'E-adresa:',
 'username' => '{{GENDER:$1|Korisničko ime}}:',
-'uid' => 'Korisnički IB:',
+'uid' => '{{GENDER:$1|Korisnički}} ID:',
 'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupa}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Vreme upisa:',
@@ -1498,10 +1496,10 @@ Ova radnja se ne može vratiti.',
 Proverite oznake HTML.',
 'badsiglength' => 'Vaš potpis je predugačak.
 Ne sme biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
-'yourgender' => 'Pol:',
-'gender-unknown' => 'nenaznačen',
-'gender-male' => 'muški',
-'gender-female' => 'ženski',
+'yourgender' => 'Kako želite da se predstavite?',
+'gender-unknown' => 'Ne želim da se predstavim',
+'gender-male' => 'On uređuje viki stranice',
+'gender-female' => 'Ona uređuje viki stranice',
 'prefs-help-gender' => 'Neobavezno: koristi se za ispravno obraćanje softvera korisnicima, zavisno od njihovog pola.
 Ovaj podatak će biti javan.',
 'email' => 'E-adresa',
@@ -1514,7 +1512,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'prefs-i18n' => 'Internacionalizacija',
 'prefs-signature' => 'Potpis',
 'prefs-dateformat' => 'Format datuma',
-'prefs-timeoffset' => 'Vremensko odstupanje',
+'prefs-timeoffset' => 'Vremenska razlika',
 'prefs-advancedediting' => 'Glavna podešavanja',
 'prefs-advancedrc' => 'Napredne postavke',
 'prefs-advancedrendering' => 'Napredne postavke',
@@ -1565,8 +1563,8 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'group-user-member' => '{{GENDER:$1|korisnik|korisnica|korisnik}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
-'group-sysop-member' => '{{GENDER:$1|administrator|administratorka|administrator}}',
-'group-bureaucrat-member' => '{{GENDER:$1|birokrata|birokratkinja|birokrata}}',
+'group-sysop-member' => '{{GENDER:$1|administrator|administratorka}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birokrata|birokratkinja}}',
 'group-suppress-member' => '{{GENDER:$1|revizor|revizorka|revizor}}',
 
 'grouppage-user' => '{{ns:project}}:Korisnici',
@@ -1594,7 +1592,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'right-reupload-shared' => 'menjanje datoteka na deljenom skladištu multimedije',
 'right-upload_by_url' => 'otpremanje datoteka sa veb adrese',
 'right-purge' => 'čišćenje keš memorije stranice bez potvrde',
-'right-autoconfirmed' => 'uređivanje poluzaštićenih stranica',
+'right-autoconfirmed' => 'Not be affected by IP-based rate limits',
 'right-bot' => 'smatranje izmena kao automatski proces',
 'right-nominornewtalk' => 'neposedovanje malih izmena na stranicama za razgovor otvara prozor za nove poruke',
 'right-apihighlimits' => 'korišćenje viših granica za upite iz API-ja',
@@ -1737,7 +1735,7 @@ Stranice s [[Special:Watchlist|vašeg spiska nadgledanja]] su '''podebljane'''."
 'reuploaddesc' => 'Nazad na obrazac za otpremanje',
 'upload-tryagain' => 'Pošalji izmenjeni opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da biste otpremali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da biste otpremali datoteke.',
 'upload_directory_missing' => 'Fascikla za slanje ($1) nedostaje i server je ne može napraviti.',
 'upload_directory_read_only' => 'Server ne može da piše po fascikli za slanje ($1).',
 'uploaderror' => 'Greška pri otpremanju',
@@ -1994,8 +1992,7 @@ Probajte kasnije kada bude manje opterećenje.',
 'upload_source_file' => ' (datoteka na vašem računaru)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Ova posebna stranica prikazuje sve poslate datoteke.
-Kad je poređano po korisniku, popis prikazuje samo one datoteke čije je poslednje izdanje postavio taj korisnik.',
+'listfiles-summary' => 'Ova posebna stranica prikazuje sve poslate datoteke.',
 'listfiles_search_for' => 'Naziv datoteke:',
 'imgfile' => 'datoteka',
 'listfiles' => 'Spisak datoteka',
@@ -2376,9 +2373,7 @@ E-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se p
 'watchnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da biste menjali spisak nadgledanja.',
 'addwatch' => 'Dodaj na spisak nadgledanja',
 'addedwatchtext' => 'Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].
-Buduće izmene ove stranice i njene stranice za razgovor biće navedene ovde, a stranica će biti <b>podebljana</b> u [[Special:RecentChanges|spisku skorašnjih izmena]] da bi se lakše uočila.
-
-Ukoliko budete želeli da uklonite stranicu sa spiska nadgledanja, kliknite opet na zvezdicu u gornjoj paleti.',
+Buduće izmene ove stranice i njene stranice za razgovor biće navedene tamo.',
 'removewatch' => 'Ukloni sa spiska nadgledanja',
 'removedwatchtext' => 'Stranica „[[:$1]]“ je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].',
 'watch' => 'Nadgledaj',
@@ -2631,7 +2626,7 @@ $1',
 'blanknamespace' => '(Glavno)',
 
 # Contributions
-'contributions' => 'Korisnički doprinosi',
+'contributions' => '{{GENDER:$1|Korisnički}} doprinosi',
 'contributions-title' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}} $1',
 'mycontris' => 'Doprinosi',
 'contribsub2' => 'Za $1 ($2)',
@@ -3179,13 +3174,13 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
 'pageinfo-language' => 'Jezik sadržaja stranice',
-'pageinfo-robot-policy' => 'Status pretraživača',
+'pageinfo-robot-policy' => 'Indeksiranje od strane robota',
 'pageinfo-robot-index' => 'Dozvoljeno',
 'pageinfo-robot-noindex' => 'Nije dozvoljeno',
 'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj nadgledača stranica',
 'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
-'pageinfo-redirects-name' => 'Preusmeravanja na stranicu',
+'pageinfo-redirects-name' => 'Broj preusmerenja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmerenje|preusmerenja|preusmerenja}}; $3 {{PLURAL:$3|nepreusmerenje|nepreusmerenja|nepreusmerenja}})',
 'pageinfo-firstuser' => 'Autor stranice',
@@ -3592,7 +3587,7 @@ $8',
 'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'Zaštićeno autorskim pravom',
-'exif-copyrighted-false' => 'Javno vlasništvo',
+'exif-copyrighted-false' => 'Status autorskih prava nije podešen',
 
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
index 3a7fceb..5595d5f 100644 (file)
@@ -241,6 +241,7 @@ $messages = array(
 'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
 'tog-norollbackdiff' => 'ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน',
 'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
+'tog-prefershttps' => 'ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อล็อกอิน',
 
 'underline-always' => 'เสมอ',
 'underline-never' => 'ไม่เคย',
@@ -1423,7 +1424,7 @@ $1",
 'userrights-no-interwiki' => 'คุณไม่ได้รับสิทธิแก้ไขสิทธิผู้ใช้บนวิกิอื่น',
 'userrights-nodatabase' => 'ไม่มีฐานข้อมูล $1 อยู่ หรือฐานข้อมูลอยู่บนเครื่องอื่น',
 'userrights-nologin' => 'คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ดูแลระบบก่อน จึงจะกำหนดสิทธิผู้ใช้ได้',
-'userrights-notallowed' => 'à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\9eิà¹\88มหรือลà¸\94สิà¸\97à¸\98ิà¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89',
+'userrights-notallowed' => 'บัญชีของคุณไม่ได้รับอนุญาตให้เพิ่มหรือลดสิทธิผู้ใช้',
 'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้',
 'userrights-unchangeable-col' => 'กลุ่มที่คุณไม่สามารถเปลี่ยนได้',
 
@@ -2031,6 +2032,7 @@ $1',
 'mostrevisions' => 'หน้าที่มีรุ่นมากที่สุด',
 'prefixindex' => 'ทุกหน้าพร้อมคำขึ้นต้น',
 'prefixindex-namespace' => 'ทุกหน้าพร้อมคำขึ้นต้น (เนมสเปซ $1)',
+'prefixindex-strip' => 'ลบคำขึ้นต้นในรายการออก',
 'shortpages' => 'หน้าสั้น',
 'longpages' => 'หน้ายาว',
 'deadendpages' => 'หน้าสุดทาง',
@@ -2985,7 +2987,7 @@ $1',
 'pageinfo-length' => 'ความยาวหน้า (ไบต์)',
 'pageinfo-article-id' => 'หมายเลขประจำหน้า',
 'pageinfo-language' => 'ภาษาเนื้อหาของหน้า',
-'pageinfo-robot-policy' => 'สà¸\96าà¸\99ะà¹\80สิรà¹\8cà¸\8aà¹\80อà¸\99à¸\88ิà¸\99',
+'pageinfo-robot-policy' => 'à¸\81ารà¸\97ำà¸\94ัà¸\8aà¸\99ีà¹\82à¸\94ยà¸\9aอà¸\95',
 'pageinfo-robot-index' => 'อนุญาต',
 'pageinfo-robot-noindex' => 'ไม่อนุญาต',
 'pageinfo-views' => 'จำนวนการเข้าดู',
@@ -3008,7 +3010,9 @@ $1',
 'pageinfo-redirectsto' => 'เปลี่ยนทางไปยัง',
 'pageinfo-contentpage' => 'นับเป็นหน้าเนื้อหา',
 'pageinfo-contentpage-yes' => 'ใช่',
+'pageinfo-protect-cascading' => 'การล็อกที่สืบทอดจากหน้านี้',
 'pageinfo-protect-cascading-yes' => 'ใช่',
+'pageinfo-protect-cascading-from' => 'การล็อกที่สืบทอดมายังหน้านี้',
 'pageinfo-category-info' => 'ข้อมูลหมวดหมู่',
 'pageinfo-category-pages' => 'จำนวนหน้า',
 'pageinfo-category-subcats' => 'จำนวนหมวดหมู่ย่อย',
@@ -3773,6 +3777,9 @@ $5
 'logentry-newusers-create2' => 'บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1',
 'logentry-newusers-byemail' => 'บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1 และส่งรหัสผ่านไปทางอีเมลแล้ว',
 'logentry-newusers-autocreate' => 'บัญชีผู้ใช้ $1 ถูกสร้างขึ้นอัตโนมัติ',
+'logentry-rights-rights' => '$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3 จาก $4 เป็น $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3',
+'logentry-rights-autopromote' => '$1 ได้รับการ{{GENDER:$2|เลื่อนกลุ่ม}}จาก $4 เป็น $5 อัตโนมัติ',
 'rightsnone' => '(ไม่มี)',
 
 # Feedback
index e1d26d3..883d326 100644 (file)
@@ -3605,7 +3605,7 @@ $8',
 'confirmemail_text' => "Pinagagawa ng {{SITENAME}} na patotohanan mo ang iyong adres ng e-liham bago gamitin ang mga kasangkapang-katangian ng e-liham.  Pindutin at buhayin ang pindutan sa ibaba para makapagpadala ng isang makapagpapatotoong e-liham (kompirmasyon) patungo sa iyong adres.
 Makakasama sa liham ang isang kawing na naglalaman ng kodigo;
 Ikarga ang kawing sa iyong pantingin-tingin (''browser'') para mapatotohanang katanggap-tanggap ang iyong adres ng e-liham.",
-'confirmemail_pending' => 'Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta/akawnt, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.',
+'confirmemail_pending' => 'Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.',
 'confirmemail_send' => 'Magpadala ng isang kodigo ng pagpapatotoo (kumpirmasyon)',
 'confirmemail_sent' => 'Naipadala na ang magpapatotoong e-liham (kumpirmasyon).',
 'confirmemail_oncreate' => 'Nagpadala na ng isang kodigo ng pagpapatotoo (kumpirmasyon) patungo sa iyong adres ng e-liham.  Hindi kailangan ang kodigong ito para makalagda, ngunit kailangan mong ibigay muna ito bago paganahin/paandarin ang anumang pang e-liham na kasangkapang-katangiang nasa loob ng wiki.',
@@ -3619,19 +3619,19 @@ Ibinalik ng tagapagpadala ang: $1',
 'confirmemail_loggedin' => 'Natiyak na ngayon ang tirahan ng e-liham mo.',
 'confirmemail_error' => 'May nangyaring kamalian sa pagsasagip ng iyong kumpirmasyon.',
 'confirmemail_subject' => 'Kumpirmasyon/pagpapatotoong pang-adres ng e-liham ng {{SITENAME}}',
-'confirmemail_body' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
-ang nagtala ng isang akawnt/kuwentang "$2" na mayroong ganitong adres ng e-liham sa {{SITENAME}}.
+'confirmemail_body' => 'May isa, maaaring ikaw, na mula sa direksiyong IP na $1,
+ang nagtala ng isang kuwentang "$2" na mayroong ganitong direksiyong e-liham sa {{SITENAME}}.
 
-Para patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhayin ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin (\'\'browser\'\'):
+Para patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhayin ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pambasa-basa (\'\'browser\'\'):
 
 $3
 
-Kung *hindi* mo itinala/inirehistro ang kuwenta, sundan mo ang kawing na ito
-para kanselahin o huwag nang ituloy ang pagpapatotoo (kumpirmasyon) ng adres ng e-liham:
+Kung *hindi* mo itinala ang kuwenta, sundan mo ang kawing na ito
+para kanselahin o huwag nang ituloy ang pagpapatotoo (kumpirmasyon) ng direksiyong e-liham:
 
 $5
 
-Magwawakas ang pagiging mabisa ng kodigo ng pagpapatotoong ito sa $4.',
+Magwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.',
 'confirmemail_body_changed' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
 ang nagbago ng adres ng e-liham ng akawnt na "$2" sa ganitong adres sa {{SITENAME}}.
 
index ddf05f2..b8e639b 100644 (file)
@@ -2095,6 +2095,10 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
 'randompage' => 'Rastgele sayfa',
 'randompage-nopages' => 'Şu {{PLURAL:$2|ad alanında|ad alanlarında}} hiç bir sayfa yok: $1.',
 
+# Random page in category
+'randomincategory' => 'Kategoriye göre rastgele sayfa',
+'randomincategory-selectcategory' => 'Rastgele sayfa alınacak kategori: $1 $2.',
+
 # Random redirect
 'randomredirect' => 'Rastgele yönlendirme',
 'randomredirect-nopages' => '"$1" ad alanında hiç bir yönlendirme yok.',
@@ -2120,6 +2124,8 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
 'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 günde}} çalışma yapan kullanıcılar',
 'statistics-mostpopular' => 'En çok ziyaret edilen sayfalar',
 
+'pageswithprop' => 'Bir sayfa özelliğine sahip sayfalar',
+'pageswithprop-text' => 'Bu sayfa belirli bir sayfa özelliğini kullanan sayfaları listeler.',
 'pageswithprop-submit' => 'Git',
 
 'doubleredirects' => 'Çift yönlendirmeler',
@@ -3861,10 +3867,14 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
+'redirect' => 'Dosya, kullanıcı veya sayfa ID yönlendirme',
+'redirect-legend' => 'Bir dosya veya sayfaya yönlendirme',
+'redirect-summary' => "Bu özel sayfa sizi bir dosya (dosya adı verilen), bir sayfa (bir revizyon ID'si verilen) veya bir kullanıcı sayfasının (sayısal kullanıcı kimliği verilen) adresine yönlendirir.",
 'redirect-submit' => 'Git',
 'redirect-value' => 'Değer:',
 'redirect-user' => 'Kullanıcı kimliği',
 'redirect-file' => 'Dosya adı',
+'redirect-not-exists' => 'Değer bulunamadı',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Benzer dosyaları ara',
index 28b041a..eda101e 100644 (file)
@@ -80,7 +80,7 @@ class mcTest extends Maintenance {
                        $get = 0;
                        $time_start = $this->microtime_float();
                        for ( $i = 1; $i <= $iterations; $i++ ) {
-                               if ( !is_null( $mcc->set( "test$i", $i ) ) ) {
+                               if ( $mcc->set( "test$i", $i ) ) {
                                        $set++;
                                }
                        }
index 27c4c6c..0cd6417 100644 (file)
                                        $containers.hide();
                                        hookCallback();
                                } else {
-                                       $.when( $containers.stop( true, true ).fadeOut() ).then( hookCallback );
+                                       $containers.stop( true, true ).fadeOut().promise().done( hookCallback );
                                }
                        } else {
-                               $.when( $containers.stop( true, true ).fadeIn() ).then( hookCallback );
+                               $containers.stop( true, true ).fadeIn().promise().done( hookCallback );
                        }
 
                } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
                                        $containers.hide();
                                        hookCallback();
                                } else {
-                                       $.when( $containers.stop( true, true ).slideUp() ).then( hookCallback );
+                                       $containers.stop( true, true ).slideUp().promise().done( hookCallback );
                                }
                        } else {
-                               $.when( $containers.stop( true, true ).slideDown() ).then( hookCallback );
+                               $containers.stop( true, true ).slideDown().promise().done( hookCallback );
                        }
 
                } else {
                                                $collapsibleContent.hide();
                                                hookCallback();
                                        } else {
-                                               $.when( $collapsibleContent.slideUp() ).then( hookCallback );
+                                               $collapsibleContent.slideUp().promise().done( hookCallback );
                                        }
                                } else {
-                                       $.when( $collapsibleContent.slideDown() ).then( hookCallback );
+                                       $collapsibleContent.slideDown().promise().done( hookCallback );
                                }
 
                        // Otherwise assume this is a customcollapse with a remote toggle
                                                hookCallback();
                                        } else {
                                                if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                       $.when( $collapsible.fadeOut() ).then( hookCallback );
+                                                       $collapsible.fadeOut().promise().done( hookCallback );
                                                } else {
-                                                       $.when( $collapsible.slideUp() ).then( hookCallback );
+                                                       $collapsible.slideUp().promise().done( hookCallback );
                                                }
                                        }
                                } else {
                                        if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                               $.when( $collapsible.fadeIn() ).then( hookCallback );
+                                               $collapsible.fadeIn().promise().done( hookCallback );
                                        } else {
-                                               $.when( $collapsible.slideDown() ).then( hookCallback );
+                                               $collapsible.slideDown().promise().done( hookCallback );
                                        }
                                }
                        }
index 8bba1fc..98a9c54 100644 (file)
@@ -16,9 +16,9 @@
                isCategory: function ( title, ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        prop: 'categoryinfo',
@@ -53,9 +53,9 @@
                getCategoriesByPrefix: function ( prefix, ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        // Fetch with allpages to only get categories that have a corresponding description page.
                        apiPromise = this.get( {
@@ -92,9 +92,9 @@
                getCategories: function ( title, ok, err, async ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        prop: 'categories',
index 96947cc..381e172 100644 (file)
@@ -59,9 +59,9 @@
                getEditToken: function ( ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        action: 'tokens',
index 08bb171..c4d23b8 100644 (file)
@@ -17,9 +17,9 @@
                parse: function ( wikitext, ok, err ) {
                        var d = $.Deferred(),
                                apiPromise;
+
                        // Backwards compatibility (< MW 1.20)
-                       d.done( ok );
-                       d.fail( err );
+                       d.done( ok ).fail( err );
 
                        apiPromise = this.get( {
                                        action: 'parse',
index e2be5c7..49a4c62 100644 (file)
@@ -22,9 +22,9 @@
                var params,
                        d = $.Deferred(),
                        apiPromise;
+
                // Backwards compatibility (< MW 1.20)
-               d.done( ok );
-               d.fail( err );
+               d.done( ok ).fail( err );
 
                params = {
                        action: 'watch',
index 7cf9d8f..3e375fb 100644 (file)
@@ -3,10 +3,15 @@
  * @singleton
  */
 ( function ( mw, $ ) {
-       var callbacks, options, tokens, user;
+       var user,
+               callbacks = {},
+               // Extend the skeleton mw.user from mediawiki.js
+               // This is kind of ugly but we're stuck with this for b/c reasons
+               options = mw.user.options || new mw.Map(),
+               tokens = mw.user.tokens || new mw.Map();
 
        /**
-        * Gets the current user's groups or rights.
+        * Get the current user's groups or rights
         *
         * @private
         * @param {string} info One of 'groups' or 'rights'
                } );
        }
 
-       callbacks = {};
-
-       // Extend the skeleton mw.user from mediawiki.js
-       // This is kind of ugly but we're stuck with this for b/c reasons
-       options = mw.user.options || new mw.Map();
-       tokens = mw.user.tokens || new mw.Map();
-
        mw.user = user = {
                options: options,
                tokens: tokens,
 
                /**
-                * Generates a random user session ID (32 alpha-numeric characters).
+                * Generate a random user session ID (32 alpha-numeric characters)
                 *
                 * This information would potentially be stored in a cookie to identify a user during a
                 * session or series of sessions. Its uniqueness should not be depended on.
@@ -68,9 +66,9 @@
                },
 
                /**
-                * Gets the current user's database id.
+                * Get the current user's database id
                 *
-                * Not to be confused with #id
+                * Not to be confused with #id.
                 *
                 * @return {number} Current user's id, or 0 if user is anonymous
                 */
@@ -79,7 +77,7 @@
                },
 
                /**
-                * Gets the current user's name.
+                * Get the current user's name
                 *
                 * @return {string|null} User name string or null if user is anonymous
                 */
@@ -96,7 +94,7 @@
                },
 
                /**
-                * Get date user registered, if available.
+                * Get date user registered, if available
                 *
                 * @return {Date|boolean|null} Date user registered, or false for anonymous users, or
                 *  null when data is not available
                },
 
                /**
-                * Checks if the current user is anonymous.
+                * Whether the current user is anonymous
                 *
                 * @return {boolean}
                 */
                },
 
                /**
-                * Gets a random ID automatically generated and stored in a session cookie.
+                * Get an automatically generated random ID (stored in a session cookie)
                 *
                 * This ID is ephemeral for everyone, staying in their browser only until they close
                 * their browser.
                 */
                sessionId: function () {
                        var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
-                       if ( typeof sessionId === 'undefined' || sessionId === null ) {
+                       if ( sessionId === undefined || sessionId === null ) {
                                sessionId = user.generateRandomSessionId();
-                               $.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
+                               $.cookie( 'mediaWiki.user.sessionId', sessionId, { expires: null, path: '/' } );
                        }
                        return sessionId;
                },
 
                /**
-                * Gets the current user's name or the session ID
+                * Get the current user's name or the session ID
                 *
-                * Not to be confused with #getId
+                * Not to be confused with #getId.
                 *
                 * @return {string} User name or random session ID
                 */
                id: function () {
-                       var name = user.getName();
-                       if ( name ) {
-                               return name;
-                       }
-                       return user.sessionId();
+                       return user.getName() || user.sessionId();
                },
 
                /**
-                * Gets the user's bucket, placing them in one at random based on set odds if needed.
+                * Get the user's bucket (place them in one if not done already)
                 *
                 *     mw.user.bucket( 'test', {
-                *         'buckets': { 'ignored': 50, 'control': 25, 'test': 25 },
-                *         'version': 1,
-                *         'expires': 7
+                *         buckets: { ignored: 50, control: 25, test: 25 },
+                *         version: 1,
+                *         expires: 7
                 *     } );
                 *
                 * @param {string} key Name of bucket
                 * @param {Object} options Bucket configuration options
                 * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
                 *  must have at least one pair)
-                * @param {number} options.version Version of bucket test, changing this forces rebucketing
-                *  (optional, default: 0)
-                * @param {number} options.expires Length of time (in days) until the user gets rebucketed
-                *  (optional, default: 30)
-                * @return {string} Bucket name - the randomly chosen key of the options.buckets object
+                * @param {number} [options.version=0] Version of bucket test, changing this forces
+                *  rebucketing
+                * @param {number} [options.expires=30] Length of time (in days) until the user gets
+                *  rebucketed
+                * @return {string} Bucket name - the randomly chosen key of the `options.buckets` object
                 */
                bucket: function ( key, options ) {
                        var cookie, parts, version, bucket,
                        cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
 
                        // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
-                       if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) > 0 ) {
+                       if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
                                parts = cookie.split( ':' );
                                if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
                                        version = Number( parts[0] );
                                        bucket = String( parts[1] );
                                }
                        }
+
                        if ( bucket === undefined ) {
                                if ( !$.isPlainObject( options.buckets ) ) {
-                                       throw 'Invalid buckets error. Object expected for options.buckets.';
+                                       throw new Error( 'Invalid bucket. Object expected for options.buckets.' );
                                }
+
                                version = Number( options.version );
+
                                // Find range
                                range = 0;
                                for ( k in options.buckets ) {
                                        range += options.buckets[k];
                                }
+
                                // Select random value within range
                                rand = Math.random() * range;
+
                                // Determine which bucket the value landed in
                                total = 0;
                                for ( k in options.buckets ) {
                                                break;
                                        }
                                }
+
                                $.cookie(
                                        'mediaWiki.user.bucket:' + key,
                                        version + ':' + bucket,
-                                       { 'path': '/', 'expires': Number( options.expires ) }
+                                       { path: '/', expires: Number( options.expires ) }
                                );
                        }
+
                        return bucket;
                },
 
                /**
-                * Gets the current user's groups.
+                * Get the current user's groups
                 *
                 * @param {Function} callback
                 */
                },
 
                /**
-                * Gets the current user's rights.
+                * Get the current user's rights
                 *
                 * @param {Function} callback
                 */
index 8df4894..462fa9c 100644 (file)
@@ -1,6 +1,7 @@
+( function ( mw, $ ) {
 
-window.ProtectionForm = {
-       'existingMatch': false,
+var ProtectionForm = window.ProtectionForm = {
+       existingMatch: false,
 
        /**
         * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
@@ -12,32 +13,38 @@ window.ProtectionForm = {
         *     numTypes             The number of protection types
         *     existingMatch        True if all the existing expiry times match
         */
-       'init': function( opts ) {
-               if( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) )
+       init: function ( opts ) {
+               var box, boxbody, row, cell, check, label;
+
+               if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
                        return false;
+               }
 
-               var box = document.getElementById( opts.tableId );
-               if( !box )
+               box = document.getElementById( opts.tableId );
+               if ( !box ) {
                        return false;
+               }
 
-               var boxbody = box.getElementsByTagName('tbody')[0];
-               var row = document.createElement( 'tr' );
+               boxbody = box.getElementsByTagName( 'tbody' )[0];
+               row = document.createElement( 'tr' );
                boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
 
                this.existingMatch = opts.existingMatch;
 
-               var cell = document.createElement( 'td' );
+               cell = document.createElement( 'td' );
                row.appendChild( cell );
                // If there is only one protection type, there is nothing to chain
-               if( opts.numTypes > 1 ) {
-                       var check = document.createElement( 'input' );
+               if ( opts.numTypes > 1 ) {
+                       check = document.createElement( 'input' );
                        check.id = 'mwProtectUnchained';
                        check.type = 'checkbox';
                        cell.appendChild( check );
-                       addClickHandler( check, function() { ProtectionForm.onChainClick(); } );
+                       window.addClickHandler( check, function () {
+                               ProtectionForm.onChainClick();
+                       } );
 
                        cell.appendChild( document.createTextNode( ' ' ) );
-                       var label = document.createElement( 'label' );
+                       label = document.createElement( 'label' );
                        label.htmlFor = 'mwProtectUnchained';
                        label.appendChild( document.createTextNode( opts.labelText ) );
                        cell.appendChild( label );
@@ -56,17 +63,19 @@ window.ProtectionForm = {
        /**
         * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
         */
-       'updateCascadeCheckbox': function() {
+       updateCascadeCheckbox: function () {
+               var i, lists, items, selected;
+
                // For non-existent titles, there is no cascade option
-               if( !document.getElementById( 'mwProtect-cascade' ) ) {
+               if ( !document.getElementById( 'mwProtect-cascade' ) ) {
                        return;
                }
-               var lists = this.getLevelSelectors();
-               for( var i = 0; i < lists.length; i++ ) {
-                       if( lists[i].selectedIndex > -1 ) {
-                               var items = lists[i].getElementsByTagName( 'option' );
-                               var selected = items[ lists[i].selectedIndex ].value;
-                               if( !this.isCascadeableLevel(selected) ) {
+               lists = this.getLevelSelectors();
+               for ( i = 0; i < lists.length; i++ ) {
+                       if ( lists[i].selectedIndex > -1 ) {
+                               items = lists[i].getElementsByTagName( 'option' );
+                               selected = items[ lists[i].selectedIndex ].value;
+                               if ( !this.isCascadeableLevel( selected ) ) {
                                        document.getElementById( 'mwProtect-cascade' ).checked = false;
                                        document.getElementById( 'mwProtect-cascade' ).disabled = true;
                                        return;
@@ -81,7 +90,7 @@ window.ProtectionForm = {
         * @param level {String}
         * @return {Boolean}
         */
-       'isCascadeableLevel': function( level ) {
+       isCascadeableLevel: function (  level ) {
                var cascadeLevels, len, i;
 
                cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
@@ -102,9 +111,10 @@ window.ProtectionForm = {
         *
         * @param source Element Level selector that changed
         */
-       'updateLevels': function(source) {
-               if( !this.isUnchained() )
+       updateLevels: function ( source ) {
+               if ( !this.isUnchained() ) {
                        this.setAllSelectors( source.selectedIndex );
+               }
                this.updateCascadeCheckbox();
        },
 
@@ -115,22 +125,24 @@ window.ProtectionForm = {
         * @param source Element expiry input that changed
         */
 
-       'updateExpiry': function(source) {
-               if( !this.isUnchained() ) {
-                       var expiry = source.value;
-                       this.forEachExpiryInput(function(element) {
+       updateExpiry: function ( source ) {
+               var expiry, listId, list;
+
+               if ( !this.isUnchained() ) {
+                       expiry = source.value;
+                       this.forEachExpiryInput( function ( element ) {
                                element.value = expiry;
-                       });
+                       } );
                }
-               var listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
-               var list = document.getElementById( listId );
-               if (list && list.value != 'othertime' ) {
+               listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
+               list = document.getElementById( listId );
+               if ( list && list.value !== 'othertime' ) {
                        if ( this.isUnchained() ) {
                                list.value = 'othertime';
                        } else {
-                               this.forEachExpirySelector(function(element) {
+                               this.forEachExpirySelector( function ( element ) {
                                        element.value = 'othertime';
-                               });
+                               } );
                        }
                }
        },
@@ -141,15 +153,16 @@ window.ProtectionForm = {
         *
         * @param source Element expiry selector that changed
         */
-       'updateExpiryList': function(source) {
-               if( !this.isUnchained() ) {
-                       var expiry = source.value;
-                       this.forEachExpirySelector(function(element) {
+       updateExpiryList: function ( source ) {
+               var expiry;
+               if ( !this.isUnchained() ) {
+                       expiry = source.value;
+                       this.forEachExpirySelector( function ( element ) {
                                element.value = expiry;
-                       });
-                       this.forEachExpiryInput(function(element) {
+                       } );
+                       this.forEachExpiryInput( function ( element ) {
                                element.value = '';
-                       });
+                       } );
                }
        },
 
@@ -157,8 +170,8 @@ window.ProtectionForm = {
         * Update chain status and enable/disable various bits of the UI
         * when the user changes the "unlock move permissions" checkbox
         */
-       'onChainClick': function() {
-               if( this.isUnchained() ) {
+       onChainClick: function () {
+               if ( this.isUnchained() ) {
                        this.enableUnchainedInputs( true );
                } else {
                        this.setAllSelectors( this.getMaxLevel() );
@@ -170,16 +183,17 @@ window.ProtectionForm = {
        /**
         * Returns true if the named attribute in all objects in the given array are matching
         */
-       'matchAttribute' : function( objects, attrName ) {
-               var value = null;
+       matchAttribute: function ( objects, attrName ) {
+               var i, element, value;
 
                // Check levels
-               for ( var i = 0; i < objects.length; i++ ) {
-                       var element = objects[i];
-                       if ( value == null ) {
+               value = null;
+               for ( i = 0; i < objects.length; i++ ) {
+                       element = objects[i];
+                       if ( value === null ) {
                                value = element[attrName];
                        } else {
-                               if ( value != element[attrName] ) {
+                               if ( value !== element[attrName] ) {
                                        return false;
                                }
                        }
@@ -192,7 +206,7 @@ window.ProtectionForm = {
         *
         * @return boolean
         */
-       'areAllTypesMatching': function() {
+       areAllTypesMatching: function () {
                return this.existingMatch
                        && this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
                        && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
@@ -204,7 +218,7 @@ window.ProtectionForm = {
         *
         * @return bool
         */
-       'isUnchained': function() {
+       isUnchained: function () {
                var element = document.getElementById( 'mwProtectUnchained' );
                return element
                        ? element.checked
@@ -214,13 +228,13 @@ window.ProtectionForm = {
        /**
         * Find the highest protection level in any selector
         */
-       'getMaxLevel': function() {
+       getMaxLevel: function () {
                var maxIndex = -1;
-               this.forEachLevelSelector(function(element) {
-                       if (element.selectedIndex > maxIndex) {
+               this.forEachLevelSelector( function ( element ) {
+                       if ( element.selectedIndex > maxIndex ) {
                                maxIndex = element.selectedIndex;
                        }
-               });
+               } );
                return maxIndex;
        },
 
@@ -229,12 +243,12 @@ window.ProtectionForm = {
         *
         * @param index int Protection level
         */
-       'setAllSelectors': function(index) {
-               this.forEachLevelSelector(function(element) {
-                       if (element.selectedIndex != index) {
+       setAllSelectors: function ( index ) {
+               this.forEachLevelSelector( function ( element ) {
+                       if ( element.selectedIndex !== index ) {
                                element.selectedIndex = index;
                        }
-               });
+               } );
        },
 
        /**
@@ -242,10 +256,12 @@ window.ProtectionForm = {
         *
         * @param func callable Callback function
         */
-       'forEachLevelSelector': function(func) {
-               var selectors = this.getLevelSelectors();
-               for (var i = 0; i < selectors.length; i++) {
-                       func(selectors[i]);
+       forEachLevelSelector: function ( func ) {
+               var i, selectors;
+
+               selectors = this.getLevelSelectors();
+               for ( i = 0; i < selectors.length; i++ ) {
+                       func( selectors[i] );
                }
        },
 
@@ -254,12 +270,14 @@ window.ProtectionForm = {
         *
         * @return Array
         */
-       'getLevelSelectors': function() {
-               var all = document.getElementsByTagName("select");
-               var ours = [];
-               for (var i = 0; i < all.length; i++) {
-                       var element = all[i];
-                       if (element.id.match(/^mwProtect-level-/)) {
+       getLevelSelectors: function () {
+               var i, ours, all, element;
+
+               all = document.getElementsByTagName( 'select' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.id.match( /^mwProtect-level-/ ) ) {
                                ours[ours.length] = element;
                        }
                }
@@ -271,10 +289,12 @@ window.ProtectionForm = {
         *
         * @param func callable Callback function
         */
-       'forEachExpiryInput': function(func) {
-               var inputs = this.getExpiryInputs();
-               for (var i = 0; i < inputs.length; i++) {
-                       func(inputs[i]);
+       forEachExpiryInput: function ( func ) {
+               var i, inputs;
+
+               inputs = this.getExpiryInputs();
+               for ( i = 0; i < inputs.length; i++ ) {
+                       func( inputs[i] );
                }
        },
 
@@ -283,12 +303,14 @@ window.ProtectionForm = {
         *
         * @return Array
         */
-       'getExpiryInputs': function() {
-               var all = document.getElementsByTagName("input");
-               var ours = [];
-               for (var i = 0; i < all.length; i++) {
-                       var element = all[i];
-                       if (element.name.match(/^mwProtect-expiry-/)) {
+       getExpiryInputs: function () {
+               var i, all, element, ours;
+
+               all = document.getElementsByTagName( 'input' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.name.match( /^mwProtect-expiry-/ ) ) {
                                ours[ours.length] = element;
                        }
                }
@@ -299,10 +321,12 @@ window.ProtectionForm = {
         * Apply a callback to each expiry selector list
         * @param func callable Callback function
         */
-       'forEachExpirySelector': function(func) {
-               var inputs = this.getExpirySelectors();
-               for (var i = 0; i < inputs.length; i++) {
-                       func(inputs[i]);
+       forEachExpirySelector: function ( func ) {
+               var i, inputs;
+
+               inputs = this.getExpirySelectors();
+               for ( i = 0; i < inputs.length; i++ ) {
+                       func( inputs[i] );
                }
        },
 
@@ -311,12 +335,14 @@ window.ProtectionForm = {
         *
         * @return Array
         */
-       'getExpirySelectors': function() {
-               var all = document.getElementsByTagName("select");
-               var ours = [];
-               for (var i = 0; i < all.length; i++) {
-                       var element = all[i];
-                       if (element.id.match(/^mwProtectExpirySelection-/)) {
+       getExpirySelectors: function () {
+               var i, all, ours, element;
+
+               all = document.getElementsByTagName( 'select' );
+               ours = [];
+               for ( i = 0; i < all.length; i++ ) {
+                       element = all[i];
+                       if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
                                ours[ours.length] = element;
                        }
                }
@@ -328,30 +354,33 @@ window.ProtectionForm = {
         *
         * @param val boolean Enable?
         */
-       'enableUnchainedInputs': function(val) {
+       enableUnchainedInputs: function ( val ) {
                var first = true;
-               this.forEachLevelSelector(function(element) {
-                       if (first) {
+
+               this.forEachLevelSelector( function ( element ) {
+                       if ( first ) {
                                first = false;
                        } else {
                                element.disabled = !val;
                        }
-               });
+               } );
                first = true;
-               this.forEachExpiryInput(function(element) {
-                       if (first) {
+               this.forEachExpiryInput( function ( element ) {
+                       if ( first ) {
                                first = false;
                        } else {
                                element.disabled = !val;
                        }
-               });
+               } );
                first = true;
-               this.forEachExpirySelector(function(element) {
-                       if (first) {
+               this.forEachExpirySelector( function ( element ) {
+                       if ( first ) {
                                first = false;
                        } else {
                                element.disabled = !val;
                        }
-               });
+               } );
        }
 };
+
+}( mediaWiki, jQuery ) );
index 160de86..580cf25 100644 (file)
@@ -1,12 +1,14 @@
+/*jshint camelcase:false */
 ( function ( mw, $ ) {
-var    ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+var    licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename,
+       ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
        fileExtensions = mw.config.get( 'wgFileExtensions' );
 
-window.licenseSelectorCheck = function() {
-       var selector = document.getElementById( "wpLicense" );
-       var selection = selector.options[selector.selectedIndex].value;
-       if( selector.selectedIndex > 0 ) {
-               if( selection == "" ) {
+licenseSelectorCheck = window.licenseSelectorCheck = function () {
+       var selector = document.getElementById( 'wpLicense' ),
+               selection = selector.options[selector.selectedIndex].value;
+       if ( selector.selectedIndex > 0 ) {
+               if ( !selection ) {
                        // Option disabled, but browser is broken and doesn't respect this
                        selector.selectedIndex = 0;
                }
@@ -17,23 +19,29 @@ window.licenseSelectorCheck = function() {
 
 function uploadSetup() {
        // Disable URL box if the URL copy upload source type is not selected
-       var e = document.getElementById( 'wpSourceTypeurl' );
-       if( e ) {
-               if( !e.checked ) {
-                       var ein = document.getElementById( 'wpUploadFileURL' );
-                       if(ein)
-                               ein.setAttribute( 'disabled', 'disabled' );
+       var ein,
+               selector, ua, isMacIe, i,
+               optionsTable, row, td,
+               wpLicense, wpLicenseRow, wpLicenseTbody,
+               uploadSourceIds, len, onchange,
+               e = document.getElementById( 'wpSourceTypeurl' );
+       if ( e ) {
+               if ( !e.checked ) {
+                       ein = document.getElementById( 'wpUploadFileURL' );
+                       if ( ein ) {
+                               ein.disabled = true;
+                       }
                }
        }
 
        // For MSIE/Mac: non-breaking spaces cause the <option> not to render.
        // But for some reason, setting the text to itself works
-       var selector = document.getElementById("wpLicense");
-       if (selector) {
-               var ua = navigator.userAgent;
-               var isMacIe = (ua.indexOf("MSIE") != -1) && (ua.indexOf("Mac") != -1);
-               if (isMacIe) {
-                       for (var i = 0; i < selector.options.length; i++) {
+       selector = document.getElementById( 'wpLicense' );
+       if ( selector ) {
+               ua = navigator.userAgent;
+               isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1;
+               if ( isMacIe ) {
+                       for ( i = 0; i < selector.options.length; i++ ) {
                                selector.options[i].text = selector.options[i].text;
                        }
                }
@@ -43,31 +51,31 @@ function uploadSetup() {
        if ( ajaxUploadDestCheck ) {
                // Insert an event handler that fetches upload warnings when wpDestFile
                // has been changed
-               document.getElementById( 'wpDestFile' ).onchange = function ( e ) {
-                       wgUploadWarningObj.checkNow(this.value);
+               document.getElementById( 'wpDestFile' ).onchange = function () {
+                       wgUploadWarningObj.checkNow( this.value );
                };
                // Insert a row where the warnings will be displayed just below the
                // wpDestFile row
-               var optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
-               var row = optionsTable.insertRow( 1 );
-               var td = document.createElement( 'td' );
+               optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
+               row = optionsTable.insertRow( 1 );
+               td = document.createElement( 'td' );
                td.id = 'wpDestFile-warning';
                td.colSpan = 2;
 
                row.appendChild( td );
        }
 
-       var wpLicense = document.getElementById( 'wpLicense' );
+       wpLicense = document.getElementById( 'wpLicense' );
        if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) {
                // License selector check
                wpLicense.onchange = licenseSelectorCheck;
 
                // License selector table row
-               var wpLicenseRow = wpLicense.parentNode.parentNode;
-               var wpLicenseTbody = wpLicenseRow.parentNode;
+               wpLicenseRow = wpLicense.parentNode.parentNode;
+               wpLicenseTbody = wpLicenseRow.parentNode;
 
-               var row = document.createElement( 'tr' );
-               var td = document.createElement( 'td' );
+               row = document.createElement( 'tr' );
+               td = document.createElement( 'td' );
                row.appendChild( td );
                td = document.createElement( 'td' );
                td.id = 'mw-license-preview';
@@ -78,63 +86,75 @@ function uploadSetup() {
 
 
        // fillDestFile setup
-       var     i,
-               uploadSourceIds = mw.config.get( 'wgUploadSourceIds' ),
-               len = uploadSourceIds.length;
-       for ( i = 0; i < len; i += 1 )
-               document.getElementById( uploadSourceIds[i] ).onchange = function (e) {
-                       fillDestFilename( this.id );
-               };
-};
+       uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
+       len = uploadSourceIds.length;
+       onchange = function () {
+               fillDestFilename( this.id );
+       };
+       for ( i = 0; i < len; i += 1 ) {
+               document.getElementById( uploadSourceIds[i] ).onchange = onchange;
+       }
+}
 
+wgUploadWarningObj = window.wgUploadWarningObj = {
+       responseCache: { '' : '&nbsp;' },
+       nameToCheck: '',
+       typing: false,
+       delay: 500, // ms
+       timeoutID: false,
 
-window.wgUploadWarningObj = {
-       'responseCache' : { '' : '&nbsp;' },
-       'nameToCheck' : '',
-       'typing': false,
-       'delay': 500, // ms
-       'timeoutID': false,
+       keypress: function () {
+               var cached, destFile, warningElt;
 
-       'keypress': function () {
-               if ( !ajaxUploadDestCheck ) return;
+               if ( !ajaxUploadDestCheck ) {
+                       return;
+               }
 
                // Find file to upload
-               var destFile = document.getElementById('wpDestFile');
-               var warningElt = document.getElementById( 'wpDestFile-warning' );
-               if ( !destFile || !warningElt ) return ;
+               destFile = document.getElementById( 'wpDestFile' );
+               warningElt = document.getElementById( 'wpDestFile-warning' );
+               if ( !destFile || !warningElt ) {
+                       return;
+               }
 
-               this.nameToCheck = destFile.value ;
+               this.nameToCheck = destFile.value;
 
                // Clear timer
                if ( this.timeoutID ) {
-                       window.clearTimeout( this.timeoutID );
+                       clearTimeout( this.timeoutID );
                }
                // Check response cache
-               for (cached in this.responseCache) {
-                       if (this.nameToCheck == cached) {
+               for ( cached in this.responseCache ) {
+                       if ( this.nameToCheck === cached ) {
                                this.setWarning(this.responseCache[this.nameToCheck]);
                                return;
                        }
                }
 
-               this.timeoutID = window.setTimeout( 'wgUploadWarningObj.timeout()', this.delay );
+               this.timeoutID = setTimeout( function () {
+                       wgUploadWarningObj.timeout();
+               }, this.delay );
        },
 
-       'checkNow': function (fname) {
-               if ( !ajaxUploadDestCheck ) return;
+       checkNow: function ( fname ) {
+               if ( !ajaxUploadDestCheck ) {
+                       return;
+               }
                if ( this.timeoutID ) {
-                       window.clearTimeout( this.timeoutID );
+                       clearTimeout( this.timeoutID );
                }
                this.nameToCheck = fname;
                this.timeout();
        },
 
-       'timeout' : function() {
-               if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) return;
-               injectSpinner( document.getElementById( 'wpDestFile' ), 'destcheck' );
+       timeout: function () {
+               if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+                       return;
+               }
+               window.injectSpinner( document.getElementById( 'wpDestFile' ), 'destcheck' );
 
                var uploadWarningObj = this;
-               ( new mw.Api ).get( {
+               ( new mw.Api() ).get( {
                        action: 'query',
                        titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
                        prop: 'imageinfo',
@@ -149,89 +169,101 @@ window.wgUploadWarningObj = {
                } );
        },
 
-       'processResult' : function ( result, fileName ) {
-               removeSpinner( 'destcheck' );
+       processResult: function ( result, fileName ) {
+               window.removeSpinner( 'destcheck' );
                this.setWarning( result.html );
                this.responseCache[fileName] = result.html;
        },
 
-       'setWarning' : function (warning) {
-               var warningElt = document.getElementById( 'wpDestFile-warning' );
-               var ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
+       setWarning: function ( warning ) {
+               var warningElt = document.getElementById( 'wpDestFile-warning' ),
+                       ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
 
                this.setInnerHTML(warningElt, warning);
 
                // Set a value in the form indicating that the warning is acknowledged and
                // doesn't need to be redisplayed post-upload
-               if ( warning == '' ) {
+               if ( !warning ) {
                        ackElt[0].value = '';
                } else {
                        ackElt[0].value = '1';
                }
 
        },
-       'setInnerHTML' : function (element, text) {
+       setInnerHTML: function ( element, text ) {
                // Check for no change to avoid flicker in IE 7
-               if (element.innerHTML != text) {
+               if ( element.innerHTML !== text ) {
                        element.innerHTML = text;
                }
        }
 };
 
-window.fillDestFilename = function(id) {
+fillDestFilename = window.fillDestFilename = function ( id ) {
+       var e, path, slash, backslash, fname,
+               found, ext, i,
+               destFile;
        if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
                return;
        }
-       if (!document.getElementById) {
+       if ( !document.getElementById ) {
                return;
        }
        // Remove any previously flagged errors
-       var e = document.getElementById( 'mw-upload-permitted' );
-       if( e ) e.className = '';
+       e = document.getElementById( 'mw-upload-permitted' );
+       if ( e ) {
+               e.className = '';
+       }
 
-       var e = document.getElementById( 'mw-upload-prohibited' );
-       if( e ) e.className = '';
+       e = document.getElementById( 'mw-upload-prohibited' );
+       if ( e ) {
+               e.className = '';
+       }
 
-       var path = document.getElementById(id).value;
+       path = document.getElementById( id ).value;
        // Find trailing part
-       var slash = path.lastIndexOf('/');
-       var backslash = path.lastIndexOf('\\');
-       var fname;
-       if (slash == -1 && backslash == -1) {
+       slash = path.lastIndexOf( '/' );
+       backslash = path.lastIndexOf( '\\' );
+       if ( slash === -1 && backslash === -1 ) {
                fname = path;
-       } else if (slash > backslash) {
-               fname = path.substring(slash+1, 10000);
+       } else if ( slash > backslash ) {
+               fname = path.substring( slash + 1, 10000 );
        } else {
-               fname = path.substring(backslash+1, 10000);
+               fname = path.substring( backslash + 1, 10000 );
        }
 
        // Clear the filename if it does not have a valid extension.
        // URLs are less likely to have a useful extension, so don't include them in the
        // extension check.
        if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
-               var found = false;
+               found = false;
                if ( fname.lastIndexOf( '.' ) !== -1 ) {
-                       var ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
-                       for ( var i = 0; i < fileExtensions.length; i += 1 ) {
+                       ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
+                       for ( i = 0; i < fileExtensions.length; i += 1 ) {
                                if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
                                        found = true;
                                        break;
                                }
                        }
                }
-               if( !found ) {
+               if ( !found ) {
                        // Not a valid extension
                        // Clear the upload and set mw-upload-permitted to error
-                       document.getElementById(id).value = '';
-                       var e = document.getElementById( 'mw-upload-permitted' );
-                       if( e ) e.className = 'error';
+                       document.getElementById( id ).value = '';
+                       e = document.getElementById( 'mw-upload-permitted' );
+                       if ( e ) {
+                               e.className = 'error';
+                       }
 
-                       var e = document.getElementById( 'mw-upload-prohibited' );
-                       if( e ) e.className = 'error';
+                       e = document.getElementById( 'mw-upload-prohibited' );
+                       if ( e ) {
+                               e.className = 'error';
+                       }
 
                        // Clear wpDestFile as well
-                       var e = document.getElementById( 'wpDestFile' );
-                       if( e ) e.value = '';
+                       e = document.getElementById( 'wpDestFile' );
+                       if ( e ) {
+                               e.value = '';
+                       }
 
                        return false;
                }
@@ -245,45 +277,51 @@ window.fillDestFilename = function(id) {
        }
 
        // Output result
-       var destFile = document.getElementById( 'wpDestFile' );
+       destFile = document.getElementById( 'wpDestFile' );
        if ( destFile ) {
                // Call decodeURIComponent function to remove possible URL-encoded characters
                // from the file name (bug 30390). Especially likely with upload-form-url.
                // decodeURIComponent can throw an exception in input is invalid utf-8
                try {
                        destFile.value = decodeURIComponent( fname );
-               } catch ( e ) {
+               } catch ( err ) {
                        destFile.value = fname;
                }
                wgUploadWarningObj.checkNow( fname );
        }
 };
 
-window.toggleFilenameFiller = function() {
-       if(!document.getElementById) return;
-       var upfield = document.getElementById('wpUploadFile');
-       var destName = document.getElementById('wpDestFile').value;
-       wgUploadAutoFill = ( destName == '' || destName == ' ' );
+window.toggleFilenameFiller = function () {
+       if ( !document.getElementById ) {
+               return;
+       }
+       var destName = document.getElementById( 'wpDestFile' ).value;
+       mw.config.set( 'wgUploadAutoFill', !destName );
 };
 
-window.wgUploadLicenseObj = {
+wgUploadLicenseObj = window.wgUploadLicenseObj = {
 
-       'responseCache' : { '' : '' },
+       responseCache: { '' : '' },
 
-       'fetchPreview': function( license ) {
-               if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) return;
-               for (cached in this.responseCache) {
-                       if (cached == license) {
+       fetchPreview: function ( license ) {
+               var cached, title;
+               if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
+                       return;
+               }
+               for ( cached in this.responseCache ) {
+                       if ( cached === license ) {
                                this.showPreview( this.responseCache[license] );
                                return;
                        }
                }
-               injectSpinner( document.getElementById( 'wpLicense' ), 'license' );
+               window.injectSpinner( document.getElementById( 'wpLicense' ), 'license' );
 
-               var title = document.getElementById('wpDestFile').value;
-               if ( !title ) title = 'File:Sample.jpg';
+               title = document.getElementById( 'wpDestFile' ).value;
+               if ( !title ) {
+                       title = 'File:Sample.jpg';
+               }
 
-               ( new mw.Api ).get( {
+               ( new mw.Api() ).get( {
                        action: 'parse',
                        text: '{{' + license + '}}',
                        title: title,
@@ -294,16 +332,17 @@ window.wgUploadLicenseObj = {
                } );
        },
 
-       'processResult' : function( result, license ) {
-               removeSpinner( 'license' );
-               this.responseCache[license] = result['parse']['text']['*'];
+       processResult: function ( result, license ) {
+               window.removeSpinner( 'license' );
+               this.responseCache[license] = result.parse.text['*'];
                this.showPreview( this.responseCache[license] );
        },
 
-       'showPreview' : function( preview ) {
+       showPreview: function ( preview ) {
                var previewPanel = document.getElementById( 'mw-license-preview' );
-               if( previewPanel.innerHTML != preview )
+               if ( previewPanel.innerHTML !== preview ) {
                        previewPanel.innerHTML = preview;
+               }
        }
 
 };
index c9f5f5c..a3ef55a 100644 (file)
@@ -84,19 +84,29 @@ class DatabaseTest extends MediaWikiTestCase {
                        $quote = '';
                } elseif ( $this->db->getType() === 'mysql' ) {
                        $quote = '`';
+               } elseif ( $this->db->getType() === 'oracle' ) {
+                       $quote = '/*Q*/';
                } else {
                        $quote = '"';
                }
 
                if ( $database !== null ) {
-                       $database = $quote . $database . $quote . '.';
+                       if ( $this->db->getType() === 'oracle' ) {
+                               $database = $quote . $database . '.';
+                       } else {
+                               $database = $quote . $database . $quote . '.';
+                       }
                }
 
                if ( $prefix === null ) {
                        $prefix = $this->dbPrefix();
                }
 
-               return $database . $quote . $prefix . $table . $quote;
+               if ( $this->db->getType() === 'oracle' ) {
+                       return strtoupper($database . $quote . $prefix . $table);
+               } else {
+                       return $database . $quote . $prefix . $table . $quote;
+               }
        }
 
        function testTableNameLocal() {