Merge "Add comments for grep (includes/installer/)"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 21 Mar 2013 02:14:39 +0000 (02:14 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 21 Mar 2013 02:14:39 +0000 (02:14 +0000)
169 files changed:
docs/hooks.txt
includes/AjaxResponse.php
includes/AutoLoader.php
includes/Cookie.php
includes/GlobalFunctions.php
includes/HttpFunctions.php
includes/PoolCounter.php
includes/ScopedCallback.php
includes/api/ApiBase.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiImageRotate.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryTags.php
includes/cache/LocalisationCache.php
includes/clientpool/RedisConnectionPool.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/LoadBalancer.php
includes/diff/DairikiDiff.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/LockManager.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/installer/Installer.i18n.php
includes/installer/WebInstallerPage.php
includes/job/JobQueue.php
includes/job/JobQueueAggregatorRedis.php
includes/job/JobQueueDB.php
includes/job/JobQueueRedis.php
includes/media/BitmapMetadataHandler.php
includes/media/Exif.php
includes/media/IPTC.php
includes/media/Jpeg.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaHandler.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialUncategorizedcategories.php
includes/specials/SpecialWatchlist.php
includes/upload/UploadStash.php
languages/Language.php
languages/classes/LanguageAz.php
languages/classes/LanguageKaa.php
languages/classes/LanguageKk.php
languages/classes/LanguageMk.php [deleted file]
languages/classes/LanguageNso.php [deleted file]
languages/classes/LanguageSgs.php [deleted file]
languages/classes/LanguageSl.php
languages/classes/LanguageTr.php
languages/data/plurals-mediawiki.xml
languages/messages/MessagesArc.php
languages/messages/MessagesAst.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBn.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesGl.php
languages/messages/MessagesHr.php
languages/messages/MessagesIa.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLv.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMt.php
languages/messages/MessagesNb.php
languages/messages/MessagesPl.php
languages/messages/MessagesPt.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSv.php
languages/messages/MessagesTa.php
languages/messages/MessagesTet.php
languages/messages/MessagesVi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/populateRevisionLength.php
resources/Resources.php
skins/common/commonContent.css
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/languages/LanguageAmTest.php
tests/phpunit/languages/LanguageArTest.php
tests/phpunit/languages/LanguageBeTest.php
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageBhoTest.php
tests/phpunit/languages/LanguageBsTest.php
tests/phpunit/languages/LanguageCsTest.php
tests/phpunit/languages/LanguageCuTest.php
tests/phpunit/languages/LanguageCyTest.php
tests/phpunit/languages/LanguageDsbTest.php
tests/phpunit/languages/LanguageFrTest.php
tests/phpunit/languages/LanguageGaTest.php
tests/phpunit/languages/LanguageGdTest.php
tests/phpunit/languages/LanguageGvTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageHiTest.php
tests/phpunit/languages/LanguageHrTest.php
tests/phpunit/languages/LanguageHsbTest.php
tests/phpunit/languages/LanguageHuTest.php
tests/phpunit/languages/LanguageHyTest.php
tests/phpunit/languages/LanguageKshTest.php
tests/phpunit/languages/LanguageLnTest.php
tests/phpunit/languages/LanguageLtTest.php
tests/phpunit/languages/LanguageLvTest.php
tests/phpunit/languages/LanguageMgTest.php
tests/phpunit/languages/LanguageMkTest.php
tests/phpunit/languages/LanguageMoTest.php
tests/phpunit/languages/LanguageMtTest.php
tests/phpunit/languages/LanguageNsoTest.php
tests/phpunit/languages/LanguagePlTest.php
tests/phpunit/languages/LanguageRoTest.php
tests/phpunit/languages/LanguageRuTest.php
tests/phpunit/languages/LanguageSeTest.php
tests/phpunit/languages/LanguageSgsTest.php
tests/phpunit/languages/LanguageShTest.php
tests/phpunit/languages/LanguageSkTest.php
tests/phpunit/languages/LanguageSlTest.php
tests/phpunit/languages/LanguageSmaTest.php
tests/phpunit/languages/LanguageSrTest.php
tests/phpunit/languages/LanguageTiTest.php
tests/phpunit/languages/LanguageTlTest.php
tests/phpunit/languages/LanguageUkTest.php
tests/phpunit/languages/LanguageWaTest.php
tests/phpunit/skins/SideBarTest.php

index 3670cbe..c266dcc 100644 (file)
@@ -2272,6 +2272,7 @@ $special: the special page object
 &$tables: array of tables to be queried
 &$join_conds: join conditions for the tables
 &$fields: array of query fields
+$values: array of variables with watchlist options
 
 'TestCanonicalRedirect': Called when about to force a redirect to a canonical
 URL for a title when we have no other parameters on the URL. Gives a chance for
index 138f808..d553652 100644 (file)
@@ -210,7 +210,7 @@ class AjaxResponse {
         * @param $timestamp string
         * @return bool Returns true if the response code was set to 304 Not Modified.
         */
-       function checkLastModified ( $timestamp ) {
+       function checkLastModified( $timestamp ) {
                global $wgCachePages, $wgCacheEpoch, $wgUser;
                $fname = 'AjaxResponse::checkLastModified';
 
index 7136232..42cea7a 100644 (file)
@@ -194,6 +194,7 @@ $wgAutoloadLocalClasses = array(
        'PoolCounter' => 'includes/PoolCounter.php',
        'PoolCounter_Stub' => 'includes/PoolCounter.php',
        'PoolCounterWork' => 'includes/PoolCounter.php',
+       'PoolCounterWorkViaCallback' => 'includes/PoolCounter.php',
        'PoolWorkArticleView' => 'includes/WikiPage.php',
        'Preferences' => 'includes/Preferences.php',
        'PreferencesForm' => 'includes/Preferences.php',
index 27a8507..1b22c0e 100644 (file)
@@ -197,7 +197,7 @@ class CookieJar {
         * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
         * @see Cookie::set()
         */
-       public function setCookie ( $name, $value, $attr ) {
+       public function setCookie( $name, $value, $attr ) {
                /* cookies: case insensitive, so this should work.
                 * We'll still send the cookies back in the same case we got them, though.
                 */
@@ -235,7 +235,7 @@ class CookieJar {
         * @param string $domain cookie's domain
         * @return null
         */
-       public function parseCookieResponseHeader ( $cookie, $domain ) {
+       public function parseCookieResponseHeader( $cookie, $domain ) {
                $len = strlen( 'Set-Cookie:' );
 
                if ( substr_compare( 'Set-Cookie:', $cookie, 0, $len, true ) === 0 ) {
index 016736f..e1e1234 100644 (file)
@@ -3655,7 +3655,7 @@ function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
        // bug 27975 - Don't try to wait for slaves if there are none
        // Prevents permission error when getting master position
        if ( $lb->getServerCount() > 1 ) {
-               $dbw = $lb->getConnection( DB_MASTER );
+               $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
                $pos = $dbw->getMasterPos();
                $lb->waitForAll( $pos );
        }
index dc65c67..9e280db 100644 (file)
@@ -58,6 +58,8 @@ class Http {
         */
        public static function request( $method, $url, $options = array() ) {
                wfDebug( "HTTP: $method: $url\n" );
+               wfProfileIn( __METHOD__ . "-$method" );
+
                $options['method'] = strtoupper( $method );
 
                if ( !isset( $options['timeout'] ) ) {
@@ -67,11 +69,12 @@ class Http {
                $req = MWHttpRequest::factory( $url, $options );
                $status = $req->execute();
 
+               $content = false;
                if ( $status->isOK() ) {
-                       return $req->getContent();
-               } else {
-                       return false;
+                       $content = $req->getContent();
                }
+               wfProfileOut( __METHOD__ . "-$method" );
+               return $content;
        }
 
        /**
@@ -427,6 +430,8 @@ class MWHttpRequest {
        public function execute() {
                global $wgTitle;
 
+               wfProfileIn( __METHOD__ );
+
                $this->content = "";
 
                if ( strtoupper( $this->method ) == "HEAD" ) {
@@ -446,6 +451,8 @@ class MWHttpRequest {
                if ( !isset( $this->reqHeaders['User-Agent'] ) ) {
                        $this->setUserAgent( Http::userAgent() );
                }
+
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -454,6 +461,8 @@ class MWHttpRequest {
         * found in an array in the member variable headerList.
         */
        protected function parseHeader() {
+               wfProfileIn( __METHOD__ );
+
                $lastname = "";
 
                foreach ( $this->headerList as $header ) {
@@ -470,6 +479,8 @@ class MWHttpRequest {
                }
 
                $this->parseCookies();
+
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -603,6 +614,8 @@ class MWHttpRequest {
         * Parse the cookies in the response headers and store them in the cookie jar.
         */
        protected function parseCookies() {
+               wfProfileIn( __METHOD__ );
+
                if ( !$this->cookieJar ) {
                        $this->cookieJar = new CookieJar;
                }
@@ -613,6 +626,8 @@ class MWHttpRequest {
                                $this->cookieJar->parseCookieResponseHeader( $cookie, $url['host'] );
                        }
                }
+
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -700,9 +715,12 @@ class CurlHttpRequest extends MWHttpRequest {
        }
 
        public function execute() {
+               wfProfileIn( __METHOD__ );
+
                parent::execute();
 
                if ( !$this->status->isOK() ) {
+                       wfProfileOut( __METHOD__ );
                        return $this->status;
                }
 
@@ -746,6 +764,7 @@ class CurlHttpRequest extends MWHttpRequest {
                $curlHandle = curl_init( $this->url );
 
                if ( !curl_setopt_array( $curlHandle, $this->curlOptions ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Error setting curl options." );
                }
 
@@ -777,6 +796,8 @@ class CurlHttpRequest extends MWHttpRequest {
                $this->parseHeader();
                $this->setStatus();
 
+               wfProfileOut( __METHOD__ );
+
                return $this->status;
        }
 
@@ -811,6 +832,8 @@ class PhpHttpRequest extends MWHttpRequest {
        }
 
        public function execute() {
+               wfProfileIn( __METHOD__ );
+
                parent::execute();
 
                if ( is_array( $this->postData ) ) {
@@ -903,11 +926,13 @@ class PhpHttpRequest extends MWHttpRequest {
 
                if ( $fh === false ) {
                        $this->status->fatal( 'http-request-error' );
+                       wfProfileOut( __METHOD__ );
                        return $this->status;
                }
 
                if ( $result['timed_out'] ) {
                        $this->status->fatal( 'http-timed-out', $this->url );
+                       wfProfileOut( __METHOD__ );
                        return $this->status;
                }
 
@@ -930,6 +955,8 @@ class PhpHttpRequest extends MWHttpRequest {
                }
                fclose( $fh );
 
+               wfProfileOut( __METHOD__ );
+
                return $this->status;
        }
 }
index 2ebef04..38c6f04 100644 (file)
  */
 
 /**
- *  When you have many workers (threads/servers) giving service, and a
+ * When you have many workers (threads/servers) giving service, and a
  * cached item expensive to produce expires, you may get several workers
  * doing the job at the same time.
  *
- *  Given enough requests and the item expiring fast (non-cacheable,
+ * Given enough requests and the item expiring fast (non-cacheable,
  * lots of edits...) that single work can end up unfairly using most (all)
  * of the cpu of the pool. This is also known as 'Michael Jackson effect'
  * since this effect triggered on the english wikipedia on the day Michael
  * Jackson died, the biographical article got hit with several edits per
  * minutes and hundreds of read hits.
  *
- *  The PoolCounter provides semaphore semantics for restricting the number
+ * The PoolCounter provides semaphore semantics for restricting the number
  * of workers that may be concurrently performing such single task.
  *
- *  By default PoolCounter_Stub is used, which provides no locking. You
+ * By default PoolCounter_Stub is used, which provides no locking. You
  * can get a useful one in the PoolCounter extension.
  */
 abstract class PoolCounter {
-
        /* Return codes */
        const LOCKED = 1; /* Lock acquired */
        const RELEASED = 2; /* Lock released */
@@ -52,39 +51,26 @@ abstract class PoolCounter {
        const TIMEOUT = -4; /* Timeout exceeded */
        const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
 
-       /**
-        * I want to do this task and I need to do it myself.
-        *
-        * @return Locked/Error
-        */
-       abstract function acquireForMe();
-
-       /**
-        * I want to do this task, but if anyone else does it
-        * instead, it's also fine for me. I will read its cached data.
-        *
-        * @return Locked/Done/Error
-        */
-       abstract function acquireForAnyone();
-
-       /**
-        * I have successfully finished my task.
-        * Lets another one grab the lock, and returns the workers
-        * waiting on acquireForAnyone()
-        *
-        * @return Released/NotLocked/Error
-        */
-       abstract function release();
+       /** @var string All workers with the same key share the lock */
+       protected $key;
+       /** @var integer Maximum number of workers doing the task simultaneously */
+       protected $workers;
+       /** @var integer If this number of workers are already working/waiting, fail instead of wait */
+       protected $maxqueue;
+       /** @var float Maximum time in seconds to wait for the lock */
+       protected $timeout;
 
        /**
-        *  $key: All workers with the same key share the lock.
-        *  $workers: It wouldn't be a good idea to have more than this number of
-        * workers doing the task simultaneously.
-        *  $maxqueue: If this number of workers are already working/waiting,
-        * fail instead of wait.
-        *  $timeout: Maximum time in seconds to wait for the lock.
+        * @param array $conf
+        * @param string $type
+        * @param string $key
         */
-       protected $key, $workers, $maxqueue, $timeout;
+       protected function __construct( $conf, $type, $key ) {
+               $this->key = $key;
+               $this->workers = $conf['workers'];
+               $this->maxqueue = $conf['maxqueue'];
+               $this->timeout = $conf['timeout'];
+       }
 
        /**
         * Create a Pool counter. This should only be called from the PoolWorks.
@@ -105,58 +91,74 @@ abstract class PoolCounter {
                return new $class( $conf, $type, $key );
        }
 
-       protected function __construct( $conf, $type, $key ) {
-               $this->key = $key;
-               $this->workers = $conf['workers'];
-               $this->maxqueue = $conf['maxqueue'];
-               $this->timeout = $conf['timeout'];
-       }
-}
-
-class PoolCounter_Stub extends PoolCounter {
-
        /**
-        * @return Status
+        * I want to do this task and I need to do it myself.
+        *
+        * @return Status Value is one of Locked/Error
         */
-       function acquireForMe() {
-               return Status::newGood( PoolCounter::LOCKED );
-       }
+       abstract public function acquireForMe();
 
        /**
-        * @return Status
+        * I want to do this task, but if anyone else does it
+        * instead, it's also fine for me. I will read its cached data.
+        *
+        * @return Status Value is one of Locked/Done/Error
         */
-       function acquireForAnyone() {
-               return Status::newGood( PoolCounter::LOCKED );
-       }
+       abstract public function acquireForAnyone();
 
        /**
-        * @return Status
+        * I have successfully finished my task.
+        * Lets another one grab the lock, and returns the workers
+        * waiting on acquireForAnyone()
+        *
+        * @return Status value is one of Released/NotLocked/Error
         */
-       function release() {
-               return Status::newGood( PoolCounter::RELEASED );
-       }
+       abstract public function release();
+}
 
+class PoolCounter_Stub extends PoolCounter {
        public function __construct() {
                /* No parameters needed */
        }
+
+       public function acquireForMe() {
+               return Status::newGood( PoolCounter::LOCKED );
+       }
+
+       public function acquireForAnyone() {
+               return Status::newGood( PoolCounter::LOCKED );
+       }
+
+       public function release() {
+               return Status::newGood( PoolCounter::RELEASED );
+       }
 }
 
 /**
- * Handy class for dealing with PoolCounters using class members instead of callbacks.
+ * Class for dealing with PoolCounters using class members
  */
 abstract class PoolCounterWork {
        protected $cacheable = false; //Does this override getCachedWork() ?
 
        /**
-        * Actually perform the work, caching it if needed.
+        * @param string $type The type of PoolCounter to use
+        * @param string $key Key that identifies the queue this work is placed on
         */
-       abstract function doWork();
+       public function __construct( $type, $key ) {
+               $this->poolCounter = PoolCounter::factory( $type, $key );
+       }
+
+       /**
+        * Actually perform the work, caching it if needed
+        * @return mixed work result or false
+        */
+       abstract public function doWork();
 
        /**
         * Retrieve the work from cache
         * @return mixed work result or false
         */
-       function getCachedWork() {
+       public function getCachedWork() {
                return false;
        }
 
@@ -165,7 +167,7 @@ abstract class PoolCounterWork {
         * message.
         * @return mixed work result or false
         */
-       function fallback() {
+       public function fallback() {
                return false;
        }
 
@@ -181,6 +183,7 @@ abstract class PoolCounterWork {
         * Log an error
         *
         * @param $status Status
+        * @return void
         */
        function logError( $status ) {
                wfDebugLog( 'poolcounter', $status->getWikiText() );
@@ -191,7 +194,7 @@ abstract class PoolCounterWork {
         * @param $skipcache bool
         * @return bool|mixed
         */
-       function execute( $skipcache = false ) {
+       public function execute( $skipcache = false ) {
                if ( $this->cacheable && !$skipcache ) {
                        $status = $this->poolCounter->acquireForAnyone();
                } else {
@@ -232,15 +235,85 @@ abstract class PoolCounterWork {
                        /* These two cases should never be hit... */
                        case PoolCounter::ERROR:
                        default:
-                               $errors = array( PoolCounter::QUEUE_FULL => 'pool-queuefull', PoolCounter::TIMEOUT => 'pool-timeout' );
+                               $errors = array(
+                                       PoolCounter::QUEUE_FULL => 'pool-queuefull',
+                                       PoolCounter::TIMEOUT => 'pool-timeout' );
 
-                               $status = Status::newFatal( isset( $errors[$status->value] ) ? $errors[$status->value] : 'pool-errorunknown' );
+                               $status = Status::newFatal( isset( $errors[$status->value] )
+                                       ? $errors[$status->value]
+                                       : 'pool-errorunknown' );
                                $this->logError( $status );
                                return $this->error( $status );
                }
        }
+}
 
-       function __construct( $type, $key ) {
-               $this->poolCounter = PoolCounter::factory( $type, $key );
+/**
+ * Convenience class for dealing with PoolCounters using callbacks
+ * @since 1.22
+ */
+class PoolCounterWorkViaCallback extends PoolCounterWork {
+       /** @var callable */
+       protected $doWork;
+       /** @var callable|null */
+       protected $doCachedWork;
+       /** @var callable|null */
+       protected $fallback;
+       /** @var callable|null */
+       protected $error;
+
+       /**
+        * Build a PoolCounterWork class from a type, key, and callback map.
+        *
+        * The callback map must at least have a callback for the 'doWork' method.
+        * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback',
+        * and 'error' methods. Methods without callbacks will be no-ops that return false.
+        * If a 'doCachedWork' callback is provided, then execute() may wait for any prior
+        * process in the pool to finish and reuse its cached result.
+        *
+        * @param string $type
+        * @param string $key
+        * @param array $callbacks Map of callbacks
+        * @throws MWException
+        */
+       public function __construct( $type, $key, array $callbacks ) {
+               parent::__construct( $type, $key );
+               foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) {
+                       if ( isset( $callbacks[$name] ) ) {
+                               if ( !is_callable( $callbacks[$name] ) ) {
+                                       throw new MWException( "Invalid callback provided for '$name' function." );
+                               }
+                               $this->$name = $callbacks[$name];
+                       }
+               }
+               if ( !isset( $this->doWork ) ) {
+                       throw new MWException( "No callback provided for 'doWork' function." );
+               }
+               $this->cacheable = isset( $this->doCachedWork );
+       }
+
+       public function doWork() {
+               return call_user_func_array( $this->doWork, array() );
+       }
+
+       public function getCachedWork() {
+               if ( $this->doCachedWork ) {
+                       return call_user_func_array( $this->doCachedWork, array() );
+               }
+               return false;
+       }
+
+       function fallback() {
+               if ( $this->fallback ) {
+                       return call_user_func_array( $this->fallback, array() );
+               }
+               return false;
+       }
+
+       function error( $status ) {
+               if ( $this->error ) {
+                       return call_user_func_array( $this->error, array( $status ) );
+               }
+               return false;
        }
 }
index 1d5b26b..8ecd874 100644 (file)
@@ -22,6 +22,8 @@
 
 /**
  * Class for asserting that a callback happens when an dummy object leaves scope
+ *
+ * @since 1.21
  */
 class ScopedCallback {
        /** @var Closure */
@@ -34,7 +36,34 @@ class ScopedCallback {
                $this->callback = $callback;
        }
 
+       /**
+        * Trigger a scoped callback and destroy it.
+        * This is the same is just setting it to null.
+        *
+        * @param ScopedCallback $sc
+        */
+       public static function consume( ScopedCallback &$sc = null ) {
+               $sc = null;
+       }
+
+       /**
+        * Destroy a scoped callback without triggering it
+        *
+        * @param ScopedCallback $sc
+        */
+       public static function cancel( ScopedCallback &$sc = null ) {
+               if ( $sc ) {
+                       $sc->callback = null;
+               }
+               $sc = null;
+       }
+
+       /**
+        * Trigger the callback when this leaves scope
+        */
        function __destruct() {
-               call_user_func( $this->callback );
+               if ( $this->callback !== null ) {
+                       call_user_func( $this->callback );
+               }
        }
 }
index 9351a8d..d2d50ae 100644 (file)
@@ -822,7 +822,7 @@ abstract class ApiBase extends ContextSource {
         *      If not set will magically default to either watchdefault or watchcreations
         * @return bool
         */
-       protected function getWatchlistValue ( $watchlist, $titleObj, $userOption = null ) {
+       protected function getWatchlistValue( $watchlist, $titleObj, $userOption = null ) {
 
                $userWatching = $this->getUser()->isWatched( $titleObj );
 
index 9520dc7..cbb2ba6 100644 (file)
@@ -187,7 +187,7 @@ class ApiFileRevert extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=filerevert&filename=Wiki.png&comment=Revert&archivename=20110305152740!Wiki.png&token=+\\'
+                       'api.php?action=filerevert&filename=Wiki.png&comment=Revert&archivename=20110305152740!Wiki.png&token=123ABC'
                                => 'Revert Wiki.png to the version of 20110305152740',
                );
        }
index d8aa163..e8e6acf 100644 (file)
@@ -85,7 +85,7 @@ abstract class ApiFormatBase extends ApiBase {
         *
         * @param bool $b Whether or not ampersands should be escaped.
         */
-       public function setUnescapeAmps ( $b ) {
+       public function setUnescapeAmps( $b ) {
                $this->mUnescapeAmps = $b;
        }
 
index 62b69bb..884a1dc 100644 (file)
@@ -67,41 +67,36 @@ class ApiFormatWddx extends ApiFormatBase {
                $indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
                $indstr2 = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent + 2 ) );
                $nl = ( $this->getIsHtml() ? '' : "\n" );
-               switch ( gettype( $elemValue ) ) {
-                       case 'array':
-                               // Check whether we've got an associative array (<struct>)
-                               // or a regular array (<array>)
-                               $cnt = count( $elemValue );
-                               if ( $cnt == 0 || array_keys( $elemValue ) === range( 0, $cnt - 1 ) ) {
-                                       // Regular array
-                                       $this->printText( $indstr . Xml::element( 'array', array(
-                                               'length' => $cnt ), null ) . $nl );
-                                       foreach ( $elemValue as $subElemValue ) {
-                                               $this->slowWddxPrinter( $subElemValue, $indent + 2 );
-                                       }
-                                       $this->printText( "$indstr</array>$nl" );
-                               } else {
-                                       // Associative array (<struct>)
-                                       $this->printText( "$indstr<struct>$nl" );
-                                       foreach ( $elemValue as $subElemName => $subElemValue ) {
-                                               $this->printText( $indstr2 . Xml::element( 'var', array(
-                                                       'name' => $subElemName
-                                               ), null ) . $nl );
-                                               $this->slowWddxPrinter( $subElemValue, $indent + 4 );
-                                               $this->printText( "$indstr2</var>$nl" );
-                                       }
-                                       $this->printText( "$indstr</struct>$nl" );
+               if ( is_array( $elemValue ) ) {
+                       // Check whether we've got an associative array (<struct>)
+                       // or a regular array (<array>)
+                       $cnt = count( $elemValue );
+                       if ( $cnt == 0 || array_keys( $elemValue ) === range( 0, $cnt - 1 ) ) {
+                               // Regular array
+                               $this->printText( $indstr . Xml::element( 'array', array(
+                                       'length' => $cnt ), null ) . $nl );
+                               foreach ( $elemValue as $subElemValue ) {
+                                       $this->slowWddxPrinter( $subElemValue, $indent + 2 );
                                }
-                               break;
-                       case 'integer':
-                       case 'double':
-                               $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
-                               break;
-                       case 'string':
-                               $this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
-                               break;
-                       default:
-                               ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
+                               $this->printText( "$indstr</array>$nl" );
+                       } else {
+                               // Associative array (<struct>)
+                               $this->printText( "$indstr<struct>$nl" );
+                               foreach ( $elemValue as $subElemName => $subElemValue ) {
+                                       $this->printText( $indstr2 . Xml::element( 'var', array(
+                                               'name' => $subElemName
+                                       ), null ) . $nl );
+                                       $this->slowWddxPrinter( $subElemValue, $indent + 4 );
+                                       $this->printText( "$indstr2</var>$nl" );
+                               }
+                               $this->printText( "$indstr</struct>$nl" );
+                       }
+               } elseif ( is_int( $elemValue ) || is_float( $elemValue ) ) {
+                       $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
+               } elseif ( is_string( $elemValue ) ) {
+                       $this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
+               } else {
+                       ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
                }
        }
 
index b4e8e33..183d48c 100644 (file)
@@ -131,84 +131,78 @@ class ApiFormatXml extends ApiFormatBase {
                }
                $elemName = str_replace( ' ', '_', $elemName );
 
-               switch ( gettype( $elemValue ) ) {
-                       case 'array':
-                               if ( isset( $elemValue['*'] ) ) {
-                                       $subElemContent = $elemValue['*'];
-                                       if ( $doublequote ) {
-                                               $subElemContent = Sanitizer::encodeAttribute( $subElemContent );
-                                       }
-                                       unset( $elemValue['*'] );
-
-                                       // Add xml:space="preserve" to the
-                                       // element so XML parsers will leave
-                                       // whitespace in the content alone
-                                       $elemValue['xml:space'] = 'preserve';
-                               } else {
-                                       $subElemContent = null;
+               if ( is_array( $elemValue ) ) {
+                       if ( isset( $elemValue['*'] ) ) {
+                               $subElemContent = $elemValue['*'];
+                               if ( $doublequote ) {
+                                       $subElemContent = Sanitizer::encodeAttribute( $subElemContent );
                                }
-
-                               if ( isset( $elemValue['_element'] ) ) {
-                                       $subElemIndName = $elemValue['_element'];
-                                       unset( $elemValue['_element'] );
-                               } else {
-                                       $subElemIndName = null;
-                               }
-
-                               $indElements = array();
-                               $subElements = array();
-                               foreach ( $elemValue as $subElemId => & $subElemValue ) {
-                                       if ( is_string( $subElemValue ) && $doublequote ) {
-                                               $subElemValue = Sanitizer::encodeAttribute( $subElemValue );
-                                       }
-
-                                       if ( gettype( $subElemId ) === 'integer' ) {
-                                               $indElements[] = $subElemValue;
-                                               unset( $elemValue[$subElemId] );
-                                       } elseif ( is_array( $subElemValue ) ) {
-                                               $subElements[$subElemId] = $subElemValue;
-                                               unset ( $elemValue[$subElemId] );
-                                       }
+                               unset( $elemValue['*'] );
+
+                               // Add xml:space="preserve" to the
+                               // element so XML parsers will leave
+                               // whitespace in the content alone
+                               $elemValue['xml:space'] = 'preserve';
+                       } else {
+                               $subElemContent = null;
+                       }
+
+                       if ( isset( $elemValue['_element'] ) ) {
+                               $subElemIndName = $elemValue['_element'];
+                               unset( $elemValue['_element'] );
+                       } else {
+                               $subElemIndName = null;
+                       }
+
+                       $indElements = array();
+                       $subElements = array();
+                       foreach ( $elemValue as $subElemId => & $subElemValue ) {
+                               if ( is_string( $subElemValue ) && $doublequote ) {
+                                       $subElemValue = Sanitizer::encodeAttribute( $subElemValue );
                                }
 
-                               if ( is_null( $subElemIndName ) && count( $indElements ) ) {
-                                       ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
+                               if ( is_int( $subElemId ) ) {
+                                       $indElements[] = $subElemValue;
+                                       unset( $elemValue[$subElemId] );
+                               } elseif ( is_array( $subElemValue ) ) {
+                                       $subElements[$subElemId] = $subElemValue;
+                                       unset ( $elemValue[$subElemId] );
                                }
+                       }
 
-                               if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
-                                       ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
-                               }
+                       if ( is_null( $subElemIndName ) && count( $indElements ) ) {
+                               ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
+                       }
 
-                               if ( !is_null( $subElemContent ) ) {
-                                       $retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
-                               } elseif ( !count( $indElements ) && !count( $subElements ) ) {
-                                       $retval .= $indstr . Xml::element( $elemName, $elemValue );
-                               } else {
-                                       $retval .= $indstr . Xml::element( $elemName, $elemValue, null );
+                       if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
+                               ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+                       }
 
-                                       foreach ( $subElements as $subElemId => & $subElemValue ) {
-                                               $retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
-                                       }
+                       if ( !is_null( $subElemContent ) ) {
+                               $retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
+                       } elseif ( !count( $indElements ) && !count( $subElements ) ) {
+                               $retval .= $indstr . Xml::element( $elemName, $elemValue );
+                       } else {
+                               $retval .= $indstr . Xml::element( $elemName, $elemValue, null );
 
-                                       foreach ( $indElements as &$subElemValue ) {
-                                               $retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
-                                       }
-
-                                       $retval .= $indstr . Xml::closeElement( $elemName );
+                               foreach ( $subElements as $subElemId => & $subElemValue ) {
+                                       $retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
                                }
-                               break;
-                       case 'object':
-                               // ignore
-                               break;
-                       default:
-                               // to make sure null value doesn't produce unclosed element,
-                               // which is what Xml::element( $elemName, null, null ) returns
-                               if ( $elemValue === null ) {
-                                       $retval .= $indstr . Xml::element( $elemName );
-                               } else {
-                                       $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+
+                               foreach ( $indElements as &$subElemValue ) {
+                                       $retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
                                }
-                               break;
+
+                               $retval .= $indstr . Xml::closeElement( $elemName );
+                       }
+               } elseif ( !is_object( $elemValue ) ) {
+                       // to make sure null value doesn't produce unclosed element,
+                       // which is what Xml::element( $elemName, null, null ) returns
+                       if ( $elemValue === null ) {
+                               $retval .= $indstr . Xml::element( $elemName );
+                       } else {
+                               $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+                       }
                }
                return $retval;
        }
index f9c8058..b2d7582 100644 (file)
@@ -59,10 +59,6 @@ class ApiImageRotate extends ApiBase {
                $rotation = $params[ 'rotation' ];
                $user = $this->getUser();
 
-               if( is_null( $rotation ) || $rotation % 90 ) {
-                       $this->dieUsage( "Rotation: {$rotation}", 'rotation must be multiple of 90 degrees' );
-               }
-
                $pageSet = $this->getPageSet();
                $pageSet->execute();
 
@@ -73,32 +69,47 @@ class ApiImageRotate extends ApiBase {
                self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
                self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
                self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
-               self::addValues( $result, $pageSet->getMissingTitles(), 'missing' );
                self::addValues( $result, $pageSet->getInterwikiTitlesAsResult() );
 
                foreach ( $pageSet->getTitles() as $title ) {
-                       $file = wfFindFile( $title );
-
                        $r = array();
-                       $r[ 'title' ] = $title->getFullText();
-                       if ( !$file ) {
+                       $r['id'] = $title->getArticleID();
+                       ApiQueryBase::addTitleInfo( $r, $title );
+                       if ( !$title->exists() ) {
                                $r['missing'] = '';
+                       }
+
+                       $file = wfFindFile( $title );
+                       if ( !$file ) {
                                $r['result'] = 'Failure';
+                               $r['errormessage'] = 'File does not exist';
                                $result[] = $r;
                                continue;
                        }
                        $handler = $file->getHandler();
                        if ( !$handler || !$handler->canRotate() ) {
-                               $r['invalid'] = '';
                                $r['result'] = 'Failure';
+                               $r['errormessage'] = 'File type cannot be rotated';
                                $result[] = $r;
                                continue;
                        }
 
                        // Check whether we're allowed to rotate this file
-                       $this->checkPermissions( $this->getUser(), $file->getTitle() );
+                       $permError = $this->checkPermissions( $this->getUser(), $file->getTitle() );
+                       if ( $permError !== null ) {
+                               $r['result'] = 'Failure';
+                               $r['errormessage'] = $permError;
+                               $result[] = $r;
+                               continue;
+                       }
 
                        $srcPath = $file->getLocalRefPath();
+                       if ( $srcPath === false ) {
+                               $r['result'] = 'Failure';
+                               $r['errormessage'] = 'Cannot get local file path';
+                               $result[] = $r;
+                               continue;
+                       }
                        $ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
                        $tmpFile = TempFSFile::factory( 'rotate_', $ext);
                        $dstPath = $tmpFile->getPath();
@@ -141,8 +152,8 @@ class ApiImageRotate extends ApiBase {
 
        /**
         * Checks that the user has permissions to perform rotations.
-        * Dies with usage message on inadequate permissions.
         * @param $user User The user to check.
+        * @return string|null Permission error message, or null if there is no error
         */
        protected function checkPermissions( $user, $title ) {
                $permissionErrors = array_merge(
@@ -151,8 +162,12 @@ class ApiImageRotate extends ApiBase {
                );
 
                if ( $permissionErrors ) {
-                       $this->dieUsageMsg( $permissionErrors[0] );
+                       // Just return the first error
+                       $msg = $this->parseMsg( $permissionErrors[0] );
+                       return $msg['info'];
                }
+
+               return null;
        }
 
        public function mustBePosted() {
@@ -167,7 +182,8 @@ class ApiImageRotate extends ApiBase {
                $pageSet = $this->getPageSet();
                $result = array(
                        'rotation' => array(
-                               ApiBase::PARAM_DFLT => 0,
+                               ApiBase::PARAM_TYPE => array( '90', '180', '270' ),
+                               ApiBase::PARAM_REQUIRED => true
                        ),
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -183,8 +199,8 @@ class ApiImageRotate extends ApiBase {
        public function getParamDescription() {
                $pageSet = $this->getPageSet();
                return $pageSet->getParamDescription() + array(
-                       'rotation' => 'Degrees to rotate image, values can be 0, 90, 180 or 270',
-                       'token' => 'Edit token. You can get one of these through prop=info',
+                       'rotation' => 'Degrees to rotate image clockwise',
+                       'token' => 'Edit token. You can get one of these through action=tokens',
                );
        }
 
@@ -210,7 +226,7 @@ class ApiImageRotate extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=imagerotate&titles=Example.jpg&rotation=90&token=+\\',
+                       'api.php?action=imagerotate&titles=Example.jpg&rotation=90&token=123ABC',
                );
        }
 }
index 95c2745..556f147 100644 (file)
@@ -228,7 +228,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @param string $otherParams of otherParams (iiurlparam).
         * @return Array of parameters for transform.
         */
-       protected function mergeThumbParams ( $image, $thumbParams, $otherParams ) {
+       protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
                if ( !$otherParams ) {
                        return $thumbParams;
                }
index e0637ff..22480c6 100644 (file)
@@ -133,8 +133,7 @@ class ApiQueryTags extends ApiQueryBase {
 
        public function getAllowedParams() {
                return array(
-                       'continue' => array(
-                       ),
+                       'continue' => null,
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
                                ApiBase::PARAM_TYPE => 'limit',
index 009b950..2de7b48 100644 (file)
@@ -110,7 +110,7 @@ class LocalisationCache {
                'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
                'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
                'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
-               'digitGroupingPattern', 'pluralRules', 'compiledPluralRules',
+               'digitGroupingPattern', 'pluralRules', 'pluralRuleTypes', 'compiledPluralRules',
        );
 
        /**
@@ -160,6 +160,20 @@ class LocalisationCache {
         */
        var $pluralRules = null;
 
+       /**
+        * Associative array of cached plural rule types. The key is the language
+        * code, the value is an array of plural rule types for that language. For
+        * example, $pluralRuleTypes['ar'] = ['zero', 'one', 'two', 'few', 'many'].
+        * The index for each rule type matches the index for the rule in
+        * $pluralRules, thus allowing correlation between the two. The reason we
+        * don't just use the type names as the keys in $pluralRules is because
+        * Language::convertPlural applies the rules based on numeric order (or
+        * explicit numeric parameter), not based on the name of the rule type. For
+        * example, {{plural:count|wordform1|wordform2|wordform3}}, rather than
+        * {{plural:count|one=wordform1|two=wordform2|many=wordform3}}.
+        */
+       var $pluralRuleTypes = null;
+
        var $mergeableKeys = null;
 
        /**
@@ -519,17 +533,8 @@ class LocalisationCache {
         * @since 1.20
         */
        public function getPluralRules( $code ) {
-               global $IP;
-
                if ( $this->pluralRules === null ) {
-                       $cldrPlural = "$IP/languages/data/plurals.xml";
-                       $mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
-                       // Load CLDR plural rules
-                       $this->loadPluralFile( $cldrPlural );
-                       if ( file_exists( $mwPlural ) ) {
-                               // Override or extend
-                               $this->loadPluralFile( $mwPlural );
-                       }
+                       $this->loadPluralFiles();
                }
                if ( !isset( $this->pluralRules[$code] ) ) {
                        return null;
@@ -538,6 +543,37 @@ class LocalisationCache {
                }
        }
 
+       /**
+        * Get the plural rule types for a given language from the XML files.
+        * Cached.
+        * @since 1.21
+        */
+       public function getPluralRuleTypes( $code ) {
+               if ( $this->pluralRuleTypes === null ) {
+                       $this->loadPluralFiles();
+               }
+               if ( !isset( $this->pluralRuleTypes[$code] ) ) {
+                       return null;
+               } else {
+                       return $this->pluralRuleTypes[$code];
+               }
+       }
+
+       /**
+        * Load the plural XML files.
+        */
+       protected function loadPluralFiles() {
+               global $IP;
+               $cldrPlural = "$IP/languages/data/plurals.xml";
+               $mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
+               // Load CLDR plural rules
+               $this->loadPluralFile( $cldrPlural );
+               if ( file_exists( $mwPlural ) ) {
+                       // Override or extend
+                       $this->loadPluralFile( $mwPlural );
+               }
+       }
+
        /**
         * Load a plural XML file with the given filename, compile the relevant
         * rules, and save the compiled rules in a process-local cache.
@@ -549,12 +585,16 @@ class LocalisationCache {
                foreach ( $rulesets as $ruleset ) {
                        $codes = $ruleset->getAttribute( 'locales' );
                        $rules = array();
+                       $ruleTypes = array();
                        $ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
                        foreach ( $ruleElements as $elt ) {
+                               $ruleType = $elt->getAttribute( 'count' );
                                $rules[] = $elt->nodeValue;
+                               $ruleTypes[] = $ruleType;
                        }
                        foreach ( explode( ' ', $codes ) as $code ) {
                                $this->pluralRules[$code] = $rules;
+                               $this->pluralRuleTypes[$code] = $ruleTypes;
                        }
                }
        }
@@ -579,6 +619,8 @@ class LocalisationCache {
                $data['pluralRules'] = $this->getPluralRules( $code );
                # And for PHP
                $data['compiledPluralRules'] = $this->getCompiledPluralRules( $code );
+               # Load plural rule types
+               $data['pluralRuleTypes'] = $this->getPluralRuleTypes( $code );
 
                $deps['plurals'] = new FileDependency( "$IP/languages/data/plurals.xml" );
                $deps['plurals-mw'] = new FileDependency( "$IP/languages/data/plurals-mediawiki.xml" );
@@ -786,6 +828,10 @@ class LocalisationCache {
                if ( $allData['compiledPluralRules'] === null ) {
                        $allData['compiledPluralRules'] = array();
                }
+               # If there were no plural rule types, return an empty array
+               if ( $allData['pluralRuleTypes'] === null ) {
+                       $allData['pluralRuleTypes'] = array();
+               }
 
                # Set the list keys
                $allData['list'] = array();
@@ -1284,5 +1330,4 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
                        $this->unload( $code );
                }
        }
-
 }
index 5c7c4f2..a15e80b 100644 (file)
@@ -55,14 +55,6 @@ class RedisConnectionPool {
        const SERVER_DOWN_TTL = 30; // integer; seconds to cache servers as "down"
 
        /**
-        * $options include:
-        *   - connectTimeout : The timeout for new connections, in seconds.
-        *                      Optional, default is 1 second.
-        *   - persistent     : Set this to true to allow connections to persist across
-        *                      multiple web requests. False by default.
-        *   - password       : The authentication password, will be sent to Redis in clear text.
-        *                      Optional, if it is unspecified, no AUTH command will be sent.
-        *   - serializer     : Set to "php", "igbinary", or "none". Default is "php".
         * @param array $options
         */
        protected function __construct( array $options ) {
@@ -103,6 +95,14 @@ class RedisConnectionPool {
 
        /**
         * @param $options Array
+        * $options include:
+        *   - connectTimeout : The timeout for new connections, in seconds.
+        *                      Optional, default is 1 second.
+        *   - persistent     : Set this to true to allow connections to persist across
+        *                      multiple web requests. False by default.
+        *   - password       : The authentication password, will be sent to Redis in clear text.
+        *                      Optional, if it is unspecified, no AUTH command will be sent.
+        *   - serializer     : Set to "php", "igbinary", or "none". Default is "php".
         * @return RedisConnectionPool
         */
        public static function singleton( array $options ) {
index 6c45ffa..575f629 100644 (file)
@@ -661,7 +661,7 @@ class DatabaseMssql extends DatabaseBase {
                return $version;
        }
 
-       function tableExists ( $table, $fname = __METHOD__, $schema = false ) {
+       function tableExists( $table, $fname = __METHOD__, $schema = false ) {
                $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
                        WHERE table_type='BASE TABLE' AND table_name = '$table'" );
                if ( $res === false ) {
@@ -952,7 +952,7 @@ class DatabaseMssql extends DatabaseBase {
  */
 class MssqlField implements Field {
        private $name, $tablename, $default, $max_length, $nullable, $type;
-       function __construct ( $info ) {
+       function __construct( $info ) {
                $this->name = $info['COLUMN_NAME'];
                $this->tablename = $info['TABLE_NAME'];
                $this->default = $info['COLUMN_DEFAULT'];
index 27aae18..0f7eb9e 100644 (file)
@@ -965,7 +965,7 @@ class MySQLField implements Field {
        private $name, $tablename, $default, $max_length, $nullable,
                $is_pk, $is_unique, $is_multiple, $is_key, $type;
 
-       function __construct ( $info ) {
+       function __construct( $info ) {
                $this->name = $info->name;
                $this->tablename = $info->table;
                $this->default = $info->def;
index 75b3550..7db032f 100644 (file)
@@ -493,7 +493,7 @@ class DatabaseOracle extends DatabaseBase {
                return $retVal;
        }
 
-       private function fieldBindStatement ( $table, $col, &$val, $includeCol = false ) {
+       private function fieldBindStatement( $table, $col, &$val, $includeCol = false ) {
                $col_info = $this->fieldInfoMulti( $table, $col );
                $col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
 
@@ -1121,7 +1121,7 @@ class DatabaseOracle extends DatabaseBase {
                }
        }
 
-       private function wrapConditionsForWhere ( $table, $conds, $parentCol = null ) {
+       private function wrapConditionsForWhere( $table, $conds, $parentCol = null ) {
                $conds2 = array();
                foreach ( $conds as $col => $val ) {
                        if ( is_array( $val ) ) {
index f32d775..c6ac11a 100644 (file)
@@ -218,7 +218,7 @@ class SavepointPostgres {
        protected $id;
        protected $didbegin;
 
-       public function __construct ( $dbw, $id ) {
+       public function __construct( $dbw, $id ) {
                $this->dbw = $dbw;
                $this->id = $id;
                $this->didbegin = false;
@@ -450,7 +450,7 @@ class DatabasePostgres extends DatabaseBase {
                return $this->mLastResult;
        }
 
-       protected function dumpError () {
+       protected function dumpError() {
                $diags = array( PGSQL_DIAG_SEVERITY,
                                PGSQL_DIAG_SQLSTATE,
                                PGSQL_DIAG_MESSAGE_PRIMARY,
@@ -647,7 +647,7 @@ class DatabasePostgres extends DatabaseBase {
         * @since 1.19
         * @return Array
         */
-       function indexAttributes ( $index, $schema = false ) {
+       function indexAttributes( $index, $schema = false ) {
                if ( $schema === false )
                        $schema = $this->getCoreSchema();
                /*
index 1e85927..187870f 100644 (file)
@@ -407,7 +407,7 @@ class LoadBalancer {
                                wfDebug( __METHOD__ . ": no connection open\n" );
                                return false;
                        } else {
-                               $conn = $this->openConnection( $index );
+                               $conn = $this->openConnection( $index, '' );
                                if ( !$conn ) {
                                        wfDebug( __METHOD__ . ": failed to open connection\n" );
                                        return false;
index 94ffc06..1a26d0c 100644 (file)
@@ -183,7 +183,7 @@ class _DiffEngine {
         * @param $to_lines
         * @return array
         */
-       function diff ( $from_lines, $to_lines ) {
+       function diff( $from_lines, $to_lines ) {
                wfProfileIn( __METHOD__ );
 
                // Diff and store locally
@@ -241,7 +241,7 @@ class _DiffEngine {
         * @param $from_lines
         * @param $to_lines
         */
-       function diff_local ( $from_lines, $to_lines ) {
+       function diff_local( $from_lines, $to_lines ) {
                global $wgExternalDiffEngine;
                wfProfileIn( __METHOD__ );
 
@@ -469,7 +469,7 @@ class _DiffEngine {
         * @param $yoff
         * @param $ylim
         */
-       function _compareseq ( $xoff, $xlim, $yoff, $ylim ) {
+       function _compareseq( $xoff, $xlim, $yoff, $ylim ) {
                // Slide down the bottom initial diagonal.
                while ( $xoff < $xlim && $yoff < $ylim
                && $this->xv[$xoff] == $this->yv[$yoff] ) {
@@ -1204,7 +1204,7 @@ class _HWLDF_WordAccumulator {
         * @param $words
         * @param $tag string
         */
-       function addWords ( $words, $tag = '' ) {
+       function addWords( $words, $tag = '' ) {
                if ( $tag != $this->_tag ) {
                        $this->_flushGroup( $tag );
                }
@@ -1244,7 +1244,7 @@ class WordLevelDiff extends MappedDiff {
         * @param $orig_lines
         * @param $closing_lines
         */
-       function __construct ( $orig_lines, $closing_lines ) {
+       function __construct( $orig_lines, $closing_lines ) {
                wfProfileIn( __METHOD__ );
 
                list( $orig_words, $orig_stripped ) = $this->_split( $orig_lines );
index f40b8c1..638e7cd 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
  * @defgroup FileBackend File backend
- * @ingroup  FileRepo
  *
  * File backend is used to interact with file storage systems,
  * such as the local file system, NFS, or cloud storage systems.
@@ -191,7 +190,6 @@ abstract class FileBackend {
         *         'content'             => <string of new file contents>,
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
-        *         'disposition'         => <Content-Disposition header value>,
         *         'headers'             => <HTTP header name/value map> # since 1.21
         *     );
         * @endcode
@@ -204,7 +202,6 @@ abstract class FileBackend {
         *         'dst'                 => <storage path>,
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
-        *         'disposition'         => <Content-Disposition header value>,
         *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
@@ -218,7 +215,7 @@ abstract class FileBackend {
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
         *         'ignoreMissingSource' => <boolean>, # since 1.21
-        *         'disposition'         => <Content-Disposition header value>
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
         *
@@ -231,7 +228,7 @@ abstract class FileBackend {
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
         *         'ignoreMissingSource' => <boolean>, # since 1.21
-        *         'disposition'         => <Content-Disposition header value>
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
         *
@@ -249,7 +246,6 @@ abstract class FileBackend {
         *     array(
         *         'op'                  => 'describe',
         *         'src'                 => <storage path>,
-        *         'disposition'         => <Content-Disposition header value>,
         *         'headers'             => <HTTP header name/value map>
         *     )
         * @endcode
@@ -268,13 +264,11 @@ abstract class FileBackend {
         *   - overwriteSame       : An error will not be given if a file already
         *                           exists at the destination that has the same
         *                           contents as the new contents to be written there.
-        *   - disposition         : If supplied, the backend will return a Content-Disposition
-        *                           header when GETs/HEADs of the destination file are made.
-        *                           Backends that don't support metadata ignore this.
-        *                           See http://tools.ietf.org/html/rfc6266. (since 1.20)
         *   - headers             : If supplied, the backend will return these headers when
         *                           GETs/HEADs of the destination file are made. Header values
         *                           should be smaller than 256 bytes, often options or numbers.
+        *                           Content-Disposition headers can be longer, though the system
+        *                           might ignore or truncate ones that are too long to store.
         *                           Existing headers will remain, but these will replace any
         *                           conflicting previous headers, and headers will be removed
         *                           if they are set to an empty string.
@@ -321,6 +315,11 @@ abstract class FileBackend {
                if ( empty( $opts['force'] ) ) { // sanity
                        unset( $opts['nonLocking'] );
                }
+               foreach ( $ops as &$op ) {
+                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
+                               $op['headers']['Content-Disposition'] = $op['disposition'];
+                       }
+               }
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doOperationsInternal( $ops, $opts );
        }
@@ -452,7 +451,6 @@ abstract class FileBackend {
         *         'op'                  => 'create',
         *         'dst'                 => <storage path>,
         *         'content'             => <string of new file contents>,
-        *         'disposition'         => <Content-Disposition header value>,
         *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
@@ -463,7 +461,6 @@ abstract class FileBackend {
         *         'op'                  => 'store',
         *         'src'                 => <file system path>,
         *         'dst'                 => <storage path>,
-        *         'disposition'         => <Content-Disposition header value>,
         *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
@@ -475,7 +472,7 @@ abstract class FileBackend {
         *         'src'                 => <storage path>,
         *         'dst'                 => <storage path>,
         *         'ignoreMissingSource' => <boolean>, # since 1.21
-        *         'disposition'         => <Content-Disposition header value>
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
         *
@@ -486,7 +483,7 @@ abstract class FileBackend {
         *         'src'                 => <storage path>,
         *         'dst'                 => <storage path>,
         *         'ignoreMissingSource' => <boolean>, # since 1.21
-        *         'disposition'         => <Content-Disposition header value>
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
         *
@@ -504,7 +501,6 @@ abstract class FileBackend {
         *     array(
         *         'op'                  => 'describe',
         *         'src'                 => <storage path>,
-        *         'disposition'         => <Content-Disposition header value>,
         *         'headers'             => <HTTP header name/value map>
         *     )
         * @endcode
@@ -519,13 +515,11 @@ abstract class FileBackend {
         * @par Boolean flags for operations (operation-specific):
         *   - ignoreMissingSource : The operation will simply succeed and do
         *                           nothing if the source file does not exist.
-        *   - disposition         : When supplied, the backend will add a Content-Disposition
-        *                           header when GETs/HEADs of the destination file are made.
-        *                           Backends that don't support file metadata will ignore this.
-        *                           See http://tools.ietf.org/html/rfc6266 (since 1.20).
         *   - headers             : If supplied with a header name/value map, the backend will
         *                           reply with these headers when GETs/HEADs of the destination
         *                           file are made. Header values should be smaller than 256 bytes.
+        *                           Content-Disposition headers can be longer, though the system
+        *                           might ignore or truncate ones that are too long to store.
         *                           Existing headers will remain, but these will replace any
         *                           conflicting previous headers, and headers will be removed
         *                           if they are set to an empty string.
@@ -551,6 +545,9 @@ abstract class FileBackend {
                }
                foreach ( $ops as &$op ) {
                        $op['overwrite'] = true; // avoids RTTs in key/value stores
+                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
+                               $op['headers']['Content-Disposition'] = $op['disposition'];
+                       }
                }
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doQuickOperationsInternal( $ops );
index 3f1d185..1a9ac3b 100644 (file)
@@ -92,7 +92,6 @@ abstract class FileBackendStore extends FileBackend {
         * $params include:
         *   - content     : the raw file contents
         *   - dst         : destination storage path
-        *   - disposition : Content-Disposition header value for the destination
         *   - headers     : HTTP header name/value map
         *   - async       : Status will be returned immediately if supported.
         *                   If the status is OK, then its value field will be
@@ -135,7 +134,6 @@ abstract class FileBackendStore extends FileBackend {
         * $params include:
         *   - src         : source path on disk
         *   - dst         : destination storage path
-        *   - disposition : Content-Disposition header value for the destination
         *   - headers     : HTTP header name/value map
         *   - async       : Status will be returned immediately if supported.
         *                   If the status is OK, then its value field will be
@@ -179,7 +177,7 @@ abstract class FileBackendStore extends FileBackend {
         *   - src                 : source storage path
         *   - dst                 : destination storage path
         *   - ignoreMissingSource : do nothing if the source file does not exist
-        *   - disposition         : Content-Disposition header value for the destination
+        *   - headers             : HTTP header name/value map
         *   - async               : Status will be returned immediately if supported.
         *                           If the status is OK, then its value field will be
         *                           set to a FileBackendStoreOpHandle object.
@@ -248,7 +246,7 @@ abstract class FileBackendStore extends FileBackend {
         *   - src                 : source storage path
         *   - dst                 : destination storage path
         *   - ignoreMissingSource : do nothing if the source file does not exist
-        *   - disposition         : Content-Disposition header value for the destination
+        *   - headers             : HTTP header name/value map
         *   - async               : Status will be returned immediately if supported.
         *                           If the status is OK, then its value field will be
         *                           set to a FileBackendStoreOpHandle object.
@@ -294,7 +292,6 @@ abstract class FileBackendStore extends FileBackend {
         *
         * $params include:
         *   - src           : source storage path
-        *   - disposition   : Content-Disposition header value for the destination
         *   - headers       : HTTP header name/value map
         *   - async         : Status will be returned immediately if supported.
         *                     If the status is OK, then its value field will be
@@ -1277,15 +1274,20 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * Strip long HTTP headers from a file operation
+        * Strip long HTTP headers from a file operation.
+        * Most headers are just numbers, but some are allowed to be long.
+        * This function is useful for cleaning up headers and avoiding backend
+        * specific errors, especially in the middle of batch file operations.
         *
         * @param array $op Same format as doOperation()
         * @return Array
         */
        protected function stripInvalidHeadersFromOp( array $op ) {
-               if ( isset( $op['headers'] ) ) {
+               static $longs = array( 'Content-Disposition' );
+               if ( isset( $op['headers'] ) ) { // op sets HTTP headers
                        foreach ( $op['headers'] as $name => $value ) {
-                               if ( strlen( $name ) > 255 || strlen( $value ) > 255 ) {
+                               $maxHVLen = in_array( $name, $longs ) ? INF : 255;
+                               if ( strlen( $name ) > 255 || strlen( $value ) > $maxHVLen ) {
                                        trigger_error( "Header '$name: $value' is too long." );
                                        unset( $op['headers'][$name] );
                                } elseif ( !strlen( $value ) ) {
index bb0ab57..e019324 100644 (file)
@@ -457,7 +457,7 @@ abstract class FileOp {
 class CreateFileOp extends FileOp {
        protected function allowedParams() {
                return array( array( 'content', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
+                       array( 'overwrite', 'overwriteSame', 'headers' ) );
        }
 
        protected function doPrecheck( array &$predicates ) {
@@ -521,7 +521,7 @@ class StoreFileOp extends FileOp {
         */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
+                       array( 'overwrite', 'overwriteSame', 'headers' ) );
        }
 
        /**
@@ -596,7 +596,7 @@ class CopyFileOp extends FileOp {
         */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
+                       array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
        }
 
        /**
@@ -673,7 +673,7 @@ class MoveFileOp extends FileOp {
         */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
+                       array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
        }
 
        /**
@@ -813,7 +813,7 @@ class DescribeFileOp extends FileOp {
         * @return array
         */
        protected function allowedParams() {
-               return array( array( 'src' ), array( 'disposition', 'headers' ) );
+               return array( array( 'src' ), array( 'headers' ) );
        }
 
        /**
index 0f3d97a..aadad5c 100644 (file)
@@ -194,7 +194,19 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * @param string $disposition Content-Disposition header value
+        * @param $headers array
+        * @return array
+        */
+       protected function sanitizeHdrs( array $headers ) {
+               // By default, Swift has annoyingly low maximum header value limits
+               if ( isset( $headers['Content-Disposition'] ) ) {
+                       $headers['Content-Disposition'] = $this->truncDisp( $headers['Content-Disposition'] );
+               }
+               return $headers;
+       }
+
+       /**
+        * @param $disposition string Content-Disposition header value
         * @return string Truncated Content-Disposition header value to meet Swift limits
         */
        protected function truncDisp( $disposition ) {
@@ -252,13 +264,9 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( !strlen( $obj->content_type ) ) { // special case
                                $obj->content_type = 'unknown/unknown';
                        }
-                       // Set the Content-Disposition header if requested
-                       if ( isset( $params['disposition'] ) ) {
-                               $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
-                       }
                        // Set any other custom headers if requested
                        if ( isset( $params['headers'] ) ) {
-                               $obj->headers += $params['headers'];
+                               $obj->headers += $this->sanitizeHdrs( $params['headers'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $obj->write_async( $params['content'] );
@@ -337,13 +345,9 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( !strlen( $obj->content_type ) ) { // special case
                                $obj->content_type = 'unknown/unknown';
                        }
-                       // Set the Content-Disposition header if requested
-                       if ( isset( $params['disposition'] ) ) {
-                               $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
-                       }
                        // Set any other custom headers if requested
                        if ( isset( $params['headers'] ) ) {
-                               $obj->headers += $params['headers'];
+                               $obj->headers += $this->sanitizeHdrs( $params['headers'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                wfSuppressWarnings();
@@ -424,8 +428,9 @@ class SwiftFileBackend extends FileBackendStore {
                try {
                        $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
                        $hdrs = array(); // source file headers to override with new values
-                       if ( isset( $params['disposition'] ) ) {
-                               $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+                       // Set any other custom headers if requested
+                       if ( isset( $params['headers'] ) ) {
+                               $hdrs += $this->sanitizeHdrs( $params['headers'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -497,8 +502,9 @@ class SwiftFileBackend extends FileBackendStore {
                        $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
                        $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
                        $hdrs = array(); // source file headers to override with new values
-                       if ( isset( $params['disposition'] ) ) {
-                               $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+                       // Set any other custom headers if requested
+                       if ( isset( $params['headers'] ) ) {
+                               $hdrs += $this->sanitizeHdrs( $params['headers'] );
                        }
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -603,19 +609,15 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $hdrs = isset( $params['headers'] ) ? $params['headers'] : array();
-               // Set the Content-Disposition header if requested
-               if ( isset( $params['disposition'] ) ) {
-                       $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
-               }
-
                try {
                        $sContObj = $this->getContainer( $srcCont );
                        // Get the latest version of the current metadata
                        $srcObj = $sContObj->get_object( $srcRel,
                                $this->headersFromParams( array( 'latest' => true ) ) );
                        // Merge in the metadata updates...
-                       $srcObj->headers = $hdrs + $srcObj->headers;
+                       if ( isset( $params['headers'] ) ) {
+                               $srcObj->headers = $this->sanitizeHdrs( $params['headers'] ) + $srcObj->headers;
+                       }
                        $srcObj->sync_metadata(); // save to Swift
                        $this->purgeCDNCache( array( $srcObj ) );
                } catch ( CDNNotEnabledException $e ) {
index 6d155df..0512a01 100644 (file)
@@ -54,6 +54,7 @@ abstract class LockManager {
        protected $locksHeld = array();
 
        protected $domain; // string; domain (usually wiki ID)
+       protected $lockTTL; // integer; maximum time locks can be held
 
        /* Lock types; stronger locks have higher values */
        const LOCK_SH = 1; // shared lock (for reads)
@@ -64,12 +65,22 @@ abstract class LockManager {
         * Construct a new instance from configuration
         *
         * $config paramaters include:
-        *   - domain : Domain (usually wiki ID) that all resources are relative to [optional]
+        *   - domain  : Domain (usually wiki ID) that all resources are relative to [optional]
+        *   - lockTTL : Age (in seconds) at which resource locks should expire.
+        *               This only applies if locks are not tied to a connection/process.
         *
         * @param $config Array
         */
        public function __construct( array $config ) {
                $this->domain = isset( $config['domain'] ) ? $config['domain'] : wfWikiID();
+               if ( isset( $config['lockTTL'] ) ) {
+                       $this->lockTTL = max( 1, $config['lockTTL'] );
+               } elseif ( PHP_SAPI === 'cli' ) {
+                       $this->lockTTL = 2*3600;
+               } else {
+                       $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
+                       $this->lockTTL = max( 5*60, 2*(int)$met );
+               }
        }
 
        /**
index 8131f81..fafc588 100644 (file)
@@ -48,7 +48,6 @@ class MemcLockManager extends QuorumLockManager {
        /** @var Array */
        protected $serversUp = array(); // (server name => bool)
 
-       protected $lockExpiry; // integer; maximum time locks can be held
        protected $session = ''; // string; random UUID
 
        /**
@@ -86,9 +85,6 @@ class MemcLockManager extends QuorumLockManager {
                        }
                }
 
-               $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
-               $this->lockExpiry = $met ? 2*(int)$met : 2*3600;
-
                $this->session = wfRandomString( 32 );
        }
 
@@ -138,7 +134,7 @@ class MemcLockManager extends QuorumLockManager {
                        }
                        if ( $status->isOK() ) {
                                // Register the session in the lock record array
-                               $locksHeld[$type][$this->session] = $now + $this->lockExpiry;
+                               $locksHeld[$type][$this->session] = $now + $this->lockTTL;
                                // We will update this record if none of the other locks conflict
                                $lockRecords[$locksKey] = $locksHeld;
                        }
@@ -242,7 +238,7 @@ class MemcLockManager extends QuorumLockManager {
                if ( isset( $this->bagOStuffs[$lockSrv] ) ) {
                        $memc = $this->bagOStuffs[$lockSrv];
                        if ( !isset( $this->serversUp[$lockSrv] ) ) {
-                               $this->serversUp[$lockSrv] = $memc->set( 'MemcLockManager:ping', 1, 1 );
+                               $this->serversUp[$lockSrv] = $memc->set( __CLASS__ . ':ping', 1, 1 );
                                if ( !$this->serversUp[$lockSrv] ) {
                                        trigger_error( __METHOD__ . ": Could not contact $lockSrv.", E_USER_WARNING );
                                }
index ef055de..473e727 100644 (file)
@@ -604,14 +604,28 @@ Used as error message.',
        'config-page-install' => '{{Identical|Install}}',
        'config-page-copying' => 'This is a link to the full GPL text',
        'config-restart' => 'Button text to confirm the installation procedure has to be restarted.',
+       'config-copyright' => 'This message follows {{msg-mw|config-env-good}}.
+
+Parameters:
+* $1 - copyright and author list',
        'config-sidebar' => 'Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.',
        'config-env-php' => 'Parameters:
-* $1 is the version of PHP that has been installed.',
+* $1 - the version of PHP that has been installed
+See also:
+* {{msg-mw|config-env-php-toolow}}',
+       'config-env-php-toolow' => 'Parameters:
+* $1 - the version of PHP that has been installed
+* $2 - minimum PHP version number
+See also:
+* {{msg-mw|config-env-php}}',
        'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
        'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
        'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysql</code>" and "<code>php5-mysql</code>".}}
 Parameters:
 * $1 is comma separated list of database types supported by MediaWiki.',
+       'config-outdated-sqlite' => 'Used as warning. Parameters:
+* $1 - the version of SQLite that has been installed
+* $2 - minimum version',
        'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
        'config-magic-quotes-runtime' => '{{Related|Config-fatal}}',
        'config-magic-quotes-sybase' => '{{Related|Config-fatal}}',
@@ -634,14 +648,28 @@ Parameters:
 Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
        'config-no-cli-uri' => 'Parameters:
 * $1 is the default value for scriptpath.',
+       'config-using-server' => 'Used as a part of environment check result. Parameters:
+* $1 - default server name',
+       'config-using-uri' => 'Used as a part of environment check result. Parameters:
+* $1 - server name
+* $2 - script path',
+       'config-uploads-not-safe' => 'Used as a part of environment check result. Parameters:
+* $1 - name of directory for images: <code>$IP/images/</code>',
        'config-no-cli-uploads-check' => 'CLI = [[w:Command-line interface|command-line interface]] (i.e. the installer runs as a command-line script, not using HTML interface via an internet browser)',
+       'config-using531' => 'Used as error message. Parameters:
+* $1 - the version of PHP that has been installed',
        'config-suhosin-max-value-length' => '{{doc-important|Do not translate "length", "suhosin.get.max_value_length", "php.ini", "$wgResourceLoaderMaxQueryLength" and "LocalSettings.php".}}
 Message shown when PHP parameter <code>suhosin.get.max_value_length</code> is between 0 and 1023 (that max value is hard set in MediaWiki software).',
        'config-db-host-help' => '{{doc-singularthey}}',
        'config-db-host-oracle' => 'TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)',
        'config-db-wiki-settings' => 'This is more acurate: "Enter identifying or distinguishing data for this wiki" since a MySQL database can host tables of several wikis.',
        'config-db-account-oracle-warn' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+       'config-db-password-empty' => 'Used as error message. Parameters:
+* $1 - database username',
        'config-db-account-lock' => "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
+       'config-mysql-old' => 'Used as error message. Parameters:
+* $1 - minimum version
+* $2 - the version of MySQL that has been installed',
        'config-pg-test-error' => '* $1 - database name
 * $2 - error message',
        'config-sqlite-dir-help' => '{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}
@@ -660,20 +688,105 @@ Used in help box.',
 * $1 - a link to the SQLite home page having the anchor text "SQLite".',
        'config-support-oracle' => 'Parameters:
 * $1 - a link to the Oracle home page, the anchor text of which is "Oracle".',
+       'config-invalid-db-server-oracle' => 'Used as error message. Parameters:
+* $1 - database server name
+See also:
+* {{msg-mw|Config-invalid-db-name}}
+* {{msg-mw|Config-invalid-db-prefix}}',
+       'config-invalid-db-name' => 'Used as error message. Parameters:
+* $1 - database name
+See also:
+* {{msg-mw|Config-invalid-db-server-oracle}}
+* {{msg-mw|Config-invalid-db-prefix}}',
+       'config-invalid-db-prefix' => 'Used as error message. Parameters:
+* $1 - database prefix
+See also:
+* {{msg-mw|Config-invalid-db-server-oracle}}
+* {{msg-mw|Config-invalid-db-name}}',
        'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
 
 If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
        'config-invalid-schema' => '*$1 - schema name',
+       'config-db-sys-user-exists-oracle' => 'Used as error message. Parameters:
+* $1 - database username',
+       'config-postgres-old' => 'Used as error message. Used as warning. Parameters:
+* $1 - minimum version
+* $2 - the version of PostgreSQL that has been installed',
+       'config-sqlite-parent-unwritable-group' => 'Used as SQLite error message. Parameters:
+* $1 - data directory
+* $2 - "dirname" part of $1
+* $3 - "basename" part of $1
+* $4 - web server\'s primary group name
+See also:
+* {{msg-mw|Config-sqlite-parent-unwritable-nogroup}}',
+       'config-sqlite-parent-unwritable-nogroup' => 'Used as SQLite error message. Parameters:
+* $1 - data directory
+* $2 - "dirname" part of $1
+* $3 - "basename" part of $1
+See also:
+* {{msg-mw|Config-sqlite-parent-unwritable-group}}',
+       'config-sqlite-mkdir-error' => 'Used as SQLite error message. Parameters:
+* $1 - data directory name',
        'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
+       'config-sqlite-connection-error' => 'Used as SQLite error message. Parameters:
+* $1 - error message which SQLite server returned',
+       'config-sqlite-readonly' => 'Used as SQLite error message. Parameters:
+* $1 - filename',
+       'config-sqlite-cant-create-db' => 'Used as SQLite error message. Parameters:
+* $1 - filename',
        'config-can-upgrade' => 'Parameters:
 * $1 - Version or Revision indicator.',
+       'config-upgrade-done' => 'Used as success message. Parameters:
+* $1 - full URL of index.php
+See also:
+* {{msg-mw|config-upgrade-done-no-regenerate}}',
+       'config-upgrade-done-no-regenerate' => 'Used as success message. Parameters:
+* $1 - full URL of index.php
+See also:
+* {{msg-mw|config-upgrade-done}}',
        'config-show-table-status' => '{{doc-important|"<code>SHOW TABLE STATUS</code>" is a MySQL command. Do not translate this.}}',
        'config-db-web-account-same' => 'checkbox label',
        'config-db-web-create' => 'checkbox label',
-       'config-ns-generic' => '{{Identical|Project}}',
+       'config-ns-generic' => 'Used as label for "namespace type" radio button.
+
+See also:
+* {{msg-mw|Config-ns-site-name}}
+* {{msg-mw|Config-ns-other}}
+{{Identical|Project}}',
+       'config-ns-site-name' => 'Used as label for "namespace type" radio button. Parameters:
+* $1 - wiki name
+See also:
+* {{msg-mw|Config-ns-generic}}
+* {{msg-mw|Config-ns-other}}',
+       'config-ns-other' => "Used as label for \"namespace type\" radio button.
+
+This message is followed by the input box which enables to '''specify''' a namespace name.
+
+See also:
+* {{msg-mw|Config-ns-site-name}}
+* {{msg-mw|Config-ns-generic}}",
+       'config-ns-invalid' => 'Used as error message. Parameters:
+* $1 - namespace name
+See also:
+* {{msg-mw|Config-ns-conflict}}',
+       'config-ns-conflict' => 'Used as error message. Parameters:
+* $1 - namespace name
+See also:
+* {{msg-mw|Config-ns-invalid}}',
        'config-admin-name' => '{{Identical|Your name}}',
        'config-admin-password' => '{{Identical|Password}}',
+       'config-admin-name-invalid' => 'Used as error message. Parameters:
+* $1 - username of administrator',
        'config-admin-email' => '{{Identical|E-mail address}}',
+       'config-admin-error-user' => 'Used as error message. Parameters:
+* $1 - username of administrator
+See also:
+* {{msg-mw|Config-admin-error-password}}',
+       'config-admin-error-password' => 'Used as error message. Parameters:
+* $1 - username of administrator
+* $2 - error message
+See also:
+* {{msg-mw|Config-admin-error-user}}',
        'config-subscribe' => 'Used as label for the installer checkbox',
        'config-subscribe-help' => '"Low-volume" in this context means that there will be few e-mails to that mailing list per time period.',
        'config-profile-help' => 'Messages referenced:
@@ -685,10 +798,31 @@ If you\'re translating this message to a right-to-left language, consider writin
        'config-email-user' => '{{Identical|Enable user-to-user e-mail}}',
        'config-upload-help' => 'The word "mode" here refers to the access rights given to various user groups when attempting to create and store files and/or subdiretories in the said directory on the server. It also refers to the <code>mode</code> command used to maipulate said right mask under Unix, Linux, and similar operating systems. A less operating-system-centric translation is fine.',
        'config-logo-help' => '',
+       'config-instantcommons' => 'Used as label for the checkbox.
+
+The help message for this checkbox is:
+* {{msg-mw|Config-instantcommons-help}}',
+       'config-instantcommons-help' => 'Used as help message for the checkbox which is labeled {{msg-mw|config-instantcommons}}.',
        'config-cc-not-chosen' => '{{doc-important|Do not translate the "<code>proceed</code>" part.}}
 This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to click "proceed" so as to return to the MediaWiki installer page.',
        'config-memcached-servers' => '{{doc-important|Do not translate "memcached".}}
 {{Identical|Memcached server}}',
+       'config-memcache-badip' => 'Used as error message. Parameters:
+* $1 - IP address for Memcached
+See also:
+* {{msg-mw|Config-memcache-noport}}
+* {{msg-mw|Config-memcache-badport}}',
+       'config-memcache-noport' => 'Used as error message. Parameters:
+* $1 - Memcached server name
+See also:
+* {{msg-mw|Config-memcache-badip}}
+* {{msg-mw|Config-memcache-badport}}',
+       'config-memcache-badport' => 'Used as error message. Parameters:
+* $1 - 1 (hard-coded)
+* $2 - 65535 (hard-coded)
+See also:
+* {{msg-mw|Config-memcache-badip}}
+* {{msg-mw|Config-memcache-noport}}',
        'config-extensions' => '{{Identical|Extension}}',
        'config-extensions-help' => '{{doc-important|Do not translate <code>./extensions</code>.}}
 Used in help box.',
@@ -715,6 +849,8 @@ Used in help box.',
        'config-install-pg-schema-failed' => 'Parameters:
 * $1 = database user name (usernames in the database are unrelated to wiki user names)
 * $2 =',
+       'config-pg-no-plpgsql' => 'Used as error message. Parameters:
+* $1 - database name',
        'config-install-user' => 'Message indicates that the user is being created
 
 See also:
@@ -727,9 +863,22 @@ See also:
 *{{msg-mw|Config-install-keys}}
 *{{msg-mw|Config-install-sysop}}
 *{{msg-mw|Config-install-mainpage}}',
+       'config-install-user-alreadyexists' => 'Used as warning. Parameters:
+* $1 - database username',
+       'config-install-user-create-failed' => 'Used as MySQL warning and as PostgreSQL error. Parameters:
+* $1 - database username
+* $2 - detailed warning/error message',
        'config-install-user-grant-failed' => 'Parameters:
 * $1 is the database username for which granting rights failed
 * $2 is the error message',
+       'config-install-user-missing' => 'Used as PostgreSQL error message. Parameters:
+* $1 - database username
+See also:
+* {{msg-mw|Config-install-user-missing-create}}',
+       'config-install-user-missing-create' => 'Used as PostgreSQL error message. Parameters:
+* $1 - database username
+See also:
+* {{msg-mw|Config-install-user-missing}}',
        'config-install-tables' => 'Message indicates that the tables are being created
 
 See also:
@@ -742,6 +891,8 @@ See also:
 *{{msg-mw|Config-install-keys}}
 *{{msg-mw|Config-install-sysop}}
 *{{msg-mw|Config-install-mainpage}}',
+       'config-install-tables-failed' => 'Used as PostgreSQL error message. Parameters:
+* $1 - detailed error message',
        'config-install-interwiki' => 'Message indicates that the interwikitables are being populated
 
 See also:
@@ -799,6 +950,8 @@ See also:
 *{{msg-mw|Config-install-keys}}
 *{{msg-mw|Config-install-sysop}}
 *{{msg-mw|Config-install-mainpage}}',
+       'config-install-mainpage-failed' => 'Used as error message. Parameters:
+* $1 - detailed error message',
        'config-install-done' => 'Parameters:
 * $1 is the URL to LocalSettings download
 * $2 is a link to the wiki.
@@ -806,6 +959,8 @@ See also:
        'config-download-localsettings' => 'The link text used in the download link in config-install-done.',
        'config-help' => 'This is used in help boxes.
 {{Identical|Help}}',
+       'config-nofile' => 'Used as failure message. Parameters:
+* $1 - filename',
        'mainpagetext' => 'Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.',
        'mainpagedocfooter' => 'Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.
 This might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example.',
@@ -3949,7 +4104,6 @@ Es ist daher zu erwägen die Datendatei an gänzlich anderer Stelle abzulegen, b
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki unterstützt die folgenden Datenbanksysteme:
 
 $1
@@ -3959,12 +4113,10 @@ Sofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt
        'config-support-postgres' => '* $1 ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung]). Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird.',
        'config-support-sqlite' => '* $1 ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))',
        'config-support-oracle' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])',
-       'config-support-ibm_db2' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/ibm-db2.installation.php PHP mit IBM-DB2-Support kompilieren])',
        'config-header-mysql' => 'MySQL-Einstellungen',
        'config-header-postgres' => 'PostgreSQL-Einstellungen',
        'config-header-sqlite' => 'SQLite-Einstellungen',
        'config-header-oracle' => 'Oracle-Einstellungen',
-       'config-header-ibm_db2' => 'IBM DB2-Einstellungen',
        'config-invalid-db-type' => 'Unzulässiges Datenbanksystem',
        'config-missing-db-name' => 'Bei „Datenbankname“ muss ein Wert angegeben werden.',
        'config-missing-db-host' => 'Bei „Datenbankhost“ muss ein Wert angegeben werden.',
@@ -4058,7 +4210,6 @@ Dies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwen
 
 Im '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,
 allerdings können keine Zeichen außerhalb des [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
-       'config-ibm_db2-low-db-pagesize' => "Die DB2-Datenbank verfügt über einen Standardtabellenraum mit einer unzureichenden Seitengröße. Die Seitengröße muss '''32 000'' oder größer sein.",
        'config-site-name' => 'Name des Wikis:',
        'config-site-name-help' => 'Er wird in der Titelleiste des Browsers, wie auch verschiedenen anderen Stellen, genutzt.',
        'config-site-name-blank' => 'Den Namen des Wikis angeben.',
@@ -4180,7 +4331,7 @@ Die Lizenz ist daher jetzt manuell einzugeben.',
 Es wird sehr empfohlen es für mittelgroße bis große Wikis zu nutzen, aber auch für kleine Wikis ergeben sich erkennbare Geschwindigkeitsverbesserungen.',
        'config-cache-none' => 'Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann dies die Geschwindigkeit größerer Wikis negativ beeinflussen)',
        'config-cache-accel' => 'Objektcaching von PHP (APC, XCache oder WinCache)',
-       'config-cache-memcached' => 'Memchached Cacheserver nutzen (erfordert einen zusätzliche Installationsvorgang mitsamt Konfiguration)',
+       'config-cache-memcached' => 'Memcached Cacheserver nutzen (erfordert einen zusätzlichen Installationsvorgang mitsamt Konfiguration)',
        'config-memcached-servers' => 'Memcached Cacheserver',
        'config-memcached-help' => 'Liste der für Memcached nutzbaren IP-Adressen.
 Es sollte eine je Zeile mitsamt des vorgesehenen Ports angegeben werden. Beispiele:
@@ -10283,8 +10434,8 @@ chmod a+w $3</pre>',
 
 [$1 ウィキを使い始める]ことができます。
 
-もし、<code>LocalSettings.php</code>ファイルを再生成したいのならば、下のボタンを押してください。
\82¦ã\82£ã\82­ã\81«å\95\8fé¡\8cã\81\8cã\81ªã\81\84ã\81®ã\81§ã\81\82ã\82\8cã\81°ã\80\81ã\81\93ã\82\8cは'''推奨されません'''。",
+<code>LocalSettings.php</code> ファイルを再生成したい場合は、下のボタンを押してください。
\82¦ã\82£ã\82­ã\81«å\95\8fé¡\8cã\81\8cã\81\82ã\82\8bå ´å\90\88ã\82\92é\99¤ã\81\8dã\80\81å\86\8dç\94\9fæ\88\90は'''推奨されません'''。",
        'config-upgrade-done-no-regenerate' => 'アップグレードが完了しました。
 
 [$1 ウィキの使用を開始]することができます。',
@@ -10418,10 +10569,10 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
 
 ロゴが不要の場合は、このボックスを空白のままにしてください。',
        'config-instantcommons' => 'Instant Commons 機能を有効にする',
-       'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトで見つかった画像や音声、その他のメディアをウィキ上で利用することができるようになる機能です。
-これを有効化するには、MediaWikiはインターネットに接続できなければなりません
+       'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトにある画像、音声、その他のメディアをウィキ上で利用できるようにする機能です。
+これを使用するには、MediaWiki がインターネットに接続できる必要があります
 
-ウィキメディア・コモンズ以外のウィキを同じように設定する方法など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。',
+ウィキメディア・コモンズ以外のウィキを同様に設定する手順など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。',
        'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスの選択器から結果が得られませんでした。
 ライセンスの名前を手動で入力してください。',
        'config-cc-again' => 'もう一度選択してください...',
@@ -10438,6 +10589,9 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
 カンマ区切りで、利用する特定のポートの指定が必要です。例:
 127.0.0.1:11211
 192.168.1.25:1234',
+       'config-memcache-noport' => 'Memcached サーバー $1 で使用するポート番号を指定していません。
+ポート番号が分からない場合、既定値は 11211 です。',
+       'config-memcache-badport' => 'Memcached のポート番号は $1 から $2 の範囲にしてください。',
        'config-extensions' => '拡張機能',
        'config-extensions-help' => '<code>./extensions</code>ディレクトリ内で、上記リストの拡張機能が発見されました。
 
@@ -10455,6 +10609,7 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
        'config-install-pg-schema-failed' => 'テーブルの作成に失敗しました。
 利用者「$1」がスキーマ「$2」に書き込めるようにしてください。',
        'config-install-pg-commit' => '変更を送信',
+       'config-pg-no-plpgsql' => 'データベース $1 内に PL/pgSQL 言語をインストールする必要があります。',
        'config-install-user' => 'データベースユーザーの作成',
        'config-install-user-alreadyexists' => 'ユーザー「$1」は既に存在します',
        'config-install-user-create-failed' => 'ユーザー「$1」の作成に失敗しました: $2',
index 69c98a1..9119c12 100644 (file)
@@ -1289,7 +1289,7 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 
        abstract protected function getFileName();
 
-       public  function execute() {
+       public function execute() {
                $text = $this->getFileContents();
                $text = InstallDocFormatter::format( $text );
                $this->parent->output->addWikiText( $text );
index b0dd925..5ef52b5 100644 (file)
@@ -37,6 +37,8 @@ abstract class JobQueue {
 
        const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
 
+       const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
+
        /**
         * @param $params array
         */
@@ -262,6 +264,15 @@ abstract class JobQueue {
                wfProfileIn( __METHOD__ );
                $job = $this->doPop();
                wfProfileOut( __METHOD__ );
+
+               // Flag this job as an old duplicate based on its "root" job...
+               try {
+                       if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
+                               wfIncrStats( 'job-pop-duplicate' );
+                               $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
+                       }
+               } catch ( MWException $e ) {} // don't lose jobs over this
+
                return $job;
        }
 
@@ -344,7 +355,76 @@ abstract class JobQueue {
         * @return bool
         */
        protected function doDeduplicateRootJob( Job $job ) {
-               return true;
+               global $wgMemc;
+
+               $params = $job->getParams();
+               if ( !isset( $params['rootJobSignature'] ) ) {
+                       throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
+               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
+                       throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
+               }
+               $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+               // Callers should call batchInsert() and then this function so that if the insert
+               // fails, the de-duplication registration will be aborted. Since the insert is
+               // deferred till "transaction idle", do the same here, so that the ordering is
+               // maintained. Having only the de-duplication registration succeed would cause
+               // jobs to become no-ops without any actual jobs that made them redundant.
+               $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+               if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+                       return true; // a newer version of this root job was enqueued
+               }
+
+               // Update the timestamp of the last root job started at the location...
+               return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+       }
+
+       /**
+        * Check if the "root" job of a given job has been superseded by a newer one
+        *
+        * @param $job Job
+        * @return bool
+        * @throws MWException
+        */
+       final protected function isRootJobOldDuplicate( Job $job ) {
+               if ( $job->getType() !== $this->type ) {
+                       throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+               }
+               wfProfileIn( __METHOD__ );
+               $isDuplicate = $this->doIsRootJobOldDuplicate( $job );
+               wfProfileOut( __METHOD__ );
+               return $isDuplicate;
+       }
+
+       /**
+        * @see JobQueue::isRootJobOldDuplicate()
+        * @param Job $job
+        * @return bool
+        */
+       protected function doIsRootJobOldDuplicate( Job $job ) {
+               global $wgMemc;
+
+               $params = $job->getParams();
+               if ( !isset( $params['rootJobSignature'] ) ) {
+                       return false; // job has no de-deplication info
+               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
+                       trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
+                       return false;
+               }
+
+               // Get the last time this root job was enqueued
+               $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+
+               // Check if a new root job was started at the location after this one's...
+               return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+       }
+
+       /**
+        * @param string $signature Hash identifier of the root job
+        * @return string
+        */
+       protected function getRootJobCacheKey( $signature ) {
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
        }
 
        /**
index 74e9171..512a24a 100644 (file)
@@ -25,6 +25,7 @@
  * Class to handle tracking information about all queues using PhpRedis
  *
  * @ingroup JobQueue
+ * @ingroup Redis
  * @since 1.21
  */
 class JobQueueAggregatorRedis extends JobQueueAggregator {
index a7a459f..4b22e94 100644 (file)
@@ -28,7 +28,6 @@
  * @since 1.21
  */
 class JobQueueDB extends JobQueue {
-       const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
        const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
        const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
@@ -252,11 +251,6 @@ class JobQueueDB extends JobQueue {
                        $job = Job::factory( $row->job_cmd, $title,
                                self::extractBlob( $row->job_params ), $row->job_id );
                        $job->id = $row->job_id; // XXX: work around broken subclasses
-                       // Flag this job as an old duplicate based on its "root" job...
-                       if ( $this->isRootJobOldDuplicate( $job ) ) {
-                               wfIncrStats( 'job-pop-duplicate' );
-                               $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
-                       }
                        break; // done
                } while( true );
 
@@ -533,30 +527,6 @@ class JobQueueDB extends JobQueue {
                return true;
        }
 
-       /**
-        * Check if the "root" job of a given job has been superseded by a newer one
-        *
-        * @param $job Job
-        * @return bool
-        */
-       protected function isRootJobOldDuplicate( Job $job ) {
-               global $wgMemc;
-
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
-                       return false; // job has no de-deplication info
-               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-                       trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
-                       return false;
-               }
-
-               // Get the last time this root job was enqueued
-               $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
-
-               // Check if a new root job was started at the location after this one's...
-               return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
-       }
-
        /**
         * @see JobQueue::doWaitForBackups()
         * @return void
@@ -671,15 +641,6 @@ class JobQueueDB extends JobQueue {
                return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
        }
 
-       /**
-        * @param string $signature Hash identifier of the root job
-        * @return string
-        */
-       private function getRootJobCacheKey( $signature ) {
-               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
-       }
-
        /**
         * @param $params
         * @return string
index 3db8260..338dc79 100644 (file)
 /**
  * Class to handle job queues stored in Redis
  *
+ * This is faster, less resource intensive, queue that JobQueueDB.
+ * All data for a queue using this class is placed into one redis server.
+ *
+ * There are seven main redis keys used to track jobs:
+ *   - l-unclaimed  : A list of job IDs used for push/pop
+ *   - z-claimed    : A sorted set of (job ID, UNIX timestamp as score) used for job retries
+ *   - z-abandoned  : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
+ *   - h-idBySha1   : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
+ *   - h-sha1Byid   : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
+ *   - h-attempts   : A hash of (job ID => attempt count) used for job claiming/retries
+ *   - h-data       : A hash of (job ID => serialized blobs) for job storage
+ * Any given job ID can be in only one of l-unclaimed, z-claimed, and z-abandoned.
+ * If an ID appears in any of those lists, it should have a h-data entry for its ID.
+ * If a job has a non-empty SHA1 de-duplication value and its ID is in l-unclaimed,
+ * then there should be no other such jobs. Every h-idBySha1 entry has an h-sha1Byid
+ * entry and every h-sha1Byid must refer to an ID that is l-unclaimed. If a job has its
+ * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
+ *
+ * Additionally, "rootjob:* keys to track "root jobs" used for additional de-duplication.
+ * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
+ * All the keys are prefixed with the relevant wiki ID information.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ * Additionally, it should be noted that redis has different persistence modes, such
+ * as rdb snapshots, journaling, and no persistent. Appropriate configuration should be
+ * made on the servers based on what queues are using it and what tolerance they have.
+ *
  * @ingroup JobQueue
+ * @ingroup Redis
  * @since 1.21
  */
 class JobQueueRedis extends JobQueue {
@@ -33,7 +61,6 @@ class JobQueueRedis extends JobQueue {
 
        protected $server; // string; server address
 
-       const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
 
        protected $key; // string; key to prefix the queue keys with (used for testing)
@@ -41,6 +68,7 @@ class JobQueueRedis extends JobQueue {
        /**
         * @params include:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+        *                   Note that the serializer option is ignored "none" is always used.
         *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
         *                   If a hostname is specified but no port, the standard port number
         *                   6379 will be used. Required.
@@ -48,6 +76,7 @@ class JobQueueRedis extends JobQueue {
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
+               $params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
                $this->server = $params['redisServer'];
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
        }
@@ -66,12 +95,7 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doIsEmpty() {
-               $conn = $this->getConnection();
-               try {
-                       return ( $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) ) == 0 );
-               } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
-               }
+               return $this->doGetSize() == 0;
        }
 
        /**
@@ -99,7 +123,10 @@ class JobQueueRedis extends JobQueue {
                }
                $conn = $this->getConnection();
                try {
-                       return $conn->lSize( $this->getQueueKey( 'l-claimed' ) );
+                       $conn->multi( Redis::PIPELINE );
+                       $conn->zSize( $this->getQueueKey( 'z-claimed' ) );
+                       $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+                       return array_sum( $conn->exec() );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -113,65 +140,50 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doBatchPush( array $jobs, $flags ) {
-               if ( !count( $jobs ) ) {
-                       return true;
-               }
-
-               // Convert the jobs into a list of field maps
-               $items = array(); // (uid => job fields map)
+               // Convert the jobs into field maps (de-duplicated against each other)
+               $items = array(); // (job ID => job fields map)
                foreach ( $jobs as $job ) {
                        $item = $this->getNewJobFields( $job );
-                       $items[$item['uid']] = $item;
+                       if ( strlen( $item['sha1'] ) ) { // hash identifier => de-duplicate
+                               $items[$item['sha1']] = $item;
+                       } else {
+                               $items[$item['uuid']] = $item;
+                       }
                }
-
-               $dedupUids = array(); // list of uids to check for duplicates
+               // Convert the field maps into serialized blobs
+               $tuples = array();
                foreach ( $items as $item ) {
-                       if ( $this->isHashUid( $item['uid'] ) ) { // hash identifier => de-duplicate
-                               $dedupUids[] = $item['uid'];
-                       }
+                       $tuples[] = array( $item['uuid'], $item['sha1'], serialize( $item ) );
+               }
+
+               if ( !count( $tuples ) ) {
+                       return true; // nothing to do
                }
 
                $conn = $this->getConnection();
                try {
-                       // Find which of these jobs are duplicates of unclaimed jobs in the queue...
-                       if ( count( $dedupUids ) ) {
-                               $conn->multi( Redis::PIPELINE );
-                               foreach ( $dedupUids as $uid ) { // check if job data exists
-                                       $conn->exists( $this->prefixWithQueueKey( 'data', $uid ) );
-                               }
-                               if ( $this->claimTTL > 0 ) { // check which jobs were claimed
-                                       foreach ( $dedupUids as $uid ) {
-                                               $conn->hExists( $this->prefixWithQueueKey( 'h-meta', $uid ), 'ctime' );
-                                       }
-                                       list( $exists, $claimed ) = array_chunk( $conn->exec(), count( $dedupUids ) );
+                       // Actually push the non-duplicate jobs into the queue...
+                       if ( $flags & self::QoS_Atomic ) {
+                               $batches = array( $tuples ); // all or nothing
+                       } else {
+                               $batches = array_chunk( $tuples, 500 ); // avoid tying up the server
+                       }
+                       $failed = 0;
+                       $pushed = 0;
+                       foreach ( $batches as $tupleBatch ) {
+                               $added = $this->pushBlobs( $conn, $tupleBatch );
+                               if ( is_int( $added ) ) {
+                                       $pushed += $added;
                                } else {
-                                       $exists = $conn->exec();
-                                       $claimed = array(); // no claim system
-                               }
-                               // Remove the duplicate jobs to cut down on pushing duplicate uids...
-                               foreach ( $dedupUids as $k => $uid ) {
-                                       if ( $exists[$k] && empty( $claimed[$k] ) ) {
-                                               unset( $items[$uid] );
-                                       }
+                                       $failed += count( $tupleBatch );
                                }
                        }
-                       // Actually push the non-duplicate jobs into the queue...
-                       if ( count( $items ) ) {
-                               $uids = array_keys( $items );
-                               $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                               $conn->mSet( $this->prefixKeysWithQueueKey( 'data', $items ) );
-                               call_user_func_array(
-                                       array( $conn, 'lPush' ),
-                                       array_merge( array( $this->getQueueKey( 'l-unclaimed' ) ), $uids )
-                               );
-                               $res = $conn->exec(); // commit (atomic trx)
-                               if ( in_array( false, $res, true ) ) {
-                                       wfDebugLog( 'JobQueueRedis', "Could not insert {$this->type} job(s)." );
-                                       return false;
-                               }
+                       if ( $failed > 0 ) {
+                               wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
+                               return false;
                        }
-                       wfIncrStats( 'job-insert', count( $items ) );
-                       wfIncrStats( 'job-insert-duplicate', count( $jobs ) - count( $items ) );
+                       wfIncrStats( 'job-insert', count( $tuples ) );
+                       wfIncrStats( 'job-insert-duplicate', count( $tuples ) - $failed - $pushed );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -179,6 +191,51 @@ class JobQueueRedis extends JobQueue {
                return true;
        }
 
+       /**
+        * @param RedisConnRef $conn
+        * @param array $tuples List of tuples of (job ID, job SHA1 or '', serialized blob)
+        * @return integer Number of jobs inserted (duplicates are ignored)
+        * @throws RedisException
+        */
+       protected function pushBlobs( RedisConnRef $conn, array $tuples ) {
+               $args = array(); // ([id, sha1, blob [, id, sha1, blob ... ] ] )
+               foreach ( $tuples as $tuple ) {
+                       $args[] = $tuple[0]; // id
+                       $args[] = $tuple[1]; // sha1
+                       $args[] = $tuple[2]; // blob
+               }
+               static $script =
+<<<LUA
+               if #ARGV % 3 ~= 0 then return redis.error_reply('Unmatched arguments') end
+               local pushed = 0
+               for i = 1,#ARGV,3 do
+                       local id,sha1,blob = ARGV[i],ARGV[i+1],ARGV[i+2]
+                       if sha1 == '' or redis.call('hExists',KEYS[3],sha1) == 0 then
+                               redis.call('lPush',KEYS[1],id)
+                               if sha1 ~= '' then
+                                       redis.call('hSet',KEYS[2],id,sha1)
+                                       redis.call('hSet',KEYS[3],sha1,id)
+                               end
+                               redis.call('hSet',KEYS[4],id,blob)
+                               pushed = pushed + 1
+                       end
+               end
+               return pushed
+LUA;
+               return $this->redisEval( $conn, $script,
+                       array_merge(
+                               array(
+                                       $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+                                       $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+                                       $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+                                       $this->getQueueKey( 'h-data' ), # KEYS[4]
+                               ),
+                               $args
+                       ),
+                       4 # number of first argument(s) that are keys
+               );
+       }
+
        /**
         * @see JobQueue::doPop()
         * @return Job|bool
@@ -187,42 +244,27 @@ class JobQueueRedis extends JobQueue {
        protected function doPop() {
                $job = false;
 
-               if ( $this->claimTTL <= 0 && mt_rand( 0, 99 ) == 0 ) {
-                       $this->cleanupClaimedJobs(); // prune jobs and IDs from the "garbage" list
-               }
-
                $conn = $this->getConnection();
                try {
                        do {
-                               // Atomically pop an item off the queue and onto the "claimed" list
-                               $uid = $conn->rpoplpush(
-                                       $this->getQueueKey( 'l-unclaimed' ),
-                                       $this->getQueueKey( 'l-claimed' )
-                               );
-                               if ( $uid === false ) {
+                               if ( $this->claimTTL > 0 ) {
+                                       // Keep the claimed job list down for high-traffic queues
+                                       if ( mt_rand( 0, 99 ) == 0 ) {
+                                               $this->recycleAndDeleteStaleJobs();
+                                       }
+                                       $blob = $this->popAndAcquireBlob( $conn );
+                               } else {
+                                       $blob = $this->popAndDeleteBlob( $conn );
+                               }
+                               if ( $blob === false ) {
                                        break; // no jobs; nothing to do
                                }
 
                                wfIncrStats( 'job-pop' );
-                               $conn->multi( Redis::PIPELINE );
-                               $conn->get( $this->prefixWithQueueKey( 'data', $uid ) );
-                               if ( $this->claimTTL > 0 ) {
-                                       // Set the claim timestamp metadata. If this step fails, then
-                                       // the timestamp will be assumed to be the current timestamp by
-                                       // recycleAndDeleteStaleJobs() as of the next time that it runs.
-                                       // If two runners claim duplicate jobs, one will abort here.
-                                       $conn->hSetNx( $this->prefixWithQueueKey( 'h-meta', $uid ), 'ctime', time() );
-                               } else {
-                                       // If this fails, the message key will be deleted in cleanupClaimedJobs().
-                                       // If two runners claim duplicate jobs, one of them will abort here.
-                                       $conn->delete(
-                                               $this->prefixWithQueueKey( 'h-meta', $uid ),
-                                               $this->prefixWithQueueKey( 'data', $uid ) );
-                               }
-                               list( $item, $ok ) = $conn->exec();
-                               if ( $item === false || ( $this->claimTTL && !$ok ) ) {
-                                       wfDebug( "Could not find or delete job $uid; probably was a duplicate." );
-                                       continue; // job was probably a duplicate
+                               $item = unserialize( $blob );
+                               if ( $item === false ) {
+                                       wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
+                                       continue;
                                }
 
                                // If $item is invalid, recycleAndDeleteStaleJobs() will cleanup as needed
@@ -232,17 +274,75 @@ class JobQueueRedis extends JobQueue {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
 
-               // Flag this job as an old duplicate based on its "root" job...
-               try {
-                       if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
-                               wfIncrStats( 'job-pop-duplicate' );
-                               return DuplicateJob::newFromJob( $job ); // convert to a no-op
-                       }
-               } catch ( MWException $e ) {} // don't lose jobs over this
-
                return $job;
        }
 
+       /**
+        * @param RedisConnRef $conn
+        * @return array serialized string or false
+        * @throws RedisException
+        */
+       protected function popAndDeleteBlob( RedisConnRef $conn ) {
+               static $script =
+<<<LUA
+               -- Pop an item off the queue
+               local id = redis.call('rpop',KEYS[1])
+               if not id then return false end
+               -- Get the job data and remove it
+               local item = redis.call('hGet',KEYS[4],id)
+               redis.call('hDel',KEYS[4],id)
+               -- Allow new duplicates of this job
+               local sha1 = redis.call('hGet',KEYS[2],id)
+               if sha1 then redis.call('hDel',KEYS[3],sha1) end
+               redis.call('hDel',KEYS[2],id)
+               -- Return the job data
+               return item
+LUA;
+               return $this->redisEval( $conn, $script,
+                       array(
+                               $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+                               $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+                               $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+                               $this->getQueueKey( 'h-data' ), # KEYS[4]
+                       ),
+                       4 # number of first argument(s) that are keys
+               );
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @return array serialized string or false
+        * @throws RedisException
+        */
+       protected function popAndAcquireBlob( RedisConnRef $conn ) {
+               static $script =
+<<<LUA
+               -- Pop an item off the queue
+               local id = redis.call('rPop',KEYS[1])
+               if not id then return false end
+               -- Allow new duplicates of this job
+               local sha1 = redis.call('hGet',KEYS[2],id)
+               if sha1 then redis.call('hDel',KEYS[3],sha1) end
+               redis.call('hDel',KEYS[2],id)
+               -- Mark the jobs as claimed and return it
+               redis.call('zAdd',KEYS[4],ARGV[1],id)
+               redis.call('hIncrBy',KEYS[5],id,1)
+               return redis.call('hGet',KEYS[6],id)
+LUA;
+               return $this->redisEval( $conn, $script,
+                       array(
+                               $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+                               $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+                               $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+                               $this->getQueueKey( 'z-claimed' ), # KEYS[4]
+                               $this->getQueueKey( 'h-attempts' ), # KEYS[5]
+                               $this->getQueueKey( 'h-data' ), # KEYS[6]
+                               time(), # ARGV[1] (injected to be replication-safe)
+                       ),
+                       6 # number of first argument(s) that are keys
+               );
+       }
+
        /**
         * @see JobQueue::doAck()
         * @param Job $job
@@ -257,20 +357,25 @@ class JobQueueRedis extends JobQueue {
                                // the job was transformed into a DuplicateJob or anything of the sort.
                                $item = $job->metadata['sourceFields'];
 
-                               $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                               // Remove the first instance of this job scanning right-to-left.
-                               // This is O(N) in the worst case, but is likely to be much faster since
-                               // jobs are pushed to the left and we are starting from the right, where
-                               // the longest running jobs are likely to be. These should be the first
-                               // jobs to be acknowledged assuming that job run times are roughly equal.
-                               $conn->lRem( $this->getQueueKey( 'l-claimed' ), $item['uid'], -1 );
-                               // Delete the job data and its claim metadata
-                               $conn->delete(
-                                       $this->prefixWithQueueKey( 'h-meta', $item['uid'] ),
-                                       $this->prefixWithQueueKey( 'data', $item['uid'] ) );
-                               $res = $conn->exec(); // commit (atomic trx)
-
-                               if ( in_array( false, $res, true ) ) {
+                               static $script =
+<<<LUA
+                               -- Unmark the job as claimed
+                               redis.call('zRem',KEYS[1],ARGV[1])
+                               redis.call('hDel',KEYS[2],ARGV[1])
+                               -- Delete the job data itself
+                               return redis.call('hDel',KEYS[3],ARGV[1])
+LUA;
+                               $res = $this->redisEval( $conn, $script,
+                                       array(
+                                               $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+                                               $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+                                               $this->getQueueKey( 'h-data' ), # KEYS[3]
+                                               $item['uuid'] # ARGV[1]
+                                       ),
+                                       3 # number of first argument(s) that are keys
+                               );
+
+                               if ( !$res ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." );
                                        return false;
                                }
@@ -294,7 +399,7 @@ class JobQueueRedis extends JobQueue {
                } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
                        throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
                }
-               $key = $this->getRootJobKey( $params['rootJobSignature'] );
+               $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
 
                $conn = $this->getConnection();
                try {
@@ -310,13 +415,11 @@ class JobQueueRedis extends JobQueue {
        }
 
        /**
-        * Check if the "root" job of a given job has been superseded by a newer one
-        *
-        * @param $job Job
+        * @see JobQueue::doIsRootJobOldDuplicate()
+        * @param Job $job
         * @return bool
-        * @throws MWException
         */
-       protected function isRootJobOldDuplicate( Job $job ) {
+       protected function doIsRootJobOldDuplicate( Job $job ) {
                $params = $job->getParams();
                if ( !isset( $params['rootJobSignature'] ) ) {
                        return false; // job has no de-deplication info
@@ -328,7 +431,7 @@ class JobQueueRedis extends JobQueue {
                $conn = $this->getConnection();
                try {
                        // Get the last time this root job was enqueued
-                       $timestamp = $conn->get( $this->getRootJobKey( $params['rootJobSignature'] ) );
+                       $timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -369,14 +472,13 @@ class JobQueueRedis extends JobQueue {
         */
        public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
                try {
-                       $fields = $conn->get( $this->prefixWithQueueKey( 'data', $uid ) );
-                       if ( !is_array( $fields ) ) { // wtf?
-                               $conn->delete( $this->prefixWithQueueKey( 'data', $uid ) );
-                               throw new MWException( "Could not find job with UID '$uid'." );
+                       $item = unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $uid ) );
+                       if ( !is_array( $item ) ) { // this shouldn't happen
+                               throw new MWException( "Could not find job with ID '$uid'." );
                        }
-                       $title = Title::makeTitle( $fields['namespace'], $fields['title'] );
-                       $job = Job::factory( $fields['type'], $title, $fields['params'] );
-                       $job->metadata['sourceFields'] = $fields;
+                       $title = Title::makeTitle( $item['namespace'], $item['title'] );
+                       $job = Job::factory( $item['type'], $title, $item['params'] );
+                       $job->metadata['sourceFields'] = $item;
                        return $job;
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
@@ -396,125 +498,61 @@ class JobQueueRedis extends JobQueue {
                $count = 0;
                // For each job item that can be retried, we need to add it back to the
                // main queue and remove it from the list of currenty claimed job items.
+               // For those that cannot, they are marked as dead and kept around for
+               // investigation and manual job restoration but are eventually deleted.
                $conn = $this->getConnection();
                try {
-                       // Avoid duplicate insertions of items to be re-enqueued
-                       $conn->multi( Redis::MULTI );
-                       $conn->setnx( $this->getQueueKey( 'lock' ), 1 );
-                       $conn->expire( $this->getQueueKey( 'lock' ), 3600 );
-                       if ( $conn->exec() !== array( true, true ) ) { // lock
-                               return $count; // already in progress
-                       }
-
                        $now = time();
-                       $claimCutoff = $now - $this->claimTTL;
-                       $pruneCutoff = $now - self::MAX_AGE_PRUNE;
-
-                       // Get the list of all claimed jobs
-                       $claimedUids = $conn->lRange( $this->getQueueKey( 'l-claimed' ), 0, -1 );
-                       // Get a map of (uid => claim metadata) for all claimed jobs
-                       $metadata = $conn->mGet( $this->prefixValuesWithQueueKey( 'h-meta', $claimedUids ) );
-
-                       $uidsPush = array(); // items IDs to move to the "unclaimed" queue
-                       $uidsRemove = array(); // item IDs to remove from "claimed" queue
-                       foreach ( $claimedUids as $i => $uid ) { // all claimed items
-                               $info = $metadata[$i] ? $metadata[$i] : array();
-                               if ( isset( $info['ctime'] ) || isset( $info['rctime'] ) ) {
-                                       // Prefer "ctime" (set by pop()) over "rctime" (set by this function)
-                                       $ctime = isset( $info['ctime'] ) ? $info['ctime'] : $info['rctime'];
-                                       // Claimed job claimed for too long?
-                                       if ( $ctime < $claimCutoff ) {
-                                               // Get the number of failed attempts
-                                               $attempts = isset( $info['attempts'] ) ? $info['attempts'] : 0;
-                                               if ( $attempts < $this->maxTries ) {
-                                                       $uidsPush[] = $uid; // retry it
-                                               } elseif ( $ctime < $pruneCutoff ) {
-                                                       $uidsRemove[] = $uid; // just remove it
-                                               }
-                                       }
-                               } else {
-                                       // If pop() failed to set the claim timestamp, set it to the current time.
-                                       // Since that function sets this non-atomically *after* moving the job to
-                                       // the "claimed" queue, it may be the case that it just didn't set it yet.
-                                       $conn->hSet( $this->prefixWithQueueKey( 'h-meta', $uid ), 'rctime', $now );
-                               }
-                       }
-
-                       $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                       if ( count( $uidsPush ) ) { // move from "l-claimed" to "l-unclaimed"
-                               call_user_func_array(
-                                       array( $conn, 'lPush' ),
-                                       array_merge( array( $this->getQueueKey( 'l-unclaimed' ) ), $uidsPush )
-                               );
-                               foreach ( $uidsPush as $uid ) {
-                                       $conn->lRem( $this->getQueueKey( 'l-claimed' ), $uid, -1 );
-                                       $conn->hDel( $this->prefixWithQueueKey( 'h-meta', $uid ), 'ctime', 'rctime' );
-                                       $conn->hIncrBy( $this->prefixWithQueueKey( 'h-meta', $uid ), 'attempts', 1 );
-                               }
-                       }
-                       foreach ( $uidsRemove as $uid ) { // remove from "l-claimed"
-                               $conn->lRem( $this->getQueueKey( 'l-claimed' ), $uid, -1 );
-                               $conn->delete( // delete job data and metadata
-                                       $this->prefixWithQueueKey( 'h-meta', $uid ),
-                                       $this->prefixWithQueueKey( 'data', $uid ) );
-                       }
-                       $res = $conn->exec(); // commit (atomic trx)
-
-                       if ( in_array( false, $res, true ) ) {
-                               wfDebugLog( 'JobQueueRedis', "Could not recycle {$this->type} job(s)." );
-                       } else {
-                               $count += ( count( $uidsPush ) + count( $uidsRemove ) );
-                               wfIncrStats( 'job-recycle', count( $uidsPush ) );
-                       }
-
-                       $conn->delete( $this->getQueueKey( 'lock' ) ); // unlock
-               } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
-               }
-
-               return $count;
-       }
-
-       /**
-        * Destroy any jobs that have been claimed
-        *
-        * @return integer Number of jobs deleted
-        * @throws MWException
-        */
-       protected function cleanupClaimedJobs() {
-               $count = 0;
-               // Make sure the message for claimed jobs was deleted
-               // and remove the claimed job IDs from the "claimed" list.
-               $conn = $this->getConnection();
-               try {
-                       // Avoid races and duplicate effort
-                       $conn->multi( Redis::MULTI );
-                       $conn->setnx( $this->getQueueKey( 'lock' ), 1 );
-                       $conn->expire( $this->getQueueKey( 'lock' ), 3600 );
-                       if ( $conn->exec() !== array( true, true ) ) { // lock
-                               return $count; // already in progress
-                       }
-                       // Get the list of all claimed jobs
-                       $uids = $conn->lRange( $this->getQueueKey( 'l-claimed' ), 0, -1 );
-                       if ( count( $uids ) ) {
-                               // Delete the message keys and delist the corresponding ids.
-                               // Since the only other changes to "l-claimed" are left pushes, we can just strip
-                               // off the elements read here using a right trim based on the number of ids read.
-                               $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                               $conn->lTrim( $this->getQueueKey( 'l-claimed' ), 0, -count( $uids ) - 1 );
-                               $conn->delete( array_merge(
-                                       $this->prefixValuesWithQueueKey( 'h-meta', $uids ),
-                                       $this->prefixValuesWithQueueKey( 'data', $uids )
-                               ) );
-                               $res = $conn->exec(); // commit (atomic trx)
-
-                               if ( in_array( false, $res, true ) ) {
-                                       wfDebugLog( 'JobQueueRedis', "Could not purge {$this->type} job(s)." );
-                               } else {
-                                       $count += count( $uids );
-                               }
+                       static $script =
+<<<LUA
+                       local released,abandoned,pruned = 0,0,0
+                       -- Get all non-dead jobs that have an expired claim on them.
+                       -- The score for each item is the last claim timestamp (UNIX).
+                       local staleClaims = redis.call('zRangeByScore',KEYS[1],0,ARGV[1],'WITHSCORES')
+                       for id,timestamp in ipairs(staleClaims) do
+                               local attempts = redis.call('hGet',KEYS[2],id)
+                               if attempts < ARGV[3] then
+                                       -- Claim expired and retries left: re-enqueue the job
+                                       redis.call('lPush',KEYS[3],id)
+                                       redis.call('hIncrBy',KEYS[2],id,1)
+                                       released = released + 1
+                               else
+                                       -- Claim expired and no retries left: mark the job as dead
+                                       redis.call('zAdd',KEYS[5],timestamp,id)
+                                       abandoned = abandoned + 1
+                               end
+                               redis.call('zRem',KEYS[1],id)
+                       end
+                       -- Get all of the dead jobs that have been marked as dead for too long.
+                       -- The score for each item is the last claim timestamp (UNIX).
+                       local deadClaims = redis.call('zRangeByScore',KEYS[5],0,ARGV[2],'WITHSCORES')
+                       for id,timestamp in ipairs(deadClaims) do
+                               -- Stale and out of retries: remove any traces of the job
+                               redis.call('zRem',KEYS[5],id)
+                               redis.call('hDel',KEYS[2],id)
+                               redis.call('hDel',KEYS[4],id)
+                               pruned = pruned + 1
+                       end
+                       return {released,abandoned,pruned}
+LUA;
+                       $res = $this->redisEval( $conn, $script,
+                               array(
+                                       $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+                                       $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+                                       $this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
+                                       $this->getQueueKey( 'h-data' ), # KEYS[4]
+                                       $this->getQueueKey( 'z-abandoned' ), # KEYS[5]
+                                       $now - $this->claimTTL, # ARGV[1]
+                                       $now - self::MAX_AGE_PRUNE, # ARGV[2]
+                                       $this->maxTries # ARGV[3]
+                               ),
+                               5 # number of first argument(s) that are keys
+                       );
+                       if ( $res ) {
+                               list( $released, $abandoned, $pruned ) = $res;
+                               $count += $released + $pruned;
+                               wfIncrStats( 'job-recycle', count( $released ) );
                        }
-                       $conn->delete( $this->getQueueKey( 'lock' ) ); // unlock
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -538,6 +576,22 @@ class JobQueueRedis extends JobQueue {
                }
        }
 
+       /**
+        * @param RedisConnRef $conn
+        * @param string $script
+        * @param array $params
+        * @param integer $numKeys
+        * @return mixed
+        */
+       protected function redisEval( RedisConnRef $conn, $script, array $params, $numKeys ) {
+               $res = $conn->evalSha( sha1( $script ), $params, $numKeys );
+               if ( $res === false && $conn->getLastError() != '' ) { // not in script cache?
+                       wfDebugLog( 'JobQueueRedis', "Lua script error: " . $conn->getLastError() );
+                       $res = $conn->eval( $script, $params, $numKeys );
+               }
+               return $res;
+       }
+
        /**
         * @param $job Job
         * @return array
@@ -549,10 +603,11 @@ class JobQueueRedis extends JobQueue {
                        'namespace' => $job->getTitle()->getNamespace(),
                        'title'     => $job->getTitle()->getDBkey(),
                        'params'    => $job->getParams(),
-                       // Additional metadata
-                       'uid'       => $job->ignoreDuplicates()
+                       // Additional job metadata
+                       'uuid'      => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
+                       'sha1'      => $job->ignoreDuplicates()
                                ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
-                               : wfRandomString( 32 ),
+                               : '',
                        'timestamp' => time() // UNIX timestamp
                );
        }
@@ -571,14 +626,6 @@ class JobQueueRedis extends JobQueue {
                return false;
        }
 
-       /**
-        * @param string $uid Job UID
-        * @return bool Whether $uid is a SHA-1 hash based identifier for de-duplication
-        */
-       protected function isHashUid( $uid ) {
-               return strlen( $uid ) == 31;
-       }
-
        /**
         * Get a connection to the server that handles all sub-queues for this queue
         *
@@ -617,50 +664,6 @@ class JobQueueRedis extends JobQueue {
                }
        }
 
-       /**
-        * @param string $signature Hash identifier of the root job
-        * @return string
-        */
-       private function getRootJobKey( $signature ) {
-               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
-       }
-
-       /**
-        * @param $prop string
-        * @param $string string
-        * @return string
-        */
-       private function prefixWithQueueKey( $prop, $string ) {
-               return $this->getQueueKey( $prop ) . ':' . $string;
-       }
-
-       /**
-        * @param $prop string
-        * @param $items array
-        * @return Array
-        */
-       private function prefixValuesWithQueueKey( $prop, array $items ) {
-               $res = array();
-               foreach ( $items as $item ) {
-                       $res[] = $this->prefixWithQueueKey( $prop, $item );
-               }
-               return $res;
-       }
-
-       /**
-        * @param $prop string
-        * @param $items array
-        * @return Array
-        */
-       private function prefixKeysWithQueueKey( $prop, array $items ) {
-               $res = array();
-               foreach ( $items as $key => $item ) {
-                       $res[$this->prefixWithQueueKey( $prop, $key )] = $item;
-               }
-               return $res;
-       }
-
        /**
         * @param $key string
         * @return void
index 345e786..3876c52 100644 (file)
@@ -54,7 +54,7 @@ class BitmapMetadataHandler {
         *
         * @param string $app13 String containing app13 block from jpeg file
         */
-       private function doApp13 ( $app13 ) {
+       private function doApp13( $app13 ) {
                try {
                        $this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
                } catch ( MWException $e ) {
@@ -79,7 +79,7 @@ class BitmapMetadataHandler {
         * @param $filename string
         * @param $byteOrder string
         */
-       function getExif ( $filename, $byteOrder ) {
+       function getExif( $filename, $byteOrder ) {
                global $wgShowEXIF;
                if ( file_exists( $filename ) && $wgShowEXIF ) {
                        $exif = new Exif( $filename, $byteOrder );
@@ -95,7 +95,7 @@ class BitmapMetadataHandler {
         * @param array $metaArray array of metadata values
         * @param string $type type. defaults to other. if two things have the same type they're merged
         */
-       function addMetadata ( $metaArray, $type = 'other' ) {
+       function addMetadata( $metaArray, $type = 'other' ) {
                if ( isset( $this->metadata[$type] ) ) {
                        /* merge with old data */
                        $metaArray = $metaArray + $this->metadata[$type];
@@ -113,7 +113,7 @@ class BitmapMetadataHandler {
         *
         * @return Array metadata array
         */
-       function getMetadataArray () {
+       function getMetadataArray() {
                // this seems a bit ugly... This is all so its merged in right order
                // based on the MWG recomendation.
                $temp = Array();
@@ -147,7 +147,7 @@ class BitmapMetadataHandler {
         * @return array metadata result array.
         * @throws MWException on invalid file.
         */
-       static function Jpeg ( $filename ) {
+       static function Jpeg( $filename ) {
                $showXMP = function_exists( 'xml_parser_create_ns' );
                $meta = new self();
 
@@ -189,7 +189,7 @@ class BitmapMetadataHandler {
         * @param string $filename full path to file
         * @return Array Array for storage in img_metadata.
         */
-       public static function PNG ( $filename ) {
+       public static function PNG( $filename ) {
                $showXMP = function_exists( 'xml_parser_create_ns' );
 
                $meta = new self();
@@ -218,7 +218,7 @@ class BitmapMetadataHandler {
         * @param string $filename full path to file
         * @return Array metadata array
         */
-       public static function GIF ( $filename ) {
+       public static function GIF( $filename ) {
 
                $meta = new self();
                $baseArray = GIFMetadataExtractor::getMetadata( $filename );
@@ -259,7 +259,7 @@ class BitmapMetadataHandler {
         * @throws MWException
         * @return Array The metadata.
         */
-       public static function Tiff ( $filename ) {
+       public static function Tiff( $filename ) {
                if ( file_exists( $filename ) ) {
                        $byteOrder = self::getTiffByteOrder( $filename );
                        if ( !$byteOrder ) {
index 20b84d5..52d3195 100644 (file)
@@ -439,7 +439,7 @@ class Exif {
         * This has not been tested on any shift-JIS strings.
         * @param string $prop prop name.
         */
-       private function charCodeString ( $prop ) {
+       private function charCodeString( $prop ) {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
 
                        if ( strlen( $this->mFilteredExifData[$prop] ) <= 8 ) {
@@ -500,7 +500,7 @@ class Exif {
         * the type of UNDEFINED field
         * @param string $prop name of property
         */
-       private function exifPropToOrd ( $prop ) {
+       private function exifPropToOrd( $prop ) {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
                        $this->mFilteredExifData[$prop] = ord( $this->mFilteredExifData[$prop] );
                }
@@ -510,7 +510,7 @@ class Exif {
         * for example 10 degress 20`40`` S -> -10.34444
         * @param string $prop a gps coordinate exif tag name (like GPSLongitude)
         */
-       private function exifGPStoNumber ( $prop ) {
+       private function exifGPStoNumber( $prop ) {
                $loc =& $this->mFilteredExifData[$prop];
                $dir =& $this->mFilteredExifData[$prop . 'Ref'];
                $res = false;
@@ -677,7 +677,7 @@ class Exif {
         */
        private function isRational( $in ) {
                $m = array();
-               if ( !is_array( $in ) && @preg_match( '/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/', $in, $m ) ) { # Avoid division by zero
+               if ( !is_array( $in ) && preg_match( '/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/', $in, $m ) ) { # Avoid division by zero
                        return $this->isLong( $m[1] ) && $this->isLong( $m[2] );
                } else {
                        $this->debug( $in, __FUNCTION__, 'fed a non-fraction value' );
@@ -808,7 +808,7 @@ class Exif {
                }
                $type = gettype( $in );
                $class = ucfirst( __CLASS__ );
-               if ( $type === 'array' ) {
+               if ( is_array( $in ) ) {
                        $in = print_r( $in, true );
                }
 
index 4191cde..a1b3fd8 100644 (file)
@@ -423,7 +423,7 @@ class IPTC {
         *
         * @return string|array
         */
-       private static function convIPTC ( $data, $charset ) {
+       private static function convIPTC( $data, $charset ) {
                if ( is_array( $data ) ) {
                        foreach ( $data as &$val ) {
                                $val = self::convIPTCHelper( $val, $charset );
@@ -441,7 +441,7 @@ class IPTC {
         *
         * @return string
         */
-       private static function convIPTCHelper ( $data, $charset ) {
+       private static function convIPTCHelper( $data, $charset ) {
                if ( $charset ) {
                        wfSuppressWarnings();
                        $data = iconv( $charset, "UTF-8//IGNORE", $data );
index 8b5d651..3551943 100644 (file)
@@ -32,7 +32,7 @@
  */
 class JpegHandler extends ExifBitmapHandler {
 
-       function getMetadata ( $image, $filename ) {
+       function getMetadata( $image, $filename ) {
                try {
                        $meta = BitmapMetadataHandler::Jpeg( $filename );
                        if ( !is_array( $meta ) ) {
index 6ff07ed..121652f 100644 (file)
@@ -47,7 +47,7 @@ class JpegMetadataExtractor {
         * @return Array of interesting segments.
         * @throws MWException if given invalid file.
         */
-       static function segmentSplitter ( $filename ) {
+       static function segmentSplitter( $filename ) {
                $showXMP = function_exists( 'xml_parser_create_ns' );
 
                $segmentCount = 0;
@@ -195,7 +195,7 @@ class JpegMetadataExtractor {
         * @throws MWException (It gets caught next level up though)
         * @return String if the iptc hash is good or not.
         */
-       public static function doPSIR ( $app13 ) {
+       public static function doPSIR( $app13 ) {
                if ( !$app13 ) {
                        throw new MWException( "No App13 segment given" );
                }
index 9a3f645..b36bfa9 100644 (file)
@@ -133,7 +133,7 @@ abstract class MediaHandler {
         *
         * @return string version string
         */
-       static function getMetadataVersion () {
+       static function getMetadataVersion() {
                $version = Array( '2' ); // core metadata version
                wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
                return implode( ';', $version);
index 62738a0..d9cca3f 100644 (file)
@@ -414,7 +414,7 @@ class XMPReader {
         *
         * @param string $elm Namespace of element followed by a space and then tag name of element.
         */
-       private function endElementModeIgnore ( $elm ) {
+       private function endElementModeIgnore( $elm ) {
                if ( $this->curItem[0] === $elm ) {
                        array_shift( $this->curItem );
                        array_shift( $this->mode );
@@ -436,7 +436,7 @@ class XMPReader {
         *
         * @param string $elm namespace, space, and tag name.
         */
-       private function endElementModeSimple ( $elm ) {
+       private function endElementModeSimple( $elm ) {
                if ( $this->charContent !== false ) {
                        if ( $this->processingArray ) {
                                // if we're processing an array, use the original element
index 102547f..3b64fd3 100644 (file)
@@ -31,7 +31,7 @@ class XMPInfo {
        /** get the items array
         * @return Array XMP item configuration array.
         */
-       public static function getItems () {
+       public static function getItems() {
                if( !self::$ranHooks ) {
                        // This is for if someone makes a custom metadata extension.
                        // For example, a medical wiki might want to decode DICOM xmp properties.
index f98f0b5..b7b35dc 100644 (file)
@@ -335,7 +335,7 @@ class XMPValidate {
         *           or DDD,MM.mmk form
         * @param $standalone Boolean if its a simple prop (should always be true)
         */
-       public static function validateGPS ( $info, &$val, $standalone ) {
+       public static function validateGPS( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        return;
                }
index 7f21449..dea0764 100644 (file)
@@ -3140,7 +3140,6 @@ class Parser {
         * @private
         */
        function braceSubstitution( $piece, $frame ) {
-               global $wgContLang;
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-setup' );
 
@@ -3237,70 +3236,22 @@ class Parser {
 
                        $colonPos = strpos( $part1, ':' );
                        if ( $colonPos !== false ) {
-                               # Case sensitive functions
-                               $function = substr( $part1, 0, $colonPos );
-                               if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
-                                       $function = $this->mFunctionSynonyms[1][$function];
-                               } else {
-                                       # Case insensitive functions
-                                       $function = $wgContLang->lc( $function );
-                                       if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
-                                               $function = $this->mFunctionSynonyms[0][$function];
-                                       } else {
-                                               $function = false;
-                                       }
+                               $func = substr( $part1, 0, $colonPos );
+                               $funcArgs = array( trim( substr( $part1, $colonPos + 1 ) ) );
+                               for ( $i = 0; $i < $args->getLength(); $i++ ) {
+                                       $funcArgs[] = $args->item( $i );
                                }
-                               if ( $function ) {
-                                       wfProfileIn( __METHOD__ . '-pfunc-' . $function );
-                                       list( $callback, $flags ) = $this->mFunctionHooks[$function];
-                                       $initialArgs = array( &$this );
-                                       $funcArgs = array( trim( substr( $part1, $colonPos + 1 ) ) );
-                                       if ( $flags & SFH_OBJECT_ARGS ) {
-                                               # Add a frame parameter, and pass the arguments as an array
-                                               $allArgs = $initialArgs;
-                                               $allArgs[] = $frame;
-                                               for ( $i = 0; $i < $args->getLength(); $i++ ) {
-                                                       $funcArgs[] = $args->item( $i );
-                                               }
-                                               $allArgs[] = $funcArgs;
-                                       } else {
-                                               # Convert arguments to plain text
-                                               for ( $i = 0; $i < $args->getLength(); $i++ ) {
-                                                       $funcArgs[] = trim( $frame->expand( $args->item( $i ) ) );
-                                               }
-                                               $allArgs = array_merge( $initialArgs, $funcArgs );
-                                       }
-
-                                       # Workaround for PHP bug 35229 and similar
-                                       if ( !is_callable( $callback ) ) {
-                                               wfProfileOut( __METHOD__ . '-pfunc-' . $function );
-                                               wfProfileOut( __METHOD__ . '-pfunc' );
-                                               wfProfileOut( __METHOD__ );
-                                               throw new MWException( "Tag hook for $function is not callable\n" );
-                                       }
-                                       $result = call_user_func_array( $callback, $allArgs );
-                                       $found = true;
-                                       $noparse = true;
-                                       $preprocessFlags = 0;
-
-                                       if ( is_array( $result ) ) {
-                                               if ( isset( $result[0] ) ) {
-                                                       $text = $result[0];
-                                                       unset( $result[0] );
-                                               }
-
-                                               # Extract flags into the local scope
-                                               # This allows callers to set flags such as nowiki, found, etc.
-                                               extract( $result );
-                                       } else {
-                                               $text = $result;
-                                       }
-                                       if ( !$noparse ) {
-                                               $text = $this->preprocessToDom( $text, $preprocessFlags );
-                                               $isChildObj = true;
-                                       }
-                                       wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+                               try {
+                                       $result = $this->callParserFunction( $frame, $func, $funcArgs );
+                               } catch ( Exception $ex ) {
+                                       wfProfileOut( __METHOD__ . '-pfunc' );
+                                       throw $ex;
                                }
+
+                               # The interface for parser functions allows for extracting
+                               # flags into the local scope. Extract any forwarded flags
+                               # here.
+                               extract( $result );
                        }
                        wfProfileOut( __METHOD__ . '-pfunc' );
                }
@@ -3497,6 +3448,120 @@ class Parser {
                return $ret;
        }
 
+       /**
+        * Call a parser function and return an array with text and flags.
+        *
+        * The returned array will always contain a boolean 'found', indicating
+        * whether the parser function was found or not. It may also contain the
+        * following:
+        *  text: string|object, resulting wikitext or PP DOM object
+        *  isHTML: bool, $text is HTML, armour it against wikitext transformation
+        *  isChildObj: bool, $text is a DOM node needing expansion in a child frame
+        *  isLocalObj: bool, $text is a DOM node needing expansion in the current frame
+        *  nowiki: bool, wiki markup in $text should be escaped
+        *
+        * @since 1.21
+        * @param $frame PPFrame The current frame, contains template arguments
+        * @param $function string Function name
+        * @param $args array Arguments to the function
+        * @return array
+        */
+       public function callParserFunction( $frame, $function, array $args = array() ) {
+               global $wgContLang;
+
+               wfProfileIn( __METHOD__ );
+
+               # Case sensitive functions
+               if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
+                       $function = $this->mFunctionSynonyms[1][$function];
+               } else {
+                       # Case insensitive functions
+                       $function = $wgContLang->lc( $function );
+                       if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
+                               $function = $this->mFunctionSynonyms[0][$function];
+                       } else {
+                               wfProfileOut( __METHOD__ );
+                               return array( 'found' => false );
+                       }
+               }
+
+               wfProfileIn( __METHOD__ . '-pfunc-' . $function );
+               list( $callback, $flags ) = $this->mFunctionHooks[$function];
+
+               # Workaround for PHP bug 35229 and similar
+               if ( !is_callable( $callback ) ) {
+                       wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+                       wfProfileOut( __METHOD__ );
+                       throw new MWException( "Tag hook for $function is not callable\n" );
+               }
+
+               $allArgs = array( &$this );
+               if ( $flags & SFH_OBJECT_ARGS ) {
+                       # Convert arguments to PPNodes and collect for appending to $allArgs
+                       $funcArgs = array();
+                       foreach ( $args as $k => $v ) {
+                               if ( $v instanceof PPNode || $k === 0 ) {
+                                       $funcArgs[] = $v;
+                               } else {
+                                       $funcArgs[] = $this->mPreprocessor->newPartNodeArray( array( $k => $v ) )->item( 0 );
+                               }
+                       }
+
+                       # Add a frame parameter, and pass the arguments as an array
+                       $allArgs[] = $frame;
+                       $allArgs[] = $funcArgs;
+               } else {
+                       # Convert arguments to plain text and append to $allArgs
+                       foreach ( $args as $k => $v ) {
+                               if ( $v instanceof PPNode ) {
+                                       $allArgs[] = trim( $frame->expand( $v ) );
+                               } elseif ( is_int( $k ) && $k >= 0 ) {
+                                       $allArgs[] = trim( $v );
+                               } else {
+                                       $allArgs[] = trim( "$k=$v" );
+                               }
+                       }
+               }
+
+               $result = call_user_func_array( $callback, $allArgs );
+
+               # The interface for function hooks allows them to return a wikitext
+               # string or an array containing the string and any flags. This mungs
+               # things around to match what this method should return.
+               if ( !is_array( $result ) ) {
+                       $result = array(
+                               'found' => true,
+                               'text' => $result,
+                       );
+               } else {
+                       if ( isset( $result[0] ) && !isset( $result['text'] ) ) {
+                               $result['text'] = $result[0];
+                       }
+                       unset( $result[0] );
+                       $result += array(
+                               'found' => true,
+                       );
+               }
+
+               $noparse = true;
+               $preprocessFlags = 0;
+               if ( isset( $result['noparse'] ) ) {
+                       $noparse = $result['noparse'];
+               }
+               if ( isset( $result['preprocessFlags'] ) ) {
+                       $preprocessFlags = $result['preprocessFlags'];
+               }
+
+               if ( !$noparse ) {
+                       $result['text'] = $this->preprocessToDom( $result['text'], $preprocessFlags );
+                       $result['isChildObj'] = true;
+               }
+               wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+               wfProfileOut( __METHOD__ );
+
+               return $result;
+       }
+
        /**
         * Get the semi-parsed DOM representation of a template with a given title,
         * and its redirect destination title. Cached.
@@ -4158,7 +4223,7 @@ class Parser {
                        $levelCount[$toclevel] = $level;
 
                        # count number of headlines for each level
-                       @$sublevelCount[$toclevel]++;
+                       $sublevelCount[$toclevel]++;
                        $dot = 0;
                        for( $i = 1; $i <= $toclevel; $i++ ) {
                                if ( !empty( $sublevelCount[$i] ) ) {
index db649f1..3af3b7a 100644 (file)
@@ -143,10 +143,10 @@ class ParserOutput extends CacheTime {
        function setNewSection( $value ) {
                $this->mNewSection = (bool)$value;
        }
-       function hideNewSection ( $value ) {
+       function hideNewSection( $value ) {
                $this->mHideNewSection = (bool)$value;
        }
-       function getHideNewSection () {
+       function getHideNewSection() {
                return (bool)$this->mHideNewSection;
        }
        function getNewSection() {
index b59f834..ba5a4ac 100644 (file)
@@ -41,7 +41,7 @@ class RandomPage extends SpecialPage {
                return $this->namespaces;
        }
 
-       public function setNamespace ( $ns ) {
+       public function setNamespace( $ns ) {
                if( !$ns || $ns < NS_MAIN ) {
                        $ns = NS_MAIN;
                }
index 54b20dd..ebc32cf 100644 (file)
@@ -38,7 +38,7 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
         * @param $result The query result
         * @return string The category link
         */
-       function formatResult ( $skin, $result ) {
+       function formatResult( $skin, $result ) {
                $title = Title::makeTitle( NS_CATEGORY, $result->title );
                $text = $title->getText();
 
index f52c9a7..c7f122b 100644 (file)
@@ -293,7 +293,7 @@ class SpecialWatchlist extends SpecialPage {
                }
 
                ChangeTags::modifyDisplayQuery( $tables, $fields, $conds, $join_conds, $options, '' );
-               wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields ) );
+               wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $values ) );
 
                $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
                $numRows = $res->numRows();
index cfa3879..326d91d 100644 (file)
@@ -158,7 +158,7 @@ class UploadStash {
         * @param string $key key under which file information is stored
         * @return Array
         */
-       public function getMetadata ( $key ) {
+       public function getMetadata( $key ) {
                $this->getFile( $key );
                return $this->fileMetadata[$key];
        }
@@ -169,7 +169,7 @@ class UploadStash {
         * @param string $key key under which file information is stored
         * @return Array
         */
-       public function getFileProps ( $key ) {
+       public function getFileProps( $key ) {
                $this->getFile( $key );
                return $this->fileProps[$key];
        }
index 1c52da5..42883b5 100644 (file)
@@ -44,7 +44,6 @@ if ( function_exists( 'mb_strtoupper' ) ) {
  * @ingroup Language
  */
 class FakeConverter {
-
        /**
         * @var Language
         */
@@ -349,12 +348,12 @@ class Language {
        public static function isValidBuiltInCode( $code ) {
 
                if ( !is_string( $code ) ) {
-                       $type = gettype( $code );
-                       if ( $type === 'object' ) {
+                       if ( is_object( $code ) ) {
                                $addmsg = " of class " . get_class( $code );
                        } else {
                                $addmsg = '';
                        }
+                       $type = gettype( $code );
                        throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
                }
 
@@ -3544,7 +3543,7 @@ class Language {
                }
                $forms = array_values( $forms );
 
-               $pluralForm = $this->getPluralForm( $count );
+               $pluralForm = $this->getPluralRuleIndexNumber( $count );
                $pluralForm = min( $pluralForm, count( $forms ) - 1 );
                return $forms[$pluralForm];
        }
@@ -4410,7 +4409,7 @@ class Language {
        /**
         * Get the plural rules for the language
         * @since 1.20
-        * @return array Associative array with plural form, and plural rule as key-value pairs
+        * @return array Associative array with plural form number and plural rule as key-value pairs
         */
        public function getPluralRules() {
                $pluralRules = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRules' );
@@ -4427,13 +4426,48 @@ class Language {
        }
 
        /**
-        * Find the plural form matching to the given number
-        * It return the form index.
-        * @return int The index of the plural form
+        * Get the plural rule types for the language
+        * @since 1.21
+        * @return array Associative array with plural form number and plural rule type as key-value pairs
+        */
+       public function getPluralRuleTypes() {
+               $pluralRuleTypes = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRuleTypes' );
+               $fallbacks = Language::getFallbacksFor( $this->mCode );
+               if ( !$pluralRuleTypes ) {
+                       foreach ( $fallbacks as $fallbackCode ) {
+                               $pluralRuleTypes = self::$dataCache->getItem( strtolower( $fallbackCode ), 'pluralRuleTypes' );
+                               if ( $pluralRuleTypes ) {
+                                       break;
+                               }
+                       }
+               }
+               return $pluralRuleTypes;
+       }
+
+       /**
+        * Find the index number of the plural rule appropriate for the given number
+        * @return int The index number of the plural rule
         */
-       private function getPluralForm( $number ) {
+       public function getPluralRuleIndexNumber( $number ) {
                $pluralRules = $this->getCompiledPluralRules();
                $form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
                return $form;
        }
+
+       /**
+        * Find the plural rule type appropriate for the given number
+        * For example, if the language is set to Arabic, getPluralType(5) should
+        * return 'few'.
+        * @since 1.21
+        * @return string The name of the plural rule type, e.g. one, two, few, many
+        */
+       public function getPluralRuleType( $number ) {
+               $index = $this->getPluralRuleIndexNumber( $number );
+               $pluralRuleTypes = $this->getPluralRuleTypes();
+               if ( isset( $pluralRuleTypes[$index] ) ) {
+                       return $pluralRuleTypes[$index];
+               } else {
+                       return 'other';
+               }
+       }
 }
index 0956dc4..48f70e8 100644 (file)
@@ -32,7 +32,7 @@ class LanguageAz extends Language {
         * @param $string string
         * @return mixed|string
         */
-       function ucfirst ( $string ) {
+       function ucfirst( $string ) {
                if ( $string[0] == 'i' ) {
                        return 'İ' . substr( $string, 1 );
                } else {
index a397bc0..0318fb1 100644 (file)
@@ -54,7 +54,7 @@ class LanguageKaa extends Language {
         *
         * @return string
         */
-       function ucfirst ( $string ) {
+       function ucfirst( $string ) {
                if ( substr( $string, 0, 1 ) === 'i' ) {
                        return 'İ' . substr( $string, 1 );
                } else {
@@ -69,7 +69,7 @@ class LanguageKaa extends Language {
         *
         * @return mixed|string
         */
-       function lcfirst ( $string ) {
+       function lcfirst( $string ) {
                if ( substr( $string, 0, 1 ) === 'I' ) {
                        return 'ı' . substr( $string, 1 );
                } else {
index 6dd6959..f6bbae7 100644 (file)
@@ -435,7 +435,7 @@ class LanguageKk extends LanguageKk_cyrl {
         *
         * @return string
         */
-       function ucfirst ( $string ) {
+       function ucfirst( $string ) {
                $variant = $this->getPreferredVariant();
                if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'i' ) {
                        $string = 'İ' . substr( $string, 1 );
@@ -452,7 +452,7 @@ class LanguageKk extends LanguageKk_cyrl {
         *
         * @return string
         */
-       function lcfirst ( $string ) {
+       function lcfirst( $string ) {
                $variant = $this->getPreferredVariant();
                if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'I' ) {
                        $string = 'ı' . substr( $string, 1 );
diff --git a/languages/classes/LanguageMk.php b/languages/classes/LanguageMk.php
deleted file mode 100644 (file)
index 968fe26..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Macedonian (Македонски) specific code.
- *
- * 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
- * @ingroup Language
- */
-
-/**
- * Macedonian (Македонски)
- *
- * @ingroup Language
- */
-class LanguageMk extends Language {
-       /**
-        * Plural forms per
-        * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mk
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-               // TODO CLDR defines forms[0] for n != 11 and not for n%100 !== 11
-               if ( $count % 10 === 1 && $count % 100 !== 11 ) {
-                       return $forms[0];
-               } else {
-                       return $forms[1];
-               }
-       }
-}
diff --git a/languages/classes/LanguageNso.php b/languages/classes/LanguageNso.php
deleted file mode 100644 (file)
index 0c08675..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Northern Sotho (Sesotho sa Leboa) specific code.
- *
- * 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
- * @ingroup Language
- */
-
-/**
- * Northern Sotho (Sesotho sa Leboa)
- *
- * @ingroup Language
- */
-class LanguageNso extends Language {
-       /**
-        * Use singular form for zero
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( $count <= 1 ) ? $forms[0] : $forms[1];
-       }
-}
diff --git a/languages/classes/LanguageSgs.php b/languages/classes/LanguageSgs.php
deleted file mode 100644 (file)
index 0c74e45..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
- * Samogitian (Žemaitėška) specific code.
- *
- * 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 Niklas Laxström
- * @ingroup Language
- */
-
-/**
- * Samogitian (Žemaitėška)
- *
- * @ingroup Language
- */
-class LanguageSgs extends Language {
-
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 4 );
-
-               $count = abs( $count );
-               if ( $count == 0 || ( $count % 100 === 0 || ( $count % 100 >= 10 && $count % 100 < 20 ) ) ) {
-                       return $forms[2];
-               } elseif ( $count % 10 === 1 ) {
-                       return $forms[0];
-               } elseif ( $count % 10 === 2 ) {
-                       return $forms[1];
-               } else {
-                       return $forms[3];
-               }
-       }
-}
index c075e51..77957b2 100644 (file)
@@ -53,27 +53,4 @@ class LanguageSl extends Language {
                return $word; # this will return the original value for 'imenovalnik' (nominativ) and all undefined case values
        }
 
-       /**
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 5 );
-
-               if ( $count % 100 == 1 ) {
-                       $index = 0;
-               } elseif ( $count % 100 == 2 ) {
-                       $index = 1;
-               } elseif ( $count % 100 == 3 || $count % 100 == 4 ) {
-                       $index = 2;
-               } elseif ( $count != 0 ) {
-                       $index = 3;
-               } else {
-                       $index = 4;
-               }
-               return $forms[$index];
-       }
 }
index 6a01566..887f05c 100644 (file)
@@ -38,7 +38,7 @@ class LanguageTr extends Language {
         * @param $string string
         * @return string
         */
-       function ucfirst ( $string ) {
+       function ucfirst( $string ) {
                if ( strlen( $string ) && $string[0] == 'i' ) {
                        return 'İ' . substr( $string, 1 );
                } else {
@@ -50,7 +50,7 @@ class LanguageTr extends Language {
         * @param $string string
         * @return mixed|string
         */
-       function lcfirst ( $string ) {
+       function lcfirst( $string ) {
                if ( strlen( $string ) && $string[0] == 'I' ) {
                        return 'ı' . substr( $string, 1 );
                } else {
index 5c4f193..5ad6717 100644 (file)
@@ -2,6 +2,7 @@
 <!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
 <supplementalData>
        <plurals>
+               <!-- What is this override for Hebrew based on? Is there a CLDR ticket for this? -Ryan Kaldari 2013-01-28 -->
                <pluralRules locales="he">
                        <pluralRule count="one">n is 1</pluralRule>
                        <pluralRule count="two">n is 2</pluralRule>
                <pluralRules locales="bho">
                        <pluralRule count="one">n in 0..1</pluralRule>
                </pluralRules>
+               <pluralRules locales="sgs">
+                       <pluralRule count="one">n mod 10 is 1 and n mod 100 is not 11</pluralRule>
+                       <pluralRule count="two">n mod 10 is 2 and n mod 100 is not 12</pluralRule>
+                       <pluralRule count="few">n is 0 or n mod 100 is 0 or n mod 100 in 10..19</pluralRule>
+               </pluralRules>
        </plurals>
 </supplementalData>
index 03416b1..987385e 100644 (file)
@@ -287,7 +287,7 @@ $messages = array(
 'edit' => 'ܫܚܠܦ',
 'create' => 'ܒܪܝ',
 'editthispage' => 'ܫܚܠܦ ܦܐܬܐ ܗܕܐ',
-'create-this-page' => 'Ü\92ܪÜ\9d ܦܐܬܐ ܗܕܐ',
+'create-this-page' => 'Ü£Ü\9dÜ¡ ܦܐܬܐ ܗܕܐ',
 'delete' => 'ܫܘܦ',
 'deletethispage' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'undelete_short' => 'ܠܐ ܫܘܦ {{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ|$1 ܫܘܚܠܦ̈ܐ}}',
@@ -666,7 +666,7 @@ $1',
 'viewprevnext' => 'ܚܘܝ ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'ܓܒܝܬ̈ܐ ܕܒܨܝܐ',
 'searchmenu-exists' => "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
-'searchmenu-new' => "'''Ü\92ܪÜ\9d ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
+'searchmenu-new' => "'''Ü£Ü\9dÜ¡ ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
 'searchhelp-url' => 'Help:ܚܒܝܫܬ̈ܐ',
 'searchprofile-articles' => 'ܦܐܬܬ̈ܐ ܕܚܒܝܫܬ̈ܐ',
 'searchprofile-project' => 'ܦܐܬܬ̈ܐ ܕܬܪ̈ܡܝܬܐ ܘܕܥܘܕܪܢܐ',
@@ -951,6 +951,7 @@ $1',
 'upload_source_file' => ' (ܠܦܦܐ ܥܠ ܚܫܘܒܬܐ ܕܝܠܟ)',
 
 # Special:ListFiles
+'listfiles_search_for' => 'ܒܨܝ ܥܠ ܫܡܐ ܕܡܝܕܝܐ:',
 'imgfile' => 'ܠܦܦܐ',
 'listfiles' => 'ܡܟܬܒܘܬܐ ܕܠܦܦ̈ܐ',
 'listfiles_thumb' => 'ܙܘܥܪܐ',
index 8dd9dba..f66fa66 100644 (file)
@@ -547,8 +547,8 @@ Por favor vuelvi identificate depués de recibila.',
 'blocked-mailpassword' => 'Ta bloquiada la edición dende la to direición IP, polo que pa evitar abusos nun se pue usar la función de recuperación de clave.',
 'eauthentsent' => "Unvióse un corréu electrónicu de confirmación a la direición indicada.
 Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu pa confirmar que la cuenta ye de to.",
-'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
-Pa evitar abusos, namái s'unviará un recordatoriu cada {{PLURAL:$1|hora|$1 hores}}.",
+'throttled-mailpassword' => "Yá s'unvió un corréu de reaniciu la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
+Pa evitar abusos, namái s'unviará un corréu de reaniciu cada {{PLURAL:$1|hora|$1 hores}}.",
 'mailerror' => 'Fallu al unviar el corréu: $1',
 'acct_creation_throttle_hit' => "Los visitantes d'esta wiki qu'usen la to direición IP yá crearon güei {{PLURAL:$1|1 cuenta|$1 cuentes}}, que ye'l máximu almitíu nesti periodu de tiempu.
 Poro, los visitantes qu'usen esta direición IP nun puen crear más cuentes de momentu.",
@@ -602,7 +602,7 @@ Seique yá camudaras correutamente la clave o que pidieras una nueva clave provi
 
 # Special:PasswordReset
 'passwordreset' => 'Reaniciar clave',
-'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu electrónicu que te recuerde los detalles de la to cuenta.',
+'passwordreset-text' => 'Complete esti formulariu pa reaniciar la contraseña.',
 'passwordreset-legend' => 'Reaniciar clave',
 'passwordreset-disabled' => 'Los reanicios de clave tán desactivaos nesta wiki.',
 'passwordreset-pretext' => "{{PLURAL:$1||Escribi ún de los elementos de los datos d'abaxo}}",
@@ -612,32 +612,27 @@ Seique yá camudaras correutamente la clave o que pidieras una nueva clave provi
 'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola clave provisional) amás d'unvialu al usuariu.",
 'passwordreset-email' => 'Direición de corréu electrónicu:',
 'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Daquién (seique tu, dende la direición IP $1)solicitó un recordatoriu de los
-detalles de la to cuenta de {{SITENAME}} ($4).
+'passwordreset-emailtext-ip' => "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).
 {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
 a esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nún día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona,
-o si recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir
-usando la to clave antigua.",
-'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un recordatoriu de los detalles de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
-a esta direición de corréu electrónicu:
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,
+o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir
+usando la contraseña antigua.",
+'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un reaniciu de la so contraseña de {{SITENAME}} ($4). {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}} con esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona, o si
-recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir usando
-la to clave antigua.",
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona, o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir usando la contraseña antigua.",
 'passwordreset-emailelement' => "Nome d'usuariu: $1
 Clave provisional: $2",
-'passwordreset-emailsent' => 'Unvióse un corréu electrónicu de recordatoriu.',
-'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu de recordatoriu, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu de recordatoriu, que s'amuesa abaxo, pero falló'l so unviu al usuariu: $1",
+'passwordreset-emailsent' => 'Unvióse un corréu electrónicu pa reaniciar la contraseña.',
+'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
+'passwordreset-emailerror-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu al usuariu: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Camudar la direición de corréu electrónicu',
@@ -734,7 +729,7 @@ Seique se treslladara o desaniciara mientres víes la páxina.',
 'loginreqtitle' => 'Necesítase identificación',
 'loginreqlink' => 'identificate',
 'loginreqpagetext' => 'Has $1 pa ver otres páxines.',
-'accmailtitle' => 'Clave unviada.',
+'accmailtitle' => 'Clave unviada',
 'accmailtext' => "Unvióse a $2 una clave xenerada al debalu pal usuariu [[User talk:$1|$1]].
 
 La clave d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar clave]]'' depués d'identificate.",
@@ -742,10 +737,11 @@ La clave d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|
 'newarticletext' => "Siguisti un enllaz a un artículu qu'inda nun esiste.
 Pa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
 Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
-'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.
+'anontalkpagetext' => "----
+''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''
 Pola mor d'ello ha usase la direición numbérica IP pa identificalu/la.
 Tala IP pue ser compartida por varios usuarios.
-Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.''",
+Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
 'noarticletext' => 'Nestos momentos nun hai testu nesta páxina.
 Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos],
@@ -2072,9 +2068,7 @@ Pue haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] toca
 
 # Email user
 'mailnologin' => "Ensin direición d'unviu",
-'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
-y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
-pa poder unviar correos a otros usuarios.',
+'mailnologintext' => 'Has tener [[Special:UserLogin|sesión aniciada]] y una direición de corréu válida nes tos [[Special:Preferences|preferencies]] pa poder unviar correos a otros usuarios.',
 'emailuser' => 'Manda-y un corréu a esti usuariu',
 'emailuser-title-target' => 'Unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}',
 'emailuser-title-notarget' => 'Unviar un corréu electrónicu a un usuariu',
@@ -2102,7 +2096,7 @@ La direición de corréu electrónicu qu\'especificasti nes [[Special:Preference
 'emailccme' => 'Unviame per corréu una copia del mio mensaxe.',
 'emailccsubject' => 'Copia del to mensaxe a $1: $2',
 'emailsent' => 'Corréu unviáu',
-'emailsenttext' => 'El to corréu foi unviáu.',
+'emailsenttext' => "Unviose'l to mensaxe de corréu.",
 'emailuserfooter' => 'Esti corréu electrónicu unviolu $1 a $2 per aciu de la función "Manda-y un corréu a un usuariu" de {{SITENAME}}.',
 
 # User Messenger
@@ -2472,9 +2466,9 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'unblockip' => 'Desbloquiar usuariu',
 'unblockiptext' => "Usa'l formulariu d'abaxo pa restablecer l'accesu d'escritura a una direicion IP o a un nome d'usuariu previamente bloquiáu.",
 'ipusubmit' => 'Desaniciar esti bloquéu',
-'unblocked' => '[[User:$1|$1]] foi desbloquiáu',
+'unblocked' => '[[User:$1|$1]] desbloquióse.',
 'unblocked-range' => '$1 se desbloquió',
-'unblocked-id' => 'El bloquéu $1 foi elimináu',
+'unblocked-id' => "Desaniciose'l bloquéu $1.",
 'blocklist' => 'Usuarios bloquiaos',
 'ipblocklist' => 'Usuarios bloquiaos',
 'ipblocklist-legend' => 'Atopar un usuariu bloquiáu',
@@ -2496,7 +2490,7 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'anononlyblock' => 'namái anón.',
 'noautoblockblock' => 'bloquéu automáticu desactiváu',
 'createaccountblock' => 'bloquiada la creación de cuentes',
-'emailblock' => 'corréu electrónicu bloquiáu',
+'emailblock' => 'corréu electrónicu desactiváu',
 'blocklist-nousertalk' => "nun pue editar la so páxina d'alderique",
 'ipblocklist-empty' => 'La llista de bloqueos ta vacia.',
 'ipblocklist-no-results' => "La direición IP o nome d'usuariu solicitáu nun ta bloquiáu.",
@@ -2520,7 +2514,7 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 'block-log-flags-anononly' => 'namái usuarios anónimos',
 'block-log-flags-nocreate' => 'creación de cuentes desactivada',
 'block-log-flags-noautoblock' => 'bloquéu automáticu deshabilitáu',
-'block-log-flags-noemail' => 'corréu electrónicu bloquiáu',
+'block-log-flags-noemail' => 'corréu electrónicu desactiváu',
 'block-log-flags-nousertalk' => "nun pue editar la páxina d'alderique propia",
 'block-log-flags-angry-autoblock' => 'autobloquéu ameyoráu activáu',
 'block-log-flags-hiddenname' => "nome d'usuariu anubríu",
@@ -3481,16 +3475,14 @@ Los demás tarán anubríos de mou predetermináu.
 # Email address confirmation
 'confirmemail' => 'Confirmar direición de corréu',
 'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
-funcionalidaes de mensaxes. Da-y al botón que tienes equí embaxo pa unviar un avisu de
-confirmación a la to direición. Esti avisu va incluyir un enllaz con un códigu; carga
-l'enllaz nel to navegador pa confirmar la to direición de corréu electrónicu.",
+'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les carauterístiques de corréu.
+Da-y al botón que tienes equí embaxo pa unviar un corréu de confirmación a la to direición.
+El corréu va incluyir un enllaz con un códigu; carga l'enllaz nel to navegador pa confirmar que la to direición de corréu electrónicu ye válida.",
 'confirmemail_pending' => "Yá s'unvió un códigu de confirmación a la to direición de corréu; si creasti hai poco la to cuenta, pues esperar dellos minutos a que-y de tiempu a llegar enantes de pidir otru códigu nuevu.",
 'confirmemail_send' => 'Unviar códigu de confirmación',
 'confirmemail_sent' => 'Corréu de confirmación unviáu.',
 'confirmemail_oncreate' => "Unvióse un códigu de confirmación a la to direición de corréu.
-Esti códigu nun se necesita pa identificase, pero tendrás que lu conseñar enantes
-d'activar cualesquier funcionalidá de la wiki que tea rellacionada col corréu.",
+Esti códigu nun se necesita p'aniciar sesión, pero tendrás que conseñalu enantes d'activar cualesquier carauterística de la wiki que tea rellacionada col corréu.",
 'confirmemail_sendfailed' => '{{SITENAME}} nun pudo unviar el to corréu de confirmación.
 Por favor comprueba que nun punxeras carauteres non válidos na to direición de corréu.
 
@@ -3502,15 +3494,15 @@ Agora yá pues [[Special:UserLogin|coneutate]] y esfrutar de la wiki.',
 'confirmemail_loggedin' => 'Quedó confirmada la to direición de corréu.',
 'confirmemail_error' => 'Hebo un problema al guardar la to confirmación.',
 'confirmemail_subject' => 'Confirmación de la direición de corréu de {{SITENAME}}',
-'confirmemail_body' => 'Daquién, seique tu dende la IP $1, rexistró la cuenta "$2" con
+'confirmemail_body' => 'Daquién, seique tu, dende la IP $1, rexistró la cuenta "$2" con
 esta direición de corréu en {{SITENAME}}.
 
-Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les funcionalidaes
+Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les carauterístiques
 de corréu en {{SITENAME}}, abri esti enllaz nel to navegador:
 
 $3
 
-Si *nun* rexistrasti tu la cuenta, da-y a esti enllaz pa cancelar
+Si *nun* rexistrasti tu la cuenta, sigui esti enllaz pa encaboxar
 la confirmación de la direición de corréu electrónicu:
 
 $5
@@ -3544,8 +3536,8 @@ la confirmación de les señes de corréu electrónicu:
 $5
 
 Esti códigu de confirmación caduca\'l $4.',
-'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu cancelada',
-'invalidateemail' => 'Cancelar confirmación de corréu electrónicu',
+'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu encaboxada',
+'invalidateemail' => 'Encaboxar confirmación de corréu electrónicu',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[La tresclusión interwiki ta desactivada]',
@@ -3554,7 +3546,7 @@ Esti códigu de confirmación caduca\'l $4.',
 'scarytranscludetoolong' => '[La URL ye demasiao llarga]',
 
 # Delete conflict
-'deletedwhileediting' => "'''Avisu''': ¡Esta páxina foi esborrada depués de qu'entamaras a editala!",
+'deletedwhileediting' => "'''Avisu''': ¡Esta páxina desanicióse depués de qu'entamaras a editala!",
 'confirmrecreate' => "L'usuariu [[User:$1|$1]] ([[User talk:$1|alderique]]) esborró esta páxina depués de qu'empecipiaras a editala pol siguiente motivu:
 : ''$2''
 Por favor confirma que daveres quies volver a crear esta páxina.",
@@ -3777,17 +3769,17 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'sqlite-no-fts' => '$1 ensin sofitu pa gueta en testu completu',
 
 # New logging system
-'logentry-delete-delete' => '$1 desanició la páxina $3',
-'logentry-delete-restore' => '$1 restauró la páxina $3',
-'logentry-delete-event' => "$1 camudó la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-delete-revision' => "$1 camudó la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-delete-event-legacy' => '$1 camudó la visibilidá de los socesos del rexistru en $3',
-'logentry-delete-revision-legacy' => '$1 camudó la visibilidá de les revisiones na páxina $3',
-'logentry-suppress-delete' => '$1 suprimió la páxina $3',
-'logentry-suppress-event' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-suppress-revision' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-suppress-event-legacy' => '$1 camudó en secretu la visibilidá de los socesos del rexistru en $3',
-'logentry-suppress-revision-legacy' => '$1 camudó en secretu la visibilidá de les revisiones na páxina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|desanició}} la páxina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restauró}} la páxina $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de los socesos del rexistru en $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de les revisiones na páxina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimió}} la páxina $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de los socesos del rexistru en $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de les revisiones na páxina $3',
 'revdelete-content-hid' => 'conteníu tapecíu',
 'revdelete-summary-hid' => "resume d'edición tapecíu",
 'revdelete-uname-hid' => "nome d'usuariu anubríu",
@@ -3796,20 +3788,20 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'revdelete-uname-unhid' => "nome d'usuariu non anubríu",
 'revdelete-restricted' => 'aplicaes les restricciones a los alministradores',
 'revdelete-unrestricted' => 'eliminaes les restricciones a los alministradores',
-'logentry-move-move' => '$1 treslladó la páxina "$3" a "$4"',
-'logentry-move-move-noredirect' => '$1 treslladó la páxina "$3" a "$4" ensin dexar una redireición',
-'logentry-move-move_redir' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición',
-'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
-'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
-'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
-'logentry-newusers-newusers' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create2' => "$1 creó la cuenta d'usuariu $3",
-'logentry-newusers-byemail' => "$1 creó la cuenta d'usuariu $3 y la contraseña uviose per corréu electrónicu",
-'logentry-newusers-autocreate' => 'La cuenta $1 creóse automáticamente',
-'logentry-rights-rights' => '$1 camudó la pertenencia a grupos de $3 dende $4 a $5',
-'logentry-rights-rights-legacy' => '$1 camudó la pertenencia a grupos de $3',
-'logentry-rights-autopromote' => '$1 promocionó automáticamente de $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" ensin dexar una redireición',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcó}} la revisión $4 de la páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcó}} automáticamente la revisión $4 de la páxina "$3" como patrullada',
+'logentry-newusers-newusers' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create2' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3",
+'logentry-newusers-byemail' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3 y la contraseña unvióse per corréu electrónicu",
+'logentry-newusers-autocreate' => 'La cuenta $1 {{GENDER:$2|creóse}} automáticamente',
+'logentry-rights-rights' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5',
 'rightsnone' => '(nengún)',
 
 # Feedback
index eb2f411..b80f1b7 100644 (file)
@@ -807,7 +807,7 @@ $2
 Цяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт,
 ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць,
 Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.',
-'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на атрыманьне падрабязнасьцяў Вашага рахунку ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|Наступны рахунак удзельніка зьвязаны|Наступныя рахункі удзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
+'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
 
 $2
 
index 35c9b4f..370c8b1 100644 (file)
@@ -755,7 +755,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Възстановяване на парола',
-'passwordreset-text' => 'След Ð¿Ð¾Ð¿Ñ\8aлванеÑ\82о Ð½Ð° Ñ\84оÑ\80мÑ\83лÑ\8fÑ\80а Ñ\89е Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82е Ð¿Ð¸Ñ\81мо Ñ\81 Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fÑ\89а Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f Ð·Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81каÑ\82а Ñ\81меÑ\82ка.',
+'passwordreset-text' => 'Ð\9fопÑ\8aлванеÑ\82о Ð½Ð° Ñ\84оÑ\80мÑ\83лÑ\8fÑ\80а Ñ\89е Ð´Ð¾Ð²ÐµÐ´Ðµ Ð´Ð¾ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а.',
 'passwordreset-legend' => 'Възстановяване на парола',
 'passwordreset-disabled' => 'Възстановяването на паролата е изключено в това уики.',
 'passwordreset-pretext' => '{{PLURAL:$1||Въведете някоя от информациите по-долу}}',
@@ -765,16 +765,13 @@ $2',
 'passwordreset-capture-help' => 'Поставянето на отметка в това поле ще покаже електронното писмо (с временната парола), което ще бъде изпратено и до потребителя.',
 'passwordreset-email' => 'Електронна поща:',
 'passwordreset-emailtitle' => 'Подробности за сметката в {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Някой (вероятно вие, от IP адрес $1) поиска напомняне за
-данните от сметката в {{SITENAME}} ($4). За {{PLURAL:$3|следната сметка|следните сметки}}
+'passwordreset-emailtext-ip' => 'Някой (вероятно вие, от IP адрес $1) поиска възстановяване на паролата за сметката в {{SITENAME}} ($4). За {{PLURAL:$3|следната сметка|следните сметки}}
 е посочен този адрес за електронна поща:
 
 $2
 
 {{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.
-Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си 
-спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате
-старата си парола.',
+Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.',
 'passwordreset-emailtext-user' => 'Потребител $1 от {{SITENAME}} поиска напомняне за данните от сметката в {{SITENAME}}
 ($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:
 
@@ -786,7 +783,7 @@ $2
 това съобщение и да продължите да използвате старата си парола.',
 'passwordreset-emailelement' => 'Потребителско име: $1
 Временна парола: $2',
-'passwordreset-emailsent' => 'Ð\91еÑ\88е Ð¸Ð·Ð¿Ñ\80аÑ\82ено Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fÑ\89о Ð¿Ð¸Ñ\81мо Ð½Ð° ÐµÐ»ÐµÐºÑ\82Ñ\80оннаÑ\82а Ð¿Ð¾Ñ\89а.',
+'passwordreset-emailsent' => 'Ð\9dа ÐµÐ»ÐµÐºÑ\82Ñ\80оннаÑ\82а Ð¿Ð¾Ñ\89а Ð±ÐµÑ\88е Ð¸Ñ\81пÑ\80аÑ\82ено Ð¿Ð¸Ñ\81мо Ð·Ð° Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а.',
 'passwordreset-emailsent-capture' => 'По-долу е показано електронното писмо за напомняне, което беше изпратено.',
 'passwordreset-emailerror-capture' => 'По-долу е показано създадено електронно писмо за напомняне, което не беше изпратено на потребителя: $1',
 
index c4fa254..001d6bf 100644 (file)
@@ -592,7 +592,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'শব্দচাবি রিসেট',
-'passwordreset-text' => 'à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¬à¦¿à¦¸à§\8dতারিত à¦¤à¦¥à§\8dয à¦\87-মà§\87à¦\87লà§\87র à¦®à¦¾à¦§à§\8dযমà§\87 à¦ªà§\87তà§\87 নিচের ফর্মটি পূরণ করুন।',
+'passwordreset-text' => 'à¦\86পনার à¦¶à¦¬à§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦\9cনà§\8dয নিচের ফর্মটি পূরণ করুন।',
 'passwordreset-legend' => 'শব্দচাবি রিসেট',
 'passwordreset-disabled' => 'এই উইকিতে শব্দচাবি রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।',
 'passwordreset-pretext' => '{{PLURAL:$1||নিচে উল্লেখিত ডেটাগুলোর কোনো একটি প্রবেশ করান}}',
@@ -603,7 +603,7 @@ $2',
 'passwordreset-email' => 'ইমেইল ঠিকানা:',
 'passwordreset-emailtitle' => '{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি',
 'passwordreset-emailtext-ip' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
-à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¬à¦¿à¦¸à§\8dতারিত à¦¤à¦¥à§\8dয à¦\9cানতà§\87 à¦\9aà§\87য়েছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
+শবà§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦\9cনà§\8dয à¦\85নà§\81রà§\8bধ à¦\95রেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
 এই ই-মেইল ঠিকানার সাথে সংযুক্ত:
 
 $2
@@ -612,8 +612,7 @@ $2
 আপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,
 অথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে
 আপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।',
-'passwordreset-emailtext-user' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
-অ্যাকাউন্টের একটি পাসওয়ার্ড রিমাইন্ডার চেয়ে পাঠিয়েছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
+'passwordreset-emailtext-user' => 'ব্যবহারকারী $1 {{SITENAME}} ($4) সাইটের জন্য আপনার শব্দচাবি বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
 এই ই-মেইল ঠিকানার সাথে সংযুক্ত:
 
 $2
@@ -624,9 +623,9 @@ $2
 আপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।',
 'passwordreset-emailelement' => 'ব্যবহারকারী নাম: $1
 অস্থায়ী শব্দচাবি: $2',
-'passwordreset-emailsent' => 'à¦\8fà¦\95à¦\9fি à¦°à¦¿à¦®à¦¾à¦\87নà§\8dডার ই-মেইল পাঠানো হয়েছে।',
+'passwordreset-emailsent' => 'শবà§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦\8fà¦\95à¦\9fি ই-মেইল পাঠানো হয়েছে।',
 'passwordreset-emailsent-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।',
-'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 ব্যবহারকারীকে এটি পাঠানো যায়নি',
+'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 ব্যবহারকারীকে এটি পাঠানো যায়নি!',
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকানা পরিবর্তন',
@@ -806,6 +805,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'template-protected' => '(সুরক্ষিত)',
 'template-semiprotected' => '(অর্ধ-সুরক্ষিত)',
 'hiddencategories' => 'এ পাতাটি যে {{PLURAL:$1|1 লুকায়িত বিষয়শ্রেণীর|$1 লুকায়িত বিষয়শ্রেণীসমূহের}} সদস্য:',
+'edittools-upload' => '-',
 'nocreatetext' => '{{SITENAME}}-এ নতুন পাতা সৃষ্টি করার ক্ষমতা সীমাবদ্ধ করা হয়েছে।
 আপনি ফিরে গিয়ে ইতিমধ্যে বিদ্যমান কোন পাতা সম্পাদনা করতে পারেন, অথবা [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ কিংবা অ্যাকাউন্ট সৃষ্টি করতে পারেন]]।',
 'nocreate-loggedin' => 'নতুন পাতা তৈরিতে আপনাকে অনুমোতি দেওয়া হয়নি।',
@@ -1914,6 +1914,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # Book sources
 'booksources' => 'বইয়ের উৎস',
 'booksources-search-legend' => 'বইয়ের উৎসের জন্য অনুসন্ধান করা হোক',
+'booksources-isbn' => 'আইএসবিএন:',
 'booksources-go' => 'চলো',
 'booksources-text' => 'নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:',
 'booksources-invalid-isbn' => 'উল্লেখিত ISBN সঠিক নয়; অনুগ্রহ করে মূল উৎস থেকে আবার পরীক্ষা করুন।',
@@ -1986,7 +1987,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # Special:ActiveUsers
 'activeusers' => 'সক্রিয় ব্যবহারকারী তালিকা',
 'activeusers-intro' => 'এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।',
-'activeusers-count' => 'à¦\97ত {{PLURAL:$3|দিনà§\87|$3 à¦¦à¦¿à¦¨à§\87}} à¦¸à¦°à§\8dবমà§\8bà¦\9f {{PLURAL:$1|সমà§\8dপাদনার|সমà§\8dপাদনার}} সংখ্যা $1',
+'activeusers-count' => 'à¦\97ত {{PLURAL:$3|দিনà§\87|$3 à¦¦à¦¿à¦¨à§\87}} à¦¸à¦°à§\8dবমà§\8bà¦\9f {{PLURAL:$1|à¦\95রà§\8dমà¦\95াণà§\8dডà§\87র|à¦\95রà§\8dমà¦\95াণà§\8dডà§\87র}} সংখ্যা $1',
 'activeusers-from' => 'ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:',
 'activeusers-hidebots' => 'বট লুকাও',
 'activeusers-hidesysops' => 'প্রশাসক লুকাও',
@@ -2831,6 +2832,9 @@ $1',
 'pageinfo-category-subcats' => 'উপবিষয়শ্রেণীর সংখ্যা',
 'pageinfo-category-files' => 'ফাইলের সংখ্যা',
 
+# Skin names
+'skinname-standard' => 'ক্লাসিক',
+
 # Patrolling
 'markaspatrolleddiff' => 'পরীক্ষিত বলে চিহ্নিত করুন',
 'markaspatrolledtext' => 'এই নিবন্ধটিকে পরীক্ষিত বলে চিহ্নিত করুন',
@@ -2899,6 +2903,7 @@ $1',
 'sp-newimages-showfrom' => '$2, $1 এর পরের নতুন ছবিগুলো দেখাও',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'minutes-abbrev' => '$1 মিনিট',
 'seconds' => '{{PLURAL:$1|$1 সেকেন্ড|$1 সেকেন্ড}}',
 'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
 'hours' => '{{PLURAL:$1|$1 ঘণ্টা|$1 ঘণ্টা}}',
@@ -3363,7 +3368,8 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 
 # Scary transclusion
 'scarytranscludedisabled' => '[আন্তঃউইকি আন্তঃভুক্তি নিষ্ক্রিয়]',
-'scarytranscludefailed' => '[$1 এর জন্য টেম্পলেট আনা অসফল হয়েছে]',
+'scarytranscludefailed' => '[$1 এর জন্য টেমপ্লেট আনা অসফল হয়েছে]',
+'scarytranscludefailed-httpstatus' => '[$1: HTTP $2 এর জন্য টেমপ্লেট আনা বিফল হয়েছে]',
 'scarytranscludetoolong' => '[URL অতিরিক্ত দীর্ঘ]',
 
 # Delete conflict
@@ -3587,7 +3593,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 
 # New logging system
 'logentry-delete-delete' => '$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে',
-'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি ফিরিয়ে আনা হয়েছে',
+'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে',
 'logentry-delete-event' => '$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
 'logentry-delete-revision' => '$1 {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
 'logentry-delete-event-legacy' => '$1 $3টায় লগ ইভেন্টসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
@@ -3608,14 +3614,14 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'logentry-move-move-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
 'logentry-move-move_redir' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার ওপর দিয়ে স্থানান্তর করেছেন',
 'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনার ওপর দিয়ে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
-'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
-'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
-'logentry-newusers-newusers' => '$1 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà¦\9fি à¦¤à§\88রি à¦\95রা হয়েছে',
+'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন',
+'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {GENDER:$2|চিহ্নিত}} করেছেন',
+'logentry-newusers-newusers' => '$1 à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà¦\9fি {GENDER:$2|তà§\88রি à¦\95রা}} হয়েছে',
 'logentry-newusers-create' => '$1 অ্যাকাউন্টটি তৈরী করা হয়েছে',
 'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি তৈরী করেছেন',
 'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছে',
 'logentry-rights-rights' => '$1 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ পরিবর্তন করেছেন',
-'logentry-rights-autopromote' => '$1 সয়ংক্রিয়ভাবে $4 থেকে $5 এ উন্নীত হয়েছে',
+'logentry-rights-autopromote' => '$1 সয়ংক্রিয়ভাবে $4 থেকে $5 এ {{GENDER:$2|উন্নীত}} হয়েছে',
 'rightsnone' => '(কিছু নাই)',
 
 # Feedback
index dad9157..c2980ab 100644 (file)
@@ -975,7 +975,7 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 بۆ لاپەڕەی وەک ئەوە هەوڵی [[Special:Search|گەڕان لەسەر ویکی]] بدە.',
 
 # Revision deletion
-'rev-deleted-comment' => '(پوختەی دەستکاری سڕایەوە)',
+'rev-deleted-comment' => '(کورتەی دەستکاری سڕایەوە)',
 'rev-deleted-user' => '(ناوی بەکارهێنەر سڕایەوە)',
 'rev-deleted-event' => '(لۆگی کردەوە سڕایەوە)',
 'rev-deleted-text-permission' => "ئەم پێداچوونەوەیە لەم پەڕەیە '''سڕدراوەتەوە'''.
@@ -1278,8 +1278,8 @@ $1",
 'yournick' => 'واژووی نوێ:',
 'prefs-help-signature' => 'بۆچوونەکان لە لاپەڕەکانی وتووێژدا دەبێ بە "<nowiki>~~~~</nowiki>" دیاری بکرێن، کە دواتر خۆکار دەگۆڕێ بە واژۆکەت و مۆری کاتی.',
 'badsig' => 'ئیمزاكه‌ هه‌ڵه‌یه‌، ته‌ماشای كۆدی HTML بكه‌‌',
-'badsiglength' => 'واژۆکەت زۆر درێژە.
-واژۆ نابێ لە $1 {{PLURAL:$1|نووسە|نووسە}} درێژتر بێت.',
+'badsiglength' => 'واژووەکەت زۆر درێژە.
+واژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.',
 'yourgender' => 'زایەند:',
 'gender-unknown' => 'ئاشکرا نەکراو',
 'gender-male' => 'پیاو',
@@ -1294,7 +1294,7 @@ $1",
 'prefs-help-email-required' => 'ناونیشانی ئیمەیل پێویستە.',
 'prefs-info' => 'زانیاریی سەرەتایی',
 'prefs-i18n' => 'نێونەتەویی کردن',
-'prefs-signature' => 'واژۆ',
+'prefs-signature' => 'واژوو',
 'prefs-dateformat' => 'ڕازاندنەوەی ڕێکەوت',
 'prefs-timeoffset' => 'قەرەبووکەری کات',
 'prefs-advancedediting' => 'ھەڵبژاردەکانی پێشکەوتوو',
index 504c55d..fce5ba8 100644 (file)
@@ -477,7 +477,7 @@ $1',
 'viewsource-title' => '$1 саифесининъ менба коду',
 'actionthrottled' => 'Арекет токъталды',
 'actionthrottledtext' => 'Спамгъа къаршы куреш себебинден бу арекетни аз вакъыт ичинде чокъ кере текрарлап оламайсынъыз. Мумкюн олгъан къарардан зияде арекет яптынъыз. Бир къач дакъкъадан сонъ текрарлап бакъынъыз.',
-'protectedpagetext' => 'Ð\91Ñ\83 Ñ\81аиÑ\84ени ÐºÐ¸Ð¼Ñ\81е Ð´ÐµÐ½Ñ\8aиÑ\88Ñ\82иÑ\80меÑ\81ин деп о блок этильди.',
+'protectedpagetext' => 'Ð\91Ñ\83 Ñ\81аиÑ\84еде Ð´ÐµÐ½Ñ\8aиÑ\88Ñ\82иÑ\80ме Ñ\8f Ð´Ð° Ð±Ð°Ñ\88кÑ\8aа Ð±Ð¸Ñ\80 Ð°Ñ\80екеÑ\82 Ñ\8fпÑ\8bлмаÑ\81Ñ\8bн деп о блок этильди.',
 'viewsourcetext' => 'Саифенинъ кодуны козьден кечирип копиялай билесинъиз:',
 'protectedinterface' => 'Бу саифеде система интерфейсининъ метни бар. Онынъ ичюн мында бир хата чыкъмасын деп оны денъиштирмек ясакъ.',
 'editinginterface' => "'''Тенби''': MediaWiki системасынынъ интерфейс саифесини денъиштиреятасыз. Бу саифедеки денъиштирмелер интерфейснинъ корюнишини бу викининъ башкъа къулланыджылары ичюн де денъиштиреджек. Лютфен, вики интерфейсини терджиме этмек ичюн [//translatewiki.net/wiki/Main_Page?setlang=crh translatewiki.net] сайтыны (MediaWiki ресмий локализация лейхасы) къулланынъыз.",
@@ -1044,7 +1044,7 @@ $3 мына бу себепни бильдирди: ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|денъиштирме}}',
 'recentchanges' => 'Сонъки денъиштирмелер',
 'recentchanges-legend' => 'Сонъки денъиштирмелер сазламалары',
-'recentchanges-summary' => 'Япылгъан энъ сонъки денъишикликлерни бу саифеде корип оласынъыз.',
+'recentchanges-summary' => 'Япылгъан энъ сонъки денъиштирмелерни бу саифеде корип оласынъыз.',
 'recentchanges-feed-description' => 'Бу лента вастасынен викиде сонъки денъиштирмелерни козет.',
 'recentchanges-label-newpage' => 'Бу денъиштирме янъы бир саифе яратты',
 'recentchanges-label-minor' => 'Бу, кичик бир денъиштирме',
@@ -1516,7 +1516,7 @@ $UNWATCHURL
 Къорчалангъан саифелер [[Special:ProtectedPages|там джедвелини]] де коре билесинъиз.',
 'protectedarticle' => '"[[$1]]" къорчалав алтына алынды',
 'modifiedarticleprotection' => '«[[$1]]» ичюн къорчалав севиеси денъиштирильди',
-'unprotectedarticle' => 'къорчалав чыкъарлыды: "[[$1]]"',
+'unprotectedarticle' => '"[[$1]]" саифесинден къорчалав чыкъарлыды',
 'prot_1movedto2' => '"[[$1]]" саифесининъ ады "[[$2]]" оларакъ денъиштирильди',
 'protect-legend' => 'Къорчалавны тасдыкъла',
 'protectcomment' => 'Себеп:',
@@ -1528,9 +1528,9 @@ $UNWATCHURL
 'protect-cascadeon' => 'Бу саифе шимди къорчалав алтындадыр, чюнки ашагъыда джедвелленген ве каскадлы къорчалав алтындаки {{PLURAL:$1|1|$1}} саифеде къулланыла.
 Бу саифенинъ къорчалав севиесини денъиштирип оласынъыз, амма каскадлы къорчалав тесир этильмейджек.',
 'protect-default' => 'Бутюн къулланыджыларгъа рухсет бер',
-'protect-fallback' => '«$1» изни керектир',
-'protect-level-autoconfirmed' => 'Ð\9aÑ\8aайдÑ\81Ñ\8bз Ð²Ðµ Ñ\8fнÑ\8aÑ\8b ÐºÑ\8aÑ\83лланÑ\8bджÑ\8bлаÑ\80нÑ\8b Ð±Ð»Ð¾Ðº Ñ\8dÑ\82',
-'protect-level-sysop' => 'тек идареджилер',
+'protect-fallback' => 'Тек «$1» рухсети олгъан къулланыджылар ичюн',
+'protect-level-autoconfirmed' => 'Тек Ð°Ð²Ñ\82омаÑ\82ик Ñ\82аÑ\81дÑ\8bкÑ\8aлангÑ\8aан ÐºÑ\8aÑ\83лланÑ\8bджÑ\8bлаÑ\80гÑ\8aа Ñ\80Ñ\83Ñ\85Ñ\81еÑ\82 Ð±ÐµÑ\80иле',
+'protect-level-sysop' => 'Тек идареджилерге рухсет бериле',
 'protect-summary-cascade' => 'каскадлы',
 'protect-expiring' => 'бите: $1 (UTC)',
 'protect-cascade' => 'Бу саифеде къулланылгъан бутюн саифелерни къорчалавгъа ал (каскадлы къорчалав)',
@@ -1567,9 +1567,9 @@ $UNWATCHURL
 'blanknamespace' => '(Эсас)',
 
 # Contributions
-'contributions' => 'Къулланыджынынъ исселери',
+'contributions' => '{{GENDER:$1|Къулланыджынынъ}} исселери',
 'contributions-title' => '$1 къулланыджысынынъ исселери',
-'mycontris' => 'Исселерим',
+'mycontris' => 'Исселер',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Бу критерийлерге уйгъан денъиштирме тапыламады',
 'uctop' => '(сонъки)',
index 80dee5a..ad088f0 100644 (file)
@@ -472,9 +472,9 @@ Soratma: $2',
 'viewsource-title' => '$1 saifesiniñ menba kodu',
 'actionthrottled' => 'Areket toqtaldı',
 'actionthrottledtext' => 'Spamğa qarşı küreş sebebinden bu areketni az vaqıt içinde çoq kere tekrarlap olamaysıñız. Mümkün olğan qarardan ziyade areket yaptıñız. Bir qaç daqqadan soñ tekrarlap baqıñız.',
-'protectedpagetext' => 'Bu saifeni kimse deñiştirmesin dep o blok etildi.',
+'protectedpagetext' => 'Bu saifede deñiştirme ya da başqa bir areket yapılmasın dep o blok etildi.',
 'viewsourcetext' => 'Saifeniñ kodunı közden keçirip kopiyalay bilesiñiz:',
-'protectedinterface' => 'Bu saifede sistema interfeysiniñ metni bar. Onıñ içün mında bir hata çıqmasın dep onı deñiştirmek yasaq.',
+'protectedinterface' => 'Bu saifede viki interfeysiniñ metni bar. Onıñ içün mında bir hata çıqmasın dep onı deñiştirmek yasaq.',
 'editinginterface' => "'''Tenbi''': MediaWiki sistemasınıñ interfeys saifesini deñiştireyatasız. Bu saifedeki deñiştirmeler interfeysniñ körünişini bu vikiniñ başqa qullanıcıları içün de deñiştirecek. Lütfen, viki interfeysini tercime etmek içün [//translatewiki.net/wiki/Main_Page?setlang=crh translatewiki.net] saytını (MediaWiki resmiy lokalizatsiya leyhası) qullanıñız.",
 'sqlhidden' => '(SQL istintağı saqlı)',
 'cascadeprotected' => 'Bu saifeni deñiştirip olamazsıñız, çünki kaskad qorçalav altında bulunğan {{PLURAL:$1|saifege|saifelerge}} mensüptir:
@@ -1040,7 +1040,7 @@ Eger bildirseñiz, saifelerdeki deñiştirmelerni kimniñ yapqanını köstermek
 'nchanges' => '$1 {{PLURAL:$1|deñiştirme}}',
 'recentchanges' => 'Soñki deñiştirmeler',
 'recentchanges-legend' => 'Soñki deñiştirmeler sazlamaları',
-'recentchanges-summary' => 'Yapılğan eñ soñki deñişikliklerni bu saifede körip olasıñız.',
+'recentchanges-summary' => 'Yapılğan eñ soñki deñişitirmelerni bu saifede körip olasıñız.',
 'recentchanges-feed-description' => 'Bu lenta vastasınen vikide soñki deñiştirmelerni közet.',
 'recentchanges-label-newpage' => 'Bu deñiştirme yañı bir saife yarattı',
 'recentchanges-label-minor' => 'Bu, kiçik bir deñiştirme',
@@ -1511,7 +1511,7 @@ yaqın zamanda yoq etilgenlerni körmek içün: $2.',
 Qorçalanğan saifeler [[Special:ProtectedPages|tam cedvelini]] de köre bilesiñiz.',
 'protectedarticle' => '"[[$1]]" qorçalav altına alındı',
 'modifiedarticleprotection' => '"[[$1]]" içün qorçalav seviyesi deñiştirildi',
-'unprotectedarticle' => 'qorçalav çıqarlıdı: "[[$1]]"',
+'unprotectedarticle' => '"[[$1]]" saifesinden qorçalav çıqarlıdı',
 'prot_1movedto2' => '"[[$1]]" saifesiniñ adı "[[$2]]" olaraq deñiştirildi',
 'protect-legend' => 'Qorçalavnı tasdıqla',
 'protectcomment' => 'Sebep:',
@@ -1523,9 +1523,9 @@ Qorçalanğan saifeler [[Special:ProtectedPages|tam cedvelini]] de köre bilesi
 'protect-cascadeon' => 'Bu saife şimdi qorçalav altındadır, çünki aşağıda cedvellengen ve kaskadlı qorçalav altındaki {{PLURAL:$1|1|$1}} saifede qullanıla.
 Bu saifeniñ qorçalav seviyesini deñiştirip olasıñız, amma kaskadlı qorçalav tesir etilmeycek.',
 'protect-default' => 'Bütün qullanıcılarğa ruhset ber',
-'protect-fallback' => '"$1" izni kerektir',
-'protect-level-autoconfirmed' => 'Qaydsız ve yañı qullanıcılarnı blоk et',
-'protect-level-sysop' => 'tek idareciler',
+'protect-fallback' => 'Tek "$1" ruhseti olğan qullanıcılar içün',
+'protect-level-autoconfirmed' => 'Tek avtomatik tasdıqlanğan qullanıcılarğa ruhset berile',
+'protect-level-sysop' => 'Tek idarecilerge ruhset berile',
 'protect-summary-cascade' => 'kaskadlı',
 'protect-expiring' => 'bite: $1 (UTC)',
 'protect-cascade' => 'Bu saifede qullanılğan bütün saifelerni qorçalavğa al (kaskadlı qorçalav)',
@@ -1562,9 +1562,9 @@ Bu saifeniñ qorçalav seviyesini deñiştirip olasıñız, amma kaskadlı qorç
 'blanknamespace' => '(Esas)',
 
 # Contributions
-'contributions' => 'Qullanıcınıñ isseleri',
+'contributions' => '{{GENDER:$1|Qullanıcınıñ}} isseleri',
 'contributions-title' => '$1 qullanıcısınıñ isseleri',
-'mycontris' => 'İsselerim',
+'mycontris' => 'İsseler',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Bu kriteriylerge uyğan deñiştirme tapılamadı',
 'uctop' => '(soñki)',
index 6a054af..d9f70ce 100644 (file)
@@ -886,7 +886,7 @@ Možná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové d
 
 # Special:PasswordReset
 'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Pro obdržení e-mailu s připomenutím detailů vašeho účtu vyplňte tento formulář.',
+'passwordreset-text' => 'Pro získání nového hesla vyplňte tento formulář.',
 'passwordreset-legend' => 'Znovu nastavit heslo',
 'passwordreset-disabled' => 'Znovunastavení hesla je na této wiki zakázáno.',
 'passwordreset-pretext' => '{{PLURAL:$1||Zadejte jeden z údajů níže}}',
@@ -896,8 +896,7 @@ Možná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové d
 'passwordreset-capture-help' => 'Pokud zaškrtnete toto políčko, bude e-mail (s dočasným heslem) kromě zaslání uživateli zobrazen i vám.',
 'passwordreset-email' => 'E-mailová adresa:',
 'passwordreset-emailtitle' => 'Informace k účtu na {{grammar:6sg|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Někdo (patrně vy, z IP adresy $1) zažádal o připomenutí informací k vašemu
-účtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:
+'passwordreset-emailtext-ip' => 'Někdo (patrně vy, z IP adresy $1) zažádal o nastavení nového hesla k vašemu účtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:
 
 $2
 
@@ -905,7 +904,7 @@ $2
 Nyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek
 poslal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho
 tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.',
-'passwordreset-emailtext-user' => '{{gender:$1|Uživatel|Uživatelka|Uživatel}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala|zažádal}} o připomenutí informací k vašemu
+'passwordreset-emailtext-user' => '{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} o nastavení nového hesla k vašemu
 účtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:
 
 $2
@@ -916,9 +915,9 @@ poslal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete h
 tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.',
 'passwordreset-emailelement' => 'Uživatelské jméno: $1
 Dočasné heslo: $2',
-'passwordreset-emailsent' => 'E-mail s heslem byl odeslán.',
-'passwordreset-emailsent-capture' => 'Byl vygenerován připomínací e-mail, který je zobrazen níže.',
-'passwordreset-emailerror-capture' => 'Byl vygenerován připomínací e-mail, který je zobrazen níže, ale nepodařilo se ho odeslat uživateli: $1',
+'passwordreset-emailsent' => 'E-mail pro získání nového hesla byl odeslán.',
+'passwordreset-emailsent-capture' => 'Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.',
+'passwordreset-emailerror-capture' => 'Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale nepodařilo se ho odeslat uživateli: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Změna e-mailové adresy',
@@ -4052,17 +4051,17 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'sqlite-no-fts' => '$1 bez podpory plnotextového vyhledávání',
 
 # New logging system
-'logentry-delete-delete' => '$1 smazal stránku $3',
-'logentry-delete-restore' => '$1 obnovil stránku $3',
-'logentry-delete-event' => '$1 změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
-'logentry-delete-revision' => '$1 změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
-'logentry-delete-event-legacy' => '$1 změnil viditelnost protokolovacích záznamů ke stránce $3',
-'logentry-delete-revision-legacy' => '$1 změnil viditelnost revizí na stránce $3',
-'logentry-suppress-delete' => '$1 utajil stránku $3',
-'logentry-suppress-event' => '$1 utajeně změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
-'logentry-suppress-revision' => '$1 utajeně změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
-'logentry-suppress-event-legacy' => '$1 utajeně změnil viditelnost protokolovacích záznamů ke stránce $3',
-'logentry-suppress-revision-legacy' => '$1 utajeně změnil viditelnost revizí na stránce $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|smazal|smazala}} stránku $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|obnovil|obnovila}} stránku $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|utajil|utajila}} stránku $3',
+'logentry-suppress-event' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-suppress-revision' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-suppress-event-legacy' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-suppress-revision-legacy' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3',
 'revdelete-content-hid' => 'skryt obsah',
 'revdelete-summary-hid' => 'skryto shrnutí editace',
 'revdelete-uname-hid' => 'skryto uživatelské jméno',
@@ -4071,20 +4070,20 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'revdelete-uname-unhid' => 'odkryto uživatelské jméno',
 'revdelete-restricted' => 'omezení správců použito',
 'revdelete-unrestricted' => 'omezení správců odstraněno',
-'logentry-move-move' => '$1 přesunul stránku $3 na $4',
-'logentry-move-move-noredirect' => '$1 přesunul stránku $3 na $4 bez založení přesměrování',
-'logentry-move-move_redir' => '$1 přesunul stránku $3 na $4 s výměnou přesměrování',
-'logentry-move-move_redir-noredirect' => '$1 přesunul stránku $3 na $4 místo přesměrování bez založení přesměrování',
-'logentry-patrol-patrol' => '$1 označil revizi $4 stránky $3 jako prověřenou',
-'logentry-patrol-patrol-auto' => '$1 automaticky označil revizi $4 stránky $3 jako prověřenou',
-'logentry-newusers-newusers' => 'Byl založen uživatelský účet $1',
-'logentry-newusers-create' => 'Byl založen uživatelský účet $1',
-'logentry-newusers-create2' => '$1 založil uživatelský účet $3',
+'logentry-move-move' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 bez založení přesměrování',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 s výměnou přesměrování',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 místo přesměrování bez založení přesměrování',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|označil|označila}} revizi $4 stránky $3 jako prověřenou',
+'logentry-patrol-patrol-auto' => '$1 automaticky {{GENDER:$2|označil|označila}} revizi $4 stránky $3 jako prověřenou',
+'logentry-newusers-newusers' => 'Byl {{GENDER:$2|založen}} uživatelský účet $1',
+'logentry-newusers-create' => 'Byl {{GENDER:$2|založen}} uživatelský účet $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|založil|založila}} uživatelský účet $3',
 'logentry-newusers-byemail' => '$1 {{GENDER:$2|založil|založila}} uživatelský účet $3, heslo bylo posláno e-mailem',
-'logentry-newusers-autocreate' => 'Automaticky byl založen účet $1',
+'logentry-newusers-autocreate' => 'Automaticky byl {{GENDER:$2|založen}} účet $1',
 'logentry-rights-rights' => '$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách z $4 na $5',
-'logentry-rights-rights-legacy' => '$1 změnil členství $3 ve skupinách',
-'logentry-rights-autopromote' => '$1 byl automaticky povýšen z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|byl automaticky povýšen|byla automaticky povýšena}} z $4 na $5',
 'rightsnone' => '(žádné)',
 
 # Feedback
index 6d0156c..ab81729 100644 (file)
@@ -122,7 +122,7 @@ $messages = array(
 'tog-justify' => 'Unioni paragraffau',
 'tog-hideminor' => 'Cuddio golygiadau bychain yn rhestr y newidiadau diweddar',
 'tog-hidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar',
-'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag y rhestr dudalennau newydd',
+'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag rhestr y tudalennau newydd',
 'tog-extendwatchlist' => "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
 'tog-usenewrc' => "Yn dangos newidiadau i un dudalen gyda'i gilydd - ar 'newidiadau diweddar' a'r 'rhestr wylio' (angen JavaScript)",
 'tog-numberheadings' => "Rhifo penawdau'n awtomatig",
@@ -586,8 +586,8 @@ Os mai rhywun arall a holodd am y cyfrinair, ynteu eich bod wedi cofio\'r hen gy
 'blocked-mailpassword' => 'Gan fod eich cyfeiriad IP wedi ei atal rhag golygu, ni ellir adfer y cyfrinair.',
 'eauthentsent' => 'Anfonwyd e-bost o gadarnhâd at y cyfeiriad a benwyd.
 Cyn y gellir anfon unrhywbeth arall at y cyfeiriad hwnnw rhaid i chi ddilyn y cyfarwyddiadau yn yr e-bost hwnnw er mwyn cadarnhau bod y cyfeiriad yn un dilys.',
-'throttled-mailpassword' => "Anfonwyd e-bost atoch i'ch atgoffa o'ch cyfrinair eisoes, yn ystod y $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}} diwethaf.
-Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}}.",
+'throttled-mailpassword' => "Anfonwyd e-bost atoch eisoes i'ch atgoffa o'ch cyfrinair, a hynny yn ystod y $1 {{PLURAL:$1|awr}} diwethaf.
+Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr}}.",
 'mailerror' => 'Gwall wrth ddanfon yr e-bost: $1',
 'acct_creation_throttle_hit' => "Mae ymwelwyr sy'n defnyddio'ch cyfeiriad IP wedi creu $1 {{PLURAL:$1|cyfrif|cyfrif|gyfrif|chyfrif|chyfrif|cyfrif}} yn ystod y diwrnod diwethaf, sef y mwyafswm a ganiateir mewn diwrnod.
 Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfrifon ar hyn o bryd.",
@@ -636,7 +636,7 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
 
 # Special:PasswordReset
 'passwordreset' => 'Ailosod cyfrinair',
-'passwordreset-text' => "Cwblhewch y ffurflen hon er mwyn derbyn e-bost i'ch atgoffa o fanylion eich cyfrif.",
+'passwordreset-text' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
 'passwordreset-legend' => 'Ailosod y cyfrinair',
 'passwordreset-disabled' => 'Analluogwyd ailosod cyfrineiriau ar y wici hwn.',
 'passwordreset-pretext' => "{{PLURAL:$1|||Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod}}",
@@ -646,23 +646,23 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
 'passwordreset-capture-help' => "Os y ticiwch y blwch hwn, bydd yr e-bost (gyda'r cyfrinair dros dro) yn cael ei ddangos i chi yn ogystal a chael ei anfon at y defnyddiwr.",
 'passwordreset-email' => 'Eich cyfeiriad e-bost:',
 'passwordreset-emailtitle' => 'Manylion eich cyfrif ar {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am nodyn atgoffa o fanylion eich cyfrif ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am ailosod eich cyfrinair ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
 
 $2
 
-Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
-'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ei atgoffa o fanylion eich cyfrif ar {{SITENAME}}
-($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
+'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ailosod ei gyfrinair ar {{SITENAME}}
+($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
 
 $2
 
-Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau|cyfrineiriau|cyfrineiriau|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}.
+Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod}}.
 Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
 'passwordreset-emailelement' => "Enw'r defnyddiwr: $1
 Y cyfrinair dros dro: $2",
-'passwordreset-emailsent' => 'Anfonwyd nodyn atgoffa drwy e-bost.',
-'passwordreset-emailsent-capture' => 'Anfonwyd e-bost atgoffa, a ddangosir isod.',
-'passwordreset-emailerror-capture' => "Lluniwyd e-bost atgoffa fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+'passwordreset-emailsent' => 'Anfonwyd e-bost i ailosod eich cyfrinair atoch.',
+'passwordreset-emailsent-capture' => "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
+'passwordreset-emailerror-capture' => "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Newid y cyfeiriad e-bost',
@@ -3718,12 +3718,12 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'logentry-delete-delete' => 'Dileodd $1 y dudalen $3',
 'logentry-delete-restore' => 'Adferodd $1 y dudalen $3',
 'logentry-delete-event' => 'Newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
 'logentry-delete-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3',
 'logentry-delete-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3",
 'logentry-suppress-delete' => 'Cuddiodd $1 y dudalen $3',
 'logentry-suppress-event' => 'Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
 'logentry-suppress-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3, yn y dirgel',
 'logentry-suppress-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
 'revdelete-content-hid' => 'cuddiwyd y cynnwys',
@@ -3734,8 +3734,8 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'revdelete-uname-unhid' => 'datguddiwyd yr enw defnyddiwr',
 'revdelete-restricted' => 'cyfyngwyd ar allu gweinyddwyr i weld',
 'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
-'logentry-move-move' => 'Symudwyd y dudalen $3 i $4 gan $1',
-'logentry-move-move-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 heb adael dolen ailgyfeirio',
+'logentry-move-move' => 'Symudodd $1 y dudalen $3 i $4',
+'logentry-move-move-noredirect' => 'Symudodd $1 y dudalen $3 i $4 heb adael dolen ailgyfeirio',
 'logentry-move-move_redir' => 'Symudwyd y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
 'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
 'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
index 905afc8..0920527 100644 (file)
@@ -462,7 +462,7 @@ $messages = array(
 'faqpage' => 'Project: PZP',
 
 # Vector skin
-'vector-action-addsection' => 'Mesel Vırazê',
+'vector-action-addsection' => 'Mewzu vıraze',
 'vector-action-delete' => 'Bestere',
 'vector-action-move' => 'Berê',
 'vector-action-protect' => 'Bıpawe',
@@ -1279,7 +1279,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'mergelog' => 'Logê yew kerdişî',
 'pagemerge-logentry' => '[[$1]] u [[$2]] yew kerd (revizyonî heta $3)',
 'revertmerge' => 'Abırnê',
-'mergelogpagetext' => 'Cêr de  liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.',
+'mergelogpagetext' => 'Cêr de yew liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.',
 
 # Diffs
 'history-title' => 'Rewizyonê $1:',
@@ -1687,9 +1687,9 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rc-old-title' => '"$1"i orcinalê cı vıraşt',
 
 # Recent changes linked
-'recentchangeslinked' => 'Vurnayışê eleqeyıni',
-'recentchangeslinked-feed' => 'Vurnayışê eleqeyıni',
-'recentchangeslinked-toolbox' => 'Vurnayışê eleqeyıni',
+'recentchangeslinked' => 'Vurnayışê elaqeyıni',
+'recentchangeslinked-feed' => 'Vurnayışê elaqeyıni',
+'recentchangeslinked-toolbox' => 'Vurnayışê elaqeyıni',
 'recentchangeslinked-title' => 'vurnayışan ser "$1"',
 'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdaoğan de lista de vurnayışê peyênana.
index 6260f23..ad070bf 100644 (file)
@@ -775,9 +775,9 @@ XHTML id names.
 'newwindow'     => '(opens in new window)',
 'cancel'        => 'Cancel',
 'moredotdotdot' => 'More...',
+'morenotlisted' => 'More not listed...',
 'mypage'        => 'Page',
 'mytalk'        => 'Talk',
-'morenotlisted' => 'More not listed...',
 'anontalk'      => 'Talk for this IP address',
 'navigation'    => 'Navigation',
 'and'           => '&#32;and',
@@ -1067,73 +1067,73 @@ The administrator who locked it offered this explanation: "$3".',
 'virus-unknownscanner' => 'unknown antivirus:',
 
 # Login and logout pages
-'logouttext'                 => "'''You are now logged out.'''
+'logouttext'                      => "'''You are now logged out.'''
 
 You can continue to use {{SITENAME}} anonymously, or you can <span class='plainlinks'>[$1 log in again]</span> as the same or as a different user.
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomeuser'                => 'Welcome, $1!',
-'welcomecreation-msg'        => 'Your account has been created.
+'welcomeuser'                     => 'Welcome, $1!',
+'welcomecreation-msg'             => 'Your account has been created.
 Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
-'yourname'                   => 'Username:',
-'yourpassword'               => 'Password:',
-'yourpasswordagain'          => 'Retype password:',
-'remembermypassword'         => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'securelogin-stick-https'    => 'Stay connected to HTTPS after login',
-'yourdomainname'             => 'Your domain:',
-'password-change-forbidden'  => 'You cannot change passwords on this wiki.',
-'externaldberror'            => 'There was either an authentication database error or you are not allowed to update your external account.',
-'login'                      => 'Log in',
-'nav-login-createaccount'    => 'Log in / create account',
-'loginprompt'                => 'You must have cookies enabled to log in to {{SITENAME}}.',
-'userlogin'                  => 'Log in / create account',
-'userloginnocreate'          => 'Log in',
-'logout'                     => 'Log out',
-'userlogout'                 => 'Log out',
-'userlogout-summary'         => '', # do not translate or duplicate this message to other languages
-'notloggedin'                => 'Not logged in',
-'nologin'                    => "Don't have an account? $1.",
-'nologinlink'                => 'Create an account',
-'createaccount'              => 'Create account',
-'gotaccount'                 => 'Already have an account? $1.',
-'gotaccountlink'             => 'Log in',
-'userlogin-resetlink'        => 'Forgotten your login details?',
-'createaccountmail'          => 'Use a temporary random password and send it to the email address specified below',
-'createaccountreason'        => 'Reason:',
-'badretype'                  => 'The passwords you entered do not match.',
-'userexists'                 => 'Username entered already in use.
+'yourname'                        => 'Username:',
+'yourpassword'                    => 'Password:',
+'yourpasswordagain'               => 'Retype password:',
+'remembermypassword'              => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'securelogin-stick-https'         => 'Stay connected to HTTPS after login',
+'yourdomainname'                  => 'Your domain:',
+'password-change-forbidden'       => 'You cannot change passwords on this wiki.',
+'externaldberror'                 => 'There was either an authentication database error or you are not allowed to update your external account.',
+'login'                           => 'Log in',
+'nav-login-createaccount'         => 'Log in / create account',
+'loginprompt'                     => 'You must have cookies enabled to log in to {{SITENAME}}.',
+'userlogin'                       => 'Log in / create account',
+'userloginnocreate'               => 'Log in',
+'logout'                          => 'Log out',
+'userlogout'                      => 'Log out',
+'userlogout-summary'              => '', # do not translate or duplicate this message to other languages
+'notloggedin'                     => 'Not logged in',
+'nologin'                         => "Don't have an account? $1.",
+'nologinlink'                     => 'Create an account',
+'createaccount'                   => 'Create account',
+'gotaccount'                      => 'Already have an account? $1.',
+'gotaccountlink'                  => 'Log in',
+'userlogin-resetlink'             => 'Forgotten your login details?',
+'createaccountmail'               => 'Use a temporary random password and send it to the email address specified below',
+'createaccountreason'             => 'Reason:',
+'badretype'                       => 'The passwords you entered do not match.',
+'userexists'                      => 'Username entered already in use.
 Please choose a different name.',
-'loginerror'                 => 'Login error',
-'createaccounterror'         => 'Could not create account: $1',
-'nocookiesnew'               => 'The user account was created, but you are not logged in.
+'loginerror'                      => 'Login error',
+'createaccounterror'              => 'Could not create account: $1',
+'nocookiesnew'                    => 'The user account was created, but you are not logged in.
 {{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them, then log in with your new username and password.',
-'nocookieslogin'             => '{{SITENAME}} uses cookies to log in users.
+'nocookieslogin'                  => '{{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them and try again.',
-'nocookiesfornew'            => 'The user account was not created, as we could not confirm its source.
+'nocookiesfornew'                 => 'The user account was not created, as we could not confirm its source.
 Ensure you have cookies enabled, reload this page and try again.',
-'nocookiesforlogin'          => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
-'noname'                     => 'You have not specified a valid username.',
-'loginsuccesstitle'          => 'Login successful',
-'loginsuccess'               => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
-'nosuchuser'                 => 'There is no user by the name "$1".
+'nocookiesforlogin'               => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
+'noname'                          => 'You have not specified a valid username.',
+'loginsuccesstitle'               => 'Login successful',
+'loginsuccess'                    => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
+'nosuchuser'                      => 'There is no user by the name "$1".
 Usernames are case sensitive.
 Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
-'nosuchusershort'            => 'There is no user by the name "$1".
+'nosuchusershort'                 => 'There is no user by the name "$1".
 Check your spelling.',
-'nouserspecified'            => 'You have to specify a username.',
-'login-userblocked'          => 'This user is blocked. Login not allowed.',
-'wrongpassword'              => 'Incorrect password entered.
+'nouserspecified'                 => 'You have to specify a username.',
+'login-userblocked'               => 'This user is blocked. Login not allowed.',
+'wrongpassword'                   => 'Incorrect password entered.
 Please try again.',
-'wrongpasswordempty'         => 'Password entered was blank.
+'wrongpasswordempty'              => 'Password entered was blank.
 Please try again.',
-'passwordtooshort'           => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
-'password-name-match'        => 'Your password must be different from your username.',
-'password-login-forbidden'   => 'The use of this username and password has been forbidden.',
-'mailmypassword'             => 'Email new password',
-'passwordremindertitle'      => 'New temporary password for {{SITENAME}}',
-'passwordremindertext'       => 'Someone (probably you, from IP address $1) requested a new
+'passwordtooshort'                => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
+'password-name-match'             => 'Your password must be different from your username.',
+'password-login-forbidden'        => 'The use of this username and password has been forbidden.',
+'mailmypassword'                  => 'Email new password',
+'passwordremindertitle'           => 'New temporary password for {{SITENAME}}',
+'passwordremindertext'            => 'Someone (probably you, from IP address $1) requested a new
 password for {{SITENAME}} ($4). A temporary password for user
 "$2" has been created and was set to "$3". If this was your
 intent, you will need to log in and choose a new password now.
@@ -1142,53 +1142,53 @@ Your temporary password will expire in {{PLURAL:$5|one day|$5 days}}.
 If someone else made this request, or if you have remembered your password,
 and you no longer wish to change it, you may ignore this message and
 continue using your old password.',
-'noemail'                    => 'There is no email address recorded for user "$1".',
-'noemailcreate'              => 'You need to provide a valid email address',
-'passwordsent'               => 'A new password has been sent to the email address registered for "$1".
+'noemail'                         => 'There is no email address recorded for user "$1".',
+'noemailcreate'                   => 'You need to provide a valid email address',
+'passwordsent'                    => 'A new password has been sent to the email address registered for "$1".
 Please log in again after you receive it.',
-'blocked-mailpassword'       => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
-'eauthentsent'               => 'A confirmation email has been sent to the nominated email address.
+'blocked-mailpassword'            => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
+'eauthentsent'                    => 'A confirmation email has been sent to the nominated email address.
 Before any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.',
-'throttled-mailpassword'     => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
+'throttled-mailpassword'          => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
 To prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.',
-'loginstart'                 => '', # do not translate or duplicate this message to other languages
-'loginend'                   => '', # do not translate or duplicate this message to other languages
-'loginend-https'             => '', # do not translate or duplicate this message to other languages
-'signupstart'                => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
-'signupend'                  => '{{int:loginend}}', # do not translate or duplicate this message to other languages
-'signupend-https'            => '', # do not translate or duplicate this message to other languages
-'mailerror'                  => 'Error sending mail: $1',
-'acct_creation_throttle_hit' => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
+'loginstart'                      => '', # do not translate or duplicate this message to other languages
+'loginend'                        => '', # do not translate or duplicate this message to other languages
+'loginend-https'                  => '', # do not translate or duplicate this message to other languages
+'signupstart'                     => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
+'signupend'                       => '{{int:loginend}}', # do not translate or duplicate this message to other languages
+'signupend-https'                 => '', # do not translate or duplicate this message to other languages
+'mailerror'                       => 'Error sending mail: $1',
+'acct_creation_throttle_hit'      => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
 As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'emailauthenticated'         => 'Your email address was authenticated on $2 at $3.',
-'emailnotauthenticated'      => 'Your email address is not yet authenticated.
+'emailauthenticated'              => 'Your email address was authenticated on $2 at $3.',
+'emailnotauthenticated'           => 'Your email address is not yet authenticated.
 No email will be sent for any of the following features.',
-'noemailprefs'               => 'Specify an email address in your preferences for these features to work.',
-'emailconfirmlink'           => 'Confirm your email address',
-'invalidemailaddress'        => 'The email address cannot be accepted as it appears to have an invalid format.
+'noemailprefs'                    => 'Specify an email address in your preferences for these features to work.',
+'emailconfirmlink'                => 'Confirm your email address',
+'invalidemailaddress'             => 'The email address cannot be accepted as it appears to have an invalid format.
 Please enter a well-formatted address or empty that field.',
-'cannotchangeemail'          => 'Account email addresses cannot be changed on this wiki.',
-'emaildisabled'              => 'This site cannot send emails.',
-'accountcreated'             => 'Account created',
-'accountcreatedtext'         => 'The user account for $1 has been created.',
-'createaccount-title'        => 'Account creation for {{SITENAME}}',
-'createaccount-text'         => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
+'cannotchangeemail'               => 'Account email addresses cannot be changed on this wiki.',
+'emaildisabled'                   => 'This site cannot send emails.',
+'accountcreated'                  => 'Account created',
+'accountcreatedtext'              => 'The user account for $1 has been created.',
+'createaccount-title'             => 'Account creation for {{SITENAME}}',
+'createaccount-text'              => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
 You should log in and change your password now.
 
 You may ignore this message, if this account was created in error.',
-'usernamehasherror'          => 'Username cannot contain hash characters',
-'login-throttled'            => 'You have made too many recent login attempts.
+'usernamehasherror'               => 'Username cannot contain hash characters',
+'login-throttled'                 => 'You have made too many recent login attempts.
 Please wait before trying again.',
-'login-abort-generic'        => 'Your login was unsuccessful - Aborted',
-'loginlanguagelabel'         => 'Language: $1',
-'loginlanguagelinks'         => '* {{#language:de}}|de
+'login-abort-generic'             => 'Your login was unsuccessful - Aborted',
+'loginlanguagelabel'              => 'Language: $1',
+'loginlanguagelinks'              => '* {{#language:de}}|de
 * {{#language:en}}|en
 * {{#language:eo}}|eo
 * {{#language:fr}}|fr
 * {{#language:es}}|es
 * {{#language:it}}|it
 * {{#language:nl}}|nl', # do not translate or duplicate this message to other languages
-'suspicious-userlogout'      => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
+'suspicious-userlogout'           => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
 
 # Email sending
 'pear-mail-error'        => '$1', # do not translate or duplicate this message to other languages
@@ -3794,8 +3794,8 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-magic-words'            => 'Magic {{PLURAL:$1|word|words}} ($1)',
 'pageinfo-hidden-categories'      => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
 'pageinfo-templates'              => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
-'pageinfo-footer'                 => '-', # do not translate or duplicate this message to other languages
 'pageinfo-transclusions'          => '{{PLURAL:$1|Page|Pages}} transcluded on ($1)',
+'pageinfo-footer'                 => '-', # do not translate or duplicate this message to other languages
 'pageinfo-toolboxlink'            => 'Page information',
 'pageinfo-redirectsto'            => 'Redirects to',
 'pageinfo-redirectsto-info'       => 'info',
@@ -5002,7 +5002,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
-#Rotation
+# Image rotation
 'rotate-comment' => 'Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise',
 
 );
index 9afacc1..071c7fc 100644 (file)
@@ -4059,7 +4059,7 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'logentry-newusers-autocreate' => 'Konto $1 estis kreita aŭtomate',
 'logentry-rights-rights' => '$1 ŝanĝis grupan membrecon por $3 de $4 al $5',
 'logentry-rights-rights-legacy' => '$1 ŝanĝis grupan membrecon por $3',
-'logentry-rights-autopromote' => '$1 estis aŭtomate altrangigita de $4 al $5',
+'logentry-rights-autopromote' => '$1 estis aŭtomate {{GENDER:$2|altrangigita}} de $4 al $5',
 'rightsnone' => '(nenia)',
 
 # Feedback
index 16d82a5..6c4fe19 100644 (file)
@@ -65,6 +65,7 @@
  * @author Omnipaedista
  * @author Orgullomoore
  * @author Paucabot
+ * @author Penarc
  * @author PerroVerd
  * @author Pertile
  * @author Piolinfax
@@ -2146,6 +2147,10 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
 En lugar de ello deberían enlazar a una página más apropiada.<br />
 Una página es considerada página de desambiguación si utiliza la plantilla que está enlazada desde [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Páginas con una propiedad de página',
+'pageswithprop-legend' => 'Páginas con una propiedad de página',
+'pageswithprop-text' => 'Esta página muestra las páginas que usan la propiedad de una página en particular',
+'pageswithprop-prop' => 'Nombre de la propiedad',
 'pageswithprop-submit' => 'Ir',
 
 'doubleredirects' => 'Redirecciones dobles',
@@ -4144,4 +4149,7 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'duration-centuries' => '$1 {{PLURAL:$1|siglo|siglos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
 
+# Image rotation
+'rotate-comment' => 'Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj',
+
 );
index eb0a1d2..839696b 100644 (file)
@@ -4133,17 +4133,17 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'sqlite-no-fts' => '$1 sans recherche en texte intégral supportée',
 
 # New logging system
-'logentry-delete-delete' => '$1 a supprimé la page $3',
-'logentry-delete-restore' => '$1 a restauré la page $3',
-'logentry-delete-event' => "$1 a modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-'logentry-delete-revision' => '$1 a modifié la visibilité {{PLURAL:$5|d’une révision|de $5 révisions}} sur la page $3&nbsp;: $4',
-'logentry-delete-event-legacy' => '$1 a modifié la visibilité des événements du journal sur $3',
-'logentry-delete-revision-legacy' => '$1 a modifié la visibilité des révisions sur la page $3',
-'logentry-suppress-delete' => '$1 a supprimé la page $3',
-'logentry-suppress-event' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-'logentry-suppress-revision' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
-'logentry-suppress-event-legacy' => '$1 a secrètement modifié la visibilité des événements du journal sur $3',
-'logentry-suppress-revision-legacy' => '$1 a secrètement modifié la visibilité des révisions sur la page $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|a supprimé}} la page $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|a restauré}} la page $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
+'logentry-delete-revision' => '$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d’une révision|de $5 révisions}} sur la page $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|a modifié}} la visibilité des révisions sur la page $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|a supprimé}} la page $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|a secrètement modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|a secrètement modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|a secrètement modifié}} la visibilité des événements du journal sur $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|a secrètement modifié}} la visibilité des révisions sur la page $3',
 'revdelete-content-hid' => 'contenu masqué',
 'revdelete-summary-hid' => 'résumé de modification masqué',
 'revdelete-uname-hid' => 'nom d’utilisateur masqué',
@@ -4152,20 +4152,20 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'revdelete-uname-unhid' => 'nom d’utilisateur affiché',
 'revdelete-restricted' => 'restrictions appliquées aux administrateurs',
 'revdelete-unrestricted' => 'restrictions retirées pour les administrateurs',
-'logentry-move-move' => '$1 a déplacé la page $3 vers $4',
-'logentry-move-move-noredirect' => '$1 a déplacé la page $3 vers $4 sans laisser de redirection',
-'logentry-move-move_redir' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection',
-'logentry-move-move_redir-noredirect' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
-'logentry-patrol-patrol' => '$1 a marqué la révision $4 de la page $3 comme relue',
-'logentry-patrol-patrol-auto' => '$1 a automatiquement marqué la révision $4 de la page $3 comme relue',
-'logentry-newusers-newusers' => 'Le compte utilisateur $1 a été créé',
-'logentry-newusers-create' => 'Le compte utilisateur $1 a été créé',
-'logentry-newusers-create2' => 'Le compte utilisateur $3 a été créé par $1',
-'logentry-newusers-byemail' => 'Le compte utilisateur $3 a été créé par $1 et le mot de passe a été envoyé par courriel',
-'logentry-newusers-autocreate' => 'Le compte $1 a été créé automatiquement',
-'logentry-rights-rights' => "$1 a modifié l'appartenance au groupe pour $3 de $4 à $5",
-'logentry-rights-rights-legacy' => "$1 a modifié l'appartenance au groupe pour $3",
-'logentry-rights-autopromote' => '$1 a été promu automatiquement de $4 à $5',
+'logentry-move-move' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 sans laisser de redirection',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 par-dessus une redirection',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|a marqué}} la révision $4 de la page $3 comme relue',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|a automatiquement marqué}} la révision $4 de la page $3 comme relue',
+'logentry-newusers-newusers' => 'Le compte utilisateur $1 {{GENDER:$2|a été créé}}',
+'logentry-newusers-create' => 'Le compte utilisateur $1 {{GENDER:$2|a été créé}}',
+'logentry-newusers-create2' => 'Le compte utilisateur $3 {{GENDER:$2|a été créé}} par $1',
+'logentry-newusers-byemail' => 'Le compte utilisateur $3 {{GENDER:$2|a été créé}} par $1 et le mot de passe a été envoyé par courriel',
+'logentry-newusers-autocreate' => 'Le compte $1 {{GENDER:$2|a été créé}} automatiquement',
+'logentry-rights-rights' => "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3 de $4 à $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5',
 'rightsnone' => '(aucun)',
 
 # Feedback
index 45934b2..997c21a 100644 (file)
@@ -797,7 +797,7 @@ Se vos plét, tornâd-vos branchiér aprés l’avêr reçu.',
 'blocked-mailpassword' => 'Voutron adrèce IP est blocâye en ècritura, la fonccion de sovegnence du contresegno est vêr dèsactivâye por èvitar los abus.',
 'eauthentsent' => 'Un mèssâjo de confirmacion est étâ mandâ a l’adrèce èlèctronica endicâye.
 Devant qu’un ôtro mèssâjo seye mandâ a ceti compto, vos devréd siuvre les enstruccions du mèssâjo et pués confirmar que lo compto est franc lo voutro.',
-'throttled-mailpassword' => 'Un mèssâjo de sovegnence de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.
+'throttled-mailpassword' => 'Un mèssâjo de remês’a zérô de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.
 Por èvitar los abus, ren que yon serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.',
 'mailerror' => 'Fôta pendent l’èxpèdicion du mèssâjo : $1',
 'acct_creation_throttle_hit' => 'Des visitors de cél vouiqui-que qu’emplèyont voutron adrèce IP ant fêt $1 compto{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.
@@ -852,7 +852,7 @@ Pôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben dema
 
 # Special:PasswordReset
 'passwordreset' => 'Remês’a zérô du contresegno',
-'passwordreset-text' => 'Rempléd ceti formulèro por recêvre un mèssâjo de sovegnence des dètalys de voutron compto.',
+'passwordreset-text' => 'Rempléd ceti formulèro por rebetar a zérô voutron contresegno.',
 'passwordreset-legend' => 'Rebetar a zérô lo contresegno',
 'passwordreset-disabled' => 'La remês’a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
 'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de balyês ce-desot}}',
@@ -862,8 +862,8 @@ Pôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben dema
 'passwordreset-capture-help' => 'Se vos pouentâd cela câsa, lo mèssâjo (avouéc lo contresegno temporèro) vos serat montrâ quand serat mandâ a l’utilisator.',
 'passwordreset-email' => 'Adrèce èlèctronica :',
 'passwordreset-emailtitle' => 'Dètalys du compto dessus {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Yon (probâblament vos, dês l’adrèce IP $1) at demandâ na sovegnence des dètalys
-de voutron compto por {{SITENAME}} ($4). {{PLURAL:$3|Ceti compto utilisator est associyê|Cetos comptos utilisators sont associyês}}
+'passwordreset-emailtext-ip' => 'Yon (probâblament vos, dês l’adrèce IP $1) at demandâ na remês’a zérô de voutron
+contresegno por {{SITENAME}} ($4). {{PLURAL:$3|Ceti compto utilisator est associyê|Cetos comptos utilisators sont associyês}}
 a cel’adrèce èlèctronica :
 
 $2
@@ -872,8 +872,8 @@ $2
 Ora vos vos dête branchiér et pués chouèsir un contresegno novél. Se cela demanda vint pas de vos
 ou ben que vos vos éte rapelâ de voutron contresegno originâl et que vos souhètâd pas més lo changiér,
 vos pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno.',
-'passwordreset-emailtext-user' => 'L’utilisator $1 dessus {{SITENAME}} at demandâ na sovegnence des dètalys
-de voutron compto por {{SITENAME}} ($4). {{PLURAL:$3|Ceti compto utilisator est associyê|Cetos comptos utilisators sont associyês}}
+'passwordreset-emailtext-user' => 'L’utilisator $1 dessus {{SITENAME}} at demandâ na remês’a zérô de voutron contresegno por {{SITENAME}}
+($4). {{PLURAL:$3|Ceti compto utilisator est associyê|Cetos comptos utilisators sont associyês}}
 a cel’adrèce èlèctronica :
 
 $2
@@ -884,9 +884,9 @@ ou ben que vos vos éte rapelâ de voutron contresegno originâl et que vos souh
 vos pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno.',
 'passwordreset-emailelement' => 'Nom d’utilisator : $1
 Contresegno temporèro : $2',
-'passwordreset-emailsent' => 'Un mèssâjo de sovegnence est étâ mandâ.',
-'passwordreset-emailsent-capture' => 'Un mèssâjo de sovegnence est étâ mandâ, qu’est montrâ ce-desot.',
-'passwordreset-emailerror-capture' => 'Un mèssâjo de sovegnence est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisator at pas reussi : $1',
+'passwordreset-emailsent' => 'Un mèssâjo de remês’a zérô de contresegno est étâ mandâ.',
+'passwordreset-emailsent-capture' => 'Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’est montrâ ce-desot.',
+'passwordreset-emailerror-capture' => 'Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisator at pas reussi : $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Changiér l’adrèce èlèctronica',
@@ -1886,7 +1886,7 @@ $1',
 Se vos plét, veriéd-vos vers un [[Special:ListUsers/sysop|administrator]].',
 'upload-misc-error' => 'Fôta encognua pendent lo tèlèchargement',
 'upload-misc-error-text' => 'Na fôta encognua est arrevâye pendent lo tèlèchargement.
-Se vos plét, controlâd que l’URL est justa et accèssibla, et pués tornâd èprovar.
+Se vos plét, controlâd que l’URL est justa et accèssibla et pués tornâd èprovar.
 Se lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administrator]].',
 'upload-too-many-redirects' => 'L’URL contint trop de redirèccions',
 'upload-unknown-size' => 'Talye encognua',
@@ -2591,27 +2591,27 @@ Vos pouede changiér lo nivél de protèccion de cela pâge sen que cen afècte
 'undeletepage' => 'Vêre et refâre des pâges suprimâyes',
 'undeletepagetitle' => "'''Ceta lista contint des vèrsions suprimâyes de [[:$1|$1]].'''",
 'viewdeletedpage' => 'Vêre les pâges suprimâyes',
-'undeletepagetext' => '{{PLURAL:$1|Ceta pâge at étâ suprimâ et sè trove|Cetes pâges ont étâ suprimâs et sè trovont}} dens les arch·ives, de yô que pô{{PLURAL:$1||von}}t adés étre refêt{{PLURAL:$1|a|es}}.
-Les arch·ives pôvont étre èfaciês règuliérement.',
+'undeletepagetext' => '{{PLURAL:$1|Ceta pâge est étâye suprimâye et pués sè trôve|Cetes pâges sont étâyes suprimâyes et pués sè trôvont}} adés dedens les arch·ives, de yô que pô{{PLURAL:$1||von}}t étre refêt{{PLURAL:$1|a|es}}.
+Les arch·ives pôvont étre èfaciêes règuliérement.',
 'undelete-fieldset-title' => 'Refâre les vèrsions',
-'undeleteextrahelp' => "Por refâre l’historico complèt de la pâge, lèssiéd totes les câses pas pouentâs et pués clicâd dessus '''''{{int:undeletebtn}}'''''.
-Por fâre una rèstoracion encomplèta, pouentâd les câses que corrèspondont a les vèrsions a refâre, et pués clicâd dessus '''''{{int:undeletebtn}}'''''.",
-'undeleterevisions' => '$1 {{PLURAL:$1|vèrsion arch·ivâ|vèrsions arch·ivâs}}',
-'undeletehistory' => 'Se vos reféte la pâge, totes les vèrsions seront replaciês dens l’historico.
-S’una pâge novèla avouéc lo mémo nom at étâ fêta dês la suprèssion, les vèrsions refêtes aparètront dens l’historico devant et la vèrsion d’ora serat pas remplaciê ôtomaticament.',
-'undeleterevdel' => 'La rèstoracion serat pas fêta se, a la fin, la vèrsion la ples novèla de la pâge ou ben du fichiér réste suprimâ a mêtiêt.
-Dens celos câs, vos dête pas pouentar ou ben pas cachiér les vèrsions suprimâs les ples novèles (d’amont la lista).',
-'undeletehistorynoadmin' => 'Ceta pâge at étâ suprimâ.
-La rêson de la suprèssion est montrâ dens lo rèsumâ ce-desot, avouéc los dètalys ux usanciérs que l’ont changiê devant sa suprèssion.
-Lo contegnu èfèctif de celes vèrsions suprimâs est accèssiblo ren qu’ux administrators.',
-'undelete-revision' => 'Vèrsion suprimâ de $1 (vèrsion du $4 a $5) per $3 :',
-'undeleterevision-missing' => 'Vèrsion fôssa ou ben manquenta.
-Vos avéd pôt-étre un crouyo lim, ou ben la vèrsion at possu étre refêta ou ben suprimâ de les arch·ives.',
-'undelete-nodiff' => 'Gins de vèrsion devant trovâ.',
+'undeleteextrahelp' => "Por refâre l’historico complèt de la pâge, lèssiéd totes les câses pas pouentâyes et pués clicâd dessus '''''{{int:undeletebtn}}'''''.
+Por fâre na rèstoracion a mêtiêt, pouentâd les câses que corrèspondont a les vèrsions a refâre et pués clicâd dessus '''''{{int:undeletebtn}}'''''.",
+'undeleterevisions' => '$1 {{PLURAL:$1|vèrsion arch·ivâye|vèrsions arch·ivâyes}}',
+'undeletehistory' => 'Se vos reféte la pâge, totes les vèrsions seront rebetâyes dedens l’historico.
+S’una pâge novèla avouéc lo mémo nom est étâye fêta dês la suprèssion, les vèrsions refêtes aparêtront dedens l’historico devant.',
+'undeleterevdel' => 'La rèstoracion serat pas fêta s’a la fin la vèrsion la ples novèla de la pâge du fichiér réste a mêtiêt suprimâye.
+Dens celos câs, vos dête pas pouentar ou ben cachiér la vèrsion suprimâye la ples novèla.',
+'undeletehistorynoadmin' => 'Ceta pâge est étâye suprimâye.
+La rêson de la suprèssion est montrâye dens lo rèsumâ ce-desot, avouéc los dètalys des utilisators que l’ant changiê devant la sina suprèssion.
+Lo contegnu èfèctif de celes vèrsions suprimâyes est accèssiblo ren qu’ux administrators.',
+'undelete-revision' => 'Vèrsion suprimâye de $1 (du $4 a $5) per $3 :',
+'undeleterevision-missing' => 'Vèrsion pas justa ou ben manquenta.
+Pôt-étre vos éd un crouyo lim ou ben la vèrsion at possu étre refêta ou enlevâye de les arch·ives.',
+'undelete-nodiff' => 'Niona vèrsion devant trovâye.',
 'undeletebtn' => 'Refâre',
 'undeletelink' => 'vêre / refâre',
 'undeleteviewlink' => 'vêre',
-'undeletereset' => 'Tornar inicialisar',
+'undeletereset' => 'Rebetar a zérô',
 'undeleteinvert' => 'Envèrsar lo chouèx',
 'undeletecomment' => 'Rêson :',
 'undeletedrevisions' => '$1 {{PLURAL:$1|vèrsion refêta|vèrsions refêtes}}',
@@ -2619,10 +2619,10 @@ Vos avéd pôt-étre un crouyo lim, ou ben la vèrsion at possu étre refêta ou
 'undeletedfiles' => '$1 {{PLURAL:$1|fichiér refêt|fichiérs refêts}}',
 'cannotundelete' => 'Falyita de la rèstoracion :
 $1',
-'undeletedpage' => "'''La pâge $1 est étâye refêta.'''
+'undeletedpage' => "'''$1 est étâye refêta'''
 
-Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr la lista de les novèles suprèssions et rèstoracions.",
-'undelete-header' => 'Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr la lista de les pâges suprimâyes dèrriérement.',
+Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr na lista de les novèles suprèssions et rèstoracions.",
+'undelete-header' => 'Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr les pâges suprimâyes dês pou.',
 'undelete-search-title' => 'Rechèrchiér des pâges suprimâs',
 'undelete-search-box' => 'Rechèrchiér des pâges suprimâs',
 'undelete-search-prefix' => 'Montrar les pâges que començont per :',
index 9d71f03..dadabb0 100644 (file)
@@ -1510,9 +1510,9 @@ Feranerangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
 'protect-locked-access' => "Din brükerkonto ferfäiget ai ouer da nüsie ruchte tu jü änring foon e sideschüts. Heer san da aktuäle sideschütsönjstalinge fon jü sid '''„$1“:'''",
 'protect-cascadeon' => 'Jüdeer sid as nütutids diilj foon e kaskaadenspäre. Jü as önj {{PLURAL:$1|jü füliende sid|da füliende side}} önjbünen, huk döör jü kaskaadenspäropsjoon schütsed {{PLURAL:$1|as|san}}. Di sideschütsstatus koon for jüdeer sid änred wårde, dåtdeer heet ouers nån influs aw jü kaskaadenspäre:',
 'protect-default' => 'Åle brükere',
-'protect-fallback' => 'Jü "$1"-beruchtiging as nüsi.',
-'protect-level-autoconfirmed' => 'Späring for naie än ai registriirde brükere',
-'protect-level-sysop' => 'Bloot administratoore',
+'protect-fallback' => 'Ferloof bluas för brükern mä "$1"-rochten.',
+'protect-level-autoconfirmed' => 'Ferloof bluas för registriaret brükern.',
+'protect-level-sysop' => 'Ferloof bluas för administratooren.',
 'protect-summary-cascade' => 'kaskadiirend',
 'protect-expiring' => 'bit $2, am e klook $3 (UTC)',
 'protect-cascade' => 'Kaskadiirende späre - åle önj jüdeer sid önjbünene forlååge wårde uk spärd.',
@@ -1668,7 +1668,7 @@ For di fål dåt dü dåt ai dääst, präiw aw [[Special:DoubleRedirects|dööw
 Dü bast deerfor feroontuurdlik, dåt links fortönj ap dåt koräkt muul wise.
 
 Jü sid wårt '''ai''' ferschääwen, wan dåt ål en sid ma di seelew noome jeeft,
-süwid jüdeer ai lääsi unti en widerliidjing suner färsjoonshistoori as. Dåtdeer bedjüset,
+süwid jüdeer ai bloots en widerliidjing suner färsjoonshistoori as. Dåtdeer bedjüset,
 dåt dü jü sid tubääg ferschüwe koost, wan dü en fäägel mååged heest. Dü koost
 deeriinj niinj sid ouerschriwe.
 
index 85faf16..5b4e3d9 100644 (file)
@@ -732,13 +732,13 @@ e non o quere modificar, pode ignorar esta mensaxe e
 continuar a utilizar o seu contrasinal vello.',
 'noemail' => 'O usuario "$1" non posúe ningún enderezo de correo electrónico rexistrado.',
 'noemailcreate' => 'Ten que proporcionar un enderezo de correo electrónico válido',
-'passwordsent' => 'Envióuselle un contrasinal novo ao enderezo de correo electrónico rexistrado de "$1".
+'passwordsent' => 'Enviouse un contrasinal novo ao enderezo de correo electrónico rexistrado de "$1".
 Por favor, acceda ao sistema de novo tras recibilo.',
 'blocked-mailpassword' => 'O seu enderezo IP está bloqueado e ten restrinxida a edición de artigos. Tampouco se lle permite usar a función de recuperación do contrasinal para evitar abusos do sistema.',
 'eauthentsent' => 'Envióuselle un correo electrónico de confirmación ao enderezo mencionado.
 Antes de que se lle envíe calquera outro correo a esta conta terá que seguir as instrucións que aparecen nesa mensaxe para confirmar que a conta é realmente súa.',
-'throttled-mailpassword' => 'Enviouse un aviso co contrasinal {{PLURAL:$1|na última hora|nas últimas $1 horas}}.
-Para evitar o abuso do sistema só se envía unha mensaxe cada {{PLURAL:$1|hora|$1 horas}}.',
+'throttled-mailpassword' => 'Enviouse un correo electrónico de restablecemento do contrasinal {{PLURAL:$1|na última hora|nas últimas $1 horas}}.
+Para evitar o abuso do sistema só se enviará unha mensaxe de restablecemento cada {{PLURAL:$1|hora|$1 horas}}.',
 'mailerror' => 'Produciuse un erro ao enviar o correo electrónico: $1',
 'acct_creation_throttle_hit' => 'Alguén que visitou este wiki co seu enderezo IP creou, no último día, {{PLURAL:$1|unha conta|$1 contas}}, que é o máximo permitido neste período de tempo.
 Como resultado, os visitantes que usen este enderezo IP non poden crear máis contas nestes intres.',
@@ -789,7 +789,7 @@ Pode ser que xa cambiase o seu contrasinal ou que solicitase un novo contrasinal
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecer o contrasinal',
-'passwordreset-text' => 'Encha este formulario para recibir un recordatorio por correo electrónico cos detalles da súa conta.',
+'passwordreset-text' => 'Encha este formulario para restablecer o seu contrasinal.',
 'passwordreset-legend' => 'Restablecer o contrasinal',
 'passwordreset-disabled' => 'O restablecemento de contrasinais está desactivado neste wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza un dos datos a continuación}}',
@@ -799,31 +799,31 @@ Pode ser que xa cambiase o seu contrasinal ou que solicitase un novo contrasinal
 'passwordreset-capture-help' => 'Se marca esta caixa, poderá ver o correo electrónico (co contrasinal temporal) que se envía ao usuario.',
 'passwordreset-email' => 'Enderezo de correo electrónico:',
 'passwordreset-emailtitle' => 'Detalles da conta de {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguén (probablemente vostede, desde o enderezo IP $1) solicitou un recordatorio coa
-información da súa conta en {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}
+'passwordreset-emailtext-ip' => 'Alguén (probablemente vostede, desde o enderezo IP $1) solicitou o restablecemento do seu
+contrasinal de {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}
 a este enderezo de correo electrónico:
 
 $2
 
 {{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.
-Debería acceder ao sistema e elixir un novo contrasinal agora. Se outro fixo esta
+Debería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta
 solicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,
 ignore esta mensaxe e continúe empregando o seu contrasinal vello.',
-'passwordreset-emailtext-user' => 'O usuario $1 solicitou un recordatorio coa información da súa conta en {{SITENAME}}
+'passwordreset-emailtext-user' => 'O usuario $1 solicitou o restablecemento do contrasinal de {{SITENAME}}
 ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}
 a este enderezo de correo electrónico:
 
 $2
 
 {{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.
-Debería acceder ao sistema e elixir un novo contrasinal agora. Se outro fixo esta
+Debería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta
 solicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,
 ignore esta mensaxe e continúe empregando o seu contrasinal vello.',
 'passwordreset-emailelement' => 'Nome de usuario: $1
 Contrasinal temporal: $2',
-'passwordreset-emailsent' => 'Enviouse o correo electrónico co recordatorio.',
-'passwordreset-emailsent-capture' => 'Enviouse un correo electrónico recordatorio, mostrado a continuación.',
-'passwordreset-emailerror-capture' => 'Xerouse un correo electrónico recordatorio, mostrado a continuación, pero o envío ao usuario fallou: $1.',
+'passwordreset-emailsent' => 'Enviouse o correo electrónico de restablecemento do contrasinal.',
+'passwordreset-emailsent-capture' => 'Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.',
+'passwordreset-emailerror-capture' => 'Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío ao usuario fallou: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar o enderezo de correo electrónico',
@@ -3965,17 +3965,17 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'sqlite-no-fts' => '$1 sen soporte para procuras de texto completo',
 
 # New logging system
-'logentry-delete-delete' => '$1 borrou a páxina "$3"',
-'logentry-delete-restore' => '$1 restaurou a páxina "$3"',
-'logentry-delete-event' => '$1 mudou a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de "$3": $4',
-'logentry-delete-revision' => '$1 mudou a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
-'logentry-delete-event-legacy' => '$1 mudou a visibilidade de entradas do rexistro de "$3"',
-'logentry-delete-revision-legacy' => '$1 mudou a visibilidade de revisións da páxina "$3"',
-'logentry-suppress-delete' => '$1 suprimiu a páxina "$3"',
-'logentry-suppress-event' => '$1 mudou de xeito secreto a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de "$3": $4',
-'logentry-suppress-revision' => '$1 mudou de xeito secreto a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
-'logentry-suppress-event-legacy' => '$1 mudou de xeito secreto a visibilidade de entradas do rexistro de "$3"',
-'logentry-suppress-revision-legacy' => '$1 mudou de xeito secreto a visibilidade de revisións da páxina "$3"',
+'logentry-delete-delete' => '$1 {{GENDER:$2|borrou}} a páxina "$3"',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restaurou}} a páxina "$3"',
+'logentry-delete-event' => '$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|mudou}} a visibilidade de entradas do rexistro de $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|mudou}} a visibilidade de revisións da páxina "$3"',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimiu}} a páxina "$3"',
+'logentry-suppress-event' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade de entradas do rexistro de $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade de revisións da páxina "$3"',
 'revdelete-content-hid' => 'agochou contidos',
 'revdelete-summary-hid' => 'agochou o resumo de edición',
 'revdelete-uname-hid' => 'agochou o nome de usuario',
@@ -3984,20 +3984,20 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'revdelete-uname-unhid' => 'descubriu o nome de usuario',
 'revdelete-restricted' => 'aplicou restricións aos administradores',
 'revdelete-unrestricted' => 'eliminou restricións aos administradores',
-'logentry-move-move' => '$1 moveu a páxina "$3" a "$4"',
-'logentry-move-move-noredirect' => '$1 moveu a páxina "$3" a "$4" sen deixar unha redirección',
-'logentry-move-move_redir' => '$1 moveu a páxina "$3" a "$4" sobre unha redirección',
-'logentry-move-move_redir-noredirect' => '$1 moveu a páxina "$3" a "$4" sobre unha redirección sen deixar unha redirección',
-'logentry-patrol-patrol' => '$1 marcou a revisión $4 da páxina "$3" como patrullada',
-'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisión $4 da páxina "$3" como patrullada',
-'logentry-newusers-newusers' => 'Creouse a conta de usuario $1',
-'logentry-newusers-create' => 'Creouse a conta de usuario $1',
-'logentry-newusers-create2' => '$1 creou a conta de usuario $3',
-'logentry-newusers-byemail' => '$1 creou a conta de usuario $3; o contrasinal enviouse por correo electrónico',
-'logentry-newusers-autocreate' => 'A conta de usuario $1 creouse automaticamente',
-'logentry-rights-rights' => '$1 cambiou o grupo ao que pertence $3 de $4 a $5',
-'logentry-rights-rights-legacy' => '$1 cambiou o grupo ao que pertence $3',
-'logentry-rights-autopromote' => '$1 foi promovido automaticamente de $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4" sen deixar unha redirección',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4" sobre unha redirección',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4" sobre unha redirección sen deixar unha redirección',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcou}} a revisión $4 da páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcou}} automaticamente a revisión $4 da páxina "$3" como patrullada',
+'logentry-newusers-newusers' => 'Creouse a conta de {{GENDER:$2|usuario|usuaria}} $1',
+'logentry-newusers-create' => 'Creouse a conta de {{GENDER:$2|usuario|usuaria}} $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|creou}} a conta de usuario $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|creou}} a conta de usuario $3; o contrasinal enviouse por correo electrónico',
+'logentry-newusers-autocreate' => 'A conta de {{GENDER:$2|usuario|usuaria}} $1 creouse automaticamente',
+'logentry-rights-rights' => '$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3',
+'logentry-rights-autopromote' => '$1 foi {{GENDER:$2|promovido|promovida}} automaticamente de $4 a $5',
 'rightsnone' => '(ningún)',
 
 # Feedback
index 88215c4..765c9ae 100644 (file)
@@ -491,7 +491,7 @@ $messages = array(
 'history' => 'Stare izmjene',
 'history_short' => 'Stare izmjene',
 'updatedmarker' => 'obnovljeno od zadnjeg posjeta',
-'printableversion' => 'Verzija za ispis',
+'printableversion' => 'Inačica za ispis',
 'permalink' => 'Trajna poveznica',
 'print' => 'Ispiši',
 'view' => 'Vidi',
@@ -1987,7 +1987,7 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'filedelete-success' => "Datoteka '''$1''' je izbrisana.",
 'filedelete-success-old' => "Inačica datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
 'filedelete-nofile' => "'''$1''' ne postoji.",
-'filedelete-nofile-old' => "Nema arhivirane verzije datoteke '''$1''' s zadanim parametrima.",
+'filedelete-nofile-old' => "Nema arhivirane inačice datoteke '''$1''' sa zadanim parametrima.",
 'filedelete-otherreason' => 'Drugi/dodatni razlog:',
 'filedelete-reason-otherlist' => 'Drugi razlog',
 'filedelete-reason-dropdown' => '*Česti razlozi brisanja
@@ -2832,7 +2832,7 @@ Molimo odaberite drugo ime.',
 
 # Export
 'export' => 'Izvezi stranice',
-'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u XML kod. U budućim verzijama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna verzija to još ne podržava.
+'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u kȏd XML. U budućim inačicama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna inačica to još ne podržava.
 
 Za izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutačnu inačicu zajedno sa svim prijašnjima, ili samo trenutačnu inačicu s informacijom o zadnjoj promjeni.
 
index 2c71229..0214e82 100644 (file)
@@ -257,7 +257,7 @@ $messages = array(
 'category_header' => 'Articulos in le categoria "$1"',
 'subcategories' => 'Subcategorias',
 'category-media-header' => 'Multimedia in categoria "$1"',
-'category-empty' => "''Iste categoria non contine alcun pagina o file multimedia al momento.''",
+'category-empty' => "''Iste categoria non contine actualmente alcun pagina o file multimedial.''",
 'hidden-categories' => '{{PLURAL:$1|Categoria celate|Categorias celate}}',
 'hidden-category-category' => 'Categorias celate',
 'category-subcat-count' => '{{PLURAL:$2|Iste categoria ha solmente le sequente subcategoria.|Iste categoria ha le sequente {{PLURAL:$1|subcategoria|$1 subcategorias}}, ex $2 in total.}}',
index 67ae5bc..9a96023 100644 (file)
@@ -47,28 +47,28 @@ $messages = array(
 'tog-showtoolbar' => 'Ipakita ti ramit ti panag-urnos (masapul ti JavaScript)',
 'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagtakla (masapul ti JavaScript)',
 'tog-editsection' => 'Pakabaelan ti paset a panag-urnos babaen kadagiti [urnosen] a  panilpo',
-'tog-editsectiononrightclick' => 'Pakabaelan ti paset  a panag-urnos babaen ti agtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
+'tog-editsectiononrightclick' => 'Pakabaelan ti paset  a panag-urnos babaen ti panagtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
 'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga adda ti ad-adu ngem dagiti 3 a paulo)',
 'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kapaut nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
-'tog-watchcreations' => 'Agnayon kadagiti panid a pinartuatko ken papeles  nga inpanko idiay listaan ti bambantayak',
+'tog-watchcreations' => 'Agnayon kadagiti panid a pinartuatko ken papeles nga inpanko idiay listaan ti bambantayak',
 'tog-watchdefault' => 'Agnayon kadagiti panid ken papeles nga inurnosko idiay listaan ti bambantayak',
 'tog-watchmoves' => 'Agnayon kadagiti panid ken papeles nga inyalisko idiay listaan ti bambantayak',
 'tog-watchdeletion' => 'Agnayon kadagiti panid ken papeles nga inikkatko idiay listaan ti bambantayak',
-'tog-minordefault' => 'Markaan amin nga  inurnos a kas sigud a bassit',
-'tog-previewontop' => 'Ipakita ti panag-padas sakbay ti kahon ti inurnos',
+'tog-minordefault' => 'Markaan amin nga inurnos a kas sigud a bassit',
+'tog-previewontop' => 'Ipakita ti panagipadas sakbay ti pagurnosan a kahon',
 'tog-previewonfirst' => 'Ipakita ti pinadas iti umuna a panag-urnos',
 'tog-nocache' => 'Ibaldado ti panagilemmeng ti pabasabasa ti panid',
-'tog-enotifwatchlistpages' => 'E-suratannak no mabaliwan ti panid wenno papeles idiay listaan dagiti bambantayak',
-'tog-enotifusertalkpages' => 'E-suratannak no mabaliwan ti tungtungan a panidko',
-'tog-enotifminoredits' => 'E-suratannak pay para kadagiti bassit a panag-urnos kadagiti panid ken papeles',
-'tog-enotifrevealaddr' => 'Iparang ti pagtaengan ti e-suratko kadagiti panagipakaaammo nga  e-surat',
+'tog-enotifwatchlistpages' => 'Esuratannak no mabaliwan ti panid wenno papeles idiay listaan dagiti bambantayak',
+'tog-enotifusertalkpages' => 'Esuratannak no mabaliwan ti tungtungan a panidko',
+'tog-enotifminoredits' => 'Esuratannak pay para kadagiti bassit a panag-urnos kadagiti panid ken papeles',
+'tog-enotifrevealaddr' => 'Iparang ti pagtaengan ti esuratko kadagiti panagipakaaammo nga esurat',
 'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbuybuya nga agar-aramat',
 'tog-oldsig' => 'Ti adda a pirma:',
 'tog-fancysig' => 'Tratuen ti pirma a kas wikitext (nga awan ti automatiko a panagsilpo)',
 'tog-externaleditor' => 'Isigud ti panag-usar iti ruar a pnag-urnos (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
 'tog-externaldiff' => 'Isigud ti panag-usar iti ruar a  sabali (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-showjumplinks' => 'Pakabaelan  a  "lumaktaw kadagiti"  naipalaka a pagserkan a silpo',
-'tog-uselivepreview' => 'Usaren ti agdama a panagpadas  (masapul ti JavaScript) (eksperimento)',
+'tog-showjumplinks' => 'Pakabaelan a "lumaktaw kadagiti" naipalaka a pagserkan a silpo',
+'tog-uselivepreview' => 'Usaren ti agdama a panagpadas (masapul ti JavaScript) (eksperimento)',
 'tog-forceeditsummary' => 'Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos',
 'tog-watchlisthideown' => 'Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan',
 'tog-watchlisthidebots' => 'Ilemmeng dagiti inurnos ti bot manipud ti listaan ti bambantayan',
@@ -76,10 +76,10 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ilemmeng dagiti inurnos ti nakasterk nga agar-aramat manipud ti listaan ti bambantayan',
 'tog-watchlisthideanons' => 'Ilemmeng dagiti inurnos ti di am-ammo nga agar-aramat manipud ti  listaan ti bambantayan',
 'tog-watchlisthidepatrolled' => 'Ilemmeng dagiti napatruliaan nga inurnos manipud ti listaan ti bambantayan',
-'tog-ccmeonemails' => 'Patulodandak kadagiti kopia ti e-surat nga ipatulodko kadagiti sabsabali nga agar-aramat',
+'tog-ccmeonemails' => 'Patulodandak kadagiti kopia ti esurat nga ipatulodko kadagiti sabsabali nga agar-aramat',
 'tog-diffonly' => 'Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan',
 'tog-showhiddencats' => 'Ipakita dagiti nailemmeng a kategoria',
-'tog-norollbackdiff' => 'Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagi-subli',
+'tog-norollbackdiff' => 'Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagisubli',
 
 'underline-always' => 'Kanayon',
 'underline-never' => 'Saan uray kaanoman',
@@ -146,22 +146,22 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Katkategoria}}',
-'category_header' => 'Dagiti panid nga adda iti kategoria  "$1"',
-'subcategories' => 'Dagiti apo ti kategoria',
-'category-media-header' => 'Dagiti midia nga adda iti kategoria  "$1"',
+'category_header' => 'Dagiti panid nga adda iti kategoria "$1"',
+'subcategories' => 'Dagiti subkategoria',
+'category-media-header' => 'Dagiti midia nga adda iti kategoria "$1"',
 'category-empty' => "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
 'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}',
 'hidden-category-category' => 'Nailemmeng a katkategoria',
-'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad a subkategoria.|Daytoy a kategoria ket adda ti sumaganad {{PLURAL:$1|a subkategoria|$1 a dagiti subkategoria}}, manipud ti dagup nga $2.}}',
-'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad  {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
-'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad  {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
-'category-article-count-limited' => 'Ti sumaganad {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
-'category-file-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a papeles.|Ti sumaganad  {{PLURAL:$1| a papeles|$1  a pappapeles}} ket adda iti daytoy a kategoria, ti $2 a dagup.}}',
-'category-file-count-limited' => 'Ti sumaganad  {{PLURAL:$1|a papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.',
+'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad a subkategoria.|Daytoy a kategoria ket adda ti sumaganad a {{PLURAL:$1|a subkategoria|$1 a subkategoria}}, manipud ti $2 a dagup.}}',
+'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad a {{PLURAL:$1|a subkategoria|$1 a subkategoria}}.',
+'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad a {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti $2 a dagup.}}',
+'category-article-count-limited' => 'Ti sumaganad a {{PLURAL:$1|panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
+'category-file-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a papeles.|Ti sumaganad a {{PLURAL:$1| a papeles|$1 a pappapeles}} ket adda iti daytoy a kategoria, ti $2 a dagup.}}',
+'category-file-count-limited' => 'Ti sumaganad a {{PLURAL:$1|papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.',
 'listingcontinuesabbrev' => 'tuloy.',
-'index-category' => 'Dagiti naipasurutan a panid',
-'noindex-category' => 'Dagiti saan a pagsurutan a panid',
-'broken-file-category' => 'Dagiti panid a nadadael ti panag-silpo na iti papeles',
+'index-category' => 'Naipasurotan a pampanid',
+'noindex-category' => 'Di naipasurotan a pampanid',
+'broken-file-category' => 'Pampanid nga adda nadadael a silsilpo kadagiti papeles',
 
 'about' => 'Maipapan iti',
 'article' => 'Naglaon a panid',
@@ -289,7 +289,7 @@ $1',
 
 'badaccess' => 'Biddut ti pammalubos',
 'badaccess-group0' => 'Saanka a mapalubosan a mangpataray ti aramid a kiniddawmo.',
-'badaccess-groups' => 'Ti kiniddawmo nga aramid ket agpatingga laeng kadagiti agar-aramat {{PLURAL:$2|iti bunggoy|iti maysa kadagiti bunggoy}}: $1.',
+'badaccess-groups' => 'Ti kiniddawmo nga aramid ket agpatingga laeng kadagiti agar-aramat {{PLURAL:$2|iti grupo|iti maysa kadagiti grupo}}: $1.',
 
 'versionrequired' => 'Masapul ti bersion $1 ti MediaWiki',
 'versionrequiredtext' => 'Masapul ti bersion $1 ti MediaWiki tapno maaramat daytoy a panid. Kitaen ti [[Special:Version|panid ti bersion]].',
@@ -343,9 +343,9 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'Awan ti kasta nga aramid',
-'nosuchactiontext' => 'Ti inted nga inaganan ti URL ket imbalido.
-Baka madi ti naimakiniliam nga URL, wenno sinurotmo ti saan nga agpayso a panilpo.
-Baka daytoy ket "kiteb" ti "software" nga ususaren babaen ti {{SITENAME}}.',
+'nosuchactiontext' => 'Ti inted nga innaganan ti URL ket imbalido.
+Mabalin a madi ti naimakiniliam nga URL, wenno sinurotmo ti saan nga agpayso a panilpo.
+Mabalin a daytoy ket kiteb ti sopwer nga ususaren babaen ti {{SITENAME}}.',
 'nosuchspecialpage' => 'Awan ti kasta nga espesial a panid',
 'nospecialpagetext' => '<strong>Nagkiddawka ti imbalido nga espesial a panid.</strong>
 
@@ -371,13 +371,13 @@ Ti database ket nangipatulod ti biddut "$3: $4".',
 'readonlytext' => 'Ti database ket agdama a naikandado kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kanayon a pagsimpa, ket no malpas kadawyanto nga agsubli.
 
 Ti administrador a nangkandado ket nangited ti daytoy a palawag: $1',
-'missing-article' => 'Ti database ket saan a nakabiruk ti testo ti panid  a mabirukanna kuma, a napanaganan ti "$1" $2.
+'missing-article' => 'Ti database ket saan a nakabiruk ti testo ti panid  a mabirukanna koma, a napanaganan ti "$1" $2.
 
 Dayoty ket gapu babaen ti sumaganad a baak a paggiddiatan wenno panilpo ti pakasaritaan ti maysa panid a dati a naikkat.
 
-No saan a kasta, baka nakasarak ti kiteb ti "software".
+No saan a kasta, mabalin a nakasarak ti kiteb ti sopwer.
 
-Panngaasi nga  ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isurat mo ti pakaammo dayta URL.',
+Panngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta URL.',
 'missingarticle-rev' => '(binaliwan#: $1)',
 'missingarticle-diff' => '(Sabali: $1, $2)',
 'readonly_lag' => 'Automatiko a narikpan ti database kabayatan a dagiti tagabu a database server ket kumamakam iti agturay',
@@ -400,8 +400,8 @@ Amangan no addan sabali a nangikkat.',
 'delete-hook-aborted' => 'Inukas ti kawit ti panagborra.
 Awan ti intedna a palawag.',
 'badtitle' => 'Madi a titulo',
-'badtitletext' => 'Ti nakiddaw a titulo ti panid ket imbalido, blanko, wenno maysa a saan nga husto a naisilpo a titulo nga inter-lengguahe wenno inter-wiki a titulo.
-Adda ngata nagyan a maysa wenno ad-adu pay a kababalin a saan a mausar iti titulo.',
+'badtitletext' => 'Ti kiniddaw idi a titulo ti panid ket imbalido, blanko, wenno maysa a saan nga husto a naisilpo a silpo ti pagsasao wenno interwiki a titulo.
+Mabalin nga aglaon ti a maysa wenno ad-adu a karakter a saan a mausar kadagiti titulo.',
 'perfcached' => 'Ti sumaganad a datos ket naidulin ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagan|dagiti $1 a nagbanagan}} ket magun-od idiay nagidulinan.',
 'perfcachedts' => 'Ti sumaganad a datos ket naidulin, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay pagidulinan.',
 'querypage-no-updates' => 'Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. 
@@ -412,7 +412,7 @@ Panagsapul: $2',
 'viewsource' => 'Kitaen ti taudan',
 'viewsource-title' => 'Kitaen ti taudan para iti $1',
 'actionthrottled' => 'Napabuntog ti aramid',
-'actionthrottledtext' => 'Para ti pagkontra ti spam, naipatinggaka ti panagtungpal ti adu unay iti daytoy nga aramid iti nasiket nga oras, ken nalippasamon ti patingga.
+'actionthrottledtext' => 'Para iti pagkontra ti spam, naipatinggaka ti panagtungpal ti adu unay iti daytoy nga aramid iti nasiket nga oras, ken nalabsamon ti patingga.
 Pangngaasi nga ipadasmo manen no madamdama.',
 'protectedpagetext' => 'Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos wenno dagiti dadduma pay nga aksion.',
 'viewsourcetext' => 'Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:',
@@ -423,7 +423,7 @@ Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,
 Dagiti panagsukat iti daytoy a panid ket maarigan ti langa ti panagaramat nga interface dagiti sabali nga agar-aramat iti daytoy a wiki.
 Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki..",
 'sqlhidden' => '(nakalemmeng ti biniruk a SQL )',
-'cascadeprotected' => 'Daytoy a panid ket nasalakniban para iti panag-urnos, ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban nga adda ti napili nga "agsariap"  :
+'cascadeprotected' => 'Daytoy a panid ket nasalakniban para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban nga adda ti napili nga "agsariap"  :
 $2',
 'namespaceprotected' => "Awan ti pammalubosmo nga agurnos kadagiti panid iti '''$1''' a nagan ti lugar.",
 'customcssprotected' => 'Awan ti pammalubosmo nga agurnos ditoy panid ti CSS, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.',
@@ -474,7 +474,7 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE
 'gotaccount' => "Addaanka kadin ti pakabilangam? '''$1'''.",
 'gotaccountlink' => 'Sumrek',
 'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrek mo?',
-'createaccountmail' => 'Agusar ti maysa a temporario a pugto a kontrasenias ken ipatulod idiay e-surat a pagtaengan a nainganan dita baba',
+'createaccountmail' => 'Agusar ti maysa a temporario a pugto a kontrasenias ken ipatulod idiay esurat a pagtaengan a nainaganan dita baba',
 'createaccountreason' => 'Rason:',
 'badretype' => 'Saan nga agpada dagiti impanmo a kontrasenias.',
 'userexists' => 'Maus-usaren ti nagan a kayatmo.
@@ -509,7 +509,7 @@ Pangngaasi a padasem manen.',
 'passwordtooshort' => 'Ti kontrasenias ket nasken a saan a basbasit ngem  {{PLURAL:$1|1 a karakter| $1 a karkarakter}}.',
 'password-name-match' => 'Nasken a ti kontrasenias ket maigiddiat manipud ti naganmo.',
 'password-login-forbidden' => 'Ti panag-usar ti daytoy a nagan ket kontrasenias ket naiparit..',
-'mailmypassword' => 'E-surat ti baro a kontrasenias',
+'mailmypassword' => 'Ipatulod iti esurat ti baro a kontrasenias',
 'passwordremindertitle' => 'Baro a temporario a kontrasenias para iti  {{SITENAME}}',
 'passwordremindertext' => 'Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw ti baro
 a kontrasenias para iti {{SITENAME}} ($4). Ti saan nga agnayon a kontrasenias ti agususar
@@ -518,26 +518,26 @@ masapul a sumrek ka ta agpili ka ti baro a kontrasenias.
 Ti temporario a bukodmo a kontrasenias ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
 
 No sabali ti nagkiddaw, wenno no malagipmo pay ti kontrasenias mo ket dimon kayat a suktan daytoy, mabalin a dimo lattan ikaskaso daytoy a mensahe ket itultuloymo latta nga usaren ti daan a kontrasenias.',
-'noemail' => 'Awan ti i e-surat a pagtaengan a nairehistro para  iti agar-aramat a ni "$1".',
-'noemailcreate' => 'Mangtedka to pudno nga e-surat a pagtaengam',
-'passwordsent' => 'Naipatulod ti baro a kontrasenias iti e-surat a pagtaengan a nairehistro kenni "$1".
+'noemail' => 'Awan ti i esurat a pagtaengan a nairehistro para  iti agar-aramat a ni "$1".',
+'noemailcreate' => 'Mangtedka to pudno nga esurat a pagtaengam',
+'passwordsent' => 'Naipatulod ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni "$1".
 Sumrekka koma manen kalpasan a maawatmo daytoy a baro a kontrasenias.',
 'blocked-mailpassword' => 'Ti IP a pagtaengam ket naserraan manipud ti panag-urnos, ken isu a saan a mabalin nga agusar ti panagala ti kontrasenias a pamay-an tapno mapawilan ti panag-abuso.',
-'eauthentsent' => 'Naipatuloden ti pammasingked nga e-surat iti naited nga e-surat a pagtaengan.
-Sakbay nga ania man nga e-surat ti maipatulod iti pakabilangan, masapul a surotem dagiti maibagbaga iti e-surat, tapno mapasingkedan a ti pakabilangan ket agpayso a kukuam.',
+'eauthentsent' => 'Naipatuloden ti pammasingked nga esurat iti naited nga esurat a pagtaengan.
+Sakbay nga ania man nga esurat ti maipatulod iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapasingkedan a ti pakabilangan ket agpayso a kukuam.',
 'throttled-mailpassword' => 'Ti panangidisso manen ti kontrasenias ket naipatuloden, iti napalabas nga {{PLURAL:$1|oras|$1 nga oras}}.
 Tapno maipawilan ti panag-abuso, maysa laeng a panangidisso manen ti kontrasenias ti maipatulod iti tunggal maysa nga {{PLURAL:$1|oras|$1 nga oras}}.',
 'mailerror' => 'Biddut iti panagipatulod ti surat: $1',
 'acct_creation_throttle_hit' => 'Dagiti sumarungkar ti daytoy a wiki nga agususar ti IP a pagtaengan ket nakaaramid {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.
 A kas ti nagbanagan, dagiti agsarsarummgkar nga agususar ti IP a pagtaengan ket agdama a saanda a mabalin a makaaramid kadagiti pakabilangan.',
-'emailauthenticated' => 'Napasingkedan ti e-surat a pagtaengan idi $2 ti oras nga $3.',
-'emailnotauthenticated' => 'Saan pay a napasingkedan ti e-surat mo.
-Awan ti e-surat a naipatulod para kadagiti sumaganad a langa.',
-'noemailprefs' => 'Ipanaganan ti e-surat a pagtaengan tapno agbalin dagitoy a langa.',
-'emailconfirmlink' => 'Pasingkedam ti e-surat a pagtaengam',
-'invalidemailaddress' => 'Ti e-surat a pagtaengam ket saan a maawat ngamin ket kasla adda ti saan a napudno a nakabuklan.
-Pangngaasi nga ikkam ti nasayaat  a  nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
-'cannotchangeemail' => 'Dagiti pakabilangan nga e-surat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
+'emailauthenticated' => 'Napasingkedan ti esurat a pagtaengan idi $2 ti oras nga $3.',
+'emailnotauthenticated' => 'Saan pay a napasingkedan ti esuratmo.
+Awan ti esurat a naipatulod para kadagiti sumaganad a langa.',
+'noemailprefs' => 'Ipanaganan ti esurat a pagtaengan tapno agbalin dagitoy a langa.',
+'emailconfirmlink' => 'Pasingkedam ti esurat a pagtaengam',
+'invalidemailaddress' => 'Ti esurat a pagtaengam ket saan a maawat ngamin ket kasla adda ti saan a napudno a nakabuklan.
+Pangngaasi nga ikkam ti nasayaat a nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
+'cannotchangeemail' => 'Dagiti pakabilangan nga esurat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
 'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatuod kadagiti e-surat.',
 'accountcreated' => 'Naaramiden ti pakabilangan',
 'accountcreatedtext' => 'Ti pakabilangan ti agar-aramat para iti  $1 ket naaramiden.',
@@ -555,12 +555,12 @@ Pangaasi nga agurayka sakbay nga agipadas manen.',
 
 # Email sending
 'php-mail-error-unknown' => 'Di am-ammo a biddut iti surat ti PHP  () a pamay-an.',
-'user-mail-no-addy' => 'Pinadas nga impatulod ti e-surat nga awan ti e-surat a pagtaengan.',
-'user-mail-no-body' => 'Nangpadaska a nangipatulod ti e-surat nga awan linaonna wenno ababa laeng a bagi.',
+'user-mail-no-addy' => 'Pinadas nga inpatulod ti esurat nga awan ti esurat a pagtaengan.',
+'user-mail-no-body' => 'Nangpadaska a nangipatulod ti esurat nga awan linaonna wenno ababa laeng a bagi.',
 
 # Change password dialog
 'resetpass' => 'Sukatan ti kontrasenias',
-'resetpass_announce' => 'Simrekka a nagus-usar ti temporario a kodigo ti e-surat.
+'resetpass_announce' => 'Simrekka a nagus-usar ti temporario a kodigo ti esurat.
 Tapno malpaska a makastrek, nasken a mangikabilka ti baro a kontrasenias ditoy:',
 'resetpass_header' => 'Sukatan ti kontrasenias ti pakabilangan',
 'oldpassword' => 'Daan a kontrasenias:',
@@ -586,9 +586,9 @@ Mabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a t
 'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a piraso ti datos dita baba}}',
 'passwordreset-username' => 'Nagan ti agar-aramat:',
 'passwordreset-domain' => 'Pagturayan:',
-'passwordreset-capture' => 'Kitaem ti nagbanagan ti e-surat?',
+'passwordreset-capture' => 'Kitaem ti nagbanagan ti esurat?',
 'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti e-surat (nga adda ti temporario a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
-'passwordreset-email' => 'E-surat a pagtaengan:',
+'passwordreset-email' => 'Esurat a pagtaengan:',
 'passwordreset-emailtitle' => 'Salaysay ti pakabilangan iti {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangidisso manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket
 nakairaman iti daytoy nga esurat a pagtaengan:
@@ -606,9 +606,9 @@ nakairaman iti daytoy nga esurat a pagtaengan:
 $2
 
 {{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
-Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
+Sumrekka koman tapno agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
 panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken 
-agtuloy kan nga agusar ti daan a kontrasenias mo.',
+agtuloykan nga agusar ti daan a kontraseniasmo.',
 'passwordreset-emailelement' => 'Nagan ti agar-aramat: $1
 Temporario a kontrasenias: $2',
 'passwordreset-emailsent' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naipatuloden.',
@@ -616,15 +616,15 @@ Temporario a kontrasenias: $2',
 'passwordreset-emailerror-capture' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naaramiden, a napaikita dita baba, ngem napaay a napaitulod iti agar-aramat: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'Sukatan ti e-surat a pagtaengan',
-'changeemail-header' => 'Sukatan ti e-surat a pagtaengan ti pakabilangan',
-'changeemail-text' => 'Lippasem daytoy a kabuklan ti panagsukat ti e-surat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.',
+'changeemail' => 'Sukatan ti esurat a pagtaengan',
+'changeemail-header' => 'Sukatan ti esurat a pagtaengan ti pakabilangan',
+'changeemail-text' => 'Lippasem daytoy a kabuklan ti panagsukat ti esurat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.',
 'changeemail-no-info' => 'Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.',
-'changeemail-oldemail' => 'Agdama nga E-surat a pagtaengam:',
-'changeemail-newemail' => 'Baro nga e-surat a pagtaengan:',
+'changeemail-oldemail' => 'Agdama nga esurat a pagtaengam:',
+'changeemail-newemail' => 'Baro nga esurat a pagtaengan:',
 'changeemail-none' => '(awan)',
 'changeemail-password' => 'Ti bukodmo a kontrasenias ti {{SITENAME}}:',
-'changeemail-submit' => 'Sukatan ti e-surat',
+'changeemail-submit' => 'Sukatan ti esurat',
 'changeemail-cancel' => 'Ukasen',
 
 # Edit page toolbar
@@ -662,7 +662,7 @@ Mairehistro ti IP a pagtaengam iti pakasaritaan ti panagurnos iti daytoy a panid
 No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnosmo nga awan ti pakabuklanna.",
 'missingcommenttext' => 'Pangngaasi nga agikabil ti komentario dita baba.',
 'missingcommentheader' => "'''Palagip:''' Saanka a nakaited  iti suheto/paulo para iti daytoy a komentario.
-No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnosmo nga awan ti pakabuklanna.",
+No agtaklaka ti \"{{int:savearticle}}\" manen, maidulin ti inurnosmo nga awan ti pakabuklanna.",
 'summary-preview' => 'Naipadas a  pakabuklan:',
 'subject-preview' => 'Suheto/naipadas a paulo:',
 'blockedtitle' => 'Naseraan ti agar-aramat',
@@ -673,11 +673,11 @@ Ti rason ket ''$2''.
 
 * Rugi ti panangserra: $8
 * Panagpaso ti panangserra: $6
-* Ti kuma serraan na: $7
+* Ti koma serraanna: $7
 
 Mabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panag-serra.
-Dimo mabalin nga aramaten ti ramit nga e-suratan daytoy nga agar-aramat malaksid no adda napudno nga e-surat a pagtaengan a naipan iti  [[Special:Preferences|pakabilangan ti kaykayatmo]] ken no saanka a naparitan nga agaramat iti daytoy.
-Ti agdama nga IP a pagtaengam ket $3, ti naserraan nga  ID ket #$5. Pangngaasim nga iramanmo nga ited ti ania man wenno agpada kadagitoy iti ania man a panagsaludsodmo.",
+Dimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a naipan iti [[Special:Preferences|pakabilangan ti kaykayatmo]] ken no saanka a naparitan nga agaramat iti daytoy.
+Ti agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. Pangngaasim nga iramanmo nga ited ti ania man wenno agpada kadagitoy iti ania man a panagsaludsodmo.",
 'autoblockedtext' => 'Ti IP a pagtaengam ket na-automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.
 Ti rason nga inted ket:
 
@@ -685,19 +685,18 @@ Ti rason nga inted ket:
 
 * Rugi ti panag-serra: $8
 * Panagpaso ti panag-serra: $6
-* Ti serraan na kuma: $7
+* Ti serraanna koma: $7
 
 Mabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panag-serra.
 
-Laglagipem nga saanmo a mabalin nga usaren ti "e-suratam daytoy nga agar-aramat "  ket laeng no addaan ka ti napudno nga e-surat a pagtaengan a nakarehistro idiay [[Special:Preferences|kakaykayatam]] ken saan ka a
-naserraan ti panag-usar na.
+Laglagipem a saanmo a mabalin nga usaren ti "esuratan daytoy nga agar-aramat" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro idiay [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panag-usar daytoy.
 
 Ti tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.
-Pangaasi nga iramanmo amin dagiti salaysay ti amin a panagsaludsodmo.',
+Pangaasi nga iramanmo amin dagiti salaysay kadagiti amin a panagsaludsodmo.',
 'blockednoreason' => 'awan ti naited a rason',
 'whitelistedittext' => 'Nasken ti $1 tapno maurnosmo dagitoy a panid.',
-'confirmedittext' => 'Masapul a pasingkedam ti e-surat sakbay a makaurnos kadagitoy a panid.
-Pangngaasim nga ikabil ken ipapudnom ti e-suratmo idiay [[Special:Preferences|kaykayat dagiti agar-aramat ]].',
+'confirmedittext' => 'Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.
+Pangngaasim nga ikabil ken ipapudnom ti esuratmo idiay [[Special:Preferences|kaykayat dagiti agar-aramat ]].',
 'nosuchsectiontitle' => 'Saan a mabirukan ti paset',
 'nosuchsectiontext' => 'Pinadasmo nga inurnos ti awan a paset.
 Mabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.',
@@ -774,9 +773,9 @@ Mapasamak daytoy no agus-usarka ti saan a nasayaat a naibasta ti sapot a diamamm
 'editingcomment' => 'Ururnosen ti $1 (baro a paset)',
 'editconflict' => 'Adda kasinnungat ti panag-urnos: $1',
 'explainconflict' => "Adda sabali a nagsukat iti daytoy a panid idi nangrugi ka a nagurnos.
-Ti ngato a lugar ti testo ket adda dagiti nagyanna a testo ti panid a kasla agdama a kita na.
+Ti ngato a lugar ti testo ket adda dagiti nagyanna a testo ti panid a kasla agdama a kitana.
 Ti inurnosmo ket maipakita dita babba a lugar ti testo
-Ipatipon mo dagiti sinukatam idiay lugar ti testo.
+Ipatiponmo dagiti sinukatam idiay lugar ti testo.
 '''Iti laeng''' testo dita ngato a lugar ti testo ti maidulin no pesselem ti \"{{int:savearticle}}\".",
 'yourtext' => 'Ti testom',
 'storedversion' => 'Bersion a naidulin',
@@ -803,7 +802,7 @@ Ti administrador a nangrikep ket nangited iti daytoy a palawag: $1",
 Ti nakaudi a naikabil a listaan ket adda dita baba tapno usaren a  reperensia:",
 'semiprotectedpagewarning' => "'''Pakaammo:'''Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.
 Ti naudi a naikabil a listaan ket adda dita baba tapno usaren a reperensia:",
-'cascadeprotectedwarning' => "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng administrador nga adda ti  gundaway ti makaurnos, ngamin ket nairaman kadagiti sumaganad a nasalakniban ti sariap
+'cascadeprotectedwarning' => "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng administrador nga adda ti pammalubos ti makaurnos ngamin ket nairaman kadagiti sumaganad a nasalakniban iti sariap
 {{PLURAL:$1|a panid|a pampanid}}:",
 'titleprotectedwarning' => "'''Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan a karbengan ]] ket nasken ti makapartuat iti daytoy.'''
 Ti kinaudi a naikabil iti listaan ket naikabil dita baba tapno usaren a reperensia:",
@@ -850,7 +849,7 @@ Adda met daytoyen.',
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an  a panagtawtawag.
 
-Adda kuman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
+Adda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
 'expensive-parserfunction-category' => 'Dagiti panid nga adda ti adu unay a nangina a parser a pamay-an a panagtawtawag',
 'post-expand-template-inclusion-warning' => "'''Ballaag:''' Dakkel unay ti nairaman a kadakkel ti plantilia.
 Adda dagiti plantilia a saanto a mairaman.",
@@ -872,7 +871,7 @@ Dagitoy a panagpalawag  ket naikkaten.",
 # "Undo" feature
 'undo-success' => 'Ti panag-urnos ket saan a maisubli.
 Pangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayatmo nga aramiden, ken idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.',
-'undo-failure' => 'Ti inurnos ket saan a maipasubli ta adda dagiti nakisinnungat a patingnga a naurnos.',
+'undo-failure' => 'Ti inurnos ket saan a maipasubli gaputa adda dagiti nakisinnungat a patingnga a naurnos.',
 'undo-norev' => 'Saan a maibabawi ti naurnos ngamin ket awan met daytoy wenno mabalin a naikkat.',
 'undo-summary' => 'Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])',
 
@@ -919,17 +918,17 @@ Padasem ti [[Special:Search|agbiruk ditoy a wiki]] para kadagiti maitutop a baro
 'rev-deleted-user' => '(naikkat ti nagan ti agar-aramat)',
 'rev-deleted-event' => '(naikkat ti aramid a listaan)',
 'rev-deleted-user-contribs' => '[ti nagan ti agar-aramat wenno IP a pagtaengan ket naikkat - ti inurnos ket nailemmeng kadagiti nagparawad]',
-'rev-deleted-text-permission' => "Ti panakabaliw daytoy a panid ket '''naikkaten'''.
+'rev-deleted-text-permission' => "Ti pannakabaliw daytoy a panid ket '''naikkaten'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-'rev-deleted-text-unhide' => "Ti panakabaliw daytoy a panid ket '''naikkaten'''.
+'rev-deleted-text-unhide' => "Ti pannakabaliw daytoy a panid ket '''naikkaten'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].
 Mabalinmo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
-'rev-suppressed-text-unhide' => "Ti panakabaliw daytoy a panid ket '''napasardeng'''.
+'rev-suppressed-text-unhide' => "Ti pannakabaliw daytoy a panid ket '''napasardeng'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].
 Mabalinmo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
-'rev-deleted-text-view' => "Ti panakabaliw daytoy a panid ket '''naikkaten'''.
+'rev-deleted-text-view' => "Ti pannakabaliw daytoy a panid ket '''naikkaten'''.
 Mabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-'rev-suppressed-text-view' => "Ti panakabaliw daytoy a panid ket '''napasardeng'''.
+'rev-suppressed-text-view' => "Ti pannakabaliw daytoy a panid ket '''napasardeng'''.
 Mabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
 'rev-deleted-no-diff' => "Saanmo a makita daytoy a paggiddiatan ngamin ket ti maysa a panagbaliw ket '''naikkat''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
@@ -1161,8 +1160,8 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'prefs-watchlist-token' => 'Tandaan ti bambantayan:',
 'prefs-misc' => 'Sabsabali',
 'prefs-resetpass' => 'Sukatan ti kontrasenias',
-'prefs-changeemail' => 'Sukatan ti e-surat a pagtaengan',
-'prefs-setemail' => 'Ikabil ti e-surat a pagtaengan',
+'prefs-changeemail' => 'Sukatan ti esurat a pagtaengan',
+'prefs-setemail' => 'Ikabil ti esurat a pagtaengan',
 'prefs-email' => 'Pagpilian ti e-surat',
 'prefs-rendering' => 'Tabas',
 'saveprefs' => 'Idulin',
@@ -1202,7 +1201,7 @@ Adda ditoy ti pugto a pateg a mausarmo: $1',
 'timezoneregion-europe' => 'Europa',
 'timezoneregion-indian' => 'Taaw Indiano',
 'timezoneregion-pacific' => 'Taaw Pasipiko',
-'allowemail' => 'Pakabaelam ti e-surat a naggapu kadagiti sabali nga agar-aramat',
+'allowemail' => 'Pakabaelam ti esurat a naggapu kadagiti sabali nga agar-aramat',
 'prefs-searchoptions' => 'Biruken',
 'prefs-namespaces' => 'Nagan ti luglugar',
 'defaultns' => 'Wenno saan agbirukka kadagitoy a nagan ti luglugar:',
@@ -1213,9 +1212,9 @@ Adda ditoy ti pugto a pateg a mausarmo: $1',
 'prefs-common-css-js' => 'Bingay a CSS/JavaScript dagiti amin a kudil:',
 'prefs-reset-intro' => 'Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kakaykayatam iti kasisigud ti daytoy a wiki.
 Ngem saanto a mabalinen nga ipasubli.',
-'prefs-emailconfirm-label' => 'Pagsingkedan ti e-surat:',
+'prefs-emailconfirm-label' => 'Pammasingked ti esurat:',
 'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
-'youremail' => 'E-surat:',
+'youremail' => 'Esurat:',
 'username' => '{{GENDER:$1|Nagan ti agar-aramat}}:',
 'uid' => 'ID ti {{GENDER:$1|Agar-aramat}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Kameng}} ti {{PLURAL:$1|a grupo|a grupgrupo}}:',
@@ -1229,19 +1228,19 @@ Ngem saanto a mabalinen nga ipasubli.',
 'badsig' => 'Saan a pudno a kilaw a pirma.
 Ikur-it dagiti HTML nga etiketa.',
 'badsiglength' => 'Atiddog unay ti pirmam.
-Masapul a nababbaba ngem $1 {{PLURAL:$1| a karakter|kadagiti karakter}} ti kaatiddog na.',
+Masapul a nababbaba ngem $1 {{PLURAL:$1| a karakter|kadagiti karakter}} ti kaatiddogna.',
 'yourgender' => 'Lalaki wenno Babai:',
 'gender-unknown' => 'Saan a naibagbaga',
 'gender-male' => 'Lalaki',
 'gender-female' => 'Babai',
-'prefs-help-gender' => 'Makapili: Usaren no lalaki wenno babai a panagtawag ti "software" .
+'prefs-help-gender' => 'Makapili: Usaren no lalaki wenno babai a panagtawag ti sopwer.
 Daytoy a pakaammo ket makita ti publiko.',
-'email' => 'E-surat',
+'email' => 'Esurat',
 'prefs-help-realname' => 'Saan a nasken ti pudno a nagan.
 Ngem no kayatmo nga ited, maaramat daytoy a kas pammadayaw ken pangpatalged iti obram.',
-'prefs-help-email' => 'Ti e-surat a pagtaengan ket saan a masapul, ngem masapul no agsukat ka ti kontrasenias, no baka malipatam ti kontrasenias mo.',
-'prefs-help-email-others' => 'Mabalinmo nga agpili tapno dagiti sabsabali nga agar-aramat ket ma e-suratandaka idiay panagsilpo ti panidmo wenno ti panid ti tungtungam.
-Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak kenka.',
+'prefs-help-email' => 'Ti esurat a pagtaengan ket saan a masapul, ngem masapul no agsukatka ti kontrasenias, no baka malipatam ti kontraseniasmo.',
+'prefs-help-email-others' => 'Mabalinmo nga agpili tapno dagiti sabsabali nga agar-aramat ket ma esuratandaka idiay panagsilpo ti panidmo wenno ti panid ti tungtungam.
+Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak kenka.',
 'prefs-help-email-required' => 'Masapul ti e-surat a pagtaengan.',
 'prefs-info' => 'Kangrunaan a pakaammuan',
 'prefs-i18n' => 'Internasionalisasion',
@@ -1259,33 +1258,33 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'prefs-diffs' => 'Sabali',
 
 # User preference: email validation using jQuery
-'email-address-validity-valid' => 'Ti e-surat a pagtaengan ket kasla umiso',
-'email-address-validity-invalid' => 'Ikabil ti umiso nga e-surat a pagtaengan',
+'email-address-validity-valid' => 'Ti esurat a pagtaengan ket kasla umiso',
+'email-address-validity-invalid' => 'Ikabil ti umiso nga esurat a pagtaengan',
 
 # User rights
-'userrights' => 'Agtartaripatu dagiti kaberngan ti agar-aramat',
-'userrights-lookup-user' => 'Agtaripatu kadagiti bunggoy ti agar-aramat',
+'userrights' => 'Panagtaripatu kadagiti karbengan ti agar-aramat',
+'userrights-lookup-user' => 'Agtaripatu kadagiti grupo ti agar-aramat',
 'userrights-user-editname' => 'Mangiserrek iti nagan-agar-aramat:',
-'editusergroup' => 'Urnosen dagita bunggoy ti agar-aramat',
+'editusergroup' => 'Urnosen dagita grupo ti agar-aramat',
 'editinguser' => "Suksukatan ti karbengan ti agar-aramat ni '''[[User:$1|$1]]''' $2",
-'userrights-editusergroup' => 'Urnosen dagita bunggoy ti agar-aramat',
-'saveusergroups' => 'Idulin dagita bunggoy ti agar-aramat',
+'userrights-editusergroup' => 'Urnosen dagita grupo ti agar-aramat',
+'saveusergroups' => 'Idulin dagita grupo ti agar-aramat',
 'userrights-groupsmember' => 'Kameng iti:',
 'userrights-groupsmember-auto' => 'Napudno a kameng iti:',
-'userrights-groups-help' => 'Mabaliwam dagiti ayan a bunggoy ti agar-aramat:
-* Ti nakur-it a kahon ket kayatna a saoen nga adda ti agar-aramat dita a bunggoy.
-* Ti saan a nakur-it a kahon ket kayatna a saoen nga awan ti agar-aramat dita a bunggoy.
-* A * ti kunana ket saan mo a maikkat ti bunggoy no nainayonmon, wenno pagbalittaden.',
+'userrights-groups-help' => 'Mabaliwam dagiti ayan a grupo ti agar-aramat:
+* Ti nakur-it a kahon ket kayatna a saoen nga adda ti agar-aramat dita a grupo.
+* Ti saan a nakur-it a kahon ket kayatna a saoen nga awan ti agar-aramat dita a grupo.
+* A * ti kunana ket saanmo a maikkat ti grupo no nainayonmon, wenno pagbalittaden.',
 'userrights-reason' => 'Rason:',
 'userrights-no-interwiki' => 'Awan ti pammalubosmo nga agbaliw ti karbengan ti agar-aramat kadagiti sabali a wiki.',
 'userrights-nodatabase' => 'Awan ti database a $1 wenno saan a lokal.',
 'userrights-nologin' => 'Masapul a [[Special:UserLogin|sumrekka]] nga adda pakabilangan nga administrador ti magted kadagiti karbengan ti agar-aramat.',
 'userrights-notallowed' => 'Awan ti pammalubos ti pakabilangam a mangted iti kakaberngan ti agar-aramat.',
-'userrights-changeable-col' => 'Dagiti bunggoy a mabalinmo a baliwan',
-'userrights-unchangeable-col' => 'Dagiti bunggoy a dimo mabalin a baliwan',
+'userrights-changeable-col' => 'Dagiti grupo a mabalinmo a baliwan',
+'userrights-unchangeable-col' => 'Dagiti grupo a dimo mabalin a baliwan',
 
 # Groups
-'group' => 'Bunggoy:',
+'group' => 'Grupo:',
 'group-user' => 'Dagiti agar-aramat',
 'group-autoconfirmed' => 'Dagiti automatiko a napasingkedan nga agar-aramat',
 'group-bot' => 'Dagiti bot',
@@ -1322,7 +1321,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-suppressredirect' => 'Saan nga agaramid ti baw-ing a naggapo iti taudan no iyalis dagiti panid',
 'right-upload' => 'Agipan ti papeles',
 'right-reupload' => 'Suratam manen dagiti adda a papeles',
-'right-reupload-own' => 'Pasuratam manen dagiti addaan ti pinag-ipan mo a papeles',
+'right-reupload-own' => 'Pasuratam manen dagiti addaan ti pinag-ipanmo a papeles',
 'right-reupload-shared' => 'Paawanen dagiti papeles idiay pagbingayan ti nakaikabilan ti midia a lokal',
 'right-upload_by_url' => 'Pag-ipan ti papeles a naggapu ti URL',
 'right-purge' => 'Purgaen ti pagidulinan ti pagsaadan a ti panid nga awan ti panagpasingked',
@@ -1342,7 +1341,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-suppressrevision' => 'Kitaen ken ipasubli dagiti binaliwan a nailemmeng manipud kadagiti administrador',
 'right-suppressionlog' => 'Kitaen dagita pribado a listaan',
 'right-block' => 'Serraan dagiti sabali nga agar-aramat manipud iti panag-urnos',
-'right-blockemail' => 'Serraan dagiti agar-aramat nga agpatulod manipud ti e-surat',
+'right-blockemail' => 'Serraan dagiti agar-aramat nga agpatulod manipud ti esurat',
 'right-hideuser' => 'Serraan ti maysa a nagan ti agar-aramat, ilemmeng manipud ti publiko',
 'right-ipblock-exempt' => 'Labsan dagiti IP a serra, dagiti automatiko a serra ken dagiti nasakup a serra.',
 'right-proxyunbannable' => 'Labsan dagiti automatiko a serra dagiti proxie',
@@ -1367,8 +1366,8 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-userrights-interwiki' => 'Urnosen dagiti karbengan ti agar-aramat kadagiti agar-aramat iti sabsabali a wiki',
 'right-siteadmin' => 'Ikandado ken lukatan ti database',
 'right-override-export-depth' => 'Ipan dagiti panid ken iraman dagiti nasilpo a panid iti kauneg nga 5',
-'right-sendemail' => 'Agpatulod ti e-surat kadagiti sabali nga agar-aramat',
-'right-passwordreset' => 'Kitaen dagiti e-surat ti naipasubli a kontrasenias',
+'right-sendemail' => 'Agpatulod ti esurat kadagiti sabali nga agar-aramat',
+'right-passwordreset' => 'Kitaen dagiti esurat a panagidisso manen ti kontrasenias',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Listaan dagiti naaramid nga agar-aramat',
@@ -1413,7 +1412,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'action-userrights' => 'urnosen amin dagiti karbengan ti agar-aramat',
 'action-userrights-interwiki' => 'urnosen dagiti karbengan ti agar-aramat iti agar-aramat kadagiti sabsabali a wiki',
 'action-siteadmin' => 'kandaduan wenno lukatan daytoy "database"',
-'action-sendemail' => 'ipatulod dagiti e-surat',
+'action-sendemail' => 'agipatulod kadagiti esurat',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}',
@@ -1472,9 +1471,9 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''
 'upload_directory_missing' => 'Ti direktorio ti pag-ipan ($1) ket napukaw ken saan a mabalin nga aramiden iti webserver.',
 'upload_directory_read_only' => 'Ti pagipanan a direktoria ($1) ket saan a masuratan ti webserver.',
 'uploaderror' => 'Biddut ti panang-ipan',
-'upload-recreate-warning' => "'''Ballag: ti papeles nga adda itoy ti nagan na ket naikkat wenno naiyalis.'''
+'upload-recreate-warning' => "'''Ballag: Ti papeles babaen ti dayta a nagan ket naikkat wenno naiyalis.'''
 
-Ti listaan ti panagikkat ken panagiyalis daytoy a panid ket adda ditoy tapno makitam:",
+Ti listaan ti panagikkat ken panagiyalis para iti daytoy a panid ket adda ditoy tapno makitam:",
 'uploadtext' => "Usaren ti kabuklan dita baba ti pinag-ipan ti papeles.
 Ti panagkita wenno panagbiruk ti napalubos a pinag-ipan ti papeles mapan ka idiay [[Special:FileList|listaan dagiti napag-ipan a papeles]], dagiti pinag-ipan wenno pinag-ipan manen ket nakalista pay idiay [[Special:Log/upload|listaan ti pinag-ipan]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].
 
@@ -1511,7 +1510,7 @@ Ti mapalubusan  {{PLURAL:\$3|a kita ti papeles ket|kadagiti kita ti papeles ket}
 'filetype-banned-type' => 'Ti \'\'\'".$1"\'\'\' {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}.
 Ti mapalubusan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.',
 'filetype-missing' => 'Daytoy a papeles ket awan ti kita na a (kasla ".jpg").',
-'empty-file' => 'Ti papeles nga intedmo ket awan ti nagyan na.',
+'empty-file' => 'Ti papeles nga intedmo ket awan ti nagyanna.',
 'file-too-large' => 'Ti papeles nga intedmo ket dakkel unay.',
 'filename-tooshort' => 'Ti nagan daytoy a papeles ket bassit unay.',
 'filetype-banned' => 'Ti kita daytoy a papeles ket maiparit.',
@@ -1545,7 +1544,7 @@ Pangngaasi a kitaem ti papeles a <strong>[[:$1]]</strong>.
 No ti nakitam a papeles ket isu met laeng dayta dati a kadakkel, saanka a mang-ipan iti sabali pay a napabassit nga imahen.",
 'file-thumbnail-no' => "Ti nagan ti papeles ket mangrugi ti <strong>$1</strong>.
 Kasla imahen a napabassit ''(thumbnail)''.
-No addaan ka ti dakkel a resolusion daytoy nga imahen ipag-ipan daytoy, no saan ket pangngaasi ta sukatam ti nagan ti papeles.",
+No addaanka ti dakkel a resolusion daytoy nga imahen ipag-ipan daytoy, no saan ket pangngaasi a sukatam ti nagan ti papeles.",
 'fileexists-forbidden' => 'Daytoy a nagan ti papeles ket adda dita, ken saan a mabalin a masuratan manen.
 No ket kayatmo latta nga agipan ti papeles, pangngaasi ta agsubli ka ken usarem ti baro a nagan.
 [[File:$1|thumb|center|$1]]',
@@ -1592,7 +1591,7 @@ $1',
 'upload-warning-msg' => 'Addaan a parikut ti panag-ipan a naggapu idiay [$2]. Mabalin mo ti agsubli ti [[Special:Upload/stash/$1|nakabuklan ti pag-ipan]] tapno masimpaan ti parikut.',
 
 'upload-proto-error' => 'Saan a husto a protokol',
-'upload-proto-error-text' => 'Dagiti adayo a pinag-ipan ket kasapulan a dagiti URLs ket mangrugi iti <code>http://</code> wenno <code>ftp://</code>.',
+'upload-proto-error-text' => 'Dagiti adayo a pinag-ipan ket makasapul kadagiti URL a mangrugi iti <code>http://</code> wenno <code>ftp://</code>.',
 'upload-file-error' => 'Akin-uneg a biddut',
 'upload-file-error-text' => 'Adda biddut a naggapu iti uneg idi padasen ti agaramid ti saan nga agnayon a papeles dita server.
 Pangngaasi a kontaken ti [[Special:ListUsers/sysop|administrador]]',
@@ -1623,7 +1622,7 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
 'backend-fail-closetemp' => 'Saan a marikpan ti temporario a papeles.',
 'backend-fail-read' => 'Saan a mabasa ti papeles $1.',
 'backend-fail-create' => 'Saan a masuratan ti papeles $1.',
-'backend-fail-maxsize' => 'Saan a masuratan ti papeles $1 gapu ta dakdakkel ngem {{PLURAL:$2|maysa a byte|dagiti $2 a byte}}.',
+'backend-fail-maxsize' => 'Saan a masuratan ti papeles $1 gaputa dakdakkel ngem {{PLURAL:$2|maysa a byte|$2 a byte}}.',
 'backend-fail-readonly' => 'Ti pagidulinan a kalikudan ti "$1" ket agdama a mabasa laeng. Ti rason a naited idi ket: "$2"',
 'backend-fail-synced' => 'Ti papeles "$1" ket bangking ti kasasaad na  iti kinauneg a pagidulinan ti kalikudan',
 'backend-fail-connect' => 'Saan a makaikapet idiay pagidulinan a kalikudan  "$1".',
@@ -1658,7 +1657,7 @@ Saan a matutup ti pinagkita ti seguridad na.',
 
 # Special:UploadStash
 'uploadstash' => 'Pinag-ipan ti stash',
-'uploadstash-summary' => 'Daytoy a panid ket mangted ti panagserrek ti papeles a napag-ipan (wenno nairugi nga ipan) ngem saan pay na naipablaak dita wiki. Dagitoy a papeles ket saan a makita ti sabsabali ngem laeng ti agar-aramat a nag-ipan kaniada.',
+'uploadstash-summary' => 'Daytoy a panid ket mangted ti panagserrek kadagiti papeles a napag-ipan (wenno nairugi a naipan) ngem saan pay a naipablaak iti wiki. Dagitoy a papeles ket saan a makita ti sabsabali ngem laeng ti agar-aramat a nag-ipan kaniada.',
 'uploadstash-clear' => 'Dalusan dagiti na stash a papeles',
 'uploadstash-nofiles' => 'Awan ti na stash a papeles mo.',
 'uploadstash-badtoken' => 'Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talek mo ti panag-urnos ket nagpaso. Padasem manen.',
@@ -1786,7 +1785,7 @@ Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti pap
 'filedelete-success' => "Naikkaten ti '''$1'''.",
 'filedelete-success-old' => "Ti bersion iti '''[[Media:$1|$1]]''' manipud idi $3, $2 ket naikkaten.",
 'filedelete-nofile' => "awan ti '''$1''' .",
-'filedelete-nofile-old' => "Awan ti nailebbeng a bersion ti '''$1''' nga addaan ti naited a kakitkita na.",
+'filedelete-nofile-old' => "Awan ti nailebbeng a bersion ti '''$1''' nga addaan ti naited a kakitkitana.",
 'filedelete-otherreason' => 'Sabali/maipatinayon a rason:',
 'filedelete-reason-otherlist' => 'Sabali a rason',
 'filedelete-reason-dropdown' => '*Kadawyan a rasrason ti pannakaikkat
@@ -1923,7 +1922,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'protectedpagestext' => 'Dagiti pampanid a nasalakniban para iti panaka-iyalis wenno panag-urnos',
 'protectedpagesempty' => 'Awan ti pampanid a madama a nasalakniban babaen kadagitoy a parametro.',
 'protectedtitles' => 'Dagiti nasalakniban a titulo',
-'protectedtitlestext' => 'Dagitoy a titulo ket nasalakniban ti panakaaramid',
+'protectedtitlestext' => 'Dagiti sumaganad a titulo ket nasalakniban manipud ti pannakapartuat',
 'protectedtitlesempty' => 'Awan dagiti titulo a madama a nasalakniban iti dagitoy a parametro.',
 'listusers' => 'Listaan dagiti agar-aramat',
 'listusers-editsonly' => 'Ipakita laeng dagiti agar-aramat nga adda inurnosda',
@@ -1936,7 +1935,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'move' => 'Iyalis',
 'movethispage' => 'Iyalis daytoy a panid',
 'unusedimagestext' => 'Adda dagiti sumaganad a papeles ngem saanda a naikabil iti ania man a panid.
-Pangngaasi a laglagipen a dagiti sabali a sapot ti pagsaadan  ket makasilpoda ti papeles iti dagus a URL, ken isu pay a nailista da ditoy uray no saan da a naus-usar iti agdama.',
+Pangngaasi a laglagipen a dagiti sabali a sapot ti pagsaadan  ket makasilpoda ti papeles iti dagus a URL, ken isu pay a nailista da ditoy urayno saanda a naus-usar iti agdama.',
 'unusedcategoriestext' => 'Adda dagiti sumaganad a kategoria a panid, ngem awan ti sabali a panid wenno kategoria ti agus-usar kaniada.',
 'notargettitle' => 'Awan ti napuntaan',
 'notargettext' => 'Saanmo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal daytoy nga opisio.',
@@ -1978,7 +1977,7 @@ Mapabassit mo ti pinagpakita no piliam ti kita ti listaan, ti nagan ti gar-arama
 'allpagesprev' => 'Napalabas',
 'allpagesnext' => 'Sumaruno',
 'allpagessubmit' => 'Inkan',
-'allpagesprefix' => 'Iparang dagiti pampanid nga adda pasaruno na:',
+'allpagesprefix' => 'Iparang dagiti pampanid nga adda pasarunona:',
 'allpagesbadtitle' => 'Ti naited a titulo ti panid ket imbalido wenno  adda maki-pagsasao wenno maki-wiki a pasaruno na.',
 'allpages-bad-ns' => 'Awan ti {{SITENAME}} iti nagan ti lugar a "$1".',
 'allpages-hide-redirects' => 'Ilemmeng dagiti baw-ing',
@@ -2029,31 +2028,31 @@ Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
 'activeusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
 
 # Special:ListGroupRights
-'listgrouprights' => 'Dagiti karbengan ti bunggoy ti agar-aramat',
+'listgrouprights' => 'Dagiti karbengan ti grupo ti agar-aramat',
 'listgrouprights-summary' => 'Dagiti sumaganad a listaan ti bunggoy ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti karbengan ti panagserrekda.
 Adda pay ngata [[{{MediaWiki:Listgrouprights-helppage}}|adu pay a pakaammo]] a maipapan kadagiti kabukbukodda a karbengan.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Naikkan ti karbengan</span>
 * <span class="listgrouprights-revoked">Naikkat ti karbengan</span>',
-'listgrouprights-group' => 'Bunggoy',
+'listgrouprights-group' => 'Grupo',
 'listgrouprights-rights' => 'Dagiti karbengan',
-'listgrouprights-helppage' => 'Help:Karbengan ti bunggoy',
-'listgrouprights-members' => '(listaan dagiti kameng)',
-'listgrouprights-addgroup' => 'Inayon {{PLURAL:$2|ti bunggoy|dagiti bunggoy}} : $1',
-'listgrouprights-removegroup' => 'Ikkaten {{PLURAL:$2|ti bunggoy|dagiti bunggoy}}: $1',
-'listgrouprights-addgroup-all' => 'Inayon amin dagiti bunggoy',
-'listgrouprights-removegroup-all' => 'Ikkatem amin dagiti bunggoy',
-'listgrouprights-addgroup-self' => 'Inayon {{PLURAL:$2|ti bunggoy|dagiti bunggoy}} ti bukodda a pakabilangan: $1',
-'listgrouprights-removegroup-self' => 'Ikkaten {{PLURAL:$2|ti bunggoy|dagiti bungoy}} ti bukodda a pakabilangan: $1',
-'listgrouprights-addgroup-self-all' => 'Inayon amin dagiti bunggoy ti bukodmo a pakabilangan',
+'listgrouprights-helppage' => 'Help:Karbengan ti grupo',
+'listgrouprights-members' => '(listaan ti kamkameng)',
+'listgrouprights-addgroup' => 'Inayon {{PLURAL:$2|ti grupo|dagiti grupo}} : $1',
+'listgrouprights-removegroup' => 'Ikkaten {{PLURAL:$2|ti grupo|dagiti grupo}}: $1',
+'listgrouprights-addgroup-all' => 'Inayon amin dagiti grupo',
+'listgrouprights-removegroup-all' => 'Ikkatem amin dagiti grupo',
+'listgrouprights-addgroup-self' => 'Inayon {{PLURAL:$2|ti grupo|dagiti grupo}} ti bukod a pakabilangan: $1',
+'listgrouprights-removegroup-self' => 'Ikkaten {{PLURAL:$2|ti grupo|dagiti grupo}} manipud ti bukod a pakabilangan: $1',
+'listgrouprights-addgroup-self-all' => 'Inayon amin dagiti bunggoy ti bukod a pakabilangan',
 'listgrouprights-removegroup-self-all' => 'Ikkatem amin dagiti bunggoy ti bukod a pakabilangan',
 
 # Email user
 'mailnologin' => 'Awan ti pagipatulodan a pagtaengan',
-'mailnologintext' => 'Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga e-surat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti e-surat kadagiti sabsabali nga agar-aramat.',
-'emailuser' => 'E-suratan daytoy nga agar-aramat',
-'emailuser-title-target' => 'E-suratam daytoy nga {{GENDER:$1|agar-aramat}}',
-'emailuser-title-notarget' => 'E-suratan ti agar-aramat',
-'emailpage' => 'E-suratan ti agar-aramat',
+'mailnologintext' => 'Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga esurat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti esurat kadagiti sabsabali nga agar-aramat.',
+'emailuser' => 'Esuratan daytoy nga agar-aramat',
+'emailuser-title-target' => 'Esuratam daytoy nga {{GENDER:$1|agar-aramat}}',
+'emailuser-title-notarget' => 'Esuratan ti agar-aramat',
+'emailpage' => 'Esuratan ti agar-aramat',
 'emailpagetext' => 'Mabalinmo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe ti daytoy nga {{GENDER:$1|agar-aramat}}.
 Ti e-surat nga inkabilmo idiay  [[Special:Preferences|kakaykayatam]] ket agparang a kas "Naggapu" a pagtaengan ti e-surat, tapno ti nagipatulodam ket makasungbat kenka.',
 'usermailererror' => 'Kita ti surat ket nangisubli ti biddut:',
@@ -2068,7 +2067,7 @@ Ti e-surat nga inkabilmo idiay  [[Special:Preferences|kakaykayatam]] ket agparan
 'emailtarget' => 'Ikabil ti nagan ti agar-aramat a pangitulodam',
 'emailusername' => 'Nagan ti agar-aramat:',
 'emailusernamesubmit' => 'Ited',
-'email-legend' => 'Ipatulod ti e-surat ti sabali a {{SITENAME}} ti agar-aramat',
+'email-legend' => 'Ipatulod ti esurat ti sabali a {{SITENAME}} ti agar-aramat',
 'emailfrom' => 'Naggapo kenni:',
 'emailto' => 'Para kenni:',
 'emailsubject' => 'Suheto:',
@@ -2105,7 +2104,7 @@ Dagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunga
 'notvisiblerev' => 'Ti panagbalbaliw ti sabali nga agar-aramat ket naikkaten',
 'watchnochange' => 'Awan dagiti binambantayam ket naurnos dita panawen a naipakita.',
 'watchlist-details' => '{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a mairaman dagiti panid ti tungtongan.',
-'wlheader-enotif' => '* Napakabaelan ti pakiammo ti e-surat.',
+'wlheader-enotif' => '* Napakabaelan ti pakiammo ti esurat.',
 'wlheader-showupdated' => "* Dagiti panid a nasukatan manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
 'watchmethod-recent' => 'kitkitaen dagiti kinaudi nga inurnos kadagiti bambantayan a panid',
 'watchmethod-list' => 'kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos',
@@ -2151,7 +2150,7 @@ Awanen ti sabali pay a paka-ammo a maipatulod kenka no adda pay dagiti masukatan
 Ti gayyemmo ti {{SITENAME}} a sistema ti pagpa-ammo
 
 --
-Ti panagsukat ti kasasaad ti e-surat a pagpa-ammom, sarungkaram ti
+Ti panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti
 {{canonicalurl:{{#special:Preferences}}}}
 
 Ti panagsukat kadagiti kasasaad ti bambantayam, sarungkaram ti
@@ -2259,7 +2258,7 @@ Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignaye
 'protect-level-autoconfirmed' => 'Palubosan laeng dagiti automatiko a napasingkedan nga agar-aramat',
 'protect-level-sysop' => 'Palubosan laeng dagiti administrador',
 'protect-summary-cascade' => 'agsariap',
-'protect-expiring' => 'agpaso inton $1 (UTC)',
+'protect-expiring' => 'agpaso intono $1 (UTC)',
 'protect-expiring-local' => 'agpaso $1',
 'protect-expiry-indefinite' => "inggana't inggana",
 'protect-cascade' => 'Salakniban dagiti pampanid a nairaman iti daytoy a panid (babaen ti sariap a salaknib)',
@@ -2427,7 +2426,7 @@ Ikkan ti nainaganan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid
 ** Saan a maawat a nagan ti agar-aramat',
 'ipb-hardblock' => 'Iparit kadagiti nakastrek nga agar-aramat ti agpabaliw iti naggapo ditoy nga IP a pagtaengan',
 'ipbcreateaccount' => 'Pawilan ti panagpartuat iti pakabilangan',
-'ipbemailban' => 'Pawilan ti agar-aramat nga agipatulod ti e-surat',
+'ipbemailban' => 'Pawilan ti agar-aramat nga agipatulod ti esurat',
 'ipbenableautoblock' => 'Automatiko ti serra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan a padasen da nga agpabaliw',
 'ipbsubmit' => 'Serraan daytoy nga agar-aramat',
 'ipbother' => 'Sabali nga oras:',
@@ -2443,8 +2442,8 @@ Ikkan ti nainaganan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid
 'blockipsuccesssub' => 'Balligi ti panangserra',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ket naserraanen.<br />
 Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti serra.',
-'ipb-blockingself' => 'Mangrugrugika nga agserra kenka! Sigurado nga kayatmo nga aramiden daytoy?',
-'ipb-confirmhideuser' => 'Mangrugrugika ti mangserra ti agar-aramat nga adda ti napabalinna nga "ilemmeng ti agar-aramat". Iddeppenna ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Sigurado ka a kasta ti kayatmo?',
+'ipb-blockingself' => 'Mangrugrugika nga agserra kenka! Sigurado a kayatmo nga aramiden daytoy?',
+'ipb-confirmhideuser' => 'Mangrugrugika ti mangserra ti agar-aramat nga adda ti napabalinna nga "ilemmeng ti agar-aramat". Iddeppenna ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Siguradoka a kasta ti kayatmo?',
 'ipb-edit-dropdown' => 'Urnosen dagiti rason ti panagserra',
 'ipb-unblock-addr' => 'Lukatan ti serra ni $1',
 'ipb-unblock' => 'Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan',
@@ -2453,7 +2452,7 @@ Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti
 'unblockip' => 'Lukatan ti serra ti agar-aramat',
 'unblockiptext' => 'Usaren ti kinabuklan dita baba ti pinagisubli ti pinagserrek nga agsurat ti napalabas a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.',
 'ipusubmit' => 'Ikkaten daytoy a serra',
-'unblocked' => 'Naikkat ti panakaserra ni [[User:$1|$1]]',
+'unblocked' => 'Naikkat ti pannakaserra ni [[User:$1|$1]].',
 'unblocked-range' => '$1 naikkaten ti serra na',
 'unblocked-id' => 'Naikkaten ti serra ni $1',
 'blocklist' => 'Dagiti naserraan nga agar-aramat',
@@ -2473,7 +2472,7 @@ Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti
 'ipblocklist-localblock' => 'Serra a lokal',
 'ipblocklist-otherblocks' => 'Sabali {{PLURAL:$1|a serra|kadagiti serra}}',
 'infiniteblock' => "inggana't inggana",
-'expiringblock' => 'agpaso no $1 ti oras nga $2',
+'expiringblock' => 'agpaso intono $1 ti oras nga $2',
 'anononlyblock' => 'di am-ammo laeng',
 'noautoblockblock' => 'nabaldado ti auto a serra',
 'createaccountblock' => 'naserraan ti pannakapartuat ti pakabilangan',
@@ -2509,9 +2508,9 @@ Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagi
 'range_block_disabled' => 'Ti abilidad ti administrador nga agaramid ti naabutan a serra ket naiddep.',
 'ipb_expiry_invalid' => 'Imbalido ti oras a panagpaso.',
 'ipb_expiry_temp' => 'Ti serra ti nagan ti agar-aramat ket masapul a permanente.',
-'ipb_hide_invalid' => 'Saan a mapasardeng daytoy a pakabilangan; adda ngata adu unay nga inurnos na.',
+'ipb_hide_invalid' => 'Saan a mapasardeng daytoy a pakabilangan; adda ngata adu unay nga inurnosna.',
 'ipb_already_blocked' => ' "$1" ket naserraan',
-'ipb-needreblock' => '$1 ket naseraan. Kayatmo a sukatan ti serra na?',
+'ipb-needreblock' => '$1 ket naseraan. Kayatmo a sukatan ti serrana?',
 'ipb-otherblocks-header' => 'Sabali {{PLURAL:$1|a naserraan|kadagiti naserraan}}',
 'unblock-hideuser' => 'Saanmo a maisubli ti serra daytoy nga agar-aramat, nailemmengen ti nagan daytoy nga agar-aramat.',
 'ipb_cant_unblock' => 'Biddut: ID $1 ti serra a nabirukan. Baka nalukatan ti serranan.',
@@ -2528,7 +2527,7 @@ Pangngaasi ta kontakem ti agit-ited ti serbisio ti Internet mo wenno teknikal a
 'sorbsreason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a proxy" idiay DNSBL nga inusar ti {{SITNAME}}.',
 'sorbs_create_account_reason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan proxy" idiay DNSBL nga inusar ti {{SITNAME}}.
 Saanka a makaaramid ti pakabilangan',
-'cant-block-while-blocked' => 'Saanmo a maserraan dagiti sabali nga agar-aramat no naserraan ka met.',
+'cant-block-while-blocked' => 'Saanmo a maserraan dagiti sabali nga agar-aramat no naserraanka met.',
 'cant-see-hidden-user' => 'Ti agar-aramat a kayatmo a serraan ket naserraan ken nailemmeng.
 Ket awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno mabaliwan ti serra ti agar-aramat.',
 'ipbblocked' => 'Saanmo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraan ka met.',
@@ -2537,10 +2536,10 @@ Ket awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno
 # Developer tools
 'lockdb' => 'Balunetan ti database',
 'unlockdb' => 'Lukatan ti database',
-'lockdbtext' => 'Ti panagserra ti database ket makaikkat ti abilidad kadagiti amin nga agar-aramat ti agurnos kadagiti panid, ti panagsukat dagiti kaykayat da, ti panagurnos dagiti bambantayan da, ken dagiti sabsabali pay a masapul ti panagsukat idiay database.
-Pangngaasi ta pasingkedam daytoy a kayatmo nga aramiden, ken luktam dayta database no malpas kan nga agsimpa.',
-'unlockdbtext' => 'Ti panaglukat ti database ket mangipasubli ti abilidad dagiti amin nga agar-aramat ti panagurnos kadagiti panid, ti panagsukat dagiti kaykayat da, ti panagurnos dagiti bambantayanda, ken dagiti amin a makasapul ti panagsukat idiay database.
-Pangngaasi ta pasingkedam a daytoy ti kayatmo nga aramiden.',
+'lockdbtext' => 'Ti panagserra ti database ket makaikkat ti abilidad kadagiti amin nga agar-aramat ti agurnos kadagiti panid, ti panagsukat dagiti kaykayatda, ti panagurnos dagiti bambantayanda, ken dagiti sabsabali pay a masapul ti panagsukat idiay database.
+Pangngaasi a pasingkedam daytoy no kayatmo nga aramiden, ken luktam dayta database no malpas kan nga agsimpa.',
+'unlockdbtext' => 'Ti panaglukat ti database ket mangipasubli ti abilidad dagiti amin nga agar-aramat ti panagurnos kadagiti panid, ti panagsukat dagiti kaykayatda, ti panagurnos dagiti bambantayanda, ken dagiti amin a makasapul ti panagsukat idiay database.
+Pangngaasi a pasingkedam a daytoy no kayatmo nga aramiden.',
 'lockconfirm' => 'Wen, talaga a kayatko a balunetan ti database.',
 'unlockconfirm' => 'Wen, talaga a kayatko a balunetan ti database.',
 'lockbtn' => 'Balunetan ti database',
@@ -2625,7 +2624,7 @@ Pangngaasim ta i-manualmo lattan a pagtiponem ida.'''",
 'delete_and_move' => 'Ikkaten ken iyalis',
 'delete_and_move_text' => '== Masapul nga ikkaten ==
 Ti pangipanan ti panid ket "[[:$1]]" addan.
-Kayatmo nga ikkaten  tapno makaiyalis ka?',
+Kayatmo nga ikkaten  tapno makaiyaliska?',
 'delete_and_move_confirm' => 'Wen, ikkaten ti panid',
 'delete_and_move_reason' => 'Naikkat tapno mawayaan ti panaka-iyalis idiay "[[$1]]"',
 'selfmove' => 'Ti titulo ti taudan ken ti pangipanan ket agpadpada;
@@ -2707,7 +2706,7 @@ Pangngaasi a bisitaen ti [//www.mediawiki.org/wiki/Localisation Lokalisasion ti
 # Special:Import
 'import' => 'Agala kadagiti panid',
 'importinterwiki' => 'Agala ti transwiki',
-'import-interwiki-text' => 'Agpili ka ti wiki ken titulo ti panid nga alaem.
+'import-interwiki-text' => 'Agpilika ti wiki ken titulo ti panid nga alaem.
 Dagit panagbaliw a petsa ken dagiti nagan ti mannurat ket maipreserba.
 Amin a transwiki nga alaem ket mailista idiay [[Special:Log/import|listaan ti pinagala]].',
 'import-interwiki-source' => 'Taudan ti wiki/panid:',
@@ -2752,7 +2751,7 @@ Pangngaasi a padasem manen.',
 'import-error-special' => 'Ti panid ti "$1" ket saan a naala ngamin ket bukod ti  espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
 'import-error-invalid' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
 'import-error-unserialize' => 'Ti panagbaliw ti $2 iti panid ti "$1" ket di maipagsasaruno. Ti panagbalbaliw ket naireporta idi nga agus-usar ti modelo ti $3 a naipagsasaruno a kas $4.',
-'import-options-wrong' => 'Saan nga husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>',
+'import-options-wrong' => 'Saan a husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Ti naited a ramut ti panid ket imbalido a titulo.',
 'import-rootpage-nosubpage' => 'Ti nagan ti lugar ti "$1" iti ramut ti panid ket saan amangpalubos kadagiti apo ti panid.',
 
@@ -2813,7 +2812,7 @@ Mabalinmo a kitaen ti taudanna.',
 'tooltip-t-recentchangeslinked' => 'Kinaudian a sinukatan  dagiti panid a nakasilpo ditoy a panid',
 'tooltip-feed-rss' => 'RSS a pakan para iti daytoy a panid',
 'tooltip-feed-atom' => 'Atom a pakan para iti daytoy a panid',
-'tooltip-t-contributions' => 'Kitaen ti listaan dagiti naaramidan daytoy nga agar-aramat',
+'tooltip-t-contributions' => 'Kitaen ti listaan dagiti naaramid daytoy nga agar-aramat',
 'tooltip-t-emailuser' => 'Patulodan ti e-surat daytoy nga agar-aramat',
 'tooltip-t-upload' => 'Agipan iti papeles',
 'tooltip-t-specialpages' => 'Listaan ti amin nga espesial a pampanid',
@@ -2891,16 +2890,16 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'pageinfo-subpages-name' => 'Apo dagiti panid ti daytoy a panid',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|baw-ing|bawbaw-ing}}; $3 {{PLURAL:$3|saan a baw-ing|saan a bawbaw-ing}})',
 'pageinfo-firstuser' => 'Nagpartuat ti panid',
-'pageinfo-firsttime' => 'Petsa a panakapartuat ti panid',
+'pageinfo-firsttime' => 'Petsa a pannakapartuat ti panid',
 'pageinfo-lastuser' => 'Kinaudi a nagurnos',
 'pageinfo-lasttime' => 'Petsa ti kinaudi a panag-urnos',
 'pageinfo-edits' => 'Dagup a bilang dagiti inurnos',
-'pageinfo-authors' => 'Dagup a bilang dagiti naisangsangayn a mannurat',
+'pageinfo-authors' => 'Dagup a bilang dagiti naisangsangayan a mannurat',
 'pageinfo-recent-edits' => 'Itay nabiit a bilang dagiti inurnos (ti uneg ti napalabas ti $1)',
 'pageinfo-recent-authors' => 'Itay nabiit a bilang dagiti naisangsangayan a mannurat',
 'pageinfo-magic-words' => 'Salamangka  {{PLURAL:$1|a balikas|a balbalikas}} ($1)',
 'pageinfo-hidden-categories' => 'Nailemmeng {{PLURAL:$1|a kategoria|a katkategoria}} ($1)',
-'pageinfo-templates' => 'Nailak-am  {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
+'pageinfo-templates' => 'Nailak-am {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
 'pageinfo-transclusions' => '{{PLURAL:$1|A panid|A pampanid}} ti nailak-an=m idiay ($1)',
 'pageinfo-toolboxlink' => 'Pakaammo ti panid',
 'pageinfo-redirectsto' => 'Maibaw-ing idiay',
@@ -2970,8 +2969,8 @@ No usarem daytoy, baka makompromiso ti sistema.",
 'file-info-png-looped' => 'nasiluan',
 'file-info-png-repeat' => 'pinaayayam ti $1 {{PLURAL:$1|a beses|a beses}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|a kuadro| kadagiti kuadro}}',
-'file-no-thumb-animation' => "'''Paammo: Gapu kadagiti teknikal a panakaipatingga, dagiti bassit a ladawan ti daytoy a papeles ket saanto a maanimado.'''",
-'file-no-thumb-animation-gif' => "'''Paammo: Gapu kadagiti teknikal a panakaipatingga, dagiti bassit a ladawan ti nangato a resolusion dagiti  GIF nga imahen a kas daytoy ket saanto a maanimado.'''",
+'file-no-thumb-animation' => "'''Paammo: Gapu kadagiti teknikal a pannakaipatingga, dagiti bassit a ladawan ti daytoy a papeles ket saanto a maanimado.'''",
+'file-no-thumb-animation-gif' => "'''Paammo: Gapu kadagiti teknikal a pannakaipatingga, dagiti bassit a ladawan ti nangato a resolusion dagiti  GIF nga imahen a kas daytoy ket saanto a maanimado.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeria dagiti kabarbaro a papeles',
@@ -3032,10 +3031,10 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-photometricinterpretation' => 'Piksel a kabuklan',
 'exif-orientation' => 'Pagturongan',
 'exif-samplesperpixel' => 'Bilang ti nagnagyan',
-'exif-planarconfiguration' => 'Pinakaurnong ti datos',
+'exif-planarconfiguration' => 'Pannaka-urnos ti datos',
 'exif-ycbcrsubsampling' => 'Subsampling ratio ti Y iti C',
 'exif-ycbcrpositioning' => 'Y ken C a panakaipatakderan',
-'exif-xresolution' => 'Horizontal resolution',
+'exif-xresolution' => 'Horisontal a resolusion',
 'exif-yresolution' => 'nakatakder a resolusion',
 'exif-stripoffsets' => 'Lokasion ti datos ti imahen',
 'exif-rowsperstrip' => 'Bilang ti ar-aray tunggal maysa a strip',
@@ -3056,7 +3055,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-flashpixversion' => 'Nasuportaran a Flashpix a bersion',
 'exif-colorspace' => 'Kolor ti lugar',
 'exif-componentsconfiguration' => 'Ti kayat a saoen ti tunggal maysa a nagyan',
-'exif-compressedbitsperpixel' => 'Ti pinagpekkel ti imahen',
+'exif-compressedbitsperpixel' => 'Moda ti kompresion ti imahen',
 'exif-pixelydimension' => 'Kaaba ti imahen',
 'exif-pixelxdimension' => 'Katayag ti imahen',
 'exif-usercomment' => 'Dagiti komentario ti agar-aramat',
@@ -3102,6 +3101,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-contrast' => 'Contrast',
 'exif-saturation' => 'Saturation',
 'exif-sharpness' => 'Kalawag',
+'exif-devicesettingdescription' => 'Deskripsion dagiti pannakaidisso ti ramit',
 'exif-subjectdistancerange' => 'Nasakup a kaadayo ti suheto',
 'exif-imageuniqueid' => 'Naisangsangayan nga ID ti imahen',
 'exif-gpsversionid' => 'Etiketa a bersion ti GPS',
@@ -3417,54 +3417,54 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'limitall' => 'amin',
 
 # Email address confirmation
-'confirmemail' => 'Pasingkedan ti e-surat a pagtaengam',
+'confirmemail' => 'Pasingkedan ti esurat a pagtaengam',
 'confirmemail_noemail' => 'Awan ti umisu nga e-surat a pagtaengam a naikabil idiay [[Special:Preferences|kaykayat ti agar-aramat]].',
-'confirmemail_text' => 'Ti {{SITNAME}} ket masapulna a pasingkedam ti e-surat a pagtaengam sakbay nga agusar ti -surat a langa.
+'confirmemail_text' => 'Ti {{SITNAME}} ket masapulna a pasingkedam ti esurat a pagtaengam sakbay nga agusar ti esurat a langa.
 Ipabalinmo dita baba a buton ti panagitulod ti pasingkedan a surat dita a pagtaengam.
 Ti surat ket mangiraman ti panilpo nga aglaon ti maysa a kodigo;
-ikabil ti panilpo dita pagbasabasam tapno mapasingkedam a ti e-surat a pagtaengam ket umisu.',
+ikabil ti panilpo dita pagbasabasam tapno mapasingkedam a ti esurat a pagtaengam ket umisu.',
 'confirmemail_pending' => 'Ti pasingkedan a kodigo ket naipatulod kenkan:
 no kadamdama ka a nangaramid ti pakabilangam, aguray ka pay ti mano a minutos a sumangpet sakbay ka nga agpadas ti agkiddaw ti baro a kodigo.',
 'confirmemail_send' => 'Agipatulod ti pasingkedan a kodigo',
-'confirmemail_sent' => 'Naipatuloden ti pammasingked nga e-surat.',
+'confirmemail_sent' => 'Naipatuloden ti pammasingked nga esurat.',
 'confirmemail_oncreate' => 'Ti pakasingkedan a kodigo ket naipatulod dita e-surat a pagtaengam.
 Daytoy a kodigo ket saan a masapul ti sumrek, ngem masapulmo nga ited sakbay ka nga agpabalin kadagiti e-surat a langa ti wiki.',
 'confirmemail_sendfailed' => 'Ti {{SITENAME}} ket saan a makaipatulod ti pammasingked a surat.
-Pangngaasi a kitaem ti e-surat a pagtaengam para kadagiti imbalido a karakter.
+Pangngaasi a kitaem ti esurat a pagtaengam para kadagiti imbalido a karakter.
 
 Insubli ti nangisurat: $1',
 'confirmemail_invalid' => 'Imbalido a kodigo ti pammasingked.
 Mabalin a nagpaso daytoy a kodigo.',
-'confirmemail_needlogin' => 'Masapulmo ti $1 tapno mapasingkedan ti e-surat a pagtaengam.',
-'confirmemail_success' => 'Napasingkedanen ti e-surat a pagtaengam.
+'confirmemail_needlogin' => 'Masapulmo ti $1 tapno mapasingkedan ti esurat a pagtaengam.',
+'confirmemail_success' => 'Napasingkedanen ti esurat a pagtaengam.
 Mabalinmo tattan ti [[Special:UserLogin|sumrek]] ken nanamen ti wiki.',
-'confirmemail_loggedin' => 'Napasingkedanen ti e-surat a pagtaengam.',
+'confirmemail_loggedin' => 'Napasingkedanen ti esurat a pagtaengam.',
 'confirmemail_error' => 'Adda banag a biddut ti panangidulin ti pammasingkedmo.',
-'confirmemail_subject' => 'Pammasingked ti e-surat a pagtaengan ti {{SITENAME}}',
+'confirmemail_subject' => 'Pammasingked ti esurat a pagtaengan ti {{SITENAME}}',
 'confirmemail_body' => 'Addaan, baka sika, ti naggapu ti IP a pagtaengan $1,
-ket nagrehistro ti pakabilangan "$2" iti daytoy nga e-surat a pagtaengan idiay {{SITENAME}}
+ket nagrehistro ti pakabilangan "$2" iti daytoy nga esurat a pagtaengan idiay {{SITENAME}}
 
 Tapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti 
-pinagpabalin ti e-surat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:
+pinagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:
 
 $3
 
 No *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a panilpo
-ta pasardengem ti pinakasingkedan ti e-surat a  pagtaengam:
+ta pasardengem ti pinakasingkedan ti esurat a  pagtaengam:
 
 $5
 
 Daytoy a pammasingked a kodigo ket agpaso iti $4.',
 'confirmemail_body_changed' => 'Addaan, baka sika, ti naggapu ti IP a pagtaengam $1,
-ket nangsukat ti e-surat a pagtaengan ti pakabilangan "$2" iti daytoy a pagtaengan idiay {{SITENAME}}
+ket nangsukat ti esurat a pagtaengan ti pakabilangan "$2" iti daytoy a pagtaengan idiay {{SITENAME}}
 
 Tapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti 
-panagpabalin ti e-surat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:
+panagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:
 
 $3
 
 No *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a panilpo
-ta pasardengem ti pinakasingkedan ti e-surat a pagtaengam:
+ta pasardengem ti pinakasingkedan ti esurat a pagtaengam:
 
 $5
 
@@ -3560,7 +3560,7 @@ Mabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti kilaw a listaan]].',
 'watchlistedit-raw-legend' => 'Urnosen ti kilaw a listaan ti bambantayan',
 'watchlistedit-raw-explain' => 'Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba, ken mabaliwam nga urnosen babaen ti panagnayon ken panagkissay manipud ti listaan;
 maysa a titulo tunggal maysa a linia.
-No malpas ka, itakla ti "{{int:Watchlistedit-raw-submit}}".
+No malpaska, itakla ti "{{int:Watchlistedit-raw-submit}}".
 Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'watchlistedit-raw-titles' => 'Dagiti titulo:',
 'watchlistedit-raw-submit' => 'Pabaruen ti listaan ti bambantayan',
@@ -3600,12 +3600,12 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'version-license' => 'Lisensia',
 'version-poweredby-credits' => "Daytoy a wiki ket pinaandar ti '''[//www.mediawiki.org/ MediaWiki]''', karbengan a kopia © 2001-$1 $2.",
 'version-poweredby-others' => 'dadduma pay',
-'version-credits-summary' => 'Kayat mi kuma a pammadayawan dagiti sumaganad a tao para kadagiti inparawadda ti [[Special:Version|MediaWiki]].',
-'version-license-info' => 'Ti MediaWiki ket nawaya a software; maiwarasmo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti  ania man a bersion.
+'version-credits-summary' => 'Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti inparawadda iti [[Special:Version|MediaWiki]].',
+'version-license-info' => 'Ti MediaWiki ket nawaya a sopwer; maiwarasmo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a bersion.
 
-Ti MediaWiki ket naiwarwaras nga adda ti namnama a makatulong, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANAKAILAKO wenno KALAINGAN NA ITI DAYTOY A PANGGEP. Kitaen ti GNU Sapasap a  Publiko a Lisensia para kadagiti adu pay a salaysay.
+Ti MediaWiki ket naiwarwaras nga adda ti namnama a makatulong, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANAKAILAKO wenno KALAINGAN NA ITI DAYTOY A PANGGEP. Kitaen ti GNU Sapasap a Publiko a Lisensia para kadagiti adu pay a salaysay.
 
-Naka-awat ka kuman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a  Publiko a Lisensia] a nairaman iti daytoy a programa; no saan, agsurat ka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem idiay online].',
+Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a  Publiko a Lisensia] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem idiay online].',
 'version-software' => 'Naikabil a software',
 'version-software-product' => 'Produkto',
 'version-software-version' => 'Bersion',
@@ -3643,7 +3643,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'specialpages-group-changes' => 'Kaudian a sinukatan ken listaan',
 'specialpages-group-media' => 'Dagiti padamag ti media ken panag-ipan',
 'specialpages-group-users' => 'Dagiti agar-aramat ken karkarbengan',
-'specialpages-group-highuse' => 'Adu ti panaka-usar a pampanid',
+'specialpages-group-highuse' => 'Adu ti pannaka-usar a pampanid',
 'specialpages-group-pages' => 'Listaan dagiti panid',
 'specialpages-group-pagetools' => 'Ramramit ti panid',
 'specialpages-group-wiki' => 'Datos ken ramramit',
@@ -3659,10 +3659,10 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 #Ikabil ti "regular expression fragments" (idiay laeng paset nga ikabil ti tengnga ti  //) dita baba
 #Dagitoy ipada na ti URLs ti ruar (ti napudot a naikapet) imahen 
 #Dagiti agpada ket agparang nga  imahen, ket no saan ti panilpo ti imahen ti agparang laeng
-#Dagiti linia nga  umuna iti # ket maipabalin a komentario
+#Dagiti linia nga umuna iti # ket maipabalin a komentario
 #Daytoy ket "sensetibo ti kadakkel ti letra"
 
-#Ikabil dagita "regex fragment" ti ngato daytoy a linia. Baybayan daytoy a linia a kastoy</pre>',
+#Ikabil dagita "regex fragment" ti ngato daytoy a linia. Baybay-an a kastoy daytoy a linia</pre>',
 
 # Special:Tags
 'tags' => 'Umisu a sukatan dagiti etiketa',
@@ -3690,7 +3690,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'compare-revision-not-exists' => 'Awan met ti pinagbaliw dayta titulo a nainaganam.',
 
 # Database error messages
-'dberr-header' => 'Adda ti pakirut na daytoy a wiki',
+'dberr-header' => 'Adda ti pakirutna daytoy a wiki',
 'dberr-problems' => 'Pasensian a!
 Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'dberr-again' => 'Padasem ti agururay to manu a minutos ken agikarga.',
@@ -3700,7 +3700,7 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'dberr-cachederror' => 'Daytoy ket cached a kopia ti kiniddaw mo a panid, ken baka saan pay a barbaro.',
 
 # HTML forms
-'htmlform-invalid-input' => 'Adda pakirut kadagiti inkabil mo',
+'htmlform-invalid-input' => 'Adda pakirut kadagiti inkabilmo',
 'htmlform-select-badoption' => 'Ti kuwenta a nainaganam ket saan a mabalin a pagpilian.',
 'htmlform-int-invalid' => 'Ti kuwenta a nainaganam ket saan a sibubukel.',
 'htmlform-float-invalid' => 'Ti kuwenta a nainaganam ket saan a numero.',
@@ -3738,17 +3738,17 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'logentry-move-move' => 'Ni $1 ket {{GENDER:$2|inyalisna}}ti panid $3 idiay $4',
 'logentry-move-move-noredirect' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 a saan a nangibati ti baw-ing',
 'logentry-move-move_redir' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing',
-'logentry-move-move_redir-noredirect' => 'Ni $1 ket {{GENDER:$2|inyalisna} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing',
+'logentry-move-move_redir-noredirect' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing',
 'logentry-patrol-patrol' => 'Ni $1 ket {{GENDER:$2|minarkaanna}} ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
 'logentry-patrol-patrol-auto' => 'Ni $1 ket automatiko a {{GENDER:$2|minarkaanna}} ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
 'logentry-newusers-newusers' => 'Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}',
 'logentry-newusers-create' => 'Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}',
 'logentry-newusers-create2' => 'Ti pakabilangan ti agar-aramat $3 ket {{GENDER:$2|napartuat}} idi babaen ni $1',
-'logentry-newusers-byemail' => 'Ti pakabilangan a $3 ket pinartuat idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti e-surat',
-'logentry-newusers-autocreate' => 'Ti pakabilangan ni $1 ket automatiko a napartuat',
-'logentry-rights-rights' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3 manipud ti $4 iti $5',
-'logentry-rights-rights-legacy' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3',
-'logentry-rights-autopromote' => 'Ni $1 ket automatiko idi a naipangato manipud ti $4 iti $5',
+'logentry-newusers-byemail' => 'Ti pakabilangan a $3 ket {{GENDER:$2|pinartuat}} idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti esurat',
+'logentry-newusers-autocreate' => 'Ti pakabilangan ti agar-aramat ni $1 ket automatiko a {{GENDER:$2|napartuat}}',
+'logentry-rights-rights' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3 manipud ti $4 iti $5',
+'logentry-rights-rights-legacy' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3',
+'logentry-rights-autopromote' => 'Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5',
 'rightsnone' => '(awan)',
 
 # Feedback
@@ -3772,10 +3772,10 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'searchsuggest-containing' => 'naglaon ti...',
 
 # API errors
-'api-error-badaccess-groups' => 'Saan mo a mabalin ti agipan kadagiti papeles iti daytoy a wiki.',
+'api-error-badaccess-groups' => 'Saanmo a mabalin ti agipan kadagiti papeles iti daytoy a wiki.',
 'api-error-badtoken' => 'Kinauneg a biddut: Dakes a tandaan.',
 'api-error-copyuploaddisabled' => 'Ti mangipan babaen ti URL ket nabaldado ditoy a server.',
-'api-error-duplicate' => 'Adda {{PLURAL:$1|ket [$2 a sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addan ditoy a pagsaadan nga agpada ti nagyan da.',
+'api-error-duplicate' => 'Adda {{PLURAL:$1|ket [$2 a sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addan ditoy a pagsaadan nga agpada ti nagyanda.',
 'api-error-duplicate-archive' => 'Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabali a papeles]}} nga adda ditoy a pagsaadan nga agpada ti nagyan da, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.',
 'api-error-duplicate-archive-popup-title' => 'Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}} a naikkaten.',
 'api-error-duplicate-popup-title' => 'Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}}.',
@@ -3792,7 +3792,7 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'api-error-hookaborted' => 'Ti panagbabaro a pinadasmo ket napasardeng iti pangpa-atiddog a kawit.',
 'api-error-http' => 'Kinauneg a biddut: Saan a makaikabit idiay server.',
 'api-error-illegal-filename' => 'Ti nagan daytoy a papeles ket saan a maipalubos.',
-'api-error-internal-error' => 'Kinauneg a biddut: Addaan ti dakes a napasamak ti panagaramid ti panagipan mo iti daytoy a wiki.',
+'api-error-internal-error' => 'Kinauneg a biddut: Addaan ti dakes a napasamak ti panagaramid ti panagipanmo iti daytoy a wiki.',
 'api-error-invalid-file-key' => 'Kinauneg a biddut: Saan a nabirukan ti papeles idiay temporario a nagidulinan.',
 'api-error-missingparam' => 'Kinauneg a biddut: Kurang dagiti parametro iti kiddaw.',
 'api-error-missingresult' => 'Kinauneg a biddut: Saan a na-ammoan no ti kopia ket nagballigi.',
@@ -3806,9 +3806,9 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'api-error-publishfailed' => 'Kinauneg a biddut: Napaay ti server a nagipablaak ti temporario a papeles.',
 'api-error-timeout' => 'Saan a simmungbat ti server iti nanamnama nga oras.',
 'api-error-unclassified' => 'Adda di amammo a biddut a rumsua.',
-'api-error-unknown-code' => 'Di amamo a biddut: "$1"',
-'api-error-unknown-error' => 'Kinauneg a biddut: Addaan ti dakes a napasamak idi inpadas mo ti agipan ti papeles mo.',
-'api-error-unknown-warning' => 'Di am-ammo a ballaag: $1',
+'api-error-unknown-code' => 'Di am-ammo a biddut: "$1".',
+'api-error-unknown-error' => 'Kinauneg a biddut: Addaan ti dakes a napasamak idi nagipadaska ti agipan ti papelesmo.',
+'api-error-unknown-warning' => 'Di am-ammo a ballaag: "$1".',
 'api-error-unknownerror' => 'Di am-ammo a biddut: "$1".',
 'api-error-uploaddisabled' => 'Nabaldado ti mangipapan iti daytoy a wiki.',
 'api-error-verification-error' => 'Dakes ngata daytoy a papeles, wenno addaan ti madi a pagpa-atiddog.',
index 2acb24b..19c2042 100644 (file)
@@ -625,11 +625,11 @@ Il database ha restituito il seguente errore "$3: $4".',
 L'amministratore di sistema che ha imposto il blocco ha fornito questa spiegazione: $1",
 'missing-article' => 'Il database non ha trovato il testo di una pagina che avrebbe dovuto trovare sotto il nome di "$1" $2.
 
-Di solito ciò si verifica quando viene richiamato, a partire dalla cronologia o dal confronto tra revisioni, un collegamento a una pagina cancellata, a un confronto tra revisioni inesistenti o a un confronto tra revisioni ripulite dalla cronologia.
+Di solito ciò si verifica quando viene richiamato, a partire dalla cronologia o dal confronto tra versioni, un collegamento a una pagina cancellata, a un confronto tra versioni inesistenti o a un confronto tra versioni ripulite dalla cronologia.
 
 In caso contrario, si è probabilmente scoperto un errore del software MediaWiki.
 Si prega di segnalare l\'accaduto a un [[Special:ListUsers/sysop|amministratore]] specificando la URL in questione.',
-'missingarticle-rev' => '(numero della revisione: $1)',
+'missingarticle-rev' => '(numero della versione: $1)',
 'missingarticle-diff' => '(Diff: $1, $2)',
 'readonly_lag' => 'Il database è stato bloccato automaticamente per consentire ai server con i database slave di sincronizzarsi con il master',
 'internalerror' => 'Errore interno',
@@ -758,8 +758,8 @@ Per favore, effettua un accesso non appena la ricevi.',
 'blocked-mailpassword' => 'Per prevenire abusi, non è consentito usare la funzione "Invia nuova password" da un indirizzo IP bloccato.',
 'eauthentsent' => "Un messaggio e-mail di conferma è stato spedito all'indirizzo indicato.
 Per abilitare l'invio di messaggi e-mail per questo accesso è necessario seguire le istruzioni che vi sono indicate, in modo da confermare che si è i legittimi proprietari dell'indirizzo",
-'throttled-mailpassword' => 'Una nuova password è già stata inviata da meno di {{PLURAL:$1|1 ora|$1 ore}}.
-Per prevenire abusi, la funzione "Invia nuova password" può essere usata solo una volta ogni {{PLURAL:$1|ora|$1 ore}}.',
+'throttled-mailpassword' => 'Una email di reimpostazione della password è già stata inviata da meno di {{PLURAL:$1|1 ora|$1 ore}}.
+Per prevenire abusi, la funzione di reimpostazione della password può essere usata solo una volta ogni {{PLURAL:$1|ora|$1 ore}}.',
 'mailerror' => "Errore nell'invio del messaggio: $1",
 'acct_creation_throttle_hit' => "I visitatori del sito che usano il tuo indirizzo IP hanno creato {{PLURAL:$1|1 account|$1 account}} nell'ultimo giorno, che è il massimo consentito in questo periodo di tempo.
 Perciò, gli utenti che usano questo indirizzo IP non possono creare altri account per il momento.",
@@ -809,7 +809,7 @@ La password potrebbe essere stata già cambiata, oppure potrebbe essere stata ri
 
 # Special:PasswordReset
 'passwordreset' => 'Reimposta password',
-'passwordreset-text' => 'Compila questo modulo per ricevere i dettagli del tuo account via e-mail.',
+'passwordreset-text' => 'Compila questo modulo per reimpostare la tua password.',
 'passwordreset-legend' => 'Reimposta password',
 'passwordreset-disabled' => 'La reimpostazione delle password è stata disabilitata su questa wiki',
 'passwordreset-pretext' => '{{PLURAL:$1||Immetti uno dei dati richiesti qui sotto}}',
@@ -819,7 +819,7 @@ La password potrebbe essere stata già cambiata, oppure potrebbe essere stata ri
 'passwordreset-capture-help' => "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
 'passwordreset-email' => 'Indirizzo e-mail:',
 'passwordreset-emailtitle' => 'Dettagli account su {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo e-mail sono:
+'passwordreset-emailtext-ip' => "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:
 
 $2
 
@@ -827,7 +827,7 @@ $2
 Dovresti accedere e scegliere una nuova password ora. 
 
 Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
-'passwordreset-emailtext-user' => "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo e-mail sono:
+'passwordreset-emailtext-user' => "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:
 
 $2
 
@@ -837,9 +837,9 @@ Dovresti accedere e scegliere una nuova password ora.
 Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
 'passwordreset-emailelement' => 'Nome utente: $1
 Password temporanea: $2',
-'passwordreset-emailsent' => 'È stata inviata una e-mail di promemoria.',
-'passwordreset-emailsent-capture' => 'È stata inviata una e-mail di promemoria, il contenuto è riportato di seguito.',
-'passwordreset-emailerror-capture' => "È stata generata l'e-mail di promemoria riportata di seguito. L'invio all'utente non è riuscito: $1",
+'passwordreset-emailsent' => 'È stata inviata una email di reimpostazione della password.',
+'passwordreset-emailsent-capture' => 'È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.',
+'passwordreset-emailerror-capture' => "È stata generata una email di reimpostazione della password riportata di seguito. L'invio all'utente non è riuscito: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Modifica l'indirizzo e-mail",
@@ -3901,17 +3901,17 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'sqlite-no-fts' => '$1 senza la possibilità di ricerca completa nel testo',
 
 # New logging system
-'logentry-delete-delete' => '$1 ha cancellato la pagina $3',
-'logentry-delete-restore' => '$1 ha ripristinato "$3"',
-'logentry-delete-event' => '$1 ha modificato la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
-'logentry-delete-revision' => '$1 ha modificato la visibilità per {{PLURAL:$5|una revisione|$5 revisioni}} della pagina $3: $4',
-'logentry-delete-event-legacy' => '$1 ha modificato la visibilità di alcune azioni del registro di "$3"',
-'logentry-delete-revision-legacy' => '$1 ha modificato la visibilità per le revisioni della pagina $3',
-'logentry-suppress-delete' => '$1 ha nascosto la pagina "$3"',
-'logentry-suppress-event' => '$1 ha segretamente modificato la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
-'logentry-suppress-revision' => '$1 ha segretamente modificato la visibilità di {{PLURAL:$5|una versione|$5 versioni}} di "$3": $4',
-'logentry-suppress-event-legacy' => '$1 ha segretamente modificato la visibilità di alcune azioni del registro di "$3"',
-'logentry-suppress-revision-legacy' => '$1 ha segretamente modificato la visibilità di alcune versioni di "$3"',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ha cancellato}} la pagina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|ha ripristinato}} la pagina "$3"',
+'logentry-delete-event' => '$1 {{GENDER:$2|ha modificato}} la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ha modificato}} la visibilità per {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ha modificato}} la visibilità di alcune azioni del registro di $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ha modificato}} la visibilità per le versioni della pagina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ha nascosto}} la pagina $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di {{PLURAL:$5|un'azione del registro|$5 azioni del registro}} di $3: $4",
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di alcune azioni del registro di $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di alcune versioni della pagina $3',
 'revdelete-content-hid' => 'contenuto nascosto',
 'revdelete-summary-hid' => 'oggetto della modifica nascosto',
 'revdelete-uname-hid' => 'nome utente nascosto',
@@ -3920,20 +3920,20 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'revdelete-uname-unhid' => 'nome utente ripristinato',
 'revdelete-restricted' => 'limitazioni ai soli amministratori attivate',
 'revdelete-unrestricted' => 'limitazioni ai soli amministratori rimosse',
-'logentry-move-move' => '$1 ha spostato la pagina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ha spostato la pagina $3 a $4 senza lasciare redirect',
-'logentry-move-move_redir' => '$1 ha spostato la pagina $3 a $4 tramite redirect',
-'logentry-move-move_redir-noredirect' => '$1 ha spostato la pagina $3 a $4 al posto di un redirect senza lasciare redirect',
-'logentry-patrol-patrol' => '$1 ha segnato la versione $4 della pagina $3 come verificata',
-'logentry-patrol-patrol-auto' => '$1 ha segnato automaticamente la versione $4 della pagina $3 come verificata',
-'logentry-newusers-newusers' => "L'utenza $1 è stata creata",
-'logentry-newusers-create' => "L'utenza $1 è stata creata",
-'logentry-newusers-create2' => "L'utenza $3 è stata creata da $1",
-'logentry-newusers-byemail' => "L'utente $3 è stato creato da $1 e la password è stata inviata via e-mail",
-'logentry-newusers-autocreate' => "L'utenza $1 è stata creata automaticamente",
-'logentry-rights-rights' => "$1 ha modificato l'appartenenza di $3 dal gruppo $4 al gruppo $5",
-'logentry-rights-rights-legacy' => "$1 ha modificato l'appartenenza a gruppi di $3",
-'logentry-rights-autopromote' => '$1 è stato/a automaticamente promosso/a da $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 senza lasciare redirect',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 tramite redirect',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 al posto di un redirect senza lasciare redirect',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ha segnato}} la versione $4 della pagina $3 come verificata',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|ha segnato}} automaticamente la versione $4 della pagina $3 come verificata',
+'logentry-newusers-newusers' => "L'utenza $1 è stata {{GENDER:$2|creata}}",
+'logentry-newusers-create' => "L'utenza $1 è stata {{GENDER:$2|creata}}",
+'logentry-newusers-create2' => "L'utenza $3 è stata {{GENDER:$2|creata}} da $1",
+'logentry-newusers-byemail' => "L'utenza $3 è stata {{GENDER:$2|creata}} da $1 e la password è stata inviata via email",
+'logentry-newusers-autocreate' => "L'utenza $1 è stata {{GENDER:$2|creata}} automaticamente",
+'logentry-rights-rights' => "$1 {{GENDER:$2|ha modificato}} l'appartenenza di $3 dal gruppo $4 al gruppo $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|ha modificato}} l'appartenenza a gruppi di $3",
+'logentry-rights-autopromote' => '$1 è {{GENDER:$2|stato promosso|stata promossa|stato/a promosso/a}} automaticamente da $4 a $5',
 'rightsnone' => '(nessuno)',
 
 # Feedback
index 9b38c98..8ea970d 100644 (file)
@@ -4276,17 +4276,17 @@ MediaWikiは、有用であることを期待して配布されていますが
 'sqlite-no-fts' => '$1 (全文検索なし)',
 
 # New logging system
-'logentry-delete-delete' => '$1 がページ「$3」を削除しました',
-'logentry-delete-restore' => '$1 がページ「$3」を復元しました',
-'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを変更しました: $4',
-'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを変更しました: $4',
-'logentry-delete-event-legacy' => '$1 が「$3」の記録項目の閲覧レベルを変更しました',
-'logentry-delete-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを変更しました',
-'logentry-suppress-delete' => '$1 がページ「$3」を隠蔽しました',
-'logentry-suppress-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で変更しました: $4',
-'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で変更しました: $4',
-'logentry-suppress-event-legacy' => '$1 が$3で記録項目の閲覧レベルを見えない形で変更しました',
-'logentry-suppress-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを見えない形で変更しました',
+'logentry-delete-delete' => '$1 がページ「$3」を{{GENDER:$2|削除しました}}',
+'logentry-delete-restore' => '$1 がページ「$3」を{{GENDER:$2|復元しました}}',
+'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4',
+'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4',
+'logentry-delete-event-legacy' => '$1 が「$3」の記録項目の閲覧レベルを{{GENDER:$2|変更しました}}',
+'logentry-delete-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを{{GENDER:$2|変更しました}}',
+'logentry-suppress-delete' => '$1 がページ「$3」を{{GENDER:$2|隠蔽しました}}',
+'logentry-suppress-event' => '$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4',
+'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4',
+'logentry-suppress-event-legacy' => '$1 が$3で記録項目の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}',
+'logentry-suppress-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}',
 'revdelete-content-hid' => '本文の不可視化',
 'revdelete-summary-hid' => '編集要約の不可視化',
 'revdelete-uname-hid' => '利用者名の不可視化',
@@ -4295,20 +4295,20 @@ MediaWikiは、有用であることを期待して配布されていますが
 'revdelete-uname-unhid' => '利用者名の可視化',
 'revdelete-restricted' => '管理者に対する制限の適用',
 'revdelete-unrestricted' => '管理者に対する制限の除去',
-'logentry-move-move' => '$1 がページ「$3」を「$4」に移動しました',
-'logentry-move-move-noredirect' => '$1 がページ「$3」を「$4」に、リダイレクトを残さずに移動しました',
-'logentry-move-move_redir' => '$1 がページ「$3」をリダイレクトの「$4」に移動しました',
-'logentry-move-move_redir-noredirect' => '$1 がページ「$3」をリダイレクトの「$4」に、リダイレクトを残さずに移動しました',
-'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4 を巡回済みとしました',
-'logentry-patrol-patrol-auto' => '$1 が自動的にページ「$3」の版 $4 を巡回済みとしました',
-'logentry-newusers-newusers' => '利用者アカウント $1 が作成されました',
-'logentry-newusers-create' => '利用者アカウント $1 が作成されました',
-'logentry-newusers-create2' => '利用者アカウント $3 が $1 により作成されました',
-'logentry-newusers-byemail' => '利用者アカウント $3 が $1 によって作成され、そのパスワードをメールで送信しました',
-'logentry-newusers-autocreate' => '利用者アカウント $1 が自動的に作成されました',
-'logentry-rights-rights' => '$1 が $3 の所属グループを $4 から $5 に変更しました',
-'logentry-rights-rights-legacy' => '$1 が $3 の所属グループを変更しました',
-'logentry-rights-autopromote' => '$1 が $4 から $5 に自動的に昇格しました',
+'logentry-move-move' => '$1 がページ「$3」を「$4」に{{GENDER:$2|移動しました}}',
+'logentry-move-move-noredirect' => '$1 がページ「$3」を「$4」に、リダイレクトを残さずに{{GENDER:$2|移動しました}}',
+'logentry-move-move_redir' => '$1 がページ「$3」をリダイレクトの「$4」に{{GENDER:$2|移動しました}}',
+'logentry-move-move_redir-noredirect' => '$1 がページ「$3」をリダイレクトの「$4」に、リダイレクトを残さずに{{GENDER:$2|移動しました}}',
+'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4 を巡回済みと{{GENDER:$2|しました}}',
+'logentry-patrol-patrol-auto' => '$1 が自動的にページ「$3」の版 $4 を巡回済みと{{GENDER:$2|しました}}',
+'logentry-newusers-newusers' => '利用者アカウント $1 が{{GENDER:$2|作成されました}}',
+'logentry-newusers-create' => '利用者アカウント $1 が{{GENDER:$2|作成されました}}',
+'logentry-newusers-create2' => '利用者アカウント $3 が $1 により{{GENDER:$2|作成されました}}',
+'logentry-newusers-byemail' => '利用者アカウント $3 が $1 によって{{GENDER:$2|作成され}}、そのパスワードがメールで送信されました',
+'logentry-newusers-autocreate' => '利用者アカウント $1 が自動的に{{GENDER:$2|作成されました}}',
+'logentry-rights-rights' => '$1 が $3 の所属グループを $4 から $5 に{{GENDER:$2|変更しました}}',
+'logentry-rights-rights-legacy' => '$1 が $3 の所属グループを{{GENDER:$2|変更しました}}',
+'logentry-rights-autopromote' => '$1 が $4 から $5 に自動的に{{GENDER:$2|昇格しました}}',
 'rightsnone' => '(なし)',
 
 # Feedback
index 8208dd8..3a6fa9d 100644 (file)
@@ -955,8 +955,8 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rc-enhanced-hide' => 'Tefsilatu bınımne',
 
 # Recent changes linked
-'recentchangeslinked' => 'Ney sero vurnaene',
-'recentchangeslinked-toolbox' => 'Ney sero vurnaene',
+'recentchangeslinked' => 'Ney sero vurnayene',
+'recentchangeslinked-toolbox' => 'Ney sero vurnayene',
 'recentchangeslinked-title' => 'Heqa "$1"i de vurnais',
 'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya ki karberunê kategoriya bêlikerdiye rê) pelunê girêdaoğu de lista de vurnaisê peyênuna.
@@ -1436,7 +1436,7 @@ Tı şikina çımunê dae bıvênê',
 'tooltip-minoredit' => 'Ney jê vurnaiso qıc isaret ke',
 'tooltip-save' => 'Vurnaisunê ho qeyd ke',
 'tooltip-preview' => 'Kerem ke, vurnaisunê ho qeyd-kerdene ra ravêr be verqayt bıasne!',
-'tooltip-diff' => 'Kamci vurnaişi ke to meqale de kerdê, naine bıasne.',
+'tooltip-diff' => 'Kamci vurnayışi ke to meqale de kerdê, ninan basne.',
 'tooltip-compareselectedversions' => 'Ferqunê wertê ni dı nımınunê weçinıtu bıvêne.',
 'tooltip-watch' => 'Na pele lista huya şêrkerdişi ser ke',
 'tooltip-recreate' => 'Na pele esterıte bo ki, nae oncia bıaferne',
index e5b8892..cc838e4 100644 (file)
@@ -388,6 +388,9 @@ $messages = array(
 'index-category' => 'ទំព័រដែលមានលិបិក្រម',
 'noindex-category' => 'ទំព័រដែលគ្មានលិបិក្រម',
 'broken-file-category' => 'ទំព័រទាំងឡាយដែលដាច់តំណភ្ជាប់',
+'categoryviewer-pagedlinks' => '($1) ($2)',
+
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
 'about' => 'អំពី',
 'article' => 'មាតិកាអត្ថបទ',
@@ -522,6 +525,8 @@ $1',
 
 'ok' => 'យល់ព្រម',
 'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
 'retrievedfrom' => 'បានពី "$1"',
 'youhavenewmessages' => 'អ្នកមាន $1 ($2)។',
 'newmessageslink' => 'សារថ្មីៗ',
@@ -532,6 +537,7 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}ចុងក្រោយ',
 'youhavenewmessagesmulti' => 'អ្នកមានសារថ្មីៗនៅ $1',
 'editsection' => 'កែប្រែ',
+'editsection-brackets' => '[$1]',
 'editold' => 'កែប្រែ',
 'viewsourceold' => 'មើលកូដ',
 'editlink' => 'កែប្រែ',
@@ -552,6 +558,8 @@ $1',
 'site-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ $1',
 'page-rss-feed' => 'បម្រែបម្រួល RSS Feed នៃ "$1"',
 'page-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ "$1"',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (ទំព័រនេះមិនទាន់​មាននៅឡើយទេ)',
 'sort-descending' => 'តម្រៀបតាមលំដាប់ចុះ',
 'sort-ascending' => 'តម្រៀបតាមលំដាប់ឡើង',
@@ -707,6 +715,7 @@ $2',
 អ្នកបានជ្រើសមិនប្រើខូឃី។​
 
 សូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។',
 'loginsuccesstitle' => 'កត់ឈ្មោះចូលបានសំរេច',
 'loginsuccess' => "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"\$1\"។'''",
@@ -804,7 +813,7 @@ $2',
 # Special:PasswordReset
 'passwordreset' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
 'passwordreset-text' => 'បំពេញសំណុំបែបបទនេះដើម្បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីព័ត៌មានលំអិតរបស់គណនីរបស់អ្នក។',
-'passwordreset-legend' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9e¾á\9e\98',
+'passwordreset-legend' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e¶á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89',
 'passwordreset-disabled' => 'មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
 'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្នន័យខាងក្រោម}}',
 'passwordreset-username' => 'អត្តនាម៖',
@@ -1354,7 +1363,7 @@ $1",
 'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
 'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
 'prefs-personal' => 'ប្រវត្តិរូប',
-'prefs-rc' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
+'prefs-rc' => 'á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
 'prefs-watchlist' => 'បញ្ជីតាមដាន',
 'prefs-watchlist-days' => 'ចំនួនថ្ងៃត្រូវបង្ហាញក្នុងបញ្ជីតាមដាន៖',
 'prefs-watchlist-days-max' => 'អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
@@ -2276,7 +2285,7 @@ $1',
 'enotif_reset' => 'កត់សម្គាល់រាល់គ្រប់ទំព័រដែលបានចូលមើល',
 'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
 'enotif_lastvisited' => 'ពិនិត្យ $1 សម្រាប់គ្រប់បន្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយ។',
-'enotif_lastdiff' => 'សូមពិនិត្យ$1ដើម្បីមើលបន្លាស់ប្តូរនេះ។',
+'enotif_lastdiff' => 'សូមពិនិត្យ $1 ដើម្បីមើលបំលាស់ប្តូរនេះ។',
 'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
 'enotif_body' => 'ជូនចំពោះ $WATCHINGUSERNAME ជាទីរាប់អាន,
 
index d703eab..a175268 100644 (file)
@@ -428,11 +428,21 @@ MySQL ಹಿಂದಿರುಗಿಸಿದ ದೋಷ "$3: $4"',
 'cascadeprotected' => 'ಈ ಪುಟವು ಸಂಪಾದನೆ ಮಾಡಲಾಗದಂತೆ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಇದಕ್ಕೆ ಕಾರಣ ಈ ಪುಟವನ್ನು ಈ ಕೆಳಗಿನ ತಡಸಲು-ಸಂರಕ್ಷಣೆ ಅಳವಡಿಸಲಾದ {{PLURAL:$1|ಪುಟದಲ್ಲಿ|ಪುಟಗಳಲ್ಲಿ}} ಉಪಯೋಗಿಸಲಾಗಿದೆ:
 $2',
 'namespaceprotected' => "ನಿಮಗೆ '''$1''' ಪುಟಪ್ರಬೇಧಕ್ಕೆ ಸೇರಿರುವ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸುವ ಅನುಮತಿ ಇಲ್ಲ.",
+'customcssprotected' => 'ಈ ಸಿಎಸ್ಎಸ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ',
+'customjsprotected' => 'ಈ ಜಾವಾ ಸ್ಕ್ರಿಪ್ಟ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ',
 'ns-specialprotected' => 'ವಿಶೇಷ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸಲು ಆಗುವುದಿಲ್ಲ.',
 'titleprotected' => "ಈ ಹೆಸರಿನ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲಾಗದಂತೆ [[User:$1|$1]] ಅವರು ಸಂರಕ್ಷಿಸಿದ್ದಾರೆ.
 ಸಂರಕ್ಷಣೆಗೆ ನೀಡಿರುವ ಕಾರಣ: ''$2''.",
+'filereadonlyerror' => '"$1" ಕಡತವು ಓದಲು ಮಾತ್ರ ಸಾದ್ಯವಿರುವ ರೀತಿಯಲ್ಲಿರುವ"$2" ಸಂಪುಟದಲ್ಲಿರುವುದರಿಂದ ಇದನ್ನು  ಮಾರ್ಪಡಿಸಲು ಸಾದ್ಯವಾಗುತ್ತಿಲ್ಲ.
+ಇದನ್ನು ಬದ್ದಗೊಳಿಸಿರುವ ನಿರ್ವಾಹಕರು "$3" ಈ ವಿವರಣೆಯನ್ನು ನೀಡುತ್ತಿದ್ದಾರೆ.',
+'invalidtitle-knownnamespace' => '"$2"ನೇಮ್ ಸ್ಪೇಸ್ ಮತ್ತು "$3"ಪಠ್ಯದೊಂದಿಗೆ ಅಸಮಂಜಸ ತಲೆಬರಹ',
+'invalidtitle-unknownnamespace' => '$1ನೇಮ್ ಸ್ಪೇಸ್ ಮತ್ತು "$2"ಪಠ್ಯದೊಂದಿಗೆ ಅಸಮಂಜಸ ತಲೆಬರಹ',
+'exception-nologin' => 'ಲಾಗಿನ್ ಆಗಿಲ್ಲ',
+'exception-nologin-text' => 'ಈ ಪುಟ ಅಥವಾ ಚಟುವಟಿಕೆಗೆ ನೀವು ಈ ವಿಕಿಗೆ ಲಾಗಿನ್ ಆಗಿರಬೇಕಾಗಿರುತ್ತದೆ',
 
 # Virus scanner
+'virus-badscanner' => "ಅಸಮಂಜಸ ವಿನ್ಯಾಸ:ಅಪರಿಚಿತ ವೈರಸ್ ಸ್ಕಾನರ್:''$1''",
+'virus-scanfailed' => 'ಸ್ಕಾನ್ ವಿಫಲ (code $1)',
 'virus-unknownscanner' => 'ಅಪರಿಚಿತ ವೈರಾಣುನಾಶಕ:',
 
 # Login and logout pages
@@ -440,10 +450,15 @@ $2',
 
 ನೀವು {{SITENAME}} ಅನ್ನು ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹುದು, ಅಥವ ಮತ್ತೆ ಇದೇ ಹೆಸರಿನಲ್ಲಿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲ್ಲಿ <span class='plainlinks'>[$1 ಲಾಗ್ ಇನ್]</span> ಆಗಬಹುದು.
 ಗಮನಿಸಿ: ನಿಮ್ಮ ಬ್ರೌಸರ್‍ನ cache ಅನ್ನು ಅಳಿಸುವವರೆಗೂ ಕೆಲವು ಪುಟಗಳು ನೀವಿನ್ನೂ ಲಾಗ್ ಇನ್ ಆಗಿರುವಂತೆ ಪ್ರದರ್ಶಿತವಾಗಬಹುದು.",
+'welcomeuser' => 'ಸುಸ್ವಾಗತ,$1!',
+'welcomecreation-msg' => 'ನಿಮ್ಮ ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮ್ಮ [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲು ಮರೆಯಬೇಡಿ.',
 'yourname' => 'ನಿಮ್ಮ ಬಳಕೆಯ ಹೆಸರು',
 'yourpassword' => 'ನಿಮ್ಮ ಪ್ರವೇಶಪದ',
 'yourpasswordagain' => 'ಪ್ರವೇಶ ಪದ ಮತ್ತೊಮ್ಮೆ ಟೈಪ್ ಮಾಡಿ',
 'remembermypassword' => 'ಈ ಗಣಕಯಂತ್ರದಲ್ಲಿ ನನ್ನ ಲಾಗಿನ್ ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊ (ಗರಿಷ್ಠ $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
+'securelogin-stick-https' => 'ಲಾಗಿನ್ ಆದ ಬಳಿಕ HTTPS ನ ಸಂಪರ್ಕದಲ್ಲಿರಿ.',
+'yourdomainname' => 'ನಿಮ್ಮ ಕ್ಷೇತ್ರ:',
+'password-change-forbidden' => 'ನೀವು ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.',
 'login' => 'ಲಾಗ್ ಇನ್',
 'nav-login-createaccount' => 'ಲಾಗ್ ಇನ್ - log in',
 'loginprompt' => '{{SITENAME}} ತಾಣಕ್ಕೆ ಲಾಗ್ ಇನ್ ಆಗಲು ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ಕುಕೀ (cookie) ಸೌಲಭ್ಯವಿರಬೇಕು.',
index 5258d5e..597ab16 100644 (file)
@@ -1722,8 +1722,8 @@ HTML 태그를 확인하세요.',
 'nchanges' => '$1개 {{PLURAL:$1|바뀜}}',
 'recentchanges' => '최근 바뀜',
 'recentchanges-legend' => '최근 바뀜 설정',
-'recentchanges-summary' => '위키의 최근 바뀜 내역이 나와 있습니다.',
-'recentchanges-feed-description' => '위키의 최근 바뀜',
+'recentchanges-summary' => '위키의 최근 바뀜이 나와 있습니다.',
+'recentchanges-feed-description' => '위키의 최근 바뀜이 나와 있습니다.',
 'recentchanges-label-newpage' => '새로운 문서',
 'recentchanges-label-minor' => '사소한 편집',
 'recentchanges-label-bot' => '봇의 편집',
@@ -4106,8 +4106,8 @@ $5
 'sqlite-no-fts' => '$1 (본문은 찾기에서 제외)',
 
 # New logging system
-'logentry-delete-delete' => '$1 사용자가 $3 문서를 삭제했습니다.',
-'logentry-delete-restore' => '$1 사용자가 $3 문서를 복구했습니다.',
+'logentry-delete-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}.',
+'logentry-delete-restore' => '$1 사용자가 $3 문서를 {{GENDER:$2|복구했습니다}}.',
 'logentry-delete-event' => '$1 사용자가 $3의 기록 $5개에 대해 보이기 설정을 바꾸었습니다: $4',
 'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 바꾸었습니다: $4',
 'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 바꾸었습니다.',
index 574c201..46d4361 100644 (file)
@@ -598,9 +598,9 @@ $2',
 'passwordreset-emailtitle' => '{{SITENAME}} сайтдагъы тергеу джазыуну юсюнден билгиле',
 'passwordreset-emailelement' => 'Къошулуучуну аты: $1
 Болджаллы пароль: $2',
-'passwordreset-emailsent' => 'ЭÑ\81геÑ\80Ñ\82иÑ\83 e-mail ийилди.',
-'passwordreset-emailsent-capture' => 'Ийилген эсгертиу e-mail тюбюрекде берилибди.',
-'passwordreset-emailerror-capture' => 'Ийилген эсгертиу e-mail тюбюрекде берилибди, аны ашырыуу джетишимсиз болду, чурум: $1',
+'passwordreset-emailsent' => 'Ð\9fаÑ\80олÑ\8c Ð±Ð»Ð° e-mail ийилди.',
+'passwordreset-emailsent-capture' => 'Ийилген пароль эсгертиу e-mail тюбюрекде берилибди.',
+'passwordreset-emailerror-capture' => 'Ийилген пароль эсгертиу e-mail тюбюрекде берилибди, аны ашырыуу джетишимсиз болду, чурум: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Электрон почтаны адресин ауушдур',
@@ -1057,7 +1057,7 @@ $1",
 'searchprofile-articles-tooltip' => '$1 ичинде изле',
 'searchprofile-project-tooltip' => '$1 ичинде изле',
 'searchprofile-images-tooltip' => 'Файлланы изле',
-'searchprofile-everything-tooltip' => 'Бютёу бетледе изле (сюзюу бетледе да)',
+'searchprofile-everything-tooltip' => 'Бютеу бетледе изле (сюзюу бетледе да)',
 'searchprofile-advanced-tooltip' => 'Энчи ат аланладада изле',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сёз}})',
 'search-result-category-size' => '{{PLURAL:$1|1 элемент|$1 элемент}} ({{PLURAL:$2|1 тюбкатегория|$2 тюбкатегория}}, {{PLURAL:$3|1 файл|$3 файл}})',
@@ -1070,13 +1070,13 @@ $1",
 'search-interwiki-more' => '(дагъыда)',
 'search-relatedarticle' => 'Байламлы',
 'mwsuggest-disable' => 'AJAX юретиулени джукълатыгъыз',
-'searcheverything-enable' => 'Атланы бютёу аламларында изле',
+'searcheverything-enable' => 'Атланы бютеу аламларында изле',
 'searchrelated' => 'бейламлы',
-'searchall' => 'бютёу',
+'searchall' => 'бютеу',
 'showingresults' => 'Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$1</strong> {{PLURAL:$1|эсеб|эсебле}} {{PLURAL:$1|кёргюзюлгенди|кёргюзюлгендиле}}.',
 'showingresultsnum' => 'Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$3</strong> {{PLURAL:$3|эсеб|эсебле}} {{PLURAL:$3|кёргюзюлгенди|кёргюзюлгендиле}}.',
 'showingresultsheader' => "'''$4''' ючюн {{PLURAL:$5|'''$3''' эсебден '''$1'''|'''$1 — $2''' арасы '''$3''' эсеб}}",
-'nonefound' => "'''Эсгериу.''' Тынгылау бла излеу бютёу атланы аламында бардырылмайды. Бютёу атланы аламында (къошулуучуланы сюзюулери, шаблонла эмда башхала) излер ючюн аллындан ''all:'' префиксни хайырландырыгъыз неда керекли атланы аламын белгилегиз.",
+'nonefound' => "'''Эсгериу:''' тынгылау бла излеу бютеу атланы аламында бардырылмайды. Бютеу атланы аламында (къошулуучуланы сюзюулери, шаблонла эмда башхала) излер ючюн аллындан ''all:'' префиксни хайырландырыгъыз неда керекли атланы аламын белгилегиз.",
 'search-nonefound' => 'Соруу бла келишген эсеб джокъду',
 'powersearch' => 'Кенг излеу',
 'powersearch-legend' => 'Кенг излеу',
@@ -2628,14 +2628,14 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-n-recentchanges' => 'Ахыр тюрлениулени тизмеси',
 'tooltip-n-randompage' => 'Эсде болмагъан бир бетге къара',
 'tooltip-n-help' => '«{{SITENAME}}» проектге джардам этиу',
-'tooltip-t-whatlinkshere' => 'Бу бетге джибериу берген бютёу бетлени тизмеси',
+'tooltip-t-whatlinkshere' => 'Бу бетге джибериу берген бютеу бетлени тизмеси',
 'tooltip-t-recentchangeslinked' => 'Бу бет джибериуле берген бетледе ахыр тюрлениуле',
 'tooltip-feed-rss' => 'Бу битге RSS-трансляция',
 'tooltip-feed-atom' => 'Бу бетге Atom-трансляция',
 'tooltip-t-contributions' => 'Къошулуучуну тюрлендирген бетлерине къара',
 'tooltip-t-emailuser' => 'Бу къошулуучугъа письмо джибер',
 'tooltip-t-upload' => 'Файлланы джюклеу',
-'tooltip-t-specialpages' => 'Бютёу къуллукъчу бетлени тизмеси',
+'tooltip-t-specialpages' => 'Бютеу къуллукъчу бетлени тизмеси',
 'tooltip-t-print' => 'Бу бетни басмагъа версиясы',
 'tooltip-t-permalink' => 'Бетни бу версиясына дайым джибериу',
 'tooltip-ca-nstab-main' => 'Статьяны ичиндеги',
@@ -3551,18 +3551,18 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'revdelete-restricted' => 'администраторла ючюн этилген чеклениуле',
 'revdelete-unrestricted' => 'администратолра ючюн этилген чеклениуле къоратылгъандыла',
 'logentry-move-move' => '$1, $3 бетни атын $4 деб тюрлендирди',
-'logentry-move-move-noredirect' => '$1, $3 бетни атын $4 деб тюрлендирди (редирект къоймагъанлай)',
-'logentry-move-move_redir' => '$1, $3 бетни атын $4 деб тюрлендирди (редиректни башы бла)',
-'logentry-move-move_redir-noredirect' => '$1, $3 бетни атын $4 деб тюрлендирди (редиректни башы бла эм редирект къурамай)',
+'logentry-move-move-noredirect' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редирект къоймагъанлай)',
+'logentry-move-move_redir' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла)',
+'logentry-move-move_redir-noredirect' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла эм редирект къурамай)',
 'logentry-patrol-patrol' => '$1, $3 бетни $4 версияын партруль этиб чыкъды',
 'logentry-patrol-patrol-auto' => '$1, $3 бетни $4 версиясын автомат халда тинтиб чыкъды',
-'logentry-newusers-newusers' => '$1 тергеу джазыу (аккаунт) къуралды',
+'logentry-newusers-newusers' => '$1 тергеу джазыу (аккаунт) {{GENDER:$2|къуралды}}',
 'logentry-newusers-create' => '$1 тергеу джазыу (аккаунт) къуралды',
 'logentry-newusers-create2' => '$1, $3 тергеу джазыуну къурады',
 'logentry-newusers-autocreate' => '$1 тергеу джазыу автомат халда къуралды',
-'logentry-rights-rights' => '$1 къошулуучу, $3 къошулуучуну членлигин $4 къауумдан $5 къауумгъа кёчюрдю',
+'logentry-rights-rights' => '$1 къошулуучу, $3 къошулуучуну членлигин $4 къауумдан $5 къауумгъа {{GENDER:$2|кёчюрдю}}',
 'logentry-rights-rights-legacy' => '$1 къошулуучу, $3 къушулуучуну къауумлада членлигин тюрлендирди',
-'logentry-rights-autopromote' => '$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа кёчюрюлдю',
+'logentry-rights-autopromote' => '$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа {{GENDER:$2|кёчюрюлдю}}',
 'rightsnone' => '(джокъ)',
 
 # Feedback
index 578a019..4682739 100644 (file)
@@ -2388,7 +2388,7 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'logentry-newusers-newusers' => 'Ratio usoris $1 creata est',
 'logentry-newusers-create' => 'Ratio usoris $1 creata est',
 'logentry-newusers-create2' => 'Ratio usoris $3 creata est ab usore $1',
-'logentry-newusers-autocreate' => 'Ratio $1 automatice creata est',
+'logentry-newusers-autocreate' => 'Ratio usoris $1 automatice creata est',
 'rightsnone' => '(nullus)',
 
 # Search suggestions
index 988cfa0..2e6f54f 100644 (file)
@@ -663,8 +663,8 @@ Mellt Iech w.e.g. domat un, soubal Dir et kritt hutt.',
 'blocked-mailpassword' => "Déi vun Iech benotzten IP-Adress ass fir d'Ännere vu Säite gespaart. Fir Mëssbrauch ze verhënneren, gouf d'Méiglechkeet fir een neit Passwuert unzefroen och gespaart.",
 'eauthentsent' => "Eng Confirmatiouns-E-Mail gouf un déi Adress geschéckt déi Dir uginn hutt.<br />
 Ier iergendeng E-Mail vun anere Benotzer op dee Kont geschéckt ka ginn, musst Dir als éischt d'Instructiounen an der Confirmatiouns-E-Mail befollegen, fir ze bestätegen datt de Kont wierklech Ären eegenen ass.",
-'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} gouf eng Erënenrung un d'Passwuert verschéckt.
-Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Erënnerung verschéckt ginn.",
+'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} eng E-Mail verschéckt fir d'Passwuert zréckzesetzen.
+Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Mail verschéckt ginn.",
 'mailerror' => 'Feeler beim Schécke vun der E-Mail: $1',
 'acct_creation_throttle_hit' => 'Visiteure vun dëser Wiki déi Är IP-Adress hu {{PLURAL:$1|schonn $1 Benotzerkont|scho(nn) $1 Benotzerkonten}} an de leschten Deeg opgemaach, dëst ass déi maximal Zuel déi an dësem Zäitraum erlaabt ass.
 Dofir kënne Visiteure déi dës IP-Adress benotzen den Ament keng Benotzerkonten opmaachen.',
@@ -718,7 +718,7 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
 
 # Special:PasswordReset
 'passwordreset' => 'Passwuert zrécksetzen',
-'passwordreset-text' => 'Fëllt dëse Formulaire aus fir eng E-Mail Erënnerung vun den Detailer vun Ärem Benotzerkont ze kréien.',
+'passwordreset-text' => 'Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.',
 'passwordreset-legend' => 'Passwuert zrécksetzen',
 'passwordreset-disabled' => "D'Zerécksetze vum Passwuert ass op dëser Wiki ausgeschalt.",
 'passwordreset-pretext' => '{{PLURAL:$1||Gitt eng vun dësen Donnéeën an}}',
@@ -736,7 +736,7 @@ $2
 Dir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
 'passwordreset-emailelement' => 'Benotzernumm: $1
 Temporärt Passwuert: $2',
-'passwordreset-emailsent' => 'Eng Erënnerungs-Mail gouf geschéckt.',
+'passwordreset-emailsent' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt.",
 'passwordreset-emailsent-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt.",
 'passwordreset-emailerror-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt, awer de Benotzer konnt se net kréien: $1",
 
@@ -3771,8 +3771,8 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'sqlite-no-fts' => "$1 ënnerstëtzt d'Volltextsich net",
 
 # New logging system
-'logentry-delete-delete' => "$1 huet d'Säit $3 geläscht",
-'logentry-delete-restore' => "$1 huet d'Säit $3 restauréiert",
+'logentry-delete-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
+'logentry-delete-restore' => "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
 'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 geännert",
 'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 geännert",
 'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 geännert",
@@ -3792,13 +3792,13 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen",
 'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
 'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt markéiert",
-'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt markéiert",
-'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf ugeluecht',
+'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt  {{GENDER:$2|markéiert}}",
+'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
 'logentry-newusers-create' => 'De Benotzerkont $1 gouf ugeluecht',
 'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 ugeluecht',
 'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 ugeluecht an d'Passwuert gouf per E-Mail geschéckt.",
 'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch ugeluecht',
-'logentry-rights-autopromote' => "De Benotzer $1 huet d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
+'logentry-rights-autopromote' => "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
 'rightsnone' => '(keen)',
 
 # Feedback
index 42a8b46..f49b17b 100644 (file)
@@ -163,7 +163,7 @@ $messages = array(
 'vector-action-unprotect' => 'Хуьн дегишарун',
 'vector-simplesearch-preference' => 'Гегьенш жагъурунин рикIел гъун кутун (кьилди "Вектор" акунар патал)',
 'vector-view-create' => 'Туькlуьрун',
-'vector-view-edit' => 'РаÑ\81ун',
+'vector-view-edit' => 'Ð\94Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вун',
 'vector-view-history' => 'Тарихдиз килигун',
 'vector-view-view' => 'Кlелун',
 'vector-view-viewsource' => 'Чешме къалурун',
@@ -256,7 +256,7 @@ $messages = array(
 'newmessageslink' => 'цlийи чарар',
 'newmessagesdifflink' => 'Эхиримжи масакIавилер',
 'youhavenewmessagesmulti' => '"$1"-да квез цIийи чарар атанва.',
-'editsection' => 'РаÑ\81ун',
+'editsection' => 'Ð\94Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вун',
 'editold' => 'Дуьзар хъувун',
 'viewsourceold' => 'сифте кьилин коддиз килига',
 'editlink' => 'Дуьзар хъувун',
@@ -400,7 +400,7 @@ $messages = array(
 'subject' => 'Тема/кьилинцIар',
 'minoredit' => 'ГъвечIи дуьзар хъувун',
 'watchthis' => 'И ччин гуьзетун',
-'savearticle' => 'ЧÑ\8aин Ñ\85вин',
+'savearticle' => 'ЧÑ\87ин Ñ\85Ñ\83Ñ\8cн',
 'preview' => 'Сифтедин килигун',
 'showpreview' => 'Сифтедин килигун къалурун',
 'showlivepreview' => 'Фад сифтедин килигун',
@@ -595,7 +595,7 @@ $messages = array(
 
 # Preferences page
 'preferences' => 'Туькlуьрун',
-'mypreferences' => 'Zi tïķïrunar',
+'mypreferences' => 'Зи низамарунар',
 'prefs-edits' => 'Дьузар хъувунрин кьадар',
 'prefsnologin' => 'Куьне гьахьнавач',
 'changepassword' => 'Парол дегишарун',
@@ -938,7 +938,7 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'Зи вилив хуьнин сиягь',
-'mywatchlist' => 'Ð\97и Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\8eнин сиягь',
+'mywatchlist' => 'Ð\97и Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин сиягь',
 'watchlistfor2' => '$1 $2 патал',
 'addedwatchtext' => "Чар \"[[:\$1]]\" тун хъувунай куьн [[Special:Watchlist|watchlist]].                                                                                                             Къвезмай дегишунар и чарчел ва галкlанавай чарчихъ ихтилатар жеда инна, ахъатдава \"сакlус яцlу''''' инна [[Special:RecentChanges|list of recent changes]] гьам кьизил авун.",
 'removedwatchtext' => 'Чар "[[:$1]]" Идай чlурнай [[Special:Watchlist|ахтармишунин цlарар]].',
index 995fd6b..45cb9d0 100644 (file)
@@ -1600,7 +1600,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 'brokenredirects-edit' => 'labot',
 'brokenredirects-delete' => 'dzēst',
 
-'withoutinterwiki' => 'Lapas bez interwiki',
+'withoutinterwiki' => 'Lapas bez starpviki saitēm',
 'withoutinterwiki-summary' => "Šajās lapās nav saišu uz citu valodu projektiem (''interwiki''):",
 'withoutinterwiki-legend' => 'Prefikss',
 'withoutinterwiki-submit' => 'Rādīt',
index 78eee0a..ed3d6f4 100644 (file)
@@ -272,7 +272,7 @@ $1',
 'mainpage-description' => 'Palanta',
 'policy-url' => 'Project:Kabijakan',
 'portal' => 'Portal komunitas',
-'portal-url' => 'Project:Portal komunitas',
+'portal-url' => 'Portal:Komunitas',
 'privacy' => 'Kecipehan privasi',
 'privacypage' => 'Project:Kecipehan privasi',
 
index 53ed722..97adada 100644 (file)
@@ -838,7 +838,7 @@ $2',
 'blocked-mailpassword' => 'Вашата IP-адреса е блокирана за уредување, истовремено е ставена забрана за користење на функцијата за обнова на лозинка за да се спречи можноста за злоупотреба.',
 'eauthentsent' => 'На назначената адреса е испратена потврдна порака.
 Пред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.',
-'throttled-mailpassword' => 'Ð\9fоÑ\82Ñ\81еÑ\82Ñ\83ваÑ\9aе Ð·Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°Ñ\82а Ðµ Ð²ÐµÑ\9cе Ð¿Ñ\80аÑ\82ено во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.
+'throttled-mailpassword' => 'Ð\92еÑ\9cе Ðµ Ð¸Ñ\81пÑ\80аÑ\82ена Ð¿Ð¾Ñ\80ака Ð·Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°Ñ\82а во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.
 За да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.',
 'mailerror' => 'Грешка при испраќање на е-поштата: $1',
 'acct_creation_throttle_hit' => 'Корисници на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 корисничка сметка|$1 кориснички сметки}} во последниве денови, при што е достигнат максималниот број на кориснички сметки предвиден и овозможен за овој период.
@@ -892,7 +892,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Менување на лозинка',
-'passwordreset-text' => 'Пополнете го образецов за да ви испратиме потсетник за вашите најавни податоци по е-пошта.',
+'passwordreset-text' => 'Пополнете го образецов за да ја измените лозинката.',
 'passwordreset-legend' => 'Нова лозинка',
 'passwordreset-disabled' => 'На ова вики е оневозможено задавање на нова лозинка.',
 'passwordreset-pretext' => '{{PLURAL:$1||Подолу внесете еден податок}}',
@@ -902,8 +902,8 @@ $2',
 'passwordreset-capture-help' => 'Ако го штиклирате кутивчево, ќе ви се прикаже пораката (со привремената лозинка) и истата ќе му биде испратена на корисникот.',
 'passwordreset-email' => 'Е-пошта:',
 'passwordreset-emailtitle' => 'Најавни податоци за {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ð\9dекоÑ\98 (веÑ\80оÑ\98аÑ\82но Ð²Ð¸Ðµ, Ð¾Ð´ IP-адÑ\80еÑ\81аÑ\82а $1) Ð¿Ð¾Ð±Ð°Ñ\80а Ð¿Ð¾Ñ\82Ñ\81еÑ\82ник Ð½Ð° Ð²Ð°Ñ\88иÑ\82е
½Ð°Ñ\98авни Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во
+'passwordreset-emailtext-ip' => 'Ð\9dекоÑ\98 (веÑ\80оÑ\98аÑ\82но Ð²Ð¸Ðµ, Ð¾Ð´ IP-адÑ\80еÑ\81аÑ\82а $1) Ð¿Ð¾Ð±Ð°Ñ\80а Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð²Ð°Ñ\88аÑ\82а
»Ð¾Ð·Ð¸Ð½ÐºÐ° за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во
 {{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:
 
 $2
@@ -912,7 +912,7 @@ $2
 Сега треба да се најавите и да внесете нова лозинка. Ако ова барање го
 поставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате
 да ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.',
-'passwordreset-emailtext-user' => 'Ð\9aоÑ\80иÑ\81никоÑ\82 $1 Ð½Ð° {{SITENAME}} Ð¿Ð¾Ð±Ð°Ñ\80а Ð´Ð° Ð¿Ð¾Ñ\82Ñ\81еÑ\82ник Ð·Ð° Ð²Ð°Ñ\88иÑ\82е Ð½Ð°Ñ\98авни Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и на {{SITENAME}}
+'passwordreset-emailtext-user' => 'Ð\9aоÑ\80иÑ\81никоÑ\82 $1 Ð½Ð° {{SITENAME}} Ð¿Ð¾Ð±Ð°Ñ\80а Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð²Ð°Ñ\88аÑ\82а Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° на {{SITENAME}}
 ($4). Оваа е-поштенска адреса е наведена во {{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:
 
 $2
@@ -923,9 +923,9 @@ $2
 да ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.',
 'passwordreset-emailelement' => 'Корисничко име: $1
 Привремена лозинка: $2',
-'passwordreset-emailsent' => 'Испратен е потсетник по е-пошта',
-'passwordreset-emailsent-capture' => 'Испратен е потсетник по е-пошта (прикажан подолу).',
-'passwordreset-emailerror-capture' => 'Создаден е потсетник за испраќање по е-пошта (прикажан подолу), но не успеав да го испратам на корисникот: $1',
+'passwordreset-emailsent' => 'Испратено е писмо за измена на лозинката.',
+'passwordreset-emailsent-capture' => 'Испратено е писмо за измена на лозинката (прикажано подолу).',
+'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на корисникот: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Смени е-пошта',
@@ -4242,17 +4242,17 @@ $5
 'sqlite-no-fts' => '$1 без поддршка за пребарување по цели текстови',
 
 # New logging system
-'logentry-delete-delete' => '$1 ја избриша страницата $3',
-'logentry-delete-restore' => '$1 ја врати страницата $3',
-'logentry-delete-event' => '$1 ја измени видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
-'logentry-delete-revision' => '$1 ја измени видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
-'logentry-delete-event-legacy' => '$1 ја измени видливоста на настани во дневникот на $3',
-'logentry-delete-revision-legacy' => '$1 ја измени видливоста на ревизии на страницата $3',
-'logentry-suppress-delete' => '$1 ја притаи страницата $3',
-'logentry-suppress-event' => '$1 потајно ја измени видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
-'logentry-suppress-revision' => '$1 потајно ја измени видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
-'logentry-suppress-event-legacy' => '$1 потајно ја измени видливоста на настани во дневникот на $3',
-'logentry-suppress-revision-legacy' => '$1 потајно ја измени видливоста на ревизии на страницата $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ја избриша}} страницата $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|ја врати}} страницата $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ја измени}} видливоста на настаните во дневникот на $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ја измени}} видливоста на ревизиите на страницата $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ја притаи}} страницата $3',
+'logentry-suppress-event' => '$1 потајно {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
+'logentry-suppress-revision' => '$1 потајно {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
+'logentry-suppress-event-legacy' => '$1 потајно {{GENDER:$2|ја измени}} видливоста на настани во дневникот на $3',
+'logentry-suppress-revision-legacy' => '$1 потајно {{GENDER:$2|ја измени}} видливоста на ревизии на страницата $3',
 'revdelete-content-hid' => 'содржината е скриена',
 'revdelete-summary-hid' => 'описот на уредувањето е скриен',
 'revdelete-uname-hid' => 'корисничкото име е скриено',
@@ -4261,20 +4261,20 @@ $5
 'revdelete-uname-unhid' => 'корисничкото име е скриено',
 'revdelete-restricted' => 'применети ограничувања на администратори',
 'revdelete-unrestricted' => 'отстранети ограничувања за систем оператори',
-'logentry-move-move' => '$1 ја премести страницата $3 на $4',
-'logentry-move-move-noredirect' => '$1 ја премести страницата $3 на $4 без да остави пренасочување',
-'logentry-move-move_redir' => '$1 ја премести страницата $3 на $4 презапишувајќи врз пренасочување',
-'logentry-move-move_redir-noredirect' => '$1 ја премести страницата $3 на $4 презапишувајќи врз пренасочување без да остави пренасочување',
-'logentry-patrol-patrol' => '$1 ја означи ревизијата $4 на страницата $3 како испатролирана',
-'logentry-patrol-patrol-auto' => '$1 автоматски ја означи ревизијата $4 на страницата $3 како испатролирана',
-'logentry-newusers-newusers' => 'Направена е корисничката сметка $1',
-'logentry-newusers-create' => 'Направена е корисничката сметка $1',
-'logentry-newusers-create2' => 'Направена е корисничката сметка $3; создавач: $1',
-'logentry-newusers-byemail' => '$1 ја создаде корисничката сметка $3. Лозинката ви ја испративме по е-пошта',
-'logentry-newusers-autocreate' => 'СмеÑ\82каÑ\82а $1 Ðµ Ñ\81оздадена Ð°Ð²Ñ\82омаÑ\82Ñ\81ки',
-'logentry-rights-rights' => '$1 го смени групното членство за $3 од $4 во $5',
-'logentry-rights-rights-legacy' => '$1 го смени групното членство за $3',
-'logentry-rights-autopromote' => '$1 Ðµ Ð°Ð²Ñ\82омаÑ\82Ñ\81ки Ñ\83напÑ\80еден од $4 во $5',
+'logentry-move-move' => '$1 {{GENDER:$2|ја премести}} страницата $3 на $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|ја премести}} страницата $3 на $4 без да остави пренасочување',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|ја премести}} страницата $3 на $4 презапишувајќи врз пренасочување',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|ја премести}} страницата $3 на $4 презапишувајќи врз пренасочување без да остави пренасочување',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ја означи}} ревизијата $4 на страницата $3 како испатролирана',
+'logentry-patrol-patrol-auto' => '$1 автоматски {{GENDER:$2|ја означи}} ревизијата $4 на страницата $3 како испатролирана',
+'logentry-newusers-newusers' => '{{GENDER:$2|Направена}} корисничката сметка $1',
+'logentry-newusers-create' => '{{GENDER:$2|Направена}} корисничката сметка $1',
+'logentry-newusers-create2' => '{{GENDER:$2|Направена}} корисничката сметка $3 од $1',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|ја направи}} корисничката сметка $3. Лозинката ви ја испративме по е-пошта',
+'logentry-newusers-autocreate' => 'Ð\90вÑ\82омаÑ\82Ñ\81ки {{GENDER:$2|Ñ\81оздадена}} ÐºÐ¾Ñ\80иÑ\81ниÑ\87каÑ\82а Ñ\81меÑ\82ка $1',
+'logentry-rights-rights' => '$1 {{GENDER:$2|го измени}} групното членство на $3 од $4 во $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|го измени}} групното членство во $3',
+'logentry-rights-autopromote' => '$1 Ð°Ð²Ñ\82омаÑ\82Ñ\81ки {{GENDER:$2|Ñ\83напÑ\80еден|Ñ\83напÑ\80едена}} од $4 во $5',
 'rightsnone' => '(нема)',
 
 # Feedback
index 5791ba4..83a8cc4 100644 (file)
@@ -807,7 +807,7 @@ $2',
 'passwordsent' => '‘$1” എന്ന അംഗത്വത്തിനായി രജിസ്റ്റർ ചെയ്യപ്പെട്ടിട്ടുള്ള ഇമെയിൽ വിലാസത്തിലേക്ക് ഒരു പുതിയ രഹസ്യവാക്ക് അയച്ചിട്ടുണ്ട്. അത് ലഭിച്ചശേഷം ദയവായി ലോഗിൻ ചെയ്യുക.',
 'blocked-mailpassword' => 'താങ്കളുടെ ഐ.പി. വിലാസത്തെ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിട്ടുള്ളതാണ്‌. അതിനാൽ രഹസ്യവാക്ക് വീണ്ടെടുക്കുവാനുള്ള സജ്ജീകരണം ഉപയോഗിക്കുന്നതിനു താങ്കൾക്ക് അവകാശമില്ല.',
 'eauthentsent' => 'താങ്കൾ വിക്കിയിൽ ക്രമീകരിച്ചിട്ടുള്ള ഇമെയിൽ വിലാസത്തിലേക്ക് സ്ഥിരീകരണത്തിനായി ഒരു മെയിൽ അയച്ചിട്ടുണ്ട്. ഇവിടെ നിന്ന് ആ ഇമെയിൽ വിലാസത്തിലേക്ക് മറ്റൊരു മെയിൽ കൂടി അയക്കുന്നതിനു മുൻപായി, അംഗത്വം താങ്കളുടേതു തന്നെ എന്നു ഉറപ്പു വരുത്തുന്നതിനായി, ഇപ്പോൾ അയച്ചിട്ടുള്ള മെയിലിലെ നിർദ്ദേശങ്ങൾ താങ്കൾ പാലിക്കേണ്ടതാണ്.',
-'throttled-mailpassword' => 'à´\95à´´à´¿à´\9eàµ\8dà´\9e {{PLURAL:$1|മണിà´\95àµ\8dà´\95àµ\82റിനàµ\81à´³àµ\8dളിൽ |$1 à´®à´£à´¿à´\95àµ\8dà´\95àµ\82à´±àµ\81à´\95ൾà´\95àµ\8dà´\95àµ\81à´³àµ\8dളിൽ}} à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\93ർമàµ\8dമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതാനàµ\81à´³àµ\8dà´³ à´\92à´°àµ\81 à´®àµ\86യിൽ à´\85à´¯à´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fàµ\8d. à´¦àµ\81ർവിനിയàµ\8bà´\97à´\82 à´\92ഴിവാà´\95àµ\8dà´\95ാൻ {{PLURAL:$1|à´\92à´°àµ\81 à´®à´£à´¿à´\95àµ\8dà´\95àµ\82റിനàµ\81à´³àµ\8dളിൽ |$1 à´®à´£à´¿à´\95àµ\8dà´\95àµ\82à´±àµ\81à´\95ൾà´\95àµ\8dà´\95àµ\81à´³àµ\8dളിൽ}} à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\93ർമàµ\8dമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതാനàµ\81à´³àµ\8dà´³ à´\92à´°àµ\81 à´®àµ\86യിൽ à´®à´¾à´¤àµ\8dà´°à´®àµ\87 à´\85à´¨àµ\81വദിà´\95àµ\8dà´\95àµ\82.',
+'throttled-mailpassword' => 'à´\95à´´à´¿à´\9eàµ\8dà´\9e {{PLURAL:$1|മണിà´\95àµ\8dà´\95àµ\82റിനàµ\81à´³àµ\8dളിൽ |$1 à´®à´£à´¿à´\95àµ\8dà´\95àµ\82à´±àµ\81à´\95ൾà´\95àµ\8dà´\95àµ\81à´³àµ\8dളിൽ}} à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\95àµ\8dà´\95ാനàµ\81à´³àµ\8dà´³ à´\92à´°àµ\81 à´\87à´®àµ\86യിൽ à´\85à´¯à´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fàµ\8d. à´¦àµ\81à´°àµ\81പയàµ\8bà´\97à´\82 à´\92ഴിവാà´\95àµ\8dà´\95ാൻ {{PLURAL:$1|à´\92à´°àµ\81 à´®à´£à´¿à´\95àµ\8dà´\95àµ\82റിനàµ\81à´³àµ\8dളിൽ |$1 à´®à´£à´¿à´\95àµ\8dà´\95àµ\82à´±àµ\81à´\95ൾà´\95àµ\8dà´\95àµ\81à´³àµ\8dളിൽ}} à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\95àµ\8dà´\95ാനàµ\81à´³àµ\8dà´³ à´\92à´°àµ\81 à´\87à´®àµ\86യിൽ à´®à´¾à´¤àµ\8dà´°à´®àµ\87 à´\85യയàµ\8dà´\95àµ\8dà´\95àµ\81à´\95à´¯àµ\81à´³àµ\8dà´³àµ\81.',
 'mailerror' => 'മെയിൽ അയയ്ക്കുന്നതിൽ പിഴവ്: $1',
 'acct_creation_throttle_hit' => 'കഴിഞ്ഞ ഒരു ദിവസത്തിനുള്ളിൽ താങ്കളുടെ ഐ.പി. വിലാസത്തിൽ നിന്നുമുള്ള സന്ദർശകർ {{PLURAL:$1|1 അംഗത്വം|$1 അംഗത്വങ്ങൾ}} എടുത്തിട്ടുണ്ട്, പ്രസ്താവിത സമയത്തിനുള്ളിൽ എടുക്കാവുന്ന ഏറ്റവും കൂടിയ പരിധിയാണിത്.
 അതിന്റെ ഫലമായി, ഈ ഐ.പി.യിൽ നിന്നുള്ള സന്ദർശകർക്ക് ഇപ്പോൾ കൂടുതൽ അംഗത്വമെടുക്കാൻ കഴിയുന്നതല്ല.',
@@ -857,7 +857,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
-'passwordreset-text' => 'താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\85à´\82à´\97à´¤àµ\8dവവിവരà´\99àµ\8dà´\99ൾ à´¸à´\82ബനàµ\8dധിà´\9aàµ\8dà´\9a à´\93ർമàµ\8dമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽ à´\87à´®àµ\86യിൽ à´²à´­ിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.',
+'passwordreset-text' => 'രഹസàµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°ിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.',
 'passwordreset-legend' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
 'passwordreset-disabled' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കലുകൾ പ്രവർത്തരഹിതമാക്കിയിരിക്കുകയാണ്.',
 'passwordreset-pretext' => '{{PLURAL:$1||താഴെ ഒരു വിവരശകലം നൽകുക}}',
@@ -867,14 +867,14 @@ $2',
 'passwordreset-capture-help' => 'ഈ പെട്ടിയിൽ ശരി ചേർത്താൽ, ഉപയോക്താവിന് അയയ്ക്കുന്നതോടൊപ്പം ഇമെയിൽ (താത്കാലിക രഹസ്യവാക്കിനൊപ്പം) പ്രദർശിപ്പിക്കപ്പെടുന്നതാണ്.',
 'passwordreset-email' => 'ഇമെയിൽ വിലാസം:',
 'passwordreset-emailtitle' => '{{SITENAME}} സംരംഭത്തിലെ അംഗത്വവിവരങ്ങൾ',
-'passwordreset-emailtext-ip' => 'à´\86à´°àµ\8b à´\92രാൾ (മിà´\95àµ\8dà´\95വാറàµ\81à´\82 à´¤à´¾à´\99àµ\8dà´\95ളായിരിà´\95àµ\8dà´\95àµ\81à´\82, $1 à´\8eà´¨àµ\8dà´¨ à´\90.പി. à´µà´¿à´²à´¾à´¸à´¤àµ\8dതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82) {{SITENAME}} à´¸à´\82à´°à´\82à´­à´¤àµ\8dതിലàµ\86 ($4) à´\85à´\82à´\97à´¤àµ\8dവവിവരà´\99àµ\8dà´\99à´³àµ\86à´\95àµ\8dà´\95àµ\81റിà´\9aàµ\8dà´\9aàµ\81à´³àµ\8dà´³ à´\93ർമàµ\8dà´®à´\95àµ\8dà´\95àµ\81റിപàµ\8dà´ªàµ\8d അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:
+'passwordreset-emailtext-ip' => 'à´\86à´°àµ\8b à´\92രാൾ (മിà´\95àµ\8dà´\95വാറàµ\81à´\82 à´¤à´¾à´\99àµ\8dà´\95ളായിരിà´\95àµ\8dà´\95àµ\81à´\82, $1 à´\8eà´¨àµ\8dà´¨ à´\90.പി. à´µà´¿à´²à´¾à´¸à´¤àµ\8dതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82) {{SITENAME}} à´¸à´\82à´°à´\82à´­à´¤àµ\8dതിലàµ\86 ($4) à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\95àµ\8dà´\95ാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:
 
 $2
 
 
 ഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.
 താങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.',
-'passwordreset-emailtext-user' => '{{SITENAME}} à´¸à´\82à´°à´\82à´­à´¤àµ\8dതിലàµ\86 à´\89പയàµ\8bà´\95àµ\8dതാവായ $1 {{SITENAME}} à´¸à´\82à´°à´\82à´­à´¤àµ\8dതിലàµ\86 ($4) à´\85à´\82à´\97à´¤àµ\8dവവിവരà´\99àµ\8dà´\99à´³àµ\86à´\95àµ\8dà´\95àµ\81റിà´\9aàµ\8dà´\9aàµ\81à´³àµ\8dà´³ à´\93ർമàµ\8dà´®à´\95àµ\8dà´\95àµ\81റിപàµ\8dà´ªàµ\8d അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:
+'passwordreset-emailtext-user' => '{{SITENAME}} à´¸à´\82à´°à´\82à´­à´¤àµ\8dതിലàµ\86 à´\89പയàµ\8bà´\95àµ\8dതാവായ $1 {{SITENAME}} à´¸à´\82à´°à´\82à´­à´¤àµ\8dതിലàµ\86 ($4) à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\95àµ\8dà´\95ാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:
 
 $2
 
@@ -883,9 +883,9 @@ $2
 താങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.',
 'passwordreset-emailelement' => 'ഉപയോക്തൃനാമം: $1
 താത്കാലിക രഹസ്യവാക്ക്: $2',
-'passwordreset-emailsent' => 'à´\93ർമàµ\8dമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽ ഇമെയിൽ അയച്ചിട്ടുണ്ട്.',
-'passwordreset-emailsent-capture' => 'താഴàµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨, à´\93ർമàµ\8dമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽ à´\87à´®àµ\86യിൽ à´\85à´¯à´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fàµ\8d.',
-'passwordreset-emailerror-capture' => 'താഴàµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨, à´\93ർമàµ\8dമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽ à´\87à´®àµ\86യിൽ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\9aàµ\8dà´\9aàµ\81, à´ªà´\95àµ\8dà´·àµ\87 ഉപയോക്താവിന് അയയ്ക്കാൻ കഴിഞ്ഞില്ല: $1',
+'passwordreset-emailsent' => 'à´\92à´°àµ\81 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ ഇമെയിൽ അയച്ചിട്ടുണ്ട്.',
+'passwordreset-emailsent-capture' => 'രഹസàµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´\85à´¯à´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fàµ\8d, à´\85à´¤àµ\8d à´¤à´¾à´´àµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.',
+'passwordreset-emailerror-capture' => 'താഴàµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨, à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാനായàµ\86à´\99àµ\8dà´\95à´¿à´²àµ\81à´\82, ഉപയോക്താവിന് അയയ്ക്കാൻ കഴിഞ്ഞില്ല: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
@@ -3966,17 +3966,17 @@ $5
 'sqlite-no-fts' => 'പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയില്ലാത്ത $1',
 
 # New logging system
-'logentry-delete-delete' => '$3 എന്ന താൾ $1  മായ്ച്ചിരിക്കുന്നു',
-'logentry-delete-restore' => '$3 എന്ന താൾ $1  പുനഃസ്ഥാപിച്ചിരിക്കുന്നു',
-'logentry-delete-event' => '$3 എന്ന  {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1  മാറ്റിയിരിക്കുന്നു: $4',
-'logentry-delete-revision' => '$3 എന്ന താളിലെ  {{PLURAL:$5|നാൾപ്പതിപ്പിന്റെ|$5 നാൾപ്പതിപ്പുകളുടെ}} ദർശനീയത $1  മാറ്റിയിരിക്കുന്നു: $4',
-'logentry-delete-event-legacy' => '$3 എന്ന രേഖയിലെ മാറ്റങ്ങളുടെ ദർശനീയത $1 മാറ്റിയിരിക്കുന്നു',
-'logentry-delete-revision-legacy' => '$3 എന്ന താളിലെ നാൾപ്പതിപ്പുകളുടെ ദർശനീയത $1 മാറ്റിയിരിക്കുന്നു',
-'logentry-suppress-delete' => '$3 എന്ന താൾ $1  ഒതുക്കിയിരിക്കുന്നു',
-'logentry-suppress-event' => '$3 എന്ന  {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1 രഹസ്യമായി  മാറ്റിയിരിക്കുന്നു: $4',
-'logentry-suppress-revision' => '$3 എന്ന താളിലെ  {{PLURAL:$5|നാൾപ്പതിപ്പിന്റെ|$5 നാൾപ്പതിപ്പുകളുടെ}} ദർശനീയത $1 രഹസ്യമായി  മാറ്റിയിരിക്കുന്നു: $4',
-'logentry-suppress-event-legacy' => '$3 എന്ന രേഖയിലെ മാറ്റങ്ങളുടെ ദർശനീയത $1 രഹസ്യമായി മാറ്റിയിരിക്കുന്നു',
-'logentry-suppress-revision-legacy' => '$3 എന്ന താളിലെ നാൾപ്പതിപ്പുകളുടെ ദർശനീയത $1 രഹസ്യമായി മാറ്റിയിരിക്കുന്നു',
+'logentry-delete-delete' => '$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}',
+'logentry-delete-restore' => '$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}}',
+'logentry-delete-event' => '$3 എന്ന {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4',
+'logentry-delete-revision' => '$3 എന്ന താളിലെ {{PLURAL:$5|നാൾപ്പതിപ്പിന്റെ|$5 നാൾപ്പതിപ്പുകളുടെ}} ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4',
+'logentry-delete-event-legacy' => '$3 എന്ന രേഖയിലെ മാറ്റങ്ങളുടെ ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-delete-revision-legacy' => '$3 എന്ന താളിലെ നാൾപ്പതിപ്പുകളുടെ ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-suppress-delete' => '$3 എന്ന താൾ $1 {{GENDER:$2|ഒതുക്കിയിരിക്കുന്നു}}',
+'logentry-suppress-event' => '$3 എന്ന  {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1 രഹസ്യമായി {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4',
+'logentry-suppress-revision' => '$3 എന്ന താളിലെ  {{PLURAL:$5|നാൾപ്പതിപ്പിന്റെ|$5 നാൾപ്പതിപ്പുകളുടെ}} ദർശനീയത $1 രഹസ്യമായി {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4',
+'logentry-suppress-event-legacy' => '$3 എന്ന രേഖയിലെ മാറ്റങ്ങളുടെ ദർശനീയത $1 രഹസ്യമായി {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-suppress-revision-legacy' => '$3 എന്ന താളിലെ നാൾപ്പതിപ്പുകളുടെ ദർശനീയത $1 രഹസ്യമായി {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
 'revdelete-content-hid' => 'ഉള്ളടക്കം മറയ്ക്കപ്പെട്ടിരിക്കുന്നു',
 'revdelete-summary-hid' => 'തിരുത്തലിന്റെ ചുരുക്കം മറയ്ക്കപ്പെട്ടിരിക്കുന്നു',
 'revdelete-uname-hid' => 'ഉപയോക്തൃനാമം മറയ്ക്കപ്പെട്ടിരിക്കുന്നു',
@@ -3985,20 +3985,20 @@ $5
 'revdelete-uname-unhid' => 'ഉപയോക്തൃനാമം മറച്ചത് ഒഴിവാക്കിയിരിക്കുന്നു',
 'revdelete-restricted' => 'കാര്യനിർവാഹകർക്ക് പ്രവർത്തന അതിരുകൾ ഏർപ്പെടുത്തിയിരിക്കുന്നു',
 'revdelete-unrestricted' => 'കാര്യനിർവാഹകർക്ക് ഏർപ്പെടുത്തിയ പ്രവർത്തന അതിരുകൾ നീക്കം ചെയ്തിരിക്കുന്നു',
-'logentry-move-move' => '$1 എന്ന ഉപയോക്താവ് $3 എന്ന താൾ $4 എന്നാക്കി മാറ്റിയിരിക്കുന്നു',
-'logentry-move-move-noredirect' => '$3 എന്ന താൾ $4 എന്ന തലക്കെട്ടിലേയ്ക്ക് തിരിച്ചുവിടലില്ലാതെ $1 മാറ്റി',
-'logentry-move-move_redir' => '$1, $3 എന്ന താൾ $4 എന്ന താളിനു മുകളിലേയ്ക്ക് മാറ്റിയിരിക്കുന്നു',
-'logentry-move-move_redir-noredirect' => '$1, $3 എന്ന താൾ $4 എന്ന താളിനുമുകളിലേയ്ക്ക്, തിരിച്ചുവിടൽ ഇല്ലാതെ മാറ്റിയിരിക്കുന്നു',
-'logentry-patrol-patrol' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 അടയാളപ്പെടുത്തിയിരിക്കുന്നു',
-'logentry-patrol-patrol-auto' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 സ്വതേ അടയാളപ്പെടുത്തിയിരിക്കുന്നു',
-'logentry-newusers-newusers' => '$1 എന്ന ഉപയോക്തൃ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു',
-'logentry-newusers-create' => '$1 എന്ന ഉപയോക്തൃ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു',
-'logentry-newusers-create2' => '$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 സൃഷ്ടിച്ചിരിക്കുന്നു',
-'logentry-newusers-byemail' => '$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 സൃഷ്ടിച്ചിരിക്കുന്നു, രഹസ്യവാക്ക് ഇമെയിൽ വഴി അയച്ചു',
-'logentry-newusers-autocreate' => '$1 à´\8eà´¨àµ\8dà´¨ à´\85à´\82à´\97à´¤àµ\8dà´µà´\82 à´¸àµ\8dവയà´\82 à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81',
-'logentry-rights-rights' => '$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്കു മാറ്റിയിരിക്കുന്നു',
-'logentry-rights-rights-legacy' => '$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 മാറ്റിയിരിക്കുന്നു',
-'logentry-rights-autopromote' => '$1 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d $4 à´\8eà´¨àµ\8dനതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82 $5 à´\8eà´¨àµ\8dനതിലàµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d à´¸àµ\8dവയà´\82 à´\89യർതàµ\8dതിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81',
+'logentry-move-move' => '$1 എന്ന ഉപയോക്താവ് $3 എന്ന താൾ $4 എന്നാക്കി {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-move-move-noredirect' => '$3 എന്ന താൾ $4 എന്ന തലക്കെട്ടിലേയ്ക്ക് തിരിച്ചുവിടലില്ലാതെ $1 {{GENDER:$2|മാറ്റി}}',
+'logentry-move-move_redir' => '$3 എന്ന താൾ $4 എന്ന താളിനു മുകളിലേയ്ക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-move-move_redir-noredirect' => '$3 എന്ന താൾ $4 എന്ന താളിനുമുകളിലേയ്ക്ക്, $1 തിരിച്ചുവിടൽ ഇല്ലാതെ {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-patrol-patrol' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 {{GENDER:$2|അടയാളപ്പെടുത്തിയിരിക്കുന്നു}}',
+'logentry-patrol-patrol-auto' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 സ്വതേ {{GENDER:$2|അടയാളപ്പെടുത്തിയിരിക്കുന്നു}}',
+'logentry-newusers-newusers' => '$1 എന്ന ഉപയോക്തൃ അംഗത്വം {{GENDER:$2|സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു}}',
+'logentry-newusers-create' => '$1 എന്ന ഉപയോക്തൃ അംഗത്വം {{GENDER:$2|സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു}}',
+'logentry-newusers-create2' => '$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 {{GENDER:$2|സൃഷ്ടിച്ചിരിക്കുന്നു}}',
+'logentry-newusers-byemail' => '$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 {{GENDER:$2|സൃഷ്ടിച്ചിരിക്കുന്നു}}, രഹസ്യവാക്ക് ഇമെയിൽ വഴി അയച്ചു',
+'logentry-newusers-autocreate' => '$1 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´\82à´\97à´¤àµ\8dà´µà´\82 à´¸àµ\8dവയà´\82 {{GENDER:$2|à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81}}',
+'logentry-rights-rights' => '$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്കു, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-rights-rights-legacy' => '$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}',
+'logentry-rights-autopromote' => '$1 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d $4 à´\8eà´¨àµ\8dനതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82 $5 à´\8eà´¨àµ\8dനതിലàµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d à´¸àµ\8dവയമàµ\87à´µ {{GENDER:$2|à´\89യർതàµ\8dതപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81}}',
 'rightsnone' => '(ഒന്നുമില്ല)',
 
 # Feedback
@@ -4074,4 +4074,7 @@ $5
 'duration-centuries' => '{{PLURAL:$1|ഒരു നൂറ്റാണ്ട്|$1 നൂറ്റാണ്ട്}}',
 'duration-millennia' => '{{PLURAL:$1|ഒരു സഹസ്രാബ്ദം|$1 സഹസ്രാബ്ദം}}',
 
+# Image rotation
+'rotate-comment' => 'ചിത്രം പ്രദക്ഷിണദിശയിൽ {{PLURAL:$1|ഒരു ഡിഗ്രി|$1 ഡിഗ്രി}} തിരിച്ചു',
+
 );
index fd812a3..e5cc31b 100644 (file)
@@ -3805,9 +3805,9 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
 'logentry-newusers-create' => 'Il-kont $1 ġie maħluq',
 'logentry-newusers-create2' => 'Il-kont $3 ġie maħluq minn $1',
 'logentry-newusers-autocreate' => 'Il-kont $1 ġie maħluq awtomatikament',
-'logentry-rights-rights' => "$1 biddel is-sħubija ta' $3 minn $4 għal $5",
-'logentry-rights-rights-legacy' => "$1 biddel is-sħubija fil-gruppi ta' $3",
-'logentry-rights-autopromote' => '$1 ġie awtomatikament promoss minn $4 għal $5',
+'logentry-rights-rights' => "$1 {{GENDER:$2|biddel|biddlet}} is-sħubija ta' $3 minn $4 għal $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|biddel|biddlet}} is-sħubija fil-gruppi ta' $3",
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|ġie|ġiet}} awtomatikament {{GENDER:$2|promoss|promossa}} minn $4 għal $5',
 'rightsnone' => '(xejn)',
 
 # Feedback
index 10621f3..092f063 100644 (file)
@@ -792,8 +792,8 @@ og fortsette å bruke det gamle passordet.',
 Logg inn når du har mottatt det nye passordet.',
 'blocked-mailpassword' => 'IP-adressen din er blokkert fra å redigere, og for å forhindre misbruk kan du heller ikke bruke funksjonen som gir deg nytt passord.',
 'eauthentsent' => 'En bekreftelsesmelding ble sendt til gitte e-postadresse. Før andre e-poster kan sendes til kontoen må du følge instruksjonene i e-posten for å bekrefte at kontoen faktisk er din.',
-'throttled-mailpassword' => 'En passordpåminnelse ble sendt for mindre enn {{PLURAL:$1|en time|$1 timer}} siden.
-For å forhindre misbruk kan kun én passordpåminnelse sendes per {{PLURAL:$1|time|$1 timer}}.',
+'throttled-mailpassword' => 'En passordtilbakestillingsepost har allerede blitt sendt for mindre enn {{PLURAL:$1|en time|$1 timer}} siden.
+For å forhindre misbruk kan kun én passordtilbakestillingsepost sendes per {{PLURAL:$1|time|$1 timer}}.',
 'mailerror' => 'Feil under sending av e-post: $1',
 'acct_creation_throttle_hit' => 'Gjester med samme IP-adresse som deg har opprettet {{PLURAL:$1|én konto|$1 kontoer}} det siste døgnet, og det er ikke tillatt å opprette flere.
 Som et resultat kan det ikke opprettes flere kontoer fra denne IP-adressen.',
@@ -842,7 +842,7 @@ Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.'
 
 # Special:PasswordReset
 'passwordreset' => 'Passordresetting',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å motta en påminnelse om kontoopplysningene dine i en e-post.',
+'passwordreset-text' => 'Fyll ut dette skjemaet for å tilbakestille passordet ditt.',
 'passwordreset-legend' => 'Nullstill passord',
 'passwordreset-disabled' => 'Nullstilling av passord er deaktivert på denne wikien.',
 'passwordreset-pretext' => '{{PLURAL:$1||Skriv inn en av datadelene nedenfor}}',
@@ -852,8 +852,7 @@ Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.'
 'passwordreset-capture-help' => 'Hvis du krysser av her, vil du se e-posten (med foreløpig passord) i tillegg til at den blir sendt til brukeren.',
 'passwordreset-email' => 'E-postadresse:',
 'passwordreset-emailtitle' => 'Kontodetaljer på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Noen (sannsynligvis deg fra IP-adressen $1) ba om en påminnelse om dine
-kontodetaljer for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er
+'passwordreset-emailtext-ip' => 'Noen (sannsynligvis deg fra IP-adressen $1) ba om en tilbakestilling av ditt passord for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er
 tilknyttet denne e-postadressen:
 
 $2
@@ -863,7 +862,7 @@ Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
 forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
 ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
 passord.',
-'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en påminnelse om kontodetaljene dine for {{SITENAME}}
+'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en tilbakestilling av passordet ditt for {{SITENAME}}
 ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:
 
 $2
@@ -875,9 +874,9 @@ forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenge
 passord.',
 'passwordreset-emailelement' => 'Brukernavn: $1
 Midlertidig passord: $2',
-'passwordreset-emailsent' => 'En påminnelse har blitt sendt på e-post.',
-'passwordreset-emailsent-capture' => 'E-posten under er sendt ut som en påminnelse.',
-'passwordreset-emailerror-capture' => 'E-posten, som du ser under, ble forsøkt sendt til brukeren, men dette mislyktes: $1',
+'passwordreset-emailsent' => 'En passordtilbakestillingslenke har blitt sendt per e-post.',
+'passwordreset-emailsent-capture' => 'Passordtilbakestillingseposten vist under har blitt sendt ut.',
+'passwordreset-emailerror-capture' => 'En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til brukeren: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Endre e-postadresse',
@@ -3979,17 +3978,17 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 'sqlite-no-fts' => '$1 uten støtte for fulltekstsøk',
 
 # New logging system
-'logentry-delete-delete' => '$1 slettet siden $3',
-'logentry-delete-restore' => '$1 gjenopprettet siden $3',
-'logentry-delete-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-delete-revision' => '$1 endret synlighet av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4',
-'logentry-delete-event-legacy' => '$1 endret synlighet av loggede hendelser på $3',
-'logentry-delete-revision-legacy' => '$1 endret synlighet av revisjoner på side $3',
-'logentry-suppress-delete' => '$1 skjult side $3',
-'logentry-suppress-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-suppress-revision' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-suppress-event-legacy' => '$1 endret skjult synligheten av loggede hendelser på $3',
-'logentry-suppress-revision-legacy' => '$1 endret skjult synligheten av revisjoner på side $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|slettet}} siden $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|gjenopprettet}} siden $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|endret}} synligheten av logghendelser på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|endret}} synligheten av revisjoner på siden $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|skjulte}} siden $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|endret}} diskré synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|endret}} diskré synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|endret}} diskré synligheten av logghendelser på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|endret}} diskré synligheten av revisjoner på siden $3',
 'revdelete-content-hid' => 'innhold skjult',
 'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
 'revdelete-uname-hid' => 'brukernavn skjult',
@@ -3998,20 +3997,20 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 'revdelete-uname-unhid' => 'brukernavn synlig',
 'revdelete-restricted' => 'begrensninger gjelder også administratorer',
 'revdelete-unrestricted' => 'fjernet begrensninger for administratorer',
-'logentry-move-move' => '$1 flyttet siden $3 til $4',
-'logentry-move-move-noredirect' => '$1 flyttet siden $3 til $4 uten å etterlate en omdirigering',
-'logentry-move-move_redir' => '$1 flyttet siden $3 til $4 over en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttet siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
-'logentry-patrol-patrol' => '$1 markerte revisjon $4 av siden $3 som patruljert',
-'logentry-patrol-patrol-auto' => '$1 markerte automatisk revisjon $4 av siden $3 som patruljert',
-'logentry-newusers-newusers' => 'Kontoen $1 ble opprettet',
-'logentry-newusers-create' => 'Kontoen $1 ble opprettet',
-'logentry-newusers-create2' => 'Kontoen $3 ble opprettet av $1',
-'logentry-newusers-byemail' => 'Kontoen $3 ble opprettet av $1 og passordet sendt med e-post',
-'logentry-newusers-autocreate' => 'Konto $1 ble opprettet automatisk',
-'logentry-rights-rights' => '$1 endret gruppemedlemskap for $3 fra $4 til $5',
-'logentry-rights-rights-legacy' => '$1 endret gruppemedlemskap for $3',
-'logentry-rights-autopromote' => '$1 ble automatisk forfremmet fra $4 til $5',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 uten å etterlate en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerte}} revisjon $4 av siden $3 som patruljert',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerte}} automatisk revisjon $4 av siden $3 som patruljert',
+'logentry-newusers-newusers' => 'Brukerkontoen $1 ble {{GENDER:$2|opprettet}}',
+'logentry-newusers-create' => 'Brukerkontoen $1 ble {{GENDER:$2|opprettet}}',
+'logentry-newusers-create2' => 'Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1',
+'logentry-newusers-byemail' => 'Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1 og passordet ble sendt per e-post',
+'logentry-newusers-autocreate' => 'Brukerkontoen $1 ble automatisk {{GENDER:$2|opprettet}}',
+'logentry-rights-rights' => '$1 {{GENDER:$2|endret}} gruppemedlemskap for $3 fra $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|endret}} gruppemedlemskap for $3',
+'logentry-rights-autopromote' => '$1 ble automatisk {{GENDER:$2|forfremmet}} fra $4 til $5',
 'rightsnone' => '(ingen)',
 
 # Feedback
index b6e650b..e5e57aa 100644 (file)
@@ -835,7 +835,7 @@ Być może właśnie zmienił{{GENDER:|eś|aś|eś(‐aś)}} swoje hasło lub po
 
 # Special:PasswordReset
 'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'Wypełnij formularz, aby otrzymać e‐mail z przypomnieniem danych Twojego konta.',
+'passwordreset-text' => 'Wypełnij formularz, aby zresetować swoje hasło.',
 'passwordreset-legend' => 'Zresetuj hasło',
 'passwordreset-disabled' => 'Na tej wiki wyłączono możliwość resetowania haseł.',
 'passwordreset-pretext' => '{{PLURAL:$1||Wprowadź jedną z danych poniżej}}',
@@ -845,13 +845,13 @@ Być może właśnie zmienił{{GENDER:|eś|aś|eś(‐aś)}} swoje hasło lub po
 'passwordreset-capture-help' => 'Jeśli zaznaczysz to pole, zobaczysz treść wiadomości e‐mail z tymczasowym hasłem, w tej samej formie w jakiej jest wysyłana do użytkownika.',
 'passwordreset-email' => 'Adres e‐mail',
 'passwordreset-emailtitle' => 'Dane konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Ktoś (prawdopodobnie Ty, spod adresu IP $1) poprosił o przypomnienie szczegółów dotyczących Twojego konta w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}
+'passwordreset-emailtext-ip' => 'Ktoś (prawdopodobnie Ty, spod adresu IP $1) poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}
 
 $2
 
 {{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.
 Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inni poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chce go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystał ze swojego starego hasła.',
-'passwordreset-emailtext-user' => 'Użytkownik $1 poprosił o przypomnienie szczegółów dotyczących Twojego konta w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}
+'passwordreset-emailtext-user' => 'Użytkownik $1 poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}
 
 $2
 
@@ -859,9 +859,9 @@ $2
 Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inni poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chce go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystał ze swojego starego hasła.',
 'passwordreset-emailelement' => 'Nazwa użytkownika – $1
 Tymczasowe hasło – $2',
-'passwordreset-emailsent' => 'Przypominający e‐mail został wysłany.',
-'passwordreset-emailsent-capture' => 'Poniżej znajdujący się e‐mail z przypomnieniem został wysłany',
-'passwordreset-emailerror-capture' => 'Poniżej wyświetlony e‐mail z przypomnieniem został wygenerowany, ale nie udało się wysłać go do użytkownika: $1',
+'passwordreset-emailsent' => 'E‐mail pozwalający na zresetowanie hasła został wysłany.',
+'passwordreset-emailsent-capture' => 'Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.',
+'passwordreset-emailerror-capture' => 'Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do użytkownika: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Zmiana adresu e‐mail',
@@ -1344,7 +1344,7 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'search-interwiki-default' => 'Wyniki dla $1:',
 'search-interwiki-more' => '(więcej)',
 'search-relatedarticle' => 'Pokrewne',
-'mwsuggest-disable' => 'Wyłącz dynamiczne podpowiedzi',
+'mwsuggest-disable' => 'Wyłącz podpowiedzi wyszukiwania',
 'searcheverything-enable' => 'Szukaj we wszystkich przestrzeniach nazw',
 'searchrelated' => 'pokrewne',
 'searchall' => 'wszystkie',
@@ -2093,6 +2093,10 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
 a powinny odwoływać się bezpośrednio do stron treści.<br />
 Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany przez stronę [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Strony z właściwościami',
+'pageswithprop-legend' => 'Strony z właściwościami',
+'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
+
 'doubleredirects' => 'Podwójne przekierowania',
 'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
 Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.
index 73b7c2f..21aa249 100644 (file)
@@ -44,6 +44,7 @@
  * @author RmSilva
  * @author Rodrigo Calanca Nishino
  * @author SandroHc
+ * @author Sarilho1
  * @author Sir Lestaty de Lioncourt
  * @author Sérgio Ribeiro
  * @author Teles
@@ -445,6 +446,7 @@ $messages = array(
 'newwindow' => '(abre numa janela nova)',
 'cancel' => 'Cancelar',
 'moredotdotdot' => 'Mais...',
+'morenotlisted' => 'Mais não listadas...',
 'mypage' => 'Página',
 'mytalk' => 'Discussão',
 'anontalk' => 'Discussão para este IP',
@@ -791,8 +793,8 @@ Volte a autenticar-se após recebê-la, por favor.',
 'blocked-mailpassword' => 'O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-chave, para prevenir o uso abusivo.',
 'eauthentsent' => 'Foi enviada uma mensagem de confirmação para o endereço de correio electrónico que elegeu.
 Antes que seja enviada qualquer outra mensagem para a conta, terá de seguir as instruções na mensagem enviada, de modo a confirmar que a conta lhe pertence.',
-'throttled-mailpassword' => 'Já foi enviada uma recuperação de palavra-chave {{PLURAL:$1|na última hora|nas últimas $1 horas}}.
-Para prevenir abusos, só uma recuperação pode ser enviada a cada {{PLURAL:$1|hora|$1 horas}}.',
+'throttled-mailpassword' => 'Já foi enviada um email de recuperação de palavra-chave {{PLURAL:$1|na última hora|nas últimas $1 horas}}.
+Para prevenir abusos, só um email de recuperação de palavra-chave pode ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.',
 'mailerror' => 'Erro ao enviar correio: $1',
 'acct_creation_throttle_hit' => 'Visitantes desta wiki com o seu endereço IP criaram $1 {{PLURAL:$1|conta|contas}} no último dia, o que é o máximo permitido neste período de tempo.
 Em resultado, visitantes com este endereço IP não podem criar mais nenhuma conta neste momento.',
@@ -844,7 +846,7 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
 
 # Special:PasswordReset
 'passwordreset' => 'Repor palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta por correio electrónico.',
+'passwordreset-text' => 'Preencha este formulário para repor a sua palavra-passe.',
 'passwordreset-legend' => 'Reiniciar a palavra-chave',
 'passwordreset-disabled' => 'O reinício da palavra-chave foi impossibilitado nesta wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
index c21bb29..14f8b25 100644 (file)
@@ -1255,7 +1255,7 @@ See also:
 * {{msg-mw|Passwordreset-emailsent}}
 * {{msg-mw|Passwordreset-emailerror-capture}}',
 'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an e-mail fails. Parameters:
-* $1 - the name of a user who was supposed to get the e-mail
+* $1 - error message
 See also:
 * {{msg-mw|Passwordreset-emailsent}}
 * {{msg-mw|Passwordreset-emailsent-capture}}',
index 8fbc85b..5aacdd2 100644 (file)
@@ -3958,17 +3958,17 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'sqlite-no-fts' => '$1 fără suport de căutare în tot textul',
 
 # New logging system
-'logentry-delete-delete' => '$1 a șters pagina $3',
-'logentry-delete-restore' => '$1 a restaurat pagina $3',
-'logentry-delete-event' => '$1 a schimbat vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} în $3: $4',
-'logentry-delete-revision' => '$1 a schimbat vizibilitatea {{PLURAL:$5|unei modificări|a $5 modificări|a $5 de modificări}} din pagina $3: $4',
-'logentry-delete-event-legacy' => '$1 a modificat vizibilitatea evenimentelor din jurnal în $3',
-'logentry-delete-revision-legacy' => '$1 a modificat vizibilitatea modificărilor de pe pagina $3',
-'logentry-suppress-delete' => '$1 a suprimat pagina $3',
-'logentry-suppress-event' => '$1 a modificat în mod secret vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} în $3: $4',
-'logentry-suppress-revision' => '$1 a modificat în mod secret vizibilitatea {{PLURAL:$5|unei modificări|a $5 modificări|a $5 de modificări}} din pagina $3: $4',
-'logentry-suppress-event-legacy' => '$1 a modificat în mod secret vizibilitatea evenimentelor din jurnal în $3',
-'logentry-suppress-revision-legacy' => '$1 a modificat în mod secret vizibilitatea modificărilor de pe pagina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|a șters}} pagina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|a restaurat}} pagina $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} pentru $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unei versiuni|a $5 versiuni|a $5 de versiuni}} pentru pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|a modificat}} vizibilitatea evenimentelor din jurnal pentru $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|a modificat}} vizibilitatea unor versiuni ale paginii $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|a suprimat}} pagina $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|a modificat}} în mod secret vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} pentru $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|a schimbat}} în mod secret vizibilitatea {{PLURAL:$5|unei versiuni|a $5 versiuni|a $5 de versiuni}} pentru pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|a modificat}} în mod secret vizibilitatea evenimentelor din jurnal pentru $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|a modificat}} în mod secret vizibilitatea versiunilor pentru pagina $3',
 'revdelete-content-hid' => 'conținut ascuns',
 'revdelete-summary-hid' => 'descrierea modificării ascunsă',
 'revdelete-uname-hid' => 'nume de utilizator ascuns',
@@ -3977,20 +3977,20 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'revdelete-uname-unhid' => 'numele de utilizator afișat',
 'revdelete-restricted' => 'restricții aplicate administratorilor',
 'revdelete-unrestricted' => 'restricții eliminate pentru administratori',
-'logentry-move-move' => '$1 a redenumit pagina $3 în $4',
-'logentry-move-move-noredirect' => '$1 a redenumit pagina $3 în $4 fără a lăsa o redirecționare în loc',
-'logentry-move-move_redir' => '$1 a redenumit pagina $3 în $4 înlocuind redirecționarea',
-'logentry-move-move_redir-noredirect' => '$1 a redenumit pagina $3 în $4 înlocuind redirecționarea și fără a lăsa o redirecționare în loc',
-'logentry-patrol-patrol' => '$1 a marcat versiunea $4 a paginii $3 ca patrulată',
-'logentry-patrol-patrol-auto' => '$1 a marcat automat versiunea $4 a paginii $3 ca patrulată',
-'logentry-newusers-newusers' => 'Contul de utilizator $1 a fost creat',
-'logentry-newusers-create' => 'Contul de utilizator $1 a fost creat',
-'logentry-newusers-create2' => 'Contul de utilizator $3 a fost creat de către $1',
-'logentry-newusers-byemail' => 'Contul de utilizator $3 a fost creat de către $1, iar parola a fost trimisă prin e-mail',
-'logentry-newusers-autocreate' => 'Contul $1 a fost creat în mod automat',
-'logentry-rights-rights' => '$1 a schimbat apartenența la grup pentru $3 de la $4 la $5',
-'logentry-rights-rights-legacy' => '$1 a schimbat apartenența la grup pentru $3',
-'logentry-rights-autopromote' => '$1 a fost promovat în mod automat de la $4 la $5',
+'logentry-move-move' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4 fără a lăsa o redirecționare în loc',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4 înlocuind redirecționarea',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4 înlocuind redirecționarea și fără a lăsa o redirecționare în loc',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|a marcat}} versiunea $4 a paginii $3 ca patrulată',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|a marcat}} automat versiunea $4 a paginii $3 ca patrulată',
+'logentry-newusers-newusers' => 'Contul de utilizator $1 a fost {{GENDER:$2|creat}}',
+'logentry-newusers-create' => 'Contul de utilizator $1 a fost {{GENDER:$2|creat}}',
+'logentry-newusers-create2' => 'Contul de utilizator $3 a fost {{GENDER:$2|creat}} de către $1',
+'logentry-newusers-byemail' => 'Contul de utilizator $3 a fost {{GENDER:$2|creat}} de către $1, iar parola a fost trimisă prin e-mail',
+'logentry-newusers-autocreate' => 'Contul de utilizator $1 a fost {{GENDER:$2|creat}} în mod automat',
+'logentry-rights-rights' => '$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3 de la $4 la $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5',
 'rightsnone' => '(niciunul)',
 
 # Feedback
index a6abf43..12057d0 100644 (file)
@@ -3987,17 +3987,17 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'sqlite-no-fts' => "$1 senze 'u supporte d'a ricerche full-text",
 
 # New logging system
-'logentry-delete-delete' => '$1 pàgena scangellate $3',
-'logentry-delete-restore' => '$1 pàgena repristinate $3',
-'logentry-delete-event' => "$1 cangiate 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
-'logentry-delete-revision' => "$1 cangiate 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
-'logentry-delete-event-legacy' => "$1 cangiate 'a vesibbilità d'u archivije de le fatte sus 'a $3",
-'logentry-delete-revision-legacy' => "$1 cangiate 'a vesibbilità de le revisiune sus 'a pàgene $3",
-'logentry-suppress-delete' => '$1 pàgena soppresse $3',
-'logentry-suppress-event' => "$1 a scunnute cangiate 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
-'logentry-suppress-revision' => "$1 a scunnute cangiate 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
-'logentry-suppress-event-legacy' => "$1 a scunnute cangiate 'a vesibbilità d'u archivije de le fatte sus 'a $3",
-'logentry-suppress-revision-legacy' => "$1 a scunnute cangiate 'a vesibbilità de le revisiune sus 'a pàgene $3",
+'logentry-delete-delete' => '$1 pàgena {{GENDER:$2|scangellate}} $3',
+'logentry-delete-restore' => '$1 pàgena {{GENDER:$2|repristinate}} $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
+'logentry-delete-event-legacy' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità d'u archivije de le fatte sus 'a $3",
+'logentry-delete-revision-legacy' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità de le revisiune sus 'a pàgene $3",
+'logentry-suppress-delete' => '$1 pàgena {{GENDER:$2|soppresse}} $3',
+'logentry-suppress-event' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
+'logentry-suppress-revision' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
+'logentry-suppress-event-legacy' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità d'u archivije de le fatte sus 'a $3",
+'logentry-suppress-revision-legacy' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità de le revisiune sus 'a pàgene $3",
 'revdelete-content-hid' => 'condenute scunnute',
 'revdelete-summary-hid' => "riepileghe d'u cangiamende scunnute",
 'revdelete-uname-hid' => "nome de l'utende scunnute",
@@ -4006,20 +4006,20 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'revdelete-uname-unhid' => "nome de l'utende fatte vedè",
 'revdelete-restricted' => 'appliche le restriziune a le SysOps',
 'revdelete-unrestricted' => 'live le restriziune a le SysOps',
-'logentry-move-move' => '$1 pàgena spustate $3 a $4',
-'logentry-move-move-noredirect' => "$1 pàgena spustate $3 a $4 senze lassà 'nu redirezionamende",
-'logentry-move-move_redir' => "$1 pàgena spustate $3 a $4 cu 'u redirezionamende",
-'logentry-move-move_redir-noredirect' => "$1 pàgena spustate $3 a $4 sus a 'nu redirezionamende senze lassà 'nu redirezionamende",
-'logentry-patrol-patrol' => '$1 revisione marcate $4 de pàgene condrollate $3',
-'logentry-patrol-patrol-auto' => '$1 automaticamende revisione marcate $4 de pàgene condrollate $3',
-'logentry-newusers-newusers' => "'U cunde utende $1 ha state ccrejate",
-'logentry-newusers-create' => "'U cunde utende $1 ha state ccrejate",
-'logentry-newusers-create2' => "$1 {{GENDER:$2|ccrejate}} {{GENDER:$4|'nu cunde utende}} $3",
-'logentry-newusers-byemail' => "'U cunde utende $3 ha state ccrejate da $1 e 'a passuord ha state mannate pe e-mail",
-'logentry-newusers-autocreate' => "'U cunde utende $1 ha state ccrejate automaticamende",
-'logentry-rights-rights' => "$1 membre d'u gruppe cangiate pe $3 da $4 a $5",
-'logentry-rights-rights-legacy' => "$1 ave cangiate 'u membre d'u gruppe pe $3",
-'logentry-rights-autopromote' => '$1 ha state promosse automaticamende da $4 a $5',
+'logentry-move-move' => '$1 pàgena {{GENDER:$2|spustate}} $3 a $4',
+'logentry-move-move-noredirect' => "$1 pàgena {{GENDER:$2|spustate}} $3 a $4 senze lassà 'nu redirezionamende",
+'logentry-move-move_redir' => "$1 pàgena {{GENDER:$2|spustate}} $3 a $4 cu 'u redirezionamende",
+'logentry-move-move_redir-noredirect' => "$1 pàgena {{GENDER:$2|spustate}} $3 a $4 sus a 'nu redirezionamende senze lassà 'nu redirezionamende",
+'logentry-patrol-patrol' => '$1 revisione {{GENDER:$2|signate}} $4 de pàgene condrollate $3',
+'logentry-patrol-patrol-auto' => '$1 automaticamende revisione {{GENDER:$2|signate}} $4 de pàgene condrollate $3',
+'logentry-newusers-newusers' => "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}}",
+'logentry-newusers-create' => "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}}",
+'logentry-newusers-create2' => "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1",
+'logentry-newusers-byemail' => "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1 e 'a passuord ha state mannate pe e-mail",
+'logentry-newusers-autocreate' => "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}} automaticamende",
+'logentry-rights-rights' => "$1 membre d'u gruppe {{GENDER:$2|cangiate}} pe $3 da $4 a $5",
+'logentry-rights-rights-legacy' => "$1 ave {{GENDER:$2|cangiate}} 'u membre d'u gruppe pe $3",
+'logentry-rights-autopromote' => '$1 ha state {{GENDER:$2|promosse}} automaticamende da $4 a $5',
 'rightsnone' => '(ninde)',
 
 # Feedback
index 8d91ebf..6e51710 100644 (file)
@@ -2285,8 +2285,8 @@ $1',
 'notargettext' => 'Вы не указали целевую страницу или участника для этого действия.',
 'nopagetitle' => 'Нет такой целевой страницы',
 'nopagetext' => 'Указанной целевой страницы не существует.',
-'pager-newer-n' => '{{PLURAL:$1|более новая|более новые|более новых}} $1',
-'pager-older-n' => '{{PLURAL:$1|более старая|более старые|более старых}} $1',
+'pager-newer-n' => '$1 {{PLURAL:$1|более новая|более новые|более новых}}',
+'pager-older-n' => '$1 {{PLURAL:$1|более старая|более старые|более старых}}',
 'suppress' => 'Сокрытие',
 'querypage-disabled' => 'Эта спецстраница отключена для повышения производительности.',
 
index 726b025..06b5763 100644 (file)
@@ -3880,17 +3880,17 @@ Ta stran se sooča s tehničnimi težavami.',
 'sqlite-no-fts' => '$1 brez podpore iskanju polnih besedil',
 
 # New logging system
-'logentry-delete-delete' => '$1 je izbrisal(-a) stran $3',
-'logentry-delete-restore' => '$1 je obnovil(-a) stran $3',
-'logentry-delete-event' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
-'logentry-delete-revision' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
-'logentry-delete-event-legacy' => '$1 je spremenil(-a) vidljivost dnevniških dogodkov na $3',
-'logentry-delete-revision-legacy' => '$1 je spremenil(-a) vidljivost redakcij na strani $3',
-'logentry-suppress-delete' => '$1 je zatrl(-a) stran $3',
-'logentry-suppress-event' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
-'logentry-suppress-revision' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
-'logentry-suppress-event-legacy' => '$1 je skrivaj spremenil(-a) vidljivost dnevniških dogodkov na $3',
-'logentry-suppress-revision-legacy' => '$1 je skrivaj spremenil(-a) vidljivost redakcij na strani $3',
+'logentry-delete-delete' => '$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3',
+'logentry-delete-restore' => '$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3',
+'logentry-delete-event' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-delete-revision' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-delete-event-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3',
+'logentry-delete-revision-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost redakcij na strani $3',
+'logentry-suppress-delete' => '$1 je {{GENDER:$2|zatrl|zatrla|zatrl(-a)}} stran $3',
+'logentry-suppress-event' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-suppress-revision' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-suppress-event-legacy' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3',
+'logentry-suppress-revision-legacy' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost redakcij na strani $3',
 'revdelete-content-hid' => 'vsebina je skrita',
 'revdelete-summary-hid' => 'povzetek urejanja je skrit',
 'revdelete-uname-hid' => 'uporabniško ime je skrito',
@@ -3899,20 +3899,20 @@ Ta stran se sooča s tehničnimi težavami.',
 'revdelete-uname-unhid' => 'uporabniško ime je ponovno prikazano',
 'revdelete-restricted' => 'uveljavljene omejitve administratorjev',
 'revdelete-unrestricted' => 'odstranjene omejitve administratorjev',
-'logentry-move-move' => '$1 je premaknil(-a) stran $3 na $4',
-'logentry-move-move-noredirect' => '$1 je premaknil(-a) stran $3 na $4 brez preusmeritve',
-'logentry-move-move_redir' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve',
-'logentry-move-move_redir-noredirect' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve in brez preusmeritve',
-'logentry-patrol-patrol' => '$1 je označil(-a) redakcijo $4 strani $3 kot nadzorovano',
-'logentry-patrol-patrol-auto' => '$1 je samodejno označil(-a) redakcijo $4 strani $3 kot nadzorovano',
-'logentry-newusers-newusers' => '$1 je ustvaril(-a) uporabniški račun',
-'logentry-newusers-create' => '$1 je ustvaril(-a) uporabniški račun',
-'logentry-newusers-create2' => '$1 je ustvaril(-a) uporabniški račun $3',
+'logentry-move-move' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4',
+'logentry-move-move-noredirect' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 brez preusmeritve',
+'logentry-move-move_redir' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 prek preusmeritve',
+'logentry-move-move_redir-noredirect' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 prek preusmeritve in brez preusmeritve',
+'logentry-patrol-patrol' => '$1 je {{GENDER:$2|označil|označila|označil(-a)}} redakcijo $4 strani $3 kot nadzorovano',
+'logentry-patrol-patrol-auto' => '$1 je samodejno {{GENDER:$2|označil|označila|označil(-a)}} redakcijo $4 strani $3 kot nadzorovano',
+'logentry-newusers-newusers' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun',
+'logentry-newusers-create' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun',
+'logentry-newusers-create2' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3',
 'logentry-newusers-byemail' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3; geslo je bilo poslano po e-pošti',
-'logentry-newusers-autocreate' => 'Račun $1 je bil samodejno ustvarjen',
-'logentry-rights-rights' => '$1 je spremenil(-a) članstvo skupine $3 z $4 na $5',
-'logentry-rights-rights-legacy' => '$1 je spremenil(-a) članstvo skupine $3',
-'logentry-rights-autopromote' => '$1 je bil(-a) samodejno povišan(-a) z $4 na $5',
+'logentry-newusers-autocreate' => 'Račun $1 je bil samodejno {{GENDER:$2|ustvarjen}}',
+'logentry-rights-rights' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $3 z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $3',
+'logentry-rights-autopromote' => '$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5',
 'rightsnone' => '(nobeno)',
 
 # Feedback
index 36e0bb8..1a9216a 100644 (file)
@@ -844,7 +844,7 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
 'group-sysop-member' => '{{GENDER:$1|maamulaha}}',
 
 'grouppage-user' => '{{ns:project}}:Isticmaalada',
-'grouppage-autoconfirmed' => '{{ns:project}}:Gude gale la hubiyey si iskeeda ah',
+'grouppage-autoconfirmed' => '{{ns:project}}:Adeegsade la hubiyey',
 'grouppage-sysop' => '{{ns:project}}:Maamulada',
 
 # Rights
index 21438e3..2045b18 100644 (file)
@@ -30,6 +30,7 @@
  * @author M.M.S.
  * @author MagnusA
  * @author Micke
+ * @author Mikez
  * @author NH
  * @author Najami
  * @author Nghtwlkr
@@ -2892,7 +2893,7 @@ I det senare fallet kan du även använda en länk, exempel [[{{#Special:Export}
 'exportcuronly' => 'Inkludera endast den nuvarande versionen, inte hela historiken',
 'exportnohistory' => "----
 '''OBS:''' export av fullständig sidhistorik med hjälp av detta formulär har stängts av på grund av prestandaskäl.",
-'exportlistauthors' => 'Innehålla en fullständig lista över bidragsgivare för varje sida',
+'exportlistauthors' => 'Inkludera en fullständig lista över bidragsgivare för varje sida',
 'export-submit' => 'Exportera',
 'export-addcattext' => 'Lägg till sidor från kategori:',
 'export-addcat' => 'Lägg till',
index 4b7c588..2fae26a 100644 (file)
@@ -10,6 +10,7 @@
  * @author Aswn
  * @author Balajijagadesh
  * @author Caliberoviv
+ * @author ElangoRamanujam
  * @author Kaganer
  * @author Kanags
  * @author Karthi.dr
@@ -574,6 +575,7 @@ MySQL returned error "$3: $4".',
 # Email sending
 'php-mail-error-unknown' => "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
 'user-mail-no-addy' => 'மின்னஞ்சல் முகவரி இல்லாமல் மின்னஞ்சல் அனுப்ப முயற்சித்தது.',
+'user-mail-no-body' => 'வெற்று அல்லது மிகவும் சிறிய அளவுள்ள மின்னஞ்சலை அனுப்ப முயற்சித்துள்ளீர்.',
 
 # Change password dialog
 'resetpass' => 'கடவுச்சொல்லை மாற்றியமை',
@@ -594,7 +596,7 @@ MySQL returned error "$3: $4".',
 
 # Special:PasswordReset
 'passwordreset' => 'கடவுச்சொல்லை மீட்டமை',
-'passwordreset-text' => ' à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95ணà®\95à¯\8dà®\95à¯\81 à®µà®¿à®µà®°à®\99à¯\8dà®\95ளà¯\88 à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®¨à®¿à®©à¯\88வà¯\81பà®\9fà¯\81தà¯\8dதி à®®à¯\82லமாà®\95 à®ªà¯\86à®± à®\87நà¯\8dத படிவத்தை பூர்த்தி செய்யவும்.',
+'passwordreset-text' => ' à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8dலà¯\88 à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95 à®\87பà¯\8dபடிவத்தை பூர்த்தி செய்யவும்.',
 'passwordreset-legend' => 'கடவுச்சொல்லை மீட்டமை',
 'passwordreset-disabled' => 'கடவுச்சொல் மீட்டமைப்பு இந்த விக்கியில் செயலிழக்க செய்யப்பட்டுள்ளது.',
 'passwordreset-pretext' => '{{PLURAL:$1|| தரவு பகுதி ஒன்றை கீழே உள்ளிடு}}',
@@ -620,9 +622,9 @@ $2
 அல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.',
 'passwordreset-emailelement' => 'பயனர் பெயர்:  $1
 தற்காலிகக் கடவுச்சொல்: $2',
-'passwordreset-emailsent' => 'நினà¯\88வà¯\82à®\9fà¯\8dà®\9fும் மின்னஞ்சல் அனுப்பப்பட்டது.',
-'passwordreset-emailsent-capture' => 'à®\95à¯\80à®´à¯\87 à®\95ாணà¯\8dபிà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளதà¯\81 à®ªà¯\8bலà¯\8d à®¨à®¿à®©à¯\88வà¯\81பà®\9fà¯\81தà¯\8dதி மின்னஞ்சல் அனுப்பப்பட்டது.',
-'passwordreset-emailerror-capture' => 'நினà¯\88வà¯\81பà®\9fà¯\81தà¯\8dதி à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d  à®\89à®°à¯\81வாà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9fà¯\81விà®\9fà¯\8dà®\9fதà¯\81,அது கீழே காட்டப்பட்டுள்ளது, ஆனால் பயனீட்டாளருக்கு அனுப்புவது தோல்வியடைந்தது:$1',
+'passwordreset-emailsent' => 'à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95ும் மின்னஞ்சல் அனுப்பப்பட்டது.',
+'passwordreset-emailsent-capture' => 'à®\95à¯\80à®´à¯\87 à®\95ாணà¯\8dபிà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளதà¯\81 à®ªà¯\8bலà¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95à¯\81à®®à¯\8d மின்னஞ்சல் அனுப்பப்பட்டது.',
+'passwordreset-emailerror-capture' => 'à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d  à®\89à®°à¯\81வாà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9fà¯\81விà®\9fà¯\8dà®\9fதà¯\81அது கீழே காட்டப்பட்டுள்ளது, ஆனால் பயனீட்டாளருக்கு அனுப்புவது தோல்வியடைந்தது:$1',
 
 # Special:ChangeEmail
 'changeemail' => 'மின்னஞ்சல் முகவரியை மாற்று',
@@ -1174,7 +1176,7 @@ $1",
 'timezoneregion-indian' => 'இந்தியப் பெருங்கடல்',
 'timezoneregion-pacific' => 'பசிபிக் பெருங்கடல்',
 'allowemail' => 'ஏனைய பயனர்களிடம் இருந்தான மின்னஞ்சல்களை அனுமதி',
-'prefs-searchoptions' => 'தà¯\87à®\9fலà¯\8d à®µà®¿à®°à¯\81பà¯\8dபதà¯\8d à®¤à¯\87à®°à¯\8dவà¯\81à®\95ளà¯\8d',
+'prefs-searchoptions' => 'தà¯\87à®\9fà¯\81à®\95',
 'prefs-namespaces' => 'பெயர்வெளிகள்',
 'defaultns' => 'அப்படியில்லையென்றால் இந்த பொயர்வெளிகளில் தேடவும்:',
 'default' => 'பொதுவானது',
@@ -1188,8 +1190,8 @@ $1",
 'prefs-textboxsize' => 'தொகுக்கும் சாளரத்தின் அளவு',
 'youremail' => 'மின்னஞ்சல்:',
 'username' => '{{GENDER:$1|பயனர் பெயர்}}:',
-'uid' => 'பயனர்:',
-'prefs-memberingroups' => 'பின்வரும் {{PLURAL:$1|குழு|குழுக்களில்}} உறுப்பினர்:',
+'uid' => '{{பாலினம்:$1|பயனர்}}:',
+'prefs-memberingroups' => 'பின்வரும் {{பன்மை:$1|குழு|குழுக்களில்}} {{பாலினம்:$2|உறுப்பினர்}}:',
 'prefs-registration' => 'பதிவு செய்யும் நேரம்:',
 'yourrealname' => 'உண்மைப் பெயர்:',
 'yourlanguage' => 'மொழி:',
@@ -1574,7 +1576,7 @@ $1',
 'backend-fail-writetemp' => 'தற்காலிக கோப்பில் எழுத இயலவில்லை.',
 'backend-fail-closetemp' => 'தற்காலிக கோப்பை மூட முடியவில்லை.',
 'backend-fail-read' => '$1 கோப்பை படிக்க இயலவில்லை .',
-'backend-fail-create' => '$1 கோப்பை உருவாக்க இயலவில்லை .',
+'backend-fail-create' => '"$1" கோப்பை எழுத இயலவில்லை .',
 'backend-fail-connect' => '"$1" பின்புல சேமிப்புக்கு தொடர்பு கொள்ள இயலவில்லை.',
 'backend-fail-internal' => '"$1" பின்புல சேமிப்பில் அறியாப் பிழை ஒன்று நேர்ந்துள்ளது',
 'backend-fail-contenttype' => '"$1" இல் சேமிக்க கோப்பின் உள்ளடக்க வகையை உறுதிசெய்ய முடியவில்லை',
@@ -1781,6 +1783,8 @@ $1',
 'disambiguationspage' => 'Template:பக்கவழி நெறிப்படுத்தல்',
 'disambiguations-text' => "பின்வரும் பக்கங்கள் '''பக்கவழி நெறிப்படுத்தல் பக்கத்துக்கு''' இணைக்கப்பட்டுள்ளன. மாறாக இவை பொருத்தமன தலைப்பிற்கு இணைக்கப்பட வேண்டும். <br />[[MediaWiki:Disambiguationspage|பக்கவழி நெறிப்படுத்தல் பக்கங்கத்தில்]] உள்ள வார்ப்புரு இணைக்கப்பட்ட பக்கங்கள்  பக்கவழி நெறிப்படுத்தல் பக்கங்கள் என் கருதப்படும்.",
 
+'pageswithprop-submit' => 'செல்க',
+
 'doubleredirects' => 'இரட்டை வழிமாற்றுகள்',
 'doubleredirectstext' => 'இந்தப் பட்டியல் போலியான நேர்மதிப்புக்களைக் கொண்டிருக்கக்கூடும். இது வழக்கமாக, இணைப்புடன் கூடிய மேலதிக உரை முதலாவது #வழிமாற்றுக்குக் கீழ் இருப்பதைக் குறிக்கும்.ஒவ்வொரு வரியும், முதலாம் இரண்டாம் வழிமாற்றுகளுக்கு இணைப்புகளைக் கொண்டிருப்பதுடன், இரண்டாவது வழிமாற்று உரையின் முதல் வரிக்கும் இணைப்பைக் கொண்டிருக்கும், இது வழக்கமாக முதலாவது வழிமாற்று குறித்துக் காட்ட வேண்டிய "உண்மையான" இலக்குக் கட்டுரையைக் கொடுக்கும்.',
 'double-redirect-fixed-move' => '[[$1]] நகர்த்தப்பட்டுவிட்டது. இப்பொழுது [[$2]] உக்கு வழிமாற்று தருகின்றது.',
@@ -2611,6 +2615,8 @@ $1',
 'import-invalid-interwiki' => 'குறிப்பிட்ட விக்கியில் இருந்து இறக்குமதி செய்யமுடியாது .',
 'import-error-edit' => 'பக்கம் "$1" ஆனது இறக்குமதி செய்யப்படவில்லை ,ஏனெனில் அதை நீங்கள் திருத்த அனுமதிக்கப்படவில்லை.',
 'import-error-create' => 'பக்கம் "$1" ஆனது இறக்குமதி செய்யப்படவில்லை ,ஏனெனில் அதை நீங்கள் உருவாக்க  அனுமதிக்கப்படவில்லை.',
+'import-error-invalid' => 'பக்கம் "$1" பதிவிறக்கம் செய்யப்படவில்லை, ஏனெனில் அதன் பெயர் செல்லாது.',
+'import-rootpage-invalid' => 'கொடுக்கப்பட்ட மூலப்பக்கம் செல்லாத தலைப்பாகும்.',
 
 # Import log
 'importlogpage' => 'இறக்குமதி பதிகை',
@@ -2729,8 +2735,11 @@ $1',
 'pageinfo-article-id' => 'பக்க அடையாள இலக்கம்',
 'pageinfo-language' => 'பக்க உள்ளடக்க மொழி',
 'pageinfo-robot-policy' => 'தேடற்பொறி நிலைமை',
+'pageinfo-robot-index' => 'வகைப்படக்கூடியது',
+'pageinfo-robot-noindex' => 'வகைப்படாதது.',
 'pageinfo-views' => 'காட்சிகள் எண்ணிக்கை',
-'pageinfo-watchers' => 'பார்வையாளர்கள் எண்ணிக்கை',
+'pageinfo-watchers' => 'பக்கப் பார்வையாளர்கள் எண்ணிக்கை',
+'pageinfo-few-watchers' => 'விட குறைவானது $1 {{PLURAL:$1|watcher|watchers}}',
 'pageinfo-redirects-name' => 'இந்தப் பக்கத்திற்கான வழிமாற்றுகள்',
 'pageinfo-subpages-name' => 'இந்தப் பக்கத்தின் துணைப் பக்கங்கள்',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|வழிமாற்று|வழிமாற்றுகள்}}; $3 {{PLURAL:$3|வழிமாற்றில்லாதது|வழிமாற்றில்லாதவை}})',
@@ -2830,6 +2839,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1மணி| $1  மணிகள்}}',
 'days' => '{{PLURAL:$1|$1நாள்|$1 நாட்கள்}}',
 'ago' => '$1 முன்பு',
+'just-now' => 'சடுதியில்.',
 
 # Bad image list
 'bad_image_list' => 'முறை பின்வருமாறு:
index c15263a..4104810 100644 (file)
@@ -743,14 +743,22 @@ Ita-nia mudansa la armazenadu seidauk!",
 'whatlinkshere-hidelinks' => '$1 ligasaun',
 
 # Block/unblock
+'block' => "Blokeiu uza-na'in",
 'blockip' => "Blokeiu uza-na'in",
 'blockip-legend' => "Blokeiu uza-na'in",
+'ipadressorusername' => "Diresaun IP ka naran uza-na'in:",
+'ipbexpiry' => 'Tempu:',
 'ipbreason' => 'Motivu:',
 'ipbreasonotherlist' => 'Motivu seluk',
+'ipbcreateaccount' => 'La bele kria konta foun',
+'ipbemailban' => 'La bele haruka korreiu eletróniku',
 'ipbsubmit' => "Blokeiu uza-na'in ne'e",
 'ipbother' => 'Tempu seluk:',
 'ipboptions' => '2 hours:2 hours,1 loron:1 day,3 Loron:3 days,1 semana:1 week,2 semana:2 weeks,1 fulan:1 month,3 fulan:3 months,6 fulan:6 months,1 tinan:1 year,infinite:infinite',
 'ipbotheroption' => 'seluk',
+'ipbhidename' => "Subar naran uza-na'in (iha kontribuisaun no lista seluk)",
+'ipbwatchuser' => "Hateke pájina uza-na'in nian (hamutuk ho pájina diskusaun)",
+'ipb-disableusertalk' => 'La bele edita ninia pájina diskusaun',
 'ipblocklist' => "Uza-na'in sira-ne'ebé la bele edita",
 'blocklist-reason' => 'Razaun',
 'ipblocklist-submit' => 'Buka',
index 3c65416..2847cfe 100644 (file)
@@ -767,7 +767,7 @@ Nếu bạn không yêu cầu gửi mật khẩu mới, hoặc bạn đã nhớ
 'passwordsent' => 'Mật khẩu mới đã được gửi tới thư điện tử của thành viên “$1”. Xin đăng nhập lại sau khi nhận thư.',
 'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh lạm dụng.',
 'eauthentsent' => 'Thư xác nhận đã được gửi. Trước khi dùng chức năng nhận thư, bạn cần thực hiện hướng dẫn trong thư xác nhận, để đảm bảo tài khoản thuộc về bạn.',
-'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ một lần.',
+'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu $1 giờ đồng hồ một lần.',
 'mailerror' => 'Lỗi gửi thư : $1',
 'acct_creation_throttle_hit' => 'Ai đó cùng [[địa chỉ IP]] với bạn đã mở {{PLURAL:$1|một tài khoản|$1 tài khoản}} ở đây trong vòng 24 giờ. Vì quy định hạn chế số tài khoản mở trên một địa chỉ IP nên bạn hiện không thể mở thêm được nữa dùng địa chỉ IP này.',
 'emailauthenticated' => 'Địa chỉ thư điện tử của bạn được xác nhận vào lúc $3 $2.',
@@ -4074,17 +4074,17 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'sqlite-no-fts' => '$1 không có hỗ trợ tìm kiếm toàn văn',
 
 # New logging system
-'logentry-delete-delete' => '$1 đã xóa trang “$3”',
-'logentry-delete-restore' => '$1 đã phục hồi trang “$3”',
-'logentry-delete-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
-'logentry-delete-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
-'logentry-delete-event-legacy' => '$1 đã thay đổi mức hiển thị của các mục nhật trình về $3',
-'logentry-delete-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3',
-'logentry-suppress-delete' => '$1 đã ẩn trang $3',
-'logentry-suppress-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
-'logentry-suppress-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
-'logentry-suppress-event-legacy' => '$1 đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
-'logentry-suppress-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
+'logentry-delete-delete' => '$1 {{GENDER:$2}}đã xóa trang “$3”',
+'logentry-delete-restore' => '$1 {{GENDER:$2}}đã phục hồi trang “$3”',
+'logentry-delete-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các mục nhật trình về $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}}đã ẩn trang $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
 'revdelete-content-hid' => 'đã ẩn nội dung',
 'revdelete-summary-hid' => 'đã ẩn tóm lược sửa đổi',
 'revdelete-uname-hid' => 'đã ẩn tên người dùng',
@@ -4093,20 +4093,20 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'revdelete-uname-unhid' => 'đã hiện tên người dùng',
 'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
 'revdelete-unrestricted' => 'đã gỡ bỏ hạn chế cho bảo quản viên',
-'logentry-move-move' => '$1 đã đổi $3 thành $4',
-'logentry-move-move-noredirect' => '$1 đã đổi $3 thành $4 (đã tắt đổi hướng)',
-'logentry-move-move_redir' => '$1 đã đổi $3 thành $4 qua đổi hướng',
-'logentry-move-move_redir-noredirect' => '$1 đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
-'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-newusers-newusers' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create2' => '$1 đã mở tài khoản người dùng $3',
-'logentry-newusers-byemail' => '$1 đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử',
-'logentry-newusers-autocreate' => 'Tài khoản $1 đã được mở tự động',
-'logentry-rights-rights' => '$1 đã đổi các nhóm liên kết của $3 từ $4 đến $5',
-'logentry-rights-rights-legacy' => '$1 đã đổi các nhóm liên kết của $3',
-'logentry-rights-autopromote' => '$1 đã được tự động phong cấp từ $4 đến $5',
+'logentry-move-move' => '$1 {{GENDER:$2}}đã đổi $3 thành $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 (đã tắt đổi hướng)',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2}}đã đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2}}đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-newusers-newusers' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'logentry-newusers-create' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2}}đã mở tài khoản người dùng $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2}}đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử',
+'logentry-newusers-autocreate' => 'Tài khoản $1 {{GENDER:$2}}đã được mở tự động',
+'logentry-rights-rights' => '$1 {{GENDER:$2}}đã đổi các nhóm bao gồm $3 từ $4 đến $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$2}}$1 đã đổi các nhóm bao gồm $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2}}đã được tự động phong cấp từ $4 đến $5',
 'rightsnone' => '(không có)',
 
 # Feedback
index bbba41d..be84b22 100644 (file)
@@ -2020,6 +2020,8 @@ $1',
 'disambiguationspage' => 'Template:消歧义',
 'disambiguations-text' => "以下的页面都有到'''消歧义页'''的链接,但它们可能可以链接到更适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
 
+'pageswithprop' => '有某页面属性的页面',
+'pageswithprop-legend' => '有某页面属性的页面',
 'pageswithprop-text' => '此页面列出了使用特定页面属性的页面名单。',
 'pageswithprop-prop' => '属性名称:',
 'pageswithprop-submit' => '提交',
@@ -3935,10 +3937,10 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'logentry-patrol-patrol' => '$1标记页面$3的版本$4为已巡查',
 'logentry-patrol-patrol-auto' => '$1自动标记页面$3的版本$4为已巡查',
 'logentry-newusers-newusers' => '已创建用户帐户 $1',
-'logentry-newusers-create' => '创建用户帐户$1',
+'logentry-newusers-create' => '创建用户帐户 $1',
 'logentry-newusers-create2' => '创建用户帐户 $3 由 $1',
-'logentry-newusers-byemail' => '$1创建用户$3并将密码用电子邮件发送',
-'logentry-newusers-autocreate' => '账户$1被自动创建',
+'logentry-newusers-byemail' => '$1创建用户$3,并且密码已通过电子邮件发送',
+'logentry-newusers-autocreate' => '帐户$1已被自动地创建',
 'logentry-rights-rights' => '$1将$3的用户组从$4改为$5',
 'logentry-rights-rights-legacy' => '$1更改$3的用户组',
 'logentry-rights-autopromote' => '$1的用户组已自动从$4改为$5',
index d863b82..45ec98c 100644 (file)
@@ -729,7 +729,8 @@ $2',
 請在收到後再登入。',
 'blocked-mailpassword' => '您的IP地址處於查封狀態而不允許編輯,為了安全起見,密碼恢復功能已被禁用。',
 'eauthentsent' => '一封確認信已經發送到所示的地址。在發送其它郵件到此賬戶前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。',
-'throttled-mailpassword' => '密碼提醒已經在前$1小時內發送。為防止濫用,限定在$1小時內僅發送一次密碼提醒。',
+'throttled-mailpassword' => '密碼提醒已經在前$1小時內發送。
+為防止濫用,限定在$1小時內僅發送一次密碼提醒。',
 'mailerror' => '發送郵件錯誤: $1',
 'acct_creation_throttle_hit' => '在這個wiki上的訪客利用您的IP地址在昨天創建了$1個賬戶,是在這段時間中的上限。
 結果利用這個IP地址的訪客在這段時間中不能創建更多的賬戶。',
@@ -779,7 +780,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '重新設定密碼',
-'passwordreset-text' => '完成此表格以接收一個電郵以提示你的帳戶詳情。',
+'passwordreset-text' => '完成此表格以重置您的密碼。',
 'passwordreset-legend' => '重設密碼',
 'passwordreset-disabled' => '此維基上已禁止了重設密碼。',
 'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一個}}',
@@ -789,15 +790,14 @@ $2',
 'passwordreset-capture-help' => '如果您選中此框,電子郵件(包括臨時密碼)將顯示,並發送給用戶。',
 'passwordreset-email' => '電郵地址:',
 'passwordreset-emailtitle' => '在{{SITENAME}}上的詳細信息',
-'passwordreset-emailtext-ip' => '有人(可能是你,來自$1這個IP)要求發出一個在{{SITENAME}}($4)的帳戶信
-息提示。該用戶{{PLURAL:$3|是|是}}與以下電郵地址有關:
+'passwordreset-emailtext-ip' => '有人(可能是你,來自$1這個IP)要求重置{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是|是}}與以下電郵地址有關:
 
 $2
 
 {{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。
 你應該現在登入並選擇一個新的密碼。如果不是你作出這個請求,又或你已經記
 起你原來的密碼,你可以忽略本信息並使用你原來的密碼。',
-'passwordreset-emailtext-user' => '用戶$1要求發出一個在{{SITENAME}}($4)的帳戶信息提示。該用戶{{PLURAL:$3|是|是}}與以下
+'passwordreset-emailtext-user' => '用戶$1要求重置在{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是|是}}與以下
 電郵地址有關:
 
 $2
@@ -807,9 +807,9 @@ $2
 起你原來的密碼,你可以忽略本信息並使用你原來的密碼。',
 'passwordreset-emailelement' => '用戶名:$1
 臨時密碼:$2',
-'passwordreset-emailsent' => '已發送提示電郵。',
-'passwordreset-emailsent-capture' => '提醒電子郵件已發送,並在下面顯示。',
-'passwordreset-emailerror-capture' => '生成的提醒電子郵件如下所示,但發送失敗:$1',
+'passwordreset-emailsent' => '已發送重置密碼電郵。',
+'passwordreset-emailsent-capture' => '重置密碼電子郵件已發送,並在下面顯示。',
+'passwordreset-emailerror-capture' => '生成的重置密碼電子郵件如下所示,但發送失敗:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改電郵地址',
@@ -3892,14 +3892,14 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'logentry-delete-delete' => '$1刪除頁面$3',
 'logentry-delete-restore' => '$1恢復頁面$3',
 'logentry-delete-event' => '$1已更改$3中$5項日誌的可見性:$4',
-'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
-'logentry-delete-event-legacy' => '$1已更改$3中日誌的可見性',
-'logentry-delete-revision-legacy' => '$1已更改$3中歷史版本的可見性',
-'logentry-suppress-delete' => '$1已隱藏頁面$3',
-'logentry-suppress-event' => '$1已不可見地更改$3中{{PLURAL:$5|$5項日誌|$5項日誌}}的可見性:$4',
-'logentry-suppress-revision' => '$1已不可見地更改$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
-'logentry-suppress-event-legacy' => '$1已不可見地更改$3中日誌的可見性',
-'logentry-suppress-revision-legacy' => '$1已不可見地更改$3中歷史版本的可見性',
+'logentry-delete-revision' => '$1已{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
+'logentry-delete-event-legacy' => '$1{{GENDER:$2|已更改}}$3中日誌的可見性',
+'logentry-delete-revision-legacy' => '$1{{GENDER:$2|已更改}}$3中歷史版本的可見性',
+'logentry-suppress-delete' => '$1{{GENDER:$2|已隱藏}}頁面$3',
+'logentry-suppress-event' => '$1已不可見地{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5項日誌|$5項日誌}}的可見性:$4',
+'logentry-suppress-revision' => '$1已不可見地{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
+'logentry-suppress-event-legacy' => '$1已不可見地{{GENDER:$2|更改}}$3中日誌的可見性',
+'logentry-suppress-revision-legacy' => '$1已不可見地{{GENDER:$2|更改}}$3中歷史版本的可見性',
 'revdelete-content-hid' => '隱藏內容',
 'revdelete-summary-hid' => '隱藏編輯摘要',
 'revdelete-uname-hid' => '隱藏用戶名',
@@ -3912,13 +3912,13 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'logentry-move-move-noredirect' => '$1移動$3頁面至$4,不留重定向',
 'logentry-move-move_redir' => '$1通過重定向移動$3頁面至$4',
 'logentry-move-move_redir-noredirect' => '$1通過重定向移動$3頁面至$4,不留重定向',
-'logentry-patrol-patrol' => '$1標記頁面$3的版本$4為已巡查',
-'logentry-patrol-patrol-auto' => '$1自動標記頁面$3的版本$4為已巡查',
-'logentry-newusers-newusers' => '已建立用戶「$1」',
-'logentry-newusers-create' => '已建立用戶「$1」',
+'logentry-patrol-patrol' => '$1{{GENDER:$2|標記}}頁面$3的版本$4為已巡查',
+'logentry-patrol-patrol-auto' => '$1自動{{GENDER:$2|標記}}頁面$3的版本$4為已巡查',
+'logentry-newusers-newusers' => '已{{GENDER:$2|建立}}用戶「$1」',
+'logentry-newusers-create' => '已{{GENDER:$2|建立}}用戶「$1」',
 'logentry-newusers-create2' => '用戶「$1」建立用戶「$3」',
 'logentry-newusers-byemail' => '$1建立用戶$3並電郵密碼給他',
-'logentry-newusers-autocreate' => '帳戶$1被自動創建',
+'logentry-newusers-autocreate' => '用戶$1被自動{{GENDER:$2|建立}}',
 'logentry-rights-rights' => '$1將$3的權限從$4改為$5',
 'logentry-rights-rights-legacy' => '$1更改$3的權限',
 'logentry-rights-autopromote' => '$1的權限自動從$4改為$5',
index 7c529d5..1572869 100644 (file)
@@ -48,8 +48,8 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                $db = $this->getDB( DB_MASTER );
                if ( !$db->tableExists( 'revision' ) ) {
                        $this->error( "revision table does not exist", true );
-               } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
-                       $this->output( "rev_sha1 column does not exist\n\n", true );
+               } else if ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
+                       $this->output( "rev_len column does not exist\n\n", true );
                        return false;
                }
 
index f5a31fd..9593fa8 100644 (file)
@@ -160,6 +160,7 @@ return array(
        ),
        'jquery.checkboxShiftClick' => array(
                'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.client' => array(
                'scripts' => 'resources/jquery/jquery.client.js',
@@ -220,12 +221,14 @@ return array(
                'scripts' => 'resources/jquery/jquery.makeCollapsible.js',
                'styles' => 'resources/jquery/jquery.makeCollapsible.css',
                'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.mockjax' => array(
                'scripts' => 'resources/jquery/jquery.mockjax.js',
        ),
        'jquery.mw-jump' => array(
                'scripts' => 'resources/jquery/jquery.mw-jump.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.mwExtension' => array(
                'scripts' => 'resources/jquery/jquery.mwExtension.js',
@@ -233,15 +236,18 @@ return array(
        ),
        'jquery.placeholder' => array(
                'scripts' => 'resources/jquery/jquery.placeholder.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.qunit' => array(
                'scripts' => 'resources/jquery/jquery.qunit.js',
                'styles' => 'resources/jquery/jquery.qunit.css',
                'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.qunit.completenessTest' => array(
                'scripts' => 'resources/jquery/jquery.qunit.completenessTest.js',
                'dependencies' => 'jquery.qunit',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.spinner' => array(
                'scripts' => 'resources/jquery/jquery.spinner.js',
@@ -829,6 +835,7 @@ return array(
                        'jquery.mw-jump',
                        'mediawiki.util',
                ),
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.startup' => array(
                'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
@@ -837,6 +844,7 @@ return array(
                        'mediawiki.util',
                ),
                'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.patrol.ajax' => array(
                'scripts' => 'resources/mediawiki.page/mediawiki.page.patrol.ajax.js',
@@ -951,6 +959,7 @@ return array(
                ) ),
                'dependencies' => array( 'jquery.qunit' ),
                'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
 
        /* MediaWiki Tests */
@@ -965,6 +974,7 @@ return array(
                        'mediawiki.page.ready',
                ),
                'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
 
        /* MediaWiki Legacy */
index a550d97..a36fa48 100644 (file)
@@ -128,6 +128,13 @@ img.thumbborder {
 #userlogin, #userloginForm {
        border: solid 1px #cccccc;
        padding: 1.2em;
-       margin: .5em;
-       float: left;
+       margin: 0.5em;
+}
+
+#loginend {
+       margin: 0.5em;
+}
+
+#loginend table {
+       width: 100%;
 }
index e9218de..03f9659 100644 (file)
@@ -837,7 +837,7 @@ x <div>foo</div> z
 !! end
 
 !! test
-Empty lines between block tags to test open p-tags are closed between the block tags
+Empty lines between lines with block tags
 !! input
 <div></div>
 
@@ -845,6 +845,12 @@ Empty lines between block tags to test open p-tags are closed between the block
 <div></div>a
 
 b
+<div>a</div>b
+
+<div>b</div>d
+
+
+<div>e</div>
 !! result
 <div></div>
 <p><br />
@@ -852,6 +858,12 @@ b
 <div></div>a
 <p>b
 </p>
+<div>a</div>b
+<div>b</div>d
+<p><br />
+</p>
+<div>e</div>
+
 !! end
 
 ###
@@ -3270,6 +3282,24 @@ Table with row followed by newlines and table heading
 
 !! end
 
+!! test
+Table with empty line following the start tag
+!! input
+{|
+
+|-
+| foo
+|}
+!! result
+<table>
+
+
+<tr>
+<td> foo
+</td></tr></table>
+
+!! end
+
 # FIXME: Preserve the attribute properly (with an empty string as value) in
 # the PHP parser. Parsoid implements the behavior below.
 !! test
@@ -3311,6 +3341,43 @@ Wikitext table with a lot of comments
 
 !! end
 
+!! test
+Wikitext table with double-line table cell
+!! input
+{|
+|a
+b
+|}
+!! result
+<table>
+<tr>
+<td>a
+<p>b
+</p>
+</td></tr></table>
+
+!! end
+
+# The expected HTML structure in this test is debatable. The PHP parser does
+# not parse this kind of table at all. The main focus for Parsoid is on
+# round-tripping, so this output is ok for now. TODO: revisit!
+!! test
+Wikitext table with html-syntax row (Parsoid)
+!! options
+parsoid
+!! input
+{|
+|-
+<td>foo</td>
+|}
+!! result
+<table>
+<tbody>
+<tr>
+<td></td>
+<td>foo</td></tr></tbody></table>
+!! end
+
 ###
 ### Internal links
 ###
index 51fbff1..7d95b07 100644 (file)
@@ -64,7 +64,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                'oracle'
        );
 
-       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
                $this->backupGlobals = false;
@@ -123,6 +123,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       function usesTemporaryTables() {
+               return self::$useTemporaryTables;
+       }
+
        /**
         * obtains a new temporary file name
         *
index a79b3a2..c83f7da 100644 (file)
@@ -7,7 +7,7 @@
  */
 class LinksUpdateTest extends MediaWikiTestCase {
 
-       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
                $this->tablesUsed = array_merge( $this->tablesUsed,
index e8d8db0..3b8e5cf 100644 (file)
@@ -17,7 +17,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        var $the_page;
 
-       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
                $this->tablesUsed = array_merge( $this->tablesUsed,
index 2501be3..4bb6daa 100644 (file)
@@ -10,7 +10,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
        var $pages_to_delete;
 
-       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
                $this->tablesUsed = array_merge(
index 7b84d47..097e57a 100644 (file)
@@ -311,7 +311,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ ), "Database creationg" );
                $this->assertTrue( $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ ),
                        "Insertion worked" );
-               $this->assertEquals( "integer", gettype( $db->insertId() ), "Actual typecheck" );
+               $this->assertInternalType( 'integer', $db->insertId(), "Actual typecheck" );
                $this->assertTrue( $db->close(), "closing database" );
        }
 
index 453cec3..f3f9c11 100644 (file)
@@ -10,7 +10,7 @@ class JobQueueTest extends MediaWikiTestCase {
        protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
        protected $old = array();
 
-       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
                $this->tablesUsed[] = 'job';
@@ -32,44 +32,52 @@ class JobQueueTest extends MediaWikiTestCase {
                }
                $baseConfig['type'] = 'null';
                $baseConfig['wiki'] = wfWikiID();
-               $this->queueRand = JobQueue::factory(
-                       array( 'order' => 'random', 'claimTTL' => 0 ) + $baseConfig );
-               $this->queueRandTTL = JobQueue::factory(
-                       array( 'order' => 'random', 'claimTTL' => 10 ) + $baseConfig );
-               $this->queueFifo = JobQueue::factory(
-                       array( 'order' => 'fifo', 'claimTTL' => 0 ) + $baseConfig );
-               $this->queueFifoTTL = JobQueue::factory(
-                       array( 'order' => 'fifo', 'claimTTL' => 10 ) + $baseConfig );
-               if ( $baseConfig['class'] !== 'JobQueueDB' ) { // DB namespace with prefix or temp tables
-                       foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
-                               $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
-                       }
+               $variants = array(
+                       'queueRand' => array( 'order' => 'random', 'claimTTL' => 0 ),
+                       'queueRandTTL' => array( 'order' => 'random', 'claimTTL' => 10 ),
+                       'queueTimestamp' => array( 'order' => 'timestamp', 'claimTTL' => 0 ),
+                       'queueTimestampTTL' => array( 'order' => 'timestamp', 'claimTTL' => 10 ),
+                       'queueFifo' => array( 'order' => 'fifo', 'claimTTL' => 0 ),
+                       'queueFifoTTL' => array( 'order' => 'fifo', 'claimTTL' => 10 ),
+               );
+               foreach ( $variants as $q => $settings ) {
+                       try {
+                               $this->$q = JobQueue::factory( $settings + $baseConfig );
+                               if ( ! ( $this->$q instanceof JobQueueDB ) ) {
+                                       $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
+                               }
+                       } catch ( MWException $e ) {}; // unsupported? (@TODO: what if it was another error?)
                }
        }
 
        protected function tearDown() {
                global $wgMemc;
                parent::tearDown();
-               foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
-                       do {
-                               $job = $this->$q->pop();
-                               if ( $job ) {
-                                       $this->$q->ack( $job );
-                               }
-                       } while ( $job );
+               foreach ( array(
+                       'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
+                       'queueFifo', 'queueFifoTTL'
+               ) as $q ) {
+                       if ( $this->$q ) {
+                               do {
+                                       $job = $this->$q->pop();
+                                       if ( $job ) {
+                                               $this->$q->ack( $job );
+                                       }
+                               } while ( $job );
+                       }
+                       $this->$q = null;
                }
-               $this->queueRand = null;
-               $this->queueRandTTL = null;
-               $this->queueFifo = null;
-               $this->queueFifoTTL = null;
                $wgMemc = $this->old['wgMemc'];
        }
 
        /**
         * @dataProvider provider_queueLists
         */
-       function testProperties( $queue, $order, $recycles, $desc ) {
+       function testProperties( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
 
                $this->assertEquals( wfWikiID(), $queue->getWiki(), "Proper wiki ID ($desc)" );
                $this->assertEquals( 'null', $queue->getType(), "Proper job type ($desc)" );
@@ -78,8 +86,12 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testBasicOperations( $queue, $order, $recycles, $desc ) {
+       function testBasicOperations( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
+
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
@@ -137,8 +149,12 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testBasicDeduplication( $queue, $order, $recycles, $desc ) {
+       function testBasicDeduplication( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
+
 
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -186,8 +202,12 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testRootDeduplication( $queue, $order, $recycles, $desc ) {
+       function testRootDeduplication( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
+
 
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -238,6 +258,10 @@ class JobQueueTest extends MediaWikiTestCase {
         */
        function testJobOrder( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
+
 
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -266,10 +290,12 @@ class JobQueueTest extends MediaWikiTestCase {
 
        function provider_queueLists() {
                return array(
-                       array( 'queueRand', 'rand', false, 'Random queue without ack()' ),
-                       array( 'queueRandTTL', 'rand', true, 'Random queue with ack()' ),
-                       array( 'queueFifo', 'fifo', false, 'Ordered queue without ack()' ),
-                       array( 'queueFifoTTL', 'fifo', true, 'Ordered queue with ack()' )
+                       array( 'queueRand', false, 'Random queue without ack()' ),
+                       array( 'queueRandTTL', true, 'Random queue with ack()' ),
+                       array( 'queueTimestamp', false, 'Time ordered queue without ack()' ),
+                       array( 'queueTimestampTTL', true, 'Time ordered queue with ack()' ),
+                       array( 'queueFifo', false, 'FIFO ordered queue without ack()' ),
+                       array( 'queueFifoTTL', true, 'FIFO ordered queue with ack()' )
                );
        }
 
index 1e91201..3bbce2b 100644 (file)
@@ -66,7 +66,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
         * actual resolution of the image is (aka in dots per meter).
         */
        /*
-       function testPngPhysTag () {
+       function testPngPhysTag() {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
index 51643ce..75e1fd1 100644 (file)
@@ -172,19 +172,20 @@ class MagicVariableTest extends MediaWikiTestCase {
         * Rough tests for {{SERVERNAME}} magic word
         * Bug 31176
         * @group Database
+        * @dataProvider dataServernameFromDifferentProtocols
         */
-       function testServernameFromDifferentProtocols() {
-               global $wgServer;
-               $saved_wgServer = $wgServer;
+       function testServernameFromDifferentProtocols( $server ) {
+               $this->setMwGlobals( 'wgServer', $server );
 
-               $wgServer = 'http://localhost/';
-               $this->assertMagic( 'localhost', 'servername' );
-               $wgServer = 'https://localhost/';
-               $this->assertMagic( 'localhost', 'servername' );
-               $wgServer = '//localhost/'; # bug 31176
                $this->assertMagic( 'localhost', 'servername' );
+       }
 
-               $wgServer = $saved_wgServer;
+       function dataServernameFromDifferentProtocols() {
+               return array(
+                       array( 'http://localhost/' ),
+                       array( 'https://localhost/' ),
+                       array( '//localhost/' ), # bug 31176
+               );
        }
 
        ############### HELPERS ############################################
index 5c1a268..50fe0e4 100644 (file)
@@ -28,5 +28,22 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       public function testCallParserFunction() {
+               global $wgParser;
+
+               // Normal parses test passing PPNodes. Test passing an array.
+               $title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
+               $wgParser->startExternalParse( $title, new ParserOptions(), Parser::OT_HTML );
+               $frame = $wgParser->getPreprocessor()->newFrame();
+               $ret = $wgParser->callParserFunction( $frame, '#tag',
+                       array( 'pre', 'foo', 'style' => 'margin-left: 1.6em' )
+               );
+               $ret['text'] = $wgParser->mStripState->unstripBoth( $ret['text'] );
+               $this->assertSame( array(
+                       'found' => true,
+                       'text' => '<pre style="margin-left: 1.6em">foo</pre>',
+               ), $ret, 'callParserFunction works for {{#tag:pre|foo|style=margin-left: 1.6em}}' );
+       }
+
        // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
 }
index 9723e1e..ebbe5a2 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/LanguageAm.php */
 class LanguageAmTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'one', 0 ),
index 523ee7f..fee05fc 100644 (file)
@@ -6,7 +6,6 @@
 
 /** Tests for MediaWiki languages/LanguageAr.php */
 class LanguageArTest extends LanguageClassesTestCase {
-
        function testFormatNum() {
                $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
                $this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
@@ -51,6 +50,11 @@ class LanguageArTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'zero', 0 ),
index 0144941..340b334 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/LanguageBe.php */
 class LanguageBeTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'one', 1 ),
index 5b246d8..aa8c28a 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class LanguageBe_taraskTest extends LanguageClassesTestCase {
-
        /**
         * Make sure the language code we are given is indeed
         * be-tarask. This is to ensure LanguageClassesTestCase
@@ -33,14 +32,19 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
                $this->assertEquals( '1234', $this->getLang()->commafy( '1234' ) );
        }
 
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
+               $forms =  array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
@@ -57,17 +61,16 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms =  array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
-
 }
index c364917..7384ed7 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/LanguageBho.php */
 class LanguageBhoTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'one', 0 ),
@@ -22,5 +26,4 @@ class LanguageBhoTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 76d0070..d44dc32 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/LanguageBs.php */
 class LanguageBsTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'many', 0 ),
@@ -29,5 +33,4 @@ class LanguageBsTest extends LanguageClassesTestCase {
                        array( 'many', 200 ),
                );
        }
-
 }
index 884a129..9a4991b 100644 (file)
@@ -7,15 +7,19 @@
 
 /** Tests for MediaWiki languages/classes/Languagecs.php */
 class LanguageCsTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
@@ -28,5 +32,4 @@ class LanguageCsTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index e2394b3..7384918 100644 (file)
@@ -7,27 +7,30 @@
 
 /** Tests for MediaWiki languages/LanguageCu.php */
 class LanguageCuTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
+               $forms =  array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'many', 3 ),
-                       array( 'many', 4 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
                        array( 'other', 5 ),
                        array( 'one', 11 ),
                        array( 'other', 20 ),
-                       array( 'few', 22 ),
-                       array( 'many', 223 ),
+                       array( 'two', 22 ),
+                       array( 'few', 223 ),
                        array( 'other', 200 ),
                );
        }
-
 }
index 2a7f4a9..d56d622 100644 (file)
@@ -7,15 +7,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageCy.php */
 class LanguageCyTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
@@ -30,5 +34,4 @@ class LanguageCyTest extends LanguageClassesTestCase {
                        array( 'other', 200.00 ),
                );
        }
-
 }
index 285ce64..b3f01c3 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/classes/LanguageDsb.php */
 class LanguageDsbTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'other', 0 ),
@@ -28,5 +32,4 @@ class LanguageDsbTest extends LanguageClassesTestCase {
                        array( 'other', 555 ),
                );
        }
-
 }
index faf0de5..2ab5d87 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/classes/LanguageFr.php */
 class LanguageFrTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'one', 0 ),
@@ -22,5 +26,4 @@ class LanguageFrTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 2dbb088..cac3a02 100644 (file)
@@ -7,20 +7,23 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGa.php */
 class LanguageGaTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
                        array( 'other', 200 ),
                );
        }
-
 }
index 5de1e9d..b7d5cc2 100644 (file)
@@ -7,7 +7,6 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGd.php */
 class LanguageGdTest extends LanguageClassesTestCase {
-
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
index 4126e07..6e24aea 100644 (file)
@@ -7,16 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGv.php */
 class LanguageGvTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                // This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv
-               $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
+               // What does this mean? Is there a hard-coded override for gv somewhere? -Ryan Kaldari 2013-01-28
+               $forms =  array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->markTestSkipped( "This test won't work since convertPlural for gv doesn't seem to actually follow our plural rules." );
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'Form 4', 0 ),
                        array( 'Form 2', 1 ),
                        array( 'Form 3', 2 ),
@@ -28,5 +34,4 @@ class LanguageGvTest extends LanguageClassesTestCase {
                        array( 'Form 4', 50 ),
                );
        }
-
 }
index 6de88e5..1335e90 100644 (file)
@@ -7,46 +7,36 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHe.php */
 class LanguageHeTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralDual */
-       function testPluralDual( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralDual() {
-               return array(
-                       array( 'other', 0 ), // Zero -> plural
-                       array( 'one', 1 ), // Singular
-                       array( 'two', 2 ), // Dual
-                       array( 'other', 3 ), // Plural
-               );
-       }
-
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'other', 0 ), // Zero -> plural
-                       array( 'one', 1 ), // Singular
-                       array( 'other', 2 ), // Plural, no dual provided
-                       array( 'other', 3 ), // Plural
+       function providePlural() {
+               return array (
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'other', 3 ),
+                       array( 'other', 10 ),
                );
        }
 
-       /** @dataProvider providerGrammar */
+       /** @dataProvider provideGrammar */
        function testGrammar( $result, $word, $case ) {
                $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
        }
 
        // The comments in the beginning of the line help avoid RTL problems
        // with text editors.
-       function providerGrammar() {
-               return array(
+       function provideGrammar() {
+               return array (
                        array(
                                /* result */ 'וויקיפדיה',
                                /* word   */ 'ויקיפדיה',
index 86d6af5..b21bfe4 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/LanguageHi.php */
 class LanguageHiTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'one', 0 ),
@@ -22,5 +26,4 @@ class LanguageHiTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 9dce4ea..76e281b 100644 (file)
@@ -7,15 +7,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHr.php */
 class LanguageHrTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'many', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
@@ -29,5 +33,4 @@ class LanguageHrTest extends LanguageClassesTestCase {
                        array( 'many', 200 ),
                );
        }
-
 }
index bec7d81..8fee549 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHsb.php */
 class LanguageHsbTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'other', 0 ),
@@ -28,5 +32,4 @@ class LanguageHsbTest extends LanguageClassesTestCase {
                        array( 'other', 555 ),
                );
        }
-
 }
index 23d8e0c..462a7dd 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/LanguageHu.php */
 class LanguageHuTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'other', 0 ),
@@ -22,5 +26,4 @@ class LanguageHuTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 7088d37..70717f1 100644 (file)
@@ -7,20 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageHy.php */
 class LanguageHyTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               // This fails for 0, but I'm not sure why. Some voodoo going on here.
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
                        array( 'other', 200 ),
                );
        }
-
 }
index 9b4a53a..7efd58a 100644 (file)
@@ -7,20 +7,23 @@
 
 /** Tests for MediaWiki languages/classes/LanguageKsh.php */
 class LanguageKshTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other', 'zero' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
                        array( 'other', 200 ),
                );
        }
-
 }
index 669d8b0..052604c 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLn.php */
 class LanguageLnTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'one', 0 ),
@@ -22,5 +26,4 @@ class LanguageLnTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 9d6428b..eface4c 100644 (file)
@@ -7,21 +7,19 @@
 
 /** Tests for MediaWiki languages/LanguageLt.php */
 class LanguageLtTest extends LanguageClassesTestCase {
-
-       /** @dataProvider provideOneFewOtherCases */
-       function testOneFewOtherPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'other' );
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
+               $forms =  array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider provideOneFewCases */
-       function testOneFewPlural( $result, $value ) {
-               $forms = array( 'one', 'few' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function provideOneFewOtherCases() {
-               return array(
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
@@ -36,10 +34,21 @@ class LanguageLtTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideOneFewCases() {
-               return array(
+       /** @dataProvider providePluralTwoForms */
+       function testOneFewPlural( $result, $value ) {
+               $forms =  array( 'one', 'other' );
+               // This fails for 21, but not sure why.
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       function providePluralTwoForms() {
+               return array (
                        array( 'one', 1 ),
-                       array( 'few', 15 ),
+                       array( 'other', 2 ),
+                       array( 'other', 15 ),
+                       array( 'other', 20 ),
+                       array( 'one', 21 ),
+                       array( 'other', 22 ),
                );
        }
 }
index bd0c759..dce2f79 100644 (file)
@@ -7,15 +7,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLv.php */
 class LanguageLvTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'zero', 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 11 ),
@@ -27,5 +31,4 @@ class LanguageLvTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index c1e516b..e88b0af 100644 (file)
@@ -7,13 +7,17 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMg.php */
 class LanguageMgTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePlural() {
                return array(
                        array( 'one', 0 ),
@@ -23,5 +27,4 @@ class LanguageMgTest extends LanguageClassesTestCase {
                        array( 'other', 123.3434 ),
                );
        }
-
 }
index 5c241ba..a5a8f6c 100644 (file)
@@ -7,27 +7,28 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMk.php */
 class LanguageMkTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
 
-       function providerPlural() {
-               return array(
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 11 ),
                        array( 'one', 21 ),
-                       array( 'other', 411 ),
+                       array( 'one', 411 ),
                        array( 'other', 12.345 ),
                        array( 'other', 20 ),
                        array( 'one', 31 ),
                        array( 'other', 200 ),
                );
        }
-
-
 }
index f7da1cd..31d183a 100644 (file)
@@ -7,19 +7,23 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMo.php */
 class LanguageMoTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 19 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'few',   0 ),
+                       array( 'one',   1 ),
+                       array( 'few',   2 ),
+                       array( 'few',   19 ),
                        array( 'other', 20 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
index f2b881e..8f5d764 100644 (file)
@@ -7,21 +7,25 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMt.php */
 class LanguageMtTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralAllForms */
-       function testPluralAllForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralAllForms() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 19 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'few',   0 ),
+                       array( 'one',   1 ),
+                       array( 'few',   2 ),
+                       array( 'few',   10 ),
+                       array( 'many',  11 ),
+                       array( 'many',  19 ),
                        array( 'other', 20 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
@@ -37,28 +41,28 @@ class LanguageMtTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPluralTwoForms() {
-               return array(
-                       array( 'many', 0 ),
-                       array( 'one', 1 ),
-                       array( 'many', 2 ),
-                       array( 'many', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 19 ),
-                       array( 'many', 20 ),
-                       array( 'many', 99 ),
-                       array( 'many', 100 ),
-                       array( 'many', 101 ),
-                       array( 'many', 102 ),
-                       array( 'many', 110 ),
-                       array( 'many', 111 ),
-                       array( 'many', 119 ),
-                       array( 'many', 120 ),
-                       array( 'many', 201 ),
+               return array (
+                       array( 'other',  0 ),
+                       array( 'one',   1 ),
+                       array( 'other',  2 ),
+                       array( 'other',  10 ),
+                       array( 'other',  11 ),
+                       array( 'other',  19 ),
+                       array( 'other',  20 ),
+                       array( 'other',  99 ),
+                       array( 'other',  100 ),
+                       array( 'other',  101 ),
+                       array( 'other',  102 ),
+                       array( 'other',  110 ),
+                       array( 'other',  111 ),
+                       array( 'other',  119 ),
+                       array( 'other',  120 ),
+                       array( 'other',  201 ),
                );
        }
 }
index 9d80d13..7a7bff2 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageNso.php */
 class LanguageNsoTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'many', 2 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'one',  0 ),
+                       array( 'one',  1 ),
+                       array( 'other', 2 ),
                );
        }
 }
index 1e36097..1ace10b 100644 (file)
@@ -7,58 +7,62 @@
 
 /** Tests for MediaWiki languages/classes/LanguagePl.php */
 class LanguagePlTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralFourForms() {
-               return array(
-                       array( 'many', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
-                       array( 'many', 5 ),
-                       array( 'many', 9 ),
-                       array( 'many', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 21 ),
-                       array( 'few', 22 ),
-                       array( 'few', 23 ),
-                       array( 'few', 24 ),
-                       array( 'many', 25 ),
-                       array( 'many', 200 ),
-                       array( 'many', 201 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'many',  0 ),
+                       array( 'one',   1 ),
+                       array( 'few',   2 ),
+                       array( 'few',   3 ),
+                       array( 'few',   4 ),
+                       array( 'many',  5 ),
+                       array( 'many',  9 ),
+                       array( 'many',  10 ),
+                       array( 'many',  11 ),
+                       array( 'many',  21 ),
+                       array( 'few',   22 ),
+                       array( 'few',   23 ),
+                       array( 'few',   24 ),
+                       array( 'many',  25 ),
+                       array( 'many',  200 ),
+                       array( 'many',  201 ),
                );
        }
 
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+       /** @dataProvider providerPluralTwoForms */
+       function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'many', 0 ),
-                       array( 'one', 1 ),
-                       array( 'many', 2 ),
-                       array( 'many', 3 ),
-                       array( 'many', 4 ),
-                       array( 'many', 5 ),
-                       array( 'many', 9 ),
-                       array( 'many', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 21 ),
-                       array( 'many', 22 ),
-                       array( 'many', 23 ),
-                       array( 'many', 24 ),
-                       array( 'many', 25 ),
-                       array( 'many', 200 ),
-                       array( 'many', 201 ),
+       function providerPluralTwoForms() {
+               return array (
+                       array( 'other',  0 ),
+                       array( 'one',   1 ),
+                       array( 'other',  2 ),
+                       array( 'other',  3 ),
+                       array( 'other',  4 ),
+                       array( 'other',  5 ),
+                       array( 'other',  9 ),
+                       array( 'other',  10 ),
+                       array( 'other',  11 ),
+                       array( 'other',  21 ),
+                       array( 'other',  22 ),
+                       array( 'other',  23 ),
+                       array( 'other',  24 ),
+                       array( 'other',  25 ),
+                       array( 'other',  200 ),
+                       array( 'other',  201 ),
                );
        }
 }
index 916ea45..261d25a 100644 (file)
@@ -7,19 +7,23 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRo.php */
 class LanguageRoTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'few', 0 ),
-                       array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'few', 19 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'few',   0 ),
+                       array( 'one',   1 ),
+                       array( 'few',   2 ),
+                       array( 'few',   19 ),
                        array( 'other', 20 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
index 0792f75..3bdf654 100644 (file)
@@ -8,15 +8,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRu.php */
 class LanguageRuTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
@@ -33,16 +37,16 @@ class LanguageRuTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms =  array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
 
index c7dd802..3e676b9 100644 (file)
@@ -7,15 +7,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSe.php */
 class LanguageSeTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralThreeForms */
-       function testPluralThreeForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralThreeForms() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
@@ -23,14 +27,14 @@ class LanguageSeTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
+       /** @dataProvider providerPluralTwoForms */
+       function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       function providerPluralTwoForms() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
index 8a6e979..4721d50 100644 (file)
@@ -7,28 +7,32 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSgs.php */
 class LanguageSgsTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePluralAllForms */
        function testPluralAllForms( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
+               $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePluralAllForms */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providePluralAllForms() {
                return array(
-                       array( 'many', 0 ),
+                       array( 'few', 0 ),
                        array( 'one', 1 ),
-                       array( 'few', 2 ),
+                       array( 'two', 2 ),
                        array( 'other', 3 ),
-                       array( 'many', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 12 ),
-                       array( 'many', 19 ),
+                       array( 'few', 10 ),
+                       array( 'few', 11 ),
+                       array( 'few', 12 ),
+                       array( 'few', 19 ),
                        array( 'other', 20 ),
-                       array( 'many', 100 ),
+                       array( 'few', 100 ),
                        array( 'one', 101 ),
-                       array( 'many', 111 ),
-                       array( 'many', 112 ),
+                       array( 'few', 111 ),
+                       array( 'few', 112 ),
                );
        }
 
index 282fd2f..e59c894 100644 (file)
@@ -7,18 +7,30 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSh.php */
 class LanguageShTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'many', 0 ),
-                       array( 'one', 1 ),
-                       array( 'many', 2 ),
+                       array( 'one',  1 ),
+                       array( 'few', 2 ),
+                       array( 'few', 4 ),
+                       array( 'many', 5 ),
+                       array( 'many', 10 ),
+                       array( 'many', 11 ),
+                       array( 'many', 12 ),
+                       array( 'one', 101 ),
+                       array( 'few', 102 ),
+                       array( 'many', 111 ),
                );
        }
 }
index 89cbbf0..48d253c 100644 (file)
@@ -8,15 +8,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSk.php */
 class LanguageSkTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'few', 2 ),
index 075e6af..232e35b 100644 (file)
@@ -8,20 +8,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSl.php */
 class LanguageSlTest extends LanguageClassesTestCase {
-
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other', 'zero' );
+               $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providerPlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
        function providerPlural() {
-               return array(
-                       array( 'zero', 0 ),
-                       array( 'one', 1 ),
-                       array( 'two', 2 ),
-                       array( 'few', 3 ),
-                       array( 'few', 4 ),
+               return array (
+                       array( 'other',  0 ),
+                       array( 'one',   1 ),
+                       array( 'two',   2 ),
+                       array( 'few',   3 ),
+                       array( 'few',   4 ),
                        array( 'other', 5 ),
                        array( 'other', 99 ),
                        array( 'other', 100 ),
index 6d65521..3503461 100644 (file)
@@ -7,15 +7,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSma.php */
 class LanguageSmaTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralThreeForms */
-       function testPluralThreeForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralThreeForms() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
@@ -23,14 +27,14 @@ class LanguageSmaTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
+       /** @dataProvider providerPluralTwoForms */
+       function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
+       function providerPluralTwoForms() {
+               return array (
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 2 ),
index 5611030..7fbe13c 100644 (file)
@@ -16,9 +16,6 @@ require_once dirname( __DIR__ ) . '/bootstrap.php';
 
 /** Tests for MediaWiki languages/LanguageSr.php */
 class LanguageSrTest extends LanguageClassesTestCase {
-
-       ##### TESTS #######################################################
-
        function testEasyConversions() {
                $this->assertCyrillic(
                        'шђчћжШЂЧЋЖ',
@@ -113,14 +110,19 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
@@ -137,16 +139,16 @@ class LanguageSrTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
 
index 8af0eee..4a86086 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTi.php */
 class LanguageTiTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'many', 2 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'one',  0 ),
+                       array( 'one',  1 ),
+                       array( 'other', 2 ),
                );
        }
 }
index abd8581..383fe6c 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTl.php */
 class LanguageTlTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'many', 2 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'one',  0 ),
+                       array( 'one',  1 ),
+                       array( 'other', 2 ),
                );
        }
 }
index 9bbfaf6..f7f7369 100644 (file)
@@ -8,15 +8,19 @@
 
 /** Tests for MediaWiki languages/classes/LanguageUk.php */
 class LanguageUkTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
-               return array(
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
                        array( 'one', 1 ),
                        array( 'many', 11 ),
                        array( 'one', 91 ),
@@ -33,16 +37,16 @@ class LanguageUkTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
 }
index 28329fa..b4c92b7 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageWa.php */
 class LanguageWaTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array(
-                       array( 'one', 0 ),
-                       array( 'one', 1 ),
-                       array( 'many', 2 ),
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'one',  0 ),
+                       array( 'one',  1 ),
+                       array( 'other', 2 ),
                );
        }
 }
index 3902b68..279932f 100644 (file)
@@ -151,11 +151,12 @@ class SideBarTest extends MediaWikiLangTestCase {
 
        /**
         * Simple test to verify our helper assertAttribs() is functional
-        * Please note this assume MediaWiki default settings:
-        *   $wgNoFollowLinks = true
-        *   $wgExternalLinkTarget = false
         */
        function testTestAttributesAssertionHelper() {
+               $this->setMwGlobals( array(
+                       'wgNoFollowLinks' => true,
+                       'wgExternalLinkTarget' => false,
+               ) );
                $attribs = $this->getAttribs();
 
                $this->assertArrayHasKey( 'rel', $attribs );
@@ -168,38 +169,30 @@ class SideBarTest extends MediaWikiLangTestCase {
         * Test $wgNoFollowLinks in sidebar
         */
        function testRespectWgnofollowlinks() {
-               global $wgNoFollowLinks;
-               $saved = $wgNoFollowLinks;
-               $wgNoFollowLinks = false;
+               $this->setMwGlobals( 'wgNoFollowLinks', false );
 
                $attribs = $this->getAttribs();
                $this->assertArrayNotHasKey( 'rel', $attribs,
                        'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
                );
-
-               // Restore global
-               $wgNoFollowLinks = $saved;
        }
 
        /**
         * Test $wgExternaLinkTarget in sidebar
+        * @dataProvider dataRespectExternallinktarget
         */
-       function testRespectExternallinktarget() {
-               global $wgExternalLinkTarget;
-               $saved = $wgExternalLinkTarget;
-
-               $wgExternalLinkTarget = '_blank';
-               $attribs = $this->getAttribs();
-               $this->assertArrayHasKey( 'target', $attribs );
-               $this->assertEquals( $attribs['target'], '_blank' );
+       function testRespectExternallinktarget( $externalLinkTarget ) {
+               $this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
 
-               $wgExternalLinkTarget = '_self';
                $attribs = $this->getAttribs();
                $this->assertArrayHasKey( 'target', $attribs );
-               $this->assertEquals( $attribs['target'], '_self' );
-
-               // Restore global
-               $wgExternalLinkTarget = $saved;
+               $this->assertEquals( $attribs['target'], $externalLinkTarget );
        }
 
+       function dataRespectExternallinktarget() {
+               return array(
+                       array( '_blank' ),
+                       array( '_self' ),
+               );
+       }
 }