Merge "Don't fiddle with $wgLanguageCode in KkConverter"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 13 Nov 2014 08:30:48 +0000 (08:30 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 13 Nov 2014 08:30:48 +0000 (08:30 +0000)
129 files changed:
includes/AutoLoader.php
includes/ChangeTags.php
includes/DefaultSettings.php
includes/OutputPage.php
includes/Status.php
includes/StubObject.php
includes/WatchedItem.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/mk.json
includes/api/i18n/pl.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/sv.json
includes/api/i18n/zh-hans.json
includes/cache/MapCacheLRU.php [deleted file]
includes/cache/MessageCache.php
includes/context/RequestContext.php
includes/db/Database.php
includes/filebackend/FSFileBackend.php
includes/filerepo/file/File.php
includes/installer/i18n/ckb.json
includes/installer/i18n/th.json
includes/libs/MapCacheLRU.php [new file with mode: 0644]
includes/libs/ObjectFactory.php
includes/libs/RunningStat.php
includes/libs/Xhprof.php [new file with mode: 0644]
includes/libs/cdb/CdbException.php [new file with mode: 0644]
includes/libs/cdb/CdbFunctions.php [new file with mode: 0644]
includes/libs/cdb/CdbReader.php [new file with mode: 0644]
includes/libs/cdb/CdbReaderDBA.php [new file with mode: 0644]
includes/libs/cdb/CdbReaderPHP.php [new file with mode: 0644]
includes/libs/cdb/CdbWriter.php [new file with mode: 0644]
includes/libs/cdb/CdbWriterDBA.php [new file with mode: 0644]
includes/libs/cdb/CdbWriterPHP.php [new file with mode: 0644]
includes/media/MediaTransformOutput.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleDB.php
includes/profiler/ProfilerSimpleUDP.php
includes/profiler/ProfilerStandard.php
includes/profiler/ProfilerStub.php
includes/profiler/ProfilerXhprof.php [new file with mode: 0644]
includes/profiler/SectionProfiler.php [new file with mode: 0644]
includes/skins/SkinTemplate.php
includes/specialpage/SpecialPageFactory.php
includes/utils/Cdb.php [deleted file]
includes/utils/CdbDBA.php [deleted file]
includes/utils/CdbPHP.php [deleted file]
includes/utils/MWFunction.php
languages/i18n/ang.json
languages/i18n/az.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/ilo.json
languages/i18n/it.json
languages/i18n/kiu.json
languages/i18n/lzh.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/nb.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/rup.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/dev/includes/router.php
resources/lib/oojs-ui/i18n/fy.json
resources/lib/oojs-ui/i18n/he.json
resources/lib/oojs-ui/i18n/ilo.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/pt.json
resources/lib/oojs-ui/i18n/ta.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-apex.svg.css
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
resources/lib/oojs-ui/oojs-ui.js
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/XhprofTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/cdb/CdbTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/CdbTest.php [deleted file]

index e89e500..92eb4c8 100644 (file)
@@ -346,7 +346,7 @@ $wgAutoloadLocalClasses = array(
        'LinkCache' => 'includes/cache/LinkCache.php',
        'LocalisationCache' => 'includes/cache/LocalisationCache.php',
        'LocalisationCacheBulkLoad' => 'includes/cache/LocalisationCache.php',
-       'MapCacheLRU' => 'includes/cache/MapCacheLRU.php',
+       'MapCacheLRU' => 'includes/libs/MapCacheLRU.php',
        'MessageCache' => 'includes/cache/MessageCache.php',
        'ObjectFileCache' => 'includes/cache/ObjectFileCache.php',
        'ResourceFileCache' => 'includes/cache/ResourceFileCache.php',
@@ -419,7 +419,6 @@ $wgAutoloadLocalClasses = array(
        'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
        'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
        'DatabaseSqliteStandalone' => 'includes/db/DatabaseSqlite.php',
-       'DatabaseType' => 'includes/db/Database.php',
        'DBAccessError' => 'includes/db/LBFactory.php',
        'DBConnectionError' => 'includes/db/DatabaseError.php',
        'DBConnRef' => 'includes/db/LoadBalancer.php',
@@ -700,8 +699,19 @@ $wgAutoloadLocalClasses = array(
        'SwiftVirtualRESTService' => 'includes/libs/virtualrest/SwiftVirtualRESTService.php',
        'VirtualRESTService' => 'includes/libs/virtualrest/VirtualRESTService.php',
        'VirtualRESTServiceClient' => 'includes/libs/virtualrest/VirtualRESTServiceClient.php',
+       'Xhprof' => 'includes/libs/Xhprof.php',
        'XmlTypeCheck' => 'includes/libs/XmlTypeCheck.php',
 
+       # includes/libs/cdb
+       'CdbException' => 'includes/libs/cdb/CdbException.php',
+       'CdbFunctions' => 'includes/libs/cdb/CdbFunctions.php',
+       'CdbReader' => 'includes/libs/cdb/CdbReader.php',
+       'CdbReaderDBA' => 'includes/libs/cdb/CdbReaderDBA.php',
+       'CdbReaderPHP' => 'includes/libs/cdb/CdbReaderPHP.php',
+       'CdbWriter' => 'includes/libs/cdb/CdbWriter.php',
+       'CdbWriterDBA' => 'includes/libs/cdb/CdbWriterDBA.php',
+       'CdbWriterPHP' => 'includes/libs/cdb/CdbWriterPHP.php',
+
        # includes/libs/lessphp
        'lessc' => 'includes/libs/lessc.inc.php',
        'lessc_parser' => 'includes/libs/lessc.inc.php',
@@ -876,7 +886,9 @@ $wgAutoloadLocalClasses = array(
        'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
        'ProfilerStandard' => 'includes/profiler/ProfilerStandard.php',
        'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
+       'ProfilerXhprof' => 'includes/profiler/ProfilerXhprof.php',
        'ProfileSection' => 'includes/profiler/ProfileSection.php',
+       'SectionProfiler' => 'includes/profiler/SectionProfiler.php',
        'TransactionProfiler' => 'includes/profiler/TransactionProfiler.php',
 
        # includes/rcfeed
@@ -1152,14 +1164,6 @@ $wgAutoloadLocalClasses = array(
        'UploadStashNoSuchKeyException' => 'includes/upload/UploadStash.php',
 
        # includes/utils
-       'CdbException' => 'includes/utils/Cdb.php',
-       'CdbFunctions' => 'includes/utils/CdbPHP.php',
-       'CdbReader' => 'includes/utils/Cdb.php',
-       'CdbReaderDBA' => 'includes/utils/CdbDBA.php',
-       'CdbReaderPHP' => 'includes/utils/CdbPHP.php',
-       'CdbWriter' => 'includes/utils/Cdb.php',
-       'CdbWriterDBA' => 'includes/utils/CdbDBA.php',
-       'CdbWriterPHP' => 'includes/utils/CdbPHP.php',
        'DoubleReplacer' => 'includes/utils/StringUtils.php',
        'ExplodeIterator' => 'includes/utils/StringUtils.php',
        'HashtableReplacer' => 'includes/utils/StringUtils.php',
index a3c2360..87c6ce5 100644 (file)
@@ -34,13 +34,17 @@ class ChangeTags {
        public static function formatSummaryRow( $tags, $page ) {
                global $wgLang;
 
+               $tags = explode( ',', $tags );
+
+               // XXX(Ori Livneh, 2014-11-08): remove once bug 73181 is resolved.
+               $tags = array_diff( $tags, array( 'HHVM', '' ) );
+
                if ( !$tags ) {
                        return array( '', array() );
                }
 
                $classes = array();
 
-               $tags = explode( ',', $tags );
                $displayTags = array();
                foreach ( $tags as $tag ) {
                        $displayTags[] = Xml::tags(
index 29d653d..b779c01 100644 (file)
@@ -3558,6 +3558,19 @@ $wgResourceLoaderStorageEnabled = false;
  */
 $wgResourceLoaderStorageVersion = 1;
 
+/**
+ * Whether to allow site-wide CSS (MediaWiki:Common.css and friends) on
+ * restricted pages like Special:UserLogin or Special:Preferences where
+ * JavaScript is disabled for security reasons. As it is possible to
+ * execute JavaScript through CSS, setting this to true opens up a
+ * potential security hole. Some sites may "skin" their wiki by using
+ * site-wide CSS, causing restricted pages to look unstyled and different
+ * from the rest of the site.
+ *
+ * @since 1.25
+ */
+$wgAllowSiteCSSOnRestrictedPages = false;
+
 /** @} */ # End of resource loader settings }
 
 /*************************************************************************//**
index 3bb2175..a517788 100644 (file)
@@ -182,12 +182,14 @@ class OutputPage extends ContextSource {
 
        protected $mFeedLinksAppendQuery = null;
 
-       /**
-        * @var int
-        * The level of 'untrustworthiness' allowed for modules loaded on this page.
+       /** @var array
+        * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
         * @see ResourceLoaderModule::$origin
+        * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
         */
-       protected $mAllowedModuleOrigin = ResourceLoaderModule::ORIGIN_ALL;
+       protected $mAllowedModules = array(
+               ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
+       );
 
        /** @var bool Whether output is disabled.  If this is true, the 'output' method will do nothing. */
        protected $mDoNothing = false;
@@ -1359,53 +1361,59 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Restrict the page to loading modules bundled the software.
+        * Do not allow scripts which can be modified by wiki users to load on this page;
+        * only allow scripts bundled with, or generated by, the software.
+        * Site-wide styles are controlled by a config setting, since they can be
+        * used to create a custom skin/theme, but not user-specific ones.
         *
-        * Disallows the queue to contain any modules which can be modified by wiki
-        * users to load on this page.
+        * @todo this should be given a more accurate name
         */
        public function disallowUserJs() {
-               $this->reduceAllowedModuleOrigin( ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL );
+               $this->reduceAllowedModules(
+                       ResourceLoaderModule::TYPE_SCRIPTS,
+                       ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
+               );
+
+               // Site-wide styles are controlled by a config setting, see bug 71621
+               // for background on why. User styles are never allowed.
+               if ( $this->getConfig()->get( 'AllowSiteCSSOnRestrictedPages' ) ) {
+                       $styleOrigin = ResourceLoaderModule::ORIGIN_USER_SITEWIDE;
+               } else {
+                       $styleOrigin = ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL;
+               }
+               $this->reduceAllowedModules(
+                       ResourceLoaderModule::TYPE_STYLES,
+                       $styleOrigin
+               );
        }
 
        /**
-        * Get the level of JavaScript / CSS untrustworthiness allowed on this page.
-        *
+        * Show what level of JavaScript / CSS untrustworthiness is allowed on this page
         * @see ResourceLoaderModule::$origin
-        * @param string $type Unused: Module origin allowance used to be fragmented by
-        *  ResourceLoaderModule TYPE_ constants.
+        * @param string $type ResourceLoaderModule TYPE_ constant
         * @return int ResourceLoaderModule ORIGIN_ class constant
         */
-       public function getAllowedModules( $type = null ) {
-               return $this->mAllowedModuleOrigin;
+       public function getAllowedModules( $type ) {
+               if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
+                       return min( array_values( $this->mAllowedModules ) );
+               } else {
+                       return isset( $this->mAllowedModules[$type] )
+                               ? $this->mAllowedModules[$type]
+                               : ResourceLoaderModule::ORIGIN_ALL;
+               }
        }
 
        /**
         * Set the highest level of CSS/JS untrustworthiness allowed
         *
         * @deprecated since 1.24 Raising level of allowed untrusted content is no longer supported.
-        *  Use reduceAllowedModuleOrigin() instead.
-        *
+        *  Use reduceAllowedModules() instead
         * @param string $type ResourceLoaderModule TYPE_ constant
-        * @param int $level ResourceLoaderModule ORIGIN_ constant
+        * @param int $level ResourceLoaderModule class constant
         */
        public function setAllowedModules( $type, $level ) {
                wfDeprecated( __METHOD__, '1.24' );
-               $this->reduceAllowedModuleOrigin( $level );
-       }
-
-       /**
-        * Limit the highest level of CSS/JS untrustworthiness allowed.
-        *
-        * @deprecated since 1.24 Module allowance is no longer fragmented by content type.
-        *  Use reduceAllowedModuleOrigin() instead.
-        *
-        * @param string $type ResourceLoaderModule TYPE_ constant
-        * @param int $level ResourceLoaderModule ORIGIN_ class constant
-        */
-       public function reduceAllowedModules( $type, $level ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               $this->reduceAllowedModuleOrigin( $level );
+               $this->reduceAllowedModules( $type, $level );
        }
 
        /**
@@ -1414,10 +1422,11 @@ class OutputPage extends ContextSource {
         * If passed the same or a higher level than the current level of untrustworthiness set, the
         * level will remain unchanged.
         *
+        * @param string $type
         * @param int $level ResourceLoaderModule class constant
         */
-       public function reduceAllowedModuleOrigin( $level ) {
-               $this->mAllowedModuleOrigin = min( $this->mAllowedModuleOrigin, $level );
+       public function reduceAllowedModules( $type, $level ) {
+               $this->mAllowedModules[$type] = min( $this->getAllowedModules( $type ), $level );
        }
 
        /**
index 0a8062c..265eae1 100644 (file)
@@ -369,14 +369,14 @@ class Status {
        }
 
        /**
-        * Returns a list of status messages of the given type
+        * Returns a list of status messages of the given type (or all if false)
         * @param string $type
         * @return array
         */
-       protected function getStatusArray( $type ) {
+       protected function getStatusArray( $type = false ) {
                $result = array();
                foreach ( $this->errors as $error ) {
-                       if ( $error['type'] === $type ) {
+                       if ( $type === false || $error['type'] === $type ) {
                                if ( $error['message'] instanceof Message ) {
                                        $result[] = array_merge(
                                                array( $error['message']->getKey() ),
@@ -462,4 +462,45 @@ class Status {
        public function getValue() {
                return $this->value;
        }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               $status = $this->isOK() ? "OK" : "Error";
+               if ( count( $this->errors ) ) {
+                       $errorcount = "collected " . ( count($this->errors) ) . " error(s) on the way";
+               } else {
+                       $errorcount = "no errors detected";
+               }
+               if ( isset( $this->value ) ) {
+                       $valstr = gettype( $this->value ) . " value set";
+                       if ( is_object( $this->value ) ) {
+                               $valstr .= "\"" . get_class( $this->value ) . "\" instance";
+                       }
+               } else {
+                       $valstr = "no value set";
+               }
+               $out = sprintf( "<%s, %s, %s>",
+                       $status,
+                       $errorcount,
+                       $valstr
+               );
+               if ( count ($this->errors ) > 0 ) {
+                       $hdr = sprintf( "+-%'-4s-+-%'-25s-+-%'-40s-+\n", "", "", "" );
+                       $i = 1;
+                       $out .= "\n";
+                       $out .= $hdr;
+                       foreach( $this->getStatusArray() as $stat ) {
+                               $out .= sprintf( "| %4d | %-25.25s | %-40.40s |\n",
+                                       $i,
+                                       $stat[0],
+                                       implode(" ", array_slice( $stat, 1 ) )
+                               );
+                               $i += 1;
+                       }
+                       $out .= $hdr;
+               };
+               return $out;
+       }
 }
index 8878660..7f12c16 100644 (file)
@@ -110,7 +110,11 @@ class StubObject {
         * @return object
         */
        public function _newObject() {
-               return MWFunction::newObj( $this->class, $this->params );
+               return ObjectFactory::getObjectFromSpec( array(
+                       'class' => $this->class,
+                       'args' => $this->params,
+                       'closure_expansion' => false,
+               ) );
        }
 
        /**
index ab136b8..fbd6119 100644 (file)
@@ -401,7 +401,8 @@ class WatchedItem {
                $newtitle = $nt->getDBkey();
 
                $dbw = wfGetDB( DB_MASTER );
-               $res = $dbw->select( 'watchlist', 'wl_user',
+               $res = $dbw->select( 'watchlist',
+                       array( 'wl_user', 'wl_notificationtimestamp' ),
                        array( 'wl_namespace' => $oldnamespace, 'wl_title' => $oldtitle ),
                        __METHOD__, 'FOR UPDATE'
                );
@@ -411,7 +412,8 @@ class WatchedItem {
                        $values[] = array(
                                'wl_user' => $s->wl_user,
                                'wl_namespace' => $newnamespace,
-                               'wl_title' => $newtitle
+                               'wl_title' => $newtitle,
+                               'wl_notificationtimestamp' => $s->wl_notificationtimestamp,
                        );
                }
 
index 0292e9a..0b1accb 100644 (file)
@@ -109,7 +109,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        // Modern MediaWiki has the content for deleted revs in the 'text'
                        // table using fields old_text and old_flags. But revisions deleted
                        // pre-1.5 store the content in the 'archive' table directly using
index 5c44173..b7779a7 100644 (file)
  */
 class ApiQueryBlocks extends ApiQueryBase {
 
-       /**
-        * @var array
-        */
-       protected $usernames;
-
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'bk' );
        }
@@ -102,10 +97,11 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $this->addWhereFld( 'ipb_id', $params['ids'] );
                }
                if ( isset( $params['users'] ) ) {
+                       $usernames = array();
                        foreach ( (array)$params['users'] as $u ) {
-                               $this->prepareUsername( $u );
+                               $usernames[] = $this->prepareUsername( $u );
                        }
-                       $this->addWhereFld( 'ipb_address', $this->usernames );
+                       $this->addWhereFld( 'ipb_address', $usernames );
                        $this->addWhereFld( 'ipb_auto', 0 );
                }
                if ( isset( $params['ip'] ) ) {
@@ -264,7 +260,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                if ( $name === false ) {
                        $this->dieUsage( "User name {$user} is not valid", 'param_user' );
                }
-               $this->usernames[] = $name;
+               return $name;
        }
 
        public function getAllowedParams() {
index 0271037..26ae266 100644 (file)
@@ -94,7 +94,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        // Modern MediaWiki has the content for deleted revs in the 'text'
                        // table using fields old_text and old_flags. But revisions deleted
                        // pre-1.5 store the content in the 'archive' table directly using
index 2e980f3..32355b9 100644 (file)
@@ -167,7 +167,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        // For each page we will request, the user must have read rights for that page
                        $user = $this->getUser();
                        /** @var $title Title */
index 3879d7b..4d75a20 100644 (file)
@@ -32,7 +32,7 @@
 abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
        protected $limit, $diffto, $difftotext, $expandTemplates, $generateXML, $section,
-               $parseContent, $contentFormat, $setParsedLimit = true;
+               $parseContent, $fetchContent, $contentFormat, $setParsedLimit = true;
 
        protected $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
                $fld_size = false, $fld_sha1 = false, $fld_comment = false,
@@ -111,8 +111,11 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                $this->limit = $params['limit'];
 
+               $this->fetchContent = $this->fld_content || !is_null( $this->diffto )
+                       || !is_null( $this->difftotext );
+
                $smallLimit = false;
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        $smallLimit = true;
                        $this->expandTemplates = $params['expandtemplates'];
                        $this->generateXML = $params['generatexml'];
@@ -249,7 +252,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                $content = null;
                global $wgParser;
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        $content = $revision->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                        // Expand templates after getting section content because
                        // template-added sections don't count and Parser::preprocess()
index cc9f9aa..0f33d07 100644 (file)
@@ -116,19 +116,21 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $this->dieUsage( $matches->getWikiText(), 'search-error' );
                }
 
-               $apiResult = $this->getResult();
-               // Add search meta data to result
-               if ( isset( $searchInfo['totalhits'] ) ) {
-                       $totalhits = $matches->getTotalHits();
-                       if ( $totalhits !== null ) {
+               if ( $resultPageSet === null ) {
+                       $apiResult = $this->getResult();
+                       // Add search meta data to result
+                       if ( isset( $searchInfo['totalhits'] ) ) {
+                               $totalhits = $matches->getTotalHits();
+                               if ( $totalhits !== null ) {
+                                       $apiResult->addValue( array( 'query', 'searchinfo' ),
+                                               'totalhits', $totalhits );
+                               }
+                       }
+                       if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) {
                                $apiResult->addValue( array( 'query', 'searchinfo' ),
-                                       'totalhits', $totalhits );
+                                       'suggestion', $matches->getSuggestionQuery() );
                        }
                }
-               if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) {
-                       $apiResult->addValue( array( 'query', 'searchinfo' ),
-                               'suggestion', $matches->getSuggestionQuery() );
-               }
 
                // Add the search results to the result
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
@@ -151,7 +153,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        }
 
                        $title = $result->getTitle();
-                       if ( is_null( $resultPageSet ) ) {
+                       if ( $resultPageSet === null ) {
                                $vals = array();
                                ApiQueryBase::addTitleInfo( $vals, $title );
 
@@ -207,7 +209,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $hasInterwikiResults = true;
 
                        // Include number of results if requested
-                       if ( isset( $searchInfo['totalhits'] ) ) {
+                       if ( $resultPageSet === null && isset( $searchInfo['totalhits'] ) ) {
                                $totalhits = $matches->getTotalHits();
                                if ( $totalhits !== null ) {
                                        $apiResult->addValue( array( 'query', 'interwikisearchinfo' ),
@@ -218,30 +220,35 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $result = $matches->next();
                        while ( $result ) {
                                $title = $result->getTitle();
-                               $vals = array(
-                                       'namespace' => $result->getInterwikiNamespaceText(),
-                                       'title' => $title->getText(),
-                                       'url' => $title->getFullUrl(),
-                               );
-
-                               // Add item to results and see whether it fits
-                               $fit = $apiResult->addValue(
-                                       array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
-                                       null,
-                                       $vals
-                               );
 
-                               if ( !$fit ) {
-                                       // We hit the limit. We can't really provide any meaningful
-                                       // pagination info so just bail out
-                                       break;
+                               if ( $resultPageSet === null ) {
+                                       $vals = array(
+                                               'namespace' => $result->getInterwikiNamespaceText(),
+                                               'title' => $title->getText(),
+                                               'url' => $title->getFullUrl(),
+                                       );
+
+                                       // Add item to results and see whether it fits
+                                       $fit = $apiResult->addValue(
+                                               array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
+                                               null,
+                                               $vals
+                                       );
+
+                                       if ( !$fit ) {
+                                               // We hit the limit. We can't really provide any meaningful
+                                               // pagination info so just bail out
+                                               break;
+                                       }
+                               } else {
+                                       $titles[] = $title;
                                }
 
                                $result = $matches->next();
                        }
                }
 
-               if ( is_null( $resultPageSet ) ) {
+               if ( $resultPageSet === null ) {
                        $apiResult->setIndexedTagName_internal( array(
                                'query', $this->getModuleName()
                        ), 'p' );
index f8fbdc1..976b6d8 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Mormegil"
+                       "Mormegil",
+                       "YjM"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page Dokumentace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete na stránce https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.",
        "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu). Hodnota musí přesně odpovídat jednomu z původů v hlavičce Origin:, takže musí být nastavena na něco jako http://en.wikipedia.org nebo https://meta.wikimedia.org. Pokud parametr neodpovídá hlavičce Origin:, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce Origin: a tento původ je na bílé listině, bude nastavena hlavička Access-Control-Allow-Origin.",
        "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Seznam kódů lze načíst z [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] se siprop=languages nebo uveďte „user“ pro použití předvoleného jazyka aktuálního uživatele či „content“ pro použití jazyka obsahu této wiki.",
+       "apihelp-block-description": "Zablokovat uživatele.",
+       "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
+       "apihelp-block-param-reason": "Důvod bloku.",
+       "apihelp-block-param-anononly": "Zablokovat pouze anonymní uživatele (tj. zakázat editovat anonymně z této IP).",
+       "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
+       "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „blockemail“.)",
+       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
+       "apihelp-block-param-watchuser": "Sledovat uživatelskou a diskusní stranu tohoto uživatele nebo adresy IP.",
+       "apihelp-block-example-user-complex": "Trvale zablokovat uživatele Vandal s odůvodněním „Vandalism“ a bránit vytváření nových účtů a e-mailování",
+       "apihelp-compare-description": "Vrátí rozdíl dvou stránek.\n\nVe „from“ a „to“ musíte zadat číslo revize, název stránky nebo ID stránky.",
+       "apihelp-compare-param-fromtitle": "Název první stránky k porovnání.",
+       "apihelp-compare-param-fromid": "ID první stránky k porovnání.",
+       "apihelp-compare-param-fromrev": "Číslo revize první stránky k porovnání.",
+       "apihelp-compare-param-totitle": "Název druhé stránky k porovnání.",
+       "apihelp-compare-param-toid": "ID druhé stránky k porovnání.",
+       "apihelp-compare-param-torev": "Číslo revize druhé stránky k porovnání.",
+       "apihelp-compare-example-1": "Porovnat revize 1 a 2.",
+       "apihelp-createaccount-description": "Vytvořit nový uživatelský účet.",
+       "apihelp-createaccount-param-name": "Uživatelské jméno.",
+       "apihelp-createaccount-param-password": "Heslo (ignorováno, pokud je nastaveno $1mailpassword).",
+       "apihelp-createaccount-param-email": "E-mailová adresa uživatele (nepovinné).",
+       "apihelp-createaccount-param-realname": "Skutečné jméno uživatele (nepovinné).",
+       "apihelp-createaccount-param-mailpassword": "Pokud je nastaveno na libovolnou hodnotu, zašle se náhodně vygenerované heslo na e-mail uživatele.",
+       "apihelp-delete-description": "Smazat stránku.",
        "apihelp-help-description": "Zobrazuje nápovědu k uvedeným modulům.",
        "apihelp-help-param-modules": "Moduly, pro které se má zobrazit nápověda (hodnoty parametrů action= a format= nebo „main“). Submoduly lze zadávat pomocí „+“.",
-       "apihelp-help-param-submodules": "Zahrnout nápovědu pro submoduly uvedeného modulu.",
-       "apihelp-help-param-recursivesubmodules": "Zahrnout nápovědu pro submoduly rekurzivně.",
+       "apihelp-help-param-submodules": "Zahrnout nápovědu pro podmoduly uvedeného modulu.",
+       "apihelp-help-param-recursivesubmodules": "Zahrnout nápovědu pro podmoduly rekurzivně.",
        "apihelp-help-param-helpformat": "Formát výstupu nápovědy.",
        "apihelp-help-param-wrap": "Obalit výstup do standardní struktury API odpovědi.",
        "apihelp-help-param-toc": "Zahrnout v HTML výstupu tabulku obsahu.",
        "apihelp-help-example-main": "Nápověda k hlavnímu modulu",
        "apihelp-help-example-recursive": "Veškerá nápověda na jedné stránce",
        "apihelp-help-example-help": "Nápověda k samotnému modulu nápovědy",
-       "apihelp-help-example-query": "Nápověda pro dva submoduly query",
+       "apihelp-help-example-query": "Nápověda pro dva podmoduly query",
        "apihelp-format-example-generic": "Výsledek dotazu vypsat ve formátu $1.",
        "apihelp-dbg-description": "Vypisuje data ve formátu funkce var_export() z PHP.",
        "apihelp-dbgfm-description": "Vypisuje data ve formátu funkce var_export() z PHP (v čitelné HTML podobě).",
@@ -38,7 +64,7 @@
        "apihelp-jsonfm-description": "Vypisuje data ve formátu JSON (v čitelné HTML podobě).",
        "apihelp-none-description": "Nevypisuje nic.",
        "apihelp-php-description": "Vypisuje data v serializačním formátu PHP.",
-       "apihelp-phpfm-description": "Vypisuje data ve serializačním formátu PHP (v čitelné HTML podobě).",
+       "apihelp-phpfm-description": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).",
        "apihelp-rawfm-description": "Vypisuje data s ladicími prvky ve formátu JSON (v čitelné HTML podobě).",
        "apihelp-txt-description": "Vypisuje data ve formátu funkce print_r() z PHP.",
        "apihelp-txtfm-description": "Vypisuje data ve formátu funkce print_r() z PHP (v čitelné HTML podobě).",
index 7bdc693..70d32e5 100644 (file)
        "apihelp-logout-example-logout": "Meldet den aktuellen Benutzer ab",
        "apihelp-move-description": "Eine Seite verschieben.",
        "apihelp-move-param-from": "Titel der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1fromid verwendet werden.",
+       "apihelp-move-param-fromid": "Seitenkennung der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1from verwendet werden.",
        "apihelp-move-param-to": "Titel, zu dem die Seite umbenannt werden soll.",
        "apihelp-move-param-reason": "Grund für die Verschiebung.",
        "apihelp-move-param-movetalk": "Verschiebt die Diskussionsseite, falls vorhanden.",
        "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
        "apihelp-query+allcategories-description": "Alle Kategorien aufzählen.",
        "apihelp-query+allcategories-param-limit": "Wie viele Kategorien zurückgegeben werden sollen.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Nur Seiten in diesem Namensraum auflisten.",
        "apihelp-query+allfileusages-param-limit": "Wie viele Gesamtobjekte zurückgegeben werden sollen.",
        "apihelp-query+allfileusages-example-unique": "Einheitliche Dateititel auflisten",
        "apihelp-query+allfileusages-example-generator": "Seiten abrufen, die die Dateien enthalten",
        "apihelp-query+allredirects-example-generator": "Seiten abrufen, die die Weiterleitungen enthalten",
        "apihelp-query+alltransclusions-param-namespace": "Der aufzulistende Namensraum.",
        "apihelp-query+alltransclusions-example-unique": "Einheitlich eingebundene Titel auflisten",
+       "apihelp-query+allusers-param-limit": "Wie viele Benutzernamen insgesamt zurückgegeben werden sollen.",
        "apihelp-query+allusers-example-Y": "Benutzer ab Y auflisten",
        "apihelp-query+backlinks-description": "Alle Seiten finden, die auf die angegebene Seite verlinken.",
        "apihelp-query+backlinks-example-simple": "Links auf [[Hauptseite]] anzeigen",
        "apihelp-query+categorymembers-param-endsortkey": "Stattdessen $1endhexsortkey verwenden.",
        "apihelp-query+deletedrevs-param-from": "Auflistung bei diesem Titel beginnen.",
        "apihelp-query+deletedrevs-param-to": "Auflistung bei diesem Titel beenden.",
+       "apihelp-query+extlinks-param-limit": "Wie viele Links zurückgegeben werden sollen.",
+       "apihelp-query+exturlusage-param-limit": "Wie viele Seiten zurückgegeben werden sollen.",
+       "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten",
        "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
        "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
        "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
        "apihelp-query+imageinfo-param-urlheight": "Ähnlich wie $1urlwidth.",
+       "apihelp-query+info-description": "Ruft Basisinformationen über die Seite ab.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
        "apihelp-query+links-example-simple": "Links von der [[Hauptseite]] abrufen",
        "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
+       "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
        "apihelp-query+search-example-simple": "Nach „meaning“ suchen",
        "apihelp-query+search-example-text": "Texte nach „meaning“ durchsuchen",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
index ebd5f1d..ba1d552 100644 (file)
@@ -2,18 +2,35 @@
        "@metadata": {
                "authors": [
                        "Macofe",
-                       "Effy"
+                       "Effy",
+                       "Alan"
                ]
        },
        "apihelp-block-description": "Bloquear usuario",
+       "apihelp-block-param-reason": "Razón para el bloqueo.",
+       "apihelp-block-param-nocreate": "Prevenir la creación de cuentas.",
        "apihelp-compare-param-fromtitle": "Primer título para comparar",
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
        "apihelp-createaccount-param-name": "Nombre de usuario.",
-       "apihelp-delete-param-watch": "Añadir esta página a su lista de seguimiento",
-       "apihelp-delete-param-unwatch": "Borrar esta página de su lista de seguimiento",
+       "apihelp-delete-description": "Borrar una página.",
+       "apihelp-delete-param-watch": "Añadir esta página a tu lista de seguimiento.",
+       "apihelp-delete-param-unwatch": "Borrar esta página de tu lista de seguimiento.",
+       "apihelp-delete-example-simple": "Borrar la Página Principal",
        "apihelp-edit-description": "Crear y editar páginas.",
+       "apihelp-edit-param-minor": "Edición menor.",
+       "apihelp-edit-param-notminor": "Edición no menor.",
+       "apihelp-edit-param-bot": "Marcar esta edición como de bot.",
+       "apihelp-edit-example-edit": "Editar una página",
        "apihelp-expandtemplates-param-title": "Título de la página.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar cambios menores.",
+       "apihelp-login-param-name": "Nombre de usuario.",
+       "apihelp-login-param-password": "Contraseña.",
+       "apihelp-login-param-domain": "Dominio (opcional).",
+       "apihelp-move-description": "Mover una página.",
+       "apihelp-opensearch-param-search": "Buscar cadena.",
+       "apihelp-patrol-example-rcid": "Patrullar un cambio reciente",
+       "apihelp-patrol-example-revid": "Patrullar una revisión",
+       "apihelp-protect-example-protect": "Proteger una página",
        "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
        "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
        "apihelp-query+search-param-info": "Qué metadatos devolver.",
index 2077c85..9044f02 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Gomoko",
-                       "Windes"
+                       "Windes",
+                       "Orlodrim"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en  cours de développement, et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Demandes erronées :</strong> Qaund des demandes erronés sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error » et à la fois la valeur de l’entête et le code d’erreur retourné prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-query+imageusage-example-simple": "Afficher les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+imageusage-example-generator": "Obtenir des informations sur les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+info-description": "Obtenir les informations de base sur la page.",
+       "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :\n;protection:Liste de niveau de protection de chaque page.\n;talkid:L’ID de la page de discussion pour chaque page qui n’est pas une page de discussion.\n;watched:Liste de l’état de suivi de chaque page.\n;watchers:Le nombre d’observateurs, si c&est autorisé.\n;notificationtimestamp:L’horodatage de notification de la liste de suivi de chaque page.\n;subjectid:L’ID de la page parente de chaque page de discussion.\n;url:Fournit une URL complète, une URL de modification, et l’URL canonique pour chaque page.\n;readable:Si l’utilisateur peut lire cette page.\n;preload:Fournit le texte renvoyé par EditFormPreloadText.\n;displaytitle:Fournit la manière dont le titre de la page est vraiment affiché.",
+       "apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-query+info-example-simple": "Obtenir des informations sur [[Main Page]]",
+       "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur [[Main Page]]",
+       "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). N’utiliser aucun paramètre revient en pratique à « tous les liens interwiki ».",
+       "apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.",
+       "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1blprefix.",
+       "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
+       "apihelp-query+iwbacklinks-param-prop": "Quelles propriétés obtenir :\n;iwprefix:Ajoute le préfixe de l’interwiki.\n;iwtitle:Ajoute le titre de l’interwiki.",
+       "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwlinks-description": "Renvoie tous les liens interwiki des pages indiquées.",
+       "apihelp-query+iwlinks-param-url": "S&il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
+       "apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.",
+       "apihelp-query+iwlinks-param-limit": "Combien de liens interwiki renvoyer.",
+       "apihelp-query+iwlinks-param-prefix": "Renvoyer uniquement les liens interwiki avec ce préfixe.",
+       "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1prefix.",
+       "apihelp-query+iwlinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+iwlinks-example-simple": "Obtenir les liens interwiki de [[Main Page]]",
+       "apihelp-query+langbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien de langue indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un code de langue, ou tous les liens vers un titre (avec une langue donnée). N’utiliser aucun paramètre revient à « tous les liens de langue ».\n\nNotez que cela peut ne pas prendre en compte les liens de langue ajoutés par les extensions.",
+       "apihelp-query+langbacklinks-param-lang": "Langue pour le lien de langue.",
+       "apihelp-query+langbacklinks-param-title": "Lien de langue à rechercher. Doit être utilisé avec $1lang.",
+       "apihelp-query+langbacklinks-param-limit": "Combien de pages renvoyer au total.",
+       "apihelp-query+langbacklinks-param-prop": "Quelles propriétés obtenir :\n;lllang:Ajoute le code de langue du lien de langue.\n;lltitle:Ajoute le titre du lien de langue.",
+       "apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+langbacklinks-example-simple": "Obtenir les pages avec un lien avec [[:fr:Test]]",
+       "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]]",
+       "apihelp-query+langlinks-description": "Renvoie tous les liens inter-langue des pages fournies.",
+       "apihelp-query+langlinks-param-limit": "Combien de liens de langue renvoyer.",
+       "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec $1prop).",
+       "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien inter-langue :\n;url:Ajoute l’URL complète.\n;langname:Ajoute le nom localisé de la langue (au mieux). Utiliser $1inlanguagecode pour contrôler la langue.\n;autonym:Ajoute le nom natif de la langue.",
+       "apihelp-query+langlinks-param-lang": "Renvoyer uniquement les liens de langue avec ce code de langue.",
+       "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec $1lang.",
+       "apihelp-query+langlinks-param-dir": "La direction à lister.",
+       "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
+       "apihelp-query+langlinks-example-simple": "Obtenir les liens inter-langue de [[Main Page]]",
+       "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
+       "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de nom.",
+       "apihelp-query+links-param-limit": "Combien de liens renvoyer.",
+       "apihelp-query+links-param-titles": "Lister uniquement les liens de ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.",
+       "apihelp-query+links-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+links-example-simple": "Obtenir les liens de [[Main Page]]",
+       "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans [[Main Page]]",
+       "apihelp-query+links-example-namespaces": "Obtenir les liens de [[Main Page]] dans les espaces de nom Utilisateur et Modèle",
+       "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
+       "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Marquage si la page est une redirection.",
+       "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+linkshere-param-limit": "Combien renvoyer.",
+       "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirects:Afficher uniquement les non-redirections.",
+       "apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à  [[Main Page]]",
+       "apihelp-query+linkshere-example-generator": "Obtenir des informations sur les pages liées à [[Main Page]]",
+       "apihelp-query+logevents-description": "Obtenir des événements des journaux.",
+       "apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :\n;ids:Ajoute l’ID de l’événement tracé.\n;title:Ajoute le titre de la page pour l’événement tracé.\n;type:Ajoute le type de l’événement tracé.\n;user:Ajoute l’utilisateur responsable de l’événement tracé.\n;userid:Ajoute l’ID de l’utilisateur responsable de l’événement tracé.\n;timestamp:Ajoute l’horodatage de l’événement.\n;comment:Ajoute le commentaire de l’événement.\n;parsedcomment:Ajoute le commentaire analysé de l’événement.\n;details:Liste les détails supplémentaires sur l’événement.\n;tags:Liste les balises de l’événement.",
+       "apihelp-query+logevents-param-type": "Filtrer les entrées du journal à ce seul type.",
+       "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase $1type. Des actions avec une astérisque de la forme « action/* » sont autorisées pour spécifier n’importe quelle chaîne à la place de l’astérisque.",
+       "apihelp-query+logevents-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+logevents-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-format-example-generic": "Mettre en forme le résultat de la requête dans le format $1",
        "apihelp-dbg-description": "Extraire les données au format de var_export() de PHP.",
        "apihelp-dbgfm-description": "Extraire les données au format de var_export() de PHP (affiché proprement en HTML).",
        "apihelp-yamlfm-description": "Extraire les données YAML (affiché proprement en HTML).",
        "api-format-title": "Résultat de l’API de MédiaWiki",
        "api-format-prettyprint-header": "Vous regardez la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [https://www.mediawiki.org/wiki/API documentation complète], ou l’ [[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
-       "api-help-title": "Aide de l’API de MédiaWiki",
+       "api-help-title": "Aide de l’API de MediaWiki",
        "api-help-lead": "Ceci est une page d’aide de l’API de MédiaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Module principal",
        "api-help-flag-deprecated": "Ce module est obsolète.",
index 8363d0d..0d4e3ae 100644 (file)
@@ -2,11 +2,21 @@
        "@metadata": {
                "authors": [
                        "Guycn2",
-                       "Amire80"
+                       "Amire80",
+                       "Inkbug"
                ]
        },
        "apihelp-main-param-action": "איזו פעולה לבצע.",
        "apihelp-main-param-format": "התבנית של הפלט.",
+       "apihelp-block-description": "חסימת משתמש.",
+       "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
+       "apihelp-block-param-reason": "סיבה לחסימה.",
+       "apihelp-createaccount-param-name": "שם משתמש.",
+       "apihelp-delete-example-simple": "מחיקת הדף הראשי",
+       "apihelp-edit-param-minor": "עריכה משנית.",
+       "apihelp-edit-example-edit": "עריכת דף",
+       "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
+       "apihelp-expandtemplates-param-title": "כותרת הדף.",
        "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.",
        "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
index cdf9057..516d8c7 100644 (file)
@@ -1,8 +1,17 @@
 {
        "@metadata": {
                "authors": [
-                       "Csega"
+                       "Csega",
+                       "Dorgan"
                ]
        },
+       "apihelp-block-description": "Szerkesztő blokkolása",
+       "apihelp-block-param-reason": "Blokkolás oka.",
+       "apihelp-block-param-nocreate": "Új regisztráció megakadályozása",
+       "apihelp-createaccount-param-name": "Felhasználónév.",
+       "apihelp-delete-description": "Lap törlése.",
+       "apihelp-delete-example-simple": "Kezdőlap törlése.",
+       "apihelp-edit-example-edit": "Lap szerkesztése",
+       "apihelp-expandtemplates-param-title": "Lap címe.",
        "apihelp-userrights-param-userid": "Felhasználói azonosító."
 }
index ffd7079..515ab8b 100644 (file)
@@ -15,7 +15,7 @@
        "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
        "apihelp-main-param-curtimestamp": "Бклучи тековно време и време и датум во резултатот.",
        "apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како http://en.wikipedia.org or https://meta.wikimedia.org. Ако овој параметар не се совпаѓа со заглавието Origin:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе ззаглавието Контрола на пристап-Изворник.",
-       "apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]], или пак укажете „user“ за да го користите тековно зададениот јазик корисникот.",
+       "apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] со siprop=languages или укажете „user“ за да го користите тековно зададениот јазик корисникот, или пак укажете „content“ за да го користите јазикот на содржината на ова вики.",
        "apihelp-block-description": "Блокирај корисник.",
        "apihelp-block-param-user": "Корисничко име, IP-адреса или IP-опсег ако сакате да блокирате.",
        "apihelp-block-param-expiry": "Време на истек. Може да биде релативно (на пр. „5 месеци“ или „2 недели“) или пак апсолутно (на пр. „2014-09-18T12:34:56Z“). Ако го зададете „бесконечно“, „неодредено“ или „никогаш“, блокот ќе трае засекогаш.",
        "apihelp-query+allcategories-param-from": "Од која категорија да почне набројувањето.",
        "apihelp-query+allcategories-param-to": "На која категорија да запре набројувањето.",
        "apihelp-query+allcategories-param-dir": "Насока на подредувањето.",
+       "apihelp-query+alllinks-param-namespace": "Именскиот простор што се набројува.",
+       "apihelp-query+alllinks-param-limit": "Колку вкупно ставки да се дадат.",
+       "apihelp-query+alllinks-param-dir": "Насока на исписот.",
+       "apihelp-query+alllinks-example-B": "Списока на наслови со врски, вклучувајќи ги отсутните, со назнаки на нивните страници, почнувајќи од Б",
+       "apihelp-query+alllinks-example-unique": "Испиши единствени наслови со врски",
+       "apihelp-query+alllinks-example-unique-generator": "Ги дава сите наслови со врски, означувајќи ги отсутните",
+       "apihelp-query+alllinks-example-generator": "Дава страници што ги содржат врските",
+       "apihelp-query+allmessages-description": "Дава пораки од ова мрежно место.",
+       "apihelp-query+allmessages-param-filter": "Дај само пораки со називи што ја содржат оваа низа.",
+       "apihelp-query+allmessages-param-customised": "Дај само пораки во оваа состојба на прилагоденост.",
+       "apihelp-query+allmessages-param-lang": "Дај само пораки на овој јазик.",
+       "apihelp-query+allmessages-param-from": "Дај ги пораките што почнуваат од оваа порака.",
+       "apihelp-query+allmessages-param-to": "Дај пораки што завршуваат со оваа порака.",
+       "apihelp-query+allmessages-param-title": "Назив на страницата што ќе се користи во контекст кога се расчленува порака (за можноста $1enableparser).",
+       "apihelp-query+allmessages-param-prefix": "Дај пораки со оваа претставка.",
+       "apihelp-query+allmessages-example-ipb": "Прикажи ги пораките што започнуваат со „ipb-“",
+       "apihelp-query+allmessages-example-de": "Прикажи ги пораките „август“ и „главна страница“ на германски",
+       "apihelp-query+allpages-description": "Наброј ги сите страници последователно во даден именски простор.",
+       "apihelp-query+allpages-param-from": "Наслов на страницата од која ќе почне набројувањето.",
+       "apihelp-query+allpages-param-to": "Наслов на страницата на која ќе запре набројувањето.",
+       "apihelp-query+allpages-param-prefix": "Пребарај ги сите наслови на страници што почнуваат со оваа вредност.",
+       "apihelp-query+allpages-param-namespace": "Именскиот простор што се набројува.",
+       "apihelp-query+allpages-param-filterredir": "Кои страници да се испишат.",
+       "apihelp-query+allpages-param-minsize": "Ограничи на страници со барем олку бајти.",
+       "apihelp-query+allpages-param-maxsize": "Ограничи на страници со највеќе олку бајти.",
+       "apihelp-query+allpages-param-prtype": "Ограничи на само заштитени страници.",
        "apihelp-query+backlinks-example-simple": "Прикажи врски до [[Главна страница|Главната страница]]",
        "apihelp-query+backlinks-example-generator": "Дава информации за страниците што водат до [[Главна страница|Главната страница]]",
        "apihelp-query+blocks-description": "Список на сите блокирани корисници и IP-адреси",
index 7d89e3c..a75ebc8 100644 (file)
@@ -2,13 +2,17 @@
        "@metadata": {
                "authors": [
                        "Chrumps",
-                       "Py64"
+                       "Py64",
+                       "Pan Cube"
                ]
        },
        "apihelp-main-param-action": "Wybierz akcję do wykonania.",
        "apihelp-main-param-format": "Format danych wyjściowych.",
        "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu \"maxlag\" jest zwracany z wiadomością jak \"Oczekiwanie na $host: $lag sekund opóźnienia\".<br />Zobacz https://www.mediawiki.org/wiki/Manual:Maxlag_parameter by uzyskać więcej informacji.",
        "apihelp-main-param-assert": "Sprawdź, czy użytkownik jest zalogowany jeżeli jest ustawiony na \"użytkownik\", lub ma prawa bota jeśli \"bot\".",
+       "apihelp-block-description": "Zablokuj użytkownika.",
+       "apihelp-block-param-reason": "Powód blokady.",
+       "apihelp-createaccount-param-name": "Nazwa użytkownika",
        "apihelp-edit-example-edit": "Edytuj stronę",
        "apihelp-help-description": "Wyświetl pomoc dla określonych modułów.",
        "apihelp-help-param-modules": "Moduły do wyświetlenia pomocy dla (wartości akcji= i format= parametry, lub \"głównego\"). Może określić podmoduły z \"+\".",
index 27eaa94..4dc23e5 100644 (file)
@@ -1,9 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Vitorvicentevalente"
+                       "Vitorvicentevalente",
+                       "Fúlvio"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentação]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Qual acção a executar.",
        "apihelp-main-param-format": "O formato de saída.",
        "apihelp-block-description": "Bloquear um utilizador.",
        "apihelp-block-param-user": "Nome de utilizador(a), endereço ou gama de IP que pretende bloquear.",
index b81c2a6..fb368e3 100644 (file)
        "api-help-parameters": "Label for the API help parameters section\n\nParameters:\n* $1 - Number of parameters to be displayed\n{{Identical|Parameter}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
-       "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}",
+       "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}\n{{Identical|Value}}",
        "api-help-param-list-can-be-empty": "Used to indicate that one of the possible values in the list is the empty string.\n\nParameters:\n* $1 - Number of items in the rest of the list; may be 0\n* $2 - Remainder of the list as a comma-separated string",
        "api-help-param-limit": "Used to display the maximum value of a limit parameter\n\nParameters:\n* $1 - Maximum value",
        "api-help-param-limit2": "Used to display the maximum values of a limit parameter\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
index ae40cd9..4ac5531 100644 (file)
        "apihelp-filerevert-param-comment": "Ladda upp kommentar.",
        "apihelp-help-example-recursive": "All hjälp på en sida",
        "apihelp-help-example-help": "Hjälp för själva hjälpmodulen",
+       "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
+       "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
+       "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil",
+       "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
+       "apihelp-upload-param-stash": "Om angiven, kommer servern inte att lägga till filen till centralförvaret och lagra den temporärt.",
        "api-help-main-header": "Huvudmodul",
        "api-help-flag-deprecated": "Denna modul är föråldrad.",
        "api-help-flag-internal": "<strong>Denna modul är intern eller instabil.</strong> Dess funktion kan ändras utan föregående meddelande.",
index c53dac0..9c1465c 100644 (file)
@@ -7,13 +7,15 @@
                        "Papapasan"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page 文档]\n* [https://www.mediawiki.org/wiki/API:FAQ 问答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bugs与需求信息]\n</div>\n<strong>状态信息:</strong> 本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong> 当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
-       "apihelp-main-param-action": "要执行哪些操作。",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page 文档]\n* [https://www.mediawiki.org/wiki/API:FAQ 常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong> 本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong> 当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
+       "apihelp-main-param-action": "要执行操作。",
        "apihelp-main-param-format": "输出的格式。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
        "apihelp-block-description": "封禁一位用户。",
        "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
+       "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如“5个月”或“2周”)或绝对时间(例如“2014-09-18T12:34:56Z”)。如果设置为“infinite”、“indefinite”或“never”,封禁将无限期。",
        "apihelp-block-param-reason": "封禁的原因",
+       "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此IP的匿名编辑)。",
        "apihelp-block-param-nocreate": "防止创建帐户。",
        "apihelp-block-param-noemail": "阻止用户通过 wiki发送电子邮件。(要求\"blockemail\"权限)。",
        "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要“隐藏用户”权限)。",
        "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。",
        "apihelp-query+allcategories-param-limit": "要返回多少个类别。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],同时使用$1user和$1namespace将导致继续前返回少于“$1limit”个结果,在极端条件下可能不返回任何结果。",
        "apihelp-query+allfileusages-param-dir": "罗列所采用的方向。",
        "apihelp-query+allfileusages-example-unique": "列出唯一性的文件标题",
        "apihelp-query+allfileusages-example-unique-generator": "获取所有文件标题,并标记出缺失者",
        "apihelp-query+allimages-param-sha1": "图像的 SHA1 哈希。覆盖$1sha1base36。",
        "apihelp-query+allimages-param-limit": "共计要返回多少图像。",
        "apihelp-query+allimages-example-B": "显示以字母“B”开始的文件列表",
+       "apihelp-query+allimages-example-generator": "显示有关4个以“T”开头的文件的信息",
        "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面",
        "apihelp-query+allmessages-description": "返回来自该站点的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的哪些消息。\"*\" (默认值) 表示所有消息。",
        "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
        "apihelp-query+allredirects-example-unique-generator": "获得所有目标页面,标记丢失的",
        "apihelp-query+allredirects-example-generator": "获得包含重定向的页面",
+       "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1天内活跃的用户。",
        "apihelp-query+allusers-example-Y": "列出以Y开头的用户",
        "apihelp-query+extlinks-param-limit": "返回多少链接。",
        "apihelp-query+exturlusage-param-limit": "返回多少页面。",
        "apihelp-query+exturlusage-example-simple": "显示链接至http://www.mediawiki.org的页面",
+       "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
+       "apihelp-query+filearchive-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表",
        "apihelp-query+fileusage-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
        "apihelp-query+fileusage-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+linkshere-example-simple": "获取链接至[[首页]]的页面列表",
        "apihelp-query+linkshere-example-generator": "获取有关链接至[[首页]]的页面的信息",
        "apihelp-query+logevents-description": "从日志获取事件。",
+       "apihelp-query+logevents-example-simple": "列出最近日志活动",
        "apihelp-query+pagepropnames-example-simple": "获取前10个常用名称",
        "apihelp-query+pageprops-example-simple": "获取用于[[:Category:Foo]]的属性",
        "apihelp-query+pageswithprop-example-simple": "列出前10个使用&#123;&#123;DISPLAYTITLE:&#125;&#125;的页面",
        "apihelp-query+prefixsearch-param-search": "搜索字符串。",
        "apihelp-query+prefixsearch-param-namespace": "搜索的名字空间。",
        "apihelp-query+protectedtitles-param-namespace": "只列出这些名字空间的标题。",
+       "apihelp-query+protectedtitles-param-limit": "返回的总计页面数。",
        "apihelp-query+protectedtitles-example-simple": "受保护标题列表",
        "apihelp-query+querypage-param-limit": "返回的结果数。",
        "apihelp-query+querypage-example-ancientpages": "返回[[Special:Ancientpages]]的结果。",
        "apihelp-query+recentchanges-description": "枚举最近更改。",
        "apihelp-query+recentchanges-param-user": "只列出此用户的更改。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出此用户的更改。",
+       "apihelp-query+recentchanges-param-tag": "只列出带此标签的更改。",
        "apihelp-query+recentchanges-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表",
+       "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
+       "apihelp-query+redirects-param-limit": "返回多少重定向。",
        "apihelp-query+redirects-example-simple": "获取至[[首页]]的重定向列表",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[首页]]的信息",
        "apihelp-query+revisions-example-last5": "获取“首页”的最近5次修订",
        "apihelp-upload-param-watch": "监视页面。",
        "apihelp-upload-param-ignorewarnings": "忽略任何警告。",
        "apihelp-upload-param-file": "文件内容。",
+       "apihelp-upload-param-stash": "如果设置,服务器将不会添加文件至存储库并暂时藏匿。",
+       "apihelp-upload-param-chunk": "大块内容。",
        "apihelp-upload-example-url": "从URL上传",
        "apihelp-userrights-param-user": "用户名。",
        "apihelp-userrights-param-userid": "用户ID。",
        "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
        "api-help-param-default": "默认:$1",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
+       "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
        "api-help-param-disabled-in-miser-mode": "由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式]而禁用。",
        "api-help-param-limited-in-miser-mode": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],使用这个可能导致继续前返回少于“$1limit”个结果;极端情况下可能不会返回任何结果。",
        "api-help-param-continue": "什么时候更多结果可用什么时候继续使用。",
diff --git a/includes/cache/MapCacheLRU.php b/includes/cache/MapCacheLRU.php
deleted file mode 100644 (file)
index 95e3af7..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/**
- * Per-process memory cache for storing items.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- */
-
-/**
- * Handles a simple LRU key/value map with a maximum number of entries
- *
- * Use ProcessCacheLRU if hierarchical purging is needed or objects can become stale
- *
- * @see ProcessCacheLRU
- * @ingroup Cache
- * @since 1.23
- */
-class MapCacheLRU {
-       /** @var array */
-       protected $cache = array(); // (key => value)
-
-       protected $maxCacheKeys; // integer; max entries
-
-       /**
-        * @param int $maxKeys Maximum number of entries allowed (min 1).
-        * @throws MWException When $maxCacheKeys is not an int or =< 0.
-        */
-       public function __construct( $maxKeys ) {
-               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
-                       throw new MWException( __METHOD__ . " must be given an integer and >= 1" );
-               }
-               $this->maxCacheKeys = $maxKeys;
-       }
-
-       /**
-        * Set a key/value pair.
-        * This will prune the cache if it gets too large based on LRU.
-        * If the item is already set, it will be pushed to the top of the cache.
-        *
-        * @param string $key
-        * @param mixed $value
-        * @return void
-        */
-       public function set( $key, $value ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-               } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
-                       reset( $this->cache );
-                       $evictKey = key( $this->cache );
-                       unset( $this->cache[$evictKey] );
-               }
-               $this->cache[$key] = $value;
-       }
-
-       /**
-        * Check if a key exists
-        *
-        * @param string $key
-        * @return bool
-        */
-       public function has( $key ) {
-               return array_key_exists( $key, $this->cache );
-       }
-
-       /**
-        * Get the value for a key.
-        * This returns null if the key is not set.
-        * If the item is already set, it will be pushed to the top of the cache.
-        *
-        * @param string $key
-        * @return mixed
-        */
-       public function get( $key ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-                       return $this->cache[$key];
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * Clear one or several cache entries, or all cache entries
-        *
-        * @param string|array $keys
-        * @return void
-        */
-       public function clear( $keys = null ) {
-               if ( $keys === null ) {
-                       $this->cache = array();
-               } else {
-                       foreach ( (array)$keys as $key ) {
-                               unset( $this->cache[$key] );
-                       }
-               }
-       }
-
-       /**
-        * Push an entry to the top of the cache
-        *
-        * @param string $key
-        */
-       protected function ping( $key ) {
-               $item = $this->cache[$key];
-               unset( $this->cache[$key] );
-               $this->cache[$key] = $item;
-       }
-}
index 99dafa6..43e00cd 100644 (file)
@@ -72,7 +72,7 @@ class MessageCache {
        protected $mExpiry;
 
        /**
-        * Message cache has it's own parser which it uses to transform
+        * Message cache has its own parser which it uses to transform
         * messages.
         */
        protected $mParserOptions, $mParser;
@@ -1059,6 +1059,7 @@ class MessageCache {
                wfProfileIn( __METHOD__ );
                if ( !$title || !$title instanceof Title ) {
                        global $wgTitle;
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
                        $title = $wgTitle;
                }
                // Sometimes $wgTitle isn't set either...
index 059f18c..d620be9 100644 (file)
@@ -140,7 +140,7 @@ class RequestContext implements IContextSource {
                if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetCaller() . ' with no title set.' );
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
                }
 
                return $this->title;
index 34132aa..18cd39f 100644 (file)
  * @ingroup Database
  */
 
-/**
- * Base interface for all DBMS-specific code. At a bare minimum, all of the
- * following must be implemented to support MediaWiki
- *
- * @file
- * @ingroup Database
- */
-interface DatabaseType {
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        *
-        * @return string
-        */
-       function getType();
-
-       /**
-        * Open a connection to the database. Usually aborts on failure
-        *
-        * @param string $server Database server host
-        * @param string $user Database user name
-        * @param string $password Database user password
-        * @param string $dbName Database name
-        * @return bool
-        * @throws DBConnectionError
-        */
-       function open( $server, $user, $password, $dbName );
-
-       /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchObject( $res );
-
-       /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchRow( $res );
-
-       /**
-        * Get the number of rows in a result object
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numRows( $res );
-
-       /**
-        * Get the number of fields in a result object
-        * @see http://www.php.net/mysql_num_fields
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numFields( $res );
-
-       /**
-        * Get a field name in a result object
-        * @see http://www.php.net/mysql_field_name
-        *
-        * @param mixed $res A SQL result
-        * @param int $n
-        * @return string
-        */
-       function fieldName( $res, $n );
-
-       /**
-        * Get the inserted value of an auto-increment row
-        *
-        * The value inserted should be fetched from nextSequenceValue()
-        *
-        * Example:
-        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-        * $dbw->insert( 'page', array( 'page_id' => $id ) );
-        * $id = $dbw->insertId();
-        *
-        * @return int
-        */
-       function insertId();
-
-       /**
-        * Change the position of the cursor in a result object
-        * @see http://www.php.net/mysql_data_seek
-        *
-        * @param mixed $res A SQL result
-        * @param int $row
-        */
-       function dataSeek( $res, $row );
-
-       /**
-        * Get the last error number
-        * @see http://www.php.net/mysql_errno
-        *
-        * @return int
-        */
-       function lastErrno();
-
-       /**
-        * Get a description of the last error
-        * @see http://www.php.net/mysql_error
-        *
-        * @return string
-        */
-       function lastError();
-
-       /**
-        * mysql_fetch_field() wrapper
-        * Returns false if the field doesn't exist
-        *
-        * @param string $table Table name
-        * @param string $field Field name
-        *
-        * @return Field
-        */
-       function fieldInfo( $table, $field );
-
-       /**
-        * Get information about an index into an object
-        * @param string $table Table name
-        * @param string $index Index name
-        * @param string $fname Calling function name
-        * @return mixed Database-specific index description class or false if the index does not exist
-        */
-       function indexInfo( $table, $index, $fname = __METHOD__ );
-
-       /**
-        * Get the number of rows affected by the last write query
-        * @see http://www.php.net/mysql_affected_rows
-        *
-        * @return int
-        */
-       function affectedRows();
-
-       /**
-        * Wrapper for addslashes()
-        *
-        * @param string $s String to be slashed.
-        * @return string Slashed string.
-        */
-       function strencode( $s );
-
-       /**
-        * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[http://www.mysql.com/ MySQL]";
-        * Should at least contain plain text, if for some reason
-        * your database has no website.
-        *
-        * @return string Wikitext of a link to the server software's web site
-        */
-       function getSoftwareLink();
-
-       /**
-        * A string describing the current software version, like from
-        * mysql_get_server_info().
-        *
-        * @return string Version information from the database server.
-        */
-       function getServerVersion();
-
-       /**
-        * A string describing the current software version, and possibly
-        * other details in a user-friendly way. Will be listed on Special:Version, etc.
-        * Use getServerVersion() to get machine-friendly information.
-        *
-        * @return string Version information from the database server
-        */
-       function getServerInfo();
-}
-
 /**
  * Interface for classes that implement or wrap DatabaseBase
  * @ingroup Database
@@ -216,7 +36,7 @@ interface IDatabase {
  * Database abstraction object
  * @ingroup Database
  */
-abstract class DatabaseBase implements IDatabase, DatabaseType {
+abstract class DatabaseBase implements IDatabase {
        /** Number of times to re-try an operation in case of deadlock */
        const DEADLOCK_TRIES = 4;
 
index b99ffb6..9aa4ca8 100644 (file)
@@ -451,10 +451,13 @@ class FSFileBackend extends FileBackendStore {
                // Create the directory and its parents as needed...
                $this->trapWarnings();
                if ( !wfMkdirParents( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend', __METHOD__ . ": cannot create directory $dir" );
                        $status->fatal( 'directorycreateerror', $params['dir'] ); // fails on races
                } elseif ( !is_writable( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend',  __METHOD__ . ": directory $dir is read-only" );
                        $status->fatal( 'directoryreadonlyerror', $params['dir'] );
                } elseif ( !is_readable( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend',  __METHOD__ . ": directory $dir is not readable" );
                        $status->fatal( 'directorynotreadableerror', $params['dir'] );
                }
                $this->untrapWarnings();
index 7563d64..c82be50 100644 (file)
@@ -471,6 +471,8 @@ abstract class File {
        public function getThumbnailBucket( $desiredWidth, $page = 1 ) {
                global $wgThumbnailBuckets, $wgThumbnailMinimumBucketDistance;
 
+               wfDebugLog( 'thumbnail', 'thumbnail buckets ' . json_encode( $wgThumbnailBuckets ) );
+
                $imageWidth = $this->getWidth( $page );
 
                if ( $imageWidth === false ) {
index d0db084..202edef 100644 (file)
@@ -6,11 +6,13 @@
                        "Muhammed taha"
                ]
        },
+       "config-desc": "دامەزرێنەرەکە بۆ میدیاویکی",
+       "config-title": "دامەزرانی میدیاویکی $1",
        "config-information": "زانیاری",
        "config-your-language": "زمانەکەت:",
        "config-wiki-language": "زمانی ویکی:",
        "config-back": "→ گەڕانەوە",
-       "config-continue": "بەردەوامبوون ←",
+       "config-continue": "بەردەوام بە ←",
        "config-page-language": "زمان",
        "config-page-welcome": "بەخێربێیت بۆ میدیاویکی!",
        "config-page-dbconnect": "پەیوەندی دەکات بەبنکەی زانیارییەکان",
        "config-page-upgradedoc": "نوێدەکرێتەوە",
        "config-page-existingwiki": "ویکی پێشوو",
        "config-restart": "بەڵێ، دەستی پێ بکەرەوە",
-       "config-env-php": "PHP $1 دابەزێندرا.",
-       "config-env-php-toolow": "PHP $1 دابەزێندرا.\nھەرچۆنێک بێت میدیاویکی پێویستی بە PHP $2 یان بەرزتر ھەیە.",
+       "config-env-php": "PHP $1 دامەزراوە.",
+       "config-apc": "[http://www.php.net/apc APC] دامەزراوە",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] دامەزراوە",
+       "config-db-type": "جۆری داتابەیس:",
+       "config-db-host": "خانەخوێی داتابەیس:",
        "config-db-name": "ناوی بنکەدراوە:",
+       "config-db-install-account": "ھەژماری بەکارھێنەری بۆ دامەزراندن",
        "config-db-username": "ناوی بەکارھێنەری بنکەدراوە:",
        "config-db-password": "تێپەڕوشەی بنکەدراوە",
        "config-site-name": "ناوی ویکی:",
        "config-ns-generic": "پرۆژە",
+       "config-admin-name": "ناوی بەکارھێنەرییەکەت:",
        "config-admin-password": "تێپەڕوشە:",
+       "config-admin-password-confirm": "دووبارە تێپەڕوشە:",
        "config-admin-email": "ناونیشانی ئیمەیل:",
+       "config-profile-wiki": "ویکیی کراوە",
+       "config-profile-no-anon": "دروستکردنی ھەژمارە پێویستە",
+       "config-profile-fishbowl": "تەنھا دەستکاریکەری ڕێگەپێدراوە",
+       "config-license-pd": "پاوانی گشتی",
+       "config-email-settings": "ڕێکخستنەکانی ئیمەیڵ",
        "config-install-step-done": "کرا",
        "config-help": "یارمەتی",
        "mainpagetext": "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
index ec6526b..fd406a7 100644 (file)
@@ -2,9 +2,97 @@
        "@metadata": {
                "authors": [
                        "Korrawit",
-                       "Horus"
+                       "Horus",
+                       "Octahedron80"
                ]
        },
+       "config-desc": "ตัวติดตั้งสำหรับมีเดียวิกิ",
+       "config-title": "การติดตั้งมีเดียวิกิ $1",
+       "config-information": "สารสนเทศ",
+       "config-localsettings-upgrade": "ตรวจพบไฟล์ <code>LocalSettings.php</code>\nเพื่ออัปเกรดการติดตั้งนี้ กรุณากรอกค่าของ <code>$wgUpgradeKey</code> ในกล่องด้านล่าง\nคุณจะพบมันได้ใน <code>LocalSettings.php</code>",
+       "config-localsettings-cli-upgrade": "ตรวจพบไฟล์ <code>LocalSettings.php</code>\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาดำเนินงาน <code>update.php</code> แทน",
+       "config-localsettings-key": "กุญแจอัปเกรด:",
+       "config-localsettings-badkey": "กุญแจที่คุณกรอกไม่ถูกต้อง",
+       "config-upgrade-key-missing": "ตรวจพบการติดตั้งมีเดียวิกิที่มีอยู่แล้ว\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาใส่บรรทัดต่อไปนี้ที่ท้ายไฟล์ <code>LocalSettings.php</code> ของคุณ:\n\n$1",
+       "config-localsettings-incomplete": "<code>LocalSettings.php</code> ที่มีอยู่ดูเหมือนว่าไม่สมบูรณ์\nตัวแปร $1 ไม่ถูกกำหนด\nกรุณาเปลี่ยนแปลง <code>LocalSettings.php</code> เพื่อกำหนดตัวแปรนี้ และคลิก \"{{int:Config-continue}}\"",
+       "config-localsettings-connection-error": "ความผิดพลาดเกิดขึ้นเมื่อเชื่อมต่อฐานข้อมูลโดยใช้การตั้งค่าที่ระบุใน <code>LocalSettings.php</code> กรุณาแก้ไขการตั้งค่าเหล่านี้และลองอีกครั้ง\n\n$1",
+       "config-session-error": "ความผิดพลาดการเริ่มต้นช่วงเวลาสื่อสาร: $1",
+       "config-session-expired": "ช่วงเวลาสื่อสารของคุณดูเหมือนว่าหมดอายุแล้ว\nช่วงเวลาสื่อสารถูกตั้งไว้ให้มีช่วงอายุเป็น $1\nคุณสามารถเพิ่มค่าสิ่งนี้โดยกำหนด <code>session.gc_maxlifetime</code> ใน php.ini\nให้เริ่มกระบวนการติดตั้งอีกครั้ง",
+       "config-no-session": "ข้อมูลช่วงเวลาสื่อสารของคุณสูญหาย!\nให้ตรวจสอบ php.ini ของคุณและแน่ใจว่า <code>session.save_path</code> ถูกกำหนดไปยังไดเรกทอรีที่เหมาะสม",
+       "config-your-language": "ภาษาของคุณ:",
+       "config-your-language-help": "เลือกภาษาที่จะใช้ระหว่างกระบวนการติดตั้ง",
+       "config-wiki-language": "ภาษาวิกิ:",
+       "config-wiki-language-help": "เลือกภาษาที่จะใช้เขียนเป็นหลักในวิกิ",
+       "config-back": "← ย้อนกลับ",
+       "config-continue": "ดำเนินการต่อ →",
+       "config-page-language": "ภาษา",
+       "config-page-welcome": "ยินดีต้อนรับสู่มีเดียวิกิ!",
+       "config-page-dbconnect": "เชื่อมต่อไปยังฐานข้อมูล",
+       "config-page-upgrade": "อัปเกรดการติดตั้งที่มีอยู่",
+       "config-page-dbsettings": "การตั้งค่าฐานข้อมูล",
+       "config-page-name": "ชื่อ",
+       "config-page-options": "ตัวเลือก",
+       "config-page-install": "ติดตั้ง",
+       "config-page-complete": "สมบูรณ์!",
+       "config-page-restart": "เริ่มการติดตั้งอีกครั้ง",
+       "config-page-readme": "อ่านเอกสารกำกับ",
+       "config-page-releasenotes": "บันทึกการเผยแพร่",
+       "config-page-copying": "การคัดลอก",
+       "config-page-upgradedoc": "การอัปเกรด",
+       "config-page-existingwiki": "วิกิที่มีอยู่",
+       "config-help-restart": "คุณต้องการล้างข้อมูลทั้งหมดที่คุณกรอกและเริ่มกระบวนการติดตั้งอีกครั้งหรือไม่?",
+       "config-restart": "ใช่ เริ่มใหม่อีกครั้ง",
+       "config-welcome": "=== การตรวจสอบสภาพแวดล้อม ===\nการตรวจสอบเบื้องต้นจะกระทำขึ้นเพื่อดูว่าสภาพแวดล้อมนี้เหมาะสมสำหรับการติดตั้งมีเดียวิกิหรือไม่\nจำไว้ว่าให้รวบรวมสารสนเทศนี้ ถ้าคุณแสวงหาการสนับสนุนเพื่อที่จะติดตั้งให้สมบูรณ์",
+       "config-sidebar": "* [//www.mediawiki.org โฮมเพจมีเดียวิกิ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents แนวปฏิบัติของผู้ใช้]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents แนวปฏิบัติของผู้ดูแลระบบ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ คำถามที่ถามบ่อย]\n----\n* <doclink href=Readme>อ่านเอกสารกำกับ</doclink>\n* <doclink href=ReleaseNotes>บันทึกการเผยแพร่</doclink>\n* <doclink href=Copying>การคัดลอก</doclink>\n* <doclink href=UpgradeDoc>การอัปเกรด</doclink>",
+       "config-env-good": "สภาพแวดล้อมถูกตรวจสอบแล้ว\nคุณสามารถติดตั้งมีเดียวิกิ",
+       "config-env-bad": "สภาพแวดล้อมถูกตรวจสอบแล้ว\nคุณไม่สามารถติดตั้งมีเดียวิกิ",
+       "config-env-php": "PHP $1 ติดตั้งแล้ว",
+       "config-env-hhvm": "HHVM $1 ติดตั้งแล้ว",
+       "config-memory-raised": "<code>memory_limit</code> ของ PHP คือ $1 ได้เพิ่มเป็น $2",
+       "config-memory-bad": "<strong>คำเตือน:</strong> <code>memory_limit</code> ของ PHP คือ $1.\nเป็นไปได้ว่ามันอาจต่ำเกินไป\nการติดตั้งอาจล้มเหลวได้!",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] ติดตั้งแล้ว",
+       "config-apc": "[http://www.php.net/apc APC] ติดตั้งแล้ว",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ติดตั้งแล้ว",
+       "config-no-cache": "<strong>คำเตือน:</strong> ไม่พบ [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] หรือ [http://www.iis.net/download/WinCacheForPhp WinCache]\nการแคชอ็อบเจกต์จะไม่ถูกเปิดใช้งาน",
+       "config-mod-security": "<strong>คำเตือน:</strong> เว็บเซิร์ฟเวอร์ของคุณมี [http://modsecurity.org/ mod_security]/mod_security2 เปิดใช้งานอยู่ การตั้งค่าทั่วไปหลายอย่างของสิ่งนี้จะก่อให้เกิดปัญหาสำหรับมีเดียวิกิ และซอฟต์แวร์อื่นที่อนุญาตให้ผู้ใช้สามารถโพสต์เนื้อหาได้ตามใจ\nหากเป็นไปได้ สิ่งนี้ควรปิดใช้งาน หรือมิฉะนั้นก็ อ้างไปยัง[http://modsecurity.org/documentation/ เอกสารกำกับการใช้งาน mod_security] หรือติดต่อการสนับสนุนจากโฮสต์ของคุณ ถ้าคุณพบความผิดพลาดโดยสุ่ม",
+       "config-diff3-bad": "ไม่พบ GNU diff3",
+       "config-git": "พบซอฟต์แวร์ควบคุมรุ่น Git: <code>$1</code>",
+       "config-git-bad": "ไม่พบซอฟต์แวร์ควบคุมรุ่น Git",
+       "config-imagemagick": "พบ ImageMagick: <code>$1</code>\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
+       "config-gd": "พบไลบรารีกราฟิก GD ภายใน\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
+       "config-no-scaling": "ไม่พบไลบรารี GD หรือ ImageMagick\nการย่อรูปภาพจะถูกปิดใช้งาน",
+       "config-using-server": "ใช้ชื่อเซิร์ฟเวอร์ \"<nowiki>$1</nowiki>\"",
+       "config-using-uri": "ใช้ยูอาร์แอลของเซิร์ฟเวอร์ \"<nowiki>$1$2</nowiki>\"",
+       "config-mysql-innodb": "อินโนดีบี",
+       "config-mysql-myisam": "มายไอแซม",
+       "config-mysql-binary": "ไบนารี",
+       "config-mysql-utf8": "ยูทีเอฟ-8",
+       "config-site-name": "ชื่อของวิกิ:",
+       "config-ns-generic": "โครงการ",
+       "config-ns-other-default": "วิกิของฉัน",
+       "config-admin-box": "บัญชีผู้ดูแลระบบ",
+       "config-admin-name": "ชื่อผู้ใช้ของคุณ:",
+       "config-admin-password": "รหัสผ่าน:",
+       "config-admin-password-confirm": "รหัสผ่านอีกครั้ง:",
+       "config-admin-email": "ที่อยู่อีเมล:",
+       "config-license-pd": "สาธารณสมบัติ",
+       "config-extensions": "ส่วนขยาย",
+       "config-install-step-done": "เสร็จสิ้น",
+       "config-install-step-failed": "ล้มเหลว",
+       "config-install-user": "สร้างผู้ใช้ของฐานข้อมูล",
+       "config-install-user-alreadyexists": "ผู้ใช้ \"$1\" มีอยู่แล้ว",
+       "config-install-user-create-failed": "การสร้างผู้ใช้ \"$1\" ล้มเหลว: $2",
+       "config-install-user-grant-failed": "การกำหนดสิทธิผู้ใช้ \"$1\" ล้มเหลว: $2",
+       "config-install-user-missing": "ผู้ใช้ \"$1\" ที่ระบุไม่มีอยู่",
+       "config-install-user-missing-create": "ผู้ใช้ \"$1\" ที่ระบุไม่มีอยู่\nกรุณาคลิกกล่อง \"สร้างบัญชี\" ด้านล่างถ้าคุณต้องการสร้างขึ้น",
+       "config-install-tables": "สร้างตาราง",
+       "config-install-tables-exist": "<strong>คำเตือน:</strong> ตารางมีเดียวิกิดูเหมือนว่ามีอยู่แล้ว\nข้ามการสร้างไป",
+       "config-install-tables-failed": "<strong>ความผิดพลาด:</strong> การสร้างตารางล้มเหลวด้วยความผิดพลาดต่อไปนี้: $1",
+       "config-install-interwiki-list": "ไม่สามารถอ่านไฟล์ <code>interwiki.list</code>",
+       "config-install-sysop": "สร้างบัญชีผู้ใช้ที่เป็นผู้ดูแลระบบ",
+       "config-download-localsettings": "ดาวน์โหลด <code>LocalSettings.php</code>",
+       "config-help-tooltip": "คลิกเพื่อขยาย",
+       "config-nofile": "ไม่พบไฟล์ \"$1\" มันอาจถูกลบไปแล้วหรือไม่?",
        "mainpagetext": "<strong>ติดตั้งมีเดียวิกิสำเร็จ</strong>",
        "mainpagedocfooter": "ศึกษา[//meta.wikimedia.org/wiki/Help:Contents คู่มือการใช้งาน] สำหรับเริ่มต้นใช้งานซอฟต์แวร์วิกิ\n\n== เริ่มต้น ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings รายการการปรับแต่งระบบ] (ภาษาอังกฤษ)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ คำถามที่ถามบ่อยในมีเดียวิกิ] (ภาษาอังกฤษ)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]"
 }
diff --git a/includes/libs/MapCacheLRU.php b/includes/libs/MapCacheLRU.php
new file mode 100644 (file)
index 0000000..2a7ee2a
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Per-process memory cache for storing items.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * Handles a simple LRU key/value map with a maximum number of entries
+ *
+ * Use ProcessCacheLRU if hierarchical purging is needed or objects can become stale
+ *
+ * @see ProcessCacheLRU
+ * @ingroup Cache
+ * @since 1.23
+ */
+class MapCacheLRU {
+       /** @var array */
+       protected $cache = array(); // (key => value)
+
+       protected $maxCacheKeys; // integer; max entries
+
+       /**
+        * @param int $maxKeys Maximum number of entries allowed (min 1).
+        * @throws Exception When $maxCacheKeys is not an int or =< 0.
+        */
+       public function __construct( $maxKeys ) {
+               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
+                       throw new Exception( __METHOD__ . " must be given an integer and >= 1" );
+               }
+               $this->maxCacheKeys = $maxKeys;
+       }
+
+       /**
+        * Set a key/value pair.
+        * This will prune the cache if it gets too large based on LRU.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param string $key
+        * @param mixed $value
+        * @return void
+        */
+       public function set( $key, $value ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $this->ping( $key ); // push to top
+               } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
+                       reset( $this->cache );
+                       $evictKey = key( $this->cache );
+                       unset( $this->cache[$evictKey] );
+               }
+               $this->cache[$key] = $value;
+       }
+
+       /**
+        * Check if a key exists
+        *
+        * @param string $key
+        * @return bool
+        */
+       public function has( $key ) {
+               return array_key_exists( $key, $this->cache );
+       }
+
+       /**
+        * Get the value for a key.
+        * This returns null if the key is not set.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param string $key
+        * @return mixed
+        */
+       public function get( $key ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $this->ping( $key ); // push to top
+                       return $this->cache[$key];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Clear one or several cache entries, or all cache entries
+        *
+        * @param string|array $keys
+        * @return void
+        */
+       public function clear( $keys = null ) {
+               if ( $keys === null ) {
+                       $this->cache = array();
+               } else {
+                       foreach ( (array)$keys as $key ) {
+                               unset( $this->cache[$key] );
+                       }
+               }
+       }
+
+       /**
+        * Push an entry to the top of the cache
+        *
+        * @param string $key
+        */
+       protected function ping( $key ) {
+               $item = $this->cache[$key];
+               unset( $this->cache[$key] );
+               $this->cache[$key] = $item;
+       }
+}
index ee696c3..73e76f7 100644 (file)
@@ -47,7 +47,8 @@ class ObjectFactory {
         * expanded by invoking them with no arguments before passing the
         * resulting value on to the constructor/callable. This can be used to
         * pass DatabaseBase instances or other live objects to the
-        * constructor/callable.
+        * constructor/callable. This behavior can be suppressed by adding
+        * closure_expansion => false to the specification.
         *
         * @param array $spec Object specification
         * @return object
@@ -59,14 +60,18 @@ class ObjectFactory {
        public static function getObjectFromSpec( $spec ) {
                $args = isset( $spec['args'] ) ? $spec['args'] : array();
 
-               $args = array_map( function ( $value ) {
-                       if ( is_object( $value ) && $value instanceof Closure ) {
-                               // If an argument is a Closure, call it.
-                               return $value();
-                       } else {
-                               return $value;
-                       }
-               }, $args );
+               if ( !isset( $spec['closure_expansion'] ) ||
+                       $spec['closure_expansion'] === true
+               ) {
+                       $args = array_map( function ( $value ) {
+                               if ( is_object( $value ) && $value instanceof Closure ) {
+                                       // If an argument is a Closure, call it.
+                                       return $value();
+                               } else {
+                                       return $value;
+                               }
+                       }, $args );
+               }
 
                if ( isset( $spec['class'] ) ) {
                        $clazz = $spec['class'];
index dda5254..f09d101 100644 (file)
@@ -126,7 +126,7 @@ class RunningStat implements Countable {
        }
 
        /**
-        * Get the estimated stanard deviation.
+        * Get the estimated standard deviation.
         *
         * The standard deviation of a statistical population is the square root of
         * its variance. It shows shows how much variation from the mean exists. In
diff --git a/includes/libs/Xhprof.php b/includes/libs/Xhprof.php
new file mode 100644 (file)
index 0000000..1ad01cc
--- /dev/null
@@ -0,0 +1,443 @@
+<?php
+/**
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Convenience class for working with XHProf
+ * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
+ * package for use with PHP5 (Zend PHP) and is built-in to HHVM 3.3.0.
+ *
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @since 1.25
+ */
+class Xhprof {
+
+       /**
+        * @var array $config
+        */
+       protected $config;
+
+       /**
+        * Hierarchical profiling data returned by xhprof.
+        * @var array $hieraData
+        */
+       protected $hieraData;
+
+       /**
+        * Per-function inclusive data.
+        * @var array $inclusive
+        */
+       protected $inclusive;
+
+       /**
+        * Per-function inclusive and exclusive data.
+        * @var array $complete
+        */
+       protected $complete;
+
+       /**
+        * Configuration data can contain:
+        * - flags:   Optional flags to add additional information to the
+        *            profiling data collected.
+        *            (XHPROF_FLAGS_NO_BUILTINS, XHPROF_FLAGS_CPU,
+        *            XHPROF_FLAGS_MEMORY)
+        * - exclude: Array of function names to exclude from profiling.
+        * - include: Array of function names to include in profiling.
+        * - sort:    Key to sort per-function reports on.
+        *
+        * Note: When running under HHVM, xhprof will always behave as though the
+        * XHPROF_FLAGS_NO_BUILTINS flag has been used unless the
+        * Eval.JitEnableRenameFunction option is enabled for the HHVM process.
+        *
+        * @param array $config
+        */
+       public function __construct( array $config = array() ) {
+               $this->config = array_merge(
+                       array(
+                               'flags' => 0,
+                               'exclude' => array(),
+                               'include' => null,
+                               'sort' => 'wt',
+                       ),
+                       $config
+               );
+
+               xhprof_enable( $this->config['flags'], array(
+                       'ignored_functions' => $this->config['exclude']
+               ) );
+       }
+
+       /**
+        * Stop collecting profiling data.
+        *
+        * Only the first invocation of this method will effect the internal
+        * object state. Subsequent calls will return the data collected by the
+        * initial call.
+        *
+        * @return array Collected profiling data (possibly cached)
+        */
+       public function stop() {
+               if ( $this->hieraData === null ) {
+                       $this->hieraData = $this->pruneData( xhprof_disable() );
+               }
+               return $this->hieraData;
+       }
+
+       /**
+        * Load raw data from a prior run for analysis.
+        * Stops any existing data collection and clears internal caches.
+        *
+        * Any 'include' filters configured for this Xhprof instance will be
+        * enforced on the data as it is loaded. 'exclude' filters will however
+        * not be enforced as they are an XHProf intrinsic behavior.
+        *
+        * @param array $data
+        * @see getRawData()
+        */
+       public function loadRawData( array $data ) {
+               $this->stop();
+               $this->inclusive = null;
+               $this->complete = null;
+               $this->hieraData = $this->pruneData( $data );
+       }
+
+       /**
+        * Get raw data collected by xhprof.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * Each key in the returned array is an edge label for the call graph in
+        * the form "caller==>callee". There is once special case edge labled
+        * simply "main()" which represents the global scope entry point of the
+        * application.
+        *
+        * XHProf will collect different data depending on the flags that are used:
+        * - ct:    Number of matching events seen.
+        * - wt:    Inclusive elapsed wall time for this event in microseconds.
+        * - cpu:   Inclusive elapsed cpu time for this event in microseconds.
+        *          (XHPROF_FLAGS_CPU)
+        * - mu:    Delta of memory usage from start to end of callee in bytes.
+        *          (XHPROF_FLAGS_MEMORY)
+        * - pmu:   Delta of peak memory usage from start to end of callee in
+        *          bytes. (XHPROF_FLAGS_MEMORY)
+        * - alloc: Delta of amount memory requested from malloc() by the callee,
+        *          in bytes. (XHPROF_FLAGS_MALLOC)
+        * - free:  Delta of amount of memory passed to free() by the callee, in
+        *          bytes. (XHPROF_FLAGS_MALLOC)
+        *
+        * @return array
+        * @see stop()
+        * @see getInclusiveMetrics()
+        * @see getCompleteMetrics()
+        */
+       public function getRawData() {
+               return $this->stop();
+       }
+
+       /**
+        * Convert an xhprof data key into an array of ['parent', 'child']
+        * function names.
+        *
+        * The resulting array is left padded with nulls, so a key
+        * with no parent (eg 'main()') will return [null, 'function'].
+        *
+        * @return array
+        */
+       public static function splitKey( $key ) {
+               return array_pad( explode( '==>', $key, 2 ), -2, null );
+       }
+
+       /**
+        * Remove data for functions that are not included in the 'include'
+        * configuration array.
+        *
+        * @param array $data Raw xhprof data
+        * @return array
+        */
+       protected function pruneData( $data ) {
+               if ( !$this->config['include'] ) {
+                       return $data;
+               }
+
+               $want = array_fill_keys( $this->config['include'], true );
+               $want['main()'] = true;
+
+               $keep = array();
+               foreach ( $data as $key => $stats ) {
+                       list( $parent, $child ) = self::splitKey( $key );
+                       if ( isset( $want[$parent] ) || isset( $want[$child] ) ) {
+                               $keep[$key] = $stats;
+                       }
+               }
+               return $keep;
+       }
+
+       /**
+        * Get the inclusive metrics for each function call. Inclusive metrics
+        * for given function include the metrics for all functions that were
+        * called from that function during the measurement period.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * See getRawData() for a description of the metric that are returned for
+        * each funcition call. The values for the wt, cpu, mu and pmu metrics are
+        * arrays with these values:
+        * - total: Cumulative value
+        * - min: Minimum value
+        * - mean: Mean (average) value
+        * - max: Maximum value
+        * - variance: Variance (spread) of the values
+        *
+        * @return array
+        * @see getRawData()
+        * @see getCompleteMetrics()
+        */
+       public function getInclusiveMetrics() {
+               if ( $this->inclusive === null ) {
+                       // Make sure we have data to work with
+                       $this->stop();
+
+                       $main = $this->hieraData['main()'];
+                       $hasCpu = isset( $main['cpu'] );
+                       $hasMu = isset( $main['mu'] );
+                       $hasAlloc = isset( $main['alloc'] );
+
+                       $this->inclusive = array();
+                       foreach ( $this->hieraData as $key => $stats ) {
+                               list( $parent, $child ) = self::splitKey( $key );
+                               if ( !isset( $this->inclusive[$child] ) ) {
+                                       $this->inclusive[$child] = array(
+                                               'ct' => 0,
+                                               'wt' => new RunningStat(),
+                                       );
+                                       if ( $hasCpu ) {
+                                               $this->inclusive[$child]['cpu'] = new RunningStat();
+                                       }
+                                       if ( $hasMu ) {
+                                               $this->inclusive[$child]['mu'] = new RunningStat();
+                                               $this->inclusive[$child]['pmu'] = new RunningStat();
+                                       }
+                                       if ( $hasAlloc ) {
+                                               $this->inclusive[$child]['alloc'] = new RunningStat();
+                                               $this->inclusive[$child]['free'] = new RunningStat();
+                                       }
+                               }
+
+                               $this->inclusive[$child]['ct'] += $stats['ct'];
+                               foreach ( $stats as $stat => $value ) {
+                                       if ( $stat === 'ct' ) {
+                                               continue;
+                                       }
+
+                                       if ( !isset( $this->inclusive[$child][$stat] ) ) {
+                                               // Ignore unknown stats
+                                               continue;
+                                       }
+
+                                       for ( $i = 0; $i < $stats['ct']; $i++ ) {
+                                               $this->inclusive[$child][$stat]->push(
+                                                       $value / $stats['ct']
+                                               );
+                                       }
+                               }
+                       }
+
+                       // Convert RunningStat instances to static arrays and add
+                       // percentage stats.
+                       foreach ( $this->inclusive as $func => $stats ) {
+                               foreach ( $stats as $name => $value ) {
+                                       if ( $value instanceof RunningStat ) {
+                                               $total = $value->m1 * $value->n;
+                                               $this->inclusive[$func][$name] = array(
+                                                       'total' => $total,
+                                                       'min' => $value->min,
+                                                       'mean' => $value->m1,
+                                                       'max' => $value->max,
+                                                       'variance' => $value->m2,
+                                                       'percent' => 100 * $total / $main[$name],
+                                               );
+                                       }
+                               }
+                       }
+
+                       uasort( $this->inclusive, self::makeSortFunction(
+                               $this->config['sort'], 'total'
+                       ) );
+               }
+               return $this->inclusive;
+       }
+
+       /**
+        * Get the inclusive and exclusive metrics for each function call.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * In addition to the normal data contained in the inclusive metrics, the
+        * metrics have an additional 'exclusive' measurement which is the total
+        * minus the totals of all child function calls.
+        *
+        * @return array
+        * @see getRawData()
+        * @see getInclusiveMetrics()
+        */
+       public function getCompleteMetrics() {
+               if ( $this->complete === null ) {
+                       // Start with inclusive data
+                       $this->complete = $this->getInclusiveMetrics();
+
+                       foreach ( $this->complete as $func => $stats ) {
+                               foreach ( $stats as $stat => $value ) {
+                                       if ( $stat === 'ct' ) {
+                                               continue;
+                                       }
+                                       // Initialize exclusive data with inclusive totals
+                                       $this->complete[$func][$stat]['exclusive'] = $value['total'];
+                               }
+                               // Add sapce for call tree information to be filled in later
+                               $this->complete[$func]['calls'] = array();
+                               $this->complete[$func]['subcalls'] = array();
+                       }
+
+                       foreach( $this->hieraData as $key => $stats ) {
+                               list( $parent, $child ) = self::splitKey( $key );
+                               if ( $parent !== null ) {
+                                       // Track call tree information
+                                       $this->complete[$child]['calls'][$parent] = $stats;
+                                       $this->complete[$parent]['subcalls'][$child] = $stats;
+                               }
+
+                               if ( isset( $this->complete[$parent] ) ) {
+                                       // Deduct child inclusive data from exclusive data
+                                       foreach ( $stats as $stat => $value ) {
+                                               if ( $stat === 'ct' ) {
+                                                       continue;
+                                               }
+
+                                               if ( !isset( $this->complete[$parent][$stat] ) ) {
+                                                       // Ignore unknown stats
+                                                       continue;
+                                               }
+
+                                               $this->complete[$parent][$stat]['exclusive'] -= $value;
+                                       }
+                               }
+                       }
+
+                       uasort( $this->complete, self::makeSortFunction(
+                               $this->config['sort'], 'exclusive'
+                       ) );
+               }
+               return $this->complete;
+       }
+
+       /**
+        * Get a list of all callers of a given function.
+        *
+        * @param string $function Function name
+        * @return array
+        * @see getEdges()
+        */
+       public function getCallers( $function ) {
+               $edges = $this->getCompleteMetrics();
+               if ( isset( $edges[$function]['calls'] ) ) {
+                       return array_keys( $edges[$function]['calls'] );
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * Get a list of all callees from a given function.
+        *
+        * @param string $function Function name
+        * @return array
+        * @see getEdges()
+        */
+       public function getCallees( $function ) {
+               $edges = $this->getCompleteMetrics();
+               if ( isset( $edges[$function]['subcalls'] ) ) {
+                       return array_keys( $edges[$function]['subcalls'] );
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * Find the critical path for the given metric.
+        *
+        * @param string $metric Metric to find critical path for
+        * @return array
+        */
+       public function getCriticalPath( $metric = 'wt' ) {
+               $this->stop();
+               $func = 'main()';
+               $path = array(
+                       $func => $this->hieraData[$func],
+               );
+               while ( $func ) {
+                       $callees = $this->getCallees( $func );
+                       $maxCallee = null;
+                       $maxCall = null;
+                       foreach ( $callees as $callee ) {
+                               $call = "{$func}==>{$callee}";
+                               if ( $maxCall === null ||
+                                       $this->hieraData[$call][$metric] >
+                                               $this->hieraData[$maxCall][$metric]
+                               ) {
+                                       $maxCallee = $callee;
+                                       $maxCall = $call;
+                               }
+                       }
+                       if ( $maxCall !== null ) {
+                               $path[$maxCall] = $this->hieraData[$maxCall];
+                       }
+                       $func = $maxCallee;
+               }
+               return $path;
+       }
+
+       /**
+        * Make a closure to use as a sort function. The resulting function will
+        * sort by descending numeric values (largest value first).
+        *
+        * @param string $key Data key to sort on
+        * @param string $sub Sub key to sort array values on
+        * @return Closure
+        */
+       public static function makeSortFunction( $key, $sub ) {
+               return function ( $a, $b ) use ( $key, $sub ) {
+                       if ( isset( $a[$key] ) && isset( $b[$key] ) ) {
+                               // Descending sort: larger values will be first in result.
+                               // Assumes all values are numeric.
+                               // Values for 'main()' will not have sub keys
+                               $valA = is_array( $a[$key] ) ? $a[$key][$sub] : $a[$key];
+                               $valB = is_array( $b[$key] ) ? $b[$key][$sub] : $b[$key];
+                               return $valB - $valA;
+                       } else {
+                               // Sort datum with the key before those without
+                               return isset( $a[$key] ) ? -1 : 1;
+                       }
+               };
+       }
+}
diff --git a/includes/libs/cdb/CdbException.php b/includes/libs/cdb/CdbException.php
new file mode 100644 (file)
index 0000000..6cda529
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Exception for Cdb errors.
+ * This explicitly doesn't subclass MWException to encourage reuse.
+ */
+class CdbException extends Exception {
+}
diff --git a/includes/libs/cdb/CdbFunctions.php b/includes/libs/cdb/CdbFunctions.php
new file mode 100644 (file)
index 0000000..e74924c
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Common functions for readers and writers
+ */
+class CdbFunctions {
+       /**
+        * Take a modulo of a signed integer as if it were an unsigned integer.
+        * $b must be less than 0x40000000 and greater than 0
+        *
+        * @param int $a
+        * @param int $b
+        *
+        * @return int
+        */
+       public static function unsignedMod( $a, $b ) {
+               if ( $a & 0x80000000 ) {
+                       $m = ( $a & 0x7fffffff ) % $b + 2 * ( 0x40000000 % $b );
+
+                       return $m % $b;
+               } else {
+                       return $a % $b;
+               }
+       }
+
+       /**
+        * Shift a signed integer right as if it were unsigned
+        * @param int $a
+        * @param int $b
+        * @return int
+        */
+       public static function unsignedShiftRight( $a, $b ) {
+               if ( $b == 0 ) {
+                       return $a;
+               }
+               if ( $a & 0x80000000 ) {
+                       return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
+               } else {
+                       return $a >> $b;
+               }
+       }
+
+       /**
+        * The CDB hash function.
+        *
+        * @param string $s
+        *
+        * @return int
+        */
+       public static function hash( $s ) {
+               $h = 5381;
+               $len = strlen( $s );
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $h5 = ( $h << 5 ) & 0xffffffff;
+                       // Do a 32-bit sum
+                       // Inlined here for speed
+                       $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
+                       $h =
+                               (
+                                       ( $sum & 0x40000000 ? 1 : 0 )
+                                       + ( $h & 0x80000000 ? 2 : 0 )
+                                       + ( $h & 0x40000000 ? 1 : 0 )
+                                       + ( $h5 & 0x80000000 ? 2 : 0 )
+                                       + ( $h5 & 0x40000000 ? 1 : 0 )
+                               ) << 30
+                               | ( $sum & 0x3fffffff );
+                       $h ^= ord( $s[$i] );
+                       $h &= 0xffffffff;
+               }
+
+               return $h;
+       }
+}
diff --git a/includes/libs/cdb/CdbReader.php b/includes/libs/cdb/CdbReader.php
new file mode 100644 (file)
index 0000000..0ca9b9d
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Native CDB file reader and writer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Read from a CDB file.
+ * Native and pure PHP implementations are provided.
+ * http://cr.yp.to/cdb.html
+ */
+abstract class CdbReader {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
+       /**
+        * Open a file and return a subclass instance
+        *
+        * @param string $fileName
+        *
+        * @return CdbReader
+        */
+       public static function open( $fileName ) {
+               return self::haveExtension() ?
+                       new CdbReaderDBA( $fileName ) :
+                       new CdbReaderPHP( $fileName );
+       }
+
+       /**
+        * Returns true if the native extension is available
+        *
+        * @return bool
+        */
+       public static function haveExtension() {
+               if ( !function_exists( 'dba_handlers' ) ) {
+                       return false;
+               }
+               $handlers = dba_handlers();
+               if ( !in_array( 'cdb', $handlers ) || !in_array( 'cdb_make', $handlers ) ) {
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Create the object and open the file
+        *
+        * @param string $fileName
+        */
+       abstract public function __construct( $fileName );
+
+       /**
+        * Close the file. Optional, you can just let the variable go out of scope.
+        */
+       abstract public function close();
+
+       /**
+        * Get a value with a given key. Only string values are supported.
+        *
+        * @param string $key
+        */
+       abstract public function get( $key );
+}
diff --git a/includes/libs/cdb/CdbReaderDBA.php b/includes/libs/cdb/CdbReaderDBA.php
new file mode 100644 (file)
index 0000000..e0cab73
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * DBA-based CDB reader/writer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Reader class which uses the DBA extension
+ */
+class CdbReaderDBA extends CdbReader {
+       public function __construct( $fileName ) {
+               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file "' . $fileName . '"' );
+               }
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               unset( $this->handle );
+       }
+
+       public function get( $key ) {
+               return dba_fetch( $key, $this->handle );
+       }
+}
diff --git a/includes/libs/cdb/CdbReaderPHP.php b/includes/libs/cdb/CdbReaderPHP.php
new file mode 100644 (file)
index 0000000..e448414
--- /dev/null
@@ -0,0 +1,214 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * CDB reader class
+ */
+class CdbReaderPHP extends CdbReader {
+       /** The filename */
+       protected $fileName;
+
+       /* number of hash slots searched under this key */
+       protected $loop;
+
+       /* initialized if loop is nonzero */
+       protected $khash;
+
+       /* initialized if loop is nonzero */
+       protected $kpos;
+
+       /* initialized if loop is nonzero */
+       protected $hpos;
+
+       /* initialized if loop is nonzero */
+       protected $hslots;
+
+       /* initialized if findNext() returns true */
+       protected $dpos;
+
+       /* initialized if cdb_findnext() returns 1 */
+       protected $dlen;
+
+       /**
+        * @param string $fileName
+        * @throws CdbException
+        */
+       public function __construct( $fileName ) {
+               $this->fileName = $fileName;
+               $this->handle = fopen( $fileName, 'rb' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file "' . $this->fileName . '".' );
+               }
+               $this->findStart();
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       fclose( $this->handle );
+               }
+               unset( $this->handle );
+       }
+
+       /**
+        * @param mixed $key
+        * @return bool|string
+        */
+       public function get( $key ) {
+               // strval is required
+               if ( $this->find( strval( $key ) ) ) {
+                       return $this->read( $this->dlen, $this->dpos );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * @param string $key
+        * @param int $pos
+        * @return bool
+        */
+       protected function match( $key, $pos ) {
+               $buf = $this->read( strlen( $key ), $pos );
+
+               return $buf === $key;
+       }
+
+       protected function findStart() {
+               $this->loop = 0;
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $length
+        * @param int $pos
+        * @return string
+        */
+       protected function read( $length, $pos ) {
+               if ( fseek( $this->handle, $pos ) == -1 ) {
+                       // This can easily happen if the internal pointers are incorrect
+                       throw new CdbException(
+                               'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
+               }
+
+               if ( $length == 0 ) {
+                       return '';
+               }
+
+               $buf = fread( $this->handle, $length );
+               if ( $buf === false || strlen( $buf ) !== $length ) {
+                       throw new CdbException(
+                               'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
+               }
+
+               return $buf;
+       }
+
+       /**
+        * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
+        * @param string $s
+        * @throws CdbException
+        * @return mixed
+        */
+       protected function unpack31( $s ) {
+               $data = unpack( 'V', $s );
+               if ( $data[1] > 0x7fffffff ) {
+                       throw new CdbException(
+                               'Error in CDB file "' . $this->fileName . '", integer too big.' );
+               }
+
+               return $data[1];
+       }
+
+       /**
+        * Unpack a 32-bit signed integer
+        * @param string $s
+        * @return int
+        */
+       protected function unpackSigned( $s ) {
+               $data = unpack( 'va/vb', $s );
+
+               return $data['a'] | ( $data['b'] << 16 );
+       }
+
+       /**
+        * @param string $key
+        * @return bool
+        */
+       protected function findNext( $key ) {
+               if ( !$this->loop ) {
+                       $u = CdbFunctions::hash( $key );
+                       $buf = $this->read( 8, ( $u << 3 ) & 2047 );
+                       $this->hslots = $this->unpack31( substr( $buf, 4 ) );
+                       if ( !$this->hslots ) {
+                               return false;
+                       }
+                       $this->hpos = $this->unpack31( substr( $buf, 0, 4 ) );
+                       $this->khash = $u;
+                       $u = CdbFunctions::unsignedShiftRight( $u, 8 );
+                       $u = CdbFunctions::unsignedMod( $u, $this->hslots );
+                       $u <<= 3;
+                       $this->kpos = $this->hpos + $u;
+               }
+
+               while ( $this->loop < $this->hslots ) {
+                       $buf = $this->read( 8, $this->kpos );
+                       $pos = $this->unpack31( substr( $buf, 4 ) );
+                       if ( !$pos ) {
+                               return false;
+                       }
+                       $this->loop += 1;
+                       $this->kpos += 8;
+                       if ( $this->kpos == $this->hpos + ( $this->hslots << 3 ) ) {
+                               $this->kpos = $this->hpos;
+                       }
+                       $u = $this->unpackSigned( substr( $buf, 0, 4 ) );
+                       if ( $u === $this->khash ) {
+                               $buf = $this->read( 8, $pos );
+                               $keyLen = $this->unpack31( substr( $buf, 0, 4 ) );
+                               if ( $keyLen == strlen( $key ) && $this->match( $key, $pos + 8 ) ) {
+                                       // Found
+                                       $this->dlen = $this->unpack31( substr( $buf, 4 ) );
+                                       $this->dpos = $pos + 8 + $keyLen;
+
+                                       return true;
+                               }
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @param mixed $key
+        * @return bool
+        */
+       protected function find( $key ) {
+               $this->findStart();
+
+               return $this->findNext( $key );
+       }
+}
+
diff --git a/includes/libs/cdb/CdbWriter.php b/includes/libs/cdb/CdbWriter.php
new file mode 100644 (file)
index 0000000..b0a90c3
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Native CDB file reader and writer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Write to a CDB file.
+ * Native and pure PHP implementations are provided.
+ * http://cr.yp.to/cdb.html
+ */
+abstract class CdbWriter {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
+       /**
+        * File we'll be writing to when we're done
+        * @var string
+        */
+       protected $realFileName;
+
+       /**
+        * File we write to temporarily until we're done
+        * @var string
+        */
+       protected $tmpFileName;
+
+       /**
+        * Open a writer and return a subclass instance.
+        * The user must have write access to the directory, for temporary file creation.
+        *
+        * @param string $fileName
+        *
+        * @return CdbWriterDBA|CdbWriterPHP
+        */
+       public static function open( $fileName ) {
+               return CdbReader::haveExtension() ?
+                       new CdbWriterDBA( $fileName ) :
+                       new CdbWriterPHP( $fileName );
+       }
+
+       /**
+        * Create the object and open the file
+        *
+        * @param string $fileName
+        */
+       abstract public function __construct( $fileName );
+
+       /**
+        * Set a key to a given value. The value will be converted to string.
+        * @param string $key
+        * @param string $value
+        */
+       abstract public function set( $key, $value );
+
+       /**
+        * Close the writer object. You should call this function before the object
+        * goes out of scope, to write out the final hashtables.
+        */
+       abstract public function close();
+
+       /**
+        * If the object goes out of scope, close it for sanity
+        */
+       public function __destruct() {
+               if ( isset( $this->handle ) ) {
+                       $this->close();
+               }
+       }
+
+       /**
+        * Are we running on Windows?
+        * @return bool
+        */
+       protected function isWindows() {
+               return substr( php_uname(), 0, 7 ) == 'Windows';
+       }
+}
diff --git a/includes/libs/cdb/CdbWriterDBA.php b/includes/libs/cdb/CdbWriterDBA.php
new file mode 100644 (file)
index 0000000..1de371d
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * DBA-based CDB reader/writer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Writer class which uses the DBA extension
+ */
+class CdbWriterDBA extends CdbWriter {
+       public function __construct( $fileName ) {
+               $this->realFileName = $fileName;
+               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
+               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file for write "' . $fileName . '"' );
+               }
+       }
+
+       public function set( $key, $value ) {
+               return dba_insert( $key, $value, $this->handle );
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               if ( $this->isWindows() ) {
+                       unlink( $this->realFileName );
+               }
+               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
+                       throw new CdbException( 'Unable to move the new CDB file into place.' );
+               }
+               unset( $this->handle );
+       }
+}
diff --git a/includes/libs/cdb/CdbWriterPHP.php b/includes/libs/cdb/CdbWriterPHP.php
new file mode 100644 (file)
index 0000000..bfc0d87
--- /dev/null
@@ -0,0 +1,234 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * CDB writer class
+ */
+class CdbWriterPHP extends CdbWriter {
+       protected $hplist;
+
+       protected $numentries;
+
+       protected $pos;
+
+       /**
+        * @param string $fileName
+        */
+       public function __construct( $fileName ) {
+               $this->realFileName = $fileName;
+               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
+               $this->handle = fopen( $this->tmpFileName, 'wb' );
+               if ( !$this->handle ) {
+                       $this->throwException(
+                               'Unable to open CDB file "' . $this->tmpFileName . '" for write.' );
+               }
+               $this->hplist = array();
+               $this->numentries = 0;
+               $this->pos = 2048; // leaving space for the pointer array, 256 * 8
+               if ( fseek( $this->handle, $this->pos ) == -1 ) {
+                       $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' );
+               }
+       }
+
+       /**
+        * @param string $key
+        * @param string $value
+        */
+       public function set( $key, $value ) {
+               if ( strval( $key ) === '' ) {
+                       // DBA cross-check hack
+                       return;
+               }
+               $this->addbegin( strlen( $key ), strlen( $value ) );
+               $this->write( $key );
+               $this->write( $value );
+               $this->addend( strlen( $key ), strlen( $value ), CdbFunctions::hash( $key ) );
+       }
+
+       /**
+        * @throws CdbException
+        */
+       public function close() {
+               $this->finish();
+               if ( isset( $this->handle ) ) {
+                       fclose( $this->handle );
+               }
+               if ( $this->isWindows() && file_exists( $this->realFileName ) ) {
+                       unlink( $this->realFileName );
+               }
+               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
+                       $this->throwException( 'Unable to move the new CDB file into place.' );
+               }
+               unset( $this->handle );
+       }
+
+       /**
+        * @throws CdbException
+        * @param string $buf
+        */
+       protected function write( $buf ) {
+               $len = fwrite( $this->handle, $buf );
+               if ( $len !== strlen( $buf ) ) {
+                       $this->throwException( 'Error writing to CDB file "' . $this->tmpFileName . '".' );
+               }
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $len
+        */
+       protected function posplus( $len ) {
+               $newpos = $this->pos + $len;
+               if ( $newpos > 0x7fffffff ) {
+                       $this->throwException(
+                               'A value in the CDB file "' . $this->tmpFileName . '" is too large.' );
+               }
+               $this->pos = $newpos;
+       }
+
+       /**
+        * @param int $keylen
+        * @param int $datalen
+        * @param int $h
+        */
+       protected function addend( $keylen, $datalen, $h ) {
+               $this->hplist[] = array(
+                       'h' => $h,
+                       'p' => $this->pos
+               );
+
+               $this->numentries++;
+               $this->posplus( 8 );
+               $this->posplus( $keylen );
+               $this->posplus( $datalen );
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $keylen
+        * @param int $datalen
+        */
+       protected function addbegin( $keylen, $datalen ) {
+               if ( $keylen > 0x7fffffff ) {
+                       $this->throwException( 'Key length too long in file "' . $this->tmpFileName . '".' );
+               }
+               if ( $datalen > 0x7fffffff ) {
+                       $this->throwException( 'Data length too long in file "' . $this->tmpFileName . '".' );
+               }
+               $buf = pack( 'VV', $keylen, $datalen );
+               $this->write( $buf );
+       }
+
+       /**
+        * @throws CdbException
+        */
+       protected function finish() {
+               // Hack for DBA cross-check
+               $this->hplist = array_reverse( $this->hplist );
+
+               // Calculate the number of items that will be in each hashtable
+               $counts = array_fill( 0, 256, 0 );
+               foreach ( $this->hplist as $item ) {
+                       ++$counts[255 & $item['h']];
+               }
+
+               // Fill in $starts with the *end* indexes
+               $starts = array();
+               $pos = 0;
+               for ( $i = 0; $i < 256; ++$i ) {
+                       $pos += $counts[$i];
+                       $starts[$i] = $pos;
+               }
+
+               // Excessively clever and indulgent code to simultaneously fill $packedTables
+               // with the packed hashtables, and adjust the elements of $starts
+               // to actually point to the starts instead of the ends.
+               $packedTables = array_fill( 0, $this->numentries, false );
+               foreach ( $this->hplist as $item ) {
+                       $packedTables[--$starts[255 & $item['h']]] = $item;
+               }
+
+               $final = '';
+               for ( $i = 0; $i < 256; ++$i ) {
+                       $count = $counts[$i];
+
+                       // The size of the hashtable will be double the item count.
+                       // The rest of the slots will be empty.
+                       $len = $count + $count;
+                       $final .= pack( 'VV', $this->pos, $len );
+
+                       $hashtable = array();
+                       for ( $u = 0; $u < $len; ++$u ) {
+                               $hashtable[$u] = array( 'h' => 0, 'p' => 0 );
+                       }
+
+                       // Fill the hashtable, using the next empty slot if the hashed slot
+                       // is taken.
+                       for ( $u = 0; $u < $count; ++$u ) {
+                               $hp = $packedTables[$starts[$i] + $u];
+                               $where = CdbFunctions::unsignedMod(
+                                       CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
+                               while ( $hashtable[$where]['p'] ) {
+                                       if ( ++$where == $len ) {
+                                               $where = 0;
+                                       }
+                               }
+                               $hashtable[$where] = $hp;
+                       }
+
+                       // Write the hashtable
+                       for ( $u = 0; $u < $len; ++$u ) {
+                               $buf = pack( 'vvV',
+                                       $hashtable[$u]['h'] & 0xffff,
+                                       CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
+                                       $hashtable[$u]['p'] );
+                               $this->write( $buf );
+                               $this->posplus( 8 );
+                       }
+               }
+
+               // Write the pointer array at the start of the file
+               rewind( $this->handle );
+               if ( ftell( $this->handle ) != 0 ) {
+                       $this->throwException( 'Error rewinding to start of file "' . $this->tmpFileName . '".' );
+               }
+               $this->write( $final );
+       }
+
+       /**
+        * Clean up the temp file and throw an exception
+        *
+        * @param string $msg
+        * @throws CdbException
+        */
+       protected function throwException( $msg ) {
+               if ( $this->handle ) {
+                       fclose( $this->handle );
+                       unlink( $this->tmpFileName );
+               }
+               throw new CdbException( $msg );
+       }
+}
index bc9e917..d9327fb 100644 (file)
@@ -348,9 +348,9 @@ class ThumbnailImage extends MediaTransformOutput {
                        throw new MWException( __METHOD__ . ' called in the old style' );
                }
 
-               $alt = empty( $options['alt'] ) ? '' : $options['alt'];
+               $alt = isset( $options['alt'] ) ? $options['alt'] : '';
 
-               $query = empty( $options['desc-query'] ) ? '' : $options['desc-query'];
+               $query = isset( $options['desc-query'] ) ? $options['desc-query'] : '';
 
                if ( !empty( $options['custom-url-link'] ) ) {
                        $linkAttribs = array( 'href' => $options['custom-url-link'] );
index 7794fae..6c15993 100644 (file)
@@ -267,17 +267,15 @@ class LinkHolderArray {
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
         * @param string $text
-        * @return array Array of link CSS classes, indexed by PDBK.
         */
        public function replace( &$text ) {
                wfProfileIn( __METHOD__ );
 
-               /** @todo FIXME: replaceInternal doesn't return a value */
-               $colours = $this->replaceInternal( $text );
+               $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
 
                wfProfileOut( __METHOD__ );
-               return $colours;
+
        }
 
        /**
index e6486ff..d310836 100644 (file)
  *
  * - Parser::parse()
  *     produces HTML output
- * - Parser::preSaveTransform().
- *     produces altered wiki markup.
+ * - Parser::preSaveTransform()
+ *     produces altered wiki markup
  * - Parser::preprocess()
  *     removes HTML comments and expands templates
  * - Parser::cleanSig() and Parser::cleanSigInSig()
- *     Cleans a signature before saving it to preferences
+ *     cleans a signature before saving it to preferences
  * - Parser::getSection()
- *     Return the content of a section from an article for section editing
+ *     return the content of a section from an article for section editing
  * - Parser::replaceSection()
- *     Replaces a section by number inside an article
+ *     replaces a section by number inside an article
  * - Parser::getPreloadText()
- *     Removes <noinclude> sections, and <includeonly> tags.
+ *     removes <noinclude> sections and <includeonly> tags
  *
  * Globals used:
  *    object: $wgContLang
@@ -224,6 +224,9 @@ class Parser {
         */
        public $mInParse = false;
 
+       /** @var SectionProfiler */
+       protected $mProfiler;
+
        /**
         * @param array $conf
         */
@@ -365,6 +368,8 @@ class Parser {
                        $this->mPreprocessor = null;
                }
 
+               $this->mProfiler = new SectionProfiler();
+
                wfRunHooks( 'ParserClearState', array( &$this ) );
                wfProfileOut( __METHOD__ );
        }
@@ -526,6 +531,19 @@ class Parser {
                        $limitReport = str_replace( array( '-', '&' ), array( '‐', '&amp;' ), $limitReport );
                        $text .= "\n<!-- \n$limitReport-->\n";
 
+                       // Add on template profiling data
+                       $dataByFunc = $this->mProfiler->getFunctionStats();
+                       uasort( $dataByFunc, function( $a, $b ) {
+                               return $a['elapsed'] < $b['elapsed']; // descending order
+                       } );
+                       $profileReport = "Top template expansion time report (%,ms,calls,template)\n";
+                       foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
+                               $profileReport .= sprintf( "%6.2f%% %3.6f %6d - %s\n",
+                                       $item['percent'], $item['elapsed'], $item['calls'],
+                                       htmlspecialchars($item['name'] ) );
+                       }
+                       $text .= "\n<!-- \n$profileReport-->\n";
+
                        if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
                                wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
                                        $this->mTitle->getPrefixedDBkey() );
@@ -3473,7 +3491,7 @@ class Parser {
                $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
                wfProfileOut( __METHOD__ . '-setup' );
 
-               $titleProfileIn = null; // profile templates
+               $profileSection = null; // profile templates
 
                # SUBST
                wfProfileIn( __METHOD__ . '-modifiers' );
@@ -3594,11 +3612,7 @@ class Parser {
 
                # Load from database
                if ( !$found && $title ) {
-                       if ( !Profiler::instance()->isPersistent() ) {
-                               # Too many unique items can kill profiling DBs/collectors
-                               $titleProfileIn = __METHOD__ . "-title-" . $title->getPrefixedDBkey();
-                               wfProfileIn( $titleProfileIn ); // template in
-                       }
+                       $profileSection = $this->mProfiler->scopedProfileIn( $title->getPrefixedDBkey() );
                        wfProfileIn( __METHOD__ . '-loadtpl' );
                        if ( !$title->isExternal() ) {
                                if ( $title->isSpecialPage()
@@ -3680,8 +3694,8 @@ class Parser {
                # Recover the source wikitext and return it
                if ( !$found ) {
                        $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args );
-                       if ( $titleProfileIn ) {
-                               wfProfileOut( $titleProfileIn ); // template out
+                       if ( $profileSection ) {
+                               $this->mProfiler->scopedProfileOut( $profileSection );
                        }
                        wfProfileOut( __METHOD__ );
                        return array( 'object' => $text );
@@ -3707,8 +3721,8 @@ class Parser {
                        $isLocalObj = false;
                }
 
-               if ( $titleProfileIn ) {
-                       wfProfileOut( $titleProfileIn ); // template out
+               if ( $profileSection ) {
+                       $this->mProfiler->scopedProfileOut( $profileSection );
                }
 
                # Replace raw HTML by a placeholder
@@ -4829,7 +4843,7 @@ class Parser {
 
        /**
         * Transform wiki markup when saving a page by doing "\r\n" -> "\n"
-        * conversion, substitting signatures, {{subst:}} templates, etc.
+        * conversion, substituting signatures, {{subst:}} templates, etc.
         *
         * @param string $text The text to transform
         * @param Title $title The Title object for the current article
@@ -5317,11 +5331,9 @@ class Parser {
         *
         * @param string $text
         * @param int $options
-        *
-        * @return array Array of link CSS classes, indexed by PDBK.
         */
        public function replaceLinkHolders( &$text, $options = 0 ) {
-               return $this->mLinkHolders->replace( $text );
+               $this->mLinkHolders->replace( $text );
        }
 
        /**
index 4c12b10..078b66b 100644 (file)
@@ -80,18 +80,6 @@ abstract class Profiler {
         */
        abstract public function isStub();
 
-       /**
-        * Return whether this profiler stores data
-        *
-        * Called by Parser::braceSubstitution. If true, the parser will not
-        * generate per-title profiling sections, to avoid overloading the
-        * profiling data collector.
-        *
-        * @see Profiler::logData()
-        * @return bool
-        */
-       abstract public function isPersistent();
-
        /**
         * @param string $id
         */
@@ -159,6 +147,8 @@ abstract class Profiler {
        abstract public function getOutput();
 
        /**
+        * Get data for the debugging toolbar.
+        *
         * @return array
         */
        abstract public function getRawData();
index 3625db6..911b926 100644 (file)
  * @ingroup Profiler
  */
 class ProfilerSimpleDB extends ProfilerStandard {
-       public function isPersistent() {
-               return true;
-       }
-
        /**
         * Log the whole profiling data into the database.
         */
index 2671376..ad16a18 100644 (file)
  * @ingroup Profiler
  */
 class ProfilerSimpleUDP extends ProfilerStandard {
-       public function isPersistent() {
-               return true;
-       }
-
        public function logData() {
                global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgUDPProfilerFormatString;
 
index 4825f7a..b873806 100644 (file)
@@ -47,11 +47,14 @@ class ProfilerStandard extends Profiler {
 
        /**
         * @param array $params
+        *   - initTotal : set to false to omit -total/-setup entries (which use request start time)
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
 
-               $this->addInitialStack();
+               if ( !isset( $params['initTotal'] ) || $params['initTotal'] ) {
+                       $this->addInitialStack();
+               }
        }
 
        /**
@@ -63,16 +66,6 @@ class ProfilerStandard extends Profiler {
                return false;
        }
 
-       /**
-        * Return whether this profiler stores data
-        *
-        * @see Profiler::logData()
-        * @return bool
-        */
-       public function isPersistent() {
-               return false;
-       }
-
        /**
         * Add the inital item in the stack.
         */
index e81f579..43e2193 100644 (file)
@@ -31,10 +31,6 @@ class ProfilerStub extends Profiler {
                return true;
        }
 
-       public function isPersistent() {
-               return false;
-       }
-
        public function profileIn( $fn ) {
        }
 
diff --git a/includes/profiler/ProfilerXhprof.php b/includes/profiler/ProfilerXhprof.php
new file mode 100644 (file)
index 0000000..1e83e27
--- /dev/null
@@ -0,0 +1,474 @@
+<?php
+/**
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Profiler wrapper for XHProf extension.
+ *
+ * Mimics the output of ProfilerSimpleText, ProfilerSimpleUDP or
+ * ProfilerSimpleTrace but using data collected via the XHProf PHP extension.
+ * This Profiler also produces data compatable with the debugging toolbar.
+ *
+ * To mimic ProfilerSimpleText results:
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['log'] = 'text';
+ * $wgProfiler['visible'] = true;
+ * @endcode
+ *
+ * To mimic ProfilerSimpleUDP results:
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['log'] = 'udpprofile';
+ * @endcode
+ *
+ * Similar to ProfilerSimpleTrace results, report the most expensive path
+ * through the application:
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['log'] = 'critpath';
+ * $wgProfiler['visible'] = true;
+ * @endcode
+ *
+ * Rather than obeying wfProfileIn() and wfProfileOut() calls placed in the
+ * application code, ProfilerXhprof profiles all functions using the XHProf
+ * PHP extenstion. For PHP5 users, this extension can be installed via PECL or
+ * your operating system's package manager. XHProf support is built into HHVM.
+ *
+ * To restrict the functions for which profiling data is collected, you can
+ * use either a whitelist ($wgProfiler['include']) or a blacklist
+ * ($wgProfiler['exclude']) containing an array of function names. The
+ * blacklist funcitonality is built into HHVM and will completely exclude the
+ * named functions from profiling collection. The whitelist is implemented by
+ * Xhprof class and will filter the data collected by XHProf before reporting.
+ * See documentation for the Xhprof class and the XHProf extension for
+ * additional information.
+ *
+ * Data reported to debug toolbar via getRawData() can be restricted by
+ * setting $wgProfiler['toolbarCutoff'] to a minumum cumulative wall clock
+ * percentage. Functions in the call graph which contribute less than this
+ * percentage to the total wall clock time measured will be excluded from the
+ * data sent to debug toolbar. The default cutoff is 0.1 (1/1000th of the
+ * total time measured).
+ *
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @ingroup Profiler
+ * @see Xhprof
+ * @see https://php.net/xhprof
+ * @see https://github.com/facebook/hhvm/blob/master/hphp/doc/profiling.md
+ */
+class ProfilerXhprof extends Profiler {
+
+       /**
+        * @var Xhprof $xhprof
+        */
+       protected $xhprof;
+
+       /**
+        * Type of report to send when logData() is called.
+        * @var string $logType
+        */
+       protected $logType;
+
+       /**
+        * Should profile report sent to in page content be visible?
+        * @var bool $visible
+        */
+       protected $visible;
+
+       /**
+        * Minimum wall time precentage for a fucntion to be reported to the debug
+        * toolbar via getRawData().
+        * @var float $toolbarCutoff
+        */
+       protected $toolbarCutoff;
+
+       /**
+        * @param array $params
+        * @see Xhprof::__construct()
+        */
+       public function __construct( array $params = array() ) {
+               $params = array_merge(
+                       array(
+                               'log' => 'text',
+                               'visible' => false,
+                               'toolbarCutoff' => 0.1,
+                       ),
+                       $params
+               );
+               parent::__construct( $params );
+               $this->logType = $params['log'];
+               $this->visible = $params['visible'];
+               $this->xhprof = new Xhprof( $params );
+       }
+
+       public function isStub() {
+               return false;
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        *
+        * Use the 'include' configuration key instead if you need to constrain
+        * the functions that are profiled.
+        *
+        * @param string $functionname
+        */
+       public function profileIn( $functionname ) {
+               global $wgDebugFunctionEntry;
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( "Entering {$functionname}" );
+               }
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        *
+        * Use the 'include' configuration key instead if you need to constrain
+        * the functions that are profiled.
+        *
+        * @param string $functionname
+        */
+       public function profileOut( $functionname ) {
+               global $wgDebugFunctionEntry;
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( "Exiting {$functionname}" );
+               }
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        */
+       public function close() {
+       }
+
+       /**
+        * Get data for the debugging toolbar.
+        *
+        * @return array
+        * @see https://www.mediawiki.org/wiki/Debugging_toolbar
+        */
+       public function getRawData() {
+               $metrics = $this->xhprof->getCompleteMetrics();
+               $endEpoch = $this->getTime();
+               $profile = array();
+
+               foreach ( $metrics as $fname => $stats ) {
+                       if ( $stats['wt']['percent'] < $this->toolbarCutoff ) {
+                               // Ignore functions which are not significant contributors
+                               // to the total elapsed time.
+                               continue;
+                       }
+
+                       $record = array(
+                               'name' => $fname,
+                               'calls' => $stats['ct'],
+                               'elapsed' => $stats['wt']['total'] / 1000,
+                               'percent' => $stats['wt']['percent'],
+                               'memory' => isset( $stats['mu'] ) ? $stats['mu']['total'] : 0,
+                               'min' => $stats['wt']['min'] / 1000,
+                               'max' => $stats['wt']['max'] / 1000,
+                               'overhead' => array_reduce(
+                                       $stats['subcalls'],
+                                       function( $carry, $item ) {
+                                               return $carry + $item['ct'];
+                                       },
+                                       0
+                               ),
+                               'periods' => array(),
+                       );
+
+                       // We are making up periods based on the call segments we have.
+                       // What we don't have is the start time for each call (which
+                       // actually may be a collection of multiple calls from the
+                       // caller). We will pretend that all the calls happen sequentially
+                       // and finish at the end of the end of the request.
+                       foreach ( $stats['calls'] as $call ) {
+                               $avgElapsed = $call['wt'] / 1000 / $call['ct'];
+                               $avgMem = isset( $call['mu'] ) ? $call['mu'] / $call['ct'] : 0;
+                               $start = $endEpoch - $avgElapsed;
+                               for ( $i = 0; $i < $call['ct']; $i++ ) {
+                                       $callStart = $start + ( $avgElapsed * $i );
+                                       $record['periods'][] = array(
+                                               'start' => $callStart,
+                                               'end' => $callStart + $avgElapsed,
+                                               'memory' => $avgMem,
+                                               'subcalls' => 0,
+                                       );
+                               }
+                       }
+
+                       $profile[] = $record;
+               }
+               return $profile;
+       }
+
+       /**
+        * Log the data to some store or even the page output.
+        */
+       public function logData() {
+               if ( $this->logType === 'text' ) {
+                       $this->logText();
+               } elseif ( $this->logType === 'udpprofile' ) {
+                       $this->logToUdpprofile();
+               } elseif ( $this->logType === 'critpath' ){
+                       $this->logCriticalPath();
+               } else {
+                       wfLogWarning(
+                               "Unknown ProfilerXhprof log type '{$this->logType}'"
+                       );
+               }
+       }
+
+       /**
+        * Write a brief profile report to stdout.
+        */
+       protected function logText() {
+               if ( $this->templated ) {
+                       $ct = $this->getContentType();
+                       if ( $ct === 'text/html' && $this->visible ) {
+                               $prefix = '<pre>';
+                               $suffix = '</pre>';
+                       } elseif ( $ct === 'text/javascript' || $ct === 'text/css' ) {
+                               $prefix = "\n/*";
+                               $suffix = "*/\n";
+                       } else {
+                               $prefix = "<!--";
+                               $suffix = "-->\n";
+                       }
+
+                       print $this->getSummaryReport( $prefix, $suffix );
+               }
+       }
+
+       /**
+        * Send collected information to a udpprofile daemon.
+        *
+        * @see http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile
+        * @see $wgUDPProfilerHost
+        * @see $wgUDPProfilerPort
+        * @see $wgUDPProfilerFormatString
+        */
+       protected function logToUdpprofile() {
+               global $wgUDPProfilerHost, $wgUDPProfilerPort;
+               global $wgUDPProfilerFormatString;
+
+               if ( !function_exists( 'socket_create' ) ) {
+                       return;
+               }
+
+               $metrics = $this->xhprof->getInclusiveMetrics();
+
+               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+               $buffer = '';
+               $bufferSize = 0;
+               foreach ( $metrics as $func => $data ) {
+                       $line = sprintf( $wgUDPProfilerFormatString,
+                               $this->getProfileID(),
+                               $data['ct'],
+                               isset( $data['cpu'] ) ? $data['cpu']['total'] : 0,
+                               isset( $data['cpu'] ) ? $data['cpu']['variance'] : 0,
+                               $data['wt']['total'] / 1000,
+                               $data['wt']['variance'],
+                               $func,
+                               isset( $data['mu'] ) ? $data['mu']['total'] : 0
+                       );
+                       $lineLength = strlen( $line );
+                       if ( $lineLength + $bufferSize > 1400 ) {
+                               // Line would exceed max packet size, send packet before
+                               // appending to buffer.
+                               socket_sendto( $sock, $buffer, $bufferSize, 0,
+                                       $wgUDPProfilerHost, $wgUDPProfilerPort
+                               );
+                               $buffer = '';
+                               $bufferSize = 0;
+                       }
+                       $buffer .= $line;
+                       $bufferSize += $lineLength;
+               }
+               // Send final buffer
+               socket_sendto( $sock, $buffer, $bufferSize, 0x100 /* EOF */,
+                       $wgUDPProfilerHost, $wgUDPProfilerPort
+               );
+       }
+
+       /**
+        * Write a critical path report to stdout.
+        */
+       protected function logCriticalPath() {
+               if ( $this->templated ) {
+                       $ct = $this->getContentType();
+                       if ( $ct === 'text/html' && $this->visible ) {
+                               $prefix = '<pre>Critical path:';
+                               $suffix = '</pre>';
+                       } elseif ( $ct === 'text/javascript' || $ct === 'text/css' ) {
+                               $prefix = "\n/* Critical path:";
+                               $suffix = "*/\n";
+                       } else {
+                               $prefix = "<!-- Critical path:";
+                               $suffix = "-->\n";
+                       }
+
+                       print $this->getCriticalPathReport( $prefix, $suffix );
+               }
+       }
+
+       /**
+        * Get the content type of the current request.
+        * @return string
+        */
+       protected function getContentType() {
+               foreach ( headers_list() as $header ) {
+                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
+                               return $m[1];
+                       }
+               }
+               return 'application/octet-stream';
+       }
+
+       /**
+        * Returns a profiling output to be stored in debug file
+        *
+        * @return string
+        */
+       public function getOutput() {
+               return $this->getFunctionReport();
+       }
+
+       /**
+        * Get a report of profiled functions sorted by inclusive wall clock time
+        * in descending order.
+        *
+        * Each line of the report includes this data:
+        * - Function name
+        * - Number of times function was called
+        * - Total wall clock time spent in function in microseconds
+        * - Minimum wall clock time spent in function in microseconds
+        * - Average wall clock time spent in function in microseconds
+        * - Maximum wall clock time spent in function in microseconds
+        * - Percentage of total wall clock time spent in function
+        * - Total delta of memory usage from start to end of function in bytes
+        *
+        * @return string
+        */
+       protected function getFunctionReport() {
+               $data = $this->xhprof->getInclusiveMetrics();
+               uasort( $data, Xhprof::makeSortFunction( 'wt', 'total' ) );
+
+               $width = 140;
+               $nameWidth = $width - 65;
+               $format = "%-{$nameWidth}s %6d %9d %9d %9d %9d %7.3f%% %9d";
+               $out = array();
+               $out[] = sprintf( "%-{$nameWidth}s %6s %9s %9s %9s %9s %7s %9s",
+                       'Name', 'Calls', 'Total', 'Min', 'Each', 'Max', '%', 'Mem'
+               );
+               foreach ( $data as $func => $stats ) {
+                       $out[] = sprintf( $format,
+                               $func,
+                               $stats['ct'],
+                               $stats['wt']['total'],
+                               $stats['wt']['min'],
+                               $stats['wt']['mean'],
+                               $stats['wt']['max'],
+                               $stats['wt']['percent'],
+                               isset( $stats['mu'] ) ? $stats['mu']['total'] : 0
+                       );
+               }
+               return implode( "\n", $out );
+       }
+
+       /**
+        * Get a brief report of profiled functions sorted by inclusive wall clock
+        * time in descending order.
+        *
+        * Each line of the report includes this data:
+        * - Percentage of total wall clock time spent in function
+        * - Total wall clock time spent in function in seconds
+        * - Number of times function was called
+        * - Function name
+        *
+        * @param string $header Header text to prepend to report
+        * @param string $footer Footer text to append to report
+        * @return string
+        */
+       protected function getSummaryReport( $header = '', $footer = '' ) {
+               $data = $this->xhprof->getInclusiveMetrics();
+               uasort( $data, Xhprof::makeSortFunction( 'wt', 'total' ) );
+
+               $format = '%6.2f%% %3.6f %6d - %s';
+               $out = array( $header );
+               foreach ( $data as $func => $stats ) {
+                       $out[] = sprintf( $format,
+                               $stats['wt']['percent'],
+                               $stats['wt']['total'] / 1e6,
+                               $stats['ct'],
+                               $func
+                       );
+               }
+               $out[] = $footer;
+               return implode( "\n", $out );
+       }
+
+       /**
+        * Get a brief report of the most costly code path by wall clock time.
+        *
+        * Each line of the report includes this data:
+        * - Total wall clock time spent in function in seconds
+        * - Function name
+        *
+        * @param string $header Header text to prepend to report
+        * @param string $footer Footer text to append to report
+        * @return string
+        */
+       protected function getCriticalPathReport( $header = '', $footer = '' ) {
+               $data = $this->xhprof->getCriticalPath();
+
+               $out = array( $header );
+               $out[] = sprintf( "%7s %9s %9s %6s %4s",
+                       'Time%', 'Time', 'Mem', 'Calls', 'Name'
+               );
+
+               $format = '%6.2f%% %9.6f %9d %6d %s%s';
+               $total = null;
+               $nest = 0;
+               foreach ( $data as $key => $stats ) {
+                       list( $parent, $child ) = Xhprof::splitKey( $key );
+                       if ( $total === null ) {
+                               $total = $stats;
+                       }
+                       $out[] = sprintf( $format,
+                               100 * $stats['wt'] / $total['wt'],
+                               $stats['wt'] / 1e6,
+                               isset( $stats['mu'] ) ? $stats['mu'] : 0,
+                               $stats['ct'],
+                               //$nest ? str_repeat( ' ', $nest - 1 ) . '┗ ' : '',
+                               $nest ? str_repeat( ' ', $nest - 1 ) . '└─' : '',
+                               $child
+                       );
+                       $nest++;
+               }
+               $out[] = $footer;
+               return implode( "\n", $out );
+       }
+}
diff --git a/includes/profiler/SectionProfiler.php b/includes/profiler/SectionProfiler.php
new file mode 100644 (file)
index 0000000..a418d30
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Arbitrary section name based PHP profiling.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Profiler
+ * @author Aaron Schulz
+ */
+
+/**
+ * Custom PHP profiler for parser/DB type section names that xhprof/xdebug can't handle
+ *
+ * @TODO: refactor implementation by moving Profiler code to here when non-automatic
+ * profiler support is dropped.
+ *
+ * @since 1.25
+ */
+class SectionProfiler {
+       /** @var ProfilerStandard */
+       protected $profiler;
+
+       public function __construct() {
+               // This does *not* care about PHP request start time
+               $this->profiler = new ProfilerStandard( array( 'initTotal' => false ) );
+       }
+
+       /**
+        * @param string $section
+        * @return ScopedCallback
+        */
+       public function scopedProfileIn( $section ) {
+               $profiler = $this->profiler;
+               $sc = new ScopedCallback( function() use ( $profiler, $section ) {
+                       $profiler->profileOut( $section );
+               } );
+               $profiler->profileIn( $section );
+
+               return $sc;
+       }
+
+       /**
+        * @param ScopedCallback $section
+        */
+       public function scopedProfileOut( ScopedCallback &$section ) {
+               $section = null;
+       }
+
+       /**
+        * Get the raw and collated breakdown data for each method
+        *
+        * The percent time for each time is based on the current "total" time
+        * used is based on all methods so far. This method can therefore be
+        * called several times in between several profiling calls without the
+        * delays in usage of the profiler skewing the results. A "-total" entry
+        * is always included in the results.
+        *
+        * @return array List of method entries arrays, each having:
+        *   - name     : method name
+        *   - calls    : the number of method calls
+        *   - elapsed  : real time ellapsed (ms)
+        *   - percent  : percent real time
+        *   - memory   : memory used (bytes)
+        *   - min      : min real time of all calls (ms)
+        *   - max      : max real time of all calls (ms)
+        */
+       public function getFunctionStats() {
+               $data = $this->profiler->getRawData();
+
+               $memoryTotal = 0;
+               $elapsedTotal = 0;
+               foreach ( $data as $item ) {
+                       $memoryTotal += $item['memory'];
+                       $elapsedTotal += $item['elapsed'];
+               }
+
+               foreach ( $data as &$item ) {
+                       $item['percent'] = $item['elapsed'] / $elapsedTotal * 100;
+               }
+               unset( $item );
+
+               $data[] = array(
+                       'name' => '-total',
+                       'calls' => 1,
+                       'elapsed' => $elapsedTotal,
+                       'percent' => 100,
+                       'memory' => $memoryTotal,
+                       'min' => $elapsedTotal,
+                       'max' => $elapsedTotal
+               );
+
+               return $data;
+       }
+}
index 0d4e623..6c72703 100644 (file)
@@ -488,7 +488,7 @@ class SkinTemplate extends Skin {
                        wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
                }
 
-               // Set the bodytext to another key so that skins can just output it on it's own
+               // Set the bodytext to another key so that skins can just output it on its own
                // and output printfooter and debughtml separately
                $tpl->set( 'bodycontent', $tpl->data['bodytext'] );
 
index b110bda..1531f69 100644 (file)
@@ -414,7 +414,11 @@ class SpecialPageFactory {
                                // @deprecated, officially since 1.18, unofficially since forever
                                wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " .
                                        "define a subclass of SpecialPage instead.", '1.18' );
-                               $page = MWFunction::newObj( $className, $rec );
+                               $page = ObjectFactory::getObjectFromSpec( array(
+                                       'class' => $className,
+                                       'args' => $rec,
+                                       'closure_expansion' => false,
+                               ) );
                        } elseif ( $rec instanceof SpecialPage ) {
                                $page = $rec; //XXX: we should deep clone here
                        } else {
diff --git a/includes/utils/Cdb.php b/includes/utils/Cdb.php
deleted file mode 100644 (file)
index 3ceb620..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-/**
- * Native CDB file reader and writer.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Read from a CDB file.
- * Native and pure PHP implementations are provided.
- * http://cr.yp.to/cdb.html
- */
-abstract class CdbReader {
-       /**
-        * The file handle
-        */
-       protected $handle;
-
-       /**
-        * Open a file and return a subclass instance
-        *
-        * @param string $fileName
-        *
-        * @return CdbReader
-        */
-       public static function open( $fileName ) {
-               return self::haveExtension() ?
-                       new CdbReaderDBA( $fileName ) :
-                       new CdbReaderPHP( $fileName );
-       }
-
-       /**
-        * Returns true if the native extension is available
-        *
-        * @return bool
-        */
-       public static function haveExtension() {
-               if ( !function_exists( 'dba_handlers' ) ) {
-                       return false;
-               }
-               $handlers = dba_handlers();
-               if ( !in_array( 'cdb', $handlers ) || !in_array( 'cdb_make', $handlers ) ) {
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Create the object and open the file
-        *
-        * @param string $fileName
-        */
-       abstract public function __construct( $fileName );
-
-       /**
-        * Close the file. Optional, you can just let the variable go out of scope.
-        */
-       abstract public function close();
-
-       /**
-        * Get a value with a given key. Only string values are supported.
-        *
-        * @param string $key
-        */
-       abstract public function get( $key );
-}
-
-/**
- * Write to a CDB file.
- * Native and pure PHP implementations are provided.
- */
-abstract class CdbWriter {
-       /**
-        * The file handle
-        */
-       protected $handle;
-
-       /**
-        * File we'll be writing to when we're done
-        * @var string
-        */
-       protected $realFileName;
-
-       /**
-        * File we write to temporarily until we're done
-        * @var string
-        */
-       protected $tmpFileName;
-
-       /**
-        * Open a writer and return a subclass instance.
-        * The user must have write access to the directory, for temporary file creation.
-        *
-        * @param string $fileName
-        *
-        * @return CdbWriterDBA|CdbWriterPHP
-        */
-       public static function open( $fileName ) {
-               return CdbReader::haveExtension() ?
-                       new CdbWriterDBA( $fileName ) :
-                       new CdbWriterPHP( $fileName );
-       }
-
-       /**
-        * Create the object and open the file
-        *
-        * @param string $fileName
-        */
-       abstract public function __construct( $fileName );
-
-       /**
-        * Set a key to a given value. The value will be converted to string.
-        * @param string $key
-        * @param string $value
-        */
-       abstract public function set( $key, $value );
-
-       /**
-        * Close the writer object. You should call this function before the object
-        * goes out of scope, to write out the final hashtables.
-        */
-       abstract public function close();
-
-       /**
-        * If the object goes out of scope, close it for sanity
-        */
-       public function __destruct() {
-               if ( isset( $this->handle ) ) {
-                       $this->close();
-               }
-       }
-
-       /**
-        * Are we running on Windows?
-        * @return bool
-        */
-       protected function isWindows() {
-               return substr( php_uname(), 0, 7 ) == 'Windows';
-       }
-}
-
-/**
- * Exception for Cdb errors.
- * This explicitly doesn't subclass MWException to encourage reuse.
- */
-class CdbException extends Exception {
-}
diff --git a/includes/utils/CdbDBA.php b/includes/utils/CdbDBA.php
deleted file mode 100644 (file)
index efcaf21..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * DBA-based CDB reader/writer
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Reader class which uses the DBA extension
- */
-class CdbReaderDBA extends CdbReader {
-       public function __construct( $fileName ) {
-               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file "' . $fileName . '"' );
-               }
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
-               }
-               unset( $this->handle );
-       }
-
-       public function get( $key ) {
-               return dba_fetch( $key, $this->handle );
-       }
-}
-
-/**
- * Writer class which uses the DBA extension
- */
-class CdbWriterDBA extends CdbWriter {
-       public function __construct( $fileName ) {
-               $this->realFileName = $fileName;
-               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
-               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file for write "' . $fileName . '"' );
-               }
-       }
-
-       public function set( $key, $value ) {
-               return dba_insert( $key, $value, $this->handle );
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
-               }
-               if ( $this->isWindows() ) {
-                       unlink( $this->realFileName );
-               }
-               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
-                       throw new CdbException( 'Unable to move the new CDB file into place.' );
-               }
-               unset( $this->handle );
-       }
-}
diff --git a/includes/utils/CdbPHP.php b/includes/utils/CdbPHP.php
deleted file mode 100644 (file)
index 19d747a..0000000
+++ /dev/null
@@ -1,494 +0,0 @@
-<?php
-/**
- * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
- * appears in PHP 5.3. Changes are:
- *    * Error returns replaced with exceptions
- *    * Exception thrown if sizes or offsets are between 2GB and 4GB
- *    * Some variables renamed
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Common functions for readers and writers
- */
-class CdbFunctions {
-       /**
-        * Take a modulo of a signed integer as if it were an unsigned integer.
-        * $b must be less than 0x40000000 and greater than 0
-        *
-        * @param int $a
-        * @param int $b
-        *
-        * @return int
-        */
-       public static function unsignedMod( $a, $b ) {
-               if ( $a & 0x80000000 ) {
-                       $m = ( $a & 0x7fffffff ) % $b + 2 * ( 0x40000000 % $b );
-
-                       return $m % $b;
-               } else {
-                       return $a % $b;
-               }
-       }
-
-       /**
-        * Shift a signed integer right as if it were unsigned
-        * @param int $a
-        * @param int $b
-        * @return int
-        */
-       public static function unsignedShiftRight( $a, $b ) {
-               if ( $b == 0 ) {
-                       return $a;
-               }
-               if ( $a & 0x80000000 ) {
-                       return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
-               } else {
-                       return $a >> $b;
-               }
-       }
-
-       /**
-        * The CDB hash function.
-        *
-        * @param string $s
-        *
-        * @return int
-        */
-       public static function hash( $s ) {
-               $h = 5381;
-               $len = strlen( $s );
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $h5 = ( $h << 5 ) & 0xffffffff;
-                       // Do a 32-bit sum
-                       // Inlined here for speed
-                       $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
-                       $h =
-                               (
-                                       ( $sum & 0x40000000 ? 1 : 0 )
-                                       + ( $h & 0x80000000 ? 2 : 0 )
-                                       + ( $h & 0x40000000 ? 1 : 0 )
-                                       + ( $h5 & 0x80000000 ? 2 : 0 )
-                                       + ( $h5 & 0x40000000 ? 1 : 0 )
-                               ) << 30
-                               | ( $sum & 0x3fffffff );
-                       $h ^= ord( $s[$i] );
-                       $h &= 0xffffffff;
-               }
-
-               return $h;
-       }
-}
-
-/**
- * CDB reader class
- */
-class CdbReaderPHP extends CdbReader {
-       /** The filename */
-       protected $fileName;
-
-       /* number of hash slots searched under this key */
-       protected $loop;
-
-       /* initialized if loop is nonzero */
-       protected $khash;
-
-       /* initialized if loop is nonzero */
-       protected $kpos;
-
-       /* initialized if loop is nonzero */
-       protected $hpos;
-
-       /* initialized if loop is nonzero */
-       protected $hslots;
-
-       /* initialized if findNext() returns true */
-       protected $dpos;
-
-       /* initialized if cdb_findnext() returns 1 */
-       protected $dlen;
-
-       /**
-        * @param string $fileName
-        * @throws CdbException
-        */
-       public function __construct( $fileName ) {
-               $this->fileName = $fileName;
-               $this->handle = fopen( $fileName, 'rb' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file "' . $this->fileName . '".' );
-               }
-               $this->findStart();
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       fclose( $this->handle );
-               }
-               unset( $this->handle );
-       }
-
-       /**
-        * @param mixed $key
-        * @return bool|string
-        */
-       public function get( $key ) {
-               // strval is required
-               if ( $this->find( strval( $key ) ) ) {
-                       return $this->read( $this->dlen, $this->dpos );
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param int $pos
-        * @return bool
-        */
-       protected function match( $key, $pos ) {
-               $buf = $this->read( strlen( $key ), $pos );
-
-               return $buf === $key;
-       }
-
-       protected function findStart() {
-               $this->loop = 0;
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $length
-        * @param int $pos
-        * @return string
-        */
-       protected function read( $length, $pos ) {
-               if ( fseek( $this->handle, $pos ) == -1 ) {
-                       // This can easily happen if the internal pointers are incorrect
-                       throw new CdbException(
-                               'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
-               }
-
-               if ( $length == 0 ) {
-                       return '';
-               }
-
-               $buf = fread( $this->handle, $length );
-               if ( $buf === false || strlen( $buf ) !== $length ) {
-                       throw new CdbException(
-                               'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
-               }
-
-               return $buf;
-       }
-
-       /**
-        * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
-        * @param string $s
-        * @throws CdbException
-        * @return mixed
-        */
-       protected function unpack31( $s ) {
-               $data = unpack( 'V', $s );
-               if ( $data[1] > 0x7fffffff ) {
-                       throw new CdbException(
-                               'Error in CDB file "' . $this->fileName . '", integer too big.' );
-               }
-
-               return $data[1];
-       }
-
-       /**
-        * Unpack a 32-bit signed integer
-        * @param string $s
-        * @return int
-        */
-       protected function unpackSigned( $s ) {
-               $data = unpack( 'va/vb', $s );
-
-               return $data['a'] | ( $data['b'] << 16 );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       protected function findNext( $key ) {
-               if ( !$this->loop ) {
-                       $u = CdbFunctions::hash( $key );
-                       $buf = $this->read( 8, ( $u << 3 ) & 2047 );
-                       $this->hslots = $this->unpack31( substr( $buf, 4 ) );
-                       if ( !$this->hslots ) {
-                               return false;
-                       }
-                       $this->hpos = $this->unpack31( substr( $buf, 0, 4 ) );
-                       $this->khash = $u;
-                       $u = CdbFunctions::unsignedShiftRight( $u, 8 );
-                       $u = CdbFunctions::unsignedMod( $u, $this->hslots );
-                       $u <<= 3;
-                       $this->kpos = $this->hpos + $u;
-               }
-
-               while ( $this->loop < $this->hslots ) {
-                       $buf = $this->read( 8, $this->kpos );
-                       $pos = $this->unpack31( substr( $buf, 4 ) );
-                       if ( !$pos ) {
-                               return false;
-                       }
-                       $this->loop += 1;
-                       $this->kpos += 8;
-                       if ( $this->kpos == $this->hpos + ( $this->hslots << 3 ) ) {
-                               $this->kpos = $this->hpos;
-                       }
-                       $u = $this->unpackSigned( substr( $buf, 0, 4 ) );
-                       if ( $u === $this->khash ) {
-                               $buf = $this->read( 8, $pos );
-                               $keyLen = $this->unpack31( substr( $buf, 0, 4 ) );
-                               if ( $keyLen == strlen( $key ) && $this->match( $key, $pos + 8 ) ) {
-                                       // Found
-                                       $this->dlen = $this->unpack31( substr( $buf, 4 ) );
-                                       $this->dpos = $pos + 8 + $keyLen;
-
-                                       return true;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * @param mixed $key
-        * @return bool
-        */
-       protected function find( $key ) {
-               $this->findStart();
-
-               return $this->findNext( $key );
-       }
-}
-
-/**
- * CDB writer class
- */
-class CdbWriterPHP extends CdbWriter {
-       protected $hplist;
-
-       protected $numentries;
-
-       protected $pos;
-
-       /**
-        * @param string $fileName
-        */
-       public function __construct( $fileName ) {
-               $this->realFileName = $fileName;
-               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
-               $this->handle = fopen( $this->tmpFileName, 'wb' );
-               if ( !$this->handle ) {
-                       $this->throwException(
-                               'Unable to open CDB file "' . $this->tmpFileName . '" for write.' );
-               }
-               $this->hplist = array();
-               $this->numentries = 0;
-               $this->pos = 2048; // leaving space for the pointer array, 256 * 8
-               if ( fseek( $this->handle, $this->pos ) == -1 ) {
-                       $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' );
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param string $value
-        */
-       public function set( $key, $value ) {
-               if ( strval( $key ) === '' ) {
-                       // DBA cross-check hack
-                       return;
-               }
-               $this->addbegin( strlen( $key ), strlen( $value ) );
-               $this->write( $key );
-               $this->write( $value );
-               $this->addend( strlen( $key ), strlen( $value ), CdbFunctions::hash( $key ) );
-       }
-
-       /**
-        * @throws CdbException
-        */
-       public function close() {
-               $this->finish();
-               if ( isset( $this->handle ) ) {
-                       fclose( $this->handle );
-               }
-               if ( $this->isWindows() && file_exists( $this->realFileName ) ) {
-                       unlink( $this->realFileName );
-               }
-               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
-                       $this->throwException( 'Unable to move the new CDB file into place.' );
-               }
-               unset( $this->handle );
-       }
-
-       /**
-        * @throws CdbException
-        * @param string $buf
-        */
-       protected function write( $buf ) {
-               $len = fwrite( $this->handle, $buf );
-               if ( $len !== strlen( $buf ) ) {
-                       $this->throwException( 'Error writing to CDB file "' . $this->tmpFileName . '".' );
-               }
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $len
-        */
-       protected function posplus( $len ) {
-               $newpos = $this->pos + $len;
-               if ( $newpos > 0x7fffffff ) {
-                       $this->throwException(
-                               'A value in the CDB file "' . $this->tmpFileName . '" is too large.' );
-               }
-               $this->pos = $newpos;
-       }
-
-       /**
-        * @param int $keylen
-        * @param int $datalen
-        * @param int $h
-        */
-       protected function addend( $keylen, $datalen, $h ) {
-               $this->hplist[] = array(
-                       'h' => $h,
-                       'p' => $this->pos
-               );
-
-               $this->numentries++;
-               $this->posplus( 8 );
-               $this->posplus( $keylen );
-               $this->posplus( $datalen );
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $keylen
-        * @param int $datalen
-        */
-       protected function addbegin( $keylen, $datalen ) {
-               if ( $keylen > 0x7fffffff ) {
-                       $this->throwException( 'Key length too long in file "' . $this->tmpFileName . '".' );
-               }
-               if ( $datalen > 0x7fffffff ) {
-                       $this->throwException( 'Data length too long in file "' . $this->tmpFileName . '".' );
-               }
-               $buf = pack( 'VV', $keylen, $datalen );
-               $this->write( $buf );
-       }
-
-       /**
-        * @throws CdbException
-        */
-       protected function finish() {
-               // Hack for DBA cross-check
-               $this->hplist = array_reverse( $this->hplist );
-
-               // Calculate the number of items that will be in each hashtable
-               $counts = array_fill( 0, 256, 0 );
-               foreach ( $this->hplist as $item ) {
-                       ++$counts[255 & $item['h']];
-               }
-
-               // Fill in $starts with the *end* indexes
-               $starts = array();
-               $pos = 0;
-               for ( $i = 0; $i < 256; ++$i ) {
-                       $pos += $counts[$i];
-                       $starts[$i] = $pos;
-               }
-
-               // Excessively clever and indulgent code to simultaneously fill $packedTables
-               // with the packed hashtables, and adjust the elements of $starts
-               // to actually point to the starts instead of the ends.
-               $packedTables = array_fill( 0, $this->numentries, false );
-               foreach ( $this->hplist as $item ) {
-                       $packedTables[--$starts[255 & $item['h']]] = $item;
-               }
-
-               $final = '';
-               for ( $i = 0; $i < 256; ++$i ) {
-                       $count = $counts[$i];
-
-                       // The size of the hashtable will be double the item count.
-                       // The rest of the slots will be empty.
-                       $len = $count + $count;
-                       $final .= pack( 'VV', $this->pos, $len );
-
-                       $hashtable = array();
-                       for ( $u = 0; $u < $len; ++$u ) {
-                               $hashtable[$u] = array( 'h' => 0, 'p' => 0 );
-                       }
-
-                       // Fill the hashtable, using the next empty slot if the hashed slot
-                       // is taken.
-                       for ( $u = 0; $u < $count; ++$u ) {
-                               $hp = $packedTables[$starts[$i] + $u];
-                               $where = CdbFunctions::unsignedMod(
-                                       CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
-                               while ( $hashtable[$where]['p'] ) {
-                                       if ( ++$where == $len ) {
-                                               $where = 0;
-                                       }
-                               }
-                               $hashtable[$where] = $hp;
-                       }
-
-                       // Write the hashtable
-                       for ( $u = 0; $u < $len; ++$u ) {
-                               $buf = pack( 'vvV',
-                                       $hashtable[$u]['h'] & 0xffff,
-                                       CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
-                                       $hashtable[$u]['p'] );
-                               $this->write( $buf );
-                               $this->posplus( 8 );
-                       }
-               }
-
-               // Write the pointer array at the start of the file
-               rewind( $this->handle );
-               if ( ftell( $this->handle ) != 0 ) {
-                       $this->throwException( 'Error rewinding to start of file "' . $this->tmpFileName . '".' );
-               }
-               $this->write( $final );
-       }
-
-       /**
-        * Clean up the temp file and throw an exception
-        *
-        * @param string $msg
-        * @throws CdbException
-        */
-       protected function throwException( $msg ) {
-               if ( $this->handle ) {
-                       fclose( $this->handle );
-                       unlink( $this->tmpFileName );
-               }
-               throw new CdbException( $msg );
-       }
-}
index 9fb4c19..fa7eebe 100644 (file)
@@ -26,14 +26,15 @@ class MWFunction {
         * @param string $class
         * @param array $args
         * @return object
+        * @deprecated 1.25 Use ObjectFactory::getObjectFromSpec() instead
         */
        public static function newObj( $class, $args = array() ) {
-               if ( !count( $args ) ) {
-                       return new $class;
-               }
+               wfDeprecated( __METHOD__, '1.25' );
 
-               $ref = new ReflectionClass( $class );
-
-               return $ref->newInstanceArgs( $args );
+               return ObjectFactory::getObjectFromSpec( array(
+                       'class' => $class,
+                       'args' => $args,
+                       'closure_expansion' => false,
+               ) );
        }
 }
index d176033..5025c36 100644 (file)
        "sunday": "Sunnandæg",
        "monday": "Mōnandæg",
        "tuesday": "Tīwesdæg",
-       "wednesday": "Wēdnesdæg",
+       "wednesday": "Wōdnesdæg",
        "thursday": "Þunresdæg",
        "friday": "Frigedæg",
        "saturday": "Sæterndæg",
        "sun": "Sun",
        "mon": "Mōn",
        "tue": "Tīw",
-       "wed": "Wēd",
+       "wed": "Wōd",
        "thu": "Þun",
        "fri": "Fri",
        "sat": "Sæt",
index eb4226a..44cd1ee 100644 (file)
@@ -51,7 +51,7 @@
        "tog-enotifminoredits": "Səhifələrdə kiçik dəyişikliklər olsa belə, mənə e-məktub göndər",
        "tog-enotifrevealaddr": "Xəbərdarlıq e-məktublarında mənim e-poçt ünvanımı göstər",
        "tog-shownumberswatching": "İzləyən istifadəçilərin sayını göstər",
-       "tog-oldsig": "Hazırkı imza:",
+       "tog-oldsig": "İndiki imza:",
        "tog-fancysig": "Vikimətn şəklində imza (avtomatik keçid yaratmadan)",
        "tog-uselivepreview": "Canlı sınaq baxışı xüsusiyyətindən istifadə et (JavaScript tələb edir, sınaq mərhələsindədir)",
        "tog-forceeditsummary": "Qısa məzmunu boş saxladıqda mənə bildir",
        "hidetoc": "gizlə",
        "collapsible-collapse": "Gizlə",
        "collapsible-expand": "Göstər",
+       "confirmable-yes": "Bəli",
+       "confirmable-no": "Xeyr",
        "thisisdeleted": "$1 bax və ya bərpa et?",
        "viewdeleted": "$1 göstərilsin?",
        "restorelink": "{{PLURAL:$1|bir silinmiş redaktəyə|$1 silinmiş redaktəyə}}",
        "namespaceprotected": "Sizin adlarında $1 olan məqalələrdə redaktə etməyə icazəniz yoxdur.",
        "customcssprotected": "Bu səhifəni redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
        "customjsprotected": "Bu Java Script səhifəsini redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
-       "mycustomcssprotected": "Bu CSS ssəhifəsini redaktə etmə izniniz yoxdur.",
-       "mycustomjsprotected": "Bu JavaScript səhifəsini redaktə etmə izniniz yoxdur.",
-       "myprivateinfoprotected": "Sizin özəl məlumatlarınızı redaktə etmə izniniz yoxdur.",
+       "mycustomcssprotected": "Bu CSS ssəhifəsini redaktə etmək səlahiyyətiniz yoxdur.",
+       "mycustomjsprotected": "Bu JavaScript səhifəsini redaktə etmək səlahiyyətiniz yoxdur.",
+       "myprivateinfoprotected": "Sizin şəxsi məlumatlarınızı redaktə etmək səlahiyyətiniz yoxdur.",
        "mypreferencesprotected": "Seçimlərinizi redaktə etmək üçün izniniz yoxdur.",
        "ns-specialprotected": "Xüsusi səhifələr redaktə oluna bilməz.",
        "titleprotected": "Bu adda səhifənin yaradılması istifadəçi [[User:$1|$1]] tərəfindən qadağan edilmişdir.\nGöstərilən səbəb: \"''$2''\".",
        "remembermypassword": "Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})",
        "userlogin-remembermypassword": "Sistemdə qal",
        "userlogin-signwithsecure": "Etibarlı bağlantıdan istifadə edin",
-       "yourdomainname": "Sizin domain",
+       "yourdomainname": "Sizin domeniniz:",
        "password-change-forbidden": "Bu vikidə parolunuzu dəyişdirə bilməzsiniz.",
        "externaldberror": "Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.",
        "login": "Daxil ol",
        "nav-login-createaccount": "Daxil ol / hesab yarat",
-       "userlogin": "Daxil ol və ya istifadəçi yarat",
+       "userlogin": "Daxil ol və ya qeydiyyatdan keç",
        "userloginnocreate": "Daxil ol",
        "logout": "Çıxış",
        "userlogout": "Çıxış",
        "gotaccountlink": "Daxil olun",
        "userlogin-resetlink": "Daxilolma məlumatlarınızı unutmusunuz?",
        "userlogin-resetpassword-link": "Parolu unutdunuzmu?",
-       "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, baÄ\9fqa bir istifadÉ\99çi kimi daxil ola bilÉ\99rsiniz.",
+       "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, baÅ\9fqa bir istifadÉ\99çi kimi daxil ola bilÉ\99rsiniz.",
        "userlogin-createanother": "Başqa bir istifadəçi hesabı yarat",
        "createacct-emailrequired": "E-poçt ünvanı",
        "createacct-emailoptional": "E-poçt ünvanı (istəyə bağlı)",
        "suspicious-userlogout": "Sizin çıxış üçün cəhdiniz uğursuz alındı. Bu, brouzerin yaxud proksi-keşləmənin düzgün işləməməsindən qaynaqlanır.",
        "createacct-another-realname-tip": "Gərçək adınız istəyə bağlıdır.\nƏgər gərçək adınızı göstərsəniz, çalışmalarınıza müraciət etmək üçün istifadə ediləcəkdir.",
        "pt-login": "Daxil ol",
+       "pt-login-button": "Daxil ol",
        "pt-createaccount": "Akkaunt yarat",
        "pt-userlogout": "Çıxış",
        "php-mail-error-unknown": "PHP-nin mail() funksiyasında naməlum xəta",
index cc253d3..56e6cbc 100644 (file)
        "filerenameerror": "Немагчыма перайменаваць файл «$1» у «$2».",
        "filedeleteerror": "Немагчыма выдаліць файл «$1».",
        "directorycreateerror": "Немагчыма стварыць дырэкторыю «$1».",
+       "directoryreadonlyerror": "Тэчка «$1» толькі для чытаньня.",
+       "directorynotreadableerror": "Тэчка «$1» не чытаецца.",
        "filenotfound": "Немагчыма знайсьці файл «$1».",
        "unexpected": "Нечаканае значэньне: «$1»=«$2».",
        "formerror": "Памылка: не атрымалася адаслаць зьвесткі формы",
        "api-error-stashpathinvalid": "Шлях, дзе павінен быў знаходзіцца схаваны файл, апынуўся няслушным.",
        "api-error-stashfilestorage": "Адбылася памылка пры захаваньні файла ў схованку.",
        "api-error-stashzerolength": "Сэрвэр ня змог схаваць файл, бо ён мае нулявы памер.",
+       "api-error-stashnotloggedin": "Вы мусіце ўвайсьці ў сыстэму, каб захоўваць файлы ў схованку загрузкі.",
+       "api-error-stashwrongowner": "Файл, да якога вы спрабуеце атрымаць доступ у схованцы, не належыць вам.",
+       "api-error-stashnosuchfilekey": "Ключ файла, да якога вы спрабуеце атрымаць доступ у схованцы, не існуе.",
        "api-error-timeout": "Сэрвэр не адказаў у чаканы тэрмін.",
        "api-error-unclassified": "Узьнікла невядомая памылка",
        "api-error-unknown-code": "Невядомая памылка: «$1».",
index fe7d7ad..1415b2c 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Gazimagomedov",
                        "StanProg",
-                       "Bjankuloski06"
+                       "Bjankuloski06",
+                       "Vodnokon4e"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "otherlanguages": "На други езици",
        "redirectedfrom": "(пренасочване от $1)",
        "redirectpagesub": "Пренасочваща страница",
+       "redirectto": "Пренасочване към:",
        "lastmodifiedat": "Последна промяна на страницата: $2, $1.",
        "viewcount": "Страницата е била преглеждана {{PLURAL:$1|един път|$1 пъти}}.",
        "protectedpage": "Защитена страница",
        "ok": "Добре",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Взето от „$1“.",
-       "youhavenewmessages": "Имате $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Имате}} $1 ($2).",
        "youhavenewmessagesfromusers": "Имате $1 от {{PLURAL:$3|друг потребител|$3 потребители}} ($2).",
        "youhavenewmessagesmanyusers": "Имате $1 от много потребители ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|ново съобщение|999=нови съобщения}}",
        "viewsourcetext": "Можете да разгледате и да копирате кодa на страницата:",
        "viewyourtext": "Можете да прегледате и копирате изходния код на '''вашите редакции''' на тази страница:",
        "protectedinterface": "Тази страница съдържа текст, нужен за работата на системата. Тя е защитена против редактиране, за да се предотвратят възможни злоупотреби.\nЗа извършване на промяна за всички уикита, посетете [//translatewiki.net/ translatewiki.net], проектът за локализация на MediaWiki.",
-       "editinginterface": "'''Внимание:''' Редактирате страница, която се използва за интерфейса на софтуера. Промяната й ще повлияе на външния вид на уикито.\nЗа превеждане, обмислете използването на [//translatewiki.net/ translatewiki.net], проектът за локализиране на MediaWiki.",
+       "editinginterface": "<strong>Внимание:</strong> Редактирате страница, която се използва за текстовия интерфейс на софтуера. Промяната й ще повлияе на външния вид на уикито.",
+       "translateinterface": "За да добавите или промените преводи за всички уикита, моля, използвайте [//translatewiki.net/ translatewiki.net], локализиращия проект на МедияУики.",
        "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита:\n$2",
        "namespaceprotected": "Нямате права за редактиране на страници в именно пространство '''$1'''.",
        "customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
        "createaccount-text": "Някой е създал сметка за $2 в {{SITENAME}} ($4) и е посочил този адрес за електронна поща. Паролата за „$2“ е „$3“. Необходимо е да влезете в системата и да смените паролата си.\n\nМожете да пренебрегнете това съобщение, ако сметката е създадена по грешка.",
        "login-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "login-abort-generic": "Влизането беше неуспешно - Прекратено",
+       "login-migrated-generic": "Вашата сметка е бил преместена и потребителското Ви име вече не съществува в това уики.",
        "loginlanguagelabel": "Език: $1",
        "suspicious-userlogout": "Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.",
        "createacct-another-realname-tip": "Истинското име е незадължително.\nВ случай, че бъде избрабо да се попълни, ще бъде използвано за да му се приписват приносите в уикито.",
        "resetpass-submit-cancel": "Отказ",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.",
        "resetpass-recycled": "Моля, променете паролата си с такава, различна от текущата.",
+       "resetpass-temp-emailed": "Вие сте влезли в системата с помощта на временен код, който е изпратен чрез електронна поща.\nЗа да завършите влизането в системата, трябва да въведете нова парола тук:",
        "resetpass-temp-password": "Временна парола:",
        "resetpass-abort-generic": "Промяната на паролата беше прекъсната от използвано разширение.",
        "resetpass-expired": "Срокът на валидност на паролата е изтекъл. Изберете нова парола за влизане.",
+       "resetpass-expired-soft": "Вашата парола е изтекла и трябва да бъде променена. Моля, въведете нова парола сега или натиснете бутона \"{{int:resetpass-submit-cancel}}\" за да я промените по-късно.",
+       "resetpass-validity-soft": "Моля, въведете нова парола сега или натиснете бутона \"{{int:resetpass-submit-cancel}}\" за да я промените по-късно.",
        "passwordreset": "Възстановяване на парола",
        "passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\97а Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни едно от полетата.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\97а Ð¿Ð¾Ð»Ñ\83Ñ\87аване Ð½Ð° Ð²Ñ\80еменна Ð¿Ð°Ñ\80ола Ð¿Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð´Ð° Ð¿Ð¾Ð¿Ñ\8aлниÑ\82е едно от полетата.}}",
        "passwordreset-legend": "Възстановяване на парола",
        "passwordreset-disabled": "Възстановяването на паролата е изключено в това уики.",
        "passwordreset-emaildisabled": "Функционалността за електронна поща е изключена в това уики.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Парола за {{SITENAME}}:",
        "changeemail-submit": "Промяна на е-пощата",
+       "changeemail-throttled": "Направили сте твърде много опити за влизане в системата. \nМоля, изчакайте $1 преди следващия опит.",
        "resettokens": "Изчистване на маркерите",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
        "resettokens-legend": "Изчистване на маркерите",
        "version-ext-colheader-description": "Описание",
        "version-ext-colheader-credits": "Автори",
        "version-license-title": "Лиценз за $1",
-       "version-poweredby-credits": "Това Ñ\83ики Ñ\81е Ð·Ð°Ð´Ð²Ð¸Ð¶Ð´Ð²Ð° Ð¾Ñ\82 '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+       "version-poweredby-credits": "Това Ñ\83ики Ñ\80абоÑ\82и Ð¿Ð¾ Ñ\81оÑ\84Ñ\82Ñ\83еÑ\80а Ð½Ð° <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преводачи в translatewiki.net",
        "version-credits-summary": "Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].",
index 3cd8d75..91f08a2 100644 (file)
        "recentchanges": "這般其改變",
        "recentchanges-summary": "敆維基茲頁跟蹤這般其改變。",
        "recentchanges-label-newpage": "茲蜀萆修改創建新其蜀頁",
-       "recentchanges-label-minor": "是蜀萆過幼修改",
+       "recentchanges-label-minor": "是蜀萆過幼修改",
        "recentchanges-label-bot": "茲蜀萆修改是機器人做其",
        "rclistfrom": "顯示由$3 $2開始其新其改變",
        "rcshowhideminor": "$1過幼修改",
index 8c9c020..3cfa141 100644 (file)
        "protectedpages-unknown-timestamp": "Хууш дац",
        "protectedpages-unknown-performer": "Хууш доцу декъашхо",
        "protectedtitles": "ГIаролла дина цIераш",
-       "listusers": "Декъашхой могӀам",
+       "listusers": "Декъашхойн могӀам",
        "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
        "listusers-creationsort": "Кхоьллина хене хьаьжна нисъяр",
        "listusers-desc": "Харжа къезиг хиларца",
        "listusers-submit": "Гайта",
        "listusers-noresult": "Декъашхой цакарий.",
        "listusers-blocked": "(блоктоьхна)",
-       "activeusers": "Жигар декъашхой могӀам",
+       "activeusers": "Жигара декъашхойн могӀам",
        "activeusers-intro": "Лахахь гойтуш бу  {{PLURAL:$1|1=тӀаьхьара $1 динахь|тӀаьхьара $1 деношкахь}} хийцамаш бина декъашхой.",
        "activeusers-count": "{{PLURAL:$3|1=тӀаьхьарчу $3 динахь|тӀаьхьара $3 деношкахь}} $1 {{PLURAL:$1|1=нисдар|нисдарш}} дина",
        "activeusers-from": "Гучé баха декъашхой, болалуш болу тӀера:",
index f23330b..f572a60 100644 (file)
        "filerenameerror": "Nebylo možné přejmenovat soubor „$1“ na „$2“.",
        "filedeleteerror": "Nebylo možné smazat soubor „$1“.",
        "directorycreateerror": "Nelze vytvořit adresář „$1“.",
+       "directoryreadonlyerror": "Adresář „$1“ je pouze pro čtení.",
+       "directorynotreadableerror": "Adresář „$1“ nelze číst.",
        "filenotfound": "Nebylo možné najít soubor „$1“.",
        "unexpected": "Neočekávaná hodnota: \"$1\"=\"$2\".",
        "formerror": "Chyba: nebylo možné odeslat formulář",
index eecd71f..fa20694 100644 (file)
        "filerenameerror": "Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.",
        "filedeleteerror": "Die Datei „$1“ konnte nicht gelöscht werden.",
        "directorycreateerror": "Das Verzeichnis „$1“ konnte nicht angelegt werden.",
+       "directoryreadonlyerror": "Das Wörterbuch „$1“ ist schreibgeschützt.",
+       "directorynotreadableerror": "Das Wörterbuch „$1“ ist nicht lesbar.",
        "filenotfound": "Die Datei „$1“ wurde nicht gefunden.",
        "unexpected": "Unerwarteter Wert: „$1“ = „$2“",
        "formerror": "Fehler: Die Eingaben konnten nicht verarbeitet werden.",
index 95472a5..f36a000 100644 (file)
        "november-date": "Tışrino Peyên $1",
        "december-date": "Kanun $1",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
+       "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
-       "category-media-header": "Dosyeyê ke kategoriya \"$1\" miyan derê",
+       "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
        "hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
        "hidden-category-category": "Kategoriyê nımıtey",
index 8cd1a32..c18adfc 100644 (file)
        "viewsourcetext": "Μπορείτε να δείτε και να αντιγράψετε τον κώδικα αυτής της σελίδας:",
        "viewyourtext": "Μπορείτε να προβάλετε και να αντιγράψετε τον κώδικα των '''επεξεργασιών σας''' σε αυτήν τη σελίδα:",
        "protectedinterface": "Αυτή η σελίδα παρέχει κείμενο διεπαφής για το λογισμικό σε αυτό το wiki, και έχει κλειδωθεί για αποτροπή τυχόν βανδαλισμού.\n\nΓια να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wikis, παρακαλούμε χρησιμοποιήστε  [//translatewiki.net/ translatewiki.net], το εγχείρημα τοπικοποίησης του  MediaWiki.",
-       "editinginterface": "<strong>Προειδοποίηση:</strong> Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτήν τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για τους άλλους χρήστες αυτού του wiki.",
+       "editinginterface": "<strong>Προειδοποίηση:</strong> Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτήν τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για άλλους χρήστες αυτού του wiki.",
        "cascadeprotected": "Αυτή η σελίδα έχει προστατευθεί από επεξεργασία, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη σελίδα, που είναι προστατευμένη|στις ακόλουθες σελίδες, που είναι προστατευμένες}} με ενεργοποιημένη τη «διαδοχική» προστασία στο:\n$2",
        "namespaceprotected": "Δεν έχετε άδεια να επεξεργάζεστε σελίδες στον τομέα '''$1'''.",
        "customcssprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα CSS, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "confirm": "Επιβεβαίωση",
        "excontent": "το περιεχόμενο ήταν: '$1'",
        "excontentauthor": "το περιεχόμενο ήταν: '$1' (και οι μοναδικές συνεισφορές ήταν του '$2')",
-       "exbeforeblank": "το περιεχόμενο πριν απο την εκκαθάριση ήταν: '$1'",
+       "exbeforeblank": "το περιεχόμενο πριν τη διαγραφή ήταν: «$1»",
        "delete-confirm": "Διαγραφή του \"$1\"",
        "delete-legend": "Διαγραφή",
        "historywarning": "<strong>Προσοχή:</strong> Η σελίδα που πρόκειται να διαγράψετε έχει ιστορικό με περίπου $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}:",
        "confirmdeletetext": "Πρόκειται να διαγράψετε οριστικά από τη βάση δεδομένων μια σελίδα (ή μια εικόνα) μαζί με το ιστορικό της. Παρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να το κάνετε, ότι αντιλαμβάνεσθε τις συνέπειες και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "actioncomplete": "Η ενέργεια ολοκληρώθηκε.",
        "actionfailed": "Η ενέργεια απέτυχε",
-       "deletedtext": "Η \"$1\" έχει διαγραφεί.\nΓια το ιστορικό των πρόσφατων διαγραφών ανατρέξτε στο σύνδεσμο $2",
+       "deletedtext": "Η «$1» έχει διαγραφεί.\nΒλ. $2 για ιστορικό πρόσφατων διαγραφών.",
        "dellogpage": "Αρχείο καταγραφών διαγραφών",
        "dellogpagetext": "Λίστα των πιο πρόσφατων διαγραφών",
        "deletionlog": "Καταγραφές διαγραφών",
index 341f626..45c7105 100644 (file)
        "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
        "filedeleteerror": "Could not delete file \"$1\".",
        "directorycreateerror": "Could not create directory \"$1\".",
+       "directoryreadonlyerror": "Directory \"$1\" is read-only.",
+       "directorynotreadableerror": "Directory \"$1\" is not readable.",
        "filenotfound": "Could not find file \"$1\".",
        "unexpected": "Unexpected value: \"$1\"=\"$2\".",
        "formerror": "Error: Could not submit form.",
        "movepage-moved-redirect": "A redirect has been created.",
        "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
        "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
-       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
+       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation.",
        "movetalk": "Move associated talk page",
        "move-subpages": "Move subpages (up to $1)",
        "move-talk-subpages": "Move subpages of talk page (up to $1)",
        "delete_and_move_confirm": "Yes, delete the page",
        "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
        "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
-       "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
-       "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
+       "immobile-source-namespace": "Cannot move pages in namespace \"$1\".",
+       "immobile-target-namespace": "Cannot move pages into namespace \"$1\".",
        "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
        "immobile-source-page": "This page is not movable.",
        "immobile-target-page": "Cannot move to that destination title.",
        "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
-       "imagenocrossnamespace": "Cannot move file to non-file namespace",
-       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
-       "imagetypemismatch": "The new file extension does not match its type",
-       "imageinvalidfilename": "The target filename is invalid",
+       "imagenocrossnamespace": "Cannot move file to non-file namespace.",
+       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace.",
+       "imagetypemismatch": "The new file extension does not match its type.",
+       "imageinvalidfilename": "The target filename is invalid.",
        "fix-double-redirects": "Update any redirects that point to the original title",
        "move-leave-redirect": "Leave a redirect behind",
        "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
index e5804b1..1556350 100644 (file)
        "filerenameerror": "Ei saanud faili \"$1\" failiks \"$2\" ümber nimetada.",
        "filedeleteerror": "Faili nimega \"$1\" ei ole võimalik kustutada.",
        "directorycreateerror": "Kataloogi \"$1\" ei saanud luua.",
+       "directoryreadonlyerror": "Kataloog \"$1\" on kirjutuskaitstud.",
+       "directorynotreadableerror": "Kataloog \"$1\" pole loetav.",
        "filenotfound": "Faili nimega \"$1\" ei leitud.",
        "unexpected": "Ootamatu väärtus: \"$1\"=\"$2\".",
        "formerror": "Viga: vormi ei saanud salvestada",
index f79f369..03ca92b 100644 (file)
        "category-file-count": "{{PLURAL:$2|این رده تنها حاوی پروندهٔ زیر است.|{{PLURAL:$1|این پرونده|این $1 پرونده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 پرونده است.}}",
        "category-file-count-limited": "{{PLURAL:$1|پروندهٔ|$1 پروندهٔ}} زیر در ردهٔ فعلی قرار دارند.",
        "listingcontinuesabbrev": "(ادامه)",
-       "index-category": "صفحات فهرست‌شده",
+       "index-category": "صفحه‌های نمایه‌شده",
        "noindex-category": "صفحه‌های نمایه‌نشده",
-       "broken-file-category": "صفحات دارای پیوند خراب به پرونده",
+       "broken-file-category": "صفحه‌های دارای پیوند خراب به پرونده",
        "about": "درباره",
        "article": "صفحهٔ محتوایی",
        "newwindow": "(در پنجرهٔ تازه باز می‌شود)",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
-       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر \"{{int:savearticle}}\" را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
+       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر «{{int:savearticle}}» را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
        "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "permissionserrors": "خطای سطح دسترسی",
        "permissionserrorstext": "شما اجازهٔ انجام این کار را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
        "permissionserrorstext-withaction": "شما اجازهٔ $2 را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
-       "recreate-moveddeleted-warn": "'''هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.'''\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
+       "recreate-moveddeleted-warn": "<strong>هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.</strong>\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
        "moveddeleted-notice": "این صفحه حذف شده‌است.\nدر زیر سیاههٔ حذف و انتقال این صفحه نمایش داده شده‌است.",
        "log-fulllog": "مشاهدهٔ سیاههٔ کامل",
        "edit-hook-aborted": "ویرایش توسط قلاب لغو شد.\nتوضیحی در این مورد داده نشد.",
index 15eeca8..0930132 100644 (file)
        "filerenameerror": "Impossible de renommer le fichier « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de supprimer le fichier « $1 ».",
        "directorycreateerror": "Impossible de créer le dossier « $1 ».",
+       "directoryreadonlyerror": "Le répertoire « $1 » est en lecture seule.",
+       "directorynotreadableerror": "Le répertoire « $1 » n’est pas lisible.",
        "filenotfound": "Impossible de trouver le fichier « $1 ».",
        "unexpected": "Valeur inattendue : « $1 » = « $2 ».",
        "formerror": "Erreur : Impossible de soumettre le formulaire.",
index 5e3d63e..6adc493 100644 (file)
        "confirmemail_body": "Immen, nei gedachten jo, hat him by {{SITENAME}} oanmelde as \"$2\", mei dit netpostadres ($1).\n\nHjirtroch komme ek de netpostfunksjes fan {{SITENAME}} foar jo beskikber. Iepenje de neikommende keppeling om te befêstigjen dat jo wier josels by {{SITENAME}} mei dit netpostadres oanmelde hawwe:\n\n$3\n\nAt jo dat *net* wienen, brûk dy keppeling dan net, en klik hjir:\n\n$5\n\nDizze befêstigingskoade ferrint dan op $4.",
        "scarytranscludetoolong": "[URL-adres is te lang]",
        "confirmrecreate": "Sûnt jo begûn binne dizze side te bewurkjen, hat meidogger [[User:$1|$1]] ([[User talk:$1|oerlis]]) de side wiske. De reden dy't derfoar jûn waard wie:\n: ''$2''\nWolle jo de side wier op 'e nij skriuwe?",
-       "confirm_purge_button": "Okee",
-       "confirm-watch-button": "Okee",
-       "confirm-unwatch-button": "Okee",
+       "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Dizze side fan myn folchlist ôfhelje",
        "imgmultipageprev": "side werom",
        "imgmultipagenext": "folgjende side →",
        "version-software": "Ynsteld software",
        "version-software-product": "Produkt",
        "version-software-version": "Ferzje",
+       "redirect-value": "Wearde:",
        "redirect-file": "Triemnamme",
        "fileduplicatesearch": "Sykje op duplikaten",
        "fileduplicatesearch-legend": "Sykje op duplikaten",
        "duration-minutes": "$1 {{PLURAL:$1|minút|minuten}}",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekonde|sekonden}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekonde|sekonden}}",
-       "expand_templates_ok": "Okee",
+       "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Berjochten fuorthelje",
        "pagelang-language": "Taal",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)"
index f2c38c2..0cb20a6 100644 (file)
        "filerenameerror": "שינוי השם של \"$1\" ל־\"$2\" נכשל.",
        "filedeleteerror": "מחיקת \"$1\" נכשלה.",
        "directorycreateerror": "יצירת התיקייה \"$1\" נכשלה.",
+       "directoryreadonlyerror": "התיקייה \"$1\" היא לקריאה בלבד.",
+       "directorynotreadableerror": "התיקייה \"$1\" אינה ניתנת לקריאה.",
        "filenotfound": "הקובץ \"$1\" לא נמצא.",
        "unexpected": "ערך לא צפוי: \"$1\"=\"$2\"",
        "formerror": "שגיאה: לא ניתן היה לשלוח את הטופס.",
index 0b3807d..2ee1fb0 100644 (file)
        "autosumm-replace": "tekst stranice se zamjenjuje s '$1'",
        "autoredircomment": "preusmjeravanje na [[$1]]",
        "autosumm-new": "nova stranica: $1",
+       "autosumm-newblank": "stvorena prazna stranica",
        "lag-warn-normal": "Moguće je da izmjene nastale posljednjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.",
        "lag-warn-high": "Zbog kašnjenja baze podataka, moguće je da promjene napravljene u posljednjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.",
        "watchlistedit-normal-title": "Uredi popis praćenja",
index a83c628..685de7b 100644 (file)
                ]
        },
        "tog-underline": "Pinag-ugisan ti silpo:",
-       "tog-hideminor": "Ilemmeng dagiti bassit a inurnos iti kaudian a balbaliw",
-       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos iti kaudian a balbaliw",
+       "tog-hideminor": "Ilemmeng dagiti bassit nga inurnos manipud ti kaudian a balbaliw",
+       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud ti kaudian a balbaliw",
        "tog-newpageshidepatrolled": "Ilemmeng dagiti napatruliaan a panid manipud ti baro a listaan ti panid",
        "tog-extendwatchlist": "Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, saan laeng a ti kabiitan",
        "tog-usenewrc": "Dagiti grupo a panagbaliw babaen ti panid ti kaudian a balbaliw ken listaan ti bambantayan",
        "tog-numberheadings": "Automatiko a pabilangan dagiti paulo",
-       "tog-showtoolbar": "Ipakita ti baras ti ramit ti panag-urnos",
+       "tog-showtoolbar": "Ipakita ti baras ti ramit ti panagurnos",
        "tog-editondblclick": "Urnosen dagiti panid iti mamindua a panagpindut",
-       "tog-editsectiononrightclick": "Pakabaelan ti panag-urnos iti paset babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
+       "tog-editsectiononrightclick": "Pakabaelan ti panagurnos iti paset babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
        "tog-watchcreations": "Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak iti listaan ti bambantayak",
        "tog-watchdefault": "Agnayon kadagiti panid ken papeles nga inurnosko iti listaan ti bambantayak",
        "tog-watchmoves": "Agnayon kadagiti panid ken papeles nga inyalisko iti listaan ti bambantayak",
        "tog-watchdeletion": "Agnayon kadagiti panid ken papeles nga inikkatko iti listaan ti bambantayak",
+       "tog-watchrollback": "Agnayon kadagiti panid nga adda inramidko nga insubli iti bambantayak",
        "tog-minordefault": "Markaan amin dagiti inurnos a kas bassit babaen ti kasisigud",
        "tog-previewontop": "Ipakita ti panagipadas sakbay ti pagurnosan a kahon",
-       "tog-previewonfirst": "Ipakita ti pinadas iti umuna a panag-urnos",
+       "tog-previewonfirst": "Ipakita ti pinadas iti umuna a panagurnos",
        "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno papeles iti listaan dagiti bambantayak",
        "tog-enotifusertalkpages": "Esuratannak no mabaliwan ti panid ti tungtungak",
-       "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panag-urnos kadagiti panid ken papeles",
+       "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panagurnos kadagiti panid ken papeles",
        "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko iti panagipakaaammo kadagiti esurat",
        "tog-shownumberswatching": "Ipakita ti bilang dagiti agbuybuya nga agar-aramat",
        "tog-oldsig": "Ti adda a pirma:",
        "tog-fancysig": "Tratuen ti pirma a kas wikitext (nga awan ti automatiko a silpo)",
        "tog-uselivepreview": "Usaren ti agdama a panagipadas (eksperimental)",
-       "tog-forceeditsummary": "Pakaammuannak no sumrek iti blanko a pakabuklan ti panag-urnos",
+       "tog-forceeditsummary": "Pakaammuannak no sumrek iti blanko a pakabuklan ti panagurnos",
        "tog-watchlisthideown": "Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan",
        "tog-watchlisthidebots": "Ilemmeng dagiti inurnos ti bot manipud ti listaan ti bambantayan",
        "tog-watchlisthideminor": "Ilemmeng dagiti bassit nga inurnos manipud ti listaan ti bambantayan",
        "faqpage": "Project:MAS",
        "actions": "Dagiti aramid",
        "namespaces": "Dagiti nagan ti espasio",
-       "variants": "Sab-sabali a pagsasao",
+       "variants": "Sabsabali a pagsasao",
        "navigation-heading": "Listaan ti pagdaliasatan",
        "errorpagetitle": "Biddut",
        "returnto": "Agsubli idiay $1.",
        "permalink": "Agnanayon a silpo",
        "print": "Imaldit",
        "view": "Kitaen",
-       "view-foreign": "Kitaen idiay $1",
+       "view-foreign": "Kitaen iti $1",
        "edit": "Urnosen",
        "edit-local": "Urnosen ti lokal a deskripsion",
        "create": "Agpartuat",
-       "create-local": "Agnayon ti lokal a deskripsion",
+       "create-local": "Agnayon iti lokal a deskripsion",
        "editthispage": "Urnosen daytoy a panid",
        "create-this-page": "Partuaten daytoy a panid",
        "delete": "Ikkaten",
        "talkpage": "Pagtungtungan daytoy a panid",
        "talkpagelinktext": "Tungtungan",
        "specialpage": "Espesial a panid",
-       "personaltools": "Bukod a ram-ramit",
+       "personaltools": "Bukod a ramramit",
        "articlepage": "Kitaen ti naglaon a panid",
        "talk": "Pagtungtungan",
        "views": "Dagiti pangkitaan",
        "otherlanguages": "Kadagiti sabali a pagsasao",
        "redirectedfrom": "(Naibaw-ing manipud iti $1)",
        "redirectpagesub": "Baw-ing a panid",
+       "redirectto": "Naibaw-ing iti:",
        "lastmodifiedat": "Daytoy a panid ket naudi a nabaliwan idi $1, $2.",
        "viewcount": "Naserrekanen daytoy a panid {{PLURAL:$1|iti naminsan|kadagiti $1 a beses}}.",
        "protectedpage": "Nasalakniban a panid",
        "currentevents-url": "Project:Agdama a paspasamak",
        "disclaimers": "Dagiti renunsia",
        "disclaimerpage": "Project:Sapasap a renunsia",
-       "edithelp": "Tulong ti panag-urnos",
+       "edithelp": "Tulong ti panagurnos",
        "mainpage": "Umuna a Panid",
        "mainpage-description": "Umuna a Panid",
        "policy-url": "Project:Annuroten",
        "hidetoc": "ilemmeng",
        "collapsible-collapse": "Rebbaen",
        "collapsible-expand": "Palawaen",
+       "confirmable-confirm": "Siguradoka kadi ?",
+       "confirmable-yes": "Wen",
+       "confirmable-no": "Saan",
        "thisisdeleted": "Kitaen wenno ipulang $1?",
        "viewdeleted": "Kitaen $1?",
        "restorelink": "{{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}",
        "viewsource-title": "Kitaen ti taudan para iti $1",
        "actionthrottled": "Napabuntog ti aramid",
        "actionthrottledtext": "Para iti pagkontra ti spam, naipatinggaka nga agramid iti daytoy a tignay iti adu unay a beses iti nasiket nga oras, ken nalabsamon daytoy a patingga.\nPangngaasi nga ipadasmo manen no madamdama.",
-       "protectedpagetext": "Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos wenno dagiti dadduma pay a tignay.",
+       "protectedpagetext": "Nasalakniban daytoy a panid tapno mapawilan ti panagurnos wenno dagiti dadduma pay a tignay.",
        "viewsourcetext": "Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:",
        "viewyourtext": "Mabalinmo a makita ken tuladen ti taudan dagiti <strong>inurnosmo</strong> iti daytoy panid:",
-       "protectedinterface": "Daytoy a panid ket mangited ti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-       "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
+       "protectedinterface": "Daytoy a panid ket mangited iti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
+       "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.",
+       "translateinterface": "Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
        "cascadeprotected": "Daytoy a panid ket nasalaknibanen para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
        "namespaceprotected": "Awan ti pammalubosmo nga agurnos kadagiti panid iti nagan ti espasio ti <strong>$1</strong>.",
        "customcssprotected": "Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "mypreferencesprotected": "Awan pammalubosmo nga agurnos kadagiti kakaykayatam.",
        "ns-specialprotected": "Saan a mabalin nga urnosen dagiti espesial a panid.",
        "titleprotected": "Daytoy a titulo ket nasalakniban manipud ti pannakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket \"<em>$2</em>\".",
-       "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ket ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag \"''$3''\".",
+       "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ket ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag: \"$3\".",
        "invalidtitle-knownnamespace": "Imbalido a titulo iti nagan ti espasio \"$2\" ken testo \"$3\"",
        "invalidtitle-unknownnamespace": "Imbalido a titulo iti di ammo a nagan ti espasio a bilang $1 ken testo \"$2\"",
        "exception-nologin": "Saan a nakastrek",
-       "exception-nologin-text": "Pangngaasi a [[Special:Userlogin|sumrek]] tapno maserrekam daytoy a panid wenno tignay.",
+       "exception-nologin-text": "Pangngaasi a sumrek tapno maserrekam daytoy a panid wenno tignay.",
        "exception-nologin-text-manual": "Pangngaasi a $1 tapno maserrekan daytoy a panid wenno tignay.",
        "virus-badscanner": "Madi ti konpigurasion: Di ammo a panagsukimat ti birus: <em>$1</em>",
        "virus-scanfailed": "napaay ti panagsukimat (kodigo $1)",
        "userlogin-signwithsecure": "Usaren ti natalged a koneksion",
        "yourdomainname": "Ti bukodmo a dominio:",
        "password-change-forbidden": "Saanmo a mabaliwan dagiti kontrasenias iti daytoy a wiki.",
-       "externaldberror": "Mabalin nga adda biddut iti pannakapasingked ti database wenno saanka a mapalubosan a mangpabaro ti akin-ruar a pakabilangam.",
+       "externaldberror": "Mabalin nga adda biddut iti pannakapasingked ti database wenno saanka a mapalubosan a mangpabaro ti akinruar a pakabilangam.",
        "login": "Sumrek",
-       "nav-login-createaccount": "Sumrek / agpartuat ti pakabilangan",
-       "userlogin": "Sumrek / agpartuat ti pakabilangan",
+       "nav-login-createaccount": "Sumrek / agpartuat iti pakabilangan",
+       "userlogin": "Sumrek / agpartuat iti pakabilangan",
        "userloginnocreate": "Sumrek",
        "logout": "Rummuar",
        "userlogout": "Rummuar",
        "userlogin-noaccount": "Awan ti pakabilangam?",
        "userlogin-joinproject": "Tumipon iti {{SITENAME}}",
        "nologin": "Awan pakabilangam? $1.",
-       "nologinlink": "Agpartuat ti pakabilangan",
-       "createaccount": "Agpartuat ti pakabilangan",
+       "nologinlink": "Agpartuat iti pakabilangan",
+       "createaccount": "Agpartuat iti pakabilangan",
        "gotaccount": "Addaanka kadin iti pakabilangan? $1.",
        "gotaccountlink": "Sumrek",
        "userlogin-resetlink": "Nalipatam dagiti salaysay ti panagserrekmo?",
        "userlogin-resetpassword-link": "Nalipatam ti kontraseniasmo?",
        "userlogin-helplink2": "Tulong iti panagserrek",
        "userlogin-loggedin": "Nakastrekkan a kas ni {{GENDER:$1|$1}}.\nUsaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.",
-       "userlogin-createanother": "Agpartuat ti sabali a pakabilangan",
+       "userlogin-createanother": "Agpartuat iti sabali a pakabilangan",
        "createacct-emailrequired": "Esurat a pagtaengan",
        "createacct-emailoptional": "Esurat a pagtaengan (pagpilian)",
        "createacct-email-ph": "Ikabil ti esurat a pagtaengam",
        "createacct-another-email-ph": "Ikabil ti esurat a pagtaengan",
-       "createaccountmail": "Agusar ti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
+       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
        "createacct-realname": "Pudno a nagan (pagpilian)",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-captcha": "Panagpatalged ti seguridad",
        "createacct-imgcaptcha-ph": "Ikabil ti testo a makitam dita ngato",
        "createacct-submit": "Partuatem ti pakabilangam",
-       "createacct-another-submit": "Agpartuat ti sabali a pakabilangan",
+       "createacct-another-submit": "Agpartuat iti sabali a pakabilangan",
        "createacct-benefit-heading": "Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.",
        "createacct-benefit-body1": "{{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "createacct-benefit-body2": "{{PLURAL:$1|a panid|a pampanid}}",
        "noname": "Saanmo a nainaganan ti umisu a nagan ti agar-aramat.",
        "loginsuccesstitle": "Balligi ti panagserrek",
        "loginsuccess": "<strong>Nakastrekkan iti {{SITENAME}} a kas ni \"$1\".</strong>",
-       "nosuchuser": "Awan ti agar-aramat nga agnagan ti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletram, wenno [[Special:UserLogin/signup|agpartuat ti baro a pakabilangan]].",
+       "nosuchuser": "Awan ti agar-aramat nga agnagan ti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletram, wenno [[Special:UserLogin/signup|agpartuat iti baro a pakabilangan]].",
        "nosuchusershort": "Awan ti agar-aramat nga agnagan ti \"$1\".\nKitaem ti panangiletram.",
        "nouserspecified": "Nasken nga inaganam ti nagan ti agar-aramat.",
        "login-userblocked": "Naserraan daytoy nga agar-aramat. Saan a mapalubosan ti sumrek.",
        "noemail": "Awan ti esurat a pagtaengan a nairehistro para iti agar-aramat a ni \"$1\".",
        "noemailcreate": "Nasken a mangitedka ti pudno nga esurat a pagtaengan.",
        "passwordsent": "Naipatuloden ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan ti pannakaawatmo.",
-       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud ti panag-urnos, ken isu a saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panag-abuso.",
+       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud ti panagurnos, ken isu a saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panag-abuso.",
        "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti aniaman nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
        "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas a {{PLURAL:$1|nga oras|$1 nga or-oras}}.\nTapno maipawilan ti panag-abuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti kada {{PLURAL:$1|nga oras|$1 nga or-oras}}.",
        "mailerror": "Biddut iti panangipatulod ti surat: $1",
        "createaccount-text": "Adda nagpartuat ti pakabilangan para iti esurat a pagtaengam iti {{SITENAME}} ($4) nga agnagan  ti \"$2\", iti kontrasenias a \"$3\".\nNasken a sumrekka ken sukatam ti kontraseniasmo tattan.\n\nMabalinmo ti saan a mangikaskaso iti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.",
        "login-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga agurayka ti $1 sakbay a padasen manen.",
        "login-abort-generic": "Napaay ti panagserrekmo - Napasardeng",
+       "login-migrated-generic": "Ti pakabilangam ket naiyakaren, ken awanen ti naganmo nga agar-aramat iti daytoy a wiki.",
        "loginlanguagelabel": "Pagsasao: $1",
-       "suspicious-userlogout": "Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod ti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.",
+       "suspicious-userlogout": "Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod iti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.",
        "createacct-another-realname-tip": "Saan a nasken ti pudno a nagan.\nNo kayatmo nga ited, mausarto daytoy para iti panangited ti pammadayaw para kadagiti obrada.",
        "pt-login": "Sumrek",
        "pt-login-button": "Sumrek",
-       "pt-createaccount": "Agpartuat ti pakabilangan",
+       "pt-createaccount": "Agpartuat iti pakabilangan",
        "pt-userlogout": "Rummuar",
        "php-mail-error-unknown": "Di ammo a biddut iti surat ti annong ti PHP().",
        "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga esurat a pagtaengan.",
        "retypenew": "Imakinilya manen ti baro a kontrasenias:",
        "resetpass_submit": "Isaad ti kontrasenias ken sumrek",
        "changepassword-success": "Balligi a nasukatan ti kontraseniasmo!",
-       "changepassword-throttled": "Nakaaramidka kadagiti adu unay a nabiit a panangipadas ti panagserrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
+       "changepassword-throttled": "Nakaaramidka kadagiti adu unay a nabiit a panangipadas ti panagserrek.\nPangngaasi nga aguray iti $1 sakbay a padasen manen.",
        "resetpass_forbidden": "Saan a masukatan dagiti kontrasenias",
        "resetpass-no-info": "Masapul a nakastrekka tapno dagus a makapanka iti daytoy a panid.",
        "resetpass-submit-loggedin": "Sukatan ti kontrasenias",
        "hr_tip": "Horisontal a linia (manmano laeng nga aramaten)",
        "summary": "Pakabuklan:",
        "subject": "Suheto/paulo:",
-       "minoredit": "Daytoy ket bassit a panag-urnos",
+       "minoredit": "Daytoy ket bassit a panagurnos",
        "watchthis": "Bantayan daytoy a panid",
        "savearticle": "Idulin ti panid",
        "preview": "Ipadas",
        "showpreview": "Ipakita ti ipadas",
        "showdiff": "Ipakita dagiti sinukatan",
        "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti aniaman a linaon.",
-       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek.\nMairehistro ti IP a pagtaengam iti pakasaritaan ti panag-urnos iti daytoy a panid.",
-       "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panag-urnos iti daytoy a panid.</em>",
-       "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panag-urnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti IP a pagtaengan ket publikonto a makita nga agaramidka iti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
+       "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panagurnos iti daytoy a panid.</em>",
+       "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "missingcommenttext": "Pangngaasi nga agikabil ti komentario dita baba.",
-       "missingcommentheader": "<strong>Palagip:</strong> Saanka a nakaited  iti suheto/paulo para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "missingcommentheader": "<strong>Palagip:</strong> Saanka a nakaited iti suheto/paulo para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "summary-preview": "Naipadas a pakabuklan:",
        "subject-preview": "Suheto/naipadas a paulo:",
        "blockedtitle": "Naseraan ti agar-aramat",
        "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
        "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panag-usar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
-       "whitelistedittext": "Nasken ti $1 tapno maurnosmo dagitoy a panid.",
+       "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasi nga isaad ken ipapudnom ti esuratmo babaen ti [[Special:Preferences|kakaykayatan ti agar-aramat]].",
        "nosuchsectiontitle": "Saan a mabirukan ti paset",
        "nosuchsectiontext": "Pinadasmo nga inurnos ti awan a paset.\nMabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.",
        "accmailtext": "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden iti $2. Mabalin a masukatan iti\n<em>[[Special:ChangePassword|pagsukatan ti kontrasenias]]</em> a panid no sumrekka.",
        "newarticle": "(Baro)",
        "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>back</strong> ti pagbasabasam.",
-       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat ti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agpartuatka ti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
+       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
        "noarticletext": "Awan ti agdama a testo daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid]</span>.",
        "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat iti daytoy a panid.",
        "missing-revision": "Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti \"{{FULLPAGENAME}}\" ket awan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a silpo ti baak a pakasaritaan iti maysa a naikkaten a panid.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "userjspreview": "<strong>Laglagipem a subsubokam/ipadpadasmo ti bukodmo a JavaScript ti agar-aramat.\nSaan pay a naidulin!</strong>",
        "sitecsspreview": "<strong>Laglagipem nga ipadpadasmo laeng daytoy a CSS.\nSaan pay a naidulin!</strong>",
        "sitejspreview": "<strong>Laglagipem nga ipadpadasmo laeng daytoy a kodigo ti JavaScript.\nSaan pay nga naidulin!</strong>",
-       "userinvalidcssjstitle": "<strong>Ballaag:</strong> Awan ti kudil a \"$1\".\nDagiti panid ti naiduma a .css ken .js ket agus-usar ti titulo ti bassit a letra, kas ti {{ns:user}}:Foo/vector.css saan a kas ti {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Ballaag:</strong> Awan ti kudil a \"$1\".\nDagiti panid ti naiduma a .css ken .js ket agus-usar iti titulo ti bassit a letra, kas ti {{ns:user}}:Foo/vector.css saan a kas ti {{ns:user}}:Foo/Vector.css.",
        "updated": "(Napabaro)",
        "note": "<strong>Nota:</strong>",
        "previewnote": "<strong>Laglagipem a daytoy ket panagipadas laeng.</strong>\nDagiti sinukatam ket saan pay a naidulin!",
        "continue-editing": "Mapan idiay pagurnosan a lugar",
-       "previewconflict": "Daytoy a panagpadas ket mangipakita ti testo iti lugar ti akin-ngato a pangurnosan ti testo a kasla agparang no piliem nga idulin.",
-       "session_fail_preview": "<strong>Pasensia! Saanmi a maproseso ti panag-urnosmo gapu ta naawanan ti sesion ti datos.</strong>\nPangngaasi a padasen manen.\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
-       "session_fail_preview_html": "<strong>Pasensia! Saanmi a maproseso ti panag-urnosmo gapu ta naawanan ti sesion ti datos.</strong>'\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panag-urnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
-       "token_suffix_mismatch": "<strong>Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panag-urnos.</strong>\nTi panag-urnos ket saan a naawat tapno mapawilan ti pannakadadael ti testo ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
-       "edit_form_incomplete": "<strong>Adda dagiti paset ti pagurnosan a porma a saan a nakadanon dita server; mamindua a kitaen dagiti panag-urnosmo ket sibubukel ken padasen manen.</strong>",
+       "previewconflict": "Daytoy a panagpadas ket mangipakita ti testo iti lugar ti akinngato a pangurnosan ti testo a kasla agparang no piliem nga idulin.",
+       "session_fail_preview": "<strong>Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.</strong>\nPangngaasi a padasen manen.\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
+       "session_fail_preview_html": "<strong>Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.</strong>'\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panagurnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
+       "token_suffix_mismatch": "<strong>Ti panagurnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panagurnos.</strong>\nTi panagurnos ket saan a naawat tapno mapawilan ti pannakadadael ti testo ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
+       "edit_form_incomplete": "<strong>Adda dagiti paset ti pagurnosan a porma a saan a nakadanon dita server; mamindua a kitaen dagiti panagurnosmo ket sibubukel ken padasen manen.</strong>",
        "editing": "Ur-urnosen ti $1",
        "creating": "Agparpartuat ti $1",
        "editingsection": "Ur-urnosen ti $1 (paset)",
        "editingcomment": "Ur-urnosen ti $1 (baro a paset)",
-       "editconflict": "Agsinnungat a panag-urnos: $1",
-       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti testo ket aglaon ti testo ti panid iti agdama kaddana.\nDagiti sinukatam ket maipakita iti akinbabba a lugar ti testo.\nNasken nga itiponmoto dagiti sinukatam iti adda a testo.\nTi <strong>laeng</strong> testo iti akinngato a lugar ti testo ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
+       "editconflict": "Agsinnungat a panagurnos: $1",
+       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti testo ket aglaon ti testo ti panid iti agdama kaaddana.\nDagiti sinukatam ket maipakita iti akinbaba a lugar ti testo.\nNasken nga itiponmonto dagiti sinukatam iti adda a testo.\nTi <strong>laeng</strong> testo iti akinngato a lugar ti testo ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
        "yourtext": "Ti testom",
        "storedversion": "Rebision a naidulin",
        "nonunicodebrowser": "<strong>Ballaag: Ti pabasabasam ket saan a maitunos iti Unicode .</strong>\nAdda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a karakter ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
        "yourdiff": "Paggigiddiatan",
        "copyrightwarning": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket naikeddeng a naipablaak babaen ti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). \nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan.\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
        "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
-       "longpageerror": "<strong>Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kil-kilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kil-kilobyte}}.</strong>\nSaan a mabalin a maidulin.",
+       "longpageerror": "<strong>Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
        "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "template-protected": "(nasalakniban)",
        "template-semiprotected": "(nasalakniban-bassit)",
        "hiddencategories": "Daytoy a panid ket kameng {{PLURAL:$1|ti 1 a nailemmeng a kategoria|dagiti $1 a nailemmeng a kategoria}}:",
-       "nocreatetext": "Ginawidan ti {{SITENAME}} ti abilidad nga agpartuat kadagiti baro a panid.\nMabalinmo ti agsubli ken agurnos ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agapartuat ti pakabilangan]].",
+       "nocreatetext": "Ginawidan ti {{SITENAME}} ti abilidad nga agpartuat kadagiti baro a panid.\nMabalinmo ti agsubli ken agurnos ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agapartuat iti pakabilangan]].",
        "nocreate-loggedin": "Awan ti pammalubosmo nga agpartuat kadagiti baro a panid.",
-       "sectioneditnotsupported-title": "Saan a nasuportaran ti panag-urnos ti paset",
-       "sectioneditnotsupported-text": "Saan a nasuportaran ti panag-urnos ti paset iti daytoy a panid.",
+       "sectioneditnotsupported-title": "Saan a nasuportaran ti panagurnos ti paset",
+       "sectioneditnotsupported-text": "Saan a nasuportaran ti panagurnos ti paset iti daytoy a panid.",
        "permissionserrors": "Biddut ti pammalubos",
        "permissionserrorstext": "Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:",
        "permissionserrorstext-withaction": "Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:",
        "recreate-moveddeleted-warn": "<strong>Ballaag: Agparpartuatka manen ti dati a naikkat a panid.</strong>\n\nUsigem koma no maitutop ti agtuloy nga agurnos iti daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
        "moveddeleted-notice": "Naikkaten daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
        "log-fulllog": "Kitaem ti napno a listaan",
-       "edit-hook-aborted": "Ti panag-urnos ket pinasardeng babaen ti kawit.\nAwan ti intedna a palawag.",
+       "edit-hook-aborted": "Ti panagurnos ket pinasardeng babaen ti kawit.\nAwan ti intedna a palawag.",
        "edit-gone-missing": "Saan a mapabaro daytoy a panid.\nKasla met naikkaten.",
-       "edit-conflict": "Kasinnungat ti panag-urnos.",
+       "edit-conflict": "Agsinnungat a panagurnos.",
        "edit-no-change": "Ti inurnosmo ket saan a naikaskaso ngamin ket awan ti naaramid a pannakasukat iti testo.",
-       "postedit-confirmation-created": "Ti panid ket napartuaten.",
-       "postedit-confirmation-restored": "Ti panid ket naipulangen.",
-       "postedit-confirmation-saved": "Ti inurnosmo ket naidulinen.",
-       "edit-already-exists": "Saan a makaaramid ti baro a panid.\nAdda met daytoyen.",
+       "postedit-confirmation-created": "Napartuaten ti panid.",
+       "postedit-confirmation-restored": "Naipulangen ti panid.",
+       "postedit-confirmation-saved": "Naidulinen ti inurnosmo.",
+       "edit-already-exists": "Saan a makapartuat iti baro a panid.\nAdda met daytoyen.",
        "defaultmessagetext": "Kasisigud a testo ti mensahe",
        "content-failed-to-parse": "Napaay a mawaswas ti $2 a linaon para iti $1 a modelo: $3",
        "invalid-content-data": "Imbalido a datos ti linaon",
        "content-model-text": "naranas a testo",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "<strong>Ballaag:</strong> Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an a panagtawtawag.\n\nAdda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan iti $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
-       "expensive-parserfunction-category": "Dagiti panid nga adda ti adu unay a nangina a parser a pamay-an a panagtawtawag",
+       "duplicate-args-category": "Pampanid nga agus-usar kadagiti duplikado nga argumento kadagiti panagtawag ti plantilia",
+       "duplicate-args-category-desc": "Ti panid ket aglaon kadagiti panagtawag ti plantilia nga agus-usar kadagiti duplikado dagiti argumento, a kas ti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> wenno <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti adu unay kadagiti panagtawag ti nangina a parser.\n\nAdda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan iti $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
+       "expensive-parserfunction-category": "Dagiti panid nga addaan iti adu unay kadagiti panagtawag ti nangina a parser",
        "post-expand-template-inclusion-warning": "<strong>Ballaag:</strong> Dakkel unay ti nairaman a kadakkel ti plantilia.\nAdda dagiti plantilia a saanto a mairaman.",
        "post-expand-template-inclusion-category": "Pampanid nga ayan ti plantilia a nagsobra ti kadakkel ti rukod a nairaman",
        "post-expand-template-argument-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.\nDagitoy nga argumento ket saanen a nairaman.",
-       "post-expand-template-argument-category": "Pampanid a naglaon dagiti saan a nairaman nga argumento ti plantilia",
-       "parser-template-loop-warning": "Nakaduktal ti silo ti plantilia: [[$1]]",
+       "post-expand-template-argument-category": "Pampanid a naglaon kadagiti saan a nairaman nga argumento ti plantilia",
+       "parser-template-loop-warning": "Nakaduktal iti silo ti plantilia: [[$1]]",
        "parser-template-recursion-depth-warning": "Nalabsan ti patingga ti panagdullit ti kinauneg ti plantilia ($1)",
        "language-converter-depth-warning": "Nalabsan ti patingga ti pagbaliwen a kinauneg ti pagsasao ($1)",
-       "node-count-exceeded-category": "Dagiti panid a simmurok ti bilang ti nodo",
-       "node-count-exceeded-category-desc": "Ti kategoria para kadagiti panid a nalabsan ti bilang ti nodo.",
+       "node-count-exceeded-category": "Dagiti panid a nakasurokan ti bilang ti nodo",
+       "node-count-exceeded-category-desc": "Ti panid ket nasurokanna ti kaaduan a bilang ti nodo.",
        "node-count-exceeded-warning": "Ti panid ket nasurokanna ti bilang ti nodo",
-       "expansion-depth-exceeded-category": "Dagiti panid a nasurokan ti kauneg ti panagpadakkel",
-       "expansion-depth-exceeded-category-desc": "Daytoy ket kategoria para kadagiti panid a nalabsan ti kauneg ti panagpadakkel.",
+       "expansion-depth-exceeded-category": "Pampanid a nasurokan ti kauneg ti panagpadakkel",
+       "expansion-depth-exceeded-category-desc": "Ti panid ket nasurokanna ti kaaduan ti kauneg ti panagpadakkel.",
        "expansion-depth-exceeded-warning": "Ti panid ket nasurokanna ti kauneg ti panagpadakkel",
        "parser-unstrip-loop-warning": "Nakaduktal ti di-naukisan a silo",
        "parser-unstrip-recursion-limit": "Nalabsan ti patingga ti panagdullit ti di-naukisan ($1)",
        "cantcreateaccount-text": "Ti panagpartuat ti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
        "cantcreateaccount-range-text": "Ti panagpartuat ti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti '''$1''', a mairaman ti IP a pagtaengam ('''$4'''), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket ''$2''",
        "viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
-       "nohistory": "Awan ti pakasaritaan ti panag-urnos iti daytoy a panid.",
+       "nohistory": "Awan ti pakasaritaan ti panagurnos iti daytoy a panid.",
        "currentrev": "Kinaudi a rebision",
        "currentrev-asof": "Kinaudi a rebision manipud idi $1",
        "revisionasof": "Rebision manipud idi $1",
        "rev-deleted-comment": "(naikkat ti pakabuklan ti inurnos)",
        "rev-deleted-user": "(naikkat ti nagan ti agar-aramat)",
        "rev-deleted-event": "(naikkat ti listaan ti tignay)",
-       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontributor]",
+       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontribusion]",
        "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
        "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
        "revdelete-text-file": "Dagiti naikkat a bersion ti papeles ket agparangto pay laeng iti pakasaritaan ti papeles, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "logdelete-text": "Dagiti naikkat a listaan ti pasamak ket agparangto pay laeng kadagiti listaan, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "revdelete-text-others": "Dagiti sabali nga administrador ket mabalindanto pay laeng a maserrekan ti nailemmeng a linaon ken mangisubli daytoy, malaksid no adda dagiti maipatinayon a maisaad a panangigawid.",
-       "revdelete-confirm": "Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ken araramidem daytoy segun [[{{MediaWiki:Policy-url}}|ti annuroten]].",
+       "revdelete-confirm": "Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ken ar-aramidem daytoy segun [[{{MediaWiki:Policy-url}}|ti annuroten]].",
        "revdelete-suppress-text": "Ti panagdepdep ket usaren <strong>laeng</strong> kadagiti sumaganad a kaso;\n* Makapataud ti libelo a pakaammo\n* Di maiparbeng a personal a pakaammo\n* : <em>dagiti adres ti balay ken numero ti telepono, dagiti numero ti nailian a pakaipakaammuan, kdpy.</em>",
        "revdelete-legend": "Isaad dagiti panangigawid ti panagkita",
        "revdelete-hide-text": "Testo ti rebision",
        "mergehistory-from": "Taudan ti panid:",
        "mergehistory-into": "Pangipanan a panid:",
        "mergehistory-list": "Mabalin nga itipon a pakasaritaan ti inurnos",
-       "mergehistory-merge": "Dagiti sumaganad a rebision iti [[:$1]] ket mabalin nga itipon iti [[:$2]].\nUsaren ti radio a buton a tukol ti panagtipon iti laeng panagbaliw a napartuat iti ken sakbay ti nainagan nga oras.\nLaglagipen a ti panag-usar kadagiti silpo ti pagdaliasatan ket mangisaad manen iti daytoy a batong.",
-       "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panag-urnos",
+       "mergehistory-merge": "Dagiti sumaganad a rebision iti [[:$1]] ket mabalin nga itipon iti [[:$2]].\nUsaren ti radio a buton a tukol ti panagtipon iti laeng panagbaliw a napartuat iti ken sakbay ti nainagan nga oras.\nLaglagipen a ti panagusar kadagiti silpo ti pagdaliasatan ket mangisaad manen iti daytoy a batong.",
+       "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panagurnos",
        "mergehistory-submit": "Pagtitiponen dagiti rebision",
        "mergehistory-empty": "Awan dagiti rebision ti mabalin nga itipon.",
        "mergehistory-success": "$3 {{PLURAL:$3|a rebision|dagiti rebision}} iti [[:$1]] ket nagballigi a naitipon iti [[:$2]].",
        "searchprofile-everything-tooltip": "Birukem amin a linaon (uray dagiti tungtungan a panid)",
        "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a nagan ti espasio",
        "search-result-size": "$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})",
-       "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2  a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
+       "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2 a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
        "search-redirect": "(baw-ing ti $1)",
        "search-section": "(paset $1)",
+       "search-category": "(kategoria $1)",
        "search-file-match": "(maipada ti linaon a papeles)",
        "search-suggest": "Daytoy kadi: $1",
        "search-interwiki-caption": "Dagiti kakabsat a gandat",
        "searchall": "amin",
        "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti <strong>1</strong> a nagbanagan|dagiti <strong>$1</strong> a nagbanagan}} a mangrugi ti #<strong>$2</strong>.",
        "showingresultsinrange": "Mangipakpakita aginggana {{PLURAL:$1|iti <strong>1</strong> a resulta|dagiti <strong>$1</strong> a resulta}} iti sakop ti #<strong>$2</strong> aginggana ti #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Nagbanagan a <strong>$1</strong> iti <strong>$3</strong>|Dagiti nagbanagan a <strong>$1 - $2</strong> iti <strong>$3</strong>}}",
        "search-nonefound": "Awan dagiti nagbanagan a maipada ti usisa.",
        "powersearch-legend": "Napasayat a panagbiruk",
        "powersearch-ns": "Agbiruk kadagiti nagan ti espasio:",
        "powersearch-togglenone": "Awan",
        "powersearch-remember": "Lagipen ti napili para kadagiti masakbayan a panagbiruk",
        "search-external": "Akinruar a panagbiruk",
-       "searchdisabled": "Ti panagbiruk iti {{SITENAME}} ket nabaldado.\nMabalinmo ti agbiruk idiay Google tattan.\nLaglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.",
+       "searchdisabled": "Nabaldado ti panagbiruk iti {{SITENAME}}.\nMabalinmo itan ti agbiruk idiay Google.\nLaglagipem laeng a dagiti pagsurotan a linaon ti {{SITENAME}} ket mabalin a baak.",
        "search-error": "Adda maysa a biddut a napasamak bayat nga agbirbiruk:$1",
        "preferences": "Kakaykayatan",
        "mypreferences": "Kakaykayatan",
        "prefs-edits": "Bilang dagiti inurnos:",
-       "prefsnologintext2": "Pangngaasi a $1 tapno mabaliwan dagiti kakaykayatam.",
+       "prefsnologintext2": "Pangngaasi a sumrek tapno mabaliwan dagiti kakaykayatam.",
        "prefs-skin": "Kudil",
        "skin-preview": "Ipadas",
        "datedefault": "Awan ti kakaykayatan",
        "gender-female": "Isuna ket babai nga agur-urnos ti pampanid ti wiki",
        "prefs-help-gender": "Ti panangisaad daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar iti pategna tapno tawagannaka ken ibaganaka kadagiti sabali nga agus-usar iti maitunos gramatika ti henero.\nDaytoy a pakaammo ket makitanto iti publiko.",
        "email": "Esurat",
-       "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNgem no kayatmo nga ited, maaramatto daytoy a kas pammadayaw ken pangpatalged para iti obram.",
+       "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNo maited, mabalin a maaramatto a panangited iti pammadayaw kenka iti obram.",
        "prefs-help-email": "Ti esurat a pagtaengan ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
        "prefs-help-email-others": "Mabalinmo pay ti agpili tapno dagiti sabali nga agar-aramat ket mabalin nga esuratandaka babaen ti silpo ti panidmo wenno ti panid ti tungtungam.\nTi esurat a pagtaengam ket saan a maipakita no agkontak kenka dagiti agar-aramat.",
        "prefs-help-email-required": "Masapul ti esurat a pagtaengan.",
        "prefs-tokenwatchlist": "Tandaan",
        "prefs-diffs": "Paggigiddiatan",
        "prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
+       "prefswarning-warning": "Nagaramikka kadagiti panagbalbaliw kadagiti kakaykayatam a saan pay a naidulin.\nNo panawan daytoy a panid a saan nga agpindut iti \"$1\" dagiti kakaykayatam ket saanto a mapabaro.",
        "prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
        "email-address-validity-valid": "Ti esurat a pagtaengan ket kasla umiso",
        "email-address-validity-invalid": "Ikabil ti umiso nga esurat a pagtaengan",
        "userrights-lookup-user": "Agtaripato kadagiti grupo ti agar-aramat",
        "userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
        "editusergroup": "Urnosen dagiti grupo ti agar-aramat",
-       "editinguser": "Suksukatan ti karbengan ti agar-aramat ni '''[[User:$1|$1]]''' $2",
+       "editinguser": "Suksukatan ti karbengan ti agar-aramat ni <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Urnosen dagiti grupo ti agar-aramat",
        "saveusergroups": "Idulin dagiti grupo ti agar-aramat",
        "userrights-groupsmember": "Kameng iti:",
        "right-suppressrevision": "Agkita, agilemmeng ken agisubli ti pannakakita dagiti naisangayan a rebision dagiti panid manipud ti sinoman nga agar-aramat",
        "right-viewsuppressed": "Agkita kadagiti rebision a nailemmeng manipud ti sinoman nga agar-aramat",
        "right-suppressionlog": "Agkita kadagiti pribado a listaan",
-       "right-block": "Agserra kadagiti sabali nga agar-aramat manipud iti panag-urnos",
+       "right-block": "Agserra kadagiti sabali nga agar-aramat manipud iti panagurnos",
        "right-blockemail": "Agserra iti agar-aramat manipud ti panagipatulod ti esurat",
        "right-hideuser": "Agserra iti nagan ti agar-aramat, ken agilemmeng manipud ti publiko",
        "right-ipblock-exempt": "Labsanna dagiti serra ti IP, dagiti automatiko a serra ken dagiti sakop a serra.",
        "right-proxyunbannable": "Labsanna dagiti automatiko a serra dagiti pannakbagi",
-       "right-unblockself": "Bukod nga agikkat it pannaka-serra",
+       "right-unblockself": "Bukod nga agikkat it pannakaserra",
        "right-protect": "Agsukat kadagiti agpang ti salaknib ken agurnos kadagiti nasalakniban ti sariap a panid",
        "right-editprotected": "Agurnos kadagiti panid a nasalakniban a kas \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Agurnos kadagiti panid a nasalakniban a kas \"{{int:protect-level-autoconfirmed}}\"",
        "action-browsearchive": "agbiruk kadagiti naikkat a panid",
        "action-undelete": "agisubli iti pannakaikkat iti daytoy a panid",
        "action-suppressrevision": "agrepaso ken agisubli iti daytoy a nailemmeng a rebision",
-       "action-suppressionlog": "agkita iti daytoy a pribalo a listaan",
-       "action-block": "agserra iti daytoy nga agar-aramat manipud ti panag-urnos",
+       "action-suppressionlog": "agkita iti daytoy a pribado a listaan",
+       "action-block": "agserra iti daytoy nga agar-aramat manipud ti panagurnos",
        "action-protect": "mangsukat kadagiti lessaad ti salaknib para iti daytoy a panid",
        "action-rollback": "napardas a mangisubli kadagiti inurnos ti kinaudi nga agar-aramat a nagurnos iti naisangsangayan a panid",
        "action-import": "agala ti pampanid manipud ti sabali a wiki",
        "recentchanges-summary": "Siputen ti kaudian a balbaliw iti wiki iti daytoy a panid.",
        "recentchanges-noresult": "Awan ti nasuksukatan iti las-ud ti naited a paset ti panawen a kapada dagitoy a kriteria.",
        "recentchanges-feed-description": "Siputen ti kaudian a balbaliw iti wiki iti daytoy a pakan.",
-       "recentchanges-label-newpage": "Daytoy a panag-urnos ket nakapartuat iti baro a panid",
-       "recentchanges-label-minor": "Daytoy ket bassit a panag-urnos",
-       "recentchanges-label-bot": "Daytoy a panag-urnos ket inaramid babaen ti bot",
-       "recentchanges-label-unpatrolled": "Daytoy a panag-urnos ket saan pay a napatruliaan",
+       "recentchanges-label-newpage": "Daytoy a panagurnos ket nakapartuat iti baro a panid",
+       "recentchanges-label-minor": "Daytoy ket bassit a panagurnos",
+       "recentchanges-label-bot": "Daytoy a panagurnos ket inaramid babaen ti bot",
+       "recentchanges-label-unpatrolled": "Daytoy a panagurnos ket saan pay a napatruliaan",
        "recentchanges-label-plusminus": "Ti panagbaliw ti kadakkel ti panid babaen ti bilang dagiti byte",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
        "rcnotefrom": "Dita baba ket {{PLURAL:$5|ti sinukatan|dagiti sinukatan}} manipud idi <strong>$3, $4</strong> (aginggana iti <strong>$1</strong> a naipakita).",
        "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $2, $3",
-       "rcshowhideminor": "$1 dagiti bassit a panag-urnos",
+       "rcshowhideminor": "$1 dagiti bassit a panagurnos",
        "rcshowhideminor-show": "Ipakita",
        "rcshowhideminor-hide": "Ilemmeng",
        "rcshowhidebots": "$1 dagiti bot",
        "rcshowhideanons": "$1 dagiti di ammo nga agar-aramat",
        "rcshowhideanons-show": "Ipakita",
        "rcshowhideanons-hide": "Ilemmeng",
-       "rcshowhidepatr": "$1 dagiti napatrulian a panag-urnos",
+       "rcshowhidepatr": "$1 dagiti napatrulian a panagurnos",
        "rcshowhidepatr-show": "Ipakita",
        "rcshowhidepatr-hide": "Ilemmeng",
        "rcshowhidemine": "$1 dagiti inurnosko",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 nga agbuybuya {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}}]",
        "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\")",
-       "rc_categories_any": "Uray ania",
+       "rc_categories_any": "Ania man",
        "rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panag-sukat",
        "newsectionsummary": "/* $1 */ baro a paset",
        "rc-enhanced-expand": "Ipakita dagiti salaysay",
        "uploaderror": "Biddut ti panagikarga",
        "upload-recreate-warning": "<strong>Ballag: Ti papeles babaen ti dayta a nagan ket naikkat wenno naiyalis.</strong>\n\nTi listaan ti panagikkat ken panagiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
        "uploadtext": "Usaren ti porma dita baba tapno makaikarga iti papeles.\nTi panagkita wenno panagbiruk ti dati a naikarga a papeles mapan idiay [[Special:FileList|listaan dagiti naikarga a papeles]], dagiti naikarga wenno naikarga manen ket nailista pay idiay [[Special:Log/upload|listaan ti panagikarga]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].\n\nTi panangiraman ti papeles iti panid, usaren ti silpo a kas dagiti sumaganad a porma:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tapno mausar ti napno a bersion ti papeles \n* <strong><code><nowiki>[[</nowiki>{{ns:file<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> tapno mausar ti 200 a piksel a kalawa a panagiparang iti kanigid a margin nga addaan iti \"alt text\"a kas ti deskripsion\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> para iti dagus a panangisilpo iti papeles nga awan ti panangipakita ti papeles",
-       "upload-permitted": "Dagiti mapalubosan a kita ti papeles: $1.",
+       "upload-permitted": "Dagiti maipalubos a kita ti papeles: $1.",
        "upload-preferred": "Dagiti kaykayat a kita ti papeles: $1.",
        "upload-prohibited": "Dagiti maiparit a kita ti papeles: $1.",
        "uploadlogpage": "Listaan ti panagikarga",
        "filereuploadsummary": "Dagiti pannakasukat ti papeles:",
        "filestatus": "Kasasaad ti karbengan ti kopia:",
        "filesource": "Taudan:",
-       "ignorewarning": "Di ikaskaso ti ballaag ket idulin latta ti papeles",
-       "ignorewarnings": "Di ikaskaso dagiti aniaman a ballaag",
+       "ignorewarning": "Di ikaskaso ti ballaag ken idulin latta ti papeles",
+       "ignorewarnings": "Di ikaskaso dagiti ania man a ballaag",
        "minlength1": "Dagiti nagan ti papeles ket nasken a saan a basbassit ngem maysa a letra.",
        "illegalfilename": "Ti nagan ti papeles ti \"$1\" ket aglaon kadagiti karakter a saan a maipalubos kadagiti titulo ti panid.\nPangngaasi a naganan manen ti papeles ken padasen manen nga ikarga.",
        "filename-toolong": "Dagiti nagan ti papeles ket nasken a saan nga at-atiddog ngem dagiti 240 a byte.",
        "filetype-mime-mismatch": "Ti pagpa-atiddog ti papeles ti \".$1\" ket saan a maipada iti naduktalan a kita ti MIME iti papeles ($2).",
        "filetype-badmime": "Dagiti papeles a kita ti MIME ti \"$1\" ket saan a maipalubos a maikarga.",
        "filetype-bad-ie-mime": "Saan a maikarga daytoy a papeles gapu ta maduktalan ti Internet Explorer a kas \"$1\", a saan a maipalubos ken makapataud ti dakes a kita ti papeles.",
-       "filetype-unwanted-type": "Ti <strong>\".$1\"</strong> ket mays a di kayat a kita ti papeles.\nTi kaykayat {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
+       "filetype-unwanted-type": "Ti <strong>\".$1\"</strong> ket maysa a di kayat a kita ti papeles.\nTi kaykayat {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
        "filetype-banned-type": "Ti <strong>\".$1\"</strong> {{PLURAL:$4|ket saan a maipalubos a kita ti papeles|ket dagiti saan a maipalubos a kita ti papeles}}.\nTi mapalubosan {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
        "filetype-missing": "Daytoy a papeles ket awan ti pagpaatiddogna (kasla ti \".jpg\").",
        "empty-file": "Ti papeles nga intedmo ket awan linaonna.",
        "illegal-filename": "Ti nagan ti papeles ket saan a maipalubos.",
        "overwrite": "Saan a maipalubos ti mangsurat manen iti addan a papeles.",
        "unknown-error": "Napasamak ti maysa a di ammo a biddut.",
-       "tmp-create-error": "Saan a makapartuat ti temporario a papeles.",
+       "tmp-create-error": "Saan a makapartuat iti temporario a papeles.",
        "tmp-write-error": "Biddut ti panagsurat iti temporario a papeles.",
        "large-file": "Maisingasing a dagiti papeles ket saan a dakdakkel ngem $1;\ndaytoy a papeles ket $2.",
        "largefileserver": "Daytoy a papeles ket dakdakel ngem ti ipalubos a pannakaaramid ti server.",
        "uploaddisabledtext": "Nabaldado dagiti panagikarga ti papeles.",
        "php-uploaddisabledtext": "Dagiti panangikarga ti papeles ket nabaldado iti PHP.\nPanngaasi a kitaem ti pannakaisaad ti panagikarga ti papeles.",
        "uploadscripted": "Daytoy a papeles ket naglaon ti HTML wenno eskritu ti kodigo a mabalin a kamali nga inpatarus babaen ti pagbasabasa ti web.",
-       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon ti maysa a saan a mabalin a nagan ti espasio ti \"$1\"",
+       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon ti maysa a saan a mabalin a nagan ti espasio ti \"$1\".",
        "uploadinvalidxml": "Ti XML iti naikarga a papeles ket saan a maiwaswas.",
        "uploadvirus": "Ti papeles ket aglaon ti birus! \nDagiti salaysay: $1",
        "uploadjava": "Daytoy a papeles ket papeles ti ZIP nga aglaon ti Java .a klase ti papeles.\nTi panangikarga ti papales ti Java ket saan a maipalubos gapu ta makapataudda a manglabas kadagiti panangigawid ti seguridad.",
        "uploadstash-summary": "Daytoy a panid ket mangited ti panagserrek kadagiti papeles a naikarga wenno mangrugrugi iti proseso a maikarga, ngem saan pay a naipablaak iti wiki. Dagitoy a papeles ket saan a makita ti sinoman ngem ti laeng agar-aramat a nagikarga kaniada.",
        "uploadstash-clear": "Dalusan dagiti na-stash a papeles",
        "uploadstash-nofiles": "Awan ti na-stash a papelesmo.",
-       "uploadstash-badtoken": "Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talekmo ti panag-urnos ket nagpason. Padasen manen.",
+       "uploadstash-badtoken": "Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talekmo ti panagurnos ket nagpason. Padasen manen.",
        "uploadstash-errclear": "Ti panagdalus kadagiti papeles ket napaay.",
        "uploadstash-refresh": "Pasadiwaen dagiti listaan ti papeles",
        "invalid-chunk-offset": "Imbalido a pirgis ti timbengan",
        "filehist-dimensions": "Dagiti rukod",
        "filehist-filesize": "Kadakkel ti papeles",
        "filehist-comment": "Komentario",
-       "imagelinks": "Panag-usar ti papeles",
+       "imagelinks": "Panagusar iti papeles",
        "linkstoimage": "Ti sumaganad {{PLURAL:$1|a silsilpo ti panid|kadagiti $1 a silpo ti pampanid}} iti daytoy a papeles:",
        "linkstoimage-more": "Ad-adu ngem $1 {{PLURAL:$1|a silsilpo ti panid|a silpo ti pampanid}} iti daytoy a papeles.\nTi sumaganad a listaan ket mangipakita {{PLURAL:$1|ti umona a silpo ti panid|kadagiti umuna a $1 a silsilpo ti panid}} iti daytoy laeng a papeles.\nMagun-od ti [[Special:WhatLinksHere/$2|kompleto a listaan]].",
        "nolinkstoimage": "Awan ti pampanid a nakasilpo iti daytoy a papeles.",
        "randomincategory": "Pugto a panid iti kategoria",
        "randomincategory-invalidcategory": "Ti \"$1\" ket saan nga umisu a nagan ti kategoria.",
        "randomincategory-nopages": "Awan ti pampanid iti kategoria ti [[:Category:$1]].",
+       "randomincategory-category": "Kategoria:",
+       "randomincategory-legend": "Pugto a panid iti kategoria",
        "randomredirect": "Pugto a baw-ing",
        "randomredirect-nopages": "Awan dagiti baw-ing iti daytoy a nagan ti espasio ti \"$1\".",
        "statistics": "Estadistika",
        "statistics-header-pages": "Estadistika ti panid",
-       "statistics-header-edits": "Estadistika ti panag-urnos",
+       "statistics-header-edits": "Estadistika ti panagurnos",
        "statistics-header-users": "Estadistika ti agar-aramat",
        "statistics-header-hooks": "Sabali nga estadistika",
        "statistics-articles": "Dagiti naglaon a panid",
        "withoutinterwiki-submit": "Ipakita",
        "fewestrevisions": "Dagiti panid nga adda kadagiti kabassitan a rebision",
        "nbytes": "$1 {{PLURAL:$1|a byte|dagiti byte}}",
-       "ncategories": "$1 {{PLURAL:$1|a kategoria|a katkategoria}}",
+       "ncategories": "$1 a {{PLURAL:$1|kategoria|katkategoria}}",
        "ninterwikis": "$1 {{PLURAL:$1|nga interwiki|dagiti interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|a silpo|kadagiti silpo}}",
-       "nmembers": "$1 {{PLURAL:$1|a kameng|kamkameng}}",
-       "nmemberschanged": "$1 → $2 {{PLURAL:$2|kameng|kamkameng}}",
+       "nmembers": "$1 a {{PLURAL:$1|kameng|kamkameng}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|kameng|kamkameng}}",
        "nrevisions": "$1 {{PLURAL:$1|a rebison|kadagiti rebision}}",
        "nviews": "$1 {{PLURAL:$1|a panangkita|kadagiti panangkita}}",
-       "nimagelinks": "Inusar iti $1 {{PLURAL:$1|a panid|a pampanid}}",
-       "ntransclusions": "inusar iti $1 {{PLURAL:$1|a panid|a pampanid}}",
+       "nimagelinks": "Inusar iti $1 a {{PLURAL:$1|panid|pampanid}}",
+       "ntransclusions": "inusar iti $1 a {{PLURAL:$1|panid|pampanid}}",
        "specialpage-empty": "Awan dagiti nagbanagan daytoy a reporta.",
        "lonelypages": "Dagiti naulila a panid",
        "lonelypagestext": "Dagiti sumaganad a panid ket saan a nakasilpo wenno nailak-am kadagiti sabali a panid iti {{SITENAME}}.",
        "wantedtemplates": "Dagiti makiddaw a plantilia",
        "mostlinked": "Dagiti panid a kaaduan iti nakasilpo",
        "mostlinkedcategories": "Dagiti kategoria a kaaduan iti nakasilpo",
-       "mostlinkedtemplates": "Kaaduan a nailak-am a pampanid",
+       "mostlinkedtemplates": "Dagiti panid a kaaduan a nailak-am",
        "mostcategories": "Dagiti panid a kaaduan kadagiti kategoria",
        "mostimages": "Dagiti papeles a kaaduan iti nakasilpo",
        "mostinterwikis": "Dagiti panid a kaaduan kadagiti interwiki",
        "mostrevisions": "Dagiti artikulo a kaaduan kadagiti rebision",
-       "prefixindex": "Dagiti amin a panid nga addaan iti pasaruno",
+       "prefixindex": "Amin a pampanid nga addaan iti pasaruno",
        "prefixindex-namespace": "Amin a pampanid nga addaan iti pasaruno (nagan ti espasio ti $1)",
        "prefixindex-strip": "Ikkaten ti pasaruno iti listaan",
        "shortpages": "Dagiti ababa a panid",
        "protectedpages-timestamp": "Petsa ken oras",
        "protectedpages-page": "Panid",
        "protectedpages-expiry": "Agpaso",
-       "protectedpages-performer": "Salakniban ti agar-aramat",
+       "protectedpages-performer": "Nangsalaknib nga agar-aramat",
        "protectedpages-params": "Dagiti parametro ti panagsalaknib",
        "protectedpages-reason": "Rason",
        "protectedpages-unknown-timestamp": "Di ammo",
        "pager-older-n": "{{PLURAL:$1|nadadaan a 1|nadadaan a $1}}",
        "suppress": "Pakapansin",
        "querypage-disabled": "Daytoy nga espesial a panid ket nabaldado gapu kadagiti rason ti kasayaat ti panagpataray.",
+       "apihelp": "Tulong ti API",
+       "apihelp-no-such-module": "Saan a nabirukan ti modulo ti \"$1\".",
        "booksources": "Dagiti taudan ti libro",
        "booksources-search-legend": "Agbiruk para kadagiti taudan ti libro",
+       "booksources-search": "Biruken",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
        "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
        "specialloguserlabel": "Perpormer:",
        "trackingcategories-msg": "Pagsurotan a kategoria",
        "trackingcategories-name": "Nagan ti mensahe",
        "trackingcategories-desc": "Kriteria ti panangiraman ti kategoria",
-       "noindex-category-desc": "Ti panid ket saan naipagsurotan babaen dagiti robot gapu ta addaan iti salamangka a balikas ti <code><nowiki>__NOINDEX__</nowiki></code> ken adda iti nagan ti espasio a maipalubos ti wagayway.",
+       "noindex-category-desc": "Ti panid ket saan naipagsurotan babaen dagiti robot gapu ta addaan iti salamangka a balikas iti <code><nowiki>__NOINDEX__</nowiki></code> ken adda iti nagan ti espasio a maipalubos ti wagayway.",
        "index-category-desc": "Ti panid ket addaan iti <code><nowiki>__INDEX__</nowiki></code> (ken adda iti nagan ti espasio a maipalubos ti wagayway), ken isu a naipagsurotan babaen dagiti robot ngem no iti kadawyan ket saan.",
-       "post-expand-template-inclusion-category-desc": "Kalpasan ti panagpadakkel kadagiti amin a plantilia, ti kadakkel ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>, isu a dagiti plantilia ket saan a napadakkel.",
-       "post-expand-template-argument-category-desc": "Kalpasan ti panagpadakkel ti argumento ti plantilia (dagiti addaan iti tallo a pangrikep, kasla ti <code>{{{Foo}}}</code>), ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Adu unay dagiti nangina nga annong ti parser (kasla ti <code>#ifexist</code>) a nairaman iti panid. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Kategoria a nainayon no ti panid ket aglaon ti nadadael a silpo ti papeles (ti silpo a panangisengngat ti papeles no awan ti papeles).",
-       "hidden-category-category-desc": "Daytoy ket kategoria nga addaan iti <code><nowiki>__HIDDENCAT__</nowiki></code> , a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid, babaen ti kasisigud.",
+       "post-expand-template-inclusion-category-desc": "Ti kadakkel ti panid ket dakdakkel ngem <code>$wgMaxArticleSize</code> kalpasan ti panangipadakkel amin dagiti plantilia, isu nga adda met dagiti plantilia a saan a naipadakkel",
+       "post-expand-template-argument-category-desc": "Ti panid ket dakdakkel ngem <code>$wgMaxArticleSize</code> kalpasan ti panagpadakkel ti argumento (kasla banag kadagiti tallo a pangrikep, kasla ti <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Ti panid ket agus-usar iti adu unay kadagiti annong ti nangina a parser (kasla ti <code>#ifexist</code>) a nairaman iti panid. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Ti panid ket aglaon ti nadadael a silpo ti papeles (ti silpo a panangisengngat ti papeles no awan ti papeles).",
+       "hidden-category-category-desc": "Ti kategoria ket aglaon ti <code><nowiki>__HIDDENCAT__</nowiki></code> iti panid a linaonna, a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid babaen ti kasisigud.",
        "trackingcategories-nodesc": "Awan ti magun-od a deskripsion.",
        "trackingcategories-disabled": "Nabaldado ti kategoria",
        "mailnologin": "Awan ti pagipatulodan a pagtaengan",
        "emailuser-title-target": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "emailuser-title-notarget": "Esuratan ti agar-aramat",
        "emailpage": "Esuratan ti agar-aramat",
-       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod ti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapu\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
+       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
        "defemailsubject": "Esurat ti {{SITENAME}} a naggapo kenni \"$1\"",
        "usermaildisabled": "Saanmo a mabalin ti agipatulod ti esurat",
        "usermaildisabledtext": "Saanmo a mabalin ti agipatulod ti esurat kadagiti sabali nga agar-aramat iti daytoy a wiki",
        "mywatchlist": "Bambantayan",
        "watchlistfor2": "Para iti $1 $2",
        "nowatchlist": "Awan ti banag iti listaan dagiti bambantayam.",
-       "watchlistanontext": "Pangngaasim ti $1 tapno makitam dagiti inurnosmo dita bambantayam.",
+       "watchlistanontext": "Pangngaasi a sumrek tapno makitam dagiti inurnosmo dita bambantayam.",
        "watchnologin": "Saan a nakastrek",
        "addwatch": "Inayon iti listaan ti bambantayan",
        "addedwatchtext": "Ti panid iti \"[[:$1]]\" ket nainayonen idiay [[Special:Watchlist|listaan ti bambantayam]].\nDagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunganna a panid ket mailistanto idiay.",
        "enotif_body_intro_moved": "Ti {{SITENAME}} a panid ti $1 ket naiyalisen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
        "enotif_body_intro_restored": "Ti {{SITENAME}} a panid ti $1 ket naipulangen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
        "enotif_body_intro_changed": "Ti {{SITENAME}} a panid ti $1 ket nasukatanen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
-       "enotif_lastvisited": "Kitaen ti $1 para iti am-amin a panagsukat sipud ti naudi nga isasarungkarmo.",
+       "enotif_lastvisited": "Kitaen ti $1 para iti amin a panagsukat sipud ti naudi nga isasarungkarmo.",
        "enotif_lastdiff": "Kitaen ti $1 tapno mabuya daytoy a panagsukat.",
        "enotif_anon_editor": "di am-ammo nga agar-aramat $1",
        "enotif_body": "Nadungngo a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nPakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaken ti mannurat:\nsurat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAwanton dagiti sabali a pakaammo iti kaso ti adu pay a panagtigtignay malaksid no sarungkaram datoy a panid bayat a nakastrekka. Mabalinmo pay nga isaad manen dagiti wagayway ti pakaammo para kadagiti amin a bambantayam a panid idiay listaan ti bambantayam.\n\nTi mannakigayyem a sistema ti panagpaammo ti {{SITENAME}} \n\n--\nTi panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti\n{{canonicalurl:{{#special:Preferences}}}}\n\nTi panagsukat kadagiti kasasaad ti listaan ti bambantayam, sarungkaram ti\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTi panagikkat ti panid kadagiti listaan ti bambantayam, sarungkaram ti\n$UNWATCHURL\n\nTi makunkunam ken no masapulmo pay ti tulong:\n$HELPPAGE",
        "exbeforeblank": "ti linaon sakbay idi nablanko ket: \"$1\"",
        "delete-confirm": "Ikkaten ti \"$1\"",
        "delete-legend": "Ikkaten",
-       "historywarning": "<strong>Ballaag:</strong> Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna ti agarup a $1 {{PLURAL:$1|a rebision|kadagiti rebision}}:",
-       "confirmdeletetext": "Mangrugrugika a mangikkat ti maysa a panid a kakuyogna amin ti pakasaritaanna.\nPangngaasi a pasingkedam a talaga a kayatmo nga aramiden daytoy, a maawatam ti bunga ti panangikkatmo, ken aramidem daytoy kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].",
+       "historywarning": "<strong>Ballaag:</strong> Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna iti $1 {{PLURAL:$1|a rebision|kadagiti rebision}}:",
+       "confirmdeletetext": "Mangrugrugika a mangikkat iti maysa a panid a kakuyog amin ti pakasaritaanna.\nPangngaasi a pasingkedam a naikeddeng a kayatmo nga aramiden daytoy, a maawatam ti pagbnagan ti panangikkatmo, ken aramidem daytoy a kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].",
        "actioncomplete": "Nalpasen ti aramid",
        "actionfailed": "Napaay ti aramid",
        "deletedtext": "Naikkaten ti \"$1\".\nKitaen ti $2 para iti pannakairehistro dagiti naudi a pangikkat.",
        "deletereason-dropdown": "* Kadawyan a rasrason ti panagikkat\n** Spam\n** Bandalismo\n** Panaglabsing iti karbengan ti kopia\n** Kiddaw ti mannurat\n** Naputed a baw-ing",
        "delete-edit-reasonlist": "Urnosen dagiti rason ti panagikkat",
        "delete-toobig": "Daytoy a panid ket dakkel ti pakasaritaanna, sumurok a  $1 {{PLURAL:a panagbaliwan|dagiti panagbaliwan}}.\nTi panagikkat ti kastoy a pammpanid ket naparitan tapno mapawilan ti saan nga inkarkaro a pannakadadael ti {{SITENAME}}.",
-       "delete-warning-toobig": "Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panag-urnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.\nTi panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};\nagal-aluadka a mangrugi.",
+       "delete-warning-toobig": "Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panagurnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.\nTi panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};\nagal-aluadka a mangrugi.",
+       "deleteprotected": "Saanmo a maikkat daytoy a panid gapu ta nasalaknibanen.",
        "deleting-backlinks-warning": "'''Ballaag:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Dagiti dadduma a panid]] ket naisilpo wenno nailak-am manipud ti panid a gangani nga ikkatem.",
-       "rollback": "Isubli dagiti panag-urnos",
+       "rollback": "Isubli dagiti panagurnos",
        "rollback_short": "Isubli",
        "rollbacklink": "isubli",
        "rollbacklinkcount": "agisubli ti $1 {{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "rollbackfailed": "Napaay ti panangisubli",
        "cantrollback": "Saan a maisubli ti panagurnos;\nti naudi a nakaaramid ket iti laeng nagsurat iti daytoy a panid.",
        "alreadyrolled": "Saan a maipasubli ti kinaudi a panagurnos iti [[:$1]] babaen ni [[User:$2|$2]] ([[User talk:$2|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nadda sabali a naurnos wenno nagipasubli ti panid.\n\nTi kinaudi a panagurnos ti daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Ti pakabuklan ti panag-urnos idi ket: \"''$1''\".",
-       "revertpage": "Insubli ti panag-urnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a rebision babaen ni [[User:$1|$1]]",
+       "editcomment": "Ti pakabuklan ti panagurnos idi ket: \"''$1''\".",
+       "revertpage": "Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a rebision babaen ni [[User:$1|$1]]",
        "revertpage-nouser": "Naisubli dagiti inurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a rebision babaen ni {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Naibabawi dagiti panag-urnos babaen ni $1;\nnaisubli manen ti naudi a rebision babaen ni $2.",
+       "rollback-success": "Naibabawi dagiti panagurnos babaen ni $1;\nnaisubli manen ti naudi a rebision babaen ni $2.",
        "sessionfailure-title": "Napaay ti sesion",
        "sessionfailure": "Adda parikut ti sesion ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti sesion.\nAgsublika iti naggapuam a panid, ikargam manen ti panid ken padasen manen.",
        "protectlogpage": "Listaan ti panagsalaknib",
        "protect-othertime": "Sabali nga oras:",
        "protect-othertime-op": "sabali nga oras",
        "protect-existing-expiry": "Ti adda a panagpaso ti oras: $3, $2",
+       "protect-existing-expiry-infinity": "Ti adda a panagpaso ti oras: inggana't inggana",
        "protect-otherreason": "Sabali/maipatinayon a rason:",
        "protect-otherreason-op": "Sabali a rason",
-       "protect-dropdown": "*Kadawyan a rasrason ti panagsalaknib\n** Adu unay a bandalismo\n** Adu unay a panagspam\n** Saan a produktibo ti agsinnungat a panag-urnos\n** Adu unay nga agbuybuya iti panid",
+       "protect-dropdown": "*Kadawyan a rasrason ti panagsalaknib\n** Adu unay a bandalismo\n** Adu unay a panagspam\n** Saan a produktibo ti agsinnungat a panagurnos\n** Adu unay nga agbuybuya iti panid",
        "protect-edit-reasonlist": "Urnosen dagiti rason ti salaknib",
        "protect-expiry-options": "1 nga oras:1 hour,1 nga aldaw:1 day,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "restriction-type": "Pammalubos:",
        "restriction-create": "Agpartuat",
        "restriction-upload": "Agikarga",
        "restriction-level-sysop": "napno a nasalakniban",
-       "restriction-level-autoconfirmed": "nasalakniban bassit",
+       "restriction-level-autoconfirmed": "nasalakniban-bassit",
        "restriction-level-all": "aniaman nga agpang",
        "undelete": "Kitaen dagiti naikkat a panid",
        "undeletepage": "Kitaen ken isubli dagiti naikkat a panid",
        "viewdeletedpage": "Kitaen dagiti naikkat a panid",
        "undeletepagetext": "Ti sumaganad a {{PLURAL:$1|panid ket naikkaten ngem|$1 pampanid ket naikkaten ngem}} adda pay naarkibo ken mabalin pay a maipasubli .\nTi arkibo ket mabalin a sagpaminsan a madalusan.",
        "undelete-fieldset-title": "Ipasubli dagiti rebision",
-       "undeleteextrahelp": "Tapno maipasubli ti intero a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken pinduten ti '''''{{int:undeletebtn}}'''''.\nTi agaramid ti napilian a panagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken pinduten ti '''''{{int:undeletebtn}}'''''.",
+       "undeleteextrahelp": "Tapno maipasubli ti intero a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken pinduten ti <strong><em>{{int:undeletebtn}}</em></strong>.\nTi agaramid ti napilian a panagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken pinduten ti <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naarkibo",
        "undeletehistory": "No ipasublim daytoy a panid, amin dagiti rebision ket maipasubli iti pakasaritaan.\nKet no adda baro a panid a kanagnaganna a naaramid ti napalabas a panagikkat, dagiti naipasubli a rebision ket agparang iti napalabas a pakasaritaan.",
        "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti rebision ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a rebision.",
        "autoblockid": "Auto a panagserra #$1",
        "block": "Seraan ti agar-aramat",
        "unblock": "Ikkaten ti serra ti agar-aramat",
-       "blockip": "Serraan ti agar-aramat",
+       "blockip": "Serraan ti {{GENDER:$1|agar-aramat}}",
        "blockip-legend": "Serraan ti agar-aramat",
-       "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a na-bandalismo) .",
+       "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a nabandalismo) .",
        "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Mangbutbuteng a panagkukua /mangriribok\n** Agab-abuso kadagiti nadumaduma a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
        "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud ti panagurnos manipud ti daytoy nga IP a pagtaengan",
        "ipbcreateaccount": "Pawilan ti panagpartuat iti pakabilangan",
-       "ipbemailban": "Pawilan ti agar-aramat nga agipatulod ti esurat",
+       "ipbemailban": "Pawilan ti agar-aramat nga agipatulod iti esurat",
        "ipbenableautoblock": "Automatiko a mangserra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan nga ayan ti pangipadasanda nga agurnos",
        "ipbsubmit": "Serraan daytoy nga agar-aramat",
        "ipbother": "Sabali nga oras:",
        "ipboptions": "2 nga oras:2 hours,1 nga aldaw:1 day,3 nga aldaw:3 days,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "ipbhidename": "Ilemmeng ti nagan ti agar-aramat kadagiti listaan ken inurnos",
-       "ipbwatchuser": "Bantayan ti panid ti agar-ramat ken panid ti tungtungan daytoy nga agar-aramat",
+       "ipbwatchuser": "Bantayan ti panid ti agar-aramat ken panid ti tungtungan daytoy nga agar-aramat",
        "ipb-disableusertalk": "Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid bayat a naserraan",
        "ipb-change-block": "Serraan manen ti agar-aramat kadagitoy a pannakaisaad",
        "ipb-confirm": "Pasingkedan ti serra",
        "ipb-unblock-addr": "Lukatan ti serra ni $1",
        "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan",
        "ipb-blocklist": "Kitaen dagiti adda a serra",
-       "ipb-blocklist-contribs": "Dagiti kontribusion para kenni $1",
+       "ipb-blocklist-contribs": "Dagiti kontribusion para kenni {{GENDER:$1|$1}}",
        "unblockip": "Lukatan ti serra ti agar-aramat",
        "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.",
        "ipusubmit": "Ikkaten daytoy a serra",
        "unblocked": "Naikkat ti pannakaserra ni [[User:$1|$1]].",
        "unblocked-range": "Naikkaten ti serra ti $1.",
        "unblocked-id": "Naikkaten ti serra ti $1.",
+       "unblocked-ip": "Naikkaten ti serra ni [[Special:Contributions/$1|$1]] .",
        "blocklist": "Dagiti naserraan nga agar-aramat",
        "ipblocklist": "Dagiti naserraan nga agar-aramat",
        "ipblocklist-legend": "Agbiruk ti naserraan nga agar-aramat",
        "expiringblock": "agpaso intono $1, $2",
        "anononlyblock": "di ammo laeng",
        "noautoblockblock": "nabaldado ti automatiko a serra",
-       "createaccountblock": "naserraan ti pannakapartuat ti pakabilangan",
+       "createaccountblock": "nabaldado ti pannakapartuat ti pakabilangan",
        "emailblock": "nabaldado ti esurat",
        "blocklist-nousertalk": "saan a mabalin nga agurnos ti bukod a tungtungan a panid",
        "ipblocklist-empty": "Awan linaon ti listaan ti serra.",
        "block-log-flags-nocreate": "nabaldado ti panagpartuat ti pakabilangan",
        "block-log-flags-noautoblock": "nabaldado ti automatiko a serra",
        "block-log-flags-noemail": "nabaldado ti esurat",
-       "block-log-flags-nousertalk": "saan a mabalin nga agurnos ti bukodna a tungtungan a panid",
+       "block-log-flags-nousertalk": "saan a mabalin nga agurnos iti bukodna a tungtungan a panid",
        "block-log-flags-angry-autoblock": "napakabaelan ti napasayaat nga automatiko a serra",
        "block-log-flags-hiddenname": "nailemmeng ti nagan ti agar-aramat",
        "range_block_disabled": "Ti abilidad ti administrador nga agpartuat ti nasakupan a serra ket nabaldado.",
        "pagemovedsub": "Balligi ti panangiyalis",
        "movepage-moved": "<strong>Naiyalisen ti \"$1\" iti \"$2\"</strong>",
        "movepage-moved-redirect": "Napartuaten ti maysa a baw-ing.",
-       "movepage-moved-noredirect": "Ti pannakapartuat ti baw-ing ket napasardeng.",
+       "movepage-moved-noredirect": "Napasardeng ti pannakapartuat ti baw-ing.",
        "articleexists": "Adda panid nga adda ti kastan a nagan, wenno ti nagan a pinilim ket saan a mabalin.\nPangngaasi nga agpili ti sabali a nagan.",
        "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud ti pannakapartuat",
        "movetalk": "Iyalis ti mainaig a panid ti tungtungan",
        "import": "Agala kadagiti panid",
        "importinterwiki": "Agala ti transwiki",
        "import-interwiki-text": "Agpilika ti wiki ken titulo ti panid nga alaem.\nDagiti rebision ti petsa ken dagiti nagan ti mannurat ket maipreserba.\nAmin a transwiki nga alaem ket mailista iti [[Special:Log/import|listaan ti panagala]].",
+       "import-interwiki-sourcewiki": "Taudan a wiki:",
+       "import-interwiki-sourcepage": "Taudan a panid:",
        "import-interwiki-history": "Kopiaen amin dagiti rebision ti pakasaritaan daytoy a panid",
        "import-interwiki-templates": "Iraman amin dagiti plantilia",
        "import-interwiki-submit": "Agala",
        "tooltip-pt-preferences": "Dagiti kakaykayatam",
        "tooltip-pt-watchlist": "Listaan dagiti panid a sipsiputem para iti pannakabalbaliw",
        "tooltip-pt-mycontris": "Ti listaan dagiti kontribusionmo",
-       "tooltip-pt-login": "Maisingasing a sumrekka; nupay kasta, daytoy ket saan a maipapilit",
+       "tooltip-pt-login": "Maaw-awis a sumrekka; nupay kasta, daytoy ket saan a nasken",
        "tooltip-pt-logout": "Rummuar",
+       "tooltip-pt-createaccount": "Maaw-awis nga agpartuatka iti pakabilangan ken sumrek; nupay kasta, daytoy ket saan a nasken",
        "tooltip-ca-talk": "Pagtungtungan a maipapan ti linaon ti panid",
        "tooltip-ca-edit": "Mabalinmo nga urnosen daytoy a panid. Pangngaasi nga aramatem ti buton ti panagipadas sakbay nga agidulin",
        "tooltip-ca-addsection": "Mangirugi ti baro a paset",
        "tooltip-n-currentevents": "Agsapul ti pakaammo kadagiti agdama a paspasamak",
        "tooltip-n-recentchanges": "Listaan dagiti naudi a sinukatan iti wiki",
        "tooltip-n-randompage": "Agikarga iti pugto a panid",
-       "tooltip-n-help": "Ti lugar a pagsapulan",
+       "tooltip-n-help": "Ti lugar a pagduktalan",
        "tooltip-t-whatlinkshere": "Listaan ti amin a pampanid ti wiki a nakasilpo ditoy",
        "tooltip-t-recentchangeslinked": "Kaudian a balbaliw kadagiti panid a naisilpo manipud ti daytoy a panid",
        "tooltip-feed-rss": "RSS a pakan para iti daytoy a panid",
        "tooltip-feed-atom": "Atom a pakan para iti daytoy a panid",
        "tooltip-t-contributions": "Ti lstaan dagiti kontribusion iti daytoy nga agar-aramat",
        "tooltip-t-emailuser": "Patulodan ti esurat daytoy nga agar-aramat",
+       "tooltip-t-info": "Adu pay a pakaammo a maipanggep iti daytoy a panid",
        "tooltip-t-upload": "Agikarga kadagiti papeles",
        "tooltip-t-specialpages": "Listaan ti amin nga espesial a pampanid",
        "tooltip-t-print": "Maimaldit a bersion iti daytoy a panid",
        "pageinfo-firstuser": "Nagpartuat iti panid",
        "pageinfo-firsttime": "Petsa a pannakapartuat ti panid",
        "pageinfo-lastuser": "Kinaudi nga editor",
-       "pageinfo-lasttime": "Petsa ti kinaudi a panag-urnos",
+       "pageinfo-lasttime": "Petsa ti kinaudi a panagurnos",
        "pageinfo-edits": "Dagup a bilang dagiti inurnos",
        "pageinfo-authors": "Dagup a bilang dagiti naisangsangayan a mannurat",
        "pageinfo-recent-edits": "Itay nabiit a bilang dagiti inurnos (ti uneg ti napalabas ti $1)",
        "exif-photometricinterpretation": "Pakabuklan ti piksel",
        "exif-orientation": "Pagturongan",
        "exif-samplesperpixel": "Bilang dagiti komponente",
-       "exif-planarconfiguration": "Pannaka-urnos ti datos",
+       "exif-planarconfiguration": "Pannakaurnos ti datos",
        "exif-ycbcrsubsampling": "Subwadan pannakaibagi ti Y iti C",
        "exif-ycbcrpositioning": "Y ken C a panakaipatakderan",
        "exif-xresolution": "Horisontal a resolusion",
        "exif-exposuretime": "Exposure time",
        "exif-exposuretime-format": "$1 sec ($2)",
        "exif-fnumber": "F a Numero",
-       "exif-exposureprogram": "Exposure Program",
-       "exif-spectralsensitivity": "Spectral sensitivity",
-       "exif-isospeedratings": "ISO speed rating",
+       "exif-exposureprogram": "Programa ti panakailatakan",
+       "exif-spectralsensitivity": "Espektral a sensitibidad",
+       "exif-isospeedratings": "Grado ti kapardas ti ISO",
        "exif-shutterspeedvalue": "APEX Shutter speed",
        "exif-aperturevalue": "Apex aperture",
        "exif-brightnessvalue": "Kalawag ti APEX",
        "exif-exposurebiasvalue": "Exposure bias",
-       "exif-maxaperturevalue": "Maximum land aperture",
-       "exif-subjectdistance": "Kaadayu ti suheto",
-       "exif-meteringmode": "Metering mode",
+       "exif-maxaperturevalue": "Kangato ti apertura ti daga",
+       "exif-subjectdistance": "Kaadayo ti suheto",
+       "exif-meteringmode": "Panagmetro a moda",
        "exif-lightsource": "Paggapuan ti lawag",
        "exif-flash": "Silap",
        "exif-focallength": "Lens focal length",
        "exif-focalplaneyresolution": "Focal plane Y resolution",
        "exif-focalplaneresolutionunit": "Focal plane resolution unit",
        "exif-subjectlocation": "Lokasion ti suheto",
-       "exif-exposureindex": "Exposure index",
-       "exif-sensingmethod": "Sensing method",
-       "exif-filesource": "Nagtaudan ti papeles",
-       "exif-scenetype": "Scene type",
-       "exif-customrendered": "Custom image processing",
-       "exif-exposuremode": "Exposure mode",
+       "exif-exposureindex": "Pagsurotan ti panakailatakan",
+       "exif-sensingmethod": "Pamay-an ti panagrikna",
+       "exif-filesource": "Taudan ti papeles",
+       "exif-scenetype": "Kita ti senario",
+       "exif-customrendered": "Naiduma a panagproseso ti ladawan",
+       "exif-exposuremode": "Moda ti panakailatakan",
        "exif-whitebalance": "Pagtimbangan ti puraw",
        "exif-digitalzoomratio": "Digital zoom ratio",
        "exif-focallengthin35mmfilm": "Focal length iti 35 mm a film",
-       "exif-scenecapturetype": "Scene capture type",
-       "exif-gaincontrol": "Scene control",
+       "exif-scenecapturetype": "Kita ti panagala iti senario",
+       "exif-gaincontrol": "Panagtengngel ti senario",
        "exif-contrast": "Contrast",
        "exif-saturation": "Saturation",
        "exif-sharpness": "Kalawag",
        "exif-devicesettingdescription": "Deskripsion dagiti pannakaidisso ti ramit",
        "exif-subjectdistancerange": "Nasakup a kaadayo ti suheto",
-       "exif-imageuniqueid": "Naisangsangayan nga ID ti imahen",
+       "exif-imageuniqueid": "Naisangsangayan nga ID ti ladawan",
        "exif-gpsversionid": "Etiketa a bersion ti GPS",
-       "exif-gpslatituderef": "Amianan wenno Abagatan a Latitude",
-       "exif-gpslatitude": "Latitude",
-       "exif-gpslongituderef": "Daya wenno Laud a Longitude",
-       "exif-gpslongitude": "Longitude",
+       "exif-gpslatituderef": "Amianan wenno Abagatan a Latitud",
+       "exif-gpslatitude": "Latitud",
+       "exif-gpslongituderef": "Daya wenno Laud a Longitud",
+       "exif-gpslongitude": "Longitud",
        "exif-gpsaltituderef": "Reperensia ti kangato",
        "exif-gpsaltitude": "Kangato",
-       "exif-gpstimestamp": "GPS nga oras (atomiko a pagurasan)",
+       "exif-gpstimestamp": "GPS nga oras (atomiko a pagorasan)",
        "exif-gpssatellites": "Dagiti satelite a naaramat para iti panagrukod",
-       "exif-gpsstatus": "Receiver status",
+       "exif-gpsstatus": "Kasasaad ti pangawat",
        "exif-gpsmeasuremode": "Panagrukod a moda",
        "exif-gpsdop": "Kasayaat ti panagrukod",
-       "exif-gpsspeedref": "Speed unit",
-       "exif-gpsspeed": "Kapaspas ti GPS receiver",
-       "exif-gpstrackref": "Reperensia iti direksion ti panaggunay",
+       "exif-gpsspeedref": "Yunit ti kapardas",
+       "exif-gpsspeed": "Kapaspas ti pangawat ti GPS",
+       "exif-gpstrackref": "Reperensia iti direksion ti kuti",
        "exif-gpstrack": "Direksion ti kuti",
-       "exif-gpsimgdirectionref": "Reperensia iti direksion ti imahen",
+       "exif-gpsimgdirectionref": "Reperensia iti direksion ti ladawan",
        "exif-gpsimgdirection": "Direksion ti ladawan",
        "exif-gpsmapdatum": "Datos nga inaramat ti geodetiko a panagsukimat",
        "exif-gpsdestlatituderef": "Reperensia iti papanan a latitud",
        "exif-rightscertificate": "Sertipikado ti panagtaripato kadagiti karbengan",
        "exif-copyrighted": "Kasasaad ti karbengan ti kopia",
        "exif-copyrightowner": "Akinkukua ti karbengan ti kopia",
-       "exif-usageterms": "Dagiti termino ti panag-usar",
+       "exif-usageterms": "Dagiti termino ti panagusar",
        "exif-webstatement": "Insasao ti karbengan ti kopia nga addaan iti online",
        "exif-originaldocumentid": "Naisangayan nga ID iti kinasigud a dokumento",
        "exif-licenseurl": "URL para iti lisensia ti karbengan ti kopia",
        "exif-subjectdistancerange-1": "Makro",
        "exif-subjectdistancerange-2": "Asideg a pinagkita",
        "exif-subjectdistancerange-3": "Adayo a pinagkita",
-       "exif-gpslatitude-n": "Amianan a latitude",
-       "exif-gpslatitude-s": "Abagatan a latitude",
-       "exif-gpslongitude-e": "Daya a longitude",
-       "exif-gpslongitude-w": "Abagatan a longitude",
+       "exif-gpslatitude-n": "Amianan a latitud",
+       "exif-gpslatitude-s": "Abagatan a latitud",
+       "exif-gpslongitude-e": "Daya a longitud",
+       "exif-gpslongitude-w": "Abagatan a longitud",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|a metro|kadagiti metro}} a nangatngato ngem ti baybay",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|a metro|kadagiti metro}} a nababbaba ngem ti baybay",
        "exif-gpsstatus-a": "Agrukrukoden",
-       "exif-gpsstatus-v": "Panag-rukod ken pannakabin ti pang-usar ti sabali",
+       "exif-gpsstatus-v": "Panagrukod ken interoperabilidad",
        "exif-gpsmeasuremode-2": "2-kalawa pagrukod",
        "exif-gpsmeasuremode-3": "3-kalawa pagrukod",
        "exif-gpsspeed-k": "Dagiti kilometro kada oras",
        "exif-gpsdop-good": "Nalaing ($1)",
        "exif-gpsdop-moderate": "Natimbeng ($1)",
        "exif-gpsdop-fair": "Nasayaat ($1)",
-       "exif-gpsdop-poor": "Makukurangan ($1)",
+       "exif-gpsdop-poor": "Makurkurangan ($1)",
        "exif-objectcycle-a": "Agsapa laeng",
        "exif-objectcycle-p": "Rabii laeng",
        "exif-objectcycle-b": "Agsapa ken rabii",
        "confirmemail_body": "Addaan, baka sika, ti naggapu ti IP a pagtaengan $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga esurat a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a  pagtaengam:\n\n$5\n\nDaytoy a pammasingked a kodigo ket agpaso iti $4.",
        "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti IP a pagtaengam $1,\nket nangsukat ti esurat a pagtaengan ti pakabilangan \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a pagtaengam:\n\n$5\n\nDaytoy a kodigo a pasingkedan ket agpaso iti $4.",
        "confirmemail_body_set": "Addaan, baka sika met laeng, manipud ti IP a pagtaengan ti $1,\nket nangikabil ti esurat a pagtaengan ti pakabilangan ti \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa idiay {{SITENAME}}, lukatam daytoy a silpo idiay pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti esurat a pagtaengan:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
-       "confirmemail_invalidated": "Naukas ti pammasingked ti e-surat a pagtaengam",
-       "invalidateemail": "Ukasen ti pammasingked ti e-surat",
+       "confirmemail_invalidated": "Naukas ti pammasingked ti esurat a pagtaengam",
+       "invalidateemail": "Ukasen ti pammasingked ti esurat",
        "scarytranscludedisabled": "[Nabaldado ti Interwiki panagiraman]",
        "scarytranscludefailed": "[Napaay ti panagala ti plantilia para iti $1]",
        "scarytranscludefailed-httpstatus": "[Napaay ti panagala ti plantilia para iti $1: HTTP $2]",
        "confirm-watch-top": "Inayon daytoy a panid iti listaan ti bambantayam?",
        "confirm-unwatch-button": "Sige",
        "confirm-unwatch-top": "Ikkatem daytoy a panid manipud ti listaan ti bambantayam?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← napalabas a panid",
        "imgmultipagenext": "sumaruno a panid →",
        "imgmultigo": "Inkan!",
        "unknown_extension_tag": "Di ammo a pagpaatiddog nga etiketa ti \"$1\"",
        "duplicate-defaultsort": "<strong>Ballag:</strong> Kasisigud a panagilasin ti \"$2\" ket tuonana ti immuna a kasisigud a panagilasin ti \"$1\".",
        "duplicate-displaytitle": "<strong>Ballaag:</strong> Ti maiparang a titulo ti \"$2\" ket tuonanna ti immmuna a maiparang a titulo ti \"$1\".",
+       "invalid-indicator-name": "<strong>Biddut:</strong> Ti gupit ti <code>name</code> a panangipakita ti kasasaad ti panid ket nasken nga adda linaon.",
        "version": "Bersion",
        "version-extensions": "Dagiti naisaad a pagpaatiddog",
        "version-skins": "Naisaad a kudkudil",
        "version-credits-not-found": "Awan dagiti nabirukan a naisalaysay a pammadayaw para iti daytoy a pagpaatiddog.",
        "version-poweredby-credits": "Daytoy a wiki ket pinaandar babaen ti '''[https://www.mediawiki.org/ MediaWiki]''', karbengan ti kopia © 2001-$1 $2.",
        "version-poweredby-others": "dadduma pay",
-       "version-poweredby-translators": "dagiti agipatpatarus ti translatewiki.net",
+       "version-poweredby-translators": "dagiti agipatpatarus iti translatewiki.net",
        "version-credits-summary": "Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti kontribusonda iti [[Special:Version|MediaWiki]].",
        "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
        "version-software": "Naisaad a sopwer",
        "revdelete-uname-unhid": "saan a nailemmeng ti nagan ti agar-aramat",
        "revdelete-restricted": "naipakat dagiti panangigawid kadagiti administrador",
        "revdelete-unrestricted": "inikkat dagiti panangigawid para kadagiti administrador",
+       "logentry-merge-merge": "Ni $1 ket {{GENDER:$2|intiponna}} ti $3 iti $4 (kadagiti rebision aginggana iti $5)",
        "logentry-move-move": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid $3 iti $4",
        "logentry-move-move-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a saan a nangibati ti baw-ing",
        "logentry-move-move_redir": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a nagtuon iti baw-ing",
        "logentry-rights-rights": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3 manipud ti $4 iti $5",
        "logentry-rights-rights-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3",
        "logentry-rights-autopromote": "Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5",
+       "logentry-upload-upload": "Ni $1 ket {{GENDER:$2|inkargana}} ti $3",
+       "logentry-upload-overwrite": "Ni $1 ket {{GENDER:$2|inkargana}} ti baro a bersion ti $3",
+       "logentry-upload-revert": "Ni $1 ket {{GENDER:$2|inkargana}} ti $3",
        "rightsnone": "(awan)",
-       "revdelete-summary": "pakabuklan ti panagedit",
+       "revdelete-summary": "Pakabuklan ti inurnos",
        "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
        "feedback-subject": "Suheto:",
        "feedback-message": "Mensahe:",
        "feedback-thanks": "Agyaman! Ti feedbackmo ket naipablaak iti panid \"[$2 $1]\".",
        "feedback-close": "Nalpasen",
        "feedback-bugcheck": "Nasayaaten! Kitaem tapno saan a dagiti adda idin a [$1 nga ammo a parparikut].",
-       "feedback-bugnew": "Kinitak. Agireporta ti baro a parikut",
+       "feedback-bugnew": "Kinitak. Agireporta iti baro a parikut",
        "searchsuggest-search": "Biruken",
        "searchsuggest-containing": "naglaon ti...",
        "api-error-badaccess-groups": "Saanka mapalubosan nga agikarga kadagiti papeles iti daytoy a wiki.",
        "action-pagelang": "baliwan ti pagsasao ti panid",
        "log-name-pagelang": "Listaan ti panagbaliw ti pagsasao",
        "log-description-pagelang": "Daytoy ket listaan dagiti panagbaliw kadagiti pagsasao ti panid.",
-       "logentry-pagelang-pagelang": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti pagsasao ti panid para iti $3 manipud ti $4 iti $5."
+       "logentry-pagelang-pagelang": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti pagsasao ti panid para iti $3 manipud ti $4 iti $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (napakabaelan)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''nabaldado''')",
+       "mediastatistics": "Estadistika ti midia",
+       "mediastatistics-summary": "Estadistika a maipanggep dagiti kita ti naikarga a papeles. Daytoy ket mangiraman laeng ti kinaudi a bersion ti papeles. Dagiti bersion ti papeles a daan wenno naikkat ket saan a mairaman.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 a byte|$1 kadagiti bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Kita ti MIME",
+       "mediastatistics-table-extensions": "Dagiti mabalin pagpaatiddog",
+       "mediastatistics-table-count": "Bilang dagiti papeles",
+       "mediastatistics-table-totalbytes": "Naitiptipon a kadakkel",
+       "mediastatistics-header-unknown": "Di ammo",
+       "mediastatistics-header-bitmap": "Ladladawan ti bitmap",
+       "mediastatistics-header-office": "Opisina"
 }
index ed1c57e..6f9dd52 100644 (file)
        "filerenameerror": "Impossibile rinominare il file \"$1\" in \"$2\".",
        "filedeleteerror": "Impossibile cancellare il file \"$1\".",
        "directorycreateerror": "Impossibile creare la directory \"$1\".",
+       "directoryreadonlyerror": "La directory \"$1\" è di sola lettura.",
+       "directorynotreadableerror": "La directory \"$1\" non è leggibile.",
        "filenotfound": "Impossibile trovare il file \"$1\".",
        "unexpected": "Valore imprevisto: \"$1\"=\"$2\".",
        "formerror": "Errore: impossibile inviare il modulo",
index f422a47..dd14b35 100644 (file)
        "nov": "Teş",
        "dec": "Gağ",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
+       "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Medyawa ke kategoriya \"$1\" dera",
        "category-empty": "''Na kategoriye de hona qet nustey ya ki medya çinê.''",
index 589613f..9893e3e 100644 (file)
        "mailerror": "信失遣如下:$1",
        "acct_creation_throttle_hit": "一日之內,於一址但許一人增簿。",
        "emailauthenticated": "$2 $3郵驛證矣",
-       "emailnotauthenticated": "郵驛<strong>未證</strong>,下不遺書。",
+       "emailnotauthenticated": "郵驛未證,下不遺書。",
        "noemailprefs": "郵驛設而用之。",
        "emailconfirmlink": "惠考郵驛",
        "invalidemailaddress": "驛址不格,惠正略之。",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|書]])簿增矣。",
        "createaccount-title": "於{{SITENAME}}增簿",
        "createaccount-text": "有人於{{SITENAME}}用爾之電郵增名為 \"$2\" 之簿 ($4),符節為 \"$3\" 。汝應登,再改符節也。\n\n如簿誤增,爾可略之。",
-       "login-throttled": "爾多試於此簿登中。\n請候再試之。",
+       "login-throttled": "爾多試於此簿登中。\n請候 $1 再試之。",
        "login-abort-generic": "登簿未成——棄",
        "loginlanguagelabel": "語:$1",
        "suspicious-userlogout": "爾欲無離也,可由壞瀏覽器或快枝代理呈送之。",
        "passwordreset-domain": "域:",
        "passwordreset-email": "電郵址",
        "changeemail": "更郵址",
+       "changeemail-oldemail": "當前郵驛:",
+       "changeemail-newemail": "新郵驛:",
        "changeemail-none": "(無)",
        "changeemail-password": "汝 {{SITENAME}} 之符節",
        "bold_sample": "粗體",
        "postedit-confirmation-saved": "汝之纂已成",
        "edit-already-exists": "不建新頁。\n已存也。",
        "defaultmessagetext": "慣話文",
+       "content-model-text": "純文本",
+       "content-model-javascript": "JavaScript",
        "content-model-css": "層疊樣式表",
        "expensive-parserfunction-warning": "警:頁有多貴功呼。\n\n其須少$2呼,現有$1呼。",
        "expensive-parserfunction-category": "頁有多貴功呼",
        "revdelete-hide-user": "簿、IP址以藏",
        "revdelete-hide-restricted": "廢有秩與簿之事",
        "revdelete-radio-same": "(無改)",
-       "revdelete-radio-set": "",
-       "revdelete-radio-unset": "",
+       "revdelete-radio-set": "",
+       "revdelete-radio-unset": "",
        "revdelete-suppress": "廢有秩與簿之事",
        "revdelete-unsuppress": "復審解限",
        "revdelete-log": "因:",
index 35266cb..19a78c3 100644 (file)
        "searchresultshead": "Fikarohana",
        "stub-threshold": "Fetra ambony ho an'i <a href=\"#\" class=\"stub\">rohim-bangovango</a> (oktety):",
        "stub-threshold-disabled": "Tsy alefa",
-       "recentchangesdays": "Isa ny andro ho ampiseho eo amin'ny fanovàna farany",
+       "recentchangesdays": "Isan'ny andro ho aseho amin'ny fiovana farany:",
        "recentchangesdays-max": "($1 andro{{PLURAL:$1||}} fara-faha betsany)",
        "recentchangescount": "Isan'ny fanovana haseho (tsipalotra) :",
        "prefs-help-recentchangescount": "Misy ny fiovana farany, ny tantaram-pejy ary ny laogy",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "recentchanges": "Fiovana farany",
-       "recentchanges-legend": "Safidy ny fanovàna farany",
+       "recentchanges-legend": "Safidin'ny fiovana farany",
        "recentchanges-summary": "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
        "recentchanges-noresult": "Tsy misy fanovana miady amin'ny fepe-potoana napetraka.",
-       "recentchanges-feed-description": "Arao ny fanovàna farany amin'ity wiki ity anaty topa",
+       "recentchanges-feed-description": "Hanaraka ny fiovana faran'ny wiki anaty topaka.",
        "recentchanges-label-newpage": "Namorona pejy vaovao io fanovana io",
        "recentchanges-label-minor": "Kely fotsiny ity fanovana ity",
        "recentchanges-label-bot": "Nataon'ny rôbô ity fanovana ity.",
        "tooltip-n-mainpage-description": "hitsidika ny renipejy",
        "tooltip-n-portal": "Ny mombamomba ny tetikasa",
        "tooltip-n-currentevents": "Hikaroka torohay fototra mikasika ny vaovao",
-       "tooltip-n-recentchanges": "Lisitra ny fanovàna farany efa vita eto amin'ity wiki ity",
+       "tooltip-n-recentchanges": "Lisitry ny fiovana farany eto amin'ny wiki",
        "tooltip-n-randompage": "Hjery pejy aki-sendra",
        "tooltip-n-help": "fanoroana",
        "tooltip-t-whatlinkshere": "Lisitra ny pejy wiki mirohy eto",
index a931417..7df7fe3 100644 (file)
        "filerenameerror": "Не можев да ја преименувам податотеката „$1“ во „$2“.",
        "filedeleteerror": "Не може да се избрише податотеката „$1“.",
        "directorycreateerror": "Не можеше да се создаде именикот „$1“.",
+       "directoryreadonlyerror": "Папката „$1“ не е запислива.",
+       "directorynotreadableerror": "Папката „$1“ не е читлива.",
        "filenotfound": "Не може да се најде податотеката „$1“.",
        "unexpected": "Неочекувана вредност: „$1“=„$2“.",
        "formerror": "Грешка: не можам да го испратам образецот",
index 2c29847..edf5578 100644 (file)
@@ -40,7 +40,8 @@
                        "Teak",
                        "Wouterkoch",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Chameleon222"
                ]
        },
        "tog-underline": "Strek under lenker:",
        "viewsourcetext": "Du kan se og kopiere kilden til denne siden:",
        "viewyourtext": "Du kan se og kopiere kilden til '''dine endringer''' på denne siden:",
        "protectedinterface": "Denne siden kontrollerer brukergrensesnittekst for programvaren, og er låst for å hindre misbruk.",
-       "editinginterface": "'''Advarsel:''' Du redigerer en side som brukes til å kontrollere grensesnittekst for programvaren.\nEndringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere.\nFor oversettelser er det best om du bruker [//translatewiki.net/wiki/Main_Page?setlang=nb translatewiki.net], prosjektet for oversettelse av MediaWiki.",
+       "editinginterface": "<strong>Advarsel:</strong> Du redigerer en side som brukes til å kontrollere grensesnittekst for programvaren.\nEndringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere på denne wikien.",
+       "translateinterface": "For å legge til eller endre oversettelser for alle wikier bruk [//translatewiki.net/ translatewiki.net], MediaWikis lokaliseringsprosjekt.",
        "cascadeprotected": "Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->\n$2",
        "namespaceprotected": "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
        "customcssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "duplicate-args-category": "Sider med like argumenter i malkall",
+       "duplicate-args-category-desc": "Denne siden inneholder malkall med duplikate parametre, slik som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.\n\nDet burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..",
        "expensive-parserfunction-category": "Sider med for mange prosesskrevende parserfunksjoner",
        "post-expand-template-inclusion-warning": "Advarsel: Størrelsen på inkluderte maler er for stor.\nNoen maler vil ikke bli inkludert.",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
        "search-redirect": "(omdirigering $1)",
        "search-section": "(avsnitt $1)",
+       "search-category": "(kategori $1)",
        "search-file-match": "(matcher filinnhold)",
        "search-suggest": "Mente du: $1",
        "search-interwiki-caption": "Søsterprosjekter",
        "gender-female": "Hun redigerer wikisider",
        "prefs-help-gender": "Det er valgfritt å angi dette.\nProgramvaren bruker verdien for å anvende riktig grammatikalsk kjønn ved henvendelser til deg og i omtale av deg for andre brukere.\nInformasjonen vil være offentlig.",
        "email": "E-post",
-       "prefs-help-realname": "* Virkelig navn (valgfritt): dersom du velger å oppgi navnet, vil det bli brukt til å kreditere deg for ditt arbeid.",
+       "prefs-help-realname": "Virkelig navn er valgfritt.\nDersom angitt, kan det komme til å bli brukt til å kreditere deg for ditt arbeid.",
        "prefs-help-email": "Å angi e-postadresse er valgfritt, men er nødvendig for å få tilsendt nytt passord om du skulle glemme det gamle.",
        "prefs-help-email-others": "Du kan også velge å la andre brukere kontakte deg via brukersiden din uten å røpe identiteten din.",
        "prefs-help-email-required": "E-postadresse er påkrevd.",
        "prefs-tokenwatchlist": "Merke",
        "prefs-diffs": "Forskjeller",
        "prefs-help-prefershttps": "Denne preferansen vil virke etter neste innlogging.",
+       "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
        "email-address-validity-valid": "E-postadressen ser gyldig ut",
        "email-address-validity-invalid": "Skriv inn en gyldig e-postadresse",
        "suppress": "Historikkrydding",
        "querypage-disabled": "Denne spesialsiden er deaktivert av ytelsesårsaker.",
        "apihelp": "API hjelp",
+       "apihelp-no-such-module": "Modulen «$1» ikke funnet.",
        "booksources": "Bokkilder",
        "booksources-search-legend": "Søk etter bokkilder",
        "booksources-search": "Søk",
        "exbeforeblank": "innholdet før siden ble tømt var: «$1»",
        "delete-confirm": "Slett «$1»",
        "delete-legend": "Slett",
-       "historywarning": "<strong>Advarsel:</strong> Siden du er i ferd med å slete har en historikk med $1 {{PLURAL:$1|revisjon|revisjoner}}:",
+       "historywarning": "<strong>Advarsel:</strong> Siden du er i ferd med å slette har en historikk med $1 {{PLURAL:$1|revisjon|revisjoner}}:",
        "confirmdeletetext": "Du holder på å slette en side sammen med historikken.\nBekreft at du virkelig vil slette denne siden, at du forstår konsekvensene og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].",
        "actioncomplete": "Gjennomført",
        "actionfailed": "Handling mislyktes",
        "protect-othertime": "Annen tid:",
        "protect-othertime-op": "annen tid",
        "protect-existing-expiry": "Gjeldende utløpstid: $3 $2",
+       "protect-existing-expiry-infinity": "Gjeldende utløpstid: uendelig",
        "protect-otherreason": "Annen/utdypende grunn:",
        "protect-otherreason-op": "Annen grunn",
        "protect-dropdown": "*Vanlige låsingsårsaker\n** Gjentatt hærverk\n** Gjentatt spam\n** Redigeringskrig\n** Side med mange besøkende",
        "tooltip-pt-mycontris": "Liste over dine bidrag",
        "tooltip-pt-login": "Du oppfordres til å logge inn, men det er ikke obligatorisk",
        "tooltip-pt-logout": "Logg ut",
+       "tooltip-pt-createaccount": "Du oppfordres til å opprette en konto og logge inn, men det er ikke obligatorisk.",
        "tooltip-ca-talk": "Diskusjon om innholdssiden",
        "tooltip-ca-edit": "Du kan redigere denne siden. Vennligst bruk forhåndsvisningsknappen før du lagrer.",
        "tooltip-ca-addsection": "Start et nytt avsnitt",
        "tooltip-feed-atom": "Atom-mating for denne siden",
        "tooltip-t-contributions": "Vis liste over bidrag fra denne brukeren",
        "tooltip-t-emailuser": "Send en e-post til denne brukeren",
+       "tooltip-t-info": "Mer informasjon om denne siden",
        "tooltip-t-upload": "Last opp filer",
        "tooltip-t-specialpages": "Liste over alle spesialsider",
        "tooltip-t-print": "Utskriftsvennlig versjon av denne siden",
index 220b395..6e63fc4 100644 (file)
@@ -70,7 +70,8 @@
                        "Darellur",
                        "Michał Sobkowski",
                        "Py64",
-                       "Nanaki"
+                       "Nanaki",
+                       "Alan ffm"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "versionrequiredtext": "Użycie tej strony wymaga oprogramowania MediaWiki w wersji $1. Zobacz stronę [[Special:Version|wersja oprogramowania]].",
        "ok": "OK",
        "pagetitle": "$1 – {{SITENAME}}",
-       "retrievedfrom": "Źródło „$1”",
+       "retrievedfrom": "Źródło: „$1”",
        "youhavenewmessages": "Masz $1 ($2).",
        "youhavenewmessagesfromusers": "Masz $1 od {{PLURAL:$3|innego użytkownika|$3 użytkowników}} ($2).",
        "youhavenewmessagesmanyusers": "Masz $1 od wielu użytkowników ($2).",
index 47e8040..5d1bffb 100644 (file)
        "filerenameerror": "A l'é pa podusse cangeje nòm a l'archivi «$1» an «$2».",
        "filedeleteerror": "A l'é pa podusse scancelé l'archivi «$1».",
        "directorycreateerror": "A l'é pa podusse creé ël dossié «$1».",
+       "directoryreadonlyerror": "Ël dossié «$1» a l'é mach an letura.",
+       "directorynotreadableerror": "Ël dossié «$1» as peul nen les-se.",
        "filenotfound": "A l'é pa trovasse l'archivi «$1».",
        "unexpected": "Valor che i së spetavo pa: «$1»=«$2».",
        "formerror": "Eror: A l'é nen podusse mandé ël formolari.",
index 4747ded..fc640b9 100644 (file)
        "filerenameerror": "Não foi possível alterar o nome do ficheiro \"$1\" para \"$2\".",
        "filedeleteerror": "Não foi possível eliminar o ficheiro \"$1\".",
        "directorycreateerror": "Não foi possível criar o diretório \"$1\".",
+       "directoryreadonlyerror": "O diretório \"$1\" é apenas de leitura.",
+       "directorynotreadableerror": "O diretório \"$1\" não é legível.",
        "filenotfound": "Não foi possível encontrar o ficheiro \"$1\".",
        "unexpected": "Valor não esperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Não foi possível enviar o formulário",
index b9d586c..e254fa5 100644 (file)
        "filecopyerror": "Parameters:\n* $1 - source file name\n* $2 - destination file name",
        "filerenameerror": "Parameters:\n* $1 - old file name\n* $2 - new file name",
        "filedeleteerror": "Parameters:\n* $1 - file name",
-       "directorycreateerror": "Parameters:\n* $1 - directory name",
+       "directorycreateerror": "Error message returned when the directory cannot be created. Parameters:\n* $1 - directory name",
+       "directoryreadonlyerror": "Error message returned when the directory is read-only. Parameters:\n* $1 - directory name",
+       "directorynotreadableerror": "Error message returned when the directory isn't readable. Parameters:\n* $1 - directory name",
        "filenotfound": "Parameters:\n* $1 - file name",
        "unexpected": "This message indicates the value $2 is unexpected for $1. Parameters:\n* $1 - name\n* $2 - value",
        "formerror": "Generic error message show to a user when they try to submit information that could not be processed for any reason.",
index b8e413b..468b8d1 100644 (file)
        "filerenameerror": "Fișierul \"$1\" nu a putut fi mutat la \"$2\".",
        "filedeleteerror": "Fișierul \"$1\" nu a putut fi șters.",
        "directorycreateerror": "Nu se poate crea directorul \"$1\".",
+       "directoryreadonlyerror": "Dosarul „$1” este doar în citire.",
+       "directorynotreadableerror": "Dosarul „$1” nu poate fi citit.",
        "filenotfound": "Fișierul „$1” nu a putut fi găsit.",
        "unexpected": "Valoare neașteptată: „$1”=„$2”.",
        "formerror": "Eroare: datele nu au putut fi trimise",
index 1708443..dd90bc9 100644 (file)
@@ -71,7 +71,8 @@
                        "Oleg3280",
                        "Nirovulf",
                        "Striking Blue",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "MaxBioHazard"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "hidden-category-category": "Скрытые категории",
        "category-subcat-count": "{{PLURAL:$2|1=Эта категория содержит только следующую подкатегорию.|В этой категории отображается $1 {{PLURAL:$1|подкатегория|подкатегорий|подкатегории}} из имеющихся $2.}}",
        "category-subcat-count-limited": "В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.",
-       "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показано $1 страниц|Показаны $1 страницы}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
+       "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показаны $1 страницы|Показано $1 страниц}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
        "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц|1=только одна страница}}.",
-       "category-file-count": "{{PLURAL:$2|1=ЭÑ\82а ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bй Ñ\84айл.|{{PLURAL:$1|Ð\9fоказан $1 Ñ\84айл|Ð\9fоказано $1 Ñ\84айлов|Ð\9fоказанÑ\8b $1 Ñ\84айла}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}",
+       "category-file-count": "{{PLURAL:$2|1=ЭÑ\82а ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bй Ñ\84айл.|{{PLURAL:$1|Ð\9fоказан $1 Ñ\84айл|Ð\9fоказано $1 Ñ\84айла|Ð\9fоказанÑ\8b $1 Ñ\84айлов}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}",
        "category-file-count-limited": "В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов|1=только один файл}}.",
        "listingcontinuesabbrev": "(продолжение)",
        "index-category": "Индексируемые страницы",
        "filerenameerror": "Невозможно переименовать файл «$1» в «$2».",
        "filedeleteerror": "Невозможно удалить файл «$1».",
        "directorycreateerror": "Невозможно создать директорию «$1».",
+       "directoryreadonlyerror": "Каталог «$1» доступен только для чтения.",
+       "directorynotreadableerror": "Каталог «$1» не читается.",
        "filenotfound": "Невозможно найти файл «$1».",
        "unexpected": "Неподходящее значение: «$1»=«$2».",
        "formerror": "Ошибка: невозможно передать данные формы",
index 3969358..7892473 100644 (file)
@@ -16,7 +16,7 @@
        "tog-showtoolbar": "Aratâ bara di halati trâ alâxiri",
        "tog-editondblclick": "Alâxeaști frândzâli pri-tu click duplo",
        "tog-editsectiononrightclick": "Activeadzâ alâxirea a secțiuniloru pri-tu click ndreapta pi titlu a secțiunâľei",
-       "tog-watchcreations": "Adavgâ frândzâli pi cari li adar și fișierele pi cari li ncari la lista a ńia di frândzâ avinati",
+       "tog-watchcreations": "Adavgâ frândzâli pi cari li adaru și fișierili pi cari li ancarcu la lista a ńia di frândzâ avinati",
        "tog-watchdefault": "Adavgâ frândzâli și fișierili pi cari li alâxescu la lista a ńia di avinari",
        "tog-watchmoves": "Adavgâ frândzâli și fișierili pi cari li dau numâ noao la lista a ńia di avinari",
        "tog-watchdeletion": "Adavgâ frândzâli și fișierili pi cari li aștergu la lista a ńia di avinari",
        "readonly": "Baza di dati easti blocatâ (ncľisâ) la nyrâpseari",
        "missingarticle-rev": "(versiuniľea#: $1)",
        "missingarticle-diff": "(Dif: $1, $2)",
+       "internalerror": "Sfalmâ di nuntru",
+       "internalerror_info": "Sfalmâ di nuntru: $1",
+       "filecopyerror": "Fișierlu \"$1\" nu putu s-hibâ copiatu \"$2\".",
+       "filerenameerror": "Fișierlu \"$1\" nu putu s-hibâ mutatu \"$2\".",
+       "filedeleteerror": "Fișierlu \"$1\" nu si putu s-hibâ aștersu.",
+       "directorycreateerror": "Nu s-poati si s-facâ directorlu \"$1\".",
+       "directoryreadonlyerror": "Directorlu \"$1\" easti mași trâ adghivâsiri.",
+       "directorynotreadableerror": "Directorlu \"$1\" nu s-poati si s-adghivâseascâ.",
+       "filenotfound": "Fișierlu \"$1\" nu si putu s-hibâ aflatu.",
        "badtitle": "Titlu alatusu",
        "viewsource": "Vez-u textu",
        "viewsource-title": "Vedz ivurlu trâ $1",
        "userlogin-yourname-ph": "Bagâ-u numa a ta di utilizatoru",
        "createacct-another-username-ph": "Bagâ-u numa di utilizatoru",
        "yourpassword": "Zboru cľeae:",
-       "userlogin-yourpassword": "Zboarâ acrifo (parolâ)",
+       "userlogin-yourpassword": "Zboru acrifo (parolâ)",
        "userlogin-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
        "createacct-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
        "yourpasswordagain": "Bagâ-u cľeae diznou:",
        "gotaccountlink": "Leagâ-ti",
        "userlogin-resetlink": "U agârșii parola i numa di utilizatoru?",
        "userlogin-resetpassword-link": "U agârșii parola?",
+       "userlogin-helplink2": "Agiutoru la ligari",
+       "userlogin-createanother": "Adrari contu nou",
        "createacct-emailrequired": "Adresâ di carti electronicâ",
        "createacct-emailoptional": "Adresâ di carti electronicâ (opționalu)",
        "createacct-email-ph": "Bagâ-u adresa a ta di carti electronicâ",
        "createacct-another-email-ph": "Bagâ-u adresa di carti electronicâ",
+       "createaccountmail": "Ufiliseaști unâ parolâ (zboru acrifo) pirastica și u pitreați la adresa di e-mail cari u dzâț tini",
        "createacct-realname": "Numa realâ (opționalu)",
        "createaccountreason": "Furńie:",
        "createacct-reason": "Furńie",
+       "createacct-reason-ph": "Câ ți feci altu contu",
+       "createacct-captcha": "Duchimie (provâ) di securitati",
+       "createacct-imgcaptcha-ph": "Bagâ lu textu pi cari lu vedz disuprâ",
+       "createacct-submit": "Adrari contu-ț",
+       "createacct-another-submit": "Adrari altu contu",
+       "createacct-benefit-heading": "{{SITENAME}} s-feasi cu oamińi ca tini.",
+       "createacct-benefit-body1": "{{PLURAL:$1|alâxiri|alâxiri|di alâxiri}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|frândzâ|frândzâ|de frândzâ}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribuitoru proaspitu|contribuitori proaspiț|di contribuitori proaspiț}}",
+       "badretype": "Zboarâli acrifo pi cari lâ bâgaș nu suntu unâ.",
+       "userexists": "Numa di utilizatoru pi cari u bâgaș ari nica aoa. Ti oru, ľea altâ numâ.",
+       "loginerror": "Sfalmâ di ligari",
+       "createacct-error": "Sfalmâ la adrarea a contlui",
+       "createaccounterror": "Nu s-putu si s-facâ contu: $1",
+       "loginsuccesstitle": "Ligarea s-bitisi ghini",
+       "loginsuccess": "'''Ti ligai la {{SITENAME}} ca „$1”.'''",
+       "loginlanguagelabel": "Limbâ: $1",
+       "pt-login": "Leagâ-ti",
+       "pt-login-button": "Leagâ-ti",
+       "pt-createaccount": "Fă contu (isape)",
+       "pt-userlogout": "Dizleagâ-ti",
+       "bold_sample": "Scriari groasâ (bold)",
+       "bold_tip": "Scriari groasâ (bold)",
+       "italic_sample": "Scriari aplicatâ (italic)",
+       "italic_tip": "Scriari aplicatâ (italic)",
+       "link_sample": "Titlu a ligâturiľei",
+       "link_tip": "Ligâturâ di nuntru",
+       "extlink_sample": "http://www.example.com titlu a ligâturiľei",
        "summary": "Rezumatu:",
        "minoredit": "Aestâ easti unâ alâxiri minorâ (ńicâ)",
        "watchthis": "Mutrea-u frândzâ aestâ",
index cd7d6aa..5556cd9 100644 (file)
        "autosumm-replace": "Сирэй иһэ уларытыллыбыт: '$1'",
        "autoredircomment": "Утаарыы: [[$1]]",
        "autosumm-new": "'$1' ыйааһыннаах саҥа сирэй оҥоһулунна",
+       "autosumm-newblank": "Кураанах сирэй оҥоһулунна",
        "size-bytes": "$1 байт",
        "lag-warn-normal": "$1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
        "lag-warn-high": "Синхронизация лаппа хойутуур буолан кэнники $1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
index 662f189..a03a4cb 100644 (file)
        "edit-gone-missing": "Mpussìbbili aggiurnari la pàggina.\nPari ca fu scancillata.",
        "edit-conflict": "Cunflittu di edizzioni.",
        "edit-no-change": "La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.",
+       "postedit-confirmation-created": "La pàggina fu criata.",
        "postedit-confirmation-saved": "Lu canciamentu fu sarbatu.",
        "edit-already-exists": "Mpussìbbili criari na pàggina nova.\nEsisti ggià.",
        "expensive-parserfunction-warning": "Accura: Sta pàggina cunteni troppi chiamati ê parser functions.\n\nAvissi a èssiri menu di $2, ô mumentu ci {{PLURAL:$1|nn'è $1|nni sunnu $1}}.",
index b28a7db..5684954 100644 (file)
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
        "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4",
-       "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|$5 измене|$5 измена|1=једне измене}} на страници $3: $4",
+       "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=једне измене|$5 измене|$5 измена}} на страници $3: $4",
        "logentry-delete-event-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику на $3",
        "logentry-delete-revision-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост измена на страници $3",
        "logentry-suppress-delete": "$1 је {{GENDER:$2|потиснуо|потиснула}} страницу $3",
index eb0d42f..57633c1 100644 (file)
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja|$5 događaja}} u dnevniku na $3: $4",
-       "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|$5 izmene|$5 izmena|1=jedne izmene}} na stranici $3: $4",
+       "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=jedne izmene|$5 izmene|$5 izmena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku na $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "logentry-suppress-delete": "$1 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3",
index 6b0bac8..95c062a 100644 (file)
        "filerenameerror": "Kunde inte byta namn på filen \"$1\" till \"$2\".",
        "filedeleteerror": "Kunde inte radera filen \"$1\".",
        "directorycreateerror": "Kunde inte skapa katalogen \"$1\".",
+       "directoryreadonlyerror": "Katalog \"$1\" är skrivskyddad.",
+       "directorynotreadableerror": "Katalog \"$1\" är inte läsbar.",
        "filenotfound": "Kunde inte hitta filen \"$1\".",
        "unexpected": "Oväntat värde: \"$1\"=\"$2\".",
        "formerror": "Fel: Kunde inte sända formulär",
        "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-publishfailed": "Internt fel: Servern kunde inte publicera temporär fil.",
        "api-error-stasherror": "Ett fel uppstod under uppladdningen av filen till mellanlagringsfilen.",
+       "api-error-stashedfilenotfound": "Den temporära filen kunde inte hittas när den skulle laddas upp från den temporära lagringsytan.",
+       "api-error-stashpathinvalid": "Den sökväg där den temporära filen skulle ha hittats var ogiltig.",
+       "api-error-stashfilestorage": "Ett fel uppstod under lagringen av filen i den temporära lagringsytan.",
+       "api-error-stashzerolength": "Servern kunde inte lagra filen temporärt eftersom den har noll längd.",
+       "api-error-stashnotloggedin": "Du måste vara inloggad för att spara filer till den temporära ytan för uppladdningar.",
+       "api-error-stashwrongowner": "Filen du försöker komma åt i det temporära lagringsutrymmet tillhör inte dig.",
+       "api-error-stashnosuchfilekey": "Filnyckeln som du försökte komma åt i den temporära lagringsytan existerar inte.",
        "api-error-timeout": "Servern svarade inte inom förväntad tid.",
        "api-error-unclassified": "Ett okänt fel uppstod",
        "api-error-unknown-code": "Okänt fel: \"$1\"",
index 1fa4813..171415c 100644 (file)
        "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้:",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ<strong>การแก้ไขของคุณ</strong>มายังหน้านี้ได้:",
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
-       "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะกระทบต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้\nในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
+       "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
+       "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
        "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ในหน้าซึ่งถูกล็อกโดยเปิดตัวเลือก \"ทบทุกลำดับขั้น\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "createaccount-text": "มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ \"$2\" และรหัสผ่าน \"$3\" \nคุณควรล็อกอินและเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด",
        "login-throttled": "ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "login-abort-generic": "การล็อกอินของคุณไม่สำเร็จ - ล้มเลิกแล้ว",
+       "login-migrated-generic": "บัญชีของคุณถูกย้ายแล้ว และไม่มีชื่อผู้ใช้ของคุณอยู่บนวิกินี้อีก",
        "loginlanguagelabel": "ภาษา: $1",
        "suspicious-userlogout": "คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย",
        "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
        "content-model-text": "ข้อความธรรมดา",
        "content-model-javascript": "จาวาสคริปต์",
        "content-model-css": "CSS",
+       "duplicate-args-category": "หน้าที่ใช้อาร์กิวเมนต์จำลองในการเรียกแม่แบบ",
        "expensive-parserfunction-warning": "<strong>คำเตือน:</strong> หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
        "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป",
        "post-expand-template-inclusion-warning": "<strong>คำเตือน:</strong> แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nจะไม่รวมบางแม่แบบเข้ามา",
        "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)",
        "search-redirect": "(เปลี่ยนทาง $1)",
        "search-section": "(ส่วน $1)",
+       "search-category": "(หมวดหมู่ $1)",
        "search-file-match": "(เนื้อหาไฟล์ตรง)",
        "search-suggest": "คุณอาจหมายถึง: $1",
        "search-interwiki-caption": "โครงการพี่น้อง",
        "gender-female": "หญิง",
        "prefs-help-gender": "เลือกตั้งค่านี้หรือไม่ก็ได้\nซอฟต์แวร์ใช้ค่านี้เพื่อติดต่อคุณและกล่าวถึงคุณโดยใช้เพศทางไวยากรณ์ที่เหมาะสมเมื่อติดต่อผู้อื่น\nสารสนเทศนี้เปิดเผยต่อสาธารณะ",
        "email": "อีเมล",
-       "prefs-help-realname": "à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 \nà¸\96à¹\89าà¸\84ุà¸\93à¹\80ลือà¸\81à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¹\80à¸\81ียรà¸\95ิà¹\81à¸\81à¹\88à¸\87าà¸\99à¸\82อà¸\87คุณ",
+       "prefs-help-realname": "à¹\84มà¹\88à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 \nหาà¸\81à¹\83à¸\8aà¹\89 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¸\9aà¹\88à¸\87à¸\8aีà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93วà¹\88ามาà¸\88าà¸\81คุณ",
        "prefs-help-email": "ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่หากคุณลืมรหัสผ่าน",
        "prefs-help-email-others": "คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ\nไม่เปิดเผยที่อยู่อีเมลของคุณเมื่อผู้ใช้อื่นติดต่อคุณ",
        "prefs-help-email-required": "ต้องการที่อยู่อีเมล",
        "movepagetalktext": "หน้าพูดคุยของหน้านี้จะถูกเปลี่ยนชื่อตามไปโดยอัตโนมัติ '''เว้นแต่:'''\n*มีหน้าพูดคุยภายใต้ชื่อใหม่อยู่แล้ว หรือ\n*คุณไม่เลือกกล่องด้านล่าง\n\nหากเกิดกรณีเหล่านี้ คุณจะต้องย้ายหรือรวมหน้าเองหากต้องการเปลี่ยนชื่อตามในภายหลัง",
        "movearticle": "เปลี่ยนชื่อ",
        "moveuserpage-warning": "'''คำเตือน''' คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ'''ไม่'''ถูกเปลี่ยนชื่อ",
+       "movecategorypage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะ<em>ไม่</em>ถูกจัดเข้าหมวดหมู่ใหม่",
        "movenologintext": "ถ้าต้องการเปลี่ยนชื่อหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|ล็อกอิน]]",
        "movenotallowed": "คุณไม่มีสิทธิเปลี่ยนชื่อหน้า",
        "movenotallowedfile": "คุณไม่มีสิทธิย้ายไฟล์",
        "cant-move-user-page": "คุณไม่มีสิทธิย้ายหน้าผู้ใช้ (แยกจากหน้าย่อย)",
        "cant-move-to-user-page": "คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)",
+       "cant-move-category-page": "คุณไม่มีสิทธิย้ายหน้าหมวดหมู่",
+       "cant-move-to-category-page": "คุณไม่มีสิทธิย้ายหน้าไปหน้าหมวดหมู่",
        "newtitle": "ไปชื่อเรื่องใหม่:",
        "move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง",
        "movepagebtn": "เปลี่ยนชื่อ",
        "importlogpage": "ปูมการนำเข้า",
        "importlogpagetext": "นำเข้าไฟล์จากวิกิอื่น โดยผ่านทางผู้ดูแลระบบ",
        "import-logentry-upload": "นำเข้า [[$1]] ผ่านการอัปโหลดแล้ว",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}",
+       "import-logentry-upload-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}",
        "import-logentry-interwiki": "นำเข้าข้ามวิกิ $1 แล้ว",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
+       "import-logentry-interwiki-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
        "javascripttest": "การทดสอบจาวาสคริปต์",
        "javascripttest-title": "กำลังดำเนินงานทดสอบ $1",
        "javascripttest-pagetext-noframework": "หน้านี้สงวนไว้สำหรับดำเนินงานการทดสอบจาวาสคริปต์",
        "tooltip-pt-mycontris": "รายการหน้าที่คุณเขียน",
        "tooltip-pt-login": "ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน",
        "tooltip-pt-logout": "ล็อกเอาต์",
+       "tooltip-pt-createaccount": "สนับสนุนให้คุณสร้างบัญชีและล็อกอิน แต่ไม่บังคับ",
        "tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา",
        "tooltip-ca-edit": "คุณสามารถแก้ไขหน้านี้ได้ โปรดใช้ปุ่มตัวอย่างก่อนบันทึก",
        "tooltip-ca-addsection": "เริ่มส่วนใหม่",
        "tooltip-feed-atom": "ฟีดอะตอม (Atom) ของหน้านี้",
        "tooltip-t-contributions": "รายการเรื่องที่เขียนโดยผู้ใช้นี้",
        "tooltip-t-emailuser": "ส่งอีเมลถึงผู้ใช้นี้",
+       "tooltip-t-info": "สารสนเทศเพิ่มเติมเกี่ยวกับหน้านี้",
        "tooltip-t-upload": "อัปโหลดไฟล์",
        "tooltip-t-specialpages": "รายการหน้าพิเศษทั้งหมด",
        "tooltip-t-print": "รุ่นที่พร้อมพิมพ์ของหน้านี้",
index 8dcc5d8..879e8ef 100644 (file)
        "edit-no-change": "Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.",
        "edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
        "editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.",
+       "duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
        "expensive-parserfunction-warning": "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nЧикләү: $2 {{PLURAL:$2|1=куллану}}, бу очракта {{PLURAL:$1|$1 тапкыр}} башкарырга рөхсәт ителә.",
        "expensive-parserfunction-category": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "post-expand-template-inclusion-warning": "'''Игътибар:''' Кулланылучы үрнәкләр артык зур.\nКайберләре кабызылмаячак.",
index 4d3384b..e534258 100644 (file)
        "editundo": "скасувати",
        "diff-empty": "(Немає відмінностей)",
        "diff-multi-sameuser": "(не {{PLURAL:$1|показано одну проміжну версію|показані $1 проміжні версії|показано $1 проміжних версій}} цього учасника)",
-       "diff-multi-otherusers": "(не {{PLURAL:$1|показана одна проміжна версія|показано $1 проміжні версії|показані $1 проміжних версій}} {{PLURAL:$2|ще одного учасника|$2 учасників}})",
+       "diff-multi-otherusers": "(не {{PLURAL:$1|показана $1 проміжна версія|показано $1 проміжні версії|показані $1 проміжних версій}} {{PLURAL:$2|ще одного учасника|$2 учасників}})",
        "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 проміжна версія|не показані $1 проміжні версії|не показано $1 проміжних версій}}, зроблених більш, ніж {{PLURAL:$2|1=$1 користувачем|$2 користувачами}})",
        "difference-missing-revision": "{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.\n\nІмовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "searchresults": "Результати пошуку",
index 60d9cf6..59d636c 100644 (file)
@@ -19,7 +19,8 @@
                        "محبوب عالم",
                        "පසිඳු කාවින්ද",
                        "아라",
-                       "Calak"
+                       "Calak",
+                       "عرفان ارشد"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "newwindow": "(نـئی ونـڈو میـں)",
        "cancel": "منسوخ",
        "moredotdotdot": "اور...",
+       "morenotlisted": "یہ فہرست مکمل نہیں ہے-",
        "mypage": "میرا صفحہ",
        "mytalk": "میری گفتگو",
        "anontalk": "اس IP کیلیے بات چیت",
        "permalink": "مستقل کڑی",
        "print": "طباعت",
        "view": "منظر",
+       "view-foreign": "$1 پر دیکھیں",
        "edit": "ترمیم",
+       "edit-local": "ترمیم مقامی وضاحت",
        "create": "تخلیق",
+       "create-local": "ادخال مقامی وضاحت",
        "editthispage": "اس صفحہ میں ترمیم کریں",
        "create-this-page": "صفحہ ہٰذا تخلیق کیجئے",
        "delete": "حذف",
        "deletethispage": "یہ صفحہ حذف کریں",
+       "undeletethispage": "یہ صفحہ بحال کریں",
        "undelete_short": "بحال {{PLURAL:$1|ایک ترمیم|$1 ترامیم}}",
        "protect": "محفوظ",
        "protect_change": "تبدیل کرو",
index 8ce4527..54b5846 100644 (file)
        "internalerror": "Ichki xato",
        "internalerror_info": "Ichki xato: $1",
        "filecopyerror": "\"$1\" fayl nusxasini \"$2\" fayliga koʻchirib boʻlmadi.",
+       "filerenameerror": "Faylning nomini \"$1\"dan \"$2\"ga o‘zgartirib bo‘lmadi.",
        "filedeleteerror": "\"$1\" faylini oʻchirib boʻlmadi.",
+       "directorycreateerror": "\"$1\" papkasini yaratib bo‘lmadi.",
        "filenotfound": "\"$1\" faylini topib boʻlmadi.",
+       "unexpected": "Kutilmagan qiymat: \"$1\"=\"$2\".",
        "cannotdelete-title": "\"$1\" sahifasini oʻchirib boʻlmadi.",
        "badtitle": "Notoʻgʻri sarlavha",
        "viewsource": "Manbasini koʻrish",
index 24a9572..9553b99 100644 (file)
@@ -39,7 +39,7 @@
        "tog-showtoolbar": "Hiển thị thanh định dạng",
        "tog-editondblclick": "Nhấn đúp để sửa đổi trang",
        "tog-editsectiononrightclick": "Bấm chuột phải vào đề mục để sửa đổi phần trang",
-       "tog-watchcreations": "Tự động theo dõi các trang tôi viết và các tập tin tôi tải lên",
+       "tog-watchcreations": "Tự động theo dõi các trang tôi tạo và các tập tin tôi tải lên",
        "tog-watchdefault": "Tự động theo dõi các trang và tập tin tôi sửa",
        "tog-watchmoves": "Tự động theo dõi các trang và tập tin tôi di chuyển",
        "tog-watchdeletion": "Tự động theo dõi các trang và tập tin tôi xóa",
index 78f36cd..4cb1ff4 100644 (file)
        "filerenameerror": "无法将文件“$1”重命名为“$2”。",
        "filedeleteerror": "无法删除文件“$1”。",
        "directorycreateerror": "无法创建目录“$1”。",
+       "directoryreadonlyerror": "目录“$1”是只读的。",
+       "directorynotreadableerror": "目录“$1”无法读取。",
        "filenotfound": "找不到文件“$1”。",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:无法提交表单",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "duplicate-args-category": "调用重复模板参数的页面",
-       "duplicate-args-category-desc": "页面包含使用重复参数的模板调用,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
+       "duplicate-args-category-desc": "页面包含调用了重复参数的模板,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
        "expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫",
        "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
index c1c2635..9545173 100644 (file)
        "projectpage": "檢視專案頁面",
        "imagepage": "檢視檔案頁面",
        "mediawikipage": "檢視訊息頁面",
-       "templatepage": "檢視樣頁面",
+       "templatepage": "檢視樣頁面",
        "viewhelppage": "檢視說明頁面",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
-       "nstab-template": "樣",
+       "nstab-template": "樣",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
        "nosuchaction": "無此動作",
        "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
        "templatesused": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
-       "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|樣}}:",
+       "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|樣}}:",
        "templatesusedsection": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
        "template-protected": "(受保護)",
        "template-semiprotected": "(受半保護)",
        "duplicate-args-category-desc": "該頁面包含重複使用參數的樣版呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的解析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "expensive-parserfunction-category": "使用了太多消耗系統資源的分析函數的頁面",
-       "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用樣板後大小超出限制。\n部份樣內容將不會被使用。",
+       "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用樣板後大小超出限制。\n部份樣內容將不會被使用。",
        "post-expand-template-inclusion-category": "引用樣板後大小超出限制的頁面",
        "post-expand-template-argument-warning": "<strong>警告:</strong>此頁面有一個以上的樣版參數過長。\n過長的參數會被直接忽略。",
-       "post-expand-template-argument-category": "樣參數有部份被忽略的頁面",
-       "parser-template-loop-warning": "偵測到樣遞迴:[[$1]]",
+       "post-expand-template-argument-category": "樣參數有部份被忽略的頁面",
+       "parser-template-loop-warning": "偵測到樣遞迴:[[$1]]",
        "parser-template-recursion-depth-warning": "超出樣版遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
        "node-count-exceeded-category": "節點數量超出限制的頁面",
        "listduplicatedfiles": "重複檔案清單",
        "listduplicatedfiles-summary": "此清單中包含最新版本的檔案與其他檔案重複的清單,本清單只顯示本地檔案。",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
-       "unusedtemplates": "未使用的樣",
+       "unusedtemplates": "未使用的樣",
        "unusedtemplatestext": "此頁面列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的樣版。\n在刪除前,仍需檢查是否有連結這些樣版的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "linksearch-pat": "搜尋關鍵字:",
        "linksearch-ns": "命名空間:",
        "linksearch-ok": "搜尋",
-       "linksearch-text": "可使用萬用字元如 \"*.wikipedia.org\"。\n萬用字元必須使用在最上層網域,例如 \"*.org\".<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
+       "linksearch-text": "可使用萬用字元如 *.wikipedia.org。\n萬用字元必須使用在最上層網域,例如 *.org 。<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
        "linksearch-line": "$1 由 $2 所連結",
        "linksearch-error": "萬用字元僅可在主機名稱的開頭使用。",
        "listusersfrom": "顯示使用者開始自:",
        "enotif_subject_restored": "{{SITENAME}} $2 已還原頁面 $1",
        "enotif_subject_changed": "{{SITENAME}} $2 已修改頁面 $1",
        "enotif_body_intro_deleted": "{{SITENAME}} $2 已刪除頁面 $1 於 $PAGEEDITDATE,詳見 $3。",
-       "enotif_body_intro_created": "{{SITENAME}} $2 已建立頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
-       "enotif_body_intro_moved": "{{SITENAME}} $2 已移動頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
-       "enotif_body_intro_restored": "{{SITENAME}} $2 已還原頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
-       "enotif_body_intro_changed": "{{SITENAME}} $2 已修改頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
+       "enotif_body_intro_created": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|建立}},詳見目前的修訂 $3。",
+       "enotif_body_intro_moved": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|移動}},詳見目前的修訂 $3。",
+       "enotif_body_intro_restored": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|恢復}},詳見目前的修訂 $3。",
+       "enotif_body_intro_changed": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|更改}},詳見目前的修訂 $3。",
        "enotif_lastvisited": "請參考 $1 檢視自您上次檢視後所有的變更。",
        "enotif_lastdiff": "請參考 $1 檢視此變更。",
        "enotif_anon_editor": "匿名使用者 $1",
        "unblock": "解除封鎖使用者",
        "blockip": "封鎖{{GENDER:$1|使用者}}",
        "blockip-legend": "封鎖使用者",
-       "blockiptext": "填寫以下單據可封鎖特定 IP 位址或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
+       "blockiptext": "填寫以下表單可封鎖特定 IP 位址或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
        "ipaddressorusername": "IP 位址或使用者名稱:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "export-addnstext": "使用命名空間新增頁面:",
        "export-addns": "新增",
        "export-download": "儲存為檔案",
-       "export-templates": "包含樣",
+       "export-templates": "包含樣",
        "export-pagelinks": "包含連結的頁面深度:",
        "allmessages": "系統訊息",
        "allmessagesname": "名稱",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁的所有歷史修訂",
-       "import-interwiki-templates": "包含所有樣",
+       "import-interwiki-templates": "包含所有樣",
        "import-interwiki-submit": "匯入",
        "import-interwiki-namespace": "目標命名空間:",
        "import-interwiki-rootpage": "目標根頁面 (選填):",
        "tooltip-ca-nstab-project": "檢視專案頁面",
        "tooltip-ca-nstab-image": "檢視檔案頁面",
        "tooltip-ca-nstab-mediawiki": "檢視系統訊息",
-       "tooltip-ca-nstab-template": "檢視樣",
+       "tooltip-ca-nstab-template": "檢視樣",
        "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
        "tooltip-minoredit": "標記為小修訂",
        "confirmemail_success": "您的電子郵件已經被確認。您現在可以[[Special:UserLogin|登入]]並使用此網站了。",
        "confirmemail_loggedin": "已確認您的電子郵件位址。",
        "confirmemail_subject": "{{SITENAME}} 電子郵件位址確認",
-       "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1)  已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件位址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body": "不明人士(可能是您自己,來自 IP 位址 $1 )已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件位址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_set": "不明人士(可能是您自己,來自 IP 位址 $1 )已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_invalidated": "已取消電子郵件位址確認",
        "invalidateemail": "取消電子郵件確認",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
-       "scarytranscludefailed": "[樣 $1 讀取失敗]",
-       "scarytranscludefailed-httpstatus": "[樣 $1 讀取失敗:HTTP $2]",
+       "scarytranscludefailed": "[樣 $1 讀取失敗]",
+       "scarytranscludefailed-httpstatus": "[樣 $1 讀取失敗:HTTP $2]",
        "scarytranscludetoolong": "[URL 過長]",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
        "redirect-revision": "頁面修訂 ID",
        "redirect-file": "檔案名稱",
        "redirect-not-exists": "查無值",
-       "fileduplicatesearch": "æ\90\9cå°\8bé\87\8dè¦\86檔案",
+       "fileduplicatesearch": "æ\90\9cå°\8bé\87\8dè¤\87檔案",
        "fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
        "fileduplicatesearch-legend": "搜尋重覆",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "fileduplicatesearch-info": "$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4",
-       "fileduplicatesearch-result-1": "æª\94æ¡\88 $1 ç\84¡é\87\8dè¦\86的檔案。",
+       "fileduplicatesearch-result-1": "æª\94æ¡\88 $1 ç\84¡é\87\8dè¤\87的檔案。",
        "fileduplicatesearch-result-n": "檔案 $1 有 $2 筆重覆的檔案。",
        "fileduplicatesearch-noresults": "查無名稱為 \"$1\" 的檔案。",
        "specialpages": "特殊頁面",
        "limitreport-ppgeneratednodes": "預處理器產生節點次數",
        "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
-       "limitreport-templateargumentsize": "樣參數大小",
+       "limitreport-templateargumentsize": "樣參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
        "limitreport-expensivefunctioncount": "高消耗解析器函數次數",
-       "expandtemplates": "展開樣",
+       "expandtemplates": "展開樣",
        "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的解析器語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
index 0a65e31..97c8954 100644 (file)
@@ -98,5 +98,5 @@ if ( $mime ) {
        return true;
 }
 
-# Let the php server handle things on it's own otherwise
+# Let the php server handle things on its own otherwise
 return false;
index 2aaf960..ddf9ff7 100644 (file)
@@ -4,5 +4,8 @@
                        "Robin0van0der0vliet"
                ]
        },
+       "ooui-toolbar-more": "Mear",
+       "ooui-toolgroup-expand": "Mear",
+       "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annulearje"
 }
index 81690ab..cadc416 100644 (file)
@@ -25,5 +25,6 @@
        "ooui-dialog-message-reject": "ביטול",
        "ooui-dialog-process-error": "משהו השתבש",
        "ooui-dialog-process-dismiss": "לוותר",
-       "ooui-dialog-process-retry": "לנסות שוב"
+       "ooui-dialog-process-retry": "לנסות שוב",
+       "ooui-dialog-process-continue": "המשך"
 }
index 81a91ed..b37beae 100644 (file)
@@ -8,9 +8,12 @@
        "ooui-outline-control-move-up": "Ipangato ti banag",
        "ooui-outline-control-remove": "Ikkaten ti banag",
        "ooui-toolbar-more": "Adu pay",
+       "ooui-toolgroup-expand": "Adu pay",
+       "ooui-toolgroup-collapse": "Basbassit",
        "ooui-dialog-message-accept": "Sige",
        "ooui-dialog-message-reject": "Ukasen",
        "ooui-dialog-process-error": "Adda madi a napasamak",
        "ooui-dialog-process-dismiss": "Pugsayen",
-       "ooui-dialog-process-retry": "Padasen manen"
+       "ooui-dialog-process-retry": "Padasen manen",
+       "ooui-dialog-process-continue": "Agtuloy"
 }
index 6442342..ec86124 100644 (file)
@@ -5,7 +5,8 @@
                        "Miya",
                        "Penn Station",
                        "Shirayuki",
-                       "Takot"
+                       "Takot",
+                       "Los688"
                ]
        },
        "ooui-outline-control-move-down": "項目を下に移動させる",
@@ -18,5 +19,6 @@
        "ooui-dialog-message-reject": "キャンセル",
        "ooui-dialog-process-error": "エラーが発生しました…",
        "ooui-dialog-process-dismiss": "閉じる",
-       "ooui-dialog-process-retry": "もう一度お試しください"
+       "ooui-dialog-process-retry": "もう一度お試しください",
+       "ooui-dialog-process-continue": "続行"
 }
index d261e2d..7b3176f 100644 (file)
@@ -18,6 +18,7 @@
        "ooui-outline-control-remove": "Remover elemento",
        "ooui-toolbar-more": "Mais",
        "ooui-toolgroup-expand": "Mais",
+       "ooui-toolgroup-collapse": "Menos",
        "ooui-dialog-message-accept": "Aceitar",
        "ooui-dialog-message-reject": "Cancelar",
        "ooui-dialog-process-error": "Algo correu mal",
index 0145017..122d4a2 100644 (file)
@@ -4,7 +4,10 @@
                        "Jayarathina",
                        "Sank",
                        "Shanmugamp7",
-                       "மதனாஹரன்"
+                       "மதனாஹரன்",
+                       "ElangoRamanujam"
                ]
-       }
+       },
+       "ooui-toolgroup-expand": "மேலும்",
+       "ooui-dialog-process-continue": "தொடரவும்"
 }
index 1110669..3fd8d36 100644 (file)
@@ -13,7 +13,8 @@
                        "Simon Shek",
                        "Spring Roll Conan",
                        "Waihorace",
-                       "Cwlin0416"
+                       "Cwlin0416",
+                       "LNDDYL"
                ]
        },
        "ooui-outline-control-move-down": "項目下移",
@@ -26,5 +27,6 @@
        "ooui-dialog-message-reject": "取消",
        "ooui-dialog-process-error": "發生不明錯誤",
        "ooui-dialog-process-dismiss": "關閉",
-       "ooui-dialog-process-retry": "再試一次"
+       "ooui-dialog-process-retry": "再試一次",
+       "ooui-dialog-process-continue": "繼續"
 }
index 4cac5e5..b225b4b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (05f0fefc3f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-11T16:30:00Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
        border-color: #a7dcff;
        box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
        opacity: 0.8;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index a2edf03..8c4ddfc 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (05f0fefc3f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:33Z
+ * Date: 2014-11-11T16:29:49Z
  */
 /* Instantiation */
 
index 5bf6e69..14ad38f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (05f0fefc3f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-11T16:30:00Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
        border-color: #a7dcff;
        box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
        opacity: 0.8;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index 90355a2..34db397 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (05f0fefc3f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-11T16:30:00Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #0274ff;
        border-radius: 0.1em;
        border-color: #aaaaaa;
        box-shadow: inset 0.4em 0 0 0 #0274ff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
        box-shadow: inset 0.4em 0 0 0 #cccccc;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.4em;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index cd436e2..1ef5bca 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (05f0fefc3f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:33Z
+ * Date: 2014-11-11T16:29:49Z
  */
 /**
  * @class
index 0d399f9..aa5605a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (05f0fefc3f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-11T16:30:00Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #0274ff;
        border-radius: 0.1em;
        border-color: #aaaaaa;
        box-shadow: inset 0.4em 0 0 0 #0274ff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
        box-shadow: inset 0.4em 0 0 0 #cccccc;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.4em;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index 387df23..a8d0029 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (05f0fefc3f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:33Z
+ * Date: 2014-11-11T16:29:49Z
  */
 ( function ( OO ) {
 
@@ -202,6 +202,7 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$pending] Element to mark as pending, defaults to this.$element
  */
 OO.ui.PendingElement = function OoUiPendingElement( config ) {
        // Configuration initialization
@@ -1438,7 +1439,6 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [size] Symbolic name of dialog size, `small`, `medium`, `large` or `full`; omit to
  *   use #static-size
- * @fires initialize
  */
 OO.ui.Window = function OoUiWindow( config ) {
        // Configuration initialization
@@ -1820,7 +1820,7 @@ OO.ui.Window.prototype.getTeardownProcess = function () {
  * instead of display.
  *
  * @param {boolean} [show] Make window visible, omit to toggle visibility
- * @fires visible
+ * @fires toggle
  * @chainable
  */
 OO.ui.Window.prototype.toggle = function ( show ) {
@@ -2081,7 +2081,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
 
        this.getTeardownProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
-               win.$element.removeClass( 'oo-ui-window-setup' ).width();
+               win.$element.removeClass( 'oo-ui-window-load oo-ui-window-setup' ).width();
                win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
                win.$element.hide();
                win.visible = false;
@@ -2094,10 +2094,9 @@ OO.ui.Window.prototype.teardown = function ( data ) {
 /**
  * Load the frame contents.
  *
- * Once the iframe's stylesheets are loaded, the `load` event will be emitted and the returned
- * promise will be resolved. Calling while loading will return a promise but not trigger a new
- * loading cycle. Calling after loading is complete will return a promise that's already been
- * resolved.
+ * Once the iframe's stylesheets are loaded the returned promise will be resolved. Calling while
+ * loading will return a promise but not trigger a new loading cycle. Calling after loading is
+ * complete will return a promise that's already been resolved.
  *
  * Sounds simple right? Read on...
  *
@@ -2126,12 +2125,13 @@ OO.ui.Window.prototype.teardown = function ( data ) {
  * All this stylesheet injection and polling magic is in #transplantStyles.
  *
  * @return {jQuery.Promise} Promise resolved when loading is complete
- * @fires load
  */
 OO.ui.Window.prototype.load = function () {
        var sub, doc, loading,
                win = this;
 
+       this.$element.addClass( 'oo-ui-window-load' );
+
        // Non-isolated windows are already "loaded"
        if ( !this.loading && !this.isolated ) {
                this.loading = $.Deferred().resolve();
@@ -2855,13 +2855,10 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
 
        // Window opening
        if ( opening.state() !== 'rejected' ) {
-               // Begin loading the window if it's not loading or loaded already - may take noticable time
-               // and we want to do this in parallel with any other preparatory actions
-               if ( !win.isLoading() && !win.isLoaded() ) {
-                       // Finish initializing the window (must be done after manager is attached to DOM)
+               if ( !win.getManager() ) {
                        win.setManager( this );
-                       preparing.push( win.load() );
                }
+               preparing.push( win.load() );
 
                if ( this.closing ) {
                        // If a window is currently closing, wait for it to complete
@@ -9928,7 +9925,6 @@ OO.ui.LabelWidget.prototype.onClick = function () {
  * @constructor
  * @param {Mixed} data Option data
  * @param {Object} [config] Configuration options
- * @cfg {string} [rel] Value for `rel` attribute in DOM, allowing per-option styling
  */
 OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
        // Configuration initialization
@@ -9951,7 +9947,6 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
        // Initialization
        this.$element
                .data( 'oo-ui-optionWidget', this )
-               .attr( 'rel', config.rel )
                .attr( 'role', 'option' )
                .addClass( 'oo-ui-optionWidget' )
                .append( this.$label );
index 35a44cb..913f901 100644 (file)
                &:active,
                &:focus {
                        + label {
-                               &::after {
-                                       content: '';
-                                       position: absolute;
-                                       width: @checkboxSize;
-                                       height: @checkboxSize - @focusBottomBorderSize + 0.08; // offset by bottom border
-                                       // offset from the checkbox by 1px to account for left border
-                                       left: 1px;
-                                       border-bottom: solid @focusBottomBorderSize lightgrey;
+                               &::before {
+                                       box-shadow: inset 0 -@focusBottomBorderSize 0 0 lightgrey;
                                }
                        }
                }
index 592a309..499b91a 100644 (file)
 // You generally don't need to use this class if <label> is within an Agora
 // form container such as mw-ui-vform
 .mw-ui-label {
-       .agora-label-styling(); // mixins/forms.less
+       .agora-label-styling();
 }
 
 // Nesting an input  inside a label with this class
 // improves alignment, e.g.
-//     <label class="mw-ui-radio-label">
-//             <input type="radio">The label text
-//     </label>
+//
+// <label class="mw-ui-radio-label">
+//   <input type="radio">The label text
+// </label>
 .mw-ui-radio-label {
        .agora-inline-label-styling();
 }
index 95d3c40..05275c8 100644 (file)
@@ -783,7 +783,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * Utility method taking an array of elements and wrapping
-        * each element in it's own array. Useful for data providers
+        * each element in its own array. Useful for data providers
         * that only return a single argument.
         *
         * @since 1.20
index f2a720e..f4d1799 100644 (file)
@@ -13,6 +13,7 @@ class MWFunctionTest extends MediaWikiTestCase {
                $args = array( $arg1, $arg2, $arg3, $arg4 );
 
                $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
+               $this->hideDeprecated( 'MWFunction::newObj' );
                $this->assertEquals(
                        MWFunction::newObj( 'MWBlankClass', $args )->args,
                        $newObject->args
index 7657633..f0ac6ac 100644 (file)
@@ -172,18 +172,20 @@ class FormatJsonTest extends MediaWikiTestCase {
        /**
         * Test data for testParseTryFixing.
         *
-        * HHVM has a lenient json parser (yeah great idea right?) which allows
-        * trailing commas for array and object delarations among other things, so
-        * our JSON_ERROR_SYNTAX rescue block is not always triggered. It however
-        * isn't lenient in exactly the same ways as our TRY_FIXING mode, so the
-        * assertions in this test are a bit more complicated than they ideally
-        * would be:
+        * Some PHP interpreters use json-c rather than the JSON.org cannonical
+        * parser to avoid being encumbered by the "shall be used for Good, not
+        * Evil" clause of the JSON.org parser's license. By default, json-c
+        * parses in a non-strict mode which allows trailing commas for array and
+        * object delarations among other things, so our JSON_ERROR_SYNTAX rescue
+        * block is not always triggered. It however isn't lenient in exactly the
+        * same ways as our TRY_FIXING mode, so the assertions in this test are
+        * a bit more complicated than they ideally would be:
         *
-        * Optional third argument: true if hhvm parses the value without
+        * Optional third argument: true if json-c parses the value without
         * intervention, false otherwise. Defaults to true.
         *
-        * Optional fourth argument: expected cannonical JSON serialization of HHVM
-        * parsed result. Defaults to the second argument's value.
+        * Optional fourth argument: expected cannonical JSON serialization of
+        * json-c parsed result. Defaults to the second argument's value.
         */
        public static function provideParseTryFixing() {
                return array(
@@ -207,23 +209,24 @@ class FormatJsonTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideParseTryFixing
         * @param string $value
-        * @param string|bool $expected Expected result with Zend PHP
-        * @param bool $hhvmParses Will HHVM parse this value without TRY_FIXING?
-        * @param string|bool $expectedHHVM Expected result with HHVM if different
-        * from the PHP5 expectation
+        * @param string|bool $expected Expected result with strict parser
+        * @param bool $jsoncParses Will json-c parse this value without TRY_FIXING?
+        * @param string|bool $expectedJsonc Expected result with lenient parser
+        * if different from the strict expectation
         */
        public function testParseTryFixing(
                $value, $expected,
-               $hhvmParses = true, $expectedHHVM = null
+               $jsoncParses = true, $expectedJsonc = null
        ) {
                // PHP5 results are always expected to have isGood() === false
                $expectedGoodStatus = false;
 
-               if ( wfIsHHVM() ) {
-                       // Use HHVM specific expected result if provided
-                       $expected = ( $expectedHHVM === null ) ? $expected : $expectedHHVM;
-                       // If HHVM parses the value natively, expect isGood() === true
-                       $expectedGoodStatus = $hhvmParses;
+               // Check to see if json parser allows trailing commas
+               if ( json_decode( '[1,]' ) !== null ) {
+                       // Use json-c specific expected result if provided
+                       $expected = ( $expectedJsonc === null ) ? $expected : $expectedJsonc;
+                       // If json-c parses the value natively, expect isGood() === true
+                       $expectedGoodStatus = $jsoncParses;
                }
 
                $st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
diff --git a/tests/phpunit/includes/libs/ObjectFactoryTest.php b/tests/phpunit/includes/libs/ObjectFactoryTest.php
new file mode 100644 (file)
index 0000000..8c2f12c
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
+       public function testClosureExpansionDisabled() {
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+                       'closure_expansion' => false,
+               ) );
+               $this->assertInstanceOf( 'Closure', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0]() );
+       }
+
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
+       public function testClosureExpansionEnabled() {
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+                       'closure_expansion' => true,
+               ) );
+               $this->assertInternalType( 'string', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0] );
+
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+               ) );
+               $this->assertInternalType( 'string', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0] );
+       }
+}
+
+class ObjectFactoryTest_Fixture {
+       public $args;
+       public function __construct( /*...*/ ) { $this->args = func_get_args(); }
+}
diff --git a/tests/phpunit/includes/libs/XhprofTest.php b/tests/phpunit/includes/libs/XhprofTest.php
new file mode 100644 (file)
index 0000000..e0e68e0
--- /dev/null
@@ -0,0 +1,312 @@
+<?php
+/**
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @uses Xhprof
+ * @uses AutoLoader
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @since 1.25
+ */
+class XhprofTest extends PHPUnit_Framework_TestCase {
+
+       public function setUp() {
+               if ( !function_exists( 'xhprof_enable' ) ) {
+                       $this->markTestSkipped( 'No xhprof support detected.' );
+               }
+       }
+
+       /**
+        * @covers Xhprof::splitKey
+        * @dataProvider provideSplitKey
+        */
+       public function testSplitKey( $key, $expect ) {
+               $this->assertSame( $expect, Xhprof::splitKey( $key ) );
+       }
+
+       public function provideSplitKey() {
+               return array(
+                       array( 'main()', array( null, 'main()' ) ),
+                       array( 'foo==>bar', array( 'foo', 'bar' ) ),
+                       array( 'bar@1==>bar@2', array( 'bar@1', 'bar@2' ) ),
+                       array( 'foo==>bar==>baz', array( 'foo', 'bar==>baz' ) ),
+                       array( '==>bar', array( '', 'bar' ) ),
+                       array( '', array( null, '' ) ),
+               );
+       }
+
+       /**
+        * @covers Xhprof::__construct
+        * @covers Xhprof::stop
+        * @covers Xhprof::getRawData
+        * @dataProvider provideRawData
+        */
+       public function testRawData( $flags, $keys ) {
+               $xhprof = new Xhprof( array( 'flags' => $flags ) );
+               $raw = $xhprof->getRawData();
+               $this->assertArrayHasKey( 'main()', $raw );
+               foreach ( $keys as $key ) {
+                       $this->assertArrayHasKey( $key, $raw['main()'] );
+               }
+       }
+
+       public function provideRawData() {
+               return array(
+                       array( 0, array( 'ct', 'wt' ) ),
+                       array( XHPROF_FLAGS_MEMORY, array( 'ct', 'wt', 'mu', 'pmu' ) ),
+                       array( XHPROF_FLAGS_CPU, array( 'ct', 'wt', 'cpu' ) ),
+                       array( XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU, array(
+                               'ct', 'wt', 'mu', 'pmu', 'cpu',
+                       ) ),
+               );
+       }
+
+       /**
+        * @covers Xhprof::pruneData
+        */
+       public function testInclude() {
+               $xhprof = $this->getXhprofFixture( array(
+                       'include' => array( 'main()' ),
+               ) );
+               $raw = $xhprof->getRawData();
+               $this->assertArrayHasKey( 'main()', $raw );
+               $this->assertArrayHasKey( 'main()==>foo', $raw );
+               $this->assertArrayHasKey( 'main()==>xhprof_disable', $raw );
+               $this->assertSame( 3, count( $raw ) );
+       }
+
+       /**
+        * Validate the structure of data returned by
+        * Xhprof::getInclusiveMetrics(). This acts as a guard against unexpected
+        * structural changes to the returned data in lieu of using a more heavy
+        * weight typed response object.
+        *
+        * @covers Xhprof::getInclusiveMetrics
+        */
+       public function testInclusiveMetricsStructure() {
+               $metricStruct = array(
+                       'ct' => 'int',
+                       'wt' => 'array',
+                       'cpu' => 'array',
+                       'mu' => 'array',
+                       'pmu' => 'array',
+               );
+               $statStruct = array(
+                       'total' => 'numeric',
+                       'min' => 'numeric',
+                       'mean' => 'numeric',
+                       'max' => 'numeric',
+                       'variance' => 'numeric',
+                       'percent' => 'numeric',
+               );
+
+               $xhprof = $this->getXhprofFixture();
+               $metrics = $xhprof->getInclusiveMetrics();
+
+               foreach ( $metrics as $name => $metric ) {
+                       $this->assertArrayStructure( $metricStruct, $metric );
+
+                       foreach ( $metricStruct as $key => $type ) {
+                               if ( $type === 'array' ) {
+                                       $this->assertArrayStructure( $statStruct, $metric[$key] );
+                                       if ( $name === 'main()' ) {
+                                               $this->assertEquals( 100, $metric[$key]['percent'] );
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Validate the structure of data returned by
+        * Xhprof::getCompleteMetrics(). This acts as a guard against unexpected
+        * structural changes to the returned data in lieu of using a more heavy
+        * weight typed response object.
+        *
+        * @covers Xhprof::getCompleteMetrics
+        */
+       public function testCompleteMetricsStructure() {
+               $metricStruct = array(
+                       'ct' => 'int',
+                       'wt' => 'array',
+                       'cpu' => 'array',
+                       'mu' => 'array',
+                       'pmu' => 'array',
+                       'calls' => 'array',
+                       'subcalls' => 'array',
+               );
+               $statsMetrics = array( 'wt', 'cpu', 'mu', 'pmu' );
+               $statStruct = array(
+                       'total' => 'numeric',
+                       'min' => 'numeric',
+                       'mean' => 'numeric',
+                       'max' => 'numeric',
+                       'variance' => 'numeric',
+                       'percent' => 'numeric',
+                       'exclusive' => 'numeric',
+               );
+
+               $xhprof = $this->getXhprofFixture();
+               $metrics = $xhprof->getCompleteMetrics();
+
+               foreach ( $metrics as $name => $metric ) {
+                       $this->assertArrayStructure( $metricStruct, $metric, $name );
+
+                       foreach ( $metricStruct as $key => $type ) {
+                               if ( in_array( $key, $statsMetrics ) ) {
+                                       $this->assertArrayStructure(
+                                               $statStruct, $metric[$key], $key
+                                       );
+                                       $this->assertLessThanOrEqual(
+                                               $metric[$key]['total'], $metric[$key]['exclusive']
+                                       );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @covers Xhprof::getCallers
+        * @covers Xhprof::getCallees
+        * @uses Xhprof
+        */
+       public function testEdges() {
+               $xhprof = $this->getXhprofFixture();
+               $this->assertSame( array(), $xhprof->getCallers( 'main()' ) );
+               $this->assertSame( array( 'foo', 'xhprof_disable' ),
+                       $xhprof->getCallees( 'main()' )
+               );
+               $this->assertSame( array( 'main()' ),
+                       $xhprof->getCallers( 'foo' )
+               );
+               $this->assertSame( array(), $xhprof->getCallees( 'strlen' ) );
+       }
+
+       /**
+        * @covers Xhprof::getCriticalPath
+        * @uses Xhprof
+        */
+       public function testCriticalPath() {
+               $xhprof = $this->getXhprofFixture();
+               $path = $xhprof->getCriticalPath();
+
+               $last = null;
+               foreach ( $path as $key => $value ) {
+                       list( $func, $call ) = Xhprof::splitKey( $key );
+                       $this->assertSame( $last, $func );
+                       $last = $call;
+               }
+               $this->assertSame( $last, 'bar@1' );
+       }
+
+       /**
+        * Get an Xhprof instance that has been primed with a set of known testing
+        * data. Tests for the Xhprof class should laregly be concerned with
+        * evaluating the manipulations of the data collected by xhprof rather
+        * than the data collection process itself.
+        *
+        * The returned Xhprof instance primed will be with a data set created by
+        * running this trivial program using the PECL xhprof implementation:
+        * @code
+        * function bar( $x ) {
+        *   if ( $x > 0 ) {
+        *     bar($x - 1);
+        *   }
+        * }
+        * function foo() {
+        *   for ( $idx = 0; $idx < 2; $idx++ ) {
+        *     bar( $idx );
+        *     $x = strlen( 'abc' );
+        *   }
+        * }
+        * xhprof_enable( XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY );
+        * foo();
+        * $x = xhprof_disable();
+        * var_export( $x );
+        * @endcode
+        *
+        * @return Xhprof
+        */
+       protected function getXhprofFixture( array $opts = array() ) {
+               $xhprof = new Xhprof( $opts );
+               $xhprof->loadRawData( array (
+                       'foo==>bar' => array (
+                               'ct' => 2,
+                               'wt' => 57,
+                               'cpu' => 92,
+                               'mu' => 1896,
+                               'pmu' => 0,
+                       ),
+                       'foo==>strlen' => array (
+                               'ct' => 2,
+                               'wt' => 21,
+                               'cpu' => 141,
+                               'mu' => 752,
+                               'pmu' => 0,
+                       ),
+                       'bar==>bar@1' => array (
+                               'ct' => 1,
+                               'wt' => 18,
+                               'cpu' => 19,
+                               'mu' => 752,
+                               'pmu' => 0,
+                       ),
+                       'main()==>foo' => array (
+                               'ct' => 1,
+                               'wt' => 304,
+                               'cpu' => 307,
+                               'mu' => 4008,
+                               'pmu' => 0,
+                       ),
+                       'main()==>xhprof_disable' => array (
+                               'ct' => 1,
+                               'wt' => 8,
+                               'cpu' => 10,
+                               'mu' => 768,
+                               'pmu' => 392,
+                       ),
+                       'main()' => array (
+                               'ct' => 1,
+                               'wt' => 353,
+                               'cpu' => 351,
+                               'mu' => 6112,
+                               'pmu' => 1424,
+                       ),
+               ) );
+               return $xhprof;
+       }
+
+       /**
+        * Assert that the given array has the described structure.
+        *
+        * @param array $struct Array of key => type mappings
+        * @param array $actual Array to check
+        * @param string $label
+        */
+       protected function assertArrayStructure( $struct, $actual, $label = null ) {
+               $this->assertInternalType( 'array', $actual, $label );
+               $this->assertCount( count($struct), $actual, $label );
+               foreach ( $struct as $key => $type ) {
+                       $this->assertArrayHasKey( $key, $actual );
+                       $this->assertInternalType( $type, $actual[$key] );
+               }
+       }
+}
diff --git a/tests/phpunit/includes/libs/cdb/CdbTest.php b/tests/phpunit/includes/libs/cdb/CdbTest.php
new file mode 100644 (file)
index 0000000..487ee1f
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Test the CDB reader/writer
+ * @covers CdbWriterPHP
+ * @covers CdbWriterDBA
+ */
+class CdbTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               if ( !CdbReader::haveExtension() ) {
+                       $this->markTestSkipped( 'Native CDB support is not available' );
+               }
+       }
+
+       /**
+        * @group medium
+        */
+       public function testCdb() {
+               $dir = wfTempDir();
+               if ( !is_writable( $dir ) ) {
+                       $this->markTestSkipped( "Temp dir isn't writable" );
+               }
+
+               $phpcdbfile = $this->getNewTempFile();
+               $dbacdbfile = $this->getNewTempFile();
+
+               $w1 = new CdbWriterPHP( $phpcdbfile );
+               $w2 = new CdbWriterDBA( $dbacdbfile );
+
+               $data = array();
+               for ( $i = 0; $i < 1000; $i++ ) {
+                       $key = $this->randomString();
+                       $value = $this->randomString();
+                       $w1->set( $key, $value );
+                       $w2->set( $key, $value );
+
+                       if ( !isset( $data[$key] ) ) {
+                               $data[$key] = $value;
+                       }
+               }
+
+               $w1->close();
+               $w2->close();
+
+               $this->assertEquals(
+                       md5_file( $phpcdbfile ),
+                       md5_file( $dbacdbfile ),
+                       'same hash'
+               );
+
+               $r1 = new CdbReaderPHP( $phpcdbfile );
+               $r2 = new CdbReaderDBA( $dbacdbfile );
+
+               foreach ( $data as $key => $value ) {
+                       if ( $key === '' ) {
+                               // Known bug
+                               continue;
+                       }
+                       $v1 = $r1->get( $key );
+                       $v2 = $r2->get( $key );
+
+                       $v1 = $v1 === false ? '(not found)' : $v1;
+                       $v2 = $v2 === false ? '(not found)' : $v2;
+
+                       # cdbAssert( 'Mismatch', $key, $v1, $v2 );
+                       $this->cdbAssert( "PHP error", $key, $v1, $value );
+                       $this->cdbAssert( "DBA error", $key, $v2, $value );
+               }
+       }
+
+       private function randomString() {
+               $len = mt_rand( 0, 10 );
+               $s = '';
+               for ( $j = 0; $j < $len; $j++ ) {
+                       $s .= chr( mt_rand( 0, 255 ) );
+               }
+
+               return $s;
+       }
+
+       private function cdbAssert( $msg, $key, $v1, $v2 ) {
+               $this->assertEquals(
+                       $v2,
+                       $v1,
+                       $msg . ', k=' . bin2hex( $key )
+               );
+       }
+}
diff --git a/tests/phpunit/includes/utils/CdbTest.php b/tests/phpunit/includes/utils/CdbTest.php
deleted file mode 100644 (file)
index 487ee1f..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-/**
- * Test the CDB reader/writer
- * @covers CdbWriterPHP
- * @covers CdbWriterDBA
- */
-class CdbTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-               if ( !CdbReader::haveExtension() ) {
-                       $this->markTestSkipped( 'Native CDB support is not available' );
-               }
-       }
-
-       /**
-        * @group medium
-        */
-       public function testCdb() {
-               $dir = wfTempDir();
-               if ( !is_writable( $dir ) ) {
-                       $this->markTestSkipped( "Temp dir isn't writable" );
-               }
-
-               $phpcdbfile = $this->getNewTempFile();
-               $dbacdbfile = $this->getNewTempFile();
-
-               $w1 = new CdbWriterPHP( $phpcdbfile );
-               $w2 = new CdbWriterDBA( $dbacdbfile );
-
-               $data = array();
-               for ( $i = 0; $i < 1000; $i++ ) {
-                       $key = $this->randomString();
-                       $value = $this->randomString();
-                       $w1->set( $key, $value );
-                       $w2->set( $key, $value );
-
-                       if ( !isset( $data[$key] ) ) {
-                               $data[$key] = $value;
-                       }
-               }
-
-               $w1->close();
-               $w2->close();
-
-               $this->assertEquals(
-                       md5_file( $phpcdbfile ),
-                       md5_file( $dbacdbfile ),
-                       'same hash'
-               );
-
-               $r1 = new CdbReaderPHP( $phpcdbfile );
-               $r2 = new CdbReaderDBA( $dbacdbfile );
-
-               foreach ( $data as $key => $value ) {
-                       if ( $key === '' ) {
-                               // Known bug
-                               continue;
-                       }
-                       $v1 = $r1->get( $key );
-                       $v2 = $r2->get( $key );
-
-                       $v1 = $v1 === false ? '(not found)' : $v1;
-                       $v2 = $v2 === false ? '(not found)' : $v2;
-
-                       # cdbAssert( 'Mismatch', $key, $v1, $v2 );
-                       $this->cdbAssert( "PHP error", $key, $v1, $value );
-                       $this->cdbAssert( "DBA error", $key, $v2, $value );
-               }
-       }
-
-       private function randomString() {
-               $len = mt_rand( 0, 10 );
-               $s = '';
-               for ( $j = 0; $j < $len; $j++ ) {
-                       $s .= chr( mt_rand( 0, 255 ) );
-               }
-
-               return $s;
-       }
-
-       private function cdbAssert( $msg, $key, $v1, $v2 ) {
-               $this->assertEquals(
-                       $v2,
-                       $v1,
-                       $msg . ', k=' . bin2hex( $key )
-               );
-       }
-}