Merge "mw.widgets.CategorySelector: Prevent duplicates"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 23 Dec 2015 13:12:52 +0000 (13:12 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 23 Dec 2015 13:12:52 +0000 (13:12 +0000)
56 files changed:
includes/DefaultSettings.php
includes/Import.php
includes/Sanitizer.php
includes/Title.php
includes/api/ApiBase.php
includes/api/ApiRevisionDelete.php
includes/api/ApiTag.php
includes/api/ApiUndelete.php
includes/api/ApiUserrights.php
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LoadBalancer.php
includes/diff/DifferenceEngine.php
includes/installer/i18n/ast.json
includes/libs/objectcache/BagOStuff.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/utils/UIDGenerator.php
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/ca.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/it.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/mk.json
languages/i18n/nap.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/sd.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/war.json
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki/mediawiki.template.mustache.js
tests/parser/parserTests.txt
tests/phpunit/data/templates/conds.mustache [new file with mode: 0644]
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js [new file with mode: 0644]

index 54216fd..36b6533 100644 (file)
@@ -2609,7 +2609,14 @@ $wgCdnMaxageLagged = 30;
 /**
  * If set, any SquidPurge call on a URL or URLs will send a second purge no less than
  * this many seconds later via the job queue. This requires delayed job support.
- * This should be safely higher than the 'max lag' value in $wgLBFactoryConf.
+ * This should be safely higher than the 'max lag' value in $wgLBFactoryConf, so that
+ * slave lag does not cause page to be stuck in stales states in CDN.
+ *
+ * This also fixes race conditions in two-tiered CDN setups (e.g. cdn2 => cdn1 => MediaWiki).
+ * If a purge for a URL reaches cdn2 before cdn1 and a request reaches cdn2 for that URL,
+ * it will populate the response from the stale cdn1 value. When cdn1 gets the purge, cdn2
+ * will still be stale. If the rebound purge delay is safely higher than the time to relay
+ * a purge to all nodes, then the rebound puge will clear cdn2 after cdn1 was cleared.
  *
  * @since 1.27
  */
index 0999931..67f7ba5 100644 (file)
@@ -825,6 +825,30 @@ class WikiImporter {
         * @return bool|mixed
         */
        private function processRevision( $pageInfo, $revisionInfo ) {
+               global $wgMaxArticleSize;
+
+               // Make sure revisions won't violate $wgMaxArticleSize, which could lead to
+               // database errors and instability. Testing for revisions with only listed
+               // content models, as other content models might use serialization formats
+               // which aren't checked against $wgMaxArticleSize.
+               if ( ( !isset( $revisionInfo['model'] ) ||
+                       in_array( $revisionInfo['model'], array(
+                               'wikitext',
+                               'css',
+                               'json',
+                               'javascript',
+                               'text',
+                               ''
+                       ) ) ) &&
+                       (int)( strlen( $revisionInfo['text'] ) / 1024 ) > $wgMaxArticleSize
+               ) {
+                       throw new MWException( 'The text of ' .
+                               ( isset( $revisionInfo['id'] ) ?
+                                       "the revision with ID $revisionInfo[id]" :
+                                       'a revision'
+                               ) . " exceeds the maximum allowable size ($wgMaxArticleSize KB)" );
+               }
+
                $revision = new WikiRevision( $this->config );
 
                if ( isset( $revisionInfo['id'] ) ) {
index 4fc775f..5242856 100644 (file)
@@ -756,7 +756,9 @@ class Sanitizer {
                        # * data-mw-<name here> is reserved for extensions (or core) if
                        #   they need to communicate some data to the client and want to be
                        #   sure that it isn't coming from an untrusted user.
-                       if ( !preg_match( '/^data-(?!ooui|mw|parsoid)/i', $attribute )
+                       # * Ensure that the attribute is not namespaced by banning
+                       #   colons.
+                       if ( !preg_match( '/^data-(?!ooui|mw|parsoid)[^:]*$/i', $attribute )
                                && !isset( $whitelist[$attribute] )
                        ) {
                                continue;
index 5d8b072..35d9c6b 100644 (file)
@@ -768,16 +768,16 @@ class Title {
         * @param string $title The DB key form the title
         * @param string $fragment The link fragment (after the "#")
         * @param string $interwiki The interwiki prefix
-        * @param bool $canoncialNamespace If true, use the canonical name for
+        * @param bool $canonicalNamespace If true, use the canonical name for
         *   $ns instead of the localized version.
         * @return string The prefixed form of the title
         */
        public static function makeName( $ns, $title, $fragment = '', $interwiki = '',
-               $canoncialNamespace = false
+               $canonicalNamespace = false
        ) {
                global $wgContLang;
 
-               if ( $canoncialNamespace ) {
+               if ( $canonicalNamespace ) {
                        $namespace = MWNamespace::getCanonicalName( $ns );
                } else {
                        $namespace = $wgContLang->getNsText( $ns );
index 8a98197..cb74ae1 100644 (file)
@@ -1461,6 +1461,33 @@ abstract class ApiBase extends ContextSource {
                );
        }
 
+       /**
+        * Throw a UsageException, which will (if uncaught) call the main module's
+        * error handler and die with an error message including block info.
+        *
+        * @since 1.27
+        * @param Block $block The block used to generate the UsageException
+        * @throws UsageException always
+        */
+       public function dieBlocked( Block $block ) {
+               // Die using the appropriate message depending on block type
+               if ( $block->getType() == Block::TYPE_AUTO ) {
+                       $this->dieUsage(
+                               'Your IP address has been blocked automatically, because it was used by a blocked user',
+                               'autoblocked',
+                               0,
+                               array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) )
+                       );
+               } else {
+                       $this->dieUsage(
+                               'You have been blocked from editing',
+                               'blocked',
+                               0,
+                               array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) )
+                       );
+               }
+       }
+
        /**
         * Get error (as code, string) from a Status object.
         *
index b70b536..4db3ca1 100644 (file)
@@ -36,30 +36,12 @@ class ApiRevisionDelete extends ApiBase {
 
                $params = $this->extractRequestParams();
                $user = $this->getUser();
-
                if ( !$user->isAllowed( RevisionDeleter::getRestriction( $params['type'] ) ) ) {
                        $this->dieUsageMsg( 'badaccess-group0' );
                }
 
                if ( $user->isBlocked() ) {
-                       $block = $user->getBlock();
-
-                       // Die using the appropriate message depending on block type
-                       if ( $block->getType() == TYPE_AUTO ) {
-                               $this->dieUsage(
-                                       'Your IP address has been blocked automatically, because it was used by a blocked user',
-                                       'autoblocked',
-                                       0,
-                                       array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) )
-                               );
-                       } else {
-                               $this->dieUsage(
-                                       'You have been blocked from editing',
-                                       'blocked',
-                                       0,
-                                       array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) )
-                               );
-                       }
+                       $this->dieBlocked( $user->getBlock() );
                }
 
                if ( !$params['ids'] ) {
index 4157de0..4bf799e 100644 (file)
@@ -40,24 +40,7 @@ class ApiTag extends ApiBase {
                }
 
                if ( $user->isBlocked() ) {
-                       $block = $user->getBlock();
-
-                       // Die using the appropriate message depending on block type
-                       if ( $block->getType() == TYPE_AUTO ) {
-                               $this->dieUsage(
-                                       'Your IP address has been blocked automatically, because it was used by a blocked user',
-                                       'autoblocked',
-                                       0,
-                                       array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) )
-                               );
-                       } else {
-                               $this->dieUsage(
-                                       'You have been blocked from editing',
-                                       'blocked',
-                                       0,
-                                       array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) )
-                               );
-                       }
+                       $this->dieBlocked( $user->getBlock() );
                }
 
                // validate and process each revid, rcid and logid
index cd50ee6..469fe7f 100644 (file)
@@ -33,18 +33,13 @@ class ApiUndelete extends ApiBase {
                $this->useTransactionalTimeLimit();
 
                $params = $this->extractRequestParams();
-
-               if ( !$this->getUser()->isAllowed( 'undelete' ) ) {
+               $user = $this->getUser();
+               if ( !$user->isAllowed( 'undelete' ) ) {
                        $this->dieUsageMsg( 'permdenied-undelete' );
                }
 
-               if ( $this->getUser()->isBlocked() ) {
-                       $this->dieUsage(
-                               'You have been blocked from editing',
-                               'blocked',
-                               0,
-                               array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $this->getUser()->getBlock() ) )
-                       );
+               if ( $user->isBlocked() ) {
+                       $this->dieBlocked( $user->getBlock() );
                }
 
                $titleObj = Title::newFromText( $params['title'] );
index 3ccdde2..e32b612 100644 (file)
@@ -49,6 +49,14 @@ class ApiUserrights extends ApiBase {
        }
 
        public function execute() {
+               $pUser = $this->getUser();
+
+               // Deny if the user is blocked and doesn't have the full 'userrights' permission.
+               // This matches what Special:UserRights does for the web UI.
+               if ( $pUser->isBlocked() && !$pUser->isAllowed( 'userrights' ) ) {
+                       $this->dieBlocked( $pUser->getBlock() );
+               }
+
                $params = $this->extractRequestParams();
 
                $user = $this->getUrUser( $params );
index dc8b4b5..b386905 100644 (file)
        "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.",
        "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "Obtenir des informations supplémentaires sur les 10 premières pages utilisant <code>_&#95;NOTOC_&#95;</code>.",
-       "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.",
+       "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.\n\nMalgré les similarités dans le nom, ce module n’est pas destiné à être l’équivalent de [[Special:PrefixIndex]] ; pour cela, voyez <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> avec le paramètre <kbd>apprefix</kbd>. Le but de ce module est similaire à <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd> : prendre l’entrée utilisateur et fournir les meilleurs titres s’en approchant. Selon le serveur du moteur de recherche, cela peut inclure corriger des fautes de frappe, éviter des redirections, ou d’autres heuristiques.",
        "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
        "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.",
        "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
index 9d69078..5489b1d 100644 (file)
        "apihelp-query+allusers-paramvalue-prop-rights": "Lista os dereitos que ten o usuario.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "Engade o número de edicións do usuario.",
        "apihelp-query+allusers-paramvalue-prop-registration": "Engade o selo de tempo do momento no que se rexistrou o usuario, se está dispoñible (pode ser branco).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "Engade os identificadores centrais e o estado de acoplamento do usuario.",
        "apihelp-query+allusers-param-limit": "Número total de nomes de usuario a devolver.",
        "apihelp-query+allusers-param-witheditsonly": "Só listar usuarios que teñan feito edicións.",
        "apihelp-query+allusers-param-activeusers": "Só listar usuarios activos {{PLURAL:$1|no último día|nos $1 últimos días}}.",
        "apihelp-rollback-description": "Desfacer a última modificación da páxina.\n\nSe o último usuario que modificou a páxina fixo varias modificacións nunha fila, desfaranse todas.",
        "apihelp-rollback-param-title": "Título da páxina a desfacer. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-rollback-param-pageid": "ID da páxina a desfacer. Non pode usarse xunto con <var>$1title</var>.",
+       "apihelp-rollback-param-tags": "Etiquetas a aplicar á reversión.",
        "apihelp-rollback-param-user": "Nome do usuario cuxas modificacións van a desfacerse.",
        "apihelp-rollback-param-summary": "Personalizar o resumo de edición. Se está baleiro, usarase o resumo por defecto.",
        "apihelp-rollback-param-markbot": "Marcar as edicións revertidas e a reversión como edicións de bot.",
index 54093ee..5b54d0c 100644 (file)
        "apihelp-query+pageswithprop-param-dir": "באיזה כיוון לסדר.",
        "apihelp-query+pageswithprop-example-simple": "הצגת עשרת הדפים הראשונים שעושים שימוש ב־<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "קבלת מידע נוסף על עשרת הדפים הראשונים המשתמשים ב־<code>_&#95;NOTOC_&#95;</code>.",
-       "apihelp-query+prefixsearch-description": "ביצוע חיפוש תחילית של כותרות דפים.",
+       "apihelp-query+prefixsearch-description": "ביצוע חיפוש תחילית של כותרות דפים.\n\nלמרות הדמיון בשם, המודול הזה אינו אמור להיות שווה ל־[[Special:PrefixIndex]] (\"מיוחד:דפים המתחילים ב\"); לדבר כזה, ר' <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> עם הפרמטר <kbd>apprefix</kbd>. מטרת המודול הזה דומה ל־<kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: לקבל קלט ממשתמש ולספק את הכותרות המתאימות ביותר. בהתאם לשרת מנוע החיפוש, זה יכול לכלול תיקון שגיאות כתיב, הימנעות מדפי הפניה והירסטיקות אחרות.",
        "apihelp-query+prefixsearch-param-search": "מחרוזת לחיפוש.",
        "apihelp-query+prefixsearch-param-namespace": "שמות מתחם לחיפוש.",
        "apihelp-query+prefixsearch-param-limit": "מספר התוצאות המרבי להחזרה.",
index eeeca62..4aed718 100644 (file)
@@ -190,36 +190,47 @@ abstract class LBFactory {
         * @param array $args
         */
        private function forEachLBCallMethod( $methodName, array $args = array() ) {
-               $this->forEachLB( function ( LoadBalancer $loadBalancer, $methodName, array $args ) {
-                       call_user_func_array( array( $loadBalancer, $methodName ), $args );
-               }, array( $methodName, $args ) );
+               $this->forEachLB(
+                       function ( LoadBalancer $loadBalancer, $methodName, array $args ) {
+                               call_user_func_array( array( $loadBalancer, $methodName ), $args );
+                       },
+                       array( $methodName, $args )
+               );
        }
 
        /**
         * Commit on all connections. Done for two reasons:
         * 1. To commit changes to the masters.
         * 2. To release the snapshot on all connections, master and slave.
+        * @param string $fname Caller name
         */
-       public function commitAll() {
-               $this->forEachLBCallMethod( 'commitAll' );
+       public function commitAll( $fname = __METHOD__ ) {
+               $start = microtime( true );
+               $this->forEachLBCallMethod( 'commitAll', array( $fname ) );
+               $timeMs = 1000 * ( microtime( true ) - $start );
+
+               RequestContext::getMain()->getStats()->timing( "db.commit-all", $timeMs );
        }
 
        /**
         * Commit changes on all master connections
+        * @param string $fname Caller name
         */
-       public function commitMasterChanges() {
+       public function commitMasterChanges( $fname = __METHOD__ ) {
                $start = microtime( true );
-               $this->forEachLBCallMethod( 'commitMasterChanges' );
+               $this->forEachLBCallMethod( 'commitMasterChanges', array( $fname ) );
                $timeMs = 1000 * ( microtime( true ) - $start );
+
                RequestContext::getMain()->getStats()->timing( "db.commit-masters", $timeMs );
        }
 
        /**
         * Rollback changes on all master connections
+        * @param string $fname Caller name
         * @since 1.23
         */
-       public function rollbackMasterChanges() {
-               $this->forEachLBCallMethod( 'rollbackMasterChanges' );
+       public function rollbackMasterChanges( $fname = __METHOD__ ) {
+               $this->forEachLBCallMethod( 'rollbackMasterChanges', array( $fname ) );
        }
 
        /**
index 19b2d1c..4ff400c 100644 (file)
@@ -1021,14 +1021,15 @@ class LoadBalancer {
 
        /**
         * Commit transactions on all open connections
+        * @param string $fname Caller name
         */
-       public function commitAll() {
+       public function commitAll( $fname = __METHOD__ ) {
                foreach ( $this->mConns as $conns2 ) {
                        foreach ( $conns2 as $conns3 ) {
                                /** @var DatabaseBase[] $conns3 */
                                foreach ( $conns3 as $conn ) {
                                        if ( $conn->trxLevel() ) {
-                                               $conn->commit( __METHOD__, 'flush' );
+                                               $conn->commit( $fname, 'flush' );
                                        }
                                }
                        }
@@ -1036,9 +1037,10 @@ class LoadBalancer {
        }
 
        /**
-        *  Issue COMMIT only on master, only if queries were done on connection
+        * Issue COMMIT only on master, only if queries were done on connection
+        * @param string $fname Caller name
         */
-       public function commitMasterChanges() {
+       public function commitMasterChanges( $fname = __METHOD__ ) {
                $masterIndex = $this->getWriterIndex();
                foreach ( $this->mConns as $conns2 ) {
                        if ( empty( $conns2[$masterIndex] ) ) {
@@ -1047,7 +1049,7 @@ class LoadBalancer {
                        /** @var DatabaseBase $conn */
                        foreach ( $conns2[$masterIndex] as $conn ) {
                                if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       $conn->commit( __METHOD__, 'flush' );
+                                       $conn->commit( $fname, 'flush' );
                                }
                        }
                }
@@ -1055,9 +1057,11 @@ class LoadBalancer {
 
        /**
         * Issue ROLLBACK only on master, only if queries were done on connection
+        * @param string $fname Caller name
+        * @throws DBExpectedError
         * @since 1.23
         */
-       public function rollbackMasterChanges() {
+       public function rollbackMasterChanges( $fname = __METHOD__ ) {
                $failedServers = array();
 
                $masterIndex = $this->getWriterIndex();
@@ -1069,7 +1073,7 @@ class LoadBalancer {
                        foreach ( $conns2[$masterIndex] as $conn ) {
                                if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
                                        try {
-                                               $conn->rollback( __METHOD__, 'flush' );
+                                               $conn->rollback( $fname, 'flush' );
                                        } catch ( DBError $e ) {
                                                MWExceptionHandler::logException( $e );
                                                $failedServers[] = $conn->getServer();
index 781b6a6..5e37663 100644 (file)
@@ -459,74 +459,93 @@ class DifferenceEngine extends ContextSource {
        }
 
        /**
-        * Get a link to mark the change as patrolled, or '' if there's either no
-        * revision to patrol or the user is not allowed to to it.
+        * Build a link to mark a change as patrolled.
+        *
+        * Returns empty string if there's either no revision to patrol or the user is not allowed to.
         * Side effect: When the patrol link is build, this method will call
         * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
         *
-        * @return string
+        * @return string HTML or empty string
         */
        protected function markPatrolledLink() {
+               if ( $this->mMarkPatrolledLink === null ) {
+                       $linkInfo = $this->getMarkPatrolledLinkInfo();
+                       // If false, there is no patrol link needed/allowed
+                       if ( !$linkInfo ) {
+                               $this->mMarkPatrolledLink = '';
+                       } else {
+                               $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
+                                       $this->mNewPage,
+                                       $this->msg( 'markaspatrolleddiff' )->escaped(),
+                                       array(),
+                                       array(
+                                               'action' => 'markpatrolled',
+                                               'rcid' => $linkInfo['rcid'],
+                                               'token' => $linkInfo['token'],
+                                       )
+                               ) . ']</span>';
+                       }
+               }
+               return $this->mMarkPatrolledLink;
+       }
+
+       /**
+        * Returns an array of meta data needed to build a "mark as patrolled" link and
+        * adds the mediawiki.page.patrol.ajax to the output.
+        *
+        * @return array|false An array of meta data for a patrol link (rcid & token)
+        *  or false if no link is needed
+        */
+       protected function getMarkPatrolledLinkInfo() {
                global $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+
                $user = $this->getUser();
 
-               if ( $this->mMarkPatrolledLink === null ) {
-                       // Prepare a change patrol link, if applicable
-                       if (
-                               // Is patrolling enabled and the user allowed to?
-                               $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $user ) &&
-                               // Only do this if the revision isn't more than 6 hours older
-                               // than the Max RC age (6h because the RC might not be cleaned out regularly)
-                               RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 )
-                       ) {
-                               // Look for an unpatrolled change corresponding to this diff
-
-                               $db = wfGetDB( DB_SLAVE );
-                               $change = RecentChange::newFromConds(
-                                       array(
-                                               'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
-                                               'rc_this_oldid' => $this->mNewid,
-                                               'rc_patrolled' => 0
-                                       ),
-                                       __METHOD__
-                               );
+               // Prepare a change patrol link, if applicable
+               if (
+                       // Is patrolling enabled and the user allowed to?
+                       $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $user ) &&
+                       // Only do this if the revision isn't more than 6 hours older
+                       // than the Max RC age (6h because the RC might not be cleaned out regularly)
+                       RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 )
+               ) {
+                       // Look for an unpatrolled change corresponding to this diff
+                       $db = wfGetDB( DB_SLAVE );
+                       $change = RecentChange::newFromConds(
+                               array(
+                                       'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
+                                       'rc_this_oldid' => $this->mNewid,
+                                       'rc_patrolled' => 0
+                               ),
+                               __METHOD__
+                       );
 
-                               if ( $change && !$change->getPerformer()->equals( $user ) ) {
-                                       $rcid = $change->getAttribute( 'rc_id' );
-                               } else {
-                                       // None found or the page has been created by the current user.
-                                       // If the user could patrol this it already would be patrolled
-                                       $rcid = 0;
+                       if ( $change && !$change->getPerformer()->equals( $user ) ) {
+                               $rcid = $change->getAttribute( 'rc_id' );
+                       } else {
+                               // None found or the page has been created by the current user.
+                               // If the user could patrol this it already would be patrolled
+                               $rcid = 0;
+                       }
+                       // Build the link
+                       if ( $rcid ) {
+                               $this->getOutput()->preventClickjacking();
+                               if ( $wgEnableAPI && $wgEnableWriteAPI
+                                       && $user->isAllowed( 'writeapi' )
+                               ) {
+                                       $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
                                }
-                               // Build the link
-                               if ( $rcid ) {
-                                       $this->getOutput()->preventClickjacking();
-                                       if ( $wgEnableAPI && $wgEnableWriteAPI
-                                               && $user->isAllowed( 'writeapi' )
-                                       ) {
-                                               $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
-                                       }
 
-                                       $token = $user->getEditToken( $rcid );
-                                       $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
-                                               $this->mNewPage,
-                                               $this->msg( 'markaspatrolleddiff' )->escaped(),
-                                               array(),
-                                               array(
-                                                       'action' => 'markpatrolled',
-                                                       'rcid' => $rcid,
-                                                       'token' => $token,
-                                               )
-                                       ) . ']</span>';
-                               } else {
-                                       $this->mMarkPatrolledLink = '';
-                               }
-                       } else {
-                               $this->mMarkPatrolledLink = '';
+                               $token = $user->getEditToken( $rcid );
+                               return array(
+                                       'rcid' => $rcid,
+                                       'token' => $token,
+                               );
                        }
                }
 
-               return $this->mMarkPatrolledLink;
+               // No mark as patrolled link applicable
+               return false;
        }
 
        /**
index 41fcba6..da2a1c5 100644 (file)
@@ -77,6 +77,7 @@
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-type-mysql": "MySQL (o compatible)",
        "config-type-mssql": "Microsoft SQL Server",
+       "config-invalid-db-type": "Triba non válida de base de datos.",
        "config-missing-db-name": "Tienes d'introducir un valor pa «{{int:config-db-name}}».",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
index 703c195..b9be43d 100644 (file)
@@ -507,18 +507,27 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        /**
         * Increase stored value of $key by $value while preserving its TTL
         *
-        * This will create the key with value $init and TTL $ttl if not present
+        * This will create the key with value $init and TTL $ttl instead if not present
         *
         * @param string $key
         * @param int $ttl
         * @param int $value
         * @param int $init
-        * @return bool
+        * @return int|bool New value or false on failure
         * @since 1.24
         */
        public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) {
-               return $this->incr( $key, $value ) ||
-                       $this->add( $key, (int)$init, $ttl ) || $this->incr( $key, $value );
+               $newValue = $this->incr( $key, $value );
+               if ( $newValue === false ) {
+                       // No key set; initialize
+                       $newValue = $this->add( $key, (int)$init, $ttl ) ? $init : false;
+               }
+               if ( $newValue === false ) {
+                       // Raced out initializing; increment
+                       $newValue = $this->incr( $key, $value );
+               }
+
+               return $newValue;
        }
 
        /**
index 6705336..04b0434 100644 (file)
@@ -50,14 +50,10 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                // Build CSS rules
                $rules = array();
 
-               // Underline: 2 = browser default, 1 = always, 0 = never
+               // Underline: 2 = skin default, 1 = always, 0 = never
                if ( $options['underline'] < 2 ) {
                        $rules[] = "a { text-decoration: " .
                                ( $options['underline'] ? 'underline' : 'none' ) . "; }";
-               } else {
-                       # The scripts of these languages are very hard to read with underlines
-                       $rules[] = 'a:lang(ar), a:lang(kk-arab), a:lang(mzn), ' .
-                       'a:lang(ps), a:lang(ur) { text-decoration: none; }';
                }
                if ( $options['editfont'] !== 'default' ) {
                        // Double-check that $options['editfont'] consists of safe characters only
@@ -72,6 +68,15 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                return array( 'all' => $style );
        }
 
+       /**
+        * @param ResourceLoaderContext $context
+        * @return bool
+        */
+       public function isKnownEmpty( ResourceLoaderContext $context ) {
+               $styles = $this->getStyles( $context );
+               return isset( $styles['all'] ) && $styles['all'] === '';
+       }
+
        /**
         * @return string
         */
index e2de900..ed7ddb8 100644 (file)
@@ -373,12 +373,9 @@ class UIDGenerator {
                        $cache = ObjectCache::getLocalServerInstance();
                }
                if ( $cache ) {
-                       $counter = $cache->incr( $bucket, $count );
+                       $counter = $cache->incrWithInit( $bucket, $cache::TTL_INDEFINITE, $count, $count );
                        if ( $counter === false ) {
-                               if ( !$cache->add( $bucket, (int)$count ) ) {
-                                       throw new RuntimeException( 'Unable to set value to ' . get_class( $cache ) );
-                               }
-                               $counter = $count;
+                               throw new RuntimeException( 'Unable to set value to ' . get_class( $cache ) );
                        }
                }
 
index 280086c..f41175b 100644 (file)
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
-       "transaction-duration-limit-exceeded": "Para evitar crear un gran atrasu na replicación, esta transaición albortóse porque la duración de la escritura ($1) pasó la llende de $2 segundos.\nSi tas cambiando munchos oxetos al mesmu tiempu, intenta meyor facer operaciones múltiples más pequeñes.",
+       "transaction-duration-limit-exceeded": "Para evitar crear un gran atrasu na replicación, esta transaición albortóse porque la duración de la escritura ($1) pasó la llende de $2 {{PLURAL:$2|segundu|segundos}}.\nSi tas cambiando munchos oxetos al mesmu tiempu, intenta meyor facer operaciones múltiples más pequeñes.",
        "laggedslavemode": "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
        "readonly": "Base de datos candada",
        "enterlockreason": "Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu",
        "wlshowhideanons": "usuarios anónimos",
        "wlshowhidepatr": "ediciones supervisaes",
        "wlshowhidemine": "les mios ediciones",
+       "wlshowhidecategorization": "categorización de páxina",
        "watchlist-options": "Opciones de la llista de siguimientu",
        "watching": "Vixilando...",
        "unwatching": "Dexando de vixilar...",
        "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|cambiu|cambios}}",
        "tags-manage-no-permission": "Nun tienes permisu p'alministrar etiquetes de cambiu.",
+       "tags-manage-blocked": "Nun puedes xestionar etiquetes de cambiu mentanto teas bloquiáu.",
        "tags-create-heading": "Crear una etiqueta nueva",
        "tags-create-explanation": "De mou predetermináu, les etiquetes nueves que se creen tarán disponibles pa que les usen los usuarios y bots.",
        "tags-create-tag-name": "Nome de la etiqueta:",
        "tags-deactivate-not-allowed": "Nun ye posible desactivar la etiqueta «$1».",
        "tags-deactivate-submit": "Desactivar",
        "tags-apply-no-permission": "Nun tienes permisu p'aplicar etiquetes de cambios xunto colos cambios.",
+       "tags-apply-blocked": "Nun puedes aplicar etiquetes de cambiu xunto colos cambios mentanto teas bloquiáu.",
        "tags-apply-not-allowed-one": "Nun se permite aplicar manualmente la etiqueta «$1».",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta nun pue|Les siguientes etiquetes nun puen}} aplicase manualmente: $1",
        "tags-update-no-permission": "Nun tienes permisu p'amestar o desaniciar etiquetes de cambiu nes revisiones individuales o entraes del rexistru.",
+       "tags-update-blocked": "Nun puedes amestar o desaniciar etiquetes de cambiu mentanto teas bloquiáu.",
        "tags-update-add-not-allowed-one": "Nun se permite amestar manualmente la etiqueta «$1».",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta nun pue|Les siguientes etiquetes nun puen}} amestase manualmente: $1",
        "tags-update-remove-not-allowed-one": "Nun se permite desaniciar la etiqueta «$1».",
index 2cdbc82..338bc87 100644 (file)
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Вы таксама можаце скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі правілы сайту дазваляюць загрузку такога файлу.",
        "foreign-structured-upload-form-2-label-intro": "Дзякуем за ахвяраваньне выявы, якая будзе выкарыстаная ў {{GRAMMAR:месны|{{SITENAME}}}}. Вам варта працягваць, калі яна адпавядае наступным умовам:",
        "foreign-structured-upload-form-2-label-ownwork": "Гэта мусіць быць цалкам <strong>вашая ўласная праца</strong>, а ня проста выява з Інтэрнэту",
+       "foreign-structured-upload-form-2-label-noderiv": "Яна <strong>не павінна ўтрымліваць чужой працы</strong> або быць натхнёнай ёю",
+       "foreign-structured-upload-form-2-label-useful": "Яна павінна быць <strong>адукацыйнай і карыснай</strong> для навучаньня іншых",
        "backend-fail-stream": "Немагчыма накіраваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файла $1.",
        "backend-fail-notexists": "Файл $1 не існуе.",
index 8e9e456..91061f4 100644 (file)
        "userloginnocreate": "Inici de sessió",
        "logout": "Finalitza la sessió",
        "userlogout": "Finalitza la sessió",
-       "notloggedin": "No us heu identificat",
+       "notloggedin": "Sense sessió iniciada",
        "userlogin-noaccount": "No teniu cap compte?",
        "userlogin-joinproject": "Uniu-vos a {{SITENAME}}",
        "nologin": "No teniu un compte? '''$1'''.",
        "createacct-another-realname-tip": "El nom real és opcional.\nSi decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
        "pt-login": "Inicia la sessió",
        "pt-login-button": "Inicia sessió",
-       "pt-createaccount": "Creeu un compte",
+       "pt-createaccount": "Crea un compte",
        "pt-userlogout": "Finalitza la sessió",
        "php-mail-error-unknown": "Error desconegut en la funció mail() de PHP",
        "user-mail-no-addy": "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
index 44ee916..431f680 100644 (file)
        "usercssyoucanpreview": "<strong>Tip:</strong> Použijte tlačítko „{{int:showpreview}}“ k testování vašeho nového CSS před uložením.",
        "userjsyoucanpreview": "<strong>Tip:</strong> Použijte tlačítko „{{int:showpreview}}“ k testování vašeho nového JavaScriptu před uložením.",
        "usercsspreview": "<strong>Pamatujte, že si prohlížíte jen náhled vašeho uživatelského CSS, jelikož dosud nebyl uložen!</strong>",
-       "userjspreview": "<strong>Pamatujte, že testujete a prohlížíte pouze náhled vašeho uživatelského JavaScriptu, jelikož dosud nebyl uložen!</strong>'",
+       "userjspreview": "<strong>Pamatujte, že testujete a prohlížíte pouze náhled svého uživatelského JavaScriptu, jelikož dosud nebyl uložen!</strong>",
        "sitecsspreview": "<strong>Pamatujte, že si prohlížíte jen náhled tohoto CSS, jelikož dosud nebylo uloženo!</strong>",
        "sitejspreview": "<strong>Pamatujte, že testujete a prohlížíte pouze náhled tohoto JavaScriptu, jelikož dosud nebyl uložen!</strong>",
        "userinvalidcssjstitle": "<strong>Varování:</strong> Vzhled „$1“ neexistuje. Nezapomeňte, že uživatelské .css a .js soubory používají malá písmena, např. {{ns:user}}:{{BASEPAGENAME}}/vector.css, nikoli {{ns:user}}:{{BASEPAGENAME}}/Vector.css.",
        "changecontentmodel-nodirectediting": "Model obsahu $1 nepodporuje přímou editaci",
        "log-name-contentmodel": "Kniha změny modelů obsahu",
        "log-description-contentmodel": "Události týkající se modelů obsahu stránek",
-       "logentry-contentmodel-change": "$1 {{GENDER:$2|změnil|změnila}} obsah modelu stránky $3 z „$4“ na „$5“",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|změnil|změnila}} model obsahu stránky $3 z „$4“ na „$5“",
        "logentry-contentmodel-change-revertlink": "vrátit",
        "logentry-contentmodel-change-revert": "vrácení zpět",
        "protectlogpage": "Kniha zamčení",
        "import-error-special": "Stránka „$1“ se nenaimportovala, protože patří do speciálního jmenného prostoru, ve kterém stránky být nemohou.",
        "import-error-invalid": "Stránka „$1“ se nenaimportovala, protože název, pod kterým by se naimportovala, je na této wiki nepoužitelný.",
        "import-error-unserialize": "Nepodařilo se deserializovat revizi $2 stránky „$1“. Revize měla používat model obsahu $3 serializovaný jako $4.",
-       "import-error-bad-location": "Revizi $2 používající obsahový model $3 nelze uložit na \"$1\" na této wiki, neboť tento model není na této stránce podporován.",
+       "import-error-bad-location": "Revizi $2 používající model obsahu $3 nelze uložit jako „$1“ na této wiki, neboť tento model není na této stránce podporován.",
        "import-options-wrong": "{{PLURAL:$2|Chybná volba|Chybné volby}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Zadaný název kořenové stránky je neplatný.",
        "import-rootpage-nosubpage": "Ve jmenném prostoru „$1“ kořenové stránky nejsou dovoleny podstránky.",
        "tags-deactivate": "deaktivovat",
        "tags-hitcount": "$1 {{PLURAL:$1|změna|změny|změn}}",
        "tags-manage-no-permission": "Nemáte oprávnění spravovat značky pro změny.",
-       "tags-manage-blocked": "Nemůžete spravovat značky, když jste {{GENDER:zablokován|zablokována|zablokováni}}.",
+       "tags-manage-blocked": "Nemůžete spravovat značky, když jste {{GENDER:|zablokován|zablokována|zablokováni}}.",
        "tags-create-heading": "Vytvořit novou značku",
        "tags-create-explanation": "Nově vytvořené značky jsou implicitně k dispozici uživatelům a botům.",
        "tags-create-tag-name": "Název značky:",
        "tags-deactivate-not-allowed": "Značku „$1“ nelze deaktivovat.",
        "tags-deactivate-submit": "Deaktivovat",
        "tags-apply-no-permission": "Nemáte oprávnění přidávat značky k vlastním změnám",
-       "tags-apply-blocked": "Nemůžete ke svým změnám přidávat značky, když jste {{GENDER:zablokován|zablokována|zablokováni}}.",
+       "tags-apply-blocked": "Nemůžete ke svým změnám přidávat značky, když jste {{GENDER:|zablokován|zablokována|zablokováni}}.",
        "tags-apply-not-allowed-one": "Značku „$1“ není dovoleno ručně přidávat.",
        "tags-apply-not-allowed-multi": "Následující {{PLURAL:$2|značku|značky}} není dovoleno ručně přidávat: $1",
        "tags-update-no-permission": "Nemáte oprávnění přidávat libovolné značky na jednotlivé revize a protokolovací záznamy a odebírat je",
-       "tags-update-blocked": "Nemůžete přidávat nebo ubírat značky, když jste {{GENDER:zablokován|zablokována|zablokováni}}.",
+       "tags-update-blocked": "Nemůžete přidávat nebo odebírat značky, když jste {{GENDER:|zablokován|zablokována|zablokováni}}.",
        "tags-update-add-not-allowed-one": "Značku „$1“ není dovoleno ručně přidávat.",
        "tags-update-add-not-allowed-multi": "Následující {{PLURAL:$2|značku|značky}} není dovoleno ručně přidávat: $1",
        "tags-update-remove-not-allowed-one": "Značku „$1“ není dovoleno odebírat.",
index 050d208..699cc1a 100644 (file)
        "wlshowhideanons": "Anonyme Benutzer",
        "wlshowhidepatr": "Kontrollierte Bearbeitungen",
        "wlshowhidemine": "Meine Bearbeitungen",
+       "wlshowhidecategorization": "Seitenkategorisierung",
        "watchlist-options": "Anzeigeoptionen",
        "watching": "Beobachten …",
        "unwatching": "Nicht mehr beobachten …",
        "mediastatistics-summary": "Statistiken über hochgeladene Dateitypen. Dies beinhaltet nur die aktuellste Version einer Datei. Alte oder gelöschte Dateiversionen sind ausgeschlossen.",
        "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3 %)",
+       "mediastatistics-bytespertype": "Gesamte Dateigröße für diesen Abschnitt: $1 Bytes.",
+       "mediastatistics-allbytes": "Gesamte Dateigröße für alle Dateien: $1 Bytes.",
        "mediastatistics-table-mimetype": "MIME-Typ",
        "mediastatistics-table-extensions": "Mögliche Erweiterungen",
        "mediastatistics-table-count": "Anzahl der Dateien",
index 3f761f6..779b8b7 100644 (file)
        "unprotectthispage": "Change protection of this page",
        "newpage": "New page",
        "talkpage": "Discuss this page",
-       "talkpagelinktext": "Talk",
+       "talkpagelinktext": "talk",
        "specialpage": "Special page",
        "personaltools": "Personal tools",
        "addsection": "+",
index 0d08b3b..f6c83d6 100644 (file)
        "wantedtemplates": "Plantillas requeridas",
        "mostlinked": "Artículos más enlazados",
        "mostlinkedcategories": "Categorías más enlazadas",
-       "mostlinkedtemplates": "Páginas más transcluídas",
+       "mostlinkedtemplates": "Páginas más transcluidas",
        "mostcategories": "Páginas con más categorías",
        "mostimages": "Imágenes más usadas",
        "mostinterwikis": "Páginas con más interwikis",
index f31cbad..957fb66 100644 (file)
        "wlshowhideanons": "utilisateurs anonymes",
        "wlshowhidepatr": "modifications relues",
        "wlshowhidemine": "mes modifications",
+       "wlshowhidecategorization": "catégorisation de la page",
        "watchlist-options": "Options de la liste de suivi",
        "watching": "Suivi…",
        "unwatching": "Fin du suivi…",
index afb197f..96b65d7 100644 (file)
        "databaseerror-query": "Pescuda: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Erro: $1",
-       "transaction-duration-limit-exceeded": "Para evitar crear un gran atraso na replicación, esta transacción abortouse xa que a duración de escritura ($1) excedeu o límite de $2 segundos.\nSe estás a cambiar moitos obxectos ao mesmo tempo, procura facer operacións múltiples máis pequenas no seu lugar.",
+       "transaction-duration-limit-exceeded": "Para evitar crear un gran atraso na replicación, esta transacción abortouse xa que a duración de escritura ($1) excedeu o límite de $2 {{PLURAL:$2|segundo|segundos}} .\nSe está a cambiar moitos obxectos ao mesmo tempo, procure facer operacións múltiples máis pequenas no seu lugar.",
        "laggedslavemode": "'''Aviso:''' A páxina pode non conter as actualizacións recentes.",
        "readonly": "Base de datos pechada",
        "enterlockreason": "Dea unha razón para o peche, incluíndo unha estimación de até cando se manterá",
-       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probablemente debido a procesos de mantemento, tras os que volverá á normalidade.\n\nO administrador que a pechou deu esta explicación: $1",
+       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probablemente debido a procesos de mantemento, tras os que volverá á normalidade.\n\nO administrador de sistemas que a pechou deu esta explicación: $1",
        "missing-article": "A base de datos non atopou o texto da páxina chamada \"$1\" $2, que debera ter atopado.\n\nNormalmente, isto está causado por seguir unha ligazón cara a unha diferenza vella ou a unha páxina que foi borrada.\n\nSe este non é o caso, poida que atopase un erro no software.\nPor favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando nota do enderezo URL.",
        "missingarticle-rev": "(nº de revisión: $1)",
        "missingarticle-diff": "(dif: $1, $2)",
        "mypreferencesprotected": "Non ten os permisos necesarios para editar as súas preferencias.",
        "ns-specialprotected": "Non se poden editar as páxinas no espazo de nomes \"{{ns:special}}\".",
        "titleprotected": "Este título foi protexido da creación por [[User:$1|$1]].\nO motivo achegado é ''$2''.",
-       "filereadonlyerror": "Non se puido modificar o ficheiro \"$1\" porque o repositorio \"$2\" está en modo de só lectura.\n\nO administrador que bloqueou o repositorio achegou este motivo: \"$3\".",
+       "filereadonlyerror": "Non se puido modificar o ficheiro \"$1\" porque o repositorio \"$2\" está en modo de só lectura.\n\nO administrador de sistemas que bloqueou o repositorio achegou este motivo: \"$3\".",
        "invalidtitle-knownnamespace": "Título inválido co espazo de nomes \"$2\" e o texto \"$3\"",
        "invalidtitle-unknownnamespace": "Título inválido cun número de espazo de nomes, $1, descoñecido e o texto \"$2\"",
        "exception-nologin": "Non accedeu ao sistema",
        "passwordreset-emailtext-ip": "Alguén (probablemente vostede, desde o enderezo IP $1) solicitou o restablecemento do seu\ncontrasinal de {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailtext-user": "O usuario $1 solicitou o restablecemento do contrasinal de {{SITENAME}}\n($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailelement": "Nome de usuario: \n$1\n\nContrasinal temporal: \n$2",
-       "passwordreset-emailsentemail": "Se esta é unha dirección de correo electrónico rexistrada para a túa conta, entón enviarase un correo electrónico para o restablecemento do teu contrasinal.",
+       "passwordreset-emailsentemail": "Se esta é unha dirección de correo electrónico rexistrada para a súa conta, entón enviarase un correo electrónico para o restablecemento do seu contrasinal.",
+       "passwordreset-emailsentusername": "Se hai unha dirección de correo electrónico rexistrada para esta conta, entón enviarase un correo electrónico para o 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 {{GENDER:$2|ao usuario|á usuaria}} fallou: $1",
        "changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
        "copyrightwarning2": "Por favor, decátese de que todas as súas contribucións a {{SITENAME}} poden ser editadas, alteradas ou eliminadas por outras persoas. Se non quere que os seus escritos sexan editados sen piedade, non os publique aquí.<br />\nDo mesmo xeito, comprométese a que o que vostede escriba sexa da súa autoría ou copiado dunha fonte de dominio público ou recurso público semellante (vexa $1 para detalles).\n'''NON ENVÍE SEN PERMISO TRABALLOS CON DEREITOS DE COPIA!'''",
        "editpage-cannot-use-custom-model": "O modelo de contido desta páxina non se pode modificar.",
        "longpageerror": "'''Erro: O texto que pretende gardar ocupa {{PLURAL:$1|$1 kilobyte|$1 kilobytes}}, e existe un límite dun máximo de {{PLURAL:$2|$2 kilobyte|$2 kilobytes}}.'''\nPolo tanto, non se pode gardar.",
-       "readonlywarning": "'''Atención: A base de datos foi pechada para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.'''\nSe cadra, pode cortar e pegar o texto nun ficheiro de texto e gardalo para despois.\n\nO administrador que a pechou deu esta explicación: $1",
+       "readonlywarning": "<strong>Atención: A base de datos foi pechada para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.</strong>\nSe cadra, pode cortar e pegar o texto nun ficheiro de texto e gardalo para despois.\n\nO administrador de sistemas que a pechou deu esta explicación: $1",
        "protectedpagewarning": "'''Aviso: Esta páxina foi protexida de xeito que só os usuarios con privilexios de administrador a poidan editar.'''\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "semiprotectedpagewarning": "'''Nota:''' Esta páxina foi protexida de xeito que só os usuarios rexistrados a poidan editar.\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta páxina foi protexida de xeito que só a poden editar os usuarios con privilexios de administrador debido a que está transcluída {{PLURAL:$1|na seguinte páxina protexida|nas seguintes páxinas protexidas}} coa opción \"protección en serie\" activada:",
        "permissionserrors": "Erro de permisos",
        "permissionserrorstext": "Non ten os permisos necesarios para facelo {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "permissionserrorstext-withaction": "Non ten os permisos necesarios para $2, {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
-       "contentmodelediterror": "Non pode editar esta revisión porque o seu modelo de contido é <code>$1</code>, e o modelo de contido actual da páxina é <code>$2</code>.",
+       "contentmodelediterror": "Non pode editar esta revisión porque o seu modelo de contido é <code>$1</code>, o cal difire do modelo de contido actual da páxina <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Atención: Vai volver crear unha páxina que xa foi eliminada anteriormente.'''\n\nDebería considerar se é apropiado continuar a editar esta páxina.\nVelaquí están o rexistro de borrados e mais o de traslados desta páxina, por se quere consultalos:",
        "moveddeleted-notice": "Esta páxina foi borrada.\nA continuación pódese ver o rexistro de borrados e traslados desta páxina, por se quere consultalos.",
        "moveddeleted-notice-recent": "Sentímolo, esta página foi borrada recentemente (dentro das últimas 24 horas).\nO rexistro de borrado e traslado da páxina amósanse abaixo como referencia.",
        "recentchanges-legend-heading": "'''Lenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Mostrar",
        "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "rcshowhideminor": "$1 as edicións pequenas",
        "foreign-structured-upload-form-label-own-work-message-shared": "Certifico que son o propietario dos dereitos de autor deste ficheiro, e que concordo a liberar irrevocablemente este ficheiro a Wikimedia Commons baixo a licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], e que concordo cos [https://wikimediafoundation.org/wiki/Terms_of_Use Termos de uso].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Se non posúe os dereitos de autor deste ficheiro, ou quere liberalo baixo unha licenza diferente, considere usar o [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subas de Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Tamén pode interesarlle usar [[Special:Upload|a páxina de carga en {{SITENAME}}]], se o sitio permite a suba deste ficheiro nas súas políticas.",
+       "foreign-structured-upload-form-2-label-intro": "Grazas por doar unha imaxe para ser usada en {{SITENAME}}. Só debería continuar se se cumpren varias condicións:",
+       "foreign-structured-upload-form-2-label-ownwork": "Debe ser completamente <strong>creada por vostede</strong>, non só tomada de Internet",
+       "foreign-structured-upload-form-2-label-noderiv": "Non ten que conter <strong>traballo creado por outra persoa</strong>, nin estar  inspirado por outras obras",
+       "foreign-structured-upload-form-2-label-useful": "Debe ser <strong>educativo e útil</strong> para ensinar a outros",
+       "foreign-structured-upload-form-2-label-ccbysa": "Debe aceptar a <strong>publicación de forma irrevogable</strong> en Internet baixo a licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]",
+       "foreign-structured-upload-form-2-label-alternative": "Se non todos os criterios de arriba son certos, aínda pode subir este ficheiro usando o [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subas de Commons], mentres estea dispoñible baixo unha licenza libre.",
+       "foreign-structured-upload-form-2-label-termsofuse": "Ó subir o ficheiro, vostede da fe de que é o dono dos dereitos de autor neste ficheiro, e acepta irrevogablemente liberar este ficheiro a Wikimedia Commons baixo a licenza Creative Commons Attribution-ShareAlike 4.0, e acepta os [https://wikimediafoundation.org/wiki/Terms_of_Use Termos de Uso].",
+       "foreign-structured-upload-form-3-label-question-website": "Descargou esta imaxe dun sitio web, ou obtívoa dunha busca de imaxes?",
+       "foreign-structured-upload-form-3-label-question-ownwork": "Creou esta imaxe (tomou a foto, fixo o debuxo, etc) vostede mesmo?",
+       "foreign-structured-upload-form-3-label-question-noderiv": "Contén, ou está inspirada por, traballo propiedade de calquera outra persoa, como un logotipo?",
+       "foreign-structured-upload-form-3-label-yes": "Si",
+       "foreign-structured-upload-form-3-label-no": "Non",
+       "foreign-structured-upload-form-3-label-alternative": "Desafortunadamente, neste caso, esta ferramenta non é compatible para subir este ficheiro. Aínda pode ser capaz de subir este ficheiro usando o [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subas de Commons], mentres estea dispoñible baixo unha licenza libre.",
+       "foreign-structured-upload-form-4-label-good": "Ó usar esta ferramenta, pode subir gráficos educativos que crease e fotografías que fixese, que non conteñan traballo de ninguén máis.",
+       "foreign-structured-upload-form-4-label-bad": "Non pode subir imaxes atopadas nun motor de buscas ou descargadas doutros sitios web.",
        "backend-fail-stream": "Non se puido transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Non se puido facer unha copia de seguridade do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro \"$1\" non existe.",
        "mostrevisions": "Páxinas con máis revisións",
        "prefixindex": "Todas as páxinas con prefixo",
        "prefixindex-namespace": "Todas as páxinas con prefixo (espazo de nomes $1)",
+       "prefixindex-submit": "Mostrar",
        "prefixindex-strip": "Quitar o prefixo na lista",
        "shortpages": "Páxinas curtas",
        "longpages": "Páxinas longas",
        "protectedpages-performer": "Protector",
        "protectedpages-params": "Parámetros da protección",
        "protectedpages-reason": "Motivo",
+       "protectedpages-submit": "Mostrar páxinas",
        "protectedpages-unknown-timestamp": "Descoñecido",
        "protectedpages-unknown-performer": "Usuario descoñecido",
        "protectedtitles": "Títulos protexidos",
        "protectedtitles-summary": "Esta páxina lista os títulos que están protexidos actualmente fronte á creación. Para obter unha lista de páxinas existentes protexidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Actualmente non hai ningún título protexido con eses parámetros.",
+       "protectedtitles-submit": "Mostrar títulos",
        "listusers": "Lista de usuarios",
        "listusers-editsonly": "Mostrar só os usuarios con edicións",
        "listusers-creationsort": "Ordenar por data de creación",
        "usereditcount": "$1 {{PLURAL:$1|edición|edicións}}",
        "usercreated": "{{GENDER:$3|Creado|Creada}} o $1 ás $2",
        "newpages": "Páxinas novas",
+       "newpages-submit": "Mostrar",
        "newpages-username": "Nome de usuario:",
        "ancientpages": "Páxinas máis antigas",
        "move": "Mover",
        "specialloguserlabel": "Executante:",
        "speciallogtitlelabel": "Obxectivo (título ou {{ns:user}}:nome de usuario):",
        "log": "Rexistros",
+       "logeventslist-submit": "Mostrar",
        "all-logs-page": "Todos os rexistros públicos",
        "alllogstext": "Vista combinada de todos os rexistros dipoñibles en {{SITENAME}}.\nPode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario ou o título da páxina afectada.",
        "logempty": "Non se atopou ningún elemento relacionado no rexistro.",
        "cachedspecial-viewing-cached-ts": "Está a ver unha versión da páxina gardada na caché, que pode non estar completamente actualizada.",
        "cachedspecial-refresh-now": "Ir á versión máis recente.",
        "categories": "Categorías",
+       "categories-submit": "Mostrar",
        "categoriespagetext": "{{PLURAL:$1|A seguinte categoría contén|As seguintes categorías conteñen}} páxinas ou contidos multimedia.\nAquí non se mostran as [[Special:UnusedCategories|categorías sen uso]].\nOlle tamén as [[Special:WantedCategories|categorías requiridas]].",
        "categoriesfrom": "Mostrar as categorías que comecen por:",
        "special-categories-sort-count": "ordenar por número",
        "activeusers-hidebots": "Agochar os bots",
        "activeusers-hidesysops": "Agochar os administradores",
        "activeusers-noresult": "Non se atopou ningún usuario.",
+       "activeusers-submit": "Mostrar usuarios activos",
        "listgrouprights": "Dereitos dun usuario segundo o seu grupo",
        "listgrouprights-summary": "A seguinte lista mostra os grupos de usuario definidos neste wiki, cos seus dereitos de acceso asociados.\nSe quere máis información acerca dos dereitos individuais, pode atopala [[{{MediaWiki:Listgrouprights-helppage}}|aquí]].",
        "listgrouprights-key": "Lenda:\n* <span class=\"listgrouprights-granted\">Dereito concedido</span>\n* <span class=\"listgrouprights-revoked\">Dereito revogado</span>",
        "wlshowlast": "Mostrar as últimas $1 horas e os últimos $2 días",
        "watchlistall2": "todo",
        "watchlist-hide": "Agochar",
+       "watchlist-submit": "Mostrar",
        "wlshowtime": "Periodo de tempo a amosar:",
        "wlshowhideminor": "edicións menores",
        "wlshowhidebots": "bots",
        "wlshowhideanons": "usuarios anónimos",
        "wlshowhidepatr": "edicións vixiadas",
        "wlshowhidemine": "as miñas edicións",
+       "wlshowhidecategorization": "categorización da páxina",
        "watchlist-options": "Opcións de vixilancia",
        "watching": "Vixiando...",
        "unwatching": "Deixando de vixiar...",
        "delete-confirm": "Borrar \"$1\"",
        "delete-legend": "Borrar",
        "historywarning": "<strong>Atención:</strong> A páxina que está a piques de borrar ten un historial con $1 {{PLURAL:$1|revisión|revisións}}:",
+       "historyaction-submit": "Mostrar",
        "confirmdeletetext": "Está a piques de borrar de xeito permanente unha páxina ou imaxe con todo o seu historial na base de datos.\nPor favor, confirme que é realmente a súa intención, que comprende as consecuencias e que está obrando de acordo coas regras [[{{MediaWiki:Policy-url}}|da política e normas]].",
        "actioncomplete": "Completouse a acción",
        "actionfailed": "Fallou a acción",
        "whatlinkshere-hidelinks": "$1 as ligazóns",
        "whatlinkshere-hideimages": "$1 as ligazóns ao ficheiro",
        "whatlinkshere-filters": "Filtros",
+       "whatlinkshere-submit": "Ir",
        "autoblockid": "Bloqueo automático nº$1",
        "block": "Bloquear un usuario",
        "unblock": "Desbloquear un usuario",
        "exif-compression-6": "JPEG (vello)",
        "exif-copyrighted-true": "Con dereitos de autoría",
        "exif-copyrighted-false": "Dereitos de autoría non definidos",
+       "exif-photometricinterpretation-1": "Negro e branco (negro é 0)",
        "exif-unknowndate": "Data descoñecida",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Volteada horizontalmente",
        "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificación|modificacións}}",
        "tags-manage-no-permission": "Non ten os permisos necesarios para modificar etiquetas.",
+       "tags-manage-blocked": "Non pode acceder á interface de modificación de etiquetas mentres estea bloqueado.",
        "tags-create-heading": "Crear unha nova etiqueta",
        "tags-create-explanation": "Por defecto, as etiquetas creadas recentemente poderán ser empregadas polos usuarios e os bots.",
        "tags-create-tag-name": "Nome da etiqueta:",
        "tags-deactivate-not-allowed": "Non é posible reactivar a páxina \"$1\".",
        "tags-deactivate-submit": "Desactivar",
        "tags-apply-no-permission": "Non ten permisos para aplicar etiquetas de cambios xunto cos seus tus cambios.",
+       "tags-apply-blocked": "Non pode aplicar os cambios das etiquetas cos seus cambios mentras estea bloqueado.",
        "tags-apply-not-allowed-one": "A etiqueta \"$1\" non se puede aplicar manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta non se pode|As seguintes etiquetas non se poden}} aplicar manualmente: $1",
        "tags-update-no-permission": "Non ten permisos para engadir ou quitar etiquetas de cambio das revisións individuais ou das entradas do rexistro.",
+       "tags-update-blocked": "Non pode engadir nin quitar de modificación etiquetas mentras estea bloqueado.",
        "tags-update-add-not-allowed-one": "A etiqueta \"$1\" non se pode engadir manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta non se pode|As seguintes etiquetas non se poden}} engadir manualmente: $1",
        "tags-update-remove-not-allowed-one": "A etiqueta \"$1\" non se pode eliminar.",
index c86a511..6ba8b97 100644 (file)
        "viewyourtext": "આપ આ પાનાનાં '''આપનાં સંપાદનો'''નો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:",
        "protectedinterface": "આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.\nબધાંજ વિકિ માટે ભાષાંતર ઉમેરવા કે બદલવા માટે, કૃપા કરી [//translatewiki.net/ translatewiki.net], મિડિયાવિકિ સ્થાનિયકરણ પ્રકલ્પ, વાપરો.",
        "editinginterface": "<strong>ચેતવણી:</strong> તમે જે પાનામાં ફેરફાર કરી રહ્યા છો તે પાનું સોફ્ટવેર માટે ઇન્ટરફેસ ટેક્સટ પૂરી પાડે છે.\nઅહીંનો બદલાવ આ વિકિ પર ઉપસ્થિત અન્ય સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.",
-       "cascadeprotected": "આ પાના પર ફેરફાર પ્રતિબંધિત છે કેમ કે આ પાનું  {{PLURAL:$1|એવું પાનું|એવા પાના}} માં શામિલ છે જેમાં અનુવર્તી (પગથિયામય)સંરક્ષણ સક્રીય છે :\n$2",
+       "cascadeprotected": "આ પાના પર ફેરફાર પ્રતિબંધિત છે, કારણ કે આ પાનું {{PLURAL:$1|એવા પાનાં}}નું સભ્ય છે કે જેમાં અનુવર્તી(પગથિયામય) સંરક્ષણ લાગુ કરવામાં આવ્યું છે :\n$2",
        "namespaceprotected": "તમને '''$1''' નામાવકાશનાં પાનાંમાં ફેરફાર કરવાની પરવાનગી નથી.",
        "customcssprotected": "તમને આ પાનું બદલવાની પરવાનગી નથી કારણકે આ પાનામાં બીજા સભ્યની પસંદગીના સેટીંગ્સ છે.",
        "customjsprotected": "તમને આ JavaScript પાનું બદલવાની પરવાનગી નથી કારણકે આ પાનામાં બીજા સભ્યની પસંદગીના સેટીંગ્સ છે.",
        "nav-login-createaccount": "પ્રવેશ કરો / નવું ખાતું ખોલો",
        "userlogin": "પ્રવેશ કરો / નવું ખાતું ખોલો",
        "userloginnocreate": "પ્રવેશ",
-       "logout": "બહાર àª¨à«\80àª\95ળà«\8b",
+       "logout": "પà«\8dરસà«\8dથાન",
        "userlogout": "પ્રસ્થાન/લૉગ આઉટ",
        "notloggedin": "પ્રવેશ કરેલ નથી",
        "userlogin-noaccount": "શું તમારૂં ખાતું નથી?",
        "pt-login": "પ્રવેશ",
        "pt-login-button": "પ્રવેશો",
        "pt-createaccount": "ખાતું બનાવો",
-       "pt-userlogout": "બહાર àª¨à«\80àª\95ળà«\8b",
+       "pt-userlogout": "પà«\8dરસà«\8dથાન",
        "php-mail-error-unknown": "PHPની મેલ() કામગીરીમાં અજ્ઞાત ત્રુટિ",
        "user-mail-no-addy": "ઈ મેલ એડ્રસ વગર ઈ મેલ મોકલવા પ્રયત્ન કરેલ.",
        "user-mail-no-body": "કોરો કે નાનકડો ઈમેઇલ મોકલવાનો પ્રયાસ કરાયો.",
        "tooltip-pt-watchlist": "તમે દેખરેખ રાખી રહ્યાં હોવ તેવા પાનાઓની યાદી",
        "tooltip-pt-mycontris": "તમારા યોગદાનની યાદી",
        "tooltip-pt-login": "આપને પ્રવેશ કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી",
-       "tooltip-pt-logout": "બહાર àª¨à«\80àª\95ળà«\8b",
+       "tooltip-pt-logout": "પà«\8dરસà«\8dથાન",
        "tooltip-pt-createaccount": "તમને ખાતું બનાવીને પ્રવેશ કરવા માટે આમંત્રણ છે; તેમ કરવું જોકે, આવશ્યક નથી",
        "tooltip-ca-talk": "અનુક્રમણિકાનાં પાના વિષે ચર્ચા",
        "tooltip-ca-edit": "આ પાનામાં ફેરફાર કરો",
index c00a8cc..fcb711e 100644 (file)
        "wlshowhideanons": "משתמשים אנונימיים",
        "wlshowhidepatr": "עריכות בדוקות",
        "wlshowhidemine": "עריכות שלי",
+       "wlshowhidecategorization": "הוספות והסרות של דפים מקטגוריות",
        "watchlist-options": "אפשרויות ברשימת המעקב",
        "watching": "בהוספה לרשימת המעקב…",
        "unwatching": "בהסרה מרשימת המעקב…",
index 75d5fcb..c3021df 100644 (file)
        "rcshowhidemine": "$1 le mie modifiche",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Nascondi",
-       "rcshowhidecategorization": "$1 la categorizzazione della pagina",
+       "rcshowhidecategorization": "$1 categorizzazione della pagina",
        "rcshowhidecategorization-show": "Mostra",
        "rcshowhidecategorization-hide": "Nascondi",
        "rclinks": "Mostra le $1 modifiche più recenti apportate negli ultimi $2 giorni<br />$3",
        "wlshowhideanons": "utenti anonimi",
        "wlshowhidepatr": "modifiche verificate",
        "wlshowhidemine": "mie modifiche",
+       "wlshowhidecategorization": "categorizzazione della pagina",
        "watchlist-options": "Opzioni osservati speciali",
        "watching": "Aggiunta agli osservati speciali...",
        "unwatching": "Eliminazione dagli osservati speciali...",
index 75bc2c8..c975e86 100644 (file)
        "foreign-structured-upload-form-label-own-work": "Бұл менің өз туындым",
        "foreign-structured-upload-form-label-infoform-categories": "Санаттар",
        "foreign-structured-upload-form-label-infoform-date": "Ай-күні",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Мен осы файлдың авторы екенінімді растаймын және бұл файлды Wikimedia Commons ортаққорына [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] лицензиясы аясында қайтымсыз жариялауға келісемін, сонымен бірге [https://wikimediafoundation.org/wiki/Terms_of_Use Қолдану шарттарына] да келісемін.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Егер сіз осы файлдың авторы өзіңіз болмасаңыз немесе оны сіз басқа лицензия аясында жариялағыңыз келсе [https://commons.wikimedia.org/wiki/Special:UploadWizard Ортаққор Жүктеу шеберін] қолданыңыз.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Егер сайт бұл файлды жүктеуге өзінің ережелері аясында рұқсат беретін болса, сіз сондай-ақ [[Special:Upload|{{SITENAME}} жобасындағы жүктеу бетін]] қолданып көргіңіз келетін шығар.",
        "foreign-structured-upload-form-3-label-yes": "Иә",
        "foreign-structured-upload-form-3-label-no": "Жоқ",
        "backend-fail-stream": "«$1» файлы ақпады.",
index 57aa194..d2f7c69 100644 (file)
        "movepage-page-moved": "\"$1\" 문서를 \"$2\" 문서로 이동했습니다.",
        "movepage-page-unmoved": "$1 문서를 $2 문서로 옮길 수 없습니다.",
        "movepage-max-pages": "{{PLURAL:$1|문서}}를 최대 $1개 이동했으며 나머지 문서는 자동으로 이동하지 않습니다.",
-       "movelogpage": "ì\98®ê¸°ê¸° 기록",
+       "movelogpage": "ì\9d´ë\8f\99 기록",
        "movelogpagetext": "아래는 옮겨진 모든 문서의 목록입니다.",
        "movesubpage": "{{PLURAL:$1|하위 문서}}",
        "movesubpagetext": "이 문서에는 다음 {{PLURAL:$1|하위 문서}} $1개가 있습니다.",
index 0d6ed54..cf62305 100644 (file)
@@ -51,7 +51,7 @@
        "tog-enotifminoredits": "Mittere mihi litteras electronicas etiam pro recensionibus minoribus",
        "tog-enotifrevealaddr": "Monstrare inscriptio mea electronica in nuntiis notificantibus",
        "tog-shownumberswatching": "Numerum usorum observantium monstrare",
-       "tog-oldsig": "Subscriptio, qua nunc uteris",
+       "tog-oldsig": "Subscriptio, qua nunc uteris:",
        "tog-fancysig": "Subscriptio vicitext (sine nexu automatico)",
        "tog-uselivepreview": "Praevisum viventem adhibere (experimentalis)",
        "tog-forceeditsummary": "Si recensionem non summatim descripsero, me roga si continuare velim",
        "mergehistory-reason": "Causa:",
        "mergelog": "Acta confundendi",
        "revertmerge": "Inconfundere",
-       "history-title": "$1: Historia paginae",
+       "history-title": "Historia paginae \"$1\"",
        "lineno": "Linea $1:",
        "compareselectedversions": "Conferre emendationes selectas",
        "showhideselectedversions": "Monstrare/celare emendationes selectas",
        "usermessage-editor": "Nuntius systematis",
        "watchlist": "Paginae observatae",
        "mywatchlist": "Paginae observatae",
-       "watchlistfor2": "ab usore \"$1\"",
+       "watchlistfor2": "ab usore \"$1\" $2",
        "nowatchlist": "Sunt nullas paginas in indice tuo paginarum observatarum.",
        "watchlistanontext": "Ad inspiciendum vel recensendum indicem paginarum observatarum necesse est nomen dare.",
        "watchnologin": "Nomen datum non est",
        "tooltip-ca-edit": "Hanc paginam recensere",
        "tooltip-ca-addsection": "Novam partem creare",
        "tooltip-ca-viewsource": "Haec pagina protecta est. Inspicere quidem fontem licet.",
-       "tooltip-ca-history": "Emendationes veteres huius paginae",
+       "tooltip-ca-history": "Superiores huius paginae versiones",
        "tooltip-ca-protect": "Protegere hanc paginam",
        "tooltip-ca-delete": "Delere hanc paginam",
        "tooltip-ca-undelete": "Restituere emendationes huic paginae conlatas antequam haec pagina deleta esset",
        "tooltip-summary": "Summarium breve addere",
        "anonymous": "{{PLURAL:$1|Usor ignotus|Usores ignoti}} {{grammar:genitive|{{SITENAME}}}}",
        "siteuser": "{{SITENAME}} usor $1",
-       "lastmodifiedatby": "Pagina novissime die $2 hora $1 ab usore $3 mutatata est.",
+       "lastmodifiedatby": "Pagina novissime die $2 hora $1 ab usore $3 mutata est.",
        "others": "alii",
        "siteusers": "{{PLURAL:$2|usor|usores}} {{grammar:genitive|{{SITENAME}}}} $1",
        "creditspage": "Auctores paginae",
index 07357ea..b5523e5 100644 (file)
        "previewnote": "'''Denkt drun datt dëst nëmmen eng net gespäichert Versioun ass.'''\nÄr Ännerunge sinn nach net gespäichert!",
        "continue-editing": "Gitt weider an de Beräich fir z'änneren",
        "previewconflict": "Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.",
-       "session_fail_preview": "'''Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.\nVersicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, da versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.'''",
+       "session_fail_preview": "<strong>Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.</strong>\nVersicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, da versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.",
        "session_fail_preview_html": "<strong>Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.</strong>\n\n<em>Well op {{SITENAME}} 'raw HTML' aktivéiert ass, gouf d'Uweise vun der nach net gespäicherter Versioun ausgeblennt fir JavaScript-Attacken ze vermeiden.</em>\n\n<strong>Wann Dir eng berechtegt Ännerung maache wëllt, da versicht et w.e.g. nach eng Kéier.\nWann de Problem dann ëmmer nach bestoe sollt, versicht Iech [[Special:UserLogout|auszeloggen]] an dann erëm anzeloggen.</strong>",
        "token_suffix_mismatch": "'''Är Ännerung gouf refuséiert, well Äre Browser Zeechen am Ännerungs-Identifiant verännert huet.'''\nD'Ännerung gouf refuséiert, fir ze verhënneren datt den Text op der Säit onliesbar gëtt.\nDëst geschitt heiansdo wann Dir en anonyme Proxy-Service um Internet benotzt.",
        "edit_form_incomplete": "'''En Deel vum Ännerungsformulaire koum net um Server un; iwwerpréift w.e.g ob Är Ännerunge komplett sinn a probéiert nach emol.'''",
        "wlshowhideanons": "anonym Benotzer",
        "wlshowhidepatr": "iwwerwaacht Ännerungen",
        "wlshowhidemine": "meng Ännerungen",
+       "wlshowhidecategorization": "Kategorisatioun vu Säiten",
        "watchlist-options": "Optioune vun der Iwwerwaachungslëscht",
        "watching": "Iwwerwaachen …",
        "unwatching": "Net méi iwwerwaachen …",
index d81ccdf..bf661d4 100644 (file)
        "wlshowhideanons": "анонимни корисници",
        "wlshowhidepatr": "проверени уредувања",
        "wlshowhidemine": "моите уредувања",
+       "wlshowhidecategorization": "категоризација на страници",
        "watchlist-options": "Поставки за список на набљудувања",
        "watching": "Набљудување...",
        "unwatching": "Отстранувам од набљудувани...",
        "mediastatistics": "Статистики за слики и снимки",
        "mediastatistics-summary": "Статистики за подигнати типови податотеки. Се зема предвид само последната верзија на податотеката. Старите и избришаните верзии не се бројат.",
        "mediastatistics-nbytes": "{{PLURAL:$1|Еден бајт|$1 бајти}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Вкупен обем на пасусот: $1 бајти.",
+       "mediastatistics-allbytes": "Вкупен обем на сите податотеки: $1 бајти.",
        "mediastatistics-table-mimetype": "MIME-тип",
        "mediastatistics-table-extensions": "Можни додатоци",
        "mediastatistics-table-count": "Број на податотеки",
index 0c9e0b0..cc39d78 100644 (file)
        "databaseerror-query": "Richiesta: $1",
        "databaseerror-function": "Funzione: $1",
        "databaseerror-error": "Sbaglio: $1",
-       "transaction-duration-limit-exceeded": "Pe' putè scanzà 'e crià n'auto tiempo e replica, sta transazziona fuje fernuta pecché pe' tramente ca se faceva chesto ($1) s'appassaje 'o lemmeto $2 secondo.\nSi state a cagnà nu cuofeno 'elemente a na vota, tentate e fà nu cuofeno 'operaziune cchiù piccerille mmece.",
+       "transaction-duration-limit-exceeded": "Pe' putè scanzà 'e crià n'auto tiempo e replica, sta transazziona fuje fernuta pecché pe' tramente ca se faceva chesto ($1) s'appassaje 'o lemmeto 'e $2 {{PLURAL:$2|secondo|secunde}}.\nSi state a cagnà nu cuofeno 'elemente a na vota, tentate e fà nu cuofeno 'operaziune cchiù piccerille mmece.",
        "laggedslavemode": "'''Attenzione:''' 'a paggena putesse nun fà vedé ll'aggiornamente cchiù recente.",
        "readonly": "Database bloccato",
        "enterlockreason": "Miette 'o mutivo 'e blocco, nzieme a 'o mumento quanno se penza ca 'o blocco se sarrà fernuto",
        "wlshowhideanons": "utente anonime",
        "wlshowhidepatr": "cagnamiente cuntrullate",
        "wlshowhidemine": "cagnamiente d' 'e mieie",
+       "wlshowhidecategorization": "categorizzaziona d' 'a paggena",
        "watchlist-options": "Opziune 'a l'elenco 'e paggene cuntrullate",
        "watching": "Cuntrullanno...",
        "unwatching": "Lassanno 'e cuntrullà...",
        "tags-deactivate": "stuta",
        "tags-hitcount": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
        "tags-manage-no-permission": "Nun tenite 'o permesso pe' cagnà 'e tag.",
+       "tags-manage-blocked": "Nun putite cagnà sti tag quanno site bluccato/a.",
        "tags-create-heading": "Crìa nu tag nuovo",
        "tags-create-explanation": "Comme predefinito, 'e tag criate nuove nuove se farranno disponibbele pe ll'ausà ll'utente e re bot",
        "tags-create-tag-name": "Nomme 'e ll'etichetta ('o tag):",
        "tags-deactivate-not-allowed": "Nun se pò stutà 'o tag \"$1\".",
        "tags-deactivate-submit": "Stuta",
        "tags-apply-no-permission": "Nun tenite premmesse pe' putè apprecà tag 'e cagnamiente pe' tramente ca facite cagnamiente.",
+       "tags-apply-blocked": "Nun putite apprecà cagnamiente 'e tag pe' tramente ca facite cagnamiente quanno site bluccato/a.",
        "tags-apply-not-allowed-one": "'O tag \"$1\" nun è premmesso a se ffà manualmente apprecà.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|'O tag ccà abbascio nun è|'E tag ccà abbascio nun songo}} premmesse 'e s'apprecà manualmente: $1",
        "tags-update-no-permission": "Nun tenite premmesse pe' putè azzeccà o luvà tag 'e cagnamiento 'a 'e verziune nnividuale o entrate 'o log.",
+       "tags-update-blocked": "Nun putite azzeccà o luvà tag quanno site bluccato/a.",
        "tags-update-add-not-allowed-one": "'O tag \"$1\" nun è premmesso 'e s'azzeccà 'n manuale.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|'O tag ccà abbascio nun è|'E tag ccà abbascio nu so'}} premmesse 'e s'azzeccà manualmente: $1",
        "tags-update-remove-not-allowed-one": "'O tag \"$1\" nun è permesso d' 'o luvà.",
index 04957af..70fef1d 100644 (file)
        "confirmedittext": "Edytowanie jest możliwe dopiero po zweryfikowaniu adresu e‐mail.\nPodaj adres e‐mail i potwierdź go w swoich [[Special:Preferences|ustawieniach użytkownika]].",
        "nosuchsectiontitle": "Nie można znaleźć sekcji",
        "nosuchsectiontext": "{{GENDER:|Próbowałeś|Próbowałaś}} edytować sekcję, która nie istnieje.\nMogła zostać przeniesiona lub usunięta podczas przeglądania tej strony.",
-       "loginreqtitle": "musisz się zalogować",
+       "loginreqtitle": "Musisz się zalogować",
        "loginreqlink": "zalogować się",
        "loginreqpagetext": "Musisz $1, żeby móc przeglądać inne strony.",
        "accmailtitle": "Hasło zostało wysłane.",
        "tooltip-pt-mytalk": "Moja strona dyskusji",
        "tooltip-pt-anontalk": "Dyskusja użytkownika dla tego adresu IP",
        "tooltip-pt-preferences": "Moje preferencje",
-       "tooltip-pt-watchlist": "Lista stron obserwowanych przez Ciebie",
+       "tooltip-pt-watchlist": "Lista stron obserwowanych przeze mnie",
        "tooltip-pt-mycontris": "Lista moich edycji",
        "tooltip-pt-anoncontribs": "Lista edycji wykonanych z tego adresu IP",
        "tooltip-pt-login": "Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.",
index 5ab5f7c..b04dfa5 100644 (file)
        "media_tip": "Link para o arquivo",
        "sig_tip": "Sua assinatura, com hora e data",
        "hr_tip": "Linha horizontal (use de forma moderada)",
-       "summary": "Sumário:",
+       "summary": "Resumo da edição:",
        "subject": "Assunto:",
        "minoredit": "Marcar como edição menor",
        "watchthis": "Vigiar esta página",
        "selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"{{int:savearticle}}\" novamente, o redirecionamento será criado de qualquer modo.",
        "missingcommenttext": "Por favor, introduzida um comentário abaixo.",
        "missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
-       "summary-preview": "Previsão de sumário:",
+       "summary-preview": "Previsão do resumo:",
        "subject-preview": "Previsão do assunto/título:",
        "previewerrortext": "Ocorreu um erro ao tentar pré-visualizar suas alterações.",
        "blockedtitle": "O usuário está bloqueado",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta previsão:",
        "templatesusedsection": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta seção:",
        "template-protected": "(protegida)",
-       "template-semiprotected": "(semi-protegida)",
+       "template-semiprotected": "(semiprotegida)",
        "hiddencategories": "Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:",
        "edittools": "<!-- O texto aqui disponibilizado será exibido abaixo dos formulários de edição e de envio de arquivos. -->",
        "nocreatetext": "{{SITENAME}} tem restringida a habilidade de criar novas páginas.\nVolte à tela anterior e edite uma página já existente, ou [[Special:UserLogin|autentique-se ou crie uma conta]].",
        "history-feed-empty": "A página requisitada não existe.\nPoderá ter sido eliminada do wiki ou renomeada.\nTente [[Special:Search|pesquisar no wiki]] por páginas relevantes.",
        "history-edit-tags": "Editar etiquetas das revisões selecionadas",
        "rev-deleted-comment": "(resumo da edição suprimido)",
-       "rev-deleted-user": "(nome de usuário removido)",
+       "rev-deleted-user": "(nome de usuário(a) removido)",
        "rev-deleted-event": "(registros de detalhes eliminados)",
-       "rev-deleted-user-contribs": "[nome de usuário ou endereço de IP eliminado - edição ocultada das contribuições]",
+       "rev-deleted-user-contribs": "[nome de usuário(a) ou endereço de IP eliminado – edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão desta página foi '''eliminada'''.\nPodem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].",
        "rev-suppressed-text-permission": "A revisão desta página foi '''eliminada'''.\nVocê pode visualizá-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "rev-deleted-text-unhide": "Esta revisão desta página foi '''removida'''.\nPoderá haver detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].\nVocê ainda pode [$1 ver esta revisão] se deseja prosseguir.",
        "revdelete-hide-text": "Texto de revisão",
        "revdelete-hide-image": "Ocultar conteúdos do arquivo",
        "revdelete-hide-name": "Ocultar destino e parâmetros",
-       "revdelete-hide-comment": "Sumário de edição",
+       "revdelete-hide-comment": "Resumo da edição",
        "revdelete-hide-user": "Nome de usuário/endereço IP",
        "revdelete-hide-restricted": "Suprimir dados de administradores assim como de outros",
        "revdelete-radio-same": "(não alterar)",
        "restriction-create": "Criar",
        "restriction-upload": "Enviar",
        "restriction-level-sysop": "totalmente protegida",
-       "restriction-level-autoconfirmed": "semi-protegida",
+       "restriction-level-autoconfirmed": "semiprotegida",
        "restriction-level-all": "qualquer nível",
        "undelete": "Ver páginas eliminadas",
        "undeletepage": "Ver e restaurar páginas eliminadas",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|alterou}} secretamente a visibilidade de entradas de registo em $3",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|alterou}} secretamente a visibilidade de revisões da página $3",
        "revdelete-content-hid": "conteúdo oculto",
-       "revdelete-summary-hid": "sumário de edição oculto",
+       "revdelete-summary-hid": "resumo da edição oculto",
        "revdelete-uname-hid": "nome de usuário oculto",
        "revdelete-content-unhid": "conteúdo desocultado",
        "revdelete-summary-unhid": "sumário de edição desocultado",
index 9b96a54..ea77f35 100644 (file)
        "history-feed-empty": "A página solicitada não existe.\nPode ter sido eliminada da wiki ou o nome sido alterado.\nTente [[Special:Search|pesquisar na wiki]] novas páginas relevantes.",
        "history-edit-tags": "Editar etiquetas das revisões selecionadas",
        "rev-deleted-comment": "(resumo da edição suprimido)",
-       "rev-deleted-user": "(nome de utilizador removido)",
+       "rev-deleted-user": "(nome de utilizador(a) removido)",
        "rev-deleted-event": "(registos de detalhes eliminados)",
-       "rev-deleted-user-contribs": "[nome de utilizador ou IP removido - edição ocultada das contribuições]",
+       "rev-deleted-user-contribs": "[nome de utilizador(a) ou IP removido – edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
        "rev-suppressed-text-permission": "Esta revisão de página foi <strong>suprimida</strong>.\nPode consultar os detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
        "rev-deleted-text-unhide": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].\nPode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
        "group-user-member": "{{GENDER:$1|utilizador|utilizadora}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utilizador autoconfirmado|utilizadora autoconfirmada|utilizador(a) autoconfirmado(a)}}",
        "group-bot-member": "{{GENDER:$1|robô}}",
-       "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
+       "group-sysop-member": "{{GENDER:$1|administrador|administradora|administrador(a)}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrata}}",
        "group-suppress-member": "{{GENDER:$1|supressor|supressora}}",
        "grouppage-user": "{{ns:project}}:Utilizadores",
        "wlshowhideanons": "usuários anônimos",
        "wlshowhidepatr": "edições patrulhadas",
        "wlshowhidemine": "minhas edições",
+       "wlshowhidecategorization": "categorização de páginas",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "A vigiar...",
        "unwatching": "A deixar de vigiar...",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|alterou}} secretamente a visibilidade de entradas de registo em $3",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|alterou}} secretamente a visibilidade de revisões da página $3",
        "revdelete-content-hid": "conteúdo oculto",
-       "revdelete-summary-hid": "sumário de edição oculto",
+       "revdelete-summary-hid": "resumo da edição oculto",
        "revdelete-uname-hid": "utilizador oculto",
        "revdelete-content-unhid": "conteúdo desocultado",
        "revdelete-summary-unhid": "sumário de edição desocultado",
index b206367..82008bc 100644 (file)
        "resetpass-recycled": "مهرباني ڪري پنهنجي هاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھو لفظ چونڊيو.",
        "resetpass-temp-emailed": "توهان برق ٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان لاگ اِن ٿيا آهيو. لاگ اِن کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھو لفظ طَي ڪرڻو ئي پوندو:",
        "resetpass-temp-password": "عارضي ڳجھو لفظ:",
+       "resetpass-expired": "توهان جو ڳجھو لفظ مدي خارج ٿي چڪو آهي. نئون ڳجھو لفظ مقرر ڪريو ۽ لاگ اِن ٿيو.",
        "resetpass-expired-soft": "توهان جو ڳجھو لفظ مدي خارج ٿي چڪو آهي. مهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:resetpass-submit-cancel}}\" تي ڪلڪ ڪريو.",
        "resetpass-validity-soft": "توهان جو ڳجھو لفظ ناقابل ڪار آهي: $1\nمهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:resetpass-submit-cancel}}\" تي ڪلڪ ڪريو.",
        "passwordreset": "ڳجھو لفظ مَٽايو",
        "passwordreset-text-one": "برق ٽپال ذريعي عارضي ڳجھو لفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
+       "passwordreset-disabled": "هن وڪيءَ تي ڳجھو لفظ نئين سِر مقرر ڪرڻ وارو چارو غير فعال بڻايو ويو آهي.",
+       "passwordreset-emaildisabled": "هن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
        "passwordreset-username": "يُوزرنانءُ:",
        "passwordreset-domain": "ميدان:",
        "passwordreset-email": "برق ٽپال پتو:",
        "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي. توهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا.  \n\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
        "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
        "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
+       "updated": "(تجديديل)",
+       "note": "<strong>نوٽ:</strong>",
        "previewnote": "<strong>'''هيءَ محظ پيش نگاهہ آهي.</strong> ترميمون اڃا سانڍجوين ناهن!'''",
        "continue-editing": "ترميم گاھ ڏانهن وڃو",
        "editing": "زير ترميم $1",
        "history-feed-description": "وڪي جي هن صفحي جي ترميمي سوانح",
        "history-feed-item-nocomment": "$2 تي $1",
        "rev-deleted-user": "(يُوزرنانءُ ڊاٺو ويو)",
+       "rev-deleted-event": "(لاگ تفصيل هٽايا ويا)",
+       "rev-deleted-user-contribs": "[يُوزرنانءُ يا آءِ پِي پتو مِٽايو ويو - ڀاڱيدارين مان ترميمون لڪايون ويون]",
        "rev-delundel": "نمائش تبديل ڪريو",
        "rev-showdeleted": "ڏيکاريو",
        "revisiondelete": "مسوادا ڊاهيو/اڻ‌ڊاهيو",
        "revdelete-show-file-submit": "ها",
        "revdelete-legend": "نمائش جون پابنديون ترتيب ڪريو",
        "revdelete-hide-image": "فائيل جو مواد لڪايو",
+       "revdelete-hide-name": "هدف ۽ نيمپيما لڪايو",
        "revdelete-hide-comment": "ترميم جو تتُ",
        "revdelete-hide-user": "ايڊيٽر جو يوزرنانءُ / آء پي پتو",
+       "revdelete-hide-restricted": "منتظمن توڙي ٻين کان مليل اعداد دٻايو",
        "revdelete-radio-same": "(نہ بدلايو)",
        "revdelete-radio-set": "لڪل",
        "revdelete-radio-unset": "ظاهر",
+       "revdelete-suppress": "منتظمن توڙي ٻين کان مليل اعداد دٻايو",
        "revdelete-log": "سبب:",
        "revdel-restore": "نمائش تبديل ڪريو",
        "pagehist": "صفحي جي سوانح",
        "right-createpage": "صفحا سنواريو (جيڪي مباحثي صفحا نہ آهن)",
        "right-createtalk": "مباحثي صفحا سرجيو",
        "right-createaccount": "نوان يُوزر کاتا کوليو",
+       "right-minoredit": "ترميمُن کي معمُولي ڄاڻايو",
        "right-move": "صفحا چوريو",
        "right-move-subpages": "ذيلي صفحن سميت صفحا چوريو",
+       "right-move-categorypages": "زمراتي صفحا چوريو",
        "right-movefile": "فائيل چوريو",
        "right-upload": "فائيل چاڙهيو",
        "right-upload_by_url": "ڪنهن يُوآرايل تان فائيل چاڙهيو",
        "right-mergehistory": "صفحن جي سوانح سنواريو",
        "right-userrights": "سڀ يوزر حق ترميم ڪريو",
        "right-userrights-interwiki": "هن وڪي جي يوزرس جا حق ترميم ڪريو",
+       "right-siteadmin": "اعدادخانو بنديو ۽ کوليو",
+       "right-override-export-depth": "5ئين اونهائيءَ تائين ڳنڍيل صفحن سميت صفحا برآمديو",
        "right-sendemail": "ٻين يوزرس ڏانهن ايميل موڪليو",
+       "right-passwordreset": "ڳجھو لفظ مقرري برق ٽپالون ڏسو",
+       "right-managechangetags": "اعدادخاني ۾ [[Special:Tags|ٽيگس]] سرجيو ۽ ڊاهيو.",
        "newuserlogpage": "يوزر کاتن جو لاگ",
        "rightslog": "يُوزر حق لاگ",
        "action-read": "هي صفحو پڙهو",
        "action-movefile": "هيءُ فائيل چوريو",
        "action-upload": "هيءُ فائيل چاڙهيو",
        "action-delete": "هيءُ صفحو ڊاهيو",
+       "action-deleterevision": "هيءُ ڀيرو ڊاهيو",
+       "action-deletedhistory": "هن صفحي جي ڊاٺ سوانح ڏسو",
        "action-browsearchive": "ڊاٺل صفحن ۾ ڳوليو",
        "action-undelete": "هيءُ صفحو اڻڊاهيو",
+       "action-suppressrevision": "هن لڪيل ڀيري تي نظرثاني ڪريو ۽ بحاليو",
+       "action-suppressionlog": "هيءُ ذاتي لاگ ڏسو",
+       "action-block": "هن يُوزر کي سنوارڻ کان روڪيو",
+       "action-protect": "هن صفحي جي تحفظاتي سطح بدلايو",
+       "action-rollback": "ڪنهن مخصوص صفحي تي آخري ترميم ڪندڙ يُوزر جي سمورين ترميمن کي ترت واپس ورايو",
        "action-import": "ٻي ڪنهن وڪي کان صفحا درآمد ڪريو",
        "action-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
+       "action-unwatchedpages": "اڻ ٽيٽيل صفحن جي فهرست ڏسو",
        "action-mergehistory": "هن صفحي جي سوانح ضم ڪريو",
        "action-userrights": "سڀ يوزر حق ترميم ڪريو",
        "action-userrights-interwiki": "ٻين وڪيز جي يوزرس جا حق ترميم ڪريو",
        "rcshowhidemine": "منهنجون ترميمون $1",
        "rcshowhidemine-show": "نمايو",
        "rcshowhidemine-hide": "لڪايو",
+       "rcshowhidecategorization": "$1 صفحاتي زمراڪاري",
        "rcshowhidecategorization-show": "ڏيکاريو",
        "rcshowhidecategorization-hide": "لڪايو",
        "rclinks": "پوين $2 ڏينهن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
        "minoreditletter": "م",
        "newpageletter": "ن",
        "boteditletter": "گ",
+       "number_of_watching_users_pageview": "[$1، {{PLURAL:$1|يُوزر|يُوزرس}} کي ٽيٽيندي]",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کان پوءِ",
        "rc-enhanced-expand": "تفصيل ڏيکاريو",
        "rc-enhanced-hide": "تفصيل لڪايو",
        "recentchangeslinked-to": "رڳو ڄاڻايل صفحي سان ڳانڍيل صفحن ۾ ٿيل تبديليون نمايو",
        "upload": "فائيل چاڙهيو",
        "uploadbtn": "فائيل چاڙهيو",
+       "uploadnologin": "لاگ اِن ٿيل نہ آهيو",
+       "uploadnologintext": "فائيل چاڙهڻ لاءِ $1.",
        "uploaderror": "چاڙهہ چُڪَ",
        "uploadlogpage": "چاڙهہ لاگ",
        "filename": "فائيل نانءُ",
        "filereuploadsummary": "فائيل تبديليون:",
        "filesource": "ذريعو:",
        "filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
+       "filetype-banned": "فائيل جو هيءُ قسم بندشيل آهي.",
+       "verification-error": "هن فائيل جي تصديق ٿي نہ سگھي.",
+       "illegal-filename": "اهو فائيل‌نانءُ ناقابل قبول آهي.",
+       "unknown-error": "ڪا اڻجاتل چُڪَ ٿي.",
+       "tmp-create-error": "عارضي فائيل سرجي نہ سگھيو.",
        "uploadwarning": "چاڙھ جو چتاءُ",
        "savefile": "فائيل سانڍيو",
        "uploaddisabled": "چاڙھ ناقابلِ ڪار بڻيل.",
index 800e28f..606b386 100644 (file)
        "wlshowhideanons": "brezimni uporabniki",
        "wlshowhidepatr": "pregledana urejanja",
        "wlshowhidemine": "moja urejanja",
+       "wlshowhidecategorization": "kategorizacija strani",
        "watchlist-options": "Možnosti spiska nadzorov",
        "watching": "Nadziranje ...",
        "unwatching": "Nenadziranje ...",
index f70bb5b..be86ac2 100644 (file)
        "wlshowhideanons": "anonyma användare",
        "wlshowhidepatr": "patrullerade redigeringar",
        "wlshowhidemine": "mina redigeringar",
+       "wlshowhidecategorization": "kategorisering av sidor",
        "watchlist-options": "Alternativ för bevakningslistan",
        "watching": "Bevakar...",
        "unwatching": "Avbevakar...",
        "mediastatistics": "Mediastatistik",
        "mediastatistics-summary": "Statistik om uppladdade filtyper. Detta inkluderar bara den senaste versionen av en fil. Äldre eller raderade filversioner exkluderas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Total filstorlek för detta avsnitt: $1 byte.",
+       "mediastatistics-allbytes": "Total filstorlek för alla filer: $1 byte.",
        "mediastatistics-table-mimetype": "MIME-typ",
        "mediastatistics-table-extensions": "Möjliga tillägg",
        "mediastatistics-table-count": "Antal filer",
index 59f6b3f..da74677 100644 (file)
@@ -43,7 +43,8 @@
                        "Shrikarsan",
                        "Matma Rex",
                        "Anj.balaji",
-                       "Dineshkumar Ponnusamy"
+                       "Dineshkumar Ponnusamy",
+                       "Sharanrajindia"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "log-name-pagelang": "மொழி பதிவை மாற்றுக",
        "log-description-pagelang": "இது பக்க மொழி மாற்றச் செயல்பாட்டின் பதிவு.",
        "logentry-pagelang-pagelang": "$3 க்கான பக்க மொழியை $4 இலிருந்து $5 க்கு $1 {{GENDER:$2|மாற்றினார்}}.",
+       "mediastatistics-bytespertype": "இந்த பிரிவக்கான மொத்த கோப்பளவு: $1 எண்ணுண்மி",
+       "mediastatistics-allbytes": "அனைத்து கோப்புகளின் மொத்த கோப்பளவு: $1 எண்ணுண்மி",
        "mediastatistics-table-count": "கோப்புகளின் எண்ணிக்கை",
        "mediastatistics-table-totalbytes": "மொத்த அளவு",
        "mediastatistics-header-unknown": "அறியப்படாதது",
index 1f88168..07620e2 100644 (file)
        "minimum-size": "కనీస పరిమాణం",
        "maximum-size": "గరిష్ఠ పరిమాణం",
        "pagesize": "(బైట్లు)",
-       "restriction-edit": "మారà±\8dà°\9aà±\81",
-       "restriction-move": "తరలిà°\82à°\9aà±\81",
+       "restriction-edit": "మారà±\8dà°\9aà°¡à°\82",
+       "restriction-move": "తరలిà°\82à°\9aà°¡à°\82",
        "restriction-create": "సృష్టించు",
        "restriction-upload": "ఎక్కించు",
        "restriction-level-sysop": "పూర్తి సంరక్షణ",
        "pageinfo-header-edits": "మార్పుల చరిత్ర",
        "pageinfo-header-restrictions": "పేజీ సంరక్షణ",
        "pageinfo-header-properties": "పేజీ లక్షణాలు",
-       "pageinfo-display-title": "à°¶à±\80à°°à±\8dà°·à°¿à°\95 à°\9aà±\82పిà°\82à°\9aà±\81",
+       "pageinfo-display-title": "à°\9aà±\82పిà°\82à°\9aà±\87 à°¶à±\80à°°à±\8dà°·à°¿à°\95",
        "pageinfo-length": "పేజీ నిడివి (బైట్లలో)",
        "pageinfo-article-id": "పేజీ ఐడీ",
        "pageinfo-language": "పేజీ విషయపు భాష",
        "pageinfo-content-model": "పేజీ కంటెంటు మోడల్",
-       "pageinfo-robot-policy": "à°°à±\8bà°¬à±\8bà°\9fà±\8dà°²à°\9aà±\87 à°\87à°\82à°¡à±\86à°\95à±\8dసవà±\81à°¤à±\8bà°\82ది",
+       "pageinfo-robot-policy": "à°°à±\8bà°¬à±\8bà°\9fà±\8dà°²à°\9aà±\87 à°\87à°\82à°¡à±\86à°\95à±\8dసిà°\82à°\97à±\81",
        "pageinfo-robot-index": "అనుమతించబడింది",
        "pageinfo-robot-noindex": "అనుమతించబడలేదు",
        "pageinfo-watchers": "పేజీ గమనింపుదారుల సంఖ్య",
        "pageinfo-edits": "మొత్తం మార్పుల సంఖ్య",
        "pageinfo-authors": "ప్రత్యేక కర్తల మొత్తం సంఖ్య",
        "pageinfo-recent-edits": "ఇటీవలి మార్పుల సంఖ్య (గత $1 లోపు)",
-       "pageinfo-recent-authors": "à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°\95à°°à±\8dతల à°\87à°\9fà±\80వలి సంఖ్య",
-       "pageinfo-magic-words": "à°\9aమతà±\8dà°\95ార {{PLURAL:$1|పదం|పదాలు}} ($1)",
+       "pageinfo-recent-authors": "à°\87à°\9fà±\80వలి à°°à°\9aయితల సంఖ్య",
+       "pageinfo-magic-words": "మాయా {{PLURAL:$1|పదం|పదాలు}} ($1)",
        "pageinfo-hidden-categories": "దాచిన {{PLURAL:$1|వర్గం|వర్గాలు}} ($1)",
        "pageinfo-templates": "ట్రాన్స్‍క్లూడు చేసిన {{PLURAL:$1|మూస|మూసలు}} ($1)",
        "pageinfo-transclusions": "($1) తో {{PLURAL:$1|పేజీ|పేజీలు}} ట్రాన్స్‍క్లూడు చెయ్యబడ్డాయి",
index f597601..2580f91 100644 (file)
        "morenotlisted": "Diri kompleto ini nga listahan.",
        "mypage": "Pakli",
        "mytalk": "Mga akon paghingay",
-       "anontalk": "Paghingay para hini nga IP",
+       "anontalk": "Hiruhimangraw",
        "navigation": "Paglayag",
        "and": "&#32;ngan",
        "qbfind": "Bilnga",
        "mergehistory-empty": "Waray mga rebisyon in puydi matampo.",
        "mergehistory-no-source": "Waray pa an tinikangan nga pakli nga $1.",
        "mergehistory-no-destination": "Waray pa an kakadtuan nga pakli nga $1.",
+       "mergehistory-autocomment": "Gintampo an [[:$1]] tipakadto ha [[:$2]]",
        "mergehistory-comment": "Gintampo an [[:$1]] ngada ha [[:$2]]: $3",
        "mergehistory-same-destination": "An gintikangan ngan kakadtoan nga mga pakli in diri puydi magkaparo",
        "mergehistory-reason": "Katadungan:",
        "notextmatches": "Waray teksto han pakli an parehas",
        "prevn": "naha-una nga {{PLURAL:$1|$1}}",
        "nextn": "sunod nga {{PLURAL:$1|$1}}",
+       "prev-page": "nahiuna nga pakli",
+       "next-page": "masunod nga pakli",
        "prevn-title": "Nahiuna $1 {{PLURAL:$1|resulta|mga resulta}}",
        "nextn-title": "Sunod nga $1 {{PLURAL:$1|resulta|mga resulta}}",
        "shown-title": "Kitaa $1 {{PLURAL:$1|resulta|mga resulta}} kada pakli",
        "search-result-category-size": "{{PLURAL:$1|1 nga api|$1 nga mga api}} ({{PLURAL:$2|1 nga ubos-nga-kaarangay|$2 nga mga ubos-nga-kaarangay}}, {{PLURAL:$3| 1 nga fayl|$3 nga mga fayl}})",
        "search-redirect": "(redirekta $1)",
        "search-section": "(bahin $1)",
+       "search-category": "(kaarangay $1)",
        "search-suggest": "Buot sidngon mo ba: $1",
        "search-interwiki-caption": "Mga bugto nga proyekto",
        "search-interwiki-default": "Mga resulta tikang han $1:",
        "userrights-nodatabase": "Waray kaaagii an Database $1 o diri ini aada ha lokal.",
        "userrights-changeable-col": "Mga hugpo nga puydi mo labtan",
        "userrights-unchangeable-col": "Mga hugpo nga diri mo puydi labtan",
+       "userrights-removed-self": "Malinamposon nim gintanggal an imo kalugaringon mga katungod. Tungod hito, diri ka na makaka-access hini nga pakli.",
        "group": "Hugpo:",
        "group-user": "Mga gumaramit",
        "group-autoconfirmed": "Mga gumaramit nga lugaring nakokonpirma",
index 453d928..4803a0a 100644 (file)
@@ -117,22 +117,16 @@ pre, .mw-code {
        border: 1px solid #aaaaaa;
        background-color: #f9f9f9;
        padding: 5px;
-       display: inline-block;
        display: table;
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
 }
 
 /* Separate columns for tocnumber and toctext */
-/* Ignored by IE7 and lower */
 .tocnumber,
 .toctext {
        display: table-cell;
 }
 
 /* Space between the columns for tocnumber and toctext */
-/* Ignored by IE7 and lower */
 .tocnumber:after {
        content: "";
        padding-right: 0.5em;
@@ -326,7 +320,6 @@ a.sortheader {
        list-style: none;
        list-style-type: none;
        list-style-image: none;
-       vertical-align: middle !ie;
 }
 
 .catlinks li {
@@ -335,8 +328,6 @@ a.sortheader {
        padding: 0 .4em;
        border-left: 1px solid #AAA;
        margin: 0.1em 0;
-       zoom: 1;
-       display: inline !ie;
 }
 
 .catlinks li:first-child {
index d706d26..7872085 100644 (file)
@@ -25,6 +25,14 @@ a:hover, a:focus {
        text-decoration: underline;
 }
 
+a:lang(ar),
+a:lang(kk-arab),
+a:lang(mzn),
+a:lang(ps),
+a:lang(ur) {
+       text-decoration: none;
+}
+
 a.stub {
        color: #772233;
 }
index 1e65da5..510068a 100644 (file)
        CSP.getNewMenuItems = function ( input ) {
                var i,
                        promises = [],
-                       deferred = new $.Deferred();
+                       deferred = $.Deferred();
 
                if ( $.trim( input ) === '' ) {
                        deferred.resolve( [] );
         * @return {jQuery.Promise} Resolves with an array of categories
         */
        CSP.searchCategories = function ( input, searchType ) {
-               var deferred = new $.Deferred();
+               var deferred = $.Deferred();
 
                switch ( searchType ) {
                        case CategorySelector.SearchType.OpenSearch:
index 624986a..7f62256 100644 (file)
@@ -4,8 +4,27 @@
        mw.template.registerCompiler( 'mustache', {
                compile: function ( src ) {
                        return {
-                               render: function ( data ) {
-                                       return $( $.parseHTML( Mustache.render( src, data ) ) );
+                               /**
+                                * @ignore
+                                * @return {string} The raw source code of the template
+                                */
+                               getSource: function () {
+                                       return src;
+                               },
+                               /**
+                                * @ignore
+                                * @param {Object} data Data to render
+                                * @param {Object} partialTemplates Map partial names to Mustache template objects
+                                *  returned by mw.template.get()
+                                */
+                               render: function ( data, partialTemplates ) {
+                                       var partials = {};
+                                       if ( partialTemplates ) {
+                                               $.each( partialTemplates, function ( name, template ) {
+                                                       partials[ name ] = template.getSource();
+                                               } );
+                                       }
+                                       return $( $.parseHTML( Mustache.render( src, data, partials ) ) );
                                }
                        };
                }
index a0e0b3a..0ed8270 100644 (file)
@@ -20544,7 +20544,7 @@ HTML5 data attributes
 !! test
 Strip reserved data attributes
 !! wikitext
-<div data-mw="foo" data-parsoid="bar" data-mw-someext="baz" data-ok="fred" data-ooui="xyzzy">d</div>
+<div data-mw="foo" data-parsoid="bar" data-mw-someext="baz" data-ok="fred" data-ooui="xyzzy" data-bad:ns="ns">d</div>
 !! html
 <div data-ok="fred">d</div>
 
diff --git a/tests/phpunit/data/templates/conds.mustache b/tests/phpunit/data/templates/conds.mustache
new file mode 100644 (file)
index 0000000..5ebd2ea
--- /dev/null
@@ -0,0 +1 @@
+{{#list}}oh no{{/list}}{{#foo}}none of this should render{{/foo}}
\ No newline at end of file
index 0b87727..552dacb 100644 (file)
@@ -212,7 +212,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                                ),
                                'child' => array(
                                        'tag' => 'a',
-                                       'content' => 'Talk',
+                                       'content' => 'talk',
                                )
                        ),
                        $cacheEntry->usertalklink,
index 94b74cb..b9fd6ab 100644 (file)
@@ -183,6 +183,18 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
        }
 
+       /**
+        * @covers BagOStuff::incrWithInit
+        */
+       public function testIncrWithInit() {
+               $key = wfMemcKey( 'test' );
+               $val = $this->cache->incrWithInit( $key, 0, 1, 3 );
+               $this->assertEquals( 3, $val, "Correct init value" );
+
+               $val = $this->cache->incrWithInit( $key, 0, 1, 3 );
+               $this->assertEquals( 4, $val, "Correct init value" );
+       }
+
        /**
         * @covers BagOStuff::getMulti
         */
index 545718a..926e986 100644 (file)
@@ -71,6 +71,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
@@ -126,6 +127,7 @@ return array(
                        'mediawiki.toc',
                        'mediawiki.Uri',
                        'mediawiki.user',
+                       'mediawiki.template.mustache',
                        'mediawiki.template',
                        'mediawiki.util',
                        'mediawiki.special.recentchanges',
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js
new file mode 100644 (file)
index 0000000..38ae5e4
--- /dev/null
@@ -0,0 +1,32 @@
+( function ( mw ) {
+
+       QUnit.module( 'mediawiki.template.mustache', {
+               setup: function () {
+                       // Stub register some templates
+                       this.sandbox.stub( mw.templates, 'get' ).returns( {
+                               'test_greeting.mustache': '<div>{{foo}}{{>suffix}}</div>',
+                               'test_greeting_suffix.mustache': ' goodbye'
+                       } );
+               }
+       } );
+
+       QUnit.test( 'render', 2, function ( assert ) {
+               var html, htmlPartial, data, partials,
+                       template = mw.template.get( 'stub', 'test_greeting.mustache' ),
+                       partial = mw.template.get( 'stub', 'test_greeting_suffix.mustache' );
+
+               data = {
+                       foo: 'Hello'
+               };
+               partials = {
+                       suffix: partial
+               };
+
+               html = template.render( data ).html();
+               htmlPartial = template.render( data, partials ).html();
+
+               assert.strictEqual( html, 'Hello', 'Render without partial' );
+               assert.strictEqual( htmlPartial, 'Hello goodbye', 'Render with partial' );
+       } );
+
+}( mediaWiki ) );