Merge "Fixed some @params documentation (includes/*)"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 22 Apr 2014 09:57:32 +0000 (09:57 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 22 Apr 2014 09:57:32 +0000 (09:57 +0000)
113 files changed:
RELEASE-NOTES-1.23
RELEASE-NOTES-1.24
docs/hooks.txt
img_auth.php
includes/AutoLoader.php
includes/DefaultSettings.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filerepo/FileRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bn.json
includes/installer/i18n/de.json
includes/installer/i18n/es.json
includes/installer/i18n/it.json
includes/installer/i18n/ko.json
includes/installer/i18n/lrc.json
includes/installer/i18n/nb.json
includes/installer/i18n/sl.json
includes/installer/i18n/tl.json
includes/installer/i18n/vi.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/libs/ProcessCacheLRU.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/CoreTagHooks.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/StripState.php
includes/parser/Tidy.php
includes/profiler/Profiler.php
includes/profiler/ProfilerMwprof.php
includes/profiler/ProfilerSimpleDB.php
includes/profiler/ProfilerSimpleText.php
includes/profiler/ProfilerSimpleTrace.php
includes/profiler/ProfilerSimpleUDP.php
includes/profiler/ProfilerStandard.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/search/SearchPostgres.php
includes/specials/SpecialSearch.php
includes/templates/Usercreate.php
includes/title/MalformedTitleException.php
includes/title/MediaWikiPageLinkRenderer.php
includes/title/MediaWikiTitleCodec.php
includes/title/PageLinkRenderer.php
includes/title/TitleFormatter.php
includes/title/TitleParser.php
includes/title/TitleValue.php
languages/Language.php
languages/LanguageConverter.php
languages/i18n/am.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/ce.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/egl.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/fi.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/it.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/mg.json
languages/i18n/mn.json
languages/i18n/nan.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/sah.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/utils/CLDRPluralRuleConverter.php
languages/utils/CLDRPluralRuleConverterExpression.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverterFragment.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverterOperator.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverter_Expression.php [deleted file]
languages/utils/CLDRPluralRuleConverter_Fragment.php [deleted file]
languages/utils/CLDRPluralRuleConverter_Operator.php [deleted file]
languages/utils/CLDRPluralRuleError.php
languages/utils/CLDRPluralRuleEvaluator.php
languages/utils/CLDRPluralRuleEvaluatorRange.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleEvaluator_Range.php [deleted file]
maintenance/generateJsonI18n.php
resources/lib/oojs-ui/i18n/diq.json
resources/lib/oojs-ui/i18n/he.json
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/mediawiki.less/mediawiki.mixins.less
skins/common/commonPrint.css
thumb.php

index 2b1dba3..22520d3 100644 (file)
@@ -57,6 +57,7 @@ production.
 * $wgProfileOnly is now deprecated; set the log file in
   $wgDebugLogGroups['profileoutput'] to replace it.
 * $wgMaxBacklinksInvalidate was removed; use $wgJobBackoffThrottling instead
+* Deprecated ResourceLoaderGetStartupModules hook.
 
 === New features in 1.23 ===
 * ResourceLoader can utilize the Web Storage API to cache modules client-side.
index 500d19f..fd422fa 100644 (file)
@@ -33,6 +33,12 @@ changes to languages because of Bugzilla reports.
 * The Special:Search hooks SpecialSearchGo and SpecialSearchResultsAppend
   were removed as they were unused.
 
+==== Renamed classes ====
+* CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
+* CLDRPluralRuleConverter_Fragment to CLDRPluralRuleConverterFragment
+* CLDRPluralRuleConverter_Operator to CLDRPluralRuleConverterOperator
+* CLDRPluralRuleEvaluator_Range to CLDRPluralRuleEvaluatorRange
+
 == Compatibility ==
 
 MediaWiki 1.24 requires PHP 5.3.2 or later.
index de4bc3b..80f388b 100644 (file)
@@ -2096,7 +2096,7 @@ configuration variables to JavaScript. Things that depend on the current page
 or request state must be added through MakeGlobalVariablesScript instead.
 &$vars: array( variable name => value )
 
-'ResourceLoaderGetStartupModules': Run once the startup module is being
+'ResourceLoaderGetStartupModules': DEPRECATED. Run once the startup module is being
 generated. This allows you to add modules to the startup module. This hook
 should be used sparingly since any module added here will be loaded on all
 pages. This hook is useful if you want to make code available to module loader
index e139227..dc3dcd8 100644 (file)
@@ -52,12 +52,13 @@ wfImageAuthMain();
 wfLogProfilingData();
 
 function wfImageAuthMain() {
-       global $wgImgAuthPublicTest, $wgImgAuthUrlPathMap, $wgRequest;
+       global $wgImgAuthPublicTest, $wgImgAuthUrlPathMap;
+
+       $request = RequestContext::getMain()->getRequest();
+       $publicWiki = in_array( 'read', User::getGroupPermissions( array( '*' ) ), true );
 
        // See if this is a public Wiki (no protections).
-       if ( $wgImgAuthPublicTest
-               && in_array( 'read', User::getGroupPermissions( array( '*' ) ), true )
-       ) {
+       if ( $wgImgAuthPublicTest && $publicWiki ) {
                // This is a public wiki, so disable this script (for private wikis only)
                wfForbidden( 'img-auth-accessdenied', 'img-auth-public' );
                return;
@@ -81,7 +82,7 @@ function wfImageAuthMain() {
        if ( $extension != '' ) {
                $whitelist[] = $extension;
        }
-       if ( !$wgRequest->checkUrlExtension( $whitelist ) ) {
+       if ( !$request->checkUrlExtension( $whitelist ) ) {
                return;
        }
 
@@ -118,45 +119,63 @@ function wfImageAuthMain() {
        if ( strpos( $path, '/thumb/' ) === 0 ) {
                $name = wfBaseName( dirname( $path ) ); // file is a thumbnail
                $filename = $repo->getZonePath( 'thumb' ) . substr( $path, 6 ); // strip "/thumb"
+               // Check to see if the file exists
+               if ( !$repo->fileExists( $filename ) ) {
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
+                       return;
+               }
        } else {
                $name = wfBaseName( $path ); // file is a source file
                $filename = $repo->getZonePath( 'public' ) . $path;
+               // Check to see if the file exists and is not deleted
+               $bits = explode( '!', $name, 2 );
+               if ( substr( $path, 0, 9 ) === '/archive/' && count( $bits ) == 2 ) {
+                       $file = $repo->newFromArchiveName( $bits[1], $name );
+               } else {
+                       $file = $repo->newFile( $name );
+               }
+               if ( !$file->exists() || $file->isDeleted( File::DELETED_FILE ) ) {
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
+                       return;
+               }
        }
 
-       // Check to see if the file exists
-       if ( !$repo->fileExists( $filename ) ) {
-               wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
-               return;
-       }
+       $headers = array(); // extra HTTP headers to send
 
-       $title = Title::makeTitleSafe( NS_FILE, $name );
-       if ( !$title instanceof Title ) { // files have valid titles
-               wfForbidden( 'img-auth-accessdenied', 'img-auth-badtitle', $name );
-               return;
-       }
+       if ( !$publicWiki ) {
+               // For private wikis, run extra auth checks and set cache control headers
+               $headers[] = 'Cache-Control: private';
+               $headers[] = 'Vary: Cookie';
 
-       // Run hook for extension authorization plugins
-       /** @var $result array */
-       $result = null;
-       if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
-               wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
-               return;
-       }
+               $title = Title::makeTitleSafe( NS_FILE, $name );
+               if ( !$title instanceof Title ) { // files have valid titles
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-badtitle', $name );
+                       return;
+               }
 
-       // Check user authorization for this title
-       // Checks Whitelist too
-       if ( !$title->userCan( 'read' ) ) {
-               wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $name );
-               return;
+               // Run hook for extension authorization plugins
+               /** @var $result array */
+               $result = null;
+               if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
+                       wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
+                       return;
+               }
+
+               // Check user authorization for this title
+               // Checks Whitelist too
+               if ( !$title->userCan( 'read' ) ) {
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $name );
+                       return;
+               }
        }
 
-       if ( $wgRequest->getCheck( 'download' ) ) {
-               header( 'Content-Disposition: attachment' );
+       if ( $request->getCheck( 'download' ) ) {
+               $headers[] = 'Content-Disposition: attachment';
        }
 
        // Stream the requested file
        wfDebugLog( 'img_auth', "Streaming `" . $filename . "`." );
-       $repo->streamFile( $filename, array( 'Cache-Control: private', 'Vary: Cookie' ) );
+       $repo->streamFile( $filename, $headers );
 }
 
 /**
index de19e85..e8adf3e 100644 (file)
@@ -834,8 +834,10 @@ $wgAutoloadLocalClasses = array(
        'ProfilerSimpleText' => 'includes/profiler/ProfilerSimpleText.php',
        'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
        'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
+       'ProfilerStandard' => 'includes/profiler/ProfilerStandard.php',
        'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
        'ProfileSection' => 'includes/profiler/Profiler.php',
+       'TransactionProfiler' => 'includes/profiler/Profiler.php',
 
        # includes/rcfeed
        'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php',
@@ -1125,11 +1127,11 @@ $wgAutoloadLocalClasses = array(
        'Language' => 'languages/Language.php',
        'LanguageConverter' => 'languages/LanguageConverter.php',
        'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleConverter.php',
-       'CLDRPluralRuleConverter_Expression' => 'languages/utils/CLDRPluralRuleConverter_Expression.php',
-       'CLDRPluralRuleConverter_Fragment' => 'languages/utils/CLDRPluralRuleConverter_Fragment.php',
-       'CLDRPluralRuleConverter_Operator' => 'languages/utils/CLDRPluralRuleConverter_Operator.php',
+       'CLDRPluralRuleConverterExpression' => 'languages/utils/CLDRPluralRuleConverterExpression.php',
+       'CLDRPluralRuleConverterFragment' => 'languages/utils/CLDRPluralRuleConverterFragment.php',
+       'CLDRPluralRuleConverterOperator' => 'languages/utils/CLDRPluralRuleConverterOperator.php',
        'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleEvaluator_Range' => 'languages/utils/CLDRPluralRuleEvaluator_Range.php',
+       'CLDRPluralRuleEvaluatorRange' => 'languages/utils/CLDRPluralRuleEvaluatorRange.php',
        'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleError.php',
 
        # maintenance
index c0c2e22..b6860b9 100644 (file)
@@ -4771,6 +4771,13 @@ $wgRateLimits = array(
                'ip' => null,
                'subnet' => null,
        ),
+       'renderfile-nonstandard' => array( // same as above but for non-standard thumbnails
+               'anon' => null,
+               'user' => null,
+               'newbie' => null,
+               'ip' => null,
+               'subnet' => null,
+       ),
 );
 
 /**
index 79c17aa..7156fba 100644 (file)
@@ -1217,10 +1217,10 @@ abstract class FileBackend {
         * @param array $params Parameters include:
         *   - srcs        : list of source storage paths
         *   - latest      : use the latest available data
+        * @return bool All requests proceeded without I/O errors (since 1.24)
         * @since 1.23
         */
-       public function preloadFileStat( array $params ) {
-       }
+       abstract public function preloadFileStat( array $params );
 
        /**
         * Lock the files at the given storage paths in the backend.
index c39bbaf..bfffcc0 100644 (file)
@@ -669,7 +669,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        public function preloadFileStat( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               $this->backends[$this->masterIndex]->preloadFileStat( $realParams );
+               return $this->backends[$this->masterIndex]->preloadFileStat( $realParams );
        }
 
        public function getScopedLocksForOps( array $ops, Status $status ) {
index 5776013..ce4dedd 100644 (file)
@@ -1102,19 +1102,35 @@ abstract class FileBackendStore extends FileBackend {
                        $paths = array_merge( $paths, $op->storagePathsRead() );
                        $paths = array_merge( $paths, $op->storagePathsChanged() );
                }
+
+               // Enlarge the cache to fit the stat entries of these files
+               $this->cheapCache->resize( max( 2 * count( $paths ), self::CACHE_CHEAP_SIZE ) );
+
                // Load from the persistent container caches
                $this->primeContainerCache( $paths );
                // Get the latest stat info for all the files (having locked them)
-               $this->preloadFileStat( array( 'srcs' => $paths, 'latest' => true ) );
+               $ok = $this->preloadFileStat( array( 'srcs' => $paths, 'latest' => true ) );
 
-               // Actually attempt the operation batch...
-               $opts = $this->setConcurrencyFlags( $opts );
-               $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
+               if ( $ok ) {
+                       // Actually attempt the operation batch...
+                       $opts = $this->setConcurrencyFlags( $opts );
+                       $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
+               } else {
+                       // If we could not even stat some files, then bail out...
+                       $subStatus = Status::newFatal( 'backend-fail-internal', $this->name );
+                       foreach ( $ops as $i => $op ) { // mark each op as failed
+                               $subStatus->success[$i] = false;
+                               ++$subStatus->failCount;
+                       }
+               }
 
                // Merge errors into status fields
                $status->merge( $subStatus );
                $status->success = $subStatus->success; // not done in merge()
 
+               // Shrink the stat cache back to normal size
+               $this->cheapCache->resize( self::CACHE_CHEAP_SIZE );
+
                return $status;
        }
 
@@ -1282,11 +1298,12 @@ abstract class FileBackendStore extends FileBackend {
 
        final public function preloadFileStat( array $params ) {
                $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $success = true; // no network errors
 
                $params['concurrency'] = ( $this->parallelize !== 'off' ) ? $this->concurrency : 1;
                $stats = $this->doGetFileStatMulti( $params );
                if ( $stats === null ) {
-                       return; // not supported
+                       return true; // not supported
                }
 
                $latest = !empty( $params['latest'] ); // use latest data?
@@ -1318,9 +1335,12 @@ abstract class FileBackendStore extends FileBackend {
                                        array( 'hash' => false, 'latest' => $latest ) );
                                wfDebug( __METHOD__ . ": File $path does not exist.\n" );
                        } else { // an error occurred
+                               $success = false;
                                wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
                        }
                }
+
+               return $success;
        }
 
        /**
index 1fc91d8..8701849 100644 (file)
@@ -1244,7 +1244,7 @@ class FileRepo {
                        // This will check if the archive file also exists and fail if does.
                        // This is a sanity check to avoid data loss. On Windows and Linux,
                        // copy() will overwrite, so the existence check is vulnerable to
-                       // race conditions unless an functioning LockManager is used.
+                       // race conditions unless a functioning LockManager is used.
                        // LocalFile also uses SELECT FOR UPDATE for synchronization.
                        $operations[] = array(
                                'op' => 'copy',
index fb20e96..84daa80 100644 (file)
@@ -1031,7 +1031,7 @@ abstract class File {
                        $tmpFile->bind( $thumb ); // keep alive with $thumb
 
                        if ( !$thumb ) { // bad params?
-                               $thumb = null;
+                               $thumb = false;
                        } elseif ( $thumb->isError() ) { // transform error
                                $this->lastError = $thumb->toText();
                                // Ignore errors if requested
index f9b4f47..dbf6918 100644 (file)
@@ -1168,16 +1168,19 @@ class LocalFile extends File {
                // Trim spaces on user supplied text
                $comment = trim( $comment );
 
-               // truncate nicely or the DB will do it for us
+               // Truncate nicely or the DB will do it for us
                // non-nicely (dangling multi-byte chars, non-truncated version in cache).
                $comment = $wgContLang->truncate( $comment, 255 );
                $this->lock(); // begin
                $status = $this->publish( $srcPath, $flags, $options );
 
-               if ( $status->successCount > 0 ) {
-                       # Essentially we are displacing any existing current file and saving
-                       # a new current file at the old location. If just the first succeeded,
-                       # we still need to displace the current DB entry and put in a new one.
+               if ( $status->successCount >= 2 ) {
+                       // There will be a copy+(one of move,copy,store).
+                       // The first succeeding does not commit us to updating the DB
+                       // since it simply copied the current version to a timestamped file name.
+                       // It is only *preferable* to avoid leaving such files orphaned.
+                       // Once the second operation goes through, then the current version was
+                       // updated and we must therefore update the DB too.
                        if ( !$this->recordUpload2( $status->value, $comment, $pageText, $props, $timestamp, $user ) ) {
                                $status->fatal( 'filenotfound', $srcPath );
                        }
@@ -1999,7 +2002,8 @@ class LocalFileDeleteBatch {
                        $res = $dbw->select(
                                'oldimage',
                                array( 'oi_archive_name', 'oi_sha1' ),
-                               array( 'oi_archive_name' => array_keys( $oldRels ) ),
+                               array( 'oi_archive_name' => array_keys( $oldRels ),
+                                       'oi_name' => $this->file->getName() ), // performance
                                __METHOD__
                        );
 
index 6a6f8d1..1cd295f 100644 (file)
        "config-mssql-auth": "Тып аўтэнтыфікацыі:",
        "config-mssql-install-auth": "Абярыце тып аўтэнтыфікацыі, які будзе выкарыстаны для злучэньня з базай зьвестак падчас працэсу ўсталяваньня.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
        "config-mssql-web-auth": "Абярыце тып аўтэнтыфікацыі, які вэб-сэрвэр будзе выкарыстоўваць для злучэньня з базай зьвестак падчас звычайнага функцыянаваньня вікі.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
+       "config-mssql-sqlauth": "Аўтэнтыфікацыя SQL-сэрвэра",
+       "config-mssql-windowsauth": "Windows-аўтэнтыфікацыя",
        "config-site-name": "Назва вікі:",
        "config-site-name-help": "Назва будзе паказвацца ў загалоўку браўзэра і ў некаторых іншых месцах.",
        "config-site-name-blank": "Увядзіце назву сайта.",
index 0ad55b9..2c2b9e1 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Bellayet",
                        "Wikitanvir",
-                       "Aftab1995"
+                       "Aftab1995",
+                       "Tauhid16"
                ]
        },
        "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
        "config-page-existingwiki": "ইতিমধ্যেই থাকা উইকি",
        "config-restart": "হ্যাঁ, পুনরায় চালু করুন",
        "config-env-php": "পিএইচপি $1 ইন্সটল করা হয়েছে।",
+       "config-apc": "[http://www.php.net/apc এপিসি] ইনস্টল হয়েছে",
        "config-db-type": "ডেটাবেজের ধরন:",
        "config-db-host": "ডেটাবেজের হোস্ট:",
+       "config-db-wiki-settings": "এই উইকি সনাক্ত করুন",
+       "config-db-name": "উপাত্তসংগ্রহশালা নামঃ",
        "config-db-install-account": "ইন্সটলের জন্য ব্যবহারকারী অ্যাকাউন্ট",
        "config-db-username": "ডেটাবেজের ব্যবহারকারী নাম:",
        "config-db-password": "ডেটাবেজের শব্দচাবি:",
index 8f160d6..1bc4945 100644 (file)
@@ -12,7 +12,8 @@
                        "Wikinaut",
                        "아라",
                        "Se4598",
-                       "Suriyaa Kudo"
+                       "Suriyaa Kudo",
+                       "Das Schäfchen"
                ]
        },
        "config-desc": "Das MediaWiki-Installationsprogramm",
@@ -64,7 +65,7 @@
        "config-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [//www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
        "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\nDie folgenden Datenbanksysteme werden unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von <code>./configure --with-mysqli</code>.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das <code>php5-mysql</code>-Paket installieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
-       "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
+       "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, sodass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
        "config-register-globals": "'''Warnung: Der Parameter <code>[http://php.net/register_globals register_globals]</code> von PHP ist aktiviert.'''\n'''Sie sollte deaktiviert werden, sofern dies möglich ist.'''\nDie MediaWiki-Installation wird zwar laufen, wobei aber der Server für potentielle Sicherheitsprobleme anfällig ist.",
        "config-magic-quotes-runtime": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/function.set-magic-quotes-runtime.php set_magic_quotes_runtime]</code> von PHP ist aktiviert!'''\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
        "config-magic-quotes-sybase": "<strong>Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/sybase.configuration.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!</strong>\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
        "config-pcre-old": "<strong>Fataler Fehler:</strong> PCRE $1 oder neuer ist erforderlich!\nDie vorhandene PHP-Binärdatei ist mit PCRE $2 verknüpft.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Weitere Informationen].",
        "config-pcre-no-utf8": "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.\nMediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein.",
        "config-memory-raised": "Der PHP-Parameter <code>memory_limit</code> betrug $1 und wurde auf $2 erhöht.",
-       "config-memory-bad": "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte daher scheitern!",
+       "config-memory-bad": "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte eventuell scheitern!",
        "config-ctype": "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.",
        "config-json": "<strong>Fataler Fehler:</strong> PHP wurde ohne Unterstützung für JSON kompiliert.\nVor der Installation von MediaWiki muss entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren werden.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.\n* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, nutzen nicht mehr die PHP-Erweiterung, sondern stattdessen die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert",
        "config-apc": "[http://www.php.net/apc APC] ist installiert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert",
        "config-no-cache": "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] wurden nicht gefunden.\nDas Objektcaching kann daher nicht aktiviert werden.",
-       "config-mod-security": "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen beliebige Inhalte im Wiki einzustellen.\nFür weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
+       "config-mod-security": "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen, beliebige Inhalte im Wiki einzustellen.\nFür weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
        "config-diff3-bad": "GNU diff3 wurde nicht gefunden.",
        "config-git": "Die Versionsverwaltungssoftware „Git“ wurde gefunden: <code>$1</code>.",
        "config-git-bad": "Die Versionsverwaltungssoftware „Git“ wurde nicht gefunden.",
        "config-no-cli-uri": "'''Warnung''': Es wurde kein Pfad zum Skipt (<code>--scriptpath</code>) angegeben. Daher wird der Standardpfad genutzt: <code>$1</code>.",
        "config-using-server": "Der Servername „<nowiki>$1</nowiki>“ wird verwendet.",
        "config-using-uri": "Die Server-URL „<nowiki>$1$2</nowiki>“ wird verwendet.",
-       "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen diese [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
+       "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen, diese [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
        "config-no-cli-uploads-check": "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien (<code>$1</code>) wird, während der Installation über die Kommandozeile, nicht auf Sicherheitsanfälligkeiten hinsichtlich willkürlicher Skriptausführungen geprüft.",
        "config-brokenlibxml": "Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.\nAktualisiere auf libxml2 2.7.3 oder später, um das Problem zu lösen. Installationsabbruch ([https://bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).",
-       "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.\nSofern möglich sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> auf 1024 oder höher festgelegt werden.\nGleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> auf den selben Wert eingestellt werden.",
+       "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.\nSofern möglich, sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> auf 1024 oder höher festgelegt werden.\nGleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> auf den selben Wert eingestellt werden.",
        "config-db-type": "Datenbanksystem:",
        "config-db-host": "Datenbankserver:",
        "config-db-host-help": "Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.\n\nSofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den zutreffenden Servernamen in seiner Dokumentation angegeben haben.\n\nSofern auf einem Windows-Server installiert und MySQL genutzt wird, funktioniert der Servername „localhost“ voraussichtlich nicht. Wenn nicht, sollte  „127.0.0.1“ oder die lokale IP-Adresse angegeben werden.\n\nSofern PostgresQL genutzt wird, muss dieses Feld leer gelassen werden, um über ein Unix-Socket zu verbinden.",
        "config-db-name": "Datenbankname:",
        "config-db-name-help": "Bitte einen Namen angeben, mit dem das Wiki identifiziert werden kann.\nDabei sollten keine Leerzeichen verwendet werden.\n\nSofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den Datenbanknamen angegeben oder aber die Erstellung einer Datenbank über ein entsprechendes Interface gestattet haben.",
        "config-db-name-oracle": "Datenbankschema:",
-       "config-db-account-oracle-warn": "Es gibt drei von MediaWiki unterstützte Möglichkeiten Oracle als Datenbank einzurichten:\n\nSofern das Datenbankbenutzerkonto während des Installationsvorgangs erstellt werden soll, muss ein Datenbankbenutzerkonto mit der SYSDBA-Berechtigung zusammen mit den entsprechenden Anmeldeinformationen angegeben werden, mit dem dann über das Web auf die Datenbank zugegriffen werden kann. Alternativ kann man auch lediglich ein einzelnes manuell angelegtes Datenbankbenutzerkonto angeben, mit dem über das Web auf die Datenbank zugegriffen werden kann, sofern dieses über die Berechtigung zur Erstellung von Datenbankschemen verfügt. Zudem ist es möglich zwei Datenbankbenutzerkonten anzugeben von denen eines die Berechtigung zur Erstellung von Datenbankschemen hat und das andere, um mit ihm über das Web auf die Datenbank zuzugreifen.\n\nEin Skript zum Anlegen eines Datenbankbenutzerkontos mit den notwendigen Berechtigungen findet man unter dem Pfad „…/maintenance/oracle/“ dieser MediaWiki-Installation. Es ist dabei zu bedenken, dass die Verwendung eines Datenbankbenutzerkontos mit beschränkten Berechtigungen die Nutzung der Wartungsfunktionen für das Standarddatenbankbenutzerkonto deaktiviert.",
+       "config-db-account-oracle-warn": "Es gibt drei von MediaWiki unterstützte Möglichkeiten, Oracle als Datenbank einzurichten:\n\nSofern das Datenbankbenutzerkonto während des Installationsvorgangs erstellt werden soll, muss ein Datenbankbenutzerkonto mit der SYSDBA-Berechtigung zusammen mit den entsprechenden Anmeldeinformationen angegeben werden, mit dem dann über das Web auf die Datenbank zugegriffen werden kann. Alternativ kann man auch lediglich ein einzelnes manuell angelegtes Datenbankbenutzerkonto angeben, mit dem über das Web auf die Datenbank zugegriffen werden kann, sofern dieses über die Berechtigung zur Erstellung von Datenbankschemen verfügt. Zudem ist es möglich, zwei Datenbankbenutzerkonten anzugeben, von denen eines die Berechtigung zur Erstellung von Datenbankschemen hat und das andere, um mit ihm über das Web auf die Datenbank zuzugreifen.\n\nEin Skript zum Anlegen eines Datenbankbenutzerkontos mit den notwendigen Berechtigungen findet man unter dem Pfad „…/maintenance/oracle/“ dieser MediaWiki-Installation. Es ist dabei zu bedenken, dass die Verwendung eines Datenbankbenutzerkontos mit beschränkten Berechtigungen die Nutzung der Wartungsfunktionen für das Standarddatenbankbenutzerkonto deaktiviert.",
        "config-db-install-account": "Benutzerkonto für die Installation",
        "config-db-username": "Name des Datenbankbenutzers:",
        "config-db-password": "Passwort des Datenbankbenutzers:",
-       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObzwar es möglich ist Datenbankbenutzer ohne Passwort anzulegen, so ist dies aber nicht sicher.",
+       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObzwar es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies aber nicht sicher.",
        "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
        "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
        "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
        "config-db-wiki-account": "Benutzerkonto für den normalen Betrieb",
        "config-db-wiki-help": "Bitte Benutzernamen und Passwort angeben, die der Webserver während des Normalbetriebes dazu verwenden soll, eine Verbindung zum Datenbankserver herzustellen.\nSofern ein entsprechendes Benutzerkonto nicht vorhanden ist und das Benutzerkonto für den Installationsvorgang über ausreichende Berechtigungen verfügt, wird dieses Benutzerkonto automatisch mit den Mindestberechtigungen zum Normalbetrieb des Wikis angelegt.",
        "config-db-prefix": "Datenbanktabellenpräfix:",
-       "config-db-prefix-help": "Sofern eine Datenbank für mehrere Wikiinstallationen oder eine Wikiinstallation und eine andere Programminstallation genutzt werden soll, muss ein Datenbanktabellenpräfix angegeben werden, um Datenbankprobleme zu vermeiden.\nEs können keine Leerzeichen verwendet werden.\n\nGewöhnlich bleibt dieses Datenfeld leer.",
+       "config-db-prefix-help": "Sofern eine Datenbank für mehrere Wikiinstallationen oder eine Wikiinstallation und eine andere Programminstallation genutzt werden soll, muss ein Datenbanktabellenpräfix angegeben werden, um Datenbankprobleme zu vermeiden.\nEs können keine Leerzeichen verwendet werden.\n\nGewöhnlich bleibt dieses Feld leer.",
        "config-db-charset": "Datenbankzeichensatz",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binär",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
index 8ee1c9d..30229b4 100644 (file)
        "config-install-mainpage": "Creando página principal con contenido predeterminado",
        "config-install-extension-tables": "Creando las tablas para las extensiones habilitadas",
        "config-install-mainpage-failed": "No se pudo insertar la página principal: $1",
-       "config-install-done": "''' Felicidades!'''\nHa instalado MediaWiki correctamente.\n\nEl instalador ha generado un  archivo<code>LocalSettings.php</code>.\nContiene toda su configuración.\n\nDeberá descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). Debería haber comenzado automáticamente la descarga.\n\nSi no comenzó la descarga, o si se ha cancelado, puede reiniciar la descarga haciendo clic en el enlace siguiente:\n$3\n\n'''Nota''': Si no haces esto ahora, este archivo de configuración generado no estará disponible para usted más tarde si sale de la instalación sin descargarlo.\n\nCuando lo haya hecho, usted puede '''[$2  entrar en su wiki]'''.",
+       "config-install-done": "<strong>¡Felicidades!</strong>\nHas instalado MediaWiki correctamente.\n\nEl instalador ha generado un  archivo <code>LocalSettings.php</code>.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\n<strong>Nota</strong>: Si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás <strong>[$2  entrar en tu wiki]</strong>.",
        "config-download-localsettings": "Descargar archivo <code>LocalSettings.php</code>",
        "config-help": "Ayuda",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
index 0064dce..2c14345 100644 (file)
@@ -7,7 +7,8 @@
                        "Gianfranco",
                        "Karika",
                        "아라",
-                       "Lucas2"
+                       "Lucas2",
+                       "Ontsed"
                ]
        },
        "config-desc": "Il programma di installazione per MediaWiki",
        "config-db-username": "Nome utente del database:",
        "config-db-password": "Password del database:",
        "config-db-password-empty": "Inserire una password per il nuovo utente del database: $1.\nAnche se può essere possibile creare utenti senza password, questo non è sicuro.",
-       "config-db-username-empty": "È necessario immettere un valore per \"Nome utente del database\"",
+       "config-db-username-empty": "È necessario immettere un valore per \"{{int:config-db-username}}\"",
        "config-db-install-username": "Inserisci il nome utente che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesto non è il nome utente dell'account MediaWiki; ma quello per il tuo database.",
        "config-db-install-password": "Inserisci la password che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesta non è la password dell'account MediaWiki; ma quella per il tuo database.",
        "config-db-install-help": "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
        "config-header-oracle": "Impostazioni Oracle",
        "config-header-mssql": "Impostazioni di Microsoft SQL Server",
        "config-invalid-db-type": "Tipo di database non valido",
-       "config-missing-db-name": "È necessario immettere un valore per \"Nome del database\"",
+       "config-missing-db-name": "È necessario immettere un valore per \"{{int:config-db-name}}\".",
        "config-missing-db-host": "È necessario immettere un valore per \"Host del database\"",
-       "config-missing-db-server-oracle": "È necessario immettere un valore per \"TNS del database\"",
+       "config-missing-db-server-oracle": "È necessario immettere un valore per \"{{int:config-db-host-oracle}}\".",
        "config-invalid-db-name": "Nome di database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
        "config-invalid-db-prefix": "Prefisso database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
        "config-connection-error": "$1.\n\nControlla host, nome utente e password e prova ancora.",
index 68be0b2..5b891bb 100644 (file)
        "config-db-username": "데이터베이스 사용자 이름:",
        "config-db-password": "데이터베이스 비밀번호:",
        "config-db-password-empty": "새 데이터베이스 사용자의 비밀번호를 입력하세요: $1.\n비밀번호 없이 사용자를 만들 수도 있지만 안전하지 않습니다.",
+       "config-db-username-empty": "\"{{int:config-db-username}}\"에 대한 값을 입력해야 합니다.",
        "config-db-install-username": "설치 과정 도중 데이터베이스에 연결할 때 사용할 사용자 이름을 입력하세요.\n미디어위키 계정의 사용자 이름이 아닌 데이터베이스의 사용자 이름입니다.",
        "config-db-install-password": "설치 과정 도중 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요.\n미디어위키 계정의 비밀번호가 아닌 데이터베이스의 비밀번호입니다.",
        "config-db-install-help": "설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름과 비밀번호를 입력하세요.",
        "config-header-oracle": "Oracle 설정",
        "config-header-mssql": "마이크로소프트 SQL 서버 설정",
        "config-invalid-db-type": "잘못된 데이터베이스 종류",
-       "config-missing-db-name": "\"데이터베이스 이름\"에 대한 값을 입력해야 합니다",
-       "config-missing-db-host": "\"데이터베이스 호스트\"에 대한 값을 입력해야 합니다",
-       "config-missing-db-server-oracle": "\"데이터베이스 TNS\"에 대한 값을 입력해야 합니다",
+       "config-missing-db-name": "\"{{int:config-db-name}}\"에 대한 값을 입력해야 합니다.",
+       "config-missing-db-host": "\"{{int:config-db-host}}\"에 대한 값을 입력해야 합니다.",
+       "config-missing-db-server-oracle": "\"{{int:config-db-host-oracle}}\"에 대한 값을 입력해야 합니다.",
        "config-invalid-db-server-oracle": "\"$1\" 데이터베이스 TNS가 잘못됐습니다.\n\"TNS Name\"이나 \"Easy Connect\" 문자열 중 하나를 사용하세요 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm 오라클 네이밍 메서드])",
        "config-invalid-db-name": "\"$1\" 데이터베이스 이름이 잘못되었습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
        "config-invalid-db-prefix": "\"$1\" 데이터베이스 접두어가 잘못됐습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
index 112b4b5..607fc40 100644 (file)
@@ -1,11 +1,24 @@
 {
        "@metadata": {
                "authors": [
-                       "Bonevarluri"
+                       "Bonevarluri",
+                       "Mogoeilor"
                ]
        },
+       "config-information": "دونسمنيا",
        "config-your-language": "زون شما:",
        "config-wiki-language": "زون ویکی:",
        "config-page-language": "زون",
+       "config-page-welcome": "د ویکی رسانه خوش اومایت!",
+       "config-page-name": "نوم",
+       "config-page-options": "گزينه يا هنی:",
+       "config-page-install": "پورنیئن",
+       "config-page-complete": "تموم بيه!",
+       "config-page-readme": "منه بحون",
+       "config-page-copying": "د حال ورداشتن",
+       "config-page-upgradedoc": "د حالت نو کردن",
+       "config-page-existingwiki": "ویکی یایی که هئن",
+       "config-restart": "هری، دواره رئش بون",
+       "config-env-php": "پی اچ پی $1  پورسته.",
        "config-install-pg-plpgsql": "وارسی سی زون پی ال/پی جی اس کیو ال"
 }
index 9a7d659..9c5344a 100644 (file)
@@ -4,7 +4,8 @@
                        "Event",
                        "Nghtwlkr",
                        "아라",
-                       "Danmichaelo"
+                       "Danmichaelo",
+                       "Jeblad"
                ]
        },
        "config-desc": "Installasjonsprogrammet for MediaWiki",
        "config-db-username": "Databasebrukernavn:",
        "config-db-password": "Databasepassord:",
        "config-db-password-empty": "Skriv inn et passord for den nye databasebrukeren: $1.\nDet er mulig å opprette brukere uten passord, men dette er ikke sikkert.",
+       "config-db-username-empty": "Du må skrive inn en verdi for «{{int:config-db-username}}»",
        "config-db-install-username": "Skriv inn brukernavnet som vil bli brukt til å koble til databasen under installasjonsprosessen.\nDette er ikke brukernavnet på MediaWiki-kontoen; dette er brukernavnet for databasen din.",
        "config-db-install-password": "Skriv inn passordet som vil bli brukt til å koble til databasen under installasjonsprosessen.\nDette er ikke passordet på MediaWiki-kontoen; dette er passordet for databasen din.",
        "config-db-install-help": "Skriv inn brukernavnet og passordet som vil bli brukt for å koble til databasen under installasjonsprosessen.",
        "config-header-oracle": "Oracle-innstillinger",
        "config-header-mssql": "Microsoft SQLServer-innstillinger",
        "config-invalid-db-type": "Ugyldig databasetype",
-       "config-missing-db-name": "Du må skrive inn en verdi for «Databasenavn»",
-       "config-missing-db-host": "Du må skrive inn en verdi for «Databasevert»",
-       "config-missing-db-server-oracle": "Du må skrive inn en verdi for «Database TNS»",
+       "config-missing-db-name": "Du må skrive inn en verdi for «{{int:config-db-name}}»",
+       "config-missing-db-host": "Du må skrive inn en verdi for «{{int:config-db-host}}»",
+       "config-missing-db-server-oracle": "Du må skrive inn en verdi for «{{int:config-db-host-oracle}}»",
        "config-invalid-db-server-oracle": "Ugyldig database-TNS «$1».\nBruk enten \"TNS Name\" eller en \"Easy Connect\"-streng ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
        "config-invalid-db-name": "Ugyldig databasenavn «$1».\nBruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).",
        "config-invalid-db-prefix": "Ugyldig databaseprefiks «$1».\nBruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).",
index f6df9b7..e4f1ebe 100644 (file)
@@ -75,9 +75,9 @@
        "config-header-sqlite": "Nastavitve SQLite",
        "config-header-oracle": "Nastavitve Oracle",
        "config-invalid-db-type": "Neveljavna vrsta zbirke podatkov",
-       "config-missing-db-name": "Vnesti morate vrednost za »Ime zbirke podatkov«",
-       "config-missing-db-host": "Vnesti morate vrednost za »Gostitelj zbirke podatkov«",
-       "config-missing-db-server-oracle": "Vnesti morate vrednost za »TNS zbirke podatkov«",
+       "config-missing-db-name": "Vnesti morate vrednost za »{{int:config-db-name}}«",
+       "config-missing-db-host": "Vnesti morate vrednost za »{{int:config-db-host}}«.",
+       "config-missing-db-server-oracle": "Vnesti morate vrednost za »{{int:config-db-host-oracle}}«.",
        "config-invalid-db-server-oracle": "Neveljaven TNS zbirke podatkov »$1«.\nUporabite ali \"ime TNS\" ali niz \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Načini poimenovanja Oracle])",
        "config-invalid-db-name": "Neveljavno ime zbirke podatkov »$1«.\nUporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in vezaje (-).",
        "config-invalid-db-prefix": "Neveljavna predpona zbirke podatkov »$1«.\nUporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in vezaje (-).",
index ce76620..5a309a1 100644 (file)
        "config-db-name": "Pangalan ng kalipunan ng dato:",
        "config-db-name-help": "Pumili ng isang pangalan na pangkilala sa wiki mo.\nHindi ito dapat maglaman ng mga patlang.\n\nKung gumagamit ka ng pinagsasaluhang pagpapasinaya ng sangkasaputan, ang iyong tagapagbigay ng pagpapasinaya ay maaaring bigyan ka ng isang tiyak na pangalan ng kalipunan ng datong gagamitin o papayagan kang lumikha ng mga kalipunan ng dato sa pamamagitan ng isang entrepanyong pantaban.",
        "config-db-name-oracle": "Balangkas ng kalipunan ng dato:",
-       "config-db-account-oracle-warn": "Mayroong tatlong tinatangkilik na tagpo para sa pagluluklok ng Oracle bilang panlikurang hulihan ng kalipunan ng dato:\n\nKung nais mong lumikha ng akawnt ng kalipunan ng dato bilang bahagi ng proseso ng pagluluklok, paki magbigay ng isang akawnt na mayroong gampanin ng SYSDBA bilang akawnt ng kalipunan ng dato para sa pagluluklok at tukuyin ang ninanais na mga kredensiyal para sa akawnt ng pagpunta sa sangkasaputan, o di kaya ay maaaring kinakamay na lumikha ng akawnt ng pagpunta sa sangkasaputan at ibigay lamang ang akawnt na iyan (kung mayroong ito ng kinakailangang mga pahintulot upang malikha ang mga bagay na pampagpapanukala) o magbigay ng dalawang magkaibang mga akawnt, isang mayroong pribilehiyo ng paglikha at isang may pagbabawal para sa pagpunta sa sangkasaputan.\n\nAng panitik sa paglikha ng isang akawnt na mayroon ng kinakailangang mga pribilehiyo ay matatagpuan sa loob ng direktoryong \"maintenance/oracle/\" ng pagluluklok na ito. Pakatandaan na ang paggamit ng isang akawnt na may pagbabawal ay hindi magpapagana isa lahat ng mga kakayahang pampananatili sa piling ng likas na nakatakdang akawnt.",
-       "config-db-install-account": "Akawnt ng tagagamit para sa pagluluklok",
+       "config-db-account-oracle-warn": "Mayroong tatlong suportadong senaryo para sa pag-install ng Oracle bilang database backend:\n\nKung nais mong lumikha ng account ng database bilang bahagi ng proseso ng pag-install, paki magbigay ng isang account na mayroong gampanin ng SYSDBA bilang account ng database para sa pag-install at tukuyin ang ninanais na mga kredensiyal para sa account ng web-access, o di kaya ay maaaring gawing manu-mano ang paglikha ng account ng web access at ibigay lamang ang account na iyan (kung mayroong ito ng kinakailangang mga pahintulot upang malikha ang mga schema object) o magbigay ng dalawang magkaibang mga account, isang mayroong pribilehiyo ng paglikha at isang may pagbabawal para sa web access.\n\nAng script sa paglikha ng isang account na mayroon ng kinakailangang mga pribilehiyo ay matatagpuan sa loob ng directory na \"maintenance/oracle/\" ng pag-install na ito. Pakatandaan na ang paggamit ng isang account na may pagbabawal ay hindi magpapagana sa lahat ng mga kakayahang pampananatili kasama ang nakatakdang account.",
+       "config-db-install-account": "Account ng tagagamit para sa pagluluklok",
        "config-db-username": "Pangalang pangtagagamit ng kalipunan ng dato:",
        "config-db-password": "Password sa kalipunan ng dato:",
        "config-db-password-empty": "Paki magpasok ng isang hudyat para sa bagong tagagamit ng kalipunan ng dato: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga hudyat, hindi ito ligtas.",
-       "config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa kalipunan ng dato habang isinasagawa ang pagluluklok.\nHindi ito ang pangalan ng tagagamit ng akawnt ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong kalipunan ng dato.",
-       "config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa akawnt ng MediaWiki; ito ang password para sa iyong database.",
+       "config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa database habang isinasagawa ang pag-install.\nHindi ito ang pangalan ng tagagamit ng account ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong database.",
+       "config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa account ng MediaWiki; ito ang password para sa iyong database.",
        "config-db-install-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.",
        "config-db-account-lock": "Gamitin ang kaparehong pangalan at password habang nasa normal na operasyon",
-       "config-db-wiki-account": "Akawnt ng tagagamit para sa pangkaraniwang pagpapaandar",
-       "config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang kumabit sa kalipunan ng dato habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang akawnt, at ang akawnt ng pagluluklok ay mayroong sapat na mga pribilehiyo, ang akawnt na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
+       "config-db-wiki-account": "Account ng tagagamit para sa pangkaraniwang pagpapaandar",
+       "config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang kumabit sa database habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang account, at ang pag-install ng account ay mayroong sapat na mga pribilehiyo, ang account na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
        "config-db-prefix": "Unlapi ng talahanayan ng kalipunan ng dato:",
        "config-db-prefix-help": "Kung kailangan mong ibahagi ang isang kalipunan ng dato sa pagitan ng maramihang mga wiki, o sa pagitan ng MediaWiki at ibang aplikasyon ng kasaputan, maaaring piliin mo na magdagdag ng isang unlapi sa lahat ng mga pangalan ng talahanayan upang maiwasan ang mga salungatan.\nHuwag gumamit ng mga patlang.\n\nAng hanay na ito ay karaniwang iniiwanang walang laman.",
        "config-db-charset": "Pangkat ng panitik ng kalipunan ng dato",
        "config-invalid-db-prefix": "Hindi tanggap na unlapi ng kalipunan ng dato na \"$1\".\nGamitin lamang ang mga titik na ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga gitling (-).",
        "config-connection-error": "$1.\n\nSuriin ang host, pangalan at password na nasa ibaba at subukan ulit.",
        "config-invalid-schema": "Hindi katanggap-tanggap na panukala para sa \"$1\" ng MediaWiki.\nGumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), at mga salungguhit (_).",
-       "config-db-sys-create-oracle": "Ang panluklok ay tumatangkilik lamang sa paggamit ng isang akawnt ng SYSDBA para sa paglikha ng isang bagong akawnt.",
-       "config-db-sys-user-exists-oracle": "Umiiral na ang akawnt ng tagagamit na \"$1\". Magagamit lamang ang SYSDBA para sa paglikha ng isang bagong akawnt!",
+       "config-db-sys-create-oracle": "Ang installer ay sumusuporta lamang sa paggamit ng isang account ng SYSDBA para sa paglikha ng isang bagong account.",
+       "config-db-sys-user-exists-oracle": "Umiiral na ang account ng tagagamit na \"$1\". Magagamit lamang ang SYSDBA para sa paglikha ng isang bagong account!",
        "config-postgres-old": "Kailangan ang PostgreSQL $1 o mas bago, mayroon kang $2.",
        "config-sqlite-name-help": "Pumili ng isang pangalan na pangkilala na wiki mo.\nHuwag gumamit ng mga puwang o mga gitling.\nGagamitin ito para sa pangalan ng talaksan ng dato ng SQLite.",
        "config-sqlite-parent-unwritable-group": "Hindi malikha ang direktoryo ng dato na <code><nowiki>$1</nowiki></code>, sapagkat ang magulang na direktoryong <code><nowiki>$2</nowiki></code> ay hindi masulatan ng tagapaghain ng kasaputan.\n\nNapag-alaman ng tagapagluklok kung sinong tagagamit ang kinatatakbuhan ng iyong tagapaghain ng kasaputan.\nGawing nasusulatan nito ang <code><nowiki>$3</nowiki></code> ng direktoryo upang makapagpatuloy.\nIto ang gawin sa ibabaw ng isang sistema ng Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-regenerate": "Muling likhain ang LocalSettings.php →",
        "config-show-table-status": "Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!",
        "config-unknown-collation": "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
-       "config-db-web-account": "Akawnt ng kalipunan ng dato para sa pagpunta sa web",
+       "config-db-web-account": "Account ng kalipunan ng dato para sa pagpunta sa web",
        "config-db-web-help": "Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.",
-       "config-db-web-account-same": "Gamitin ang gayun din akawnt katulad ng sa pagluluklok",
-       "config-db-web-create": "Likhain ang akawnt kung hindi pa ito umiiral",
-       "config-db-web-no-create-privs": "Ang tinukoy mong akawnt na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang akawnt.\nAng akawnt na tutukuyin mo rito ay umiiral na dapat.",
+       "config-db-web-account-same": "Gamitin ang gayun din account katulad ng sa pag-install",
+       "config-db-web-create": "Likhain ang account kung hindi pa ito umiiral",
+       "config-db-web-no-create-privs": "Ang tinukoy mong account na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang account.\nAng account na tutukuyin mo rito ay umiiral na dapat.",
        "config-mysql-engine": "Makinang imbakan:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-project-namespace-help": "Bilang pagsunod sa halimbawa ng Wikipedia, maraming mga wiki ang nagpapanatili ng kanilang mga pahina ng patakaran na nakahiwalay magmula sa kanilang mga pahina ng nilalaman, na nasa loob ng isang \"'''puwang na pampangalan ng proyekto'''\".\nAng lahat ng mga pamagat ng pahina na nasa loob ng puwang ng pangalang ito ay nagsisimula na mayroong isang partikular na unlapi, na maaari mong tukuyin dito.\nSa nakaugalian, ang unlaping ito ay hinango mula sa pangalan ng wiki, subalit hindi ito maaaring maglaman ng mga panitik ng palabantasan na katulad ng \"#\" o \":\".",
        "config-ns-invalid": "Ang tinukoy na puwang ng pangalan na \"<nowiki>$1</nowiki>\" ay hindi katanggap-tanggap.\nTumukoy ng isang ibang puwang ng pangalan ng proyekto.",
        "config-ns-conflict": "Ang tinukoy na puwang ng pangalan na \"<nowiki>$1</nowiki>\" ay sumasalungat sa isang likas na nakatakdang puwang ng pangalan ng MediaWiki.\nTumukoy ng isang ibang puwang ng pangalan ng proyekto.",
-       "config-admin-box": "Akawnt ng tagapangasiwa",
+       "config-admin-box": "Account ng tagapangasiwa",
        "config-admin-name": "Pangalan mo:",
        "config-admin-password": "Password:",
        "config-admin-password-confirm": "Password uli:",
        "config-admin-help": "Ipasok dito ang mas ninanais mong pangalan ng tagagamit, bilang halimbawa na ang \"Joe Bloggs\".\nIto ang pangalang gagamitin mo upang lumagdang papasok sa wiki.",
        "config-admin-name-blank": "Magpasok ng isang pangalan ng tagagamit na tagapangasiwa.",
        "config-admin-name-invalid": "Ang tinukoy na pangalan ng tagagamit na \"<nowiki>$1</nowiki>\" ay hindi tanggap.\nTumukoy ng ibang pangalan ng tagagamit.",
-       "config-admin-password-blank": "Magpasok ng isang password para sa akawnt ng tagapangasiwa.",
+       "config-admin-password-blank": "Magpasok ng isang password para sa account ng tagapangasiwa.",
        "config-admin-password-mismatch": "Hindi magkatugma ang ipinasok mong dalawang mga password.",
        "config-admin-email": "Tirahan ng e-liham:",
        "config-admin-email-help": "Magpasok dito ng isang tirahan ng e-liham upang mapahintulutan kang makatanggap ng e-liham mula sa iba pang mga tagagamit sa ibabaw ng wiki, itakdang muli ang hudyat mo, at mapabatiran ng mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang hanay na ito.",
        "config-optional-skip": "Naiinip na ako, basta iluklok na lang ang wiki.",
        "config-profile": "Balangkas ng mga karapatan ng tagagamit:",
        "config-profile-wiki": "Tradisyonal na wiki",
-       "config-profile-no-anon": "Kailangan ang paglikha ng akawnt",
+       "config-profile-no-anon": "Kailangan ang paglikha ng account",
        "config-profile-fishbowl": "Pinahintulutang mga patnugot lamang",
        "config-profile-private": "Pribadong wiki",
        "config-profile-help": "Pinaka mahusay ang pagtakbo ng mga Wiki kapag pinapahintulutan mo ang pinaka maraming mga tao na makapamatnugot ng mga ito hanggang sa maaari.\nSa loob ng MediaWiki, maginhawang masusuring muli ang kamakailang mga pagbabago, at mapanauli sa dati ang anumang nasira na nagawa ng isang walang muwang o may masamang hangarin na mga tagagamit.\n\nSubalit, marami ang nakatagpo na nagagamit ang MediaWiki sa loob ng malawak na sari-saring mga gampanin, at kung minsan ay hindi madaling makumbinsi ang lahat ng mga tao hinggil sa kapakinabangan ng kaparaanan ng wiki.\nKung kaya't nasa iyo ang pagpili.\n\nAng isang '''{{int:config-profile-wiki}}''' ay nagpapahintulot sa sinuman upang makapagbago, na hindi kailangan ang paglagdang papasok.\nAng isang wiki na mayroong '''{{int:config-profile-no-anon}}''' ay nagbibigay ng karagdagang pananagutan, subalit maaaring pumigil sa nagkataon lamang na mga tagapag-ambag.\n\nAng tagpo na '''{{int:config-profile-fishbowl}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang  makapamatnugot.\nAng isang '''{{int:config-profile-private}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang makapamatnugot.\n\nAng mas masasalimuot na mga kaayusan ng mga karapatan ng tagagamit ay makukuha pagkaraan ng pagluluklok, tingnan ang [//www.mediawiki.org/wiki/Manual:User_rights may kaugnayang kinamay na lahok].",
        "config-install-pg-commit": "Isinasagawa ang mga pagbabago",
        "config-install-pg-plpgsql": "Sumusuri ng wikang PL/pgSQL",
        "config-pg-no-plpgsql": "Kailangan mong magtalaga ng wikang PL/pgSQL sa loob ng kalipunan ng datong $1",
-       "config-pg-no-create-privs": "Ang tinukoy mong akawnt para sa pagtatalaga ay walang sapat na mga pribilehiyo upang makalikha ng isang akawnt.",
-       "config-pg-not-in-role": "Umiiral na ang akawnt na tinukoy mo para sa tagagamit ng sangkasaputan.\nAng tinukoy mong akawnt para sa pagluluklok ay hindi isang tagagamit na super at hindi isang kasapi sa gampanin ng tagagamit ng sangkasaputan, kung kaya't hindi nito nagawang makalikha ng mga bagay na pag-aari ng tagagamit ng sangkasaputan.\n\nSa kasalukuyan, nangangailangan ang MediaWiki na ang mga talahanayan ay maging pag-aari ng tagagamit ng sangkasaputan. Paki tumukoy ng isa pang pangalan ng akawnt na pangsangkasaputan, o pindutin ang \"bumalik\" at tumukoy ng isang tagagamit na may kaangkupang pribilehiyo ng pagluluklok.",
+       "config-pg-no-create-privs": "Ang tinukoy mong accountpara sa pagtatalaga ay walang sapat na mga pribilehiyo upang makalikha ng isang account.",
+       "config-pg-not-in-role": "Umiiral na ang account na tinukoy mo para sa tagagamit ng web.\nAng tinukoy mong account para sa pag-install ay hindi isang tagagamit na super at hindi isang kasapi sa gampanin ng tagagamit ng web, kung kaya't hindi nito nagawang makalikha ng mga bagay na pag-aari ng tagagamit ng web.\n\nSa kasalukuyan, nangangailangan ang MediaWiki na ang mga table ay maging pag-aari ng tagagamit ng web. Pakitukoy ng isa pang pangalan ng account na web, o pindutin ang \"bumalik\" at tumukoy ng isang tagagamit na may kaangkupang pribilehiyo ng pag-install.",
        "config-install-user": "Nililikha ang tagagamit ng kalipunan ng dato",
        "config-install-user-alreadyexists": "Umiiral na ang tagagamit na \"$1\"",
        "config-install-user-create-failed": "Nabigo ang paglikha ng tagagamit na \"$1\": $2",
        "config-install-user-grant-failed": "Nabigo ang pagbibigay ng pahintulot sa tagagamit na \"$1\": $2",
        "config-install-user-missing": "Hindi umiiral ang tinukoy na tagagamit na si \"$1\".",
-       "config-install-user-missing-create": "Hindi umiiral ang tinukoy na tagagamit na si \"$1\".\nPaki lagitikin ang nasa ibabang kahong natsetsekan na \"likhain ang akawnt\" kung nais mong likhain ito.",
+       "config-install-user-missing-create": "Hindi umiiral ang tinukoy na tagagamit na si \"$1\".\nPaki-klik ang nasa ibabang kahong natsetsekan na \"likhain ang account\" kung nais mong likhain ito.",
        "config-install-tables": "Nililikha ang mga talahanayan",
        "config-install-tables-exist": "'''Babala''': Tila umiiral na ang mga talahanayan ng MediaWiki.\nNilalaktawan ang paglikha.",
        "config-install-tables-failed": "'''Kamalian''': Nabigo ang paglikha ng talahanayan na may sumusunod na kamalian: $1",
        "config-install-stats": "Sinisimulan ang estadistika",
        "config-install-keys": "Ginagawa ang lihim na mga susi",
        "config-insecure-keys": "'''Babala:''' Nalikha ang {{PLURAL:$2|A secure key|ligtas na mga susi}} ($1) habang ang pagluluklok {{PLURAL:$2|ay|ay}} hindi pa lubos na ligtas. Isaalang-alang ang kinakamay na pagbago {{PLURAL:$2|nito|ng mga ito}}.",
-       "config-install-sysop": "Nililikha ang akawnt ng tagagamit na tagapangasiwa",
+       "config-install-sysop": "Nililikha ang account ng tagagamit na tagapangasiwa",
        "config-install-subscribe-fail": "Hindi nagawang magpasipi mula sa mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "Hindi nakalagak ang cURL at hindi makukuha ang allow_url_fopen",
        "config-install-mainpage": "Nililikha ang pangunahing pahina na may likas na nakatakdang nilalaman",
index 009ab9e..fd1e177 100644 (file)
@@ -57,6 +57,7 @@
        "config-db-install-account": "Tài khoản người dùng để cài đặt",
        "config-db-username": "Tên người dùng cơ sở dữ liệu:",
        "config-db-password": "Mật khẩu cơ sở dữ liệu:",
+       "config-db-username-empty": "Bạn phải nhập một giá trị cho “{{int:config-db-username}}”",
        "config-db-wiki-account": "Tài khoản người dùng để hoạt động bình thường",
        "config-db-prefix": "Tiền tố bảng cơ sở dữ liệu:",
        "config-db-charset": "Bảng mã cơ sở dữ liệu",
        "config-header-oracle": "Thiết lập Oracle",
        "config-header-mssql": "Thiết lập Microsoft SQL Server",
        "config-invalid-db-type": "Loại cơ sở dữ liệu không hợp lệ",
-       "config-missing-db-name": "Bạn phải nhập một giá trị cho “Tên cơ sở dữ liệu”",
-       "config-missing-db-host": "Bạn phải nhập một giá trị cho “Máy chủ cơ sở dữ liệu”",
-       "config-missing-db-server-oracle": "Bạn phải nhập một giá trị cho “TNS cơ sở dữ liệu”",
+       "config-missing-db-name": "Bạn phải nhập một giá trị cho “{{int:config-db-name}}”",
+       "config-missing-db-host": "Bạn phải nhập một giá trị cho “{{int:config-db-host}}”",
+       "config-missing-db-server-oracle": "Bạn phải nhập một giá trị cho “{{int:config-db-host-oracle}}”",
        "config-invalid-schema": "Giản đồ “$1” không hợp lệ cho MediaWiki.\nHãy chỉ sử dụng các chữ cái ASCII (a–z, A–Z), chữ số (0–9), và dấu gạch dưới (_).",
        "config-postgres-old": "Cần PostgreSQL $1 trở lên; bạn có $2.",
        "config-mssql-old": "Cần Microsoft SQL Server $1 trở lên. Bạn có $2.",
        "config-sqlite-readonly": "Không thể ghi vào tập tin <code>$1</code>.",
        "config-sqlite-cant-create-db": "Không thể tạo ra tập tin cơ sở dữ liệu <code>$1</code>.",
+       "config-sqlite-fts3-downgrade": "PHP thiếu sự hỗ trợ cho FTS3; đang giáng cấp các bảng",
+       "config-can-upgrade": "Cơ sở dữ liệu này có bảng MediaWiki.\nĐể nâng cấp các bảng đến MediaWiki $1, bấm <strong>Tiếp tục</strong>.",
        "config-regenerate": "Tạo lại LocalSettings.php →",
        "config-show-table-status": "Truy vấn <code>SHOW TABLE STATUS</code> bị thất bại!",
        "config-db-web-account": "Tài khoản cơ sở dữ liệu để truy cập Web",
index a01ab18..c2d0cdd 100644 (file)
        "config-enable-email-help": "如果您希望使用电子邮件功能,请正确配置[http://www.php.net/manual/en/mail.configuration.php PHP的邮件设定]。如果您不需要任何电子邮件功能,请在此处禁用它。",
        "config-email-user": "启用用户到用户的电子邮件",
        "config-email-user-help": "允许所有用户互发邮件,假若他们启用了该功能。",
-       "config-email-usertalk": "启用用户讨论页通知",
+       "config-email-usertalk": "å\90¯ç\94¨ç\94¨æ\88·è®¨è®ºé¡µé\9d¢é\80\9aç\9f¥",
        "config-email-usertalk-help": "允许用户收到用户讨论页被修改的通知,假若他们启用了该功能。",
        "config-email-watchlist": "启用监视列表通知",
        "config-email-watchlist-help": "允许用户收到与其监视列表有关的通知,假若他们启用了该功能。",
index 536fd8b..edbf35a 100644 (file)
@@ -8,7 +8,8 @@
                        "Mark85296341",
                        "Simon Shek",
                        "아라",
-                       "Liuxinyu970226"
+                       "Liuxinyu970226",
+                       "Xiaomingyan"
                ]
        },
        "config-desc": "MediaWiki安裝程式",
        "config-db-username": "資料庫使用者名稱:",
        "config-db-password": "資料庫密碼:",
        "config-db-password-empty": "請為新數據庫用戶$1輸入密碼。儘管您可以創建不使用密碼的用戶,但這樣做並不安全。",
+       "config-db-username-empty": "您必須鍵入用於「{{int:config-db-username}}」值",
        "config-db-install-username": "請輸入在安裝過程中用於連接數據庫的用戶名。請勿輸入MediaWiki帳號的用戶名,請輸入您數據庫的用戶名。",
        "config-db-install-password": "請輸入在安裝過程中用於連接數據庫的密碼。請勿輸入MediaWiki帳號的密碼,請輸入您數據庫的密碼。",
        "config-db-install-help": "請輸入在安裝過程中用於連接數據庫的用戶名和密碼。",
        "config-enable-email-help": "如果您希望使用電子郵件功能,請正確配置[http://www.php.net/manual/en/mail.configuration.php PHP的郵件設定]。如果您不需要任何電子郵件功能,請在此處禁用它。",
        "config-email-user": "啟用用戶到用戶的電子郵件",
        "config-email-user-help": "允許所有用戶互發郵件,假若他們啟用了該功能。",
-       "config-email-usertalk": "啟用用戶討論頁通知",
+       "config-email-usertalk": "啟用使用者討論頁面通知",
        "config-email-usertalk-help": "允許用戶收到用戶討論頁被修改的通知,假若他們啟用了該功能。",
        "config-email-watchlist": "啟用監視列表通知",
        "config-email-watchlist-help": "允許用戶收到與其監視列表有關的通知,假若他們啟用了該功能。",
index f2d9f42..f988207 100644 (file)
@@ -38,10 +38,7 @@ class ProcessCacheLRU {
         * @throws UnexpectedValueException When $maxCacheKeys is not an int or =< 0.
         */
        public function __construct( $maxKeys ) {
-               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
-                       throw new UnexpectedValueException( __METHOD__ . " must be given an integer >= 1" );
-               }
-               $this->maxCacheKeys = $maxKeys;
+               $this->resize( $maxKeys );
        }
 
        /**
@@ -119,6 +116,25 @@ class ProcessCacheLRU {
                }
        }
 
+       /**
+        * Resize the maximum number of cache entries, removing older entries as needed
+        *
+        * @param $maxKeys integer
+        * @return void
+        */
+       public function resize( $maxKeys ) {
+               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
+                       throw new UnexpectedValueException( __METHOD__ . " must be given an integer >= 1" );
+               }
+               $this->maxCacheKeys = $maxKeys;
+               while ( count( $this->cache ) > $this->maxCacheKeys ) {
+                       reset( $this->cache );
+                       $evictKey = key( $this->cache );
+                       unset( $this->cache[$evictKey] );
+                       unset( $this->cacheTimes[$evictKey] );
+               }
+       }
+
        /**
         * Push an entry to the top of the cache
         *
index dfe3c80..464bacd 100644 (file)
@@ -53,7 +53,7 @@ class CacheTime {
        }
 
        /**
-        * @param $com bool
+        * @param bool $com
         * @return bool
         */
        function setContainsOldMagic( $com ) {
@@ -63,7 +63,7 @@ class CacheTime {
        /**
         * setCacheTime() sets the timestamp expressing when the page has been rendered.
         * This does not control expiry, see updateCacheExpiry() for that!
-        * @param $t string
+        * @param string $t
         * @return string
         */
        function setCacheTime( $t ) {
@@ -80,7 +80,7 @@ class CacheTime {
 
        /**
         * @since 1.23
-        * @param $id int Revision id
+        * @param int $id Revision id
         */
        function setCacheRevisionId( $id ) {
                $this->mCacheRevisionId = $id;
@@ -94,7 +94,7 @@ class CacheTime {
         * or equal to the smallest number that was provided as an argument to
         * updateCacheExpiry().
         *
-        * @param $seconds number
+        * @param int $seconds
         */
        function updateCacheExpiry( $seconds ) {
                $seconds = (int)$seconds;
@@ -156,8 +156,8 @@ class CacheTime {
         * per-article cache invalidation timestamps, or if it comes from
         * an incompatible older version.
         *
-        * @param string $touched the affected article's last touched timestamp
-        * @return Boolean
+        * @param string $touched The affected article's last touched timestamp
+        * @return bool
         */
        public function expired( $touched ) {
                global $wgCacheEpoch;
@@ -178,8 +178,8 @@ class CacheTime {
         * deployed. Someday that should probably be changed.
         *
         * @since 1.23
-        * @param int $id the affected article's current revision id
-        * @return Boolean
+        * @param int $id The affected article's current revision id
+        * @return bool
         */
        public function isDifferentRevision( $id ) {
                $cached = $this->getCacheRevisionId();
index 02f2438..65c3e1d 100644 (file)
@@ -27,7 +27,7 @@
  */
 class CoreParserFunctions {
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @return void
         */
        static function register( $parser ) {
@@ -76,7 +76,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $part1
         * @return array
         */
@@ -144,7 +144,7 @@ class CoreParserFunctions {
         * Or to encode a value for the HTTP "path", spaces are encoded as '%20'.
         * For links to "wiki"s, or similar software, spaces are encoded as '_',
         *
-        * @param $parser Parser object
+        * @param Parser $parser
         * @param string $s The text to encode.
         * @param string $arg (optional): The type of encoding.
         * @return string
@@ -186,7 +186,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $s
         * @return
         */
@@ -196,7 +196,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $s
         * @return
         */
@@ -265,7 +265,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $num
         * @param string $arg
         * @return string
@@ -282,7 +282,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $case
         * @param string $word
         * @return
@@ -293,8 +293,8 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
-        * @param $username string
+        * @param Parser $parser
+        * @param string $username
         * @return
         */
        static function gender( $parser, $username ) {
@@ -335,7 +335,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $text
         * @return
         */
@@ -350,9 +350,9 @@ class CoreParserFunctions {
         * Override the title of the page when viewed, provided we've been given a
         * title which will normalise to the canonical title
         *
-        * @param $parser Parser: parent parser
-        * @param string $text desired title text
-        * @return String
+        * @param Parser $parser Parent parser
+        * @param string $text Desired title text
+        * @return string
         */
        static function displaytitle( $parser, $text = '' ) {
                global $wgRestrictDisplayTitle;
@@ -408,9 +408,9 @@ class CoreParserFunctions {
        /**
         * Matches the given value against the value of given magic word
         *
-        * @param string $magicword magic word key
-        * @param mixed $value value to match
-        * @return boolean true on successful match
+        * @param string $magicword Magic word key
+        * @param string $value Value to match
+        * @return bool True on successful match
         */
        private static function matchAgainstMagicword( $magicword, $value ) {
                $value = trim( strval( $value ) );
@@ -521,7 +521,7 @@ class CoreParserFunctions {
        /**
         * Functions to get and normalize pagenames, corresponding to the magic words
         * of the same names
-        * @return String
+        * @return string
         */
        static function pagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
@@ -690,9 +690,9 @@ class CoreParserFunctions {
         * Return the size of the given page, or 0 if it's nonexistent.  This is an
         * expensive parser function and can't be called too many times per page.
         *
-        * @param $parser Parser
-        * @param $page String Name of page to check (Default: empty string)
-        * @param $raw String Should number be human readable with commas or just number
+        * @param Parser $parser
+        * @param string $page Name of page to check (Default: empty string)
+        * @param string $raw Should number be human readable with commas or just number
         * @return string
         */
        static function pagesize( $parser, $page = '', $raw = null ) {
@@ -736,10 +736,10 @@ class CoreParserFunctions {
 
        /**
         * Gives language names.
-        * @param $parser Parser
-        * @param string $code  Language code (of which to get name)
-        * @param string $inLanguage  Language code (in which to get name)
-        * @return String
+        * @param Parser $parser
+        * @param string $code Language code (of which to get name)
+        * @param string $inLanguage Language code (in which to get name)
+        * @return string
         */
        static function language( $parser, $code = '', $inLanguage = '' ) {
                $code = strtolower( $code );
@@ -750,6 +750,11 @@ class CoreParserFunctions {
 
        /**
         * Unicode-safe str_pad with the restriction that $length is forced to be <= 500
+        * @param Parser $parser
+        * @param string $string
+        * @param int $length
+        * @param string $padding
+        * @param int $direction
         * @return string
         */
        static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
@@ -787,8 +792,8 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
-        * @param $text
+        * @param Parser $parser
+        * @param string $text
         * @return string
         */
        static function anchorencode( $parser, $text ) {
@@ -813,7 +818,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $text The sortkey to use
         * @param string $uarg Either "noreplace" or "noerror" (in en)
         *   both suppress errors, and noreplace does nothing if
@@ -888,6 +893,9 @@ class CoreParserFunctions {
 
        /**
         * Parser function to extension tag adaptor
+        * @param Parser $parser
+        * @param PPFrame $frame
+        * @param array $args
         * @return string
         */
        public static function tagObj( $parser, $frame, $args ) {
@@ -938,8 +946,8 @@ class CoreParserFunctions {
         * For a given title, which is equal to the current parser title,
         * the revision object from the parser is used, when that is the current one
         *
-        * @param $parser Parser
-        * @param $title Title
+        * @param Parser $parser
+        * @param Title $title
         * @return Revision
         * @since 1.23
         */
@@ -985,8 +993,8 @@ class CoreParserFunctions {
 
        /**
         * Get the pageid of a specified page
-        * @param $parser Parser
-        * @param $title string Title to get the pageid from
+        * @param Parser $parser
+        * @param string $title Title to get the pageid from
         * @since 1.23
         */
        public static function pageid( $parser, $title = null ) {
@@ -1029,8 +1037,8 @@ class CoreParserFunctions {
 
        /**
         * Get the id from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the id from
+        * @param Parser $parser
+        * @param string $title Title to get the id from
         * @since 1.23
         */
        public static function revisionid( $parser, $title = null ) {
@@ -1045,8 +1053,8 @@ class CoreParserFunctions {
 
        /**
         * Get the day from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the day from
+        * @param Parser $parser
+        * @param string $title Title to get the day from
         * @since 1.23
         */
        public static function revisionday( $parser, $title = null ) {
@@ -1061,8 +1069,8 @@ class CoreParserFunctions {
 
        /**
         * Get the day with leading zeros from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the day from
+        * @param Parser $parser
+        * @param string $title Title to get the day from
         * @since 1.23
         */
        public static function revisionday2( $parser, $title = null ) {
@@ -1077,8 +1085,8 @@ class CoreParserFunctions {
 
        /**
         * Get the month with leading zeros from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the month from
+        * @param Parser $parser
+        * @param string $title Title to get the month from
         * @since 1.23
         */
        public static function revisionmonth( $parser, $title = null ) {
@@ -1093,8 +1101,8 @@ class CoreParserFunctions {
 
        /**
         * Get the month from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the month from
+        * @param Parser $parser
+        * @param string $title Title to get the month from
         * @since 1.23
         */
        public static function revisionmonth1( $parser, $title = null ) {
@@ -1109,8 +1117,8 @@ class CoreParserFunctions {
 
        /**
         * Get the year from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the year from
+        * @param Parser $parser
+        * @param string $title Title to get the year from
         * @since 1.23
         */
        public static function revisionyear( $parser, $title = null ) {
@@ -1125,8 +1133,8 @@ class CoreParserFunctions {
 
        /**
         * Get the timestamp from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the timestamp from
+        * @param Parser $parser
+        * @param string $title Title to get the timestamp from
         * @since 1.23
         */
        public static function revisiontimestamp( $parser, $title = null ) {
@@ -1141,8 +1149,8 @@ class CoreParserFunctions {
 
        /**
         * Get the user from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the user from
+        * @param Parser $parser
+        * @param string $title Title to get the user from
         * @since 1.23
         */
        public static function revisionuser( $parser, $title = null ) {
index cbc060a..01ad97c 100644 (file)
@@ -27,7 +27,7 @@
  */
 class CoreTagHooks {
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @return void
         */
        static function register( $parser ) {
@@ -69,9 +69,9 @@ class CoreTagHooks {
         *
         * Uses undocumented extended tag hook return values, introduced in r61913.
         *
-        * @param $content string
-        * @param $attributes array
-        * @param $parser Parser
+        * @param string $content
+        * @param array $attributes
+        * @param Parser $parser
         * @throws MWException
         * @return array
         */
@@ -91,9 +91,9 @@ class CoreTagHooks {
         *
         * Uses undocumented extended tag hook return values, introduced in r61913.
         *
-        * @param $content string
-        * @param $attributes array
-        * @param $parser Parser
+        * @param string $content
+        * @param array $attributes
+        * @param Parser $parser
         * @return array
         */
        static function nowiki( $content, $attributes, $parser ) {
index d10841f..3ddc9d4 100644 (file)
@@ -49,7 +49,7 @@ class DateFormatter {
        const LAST = 8;
 
        /**
-        * @param $lang Language In which language to format the date
+        * @param Language $lang In which language to format the date
         */
        function __construct( Language $lang ) {
                $this->lang = $lang;
@@ -120,7 +120,7 @@ class DateFormatter {
        /**
         * Get a DateFormatter object
         *
-        * @param $lang Language|string|null In which language to format the date
+        * @param Language|string|null $lang In which language to format the date
         *              Defaults to the site content language
         * @return DateFormatter object
         */
@@ -142,7 +142,7 @@ class DateFormatter {
        /**
         * @param string $preference User preference
         * @param string $text Text to reformat
-        * @param array $options can contain 'linked' and/or 'match-whole'
+        * @param array $options Array can contain 'linked' and/or 'match-whole'
         *
         * @return string
         */
@@ -193,7 +193,7 @@ class DateFormatter {
        }
 
        /**
-        * @param $matches
+        * @param array $matches
         * @return string
         */
        function replace( $matches ) {
@@ -215,8 +215,8 @@ class DateFormatter {
        }
 
        /**
-        * @param $bits array
-        * @param $link bool
+        * @param array $bits
+        * @param bool $link
         * @return string
         */
        function formatDate( $bits, $link = true ) {
@@ -326,7 +326,7 @@ class DateFormatter {
 
        /**
         * Makes an ISO month, e.g. 02, from a month name
-        * @param string $monthName month name
+        * @param string $monthName Month name
         * @return string ISO month name
         */
        function makeIsoMonth( $monthName ) {
index 0e7c76f..2f95af2 100644 (file)
@@ -49,8 +49,8 @@ class LinkHolderArray {
         * serializing at present.
         *
         * Compact the titles, only serialize the text form.
-         * @return array
-         */
+        * @return array
+        */
        function __sleep() {
                foreach ( $this->internals as &$nsLinks ) {
                        foreach ( $nsLinks as &$entry ) {
@@ -88,7 +88,7 @@ class LinkHolderArray {
 
        /**
         * Merge another LinkHolderArray into this one
-        * @param $other LinkHolderArray
+        * @param LinkHolderArray $other
         */
        function merge( $other ) {
                foreach ( $other->internals as $ns => $entries ) {
@@ -110,9 +110,9 @@ class LinkHolderArray {
         * converted for use in the destination link holder. The resulting array of
         * strings will be returned.
         *
-        * @param $other LinkHolderArray
-        * @param array $texts of strings
-        * @return Array
+        * @param LinkHolderArray $other
+        * @param array $texts Array of strings
+        * @return array
         */
        function mergeForeign( $other, $texts ) {
                $this->tempIdOffset = $idOffset = $this->parent->nextLinkID();
@@ -208,8 +208,8 @@ class LinkHolderArray {
         * parsing of interwiki links, and secondly to allow all existence checks and
         * article length checks (for stub links) to be bundled into a single query.
         *
-        * @param $nt Title
-        * @param $text String
+        * @param Title $nt
+        * @param string $text
         * @param array $query [optional]
         * @param string $trail [optional]
         * @param string $prefix [optional]
@@ -253,7 +253,7 @@ class LinkHolderArray {
        /**
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
-        * @return array of link CSS classes, indexed by PDBK.
+        * @return array Array of link CSS classes, indexed by PDBK.
         */
        function replace( &$text ) {
                wfProfileIn( __METHOD__ );
@@ -267,6 +267,7 @@ class LinkHolderArray {
 
        /**
         * Replace internal links
+        * @param string $text
         */
        protected function replaceInternal( &$text ) {
                if ( !$this->internals ) {
@@ -418,6 +419,7 @@ class LinkHolderArray {
 
        /**
         * Replace interwiki links
+        * @param string $text
         */
        protected function replaceInterwiki( &$text ) {
                if ( empty( $this->interwikis ) ) {
@@ -443,6 +445,7 @@ class LinkHolderArray {
 
        /**
         * Modify $this->internals and $colours according to language variant linking rules
+        * @param array $colours
         */
        protected function doVariants( &$colours ) {
                global $wgContLang;
@@ -606,8 +609,8 @@ class LinkHolderArray {
         * Replace <!--LINK--> link placeholders with plain text of links
         * (not HTML-formatted).
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        function replaceText( $text ) {
                wfProfileIn( __METHOD__ );
@@ -624,7 +627,7 @@ class LinkHolderArray {
        /**
         * Callback for replaceText()
         *
-        * @param $matches Array
+        * @param array $matches
         * @return string
         * @private
         */
index 6818884..7423006 100644 (file)
@@ -205,7 +205,7 @@ class Parser {
        var $mUniqPrefix;
 
        /**
-        * @var Array with the language name of each language link (i.e. the
+        * @var array Array with the language name of each language link (i.e. the
         * interwiki prefix) in the key, value arbitrary. Used to avoid sending
         * duplicate language links to the ParserOutput.
         */
@@ -214,7 +214,7 @@ class Parser {
        /**
         * Constructor
         *
-        * @param $conf array
+        * @param array $conf
         */
        public function __construct( $conf = array() ) {
                $this->mConf = $conf;
@@ -346,12 +346,12 @@ class Parser {
         * Do not call this function recursively.
         *
         * @param string $text text we want to parse
-        * @param $title Title object
-        * @param $options ParserOptions
-        * @param $linestart boolean
-        * @param $clearState boolean
-        * @param int $revid number to pass in {{REVISIONID}}
-        * @return ParserOutput a ParserOutput
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param bool $linestart
+        * @param bool $clearState
+        * @param int $revid Number to pass in {{REVISIONID}}
+        * @return ParserOutput A ParserOutput
         */
        public function parse( $text, Title $title, ParserOptions $options, $linestart = true, $clearState = true, $revid = null ) {
                /**
@@ -590,7 +590,7 @@ class Parser {
         *
         * If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
         *
-        * @param string $text text extension wants to have parsed
+        * @param string $text Text extension wants to have parsed
         * @param PPFrame $frame The frame to use for expanding any template variables
         *
         * @return string
@@ -607,6 +607,10 @@ class Parser {
        /**
         * Expand templates and variables in the text, producing valid, static wikitext.
         * Also removes comments.
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param int|null $revid
         * @return mixed|string
         */
        function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null ) {
@@ -627,7 +631,7 @@ class Parser {
         * Recursive parser entry point that can be called from an extension tag
         * hook.
         *
-        * @param string $text text to be expanded
+        * @param string $text Text to be expanded
         * @param PPFrame $frame The frame to use for expanding any template variables
         * @return string
         * @since 1.19
@@ -647,11 +651,11 @@ class Parser {
         * transclusion, comments, templates, arguments, tags hooks and parser
         * functions are untouched.
         *
-        * @param $text String
-        * @param $title Title
-        * @param $options ParserOptions
-        * @param $params Array
-        * @return String
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param array $params
+        * @return string
         */
        public function getPreloadText( $text, Title $title, ParserOptions $options, $params = array() ) {
                $msg = new RawMessage( $text );
@@ -689,7 +693,7 @@ class Parser {
        /**
         * Accessor for mUniqPrefix.
         *
-        * @return String
+        * @return string
         */
        public function uniqPrefix() {
                if ( !isset( $this->mUniqPrefix ) ) {
@@ -707,7 +711,7 @@ class Parser {
        /**
         * Set the context title
         *
-        * @param $t Title
+        * @param Title $t
         */
        function setTitle( $t ) {
                if ( !$t ) {
@@ -726,7 +730,7 @@ class Parser {
        /**
         * Accessor for the Title object
         *
-        * @return Title object
+        * @return Title
         */
        function getTitle() {
                return $this->mTitle;
@@ -735,8 +739,8 @@ class Parser {
        /**
         * Accessor/mutator for the Title object
         *
-        * @param $x Title object or null to just get the current one
-        * @return Title object
+        * @param Title $x Title object or null to just get the current one
+        * @return Title
         */
        function Title( $x = null ) {
                return wfSetVar( $this->mTitle, $x );
@@ -745,7 +749,7 @@ class Parser {
        /**
         * Set the output type
         *
-        * @param int $ot new value
+        * @param int $ot New value
         */
        function setOutputType( $ot ) {
                $this->mOutputType = $ot;
@@ -762,7 +766,7 @@ class Parser {
         * Accessor/mutator for the output type
         *
         * @param int|null $x New value or null to just get the current one
-        * @return Integer
+        * @return int
         */
        function OutputType( $x = null ) {
                return wfSetVar( $this->mOutputType, $x );
@@ -771,7 +775,7 @@ class Parser {
        /**
         * Get the ParserOutput object
         *
-        * @return ParserOutput object
+        * @return ParserOutput
         */
        function getOutput() {
                return $this->mOutput;
@@ -789,7 +793,7 @@ class Parser {
        /**
         * Accessor/mutator for the ParserOptions object
         *
-        * @param $x ParserOptions New value or null to just get the current one
+        * @param ParserOptions $x New value or null to just get the current one
         * @return ParserOptions Current ParserOptions object
         */
        function Options( $x = null ) {
@@ -804,7 +808,7 @@ class Parser {
        }
 
        /**
-        * @param $id int
+        * @param int $id
         */
        function setLinkID( $id ) {
                $this->mLinkID = $id;
@@ -843,6 +847,7 @@ class Parser {
 
        /**
         * Get the language object for language conversion
+        * @return Language|null
         */
        function getConverterLanguage() {
                return $this->getTargetLanguage();
@@ -852,7 +857,7 @@ class Parser {
         * Get a User object either from $this->mUser, if set, or from the
         * ParserOptions object otherwise
         *
-        * @return User object
+        * @return User
         */
        function getUser() {
                if ( !is_null( $this->mUser ) ) {
@@ -864,7 +869,7 @@ class Parser {
        /**
         * Get a preprocessor object
         *
-        * @return Preprocessor instance
+        * @return Preprocessor
         */
        function getPreprocessor() {
                if ( !isset( $this->mPreprocessor ) ) {
@@ -970,7 +975,7 @@ class Parser {
         * Returns the unique tag which must be inserted into the stripped text
         * The tag will be replaced with the original text in unstrip()
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -985,6 +990,7 @@ class Parser {
         * parse the wiki syntax used to render tables
         *
         * @private
+        * @param string $text
         * @return string
         */
        function doTableStuff( $text ) {
@@ -1183,9 +1189,9 @@ class Parser {
         *
         * @private
         *
-        * @param $text string
-        * @param $isMain bool
-        * @param $frame bool
+        * @param string $text
+        * @param bool $isMain
+        * @param bool $frame
         *
         * @return string
         */
@@ -1253,7 +1259,7 @@ class Parser {
         * DML
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -1279,7 +1285,7 @@ class Parser {
 
        /**
         * @throws MWException
-        * @param $m array
+        * @param array $m
         * @return HTML|string
         */
        function magicLinkCallback( $m ) {
@@ -1330,7 +1336,7 @@ class Parser {
        /**
         * Make a free external link, given a user-supplied URL
         *
-        * @param $url string
+        * @param string $url
         *
         * @return string HTML
         * @private
@@ -1386,7 +1392,7 @@ class Parser {
         *
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -1404,7 +1410,7 @@ class Parser {
         * Replace single quotes with HTML markup
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string the altered text
         */
@@ -1423,7 +1429,7 @@ class Parser {
        /**
         * Helper function for doAllQuotes()
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -1612,7 +1618,7 @@ class Parser {
         *
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @throws MWException
         * @return string
@@ -1693,10 +1699,10 @@ class Parser {
         * Get the rel attribute for a particular external link.
         *
         * @since 1.21
-        * @param string|bool $url optional URL, to extract the domain from for rel =>
+        * @param string|bool $url Optional URL, to extract the domain from for rel =>
         *   nofollow if appropriate
-        * @param $title Title optional Title, for wgNoFollowNsExceptions lookups
-        * @return string|null rel attribute for $url
+        * @param Title $title Optional Title, for wgNoFollowNsExceptions lookups
+        * @return string|null Rel attribute for $url
         */
        public static function getExternalLinkRel( $url = false, $title = null ) {
                global $wgNoFollowLinks, $wgNoFollowNsExceptions, $wgNoFollowDomainExceptions;
@@ -1715,9 +1721,9 @@ class Parser {
         * (depending on configuration, namespace, and the URL's domain) and/or a
         * target attribute (depending on configuration).
         *
-        * @param string|bool $url optional URL, to extract the domain from for rel =>
+        * @param string|bool $url Optional URL, to extract the domain from for rel =>
         *   nofollow if appropriate
-        * @return Array associative array of HTML attributes
+        * @return array Associative array of HTML attributes
         */
        function getExternalLinkAttribs( $url = false ) {
                $attribs = array();
@@ -1732,8 +1738,8 @@ class Parser {
        /**
         * Replace unusual URL escape codes with their equivalent characters
         *
-        * @param $url String
-        * @return String
+        * @param string $url
+        * @return string
         *
         * @todo This can merge genuinely required bits in the path or query string,
         *       breaking legit URLs. A proper fix would treat the various parts of
@@ -1749,7 +1755,7 @@ class Parser {
         * Callback function used in replaceUnusualEscapes().
         * Replaces unusual URL escape codes with their equivalent character
         *
-        * @param $matches array
+        * @param array $matches
         *
         * @return string
         */
@@ -1771,7 +1777,7 @@ class Parser {
         * option, through the exception, or through the on-wiki whitelist
         * @private
         *
-        * $param $url string
+        * $param string $url
         *
         * @return string
         */
@@ -1834,7 +1840,7 @@ class Parser {
 
        /**
         * Process [[ ]] wikilinks (RIL)
-        * @param $s
+        * @param string $s
         * @throws MWException
         * @return LinkHolderArray
         *
@@ -2214,7 +2220,7 @@ class Parser {
 
        /**
         * Return true if subpage links should be expanded on this page.
-        * @return Boolean
+        * @return bool
         */
        function areSubpagesAllowed() {
                # Some namespaces don't allow subpages
@@ -2254,8 +2260,8 @@ class Parser {
         * of both arguments, starting at the beginning of both.
         * @private
         *
-        * @param $st1 string
-        * @param $st2 string
+        * @param string $st1
+        * @param string $st2
         *
         * @return int
         */
@@ -2279,7 +2285,7 @@ class Parser {
         * element appropriate to the prefix character passed into them.
         * @private
         *
-        * @param $char string
+        * @param string $char
         *
         * @return string
         */
@@ -2304,7 +2310,7 @@ class Parser {
 
        /**
         * TODO: document
-        * @param $char String
+        * @param string $char
         * @private
         *
         * @return string
@@ -2330,7 +2336,7 @@ class Parser {
 
        /**
         * TODO: document
-        * @param $char String
+        * @param string $char
         * @private
         *
         * @return string
@@ -2550,11 +2556,11 @@ class Parser {
         * Split up a string on ':', ignoring any occurrences inside tags
         * to prevent illegal overlapping.
         *
-        * @param string $str the string to split
-        * @param &$before String set to everything before the ':'
-        * @param &$after String set to everything after the ':'
+        * @param string $str The string to split
+        * @param string &$before Set to everything before the ':'
+        * @param string &$after Set to everything after the ':'
         * @throws MWException
-        * @return String the position of the ':', or false if none found
+        * @return string The position of the ':', or false if none found
         */
        function findColonNoLinks( $str, &$before, &$after ) {
                wfProfileIn( __METHOD__ );
@@ -2718,8 +2724,8 @@ class Parser {
         *
         * @private
         *
-        * @param $index integer
-        * @param bool|\PPFrame $frame
+        * @param int $index
+        * @param bool|PPFrame $frame
         *
         * @throws MWException
         * @return string
@@ -3098,7 +3104,7 @@ class Parser {
        /**
         * Return a three-element array: leading whitespace, string contents, trailing whitespace
         *
-        * @param $s string
+        * @param string $s
         *
         * @return array
         */
@@ -3125,11 +3131,11 @@ class Parser {
         *  self::OT_PREPROCESS: templates but not extension tags
         *  self::OT_HTML: all templates and extension tags
         *
-        * @param string $text the text to transform
-        * @param $frame PPFrame Object describing the arguments passed to the template.
+        * @param string $text The text to transform
+        * @param PPFrame $frame Object describing the arguments passed to the template.
         *        Arguments may also be provided as an associative array, as was the usual case before MW1.12.
         *        Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
-        * @param $argsOnly Boolean only do argument (triple-brace) expansion, not double-brace expansion
+        * @param bool $argsOnly Only do argument (triple-brace) expansion, not double-brace expansion
         * @private
         *
         * @return string
@@ -3159,7 +3165,7 @@ class Parser {
        /**
         * Clean up argument array - refactored in 1.9 so parserfunctions can use it, too.
         *
-        * @param $args array
+        * @param array $args
         *
         * @return array
         */
@@ -3189,7 +3195,7 @@ class Parser {
         * Warn the user when a parser limitation is reached
         * Will warn at most once the user per limitation type
         *
-        * @param string $limitationType should be one of:
+        * @param string $limitationType Should be one of:
         *   'expensive-parserfunction' (corresponding messages:
         *       'expensive-parserfunction-warning',
         *       'expensive-parserfunction-category')
@@ -3555,9 +3561,9 @@ class Parser {
         *  nowiki: bool, wiki markup in $text should be escaped
         *
         * @since 1.21
-        * @param $frame PPFrame The current frame, contains template arguments
-        * @param $function string Function name
-        * @param $args array Arguments to the function
+        * @param PPFrame $frame The current frame, contains template arguments
+        * @param string $function Function name
+        * @param array $args Arguments to the function
         * @return array
         */
        public function callParserFunction( $frame, $function, array $args = array() ) {
@@ -3660,7 +3666,7 @@ class Parser {
         * Get the semi-parsed DOM representation of a template with a given title,
         * and its redirect destination title. Cached.
         *
-        * @param $title Title
+        * @param Title $title
         *
         * @return array
         */
@@ -3699,7 +3705,7 @@ class Parser {
        /**
         * Fetch the unparsed text of a template and register a reference to it.
         * @param Title $title
-        * @return Array ( string or false, Title )
+        * @return array ( string or false, Title )
         */
        function fetchTemplateAndTitle( $title ) {
                $templateCb = $this->mOptions->getTemplateCallback(); # Defaults to Parser::statelessFetchTemplate()
@@ -3722,7 +3728,7 @@ class Parser {
        /**
         * Fetch the unparsed text of a template and register a reference to it.
         * @param Title $title
-        * @return mixed string or false
+        * @return string|bool
         */
        function fetchTemplate( $title ) {
                $rv = $this->fetchTemplateAndTitle( $title );
@@ -3832,7 +3838,7 @@ class Parser {
         * If 'broken' is a key in $options then the file will appear as a broken thumbnail.
         * @param Title $title
         * @param array $options Array of options to RepoGroup::findFile
-        * @return Array ( File or false, Title of file )
+        * @return array ( File or false, Title of file )
         */
        function fetchFileAndTitle( $title, $options = array() ) {
                $file = $this->fetchFileNoRegister( $title, $options );
@@ -3857,7 +3863,7 @@ class Parser {
         *
         * @param Title $title
         * @param array $options Array of options to RepoGroup::findFile
-        * @return File or false
+        * @return File|bool
         */
        protected function fetchFileNoRegister( $title, $options = array() ) {
                if ( isset( $options['broken'] ) ) {
@@ -3873,8 +3879,8 @@ class Parser {
        /**
         * Transclude an interwiki link.
         *
-        * @param $title Title
-        * @param $action
+        * @param Title $title
+        * @param string $action
         *
         * @return string
         */
@@ -3894,8 +3900,8 @@ class Parser {
        }
 
        /**
-        * @param $url string
-        * @return Mixed|String
+        * @param string $url
+        * @return mixed|string
         */
        function fetchScaryTemplateMaybeFromCache( $url ) {
                global $wgTranscludeCacheExpiry;
@@ -3930,8 +3936,8 @@ class Parser {
         * Triple brace replacement -- used for template arguments
         * @private
         *
-        * @param $piece array
-        * @param $frame PPFrame
+        * @param array $piece
+        * @param PPFrame $frame
         *
         * @return array
         */
@@ -3985,7 +3991,7 @@ class Parser {
         *     attributes Optional associative array of parsed attributes
         *     inner      Contents of extension element
         *     noClose    Original text did not have a close tag
-        * @param $frame PPFrame
+        * @param PPFrame $frame
         *
         * @throws MWException
         * @return string
@@ -4071,7 +4077,7 @@ class Parser {
         *
         * @param string $type The type of expansion
         * @param int $size The size of the text
-        * @return bool false if this inclusion would take it over the maximum, true otherwise
+        * @return bool False if this inclusion would take it over the maximum, true otherwise
         */
        function incrementIncludeSize( $type, $size ) {
                if ( $this->mIncludeSizes[$type] + $size > $this->mOptions->getMaxIncludeSize() ) {
@@ -4085,7 +4091,7 @@ class Parser {
        /**
         * Increment the expensive function count
         *
-        * @return bool false if the limit has been exceeded
+        * @return bool False if the limit has been exceeded
         */
        function incrementExpensiveFunctionCount() {
                $this->mExpensiveFunctionCount++;
@@ -4096,7 +4102,7 @@ class Parser {
         * Strip double-underscore items like __NOGALLERY__ and __NOTOC__
         * Fills $this->mDoubleUnderscores, returns the modified text
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -4198,9 +4204,9 @@ class Parser {
         * It loops through all headlines, collects the necessary data, then splits up the
         * string and re-inserts the newly formatted headlines.
         *
-        * @param $text String
-        * @param string $origText original, untouched wikitext
-        * @param $isMain Boolean
+        * @param string $text
+        * @param string $origText Original, untouched wikitext
+        * @param bool $isMain
         * @return mixed|string
         * @private
         */
@@ -4607,8 +4613,8 @@ class Parser {
        /**
         * Pre-save transform helper function
         *
-        * @param $text string
-        * @param $user User
+        * @param string $text
+        * @param User $user
         *
         * @return string
         */
@@ -4690,10 +4696,10 @@ class Parser {
         * Do not reuse this parser instance after calling getUserSig(),
         * as it may have changed if it's the $wgParser.
         *
-        * @param $user User
-        * @param string|bool $nickname nickname to use or false to use user's default nickname
-        * @param $fancySig Boolean|null whether the nicknname is the complete signature
-        *                  or null to use default value
+        * @param User $user
+        * @param string|bool $nickname Nickname to use or false to use user's default nickname
+        * @param bool|null $fancySig whether the nicknname is the complete signature
+        *    or null to use default value
         * @return string
         */
        function getUserSig( &$user, $nickname = false, $fancySig = null ) {
@@ -4741,8 +4747,8 @@ class Parser {
        /**
         * Check that the user's signature contains no bad XML
         *
-        * @param $text String
-        * @return mixed An expanded string, or false if invalid.
+        * @param string $text
+        * @return string|bool An expanded string, or false if invalid.
         */
        function validateSig( $text ) {
                return Xml::isWellFormedXmlFragment( $text ) ? $text : false;
@@ -4803,20 +4809,20 @@ class Parser {
         * Set up some variables which are usually set up in parse()
         * so that an external function can call some class members with confidence
         *
-        * @param $title Title|null
-        * @param $options ParserOptions
-        * @param $outputType
-        * @param $clearState bool
+        * @param Title|null $title
+        * @param ParserOptions $options
+        * @param int $outputType
+        * @param bool $clearState
         */
        public function startExternalParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
                $this->startParse( $title, $options, $outputType, $clearState );
        }
 
        /**
-        * @param $title Title|null
-        * @param $options ParserOptions
-        * @param $outputType
-        * @param $clearState bool
+        * @param Title|null $title
+        * @param ParserOptions $options
+        * @param int $outputType
+        * @param bool $clearState
         */
        private function startParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
                $this->setTitle( $title );
@@ -5011,7 +5017,7 @@ class Parser {
        /**
         * Get all registered function hook identifiers
         *
-        * @return Array
+        * @return array
         */
        function getFunctionHooks() {
                return array_keys( $this->mFunctionHooks );
@@ -5021,9 +5027,9 @@ class Parser {
         * Create a tag function, e.g. "<test>some stuff</test>".
         * Unlike tag hooks, tag functions are parsed at preprocessor level.
         * Unlike parser functions, their content is not preprocessed.
-        * @param $tag
-        * @param $callback
-        * @param $flags
+        * @param string $tag
+        * @param callable $callback
+        * @param int $flags
         * @throws MWException
         * @return null
         */
@@ -5048,10 +5054,10 @@ class Parser {
         * Replace "<!--LINK-->" link placeholders with actual links, in the buffer
         * Placeholders created in Skin::makeLinkObj()
         *
-        * @param $text string
-        * @param $options int
+        * @param string $text
+        * @param int $options
         *
-        * @return array of link CSS classes, indexed by PDBK.
+        * @return array Array of link CSS classes, indexed by PDBK.
         */
        function replaceLinkHolders( &$text, $options = 0 ) {
                return $this->mLinkHolders->replace( $text );
@@ -5061,8 +5067,8 @@ class Parser {
         * Replace "<!--LINK-->" link placeholders with plain text of links
         * (not HTML-formatted).
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        function replaceLinkHoldersText( $text ) {
                return $this->mLinkHolders->replaceText( $text );
@@ -5238,7 +5244,7 @@ class Parser {
        }
 
        /**
-        * @param $handler
+        * @param string $handler
         * @return array
         */
        function getImageParams( $handler ) {
@@ -5284,9 +5290,9 @@ class Parser {
        /**
         * Parse image options text and use it to make an image
         *
-        * @param $title Title
-        * @param $options String
-        * @param $holders LinkHolderArray|bool
+        * @param Title $title
+        * @param string $options
+        * @param LinkHolderArray|bool $holders
         * @return string HTML
         */
        function makeImage( $title, $options, $holders = false ) {
@@ -5501,9 +5507,9 @@ class Parser {
        }
 
        /**
-        * @param $caption
-        * @param $holders LinkHolderArray
-        * @return mixed|String
+        * @param string $caption
+        * @param LinkHolderArray $holders
+        * @return mixed|string
         */
        protected function stripAltText( $caption, $holders ) {
                # Strip bad stuff out of the title (tooltip).  We can't just use
@@ -5542,9 +5548,9 @@ class Parser {
         * Callback from the Sanitizer for expanding items found in HTML attribute
         * values, so they can be safely tested and escaped.
         *
-        * @param $text String
-        * @param $frame PPFrame
-        * @return String
+        * @param string $text
+        * @param PPFrame $frame
+        * @return string
         */
        function attributeStripCallback( &$text, $frame = false ) {
                $text = $this->replaceVariables( $text, $frame );
@@ -5567,7 +5573,7 @@ class Parser {
         * Transparent tag hooks are like regular XML-style tag hooks, except they
         * operate late in the transformation sequence, on HTML instead of wikitext.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -5597,7 +5603,7 @@ class Parser {
         * External callers should use the getSection and replaceSection methods.
         *
         * @param string $text Page wikitext
-        * @param string $section a section identifier string of the form:
+        * @param string $section A section identifier string of the form:
         *   "<flag1> - <flag2> - ... - <section number>"
         *
         * Currently the only recognised flag is "T", which means the target section number
@@ -5735,10 +5741,10 @@ class Parser {
         *
         * If a section contains subsections, these are also returned.
         *
-        * @param string $text text to look in
-        * @param string $section section identifier
-        * @param string $deftext default to return if section is not found
-        * @return string text of the requested section
+        * @param string $text Text to look in
+        * @param string $section Section identifier
+        * @param string $deftext Default to return if section is not found
+        * @return string Text of the requested section
         */
        public function getSection( $text, $section, $deftext = '' ) {
                return $this->extractSections( $text, $section, "get", $deftext );
@@ -5770,7 +5776,7 @@ class Parser {
        /**
         * Get the revision object for $this->mRevisionId
         *
-        * @return Revision|null either a Revision object or null
+        * @return Revision|null Either a Revision object or null
         * @since 1.23 (public since 1.23)
         */
        public function getRevisionObject() {
@@ -5788,6 +5794,7 @@ class Parser {
        /**
         * Get the timestamp associated with the current revision, adjusted for
         * the default server-local timestamp
+        * @return string
         */
        function getRevisionTimestamp() {
                if ( is_null( $this->mRevisionTimestamp ) ) {
@@ -5834,7 +5841,7 @@ class Parser {
        /**
         * Get the size of the revision
         *
-        * @return int|null revision size
+        * @return int|null Revision size
         */
        function getRevisionSize() {
                if ( is_null( $this->mRevisionSize ) ) {
@@ -5884,7 +5891,7 @@ class Parser {
         * Accessor for $mDefaultSort
         * Unlike getDefaultSort(), will return false if none is set
         *
-        * @return string or false
+        * @return string|bool
         */
        public function getCustomDefaultSort() {
                return $this->mDefaultSort;
@@ -5895,7 +5902,7 @@ class Parser {
         * presumably extracted from a heading, for example "Header" from
         * "== Header ==".
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -5931,7 +5938,7 @@ class Parser {
         * to create valid section anchors by mimicing the output of the
         * parser when headings are parsed.
         *
-        * @param string $text text string to be stripped of wikitext
+        * @param string $text Text string to be stripped of wikitext
         * for use in a Section anchor
         * @return string Filtered text string
         */
@@ -5957,10 +5964,10 @@ class Parser {
        /**
         * strip/replaceVariables/unstrip for preprocessor regression testing
         *
-        * @param $text string
-        * @param $title Title
-        * @param $options ParserOptions
-        * @param $outputType int
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param int $outputType
         *
         * @return string
         */
@@ -5974,9 +5981,9 @@ class Parser {
        }
 
        /**
-        * @param $text string
-        * @param $title Title
-        * @param $options ParserOptions
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
         * @return string
         */
        function testPst( $text, Title $title, ParserOptions $options ) {
@@ -5984,9 +5991,9 @@ class Parser {
        }
 
        /**
-        * @param $text
-        * @param $title Title
-        * @param $options ParserOptions
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
         * @return string
         */
        function testPreprocess( $text, Title $title, ParserOptions $options ) {
@@ -6004,8 +6011,8 @@ class Parser {
         * two strings will be replaced with the value returned by the callback in
         * each case.
         *
-        * @param $s string
-        * @param $callback
+        * @param string $s
+        * @param callable $callback
         *
         * @return string
         */
@@ -6036,7 +6043,7 @@ class Parser {
        /**
         * Remove any strip markers found in the given text.
         *
-        * @param $text Input string
+        * @param string $text Input string
         * @return string
         */
        function killMarkers( $text ) {
@@ -6055,7 +6062,7 @@ class Parser {
         * unserializeHalfParsedText(). The text can then be safely incorporated into
         * the return value of a parser hook.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return array
         */
@@ -6084,7 +6091,7 @@ class Parser {
         *
         * @param array $data Serialized data
         * @throws MWException
-        * @return String
+        * @return string
         */
        function unserializeHalfParsedText( $data ) {
                if ( !isset( $data['version'] ) || $data['version'] != self::HALF_PARSED_VERSION ) {
@@ -6107,7 +6114,7 @@ class Parser {
         * serializeHalfParsedText(), is compatible with the current version of the
         * parser.
         *
-        * @param $data Array
+        * @param array $data
         *
         * @return bool
         */
@@ -6118,7 +6125,7 @@ class Parser {
        /**
         * Parsed a width param of imagelink like 300px or 200x300px
         *
-        * @param $value String
+        * @param string $value
         *
         * @return array
         * @since 1.20
index ff74f2a..e374361 100644 (file)
@@ -45,7 +45,7 @@ class ParserCache {
         * Setup a cache pathway with a given back-end storage mechanism.
         * May be a memcached client or a BagOStuff derivative.
         *
-        * @param $memCached Object
+        * @param MWMemcached $memCached
         * @throws MWException
         */
        protected function __construct( $memCached ) {
@@ -56,8 +56,8 @@ class ParserCache {
        }
 
        /**
-        * @param $article Article
-        * @param $hash string
+        * @param Article $article
+        * @param string $hash
         * @return mixed|string
         */
        protected function getParserOutputKey( $article, $hash ) {
@@ -72,7 +72,7 @@ class ParserCache {
        }
 
        /**
-        * @param $article Article
+        * @param Article $article
         * @return mixed|string
         */
        protected function getOptionsKey( $article ) {
@@ -90,8 +90,8 @@ class ParserCache {
         * English preferences. That's why we take into account *all* user
         * options. (r70809 CR)
         *
-        * @param $article Article
-        * @param $popts ParserOptions
+        * @param Article $article
+        * @param ParserOptions $popts
         * @return string
         */
        function getETag( $article, $popts ) {
@@ -102,8 +102,8 @@ class ParserCache {
 
        /**
         * Retrieve the ParserOutput from ParserCache, even if it's outdated.
-        * @param $article Article
-        * @param $popts ParserOptions
+        * @param Article $article
+        * @param ParserOptions $popts
         * @return ParserOutput|bool False on failure
         */
        public function getDirty( $article, $popts ) {
index 21403b4..7c84b67 100644 (file)
@@ -275,7 +275,7 @@ class ParserOptions {
         *
         * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
         *
-        * @return Language object
+        * @return Language
         * @since 1.19
         */
        function getUserLangObj() {
@@ -286,7 +286,7 @@ class ParserOptions {
        /**
         * Same as getUserLangObj() but returns a string instead.
         *
-        * @return String Language code
+        * @return string Language code
         * @since 1.17
         */
        function getUserLang() {
@@ -344,8 +344,8 @@ class ParserOptions {
 
        /**
         * Constructor
-        * @param $user User object
-        * @param $lang Language object
+        * @param User $user
+        * @param Language $lang
         */
        function __construct( $user = null, $lang = null ) {
                if ( $user === null ) {
@@ -370,8 +370,8 @@ class ParserOptions {
         * Get a ParserOptions object from a given user.
         * Language will be taken from $wgLang.
         *
-        * @param $user User object
-        * @return ParserOptions object
+        * @param User $user
+        * @return ParserOptions
         */
        public static function newFromUser( $user ) {
                return new ParserOptions( $user );
@@ -380,9 +380,9 @@ class ParserOptions {
        /**
         * Get a ParserOptions object from a given user and language
         *
-        * @param $user User object
-        * @param $lang Language object
-        * @return ParserOptions object
+        * @param User $user
+        * @param Language $lang
+        * @return ParserOptions
         */
        public static function newFromUserAndLang( User $user, Language $lang ) {
                return new ParserOptions( $user, $lang );
@@ -391,8 +391,8 @@ class ParserOptions {
        /**
         * Get a ParserOptions object from a IContextSource object
         *
-        * @param $context IContextSource object
-        * @return ParserOptions object
+        * @param IContextSource $context
+        * @return ParserOptions
         */
        public static function newFromContext( IContextSource $context ) {
                return new ParserOptions( $context->getUser(), $context->getLanguage() );
@@ -401,8 +401,8 @@ class ParserOptions {
        /**
         * Get user options
         *
-        * @param $user User object
-        * @param $lang Language object
+        * @param User $user
+        * @param Language $lang
         */
        private function initialiseFromUser( $user, $lang ) {
                global $wgInterwikiMagic, $wgAllowExternalImages,
@@ -441,6 +441,7 @@ class ParserOptions {
        /**
         * Registers a callback for tracking which ParserOptions which are used.
         * This is a private API with the parser.
+        * @param callable $callback
         */
        function registerWatcher( $callback ) {
                $this->onAccessCallback = $callback;
@@ -448,7 +449,7 @@ class ParserOptions {
 
        /**
         * Called when an option is accessed.
-        * @param string $optionName name of the option
+        * @param string $optionName Name of the option
         */
        public function optionUsed( $optionName ) {
                if ( $this->onAccessCallback ) {
index d1e3e58..49e810c 100644 (file)
@@ -96,7 +96,7 @@ class ParserOutput extends CacheTime {
        /**
         * callback used by getText to replace editsection tokens
         * @private
-        * @param $m
+        * @param array $m
         * @throws MWException
         * @return mixed
         */
@@ -181,8 +181,8 @@ class ParserOutput extends CacheTime {
        /**
         * Checks, if a url is pointing to the own server
         *
-        * @param string $internal the server to check against
-        * @param string $url the url to check
+        * @param string $internal The server to check against
+        * @param string $url The url to check
         * @return bool
         */
        static function isLinkInternal( $internal, $url ) {
@@ -212,8 +212,8 @@ class ParserOutput extends CacheTime {
        /**
         * Record a local or interwiki inline link for saving in future link tables.
         *
-        * @param $title Title object
-        * @param $id Mixed: optional known page_id so we can skip the lookup
+        * @param Title $title
+        * @param int|null $id Optional known page_id so we can skip the lookup
         */
        function addLink( Title $title, $id = null ) {
                if ( $title->isExternal() ) {
@@ -247,7 +247,7 @@ class ParserOutput extends CacheTime {
         * Register a file dependency for this output
         * @param string $name Title dbKey
         * @param string $timestamp MW timestamp of file creation (or false if non-existing)
-        * @param string $sha1 base 36 SHA-1 of file (or false if non-existing)
+        * @param string $sha1 Base 36 SHA-1 of file (or false if non-existing)
         * @return void
         */
        function addImage( $name, $timestamp = null, $sha1 = null ) {
@@ -259,9 +259,9 @@ class ParserOutput extends CacheTime {
 
        /**
         * Register a template dependency for this output
-        * @param $title Title
-        * @param $page_id
-        * @param $rev_id
+        * @param Title $title
+        * @param int $page_id
+        * @param int $rev_id
         * @return void
         */
        function addTemplate( $title, $page_id, $rev_id ) {
@@ -278,7 +278,7 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * @param $title Title object, must be an interwiki link
+        * @param Title $title Title object, must be an interwiki link
         * @throws MWException if given invalid input
         */
        function addInterwikiLink( $title ) {
@@ -296,6 +296,8 @@ class ParserOutput extends CacheTime {
         * Add some text to the "<head>".
         * If $tag is set, the section with that tag will only be included once
         * in a given page.
+        * @param string $section
+        * @param string|bool $tag
         */
        function addHeadItem( $section, $tag = false ) {
                if ( $tag !== false ) {
@@ -324,8 +326,8 @@ class ParserOutput extends CacheTime {
        /**
         * Add one or more variables to be set in mw.config in JavaScript.
         *
-        * @param $keys {String|Array} Key or array of key/value pairs.
-        * @param $value {Mixed} [optional] Value of the configuration variable.
+        * @param string|array $keys Key or array of key/value pairs.
+        * @param mixed $value [optional] Value of the configuration variable.
         * @since 1.23
         */
        public function addJsConfigVars( $keys, $value = null ) {
@@ -342,7 +344,7 @@ class ParserOutput extends CacheTime {
        /**
         * Copy items from the OutputPage object into this one
         *
-        * @param $out OutputPage object
+        * @param OutputPage $out
         */
        public function addOutputPageMetadata( OutputPage $out ) {
                $this->addModules( $out->getModules() );
@@ -369,7 +371,7 @@ class ParserOutput extends CacheTime {
        /**
         * Get the title to be used for display
         *
-        * @return String
+        * @return string
         */
        public function getDisplayTitle() {
                $t = $this->getTitleText();
@@ -465,7 +467,7 @@ class ParserOutput extends CacheTime {
        /**
         * Returns the options from its ParserOptions which have been taken
         * into account to produce this output or false if not available.
-        * @return mixed Array
+        * @return array
         */
        public function getUsedOptions() {
                if ( !isset( $this->mAccessedOptions ) ) {
@@ -482,6 +484,7 @@ class ParserOutput extends CacheTime {
         * @see ParserCache::save
         * @see ParserOptions::addExtraKey
         * @see ParserOptions::optionsHash
+        * @param string $option
         */
        public function recordOption( $option ) {
                $this->mAccessedOptions[$option] = true;
@@ -511,11 +514,11 @@ class ParserOutput extends CacheTime {
         *
         * @since 1.20
         *
-        * @param $title Title The title of the page we're updating. If not given, a title object will be created
-        *                      based on $this->getTitleText()
-        * @param $recursive Boolean: queue jobs for recursive updates?
+        * @param Title $title The title of the page we're updating. If not given, a title object will
+        *    be created based on $this->getTitleText()
+        * @param bool $recursive Queue jobs for recursive updates?
         *
-        * @return Array. An array of instances of DataUpdate
+        * @return array An array of instances of DataUpdate
         */
        public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
                if ( is_null( $title ) ) {
@@ -562,11 +565,10 @@ class ParserOutput extends CacheTime {
         * @since 1.21
         *
         * @param string $key The key for accessing the data. Extensions should take care to avoid
-        *               conflicts in naming keys. It is suggested to use the extension's name as a
-        *               prefix.
+        *   conflicts in naming keys. It is suggested to use the extension's name as a prefix.
         *
         * @param mixed $value The value to set. Setting a value to null is equivalent to removing
-        *              the value.
+        *   the value.
         */
        public function setExtensionData( $key, $value ) {
                if ( $value === null ) {
index aeae234..920b6f6 100644 (file)
@@ -128,7 +128,7 @@ class Parser_DiffTest
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @return bool
         */
        function onClearState( &$parser ) {
index aeacd2e..4cd5694 100644 (file)
@@ -28,7 +28,7 @@ interface Preprocessor {
        /**
         * Create a new preprocessor object based on an initialised Parser object
         *
-        * @param $parser Parser
+        * @param Parser $parser
         */
        function __construct( $parser );
 
@@ -42,7 +42,7 @@ interface Preprocessor {
        /**
         * Create a new custom frame for programmatic use of parameter replacement as used in some extensions
         *
-        * @param $args array
+        * @param array $args
         *
         * @return PPFrame
         */
@@ -51,15 +51,15 @@ interface Preprocessor {
        /**
         * Create a new custom node for programmatic use of parameter replacement as used in some extensions
         *
-        * @param $values
+        * @param array $values
         */
        function newPartNodeArray( $values );
 
        /**
         * Preprocess text to a PPNode
         *
-        * @param $text
-        * @param $flags
+        * @param string $text
+        * @param int $flags
         *
         * @return PPNode
         */
@@ -148,8 +148,7 @@ interface PPFrame {
        /**
         * Returns true if the infinite loop check is OK, false if a loop is detected
         *
-        * @param $title
-        *
+        * @param Title $title
         * @return bool
         */
        function loopCheck( $title );
index 0e7d42a..df3cbeb 100644 (file)
@@ -56,7 +56,7 @@ class Preprocessor_DOM implements Preprocessor {
        }
 
        /**
-        * @param $args array
+        * @param array $args
         * @return PPCustomFrame_DOM
         */
        function newCustomFrame( $args ) {
@@ -64,7 +64,7 @@ class Preprocessor_DOM implements Preprocessor {
        }
 
        /**
-        * @param $values
+        * @param array $values
         * @return PPNode_DOM
         */
        function newPartNodeArray( $values ) {
@@ -109,10 +109,10 @@ class Preprocessor_DOM implements Preprocessor {
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
         *
-        * @param string $text the text to parse
-        * @param $flags Integer: bitwise combination of:
-        *          Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
-        *                                     included. Default is to assume a direct page view.
+        * @param string $text The text to parse
+        * @param int $flags Bitwise combination of:
+        *     Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
+        *                                  included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
         * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
@@ -201,8 +201,8 @@ class Preprocessor_DOM implements Preprocessor {
        }
 
        /**
-        * @param $text string
-        * @param $flags int
+        * @param string $text
+        * @param int $flags
         * @return string
         */
        function preprocessToXml( $text, $flags = 0 ) {
@@ -947,7 +947,7 @@ class PPFrame_DOM implements PPFrame {
 
        /**
         * Construct a new preprocessor frame.
-        * @param $preprocessor Preprocessor The parent preprocessor
+        * @param Preprocessor $preprocessor The parent preprocessor
         */
        function __construct( $preprocessor ) {
                $this->preprocessor = $preprocessor;
@@ -962,6 +962,9 @@ class PPFrame_DOM implements PPFrame {
         * Create a new child frame
         * $args is optionally a multi-root PPNode or array containing the template arguments
         *
+        * @param bool|array $args
+        * @param Title|bool $title
+        * @param int $indexOffset
         * @return PPTemplateFrame_DOM
         */
        function newChild( $args = false, $title = false, $indexOffset = 0 ) {
@@ -1004,8 +1007,8 @@ class PPFrame_DOM implements PPFrame {
 
        /**
         * @throws MWException
-        * @param $root
-        * @param $flags int
+        * @param string|PPNode_DOM|DOMDocument $root
+        * @param int $flags
         * @return string
         */
        function expand( $root, $flags = 0 ) {
@@ -1228,8 +1231,8 @@ class PPFrame_DOM implements PPFrame {
        }
 
        /**
-        * @param $sep
-        * @param $flags
+        * @param string $sep
+        * @param int $flags
         * @return string
         */
        function implodeWithFlags( $sep, $flags /*, ... */ ) {
@@ -1260,6 +1263,7 @@ class PPFrame_DOM implements PPFrame {
         * Implode with no flags specified
         * This previously called implodeWithFlags but has now been inlined to reduce stack depth
         *
+        * @param string $sep
         * @return string
         */
        function implode( $sep /*, ... */ ) {
@@ -1290,6 +1294,7 @@ class PPFrame_DOM implements PPFrame {
         * Makes an object that, when expand()ed, will be the same as one obtained
         * with implode()
         *
+        * @param string $sep
         * @return array
         */
        function virtualImplode( $sep /*, ... */ ) {
@@ -1318,6 +1323,9 @@ class PPFrame_DOM implements PPFrame {
 
        /**
         * Virtual implode with brackets
+        * @param string $start
+        * @param string $sep
+        * @param string $end
         * @return array
         */
        function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
@@ -1394,6 +1402,7 @@ class PPFrame_DOM implements PPFrame {
        /**
         * Returns true if the infinite loop check is OK, false if a loop is detected
         *
+        * @param Title $title
         * @return bool
         */
        function loopCheck( $title ) {
@@ -1433,11 +1442,11 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
        var $numberedExpansionCache, $namedExpansionCache;
 
        /**
-        * @param $preprocessor
-        * @param $parent PPFrame_DOM
-        * @param $numberedArgs array
-        * @param $namedArgs array
-        * @param $title Title
+        * @param Preprocessor $preprocessor
+        * @param PPFrame_DOM $parent
+        * @param array $numberedArgs
+        * @param array $namedArgs
+        * @param Title $title
         */
        function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
                parent::__construct( $preprocessor );
@@ -1656,7 +1665,7 @@ class PPNode_DOM implements PPNode {
        }
 
        /**
-        * @param $type
+        * @param string $type
         *
         * @return bool|PPNode_DOM
         */
@@ -1676,7 +1685,7 @@ class PPNode_DOM implements PPNode {
        }
 
        /**
-        * @param $i
+        * @param int $i
         * @return bool|PPNode_DOM
         */
        function item( $i ) {
index d6edb21..aebb98e 100644 (file)
@@ -47,7 +47,7 @@ class Preprocessor_Hash implements Preprocessor {
        }
 
        /**
-        * @param $args array
+        * @param array $args
         * @return PPCustomFrame_Hash
         */
        function newCustomFrame( $args ) {
@@ -55,7 +55,7 @@ class Preprocessor_Hash implements Preprocessor {
        }
 
        /**
-        * @param $values array
+        * @param array $values
         * @return PPNode_Hash_Array
         */
        function newPartNodeArray( $values ) {
@@ -89,10 +89,10 @@ class Preprocessor_Hash implements Preprocessor {
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
         *
-        * @param string $text the text to parse
-        * @param $flags Integer: bitwise combination of:
-        *          Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
-        *                                     included. Default is to assume a direct page view.
+        * @param string $text The text to parse
+        * @param int $flags Bitwise combination of:
+        *    Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
+        *                                 included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
         * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
@@ -762,6 +762,7 @@ class PPDStackElement_Hash extends PPDStackElement {
        /**
         * Get the accumulator that would result if the close is not found.
         *
+        * @param int|bool $openingCount
         * @return PPDAccum_Hash
         */
        function breakSyntax( $openingCount = false ) {
@@ -812,6 +813,7 @@ class PPDAccum_Hash {
 
        /**
         * Append a string literal
+        * @param string $s
         */
        function addLiteral( $s ) {
                if ( $this->lastNode === false ) {
@@ -826,6 +828,7 @@ class PPDAccum_Hash {
 
        /**
         * Append a PPNode
+        * @param PPNode $node
         */
        function addNode( PPNode $node ) {
                if ( $this->lastNode === false ) {
@@ -838,6 +841,8 @@ class PPDAccum_Hash {
 
        /**
         * Append a tree node with text contents
+        * @param string $name
+        * @param string $value
         */
        function addNodeWithText( $name, $value ) {
                $node = PPNode_Hash_Tree::newWithText( $name, $value );
@@ -848,6 +853,7 @@ class PPDAccum_Hash {
         * Append a PPAccum_Hash
         * Takes over ownership of the nodes in the source argument. These nodes may
         * subsequently be modified, especially nextSibling.
+        * @param PPAccum_Hash $accum
         */
        function addAccum( $accum ) {
                if ( $accum->lastNode === false ) {
@@ -898,7 +904,7 @@ class PPFrame_Hash implements PPFrame {
 
        /**
         * Construct a new preprocessor frame.
-        * @param $preprocessor Preprocessor: the parent preprocessor
+        * @param Preprocessor $preprocessor The parent preprocessor
         */
        function __construct( $preprocessor ) {
                $this->preprocessor = $preprocessor;
@@ -913,9 +919,8 @@ class PPFrame_Hash implements PPFrame {
         * Create a new child frame
         * $args is optionally a multi-root PPNode or array containing the template arguments
         *
-        * @param array|bool|\PPNode_Hash_Array $args PPNode_Hash_Array|array
-        * @param $title Title|bool
-        *
+        * @param array|bool|PPNode_Hash_Array $args
+        * @param Title|bool $title
         * @param int $indexOffset
         * @throws MWException
         * @return PPTemplateFrame_Hash
@@ -952,8 +957,8 @@ class PPFrame_Hash implements PPFrame {
 
        /**
         * @throws MWException
-        * @param $root
-        * @param $flags int
+        * @param string|PPNode$root
+        * @param int $flags
         * @return string
         */
        function expand( $root, $flags = 0 ) {
@@ -1135,8 +1140,8 @@ class PPFrame_Hash implements PPFrame {
        }
 
        /**
-        * @param $sep
-        * @param $flags
+        * @param string $sep
+        * @param int $flags
         * @return string
         */
        function implodeWithFlags( $sep, $flags /*, ... */ ) {
@@ -1166,6 +1171,7 @@ class PPFrame_Hash implements PPFrame {
        /**
         * Implode with no flags specified
         * This previously called implodeWithFlags but has now been inlined to reduce stack depth
+        * @param string $sep
         * @return string
         */
        function implode( $sep /*, ... */ ) {
@@ -1196,6 +1202,7 @@ class PPFrame_Hash implements PPFrame {
         * Makes an object that, when expand()ed, will be the same as one obtained
         * with implode()
         *
+        * @param string $sep
         * @return PPNode_Hash_Array
         */
        function virtualImplode( $sep /*, ... */ ) {
@@ -1225,6 +1232,9 @@ class PPFrame_Hash implements PPFrame {
        /**
         * Virtual implode with brackets
         *
+        * @param string $start
+        * @param string $sep
+        * @param string $end
         * @return PPNode_Hash_Array
         */
        function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
@@ -1257,8 +1267,8 @@ class PPFrame_Hash implements PPFrame {
        }
 
        /**
-        * @param $level bool
-        * @return array|bool|String
+        * @param bool $level
+        * @return array|bool|string
         */
        function getPDBK( $level = false ) {
                if ( $level === false ) {
@@ -1299,7 +1309,7 @@ class PPFrame_Hash implements PPFrame {
        }
 
        /**
-        * @param $name
+        * @param string $name
         * @return bool
         */
        function getArgument( $name ) {
@@ -1309,7 +1319,7 @@ class PPFrame_Hash implements PPFrame {
        /**
         * Returns true if the infinite loop check is OK, false if a loop is detected
         *
-        * @param $title Title
+        * @param Title $title
         *
         * @return bool
         */
@@ -1345,11 +1355,11 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        var $numberedExpansionCache, $namedExpansionCache;
 
        /**
-        * @param $preprocessor
-        * @param $parent
-        * @param $numberedArgs array
-        * @param $namedArgs array
-        * @param $title Title
+        * @param Preprocessor $preprocessor
+        * @param bool|PPFrame $parent
+        * @param array $numberedArgs
+        * @param array $namedArgs
+        * @param Title $title
         */
        function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
                parent::__construct( $preprocessor );
@@ -1431,7 +1441,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        }
 
        /**
-        * @param $index
+        * @param int $index
         * @return array|bool
         */
        function getNumberedArgument( $index ) {
@@ -1446,7 +1456,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        }
 
        /**
-        * @param $name
+        * @param string $name
         * @return bool
         */
        function getNamedArgument( $name ) {
@@ -1462,7 +1472,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        }
 
        /**
-        * @param $name
+        * @param string $name
         * @return array|bool
         */
        function getArgument( $name ) {
@@ -1519,7 +1529,7 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
        }
 
        /**
-        * @param $index
+        * @param int $index
         * @return bool
         */
        function getArgument( $index ) {
@@ -1563,8 +1573,8 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * @param $name
-        * @param $text
+        * @param string $name
+        * @param string $text
         * @return PPNode_Hash_Tree
         */
        static function newWithText( $name, $text ) {
@@ -1619,7 +1629,7 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * @param $i
+        * @param int $i
         * @return bool
         */
        function item( $i ) {
index 5b94453..d4f4559 100644 (file)
@@ -37,7 +37,7 @@ class StripState {
        const UNSTRIP_RECURSION_LIMIT = 20;
 
        /**
-        * @param $prefix string
+        * @param string $prefix
         */
        function __construct( $prefix ) {
                $this->prefix = $prefix;
@@ -51,16 +51,16 @@ class StripState {
 
        /**
         * Add a nowiki strip item
-        * @param $marker
-        * @param $value
+        * @param string $marker
+        * @param string $value
         */
        function addNoWiki( $marker, $value ) {
                $this->addItem( 'nowiki', $marker, $value );
        }
 
        /**
-        * @param $marker
-        * @param $value
+        * @param string $marker
+        * @param string $value
         */
        function addGeneral( $marker, $value ) {
                $this->addItem( 'general', $marker, $value );
@@ -68,9 +68,9 @@ class StripState {
 
        /**
         * @throws MWException
-        * @param $type
-        * @param $marker
-        * @param $value
+        * @param string $type
+        * @param string $marker
+        * @param string $value
         */
        protected function addItem( $type, $marker, $value ) {
                if ( !preg_match( $this->regex, $marker, $m ) ) {
@@ -81,7 +81,7 @@ class StripState {
        }
 
        /**
-        * @param $text
+        * @param string $text
         * @return mixed
         */
        function unstripGeneral( $text ) {
@@ -89,7 +89,7 @@ class StripState {
        }
 
        /**
-        * @param $text
+        * @param string $text
         * @return mixed
         */
        function unstripNoWiki( $text ) {
@@ -97,7 +97,7 @@ class StripState {
        }
 
        /**
-        * @param $text
+        * @param string $text
         * @return mixed
         */
        function unstripBoth( $text ) {
@@ -107,8 +107,8 @@ class StripState {
        }
 
        /**
-        * @param $type
-        * @param $text
+        * @param string $type
+        * @param string $text
         * @return mixed
         */
        protected function unstripType( $type, $text ) {
@@ -127,7 +127,7 @@ class StripState {
        }
 
        /**
-        * @param $m array
+        * @param array $m
         * @return array
         */
        protected function unstripCallback( $m ) {
@@ -159,7 +159,7 @@ class StripState {
         * Get a StripState object which is sufficient to unstrip the given text.
         * It will contain the minimum subset of strip items necessary.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return StripState
         */
@@ -195,9 +195,9 @@ class StripState {
         * will not be preserved. The strings in the $texts array will have their
         * strip markers rewritten, the resulting array of strings will be returned.
         *
-        * @param $otherState StripState
-        * @param $texts Array
-        * @return Array
+        * @param StripState $otherState
+        * @param array $texts
+        * @return array
         */
        function merge( $otherState, $texts ) {
                $mergePrefix = Parser::getRandomString();
@@ -215,7 +215,7 @@ class StripState {
        }
 
        /**
-        * @param $m
+        * @param array $m
         * @return string
         */
        protected function mergeCallback( $m ) {
@@ -226,7 +226,7 @@ class StripState {
        /**
         * Remove any strip markers found in the given text.
         *
-        * @param $text Input string
+        * @param string $text Input string
         * @return string
         */
        function killMarkers( $text ) {
index dbfab34..f7fe5a8 100644 (file)
@@ -50,7 +50,7 @@ class MWTidyWrapper {
        }
 
        /**
-        * @param $text string
+        * @param string $text
         * @return string
         */
        public function getWrapped( $text ) {
@@ -79,7 +79,7 @@ class MWTidyWrapper {
        }
 
        /**
-        * @param $m array
+        * @param array $m
         *
         * @return string
         */
@@ -91,7 +91,7 @@ class MWTidyWrapper {
        }
 
        /**
-        * @param $text string
+        * @param string $text
         * @return string
         */
        public function postprocess( $text ) {
@@ -121,8 +121,8 @@ class MWTidy {
         * If tidy isn't able to correct the markup, the original will be
         * returned in all its glory with a warning comment appended.
         *
-        * @param string $text hideous HTML input
-        * @return String: corrected HTML output
+        * @param string $text Hideous HTML input
+        * @return string Corrected HTML output
         */
        public static function tidy( $text ) {
                global $wgTidyInternal;
@@ -153,9 +153,9 @@ class MWTidy {
        /**
         * Check HTML for errors, used if $wgValidateAllHtml = true.
         *
-        * @param $text String
-        * @param &$errorStr String: return the error string
-        * @return Boolean: whether the HTML is valid
+        * @param string $text
+        * @param string &$errorStr Return the error string
+        * @return bool Whether the HTML is valid
         */
        public static function checkErrors( $text, &$errorStr = null ) {
                global $wgTidyInternal;
@@ -175,9 +175,9 @@ class MWTidy {
         * Also called in OutputHandler.php for full page validation
         *
         * @param string $text HTML to check
-        * @param $stderr Boolean: Whether to read result from STDERR rather than STDOUT
-        * @param &$retval int Exit code (-1 on internal error)
-        * @return mixed String or null
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
         */
        private static function execExternalTidy( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgTidyBin, $wgTidyOpts;
@@ -242,9 +242,9 @@ class MWTidy {
         * saving the overhead of spawning a new process.
         *
         * @param string $text HTML to check
-        * @param $stderr Boolean: Whether to read result from error status instead of output
-        * @param &$retval int Exit code (-1 on internal error)
-        * @return mixed String or null
+        * @param bool $stderr Whether to read result from error status instead of output
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
         */
        private static function execInternalTidy( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgDebugTidy;
index 109e3eb..8c819ff 100644 (file)
  *
  * @file
  * @ingroup Profiler
- * This file is only included if profiling is enabled
- */
-
-/**
  * @defgroup Profiler Profiler
+ * This file is only included if profiling is enabled
  */
 
 /**
@@ -91,37 +88,18 @@ class ProfileSection {
 }
 
 /**
+ * Profiler base class that defines the interface and some trivial functionality
+ *
  * @ingroup Profiler
- * @todo document
  */
-class Profiler {
-       /** @var array List of resolved profile calls with start/end data */
-       protected $mStack = array();
-       /** @var array Queue of open profile calls with start data */
-       protected $mWorkStack = array();
-
-       /** @var array Map of (function name => aggregate data array) */
-       protected $mCollated = array();
-       /** @var bool */
-       protected $mCollateDone = false;
-       /** @var bool */
-       protected $mCollateOnly = false;
-       /** @var array Cache of a standard broken collation entry */
-       protected $mErrorEntry;
-
-       /** @var string wall|cpu|user */
-       protected $mTimeMetric = 'wall';
+abstract class Profiler {
        /** @var string|bool Profiler ID for bucketing data */
        protected $mProfileID = false;
        /** @var bool Whether MediaWiki is in a SkinTemplate output context */
        protected $mTemplated = false;
 
-       /** @var float seconds */
-       protected $mDBLockThreshold = 5.0;
-       /** @var array DB/server name => (active trx count,timestamp) */
-       protected $mDBTrxHoldingLocks = array();
-       /** @var array DB/server name => list of (function name, elapsed time) */
-       protected $mDBTrxMethodTimes = array();
+       /** @var TransactionProfiler */
+       protected $trxProfiler;
 
        /** @var Profiler */
        public static $__instance = null; // do not call this outside Profiler and ProfileSection
@@ -130,28 +108,24 @@ class Profiler {
         * @param array $params
         */
        public function __construct( array $params ) {
-               if ( isset( $params['timeMetric'] ) ) {
-                       $this->mTimeMetric = $params['timeMetric'];
-               }
                if ( isset( $params['profileID'] ) ) {
                        $this->mProfileID = $params['profileID'];
                }
-
-               $this->mCollateOnly = $this->collateOnly();
-
-               $this->addInitialStack();
+               $this->trxProfiler = new TransactionProfiler();
        }
 
        /**
         * Singleton
         * @return Profiler
         */
-       public static function instance() {
+       final public static function instance() {
                if ( self::$__instance === null ) {
                        global $wgProfiler;
                        if ( is_array( $wgProfiler ) ) {
                                if ( !isset( $wgProfiler['class'] ) ) {
                                        $class = 'ProfilerStub';
+                               } elseif ( $wgProfiler['class'] === 'Profiler'  ) {
+                                       $class = 'ProfilerStub'; // b/c; don't explode
                                } else {
                                        $class = $wgProfiler['class'];
                                }
@@ -159,7 +133,7 @@ class Profiler {
                        } elseif ( $wgProfiler instanceof Profiler ) {
                                self::$__instance = $wgProfiler; // back-compat
                        } else {
-                               self::$__instance = new ProfilerStub( $wgProfiler );
+                               self::$__instance = new ProfilerStub( array() );
                        }
                }
                return self::$__instance;
@@ -169,7 +143,7 @@ class Profiler {
         * Set the profiler to a specific profiler instance. Mostly for dumpHTML
         * @param Profiler $p
         */
-       public static function setInstance( Profiler $p ) {
+       final public static function setInstance( Profiler $p ) {
                self::$__instance = $p;
        }
 
@@ -178,19 +152,19 @@ class Profiler {
         *
         * @return bool
         */
-       public function isStub() {
-               return false;
-       }
+       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
         */
-       public function isPersistent() {
-               return false;
-       }
+       abstract public function isPersistent();
 
        /**
         * @param string $id
@@ -210,192 +184,19 @@ class Profiler {
                }
        }
 
-       /**
-        * Whether to internally just track aggregates and ignore the full stack trace
-        *
-        * @return bool
-        */
-       protected function collateOnly() {
-               return false;
-       }
-
-       /**
-        * Add the inital item in the stack.
-        */
-       protected function addInitialStack() {
-               $this->mErrorEntry = $this->getErrorEntry();
-
-               $initialTime = $this->getInitialTime( 'wall' );
-               $initialCpu = $this->getInitialTime( 'cpu' );
-               if ( $initialTime !== null && $initialCpu !== null ) {
-                       $this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
-                       if ( $this->mCollateOnly ) {
-                               $this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
-                               $this->profileOut( '-setup' );
-                       } else {
-                               $this->mStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
-                                       $this->getTime( 'wall' ), $this->getTime( 'cpu' ), 0 );
-                       }
-               } else {
-                       $this->profileIn( '-total' );
-               }
-       }
-
-       /**
-        * @return array Initial collation entry
-        */
-       protected function getZeroEntry() {
-               return array(
-                       'cpu'      => 0.0,
-                       'cpu_sq'   => 0.0,
-                       'real'     => 0.0,
-                       'real_sq'  => 0.0,
-                       'memory'   => 0,
-                       'count'    => 0,
-                       'min_cpu'  => 0.0,
-                       'max_cpu'  => 0.0,
-                       'min_real' => 0.0,
-                       'max_real' => 0.0,
-                       'periods'  => array(), // not filled if mCollateOnly
-                       'overhead' => 0 // not filled if mCollateOnly
-               );
-       }
-
-       /**
-        * @return array Initial collation entry for errors
-        */
-       protected function getErrorEntry() {
-               $entry = $this->getZeroEntry();
-               $entry['count'] = 1;
-               return $entry;
-       }
-
-       /**
-        * Update the collation entry for a given method name
-        *
-        * @param string $name
-        * @param float $elapsedCpu
-        * @param float $elapsedReal
-        * @param int $memChange
-        * @param int $subcalls
-        * @param array|null $period Map of ('start','end','memory','subcalls')
-        */
-       protected function updateEntry(
-               $name, $elapsedCpu, $elapsedReal, $memChange, $subcalls = 0, $period = null
-       ) {
-               $entry =& $this->mCollated[$name];
-               if ( !is_array( $entry ) ) {
-                       $entry = $this->getZeroEntry();
-                       $this->mCollated[$name] =& $entry;
-               }
-               $entry['cpu'] += $elapsedCpu;
-               $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
-               $entry['real'] += $elapsedReal;
-               $entry['real_sq'] += $elapsedReal * $elapsedReal;
-               $entry['memory'] += $memChange > 0 ? $memChange : 0;
-               $entry['count']++;
-               $entry['min_cpu'] = $elapsedCpu < $entry['min_cpu'] ? $elapsedCpu : $entry['min_cpu'];
-               $entry['max_cpu'] = $elapsedCpu > $entry['max_cpu'] ? $elapsedCpu : $entry['max_cpu'];
-               $entry['min_real'] = $elapsedReal < $entry['min_real'] ? $elapsedReal : $entry['min_real'];
-               $entry['max_real'] = $elapsedReal > $entry['max_real'] ? $elapsedReal : $entry['max_real'];
-               // Apply optional fields
-               $entry['overhead'] += $subcalls;
-               if ( $period ) {
-                       $entry['periods'][] = $period;
-               }
-       }
-
        /**
         * Called by wfProfieIn()
         *
         * @param string $functionname
         */
-       public function profileIn( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) .
-                               'Entering ' . $functionname . "\n" );
-               }
-
-               $this->mWorkStack[] = array(
-                       $functionname,
-                       count( $this->mWorkStack ),
-                       $this->getTime( 'time' ),
-                       $this->getTime( 'cpu' ),
-                       memory_get_usage()
-               );
-       }
+       abstract public function profileIn( $functionname );
 
        /**
         * Called by wfProfieOut()
         *
         * @param  string $functionname
         */
-       public function profileOut( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) .
-                               'Exiting ' . $functionname . "\n" );
-               }
-
-               $item = array_pop( $this->mWorkStack );
-               list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
-
-               if ( $item === null ) {
-                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
-               } else {
-                       if ( $functionname === 'close' ) {
-                               if ( $ofname !== '-total' ) {
-                                       $message = "Profile section ended by close(): {$ofname}";
-                                       $this->debugGroup( 'profileerror', $message );
-                                       if ( $this->mCollateOnly ) {
-                                               $this->mCollated[$message] = $this->mErrorEntry;
-                                       } else {
-                                               $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
-                                       }
-                               }
-                               $functionname = $ofname;
-                       } elseif ( $ofname !== $functionname ) {
-                               $message = "Profiling error: in({$ofname}), out($functionname)";
-                               $this->debugGroup( 'profileerror', $message );
-                               if ( $this->mCollateOnly ) {
-                                       $this->mCollated[$message] = $this->mErrorEntry;
-                               } else {
-                                       $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
-                               }
-                       }
-                       $realTime = $this->getTime( 'wall' );
-                       $cpuTime = $this->getTime( 'cpu' );
-                       if ( $this->mCollateOnly ) {
-                               $elapsedcpu = $cpuTime - $octime;
-                               $elapsedreal = $realTime - $ortime;
-                               $memchange = memory_get_usage() - $omem;
-                               $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
-                       } else {
-                               $this->mStack[] = array_merge( $item,
-                                       array( $realTime, $cpuTime,     memory_get_usage() ) );
-                       }
-                       $this->updateTrxProfiling( $functionname, $realTime - $ortime );
-               }
-       }
-
-       /**
-        * Close opened profiling sections
-        */
-       public function close() {
-               while ( count( $this->mWorkStack ) ) {
-                       $this->profileOut( 'close' );
-               }
-       }
-
-       /**
-        * Log the data to some store or even the page output
-        */
-       public function logData() {
-               /* Implement in subclasses */
-       }
+       abstract public function profileOut( $functionname );
 
        /**
         * Mark a DB as in a transaction with one or more writes pending
@@ -406,37 +207,7 @@ class Profiler {
         * @param string $db DB name
         */
        public function transactionWritingIn( $server, $db ) {
-               $name = "{$server} ({$db})";
-               if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
-                       ++$this->mDBTrxHoldingLocks[$name]['refs'];
-               } else {
-                       $this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
-                       $this->mDBTrxMethodTimes[$name] = array();
-               }
-       }
-
-       /**
-        * Register the name and time of a method for slow DB trx detection
-        *
-        * @param string $method Function name
-        * @param float $realtime Wal time ellapsed
-        */
-       protected function updateTrxProfiling( $method, $realtime ) {
-               if ( !$this->mDBTrxHoldingLocks ) {
-                       return; // short-circuit
-               // @TODO: hardcoded check is a tad janky (what about FOR UPDATE?)
-               } elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
-                       && $realtime < $this->mDBLockThreshold
-               ) {
-                       return; // not a DB master query nor slow enough
-               }
-               $now = microtime( true );
-               foreach ( $this->mDBTrxHoldingLocks as $name => $info ) {
-                       // Hacky check to exclude entries from before the first TRX write
-                       if ( ( $now - $realtime ) >= $info['start'] ) {
-                               $this->mDBTrxMethodTimes[$name][] = array( $method, $realtime );
-                       }
-               }
+               $this->trxProfiler->transactionWritingIn( $server, $db );
        }
 
        /**
@@ -450,30 +221,19 @@ class Profiler {
         * @param string $db DB name
         */
        public function transactionWritingOut( $server, $db ) {
-               $name = "{$server} ({$db})";
-               if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
-                       $slow = false;
-                       foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
-                               list( $method, $realtime ) = $info;
-                               if ( $realtime >= $this->mDBLockThreshold ) {
-                                       $slow = true;
-                                       break;
-                               }
-                       }
-                       if ( $slow ) {
-                               $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
-                               $msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
-                               foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
-                                       list( $method, $realtime ) = $info;
-                                       $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
-                               }
-                               $this->debugGroup( 'DBPerformance', $msg );
-                       }
-                       unset( $this->mDBTrxHoldingLocks[$name] );
-                       unset( $this->mDBTrxMethodTimes[$name] );
-               }
+               $this->trxProfiler->transactionWritingOut( $server, $db );
        }
 
+       /**
+        * Close opened profiling sections
+        */
+       abstract public function close();
+
+       /**
+        * Log the data to some store or even the page output
+        */
+       abstract public function logData();
+
        /**
         * Mark this call as templated or not
         *
@@ -488,86 +248,12 @@ class Profiler {
         *
         * @return string
         */
-       public function getOutput() {
-               global $wgDebugFunctionEntry, $wgProfileCallTree;
-
-               $wgDebugFunctionEntry = false; // hack
-
-               if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
-                       return "No profiling output\n";
-               }
-
-               if ( $wgProfileCallTree ) {
-                       return $this->getCallTree();
-               } else {
-                       return $this->getFunctionReport();
-               }
-       }
+       abstract public function getOutput();
 
        /**
-        * Returns a tree of function call instead of a list of functions
-        * @return string
-        */
-       protected function getCallTree() {
-               return implode( '', array_map(
-                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack )
-               ) );
-       }
-
-       /**
-        * Recursive function the format the current profiling array into a tree
-        *
-        * @param array $stack profiling array
         * @return array
         */
-       protected function remapCallTree( array $stack ) {
-               if ( count( $stack ) < 2 ) {
-                       return $stack;
-               }
-               $outputs = array();
-               for ( $max = count( $stack ) - 1; $max > 0; ) {
-                       /* Find all items under this entry */
-                       $level = $stack[$max][1];
-                       $working = array();
-                       for ( $i = $max -1; $i >= 0; $i-- ) {
-                               if ( $stack[$i][1] > $level ) {
-                                       $working[] = $stack[$i];
-                               } else {
-                                       break;
-                               }
-                       }
-                       $working = $this->remapCallTree( array_reverse( $working ) );
-                       $output = array();
-                       foreach ( $working as $item ) {
-                               array_push( $output, $item );
-                       }
-                       array_unshift( $output, $stack[$max] );
-                       $max = $i;
-
-                       array_unshift( $outputs, $output );
-               }
-               $final = array();
-               foreach ( $outputs as $output ) {
-                       foreach ( $output as $item ) {
-                               $final[] = $item;
-                       }
-               }
-               return $final;
-       }
-
-       /**
-        * Callback to get a formatted line for the call tree
-        * @return string
-        */
-       protected function getCallTreeLine( $entry ) {
-               list( $fname, $level, $startreal, , , $endreal ) = $entry;
-               $delta = $endreal - $startreal;
-               $space = str_repeat( ' ', $level );
-               # The ugly double sprintf is to work around a PHP bug,
-               # which has been fixed in recent releases.
-               return sprintf( "%10s %s %s\n",
-                       trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
-       }
+       abstract public function getRawData();
 
        /**
         * Get the initial time of the request, based either on $wgRequestTime or
@@ -580,12 +266,8 @@ class Profiler {
         *   - false (default): will fall back to default metric
         * @return float|null
         */
-       protected function getTime( $metric = false ) {
-               if ( $metric === false ) {
-                       $metric = $this->mTimeMetric;
-               }
-
-               if ( $metric === 'cpu' || $this->mTimeMetric === 'user' ) {
+       protected function getTime( $metric = 'wall' ) {
+               if ( $metric === 'cpu' || $metric === 'user' ) {
                        if ( !function_exists( 'getrusage' ) ) {
                                return 0;
                        }
@@ -613,14 +295,10 @@ class Profiler {
         *   - false (default): will fall back to default metric
         * @return float|null
         */
-       protected function getInitialTime( $metric = false ) {
+       protected function getInitialTime( $metric = 'wall' ) {
                global $wgRequestTime, $wgRUstart;
 
-               if ( $metric === false ) {
-                       $metric = $this->mTimeMetric;
-               }
-
-               if ( $metric === 'cpu' || $this->mTimeMetric === 'user' ) {
+               if ( $metric === 'cpu' || $metric === 'user' ) {
                        if ( !count( $wgRUstart ) ) {
                                return null;
                        }
@@ -642,231 +320,121 @@ class Profiler {
        }
 
        /**
-        * Populate mCollated
+        * Add an entry in the debug log file
+        *
+        * @param string $s to output
         */
-       protected function collateData() {
-               if ( $this->mCollateDone ) {
-                       return;
-               }
-               $this->mCollateDone = true;
-               $this->close(); // set "-total" entry
-
-               if ( $this->mCollateOnly ) {
-                       return; // already collated as methods exited
-               }
-
-               $this->mCollated = array();
-
-               # Estimate profiling overhead
-               $profileCount = count( $this->mStack );
-               self::calculateOverhead( $profileCount );
-
-               # First, subtract the overhead!
-               $overheadTotal = $overheadMemory = $overheadInternal = array();
-               foreach ( $this->mStack as $entry ) {
-                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
-                       $fname = $entry[0];
-                       $elapsed = $entry[5] - $entry[2];
-                       $memchange = $entry[7] - $entry[4];
-
-                       if ( $fname === '-overhead-total' ) {
-                               $overheadTotal[] = $elapsed;
-                               $overheadMemory[] = max( 0, $memchange );
-                       } elseif ( $fname === '-overhead-internal' ) {
-                               $overheadInternal[] = $elapsed;
-                       }
-               }
-               $overheadTotal = $overheadTotal ?
-                       array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
-               $overheadMemory = $overheadMemory ?
-                       array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
-               $overheadInternal = $overheadInternal ?
-                       array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
-
-               # Collate
-               foreach ( $this->mStack as $index => $entry ) {
-                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
-                       $fname = $entry[0];
-                       $elapsedCpu = $entry[6] - $entry[3];
-                       $elapsedReal = $entry[5] - $entry[2];
-                       $memchange = $entry[7] - $entry[4];
-                       $subcalls = $this->calltreeCount( $this->mStack, $index );
-
-                       if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
-                               # Adjust for profiling overhead (except special values with elapsed=0
-                               if ( $elapsed ) {
-                                       $elapsed -= $overheadInternal;
-                                       $elapsed -= ( $subcalls * $overheadTotal );
-                                       $memchange -= ( $subcalls * $overheadMemory );
-                               }
-                       }
-
-                       $period = array( 'start' => $entry[2], 'end' => $entry[5],
-                               'memory' => $memchange, 'subcalls' => $subcalls );
-                       $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange, $subcalls, $period );
+       protected function debug( $s ) {
+               if ( function_exists( 'wfDebug' ) ) {
+                       wfDebug( $s );
                }
-
-               $this->mCollated['-overhead-total']['count'] = $profileCount;
-               arsort( $this->mCollated, SORT_NUMERIC );
        }
 
        /**
-        * Returns a list of profiled functions.
+        * Add an entry in the debug log group
         *
-        * @return string
+        * @param string $group Group to send the message to
+        * @param string $s to output
         */
-       protected function getFunctionReport() {
-               $this->collateData();
-
-               $width = 140;
-               $nameWidth = $width - 65;
-               $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d  (%13.3f -%13.3f) [%d]\n";
-               $titleFormat = "%-{$nameWidth}s %6s %13s %13s %13s %9s\n";
-               $prof = "\nProfiling data\n";
-               $prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
-
-               $total = isset( $this->mCollated['-total'] )
-                       ? $this->mCollated['-total']['real']
-                       : 0;
-
-               foreach ( $this->mCollated as $fname => $data ) {
-                       $calls = $data['count'];
-                       $percent = $total ? 100 * $data['real'] / $total : 0;
-                       $memory = $data['memory'];
-                       $prof .= sprintf( $format,
-                               substr( $fname, 0, $nameWidth ),
-                               $calls,
-                               (float)( $data['real'] * 1000 ),
-                               (float)( $data['real'] * 1000 ) / $calls,
-                               $percent,
-                               $memory,
-                               ( $data['min_real'] * 1000.0 ),
-                               ( $data['max_real'] * 1000.0 ),
-                               $data['overhead']
-                       );
+       protected function debugGroup( $group, $s ) {
+               if ( function_exists( 'wfDebugLog' ) ) {
+                       wfDebugLog( $group, $s );
                }
-               $prof .= "\nTotal: $total\n\n";
-
-               return $prof;
        }
+}
 
-       /**
-        * @return array
-        */
-       public function getRawData() {
-               // This method is called before shutdown in the footer method on Skins.
-               // If some outer methods have not yet called wfProfileOut(), work around
-               // that by clearing anything in the work stack to just the "-total" entry.
-               // Collate after doing this so the results do not include profile errors.
-               if ( count( $this->mWorkStack ) > 1 ) {
-                       $oldWorkStack = $this->mWorkStack;
-                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
-               } else {
-                       $oldWorkStack = null;
-               }
-               $this->collateData();
-               // If this trick is used, then the old work stack is swapped back afterwards
-               // and mCollateDone is reset to false. This means that logData() will still
-               // make use of all the method data since the missing wfProfileOut() calls
-               // should be made by the time it is called.
-               if ( $oldWorkStack ) {
-                       $this->mWorkStack = $oldWorkStack;
-                       $this->mCollateDone = false;
-               }
-
-               $total = isset( $this->mCollated['-total'] )
-                       ? $this->mCollated['-total']['real']
-                       : 0;
-
-               $profile = array();
-               foreach ( $this->mCollated as $fname => $data ) {
-                       $periods = array();
-                       foreach ( $data['periods'] as $period ) {
-                               $period['start'] *= 1000;
-                               $period['end'] *= 1000;
-                               $periods[] = $period;
-                       }
-                       $profile[] = array(
-                               'name' => $fname,
-                               'calls' => $data['count'],
-                               'elapsed' => $data['real'] * 1000,
-                               'percent' => $total ? 100 * $data['real'] / $total : 0,
-                               'memory' => $data['memory'],
-                               'min' => $data['min_real'] * 1000,
-                               'max' => $data['max_real'] * 1000,
-                               'overhead' => $data['overhead'],
-                               'periods' => $periods
-                       );
-               }
-
-               return $profile;
-       }
+/**
+ * Helper class that detects high-contention DB queries via profiling calls
+ *
+ * This class is meant to work with a Profiler, as the later already knows
+ * when methods start and finish (which may take place during transactions).
+ *
+ * @since 1.24
+ */
+class TransactionProfiler {
+       /** @var float seconds */
+       protected $mDBLockThreshold = 5.0;
+       /** @var Array DB/server name => (active trx count,timestamp) */
+       protected $mDBTrxHoldingLocks = array();
+       /** @var Array DB/server name => list of (function name, elapsed time) */
+       protected $mDBTrxMethodTimes = array();
 
        /**
-        * Dummy calls to wfProfileIn/wfProfileOut to calculate its overhead
+        * Mark a DB as in a transaction with one or more writes pending
         *
-        * @param int $profileCount
-        */
-       protected static function calculateOverhead( $profileCount ) {
-               wfProfileIn( '-overhead-total' );
-               for ( $i = 0; $i < $profileCount; $i++ ) {
-                       wfProfileIn( '-overhead-internal' );
-                       wfProfileOut( '-overhead-internal' );
-               }
-               wfProfileOut( '-overhead-total' );
-       }
-
-       /**
-        * Counts the number of profiled function calls sitting under
-        * the given point in the call graph. Not the most efficient algo.
+        * Note that there can be multiple connections to a single DB.
         *
-        * @param array $stack
-        * @param int $start
-        * @return int
+        * @param string $server DB server
+        * @param string $db DB name
         */
-       protected function calltreeCount( $stack, $start ) {
-               $level = $stack[$start][1];
-               $count = 0;
-               for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
-                       $count ++;
+       public function transactionWritingIn( $server, $db ) {
+               $name = "{$server} ({$db})";
+               if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
+                       ++$this->mDBTrxHoldingLocks[$name]['refs'];
+               } else {
+                       $this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
+                       $this->mDBTrxMethodTimes[$name] = array();
                }
-               return $count;
        }
 
        /**
-        * Add an entry in the debug log file
+        * Register the name and time of a method for slow DB trx detection
         *
-        * @param string $s String to output
-        */
-       protected function debug( $s ) {
-               if ( function_exists( 'wfDebug' ) ) {
-                       wfDebug( $s );
-               }
-       }
-
-       /**
-        * Add an entry in the debug log group
+        * This method is only to be called by the Profiler class as methods finish
         *
-        * @param string $group Group to send the message to
-        * @param string $s String to output
+        * @param string $method Function name
+        * @param float $realtime Wal time ellapsed
         */
-       protected function debugGroup( $group, $s ) {
-               if ( function_exists( 'wfDebugLog' ) ) {
-                       wfDebugLog( $group, $s );
+       public function recordFunctionCompletion( $method, $realtime ) {
+               if ( !$this->mDBTrxHoldingLocks ) {
+                       return; // short-circuit
+               // @TODO: hardcoded check is a tad janky (what about FOR UPDATE?)
+               } elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
+                       && $realtime < $this->mDBLockThreshold
+               ) {
+                       return; // not a DB master query nor slow enough
+               }
+               $now = microtime( true );
+               foreach ( $this->mDBTrxHoldingLocks as $name => $info ) {
+                       // Hacky check to exclude entries from before the first TRX write
+                       if ( ( $now - $realtime ) >= $info['start'] ) {
+                               $this->mDBTrxMethodTimes[$name][] = array( $method, $realtime );
+                       }
                }
        }
 
        /**
-        * Get the content type sent out to the client.
-        * Used for profilers that output instead of store data.
-        * @return string
+        * Mark a DB as no longer in a transaction
+        *
+        * This will check if locks are possibly held for longer than
+        * needed and log any affected transactions to a special DB log.
+        * Note that there can be multiple connections to a single DB.
+        *
+        * @param string $server DB server
+        * @param string $db DB name
         */
-       protected function getContentType() {
-               foreach ( headers_list() as $header ) {
-                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
-                               return $m[1];
+       public function transactionWritingOut( $server, $db ) {
+               $name = "{$server} ({$db})";
+               if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
+                       $slow = false;
+                       foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
+                               list( $method, $realtime ) = $info;
+                               if ( $realtime >= $this->mDBLockThreshold ) {
+                                       $slow = true;
+                                       break;
+                               }
                        }
+                       if ( $slow ) {
+                               $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
+                               $msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
+                               foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
+                                       list( $method, $realtime ) = $info;
+                                       $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
+                               }
+                               $this->debugGroup( 'DBPerformance', $msg );
+                       }
+                       unset( $this->mDBTrxHoldingLocks[$name] );
+                       unset( $this->mDBTrxMethodTimes[$name] );
                }
-               return null;
        }
 }
index 67b6034..abcd23c 100644 (file)
  * @since 1.23
  */
 class ProfilerMwprof extends Profiler {
+       /** @var array Queue of open profile calls with start data */
+       protected $mWorkStack = array();
+
+       /** @var array Map of (function name => aggregate data array) */
+       protected $mCollated = array();
+       /** @var array Cache of a standard broken collation entry */
+       protected $mErrorEntry;
+
        // Message types
        const TYPE_SINGLE = 1;
        const TYPE_RUNNING = 2;
 
-       protected function collateOnly() {
+       public function isStub() {
                return false;
        }
 
-       /**
-        * Indicate that this Profiler subclass is persistent.
-        *
-        * Called by Parser::braceSubstitution. If true, the parser will not
-        * generate per-title profiling sections, to avoid overloading the
-        * profiling data collector.
-        *
-        * @return bool true
-        */
        public function isPersistent() {
                return true;
        }
@@ -88,7 +87,7 @@ class ProfilerMwprof extends Profiler {
                $elapsedCpu = $this->getTime( 'cpu' ) - $inCpu;
                $elapsedWall = $this->getTime() - $inWall;
                $this->updateRunningEntry( $outName, $elapsedCpu, $elapsedWall );
-               $this->updateTrxProfiling( $outName, $elapsedWall );
+               $this->trxProfiler->recordFunctionCompletion( $outName, $elapsedWall );
        }
 
        /**
@@ -129,17 +128,6 @@ class ProfilerMwprof extends Profiler {
                $entry['wall']->push( $elapsedWall );
        }
 
-       /**
-        * Produce an empty function report.
-        *
-        * ProfileMwprof does not provide a function report.
-        *
-        * @return string Empty string.
-        */
-       public function getFunctionReport() {
-               return '';
-       }
-
        /**
         * @return array
         */
@@ -194,7 +182,6 @@ class ProfilerMwprof extends Profiler {
 
                foreach ( $profile as &$item ) {
                        $item['percent'] = $totalWall ? 100 * $item['elapsed'] / $totalWall : 0;
-                       $z+= $item['percent'];
                }
 
                return $profile;
@@ -214,7 +201,6 @@ class ProfilerMwprof extends Profiler {
                $this->close();
 
                if ( !function_exists( 'socket_create' ) ) {
-                       #trigger_error( __METHOD__ . ": function \"socket_create\" not found." );
                        return; // avoid fatal
                }
 
@@ -254,4 +240,17 @@ class ProfilerMwprof extends Profiler {
                        socket_send( $sock, $buffer, $bufferLength, 0 );
                }
        }
+
+       /**
+        * Close opened profiling sections
+        */
+       public function close() {
+               while ( count( $this->mWorkStack ) ) {
+                       $this->profileOut( 'close' );
+               }
+       }
+
+       public function getOutput() {
+               return ''; // no report
+       }
 }
index e35eec1..6911d4b 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup Profiler
  */
-class ProfilerSimpleDB extends Profiler {
+class ProfilerSimpleDB extends ProfilerStandard {
        protected function collateOnly() {
                return true;
        }
index 975d260..0ee7aad 100644 (file)
@@ -31,7 +31,7 @@
  *
  * @ingroup Profiler
  */
-class ProfilerSimpleText extends Profiler {
+class ProfilerSimpleText extends ProfilerStandard {
        public $visible = false; /* Show as <PRE> or <!-- ? */
        static private $out;
 
index 8d7f11c..2a44494 100644 (file)
@@ -26,7 +26,7 @@
  * @todo document methods (?)
  * @ingroup Profiler
  */
-class ProfilerSimpleTrace extends Profiler {
+class ProfilerSimpleTrace extends ProfilerStandard {
        protected $trace = "Beginning trace: \n";
        protected $memory = 0;
 
index dfe923d..22d5cd4 100644 (file)
@@ -27,7 +27,7 @@
  *  http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
  * @ingroup Profiler
  */
-class ProfilerSimpleUDP extends Profiler {
+class ProfilerSimpleUDP extends ProfilerStandard {
        protected function collateOnly() {
                return true;
        }
diff --git a/includes/profiler/ProfilerStandard.php b/includes/profiler/ProfilerStandard.php
new file mode 100644 (file)
index 0000000..dc1114c
--- /dev/null
@@ -0,0 +1,557 @@
+<?php
+/**
+ * Common implementation class for 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
+ */
+
+/**
+ * Standard profiler that tracks real time, cpu time, and memory deltas
+ *
+ * This supports profile reports, the debug toolbar, and high-contention
+ * DB query warnings. This does not persist the profiling data though.
+ *
+ * @ingroup Profiler
+ * @since 1.24
+ */
+class ProfilerStandard extends Profiler {
+       /** @var array List of resolved profile calls with start/end data */
+       protected $mStack = array();
+       /** @var array Queue of open profile calls with start data */
+       protected $mWorkStack = array();
+
+       /** @var array Map of (function name => aggregate data array) */
+       protected $mCollated = array();
+       /** @var bool */
+       protected $mCollateDone = false;
+       /** @var bool */
+       protected $mCollateOnly = false;
+       /** @var array Cache of a standard broken collation entry */
+       protected $mErrorEntry;
+
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+
+               $this->mCollateOnly = $this->collateOnly();
+
+               $this->addInitialStack();
+       }
+
+       /**
+        * Return whether this a stub profiler
+        *
+        * @return Boolean
+        */
+       public function isStub() {
+               return false;
+       }
+
+       /**
+        * Return whether this profiler stores data
+        *
+        * @see Profiler::logData()
+        * @return Boolean
+        */
+       public function isPersistent() {
+               return false;
+       }
+
+       /**
+        * Whether to internally just track aggregates and ignore the full stack trace
+        *
+        * Only doing collation saves memory overhead but limits the use of certain
+        * features like that of graph generation for the debug toolbar.
+        *
+        * @return boolean
+        */
+       protected function collateOnly() {
+               return false;
+       }
+
+       /**
+        * Add the inital item in the stack.
+        */
+       protected function addInitialStack() {
+               $this->mErrorEntry = $this->getErrorEntry();
+
+               $initialTime = $this->getInitialTime( 'wall' );
+               $initialCpu = $this->getInitialTime( 'cpu' );
+               if ( $initialTime !== null && $initialCpu !== null ) {
+                       $this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
+                       if ( $this->mCollateOnly ) {
+                               $this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
+                               $this->profileOut( '-setup' );
+                       } else {
+                               $this->mStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
+                                       $this->getTime( 'wall' ), $this->getTime( 'cpu' ), 0 );
+                       }
+               } else {
+                       $this->profileIn( '-total' );
+               }
+       }
+
+       /**
+        * @return array Initial collation entry
+        */
+       protected function getZeroEntry() {
+               return array(
+                       'cpu'      => 0.0,
+                       'cpu_sq'   => 0.0,
+                       'real'     => 0.0,
+                       'real_sq'  => 0.0,
+                       'memory'   => 0,
+                       'count'    => 0,
+                       'min_cpu'  => 0.0,
+                       'max_cpu'  => 0.0,
+                       'min_real' => 0.0,
+                       'max_real' => 0.0,
+                       'periods'  => array(), // not filled if mCollateOnly
+                       'overhead' => 0 // not filled if mCollateOnly
+               );
+       }
+
+       /**
+        * @return array Initial collation entry for errors
+        */
+       protected function getErrorEntry() {
+               $entry = $this->getZeroEntry();
+               $entry['count'] = 1;
+               return $entry;
+       }
+
+       /**
+        * Update the collation entry for a given method name
+        *
+        * @param string $name
+        * @param float $elapsedCpu
+        * @param float $elapsedReal
+        * @param integer $memChange
+        * @param integer $subcalls
+        * @param array|null $period Map of ('start','end','memory','subcalls')
+        */
+       protected function updateEntry(
+               $name, $elapsedCpu, $elapsedReal, $memChange, $subcalls = 0, $period = null
+       ) {
+               $entry =& $this->mCollated[$name];
+               if ( !is_array( $entry ) ) {
+                       $entry = $this->getZeroEntry();
+                       $this->mCollated[$name] =& $entry;
+               }
+               $entry['cpu'] += $elapsedCpu;
+               $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
+               $entry['real'] += $elapsedReal;
+               $entry['real_sq'] += $elapsedReal * $elapsedReal;
+               $entry['memory'] += $memChange > 0 ? $memChange : 0;
+               $entry['count']++;
+               $entry['min_cpu'] = $elapsedCpu < $entry['min_cpu'] ? $elapsedCpu : $entry['min_cpu'];
+               $entry['max_cpu'] = $elapsedCpu > $entry['max_cpu'] ? $elapsedCpu : $entry['max_cpu'];
+               $entry['min_real'] = $elapsedReal < $entry['min_real'] ? $elapsedReal : $entry['min_real'];
+               $entry['max_real'] = $elapsedReal > $entry['max_real'] ? $elapsedReal : $entry['max_real'];
+               // Apply optional fields
+               $entry['overhead'] += $subcalls;
+               if ( $period ) {
+                       $entry['periods'][] = $period;
+               }
+       }
+
+       /**
+        * Called by wfProfieIn()
+        *
+        * @param $functionname String
+        */
+       public function profileIn( $functionname ) {
+               global $wgDebugFunctionEntry;
+
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) .
+                               'Entering ' . $functionname . "\n" );
+               }
+
+               $this->mWorkStack[] = array(
+                       $functionname,
+                       count( $this->mWorkStack ),
+                       $this->getTime( 'time' ),
+                       $this->getTime( 'cpu' ),
+                       memory_get_usage()
+               );
+       }
+
+       /**
+        * Called by wfProfieOut()
+        *
+        * @param $functionname String
+        */
+       public function profileOut( $functionname ) {
+               global $wgDebugFunctionEntry;
+
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) .
+                               'Exiting ' . $functionname . "\n" );
+               }
+
+               $item = array_pop( $this->mWorkStack );
+               list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
+
+               if ( $item === null ) {
+                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
+               } else {
+                       if ( $functionname === 'close' ) {
+                               if ( $ofname !== '-total' ) {
+                                       $message = "Profile section ended by close(): {$ofname}";
+                                       $this->debugGroup( 'profileerror', $message );
+                                       if ( $this->mCollateOnly ) {
+                                               $this->mCollated[$message] = $this->mErrorEntry;
+                                       } else {
+                                               $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                                       }
+                               }
+                               $functionname = $ofname;
+                       } elseif ( $ofname !== $functionname ) {
+                               $message = "Profiling error: in({$ofname}), out($functionname)";
+                               $this->debugGroup( 'profileerror', $message );
+                               if ( $this->mCollateOnly ) {
+                                       $this->mCollated[$message] = $this->mErrorEntry;
+                               } else {
+                                       $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                               }
+                       }
+                       $realTime = $this->getTime( 'wall' );
+                       $cpuTime = $this->getTime( 'cpu' );
+                       if ( $this->mCollateOnly ) {
+                               $elapsedcpu = $cpuTime - $octime;
+                               $elapsedreal = $realTime - $ortime;
+                               $memchange = memory_get_usage() - $omem;
+                               $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
+                       } else {
+                               $this->mStack[] = array_merge( $item,
+                                       array( $realTime, $cpuTime,     memory_get_usage() ) );
+                       }
+                       $this->trxProfiler->recordFunctionCompletion( $functionname, $realTime - $ortime );
+               }
+       }
+
+       /**
+        * Close opened profiling sections
+        */
+       public function close() {
+               while ( count( $this->mWorkStack ) ) {
+                       $this->profileOut( 'close' );
+               }
+       }
+
+       /**
+        * Log the data to some store or even the page output
+        */
+       public function logData() {
+               /* Implement in subclasses */
+       }
+
+       /**
+        * Returns a profiling output to be stored in debug file
+        *
+        * @return String
+        */
+       public function getOutput() {
+               global $wgDebugFunctionEntry, $wgProfileCallTree;
+
+               $wgDebugFunctionEntry = false; // hack
+
+               if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
+                       return "No profiling output\n";
+               }
+
+               if ( $wgProfileCallTree ) {
+                       return $this->getCallTree();
+               } else {
+                       return $this->getFunctionReport();
+               }
+       }
+
+       /**
+        * Returns a tree of function call instead of a list of functions
+        * @return string
+        */
+       protected function getCallTree() {
+               return implode( '', array_map(
+                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack )
+               ) );
+       }
+
+       /**
+        * Recursive function the format the current profiling array into a tree
+        *
+        * @param array $stack profiling array
+        * @return array
+        */
+       protected function remapCallTree( array $stack ) {
+               if ( count( $stack ) < 2 ) {
+                       return $stack;
+               }
+               $outputs = array();
+               for ( $max = count( $stack ) - 1; $max > 0; ) {
+                       /* Find all items under this entry */
+                       $level = $stack[$max][1];
+                       $working = array();
+                       for ( $i = $max -1; $i >= 0; $i-- ) {
+                               if ( $stack[$i][1] > $level ) {
+                                       $working[] = $stack[$i];
+                               } else {
+                                       break;
+                               }
+                       }
+                       $working = $this->remapCallTree( array_reverse( $working ) );
+                       $output = array();
+                       foreach ( $working as $item ) {
+                               array_push( $output, $item );
+                       }
+                       array_unshift( $output, $stack[$max] );
+                       $max = $i;
+
+                       array_unshift( $outputs, $output );
+               }
+               $final = array();
+               foreach ( $outputs as $output ) {
+                       foreach ( $output as $item ) {
+                               $final[] = $item;
+                       }
+               }
+               return $final;
+       }
+
+       /**
+        * Callback to get a formatted line for the call tree
+        * @return string
+        */
+       protected function getCallTreeLine( $entry ) {
+               list( $fname, $level, $startreal, , , $endreal ) = $entry;
+               $delta = $endreal - $startreal;
+               $space = str_repeat( ' ', $level );
+               # The ugly double sprintf is to work around a PHP bug,
+               # which has been fixed in recent releases.
+               return sprintf( "%10s %s %s\n",
+                       trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
+       }
+
+       /**
+        * Populate mCollated
+        */
+       protected function collateData() {
+               if ( $this->mCollateDone ) {
+                       return;
+               }
+               $this->mCollateDone = true;
+               $this->close(); // set "-total" entry
+
+               if ( $this->mCollateOnly ) {
+                       return; // already collated as methods exited
+               }
+
+               $this->mCollated = array();
+
+               # Estimate profiling overhead
+               $profileCount = count( $this->mStack );
+               self::calculateOverhead( $profileCount );
+
+               # First, subtract the overhead!
+               $overheadTotal = $overheadMemory = $overheadInternal = array();
+               foreach ( $this->mStack as $entry ) {
+                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
+                       $fname = $entry[0];
+                       $elapsed = $entry[5] - $entry[2];
+                       $memchange = $entry[7] - $entry[4];
+
+                       if ( $fname === '-overhead-total' ) {
+                               $overheadTotal[] = $elapsed;
+                               $overheadMemory[] = max( 0, $memchange );
+                       } elseif ( $fname === '-overhead-internal' ) {
+                               $overheadInternal[] = $elapsed;
+                       }
+               }
+               $overheadTotal = $overheadTotal ?
+                       array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
+               $overheadMemory = $overheadMemory ?
+                       array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
+               $overheadInternal = $overheadInternal ?
+                       array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
+
+               # Collate
+               foreach ( $this->mStack as $index => $entry ) {
+                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
+                       $fname = $entry[0];
+                       $elapsedCpu = $entry[6] - $entry[3];
+                       $elapsedReal = $entry[5] - $entry[2];
+                       $memchange = $entry[7] - $entry[4];
+                       $subcalls = $this->calltreeCount( $this->mStack, $index );
+
+                       if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
+                               # Adjust for profiling overhead (except special values with elapsed=0
+                               if ( $elapsed ) {
+                                       $elapsed -= $overheadInternal;
+                                       $elapsed -= ( $subcalls * $overheadTotal );
+                                       $memchange -= ( $subcalls * $overheadMemory );
+                               }
+                       }
+
+                       $period = array( 'start' => $entry[2], 'end' => $entry[5],
+                               'memory' => $memchange, 'subcalls' => $subcalls );
+                       $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange, $subcalls, $period );
+               }
+
+               $this->mCollated['-overhead-total']['count'] = $profileCount;
+               arsort( $this->mCollated, SORT_NUMERIC );
+       }
+
+       /**
+        * Returns a list of profiled functions.
+        *
+        * @return string
+        */
+       protected function getFunctionReport() {
+               $this->collateData();
+
+               $width = 140;
+               $nameWidth = $width - 65;
+               $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d  (%13.3f -%13.3f) [%d]\n";
+               $titleFormat = "%-{$nameWidth}s %6s %13s %13s %13s %9s\n";
+               $prof = "\nProfiling data\n";
+               $prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
+
+               $total = isset( $this->mCollated['-total'] )
+                       ? $this->mCollated['-total']['real']
+                       : 0;
+
+               foreach ( $this->mCollated as $fname => $data ) {
+                       $calls = $data['count'];
+                       $percent = $total ? 100 * $data['real'] / $total : 0;
+                       $memory = $data['memory'];
+                       $prof .= sprintf( $format,
+                               substr( $fname, 0, $nameWidth ),
+                               $calls,
+                               (float)( $data['real'] * 1000 ),
+                               (float)( $data['real'] * 1000 ) / $calls,
+                               $percent,
+                               $memory,
+                               ( $data['min_real'] * 1000.0 ),
+                               ( $data['max_real'] * 1000.0 ),
+                               $data['overhead']
+                       );
+               }
+               $prof .= "\nTotal: $total\n\n";
+
+               return $prof;
+       }
+
+       /**
+        * @return array
+        */
+       public function getRawData() {
+               // This method is called before shutdown in the footer method on Skins.
+               // If some outer methods have not yet called wfProfileOut(), work around
+               // that by clearing anything in the work stack to just the "-total" entry.
+               // Collate after doing this so the results do not include profile errors.
+               if ( count( $this->mWorkStack ) > 1 ) {
+                       $oldWorkStack = $this->mWorkStack;
+                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
+               } else {
+                       $oldWorkStack = null;
+               }
+               $this->collateData();
+               // If this trick is used, then the old work stack is swapped back afterwards
+               // and mCollateDone is reset to false. This means that logData() will still
+               // make use of all the method data since the missing wfProfileOut() calls
+               // should be made by the time it is called.
+               if ( $oldWorkStack ) {
+                       $this->mWorkStack = $oldWorkStack;
+                       $this->mCollateDone = false;
+               }
+
+               $total = isset( $this->mCollated['-total'] )
+                       ? $this->mCollated['-total']['real']
+                       : 0;
+
+               $profile = array();
+               foreach ( $this->mCollated as $fname => $data ) {
+                       $periods = array();
+                       foreach ( $data['periods'] as $period ) {
+                               $period['start'] *= 1000;
+                               $period['end'] *= 1000;
+                               $periods[] = $period;
+                       }
+                       $profile[] = array(
+                               'name' => $fname,
+                               'calls' => $data['count'],
+                               'elapsed' => $data['real'] * 1000,
+                               'percent' => $total ? 100 * $data['real'] / $total : 0,
+                               'memory' => $data['memory'],
+                               'min' => $data['min_real'] * 1000,
+                               'max' => $data['max_real'] * 1000,
+                               'overhead' => $data['overhead'],
+                               'periods' => $periods
+                       );
+               }
+
+               return $profile;
+       }
+
+       /**
+        * Dummy calls to wfProfileIn/wfProfileOut to calculate its overhead
+        */
+       protected static function calculateOverhead( $profileCount ) {
+               wfProfileIn( '-overhead-total' );
+               for ( $i = 0; $i < $profileCount; $i++ ) {
+                       wfProfileIn( '-overhead-internal' );
+                       wfProfileOut( '-overhead-internal' );
+               }
+               wfProfileOut( '-overhead-total' );
+       }
+
+       /**
+        * Counts the number of profiled function calls sitting under
+        * the given point in the call graph. Not the most efficient algo.
+        *
+        * @param $stack Array:
+        * @param $start Integer:
+        * @return Integer
+        */
+       protected function calltreeCount( $stack, $start ) {
+               $level = $stack[$start][1];
+               $count = 0;
+               for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
+                       $count ++;
+               }
+               return $count;
+       }
+
+       /**
+        * Get the content type sent out to the client.
+        * Used for profilers that output instead of store data.
+        * @return string
+        */
+       protected function getContentType() {
+               foreach ( headers_list() as $header ) {
+                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
+                               return $m[1];
+                       }
+               }
+               return null;
+       }
+}
index 005081c..5ff88d8 100644 (file)
@@ -238,7 +238,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        public static function getStartupModulesUrl( ResourceLoaderContext $context ) {
                // The core modules:
                $moduleNames = array( 'jquery', 'mediawiki' );
-               wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ) );
+               wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ), '1.23' );
 
                // Get the latest version
                $loader = $context->getResourceLoader();
index 4da63b3..e4f4b55 100644 (file)
@@ -191,7 +191,7 @@ class SearchPostgres extends SearchDatabase {
 
        function update( $pageid, $title, $text ) {
                ## We don't want to index older revisions
-               $sql = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN " .
+               $sql = "UPDATE pagecontent SET textvector = NULL WHERE textvector IS NOT NULL and old_id IN " .
                                "(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
                                " ORDER BY rev_text_id DESC OFFSET 1)";
                $this->db->query( $sql );
index 61bb1cd..0c4252e 100644 (file)
@@ -551,7 +551,7 @@ class SpecialSearch extends SpecialPage {
                $profile = new ProfileSection( __METHOD__ );
 
                if ( $result->isBrokenTitle() ) {
-                       return "<!-- Broken link in search result -->\n";
+                       return '';
                }
 
                $title = $result->getTitle();
@@ -583,7 +583,7 @@ class SpecialSearch extends SpecialPage {
                // The least confusing at this point is to drop the result.
                // You may get less results, but... oh well. :P
                if ( $result->isMissingRevision() ) {
-                       return "<!-- missing page " . htmlspecialchars( $title->getPrefixedText() ) . "-->\n";
+                       return '';
                }
 
                // format redirects / relevant sections
@@ -783,7 +783,7 @@ class SpecialSearch extends SpecialPage {
                $profile = new ProfileSection( __METHOD__ );
 
                if ( $result->isBrokenTitle() ) {
-                       return "<!-- Broken link in search result -->\n";
+                       return '';
                }
 
                $title = $result->getTitle();
index d1aef1d..1c8bbd1 100644 (file)
@@ -51,9 +51,6 @@ class UsercreateTemplate extends BaseTemplate {
                <div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
        <?php } ?>
        <div id="userloginForm">
-               <h2 class="createaccount-join">
-                       <?php $this->msg( $this->data['loggedin'] ? 'createacct-another-join' : 'createacct-join' ); ?>
-               </h2>
                <form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
                        <section class="mw-form-header">
                                <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
index 4b14a19..a8a5d75 100644 (file)
@@ -29,5 +29,4 @@
  * @author Daniel Kinzler
  */
 class MalformedTitleException extends Exception {
-
 }
index 62ed4c2..c593dca 100644 (file)
@@ -28,7 +28,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 class MediaWikiPageLinkRenderer implements PageLinkRenderer {
-
        /**
         * @var TitleFormatter
         */
@@ -108,6 +107,7 @@ class MediaWikiPageLinkRenderer implements PageLinkRenderer {
                // re-implement Linker to use a HtmlPageLinkRenderer.
                $title = Title::newFromTitleValue( $page );
                $link = Linker::link( $title, htmlspecialchars( $text ) );
+
                return $link;
        }
 
index 288c1d9..d6c666a 100644 (file)
@@ -33,7 +33,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
-
        /**
         * @var Language
         */
@@ -54,7 +53,9 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param GenderCache $genderCache the gender cache for generating gendered namespace names
         * @param string[]|string $localInterwikis
         */
-       public function __construct( Language $language, GenderCache $genderCache, $localInterwikis = array() ) {
+       public function __construct( Language $language, GenderCache $genderCache,
+               $localInterwikis = array()
+       ) {
                $this->language = $language;
                $this->genderCache = $genderCache;
                $this->localInterwikis = (array)$localInterwikis;
@@ -71,7 +72,8 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         */
        public function getNamespaceName( $namespace, $text ) {
                if ( $this->language->needsGenderDistinction() &&
-                       MWNamespace::hasGenderDistinction( $namespace ) ) {
+                       MWNamespace::hasGenderDistinction( $namespace )
+               ) {
 
                        //NOTE: we are assuming here that the title text is a user name!
                        $gender = $this->genderCache->getGenderOf( $text, __METHOD__ );
@@ -219,7 +221,11 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                # Note: use of the /u option on preg_replace here will cause
                # input with invalid UTF-8 sequences to be nullified out in PHP 5.2.x,
                # conveniently disabling them.
-               $dbkey = preg_replace( '/[ _\xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}]+/u', '_', $dbkey );
+               $dbkey = preg_replace(
+                       '/[ _\xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}]+/u',
+                       '_',
+                       $dbkey
+               );
                $dbkey = trim( $dbkey, '_' );
 
                if ( strpos( $dbkey, UTF8_REPLACEMENT ) !== false ) {
@@ -376,7 +382,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
 
                # Fill fields
                $parts['dbkey'] = $dbkey;
+
                return $parts;
        }
-
 }
index 240a961..a277594 100644 (file)
@@ -31,7 +31,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 interface PageLinkRenderer {
-
        /**
         * Returns the URL for the given page.
         *
@@ -65,5 +64,4 @@ interface PageLinkRenderer {
         * @return string
         */
        public function renderWikitextLink( TitleValue $page, $text = null );
-
 }
index 263f547..ea58b1e 100644 (file)
@@ -31,7 +31,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 interface TitleFormatter {
-
        /**
         * Returns the title formatted for display.
         * Per default, this includes the namespace but not the fragment.
index b3ef479..d548663 100644 (file)
@@ -31,7 +31,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 interface TitleParser {
-
        /**
         * Parses the given text and constructs a TitleValue. Normalization
         * is applied according to the rules appropriate for the form specified by $form.
index d2b4d86..73e1dc2 100644 (file)
@@ -34,7 +34,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 class TitleValue {
-
        /**
         * @var int
         */
@@ -153,7 +152,7 @@ class TitleValue {
        public function __toString() {
                $name = $this->namespace . ':' . $this->dbkey;
 
-               if ( $this->fragment !== '' )  {
+               if ( $this->fragment !== '' ) {
                        $name .= '#' . $this->fragment;
                }
 
index 6400786..eb8e909 100644 (file)
@@ -44,28 +44,94 @@ class FakeConverter {
         * @var Language
         */
        public $mLang;
-       function __construct( $langobj ) { $this->mLang = $langobj; }
-       function autoConvert( $text, $variant = false ) { return $text; }
-       function autoConvertToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
-       function convert( $t ) { return $t; }
-       function convertTo( $text, $variant ) { return $text; }
-       function convertTitle( $t ) { return $t->getPrefixedText(); }
-       function convertNamespace( $ns ) { return $this->mLang->getFormattedNsText( $ns ); }
-       function getVariants() { return array( $this->mLang->getCode() ); }
-       function getVariantFallbacks( $variant ) { return $this->mLang->getCode(); }
-       function getPreferredVariant() { return $this->mLang->getCode(); }
-       function getDefaultVariant() { return $this->mLang->getCode(); }
-       function getURLVariant() { return ''; }
-       function getConvRuleTitle() { return false; }
-       function findVariantLink( &$l, &$n, $ignoreOtherCond = false ) { }
-       function getExtraHashOptions() { return ''; }
-       function getParsedTitle() { return ''; }
-       function markNoConversion( $text, $noParse = false ) { return $text; }
-       function convertCategoryKey( $key ) { return $key; }
+
+       function __construct( $langobj ) {
+               $this->mLang = $langobj;
+       }
+
+       function autoConvert( $text, $variant = false ) {
+               return $text;
+       }
+
+       function autoConvertToAllVariants( $text ) {
+               return array( $this->mLang->getCode() => $text );
+       }
+
+       function convert( $t ) {
+               return $t;
+       }
+
+       function convertTo( $text, $variant ) {
+               return $text;
+       }
+
+       /**
+        * @param Title $t
+        * @return mixed
+        */
+       function convertTitle( $t ) {
+               return $t->getPrefixedText();
+       }
+
+       function convertNamespace( $ns ) {
+               return $this->mLang->getFormattedNsText( $ns );
+       }
+
+       function getVariants() {
+               return array( $this->mLang->getCode() );
+       }
+
+       function getVariantFallbacks( $variant ) {
+               return $this->mLang->getCode();
+       }
+
+       function getPreferredVariant() {
+               return $this->mLang->getCode();
+       }
+
+       function getDefaultVariant() {
+               return $this->mLang->getCode();
+       }
+
+       function getURLVariant() {
+               return '';
+       }
+
+       function getConvRuleTitle() {
+               return false;
+       }
+
+       function findVariantLink( &$l, &$n, $ignoreOtherCond = false ) {
+       }
+
+       function getExtraHashOptions() {
+               return '';
+       }
+
+       function getParsedTitle() {
+               return '';
+       }
+
+       function markNoConversion( $text, $noParse = false ) {
+               return $text;
+       }
+
+       function convertCategoryKey( $key ) {
+               return $key;
+       }
+
        /** @deprecated since 1.22 is no longer used */
-       function armourMath( $text ) { return $text; }
-       function validateVariant( $variant = null ) { return $variant === $this->mLang->getCode() ? $variant : null; }
-       function translate( $text, $variant ) { return $text; }
+       function armourMath( $text ) {
+               return $text;
+       }
+
+       function validateVariant( $variant = null ) {
+               return $variant === $this->mLang->getCode() ? $variant : null;
+       }
+
+       function translate( $text, $variant ) {
+               return $text;
+       }
 }
 
 /**
@@ -73,7 +139,6 @@ class FakeConverter {
  * @ingroup Language
  */
 class Language {
-
        /**
         * @var LanguageConverter
         */
@@ -475,7 +540,8 @@ class Language {
         * Hook which will be called if this is the content language.
         * Descendants can use this to register hook functions or modify globals
         */
-       function initContLang() { }
+       function initContLang() {
+       }
 
        /**
         * Same as getFallbacksFor for current language.
@@ -484,6 +550,7 @@ class Language {
         */
        function getFallbackLanguageCode() {
                wfDeprecated( __METHOD__, '1.19' );
+
                return self::getFallbackFor( $this->mCode );
        }
 
@@ -540,6 +607,7 @@ class Language {
 
                        wfRunHooks( 'LanguageGetNamespaces', array( &$this->namespaceNames ) );
                }
+
                return $this->namespaceNames;
        }
 
@@ -589,6 +657,7 @@ class Language {
         */
        function getNsText( $index ) {
                $ns = $this->getNamespaces();
+
                return isset( $ns[$index] ) ? $ns[$index] : false;
        }
 
@@ -607,6 +676,7 @@ class Language {
         */
        function getFormattedNsText( $index ) {
                $ns = $this->getNsText( $index );
+
                return strtr( $ns, '_', ' ' );
        }
 
@@ -621,7 +691,9 @@ class Language {
        function getGenderNsText( $index, $gender ) {
                global $wgExtraGenderNamespaces;
 
-               $ns = $wgExtraGenderNamespaces + self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
+               $ns = $wgExtraGenderNamespaces +
+                       self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
+
                return isset( $ns[$index][$gender] ) ? $ns[$index][$gender] : $this->getNsText( $index );
        }
 
@@ -680,7 +752,8 @@ class Language {
                        }
 
                        global $wgExtraGenderNamespaces;
-                       $genders = $wgExtraGenderNamespaces + (array)self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
+                       $genders = $wgExtraGenderNamespaces +
+                               (array)self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
                        foreach ( $genders as $index => $forms ) {
                                foreach ( $forms as $alias ) {
                                        $aliases[$alias] = $index;
@@ -700,6 +773,7 @@ class Language {
 
                        $this->namespaceAliases = $aliases + $convertedNames;
                }
+
                return $this->namespaceAliases;
        }
 
@@ -1143,14 +1217,21 @@ class Language {
                        throw new MWException( __METHOD__ . ": The timestamp $ts should be a number" );
                }
 
-               for ( $p = 0; $p < strlen( $format ); $p++ ) {
+               $formatLength = strlen( $format );
+               for ( $p = 0; $p < $formatLength; $p++ ) {
                        $num = false;
                        $code = $format[$p];
-                       if ( $code == 'x' && $p < strlen( $format ) - 1 ) {
+                       if ( $code == 'x' && $p < $formatLength - 1 ) {
                                $code .= $format[++$p];
                        }
 
-                       if ( ( $code === 'xi' || $code == 'xj' || $code == 'xk' || $code == 'xm' || $code == 'xo' || $code == 'xt' ) && $p < strlen( $format ) - 1 ) {
+                       if ( ( $code === 'xi'
+                                       || $code === 'xj'
+                                       || $code === 'xk'
+                                       || $code === 'xm'
+                                       || $code === 'xo'
+                                       || $code === 'xt' )
+                               && $p < $formatLength - 1 ) {
                                $code .= $format[++$p];
                        }
 
@@ -1381,7 +1462,7 @@ class Language {
                                        break;
                                case '\\':
                                        # Backslash escaping
-                                       if ( $p < strlen( $format ) - 1 ) {
+                                       if ( $p < $formatLength - 1 ) {
                                                $s .= $format[++$p];
                                        } else {
                                                $s .= '\\';
@@ -1389,7 +1470,7 @@ class Language {
                                        break;
                                case '"':
                                        # Quoted literal
-                                       if ( $p < strlen( $format ) - 1 ) {
+                                       if ( $p < $formatLength - 1 ) {
                                                $endQuote = strpos( $format, '"', $p + 1 );
                                                if ( $endQuote === false ) {
                                                        # No terminating quote, assume literal "
@@ -1421,6 +1502,7 @@ class Language {
                                }
                        }
                }
+
                return $s;
        }
 
@@ -1523,8 +1605,10 @@ class Language {
                $zl = $zjd -1948440 + 10632;
                $zn = (int)( ( $zl - 1 ) / 10631 );
                $zl = $zl - 10631 * $zn + 354;
-               $zj = ( (int)( ( 10985 - $zl ) / 5316 ) ) * ( (int)( ( 50 * $zl ) / 17719 ) ) + ( (int)( $zl / 5670 ) ) * ( (int)( ( 43 * $zl ) / 15238 ) );
-               $zl = $zl - ( (int)( ( 30 - $zj ) / 15 ) ) * ( (int)( ( 17719 * $zj ) / 50 ) ) - ( (int)( $zj / 16 ) ) * ( (int)( ( 15238 * $zj ) / 43 ) ) + 29;
+               $zj = ( (int)( ( 10985 - $zl ) / 5316 ) ) * ( (int)( ( 50 * $zl ) / 17719 ) ) +
+                       ( (int)( $zl / 5670 ) ) * ( (int)( ( 43 * $zl ) / 15238 ) );
+               $zl = $zl - ( (int)( ( 30 - $zj ) / 15 ) ) * ( (int)( ( 17719 * $zj ) / 50 ) ) -
+                       ( (int)( $zj / 16 ) ) * ( (int)( ( 15238 * $zj ) / 43 ) ) + 29;
                $zm = (int)( ( 24 * $zl ) / 709 );
                $zd = $zl - (int)( ( 709 * $zm ) / 24 );
                $zy = 30 * $zn + $zj - 30;
@@ -1746,7 +1830,10 @@ class Language {
                        # Deduct years from the Gregorian calendar
                        # depending on the nengo periods
                        # Months and days are identical
-                       if ( ( $gy < 1912 ) || ( ( $gy == 1912 ) && ( $gm < 7 ) ) || ( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd < 31 ) ) ) {
+                       if ( ( $gy < 1912 )
+                               || ( ( $gy == 1912 ) && ( $gm < 7 ) )
+                               || ( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd < 31 ) )
+                       ) {
                                # Meiji period
                                $gy_gannen = $gy - 1868 + 1;
                                $gy_offset = $gy_gannen;
@@ -1808,7 +1895,8 @@ class Language {
                        array( '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X' ),
                        array( '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C' ),
                        array( '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M' ),
-                       array( '', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM', 'MMMMMM', 'MMMMMMM', 'MMMMMMMM', 'MMMMMMMMM', 'MMMMMMMMMM' )
+                       array( '', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM', 'MMMMMM', 'MMMMMMM',
+                               'MMMMMMMM', 'MMMMMMMMM', 'MMMMMMMMMM' )
                );
 
                $num = intval( $num );
@@ -2130,7 +2218,16 @@ class Language {
         */
        public function getDurationIntervals( $seconds, array $chosenIntervals = array() ) {
                if ( empty( $chosenIntervals ) ) {
-                       $chosenIntervals = array( 'millennia', 'centuries', 'decades', 'years', 'days', 'hours', 'minutes', 'seconds' );
+                       $chosenIntervals = array(
+                               'millennia',
+                               'centuries',
+                               'decades',
+                               'years',
+                               'days',
+                               'hours',
+                               'minutes',
+                               'seconds'
+                       );
                }
 
                $intervals = array_intersect_key( self::$durationIntervals, array_flip( $chosenIntervals ) );
@@ -2276,9 +2373,12 @@ class Language {
         */
        public function getHumanTimestamp( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
                $diff = $ts->diff( $relativeTo );
-               $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) - (int)$relativeTo->timestamp->format( 'w' ) );
+               $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) -
+                       (int)$relativeTo->timestamp->format( 'w' ) );
                $days = $diff->days ?: (int)$diffDay;
-               if ( $diff->invert || $days > 5 && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' ) ) {
+               if ( $diff->invert || $days > 5
+                       && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' )
+               ) {
                        // Timestamps are in different years: use full timestamp
                        // Also do full timestamp for future dates
                        /**
@@ -2574,7 +2674,8 @@ class Language {
                        $breaks = "[ \-\(\)\}\{\.,\?!]";
 
                        // find first letter after word break
-                       $replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)|$breaks([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
+                       $replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)|" .
+                               "$breaks([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
 
                        if ( function_exists( 'mb_strtoupper' ) ) {
                                return preg_replace_callback(
@@ -2952,7 +3053,8 @@ class Language {
        /**
         * An arrow, depending on the language direction.
         *
-        * @param string $direction The direction of the arrow: forwards (default), backwards, left, right, up, down.
+        * @param string $direction The direction of the arrow: forwards (default),
+        *   backwards, left, right, up, down.
         * @return string
         */
        function getArrow( $direction = 'forwards' ) {
@@ -3574,6 +3676,7 @@ class Language {
                if ( isset( $wgGrammarForms[$this->getCode()][$case][$word] ) ) {
                        return $wgGrammarForms[$this->getCode()][$case][$word];
                }
+
                return $word;
        }
        /**
@@ -3583,9 +3686,12 @@ class Language {
         */
        function getGrammarForms() {
                global $wgGrammarForms;
-               if ( isset( $wgGrammarForms[$this->getCode()] ) && is_array( $wgGrammarForms[$this->getCode()] ) ) {
+               if ( isset( $wgGrammarForms[$this->getCode()] )
+                       && is_array( $wgGrammarForms[$this->getCode()] )
+               ) {
                        return $wgGrammarForms[$this->getCode()];
                }
+
                return array();
        }
        /**
@@ -4102,7 +4208,7 @@ class Language {
                        throw new MWException( "Invalid language code \"$code\"" );
                }
 
-               return "$IP/languages/i18n/$code.json" ;
+               return "$IP/languages/i18n/$code.json";
        }
 
        /**
@@ -4301,10 +4407,12 @@ class Language {
         * @todo Document
         * @param int|float $seconds
         * @param array $format Optional
-        *              If $format['avoid'] == 'avoidseconds' - don't mention seconds if $seconds >= 1 hour
-        *              If $format['avoid'] == 'avoidminutes' - don't mention seconds/minutes if $seconds > 48 hours
-        *              If $format['noabbrevs'] is true - use 'seconds' and friends instead of 'seconds-abbrev' and friends
-        *              For backwards compatibility, $format may also be one of the strings 'avoidseconds' or 'avoidminutes'
+        *   If $format['avoid'] === 'avoidseconds': don't mention seconds if $seconds >= 1 hour.
+        *   If $format['avoid'] === 'avoidminutes': don't mention seconds/minutes if $seconds > 48 hours.
+        *   If $format['noabbrevs'] is true: use 'seconds' and friends instead of 'seconds-abbrev'
+        *     and friends.
+        *   For backwards compatibility, $format may also be one of the strings 'avoidseconds'
+        *     or 'avoidminutes'.
         * @return string
         */
        function formatTimePeriod( $seconds, $format = array() ) {
@@ -4398,10 +4506,11 @@ class Language {
 
        /**
         * Format a bitrate for output, using an appropriate
-        * unit (bps, kbps, Mbps, Gbps, Tbps, Pbps, Ebps, Zbps or Ybps) according to the magnitude in question
+        * unit (bps, kbps, Mbps, Gbps, Tbps, Pbps, Ebps, Zbps or Ybps) according to
+        *   the magnitude in question.
         *
         * This use base 1000. For base 1024 use formatSize(), for another base
-        * see formatComputingNumbers()
+        * see formatComputingNumbers().
         *
         * @param int $bps
         * @return string
@@ -4485,7 +4594,9 @@ class Language {
         * @param bool $atend Optional param for specified if this is the last page
         * @return string
         */
-       public function viewPrevNext( Title $title, $offset, $limit, array $query = array(), $atend = false ) {
+       public function viewPrevNext( Title $title, $offset, $limit,
+               array $query = array(), $atend = false
+       ) {
                // @todo FIXME: Why on earth this needs one message for the text and another one for tooltip?
 
                # Make 'previous' link
@@ -4529,9 +4640,13 @@ class Language {
         * @param string $class Value of the "class" attribute of the link
         * @return string HTML fragment
         */
-       private function numLink( Title $title, $offset, $limit, array $query, $link, $tooltipMsg, $class ) {
+       private function numLink( Title $title, $offset, $limit, array $query, $link,
+               $tooltipMsg, $class
+       ) {
                $query = array( 'limit' => $limit, 'offset' => $offset ) + $query;
-               $tooltip = wfMessage( $tooltipMsg )->inLanguage( $this )->title( $title )->numParams( $limit )->text();
+               $tooltip = wfMessage( $tooltipMsg )->inLanguage( $this )->title( $title )
+                       ->numParams( $limit )->text();
+
                return Html::element( 'a', array( 'href' => $title->getLocalURL( $query ),
                        'title' => $tooltip, 'class' => $class ), $link );
        }
index 92cf68c..98938b2 100644 (file)
  * @ingroup Language
  *
  * @author Zhengzhu Feng <zhengzhu@gmail.com>
- * @maintainers fdcn <fdcn64@gmail.com>, shinjiman <shinjiman@gmail.com>, PhiLiP <philip.npc@gmail.com>
+ * @author fdcn <fdcn64@gmail.com>
+ * @author shinjiman <shinjiman@gmail.com>
+ * @author PhiLiP <philip.npc@gmail.com>
  */
 class LanguageConverter {
-
        /**
         * languages supporting variants
         * @since 1.20
@@ -809,6 +810,7 @@ class LanguageConverter {
         */
        public function getExtraHashOptions() {
                $variant = $this->getPreferredVariant();
+
                return '!' . $variant;
        }
 
@@ -835,6 +837,7 @@ class LanguageConverter {
         */
        function loadDefaultTables() {
                $name = get_class( $this );
+
                throw new MWException( "Must implement loadDefaultTables() method in class $name" );
        }
 
@@ -881,7 +884,8 @@ class LanguageConverter {
        /**
         * Hook for post processing after conversion tables are loaded.
         */
-       function postLoadTables() { }
+       function postLoadTables() {
+       }
 
        /**
         * Reload the conversion tables.
@@ -892,6 +896,7 @@ class LanguageConverter {
                if ( $this->mTables ) {
                        unset( $this->mTables );
                }
+
                $this->mTablesLoaded = false;
                $this->loadTables( false );
        }
index 47bcd86..2431984 100644 (file)
@@ -20,7 +20,6 @@
        "tog-showtoolbar": "«አርም» ትዕዛዝ-መስጫ ይታይ (JavaScript)",
        "tog-editondblclick": "ሁለቴ መጫን ገጹን ማረም ያስችል (JavaScript ያስፈልጋል)",
        "tog-editsectiononrightclick": "የክፍል አርዕስት ላይ በቀኝ በመጫን ክፍል ማረምን አስችል (JavaScript)",
-       "tog-rememberpassword": "ለሚቀጥለው ጊዜ በዚህ ኮምፒውተር ላይ በአባልነት ስሜ መግባቴን (ቢበዛ ለ$1 {{PLURAL:$1|ቀን|ቀናት}}) አስታውስ።",
        "tog-watchcreations": "እኔ የምፈጥራቸውን ገጾችና የምልካቸውን ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር",
        "tog-watchdefault": "ያረምኳቸውን ገጾች እና ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር",
        "tog-watchmoves": "ያዛወርኳቸውን ገጾችና ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር",
        "login-throttled": "በዚሁ አባል ስም በጥቂት ግዜ ውስጥ ከመጠን በላይ ሙከራዎች አድርገዋል።\nእባክዎ እንደገና ሳይሞክሩ ለጥቂት ደቂቃ ይቆዩ።",
        "login-abort-generic": "መግባትዎ አልተከናወነም፤ ተሠርዟል።",
        "loginlanguagelabel": "ቋምቋ፦ $1",
+       "pt-login": "ለመግባት",
+       "pt-login-button": "ለመግባት",
        "user-mail-no-addy": "እሚደርስበት ኢ-ሜል አድራሻ ሳይታወቅ መላክ አይቻልም።",
        "changepassword": "መግቢያ ቃልዎን ለመቀየር",
        "resetpass_announce": "በኢ-ሜል በተላከ ጊዜያዊ ኮድ ገብተዋል። መግባትዎን ለመጨርስ፣ አዲስ መግቢያ ቃል እዚህ መምረጥ አለብዎ።",
index 3477d65..f05dce2 100644 (file)
        "pageswithprop-prophidden-binary": "двайковае значэньне ўласьцівасьці схавана ($1)",
        "doubleredirects": "Двайныя перанакіраваньні",
        "doubleredirectstext": "На гэтай старонцы пададзены сьпіс перанакіраваньняў на іншыя перанакіраваньні. Кожны радок утрымлівае спасылкі на першае і другое перанакіраваньне, а таксама мэтавую старонку другога перанакіраваньня, якая звычайна зьяўляецца «сапраўднай» мэтавай старонкай, куды павіннае спасылацца першае перанакіраваньне.\n<del>Закрэсьленыя</del> элемэнты былі выпраўленыя.",
-       "double-redirect-fixed-move": "[[$1]] была перанесеная, яна цяпер перанакіроўвае на [[$2]]",
-       "double-redirect-fixed-maintenance": "Ð\92Ñ\8bпÑ\80аÑ\9eленÑ\8cне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð³Ð° Ð¿ÐµÑ\80анакÑ\96Ñ\80аванÑ\8cнÑ\8f Ð· [[$1]] Ð½Ð° [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] была перанесеная.\nСтаронка аўтаматычна абноўленая і цяпер перанакіроўвае на [[$2]].",
+       "double-redirect-fixed-maintenance": "Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87нае Ð²Ñ\8bпÑ\80аÑ\9eленÑ\8cне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð³Ð° Ð¿ÐµÑ\80анакÑ\96Ñ\80аванÑ\8cнÑ\8f Ð· [[$1]] Ð½Ð° [[$2]] Ð¿Ð°Ð´Ñ\87аÑ\81 Ñ\82Ñ\8dÑ\85нÑ\96Ñ\87нага Ð°Ð±Ñ\81лÑ\83гоÑ\9eванÑ\8cнÑ\8f.",
        "double-redirect-fixer": "Выпраўленьне перанакіраваньняў",
        "brokenredirects": "Некарэктныя перанакіраваньні",
        "brokenredirectstext": "Наступныя перанакіраваньні спасылаюцца на неіснуючыя старонкі:",
index 85019ec..b916f21 100644 (file)
@@ -32,7 +32,6 @@
        "tog-showtoolbar": "Показване на инструментите за редактиране",
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "tog-editsectiononrightclick": "Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му",
-       "tog-rememberpassword": "Запомяне на паролата ми в този браузър (за не повече от $1 {{PLURAL:$1|ден|дни}})",
        "tog-watchcreations": "Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение",
        "tog-watchdefault": "Добавяне на страниците, които редактирам, в списъка ми за наблюдение",
        "tog-watchmoves": "Добавяне на преместените от мен страници и файлове към списъка ми за наблюдение",
        "print": "Печат",
        "view": "Преглед",
        "edit": "Редактиране",
+       "edit-local": "Редактиране на локалното описание",
        "create": "Създаване",
+       "create-local": "Добавяне на локално описание",
        "editthispage": "Редактиране",
        "create-this-page": "Създаване на страницата",
        "delete": "Изтриване",
        "createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
        "createacct-benefit-body1": "{{PLURAL:$1|редакция|редакции}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|скорошен сътрудник|скорошни сътрудници}}",
        "badretype": "Въведените пароли не съвпадат.",
        "userexists": "Въведеното потребителско име вече се използва.\nИзберете друго име.",
        "loginerror": "Грешка при влизане",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.",
        "resetpass-temp-password": "Временна парола:",
        "resetpass-abort-generic": "Промяната на паролата беше прекъсната от използвано разширение.",
+       "resetpass-expired": "Срокът на валидност на паролата е изтекъл. Изберете нова парола за влизане.",
        "passwordreset": "Възстановяване на парола",
        "passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
        "passwordreset-text-many": "{{PLURAL:$1|За възстановяване на паролата е необходимо да се попълни едно от полетата.}}",
index 0c9ef0b..ecf234d 100644 (file)
        "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|ইমেইলের মাধ্যমে একটি অস্থায়ী শব্দচাবি পেতে ঘরগুলির একটি পূরণ করুন।}}",
        "undo-summary-username-hidden": "একজন লুকানো ব্যবহারকারী $1 রিভিশন পুনরায় ফিরিয়ে এনেছেন",
        "cantcreateaccounttitle": "অ্যাকাউন্ট তৈরি করা যাবে না",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
+       "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানা '''$1''' ব্যাপ্তির মধ্য থেকে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানা ('''$4''') রয়েছে। \n\n$3 কর্তৃক ''$2'' কারণ দেখানো হয়েছে।",
        "viewpagelogs": "এই পাতার জন্য লগগুলো দেখুন",
        "nohistory": "এই পাতার কোন সম্পাদনার ইতিহাস নেই।",
        "currentrev": "সর্বশেষ সংস্করণ",
        "protectedpages-noredirect": "পুনর্নির্দেশনাগুলো লুকাও",
        "protectedpagesempty": "কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
        "protectedpages-page": "পাতা",
+       "protectedpages-performer": "ব্যবহারকারীকে সুরক্ষিত করা হচ্ছে",
        "protectedpages-params": "সুরক্ষা প্যারামিটার",
        "protectedpages-reason": "কারণ",
        "protectedpages-unknown-timestamp": "অজানা",
        "listgrouprights-removegroup-self": "নিজের অ্যাকাউন্ট থেকে {{PLURAL:$2|দল|দলসমূহ}} অপসারণ: $1",
        "listgrouprights-addgroup-self-all": "নিজের অ্যাকাউন্টে সকল দল সংযোজন",
        "listgrouprights-removegroup-self-all": "নিজের অ্যাকাউন্ট থেকে সকল দল অপসারণ",
+       "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
        "listgrouprights-namespaceprotection-namespace": "নামস্থান",
        "trackingcategories-name": "বার্তা নাম",
+       "trackingcategories-nodesc": "কোন বর্ণনা নেই।",
        "mailnologin": "প্রাপকের ঠিকানা নেই",
        "mailnologintext": "অন্য ব্যবহারকারীদেরকে ই-মেইল পাঠাতে হলে আপনাকে অবশ্যই আগে [[Special:UserLogin|লগ-ইন]] করতে হবে এবং ''[[Special:Preferences|আপনার পছন্দ তালিকায়]] আপনার ই-মেইল ঠিকানাটি ঠিকমত দিতে হবে।",
        "emailuser": "ইমেইল করো",
        "contributions-title": "$1 ব্যবহারকারীর অবদানসমূহ",
        "mycontris": "অবদান",
        "contribsub2": "{{GENDER:$3|$1}} ($2)-এর জন্য",
+       "contributions-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
        "nocontribs": "এই শর্তগুলির সাথে মিলে যায়, এমন কোন পরিবর্তন খুঁজে পাওয়া যায়নি।",
        "uctop": "(বর্তমান)",
        "month": "এই মাস (বা তার আগে) থেকে:",
        "importuploaderrortemp": "আমদানি ফাইলের আপলোড ব্যর্থ। একটি সাময়িক ফোল্ডার হারানো গেছে।",
        "import-parse-failure": "XML পার্স করা যায়নি",
        "import-noarticle": "ইম্পোর্ট করার মত কোন পাতা নেই!",
-       "import-nonewrevisions": "পà§\82রà§\8dবà§\87র à¦¸à¦\95ল à¦¸à¦\82সà§\8dà¦\95রণ à¦\87মà§\8dপà§\8bরà§\8dà¦\9f à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।",
+       "import-nonewrevisions": "à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦\86মদানà§\80 à¦\95রা à¦¹à¦¯à¦¼à¦¨à¦¿।",
        "xml-error-string": "$1 যে লাইনে $2, কলামে $3 (বাইট $4): $5",
        "import-upload": "XML ডাটা আপলোড",
        "import-token-mismatch": "সেশন ডাটা হারিয়ে গিয়েছে।\nঅনুগ্রহ করে পুনরায় চেষ্টা করুন।",
index eb7f720..8e8173a 100644 (file)
        "brokenredirects-edit": "нисъе",
        "brokenredirects-delete": "дӀаяккха",
        "withoutinterwiki": "Юкъарвики-хьажорагаш йоцу агӀонаш",
-       "withoutinterwiki-summary": "Ð\9bаÑ\85аÑ\80а Ð°Ð³Ó\80онийн Ñ\8eкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ñ\8fÑ\86:",
+       "withoutinterwiki-summary": "Лахара агӀонийн юкъарвики-хьажоргаш яц:",
        "withoutinterwiki-submit": "Гайта",
        "fewestrevisions": "ЧIогIа кIезиг башхонаш йолу агIонаш",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "whatlinkshere-title": "ХӀокхунца «$1» йолу агӀонаш",
        "whatlinkshere-page": "Агlо:",
        "linkshere": "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажорагца ю",
-       "nolinkshere": "Ð¥Ó\80окÑ\85Ñ\83 '''[[:$1]]''' Ð°Ð³Ó\80она Ñ\82Ó\80е ÐºÑ\85еÑ\87Ñ\83 Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ñ\8fÑ\86.",
+       "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
        "nolinkshere-ns": "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш",
        "isredirect": "агӀо-дӀасахьажайар",
        "istemplate": "юкъаялийнарш",
index 3e925b0..d0f0381 100644 (file)
        "unexpected": "Unerwarteter Wert: „$1“ = „$2“",
        "formerror": "Fehler: Die Eingaben konnten nicht verarbeitet werden.",
        "badarticleerror": "Diese Aktion kann auf diese Seite nicht angewendet werden.",
-       "cannotdelete": "Die Seite oder Datei „$1“ kann nicht gelöscht werden.\nMöglicherweise wurde sie bereits von jemand anderem gelöscht.",
+       "cannotdelete": "Die Seite oder Datei „$1“ konnte nicht gelöscht werden.\nMöglicherweise wurde sie bereits von jemand anderem gelöscht.",
        "cannotdelete-title": "Seite „$1“ kann nicht gelöscht werden",
        "delete-hook-aborted": "Die Löschung wurde von einer Programmerweiterung zu MediaWiki verhindert.\nEs ist hierzu keine Erklärung verfügbar.",
        "no-null-revision": "Die neue Nullversion für die Seite „$1“ konnte nicht erstellt werden",
        "userlogin-signwithsecure": "Sichere Verbindung verwenden",
        "yourdomainname": "Deine Domain:",
        "password-change-forbidden": "Du kannst auf diesem Wiki keine Passwörter ändern.",
-       "externaldberror": "Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.",
+       "externaldberror": "Entweder liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.",
        "login": "Anmelden",
        "nav-login-createaccount": "Anmelden / Benutzerkonto erstellen",
        "loginprompt": "Zur Anmeldung müssen Cookies aktiviert sein.",
        "changeemail-cancel": "Abbrechen",
        "changeemail-throttled": "Du hast zu viele Anmeldeversuche unternommen.\nBitte warte $1, bevor du es erneut versuchst.",
        "resettokens": "Tokens zurücksetzen",
-       "resettokens-text": "Du kannst Tokens zurücksetzen, die dir den Zugriff auf bestimmte private Daten ermöglichen, die mit deinem Benutzerkonto hier verknüpft sind.\n\nDu solltest dies nur machen, wenn du die Tokens versehentlich mit jemandem geteilt hast oder dein Konto gefährdet ist.",
+       "resettokens-text": "Du kannst Tokens zurücksetzen, welche dir den Zugriff auf bestimmte private Daten ermöglichen, die mit deinem Benutzerkonto hier verknüpft sind.\n\nDu solltest dies nur machen, wenn du die Tokens versehentlich mit jemandem geteilt hast oder dein Konto gefährdet ist.",
        "resettokens-no-tokens": "Es gibt keine Tokens zum Zurücksetzen.",
        "resettokens-legend": "Tokens zurücksetzen",
        "resettokens-tokens": "Tokens:",
        "pageswithprop-prophidden-binary": "Binäreigenschaftswert versteckt ($1)",
        "doubleredirects": "Doppelte Weiterleitungen",
        "doubleredirectstext": "Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.\nJede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.\n<del>Durchgestrichene</del> Einträge wurden bereits erfolgreich bearbeitet.",
-       "double-redirect-fixed-move": "[[$1]] wurde verschoben und leitet nun nach [[$2]] weiter.",
-       "double-redirect-fixed-maintenance": "Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] wurde verschoben.\nDie Seite wurde automatisch aktualisiert und leitet nun nach [[$2]] weiter.",
+       "double-redirect-fixed-maintenance": "Automatische Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]] in einem Wartungsauftrag.",
        "double-redirect-fixer": "RedirectBot",
        "brokenredirects": "Defekte Weiterleitungen",
        "brokenredirectstext": "Diese Spezialseite listet Weiterleitungen auf nicht existierende Seiten auf.",
index 5f8c96b..99a6fbb 100644 (file)
        "emailsend": "Bırışe",
        "emailccme": "kopyayekê mesaji mı re bıerşaw",
        "emailccsubject": "$2 kopyaya mesaj a ke şıma erşawıto/a $1:",
-       "emailsent": "E-posta bırşê",
+       "emailsent": "E-poste rışna",
        "emailsenttext": "e-mailê şıma erşawiya/ruşiya",
        "emailuserfooter": "na e-posta hetê ıney ra $1 erşawiya $2 no/na karberi/e re. pê fonksiyonê \"Karberi/e re e-posta bıerşaw\" no {{SITENAME}} keyepeli erşawiya.",
        "usermessage-summary": "Mesacê sistemi caverde.",
        "imgmultigoto": "Şo pela da $1",
        "img-lang-default": "(zıwano hesabiyaye)",
        "img-lang-info": "Resimé $1, $2 ya teké pé ke.",
-       "img-lang-go": "Bırş",
+       "img-lang-go": "Şo",
        "ascending_abbrev": "berz",
        "descending_abbrev": "nızm",
        "table_pager_next": "Pela peyêne",
index a5e45b8..4d2ab48 100644 (file)
        "rev-suppressed-text-view": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. J aministradōr a pōlen incòra guardêrla; \nconsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.",
        "rev-deleted-no-diff": "An n'é mìa pusébil guardêr cól cunfrûnt ché tra 'l versiòun perchè óna dal revisiòun l'é stêda <strong> scanşlêda </strong>. Consûlta al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log dal scanşladûri] per i particulêr.",
        "rev-suppressed-no-diff": "An n'é mìa pusébil guardêr cól cunfrûnt ché tra 'l versiòun perchè óna dal revisiòun l'é stêda <strong> scanşlêda </strong>.",
-       "rev-deleted-unhide-diff": "Ó dal revisiòun de sté cunfrûnt l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri] per i particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].",
+       "rev-deleted-unhide-diff": "Óna dal revisiòun de sté cunfrûnt l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri] per i particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].",
+       "rev-suppressed-unhide-diff": "Óna dal revisiòun de sté cunfrûnt ed versiòun l'é stêda <strong> scanşlêda </strong>. \nA pré èsregh di particulêr int al {{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri]. \nSét vō cme aministradōr ét pō incòra [$1 guardêr sté cunfrûnt ed versiòun].",
+       "rev-deleted-diff-view": "Óna dal revisiòun de sté cunfrûnt ed versiòun l'é stêda <strong> scanşlêda </strong>. \nCme aministradōr ét pō guardêr sté cunfrûnt ed versiòun; a prén èsregh di particulêr int al {{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri].",
+       "rev-suppressed-diff-view": "Óna dal revisiòun de sté cunfrûnt ed versiòun l'é stêda <strong> spustêda </strong>. \nCme aministradōr ét pō guardêr sté cunfrûnt ed versiòun; a prén èsregh di particulêr int al {{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri].",
        "rev-delundel": "Guêrda/nascònd",
+       "rev-showdeleted": "fà vèder",
+       "revisiondelete": "Scanşèla o tōrna a mèter versiòun",
+       "revdelete-nooldid-title": "Versiòun mìa precişêda",
+       "revdelete-nooldid-text": "An n'é mìa stê precişê nisóna versiòun 'd la pàgina in dó fêr cla funsiòun ché, la versiòun precişêda l' an gh'é mìa opór a s' é drē pruvêr ed lughêr la vèrsiòun 'd adèsa.",
+       "revdelete-no-file": "Al file precişê an gh'é mìa.",
+       "revdelete-show-file-confirm": "A 's vōl vèder la versiòun scanşlêda dal file \"<nowiki>$1</nowiki>\" dal $2 al $3?",
+       "revdelete-show-file-submit": "Sé",
+       "revdelete-selected-text": "{{PLURAL:$1|Versiòun sernîda| Versiòun sernîdi}} ed [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versiòun sernîda| Versiòun sernîdi}} dal file ed [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Fât dal regéster sernî}}:",
+       "revdelete-text-text": "Al versiòun scanşlêdi as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
+       "revdelete-text-file": " Al versiòun di file scanşlê as vèden incòra int la stòria dal file, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
+       "logdelete-text": "I fât scanşlê as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
        "revdelete-radio-set": "Nascònd",
        "revdelete-radio-unset": "Fà vèder",
        "revdel-restore": "Câmbia la vidûda.",
index 5453c5f..dade4ec 100644 (file)
     "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
     "internalerror": "Internal error",
     "internalerror_info": "Internal error: $1",
-    "fileappenderrorread": "Could not read \"$1\" during append.",
-    "fileappenderror": "Could not append \"$1\" to \"$2\".",
     "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
     "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
     "filedeleteerror": "Could not delete file \"$1\".",
     "directorycreateerror": "Could not create directory \"$1\".",
     "filenotfound": "Could not find file \"$1\".",
-    "fileexistserror": "Unable to write to file \"$1\": File exists.",
     "unexpected": "Unexpected value: \"$1\"=\"$2\".",
     "formerror": "Error: Could not submit form.",
     "badarticleerror": "This action cannot be performed on this page.",
     "userlogin-helplink2": "Help with logging in",
     "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
     "userlogin-createanother": "Create another account",
-    "createacct-join": "Enter your information below.",
-    "createacct-another-join": "Enter the new account's information below.",
     "createacct-emailrequired": "Email address",
     "createacct-emailoptional": "Email address (optional)",
     "createacct-email-ph": "Enter your email address",
     "savearticle": "Save page",
     "preview": "Preview",
     "showpreview": "Show preview",
-    "showlivepreview": "Live preview",
     "showdiff": "Show changes",
     "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
     "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
     "search-nonefound": "There were no results matching the query.",
     "powersearch-legend": "Advanced search",
     "powersearch-ns": "Search in namespaces:",
-    "powersearch-redir": "List redirects",
     "powersearch-togglelabel": "Check:",
     "powersearch-toggleall": "All",
     "powersearch-togglenone": "None",
     "prefs-advancedsearchoptions": "Advanced options",
     "prefs-advancedwatchlist": "Advanced options",
     "prefs-displayrc": "Display options",
-    "prefs-displaysearchoptions": "Display options",
     "prefs-displaywatchlist": "Display options",
     "prefs-tokenwatchlist": "Token",
     "prefs-diffs": "Diffs",
     "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
     "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
     "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
-    "notacceptable": "The wiki server cannot provide data in a format your client can read.",
     "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
     "siteuser": "{{SITENAME}} user $1",
     "anonuser": "{{SITENAME}} anonymous user $1",
     "bitrate-zetabits": "$1 Zbps",
     "bitrate-yottabits": "$1 Ybps",
     "livepreview-loading": "Loading...",
-    "livepreview-ready": "Loading... Ready!",
-    "livepreview-failed": "Live preview failed!\nTry normal preview.",
-    "livepreview-error": "Failed to connect: $1 \"$2\".\nTry normal preview.",
     "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
     "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
     "editwatchlist-summary": "",
     "compare-invalid-title": "The title you specified is invalid.",
     "compare-title-not-exists": "The title you specified does not exist.",
     "compare-revision-not-exists": "The revision you specified does not exist.",
-    "dberr-header": "This wiki has a problem",
     "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
     "dberr-again": "Try waiting a few minutes and reloading.",
     "dberr-info": "(Cannot contact the database server: $1)",
index b443422..7283ea0 100644 (file)
        "pool-timeout": "Tiempo limite agotado para el bloqueo",
        "pool-queuefull": "La cola de trabajo está llena",
        "pool-errorunknown": "Error desconocido",
+       "pool-servererror": "El servicio de contador de la piscina no está disponible ($1).",
        "aboutsite": "Acerca de {{SITENAME}}",
        "aboutpage": "Project:Acerca de",
        "copyright": "El contenido está disponible bajo  $1  a menos que se indique lo contrario.",
        "databaseerror-error": "Error: $1",
        "laggedslavemode": "'''Aviso:''' puede que falten las actualizaciones más recientes en esta página.",
        "readonly": "Base de datos bloqueada",
-       "enterlockreason": "Explique el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
+       "enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
        "readonlytext": "La base de datos no permite nuevas entradas u otras modificaciones de forma temporal, probablemente por mantenimiento rutinario, tras lo cual volverá a la normalidad.\n\nLa explicación dada por el administrador que la bloqueó fue: $1",
        "missing-article": "La base de datos no encuentra el texto de una página que debería hallarse, llamada «$1» $2.\n\nLa causa de esto suele deberse a un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, puedes haber encontrado un fallo en el software.\n\nPor favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de la URL.",
        "missingarticle-rev": "(n.º de revisión: $1)",
        "pageswithprop-prophidden-binary": "valor de la propiedad binaria oculta ($1)",
        "doubleredirects": "Redirecciones dobles",
        "doubleredirectstext": "Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.\nCada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo «real» al que la primera redirección debería apuntar.\nLas entradas <del>tachadas</del> han sido resueltas.",
-       "double-redirect-fixed-move": "[[$1]] ha sido trasladado, ahora es una redirección a [[$2]]",
-       "double-redirect-fixed-maintenance": "Corrigiendo la doble redirección desde [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] ha sido movido.\nEste fue automáticamente actualizado y ahora es una redirección a [[$2]].",
+       "double-redirect-fixed-maintenance": "Corrigiendo automáticamente la doble redirección desde [[$1]] a [[$2]] en un trabajo de mantenimiento.",
        "double-redirect-fixer": "Corrector de redirecciones",
        "brokenredirects": "Redirecciones incorrectas",
        "brokenredirectstext": "Las siguientes redirecciones enlazan a páginas que no existen:",
index 6af07b3..c32da25 100644 (file)
        "uploadnewversion-linktext": "Tallenna uusi versio tästä tiedostosta",
        "shared-repo-from": "kohteesta $1",
        "shared-repo": "jaettu mediavarasto",
-       "upload-disallowed-here": "Et voi korvata tätä tiedostoa uudella tiedostolla.",
+       "upload-disallowed-here": "Et voi tallentaa uutta tiedostoa tämän tilalle.",
        "filerevert": "Tiedoston $1 palautus",
        "filerevert-legend": "Tiedoston palautus",
        "filerevert-intro": "Olet palauttamassa takaisin tiedostoa '''[[Media:$1|$1]]''' [$4 versioon, joka luotiin $2 kello $3].",
        "pageswithprop-prophidden-binary": "ominaisuuden binääriarvo on piilotettu ($1)",
        "doubleredirects": "Kaksinkertaiset ohjaukset",
        "doubleredirectstext": "Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.\nJokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteen ensimmäiseen riviin, eli yleensä ”oikeaan” kohteeseen, johon ensimmäisen ohjauksen pitäisi osoittaa.\n<del>Yliviivatut</del> kohteet on korjattu.",
-       "double-redirect-fixed-move": "[[$1]] on siirretty, ja se ohjaa nyt sivulle [[$2]]",
-       "double-redirect-fixed-maintenance": "Korjataan kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] on siirretty.\nSe on automaattisesti päivitetty ja se ohjaa nyt sivulle [[$2]].",
+       "double-redirect-fixed-maintenance": "Korjataan automaattisesti kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]].",
        "double-redirect-fixer": "Ohjausten korjaaja",
        "brokenredirects": "Virheelliset ohjaukset",
        "brokenredirectstext": "Seuraavat ohjaukset osoittavat sivuihin, joita ei ole olemassa.",
index 42a0eee..4211604 100644 (file)
        "subject-preview": "વિષય/શીર્ષક પૂર્વાવલોકન:",
        "blockedtitle": "સભ્ય પ્રતિબંધિત છે",
        "blockedtext": "'''આપનાં સભ્ય નામ અથવા આઇ.પી. એડ્રેસ પર પ્રતિબંધ મુકવામાં આવ્યો છે.'''\n\nઆ પ્રતિબંધ  $1એ મુક્યો છે.\nજેને માટે કારણ આપવામાં આવ્યું છે કે, ''$2''.\n\n* પ્રતિબંધ મુક્યા તારીખ: $8\n* પ્રતિબંધ ઉઠાવવાની તારીખ: $6\n* જેના ઉપર પ્રતિબંધ મુક્યો છે તે: $7\n\nઆપનાં પર મુકવામાં આવેલાં પ્રતિબંધ વિષે ચર્ચા કરવા માટે આપ $1નો કે અન્ય [[{{MediaWiki:Grouppage-sysop}}|પ્રબંધક]]નો સંપર્ક કરી શકો છો.\nઆપ 'સભ્યને ઇ-મેલ કરો' ની કડી વાપરી નહી શકો, પરંતુ જો આપનાં [[Special:Preferences|મારી પસંદ]]માં યોગ્ય ઇ-મેલ સરનામું વાપર્યું હશે અને તમારા તે ખાતું વાપરવા ઉપર પ્રતિબંધ નહી મુક્યો હોય તો તમે તે કડીનો ઉપયોગ કરી શકશો.\nતમારૂં હાલનું આઇ.પી સરનામું છે $3, અને જેના પર પ્રતિબંધ મુકવામાં આવ્યો છે તે છે  #$5.\nમહેરબાની કરીને કોઇ પણ પત્ર વ્યવહારમાં ઉપરની બધીજ માહિતીનો ઉલ્લેખ કરશો.",
-       "autoblockedtext": "તમારà«\81àª\82  IP àª¸àª°àª¨àª¾àª®àª¾ àªªàª° àª¸à«\8dવયàª\82 àª\9aાલિત àª°à«\80તà«\87 àª°à«\8bàª\95 àª²àª\97ાવà«\80 àª¦à«\87વાàª\88 àª\9bà«\87 àª\95à«\87મàª\95à«\87 àª¤à«\87નà«\87 àª\85નà«\8dય àª¸àª­à«\8dય àª¦à«\8dવારા àªµàª¾àªªàª°àªµàª¾àª®àª¾àª\82 àª\86વà«\8dયà«\81àª\82 àª¹àª¤à«\81àª\82 àª\9cà«\87ના àªªàª°  $1 àª¦à«\8dવારા \n àªªàª¹à«\87લà«\87થà«\80 àª°à«\8bàª\95 àª²àª\97ાવાàª\87 àª\9bà«\87.\n:''$2''\n\n* àª°à«\8bàª\95નà«\80 àª¶àª°à«\81àª\86ત : $8\n* àª°à«\8bàª\95નà«\80 àª¸àª®àª¾àªªà«\8dતિ àª¤àª¿àª¥à«\80 : $6\n* àªªà«\8dરસà«\8dતાવિત àª°à«\8bàª\95 àª¸àª¹àª¨ àª\95રનાર : $7\n\nતમà«\87 $1 àª\85થવા  àª\95à«\8bàª\87 àª\85નà«\8dય  [[{{MediaWiki:Grouppage-sysop}}|પà«\8dરબàª\82ધàª\95 ]] àª¨à«\8b àª¸àª\82પરà«\8dàª\95 àª\95રà«\80 àª°à«\8bàª\95નà«\80 àª\9aરà«\8dàª\9aા àª\95રà«\80 àª¶àª\95à«\8b.\n\nનà«\8bàª\82ધà«\8b àª\95à«\87 àª¤à«\87મà«\87 \"àª\86 àª¸àª­à«\8dયનà«\87 àª\88-મà«\87લ àª\95રà«\8b\" àªµàª¿àª\95લà«\8dપના àªµàª¾àªªàª°à«\80 àª¶àª\95à«\8b àª¸àª¿àªµàª¾àª¯àª\95à«\87 àª¤àª®àª°à«\80 àªªàª¾àª¸à«\87 àª¤àª®àª¾àª°àª¾ [[Special:Preferences|user preferences]] àª®àª¾àª\82 àªµà«\88ધ àª\88-મà«\87લ àª¸àª°àª¨àª¾àª®à«\81àª\82 àª¹à«\8bય àª\85નà«\87તà«\87વાપરà«\80 àª¤àª®àª°àª¾ àªªàª° àª°à«\8bàª\95 àª²àª\97ાડવામાàª\82 àª\86વà«\80 àª¨ àª¹à«\8bય.\n\nતમારà«\81àª\82 àª¹àª¾àª²àª¨à«\81àª\82   IP àª¸àª°àª¨àª¾àª®à«\81àª\82  $3 àª\9bà«\87, àª\85નà«\87 àª°à«\8bàª\95નà«\80  ID àª\9bà«\87  #$5.\nàª\86 àª®àª¾àª¹àª¿àª¤à«\80 àª¤àª®àª¾àª°à«\80 àªªà«\82àª\9bપરàª\9bમાàª\82 àª\9cરà«\82ર àª\89મà«\87રશà«\8b",
+       "autoblockedtext": "તમારાàª\82 IP àª¸àª°àª¨àª¾àª®àª¾ àªªàª° àª¸à«\8dવયàª\82àª\9aાલિત àª°à«\80તà«\87 àª°à«\8bàª\95 àª²àª\97ાવà«\80 àª¦à«\87વાàª\88 àª\9bà«\87 àª\95à«\87મàª\95à«\87 àª¤à«\87 àª\85નà«\8dય àª¸àª­à«\8dય àª¦à«\8dવારા àªµàª¾àªªàª°àªµàª¾àª®àª¾àª\82 àª\86વà«\8dયà«\81àª\82 àª¹àª¤à«\81àª\82 àª\9cà«\87ના àªªàª° $1 àª¦à«\8dવારા àªªàª¹à«\87લà«\87થà«\80 àªªà«\8dરતિબàª\82ધ àª®à«\82àª\95વામાàª\82 àª\86વà«\8dયà«\8b àª\9bà«\87.\n:''$2''\n\n* àª°à«\8bàª\95નà«\80 àª¶àª°à«\81àª\86ત : $8\n* àª°à«\8bàª\95નà«\80 àª¸àª®àª¾àªªà«\8dતિ : $6\n* àªªà«\8dરસà«\8dતાવિત àª°à«\8bàª\95 àª¸àª¹àª¨ àª\95રનાર : $7\n\nતમà«\87 $1 àª\85થવા àª\95à«\8bàª\87 àª\85નà«\8dય [[{{MediaWiki:Grouppage-sysop}}|પà«\8dરબàª\82ધàª\95]]નà«\8b àª¸àª\82પરà«\8dàª\95 àª\95રà«\80 àª°à«\8bàª\95નà«\80 àª\9aરà«\8dàª\9aા àª\95રà«\80 àª¶àª\95à«\8b.\n\nનà«\8bàª\82ધà«\8b àª\95à«\87 àª¤à«\87મà«\87 \"àª\86 àª¸àª­à«\8dયનà«\87 àª\88-મà«\87લ àª\95રà«\8b\" àªµàª¿àª\95લà«\8dપ àª¨àª¹àª¿ àªµàª¾àªªàª°à«\80 àª¶àª\95à«\8b, àª¸àª¿àªµàª¾àª¯àª\95à«\87 àª¤àª®àª°à«\80 àªªàª¾àª¸à«\87 àª¤àª®àª¾àª°àª¾ [[Special:Preferences|user preferences]]માàª\82 àªµà«\88ધ àª\88-મà«\87લ àª¸àª°àª¨àª¾àª®à«\81àª\82 àª¹à«\8bય àª\85નà«\87 àª¤à«\87 àªµàª¾àªªàª°àªµàª¾ àªªàª° àªªà«\8dરતિબàª\82ધ àª¨ àª®à«\82àª\95વામાàª\82 àª\86વà«\8dયà«\8b àª¹à«\8bય.\n\nતમારà«\81àª\82 àª¹àª¾àª²àª¨à«\81àª\82 IP àª¸àª°àª¨àª¾àª®à«\81àª\82 $3 àª\9bà«\87, àª\85નà«\87 àª°à«\8bàª\95નà«\80 ID àª\9bà«\87 #$5.\nàª\86 àª®àª¾àª¹àª¿àª¤à«\80 àª¤àª®àª¾àª°à«\80 àªªà«\82àª\9bપરàª\9bમાàª\82 àª\9cરà«\82ર àª\89મà«\87રશà«\8b.",
        "blockednoreason": "કોઇ કારણ દર્શાવવામાં આવ્યું નથી",
        "whitelistedittext": "ફેરફાર કરવા માટે તમારે $1 કરવાનું છે.",
        "confirmedittext": "પાનાંમાં ફેરફાર કરવા માટે તમારે તમારા ઇમેલની પુષ્ટિ કરવી પડશે.\nમહેરબાની કરી [[Special:Preferences|મારી પસંદ]]માં જઇને તમારું ઇમેલ સરનામું આપો અને તેને પ્રમાણિત કરો.",
        "accmailtext": "[[User talk:$1|$1]] માટે રચેલ ગુપ્તસંજ્ઞા $2 ને મોકલાવી દેવાઇ છે. આ નવા ખાતાનીગુપ્તસંજ્ઞા પ્રવેશ કર્યા બાદ ''[[Special:ChangePassword|ગુપ્તસંજ્ઞા બદલો]]'' વાપરીને બદલી શકાશે.",
        "newarticle": "(નવીન)",
        "newarticletext": "આપ જે કડીને અનુસરીને અહીં પહોંચ્યા છો તે પાનું અસ્તિત્વમાં નથી.\n<br />નવું પાનું બનાવવા માટે નીચે આપેલા ખાનામાં લખવાનું શરૂ કરો (વધુ માહિતિ માટે [$1 મદદ] જુઓ).\n<br />જો આપ ભુલમાં અહીં આવી ગયા હોવ તો, આપનાં બ્રાઉઝર નાં '''બેક''' બટન પર ક્લિક કરીને પાછા વળો.",
-       "anontalkpagetext": "----''આ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે જેણે યા તો પોતાનું ખાતું નથી ખોલ્યું યાતો તેને વાપરતો નથી.\nઆથી તેને ઓળખવા માટે અમારે સાંખ્યિક  IP સરનામાની મદદ લેવી પડી છે.\nઆવું IP સરનામુંઘણાંઅન્યસભ્યો પણ વાપરતા હોઇ શકે.\nજો તમે અજ્ઞાત સભ્ય હોવ અને ઈચ્છતા હોવ કે અસંધિત ટિપ્પનીઓ તમારી તરફ વાળવામાં આવે છે, \nતો કૃપયા  [[Special:UserLogin/signup|create an account]] અથવા [[Special:UserLogin|log in]] નો ઉપયોગ કરશો  જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજીને તમારી ટીકા ન કરાય.''",
+       "anontalkpagetext": "----\n<em>આ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે જેમણે ક્યાં તો પોતાનું ખાતું ખોલ્યું નથી અથવા તો તેને વાપરતા નથી.</em>\nઆથી તેમને ઓળખવા માટે અમારે સાંખ્યિક IP સરનામાની મદદ લેવી પડી છે.\nઆવું IP સરનામું ઘણાં અન્ય સભ્યો પણ વાપરતા હોઇ શકે.\nજો તમે અજ્ઞાત સભ્ય હોવ અને માનતા હોવ કે અસંધિત ટિપ્પણીઓ તમારી તરફ વાળવામાં આવી છે, તો કૃપયા  [[Special:UserLogin/signup|create an account]] અથવા [[Special:UserLogin|log in]]નો ઉપયોગ કરશો જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજવાની ભૂલ ભવિષ્યમાં ટાળી શકાય.",
        "noarticletext": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો],\nઅથવા  [{{fullurl:{{FULLPAGENAME}}|action=edit}} આ પાનામાં ફેરફાર કરી] માહિતિ ઉમેરવાનું શરૂ કરી શકો છો</span>.",
        "noarticletext-nopermission": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, અથવા <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો], પરંતુ તમને આ પાનું બનાવવાની મંજૂરી નથી.",
        "userpage-userdoesnotexist": "સભ્ય ખાતું \"<nowiki>$1</nowiki>\"ની નોંધણીનથી થઈ.\nશું તમે ખરેખર આ પાનાની રચના કે ફેરફાર કરવા માંગો છો",
        "ipbexpiry": "સમાપ્તિ:",
        "ipbreason": "કારણ:",
        "ipbreason-dropdown": "*સામાન્ય પ્રતિબંધ કારણો\n** ખોટી માહિતી ઉમેરાઈ  \n** પાનામાંથી માહિતી ભૂંસી નાંખી\n** અનાવશ્યક બાહ્ય કડીઓ ઉમેરી \n** પાનામાં મૂર્ખામીભરી/અર્થહીન માહિતી ઉમેરી\n** ત્રાસદાયક વર્તન \n** ઘણા ખાતાઓ અને દુરુપયોગ\n** અસ્વીકાર્ય સભ્ય નામ\n** આત્યંતિક ભાંગફોડ",
-       "ipb-hardblock": "àª\85àª\9fàª\95ાવà«\8b àª\86 IP àª¸àª°àª¨àª¾àª®à«\81àª\82 àª®àª¾àª\82થà«\80 àª«à«\87રફાર àªµàªªàª°àª¾àª¶àª\95રà«\8dતાàª\93 àª®àª¾àª\82 àª²à«\89àª\97",
+       "ipb-hardblock": "àª\86 IP àª¸àª°àª¨àª¾àª®àª¾àª\82 àªªàª°àª¥à«\80 àª²à«\8bàª\97-àª\88ન àª¥àª¯à«\87લા àª¸àª­à«\8dયà«\8bનà«\87 àª«à«\87રફાર àª\95રતા àª\85àª\9fàª\95ાવà«\8b.",
        "ipbcreateaccount": "ખાતા ખોલવા પર પ્રતિબંધ",
        "ipbemailban": "સભ્યના ઇ-મેલ મોકલવા પર પ્રતિબંધ મૂકો",
        "ipbenableautoblock": "આ સભ્ય દ્વારા વપરાયેલ  IP સરનામા પર અને તત-પશ્ચ્યાત વપરાયેલ IP સરનામા ને સ્વયંચાલિત રીતે રોક લગાવો",
index 1fbc600..930de6b 100644 (file)
        "pageswithprop-prophidden-binary": "ערך של מאפיין בינארי הוסתר ($1)",
        "doubleredirects": "הפניות כפולות",
        "doubleredirectstext": "בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.\nכל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה\"אמיתי\" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.\nפריטים <del>מחוקים</del> כבר תוקנו.",
-       "double-redirect-fixed-move": "[[$1]] הועבר.\nכעת זו הפניה לדף [[$2]].",
-       "double-redirect-fixed-maintenance": "ת×\99ק×\95×\9f ×\94פנ×\99×\94 ×\9bפ×\95×\9c×\94 ×\9e[[$1]] ×\9c[[$2]].",
+       "double-redirect-fixed-move": "הדף [[$1]] הועבר.\nהוא עודכן אוטומטית ועכשיו מפנה לדף [[$2]].",
+       "double-redirect-fixed-maintenance": "ת×\99ק×\95×\9f ×\90×\95×\98×\95×\9e×\98×\99 ×©×\9c ×\94פנ×\99×\94 ×\9bפ×\95×\9c×\94 ×\9e[[$1]] ×\9c[[$2]] ×\91×\9eש×\99×\9eת ×ª×\97×\96×\95ק×\94.",
        "double-redirect-fixer": "מתקן הפניות",
        "brokenredirects": "הפניות לא תקינות",
        "brokenredirectstext": "ההפניות שלהלן מפנות לדפים שאינם קיימים:",
index ce82154..c65c474 100644 (file)
@@ -69,7 +69,8 @@
                        "Ximo17",
                        "Xpensive",
                        "ZioNicco",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "PeppeAeco"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "pageswithprop-prophidden-binary": "valore binario della proprietà nascosto ($1)",
        "doubleredirects": "Redirect doppi",
        "doubleredirectstext": "In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.\nCiascuna riga contiene i collegamenti al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene la pagina di destinazione \"corretta\" alla quale dovrebbe puntare anche il primo redirect.\nI redirect <del>cancellati</del> sono stati corretti.",
-       "double-redirect-fixed-move": "[[$1]] è stata spostata automaticamente, ora è un redirect a [[$2]]",
-       "double-redirect-fixed-maintenance": "Corretto doppio redirect da [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] è stata spostato.\nE' stato automaticamente aggiornato e ora è un redirect a [[$2]].",
+       "double-redirect-fixed-maintenance": "Correggere automaticamente il doppio redirect da [[$1]] a [[$2]] nel lavoro di manutenzione.",
        "double-redirect-fixer": "Correttore di redirect",
        "brokenredirects": "Redirect errati",
        "brokenredirectstext": "I seguenti redirect puntano a pagine inesistenti:",
index 0df0830..886bceb 100644 (file)
        "rcnotefrom": "ქვემოთ მოყვანილია ცვლილებები '''$2'''-დან (ნაჩვენებია '''$1''').",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $1-დან",
        "rcshowhideminor": "მცირე რედაქტირების $1",
+       "rcshowhideminor-show": "ჩვენება",
+       "rcshowhideminor-hide": "დამალვა",
        "rcshowhidebots": "რობოტების  $1",
        "rcshowhidebots-show": "ჩვენება",
        "rcshowhidebots-hide": "დამალვა",
-       "rcshowhideliu": "$1 რეგისტრირებული მომხმარებელი",
+       "rcshowhideliu": "რეგისტრირებული მომხმარებლების $1",
+       "rcshowhideliu-show": "ჩვენება",
+       "rcshowhideliu-hide": "დამალვა",
        "rcshowhideanons": "ანონიმური მომხმარებლების $1",
+       "rcshowhideanons-show": "ჩვენება",
+       "rcshowhideanons-hide": "დამალვა",
        "rcshowhidepatr": "გაკონტროლებული ცვლილებების $1",
        "rcshowhidemine": "ჩემი რედაქტირების $1",
+       "rcshowhidemine-show": "ჩვენება",
+       "rcshowhidemine-hide": "დამალვა",
        "rclinks": "ბოლო $1 ცვლილების ჩვენება უკანასკნელი $2 დღის მანძილზე<br />$3",
        "diff": "განსხ.",
        "hist": "ისტ.",
index 81c2374..5961d21 100644 (file)
        "revertmerge": "Біріктіруді болдырмау",
        "mergelogpagetext": "Төменде бір беттің тарихы өзге бетке біріктіру ең соңғы тізімі келтіріледі.",
        "history-title": "«$1» дегеннің өңдеу тарихы",
-       "difference-title": "Нұсқалар арасындағы айырмашылық: <<$1>>",
+       "difference-title": "$1 — нұсқалар арасындағы айырмашылық",
        "difference-title-multipage": "\"$1\" және \"$2\" беттерінің арасындағы айырмашылық",
        "difference-multipage": "(Беттер арасындағы айырмашылық)",
        "lineno": "Жол нөмірі $1:",
        "sourcefilename": "Қайнар файл атауы:",
        "sourceurl": "Қайнардың URL-мекенжайы:",
        "destfilename": "Файл атауы:",
-       "upload-maxfilesize": "ФайлдÑ\8bÒ£ ÐµÒ£ ÐºÓ©Ð¿ Ð¼Ò¯Ð¼ÐºÑ\96н Ð¼Ó©Ð»Ñ\88еÑ\80і: $1",
+       "upload-maxfilesize": "Ð\96үкÑ\82еÑ\83ге Ð±Ð¾Ð»Ð°Ñ\82Ñ\8bн ÐµÒ£ Ò¯Ð»ÐºÐµÐ½ Ñ\84айл Ó©Ð»Ñ\88емі: $1",
        "upload-description": "Файл сипаттамасы",
        "upload-options": "Жүктеу баптаулары",
        "watchthisupload": "Осы файлды бақылау",
        "listfiles-latestversion-no": "Жоқ",
        "file-anchor-link": "Файл беті",
        "filehist": "Файл тарихы",
-       "filehist-help": "ФайлдÑ\8bÒ£ Ò\9bай Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ò\9bалай ÐºÓ©Ñ\80Ñ\96неÑ\82Ñ\96н Ò¯Ñ\88Ñ\96н Ð\9aүн-ай/УаÒ\9bÑ\8bÑ\82 дегенді нұқыңыз.",
-       "filehist-deleteall": "барлығын жой",
+       "filehist-help": "ФайлдÑ\8bÒ£ Ò\9bай Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ò\9bалай ÐºÓ©Ñ\80Ñ\96неÑ\82Ñ\96н Ò¯Ñ\88Ñ\96н ÐºÒ¯Ð½-айÑ\8b\83аÒ\9bÑ\8bÑ\82Ñ\8b дегенді нұқыңыз.",
+       "filehist-deleteall": "барлығын жою",
        "filehist-deleteone": "жой",
        "filehist-revert": "қайтар",
        "filehist-current": "ағымдағы",
        "filehist-filesize": "Файл өлшемі",
        "filehist-comment": "Пікір",
        "imagelinks": "Файл қолданылуы",
-       "linkstoimage": "Бұл файлға келесі {{PLURAL:$1|беттер|$1 бет}} сілтейді:",
+       "linkstoimage": "Бұл файлға келесі {{PLURAL:$1|бет|$1 бет}} сілтейді:",
+       "linkstoimage-more": "Бұл файлға $1 беттен көп {{PLURAL:$1|бет сілтейді|бет сілтейді}}.\nТөмендегі тізімде тек бұл файлға {{PLURAL:$1|бірінше бет сілтемесі|бірінші $1 бет сілтемелері}} көрсетілген.\nБет сілтемесінің [[Special:WhatLinksHere/$2|толық тізімін]] қараңыз.",
        "nolinkstoimage": "Бұл файлға еш бет сілтемейді.",
        "morelinkstoimage": "Бұл файлдың [[Special:WhatLinksHere/$1|көбірек сілтемелерін]] қарау.",
        "linkstoimage-redirect": "$1 (файл айдатылуы) $2",
        "seconds-ago": "$1 {{PLURAL:$1|секунт|секунт}} бұрын",
        "bad_image_list": "Пішімі төмендегідей:\n\nТек тізім даналары (* нышанымен басталытын жолдар) есептеледі.\nЖолдың бірінші сілтемесі жарамсыз суретке сілтеу жөн.\nСол жолдағы кейінгі әрбір сілтемелер ерен болып есептеледі, мысалы жол ішіндегі кездесетін суреті бар беттер.",
        "metadata": "Қосымша мәліметтер",
-       "metadata-help": "Осы файлда қосымша мәліметтер бар. Бәлкім, осы мәліметтер файлды жасап шығару, не сандылау үшін пайдаланған сандық камера, не мәтіналғырдан алынған.\nЕгер осы файл негізгі күйінен өзгертілген болса, кейбір ежелелері өзгертілген фотосуретке лайық болмас.",
+       "metadata-help": "Осы файлда қосымша мәліметтер қамтылған, файл жасалуына немесе цифрлық формаға айналдырылуына дижитал (сандық) аппарат не сканер қолданылған болуы ықтимал.\nЕгер осы файл негізгі күйінен өзгертілген болса кейбір егжей-тегжейлері өзгертілген файлға лайық болмас.",
        "metadata-expand": "Егжей-тегжейін көрсет",
        "metadata-collapse": "Егжей-тегжейін жасыр",
        "metadata-fields": "Осы хабарда тізімделген EXIF қосымша мәліметтер аумақтары, сурет беті көрсету кезінде қосымша мәліметтер кесте жасырылығанда кірістірледі.\nБасқалары әдепкіден жасырылады.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
index 7884a3b..88bb482 100644 (file)
        "uploadlogpage": "올리기 기록",
        "uploadlogpagetext": "최근 올라온 파일 목록입니다.\n갤러리 형식으로 확인하고 싶으시다면 [[Special:NewFiles|새 파일 목록]]을 보세요.",
        "filename": "파일 이름",
-       "filedesc": "요약",
+       "filedesc": "파일의 설명",
        "fileuploadsummary": "요약:",
        "filereuploadsummary": "파일의 바뀜:",
        "filestatus": "저작권 상태:",
index a45ae31..2415fd6 100644 (file)
        "listgrouprights-namespaceprotection-header": "Limitatioune vum Nummraum",
        "listgrouprights-namespaceprotection-namespace": "Nummraum",
        "listgrouprights-namespaceprotection-restrictedto": "Recht(er), déi dem Benotzer d'Änneren erlaben",
+       "trackingcategories-msg": "Tracking-Kategorie",
        "trackingcategories-name": "Numm vum Message",
        "noindex-category-desc": "D'Säit gëtt net vu Botten indexéiert, well dat magescht Wuert <code><nowiki>__NOINDEX__</nowiki></code> dran ass a well se an engem Nummraum ass, an deem déi Markéierung erlaabt ass.",
        "hidden-category-category-desc": "Dëst ass eng Kategorie an där <code><nowiki>__HIDDENCAT__</nowiki></code> drasteet, dat verhënnert datt se standardméisseg an der këscht mat de Kategorielinken op der Säit gewise gëtt.",
index b7fa186..d44a379 100644 (file)
@@ -19,7 +19,6 @@
        "tog-showtoolbar": "Haneho ny toolbar fanovana",
        "tog-editondblclick": "Hanova pejy amin'ny alalan'ny tsindrim-boalavo roa misesy",
        "tog-editsectiononrightclick": "Hampiasa ny fanovana fizarana amin'ny tsindry havanana eo amin'ny lohatenim-pizarana.",
-       "tog-rememberpassword": "Tadidio ny tenimiafiko eto amin'ity solosaina ity (mandritry ny andro $1 fara-fahabetsany){{PLURAL:}}",
        "tog-watchcreations": "Hanaraka ny pejy foronoko ary ny rakitra ampidiriko",
        "tog-watchdefault": "Hanaraka ny pejy ary ny rakitra ovaiko",
        "tog-watchmoves": "Hanaraka ny pejy ary ny rakitra ovaiko anarana",
        "rcshowhidebots-hide": "Hanafina",
        "rcshowhideliu": "$1 ny mpikambana nisoratra anarana",
        "rcshowhideliu-show": "Haneho",
-       "rcshowhideliu-hide": "Hanadina",
+       "rcshowhideliu-hide": "Hanafina",
        "rcshowhideanons": "$1 ny mpikambana tsy nisoratra anarana",
        "rcshowhideanons-show": "Haneho",
        "rcshowhideanons-hide": "Hanafina",
index c770a1f..2beba8f 100644 (file)
        "category_header": "\"$1\" ангийн дан хуудас",
        "subcategories": "Ангийн бүлэг",
        "category-media-header": "\"$1\" ангийн файл",
-       "category-empty": "''Ð\9eдоогийн Ð±Ð°Ð¹Ð´Ð»Ð°Ð°Ñ\80 Ñ\8dнÑ\8d Ð°Ð½Ð³Ð¸Ð»Ð°Ð»Ð´ Ñ\85Ñ\83Ñ\83даÑ\81, Ð¼ÐµÐ´Ð¸Ð° Ñ\84айл Ð±Ð°Ð¹Ñ\85гүй Ð±Ð°Ð¹Ð½а.''",
+       "category-empty": "''Ð\9eдоогооÑ\80 Ñ\8dнÑ\8d Ð°Ð½Ð³Ð¸Ð´ Ñ\85Ñ\83Ñ\83даÑ\81, Ð·Ñ\83Ñ\80гийн Ð°Ð»Ñ\8c Ð½Ñ\8c Ñ\87 Ð°Ð»Ð³а.''",
        "hidden-categories": "{{PLURAL:$1|Нуугдсан анги|Нуугдсан ангиуд}}",
        "hidden-category-category": "Нуугдсан ангиллууд",
        "category-subcat-count": "{{PLURAL:$2|Тус ангид дараах ангийн хуудсууд хамаарна.|Тус ангид дараах $2 ангийн хуудсууд хамаарна.}}",
        "vector-view-view": "Унших",
        "vector-view-viewsource": "Кодыг харах",
        "actions": "Үйлдлүүд",
-       "namespaces": "Ð\9dÑ\8dÑ\80ний Ð·Ð°Ð¹Ð½Ñ\83Ñ\83д",
+       "namespaces": "Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bн Ñ\82Ó©Ñ\80өл",
        "variants": "Хувилбарууд",
        "navigation-heading": "Хажуугийн цэс",
        "errorpagetitle": "Aлдаа",
index 7ae9d4f..8634adc 100644 (file)
@@ -16,7 +16,7 @@
        "tog-showtoolbar": "Hián-sī pian-chi̍p ke-si-tiâu",
        "tog-editondblclick": "連揤兩个就通編輯",
        "tog-editsectiononrightclick": "Chiàⁿ ji̍h toāⁿ-lo̍h phiau-tê to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h",
-       "tog-watchcreations": "Kā goá khui ê ia̍h kah chiūⁿ chái ê tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
+       "tog-watchcreations": "Kā goá khui ê ia̍h kah chiūⁿ-chái ê tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
        "tog-watchdefault": "Kā goá pian-chi̍p kòe ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
        "tog-watchmoves": "Kā goá soá ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
        "tog-watchdeletion": "Kā goá thâi tiāu ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
index b2cdaa1..7f0d64b 100644 (file)
@@ -62,7 +62,8 @@
                        "Ymar",
                        "Žekřil71pl",
                        "לערי ריינהארט",
-                       "Pan Cube"
+                       "Pan Cube",
+                       "Wedkarski"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "unwatchedpages": "Nieobserwowane strony",
        "listredirects": "Lista przekierowań",
        "listduplicatedfiles": "Lista plików mających duplikaty",
+       "listduplicatedfiles-summary": "To jest lista plików, dla których najnowsza wersja pliku jest duplikatem najnowszej wersji innego pliku. Uwzględniane są tylko pliki lokalne.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] ma [[$3|{{PLURAL:$2|jeden duplikat|$2 duplikaty|$2 duplikatów}}]].",
        "unusedtemplates": "Nieużywane szablony",
        "unusedtemplatestext": "Poniżej znajduje się lista wszystkich stron znajdujących się w przestrzeni nazw {{ns:template}}, które nie są używane przez inne strony.\nSprawdź inne linki do szablonów, zanim usuniesz tę stronę.",
        "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo <code><nowiki>__NOINDEX__</nowiki></code> i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.",
        "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż <code>$wgMaxArticleSize</code>, więc niektóre szablony nie zostały rozwinięte.",
        "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak <code>#ifexist</code>). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "hidden-category-category-desc": "To jest kategoria z <code><nowiki>__HIDDENCAT__</nowiki></code>, co zapobiega wyświetlaniu jej w sekcji z kategoriami na stronie.",
        "trackingcategories-nodesc": "Opis nie jest dostępny.",
        "trackingcategories-disabled": "Kategoria jest wyłączona",
        "mailnologin": "Brak adresu",
index 7ec8f3f..01d1444 100644 (file)
        "pageswithprop-prophidden-binary": "Valor de propriedade binária oculta ($1)",
        "doubleredirects": "Redirecionamentos duplos",
        "doubleredirectstext": "Esta página lista as páginas que redirecionam para outros redirecionamentos.\nCada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.\nEntradas <del>riscadas</del> foram resolvidas.",
-       "double-redirect-fixed-move": "[[$1]] foi movido e agora é um redirecionamento para [[$2]]",
-       "double-redirect-fixed-maintenance": "Corrigindo redirecionamento duplo de [[$1]] para [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] foi movido\nEle foi atualizado automaticamente e agora é um redirecionamento para [[$2]]",
+       "double-redirect-fixed-maintenance": "Corrigindo automaticamente o redirecionamento duplo de [[$1]] para [[$2]] em uma tarefa de manutenção.",
        "double-redirect-fixer": "Corretor de redirecionamentos",
        "brokenredirects": "Redirecionamentos quebrados",
        "brokenredirectstext": "Os seguintes redirecionamentos ligam para páginas inexistentes:",
index 59cc68a..7c1996e 100644 (file)
        "searchrelated": "сибээстэммит",
        "searchall": "бары",
        "showingresults": "Манна {{PLURAL:$1|түмүк|түмүктэр}} {{PLURAL:$1|көрдөрүлүннэ|көрдөрүлүннүлэр}} <strong>$1</strong> , мантан саҕалаан №&nbsp;<strong>$2</strong>.",
+       "showingresultsinrange": "Манна {{PLURAL:$1|<strong>1</strong> түмүк|<strong>$1</strong> түмүк}} мантан саҕалаан <strong>$2</strong> маныаха дылы <strong>$3</strong> көрдөрүлүннэ.",
        "showingresultsnum": "Манна {{PLURAL:$3|түмүк|түмүктэр}} {{PLURAL:$3|көрдөрөлүннэ|көрдөрүлүннүлэр}} <strong>$3</strong>, мантан саҕалаан №&nbsp;<strong>$2</strong>.",
        "showingresultsheader": "'''$4''' анаммыт {{PLURAL:$5|мантан '''$3''' түмүгэ - '''$1'''|мантан '''$3''' түмүктэрэ '''$1 - $2'''}}",
        "search-nonefound": "Көрдөбүлгэ эппиэттиир билэлэр көстүбэтилэр.",
        "preferences": "Уларытыылар",
        "mypreferences": "Туруоруулар",
        "prefs-edits": "Көннөрүү ахсаана:",
+       "prefsnologintext2": "Туруоруулары уларытарга $1 наада.",
        "prefs-skin": "Тас көстүү",
        "skin-preview": "Хайдах буолара",
        "datedefault": "Көннөрү көстүүтэ",
        "recentchangesdays-max": "(улааппыта $1 күн)",
        "recentchangescount": "Саҥа уларытыылар көрдөрүллэр ахсааннара:",
        "prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
+       "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
        "savedprefs": "Эн туруорууларыҥ олохтоннулар.",
        "timezonelegend": "Олохтоох кэм:",
        "localtime": "Олохтоох кэмим:",
        "yourgender": "Хайата Эйиэхэ сөп түбэһэрий?",
        "gender-unknown": "Ыйбат инибин",
        "gender-male": "Кини биики сирэйдэри уларытар",
-       "gender-female": "Ð\94Ñ\8cаÑ\85тар",
-       "prefs-help-gender": "Ð\91Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85. Ð\91Ñ\8bÑ\80агÑ\8bÑ\80аамма Ñ\81оÑ\80оÑ\85 Ð´Ñ\8cоҥҥо Ñ\82Ñ\83һаайÑ\8bллÑ\8bбÑ\8bÑ\82 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иилÑ\8dÑ\80игÑ\8dÑ\80 Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 ÐºÐ¸Ð½Ð¸Ð»Ñ\8dÑ\80гÑ\8d Ñ\81Ñ\8bÒ»Ñ\8bаннааÑ\85 Ñ\8dÑ\82иилÑ\8dÑ\80игÑ\8dÑ\80 ÐºÑ\8bÑ\82ааÑ\87Ñ\87Ñ\8b Ð´Ñ\8cаÑ\85Ñ\82аÑ\80Ñ\8bÑ\82Ñ\82ан Ñ\8dÑ\80 ÐºÐ¸Ò»Ð¸Ñ\82иÑ\82Ñ\82Ñ\8dн ÐºÓ©Ñ\80өн Ñ\8dÑ\82ии Ñ\82Ñ\83Ñ\82Ñ\83лÑ\83н Ñ\83лаÑ\80Ñ\8bÑ\82ан Ð±Ð¸Ñ\8dÑ\80иÑ\8dн Ñ\81өп. Туора дьоҥҥо көстөр бэлиэтээһин.",
+       "gender-female": "Ð\9aини Ð±Ð¸Ð¸ÐºÐ¸ Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ñ\83лаÑ\80Ñ\8bтар",
+       "prefs-help-gender": "Ð\9cанÑ\8b Ñ\82Ñ\83Ñ\80Ñ\83оÑ\80аÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85. \nÐ\91Ñ\8bÑ\80агÑ\8bÑ\80аамма Ñ\81оÑ\80оÑ\85 Ð´Ñ\8cоҥҥо Ñ\82Ñ\83һаайÑ\8bллÑ\8bбÑ\8bÑ\82 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иилÑ\8dÑ\80игÑ\8dÑ\80 Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 ÐºÐ¸Ð½Ð¸Ð»Ñ\8dÑ\80гÑ\8d Ñ\81Ñ\8bÒ»Ñ\8bаннааÑ\85 Ñ\8dÑ\82иилÑ\8dÑ\80игÑ\8dÑ\80 ÐºÑ\8bÑ\82ааÑ\87Ñ\87Ñ\8b Ð´Ñ\8cаÑ\85Ñ\82аÑ\80Ñ\8bÑ\82Ñ\82ан Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\8dÑ\80 ÐºÐ¸Ò»Ð¸Ñ\82иÑ\82Ñ\82Ñ\8dн ÐºÓ©Ñ\80өн Ñ\8dÑ\82ии Ñ\82Ñ\83Ñ\82Ñ\83лÑ\83н Ñ\83лаÑ\80Ñ\8bÑ\82ан Ð±Ð¸Ñ\8dÑ\80иÑ\8dн Ñ\81өп. \nТуора дьоҥҥо көстөр бэлиэтээһин.",
        "email": "Почта",
        "prefs-help-realname": "Сурукка киирбит аатыҥ (булгуччута суох): ким бу сирэйи уларыппытын көрдөрөргө туттуллар",
        "prefs-help-email": "Электроннай аадырыһы суруйар булгуччута суох, ол эрээри киирии тылгын умуннаххына санатарга көмөлөһүө.",
        "prefs-displaywatchlist": "Көстүүтүн туруоруулара",
        "prefs-diffs": "Уратылара",
        "prefs-help-prefershttps": "Аныгыскы киириигэр үлэлиир буолуо.",
+       "prefs-tabs-navigation-hint": "Сүбэ: Көмпүүтэриҥ клаватууратын стрелкаларын туһанан кыбытыктан кыбытыкка көһүөххүн сөп.",
        "email-address-validity-valid": "Сөп курдук көстөр",
        "email-address-validity-invalid": "Алҕаһа суох аадырыс ирдэнэр",
        "userrights": "Кыттааччылар бырааптарын салайыы",
        "action-block": "кыттааччы уларытыыны оҥорорун бобуу",
        "action-protect": "бу сирэй харысхалын таһымын уларытыы",
        "action-rollback": "бы сирэйи көннөрбүт бүтэһик киһи уларытыыларын түргэнник суох гыныы",
-       "action-import": "бу сирэйи атын биикиттэн киллэрии",
-       "action-importupload": "бу сирэйи эрдэ суруллубут билэттэн киллэрии",
+       "action-import": "сирэйдэри атын биикиттэн киллэрии",
+       "action-importupload": "сирэйдэри эрдэ хачайданан ылбыт (суруллубут) билэттэн киллэрии",
        "action-patrol": "атыттар көннөрүүлэрин ботуруулламмыт курдук бэлиэтээ",
        "action-autopatrol": "бэйэ көннөрүүтүн ботуруулламмыт курдук бэлиэтээһин",
        "action-unwatchedpages": "ким да кэтээбэт сирэйдэрин тиһиктэрин көрүү",
        "action-viewmyprivateinfo": "бэйэҥ тускунан көрүү",
        "action-editmyprivateinfo": "бэйэҥ тускунан суруллубуту уларыт",
        "nchanges": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тиһэх сылдьыыгыттан}}",
        "enhancedrc-history": "устуоруйата",
        "recentchanges": "Кэнники уларытыылар",
        "recentchanges-legend": "Кэлиҥҥи уларытыылар хайдах көстөллөрүн туруоруу",
        "recentchanges-label-minor": "Бу улахан суолтата суох уларытыы",
        "recentchanges-label-bot": "Бу уларытыыны робот оҥорбут",
        "recentchanges-label-unpatrolled": "Бу уларытыы өссө ботурууллана илик",
-       "recentchanges-legend-newpage": "$1 — саҥа сирэй",
-       "rcnotefrom": "Мантан '''$2''' маныаха '''$1''' дылы уларыыйылар көрдөрүлүннүлэр.",
+       "recentchanges-label-plusminus": "Сирэй кээмэйэ бачча баайтынан уларыйбыт",
+       "recentchanges-legend-heading": "'''Легендата:'''",
+       "recentchanges-legend-newpage": "(өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
+       "rcnotefrom": "Улартыылар бу кэмтэн ыла көрдөрүлүннүлэр: <strong>$2</strong> (мантан элбэх көрдөрүллүбэтэ: <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $1 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
+       "rcshowhideminor-show": "Көрдөр",
+       "rcshowhideminor-hide": "Кистээ",
        "rcshowhidebots": "$1 робот",
-       "rcshowhideliu": "Аатын билиһиннэрбит кыттааччылары $1",
+       "rcshowhidebots-show": "Көрдөр",
+       "rcshowhidebots-hide": "Кистээ",
+       "rcshowhideliu": "Бэлиэтэммит кыттааччылар ахсааннара $1",
+       "rcshowhideliu-show": "Көрдөр",
+       "rcshowhideliu-hide": "Кистээ",
        "rcshowhideanons": "Ааттарын эппэтэх кыттааччылары $1",
+       "rcshowhideanons-show": "Көрдөр",
+       "rcshowhideanons-hide": "Кистээ",
        "rcshowhidepatr": "$1 бэрэбиэркэлэммит уларытыылар",
+       "rcshowhidepatr-show": "Көрдөр",
+       "rcshowhidepatr-hide": "Кистээ",
        "rcshowhidemine": "Мин уларытыыларбын $1",
+       "rcshowhidemine-show": "Көрдөр",
+       "rcshowhidemine-hide": "Кистээ",
        "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
        "diff": "уратыта",
        "hist": "история",
        "fileexists-shared-forbidden": "Маннык ааттаах ойуу уопсай ыскылаакка баар эбит.\nОл да буоллар билэни киллэриэххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Бу билэ атын {{PLURAL:$1|билэ дубликаата|билэлэр дубликааттара}} буолар:",
        "file-deleted-duplicate": "Маннык билэ ([[:$1]]) урут сотуллубут эбит. Суруттарыаҥ иннинэ бастаан тоҕо сотуллубутун көр.",
+       "file-deleted-duplicate-notitle": "Маннык билэ урут сотуллубут эбит, аата бобуллубут.\nБилэни саҥаттан киллэриэҥ иннинэ бобуллубут билэлэри көрөр кыахтаах киһиэхэ тахсан тоҕо бобуллубутун быһаарыс.",
        "uploadwarning": "Сэрэтии",
        "uploadwarning-text": "Бука диэн аллара баар билэ туһунан суругу уларыт уонна өссө хатылаа.",
        "savefile": "Билэни суруттарыы",
        "uploaddisabledtext": "Билэлэри суруттарар көҥүллэммэт.",
        "php-uploaddisabledtext": "PHP туруорууларыгар билэни киллэрии араарыллыбыт. Бука диэн, file_uploads туруоруутун көр.",
        "uploadscripted": "Бу билэ HTML эбэтэр скрипт куодтаах эбит. Интэриниэт көрдөрөр бырагыраамма ону сыыһа ааҕыан сөп.",
+       "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '$1'",
+       "uploadinvalidxml": "Хачайдаммит билэҕэ XML анаалыстанар кыаҕа суох.",
        "uploadvirus": "Бу билэ вирустаах! Көр: $1",
        "uploadjava": "Билэ Java .class билэлээх ZIP-архыып эбит.\nКуттал суох буолбатын диэн Java-билэрэри манна угар бобуллар.",
        "upload-source": "Билэ бастакы торума",
        "listfiles_size": "Кээмэйэ",
        "listfiles_description": "Быһаарыыта",
        "listfiles_count": "Барыллар",
+       "listfiles-show-all": "Ойуу эргэ барылларын эмиэ киллэр",
        "listfiles-latestversion": "Билиҥҥи барыла",
        "listfiles-latestversion-yes": "Сөп",
        "listfiles-latestversion-no": "Суох",
        "download": "хачайдаан ылыы",
        "unwatchedpages": "Ким да кэтээбэт сирэйдэрэ",
        "listredirects": "Көһөрүүлэр испииһэктэрэ",
+       "listduplicatedfiles": "Дубликааттаах билэлэр тиһиктэрэ",
+       "listduplicatedfiles-summary": "Бу тиһиккэ тиһэх барыллара атын билэлэр дубликааттарынан ааҕыллар билэлэр көрдөрүллүннүлэр. Локал билэлэр эрэ ааҕылыннылар.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] билэ [[$3|{{PLURAL:$2|соҕотох дубликааттаах|$2 дубликааттаах}}]].",
        "unusedtemplates": "Туттуллубат халыыптар",
        "unusedtemplatestext": "Манна атын сирэйдэргэ туруоруллубатах {{ns:template}} сирэйдэр көстөллөр.\nСотоору гынар буоллаххына ол халыыпкар атын билэлэр сигэммэтэхтэрин бэрэбиэркэлээ.",
        "unusedtemplateswlh": "атын ыйынньыктар",
        "ninterwikis": "$1 интервики-сигэ",
        "nlinks": "$1 {{PLURAL:$1|сигэлээх|сигэлэрдээх}}",
        "nmembers": "$1 {{PLURAL:$1|кыттааччы|кыттааччылаах}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|эбийиэк|эбийиэктээх}}",
        "nrevisions": "$1 {{PLURAL:$1|барыллаах|барыл баар}}",
        "nviews": "$1 көрүүлээх",
        "nimagelinks": "$1 {{PLURAL:$1|сирэйгэ|ахсааннаах сирэйгэ}} туттуллар",
        "deadendpagestext": "Бу ыстатыйалар {{SITENAME}} саайтын атын сирэйдэригэр сигэммэттэр.",
        "protectedpages": "Көмүскэммит ыстатыйалар",
        "protectedpages-indef": "Болдьоҕо суох эрэ көмүскэллэр",
+       "protectedpages-summary": "Манна билиҥҥи кэмҥэ көмүскэммит ыстатыйалар көстөллөр. Айарга бобуллубут сирэйдэри көрөргө манна бар [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Каскаадынан эрэ көмүскэнии",
+       "protectedpages-noredirect": "Утаарыылары кистээ",
        "protectedpagesempty": "Билигин этиллибит параметрдаах көмүскэниллибит ыстатыйалар суохтар.",
+       "protectedpages-timestamp": "Күнэ-дьыла",
+       "protectedpages-page": "Сирэй",
+       "protectedpages-expiry": "Болдьоҕо бүтэр",
+       "protectedpages-performer": "Кытааччы көмүскээһинэ",
+       "protectedpages-params": "Көмүскээһин кээмэйдэрэ",
+       "protectedpages-reason": "Төрүөтэ",
+       "protectedpages-unknown-timestamp": "Биллибэт",
+       "protectedpages-unknown-performer": "Биллибэт кыттааччы",
        "protectedtitles": "Көмүскэммит ааттар",
+       "protectedtitles-summary": "Манна бобуллубут сирэйдэр ааттара сурулуннулар. Билигин көмүскэммит сирэйдэр тиһиктэрин манна көрүөххэ сөп: [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Биир да аат бу параметрдарынан көмүскэммэт",
        "listusers": "Кыттааччылар испииһэктэрэ",
        "listusers-editsonly": "Саатар биир көннөрүүнү оҥорбут кыттааччылары көрдөр",
        "listusers-creationsort": "Айыллыбыт күнүнэн наардаа",
+       "listusers-desc": "Кыччыырынан наардаа",
        "usereditcount": "$1 {{PLURAL:$1|көннөрүү|көннөрүү}}",
        "usercreated": "Баччаҕа {{GENDER:$3|бэлиэтэммит}} $1,  $2",
        "newpages": "Саҥа ыстатыйалар",
        "listgrouprights-removegroup-self": "Маннык {{PLURAL:$2|бөлөҕү|бөлөхтөрү}} бэйэтин аатыттан сотуон сөп: $1",
        "listgrouprights-addgroup-self-all": "Бары бөлөхтөрү бэйэтин аатыгар холбуон сөп",
        "listgrouprights-removegroup-self-all": "Бары бөлөхтөрү бэйэтин аатыттан сотуон сөп",
+       "listgrouprights-namespaceprotection-header": "Аат далын хааччахтара",
+       "listgrouprights-namespaceprotection-namespace": "Аат дала",
+       "listgrouprights-namespaceprotection-restrictedto": "Кыттааччы көннөрөр бырааба",
+       "trackingcategories": "Кэтиир категориялар",
+       "trackingcategories-summary": "Манна MediaWiki аптамаатынан толорор кэтиир категориялара көстөллөр.  Бу аат далыгар {{ns:8}} систиэмэ биллэриилэрин уларытан ааттарын уларытыахха сөп.",
+       "trackingcategories-msg": "Кэтиир категория",
+       "trackingcategories-name": "Этии аата",
+       "trackingcategories-desc": "Категорияҕа киирии киритиэрийэ",
+       "noindex-category-desc": "Бу сирэйи көрдүүр роботтар болҕомотоҕо ылбаттар, тоҕо диэтэххэ <code><nowiki>__NOINDEX__</nowiki></code> диэн «аптаах тыл» туттуллубут. Сирэй инньэ гынарга көҥүллэммит аат далыгар баар эбит.",
+       "index-category-desc": "Сирэйгэ __INDEX__ диэн «аптаах тыл» баар эбит (сирэй ону көҥүллүүр аат далыгар баар эбит), онон көрдүүр роботтар кинини болҕомтоҕо ылыа да суох түгэннэргэ көрөллөр эбит.",
+       "post-expand-template-inclusion-category-desc": "Халыыптары барытын көрөдөрдөххө сирэй кээмэйэ маннааҕар улаатыа <code>$wgMaxArticleSize</code>, ол иһин сорох халыыптар көрдөрүллүбэтилэр.",
+       "post-expand-template-argument-category-desc": "Халыып аргуменын арыйдахха (фигурнай ускуопка иһигэр баары, холобур, <code>{{{Foo}}})</code>, сирэй маннааҕар улахан буолуо: <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Сирэйгэ наһаа элбэх ресурсаны сиир функция туттуллубут (холобур, маннык <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Бу категория билэҕэ алҕастаах сигэ баар буоллаҕына эбиллэр (суох билэҕэ сигэнии).",
+       "hidden-category-category-desc": "Маннык бэлиэлээх категория <code><nowiki>__HIDDENCAT__</nowiki></code> кинини категория салаатыгар көстөрүн бобор.",
+       "trackingcategories-nodesc": "Ойуулааһына суох.",
+       "trackingcategories-disabled": "Араарыллыбыт категория",
        "mailnologin": "Аадырыһа суох",
        "mailnologintext": "Атын кыттааччылары кытта e-mail көмөтүнэн суруйсуоххун баҕарар буоллаххына бэйэҕин [[Special:UserLogin|билиһиннэриэхтээххин]]  уонна e-mail аадырыскын [[Special:Preferences|туруорууларгар]] суруйуохтааххын.",
        "emailuser": "Кыттааччыга сурук",
        "unwatchthispage": "Кэтиири тохтот",
        "notanarticle": "Бу ыстатыйа буолбатах",
        "notvisiblerev": "Торум сотуллубут",
-       "watchlist-details": "{{PLURAL:$1|$1 сирэйи кэтиигин|$1 сирэй кэтэбилгэ сылдьар}}, ырытыы сирэйдэрин аахпатахха.",
+       "watchlist-details": "Ырытыы сирэйдэрин аахпатахха {{PLURAL:$1|$1 сирэйи кэтиигин|$1 сирэй эн кэтэбилгэр сылдьар}}.",
        "wlheader-enotif": "Эл. почтанан биллэрии холбоммут.",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
        "watchmethod-recent": "кэтээн көрүү бүтэһик уларыйыыларын көрүү",
        "watchmethod-list": "кэтээһин бүтэһик уларыйыылара",
        "watchlistcontains": "$1 сирэйи кэтээн көрөҕүн.",
        "iteminvalidname": "'$1' моһуогурда, аата сатаммата...",
+       "wlnote2": "Манна {{PLURAL:$1|кэнники чааска|кэнники <strong>$1</strong> чааска}} оҥоһуллубут уларытыылар көстөллөр, $2 $3.",
        "wlshowlast": "бүтэһик $1 чааска $2 күҥҥэ $3 көрдөр",
        "watchlist-options": "Кэтээн көрүү туруоруутун уларытыы",
        "watching": "Кэтээ...",
        "enotif_lastvisited": "Бутэһик киирииҥ кэнниттэн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.",
        "enotif_lastdiff": "Уларытыыны манна көрүҥ: $1.",
        "enotif_anon_editor": "ааттамматах кыттааччы $1",
-       "enotif_body": "Алама күн сырдыгынан, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nУларытыы кылгас ис хоһооно: $PAGESUMMARY $PAGEMINOREDIT\n\nУларыппыт киһиэхэ суруйуоххун сөп:\nэл. почта: $PAGEEDITOR_EMAIL\nбиики: $PAGEEDITOR_WIKI\n\nБу сирэйи көрбөтөххүнэ биллэриилэр уонна кэлиэхтэрэ суоҕа. Биллэриилэри аналлаах сирэйгэ арааран кэбиһиэххин эмиэ сөп.\n\n             Бары үтүөнү кытта, {{SITENAME}} биллэрэр тиһигэ\n\n--\nБиллэрии кэлэрин салайыы\n{{canonicalurl:{{#special:Preferences}}}}\n\nКэтиир тиһиги уларытыы\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nКэтиир тиһиктэн сирэйдэри сотуу\n$UNWATCHURL\n\nКөмө\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Аламай күн сырдыгынан, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nУларытыы кылгас ис хоһооно: $PAGESUMMARY $PAGEMINOREDIT\n\nУларыппыт киһиэхэ суруйуоххун сөп:\nэл. почта: $PAGEEDITOR_EMAIL\nбиики: $PAGEEDITOR_WIKI\n\nБу сирэйи бэлиэтэммит ааккынан киирэн көрбөтөххүнэ уларыйбытын туһунан биллэриилэр кэлиэхтэрэ суоҕа. Биллэриилэри аналлаах сирэйгэ отой арааран кэбиһиэххин эмиэ сөп.\n\n             Бары үтүөнү кытта, {{SITENAME}} биллэрэр тиһигэ\n\n--\nБиллэрии кэлэрин салайыы\n{{canonicalurl:{{#special:Preferences}}}}\n\nКэтиир тиһиги уларытыы\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nКэтиир тиһиктэн сирэйдэри сотуу\n$UNWATCHURL\n\nКөмө\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
        "created": "айыллыбыт",
        "changed": "уларыппыт (уларытыллыбыт)",
        "deletepage": "Сирэйи сот",
        "deletecomment": "Төрүөтэ:",
        "deleteotherreason": "Атын/эбии биричиинэлэр:",
        "deletereasonotherlist": "Атын биричиинэ",
-       "deletereason-dropdown": "*Common сотуу биричиинэтэ\n** ааптар ирдээһинэ\n** ааптар быраабын күөмчүлээһин\n** Алдьатыы (Вандализм)",
+       "deletereason-dropdown": "* Сотуу үксүгэр туттуллар төрүөттэрэ\n** спам\n** вандааллааһын\n** ааптар быраабын күөмчүлээһин\n** ааптар ирдэбилинэн\n** үлэлээбэт утаарыы",
        "delete-edit-reasonlist": "Сотуу төрүөтүн уларытыы",
        "delete-toobig": "Бу сирэй уларытыыларын историята уһун, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маннык сирэйдэри сотор хааччахтанар, тоҕо диэххэ алҕас {{SITENAME}} алдьаныан сөп.",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
+       "deleting-backlinks-warning": "'''Сэрэтии.''' Сотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
        "rollback": "Уруккутугар төннөр",
        "rollback_short": "Төннөрүү",
        "rollbacklink": "төннөр",
        "alreadyrolled": "Бүтэһик [[User:$2|$2]] ([[User talk:$2|Ырытыы]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) оҥорбут [[:$1]] уларытыыларын төннөрөр кыах суох;\nким эрэ атын номнуо бу сирэйи уларыппыт эбэтэр уруккутун төннөрбүт.\n\nКэнники уларытыыны [[User:$3|$3]] ([[User talk:$3|Ырытыы]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) оҥорбут.",
        "editcomment": "Уларытыыны маннык быһаарбыттар: \"''$1''\".",
        "revertpage": "([[User talk:$2|Ырытыы]]) көннөрүүлэрэ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлэр",
-       "revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ [[User:$1|$1]]",
+       "revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ: {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "$1 көннөрүүлэр бу торумҥа төннөрүлүннүлэр: $2.",
        "sessionfailure-title": "Сиэссийэ алҕаһа",
        "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
        "contributions": "{{GENDER:$1|Кыттааччы}} суруйуута (кылаата)",
        "contributions-title": "$1 кыттааччы киллэрбит уларытыылара",
        "mycontris": "Суруйуу тиһигэ",
-       "contribsub2": "Вклад $1 ($2)",
+       "contribsub2": "$1 ($2) суруйуута",
+       "contributions-userdoesnotexist": "Маннык \"$1\" кыттааччы аата бэлиэтэниллибэтэх.",
        "nocontribs": "Эппит критерийгэр эппиэттиир уларытыылар көстүбэтилэр.",
        "uctop": "(билиҥҥи)",
        "month": "Ыйтан бэттэх:",
        "sp-contributions-newbies-sub": "Саҥа ааттартан",
        "sp-contributions-newbies-title": "Саҥа бэйэлэрин билиһиннэрбит дьон уларытыылара",
        "sp-contributions-blocklog": "Бобуу сурунаала",
+       "sp-contributions-suppresslog": "кыттааччы сотуллубут көннөрүүлэрэ",
        "sp-contributions-deleted": "кыттааччы сотуллубут көннөрүүлэрэ",
        "sp-contributions-uploads": "киллэриилэр",
        "sp-contributions-logs": "сурунааллар",
        "sp-contributions-search": "Кыттааччы оҥорбут уларытыыларын көрдөөһүн",
        "sp-contributions-username": "IP аадырыһа эбэтэр аата:",
        "sp-contributions-toponly": "Кэнники барыллары эрэ көрдөр",
+       "sp-contributions-newonly": "Саҥаттан оҥоһуллубут сирэйдэри эрэ көрдөр",
        "sp-contributions-submit": "Көрдөө",
        "whatlinkshere": "Манна сигэнэллэр",
        "whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] бобуллубут/хааччахтаммыт.<br />\n[[Special:BlockList|Бобуллубут IP-лар тиһиктэрин]] көр.",
        "ipb-blockingself": "Эн бэйэҕин хааччахтаан эрэҕин! Ону өйдүүгүн дуо?",
        "ipb-confirmhideuser": "Кытааччыны хааччахтаан уонна аатын кистээн эрэҕин. Аата мантан инньэ тиһиктэргэ уонна сурунаалларга көстүбэт буолуо. Бигэргэтэҕин дуо?",
+       "ipb-confirmaction": "Бигэргэтэр буоллаххына, манна бэлиэтээ «{{int:ipb-confirm}}».",
        "ipb-edit-dropdown": "Бобуу биричиинэтин уларыт",
        "ipb-unblock-addr": "$1 бобуутун суох гын",
        "ipb-unblock": "Кыттаачыны эбэтэр IP-ны бобуллубуттар испииһэктэриттэн таһаар",
        "range_block_disabled": "Дьаһабыллар диапазоннары боболлоро көҥүллэммэт.",
        "ipb_expiry_invalid": "Сатаммат кэми туруордуҥ.",
        "ipb_expiry_temp": "Аатын кистиэһиннээх бобуу больдьоҕо суох буолуохтаах.",
-       "ipb_hide_invalid": "Ð\91Ñ\83 Ð°Ð°Ñ\82Ñ\8b ÐºÐ¸Ñ\81Ñ\82ииÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а, Ð±Ð°Ò\95аÑ\80 ÐºÐ¸Ð½Ð¸ Ð°Ð°Ñ\82Ñ\8bÑ\82Ñ\82ан Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯ Ð¾Ò¥Ð¾Ò»Ñ\83ллÑ\83бÑ\83Ñ\82а Ð±Ñ\83олÑ\83о.",
+       "ipb_hide_invalid": "Ð\91Ñ\83 Ð°Ð°Ñ\82Ñ\8b ÐºÐ¸Ñ\81Ñ\82ииÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а, ÐºÐ¸Ð½Ð¸ Ð°Ð°Ñ\82Ñ\8bÑ\82Ñ\82ан {{PLURAL:$1|бииÑ\80 ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯|$1 ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯}} Ð¾Ò¥Ð¾Ò»Ñ\83ллÑ\83бÑ\83Ñ\82.",
        "ipb_already_blocked": "\"$1\" номнуо бобуллубут",
        "ipb-needreblock": "$1 бэлиэр хааччахтаммыт. Хааччахтааһын туруорууларын уларытыаххын баҕараҕын дуо?",
        "ipb-otherblocks-header": "Атын {{PLURAL:$1|хааччахтааһын|хааччахтааһыннар}}",
        "allmessages-prefix": "Префиксынан сиидэлиир:",
        "allmessages-language": "Тыла:",
        "allmessages-filter-submit": "Көс",
+       "allmessages-filter-translate": "Тылбаас",
        "thumbnail-more": "Улаатыннар",
        "filemissing": "Билэ көстүбэтэ",
        "thumbnail_error": "Кыра ойууну оҥоруу сатаммата: $1",
        "thumbnail_image-type": "Маннык ойуу көрүҥэ манна туттуллубат",
        "thumbnail_gd-library": "GD бибилитиэкэ толору конфигурацията суох, бу функция суох: $1",
        "thumbnail_image-missing": "Арааһа бу билэ суох быһыылаах: $1",
+       "thumbnail_image-failure-limit": "Эскииһи наһаа элбэхтик киллэрэ сатаатыҥ ($1 төгүл, биитэр өссө элбэх). Бука диэн, кэлин хатылаан көрөөр.",
        "import": "Сирэйдэри импортааһын",
        "importinterwiki": "Биики ыккардынааҕы импорт",
        "import-interwiki-text": "Биикини уонна импортанар сирэй аатын киллэр.\nУларытыылар күннэрэ-ыйдара уонна аапптардар ааттара оннуларынан хаалыахтара.\nБиики ыккардынааҕы импорт дьайыылара [[Special:Log/import|аналлаах сурунаалга]] суруллаллар.",
        "importuploaderrortemp": "Хачайдааhын тохтотулунна. Быстах кэмҥэ уурар сир көстүбэтэ.",
        "import-parse-failure": "Импортааһын кэмигэр ошибка разбора XML",
        "import-noarticle": "Импортанар сирэй суох!",
-       "import-nonewrevisions": "ТÑ\83оÑ\85 Ð±Ð°Ð°Ñ\80 Ñ\82оÑ\80Ñ\83мнаÑ\80 Ð±Ñ\83 Ð¸Ð½Ð½Ð¸Ð½Ñ\8d Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82аммÑ\8bÑ\82Ñ\82аÑ\80/импоÑ\80Ñ\82аннÑ\8bлаÑ\80.",
+       "import-nonewrevisions": "Ð\91ииÑ\80 Ð´Ð° Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82аммаÑ\82а (бÑ\83 Ð¸Ð½Ð½Ð¸Ð½Ñ\8d Ñ\82аҥаÑ\81Ñ\82аммÑ\8bÑ\82Ñ\82аÑ\80, Ð±Ð¸Ð¸Ñ\82Ñ\8dÑ\80 Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 Ð±Ñ\83олан ÐºÓ©Ñ\82Ò¯Ñ\82үллүбүÑ\82Ñ\82Ñ\8dÑ\80).",
        "xml-error-string": "$1 - $2 строка, $3 колонка ($4 байт): $5",
        "import-upload": "XML-дааннайдары киллэр",
        "import-token-mismatch": "Арахсан хаалбыт. Өссө киирэн көр.",
        "pageinfo-length": "Сирэй устата (баайтынан)",
        "pageinfo-article-id": "Сирэй нүөмэрэ",
        "pageinfo-language": "Сирэй омугун тыла",
-       "pageinfo-robot-policy": "Көрдүүр сулууспалар туруктара",
-       "pageinfo-robot-index": "Индекстанар",
-       "pageinfo-robot-noindex": "Индекстаммат",
+       "pageinfo-content-model": "Сирэй иһинээҕитин модела",
+       "pageinfo-robot-policy": "Роботтар көрдөөһүннэрин туруга",
+       "pageinfo-robot-index": "Көҥүллэммит",
+       "pageinfo-robot-noindex": "Араарыллыбыт",
        "pageinfo-views": "Көрүү ахсаана",
        "pageinfo-watchers": "Кэтээнэр сирэйдэр ахсааннара",
        "pageinfo-few-watchers": "$1 кыттааччыттан аҕыйах кэтээччи",
        "svg-long-desc": "SVG билэ, номинальнай кээмэйэ $1 × $2 пииксэл, билэ кээмэйэ: $3",
        "svg-long-desc-animated": "$1 × $2 пииксэллээх анимацияламмыт SVG-билэ, кээмэйэ: $3",
        "svg-long-error": "Алҕастаах SVG-билэ: $1",
-       "show-big-image": "Ð\9eйÑ\83Ñ\83 Ð±Ñ\8dйÑ\8dÑ\82ин Ñ\82олоÑ\80Ñ\83 ÐºÑ\8dÑ\8dмÑ\8dйэ",
+       "show-big-image": "Ð\91илÑ\8d Ð±Ñ\8dйÑ\8dÑ\82э",
        "show-big-image-preview": "Бигэргэтиэх иннинэ көрүү улахана: $1.",
        "show-big-image-other": "Атын {{PLURAL:$2|түмүк|түмүктэр}}: $1.",
        "show-big-image-size": "$1 × $2 пииксэл",
        "exif-compression-3": "CCITT Group 3, факс куодтааһына",
        "exif-compression-4": "CCITT Group 4, факс куодтааһына",
        "exif-copyrighted-true": "Ааптар быраабынан араҥаччыланар",
-       "exif-copyrighted-false": "Ð\91аÑ\80-дÑ\8cон Ð±Ð°Ñ\81 Ð±Ð¸Ð»Ð¸Ð¸Ñ\82Ñ\8d",
+       "exif-copyrighted-false": "Ð\91аÑ\81 Ð±Ð¸Ð»Ð¸Ð¸Ñ\82Ñ\8d Ñ\87опÑ\87Ñ\83ламмаÑ\82аÑ\85",
        "exif-unknowndate": "Күнэ-ыйа биллибэт",
        "exif-orientation-1": "Нуорма",
        "exif-orientation-2": "Сытыары көстүбүт",
        "confirmemail_subject": "{{SITENAME}}: эл. почта аадырыһын бигэргэтии",
        "confirmemail_body": "Ким эрэ, баҕар эн буолуо бу IP-ттан: $1, {{SITENAME}} сиэрбэригэр\n«$2» диэн ааты бэлиэтээтэ уонна бу электроннай аадырыһы ыйда.\n\nМаны сөбүлэһэр буоллаххына бу ыйынньыгы: $3 баттаан\n{{SITENAME}} аадырыскын туһанарын көҥүллүүргүн бигэргэт (болдьоҕо $4 дылы).\n\nОттон бу туһунан тугу да билбэт буоллаххына бу ыйынньыгынан баран эл. почтаҕын сотон кэбис:\n\n$5",
        "confirmemail_body_changed": "Ким эрэ (баҕар эн буолуо) маннык IP-ттан: $1\nбу аадырыһы «$2» диэн {{SITENAME}} кыттаччыта бэйэтин саҥа аадырыһын курдук эттэ.\n\nБу кытааччы аата кырдьык эйиэнэ буоларын бигэргэтэр буоллаххына,\nуонна {{SITENAME}} саайтан эйиэхэ сурук кэлэрин сөбүлэһэр буоллаххына, аллара баар сигэни арый.\n\n$3\n\nӨскө бу аат эйиэхэ сыһыана суох буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
-       "confirmemail_body_set": "Ð\9aим Ñ\8dÑ\80Ñ\8d (баÒ\95аÑ\80 Ñ\8dн Ð±Ñ\83олÑ\83о) Ð¼Ð°Ð½Ð½Ñ\8bк IP-Ñ\82Ñ\82ан: $1\nбÑ\83 Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Â«$2» Ð´Ð¸Ñ\8dн {{SITENAME}} ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82а Ð±Ñ\8dйÑ\8dÑ\82ин Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8bн ÐºÑ\83Ñ\80дÑ\83к Ñ\8dÑ\82Ñ\82Ñ\8d.\n\nÐ\91Ñ\83 ÐºÑ\8bÑ\82ааÑ\87Ñ\87Ñ\8b ÐºÑ\8bÑ\80дÑ\8cÑ\8bк Ð­Ð½ Ð±Ñ\8dйÑ\8dÒ¥ Ð±Ñ\83олаÑ\80Ñ\8bн Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна,\nÑ\83онна {{SITENAME}} Ñ\81аайÑ\82ан Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\83Ñ\80Ñ\83к ÐºÑ\8dлÑ\8dÑ\80ин Ñ\81өбүлÑ\8dÒ»Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ð°Ð»Ð»Ð°Ñ\80а Ð±Ð°Ð°Ñ\80 Ñ\81игÑ\8dни Ð±Ð°Ñ\82Ñ\82аа:\n\n$3\n\nÓ¨Ñ\81кө Ð±Ñ\83 Ð°Ð°Ñ\82 Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\8bÒ»Ñ\8bана Ñ\81Ñ\83оÑ\85 буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат:\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
+       "confirmemail_body_set": "Ð\9aим Ñ\8dÑ\80Ñ\8d (баÒ\95аÑ\80 Ñ\8dн Ð±Ñ\83олÑ\83о) Ð¼Ð°Ð½Ð½Ñ\8bк IP-Ñ\82Ñ\82ан: $1\nбÑ\83 Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Â«$2» Ð´Ð¸Ñ\8dн {{SITENAME}} ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82а Ð±Ñ\8dйÑ\8dÑ\82ин Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8bн ÐºÑ\83Ñ\80дÑ\83к Ñ\8dÑ\82Ñ\82Ñ\8d.\n\nÐ\9cанÑ\8b Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна,\nÑ\83онна {{SITENAME}} Ñ\81иÑ\82им-Ñ\81иÑ\80иÑ\82Ñ\82Ñ\8dн Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\83Ñ\80Ñ\83к ÐºÑ\8dлÑ\8dÑ\80ин Ñ\81өбүлÑ\8dÒ»Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ð°Ð»Ð»Ð°Ñ\80а Ð±Ð°Ð°Ñ\80 Ñ\81игÑ\8dни Ð±Ð°Ñ\82Ñ\82аа:\n\n$3\n\nÓ¨Ñ\81кө Ð±Ñ\83 Ð°Ð°Ñ\82 Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\8bÒ»Ñ\8bана *Ñ\81Ñ\83оÑ\85* буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат:\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
        "confirmemail_invalidated": "Электроннай почта аадырыһын бигэргэтиини суох оҥоһулунна",
        "invalidateemail": "Эл. почта бигэргэтээһинин араарга",
        "scarytranscludedisabled": "[Interwiki transcluding араҕыста]",
        "confirm-watch-top": "Бу сирэйи кэтээһин тиһигэр киллэрэҕин дуо?",
        "confirm-unwatch-button": "Сөп",
        "confirm-unwatch-top": "Бу сирэйи кэтээһин тиһигиттэн сотоҕун дуо?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← инники сирэй",
        "imgmultipagenext": "аныгыскы сирэй →",
        "imgmultigo": "Көс!",
        "imgmultigoto": "Бу сирэйгэ көс $1",
+       "img-lang-default": "(эппэтэххэ талыллар тыла)",
+       "img-lang-info": "Бу ойууну $1 тылынан көрдөр. $2",
+       "img-lang-go": "Толор",
        "ascending_abbrev": "улаатыннар",
        "descending_abbrev": "кыччат",
        "table_pager_next": "Аныгыскы сирэй",
        "version-hook-name": "Перехватчик аата",
        "version-hook-subscribedby": "Суруттарыыта:",
        "version-version": "(Торум $1)",
-       "version-license": "Лиссиэнзийэ",
+       "version-license": "MediaWiki лиссиэнсийэтэ",
+       "version-ext-license": "Лиссиэнсийэ",
+       "version-ext-colheader-name": "Кэтирэтии",
+       "version-ext-colheader-version": "Барыл",
+       "version-ext-colheader-license": "Лиссиэнсийэ",
+       "version-ext-colheader-description": "Быһаарыыта",
+       "version-ext-colheader-credits": "Ааптардар",
+       "version-license-title": "$1 аналлаах лиссиэнсийэ",
+       "version-license-not-found": "Бу кэҥэтии лиссиэнсийэтин туһунан сиһилии суруллубутах.",
+       "version-credits-title": "$1 ааптардарын тиһигэ",
+       "version-credits-not-found": "Бу кэҥэтии ааптардарын туһунан сиһилии суруллубутах.",
        "version-poweredby-credits": "Бу биики бу движокка олоҕурар '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "атыттар",
        "version-poweredby-translators": "translatewiki.net тылбаасчыттара",
        "version-entrypoints": "Киирэр аадырыстар (URL)",
        "version-entrypoints-header-entrypoint": "Киирии сирэ",
        "version-entrypoints-header-url": "URL",
-       "redirect": "Билэттэн, кыттааччыттан эбэтэр барыл идентификаторыттан утаарыы",
+       "redirect": "Билэттэн, кыттааччыттан, сирэйтэн эбэтэр барыл идентификаторыттан утаарыы",
        "redirect-legend": "Билэҕэ эбэтэр сирэйгэ утаарыы",
+       "redirect-summary": "Бу аналлаах сирэй билэҕэ (билэ аатыттан), сирэйгэ (барыл эбэтэр сирэй идентификааторыттан) эбэтэр кыттааччы сирэйигэр (кыттааччы идентификаторыттан) утаарар. Туһаныы: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]] эбэтэр\n[[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Толор",
        "redirect-lookup": "Көрдөт:",
        "redirect-value": "Суолтата:",
        "redirect-user": "Кыттааччы нүөмэрэ",
+       "redirect-page": "Сирэй нүөмэрэ",
        "redirect-revision": "Сирэй барыла",
        "redirect-file": "Билэ аата",
        "redirect-not-exists": "Суолта көстүбэтэ",
        "fileduplicatesearch-result-n": "\"$1\" билэ {{PLURAL:$2|1 хатылааһыннаах эбит|$2 хатылааһыннардаах эбит}}.",
        "fileduplicatesearch-noresults": "«$1» диэн билэ суох эбит.",
        "specialpages": "Анал сирэйдэр",
-       "specialpages-note": "* Көннөрү анал сирэйдэр.\n* <strong class=\"mw-specialpagerestricted\">Хааччахтардаах анал сирэйдэр.</strong>\n* <span class=\"mw-specialpagecached\">Кээстэммит анал сирэйдэр (эргэрбит буолуохтарын сөп).</span>",
+       "specialpages-note-top": "Легендата",
+       "specialpages-note": "* Көннөрү анал сирэйдэр.\n* <span class=\"mw-specialpagerestricted\">Хааччахтардаах анал сирэйдэр.</span>",
        "specialpages-group-maintenance": "Техническэй отчуоттар",
        "specialpages-group-other": "Атын аналлаах сирэйдэр",
        "specialpages-group-login": "Киирии / бэлиэтэнии",
        "tags-tag": "Бэлиэ (тиэк) аата",
        "tags-display-header": "Уларыйыы тиһиктэригэр хайдах көстөрө",
        "tags-description-header": "Суолта толору ис хоһооно",
+       "tags-active-header": "Үлэлиир дуо?",
        "tags-hitcount-header": "Бэлиэтэммит бэлиэлэр",
+       "tags-active-yes": "Сөп",
+       "tags-active-no": "Суох",
        "tags-edit": "уларытыы",
        "tags-hitcount": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "comparepages": "Сирэйдэри тэҥнииргэ",
        "dberr-problems": "Баалаама! Бу саайт техническэй ыарахаттары көрсүбүт.",
        "dberr-again": "Аҕыйах мүнүүтэннэн саҥардан көрөөр.",
        "dberr-info": "(Билэ тиһигин кытта ситим быстыбыт: $1)",
+       "dberr-info-hidden": "(Билэ тиһигин кытта ситим суох)",
        "dberr-usegoogle": "Онуоха-маныаха дылы Google көмөтүнэн көрдүөххүн сөп.",
        "dberr-outofdate": "Индэксэ эргэрбит буолуон сөбүн умнума.",
        "dberr-cachederror": "Сирэй кээштэммит барыла көстөр, баҕар эргэрбит буолуон сөп.",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
        "logentry-delete-restore": "$3 сирэйи $1 сөргүппүт",
        "logentry-delete-event": "Сурунаал $5 суругун көстүүтүн манна $3 $1 уларыппыт: $4",
-       "logentry-delete-revision": "Сурунаал $5 суругун көстүүтүн бу сирэйгэ $3 $1 уларыппыт: $4",
+       "logentry-delete-revision": "$3 сирэй $5 барылын көстүүтүн бу сирэйгэ $1 уларыппыт: $4",
        "logentry-delete-event-legacy": "$3 сурунаал суруктарын көстүүтүн $1 уларыппыт",
        "logentry-delete-revision-legacy": "$3 сирэй барылларын көстүүтүн $1 уларыппыт",
        "logentry-suppress-delete": "$3 сирэйи $1 баттаабыт",
        "api-error-overwrite": "Баар билэни уларытар сатаммат.",
        "api-error-stashfailed": "Ис алҕас: сиэрбэр быстах кэмҥэ оҥоһуллубут билэни кыайан бигэргэппэтэх.",
        "api-error-publishfailed": "Ис алҕас: сиэрбэр быстах билэни кыайан бигэргэппэтэх.",
+       "api-error-stasherror": "Билэни угарга алҕас таҕыста.",
        "api-error-timeout": "Сиэрбэр кэтэһэр кэмҥэ хоруйдаабата.",
        "api-error-unclassified": "Биллибэт алҕас таҕыста",
        "api-error-unknown-code": "Биллибэт алҕас: «$1»",
        "duration-centuries": "$1 үйэ",
        "duration-millennia": "$1 тыһыынча сыл",
        "rotate-comment": "Ойуу $1 кыраадыс чаһы хоту эргитиллибит",
+       "limitreport-title": "Анализатор дааннайдара:",
+       "limitreport-cputime": "Процессору туһаныы",
+       "limitreport-cputime-value": "$1 сөкүүндэ",
        "expandtemplates": "Халыыптары тэнитии",
        "expand_templates_intro": "Бу аналлаах сирэй тиэкиһи уларытарытарыгар туох баар халыыптары тэнитэн көрдөрөр.\nПарсер функциялара эмиэ тэнитиллэллэр. Холобур, <nowiki>{{</nowiki>#language:...}} уонна переменнайдар <nowiki>{{</nowiki>CURRENTDAY}} уо.&nbsp;д.&nbsp;а. — уопсайынан, хос фигурнай скобка иһигэр баар барыта.\nБу дьайыы сыыһата суох, MediaWiki көмөтүнэн оҥоһуллар.",
        "expand_templates_title": "{{FULLPAGENAME}} сирэй аата уонна да атын сибидиэнньэлэр:",
index 9d532d8..abd6249 100644 (file)
        "pageswithprop-prophidden-binary": "dvojiška vrednost lastnosti je skrita ($1)",
        "doubleredirects": "Dvojne preusmeritve",
        "doubleredirectstext": "Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.\nVsaka vrstica vsebuje povezavo do prve in druge preusmeritve, kakor tudi do cilja druge preusmeritve, ki je po navadi »prava« ciljna stran, na katero naj bi kazala prva preusmeritev.\n<del>Prečrtani</del> vnosi so bili razrešeni.",
-       "double-redirect-fixed-move": "Stran [[$1]] je bil premaknjen.\nSedaj je preusmeritev na [[$2]].",
-       "double-redirect-fixed-maintenance": "Popravljanje dvojne preusmeritve z [[$1]] na [[$2]].",
+       "double-redirect-fixed-move": "Stran [[$1]] smo premaknili.\nSamodejno smo jo posodobili in sedaj se preusmerja na [[$2]].",
+       "double-redirect-fixed-maintenance": "Samodejno popravljanje dvojne preusmeritve z [[$1]] na [[$2]] v vzdrževalnem delu.",
        "double-redirect-fixer": "Popravljalec preusmeritev",
        "brokenredirects": "Pretrgane preusmeritve",
        "brokenredirectstext": "Naslednje preusmeritve kažejo na neobstoječe strani:",
index 002b191..7975755 100644 (file)
        "summary-preview": "Преглед описа:",
        "subject-preview": "Преглед теме/наслова:",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "'''Ваше корисничко име или ИП адреса је блокирана.'''\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог: ''$2''.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници|кориснику}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ИБ $5.\nНаведите све податке изнад при стварања било каквих упита.",
+       "blockedtext": "<strong>Ваше корисничко име или ИП адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог: <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварања било каквих упита.",
        "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$1|блокирао|блокирала|блокирао}} $1.\nРазлог:\n\n:''$2''\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$1|кориснику|корисници|кориснику}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ИБ $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
index c40efa6..3ef87fe 100644 (file)
        "summary-preview": "Pregled opisa:",
        "subject-preview": "Pregled teme/naslova:",
        "blockedtitle": "Korisnik je blokiran",
-       "blockedtext": "'''Vaše korisničko ime ili IP adresa je blokirana.'''\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: ''$2''.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici|korisniku}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a IB $5.\nNavedite sve podatke iznad pri stvaranja bilo kakvih upita.",
+       "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: <em>$2</em>.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a ID blokiranja $5.\nNavedite sve podatke iznad pri stvaranja bilo kakvih upita.",
        "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$1|blokirao|blokirala|blokirao}} $1.\nRazlog:\n\n:''$2''\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$1|korisniku|korisnici|korisniku}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a IB $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
index 0467a43..e32da15 100644 (file)
        "pageswithprop-prophidden-binary": "dold binärt egenskapsvärde ($1)",
        "doubleredirects": "Dubbla omdirigeringar",
        "doubleredirectstext": "Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor. \nVarje rad innehåller länkar till den första och andra omdirigeringsidan, samt till målet för den andra omdirigeringen. Målet för den andra omdirigeringen är ofta den \"riktiga\" sidan, som den första omdirigeringen egentligen ska leda till.\n<del>Överstrukna</del> poster har åtgärdats.",
-       "double-redirect-fixed-move": "[[$1]] har flyttats, och är nu en omdirigering till [[$2]]",
-       "double-redirect-fixed-maintenance": "Fixar dubbel omdirigering från [[$1]] till [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] har flyttats.\nDen uppdaterades automatiskt och är nu en omdirigering till [[$2]].",
+       "double-redirect-fixed-maintenance": "Fixar automatiskt dubbel omdirigering från [[$1]] till [[$2]] i ett underhållsjobb.",
        "double-redirect-fixer": "Omdirigeringsrättaren",
        "brokenredirects": "Trasiga omdirigeringar",
        "brokenredirectstext": "Följande omdirigeringar länkar till ej existerande sidor:",
index 72cb110..fcd9dcc 100644 (file)
        "virus-unknownscanner": "hindi kilalang panlaban sa birus:",
        "logouttext": "<strong>Nakaalis ka na sa pagkaka-login.</strong>\n\nTandaan na may ilang mga pahina na patuloy na nagpapakita na parang hindi ka naka-login, hanggang alisin mo ang iyong <i>browser cache</i>.",
        "welcomeuser": "Mabuhay, $1!",
-       "welcomecreation-msg": "Nilikha na ang iyong kuwenta.\nHuwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].",
+       "welcomecreation-msg": "Nilikha na ang iyong account.\nHuwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].",
        "yourname": "Bansag:",
        "userlogin-yourname": "Pangalan",
        "userlogin-yourname-ph": "Ilagay ang iyong pangalan",
        "userlogin-signwithsecure": "Gumamit ng ligtas na koneksyon",
        "yourdomainname": "Dominyo mo:",
        "password-change-forbidden": "Hindi mo maaaring palitan ang mga password sa wiking ito.",
-       "externaldberror": "Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.",
+       "externaldberror": "Maaaring may kamalian sa pagpapatotoo ng database o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na account.",
        "login": "Lumagda",
        "nav-login-createaccount": "Lumagda / lumikha ng account",
        "loginprompt": "Dapat na pinapahintulutan mo ang mga kuki (''cookie'') upang makalagda sa {{SITENAME}}.",
        "logout": "Umalis sa pagkakalagda",
        "userlogout": "Umalis sa pagkakalagda",
        "notloggedin": "Hindi nakalagda",
-       "userlogin-noaccount": "Wala ka pa bang akawnt?",
+       "userlogin-noaccount": "Wala ka pa bang account?",
        "userlogin-joinproject": "Sumali sa {{SITENAME}}",
        "nologin": "Wala ka pang account? $1.",
        "nologinlink": "Lumikha ng account",
-       "createaccount": "Lumikha ng akawnt",
+       "createaccount": "Lumikha ng account",
        "gotaccount": "May account ka na ba? $1.",
        "gotaccountlink": "Lumagda",
        "userlogin-resetlink": "Nakalimutan mo ang iyong mga detalyeng pang-login?",
        "userlogin-resetpassword-link": "Nakalimutan ba ang iyong password?",
        "userlogin-helplink2": "Tulong sa pag-login",
        "userlogin-loggedin": "Naka-login ka na bilang {{GENDER:$1|$1}}. Gamitin ang form sa ibaba upang maka-login bilang ibang tagagamit o user.",
-       "userlogin-createanother": "Lumikha ng iba pang akawnt",
+       "userlogin-createanother": "Lumikha ng iba pang account",
        "createacct-join": "Ilagay ang iyong impormasyon sa ibaba.",
-       "createacct-another-join": "Ilagay ang impormasyon ng bagong akawnt sa ibaba.",
+       "createacct-another-join": "Ilagay ang impormasyon ng bagong account sa ibaba.",
        "createacct-emailrequired": "Direksiyong e-liham:",
        "createacct-emailoptional": "Email (hindi kailangan)",
        "createacct-email-ph": "Ipasok ang iyong email address",
        "createacct-realname": "Tunay na pangalan (maaaring wala)",
        "createaccountreason": "Dahilan:",
        "createacct-reason": "Dahilan",
-       "createacct-reason-ph": "Bakit ka gagawa ng isa pang akawnt?",
+       "createacct-reason-ph": "Bakit ka gagawa ng isa pang account?",
        "createacct-captcha": "Siyasatin ang seguridad",
        "createacct-imgcaptcha-ph": "Ilagay ang tekstong makikita sa itaas.",
-       "createacct-submit": "Likhain ang iyong akawnt",
-       "createacct-another-submit": "Lumikha ng ibang akawnt",
+       "createacct-submit": "Likhain ang iyong account",
+       "createacct-another-submit": "Lumikha ng ibang account",
        "createacct-benefit-heading": "{{SITENAME}} ay nilikha ng mga taong iyong katulad.",
        "createacct-benefit-body1": "{{PLURAL:$1|pagbabago|mga pagbabago}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pahina|mga pahina}}",
        "badretype": "Hindi magkatugma ang ipinasok mong mga password.",
        "userexists": "May gumagamit na ng ipinasok na bansag.\nPumili po ng ibang pangalan.",
        "loginerror": "Kamalian sa paglagda",
-       "createacct-error": "May pagkakamali sa paglikha ng akawnt",
+       "createacct-error": "May pagkakamali sa paglikha ng account",
        "createaccounterror": "Hindi mailikha ang account: $1",
-       "nocookiesnew": "Nalikha ang kuwenta ng tagagamit, ngunit hindi ka nakalagda.\nGumagamit ang {{SITENAME}} ng mga kuki (''cookies'') upang makalagda ang mga tagagamit.\nHindi pinapagana ng pambasa-basa mo ang mga kuki.\nPaganahin ito ang subukang lumagda na kasama ang bagong bansag (''username'') at hudyat (''password'').",
+       "nocookiesnew": "Nalikha ang account ng tagagamit, ngunit hindi ka nakalogin.\nGumagamit ang {{SITENAME}} ng cookies upang makalogin ang mga tagagamit.\nHindi pinapagana ng browser mo ang cookies.\nPaganahin ito at subukang lumagda na kasama ang bagong pangalan at password.",
        "nocookieslogin": "Gumagamit ang {{SITENAME}} ng mga kuki (''cookies'') para mailagda ang mga tagagamit.\nHindi mo pinagagana ang mga kuki.\nPaki-andar mo ang mga ito at sumubok uli.",
-       "nocookiesfornew": "Hindi nalikha ang kuwenta ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito. \nTiyaking mayroon kang pinagaganang mga kuki, ikarga muli ang pahinang ito at subukan muli.",
+       "nocookiesfornew": "Hindi nalikha ang account ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito. \nTiyaking mayroon kang pinagaganang cookies, ikarga muli ang pahinang ito at subukan muli.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Hindi mo tinukoy ang isang tanggap na pangalan ng tagagamit.",
        "loginsuccesstitle": "Matagumpay ang paglagda",
        "loginsuccess": "'''Nakalagda ka na sa {{SITENAME}} bilang si \"$1\".'''",
-       "nosuchuser": "Walang tagagamit na may pangalang \"$1\".\nMaselan sa pagtitipa ang mga pangalan ng tagagamit.\nSuriin ang iyong pagbabaybay, o [[Special:UserLogin/signup|lumikha ng bagong kuwenta]].",
+       "nosuchuser": "Walang tagagamit na may pangalang \"$1\".\nMaselan sa pagtitipa ang mga pangalan ng tagagamit.\nSuriin ang iyong pagbabaybay, o [[Special:UserLogin/signup|lumikha ng bagong account]].",
        "nosuchusershort": "Walang tagagamit na may pangalang \"$1\".\nPakitingnan ang iyong pagbabaybay.",
        "nouserspecified": "Kailangang tukuyin mo ang isang pangalang pantagagamit.",
        "login-userblocked": "Hinarang ang tagagamit na ito.  Hindi pinahihintulutan ang paglalagda.",
        "noemailcreate": "Kailangan mong magbigay ng may-bisang direksiyong e-liham",
        "passwordsent": "Isang bagong hudyat ang ipinadala sa adres ng e-liham na nakatala para kay \"$1\".\nLumagda/Tumala lang po muli pagkaraan mong matanggap ito.",
        "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.",
-       "eauthentsent": "Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.\nBago magpadala ng iba email sa akawnt, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang akawnt.",
+       "eauthentsent": "Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.\nBago magpadala ng iba email sa account, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang account.",
        "throttled-mailpassword": "Nagpadala na ng isang paalalang pang-password, nitong huling {{PLURAL:$1|oras|$1 oras}}.\nPara maiwasin ang pangaabuso, isang paalalang pang-password lamang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.",
        "mailerror": "Kamalian sa pagpapadala ng liham: $1",
-       "acct_creation_throttle_hit": "Ang mga panauhin sa wiking ito na gumagamit ng direksiyong IP mo ay nakalikha na ng {{PLURAL:$1|1 kuwenta|$1 kuwenta}} sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.\nBilang kinalabasan, ang mga panauhing gumagamit ng ganitong direksiyong IP ay hindi na muna makakalikha ng anumang karagdagang kuwenta sa ngayon.",
+       "acct_creation_throttle_hit": "Ang mga panauhin sa wiking ito na gumagamit ng IP address mo ay nakalikha na ng $1 account sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.\nBilang kinalabasan, ang mga panauhing gumagamit ng ganitong IP address ay hindi na muna makakalikha ng anumang karagdagang account sa ngayon.",
        "emailauthenticated": "Napatunayan na ang iyong email address sa $2 noong $3.",
        "emailnotauthenticated": "Hindi pa napapatunayan ang iyong email address.\nWalang email na ipapadala para sa anumang sumusunod na mga tampok o features.",
        "noemailprefs": "Tumukoy ng isang direksiyong e-liham sa loob ng mga nais mo upang gumana ang mga kasangkapang-katangiang ito.",
        "cannotchangeemail": "Hindi maaaring baguhin ang mga direksiyong e-liham sa wiking ito.",
        "emaildisabled": "Ang sityong ito ay hindi makapagpapadala ng mga e-liham.",
        "accountcreated": "Nilikha na ang account",
-       "accountcreatedtext": "Nilikha na ang kuwenta ng tagagamit para kay [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]).",
+       "accountcreatedtext": "Nilikha na ang account ng tagagamit para kay [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]).",
        "createaccount-title": "Paglikha ng account para sa {{SITENAME}}",
-       "createaccount-text": "May lumikha ng kuwenta para sa iyong adres ng e-liham sa {{SITENAME}} ($4) na pinangalanang \"$2\", na may hudyat na \"$3\".\nDapat kang tumala at baguhin ang hudyat mo ngayon.\n\nMaaari mong huwag pansinin ang mensaheng ito, kung mali ang paglikha ng kuwentang ito.",
+       "createaccount-text": "May lumikha ng account para sa iyong email address sa {{SITENAME}} ($4) na pinangalanang \"$2\", na may password na \"$3\".\nDapat kang mag-login at baguhin ang password mo ngayon.\n\nMaaari mong huwag pansinin ang mensaheng ito, kung mali ang paglikha ng account na ito.",
        "login-throttled": "Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.\nMaghintay po muna ng $1 bago subukan uli.",
        "login-abort-generic": "Bigo ang paglagda mo - Pinigil",
        "loginlanguagelabel": "Wika: $1",
        "createacct-another-realname-tip": "Hindi kinakailangan ang tunay na pangalan.\nKung nais mo na ibigay ito, gagamitin ito para sa pagbibigay ng atribusyon para sa kanilang gawa.",
        "pt-login": "Mag-login",
        "pt-login-button": "Mag-login",
-       "pt-createaccount": "Lumikha ng akawnt",
+       "pt-createaccount": "Lumikha ng account",
        "pt-userlogout": "Umalis sa pagkakatala",
        "php-mail-error-unknown": "Hindi malamang kamalian sa tungkulin ng liham ng PHP ()",
        "user-mail-no-addy": "Sinubukang magpadala ng e-liham na walang tirahan na para sa e-liham.",
        "changepassword": "Baguhin ang password",
        "resetpass_announce": "Para sa ganap na pagtala, magtalaga ng panibagong password.",
        "resetpass_text": "<!-- Magdagdag ng teksto rito -->",
-       "resetpass_header": "Baguhin ang password ng akawnt",
+       "resetpass_header": "Baguhin ang password ng account",
        "oldpassword": "Lumang password:",
        "newpassword": "Bagong password:",
        "retypenew": "Ipasok muli ang bagong password:",
        "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang e-liham (may pansamantalang hudyat) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
        "passwordreset-email": "Direksiyong e-liham:",
        "passwordreset-emailtitle": "Mga detalye ng account sa {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng kuwenta para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|akawant ng tagagamit ay|mga akawnt ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang mga pansamantalang hudyat na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
+       "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
        "passwordreset-emailtext-user": "Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang paalala ng iyong mga akawnt ng detalye para sa {{SITENAME}}\n($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang pansamantalang mga hudyat na ito}} mawawalan ng bias sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.\nDapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang iyong orihinal na hudyat, at hindi mo na nais palitan pa ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng iyong lumang hudyat.",
        "passwordreset-emailelement": "Pangalan ng tagagamit: $1\nPansamantalang password: $2",
        "passwordreset-emailsent": "Naipadala na ang isang e-liham na pampaalala.",
        "accmailtext": "Ipinadala na sa $2 ang isang hudyat na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ng hudyat]]'' kapag lumagdang papasok.",
        "newarticle": "(Bago)",
        "newarticletext": "Sinundan mo ang isang kawing para sa isang pahinang hindi pa umiiral.\nPara likhain ang pahina, magsimulang magmakinilya sa loob ng kahong nasa ibaba (tingnan ang [$1 pahina ng tulong] para sa mas maraming kabatiran).\nKung napunta ka rito dahil sa pagkakamali, pakipindot ang pinduntang '''balik''' ('''''back''''') ng iyong pantingin-tingin (''browser'').",
-       "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng kuwenta, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na direksiyonng IP para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  direksiyong IP.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:UserLogin/signup|pakilikha ng isang kuwenta]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
+       "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng account, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na IP address para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  IP address.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:UserLogin/signup|pakilikha ng isang account]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
        "noarticletext": "Kasalukuyang walang teksto sa loob ng pahinang ito.\nMaaari mong [[Special:Search/{{PAGENAME}}|hanapin ang pamagat ng pahinang ito]] sa loob iba pang mga pahina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa kaugnay na mga talaan],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} baguhin ang pahinang ito]</span>.",
        "noarticletext-nopermission": "Kasalukuyang walang teksto sa pahinang ito.\nMaaari mong [[Special:Search/{{PAGENAME}}|hanapin ang pamagat ng pahinang ito]] sa ibang mga pahina,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa kaugnay na mga talaan]</span>.",
        "missing-revision": "Hindi umiiral ang rebisyong #$1 ng pahinang napangalanang \"{{FULLPAGENAME}}\".\n\nKaraniwang itong dulot ng pagsunod sa isang wala na sa panahong kawing ng kasaysayan na papunta sa isang pahinang nabura na.\nMatatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
-       "userpage-userdoesnotexist": "Hindi nakatala ang kuwenta ng tagagamit na \"<nowiki>$1</nowiki>\".\nPakisuri kung ibig mong likhain/baguhin ang pahinang ito.",
-       "userpage-userdoesnotexist-view": "Hindi nakatala ang kuwenta ng tagagamit na \"$1\".",
+       "userpage-userdoesnotexist": "Hindi nakatala ang account ng tagagamit na \"<nowiki>$1</nowiki>\".\nPakisuri kung ibig mong likhain/baguhin ang pahinang ito.",
+       "userpage-userdoesnotexist-view": "Hindi nakatala ang account ng tagagamit na \"$1\".",
        "blocked-notice-logextract": "Kasalukuyang hinarang ang tagagamit na ito.\nAng pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa baba para sa inyong pagsasangguni:",
        "clearyourcache": "'''Paunawa: Pagkatapos magsagip, maaaring kailanganing mong laktawan ang taguan ng iyong pantingin-tingin upang makita ang mga pagbabago.\n'''Firefox / Safari:''' Panatilihin ang pagpindot sa ''Shift'' habang nilalagitik ang ''Reload'', o pindutin ang ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sa isang Mac)\n'''Google Chrome:''' Pindutin ang ''Ctrl-Shift-R'' (''⌘-Shift-R'' sa isang Mac)\n'''Internet Explorer:''' Panatilihin ang pagpindot sa ''Ctrl'' habang nilalagitik ang ''Refresh'', o pindutin ang ''Ctrl-F5''\n'''Opera:''' Hawiin ang taguan sa loob ng ''Tools → Preferences''",
        "usercssyoucanpreview": "'''Balato:''' Gamitin ang pindutang \"{{int:showpreview}}\" upang masubok ang bago mong CSS bago sagipin.",
        "hiddencategories": "Ang pahinang ito ay kasapi sa {{PLURAL:$1|1 nakatagong kategorya|$1 nakatagong kategorya}}:",
        "edittools": "<!-- Ang teksto rito ay ipapakita sa ilalim ng mga pormularyo ng pagbabago at pagkarga. -->",
        "edittools-upload": "-",
-       "nocreatetext": "Naglagay ng hangganan (restriksyon/limitasyon) ang {{SITENAME}} sa kakayahang makalikha ng bagong mga pahina.\nMaaari kang bumalik at magbago ng isang umiiral na pahina, o kaya [[Special:UserLogin|lumagda o lumikha ng kuwenta (''account'')]].",
+       "nocreatetext": "Naglagay ng hangganan ang {{SITENAME}} sa kakayahang makalikha ng bagong mga pahina.\nMaaari kang bumalik at magbago ng isang umiiral na pahina, o kaya [[Special:UserLogin|maglogin o lumikha ng account]].",
        "nocreate-loggedin": "Wala kang pahintulot para lumikha ng bagong mga pahina.",
        "sectioneditnotsupported-title": "Hindi sinusuportahan ang pagpapatnugot ng seksyon",
        "sectioneditnotsupported-text": "Hindi sinusuportahan ang pagpapatnugot ng seksyon sa pahinang ito.",
        "undo-norev": "Hindi matanggal ang pagbabago dahil hindi ito umiiral o nabura na.",
        "undo-summary": "Tanggalin ang pagbabagong $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|Usapan]])",
        "cantcreateaccounttitle": "Hindi malikha ang account",
-       "cantcreateaccount-text": "Hinarang ni [[User:$3|$3]] ang paglikha ng kuwenta mula sa adres ng IP ('''$1''') na ito.\n\nAng dahilang ibinigay ni $3 ay ''$2''",
+       "cantcreateaccount-text": "Hinarang ni [[User:$3|$3]] ang paglikha ng acciybt mula sa IP address ('''$1''') na ito.\n\nAng dahilang ibinigay ni $3 ay ''$2''",
        "viewpagelogs": "Tingnan ang mga pagtatala para sa pahinang ito",
        "nohistory": "Walang kasaysayan ng pagbabago para sa pahinang ito.",
        "currentrev": "Pangkasalukuyang pagbabago",
        "listgrouprights-removegroup": "Maaaring tanggalin ang {{PLURAL:$2|pangkat|mga pangkat}} na: $1",
        "listgrouprights-addgroup-all": "Maaaring idagdag ang lahat ng mga pangkat",
        "listgrouprights-removegroup-all": "Maaaring tanggalin ang lahat ng mga pangkat",
-       "listgrouprights-addgroup-self": "Idagdag ang {{PLURAL:$2|pangkat|mga pangkat}} sa sariling kuwenta: $1",
-       "listgrouprights-removegroup-self": "Tanggalin ang {{PLURAL:$2|pangkat|mga pangkat}} mula sa sariling kuwenta: $1",
+       "listgrouprights-addgroup-self": "Idagdag ang {{PLURAL:$2|pangkat|mga pangkat}} sa sariling account: $1",
+       "listgrouprights-removegroup-self": "Tanggalin ang {{PLURAL:$2|pangkat|mga pangkat}} mula sa sariling account: $1",
        "listgrouprights-addgroup-self-all": "Idagdag ang lahat ng mga pangkat sa sariling account",
        "listgrouprights-removegroup-self-all": "Alisin ang lahat ng mga pangkat mula sa sariling account",
        "mailnologin": "Walang adres na mapagpapadalahan",
        "watchmethod-list": "sinusuri ang binabantayang mga pahina para sa mga kamakailan lamang na mga pagbabago",
        "watchlistcontains": "Naglalaman ng $1 {{PLURAL:$1|pahina|mga pahina}} ang iyong talaan ng mga binabantayan.",
        "iteminvalidname": "May suliranin ang bagay na '$1', hindi tanggap na pangalan...",
-       "wlnote2": "Nasa ibaba ang mga pagbabago sa nakaraang {{PLURAL:$1|oras|<strong>$1",
+       "wlnote2": "Nasa ibaba ang mga pagbabago sa nakaraang <strong>$1</strong> oras, noon pang $2, $3.",
        "wlshowlast": "Ipakita ang huling $1 mga oras $2 mga araw $3",
        "watchlist-options": "Mga pagpipilian para sa talaan ng mga binabantayan",
        "watching": "Isinasama sa mga binabantayan...",
        "protect-text": "Maaari mong tingnan at baguhin dito ang antas ng pananananggalang para sa pahinang '''$1'''.",
        "protect-locked-blocked": "Hindi mo maaaring baguhin ang mga antas ng panananggalang habang may pagharang/paghadlang.\nNarito ang mga pangkasalukuyang pagtatakda para sa pahinang '''$1''':",
        "protect-locked-dblock": "Hindi mababago ang mga antas ng panananggalang dahil sa isang umiiral na pagkandado ng kalipunan ng dato.\nNarito ang pangkasalukuyang mga pagtatakda para sa pahinang '''$1''':",
-       "protect-locked-access": "Wala kapahintulutan ang iyong kuwenta para makapagbago ng mga antas ng panananggalang ng pahina.\nNarito ang pangkasalukuyang mga pagtatakda para sa pahinang '''$1''':",
+       "protect-locked-access": "Wala kapahintulutan ang iyong account para makapagbago ng mga antas ng panananggalang ng pahina.\nNarito ang pangkasalukuyang mga pagtatakda para sa pahinang '''$1''':",
        "protect-cascadeon": "Kasalukuyang nakasanggalang na ang pahinang ito dahil kabilang/kasama ito sa sumusunod na {{PLURAL:$1|pahinang may|mga pahinang may}} buhay/umiiral na baita-baitang na mga panananggalang.\nMaaari mong baguhin ang antas ng panananggalang ng pahina, ngunit hindi ito makakaapekto sa baita-baitang na panananggalang.",
        "protect-default": "Pahintulutan ang lahat ng mga tagagamit",
        "protect-fallback": "Pahintulutan ang mga tagagamit lamang na may pahintulot na \"$1\"",
        "ipadressorusername": "Direksyong IP o bansag:",
        "ipbexpiry": "Pagkawalang-bisa:",
        "ipbreason": "Dahilan:",
-       "ipbreason-dropdown": "*Mga karaniwang dahilan sa paghaharang\n** Pagpasok ng hindi totoong impormasyon\n** Pag-alis ng nilalaman mula sa mga pahina\n** Walang-itinatanging paglalagay ng mga kawing panlabas\n** Pagpasok ng impormasyong walang kabuluhan/satsat sa mga pahina\n** Ugaling nananakot/pagligalig\n** Pagmamalabis ng maramihang kuwenta\n** Hindi kanais-nais na bansag",
+       "ipbreason-dropdown": "*Mga karaniwang dahilan sa paghaharang\n** Pagpasok ng hindi totoong impormasyon\n** Pag-alis ng nilalaman mula sa mga pahina\n** Paglalagay ng mga panlabas na link  na spam\n** Pagpasok ng impormasyong walang kabuluhan o hindi maintindihan sa mga pahina\n** Ugaling nananakot/pagligalig\n** Pagmamalabis ng maramihang account\n** Hindi kanais-nais na pangalan",
        "ipb-hardblock": "Pigilan ang nakalagdang mga tagagamit mula sa pamamatnugot mula sa tirahan ng IP na ito",
        "ipbcreateaccount": "Hadlangan ang paglikha ng account",
        "ipbemailban": "Hadlangan ang tagagamit sa pagpapadala ng e-liham",
        "confirmemail": "Patotohanan ang adres ng e-liham",
        "confirmemail_noemail": "Wala kang nakatakdang tanggap na adres ng e-liham sa iyong [[Special:Preferences|mga kagustuhan ng tagagamit]].",
        "confirmemail_text": "Pinagagawa ng {{SITENAME}} na patotohanan mo ang iyong adres ng e-liham bago gamitin ang mga kasangkapang-katangian ng e-liham.  Pindutin at buhayin ang pindutan sa ibaba para makapagpadala ng isang makapagpapatotoong e-liham (kompirmasyon) patungo sa iyong adres.\nMakakasama sa liham ang isang kawing na naglalaman ng kodigo;\nIkarga ang kawing sa iyong pantingin-tingin (''browser'') para mapatotohanang katanggap-tanggap ang iyong adres ng e-liham.",
-       "confirmemail_pending": "Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.",
+       "confirmemail_pending": "Naipadala na sa iyong e-mail ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong account, maaaring maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.",
        "confirmemail_send": "Magpadala ng isang kodigo ng pagpapatotoo (kumpirmasyon)",
        "confirmemail_sent": "Naipadala na ang magpapatotoong e-liham (kumpirmasyon).",
        "confirmemail_oncreate": "Nagpadala na ng isang kodigo ng pagpapatotoo (kumpirmasyon) patungo sa iyong adres ng e-liham.  Hindi kailangan ang kodigong ito para makalagda, ngunit kailangan mong ibigay muna ito bago paganahin/paandarin ang anumang pang e-liham na kasangkapang-katangiang nasa loob ng wiki.",
        "confirmemail_success": "Nakumpirma/napatotohanan na ang adres ng e-liham mo. Maaari ka ng [[Special:UserLogin|lumagda]] at maglibang sa wiki.",
        "confirmemail_loggedin": "Natiyak na ngayon ang tirahan ng e-liham mo.",
        "confirmemail_subject": "Kumpirmasyon/pagpapatotoong pang-adres ng e-liham ng {{SITENAME}}",
-       "confirmemail_body": "May isa, maaaring ikaw, na mula sa direksiyong IP na $1,\nang nagtala ng isang kuwentang \"$2\" na mayroong ganitong direksiyong e-liham sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhayin ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pambasa-basa (''browser''):\n\n$3\n\nKung *hindi* mo itinala ang kuwenta, sundan mo ang kawing na ito\npara kanselahin o huwag nang ituloy ang pagpapatotoo (kumpirmasyon) ng direksiyong e-liham:\n\n$5\n\nMagwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.",
-       "confirmemail_body_changed": "May isa, maaaring ikaw, na mula sa adres ng IP na $1,\nang nagbago ng adres ng e-liham ng akawnt na \"$2\" sa ganitong adres sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhaying muli ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin:\n\n$3\n\nKung *hindi* iyo ang akawnt, sundan mo ang kawing na ito\npara huwag nang ituloy ang pagpapatotoo ng adres ng e-liham:\n\n$5\n\nMagwawakas ang kodigo ng pagpapatotoong ito sa $4.",
+       "confirmemail_body": "May isang tao, malamang ikaw, na mula sa IP address na $1,\nang nagtala ng isang account na \"$2\" na mayroong ganitong email address sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng account ito at para buhayin ang mga tampok (features) sa email sa {{SITENAME}}, buksan ang link na ito sa iyong browser:\n\n$3\n\nKung *hindi* mo itinala ang account, sundan mo ang link na ito\npara kanselahin o huwag nang ituloy ang pagpapatotoo ng email address:\n\n$5\n\nMagwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.",
+       "confirmemail_body_changed": "May isang tao, malamang ikaw, na mula sa IP address na $1,\nang nagtala ng isang account na \"$2\" na mayroong ganitong email address sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng account ito at para buhayin ang mga tampok (features) sa email sa {{SITENAME}}, buksan ang link na ito sa iyong browser:\n\n$3\n\nKung *hindi* mo itinala ang account, sundan mo ang link na ito\npara kanselahin o huwag nang ituloy ang pagpapatotoo ng email address:\n\n$5\n\nMagwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.",
        "confirmemail_body_set": "May isang tao, maaaring ikaw, mula sa tirahan ng IP na $1,\nang nagtakda ng tirahan ng e-liham ng akawnt na \"$2\" papunta sa tirahang ito sa {{SITENAME}}.\n\nUpang tiyakin na ang akawnt na ito ay talagang sa iyo at muling buhayin\nang mga tampok ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin:\n\n$3\n\nKung ang akawnt ay *hindi* iyo, sundan ang kawing na ito\nupang huwag ituloy ang pagpapatunay ng tirahan ng e-liham:\n\n$5\n\nMawawalan ng bisa ang kodigong ito ng pagpapatunay pagsapit ng $4.",
        "confirmemail_invalidated": "Hindi itinuloy/kinansela ang pagpapatotoo ng e-liham",
        "invalidateemail": "Huwag ituloy/kanselahin ang pagpapatotoo ng e-liham",
        "specialpages-note": "* Normal na natatanging mga pahina.\n* <span class=\"mw-specialpagerestricted\">Pinaghihigpitang natatanging mga pahina.</span>",
        "specialpages-group-maintenance": "Mga pagpapanatiling ulat",
        "specialpages-group-other": "Iba pang natatanging mga pahina",
-       "specialpages-group-login": "Mag-login / lumikha ng akawnt",
+       "specialpages-group-login": "Mag-login / lumikha ng account",
        "specialpages-group-changes": "Mga huling binago at mga tala",
        "specialpages-group-media": "Mga ulat ng midya at mga pagkarga",
        "specialpages-group-users": "Mga tagagamit at mga karapatan",
index 6cf4e9b..b6c4746 100644 (file)
        "view": "Görüntüle",
        "view-foreign": "$1 üzerinde gör",
        "edit": "Düzenle",
-       "edit-local": "Yerel açıklama düzenle",
+       "edit-local": "Yerel açıklama düzenle",
        "create": "Oluştur",
        "create-local": "Yerel açıklama ekle",
        "editthispage": "Bu sayfayı değiştir",
index b2b3e1d..2c72c81 100644 (file)
        "contributions-title": "Внесок користувача $1",
        "mycontris": "Внесок",
        "contribsub2": "Для {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Обліковий запис користувача  «$1» не зареєстровано.",
        "nocontribs": "Редагувань, що задовольняють заданим умовам не знайдено.",
        "uctop": "(поточна)",
        "month": "До місяця (включно):",
index 2472cc4..9f20365 100644 (file)
        "searcharticle": "前往",
        "history": "页面历史",
        "history_short": "历史",
-       "updatedmarker": "æ\88\91ä¸\8a次访é\97®å\90\8eç\9a\84ä¿®æ\94¹",
+       "updatedmarker": "æ\9b´æ\96°äº\8eæ\88\91ä¸\8a次访é\97®å\90\8e",
        "printableversion": "打印版本",
        "permalink": "永久链接",
        "print": "打印",
        "sort-descending": "降序",
        "sort-ascending": "升序",
        "nstab-main": "页面",
-       "nstab-user": "用户页",
+       "nstab-user": "用户页",
        "nstab-media": "媒体文件页面",
        "nstab-special": "特殊页面",
        "nstab-project": "项目页面",
        "skin-preview": "预览",
        "datedefault": "默认格式",
        "prefs-labs": "实验室特性",
-       "prefs-user-pages": "用户页",
+       "prefs-user-pages": "用户页",
        "prefs-personal": "用户资料",
        "prefs-rc": "最近更改",
        "prefs-watchlist": "监视列表",
        "pageswithprop-prophidden-binary": "已隐藏二进制属性值($1)",
        "doubleredirects": "双重重定向",
        "doubleredirectstext": "本页面列出重定向至其他重定向页面的页面。每行含有第一及第二重定向的链接和第二重定向的目标(这通常是第一重定向应该指向的“实际”目标页面)。<del>带删除线的</del>条目已经被解决。",
-       "double-redirect-fixed-move": "[[$1]]已被移动。它现在重定向至[[$2]]。",
-       "double-redirect-fixed-maintenance": "修复双重重定向自[[$1]]至[[$2]]。",
+       "double-redirect-fixed-move": "[[$1]]已被移动。它已自动更新,并且现在重定向至[[$2]]。",
+       "double-redirect-fixed-maintenance": "在维护工作中自动修复双重重定向自[[$1]]至[[$2]]。",
        "double-redirect-fixer": "重定向修复器",
        "brokenredirects": "受损重定向",
        "brokenredirectstext": "以下重定向链接至不存在的页面:",
        "ipbother": "其它时间:",
        "ipboptions": "2小时:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,不限期:infinite",
        "ipbhidename": "在编辑及列表中隐藏用户名",
-       "ipbwatchuser": "监视该用户的用户及讨论页面",
+       "ipbwatchuser": "监视该用户的用户页和讨论页",
        "ipb-disableusertalk": "阻止用户在封禁期间编辑自己的讨论页",
        "ipb-change-block": "使用这些设置重新封禁用户",
        "ipb-confirm": "确认封禁",
index f307296..c9f21b0 100644 (file)
        "pageswithprop-prophidden-binary": "已隱藏二進位屬性值($1)",
        "doubleredirects": "雙重的重新導向",
        "doubleredirectstext": "這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是\"真正\"的目標頁面,也就是第一個重定向頁面應該指向的頁面。\n<del>已劃去</del>的為已經解決之項目。",
-       "double-redirect-fixed-move": "[[$1]]已經完成移動,它現在重新定向到[[$2]]。",
-       "double-redirect-fixed-maintenance": "修復å¾\9e[[$1]]å\88°[[$2]]ç\9a\84雙重重定向。",
+       "double-redirect-fixed-move": "[[$1]]已經完成移動。它已自動更新,並已重定向至[[$2]]。",
+       "double-redirect-fixed-maintenance": "ä½\9cç\82ºç¶­è­·å·¥ä½\9cè\87ªå\8b\95修復æ\96¼[[$1]]è\87³[[$2]]ä¹\8b雙重重定向。",
        "double-redirect-fixer": "重新導向修正器",
        "brokenredirects": "中斷的重新導向",
        "brokenredirectstext": "以下的重新導向頁面連結到不存在的頁面:",
index 65d57e0..1294b1a 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * @author Niklas Laxström, Tim Starling
  *
@@ -97,6 +96,7 @@ class CLDRPluralRuleConverter {
         */
        public static function convert( $rule ) {
                $parser = new self( $rule );
+
                return $parser->doConvert();
        }
 
@@ -119,13 +119,13 @@ class CLDRPluralRuleConverter {
 
                // Iterate through all tokens, saving the operators and operands to a
                // stack per Dijkstra's shunting yard algorithm.
-               /** @var CLDRPluralRuleConverter_Operator $token */
+               /** @var CLDRPluralRuleConverterOperator $token */
                while ( false !== ( $token = $this->nextToken() ) ) {
                        // In this grammar, there are only binary operators, so every valid
                        // rule string will alternate between operator and operand tokens.
                        $expectOperator = !$expectOperator;
 
-                       if ( $token instanceof CLDRPluralRuleConverter_Expression ) {
+                       if ( $token instanceof CLDRPluralRuleConverterExpression ) {
                                // Operand
                                if ( $expectOperator ) {
                                        $token->error( 'unexpected operand' );
@@ -172,7 +172,7 @@ class CLDRPluralRuleConverter {
        /**
         * Fetch the next token from the input string.
         *
-        * @return CLDRPluralRuleConverter_Fragment The next token
+        * @return CLDRPluralRuleConverterFragment The next token
         */
        protected function nextToken() {
                if ( $this->pos >= $this->end ) {
@@ -192,6 +192,7 @@ class CLDRPluralRuleConverter {
                if ( $length !== 0 ) {
                        $token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
                        $this->pos += $length;
+
                        return $token;
                }
 
@@ -200,6 +201,7 @@ class CLDRPluralRuleConverter {
                if ( $op2 === '..' || $op2 === '!=' ) {
                        $token = $this->newOperator( $op2, $this->pos, 2 );
                        $this->pos += 2;
+
                        return $token;
                }
 
@@ -207,7 +209,8 @@ class CLDRPluralRuleConverter {
                $op1 = $this->rule[$this->pos];
                if ( $op1 === ',' || $op1 === '=' || $op1 === '%' ) {
                        $token = $this->newOperator( $op1, $this->pos, 1 );
-                       $this->pos ++;
+                       $this->pos++;
+
                        return $token;
                }
 
@@ -235,6 +238,7 @@ class CLDRPluralRuleConverter {
                        if ( isset( self::$precedence[$bothWords] ) ) {
                                $token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
                                $this->pos = $nextTokenPos;
+
                                return $token;
                        }
                }
@@ -243,13 +247,15 @@ class CLDRPluralRuleConverter {
                if ( isset( self::$precedence[$word1] ) ) {
                        $token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
                        $this->pos += strlen( $word1 );
+
                        return $token;
                }
 
                // The single-character operand symbols
                if ( strpos( self::OPERAND_SYMBOLS, $word1 ) !== false ) {
                        $token = $this->newNumber( $word1, $this->pos );
-                       $this->pos ++;
+                       $this->pos++;
+
                        return $token;
                }
 
@@ -258,6 +264,7 @@ class CLDRPluralRuleConverter {
                        // Samples are like comments, they have no effect on rule evaluation.
                        // They run from the first sample indicator to the end of the string.
                        $this->pos = $this->end;
+
                        return false;
                }
 
@@ -269,7 +276,7 @@ class CLDRPluralRuleConverter {
         * a fragment with rpn and type members describing the result of that
         * operation.
         *
-        * @param CLDRPluralRuleConverter_Operator $op
+        * @param CLDRPluralRuleConverterOperator $op
         */
        protected function doOperation( $op ) {
                if ( count( $this->operands ) < 2 ) {
@@ -286,10 +293,10 @@ class CLDRPluralRuleConverter {
         *
         * @param string $text
         * @param int $pos
-        * @return CLDRPluralRuleConverter_Expression The numerical expression
+        * @return CLDRPluralRuleConverterExpression The numerical expression
         */
        protected function newNumber( $text, $pos ) {
-               return new CLDRPluralRuleConverter_Expression( $this, 'number', $text, $pos, strlen( $text ) );
+               return new CLDRPluralRuleConverterExpression( $this, 'number', $text, $pos, strlen( $text ) );
        }
 
        /**
@@ -298,10 +305,10 @@ class CLDRPluralRuleConverter {
         * @param string $type
         * @param int $pos
         * @param int $length
-        * @return CLDRPluralRuleConverter_Operator The operator
+        * @return CLDRPluralRuleConverterOperator The operator
         */
        protected function newOperator( $type, $pos, $length ) {
-               return new CLDRPluralRuleConverter_Operator( $this, $type, $pos, $length );
+               return new CLDRPluralRuleConverterOperator( $this, $type, $pos, $length );
        }
 
        /**
diff --git a/languages/utils/CLDRPluralRuleConverterExpression.php b/languages/utils/CLDRPluralRuleConverterExpression.php
new file mode 100644 (file)
index 0000000..1ee6b4c
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An expression object, representing a region of the input string (for error
+ * messages), the RPN notation used to evaluate it, and the result type for
+ * validation.
+ */
+class CLDRPluralRuleConverterExpression extends CLDRPluralRuleConverterFragment {
+       /** @var string */
+       public $type;
+
+       /** @var string */
+       public $rpn;
+
+       function __construct( $parser, $type, $rpn, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               $this->type = $type;
+               $this->rpn = $rpn;
+       }
+
+       public function isType( $type ) {
+               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
+                       return true;
+               }
+               if ( $type === $this->type ) {
+                       return true;
+               }
+
+               return false;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverterFragment.php b/languages/utils/CLDRPluralRuleConverterFragment.php
new file mode 100644 (file)
index 0000000..df299cb
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * The base class for operators and expressions, describing a region of the input string.
+ */
+class CLDRPluralRuleConverterFragment {
+       public $parser, $pos, $length, $end;
+
+       function __construct( $parser, $pos, $length ) {
+               $this->parser = $parser;
+               $this->pos = $pos;
+               $this->length = $length;
+               $this->end = $pos + $length;
+       }
+
+       public function error( $message ) {
+               $text = $this->getText();
+               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
+       }
+
+       public function getText() {
+               return substr( $this->parser->rule, $this->pos, $this->length );
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverterOperator.php b/languages/utils/CLDRPluralRuleConverterOperator.php
new file mode 100644 (file)
index 0000000..4acda7f
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An operator object, representing a region of the input string (for error
+ * messages), and the binary operator at that location.
+ */
+class CLDRPluralRuleConverterOperator extends CLDRPluralRuleConverterFragment {
+       /** @var string The name */
+       public $name;
+
+       /**
+        * Each op type has three characters: left operand type, right operand type and result type
+        *
+        *   b = boolean
+        *   n = number
+        *   r = range
+        *
+        * A number is a kind of range.
+        *
+        * @var array
+        */
+       static $opTypes = array(
+               'or' => 'bbb',
+               'and' => 'bbb',
+               'is' => 'nnb',
+               'is-not' => 'nnb',
+               'in' => 'nrb',
+               'not-in' => 'nrb',
+               'within' => 'nrb',
+               'not-within' => 'nrb',
+               'mod' => 'nnn',
+               ',' => 'rrr',
+               '..' => 'nnr',
+       );
+
+       /**
+        * Map converting from the abbrevation to the full form.
+        *
+        * @var array
+        */
+       static $typeSpecMap = array(
+               'b' => 'boolean',
+               'n' => 'number',
+               'r' => 'range',
+       );
+
+       /**
+        * Map for converting the new operators introduced in Rev 33 to the old forms
+        */
+       static $aliasMap = array(
+               '%' => 'mod',
+               '!=' => 'not-in',
+               '=' => 'in'
+       );
+
+       /**
+        * Initialize a new instance of a CLDRPluralRuleConverterOperator object
+        *
+        * @param CLDRPluralRuleConverter $parser The parser
+        * @param string $name The operator name
+        * @param int $pos The length
+        * @param int $length
+        */
+       function __construct( $parser, $name, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               if ( isset( self::$aliasMap[$name] ) ) {
+                       $name = self::$aliasMap[$name];
+               }
+               $this->name = $name;
+       }
+
+       /**
+        * Compute the operation
+        *
+        * @param CLDRPluralRuleConverterExpression $left The left part of the expression
+        * @param CLDRPluralRuleConverterExpression $right The right part of the expression
+        * @return CLDRPluralRuleConverterExpression The result of the operation
+        */
+       public function operate( $left, $right ) {
+               $typeSpec = self::$opTypes[$this->name];
+
+               $leftType = self::$typeSpecMap[$typeSpec[0]];
+               $rightType = self::$typeSpecMap[$typeSpec[1]];
+               $resultType = self::$typeSpecMap[$typeSpec[2]];
+
+               $start = min( $this->pos, $left->pos, $right->pos );
+               $end = max( $this->end, $left->end, $right->end );
+               $length = $end - $start;
+
+               $newExpr = new CLDRPluralRuleConverterExpression( $this->parser, $resultType,
+                       "{$left->rpn} {$right->rpn} {$this->name}",
+                       $start, $length );
+
+               if ( !$left->isType( $leftType ) ) {
+                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
+               }
+
+               if ( !$right->isType( $rightType ) ) {
+                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
+               }
+
+               return $newExpr;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverter_Expression.php b/languages/utils/CLDRPluralRuleConverter_Expression.php
deleted file mode 100644 (file)
index 8352e72..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An expression object, representing a region of the input string (for error
- * messages), the RPN notation used to evaluate it, and the result type for
- * validation.
- */
-class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
-       /** @var string */
-       public $type;
-
-       /** @var string */
-       public $rpn;
-
-       function __construct( $parser, $type, $rpn, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               $this->type = $type;
-               $this->rpn = $rpn;
-       }
-
-       public function isType( $type ) {
-               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
-                       return true;
-               }
-               if ( $type === $this->type ) {
-                       return true;
-               }
-               return false;
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverter_Fragment.php b/languages/utils/CLDRPluralRuleConverter_Fragment.php
deleted file mode 100644 (file)
index 88795a0..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * The base class for operators and expressions, describing a region of the input string.
- */
-class CLDRPluralRuleConverter_Fragment {
-       public $parser, $pos, $length, $end;
-
-       function __construct( $parser, $pos, $length ) {
-               $this->parser = $parser;
-               $this->pos = $pos;
-               $this->length = $length;
-               $this->end = $pos + $length;
-       }
-
-       public function error( $message ) {
-               $text = $this->getText();
-               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
-       }
-
-       public function getText() {
-               return substr( $this->parser->rule, $this->pos, $this->length );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverter_Operator.php b/languages/utils/CLDRPluralRuleConverter_Operator.php
deleted file mode 100644 (file)
index c42953c..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An operator object, representing a region of the input string (for error
- * messages), and the binary operator at that location.
- */
-class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
-       /** @var string The name */
-       public $name;
-
-       /**
-        * Each op type has three characters: left operand type, right operand type and result type
-        *
-        *   b = boolean
-        *   n = number
-        *   r = range
-        *
-        * A number is a kind of range.
-        *
-        * @var array
-        */
-       static $opTypes = array(
-               'or' => 'bbb',
-               'and' => 'bbb',
-               'is' => 'nnb',
-               'is-not' => 'nnb',
-               'in' => 'nrb',
-               'not-in' => 'nrb',
-               'within' => 'nrb',
-               'not-within' => 'nrb',
-               'mod' => 'nnn',
-               ',' => 'rrr',
-               '..' => 'nnr',
-       );
-
-       /**
-        * Map converting from the abbrevation to the full form.
-        *
-        * @var array
-        */
-       static $typeSpecMap = array(
-               'b' => 'boolean',
-               'n' => 'number',
-               'r' => 'range',
-       );
-
-       /**
-        * Map for converting the new operators introduced in Rev 33 to the old forms
-        */
-       static $aliasMap = array(
-               '%' => 'mod',
-               '!=' => 'not-in',
-               '=' => 'in'
-       );
-
-       /**
-        * Initialize a new instance of a CLDRPluralRuleConverter_Operator object
-        *
-        * @param CLDRPluralRuleConverter $parser The parser
-        * @param string $name The operator name
-        * @param int $pos The length
-        * @param int $length
-        */
-       function __construct( $parser, $name, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               if ( isset( self::$aliasMap[$name] ) ) {
-                       $name = self::$aliasMap[$name];
-               }
-               $this->name = $name;
-       }
-
-       /**
-        * Compute the operation
-        *
-        * @param CLDRPluralRuleConverter_Expression $left The left part of the expression
-        * @param CLDRPluralRuleConverter_Expression $right The right part of the expression
-        * @return CLDRPluralRuleConverter_Expression The result of the operation
-        */
-       public function operate( $left, $right ) {
-               $typeSpec = self::$opTypes[$this->name];
-
-               $leftType = self::$typeSpecMap[$typeSpec[0]];
-               $rightType = self::$typeSpecMap[$typeSpec[1]];
-               $resultType = self::$typeSpecMap[$typeSpec[2]];
-
-               $start = min( $this->pos, $left->pos, $right->pos );
-               $end = max( $this->end, $left->end, $right->end );
-               $length = $end - $start;
-
-               $newExpr = new CLDRPluralRuleConverter_Expression( $this->parser, $resultType,
-                       "{$left->rpn} {$right->rpn} {$this->name}",
-                       $start, $length );
-
-               if ( !$left->isType( $leftType ) ) {
-                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
-               }
-
-               if ( !$right->isType( $rightType ) ) {
-                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
-               }
-               return $newExpr;
-       }
-}
index 2ca3410..cc0b5d2 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * @author Niklas Laxström, Tim Starling
  *
@@ -18,4 +17,4 @@ class CLDRPluralRuleError extends MWException {
        function __construct( $message ) {
                parent::__construct( 'CLDR plural rule error: ' . $message );
        }
-}
\ No newline at end of file
+}
index 61ab947..7e7208a 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * Parse and evaluate a plural rule.
  *
@@ -30,7 +31,6 @@
  * @file
  * @since 1.20
  */
-
 class CLDRPluralRuleEvaluator {
        /**
         * Evaluate a number against a set of plural rules. If a rule passes,
@@ -42,6 +42,7 @@ class CLDRPluralRuleEvaluator {
         */
        public static function evaluate( $number, array $rules ) {
                $rules = self::compile( $rules );
+
                return self::evaluateCompiled( $number, $rules );
        }
 
@@ -58,6 +59,7 @@ class CLDRPluralRuleEvaluator {
                foreach ( $rules as &$rule ) {
                        $rule = CLDRPluralRuleConverter::convert( $rule );
                }
+
                return $rules;
        }
 
@@ -75,6 +77,7 @@ class CLDRPluralRuleEvaluator {
                $number = strval( $number );
                if ( !preg_match( '/^ -? ( ([0-9]+) (?: \. ([0-9]+) )? )$/x', $number, $m ) ) {
                        wfDebug( __METHOD__ . ": invalid number input, returning 'other'\n" );
+
                        return count( $rules );
                }
                if ( !isset( $m[3] ) ) {
@@ -139,8 +142,8 @@ class CLDRPluralRuleEvaluator {
         */
        private static function doOperation( $token, $left, $right ) {
                if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
-                       if ( !( $right instanceof CLDRPluralRuleEvaluator_Range ) ) {
-                               $right = new CLDRPluralRuleEvaluator_Range( $right );
+                       if ( !( $right instanceof CLDRPluralRuleEvaluatorRange ) ) {
+                               $right = new CLDRPluralRuleEvaluatorRange( $right );
                        }
                }
                switch ( $token ) {
@@ -164,17 +167,19 @@ class CLDRPluralRuleEvaluator {
                                if ( is_int( $left ) ) {
                                        return (int)fmod( $left, $right );
                                }
+
                                return fmod( $left, $right );
                        case ',':
-                               if ( $left instanceof CLDRPluralRuleEvaluator_Range ) {
+                               if ( $left instanceof CLDRPluralRuleEvaluatorRange ) {
                                        $range = $left;
                                } else {
-                                       $range = new CLDRPluralRuleEvaluator_Range( $left );
+                                       $range = new CLDRPluralRuleEvaluatorRange( $left );
                                }
                                $range->add( $right );
+
                                return $range;
                        case '..':
-                               return new CLDRPluralRuleEvaluator_Range( $left, $right );
+                               return new CLDRPluralRuleEvaluatorRange( $left, $right );
                        default:
                                throw new CLDRPluralRuleError( "Invalid RPN token" );
                }
diff --git a/languages/utils/CLDRPluralRuleEvaluatorRange.php b/languages/utils/CLDRPluralRuleEvaluatorRange.php
new file mode 100644 (file)
index 0000000..a62eeb9
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Evaluator helper class representing a range list.
+ */
+class CLDRPluralRuleEvaluatorRange {
+       /**
+        * The parts
+        *
+        * @var array
+        */
+       public $parts = array();
+
+       /**
+        * Initialize a new instance of CLDRPluralRuleEvaluatorRange
+        *
+        * @param int $start The start of the range
+        * @param int|bool $end The end of the range, or false if the range is not bounded.
+        */
+       function __construct( $start, $end = false ) {
+               if ( $end === false ) {
+                       $this->parts[] = $start;
+               } else {
+                       $this->parts[] = array( $start, $end );
+               }
+       }
+
+       /**
+        * Determine if the given number is inside the range.
+        *
+        * @param int $number The number to check
+        * @param bool $integerConstraint If true, also asserts the number is an integer; otherwise, number simply has to be inside the range.
+        * @return bool True if the number is inside the range; otherwise, false.
+        */
+       function isNumberIn( $number, $integerConstraint = true ) {
+               foreach ( $this->parts as $part ) {
+                       if ( is_array( $part ) ) {
+                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
+                                       && $number >= $part[0] && $number <= $part[1]
+                               ) {
+                                       return true;
+                               }
+                       } else {
+                               if ( $number == $part ) {
+                                       return true;
+                               }
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Readable alias for isNumberIn( $number, false ), and the implementation
+        * of the "within" operator.
+        *
+        * @param int $number The number to check
+        * @return bool True if the number is inside the range; otherwise, false.
+        */
+       function isNumberWithin( $number ) {
+               return $this->isNumberIn( $number, false );
+       }
+
+       /**
+        * Add another part to this range.
+        *
+        * @param CLDRPluralRuleEvaluatorRange|int $other The part to add, either
+        *   a range object itself or a single number.
+        */
+       function add( $other ) {
+               if ( $other instanceof self ) {
+                       $this->parts = array_merge( $this->parts, $other->parts );
+               } else {
+                       $this->parts[] = $other;
+               }
+       }
+
+       /**
+        * Returns the string representation of the rule evaluator range.
+        * The purpose of this method is to help debugging.
+        *
+        * @return string The string representation of the rule evaluator range
+        */
+       function __toString() {
+               $s = 'Range(';
+               foreach ( $this->parts as $i => $part ) {
+                       if ( $i ) {
+                               $s .= ', ';
+                       }
+                       if ( is_array( $part ) ) {
+                               $s .= $part[0] . '..' . $part[1];
+                       } else {
+                               $s .= $part;
+                       }
+               }
+               $s .= ')';
+
+               return $s;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleEvaluator_Range.php b/languages/utils/CLDRPluralRuleEvaluator_Range.php
deleted file mode 100644 (file)
index 9732b8d..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Evaluator helper class representing a range list.
- */
-class CLDRPluralRuleEvaluator_Range {
-       /**
-        * The parts
-        *
-        * @var array
-        */
-       public $parts = array();
-
-       /**
-        * Initialize a new instance of CLDRPluralRuleEvaluator_Range
-        *
-        * @param int $start The start of the range
-        * @param int|bool $end The end of the range, or false if the range is not bounded.
-        */
-       function __construct( $start, $end = false ) {
-               if ( $end === false ) {
-                       $this->parts[] = $start;
-               } else {
-                       $this->parts[] = array( $start, $end );
-               }
-       }
-
-       /**
-        * Determine if the given number is inside the range.
-        *
-        * @param int $number The number to check
-        * @param bool $integerConstraint If true, also asserts the number is an integer; otherwise, number simply has to be inside the range.
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberIn( $number, $integerConstraint = true ) {
-               foreach ( $this->parts as $part ) {
-                       if ( is_array( $part ) ) {
-                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
-                                       && $number >= $part[0] && $number <= $part[1]
-                               ) {
-                                       return true;
-                               }
-                       } else {
-                               if ( $number == $part ) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Readable alias for isNumberIn( $number, false ), and the implementation
-        * of the "within" operator.
-        *
-        * @param int $number The number to check
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberWithin( $number ) {
-               return $this->isNumberIn( $number, false );
-       }
-
-       /**
-        * Add another part to this range.
-        *
-        * @param CLDRPluralRuleEvaluator_Range|int $other The part to add, either
-        *   a range object itself or a single number.
-        */
-       function add( $other ) {
-               if ( $other instanceof self ) {
-                       $this->parts = array_merge( $this->parts, $other->parts );
-               } else {
-                       $this->parts[] = $other;
-               }
-       }
-
-       /**
-        * Returns the string representation of the rule evaluator range.
-        * The purpose of this method is to help debugging.
-        *
-        * @return string The string representation of the rule evaluator range
-        */
-       function __toString() {
-               $s = 'Range(';
-               foreach ( $this->parts as $i => $part ) {
-                       if ( $i ) {
-                               $s .= ', ';
-                       }
-                       if ( is_array( $part ) ) {
-                               $s .= $part[0] . '..' . $part[1];
-                       } else {
-                               $s .= $part;
-                       }
-               }
-               $s .= ')';
-               return $s;
-       }
-
-}
index 23c134b..ee26a6e 100644 (file)
@@ -83,7 +83,7 @@ class GenerateJsonI18n extends Maintenance {
                        $jsonfile = "$jsondir/$langcode.json";
                        $success = file_put_contents(
                                $jsonfile,
-                               FormatJson::encode( $langmsgs, true, FormatJson::ALL_OK ) . "\n"
+                               FormatJson::encode( $langmsgs, "\t", FormatJson::ALL_OK ) . "\n"
                        );
                        if ( $success === false ) {
                                $this->error( "FAILED to write $jsonfile", 1 );
index 105d806..09415fd 100644 (file)
@@ -12,6 +12,6 @@
        "ooui-dialog-action-close": "Racnê",
        "ooui-outline-control-move-down": "Bendi bere cêr",
        "ooui-outline-control-move-up": "Bendi bere cor",
-       "ooui-outline-control-remove": "Obji hewad",
+       "ooui-outline-control-remove": "Obcey wedare",
        "ooui-toolbar-more": "Zewbi"
 }
index cd8c9f2..403b200 100644 (file)
@@ -18,6 +18,6 @@
        "ooui-dialog-action-close": "סגירה",
        "ooui-outline-control-move-down": "להזיז את הפריט מטה",
        "ooui-outline-control-move-up": "להזיז את הפריט מעלה",
-       "ooui-outline-control-remove": "×\94סרת פריט",
+       "ooui-outline-control-remove": "×\9c×\94ס×\99ר ×\90ת ×\94פריט",
        "ooui-toolbar-more": "עוד"
 }
index 3257604..47a9a93 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (989950a4db)
+ * OOjs UI v0.1.0-pre (d4baf57069)
  * 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: Fri Apr 18 2014 13:02:46 GMT-0700 (PDT)
+ * Date: Mon Apr 21 2014 12:42:04 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -556,8 +556,6 @@ OO.ui.Element.prototype.getElementWindow = function () {
 
 /**
  * Get closest scrollable container.
- *
- * @see #static-method-getClosestScrollableContainer
  */
 OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
        return OO.ui.Element.getClosestScrollableContainer( this.$element[0] );
@@ -586,7 +584,6 @@ OO.ui.Element.prototype.setElementGroup = function ( group ) {
 /**
  * Scroll element into view.
  *
- * @see #static-method-scrollIntoView
  * @param {Object} [config={}]
  */
 OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
@@ -595,7 +592,7 @@ OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
 
 /**
  * Bind a handler for an event on this.$element
- * @see #static-method-onDOMEvent
+ *
  * @param {string} event
  * @param {Function} callback
  */
@@ -605,7 +602,7 @@ OO.ui.Element.prototype.onDOMEvent = function ( event, callback ) {
 
 /**
  * Unbind a handler bound with #offDOMEvent
- * @see #static-method-offDOMEvent
+ *
  * @param {string} event
  * @param {Function} callback
  */
@@ -2192,6 +2189,7 @@ OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
  * @constructor
  * @param {jQuery} $group Container node, assigned to #$group
  * @param {Object} [config] Configuration options
+ * @cfg {Object.<string,string>} [aggregations] Events to aggregate, keyed by item event name
  */
 OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        // Configuration
@@ -2201,7 +2199,8 @@ OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        this.$group = $group;
        this.items = [];
        this.$items = this.$( [] );
-       this.aggregateItemEvents = {};
+       this.aggregate = !$.isEmptyObject( config.aggregations );
+       this.aggregations = config.aggregations || {};
 };
 
 /* Methods */
@@ -2215,54 +2214,6 @@ OO.ui.GroupElement.prototype.getItems = function () {
        return this.items.slice( 0 );
 };
 
-/**
- * Add an aggregate item event.
- *
- * Aggregated events are listened to on each item and then emitted by the group under a new name,
- * and with an additional leading parameter containing the item that emitted the original event.
- * Other arguments that were emitted from the original event are passed through.
- *
- * @param {Object.<string,string|null>} events Aggregate events emitted by group, keyed by item
- *   event, use null value to remove aggregation
- * @throws {Error} If aggregation already exists
- */
-OO.ui.GroupElement.prototype.aggregate = function ( events ) {
-       var i, len, item, add, remove, itemEvent, groupEvent;
-
-       for ( itemEvent in events ) {
-               groupEvent = events[itemEvent];
-
-               // Remove existing aggregated event
-               if ( itemEvent in this.aggregateItemEvents ) {
-                       // Don't allow duplicate aggregations
-                       if ( groupEvent ) {
-                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
-                       }
-                       // Remove event aggregation from existing items
-                       remove = {};
-                       remove[itemEvent] = this.aggregateItemEvents[itemEvent];
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               this.items[i].disconnect( this, remove );
-                       }
-                       // Prevent future items from aggregating event
-                       delete this.aggregateItemEvents[itemEvent];
-               }
-
-               // Add new aggregate event
-               if ( groupEvent ) {
-                       // Make future items aggregate event
-                       this.aggregateItemEvents[itemEvent] = groupEvent;
-                       // Add event aggregation to existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[i];
-                               add = {};
-                               add[itemEvent] = [ 'emit', groupEvent, item ];
-                               item.connect( this, add );
-                       }
-               }
-       }
-};
-
 /**
  * Add items.
  *
@@ -2287,10 +2238,10 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                        }
                }
                // Add the item
-               if ( !$.isEmptyObject( this.aggregateItemEvents ) ) {
+               if ( this.aggregate ) {
                        events = {};
-                       for ( event in this.aggregateItemEvents ) {
-                               events[event] = [ 'emit', this.aggregateItemEvents[event], item ];
+                       for ( event in this.aggregations ) {
+                               events[event] = [ 'emit', this.aggregations[event], item ];
                        }
                        item.connect( this, events );
                }
@@ -2330,7 +2281,7 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
                item = items[i];
                index = $.inArray( item, this.items );
                if ( index !== -1 ) {
-                       if ( !$.isEmptyObject( this.aggregateItemEvents ) ) {
+                       if ( this.aggregate ) {
                                item.disconnect( this );
                        }
                        item.setElementGroup( null );
@@ -2356,7 +2307,7 @@ OO.ui.GroupElement.prototype.clearItems = function () {
        // Remove all items
        for ( i = 0, len = this.items.length; i < len; i++ ) {
                item = this.items[i];
-               if ( !$.isEmptyObject( this.aggregateItemEvents ) ) {
+               if ( this.aggregate ) {
                        item.disconnect( this );
                }
                item.setElementGroup( null );
index a79c4a1..ed564be 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (989950a4db)
+ * OOjs UI v0.1.0-pre (d4baf57069)
  * 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: Fri Apr 18 2014 13:02:46 GMT-0700 (PDT)
+ * Date: Mon Apr 21 2014 12:42:04 GMT-0700 (PDT)
  */
 
 /* Textures */
index 80b68cc..36f1bd4 100644 (file)
@@ -19,7 +19,7 @@
        background-image: url(@url);
 }
 
-.vertical-gradient ( @startColor: gray, @endColor: white, @startPos: 0, @endPos: 100% ) {
+.vertical-gradient(@startColor: gray, @endColor: white, @startPos: 0, @endPos: 100%) {
        background-color: @endColor;
        background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
        background-image: -webkit-gradient( linear, left top, left bottom, color-stop( @startPos, @startColor ), color-stop( @endPos, @endColor ) ); // Safari 4+, Chrome 2+
        background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
 }
 
-/* Note gzip compression means that it is okay to embed twice */
-/* http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-.background-image-svg(@svg, @fallback) {
+/*
+ * SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG).
+ * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique
+ *
+ * We use gzip compression, which means that it is okay to embed twice.
+ *
+ * We do not embed the fallback image on the assumption that the gain for old browsers
+ * is not worth the harm done to modern ones.
+ */
+.background-image-svg(@svg, @fallback) when (embeddable(@svg)) {
+       background-image: url(@fallback);
+       /* We don't need the !ie hack because this old IE uses the fallback already */
+       background-image: -webkit-linear-gradient(transparent, transparent), embed(@svg);
+       background-image: linear-gradient(transparent, transparent), embed(@svg);
+}
+
+.background-image-svg(@svg, @fallback) when not (embeddable(@svg)) {
        background-image: url(@fallback);
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       /* @embed */ background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
-       /* @embed */ background-image: linear-gradient(transparent, transparent), url(@svg);
+       background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
+       background-image: linear-gradient(transparent, transparent), url(@svg);
 }
 
 /* Caution: Does not support localisable images */
index 65f3fbe..f0ea2e9 100644 (file)
@@ -206,6 +206,12 @@ a:link, a:visited {
        content: " (" attr(href) ")";
 }
 
+#content a.external.text[href^='//']:after,
+#content a.external.autonumber[href^='//']:after {
+       /* Expand protocol-relative URLs for printing */
+       content: " (https:" attr(href) ")";
+}
+
 #globalWrapper {
        width: 100% !important;
        min-width: 0 !important;
index 3f8e0d3..df6c416 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -159,6 +159,12 @@ function wfStreamThumb( array $params ) {
                return;
        }
 
+       // Check if the file is hidden
+       if ( $img->isDeleted( File::DELETED_FILE ) ) {
+               wfThumbError( 404, "The source file '$fileName' does not exist." );
+               return;
+       }
+
        // Check permissions if there are read restrictions
        $varyHeader = array();
        if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
@@ -243,8 +249,10 @@ function wfStreamThumb( array $params ) {
                }
        }
 
+       $rel404 = isset( $params['rel404'] ) ? $params['rel404'] : null;
        unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
        unset( $params['f'] ); // We're done with 'f' parameter.
+       unset( $params['rel404'] ); // moved to $rel404
 
        // Get the normalized thumbnail name from the parameters...
        try {
@@ -263,10 +271,10 @@ function wfStreamThumb( array $params ) {
        // for the thumb params and the parent directory for the source file name.
        // Check that the zone relative path matches up so squid caches won't pick
        // up thumbs that would not be purged on source file deletion (bug 34231).
-       if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
-               if ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+       if ( $rel404 !== null ) { // thumbnail was handled via 404
+               if ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName ) ) {
                        // Request for the canonical thumbnail name
-               } elseif ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+               } elseif ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName2 ) ) {
                        // Request for the "long" thumbnail name; redirect to canonical name
                        $response = RequestContext::getMain()->getRequest()->response();
                        $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
@@ -284,7 +292,7 @@ function wfStreamThumb( array $params ) {
                } else {
                        wfThumbError( 404, "The given path of the specified thumbnail is incorrect;
                                expected '" . $img->getThumbRel( $thumbName ) . "' but got '" .
-                               rawurldecode( $params['rel404'] ) . "'." );
+                               rawurldecode( $rel404 ) . "'." );
                        return;
                }
        }
@@ -306,16 +314,26 @@ function wfStreamThumb( array $params ) {
        }
 
        $user = RequestContext::getMain()->getUser();
-       if ( $user->pingLimiter( 'renderfile' ) ) {
+       if ( !wfThumbIsStandard( $img, $params ) && $user->pingLimiter( 'renderfile-nonstandard' ) ) {
                wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
                return;
-       } elseif ( wfThumbIsAttemptThrottled( $img, $thumbName, 5 ) ) {
-               wfThumbError( 500, wfMessage( 'thumbnail_image-failure-limit', 5 ) );
+       } elseif ( $user->pingLimiter( 'renderfile' ) ) {
+               wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
+               return;
+       } elseif ( wfThumbIsAttemptThrottled( $img, $thumbName, 4 ) ) {
+               wfThumbError( 500, wfMessage( 'thumbnail_image-failure-limit', 4 ) );
                return;
        }
 
        // Thumbnail isn't already there, so create the new thumbnail...
+       $thumb = null;
        try {
+               // Record failures on PHP fatals too
+               register_shutdown_function( function() use ( &$thumb, $img, $thumbName ) {
+                       if ( $thumb === null ) { // transform() gave a fatal
+                               wfThumbIncrAttemptFailures( $img, $thumbName );
+                       }
+               } );
                $thumb = $img->transform( $params, File::RENDER_NOW );
        } catch ( Exception $ex ) {
                // Tried to select a page on a non-paged file?
@@ -345,6 +363,37 @@ function wfStreamThumb( array $params ) {
        }
 }
 
+/**
+ * Returns true if this thumbnail is one that MediaWiki generates
+ * links to on file description pages and possibly parser output.
+ *
+ * $params is considered non-standard if they involve a non-standard
+ * width or any parameter aside from width and page number. The number
+ * of possible files with standard parameters is far less than that of all
+ * possible combinations; rate-limiting for them can thus be more generious.
+ *
+ * @param File $img
+ * @param array $params
+ * @return bool
+ */
+function wfThumbIsStandard( File $img, array $params ) {
+       global $wgThumbLimits, $wgImageLimits;
+       // @TODO: use polymorphism with media handler here
+       if ( array_diff( array_keys( $params ), array( 'width', 'page' ) ) ) {
+               return false; // extra parameters present
+       }
+       if ( isset( $params['width'] ) ) {
+               $widths = $wgThumbLimits;
+               foreach ( $wgImageLimits as $pair ) {
+                       $widths[] = $pair[0];
+               }
+               if ( !in_array( $params['width'], $widths ) ) {
+                       return false;
+               }
+       }
+       return true;
+}
+
 /**
  * @param File $img
  * @param string $thumbName