Merge "(bug 32368) Add ParserCloned hook"
authorDaniel Kinzler <daniel.kinzler@wikimedia.de>
Fri, 16 Nov 2012 20:17:42 +0000 (20:17 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 16 Nov 2012 20:17:42 +0000 (20:17 +0000)
49 files changed:
RELEASE-NOTES-1.21
includes/HttpFunctions.php
includes/OutputPage.php
includes/Title.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryRevisions.php
includes/db/Database.php
includes/db/LoadBalancer.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileOp.php
includes/objectcache/MemcachedClient.php
includes/specials/SpecialUncategorizedcategories.php
languages/messages/MessagesAeb.php
languages/messages/MessagesArc.php
languages/messages/MessagesArz.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBo.php
languages/messages/MessagesBqi.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesDa.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesGlk.php
languages/messages/MessagesGu.php
languages/messages/MessagesJa.php
languages/messages/MessagesKu_arab.php
languages/messages/MessagesKw.php
languages/messages/MessagesMin.php
languages/messages/MessagesNah.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesUk.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/cleanupPreferences.php [changed mode: 0755->0644]
maintenance/nextJobDB.php
maintenance/postgres/archives/patch-ipb_address_unique.sql [deleted file]
resources/jquery/jquery.byteLimit.js
tests/parser/parserTests.txt
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiQueryRevisionsTest.php [new file with mode: 0644]
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
thumb.php

index 16c978d..fec5be6 100644 (file)
@@ -71,6 +71,7 @@ production.
   actually sorted.
 * (bug 2865)  User interface HTML elements don't use lang attribute
   (completed the fix by adding the lang attribute to firstHeading)
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
 
 === API changes in 1.21 ===
 * prop=revisions can now report the contentmodel and contentformat, see docs/contenthandler.txt
index e621f62..ab27a74 100644 (file)
@@ -45,7 +45,9 @@ class Http {
         *                          Otherwise it will use $wgHTTPProxy (if set)
         *                          Otherwise it will use the environment variable "http_proxy" (if set)
         *    - noProxy             Don't use any proxy at all. Takes precedence over proxy value(s).
-        *    - sslVerifyHost       (curl only) Verify hostname against certificate
+        *    - sslVerifyHost       (curl only) Set to 2 to verify hostname against certificate
+        *                                  Setting to 1 (or true) will NOT verify the host name. It will
+        *                                  only check its existence. Setting to 0 (or false) disables entirely.
         *    - sslVerifyCert       (curl only) Verify SSL certificate
         *    - caInfo              (curl only) Provide CA information
         *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
@@ -185,7 +187,15 @@ class MWHttpRequest {
        protected $postData = null;
        protected $proxy = null;
        protected $noProxy = false;
-       protected $sslVerifyHost = true;
+       /**
+        * Parameter passed to Curl that specifies whether
+        * to validate SSL certificates.
+        *
+        * Setting to 0 disables entirely. Setting to 1 checks
+        * the existence of a CN, but doesn't verify it. Setting
+        * to 2 (the default) actually verifies the host.
+        */
+       protected $sslVerifyHost = 2;
        protected $sslVerifyCert = true;
        protected $caInfo = null;
        protected $method = "GET";
index ff83f70..ab7e62f 100644 (file)
@@ -1469,7 +1469,7 @@ class OutputPage extends ContextSource {
         * @param $interface Boolean: whether it is an interface message
         *                                                              (for example disables conversion)
         */
-       public function addWikiTextTitle( $text, &$title, $linestart, $tidy = false, $interface = false ) {
+       public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
                global $wgParser;
 
                wfProfileIn( __METHOD__ );
index 0f02dc7..9e42a1b 100644 (file)
@@ -908,7 +908,7 @@ class Title {
 
        /**
         * Is this the mainpage?
-        * @note Title::newFromText seams to be sufficiently optimized by the title
+        * @note Title::newFromText seems to be sufficiently optimized by the title
         * cache that we don't need to over-optimize by doing direct comparisons and
         * acidentally creating new bugs where $title->equals( Title::newFromText() )
         * ends up reporting something differently than $title->isMainPage();
index a8d4a7c..7cc1755 100644 (file)
@@ -182,8 +182,8 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $block['reason'] = $row->ipb_reason;
                        }
                        if ( $fld_range && !$row->ipb_auto ) {
-                               $block['rangestart'] = IP::hexToQuad( $row->ipb_range_start );
-                               $block['rangeend'] = IP::hexToQuad( $row->ipb_range_end );
+                               $block['rangestart'] = IP::formatHex( $row->ipb_range_start );
+                               $block['rangeend'] = IP::formatHex( $row->ipb_range_end );
                        }
                        if ( $fld_flags ) {
                                // For clarity, these flags use the same names as their action=block counterparts
index 14aed28..0205005 100644 (file)
@@ -98,7 +98,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                        $vals['user'] = $row->user_name;
                                }
 
-                               if ( isset( $prop['user'] ) ) {
+                               if ( isset( $prop['userid'] ) || /*B/C*/isset( $prop['user'] ) ) {
                                        $vals['userid'] = $row->pt_user;
                                }
 
@@ -231,6 +231,9 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                ),
                                'userid' => 'integer'
                        ),
+                       'userid' => array(
+                               'userid' => 'integer'
+                       ),
                        'comment' => array(
                                'comment' => 'string'
                        ),
index ad40a64..66ff3f0 100644 (file)
@@ -546,9 +546,9 @@ class ApiQueryRevisions extends ApiQueryBase {
 
                        if ( $text === null ) {
                                $format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat();
+                               $model = $content->getModel();
 
                                if ( !$content->isSupportedFormat( $format ) ) {
-                                       $model = $content->getModel();
                                        $name = $title->getPrefixedDBkey();
 
                                        $this->dieUsage( "The requested format {$this->contentFormat} is not supported ".
@@ -556,7 +556,11 @@ class ApiQueryRevisions extends ApiQueryBase {
                                }
 
                                $text = $content->serialize( $format );
+
+                               // always include format and model.
+                               // Format is needed to deserialize, model is needed to interpret.
                                $vals['contentformat'] = $format;
+                               $vals['contentmodel'] = $model;
                        }
 
                        if ( $text !== false ) {
@@ -783,7 +787,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'texthidden' => 'boolean'
-                       )
+                       ),
+                       'contentmodel' => array(
+                               'contentmodel' => 'string'
+                       ),
                );
 
                self::addTokenProperties( $props, $this->getTokenFunctions() );
index db050f2..659c6e0 100644 (file)
@@ -230,9 +230,9 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * @since 1.20
-        * @var array of callable
+        * @var array of Closure
         */
-       protected $trxIdleCallbacks = array();
+       protected $mTrxIdleCallbacks = array();
 
        protected $mTablePrefix;
        protected $mFlags;
@@ -534,6 +534,16 @@ abstract class DatabaseBase implements DatabaseType {
                return $this->mDoneWrites;
        }
 
+       /**
+        * Returns true if there is a transaction open with possible write
+        * queries or transaction idle callbacks waiting on it to finish.
+        *
+        * @return bool
+        */
+       public function writesOrCallbacksPending() {
+               return $this->mTrxLevel && ( $this->mTrxDoneWrites || $this->mTrxIdleCallbacks );
+       }
+
        /**
         * Is a connection to the database open?
         * @return Boolean
@@ -757,6 +767,9 @@ abstract class DatabaseBase implements DatabaseType {
         * @return Bool operation success. true if already closed.
         */
        public function close() {
+               if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
+                       throw new MWException( "Transaction idle callbacks still pending." );
+               }
                $this->mOpened = false;
                if ( $this->mConn ) {
                        if ( $this->trxLevel() ) {
@@ -926,7 +939,7 @@ abstract class DatabaseBase implements DatabaseType {
                if ( false === $ret && $this->wasErrorReissuable() ) {
                        # Transaction is gone, like it or not
                        $this->mTrxLevel = 0;
-                       $this->trxIdleCallbacks = array(); // cancel
+                       $this->mTrxIdleCallbacks = array(); // cancel
                        wfDebug( "Connection lost, reconnecting...\n" );
 
                        if ( $this->ping() ) {
@@ -2899,7 +2912,7 @@ abstract class DatabaseBase implements DatabaseType {
         */
        final public function onTransactionIdle( Closure $callback ) {
                if ( $this->mTrxLevel ) {
-                       $this->trxIdleCallbacks[] = $callback;
+                       $this->mTrxIdleCallbacks[] = $callback;
                } else {
                        $callback();
                }
@@ -2911,16 +2924,20 @@ abstract class DatabaseBase implements DatabaseType {
         * @since 1.20
         */
        protected function runOnTransactionIdleCallbacks() {
+               $autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled?
+
                $e = null; // last exception
                do { // callbacks may add callbacks :)
-                       $callbacks = $this->trxIdleCallbacks;
-                       $this->trxIdleCallbacks = array(); // recursion guard
+                       $callbacks = $this->mTrxIdleCallbacks;
+                       $this->mTrxIdleCallbacks = array(); // recursion guard
                        foreach ( $callbacks as $callback ) {
                                try {
+                                       $this->clearFlag( DBO_TRX ); // make each query its own transaction
                                        $callback();
+                                       $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
                                } catch ( Exception $e ) {}
                        }
-               } while ( count( $this->trxIdleCallbacks ) );
+               } while ( count( $this->mTrxIdleCallbacks ) );
 
                if ( $e instanceof Exception ) {
                        throw $e; // re-throw any last exception
@@ -3037,7 +3054,7 @@ abstract class DatabaseBase implements DatabaseType {
                        wfWarn( "$fname: No transaction to rollback, something got out of sync!" );
                }
                $this->doRollback( $fname );
-               $this->trxIdleCallbacks = array(); // cancel
+               $this->mTrxIdleCallbacks = array(); // cancel
        }
 
        /**
@@ -3619,4 +3636,10 @@ abstract class DatabaseBase implements DatabaseType {
        public function __toString() {
                return (string)$this->mConn;
        }
+
+       public function __destruct() {
+               if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
+                       trigger_error( "Transaction idle callbacks still pending." );
+               }
+       }
 }
index 46d24fc..8d32d35 100644 (file)
@@ -926,7 +926,7 @@ class LoadBalancer {
                                continue;
                        }
                        foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->doneWrites() ) {
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
                                        $conn->commit( __METHOD__, 'flush' );
                                }
                        }
index 3a03d4d..3c23e4c 100644 (file)
@@ -177,6 +177,59 @@ class FSFileBackend extends FileBackendStore {
                return $ok;
        }
 
+       /**
+        * @see FileBackendStore::doCreateInternal()
+        * @return Status
+        */
+       protected function doCreateInternal( array $params ) {
+               $status = Status::newGood();
+
+               $dest = $this->resolveToFSPath( $params['dst'] );
+               if ( $dest === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $tempFile = TempFSFile::factory( 'create_', 'tmp' );
+                       if ( !$tempFile ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
+                       if ( $bytes === false ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $cmd = implode( ' ', array(
+                               wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
+                               wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
+                       $tempFile->bind( $status->value );
+               } else { // immediate write
+                       $bytes = file_put_contents( $dest, $params['content'] );
+                       if ( $bytes === false ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $this->chmod( $dest );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-create', $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
        /**
         * @see FileBackendStore::doStoreInternal()
         * @return Status
@@ -386,59 +439,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doCreateInternal()
-        * @return Status
-        */
-       protected function doCreateInternal( array $params ) {
-               $status = Status::newGood();
-
-               $dest = $this->resolveToFSPath( $params['dst'] );
-               if ( $dest === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               if ( !empty( $params['async'] ) ) { // deferred
-                       $tempFile = TempFSFile::factory( 'create_', 'tmp' );
-                       if ( !$tempFile ) {
-                               $status->fatal( 'backend-fail-create', $params['dst'] );
-                               return $status;
-                       }
-                       $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
-                       if ( $bytes === false ) {
-                               $status->fatal( 'backend-fail-create', $params['dst'] );
-                               return $status;
-                       }
-                       $cmd = implode( ' ', array(
-                               wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
-                               wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
-                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
-                       ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
-                       $tempFile->bind( $status->value );
-               } else { // immediate write
-                       $bytes = file_put_contents( $dest, $params['content'] );
-                       if ( $bytes === false ) {
-                               $status->fatal( 'backend-fail-create', $params['dst'] );
-                               return $status;
-                       }
-                       $this->chmod( $dest );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-create', $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        /**
         * @see FileBackendStore::doPrepareInternal()
         * @return Status
index ff1b604..49111d9 100644 (file)
@@ -460,38 +460,27 @@ abstract class FileOp {
 }
 
 /**
- * Store a file into the backend from a file on the file system.
+ * Create a file in the backend with the given content.
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
-class StoreFileOp extends FileOp {
-       /**
-        * @return array
-        */
+class CreateFileOp extends FileOp {
        protected function allowedParams() {
-               return array( array( 'src', 'dst' ),
+               return array( array( 'content', 'dst' ),
                        array( 'overwrite', 'overwriteSame', 'disposition' ) );
        }
 
-       /**
-        * @param $predicates array
-        * @return Status
-        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
-               // Check if the source file exists on the file system
-               if ( !is_file( $this->params['src'] ) ) {
-                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
-                       return $status;
-               // Check if the source file is too big
-               } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
+               // Check if the source data is too big
+               if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
                        $status->fatal( 'backend-fail-maxsize',
                                $this->params['dst'], $this->backend->maxFileSizeInternal() );
-                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
                        return $status;
                // Check if a file can be placed/changed at the destination
                } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
                        $status->fatal( 'backend-fail-usable', $this->params['dst'] );
-                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
                        return $status;
                }
                // Check if destination file exists
@@ -508,53 +497,61 @@ class StoreFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Store the file at the destination
                if ( !$this->destSameAsSource ) {
-                       return $this->backend->storeInternal( $this->setFlags( $this->params ) );
+                       // Create the file at the destination
+                       return $this->backend->createInternal( $this->setFlags( $this->params ) );
                }
                return Status::newGood();
        }
 
        /**
-        * @return bool|string
+        * @return bool|String
         */
        protected function getSourceSha1Base36() {
-               wfSuppressWarnings();
-               $hash = sha1_file( $this->params['src'] );
-               wfRestoreWarnings();
-               if ( $hash !== false ) {
-                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
-               }
-               return $hash;
+               return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
        }
 
+       /**
+        * @return array
+        */
        public function storagePathsChanged() {
                return array( $this->params['dst'] );
        }
 }
 
 /**
- * Create a file in the backend with the given content.
+ * Store a file into the backend from a file on the file system.
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
-class CreateFileOp extends FileOp {
+class StoreFileOp extends FileOp {
+       /**
+        * @return array
+        */
        protected function allowedParams() {
-               return array( array( 'content', 'dst' ),
+               return array( array( 'src', 'dst' ),
                        array( 'overwrite', 'overwriteSame', 'disposition' ) );
        }
 
+       /**
+        * @param $predicates array
+        * @return Status
+        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
-               // Check if the source data is too big
-               if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
+               // Check if the source file exists on the file system
+               if ( !is_file( $this->params['src'] ) ) {
+                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+                       return $status;
+               // Check if the source file is too big
+               } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
                        $status->fatal( 'backend-fail-maxsize',
                                $this->params['dst'], $this->backend->maxFileSizeInternal() );
-                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
+                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
                        return $status;
                // Check if a file can be placed/changed at the destination
                } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
                        $status->fatal( 'backend-fail-usable', $this->params['dst'] );
-                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
+                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
                        return $status;
                }
                // Check if destination file exists
@@ -571,23 +568,26 @@ class CreateFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
+               // Store the file at the destination
                if ( !$this->destSameAsSource ) {
-                       // Create the file at the destination
-                       return $this->backend->createInternal( $this->setFlags( $this->params ) );
+                       return $this->backend->storeInternal( $this->setFlags( $this->params ) );
                }
                return Status::newGood();
        }
 
        /**
-        * @return bool|String
+        * @return bool|string
         */
        protected function getSourceSha1Base36() {
-               return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+               wfSuppressWarnings();
+               $hash = sha1_file( $this->params['src'] );
+               wfRestoreWarnings();
+               if ( $hash !== false ) {
+                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
+               }
+               return $hash;
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsChanged() {
                return array( $this->params['dst'] );
        }
index 72f6a9f..787a168 100644 (file)
@@ -277,7 +277,7 @@ class MWMemcached {
         * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
         * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
+        * is safe to use timestamps in all cases, regardless of expiration
         * eg: strtotime("+3 hour")
         *
         * @return Boolean
index 70d98df..d2d91bd 100644 (file)
@@ -31,4 +31,17 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
                parent::__construct( $name );
                $this->requestedNamespace = NS_CATEGORY;
        }
+
+       /**
+        * Formats the result
+        * @param $skin The current skin
+        * @param $result The query result
+        * @return string The category link
+        */
+       function formatResult ( $skin, $result ) {
+               $title = Title::makeTitle( NS_CATEGORY, $result->title );
+               $text = $title->getText();
+
+               return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+        }
 }
index f98b4bd..c5fe35d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/**    زَوُن (   زَوُن)
+/** Arabic, Tunisian Spoken (تونسي)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  * @author Csisc
  */
 
+$fallback = 'ar';
+
+$rtl = true;
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ضع خطا تحت الوصلات:',
index 67d38ab..185fb68 100644 (file)
@@ -512,7 +512,7 @@ $1',
 'showdiff' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ',
 'anoneditwarning' => "'''ܙܘܗܪܐ:''' ܠܐ ܐܝܬܝܟ ܥܠܝܠܐ.
 ܐܝ ܦܝ (IP) ܕܝܠܟ ܢܬܟܬܒ ܒܬܫܥܝܬܐ ܕܦܐܬܐ.",
-'anonpreviewwarning' => '"Ü Ü\90 Ü\90Ü\9dܬÜ\9dÜ\9f Ü¥Ü Ü\9dÜ Ü\90. Ü\90Ü¢ Ü Ü\92Ü\9f Ü¦Ü\90ܬÜ\90 Ü\90ܢܬ Ü\90Ü\9d Ü¦Ü\9d (IP) Ü\95Ü\9dÜ Ü\9f Ü¢Ü¬Ü\9fܬÜ\92 ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ."',
+'anonpreviewwarning' => '"Ü Ü\90 Ü\90Ü\9dܬÜ\9dÜ\9f Ü¥Ü Ü\9dÜ Ü\90. Ü Ü\92Ü\9fܬÜ\90 Ü\95ܦÜ\90ܬÜ\90 Ü¢Ü¬Ü\9fܬÜ\92 Ü\90Ü\9d Ü¦Ü\9d (IP) Ü\95Ü\9dÜ Ü\9f ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ."',
 'summary-preview' => 'ܚܝܪܐ ܩܕܡܝܐ ܕܦܣܝܩܬ̈ܐ :',
 'blockedtitle' => 'ܡܦܠܚܢܐ ܗܘ ܡܚܪܡܐ',
 'blockednoreason' => 'ܠܝܬ ܥܠܬܐ ܝܗܝܒܬܐ',
index 022c04a..5955aff 100644 (file)
@@ -17,6 +17,8 @@
 
 $fallback = 'ar';
 
+$rtl = true;
+
 $namespaceNames = array(
        NS_MEDIA            => 'ميديا',
        NS_SPECIAL          => 'خاص',
index 94ae3bc..87f592f 100644 (file)
@@ -16,6 +16,8 @@
 
 $fallback = 'fa';
 
+$rtl = true;
+
 $namespaceNames = array(
        NS_MEDIA            => 'مدیا',
        NS_SPECIAL          => 'حاص',
index ccdae69..b80b1bd 100644 (file)
@@ -2960,7 +2960,7 @@ $1',
 'tooltip-n-currentevents' => 'Атрымаць інфармацыю пра актуальныя падзеі',
 'tooltip-n-recentchanges' => 'Сьпіс апошніх зьменаў у {{GRAMMAR:месны|{{SITENAME}}}}.',
 'tooltip-n-randompage' => 'Паказаць выпадковую старонку',
-'tooltip-n-help' => 'Месца, каб пра ўсё даведацца.',
+'tooltip-n-help' => 'Месца, каб пра ўсё даведацца',
 'tooltip-t-whatlinkshere' => 'Сьпіс усіх старонак, якія спасылаюцца на гэтую',
 'tooltip-t-recentchangeslinked' => 'Апошнія зьмены ў старонках, на якія спасылаецца гэтая старонка',
 'tooltip-feed-rss' => 'RSS-стужка для гэтай старонкі',
@@ -3083,6 +3083,8 @@ $1',
 'markedaspatrollederror' => 'Немагчыма пазначыць як «патруляваную»',
 'markedaspatrollederrortext' => 'Вы мусіце абраць вэрсію, каб пазначыць яе «патруляванай».',
 'markedaspatrollederror-noautopatrol' => 'Вам не дазволена пазначаць Вашыя ўласныя зьмены як «патруляваныя».',
+'markedaspatrollednotify' => 'Гэтая зьмена ў «$1» была пазначаная як патруляваная.',
+'markedaspatrollederrornotify' => 'Не атрымалася адпатруляваць старонку.',
 
 # Patrol log
 'patrol-log-page' => 'Журнал патруляваньняў',
@@ -3153,7 +3155,9 @@ $1',
 # Bad image list
 'bad_image_list' => 'Фармат наступны:
 
-Разглядаюцца толькі элемэнты сьпісу (радкі, якія пачынаюцца з *). Першая спасылка ў радку мусіць быць спасылкай на кепскую выяву. Усе наступныя спасылкі ў тым жа радку будуць разглядацца як выключэньні, напрыклад, старонкі, дзе можа зьяўляцца выява.',
+Разглядаюцца толькі элемэнты сьпісу (радкі, якія пачынаюцца з *).
+Першая спасылка ў радку мусіць быць спасылкай на кепскую выяву.
+Усе наступныя спасылкі ў тым жа радку будуць разглядацца як выключэньні, напрыклад, старонкі, дзе можа зьяўляцца выява.',
 
 # Metadata
 'metadata' => 'Мэтазьвесткі',
index b9a145c..c3aeffd 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Freeyak
  * @author Jason (on bo.wikipedia.org)
+ * @author YeshiTuhden
  */
 
 $digitTransformTable = array(
@@ -230,6 +231,7 @@ $messages = array(
 'disclaimerpage' => 'Project:སྤྱིའི་དགག་བྱ།',
 'edithelp' => 'རྩོམ་སྒྲིག་རོགས་རམ།',
 'edithelppage' => 'Help:རྩོམ་སྒྲིག',
+'helppage' => 'Help:ནང་དོན་',
 'mainpage' => 'གཙོ་ངོས།',
 'mainpage-description' => 'གཙོ་ངོས།',
 'policy-url' => 'Project: སྒྲིག་གཞི།',
@@ -395,6 +397,8 @@ $messages = array(
 'templatesused' => 'ཤོག་ངོས་འདིར་སྤྱད་པའི་ {{PLURAL:$1|དཔེ་པང་།|དཔེ་པང་།}}',
 'template-protected' => 'སྲུང་སྐྱོབ་འོག་ཡོད་པ།',
 'nocreate-loggedin' => 'ཤོག་ངོས་གསར་བཟོའི་ཆོག་མཆན་མི་འདུག',
+'recreate-moveddeleted-warn' => "'''ཉེན་བརྡ་:རང་གིས་སུབ་ཚར་བའི་ཤོག་ལེ་ཞིག་བསྐྱར་བཟོ་བྱེད་ཀྱི་འདུག་ '''
+ཁྱེད་རང་གལ་སྲིད་མུ་མཐུད་ཤོག་ལེ་འདི་བཟོ་ཅོས་བྱེད་འདོད་ན་སྟབས་བདེ་ཞིག་ལ་ང་ཚོས་སུབ་བཟིན་པའི་ཤོག་ལེ་འདིར་ཉར་ཡོད།",
 
 # History pages
 'viewpagelogs' => 'ཤོག་ངོས་འདིའི་ཉིན་ཐོ་ལ་ལྟ་བ།',
@@ -445,9 +449,14 @@ $messages = array(
 'nextn' => 'རྗེས་མ་{{PLURAL:$1|$1}}',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)ལ་ལྟ་བ།',
 'searchmenu-legend' => 'འཚོལ་ཞིབ་འདེམས་ཚན།',
+'searchmenu-new' => 'ལྦེ་ཁེ་སྟེང་ལ་ཤོག་ལེ་ [[:$1]]བཟོས།',
+'searchprofile-project' => 'རོགས་རམ་དང་འཆར་གཞིའི་ཤོག་ངོས་',
+'searchprofile-everything' => 'ཚང་མ་',
+'searchprofile-advanced' => 'མཐོ་རིམ་',
 'searchprofile-articles-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
 'searchprofile-project-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
 'searchprofile-images-tooltip' => 'ཡིག་ཆ་འཚོལ་བ།',
+'searchprofile-everything-tooltip' => 'བརྗོད་དོན་ཚང་མ་འཚོལ་གཞིབ་བྱེད་(གྲོས་མེས་ཤོག་ངོས་ཡང་འཚུད་པ་)',
 'search-result-size' => '$1({{PLURAL:$2|1 word|$2 words}})',
 'search-redirect' => '($1རིམ་འགྲེམ།)',
 'search-section' => '(ཚན་པ $1)',
@@ -457,6 +466,7 @@ $messages = array(
 'search-interwiki-more' => '(དེ་ལས་མང་བ།)',
 'search-relatedarticle' => 'འབྲེལ་ཡོད།',
 'searchall' => 'ཚང་མ།',
+'search-nonefound' => 'ཁྱེད་ཀྱི་འདྲི་ཞིབ་དང་མཐུན་པའི་ལན་མི་འདུག་',
 'powersearch' => 'ཞིབ་ཏུ་འཚོལ་བ།',
 'powersearch-legend' => 'ཞིབ་ཏུ་འཚོལ་བ།',
 'powersearch-ns' => 'མིང་གནས་ནང་འཚོལ་བ།',
@@ -731,6 +741,7 @@ $messages = array(
 
 # Undelete
 'undeletelink' => 'ལྟ་བ། / བསྐྱར་འདྲེན།',
+'undeleteviewlink' => 'ལྟ་བ་',
 'undelete-search-submit' => 'འཚོལ།',
 
 # Namespace form on various pages
@@ -784,6 +795,7 @@ $messages = array(
 
 # Namespace 8 related
 'allmessages' => 'མ་ལག་གི་སྐད་ཆ།',
+'allmessagesname' => 'མིང་',
 
 # Thumbnails
 'thumbnail-more' => 'ཆེ་རུ་གཏོང་བ།',
@@ -838,6 +850,7 @@ $messages = array(
 'tooltip-save' => 'བཟོ་བཅོས་ཉར་ཚགས་བྱོས།',
 'tooltip-preview' => 'ཉར་ཚགས་ཀྱི་སྔོན་དུ་བཟོ་བཅོས་ལ་བསྐྱར་ཞིབ་གནང་རོགས།',
 'tooltip-diff' => 'གང་ལ་བཟོ་བཅོས་བྱས་པའི་ཡིག་འབྲུ་སྟོན་པ།',
+'tooltip-summary' => 'ཕྱོགས་བསྡོམས་ཐུང་ངུ་ཞིག་འབྲིས་',
 
 # Browsing diffs
 'previousdiff' => '← རྩོམ་སྒྲིག་རྙིང་བ།',
index 12ff736..b0f1d7e 100644 (file)
@@ -15,6 +15,8 @@
 
 $fallback = 'fa';
 
+$rtl = true;
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'لینکهای خط به زیر',
index d9d5289..5c8e10e 100644 (file)
@@ -1468,7 +1468,7 @@ $1",
 'rcshowhidebots' => 'بۆتەکان $1',
 'rcshowhideliu' => 'بەکارھێنەرە تۆمارکراوەکان $1',
 'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
-'rcshowhidepatr' => 'Ú¯Û\86راÙ\86کارÛ\8cÛ\8cÛ\95 Ú©Û\86Ù\86ترÛ\86Úµکراوەکان $1',
+'rcshowhidepatr' => 'Ú¯Û\86راÙ\86کارÛ\8cÛ\8cÛ\95 Ú\86اÙ\88دÛ\8eرÛ\8cکراوەکان $1',
 'rcshowhidemine' => 'دەستکارییەکانی من $1',
 'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
 'diff' => 'جیاوازی',
@@ -1485,6 +1485,7 @@ $1",
 'newsectionsummary' => '/* $1 */ بەشی نوێ',
 'rc-enhanced-expand' => 'وردەکارییەکان پیشان بدە (پێویستی بە جاڤاسکریپتە)',
 'rc-enhanced-hide' => 'وردەکارییەکان بشارەوە',
+'rc-old-title' => 'بە ناوی سەرەکیی «$1» دروست کراوە',
 
 # Recent changes linked
 'recentchangeslinked' => 'گۆڕانکارییە پەیوەندیدارەکان',
index 64a2382..4f62ad4 100644 (file)
@@ -3180,6 +3180,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'markedaspatrollederror' => 'Nelze označit za prověřené',
 'markedaspatrollederrortext' => 'Musíte zvolit revizi, která má být označena jako prověřená.',
 'markedaspatrollederror-noautopatrol' => 'Nemáte dovoleno označovat vlastní editace jako prověřené.',
+'markedaspatrollednotify' => 'Tato změna stránky $1 byla označena jako prověřená.',
+'markedaspatrollederrornotify' => 'Nepodařilo se označit jako prověřené.',
 
 # Patrol log
 'patrol-log-page' => 'Kniha prověřených editací',
index a5b086c..f2eaa19 100644 (file)
@@ -2974,6 +2974,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'markedaspatrollederror' => 'Markering som „kontrolleret“ ikke mulig.',
 'markedaspatrollederrortext' => 'Du skal vælge en sideændring.',
 'markedaspatrollederror-noautopatrol' => 'Du må ikke markere dine egne ændringer som kontrolleret.',
+'markedaspatrollednotify' => 'Denne ændring af $1 er blevet markeret som patruljeret.',
+'markedaspatrollederrornotify' => 'Markering som patruljeret mislykkedes.',
 
 # Patrol log
 'patrol-log-page' => 'Kontrollog',
index 517eab5..6e6ea34 100644 (file)
@@ -472,7 +472,7 @@ $messages = array(
 'vector-view-view' => 'Bıwane',
 'vector-view-viewsource' => 'Çımey bıvêne',
 'actions' => 'Kerdışi',
-'namespaces' => 'Cayê namey',
+'namespaces' => 'Cayê namam',
 'variants' => 'Varyanti',
 
 'errorpagetitle' => 'Xırab',
@@ -1433,7 +1433,7 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
 'timezoneregion-pacific' => 'Okyanuso Pasifik',
 'allowemail' => 'Karberê bini wa bışê mı rê e-posta bırışê.',
 'prefs-searchoptions' => 'Cı geyre',
-'prefs-namespaces' => 'Caê namey',
+'prefs-namespaces' => 'Cayê namam',
 'defaultns' => 'Eke heni, enê cayanê namey de cı geyre (sae ke):',
 'default' => 'qısur',
 'prefs-files' => 'Dosyey',
@@ -3652,6 +3652,8 @@ mw.loader.using( 'jquery.cookie', function() {
 'markedaspatrollederror' => 'Nişan nibeno ke devriye biyo',
 'markedaspatrollederrortext' => 'Ti gani revizyon işaret bike ke Nişanê devriye biyo',
 'markedaspatrollederror-noautopatrol' => 'Ti nieşkeno ke vurnayişê xo nişan bike ke devriye biyê.',
+'markedaspatrollednotify' => 'Na vurnayışa dewriye deye $1 nışan biyo.',
+'markedaspatrollederrornotify' => 'Nışan kerdışê dewriyey nêbı',
 
 # Patrol log
 'patrol-log-page' => 'Logê devriye',
index 35f92f7..15c2cb0 100644 (file)
@@ -2921,6 +2921,8 @@ W zespominanju dajo se pśicyna pódaś.',
 'markedaspatrollederror' => 'Markěrowanje ako "kontrolěrowane" njejo móžne.',
 'markedaspatrollederrortext' => 'Musyš wersiju wuzwóliś.',
 'markedaspatrollederror-noautopatrol' => 'Njesmějoš swóje změny ako kontrolěrowane markěrowaś.',
+'markedaspatrollednotify' => 'Toś ta změna do $1 jo se ako doglědowana markěrowała.',
+'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane jo se njeraźiło.',
 
 # Patrol log
 'patrol-log-page' => 'Protokol kontrolow',
index 511a535..2a37792 100644 (file)
@@ -14,6 +14,8 @@
 
 $fallback = 'fa';
 
+$rtl = true;
+
 $messages = array(
 'moredotdotdot' => 'ویشتر...',
 'mypage' => 'می هنه‌شر',
index baff36b..ae11b56 100644 (file)
@@ -418,9 +418,9 @@ $1',
 'youhavenewmessages' => 'તમારા માટે $1 ($2).',
 'newmessageslink' => 'નવીન સંદેશ',
 'newmessagesdifflink' => 'છેલ્લો ફેરફાર',
-'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્યના|$3 અન્ય સભ્યોના}} $1 છે. ($2).',
+'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).',
 'youhavenewmessagesmanyusers' => 'આપને માટે $1 છે. ($2)',
-'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશ|નવાં સંદેશાઓ}}',
+'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશો|નવા સંદેશા}}',
 'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
 'editsection' => 'ફેરફાર કરો',
index 46b38ec..0bebad2 100644 (file)
@@ -3315,6 +3315,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'markedaspatrollederrortext' => '巡回済みにするには、版を指定する必要があります。',
 'markedaspatrollederror-noautopatrol' => '自分の編集を巡回済みにする権限がありません。',
 'markedaspatrollednotify' => '$1 へのこの変更は巡回済みになりました。',
+'markedaspatrollederrornotify' => '巡回済みにするのに失敗しました。',
 
 # Patrol log
 'patrol-log-page' => '巡回記録',
index a17741f..9680f2a 100644 (file)
  * @author Marmzok
  */
 
-$rtl = true;
-
 $fallback = 'ckb';
 
+$rtl = true;
+
 $digitTransformTable = array(
        '0' => '٠', # &#x0660;
        '1' => '١', # &#x0661;
index 97b9996..468ce55 100644 (file)
@@ -109,15 +109,15 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-hideminor' => 'Kudha chanjyow bian en chanjyow a-dhiwedhes',
-'tog-watchcreations' => "Keworra folednow gwruthys genev dhe'm rol golyas",
-'tog-watchdefault' => "Keworra folednow chanjys genev dhe'm rol golyas",
-'tog-watchmoves' => "Keworra folednow gwayes genev dhe'm rol golyas",
+'tog-hideminor' => 'Cudha chanjyow bian yn chanjyow a-dhiwedhes',
+'tog-watchcreations' => "Keworra folennow gwruthys genev ha restrennow ughkergys genev dhe'm rol golyas",
+'tog-watchdefault' => "Keworra folennow ha restrennow chanjys genev dhe'm rol golyas",
+'tog-watchmoves' => "Keworra folennow ha restrennow gwayys genev dhe'm rol golyas",
 'tog-watchdeletion' => "Keworra folednow dileys genev dhe'm rol golyas",
 
-'underline-always' => 'Pupres',
-'underline-never' => 'Nevra',
-'underline-default' => 'Defowt an beurel',
+'underline-always' => 'Puppres',
+'underline-never' => 'Jammes',
+'underline-default' => 'Defowt an beurel po an grohen',
 
 # Font style option in Special:Preferences
 'editfont-default' => 'Defowt an beurel',
@@ -181,32 +181,32 @@ $messages = array(
 'category-media-header' => 'Media y\'n class "$1"',
 'category-empty' => "''Nyns eus na folennow na media y'n class-ma.''",
 'hidden-categories' => '{{PLURAL:$1|Class cudhys|Classys cudhys}}',
-'hidden-category-category' => 'Klassys kovys',
+'hidden-category-category' => 'Classys cudhys',
 'category-subcat-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an isglass a sew.|Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew, dhyworth somm a $2.}}",
-'category-subcat-count-limited' => "Yma dhe'n klass-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew.",
+'category-subcat-count-limited' => "Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew.",
 'category-article-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folennow}} a sew y'n class-ma, dhyworth somm a $2.}}",
-'category-article-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew e'n klass-ma.",
+'category-article-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
 'category-file-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma, dhyworth somm a $2.}}",
-'category-file-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew e'n klass-ma.",
+'category-file-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
 'listingcontinuesabbrev' => 'pes.',
 
 'about' => 'A-dro dhe',
 'newwindow' => '(y whra egery yn fenester noweth)',
 'cancel' => 'Hedhy',
 'moredotdotdot' => 'Moy...',
-'mypage' => 'Ow folen',
+'mypage' => 'Folen',
 'mytalk' => 'Kescows',
-'anontalk' => 'Keskows rag an drigva IP-ma',
+'anontalk' => 'Kescows rag an drigva IP-ma',
 'navigation' => 'Lewyans',
 'and' => '&#32;ha(g)',
 
 # Cologne Blue skin
-'qbfind' => 'Kavos',
-'qbbrowse' => 'Peuri',
+'qbfind' => 'Cavos',
+'qbbrowse' => 'Peury',
 'qbedit' => 'Chanjya',
 'qbpageoptions' => 'An folen-ma',
-'qbmyoptions' => 'Ow folednow',
-'qbspecialpages' => 'Folednow arbednek',
+'qbmyoptions' => 'Ow folennow',
+'qbspecialpages' => 'Folennow arbennek',
 'faq' => 'FAQ',
 
 # Vector skin
@@ -244,8 +244,8 @@ $messages = array(
 'create-this-page' => 'Gwruthyl an folen-ma',
 'delete' => 'Dilea',
 'deletethispage' => 'Dilea an folen-ma',
-'undelete_short' => 'Disdhilea {{PLURAL:$1|udn janj|$1 chanj}}',
-'viewdeleted_short' => 'Gweles {{PLURAL:$1|udn janj diles|$1 chanj diles}}',
+'undelete_short' => 'Disdhilea {{PLURAL:$1|unn janj|$1 chanj}}',
+'viewdeleted_short' => 'Gweles {{PLURAL:$1|unn janj diles|$1 chanj diles}}',
 'protect' => 'Difres',
 'protect_change' => 'chanjya',
 'protectthispage' => 'Difres an folen-ma',
@@ -254,9 +254,9 @@ $messages = array(
 'newpage' => 'Folen noweth',
 'talkpage' => "Dadhelva a-dro dhe'n folen-ma",
 'talkpagelinktext' => 'Kescows',
-'specialpage' => 'Folen arbednek',
+'specialpage' => 'Folen arbennek',
 'personaltools' => 'Toulys personel',
-'postcomment' => 'Radn nowyth',
+'postcomment' => 'Rann noweth',
 'talk' => 'Kescows',
 'views' => 'Gwelow',
 'toolbox' => 'Box toulys',
@@ -264,10 +264,10 @@ $messages = array(
 'projectpage' => 'Folen meta',
 'imagepage' => 'Gweles folen an restren',
 'mediawikipage' => 'Gweles folen an messajys',
-'templatepage' => 'Gweles folen an skantlyn',
+'templatepage' => 'Gweles folen an scantlyn',
 'viewhelppage' => 'Gweles an folen gweres',
-'categorypage' => 'Gweles folen an klass',
-'viewtalkpage' => 'Gweles an keskows',
+'categorypage' => 'Gweles folen an class',
+'viewtalkpage' => 'Gweles an kescows',
 'otherlanguages' => 'Yn yethow erel',
 'redirectedfrom' => '(Daswedyes dhyworth $1)',
 'redirectpagesub' => 'Folen daswedyans',
@@ -279,7 +279,7 @@ $messages = array(
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'A-dro dhe {{SITENAME}}',
 'aboutpage' => 'Project:Kedhlow',
-'copyright' => 'Kavadow yw an dalgh en-dadn $1.',
+'copyright' => 'Cavadow yw an dalgh yn-dann $1.',
 'copyrightpage' => '{{ns:project}}:Gwirbryntyansow',
 'currentevents' => 'Darvosow a-lemmyn',
 'currentevents-url' => 'Project:Darvosow a-lemmyn',
@@ -290,20 +290,20 @@ $messages = array(
 'helppage' => 'Help:Gweres',
 'mainpage' => 'Folen dre',
 'mainpage-description' => 'Folen dre',
-'policy-url' => 'Project:Polici',
+'policy-url' => 'Project:Policy',
 'portal' => 'Porth an gemeneth',
 'portal-url' => 'Project:Porth an gemeneth',
 'privacy' => 'Policy privetter',
 'privacypage' => 'Project:Policy privetter',
 
-'badaccess' => 'Gwall kubmyes',
+'badaccess' => 'Gwall cummyes',
 
 'ok' => 'Sur',
 'retrievedfrom' => 'Daskevys dhyworth "$1"',
 'youhavenewmessages' => 'Yma $1 genowgh ($2).',
 'newmessageslink' => 'messajys noweth',
 'newmessagesdifflink' => 'chanj diwettha',
-'youhavenewmessagesmulti' => 'Yma messajys nowyth genowgh war $1',
+'youhavenewmessagesmulti' => 'Yma messajys noweth genowgh war $1',
 'editsection' => 'chanjya',
 'editold' => 'chanjya',
 'viewsourceold' => 'gweles an bennfenten',
@@ -311,12 +311,12 @@ $messages = array(
 'viewsourcelink' => 'gweles an bennfenten',
 'editsectionhint' => 'Chanjya an rann: $1',
 'toc' => 'Rol an folen',
-'showtoc' => 'diskwedhes',
-'hidetoc' => 'kudha',
-'collapsible-expand' => 'Efani',
+'showtoc' => 'disqwedhes',
+'hidetoc' => 'cudha',
+'collapsible-expand' => 'Efany',
 'thisisdeleted' => 'Gweles po restorya $1?',
 'viewdeleted' => 'Gweles $1?',
-'restorelink' => '{{PLURAL:$1|udn janj diles|$1 chanj diles}}',
+'restorelink' => '{{PLURAL:$1|unn janj diles|$1 chanj diles}}',
 'feedlinks' => 'Feed:',
 'site-rss-feed' => '$1 RSS feed',
 'site-atom-feed' => '$1 Atom feed',
@@ -339,34 +339,34 @@ $messages = array(
 # General errors
 'error' => 'Gwall',
 'databaseerror' => 'Gwall database',
-'readonly' => 'Alhwedhys yw an database',
+'readonly' => 'Alwhedhys yw an database',
 'missingarticle-rev' => '(amendyans#: $1)',
 'missingarticle-diff' => '(Dyffrans: $1, $2)',
 'internalerror' => 'Gwall a-bervedh',
 'internalerror_info' => 'Gwall a-bervedh: $1',
-'filecopyerror' => 'Ny ylles kopia an restren "$1" war-tu "$2".',
-'filerenameerror' => 'Ny ylles dashenwel an restren "$1" dhe "$2".',
-'filedeleteerror' => 'Ny ylles dilea an restren "$1".',
-'filenotfound' => 'Ny ylles kavos an restren "$1".',
+'filecopyerror' => 'Ny veu possybyl copia an restren "$1" dhe "$2".',
+'filerenameerror' => 'Ny veu possybyl dashenwel an restren "$1" dhe "$2".',
+'filedeleteerror' => 'Ny veu possybyl dilea an restren "$1".',
+'filenotfound' => 'Ny veu kevys an restren "$1".',
 'badtitle' => 'Titel drog',
 'viewsource' => 'Gweles an bennfenten',
 
 # Login and logout pages
 'welcomecreation' => '== Dynnargh, $1! ==
-Gwruthys yw agas akont.
-Na wrewgh ankevi dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
+Gwruthys yw agas acont.
+Na wrewgh ankevy dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
 'yourname' => 'Hanow usyer:',
 'yourpassword' => 'Ger tremena:',
 'yourpasswordagain' => 'Jynnscrifowgh agas ger tremena arta:',
 'remembermypassword' => "Perthy cov a'm ger tremena war'n jynn amontya-ma (rag $1 {{PLURAL:$1|dedh|dedh}} dhe'n moyha)",
-'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmi',
+'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmy',
 'yourdomainname' => 'Agas tiredh:',
 'login' => 'Omgelmy',
 'nav-login-createaccount' => 'Omgelmy / Formya acont noweth',
 'loginprompt' => 'Res yw dhywgh galosegy cookies rag omgelmy orth {{SITENAME}}.',
 'userlogin' => 'Omgelmy / formya acont noweth',
-'userloginnocreate' => 'Omgelmi',
-'logout' => 'Digelmi',
+'userloginnocreate' => 'Omgelmy',
+'logout' => 'Digelmy',
 'userlogout' => 'Digelmy',
 'notloggedin' => 'Digelmys',
 'nologin' => "A nyns eus acont dhywgh? '''$1'''.",
@@ -376,36 +376,36 @@ Na wrewgh ankevi dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]
 'gotaccountlink' => 'Omgelmy',
 'userlogin-resetlink' => 'Eus ankevys genowgh agas manylyon omgelmy?',
 'createaccountmail' => 'der e-bost',
-'createaccountreason' => 'Cheson:',
-'badretype' => 'Ny wra parya an geryow-tremena an eyl gans y gila.',
+'createaccountreason' => 'Acheson:',
+'badretype' => 'Ny wra omdhesedhes an geryow-tremena entrys genowgh.',
 'userexists' => "Yma'n hanow usyer entrys genowgh ow pos usys seulabres.
 Dowisowgh hanow aral mar pleg.",
-'loginerror' => 'Gwall omgelmi',
-'createaccounterror' => 'Ny ylles formya an akont: $1',
-'nocookiesnew' => 'An akont yw formys, mes nyns owgh hwi omgelmys.
-Yma {{SITENAME}} owth usya cookies rag omgelmi devnydhyoryon.
+'loginerror' => 'Gwall omgelmy',
+'createaccounterror' => 'Ny veu possybyl formya an acont: $1',
+'nocookiesnew' => 'Formys yw an acont, mes nyns owgh why omgelmys.
+Yma {{SITENAME}} owth usya cookies rag omgelmy devnydhyoryon.
 Dialosegys yw cookies war agas jynn amontya.
-Gwrewgh aga galosegi, hag omgelmi dre usya agas hanow usyer ha ger tremena nowyth.',
+Gwrewgh aga galosegy, hag omgelmowgh dre usya agas hanow usyer ha ger tremena noweth.',
 'nocookieslogin' => 'Yma {{SITENAME}} owth usya cookies rag omgelmi devnydhyoryon.
 Dialosegys yw cookies war agas jynn amontya.
 Gwrewgh aga galosegi hag assaya arta.',
-'noname' => 'Ny wrussowgh hwi ri hanow usyer da.',
-'loginsuccess' => "'''Omgelmys owgh hwi lebmyn orth {{SITENAME}} avel \"\$1\".'''",
-'nouserspecified' => 'Res yw dhewgh ri hanow usyer.',
-'wrongpassword' => 'Kabm o an ger tremena.
+'noname' => 'Ny wrussowgh why ry hanow usyer da.',
+'loginsuccess' => "'''Omgelmys owgh why lemmyn orth {{SITENAME}} avel \"\$1\".'''",
+'nouserspecified' => 'Res yw dhywgh ry hanow usyer.',
+'wrongpassword' => 'Camm o an ger tremena.
 Assayowgh arta mar pleg.',
 'wrongpasswordempty' => 'Gwag o an ger-tremena res. Assayowgh arta mar pleg.',
 'mailmypassword' => 'E-bostya ger tremena noweth',
-'noemailcreate' => 'Res yw dhewgh ri trigva ebost da',
-'accountcreated' => 'Formys yw an akont',
-'accountcreatedtext' => 'Formys yw an akont rag $1.',
+'noemailcreate' => 'Res yw dhewgh ry trigva ebost da',
+'accountcreated' => 'Acont formys',
+'accountcreatedtext' => 'Formys re beu an acont rag $1.',
 'loginlanguagelabel' => 'Yeth: $1',
 
 # Change password dialog
 'resetpass' => 'Chanjya ger-tremena',
-'resetpass_header' => 'Chanjya ger tremena an akont',
-'oldpassword' => 'Ger tremena koth:',
-'newpassword' => 'Ger tremena nowyth:',
+'resetpass_header' => 'Chanjya ger tremena an acont',
+'oldpassword' => 'Ger tremena coth:',
+'newpassword' => 'Ger tremena noweth:',
 'resetpass-submit-loggedin' => 'Chanjya an ger-tremena',
 'resetpass-submit-cancel' => 'Hedhi',
 
index 1060a75..a986d2a 100644 (file)
@@ -83,18 +83,18 @@ $messages = array(
 'thursday' => 'Kamih',
 'friday' => 'Jumek',
 'saturday' => 'Sabtu',
-'sun' => 'Aha',
+'sun' => 'Min',
 'mon' => 'Sin',
 'tue' => 'Sal',
 'wed' => 'Rab',
 'thu' => 'Kam',
 'fri' => 'Jum',
-'sat' => 'Sab',
+'sat' => 'Sat',
 'january' => 'Januari',
-'february' => 'Februari',
+'february' => 'Pebruari',
 'march' => 'Maret',
 'april' => 'April',
-'may_long' => 'Mei',
+'may_long' => 'Mai',
 'june' => 'Juni',
 'july' => 'Juli',
 'august' => 'Agustus',
@@ -103,10 +103,10 @@ $messages = array(
 'november' => 'November',
 'december' => 'Desember',
 'january-gen' => 'Januari',
-'february-gen' => 'Februari',
+'february-gen' => 'Pebruari',
 'march-gen' => 'Maret',
 'april-gen' => 'April',
-'may-gen' => 'Mei',
+'may-gen' => 'Mai',
 'june-gen' => 'Juni',
 'july-gen' => 'Juli',
 'august-gen' => 'Agustus',
@@ -115,10 +115,10 @@ $messages = array(
 'november-gen' => 'November',
 'december-gen' => 'Desember',
 'jan' => 'Jan',
-'feb' => 'Feb',
+'feb' => 'Peb',
 'mar' => 'Mar',
 'apr' => 'Apr',
-'may' => 'Mei',
+'may' => 'Mai',
 'jun' => 'Jun',
 'jul' => 'Jul',
 'aug' => 'Agu',
@@ -152,9 +152,9 @@ $messages = array(
 'cancel' => 'Batalkan',
 'moredotdotdot' => 'Lainnyo...',
 'mypage' => 'Laman ambo',
-'mytalk' => 'Ota denai',
+'mytalk' => 'Maota',
 'anontalk' => 'Ota IP iko',
-'navigation' => 'Navigasi',
+'navigation' => 'Pinteh',
 'and' => '&#32;jo',
 
 # Cologne Blue skin
@@ -177,7 +177,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Aktifkan pancarian saran nan disampurnokan (hanyo kulik Vector)',
 'vector-view-create' => 'Buek',
 'vector-view-edit' => 'Suntiang',
-'vector-view-history' => 'Caliak riwayat nan lalu',
+'vector-view-history' => 'Caliak riwayaik nan lalu',
 'vector-view-view' => 'Baco',
 'vector-view-viewsource' => 'Caliak sumber',
 'actions' => 'Tindakan',
@@ -193,10 +193,10 @@ $messages = array(
 'go' => 'Tuju',
 'searcharticle' => 'Tuju',
 'history' => 'Riwayat halaman',
-'history_short' => 'Riwayat',
+'history_short' => 'Riwayaik',
 'updatedmarker' => 'diubah sajak kunjuangan tarakhir ambo',
 'printableversion' => 'Versi cetak',
-'permalink' => 'Pranala permanen',
+'permalink' => 'Pranala parmanen',
 'print' => 'Cetak',
 'view' => 'Tampilkan',
 'edit' => 'Suntiang',
@@ -216,11 +216,11 @@ $messages = array(
 'talkpage' => 'Musyawarahkan laman ko',
 'talkpagelinktext' => 'Maota',
 'specialpage' => 'Laman istimewa',
-'personaltools' => 'Peralatan pribadi',
+'personaltools' => 'Pakakeh paribadi',
 'postcomment' => 'Bagian baru',
 'articlepage' => 'Liek isi laman',
-'talk' => 'Ota',
-'views' => 'Tampilan',
+'talk' => 'Rundiang',
+'views' => 'Caliak',
 'toolbox' => 'Kotak pakakeh',
 'userpage' => 'Liek laman pangguno',
 'projectpage' => 'Caliak laman proyek',
@@ -233,11 +233,11 @@ $messages = array(
 'otherlanguages' => 'Dalam baso lain',
 'redirectedfrom' => '(Dialiahkan dari $1)',
 'redirectpagesub' => 'Laman pengalihan',
-'lastmodifiedat' => 'Laman ko tarakhir diubah pado $1, maso $2.',
+'lastmodifiedat' => 'Laman ko tarakhir diubah pado $2, $1.',
 'viewcount' => 'Laman iko alah diakses sabanyak {{PLURAL:$1|ciek kali|$1 kali}}.<br />',
 'protectedpage' => 'Laman nan dilindungi',
 'jumpto' => 'Lompek ka:',
-'jumptonavigation' => 'navigasi',
+'jumptonavigation' => 'pinteh',
 'jumptosearch' => 'cari',
 'view-pool-error' => 'Maaf, server sadang sibuak pado kini ko.
 Talalu banyak pangguno barusaho mancaliak laman iko.
@@ -249,24 +249,24 @@ $1',
 'pool-errorunknown' => 'Kasalahan nan indak dikatahui',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Tentang {{SITENAME}}',
-'aboutpage' => 'Project:Perihal',
+'aboutsite' => 'Tantang {{SITENAME}}',
+'aboutpage' => 'Project:Tantang',
 'copyright' => 'Kandungan tasadio dalam $1',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
-'currentevents' => 'Paristiwa takini',
-'currentevents-url' => 'Project:Paristiwa takini',
-'disclaimers' => 'Penyangkalan',
-'disclaimerpage' => 'Project:Penyangkalan umum',
+'currentevents' => 'Kajadian kini ko',
+'currentevents-url' => 'Project:Kajadian kini ko',
+'disclaimers' => 'Sanggah',
+'disclaimerpage' => 'Project:Sanggahan umum',
 'edithelp' => 'Bantuan suntingan',
 'edithelppage' => 'Help:Suntingan',
-'helppage' => 'Help:Kandungan',
-'mainpage' => 'Halaman Utamo',
-'mainpage-description' => 'Laman Utamo',
+'helppage' => 'Help:Takadia',
+'mainpage' => 'Laman Utamo',
+'mainpage-description' => 'Laman utamo',
 'policy-url' => 'Project:Kabijakan',
 'portal' => 'Portal komunitas',
 'portal-url' => 'Project:Portal komunitas',
-'privacy' => 'Kebijakan privasi',
-'privacypage' => 'Project:Kebijakan privasi',
+'privacy' => 'Kecipehan privasi',
+'privacypage' => 'Project:Kecipehan privasi',
 
 'badaccess' => 'Kesalahan hak akses',
 'badaccess-group0' => 'Sanak indak diizinkan untuak malakukan tindakan nan Sanak minta.',
@@ -276,7 +276,7 @@ $1',
 'versionrequiredtext' => 'MediaWiki versi $1 dibutuahkan untuak manggunokan laman ijo. Caliak [[Special:Version|laman versi]]',
 
 'ok' => 'OK',
-'retrievedfrom' => 'Diperoleh dari "$1"',
+'retrievedfrom' => 'Didapek dari "$1"',
 'youhavenewmessages' => 'Awak punyo $1 ($2).',
 'newmessageslink' => 'pasan baru',
 'newmessagesdifflink' => 'parubahan terakhir',
@@ -288,9 +288,9 @@ $1',
 'editold' => 'suntiang',
 'viewsourceold' => 'Caliak sumber',
 'editlink' => 'suntiang',
-'viewsourcelink' => 'Lihek sumber',
+'viewsourcelink' => 'Caliak sumber',
 'editsectionhint' => 'Suntiang bagian: $1',
-'toc' => 'Kandungan',
+'toc' => 'Daftar isi',
 'showtoc' => 'tampilkan',
 'hidetoc' => 'suruakkan',
 'collapsible-collapse' => 'Ketekan',
@@ -302,15 +302,15 @@ $1',
 'feed-invalid' => 'Tipe pamintaan umpan indak tapek.',
 'feed-unavailable' => 'Umpan sindikasi indak tasadio',
 'site-rss-feed' => '$1 RSS Umpan',
-'site-atom-feed' => '$1 umpan Atom',
+'site-atom-feed' => 'Umpan Atom $1',
 'page-rss-feed' => 'Umpan RSS "$1"',
 'page-atom-feed' => '"$1" umpan Atom',
-'red-link-title' => '$1 (halaman alun babuek)',
+'red-link-title' => '$1 (laman indak ado)',
 'sort-descending' => 'Urutkan manurun',
 'sort-ascending' => 'Urutkan manaik',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Halaman',
+'nstab-main' => 'Laman',
 'nstab-user' => 'Laman pangguno',
 'nstab-media' => 'Laman Media',
 'nstab-special' => 'Laman istimewa',
@@ -347,12 +347,12 @@ Basis data manghasilkan kasalahan "$3: $4".',
 'readonly' => 'Basis data dikunci',
 'enterlockreason' => 'Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka',
 'readonlytext' => 'Basis data sadang dikunci tahadok masuakan baru. Panguruih nan malakukan panguncian mamberikan panjalehan sabagai berikut: <p>$1',
-'missing-article' => 'Basis data indak dapek manamukan teks dari laman yang seharusnyo ado, namo "$1" $2.
+'missing-article' => 'Basis data indak dapek manamukan teks dari laman nan saharuihnyo ado, yaitu "$1" $2.
 
-Hal ko biasonyo disebabkan dek pranala usang ka riwayat terdahulu dari laman yang lah dihapuih.
+Hal ko biasonyo disababkan dek pranala usang ka pabaikkan tadahulu laman nan alah dihapuih.
 
-Jiko bukan iko penyebabnyo, awak mungkin lah manamukan sabuah bug dalam perangkat lunak ko.
-Sila laporkan ka [[Special:ListUsers/sysop|Pengurus]], dengan manandokan alamat URL nan dituju.',
+Jikok bukan iko panyababnyo, Sanak mungkin alah manamukan sabuah bug dalam pakakeh lunak.
+Silakan laporkan hal iko ka [[Special:ListUsers/sysop|Pangurus]], dangan manyabuikkan alamaik URL nan dituju.',
 'missingarticle-rev' => '(revisi#: $1)',
 'missingarticle-diff' => '(Bedo: $1, $2)',
 'readonly_lag' => 'Basis data alah dikunci otomatis salagi basis data sakunder malakukan sinkronisasi jo basis data utamo',
@@ -378,7 +378,7 @@ Mungkin alah dihapuih jo urang lain.',
 'perfcachedts' => 'Data barikut iko diambiak dari singgahan dan tarakhir dipabaharui pado $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => 'Pamutakhiran dari laman iko sadang dimatian. Data nan ado di siko saat iko indak akan dimuaik ulang.',
 'wrong_wfQuery_params' => 'Parameter salah ka wfQuery()<br />Fungsi: $1<br />Pamintaan: $2',
-'viewsource' => 'Lihek sumber',
+'viewsource' => 'Caliak sumber',
 'viewsource-title' => 'Caliak sumber untuak $1',
 'actionthrottled' => 'Tindakan dibatasi',
 'actionthrottledtext' => 'Anda dibatasi untuak malakuan tindakan iko talalu banyak dalam waktu singkek. Sila mancubo laik satalah bara menit.',
@@ -663,12 +663,11 @@ Jiko awak indak sangajo sampai ka laman ko, klik tombol '''back''' pado penjelaj
 'anontalkpagetext' => "----''Iko adolah laman pambicaraan saurang pangguno anonim nan alun mambuek akun atau indak manggunoannyo.
 Jadi, kami tapaso harus mamakai alamat IP nan basangkutan untuak maidentifikasikannyo.
 Jikok Sanak adolah saurang pangguno anonim dan marasa mandapekkan komentar-komentar nan indak relevan nan ditujuan langsung kapado Sanak, sila [[Special:UserLogin/signup|mambuek akun]] atau [[Special:UserLogin|masuak log]] untuak mahindari karancuan jo pangguno anonim lainnya di lain wakatu.''",
-'noarticletext' => 'Kini ko indak ado teks dalam laman ko.
-Awak dapek [[Special:Search/{{PAGENAME}}|mancari judul laman ko]] pado laman lain,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log nan bakaik],
-atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} suntiang laman ko]</span>.',
+'noarticletext' => 'Kini ko indak ada teks di laman iko.
+Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancarian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
 'noarticletext-nopermission' => 'Kini ko indak ado teks dalam laman iko.
-Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancaharian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancahari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
+
+Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancahari untuak judul laman iko]] di laman lain, atau <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancahari log takaik] </span>, tapi Sanak indak punyo izin untuak mambuek laman iko.',
 'missing-revision' => 'Revisi $1 di halaman ko nan banamo "{{PAGENAME}}" indak ado.
 
 Hal iko biasonyo disababkan dek pranala sajarah nan alah kadaluarsa ka halaman ko nan alah dihapuih.
@@ -693,8 +692,8 @@ Pratayang iko alun disimpan!'''",
 'userinvalidcssjstitle' => "'''Paringatan:''' Kulik \"\$1\" indak ditamuan. Harap diingek bahawa laman .css dan .js manggunokan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannyo {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dipabaharui)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Iko hanyo tampilan pratonton.'''
-Parubahan yang awak lakukan alun disimpan!",
+'previewnote' => "'''Ingek bahasonyo iko hanyo pratonton'''
+Parubahan Sanak alun disimpan!",
 'continue-editing' => 'Pai ka area mangedit.',
 'previewconflict' => 'Pratayang iko mancaminan teks pado bagian ateh kotak suntiangan teks sabagaimano akan taliek bilo Sanak manyimpannyo.',
 'session_fail_preview' => "'''Maaf, kami ndak dapek mangolah suntiangan Sanak akibat tahapuihnyo data sesi.
@@ -793,9 +792,9 @@ Uraian-uraian tu alah diabaikan.',
 # History pages
 'viewpagelogs' => 'Lihek log untuak laman ko',
 'currentrev-asof' => 'Revisi terkini pado $1',
-'revisionasof' => 'Revisi per $1',
+'revisionasof' => 'Pabaikkan per $1',
 'revision-info' => 'Revisi sajak $1 dek $2',
-'previousrevision' => '← Revisi sabalunnyo',
+'previousrevision' => '← Pabaikkan sabalunnyo',
 'nextrevision' => 'Revisi selanjutnyo →',
 'currentrevisionlink' => 'Revisi terkini',
 'cur' => 'kini',
@@ -813,17 +812,17 @@ Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''
 # Revision deletion
 'rev-delundel' => 'tampilkan/suruakkan',
 'revdel-restore' => 'Ganti tampilan',
-'revdel-restore-deleted' => 'revisi nan lah tahapuih',
+'revdel-restore-deleted' => 'suntiangan nan alah dihapuih',
 'revdel-restore-visible' => 'tampilan revisi',
 
 # Merge log
-'revertmerge' => 'Batal bergabung',
+'revertmerge' => 'Bata bagabuang',
 
 # Diffs
-'history-title' => 'Riwayat revisi dari "$1"',
+'history-title' => 'Riwayaik pabaiakkan dari "$1"',
 'lineno' => 'Barih $1:',
 'compareselectedversions' => 'Bandingkan revisi pilihan',
-'editundo' => 'batalkan',
+'editundo' => 'batalan',
 'diff-multi' => '({{PLURAL:$1|ciek |$1 revisi antaro}} oleh {{PLURAL:$2|ciek|$2 pangguno}} indak ditampilkan)',
 
 # Search results
@@ -834,34 +833,34 @@ Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''
 'searchsubtitleinvalid' => "Awak mancari '''$1'''",
 'notitlematches' => 'Indak ado judul nan pas',
 'notextmatches' => 'Indak ado judul nan pas',
-'prevn' => 'sabalunnyo {{PLURAL:$1|$1}}',
-'nextn' => 'salanjuiknyo {{PLURAL:$1|$1}}',
-'prevn-title' => 'Sabalunnyo $1 {{PLURAL:$1|hasil|hasil}}',
-'nextn-title' => 'Barikuiknyo $1 {{PLURAL:$1|hasil|hasil}}',
-'shown-title' => '↓ Tampilkan $1 {{PLURAL:$1|hasil|hasil}} per lama',
-'viewprevnext' => 'Tampilkan ($1 {{int:pipe-separator}} $2) ($3)',
+'prevn' => '{{PLURAL:$1|$1}} sabalunnyo',
+'nextn' => '{{PLURAL:$1|$1}} salanjuknyo',
+'prevn-title' => '$1 {{PLURAL:$1|hasil|hasil}} sabalunnyo',
+'nextn-title' => '$1 {{PLURAL:$1|hasil|hasil}} salanjuknyo',
+'shown-title' => 'Caliakkan $1 {{PLURAL:$1|hasil|hasil}} per laman',
+'viewprevnext' => 'Caliakkan ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
 'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
-'searchprofile-articles' => 'Artikel',
-'searchprofile-project' => '↓ Laman Bantuan dan Proyek',
-'searchprofile-images' => '↓ Multimedia',
-'searchprofile-everything' => '↓ Sadonyo',
-'searchprofile-advanced' => 'Lanjuikan',
-'searchprofile-articles-tooltip' => '↓ Cari di $1',
+'searchprofile-articles' => 'Laman isi',
+'searchprofile-project' => 'Laman Bantuan jo Proyek',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Sadonyo',
+'searchprofile-advanced' => 'Lanjukkan',
+'searchprofile-articles-tooltip' => 'Cari di $1',
 'searchprofile-project-tooltip' => 'Cari di $1',
-'searchprofile-images-tooltip' => '↓ Cari untuak berkas',
-'searchprofile-everything-tooltip' => '↓ Cari sadoalahnyo (tamasuak laman maota)',
-'searchprofile-advanced-tooltip' => 'Pacaharian di ruang namo tatantu',
+'searchprofile-images-tooltip' => 'Cari untuak berkas',
+'searchprofile-everything-tooltip' => 'Cari sadoalahnyo (tamasuak laman maota)',
+'searchprofile-advanced-tooltip' => 'Pacarian di ruang namo tatantu',
 'search-result-size' => '$1 ({{PLURAL:$2|1 kato|$2 kato}})',
 'search-result-category-size' => '{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})',
-'search-redirect' => '(pengalihan $1)',
+'search-redirect' => '(pangaliahan $1)',
 'search-section' => '(bagian $1)',
 'search-suggest' => 'Mungkin maksud awak: $1',
 'search-interwiki-caption' => 'Proyek badunsanak',
 'search-interwiki-default' => 'Hasil $1:',
 'search-interwiki-more' => '(selanjutnyo)',
 'searchrelated' => 'bakaitan',
-'searchall' => 'Sadonyo',
+'searchall' => 'sado',
 'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1''' dari '''$3'''|Hasil '''$1 - $2''' dari '''$3'''}} untuak '''$4'''",
 'nonefound' => "'''Catatan''': hanyo babarapo ruangnamo yang dicari sacaro default.
 Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasuak laman ota, templat, dll), atau gunoan ruangnamo yang diinginkan sabagai awalan.",
@@ -874,7 +873,7 @@ Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasua
 
 # Preferences page
 'preferences' => 'Preferensi',
-'mypreferences' => 'Preferensi den',
+'mypreferences' => 'Preferensi',
 'prefs-beta' => 'Corak Beta',
 'prefs-labs' => 'Corak Uji',
 'youremail' => 'Surek Elektronik:',
@@ -914,8 +913,8 @@ Alamaik surek elektronik awak ang tu indak kan katahuan dek urang lain nan mangh
 'rcshowhidepatr' => '$1 suntiangan nan tajago',
 'rcshowhidemine' => '$1 suntingan denai',
 'rclinks' => 'Tampilkan $1 parubahan baru dalam $2 hari terakhir<br />$3',
-'diff' => 'beda',
-'hist' => 'versi',
+'diff' => 'bedo',
+'hist' => 'sajarah',
 'hide' => 'Suruakkan',
 'show' => 'Tampilkan',
 'minoreditletter' => 'k',
@@ -926,16 +925,16 @@ Alamaik surek elektronik awak ang tu indak kan katahuan dek urang lain nan mangh
 
 # Recent changes linked
 'recentchangeslinked' => 'Parubahan takaik',
-'recentchangeslinked-toolbox' => '↓ Parubahan takaik',
+'recentchangeslinked-toolbox' => 'Parubahan takaik',
 'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
 'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
-'recentchangeslinked-summary' => "Iko adolah senarai parubahan terakhir pado laman yang takaik jo laman tartantu (atau pado kalompok kategori tartantu).
-Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
+'recentchangeslinked-summary' => "Iko adolah daftar parubahan tarakhir pado laman nan tahubuang dari laman tatantu (atau anggota dari suatu kategori tatantu).
+Halaman pada [[Special:Watchlist|your watchlist]] ditondai dangan '''cetak taba''",
 'recentchangeslinked-page' => 'Namo laman:',
 'recentchangeslinked-to' => 'Tampilkan parubahan dari laman yang takaik jo laman yang disajikan',
 
 # Upload
-'upload' => 'Unggah berkas',
+'upload' => 'Muek berkas',
 'uploadlogpage' => 'Log unggah',
 'filedesc' => 'Ringkasan',
 'uploadedimage' => 'unggah "[[$1]]"',
@@ -945,7 +944,7 @@ Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
 
 # File description page
 'file-anchor-link' => 'Berkas',
-'filehist' => 'Riwayat berkas',
+'filehist' => 'Riwayaik berkas',
 'filehist-help' => 'Klik pado tanggal/waktu untuak malihek berkas pado maso tu',
 'filehist-revert' => 'kembalikan',
 'filehist-current' => 'kini ko',
@@ -955,7 +954,7 @@ Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
 'filehist-user' => 'Pangguno',
 'filehist-dimensions' => 'Dimensi',
 'filehist-comment' => 'Ulasan',
-'imagelinks' => 'Pranala berkas',
+'imagelinks' => 'Panggunoan berkas',
 'linkstoimage' => 'Berikut ko ado {{PLURAL:$1|laman nan takaik|$1 laman nan takaik}} jo berkas ko:',
 'nolinkstoimage' => 'Indak ado laman nan ado batauik ka berkas ko.',
 'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan oleh berbagai proyek lain.',
@@ -964,7 +963,7 @@ Deskripsi dari [$2 laman deskripsi berkas] ditampilkan di bawah.',
 'uploadnewversion-linktext' => 'Unggah versi baru dari berkas ko',
 
 # Random page
-'randompage' => '↓ Laman sumbarang',
+'randompage' => 'Laman sambarangan',
 
 # Statistics
 'statistics' => 'Statistik',
@@ -975,7 +974,7 @@ Deskripsi dari [$2 laman deskripsi berkas] ditampilkan di bawah.',
 'nbytes' => '$1 {{PLURAL:$1|bait|bait}}',
 'nmembers' => '$1 {{PLURAL:$1|anggota|anggota}}',
 'prefixindex' => 'Semua laman jo awalan',
-'usercreated' => 'Dibuek pado $1 waktu $2',
+'usercreated' => '{{GENDER:$3|Dibuek}} pado $1 pukua $2',
 'newpages' => 'Laman baru',
 'move' => 'Pindahkan',
 'movethispage' => 'Pindahkan laman ko',
@@ -1017,7 +1016,7 @@ Deskripsi dari [$2 laman deskripsi berkas] ditampilkan di bawah.',
 
 # Watchlist
 'watchlist' => 'Senarai pantauan denai',
-'mywatchlist' => 'Senarai pantauan den',
+'mywatchlist' => 'Daftar pantauan denai',
 'watchlistfor2' => 'Untuak $1 $2',
 'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|senarai pantauan awak]].
 Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba''' pado [[Special:RecentChanges|senarai parubahan]] agar lebih mudah manjagonyo.",
@@ -1074,8 +1073,8 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'restriction-level' => 'Tingkek larangan:',
 
 # Undelete
-'undeletelink' => 'tampilkan/pulihkan',
-'undeleteviewlink' => 'liek',
+'undeletelink' => 'caliak/cegakkan',
+'undeleteviewlink' => 'caliak',
 
 # Namespace form on various pages
 'namespace' => 'Ruangnamo:',
@@ -1116,17 +1115,17 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'whatlinkshere-hideredirs' => '$1 pengalihan',
 'whatlinkshere-hidetrans' => '$1 transklusi',
 'whatlinkshere-hidelinks' => '$1 pranala',
-'whatlinkshere-hideimages' => '$1 pahubuang gambar',
+'whatlinkshere-hideimages' => '$1 pahubuang berkas',
 'whatlinkshere-filters' => 'Penapis',
 
 # Block/unblock
 'blockip' => 'Blokir pangguno',
 'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,salamonyo:infinite',
 'ipblocklist' => 'Pangguno tablokir',
-'blocklink' => 'blokir',
-'unblocklink' => 'hilangkan blokir',
-'change-blocklink' => 'ubah blokir',
-'contribslink' => 'kontrib',
+'blocklink' => 'balokir',
+'unblocklink' => 'hilangkan balokir',
+'change-blocklink' => 'ubah balokir',
+'contribslink' => 'jariah',
 'blocklogpage' => 'Log pemblokiran',
 'blocklogentry' => 'memblokir [[$1]] dalam maso berlaku $2 $3',
 'unblocklogentry' => 'mahilangkan blokir $1',
@@ -1156,7 +1155,7 @@ Dalam kasus tu, apobilo diinginkan, awak dapek mamindahkan atau manggabuangkan l
 'movetalk' => 'Pindahkan laman ota yang takaik',
 'movelogpage' => 'Log pemindahan',
 'movereason' => 'Alasan:',
-'revertmove' => 'kembalikan',
+'revertmove' => 'baliakkan',
 
 # Export
 'export' => 'Ekspor laman',
@@ -1170,46 +1169,46 @@ Dalam kasus tu, apobilo diinginkan, awak dapek mamindahkan atau manggabuangkan l
 'thumbnail_error' => 'Gagal mambuek thumbnail : $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Halaman pangguno awak',
-'tooltip-pt-mytalk' => 'Halaman ota awak',
+'tooltip-pt-userpage' => 'Laman pangguno sanak',
+'tooltip-pt-mytalk' => 'Laman ota sanak',
 'tooltip-pt-preferences' => 'Preferensi denai',
-'tooltip-pt-watchlist' => 'Senarai laman nan denai pantau',
-'tooltip-pt-mycontris' => 'Senarai jariah denai',
-'tooltip-pt-login' => 'Awak disarankan untuak masuak log; meskipun, hal tu indak diwajibkan',
+'tooltip-pt-watchlist' => 'Daftar laman nan denai pantau.',
+'tooltip-pt-mycontris' => 'Daftar jariah Sanak',
+'tooltip-pt-login' => 'Sanak disarankan untuak masuak log; musiki, hal tu indak diwajibkan',
 'tooltip-pt-logout' => 'Kalua log',
-'tooltip-ca-talk' => 'Pembicaraan tentang isi halaman',
-'tooltip-ca-edit' => 'Awak buliah suntiang laman ko. Gunokan tombol pratonton sabalun manyimpan',
+'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
+'tooltip-ca-edit' => 'Sanak dapek manyuntiang laman iko. Silakan gunokan tombol pratonton sabalun manyimpan',
 'tooltip-ca-addsection' => 'Mulai bagian baru',
 'tooltip-ca-viewsource' => 'Laman ko dilinduangi.
-Awak hanyo buliah lihek sumber se',
-'tooltip-ca-history' => 'Revisi sabalunnyo laman ko',
+Sanak hanyo buliah lihek sumbernyo sajo',
+'tooltip-ca-history' => 'Pabaiakkan sabalunnyo dari laman ko',
 'tooltip-ca-protect' => 'Lindungi laman ko',
 'tooltip-ca-delete' => 'Hapuih laman iko',
 'tooltip-ca-move' => 'Pindahkan laman ko',
-'tooltip-ca-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
+'tooltip-ca-watch' => 'Tambahkan laman ko ka daftar pantauan sanak',
 'tooltip-ca-unwatch' => 'Kaluaan laman ko dari senarai pantauan awak',
 'tooltip-search' => 'Cari {{SITENAME}}',
 'tooltip-search-go' => 'Cari suatu laman dengan namo yang samo jiko tasadio',
-'tooltip-search-fulltext' => 'Cari halaman nan mamuek teks ko',
-'tooltip-p-logo' => '↓ Kunjungi laman utamo',
-'tooltip-n-mainpage' => 'Kunjungi Halaman Utamo',
-'tooltip-n-mainpage-description' => 'Kunjungi halaman utamo',
-'tooltip-n-portal' => 'Tentang proyek, apo yang dapek awak lakukan, di mano mancari sasuatu',
-'tooltip-n-currentevents' => 'Temukan informasi latar dari peristiwa kini ko',
+'tooltip-search-fulltext' => 'Cari laman untuak teks iko',
+'tooltip-p-logo' => 'Kunjuangi laman utamo',
+'tooltip-n-mainpage' => 'Kunjuangi laman Utamo',
+'tooltip-n-mainpage-description' => 'Kunjuangi laman utamo',
+'tooltip-n-portal' => 'Tantang proyek, apa nan dapek Sanak lakukan, dima untuak manamukan sasuatu',
+'tooltip-n-currentevents' => 'Tamukan informasi manganai latar balakang kajadian kini ko',
 'tooltip-n-recentchanges' => 'Daftar panyuntiangan baru dalam wiki',
-'tooltip-n-randompage' => 'Tampilkan sembarang halaman',
+'tooltip-n-randompage' => 'Muek sambarang laman',
 'tooltip-n-help' => 'Tampek mancari bantuan',
-'tooltip-t-whatlinkshere' => 'Senarai sado halaman wiki yang punyo pranala ka halaman ko',
+'tooltip-t-whatlinkshere' => 'Daftar dari kasado laman wiki nan tahubuang kasiko',
 'tooltip-t-recentchangeslinked' => 'Parubahan baru halaman nan bakaik jo laman ko',
 'tooltip-feed-rss' => 'Umpan RSS untuak laman ko',
 'tooltip-feed-atom' => 'Umpan Atom untuak laman ko',
 'tooltip-t-contributions' => 'Lihek senarai jariah pangguno ko',
 'tooltip-t-emailuser' => 'Kirimkan e-mail ka pangguno ko',
-'tooltip-t-upload' => 'Unggah berkas',
-'tooltip-t-specialpages' => 'Sadoalah halaman istimewa',
-'tooltip-t-print' => 'Versi cetak halaman ko',
-'tooltip-t-permalink' => 'Pranala permanen untuak revisi laman ko',
-'tooltip-ca-nstab-main' => 'Lihek isi laman',
+'tooltip-t-upload' => 'Muek berkas',
+'tooltip-t-specialpages' => 'Daftar dari kasado laman istimewa',
+'tooltip-t-print' => 'Versi cetak dari laman ko',
+'tooltip-t-permalink' => 'Pranala parmanen untuak pabaiakkan laman ko',
+'tooltip-ca-nstab-main' => 'Caliak isi laman',
 'tooltip-ca-nstab-user' => 'Caliak laman pangguno',
 'tooltip-ca-nstab-special' => 'Iko adolah laman istimewa, awak indak buliah manyuntiangnyo',
 'tooltip-ca-nstab-project' => 'Lihek laman proyek',
@@ -1225,8 +1224,8 @@ Awak hanyo buliah lihek sumber se',
 'tooltip-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
 'tooltip-recreate' => 'Buek baliak laman walaupun sabananyo pernah dihapuih',
 'tooltip-upload' => 'Mulai mamuek',
-'tooltip-rollback' => '"Baliakkan" baraliah suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
-'tooltip-undo' => '"Indak jadi" suntiangan ko dibaliakkan dan mambuka kotak suntiang dalam mode pratonton. Alasan dapek ditambah pado kotak ringkasan.',
+'tooltip-rollback' => '"Baliakkan" uruangkan suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
+'tooltip-undo' => '"Batalan" uruangkan panyuntiangan iko jo mambukak bantuak suntiang dalam bantuak pratonton. Hal ko mamungkinkan manambahkan alasan pado kotak ringkasan.',
 'tooltip-preferences-save' => 'Simpan preferensi',
 'tooltip-summary' => 'Masuakan sabuah ringkasan pendek',
 
@@ -1244,11 +1243,11 @@ Awak hanyo buliah lihek sumber se',
 'show-big-image' => 'Resolusi penuh',
 
 # Bad image list
-'bad_image_list' => 'Formatnyo sabagai berikut:
+'bad_image_list' => 'Ukurannyo adolah sabagai barikuik:
 
-Hanyo butir senarai (barih diawali jo tando *) yang dihituang.
-Pranala partamo pado barih tu mesti bakaik ka berkas nan buruak.
-Pranala-pranala salanjuiknyo pado barih nan samo dianggap sabagai pengecualian, yaitu laman nan dapek manampilkan berkas tu.',
+Hanyo daftar butia (barih nan dimulai jo tando *) nan dianggap.
+Pranala patamo pado barih musiti pranala ka berkas buruak.
+Satiok pranala salanjuiknyo pado barih nan samo dianggap pangacualian, yaitu laman dima berkas tasabuik bisa tajadi sajajar.',
 
 # Metadata
 'metadata' => 'Metadata',
index 8de89e8..2a1da2d 100644 (file)
@@ -192,7 +192,7 @@ $messages = array(
 'newwindow' => '(Motlapoāz cē yancuīc tlanexillōtl)',
 'cancel' => 'Ticcuepāz',
 'moredotdotdot' => 'Huehca ōmpa...',
-'mypage' => 'Nozāzanil',
+'mypage' => 'Noāmauh',
 'mytalk' => 'Notēixnāmiquiliz',
 'anontalk' => 'Inīn IP ītēixnāmiquiliz',
 'navigation' => 'Nènemòwalistli',
@@ -571,6 +571,8 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'revdelete-radio-set' => 'Quēmah',
 'revdelete-radio-unset' => 'Ahmo',
 'revdel-restore' => 'Ticpatlāz tlattaliztli',
+'revdel-restore-deleted' => 'tlapohpolōlli tlaceppahuilīztli',
+'revdel-restore-visible' => 'ittaloni tlaceppahuilīztli',
 'pagehist' => 'Zāzanilli tlahcuilōlloh',
 'deletedhist' => 'Ōtlapolo tlahcuilōlloh',
 'revdelete-edit-reasonlist' => 'Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa',
@@ -594,10 +596,12 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 
 # Search results
 'searchresults' => 'Tlatēmoliztli',
+'searchresults-title' => '«$1» tlatēmōliztli īmochīhualiz',
 'searchsubtitle' => 'Ōtictēmōz \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|mochīntīn zāzaniltin mopēhua īca "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|mochīntīn zāzaniltin tzonhuilia "$1" īhuīc]])',
 'searchsubtitleinvalid' => "Ōtictēmo '''$1'''",
 'prevn' => '{{PLURAL:$1|$1}} achtopa',
 'nextn' => 'niman {{PLURAL:$1|$1}}',
+'shown-title' => 'Quinēxiltīz $1 {{PLURAL:$|mochīhualiztli}} cece āmac',
 'viewprevnext' => 'Xiquintta ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Ye ia zāzanilli ītōca \"[[\$1]]\" inīn huiquipan'''",
 'searchmenu-new' => "'''Tihuelīti ticchīhuāz zāzanilli ītōca \"[[:\$1]]\" inīn huiquipan'''",
@@ -766,6 +770,8 @@ Intlā ticnequi, tlācah quimatīzqueh motequi.',
 'recentchanges' => 'Yancuīc tlapatlaliztli',
 'recentchanges-legend' => 'Yancuīc tlapatlaliztechcopa tlanequiliztli',
 'recentchanges-summary' => 'Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.',
+'recentchanges-label-newpage' => 'Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl',
+'recentchanges-label-minor' => 'Inīn tlapatlaliztli tepitōn',
 'rcnote' => "Nicān {{PLURAL:$1|cah '''1''' tlapatlaliaztli|cateh in xōcoyōc '''$1''' tlapatlaliztli}} īpan xōcoyōc {{PLURAL:$2|tōnalli|'''$2''' tōnaltin}} īhuīcpa $5, $4.",
 'rclistfrom' => 'Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1',
 'rcshowhideminor' => '$1 tlapatlalitzintli',
@@ -995,6 +1001,7 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 'linksearch' => 'Calān tzonhuiliztli tlatemoliztli',
 'linksearch-ns' => 'Tōcātzin:',
 'linksearch-ok' => 'Tictēmōz',
+'linksearch-line' => '$1 tzonhuīlo īxquichca $2',
 
 # Special:ListUsers
 'listusers-submit' => 'Tiquittāz',
@@ -1172,12 +1179,14 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'ipb-unblock-addr' => 'Ahtiquitzacuilīz $1',
 'ipb-unblock' => 'Ahtiquitzacuilīz IP nozo tlatequitiltilīlli',
 'unblockip' => 'Ahtiquitzacuilīz tlatequitiltilīlli',
+'ipblocklist' => 'Tlatequitiltilīltzacualli',
 'ipblocklist-submit' => 'Tlatēmōz',
 'infiniteblock' => 'ahtlamic',
 'expiringblock' => 'tlami īpan $1 īpan $2',
 'anononlyblock' => 'zan ahtōcā',
 'blocklink' => 'tiquitzacuilīz',
 'unblocklink' => 'ahtiquitzacuilīz',
+'change-blocklink' => 'Ticpatlaz tlatzacualli',
 'contribslink' => 'tlapatlaliztli',
 'blocklogpage' => 'Tlatequitiltilīlli ōmotzacuili',
 'blockme' => 'Timitzcuilīz',
@@ -1274,6 +1283,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'tooltip-ca-unwatch' => 'Ahtictlachiyāz inīn zāzanilli',
 'tooltip-search' => 'Tlatēmōz īpan {{SITENAME}}',
 'tooltip-search-go' => 'Tiyaz in zāzanilhuīc īca inīn huel melāhuac tōcaitl intlā yez',
+'tooltip-search-fulltext' => 'Tictemōz inīn tlahcuilōlli in āmac',
 'tooltip-p-logo' => 'Calīxatl',
 'tooltip-n-mainpage' => 'Tiquittaz in calīxatl',
 'tooltip-n-mainpage-description' => 'Tiquittaz in calīxatl',
@@ -1306,6 +1316,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'tooltip-compareselectedversions' => 'Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.',
 'tooltip-watch' => 'Ticcēntilīz inīn zāzanilli motlachiyalizhuīc',
 'tooltip-upload' => 'Ticpēhua quetzaliztli',
+'tooltip-summary' => 'Xicaquilia tepitōn tlahcuilōltōntli',
 
 # Attribution
 'anonymous' => 'Ahtōcāitl {{PLURAL:$1|tlatequitiltilīlli|tlatequitiltilīlli}} īpan {{SITENAME}}',
index b2c8ce9..227d575 100644 (file)
@@ -2876,7 +2876,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'markedaspatrollederrortext' => 'A venta che a spessìfica che version che a veul marchè coma verificà.',
 'markedaspatrollederror-noautopatrol' => "A l'ha nen ël përmess dë marchesse soe modìfiche coma «controlà».",
 'markedaspatrollednotify' => "Ës cambi a $1 a l'é stàit marcà com verificà.",
-'markedaspatrollederrornotify' => 'Marcagi com verificà falì.',
+'markedaspatrollederrornotify' => 'Marcadura com verificà falìa.',
 
 # Patrol log
 'patrol-log-page' => 'Registr dij contròj',
@@ -3472,8 +3472,8 @@ Për piasì, che an conferma che da bon a veul torna creélo.",
 # Multipage image navigation
 'imgmultipageprev' => '← pàgina andré',
 'imgmultipagenext' => 'pàgina anans →',
-'imgmultigo' => 'Va',
-'imgmultigoto' => ' a la pàgina $1',
+'imgmultigo' => 'Andé!',
+'imgmultigoto' => 'Andé a la pàgina $1',
 
 # Table pager
 'ascending_abbrev' => 'a chërse',
index bb01925..395a70d 100644 (file)
@@ -12,6 +12,8 @@
  * @author Umherirrender
  */
 
+$rtl = true;
+
 $namespaceNames = array(
        NS_MEDIA            => 'رسنۍ',
        NS_SPECIAL          => 'ځانګړی',
@@ -155,8 +157,6 @@ $magicWords = array(
        'protectionlevel'           => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
 );
 
-$rtl = true;
-
 $messages = array(
 # User preference toggles
 'tog-underline' => 'کرښنې تړنې:',
index 2f35284..974dcc2 100644 (file)
@@ -3255,6 +3255,8 @@ The wiki server can't provide data in a format your client can read.",
 'markedaspatrollederror' => 'Неможливо позначити як перевірену',
 'markedaspatrollederrortext' => 'Ви повинні зазначити версію, яка буде позначена як перевірена.',
 'markedaspatrollederror-noautopatrol' => 'Вам не дозволено позначати власні редагування як перевірені.',
+'markedaspatrollednotify' => 'Цю зміну у «$1» було позначено як відпатрульовану.',
+'markedaspatrollederrornotify' => 'Не вдалося поставити позначку про патрулювання.',
 
 # Patrol log
 'patrol-log-page' => 'Журнал патрулювання',
@@ -4315,4 +4317,6 @@ MediaWiki поширюється в надії, що вона буде кори
 'duration-centuries' => '$1 {{PLURAL:$1|століття|століття|століть}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тисячоліття|тисячоліття|тисячоліть}}',
 
+# Unknown messages
+'mytalk-parenthetical' => 'обговорення',
 );
index 4911b5c..f01686d 100644 (file)
@@ -469,7 +469,7 @@ $messages = array(
 'listingcontinuesabbrev' => '续',
 'index-category' => '允许索引的页面',
 'noindex-category' => '禁止索引的页面',
-'broken-file-category' => '损坏的文件的链接的页面',
+'broken-file-category' => '包含损坏的文件链接的页面',
 
 'about' => '关于',
 'article' => '内容页面',
@@ -2067,7 +2067,7 @@ $1',
 'mostlinkedtemplates' => '最多链接模板',
 'mostcategories' => '最多分类页面',
 'mostimages' => '最多链接文件',
-'mostinterwikis' => '跨语言链接最多的页面',
+'mostinterwikis' => '最多跨语言链接页面',
 'mostrevisions' => '最多版本页面',
 'prefixindex' => '所有有前缀的页面',
 'prefixindex-namespace' => '所有有前缀的页面($1名字空间)',
index f368435..f238188 100644 (file)
@@ -336,7 +336,7 @@ $messages = array(
 'listingcontinuesabbrev' => '續',
 'index-category' => '已做索引的頁面',
 'noindex-category' => '未做索引的頁面',
-'broken-file-category' => '有連結至已損壞檔案頁的連結之頁面',
+'broken-file-category' => '包含損壞的檔案連結的頁面',
 
 'about' => '關於',
 'article' => '內容頁面',
old mode 100755 (executable)
new mode 100644 (file)
index f37af77..3539689
@@ -1,52 +1,52 @@
-<?php\r
-/**\r
- * Remove hidden preferences from the database.\r
- *\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License along\r
- * with this program; if not, write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- * http://www.gnu.org/copyleft/gpl.html\r
- *\r
- * @file\r
- * @author TyA <tya.wiki@gmail.com>\r
- * @see [[bugzilla:30976]]\r
- * @ingroup Maintenance\r
- */\r
-\r
-require_once( __DIR__ . '/Maintenance.php' );\r
-\r
-/**\r
- * Maintenance script that removes hidden preferences from the database.\r
- *\r
- * @ingroup Maintenance\r
- */\r
-class CleanupPreferences extends Maintenance {\r
-       public function execute() {\r
-               global $wgHiddenPrefs;\r
-\r
-               $dbw = wfGetDB( DB_MASTER );\r
-               $dbw->begin();\r
-               foreach( $wgHiddenPrefs as $item ) {\r
-                       $dbw->delete(\r
-                               'user_properties',\r
-                               array( 'up_property' => $item ),\r
-                               __METHOD__\r
-                       );\r
-               };\r
-               $dbw->commit();\r
-               $this->output( "Finished!\n" );\r
-       }\r
-}\r
-\r
-$maintClass = 'CleanupPreferences'; // Tells it to run the class\r
-require_once( RUN_MAINTENANCE_IF_MAIN );\r
+<?php
+/**
+ * Remove hidden preferences from the database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author TyA <tya.wiki@gmail.com>
+ * @see [[bugzilla:30976]]
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that removes hidden preferences from the database.
+ *
+ * @ingroup Maintenance
+ */
+class CleanupPreferences extends Maintenance {
+       public function execute() {
+               global $wgHiddenPrefs;
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+               foreach( $wgHiddenPrefs as $item ) {
+                       $dbw->delete(
+                               'user_properties',
+                               array( 'up_property' => $item ),
+                               __METHOD__
+                       );
+               };
+               $dbw->commit();
+               $this->output( "Finished!\n" );
+       }
+}
+
+$maintClass = 'CleanupPreferences'; // Tells it to run the class
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 875b93d..d8480f3 100644 (file)
@@ -81,17 +81,19 @@ class nextJobDB extends Maintenance {
                        $candidates = array_values( $candidates );
                        $db = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
                        if ( !$this->checkJob( $type, $db ) ) {
-                               // This job is not available in the current database. Remove it from
-                               // the cache.
                                if ( $type === false ) {
+                                       // There are no jobs available in the current database
                                        foreach ( $pendingDBs as $type2 => $dbs ) {
                                                $pendingDBs[$type2] = array_diff( $pendingDBs[$type2], array( $db ) );
                                        }
                                } else {
+                                       // There are no jobs of this type available in the current database
                                        $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
                                }
-
-                               $wgMemc->set( $memcKey, $pendingDBs, 300 );
+                               // Update the cache to remove the outdated information
+                               $pendingDbInfo['pendingDBs'] = $pendingDBs;
+                               // @TODO: fix race condition with these updates
+                               $wgMemc->set( $memcKey, $pendingDbInfo );
                                $again = true;
                        }
                } while ( $again );
diff --git a/maintenance/postgres/archives/patch-ipb_address_unique.sql b/maintenance/postgres/archives/patch-ipb_address_unique.sql
deleted file mode 100644 (file)
index e69de29..0000000
index 75dc2b9..f2b98f0 100644 (file)
                                // This is a side-effect of limiting after the fact.
                                if ( res.trimmed === true ) {
                                        this.value = res.newVal;
-                                       prevSafeVal = res.newVal;
                                }
+                               // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
+                               // trimValForByteLength to compare the new value to an empty string instead of the
+                               // old value, resulting in trimming always from the end (bug 40850).
+                               prevSafeVal = res.newVal;
                        } );
                } );
        };
index a98e584..94cad84 100644 (file)
@@ -787,6 +787,17 @@ And a <a href="/wiki/Main_Page" title="Main Page">link</a>
 </pre>
 !! end
 
+!! test
+Ident preformatting with inline content
+!! input
+ a
+ ''b''
+!! result
+<pre>a
+<i>b</i>
+</pre>
+!! end
+
 !! test
 <pre> with <nowiki> inside (compatibility with 1.6 and earlier)
 !! input
@@ -2795,6 +2806,42 @@ Template-generated table cell attributes and cell content
 
 !! end
 
+!! test
+Table with row followed by newlines and table heading
+!! input
+{|
+|-
+
+! foo
+|}
+!! result
+<table>
+
+
+<tr>
+<th> foo
+</th></tr></table>
+
+!! end
+
+# FIXME: Preserve the attribute properly (with an empty string as value) in
+# the PHP parser. Parsoid implements the behavior below.
+!! test
+Table attributes with empty value
+!! options
+disabled
+!! input
+{|
+| style=| hello
+|}
+!! result
+<table>
+<tr>
+<td style=""> hello
+</td></tr></table>
+
+!! end
+
 ###
 ### Internal links
 ###
@@ -7051,6 +7098,37 @@ div with illegal double attributes
 
 !!end
 
+# FIXME: produce empty string instead of "class" in the PHP parser, following
+# the HTML5 spec.
+!! test
+div with empty attribute value, space before equals
+!! options
+disabled
+!! input
+<div class =>HTML rocks</div>
+!! result
+<div class="">HTML rocks</div>
+
+!! end
+
+# This it very inconsistent in the PHP parser: it returns 
+# class="class" if there is a space between the name and the equal sign (see
+# 'div with empty attribute value, space before equals'), but strips the
+# attribute completely if the space is missing. We hope that not much content
+# depends on this, so are implementing the behavior below in Parsoid for
+# consistencies' sake. Disabled for the PHP parser. 
+# FIXME: fix this behavior in the PHP parser?
+!! test
+div with empty attribute value, no space before equals
+!! options
+disabled
+!! input
+<div class=>HTML rocks</div>
+!! result
+<div class="">HTML rocks</div>
+
+!! end
+
 !! test
 HTML multiple attributes correction
 !! input
index 624cf49..a95ab85 100644 (file)
@@ -196,4 +196,153 @@ class ApiEditPageTest extends ApiTestCase {
        function testUndo() {
                $this->markTestIncomplete( "not yet implemented" );
        }
+
+       function testEditConflict() {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditConflict_$count";
+               $title = Title::newFromText( $name );
+
+               $page = WikiPage::factory( $title );
+
+               // base edit
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+               $baseTime = $page->getRevision()->getTimestamp();
+
+               // conflicting edit
+               $page->doEditContent( new WikitextContent( "Foo bar" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $page, '20120101020202' );
+
+               // try to save edit, expect conflict
+               try {
+                       list( $re,, ) = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'text' => 'nix bar!',
+                               'basetimestamp' => $baseTime,
+                               ), null, self::$users['sysop']->user );
+
+                       $this->fail( 'edit conflict expected' );
+               } catch ( UsageException $ex ) {
+                       $this->assertEquals( 'editconflict', $ex->getCodeString() );
+               }
+       }
+
+       function testEditConflict_redirect() {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditConflict_redirect_$count";
+               $title = Title::newFromText( $name );
+               $page = WikiPage::factory( $title );
+
+               $rname = "Help:ApiEditPageTest_testEditConflict_redirect_r$count";
+               $rtitle = Title::newFromText( $rname );
+               $rpage = WikiPage::factory( $rtitle );
+
+               // base edit for content
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+               $baseTime = $page->getRevision()->getTimestamp();
+
+               // base edit for redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $rpage, '20120101000000' );
+
+               // conflicting edit to redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]\n\n[[Category:Test]]" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $rpage, '20120101020202' );
+
+               // try to save edit; should work, because we follow the redirect
+               list( $re,, ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $rname,
+                       'text' => 'nix bar!',
+                       'basetimestamp' => $baseTime,
+                       'redirect' => true,
+               ), null, self::$users['sysop']->user );
+
+               $this->assertEquals( 'Success', $re['edit']['result'],
+                       "no edit conflict expected when following redirect" );
+
+               // try again, without following the redirect. Should fail.
+               try {
+                       list( $re,, ) = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $rname,
+                               'text' => 'nix bar!',
+                               'basetimestamp' => $baseTime,
+                       ), null, self::$users['sysop']->user );
+
+                       $this->fail( 'edit conflict expected' );
+               } catch ( UsageException $ex ) {
+                       $this->assertEquals( 'editconflict', $ex->getCodeString() );
+               }
+       }
+
+       function testEditConflict_bug41990() {
+               static $count = 0;
+               $count++;
+
+               /*
+               * bug 41990: if the target page has a newer revision than the redirect, then editing the
+               * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erronously
+               * caused an edit conflict to be detected.
+               */
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_$count";
+               $title = Title::newFromText( $name );
+               $page = WikiPage::factory( $title );
+
+               $rname = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_r$count";
+               $rtitle = Title::newFromText( $rname );
+               $rpage = WikiPage::factory( $rtitle );
+
+               // base edit for content
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+
+               // base edit for redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $rpage, '20120101000000' );
+               $baseTime = $rpage->getRevision()->getTimestamp();
+
+               // new edit to content
+               $page->doEditContent( new WikitextContent( "Foo bar" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $rpage, '20120101020202' );
+
+               // try to save edit; should work, following the redirect.
+               list( $re,, ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $rname,
+                       'text' => 'nix bar!',
+                       'redirect' => true,
+               ), null, self::$users['sysop']->user );
+
+               $this->assertEquals( 'Success', $re['edit']['result'],
+                       "no edit conflict expected here" );
+       }
+
+       protected function forceRevisionDate( WikiPage $page, $timestamp ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->update( 'revision',
+                       array( 'rev_timestamp' => $timestamp ),
+                       array( 'rev_id' => $page->getLatest() ) );
+
+               $page->clear();
+       }
 }
diff --git a/tests/phpunit/includes/api/ApiQueryRevisionsTest.php b/tests/phpunit/includes/api/ApiQueryRevisionsTest.php
new file mode 100644 (file)
index 0000000..28dcb97
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ */
+class ApiQueryRevisionsTest extends ApiTestCase {
+
+       /**
+        * @group medium
+        */
+       function testContentComesWithContentModelAndFormat() {
+
+               $pageName = 'Help:' . __METHOD__ ;
+               $title = Title::newFromText( $pageName );
+               $page = WikiPage::factory( $title );
+               $page->doEdit( 'Some text', 'inserting content' );
+
+               $apiResult = $this->doApiRequest( array(
+                       'action' => 'query',
+                       'prop' => 'revisions',
+                       'titles' => $pageName,
+                       'rvprop' => 'content',
+               ) );
+               $this->assertArrayHasKey( 'query', $apiResult[0] );
+               $this->assertArrayHasKey( 'pages', $apiResult[0]['query'] );
+               foreach( $apiResult[0]['query']['pages'] as $page ) {
+                       $this->assertArrayHasKey( 'revisions', $page );
+                       foreach( $page['revisions'] as $revision ) {
+                               $this->assertArrayHasKey( 'contentformat', $revision,
+                                       'contentformat should be included when asking content so'
+                                       . ' client knows how to interpretate it'
+                               );
+                               $this->assertArrayHasKey( 'contentmodel', $revision,
+                                       'contentmodel should be included when asking content so'
+                                       . ' client knows how to interpretate it'
+                               );
+                       }
+               }
+       }
+}
index 52e168b..dd03340 100644 (file)
@@ -5,7 +5,7 @@
  * @group Database
  *        ^--- needed, because we do need the database to test link updates
  */
-class TextContentTest extends MediaWikiTestCase {
+class TextContentTest extends MediaWikiLangTestCase {
        protected $context;
 
        protected function setUp() {
index e33ae01..603992e 100644 (file)
@@ -78,10 +78,18 @@ class TestORMRowTest extends ORMRowTest {
                                test_stuff                 BLOB                NOT NULL,
                                test_moarstuff             BLOB                NOT NULL,
                                test_time                  varbinary(14)       NOT NULL
-                       );'
+                       );',
+                       __METHOD__
                );
        }
 
+       protected function tearDown() {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->dropTable( 'orm_test', __METHOD__ );
+
+               parent::tearDown();
+       }
+
        public function constructorTestProvider() {
                return array(
                        array(
index 395e1a0..511166a 100644 (file)
@@ -4,7 +4,7 @@
  * @group Search
  * @group Database
  */
-class SearchEngineTest extends MediaWikiTestCase {
+class SearchEngineTest extends MediaWikiLangTestCase {
        protected $search, $pageList;
 
        /**
@@ -13,6 +13,7 @@ class SearchEngineTest extends MediaWikiTestCase {
         */
        protected function setUp() {
                parent::setUp();
+
                // Search tests require MySQL or SQLite with FTS
                # Get database type and version
                $dbType = $this->db->getType();
index 4fe6770..2990de2 100644 (file)
                $el.byteLimit();
        });
 
+       QUnit.test( 'Trim from insertion when limit exceeded', 2, function ( assert ) {
+               var $el;
+
+               // Use a new <input /> because the bug only occurs on the first time
+               // the limit it reached (bug 40850)
+               $el = $( '<input type="text"/>' )
+                       .appendTo( '#qunit-fixture' )
+                       .byteLimit( 3 )
+                       .val( 'abc' ).trigger( 'change' )
+                       .val( 'zabc' ).trigger( 'change' );
+
+               assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 0), not the end' );
+
+               $el = $( '<input type="text"/>' )
+                       .appendTo( '#qunit-fixture' )
+                       .byteLimit( 3 )
+                       .val( 'abc' ).trigger( 'change' )
+                       .val( 'azbc' ).trigger( 'change' );
+
+               assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 1), not the end' );
+       });
+
 }( jQuery, mediaWiki ) );
index 15fbf07..f1d5341 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -35,7 +35,7 @@ if ( defined( 'THUMB_HANDLER' ) ) {
        // Called from thumb_handler.php via 404; extract params from the URI...
        wfThumbHandle404();
 } else {
-       // Called directly, use $_REQUEST params
+       // Called directly, use $_GET params
        wfThumbHandleRequest();
 }
 
@@ -50,8 +50,8 @@ wfLogProfilingData();
  */
 function wfThumbHandleRequest() {
        $params = get_magic_quotes_gpc()
-               ? array_map( 'stripslashes', $_REQUEST )
-               : $_REQUEST;
+               ? array_map( 'stripslashes', $_GET )
+               : $_GET;
 
        wfStreamThumb( $params ); // stream the thumbnail
 }
@@ -91,6 +91,7 @@ function wfThumbHandle404() {
  */
 function wfStreamThumb( array $params ) {
        global $wgVaryOnXFP;
+
        wfProfileIn( __METHOD__ );
 
        $headers = array(); // HTTP headers to send
@@ -172,9 +173,7 @@ function wfStreamThumb( array $params ) {
                wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
                wfProfileOut( __METHOD__ );
                return;
-       }
-       $sourcePath = $img->getPath();
-       if ( $sourcePath === false ) {
+       } elseif ( $img->getPath() === false ) {
                wfThumbError( 500, 'The source file is not locally accessible.' );
                wfProfileOut( __METHOD__ );
                return;
@@ -189,74 +188,73 @@ function wfStreamThumb( array $params ) {
                wfSuppressWarnings();
                $imsUnix = strtotime( $imsString );
                wfRestoreWarnings();
-               $sourceTsUnix = wfTimestamp( TS_UNIX, $img->getTimestamp() );
-               if ( $sourceTsUnix <= $imsUnix ) {
+               if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
                        header( 'HTTP/1.1 304 Not Modified' );
                        wfProfileOut( __METHOD__ );
                        return;
                }
        }
 
-       $thumbName = $img->thumbName( $params );
-       if ( !strlen( $thumbName ) ) { // invalid params?
-               wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+       // Get the normalized thumbnail name from the parameters...
+       try {
+               $thumbName = $img->thumbName( $params );
+               if ( !strlen( $thumbName ) ) { // invalid params?
+                       wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+               $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
+       } catch ( MWException $e ) {
+               wfThumbError( 500, $e->getHTML() );
                wfProfileOut( __METHOD__ );
                return;
        }
 
-       $disposition = $img->getThumbDisposition( $thumbName );
-       $headers[] = "Content-Disposition: $disposition";
-
-       // Stream the file if it exists already...
-       try {
-               $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
-               // For 404 handled thumbnails, we only use the the base name of the URI
-               // for the thumb params and the parent directory for the source file name.
-               // Check that the zone relative path matches up so squid caches won't pick
-               // up thumbs that would not be purged on source file deletion (bug 34231).
-               if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
-                       if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
-                               // Request for the canonical thumbnail name
-                       } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
-                               // Request for the "long" thumbnail name; redirect to canonical name
-                               $response = RequestContext::getMain()->getRequest()->response();
-                               $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
-                               $response->header( 'Location: ' . wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
-                               $response->header( 'Expires: ' .
-                                       gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
-                               if ( $wgVaryOnXFP ) {
-                                       $varyHeader[] = 'X-Forwarded-Proto';
-                               }
-                               if ( count( $varyHeader ) ) {
-                                       $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
-                               }
-                               wfProfileOut( __METHOD__ );
-                               return;
-                       } else {
-                               wfThumbError( 404, 'The given path of the specified thumbnail is incorrect.' );
-                               wfProfileOut( __METHOD__ );
-                               return;
+       // For 404 handled thumbnails, we only use the the base name of the URI
+       // for the thumb params and the parent directory for the source file name.
+       // Check that the zone relative path matches up so squid caches won't pick
+       // up thumbs that would not be purged on source file deletion (bug 34231).
+       if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
+               if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+                       // Request for the canonical thumbnail name
+               } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+                       // Request for the "long" thumbnail name; redirect to canonical name
+                       $response = RequestContext::getMain()->getRequest()->response();
+                       $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+                       $response->header( 'Location: ' .
+                               wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
+                       $response->header( 'Expires: ' .
+                               gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
+                       if ( $wgVaryOnXFP ) {
+                               $varyHeader[] = 'X-Forwarded-Proto';
                        }
-               }
-               $thumbPath = $img->getThumbPath( $thumbName );
-               if ( $img->getRepo()->fileExists( $thumbPath ) ) {
                        if ( count( $varyHeader ) ) {
-                               $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
+                               $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
                        }
-                       $img->getRepo()->streamFile( $thumbPath, $headers );
+                       wfProfileOut( __METHOD__ );
+                       return;
+               } else {
+                       wfThumbError( 404, 'The given path of the specified thumbnail is incorrect.' );
                        wfProfileOut( __METHOD__ );
                        return;
                }
-       } catch ( MWException $e ) {
-               wfThumbError( 500, $e->getHTML() );
-               wfProfileOut( __METHOD__ );
-               return;
        }
 
+       // Suggest a good name for users downloading this thumbnail
+       $headers[] = "Content-Disposition: {$img->getThumbDisposition( $thumbName )}";
+
        if ( count( $varyHeader ) ) {
                $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
        }
 
+       // Stream the file if it exists already...
+       $thumbPath = $img->getThumbPath( $thumbName );
+       if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+               $img->getRepo()->streamFile( $thumbPath, $headers );
+               wfProfileOut( __METHOD__ );
+               return;
+       }
+
        // Thumbnail isn't already there, so create the new thumbnail...
        try {
                $thumb = $img->transform( $params, File::RENDER_NOW );