Merge "Port BCP47 formatter from PHP to JavaScript"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 12 Sep 2017 11:43:49 +0000 (11:43 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 12 Sep 2017 11:43:49 +0000 (11:43 +0000)
210 files changed:
RELEASE-NOTES-1.30
autoload.php
composer.json
includes/AjaxDispatcher.php
includes/Block.php
includes/DefaultSettings.php
includes/FormOptions.php
includes/GlobalFunctions.php
includes/Linker.php
includes/OrderedStreamingForkController.php [new file with mode: 0644]
includes/OutputPage.php
includes/Pingback.php
includes/Preferences.php
includes/Sanitizer.php
includes/Title.php
includes/actions/InfoAction.php
includes/actions/MarkpatrolledAction.php
includes/api/ApiCSPReport.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatFeedWrapper.php
includes/api/ApiMain.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryGeneratorBase.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiStashEdit.php
includes/api/ApiUsageException.php
includes/api/i18n/zh-hans.json
includes/changes/ChangesListBooleanFilter.php
includes/changes/ChangesListFilter.php
includes/collation/IcuCollation.php
includes/compat/normal/UtfNormalUtil.php
includes/config/GlobalVarConfig.php
includes/config/HashConfig.php
includes/config/MultiConfig.php
includes/content/AbstractContent.php
includes/debug/logger/monolog/AvroFormatter.php
includes/deferred/WANCacheReapUpdate.php
includes/exception/MWExceptionHandler.php
includes/exception/ProcOpenError.php [new file with mode: 0644]
includes/exception/ShellDisabledError.php [new file with mode: 0644]
includes/externalstore/ExternalStoreHttp.php
includes/externalstore/ExternalStoreMwstore.php
includes/filerepo/FileBackendDBRepoWrapper.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLTagFilter.php
includes/http/Http.php
includes/http/PhpHttpRequest.php
includes/installer/InstallerSessionProvider.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/WebInstaller.php
includes/jobqueue/JobQueueSecondTestQueue.php
includes/jobqueue/aggregator/JobQueueAggregator.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/IP.php
includes/libs/MemoizedCallable.php
includes/libs/Xhprof.php
includes/libs/XhprofData.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/mime/IEContentAnalyzer.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/MemcachedBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/TransactionProfiler.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/libs/stats/NullStatsdDataFactory.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/libs/virtualrest/RestbaseVirtualRESTService.php
includes/libs/xmp/XMP.php
includes/media/WebP.php
includes/page/Article.php
includes/page/WikiPage.php
includes/parser/BlockLevelPass.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolWorkArticleView.php
includes/rcfeed/IRCColourfulRCFeedFormatter.php
includes/rcfeed/MachineReadableRCFeedFormatter.php
includes/rcfeed/RedisPubSubFeedEngine.php
includes/rcfeed/UDPRCFeedEngine.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUploadDialogModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/revisiondelete/RevDelLogList.php
includes/search/ParserOutputSearchDataExtractor.php
includes/search/SearchEngine.php
includes/search/SearchResultSet.php
includes/search/SearchSuggestionSet.php
includes/session/BotPasswordSessionProvider.php
includes/session/Session.php
includes/shell/Command.php [new file with mode: 0644]
includes/shell/Result.php [new file with mode: 0644]
includes/shell/Shell.php [new file with mode: 0644]
includes/site/HashSiteStore.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialUnlinkAccounts.php
includes/specials/SpecialUpload.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWatchlist.php
includes/tidy/Balancer.php
includes/tidy/TidyDriverBase.php
includes/utils/AutoloadGenerator.php
languages/LanguageConverter.php
languages/i18n/ais.json
languages/i18n/ar.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/ce.json
languages/i18n/en.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/got.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/kab.json
languages/i18n/krc.json
languages/i18n/lb.json
languages/i18n/lfn.json
languages/i18n/mk.json
languages/i18n/mwl.json
languages/i18n/ne.json
languages/i18n/nn.json
languages/i18n/ps.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sd.json
languages/i18n/skr-arab.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/te.json
languages/i18n/tl.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
maintenance/addSite.php
maintenance/compareParserCache.php
maintenance/findDeprecated.php
maintenance/generateSitemap.php
maintenance/migrateComments.php
maintenance/userOptions.inc
phpcs.xml
resources/Resources.php
resources/src/mediawiki.action/mediawiki.action.view.postEdit.less
resources/src/mediawiki.action/mediawiki.action.view.postEdit.monobook.css [new file with mode: 0644]
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.special/mediawiki.special.search.styles.css
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less
resources/src/mediawiki/mediawiki.apihelp.css
resources/src/mediawiki/mediawiki.feedback.css
resources/src/mediawiki/mediawiki.filewarning.less
resources/src/mediawiki/mediawiki.util.js
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/parser/DbTestPreviewer.php
tests/parser/ParserTestPrinter.php
tests/parser/ParserTestResultNormalizer.php
tests/parser/ParserTestRunner.php
tests/parser/PhpunitTestRecorder.php
tests/parser/TidySupport.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
tests/phpunit/includes/shell/CommandTest.php [new file with mode: 0644]
tests/phpunit/includes/shell/ShellTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialPageExecutor.php
tests/phpunit/includes/specials/SpecialPageTestBase.php
tests/phpunit/mocks/content/DummyContentHandlerForTesting.php
tests/phpunit/mocks/content/DummyNonTextContentHandler.php
tests/phpunit/mocks/filebackend/MockFSFile.php
tests/phpunit/suites/ParserTestTopLevelSuite.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js

index f741a4e..67a449a 100644 (file)
@@ -213,6 +213,9 @@ changes to languages because of Phabricator reports.
   page_restrictions.pr_user, tag_summary.ts_log_id, tag_summary.ts_rev_id and
   user_properties.up_user have all been made unsigned on MySQL.
 * DB_SLAVE is deprecated. DB_REPLICA should be used instead.
+* wfUsePHP() is deprecated.
+* wfFixSessionID() was removed.
+* wfShellExec() and related functions are deprecated, use Shell::command().
 
 == Compatibility ==
 MediaWiki 1.30 requires PHP 5.5.9 or later. There is experimental support for
index c7f13d5..4448204 100644 (file)
@@ -904,6 +904,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
        'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
        'MediaWiki\\MediaWikiServices' => __DIR__ . '/includes/MediaWikiServices.php',
+       'MediaWiki\\ProcOpenError' => __DIR__ . '/includes/exception/ProcOpenError.php',
        'MediaWiki\\Search\\ParserOutputSearchDataExtractor' => __DIR__ . '/includes/search/ParserOutputSearchDataExtractor.php',
        'MediaWiki\\Services\\CannotReplaceActiveServiceException' => __DIR__ . '/includes/services/CannotReplaceActiveServiceException.php',
        'MediaWiki\\Services\\ContainerDisabledException' => __DIR__ . '/includes/services/ContainerDisabledException.php',
@@ -928,6 +929,10 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Session\\SessionProviderInterface' => __DIR__ . '/includes/session/SessionProviderInterface.php',
        'MediaWiki\\Session\\Token' => __DIR__ . '/includes/session/Token.php',
        'MediaWiki\\Session\\UserInfo' => __DIR__ . '/includes/session/UserInfo.php',
+       'MediaWiki\\ShellDisabledError' => __DIR__ . '/includes/exception/ShellDisabledError.php',
+       'MediaWiki\\Shell\\Command' => __DIR__ . '/includes/shell/Command.php',
+       'MediaWiki\\Shell\\Result' => __DIR__ . '/includes/shell/Result.php',
+       'MediaWiki\\Shell\\Shell' => __DIR__ . '/includes/shell/Shell.php',
        'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
        'MediaWiki\\Tidy\\BalanceActiveFormattingElements' => __DIR__ . '/includes/tidy/Balancer.php',
        'MediaWiki\\Tidy\\BalanceElement' => __DIR__ . '/includes/tidy/Balancer.php',
@@ -1043,6 +1048,7 @@ $wgAutoloadLocalClasses = [
        'OldLocalFile' => __DIR__ . '/includes/filerepo/file/OldLocalFile.php',
        'OracleInstaller' => __DIR__ . '/includes/installer/OracleInstaller.php',
        'OracleUpdater' => __DIR__ . '/includes/installer/OracleUpdater.php',
+       'OrderedStreamingForkController' => __DIR__ . '/includes/OrderedStreamingForkController.php',
        'OrphanStats' => __DIR__ . '/maintenance/storage/orphanStats.php',
        'Orphans' => __DIR__ . '/maintenance/orphans.php',
        'OutputPage' => __DIR__ . '/includes/OutputPage.php',
index dd7567c..70d2e8f 100644 (file)
@@ -54,7 +54,7 @@
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a",
                "justinrainbow/json-schema": "~5.2",
-               "mediawiki/mediawiki-codesniffer": "0.11.0",
+               "mediawiki/mediawiki-codesniffer": "0.12.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "2.1.0",
                "nmred/kafka-php": "0.1.5",
index 2adbc80..75fcff3 100644 (file)
@@ -56,6 +56,7 @@ class AjaxDispatcher {
 
        /**
         * Load up our object with user supplied data
+        * @param Config $config
         */
        function __construct( Config $config ) {
                $this->config = $config;
index 40095f1..5a4c43e 100644 (file)
@@ -1329,7 +1329,7 @@ class Block {
         * which in turn gives User::getName().
         *
         * @param string|int|User|null $target
-        * @return array( User|String|null, Block::TYPE_ constant|null )
+        * @return array [ User|String|null, Block::TYPE_ constant|null ]
         */
        public static function parseTarget( $target ) {
                # We may have been through this before
@@ -1396,7 +1396,7 @@ class Block {
         * Get the target and target type for this particular Block.  Note that for autoblocks,
         * this returns the unredacted name; frontend functions need to call $block->getRedactedName()
         * in this situation.
-        * @return array( User|String, Block::TYPE_ constant )
+        * @return array [ User|String, Block::TYPE_ constant ]
         * @todo FIXME: This should be an integral part of the Block member variables
         */
        public function getTargetAndType() {
index cf8e089..5b77d16 100644 (file)
@@ -3394,8 +3394,8 @@ $wgExperimentalHtmlIds = false;
 /**
  * How should section IDs be encoded?
  * This array can contain 1 or 2 elements, each of them can be one of:
- * - 'html5'  is modern HTML5 style encoding with minimal escaping. Allows to
- *            display Unicode characters in many browsers' address bars.
+ * - 'html5'  is modern HTML5 style encoding with minimal escaping. Displays Unicode
+ *            characters in most browsers' address bars.
  * - 'legacy' is old MediaWiki-style encoding, e.g. 啤酒 turns into .E5.95.A4.E9.85.92
  * - 'html5-legacy' corresponds to DEPRECATED $wgExperimentalHtmlIds mode. DO NOT use
  *            it for anything but migration off that mode (see below).
@@ -4920,6 +4920,7 @@ $wgDefaultUserOptions = [
        'previewontop' => 1,
        'rcdays' => 7,
        'rcenhancedfilters' => 0,
+       'rcenhancedfilters-disable' => 0,
        'rclimit' => 50,
        'rows' => 25, // @deprecated since 1.29 No longer used in core
        'showhiddencats' => 0,
@@ -6829,19 +6830,37 @@ $wgRCWatchCategoryMembership = false;
  */
 $wgUseRCPatrol = true;
 
+/**
+ * Whether a preference is displayed for structured change filters.
+ * If false, no preference is displayed and structured change filters are disabled.
+ * If true, structured change filters are *enabled* by default, and a preference is displayed
+ * that lets users disable them.
+ *
+ * Temporary variable during development and will be removed.
+ *
+ * @since 1.30
+ */
+$wgStructuredChangeFiltersShowPreference = false;
+
 /**
  * Whether to show the new experimental views (like namespaces, tags, and users) in
  * RecentChanges filters
+ *
+ * Temporary variable during development and will be removed.
  */
 $wgStructuredChangeFiltersEnableExperimentalViews = false;
 
 /**
  * Whether to allow users to use the experimental live update feature in the new RecentChanges UI
+ *
+ * Temporary variable during development and will be removed.
  */
 $wgStructuredChangeFiltersEnableLiveUpdate = false;
 
 /**
  * Whether to enable RCFilters app on Special:Watchlist
+ *
+ * Temporary variable during development and will be removed.
  */
 $wgStructuredChangeFiltersOnWatchlist = false;
 
index 725a512..53c8d3b 100644 (file)
@@ -246,6 +246,9 @@ class FormOptions implements ArrayAccess {
 
        /**
         * @see validateBounds()
+        * @param string $name
+        * @param int $min
+        * @param int $max
         */
        public function validateIntBounds( $name, $min, $max ) {
                $this->validateBounds( $name, $min, $max );
index 799e3fc..e80ecf1 100644 (file)
@@ -26,8 +26,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 
 use Liuggio\StatsdClient\Sender\SocketSender;
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\ProcOpenError;
 use MediaWiki\Session\SessionManager;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Shell\Shell;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\DBReplicationWaitError;
 
@@ -2237,64 +2239,12 @@ function wfIniGetBool( $setting ) {
  * @param string $args,... strings to escape and glue together,
  *  or a single array of strings parameter
  * @return string
+ * @deprecated since 1.30 use MediaWiki\Shell::escape()
  */
 function wfEscapeShellArg( /*...*/ ) {
        $args = func_get_args();
-       if ( count( $args ) === 1 && is_array( reset( $args ) ) ) {
-               // If only one argument has been passed, and that argument is an array,
-               // treat it as a list of arguments
-               $args = reset( $args );
-       }
 
-       $first = true;
-       $retVal = '';
-       foreach ( $args as $arg ) {
-               if ( !$first ) {
-                       $retVal .= ' ';
-               } else {
-                       $first = false;
-               }
-
-               if ( wfIsWindows() ) {
-                       // Escaping for an MSVC-style command line parser and CMD.EXE
-                       // @codingStandardsIgnoreStart For long URLs
-                       // Refs:
-                       //  * https://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
-                       //  * https://technet.microsoft.com/en-us/library/cc723564.aspx
-                       //  * T15518
-                       //  * CR r63214
-                       // Double the backslashes before any double quotes. Escape the double quotes.
-                       // @codingStandardsIgnoreEnd
-                       $tokens = preg_split( '/(\\\\*")/', $arg, -1, PREG_SPLIT_DELIM_CAPTURE );
-                       $arg = '';
-                       $iteration = 0;
-                       foreach ( $tokens as $token ) {
-                               if ( $iteration % 2 == 1 ) {
-                                       // Delimiter, a double quote preceded by zero or more slashes
-                                       $arg .= str_replace( '\\', '\\\\', substr( $token, 0, -1 ) ) . '\\"';
-                               } elseif ( $iteration % 4 == 2 ) {
-                                       // ^ in $token will be outside quotes, need to be escaped
-                                       $arg .= str_replace( '^', '^^', $token );
-                               } else { // $iteration % 4 == 0
-                                       // ^ in $token will appear inside double quotes, so leave as is
-                                       $arg .= $token;
-                               }
-                               $iteration++;
-                       }
-                       // Double the backslashes before the end of the string, because
-                       // we will soon add a quote
-                       $m = [];
-                       if ( preg_match( '/^(.*?)(\\\\+)$/', $arg, $m ) ) {
-                               $arg = $m[1] . str_replace( '\\', '\\\\', $m[2] );
-                       }
-
-                       // Add surrounding quotes
-                       $retVal .= '"' . $arg . '"';
-               } else {
-                       $retVal .= escapeshellarg( $arg );
-               }
-       }
-       return $retVal;
+       return call_user_func_array( Shell::class . '::escape', $args );
 }
 
 /**
@@ -2302,18 +2252,10 @@ function wfEscapeShellArg( /*...*/ ) {
  *
  * @return bool|string False or 'disabled'
  * @since 1.22
+ * @deprecated since 1.30 use MediaWiki\Shell::isDisabled()
  */
 function wfShellExecDisabled() {
-       static $disabled = null;
-       if ( is_null( $disabled ) ) {
-               if ( !function_exists( 'proc_open' ) ) {
-                       wfDebug( "proc_open() is disabled\n" );
-                       $disabled = 'disabled';
-               } else {
-                       $disabled = false;
-               }
-       }
-       return $disabled;
+       return Shell::isDisabled() ? 'disabled' : false;
 }
 
 /**
@@ -2337,221 +2279,40 @@ function wfShellExecDisabled() {
  *     method. Set this to a string for an alternative method to profile from
  *
  * @return string Collected stdout as a string
+ * @deprecated since 1.30 use class MediaWiki\Shell\Shell
  */
 function wfShellExec( $cmd, &$retval = null, $environ = [],
        $limits = [], $options = []
 ) {
-       global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
-               $wgMaxShellWallClockTime, $wgShellCgroup;
-
-       $disabled = wfShellExecDisabled();
-       if ( $disabled ) {
+       if ( Shell::isDisabled() ) {
                $retval = 1;
+               // Backwards compatibility be upon us...
                return 'Unable to run external programs, proc_open() is disabled.';
        }
 
-       $includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr'];
-       $profileMethod = isset( $options['profileMethod'] ) ? $options['profileMethod'] : wfGetCaller();
-
-       $envcmd = '';
-       foreach ( $environ as $k => $v ) {
-               if ( wfIsWindows() ) {
-                       /* Surrounding a set in quotes (method used by wfEscapeShellArg) makes the quotes themselves
-                        * appear in the environment variable, so we must use carat escaping as documented in
-                        * https://technet.microsoft.com/en-us/library/cc723564.aspx
-                        * Note however that the quote isn't listed there, but is needed, and the parentheses
-                        * are listed there but doesn't appear to need it.
-                        */
-                       $envcmd .= "set $k=" . preg_replace( '/([&|()<>^"])/', '^\\1', $v ) . '&& ';
-               } else {
-                       /* Assume this is a POSIX shell, thus required to accept variable assignments before the command
-                        * http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_09_01
-                        */
-                       $envcmd .= "$k=" . escapeshellarg( $v ) . ' ';
-               }
-       }
        if ( is_array( $cmd ) ) {
-               $cmd = wfEscapeShellArg( $cmd );
+               $cmd = Shell::escape( $cmd );
        }
 
-       $cmd = $envcmd . $cmd;
+       $includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr'];
+       $profileMethod = isset( $options['profileMethod'] ) ? $options['profileMethod'] : wfGetCaller();
 
-       $useLogPipe = false;
-       if ( is_executable( '/bin/bash' ) ) {
-               $time = intval( isset( $limits['time'] ) ? $limits['time'] : $wgMaxShellTime );
-               if ( isset( $limits['walltime'] ) ) {
-                       $wallTime = intval( $limits['walltime'] );
-               } elseif ( isset( $limits['time'] ) ) {
-                       $wallTime = $time;
-               } else {
-                       $wallTime = intval( $wgMaxShellWallClockTime );
-               }
-               $mem = intval( isset( $limits['memory'] ) ? $limits['memory'] : $wgMaxShellMemory );
-               $filesize = intval( isset( $limits['filesize'] ) ? $limits['filesize'] : $wgMaxShellFileSize );
-
-               if ( $time > 0 || $mem > 0 || $filesize > 0 || $wallTime > 0 ) {
-                       $cmd = '/bin/bash ' . escapeshellarg( "$IP/includes/limit.sh" ) . ' ' .
-                               escapeshellarg( $cmd ) . ' ' .
-                               escapeshellarg(
-                                       "MW_INCLUDE_STDERR=" . ( $includeStderr ? '1' : '' ) . ';' .
-                                       "MW_CPU_LIMIT=$time; " .
-                                       'MW_CGROUP=' . escapeshellarg( $wgShellCgroup ) . '; ' .
-                                       "MW_MEM_LIMIT=$mem; " .
-                                       "MW_FILE_SIZE_LIMIT=$filesize; " .
-                                       "MW_WALL_CLOCK_LIMIT=$wallTime; " .
-                                       "MW_USE_LOG_PIPE=yes"
-                               );
-                       $useLogPipe = true;
-               } elseif ( $includeStderr ) {
-                       $cmd .= ' 2>&1';
-               }
-       } elseif ( $includeStderr ) {
-               $cmd .= ' 2>&1';
-       }
-       wfDebug( "wfShellExec: $cmd\n" );
-
-       // Don't try to execute commands that exceed Linux's MAX_ARG_STRLEN.
-       // Other platforms may be more accomodating, but we don't want to be
-       // accomodating, because very long commands probably include user
-       // input. See T129506.
-       if ( strlen( $cmd ) > SHELL_MAX_ARG_STRLEN ) {
-               throw new Exception( __METHOD__ .
-                       '(): total length of $cmd must not exceed SHELL_MAX_ARG_STRLEN' );
-       }
-
-       $desc = [
-               0 => [ 'file', 'php://stdin', 'r' ],
-               1 => [ 'pipe', 'w' ],
-               2 => [ 'file', 'php://stderr', 'w' ] ];
-       if ( $useLogPipe ) {
-               $desc[3] = [ 'pipe', 'w' ];
-       }
-       $pipes = null;
-       $scoped = Profiler::instance()->scopedProfileIn( __FUNCTION__ . '-' . $profileMethod );
-       $proc = proc_open( $cmd, $desc, $pipes );
-       if ( !$proc ) {
-               wfDebugLog( 'exec', "proc_open() failed: $cmd" );
+       try {
+               $result = Shell::command( [] )
+                       ->unsafeParams( (array)$cmd )
+                       ->environment( $environ )
+                       ->limits( $limits )
+                       ->includeStderr( $includeStderr )
+                       ->profileMethod( $profileMethod )
+                       ->execute();
+       } catch ( ProcOpenError $ex ) {
                $retval = -1;
                return '';
        }
-       $outBuffer = $logBuffer = '';
-       $emptyArray = [];
-       $status = false;
-       $logMsg = false;
-
-       /* According to the documentation, it is possible for stream_select()
-        * to fail due to EINTR. I haven't managed to induce this in testing
-        * despite sending various signals. If it did happen, the error
-        * message would take the form:
-        *
-        * stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
-        *
-        * where [4] is the value of the macro EINTR and "Interrupted system
-        * call" is string which according to the Linux manual is "possibly"
-        * localised according to LC_MESSAGES.
-        */
-       $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4;
-       $eintrMessage = "stream_select(): unable to select [$eintr]";
-
-       $running = true;
-       $timeout = null;
-       $numReadyPipes = 0;
-
-       while ( $running === true || $numReadyPipes !== 0 ) {
-               if ( $running ) {
-                       $status = proc_get_status( $proc );
-                       // If the process has terminated, switch to nonblocking selects
-                       // for getting any data still waiting to be read.
-                       if ( !$status['running'] ) {
-                               $running = false;
-                               $timeout = 0;
-                       }
-               }
 
-               $readyPipes = $pipes;
+       $retval = $result->getExitCode();
 
-               // Clear last error
-               // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged
-               @trigger_error( '' );
-               $numReadyPipes = @stream_select( $readyPipes, $emptyArray, $emptyArray, $timeout );
-               if ( $numReadyPipes === false ) {
-                       // @codingStandardsIgnoreEnd
-                       $error = error_get_last();
-                       if ( strncmp( $error['message'], $eintrMessage, strlen( $eintrMessage ) ) == 0 ) {
-                               continue;
-                       } else {
-                               trigger_error( $error['message'], E_USER_WARNING );
-                               $logMsg = $error['message'];
-                               break;
-                       }
-               }
-               foreach ( $readyPipes as $fd => $pipe ) {
-                       $block = fread( $pipe, 65536 );
-                       if ( $block === '' ) {
-                               // End of file
-                               fclose( $pipes[$fd] );
-                               unset( $pipes[$fd] );
-                               if ( !$pipes ) {
-                                       break 2;
-                               }
-                       } elseif ( $block === false ) {
-                               // Read error
-                               $logMsg = "Error reading from pipe";
-                               break 2;
-                       } elseif ( $fd == 1 ) {
-                               // From stdout
-                               $outBuffer .= $block;
-                       } elseif ( $fd == 3 ) {
-                               // From log FD
-                               $logBuffer .= $block;
-                               if ( strpos( $block, "\n" ) !== false ) {
-                                       $lines = explode( "\n", $logBuffer );
-                                       $logBuffer = array_pop( $lines );
-                                       foreach ( $lines as $line ) {
-                                               wfDebugLog( 'exec', $line );
-                                       }
-                               }
-                       }
-               }
-       }
-
-       foreach ( $pipes as $pipe ) {
-               fclose( $pipe );
-       }
-
-       // Use the status previously collected if possible, since proc_get_status()
-       // just calls waitpid() which will not return anything useful the second time.
-       if ( $running ) {
-               $status = proc_get_status( $proc );
-       }
-
-       if ( $logMsg !== false ) {
-               // Read/select error
-               $retval = -1;
-               proc_close( $proc );
-       } elseif ( $status['signaled'] ) {
-               $logMsg = "Exited with signal {$status['termsig']}";
-               $retval = 128 + $status['termsig'];
-               proc_close( $proc );
-       } else {
-               if ( $status['running'] ) {
-                       $retval = proc_close( $proc );
-               } else {
-                       $retval = $status['exitcode'];
-                       proc_close( $proc );
-               }
-               if ( $retval == 127 ) {
-                       $logMsg = "Possibly missing executable file";
-               } elseif ( $retval >= 129 && $retval <= 192 ) {
-                       $logMsg = "Probably exited with signal " . ( $retval - 128 );
-               }
-       }
-
-       if ( $logMsg !== false ) {
-               wfDebugLog( 'exec', "$logMsg: $cmd" );
-       }
-
-       return $outBuffer;
+       return $result->getStdout();
 }
 
 /**
@@ -2569,6 +2330,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = [],
  * @param array $limits Optional array with limits(filesize, memory, time, walltime)
  *   this overwrites the global wgMaxShell* limits.
  * @return string Collected stdout and stderr as a string
+ * @deprecated since 1.30 use class MediaWiki\Shell\Shell
  */
 function wfShellExecWithStderr( $cmd, &$retval = null, $environ = [], $limits = [] ) {
        return wfShellExec( $cmd, $retval, $environ, $limits,
@@ -2609,7 +2371,7 @@ function wfShellWikiCmd( $script, array $parameters = [], array $options = [] )
        }
        $cmd[] = $script;
        // Escape each parameter for shell
-       return wfEscapeShellArg( array_merge( $cmd, $parameters ) );
+       return Shell::escape( array_merge( $cmd, $parameters ) );
 }
 
 /**
@@ -2654,7 +2416,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
        fclose( $yourtextFile );
 
        # Check for a conflict
-       $cmd = wfEscapeShellArg( $wgDiff3, '-a', '--overlap-only', $mytextName,
+       $cmd = Shell::escape( $wgDiff3, '-a', '--overlap-only', $mytextName,
                $oldtextName, $yourtextName );
        $handle = popen( $cmd, 'r' );
 
@@ -2666,7 +2428,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
        pclose( $handle );
 
        # Merge differences
-       $cmd = wfEscapeShellArg( $wgDiff3, '-a', '-e', '--merge', $mytextName,
+       $cmd = Shell::escape( $wgDiff3, '-a', '-e', '--merge', $mytextName,
                $oldtextName, $yourtextName );
        $handle = popen( $cmd, 'r' );
        $result = '';
@@ -2730,7 +2492,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
        fclose( $newtextFile );
 
        // Get the diff of the two files
-       $cmd = "$wgDiff " . $params . ' ' . wfEscapeShellArg( $oldtextName, $newtextName );
+       $cmd = "$wgDiff " . $params . ' ' . Shell::escape( $oldtextName, $newtextName );
 
        $h = popen( $cmd, 'r' );
        if ( !$h ) {
@@ -2781,6 +2543,9 @@ function wfDiff( $before, $after, $params = '-u' ) {
  * @see perldoc -f use
  *
  * @param string|int|float $req_ver The version to check, can be a string, an integer, or a float
+ *
+ * @deprecated since 1.30
+ *
  * @throws MWException
  */
 function wfUsePHP( $req_ver ) {
@@ -2809,7 +2574,7 @@ function wfUsePHP( $req_ver ) {
  *
  * @see perldoc -f use
  *
- * @deprecated since 1.26, use the "requires' property of extension.json
+ * @deprecated since 1.26, use the "requires" property of extension.json
  * @param string|int|float $req_ver The version to check, can be a string, an integer, or a float
  * @throws MWException
  */
@@ -2916,14 +2681,6 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
        return Wikimedia\base_convert( $input, $sourceBase, $destBase, $pad, $lowercase, $engine );
 }
 
-/**
- * @deprecated since 1.27, PHP's session generation isn't used with
- *  MediaWiki\Session\SessionManager
- */
-function wfFixSessionID() {
-       wfDeprecated( __FUNCTION__, '1.27' );
-}
-
 /**
  * Reset the session id
  *
index aedb704..dccd99c 100644 (file)
@@ -1539,10 +1539,16 @@ class Linker {
                if ( $sectionIndex !== false ) {
                        $classes .= " tocsection-$sectionIndex";
                }
-               return "\n<li class=\"$classes\"><a href=\"#" .
-                       $anchor . '"><span class="tocnumber">' .
-                       $tocnumber . '</span> <span class="toctext">' .
-                       $tocline . '</span></a>';
+
+               // \n<li class="$classes"><a href="#$anchor"><span class="tocnumber">
+               // $tocnumber</span> <span class="toctext">$tocline</span></a>
+               return "\n" . Html::openElement( 'li', [ 'class' => $classes ] )
+                       . Html::rawElement( 'a',
+                               [ 'href' => "#$anchor" ],
+                               Html::element( 'span', [ 'class' => 'tocnumber' ], $tocnumber )
+                                       . ' '
+                                       . Html::rawElement( 'span', [ 'class' => 'toctext' ], $tocline )
+                       );
        }
 
        /**
diff --git a/includes/OrderedStreamingForkController.php b/includes/OrderedStreamingForkController.php
new file mode 100644 (file)
index 0000000..ff29cb5
--- /dev/null
@@ -0,0 +1,216 @@
+<?php
+
+/**
+ * Reads lines of work from an input stream and farms them out to multiple
+ * child streams. Each child has exactly one piece of work in flight at a given
+ * moment. Writes the result of child's work to an output stream. If numProcs
+ * <= zero the work will be performed in process.
+ *
+ * This class amends ForkController with the requirement that the output is
+ * produced in the same exact order as input values were.
+ *
+ * Currently used by CirrusSearch extension to implement CLI search script.
+ *
+ * @ingroup Maintenance
+ * @since 1.30
+ *
+ * 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
+ */
+class OrderedStreamingForkController extends ForkController {
+       /** @var callable */
+       protected $workCallback;
+       /** @var resource */
+       protected $input;
+       /** @var resource */
+       protected $output;
+       /** @var int */
+       protected $nextOutputId;
+       /** @var string[] Int key indicates order, value is data */
+       protected $delayedOutputData = [];
+
+       /**
+        * @param int $numProcs The number of worker processes to fork
+        * @param callable $workCallback A callback to call in the child process
+        *  once for each line of work to process.
+        * @param resource $input A socket to read work lines from
+        * @param resource $output A socket to write the result of work to.
+        */
+       public function __construct( $numProcs, $workCallback, $input, $output ) {
+               parent::__construct( $numProcs );
+               $this->workCallback = $workCallback;
+               $this->input = $input;
+               $this->output = $output;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function start() {
+               if ( $this->procsToStart > 0 ) {
+                       $status = parent::start();
+                       if ( $status === 'child' ) {
+                               $this->consume();
+                       }
+               } else {
+                       $status = 'parent';
+                       $this->consumeNoFork();
+               }
+               return $status;
+       }
+
+       /**
+        * @param int $numProcs
+        * @return string
+        */
+       protected function forkWorkers( $numProcs ) {
+               $this->prepareEnvironment();
+
+               $childSockets = [];
+               // Create the child processes
+               for ( $i = 0; $i < $numProcs; $i++ ) {
+                       $sockets = stream_socket_pair( STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP );
+                       // Do the fork
+                       $pid = pcntl_fork();
+                       if ( $pid === -1 || $pid === false ) {
+                               echo "Error creating child processes\n";
+                               exit( 1 );
+                       }
+
+                       if ( !$pid ) {
+                               $this->initChild();
+                               $this->childNumber = $i;
+                               $this->input = $sockets[0];
+                               $this->output = $sockets[0];
+                               fclose( $sockets[1] );
+                               return 'child';
+                       } else {
+                               // This is the parent process
+                               $this->children[$pid] = true;
+                               fclose( $sockets[0] );
+                               $childSockets[] = $sockets[1];
+                       }
+               }
+               $this->feedChildren( $childSockets );
+               foreach ( $childSockets as $socket ) {
+                       // if a child has already shutdown the sockets will be closed,
+                       // closing a second time would raise a warning.
+                       if ( is_resource( $socket ) ) {
+                               fclose( $socket );
+                       }
+               }
+               return 'parent';
+       }
+
+       /**
+        * Child worker process. Reads work from $this->input and writes the
+        * result of that work to $this->output when completed.
+        */
+       protected function consume() {
+               while ( !feof( $this->input ) ) {
+                       $line = trim( fgets( $this->input ) );
+                       if ( $line ) {
+                               list( $id, $data ) = json_decode( $line );
+                               $result = call_user_func( $this->workCallback, $data );
+                               fwrite( $this->output, json_encode( [ $id, $result ] ) . "\n" );
+                       }
+               }
+       }
+
+       /**
+        * Special cased version of self::consume() when no forking occurs
+        */
+       protected function consumeNoFork() {
+               while ( !feof( $this->input ) ) {
+                       $line = trim( fgets( $this->input ) );
+                       if ( $line ) {
+                               $result = call_user_func( $this->workCallback, $line );
+                               fwrite( $this->output, "$result\n" );
+                       }
+               }
+       }
+
+       /**
+        * Reads lines of work from $this->input and farms them out to
+        * the provided socket.
+        *
+        * @param resource[] $sockets
+        */
+       protected function feedChildren( array $sockets ) {
+               $used = [];
+               $id = 0;
+               $this->nextOutputId = 0;
+
+               while ( !feof( $this->input ) ) {
+                       $data = fgets( $this->input );
+                       if ( $used ) {
+                               do {
+                                       $this->updateAvailableSockets( $sockets, $used, $sockets ? 0 : 5 );
+                               } while ( !$sockets );
+                       }
+                       $data = trim( $data );
+                       if ( !$data ) {
+                               continue;
+                       }
+                       $socket = array_pop( $sockets );
+                       fwrite( $socket, json_encode( [ $id++, $data ] ) . "\n" );
+                       $used[] = $socket;
+               }
+               while ( $used ) {
+                       $this->updateAvailableSockets( $sockets, $used, 5 );
+               }
+       }
+
+       /**
+        * Moves sockets from $used to $sockets when they are available
+        * for more work
+        *
+        * @param resource[] &$sockets List of sockets that are waiting for work
+        * @param resource[] &$used List of sockets currently performing work
+        * @param int $timeout The number of seconds to block waiting. 0 for
+        *  non-blocking operation.
+        */
+       protected function updateAvailableSockets( &$sockets, &$used, $timeout ) {
+               $read = $used;
+               $write = $except = [];
+               stream_select( $read, $write, $except, $timeout );
+               foreach ( $read as $socket ) {
+                       $line = fgets( $socket );
+                       list( $id, $data ) = json_decode( trim( $line ) );
+                       $this->receive( (int)$id, $data );
+                       $sockets[] = $socket;
+                       $idx = array_search( $socket, $used );
+                       unset( $used[$idx] );
+               }
+       }
+
+       /**
+        * @param int $id
+        * @param string $data
+        */
+       protected function receive( $id, $data ) {
+               if ( $id !== $this->nextOutputId ) {
+                       $this->delayedOutputData[$id] = $data;
+                       return;
+               }
+               fwrite( $this->output, $data . "\n" );
+               $this->nextOutputId = $id + 1;
+               while ( isset( $this->delayedOutputData[$this->nextOutputId] ) ) {
+                       fwrite( $this->output, $this->delayedOutputData[$this->nextOutputId] . "\n" );
+                       unset( $this->delayedOutputData[$this->nextOutputId] );
+                       $this->nextOutputId++;
+               }
+       }
+}
index dd21194..5216146 100644 (file)
@@ -139,6 +139,9 @@ class OutputPage extends ContextSource {
        /** @var array Array of elements in "<head>". Parser might add its own headers! */
        protected $mHeadItems = [];
 
+       /** @var array Additional <body> classes; there are also <body> classes from other sources */
+       protected $mAdditionalBodyClasses = [];
+
        /** @var array */
        protected $mModules = [];
 
@@ -705,6 +708,16 @@ class OutputPage extends ContextSource {
                return isset( $this->mHeadItems[$name] );
        }
 
+       /**
+        * Add a class to the <body> element
+        *
+        * @since 1.30
+        * @param string|string[] $classes One or more classes to add
+        */
+       public function addBodyClasses( $classes ) {
+               $this->mAdditionalBodyClasses = array_merge( $this->mAdditionalBodyClasses, (array)$classes );
+       }
+
        /**
         * @deprecated since 1.28 Obsolete - wgUseETag experiment was removed.
         * @param string $tag
@@ -2013,7 +2026,7 @@ class OutputPage extends ContextSource {
                }
 
                $age = time() - wfTimestamp( TS_UNIX, $mtime );
-               $adaptiveTTL = max( .9 * $age, $minTTL );
+               $adaptiveTTL = max( 0.9 * $age, $minTTL );
                $adaptiveTTL = min( $adaptiveTTL, $maxTTL );
 
                $this->lowerCdnMaxage( (int)$adaptiveTTL );
@@ -2923,7 +2936,7 @@ class OutputPage extends ContextSource {
 
                $pieces[] = Html::closeElement( 'head' );
 
-               $bodyClasses = [];
+               $bodyClasses = $this->mAdditionalBodyClasses;
                $bodyClasses[] = 'mediawiki';
 
                # Classes for LTR/RTL directionality support
index bd1b2a2..c3393bc 100644 (file)
@@ -228,6 +228,7 @@ class Pingback {
         *
         * The schema for the data is located at:
         * <https://meta.wikimedia.org/wiki/Schema:MediaWikiPingback>
+        * @return bool
         */
        public function sendPingback() {
                if ( !$this->acquireLock() ) {
index c64e8a8..c29c4b9 100644 (file)
@@ -958,6 +958,15 @@ class Preferences {
                                'label-message' => 'tog-shownumberswatching',
                        ];
                }
+
+               if ( $config->get( 'StructuredChangeFiltersShowPreference' ) ) {
+                       $defaultPreferences['rcenhancedfilters-disable'] = [
+                               'type' => 'toggle',
+                               'section' => 'rc/advancedrc',
+                               'label-message' => 'rcfilters-preference-label',
+                               'help-message' => 'rcfilters-preference-help',
+                       ];
+               }
        }
 
        /**
index ed09701..7d17cd1 100644 (file)
@@ -1284,7 +1284,6 @@ class Sanitizer {
                $mode = $wgFragmentMode[self::ID_PRIMARY];
 
                $id = self::escapeIdInternal( $id, $mode );
-               $id = self::urlEscapeId( $id, $mode );
 
                return $id;
        }
@@ -1302,23 +1301,6 @@ class Sanitizer {
                global $wgExternalInterwikiFragmentMode;
 
                $id = self::escapeIdInternal( $id, $wgExternalInterwikiFragmentMode );
-               $id = self::urlEscapeId( $id, $wgExternalInterwikiFragmentMode );
-
-               return $id;
-       }
-
-       /**
-        * Helper for escapeIdFor*() functions. URL-escapes the ID if needed.
-        *
-        * @param string $id String to escape
-        * @param string $mode One of modes from $wgFragmentMode
-        * @return string
-        */
-       private static function urlEscapeId( $id, $mode ) {
-               if ( $mode === 'html5' ) {
-                       $id = urlencode( $id );
-                       $id = str_replace( '%3A', ':', $id );
-               }
 
                return $id;
        }
index 0687a15..3da6ab9 100644 (file)
@@ -253,6 +253,9 @@ class Title implements LinkTarget {
         * Create a new Title from text, such as what one would find in a link. De-
         * codes any HTML entities in the text.
         *
+        * Title objects returned by this method are guaranteed to be valid, and
+        * thus return true from the isValid() method.
+        *
         * @param string|int|null $text The link text; spaces, prefixes, and an
         *   initial ':' indicating the main namespace are accepted.
         * @param int $defaultNamespace The namespace to use if none is specified
@@ -284,6 +287,9 @@ class Title implements LinkTarget {
         *
         * The exception subclasses encode detailed information about why the title is invalid.
         *
+        * Title objects returned by this method are guaranteed to be valid, and
+        * thus return true from the isValid() method.
+        *
         * @see Title::newFromText
         *
         * @since 1.25
@@ -500,10 +506,19 @@ class Title implements LinkTarget {
 
        /**
         * Create a new Title from a namespace index and a DB key.
-        * It's assumed that $ns and $title are *valid*, for instance when
-        * they came directly from the database or a special page name.
-        * For convenience, spaces are converted to underscores so that
-        * eg user_text fields can be used directly.
+        *
+        * It's assumed that $ns and $title are safe, for instance when
+        * they came directly from the database or a special page name,
+        * not from user input.
+        *
+        * No validation is applied. For convenience, spaces are normalized
+        * to underscores, so that e.g. user_text fields can be used directly.
+        *
+        * @note This method may return Title objects that are "invalid"
+        * according to the isValid() method. This is usually caused by
+        * configuration changes: e.g. a namespace that was once defined is
+        * no longer configured, or a character that was once allowed in
+        * titles is now forbidden.
         *
         * @param int $ns The namespace of the article
         * @param string $title The unprefixed database key form
@@ -529,6 +544,10 @@ class Title implements LinkTarget {
         * The parameters will be checked for validity, which is a bit slower
         * than makeTitle() but safer for user-provided data.
         *
+        * Title objects returned by makeTitleSafe() are guaranteed to be valid,
+        * that is, they return true from the isValid() method. If no valid Title
+        * can be constructed from the input, this method returns null.
+        *
         * @param int $ns The namespace of the article
         * @param string $title Database key form
         * @param string $fragment The link fragment (after the "#")
@@ -536,6 +555,9 @@ class Title implements LinkTarget {
         * @return Title|null The new object, or null on an error
         */
        public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) {
+               // NOTE: ideally, this would just call makeTitle() and then isValid(),
+               // but presently, that means more overhead on a potential performance hotspot.
+
                if ( !MWNamespace::exists( $ns ) ) {
                        return null;
                }
@@ -777,6 +799,36 @@ class Title implements LinkTarget {
                }
        }
 
+       /**
+        * Returns true if the title is valid, false if it is invalid.
+        *
+        * Valid titles can be round-tripped via makeTitleSafe() and newFromText().
+        * Invalid titles may get returned from makeTitle(), and it may be useful to
+        * allow them to exist, e.g. in order to process log entries about pages in
+        * namespaces that belong to extensions that are no longer installed.
+        *
+        * @note This method is relatively expensive. When constructing Title
+        * objects that need to be valid, use an instantiator method that is guaranteed
+        * to return valid titles, such as makeTitleSafe() or newFromText().
+        *
+        * @return bool
+        */
+       public function isValid() {
+               $ns = $this->getNamespace();
+
+               if ( !MWNamespace::exists( $ns ) ) {
+                       return false;
+               }
+
+               try {
+                       $parser = MediaWikiServices::getInstance()->getTitleParser();
+                       $parser->parseTitle( $this->getDBkey(), $ns );
+                       return true;
+               } catch ( MalformedTitleException $ex ) {
+                       return false;
+               }
+       }
+
        /**
         * Determine whether the object refers to a page within
         * this project (either this wiki or a wiki with a local
@@ -1356,7 +1408,7 @@ class Title implements LinkTarget {
         * get the talk page, if it is a subject page get the talk page
         *
         * @since 1.25
-        * @throws MWException
+        * @throws MWException If the page doesn't have an other page
         * @return Title
         */
        public function getOtherPage() {
@@ -1366,6 +1418,9 @@ class Title implements LinkTarget {
                if ( $this->isTalkPage() ) {
                        return $this->getSubjectPage();
                } else {
+                       if ( !$this->canHaveTalkPage() ) {
+                               throw new MWException( "{$this->getPrefixedText()} does not have an other page" );
+                       }
                        return $this->getTalkPage();
                }
        }
@@ -1742,7 +1797,7 @@ class Title implements LinkTarget {
         * @see self::getLocalURL for the arguments.
         * @param array|string $query
         * @param string $proto Protocol type to use in URL
-        * @return String. A url suitable to use in an HTTP location header.
+        * @return string A url suitable to use in an HTTP location header.
         */
        public function getFullUrlForRedirect( $query = '', $proto = PROTO_CURRENT ) {
                $target = $this;
@@ -1920,6 +1975,8 @@ class Title implements LinkTarget {
         * NOTE: Unlike getInternalURL(), the canonical URL includes the fragment
         *
         * @see self::getLocalURL for the arguments.
+        * @param string $query
+        * @param string|bool $query2
         * @return string The URL
         * @since 1.18
         */
index d3ba0aa..c5cd89f 100644 (file)
@@ -153,6 +153,7 @@ class InfoAction extends FormlessAction {
         * Creates a header that can be added to the output.
         *
         * @param string $header The header text.
+        * @param string $canonicalId
         * @return string The HTML.
         */
        protected function makeHeader( $header, $canonicalId ) {
index 611e683..66bedb2 100644 (file)
@@ -85,6 +85,7 @@ class MarkpatrolledAction extends FormAction {
        }
 
        /**
+        * @param array $data
         * @return bool|array True for success, false for didn't-try, array of errors on failure
         */
        public function onSubmit( $data ) {
index a4631d6..0df0ca9 100644 (file)
@@ -216,6 +216,7 @@ class ApiCSPReport extends ApiBase {
 
        /**
         * Mark as internal. This isn't meant to be used by normal api users
+        * @return bool
         */
        public function isInternal() {
                return true;
@@ -223,6 +224,7 @@ class ApiCSPReport extends ApiBase {
 
        /**
         * Even if you don't have read rights, we still want your report.
+        * @return bool
         */
        public function isReadMode() {
                return false;
@@ -232,6 +234,7 @@ class ApiCSPReport extends ApiBase {
         * Doesn't touch db, so max lag should be rather irrelavent.
         *
         * Also, this makes sure that reports aren't lost during lag events.
+        * @return bool
         */
        public function shouldCheckMaxLag() {
                return false;
index 36247dd..06eaa19 100644 (file)
@@ -132,6 +132,7 @@ abstract class ApiFormatBase extends ApiBase {
 
        /**
         * Overridden to honor $this->forceDefaultParams(), if applicable
+        * @inheritDoc
         * @since 1.26
         */
        protected function getParameterFromSettings( $paramName, $paramSettings, $parseLimit ) {
index d2bfd48..3ab5ab9 100644 (file)
@@ -72,6 +72,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
         * This class expects the result data to be in a custom format set by self::setResult()
         * $result['_feed'] - an instance of one of the $wgFeedClasses classes
         * $result['_feeditems'] - an array of FeedItem instances
+        * @param bool $unused
         */
        public function initPrinter( $unused = false ) {
                parent::initPrinter( $unused );
index e69300b..1415640 100644 (file)
@@ -1870,7 +1870,7 @@ class ApiMain extends ApiBase {
                ];
        }
 
-       /** @see ApiBase::getExamplesMessages() */
+       /** @inheritDoc */
        protected function getExamplesMessages() {
                return [
                        'action=help'
index 83227a2..35f93e0 100644 (file)
@@ -25,6 +25,7 @@
  * @file
  */
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * API interface for page purging
@@ -98,7 +99,7 @@ class ApiPurge extends ApiBase {
                                                $r['linkupdate'] = true;
 
                                                if ( $enableParserCache ) {
-                                                       $pcache = ParserCache::singleton();
+                                                       $pcache = MediaWikiServices::getInstance()->getParserCache();
                                                        $pcache->save( $p_result, $page, $popts );
                                                }
                                        }
index 987bb99..44a46b8 100644 (file)
@@ -169,7 +169,7 @@ class ApiQuery extends ApiBase {
         * as the first, regardless of the values of $db and $groups
         * @param string $name Name to assign to the database connection
         * @param int $db One of the DB_* constants
-        * @param array $groups Query groups
+        * @param string|string[] $groups Query groups
         * @return IDatabase
         */
        public function getNamedDB( $name, $db, $groups ) {
index fe16134..6987dfb 100644 (file)
@@ -97,9 +97,7 @@ abstract class ApiQueryBase extends ApiBase {
                return $this->mQueryModule;
        }
 
-       /**
-        * @see ApiBase::getParent()
-        */
+       /** @inheritDoc */
        public function getParent() {
                return $this->getQuery();
        }
@@ -121,7 +119,7 @@ abstract class ApiQueryBase extends ApiBase {
         * See ApiQuery::getNamedDB() for more information
         * @param string $name Name to assign to the database connection
         * @param int $db One of the DB_* constants
-        * @param array $groups Query groups
+        * @param string|string[] $groups Query groups
         * @return IDatabase
         */
        public function selectNamedDB( $name, $db, $groups ) {
index f7b94c7..5acd75f 100644 (file)
@@ -93,12 +93,9 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
                }
        }
 
-       /**
-        * @see ApiBase::getHelpFlags()
-        *
-        * Corresponding messages: api-help-flag-generator
-        */
+       /** @inheritDoc */
        protected function getHelpFlags() {
+               // Corresponding messages: api-help-flag-generator
                $flags = parent::getHelpFlags();
                $flags[] = 'generator';
                return $flags;
index d29a763..4b34091 100644 (file)
@@ -137,7 +137,6 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
 
                $order[] = $this->prefix . '_title' . $sort;
                $this->addOption( 'ORDER BY', $order );
-               $this->addOption( 'USE INDEX', [ $this->table => 'PRIMARY' ] );
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
                $res = $this->select( __METHOD__ );
index 9af4e3e..63e0748 100644 (file)
@@ -287,14 +287,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        );
                        $showRedirects = $this->fld_redirect || isset( $show['redirect'] )
                                || isset( $show['!redirect'] );
-
-                       if ( $this->fld_comment || $this->fld_parsedcomment ) {
-                               $this->commentStore = new CommentStore( 'rc_comment' );
-                               $commentQuery = $this->commentStore->getJoin();
-                               $this->addTables( $commentQuery['tables'] );
-                               $this->addFields( $commentQuery['fields'] );
-                               $this->addJoinConds( $commentQuery['joins'] );
-                       }
                }
                $this->addFieldsIf( [ 'rc_this_oldid' ],
                        $resultPageSet && $params['generaterevisions'] );
@@ -360,6 +352,15 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                }
 
                $this->token = $params['token'];
+
+               if ( $this->fld_comment || $this->fld_parsedcomment || $this->token ) {
+                       $this->commentStore = new CommentStore( 'rc_comment' );
+                       $commentQuery = $this->commentStore->getJoin();
+                       $this->addTables( $commentQuery['tables'] );
+                       $this->addFields( $commentQuery['fields'] );
+                       $this->addJoinConds( $commentQuery['joins'] );
+               }
+
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
                $hookData = [];
index 2ab8524..1e3b2c7 100644 (file)
@@ -34,6 +34,7 @@ use MediaWiki\MediaWikiServices;
  */
 class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
+       /** @var CommentStore */
        private $commentStore;
 
        public function __construct( ApiQuery $query, $moduleName ) {
@@ -260,10 +261,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
        private function extractOutputData( WatchedItem $watchedItem, array $recentChangeInfo ) {
                /* Determine the title of the page that has been changed. */
-               $title = Title::makeTitle(
-                       $watchedItem->getLinkTarget()->getNamespace(),
-                       $watchedItem->getLinkTarget()->getDBkey()
-               );
+               $title = Title::newFromLinkTarget( $watchedItem->getLinkTarget() );
                $user = $this->getUser();
 
                /* Our output data. */
index d03fca8..8a9de06 100644 (file)
@@ -74,6 +74,9 @@ class ApiStashEdit extends ApiBase {
                if ( strlen( $params['stashedtexthash'] ) ) {
                        // Load from cache since the client indicates the text is the same as last stash
                        $textHash = $params['stashedtexthash'];
+                       if ( !preg_match( '/^[0-9a-f]{40}$/', $textHash ) ) {
+                               $this->dieWithError( 'apierror-stashedit-missingtext', 'missingtext' );
+                       }
                        $textKey = $cache->makeKey( 'stashedit', 'text', $textHash );
                        $text = $cache->get( $textKey );
                        if ( !is_string( $text ) ) {
index 17655ec..47902a7 100644 (file)
@@ -152,7 +152,7 @@ class ApiUsageException extends UsageException implements ILocalizedException {
        }
 
        /**
-        * @returns ApiMessage
+        * @return ApiMessage
         */
        private function getApiMessage() {
                $errors = $this->status->getErrorsByType( 'error' );
index dbd4d0e..1ce0369 100644 (file)
        "apihelp-feedcontributions-summary": "返回用户贡献纲要。",
        "apihelp-feedcontributions-param-feedformat": "纲要的格式。",
        "apihelp-feedcontributions-param-user": "获取哪些用户的贡献。",
-       "apihelp-feedcontributions-param-namespace": "è¿\87滤å\93ªäº\9bå\91½å\90\8d空间的贡献。",
+       "apihelp-feedcontributions-param-namespace": "è¿\87滤å\93ªäº\9bå\90\8då­\97空间的贡献。",
        "apihelp-feedcontributions-param-year": "起始年份(及更早)。",
        "apihelp-feedcontributions-param-month": "起始月份(及更早)。",
        "apihelp-feedcontributions-param-tagfilter": "过滤有这些标签的贡献者。",
        "apihelp-feedcontributions-example-simple": "返回用户<kbd>Example</kbd>的贡献。",
        "apihelp-feedrecentchanges-summary": "返回最近更改的摘要。",
        "apihelp-feedrecentchanges-param-feedformat": "纲要的格式。",
-       "apihelp-feedrecentchanges-param-namespace": "ç\94¨äº\8eé\99\90å\88¶ç»\93æ\9e\9cç\9a\84å\91½å\90\8d空间。",
-       "apihelp-feedrecentchanges-param-invert": "é\99¤æ\89\80é\80\89å®\9aè\80\85å¤\96ç\9a\84æ\89\80æ\9c\89å\91½å\90\8d空间。",
-       "apihelp-feedrecentchanges-param-associated": "å\8c\85æ\8b¬ç\9b¸å\85³ç\9a\84å\91½å\90\8d空间(讨论页或主要)。",
+       "apihelp-feedrecentchanges-param-namespace": "ç\94¨äº\8eé\99\90å\88¶ç»\93æ\9e\9cç\9a\84å\90\8då­\97空间。",
+       "apihelp-feedrecentchanges-param-invert": "é\99¤æ\89\80é\80\89å®\9aè\80\85å¤\96ç\9a\84æ\89\80æ\9c\89å\90\8då­\97空间。",
+       "apihelp-feedrecentchanges-param-associated": "å\8c\85æ\8b¬ç\9b¸å\85³ç\9a\84å\90\8då­\97空间(讨论页或主要)。",
        "apihelp-feedrecentchanges-param-days": "用于限制结果的天数。",
        "apihelp-feedrecentchanges-param-limit": "所要返回结果的最大数目。",
        "apihelp-feedrecentchanges-param-from": "显示自那时以来的更改。",
        "apihelp-query+protectedtitles-paramvalue-prop-expiry": "添加保护将被提升时的时间戳。",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "添加保护级别。",
        "apihelp-query+protectedtitles-example-simple": "受保护标题列表。",
-       "apihelp-query+protectedtitles-example-generator": "æ\89¾å\88°ä¸»å\91½å\90\8d空间中已保护的标题的链接。",
+       "apihelp-query+protectedtitles-example-generator": "æ\89¾å\88°ä¸»å\90\8då­\97空间中已保护的标题的链接。",
        "apihelp-query+querypage-summary": "获取由基于QueryPage的特殊页面提供的列表。",
        "apihelp-query+querypage-param-page": "特殊页面的名称。注意其区分大小写。",
        "apihelp-query+querypage-param-limit": "返回的结果数。",
index 913bd38..2a7ba88 100644 (file)
@@ -127,7 +127,7 @@ class ChangesListBooleanFilter extends ChangesListFilter {
                }
 
                if ( isset( $filterDefinition['default'] ) ) {
-                       $this->defaultValue = $filterDefinition['default'];
+                       $this->setDefault( $filterDefinition['default'] );
                } else {
                        throw new MWException( 'You must set a default' );
                }
@@ -156,12 +156,14 @@ class ChangesListBooleanFilter extends ChangesListFilter {
        }
 
        /**
-        * Sets default
+        * Sets default.  It must be a boolean.
+        *
+        * It will be coerced to boolean.
         *
         * @param bool $defaultValue
         */
        public function setDefault( $defaultValue ) {
-               $this->defaultValue = $defaultValue;
+               $this->defaultValue = (bool)$defaultValue;
        }
 
        /**
@@ -236,9 +238,12 @@ class ChangesListBooleanFilter extends ChangesListFilter {
         */
        public function isSelected( FormOptions $opts ) {
                return !$opts[ $this->getName() ] &&
-                       array_filter( $this->getSiblings(), function ( $sibling ) use ( $opts ) {
-                               return $opts[ $sibling->getName() ];
-                       } );
+                       array_filter(
+                               $this->getSiblings(),
+                               function ( ChangesListBooleanFilter $sibling ) use ( $opts ) {
+                                       return $opts[ $sibling->getName() ];
+                               }
+                       );
        }
 
        /**
index 0b34a5d..2fc1006 100644 (file)
@@ -309,6 +309,7 @@ abstract class ChangesListFilter {
         * structured UI.
         *
         * This can either be the exact filter, or a new filter that replaces it.
+        * @return bool
         */
        public function isFeatureAvailableOnStructuredUi() {
                return $this->displaysOnStructuredUi();
index 54b04ee..efda596 100644 (file)
@@ -474,6 +474,8 @@ class IcuCollation extends Collation {
        }
 
        /**
+        * @param string $index
+        * @return string
         * @since 1.16.3
         */
        public function getLetterByIndex( $index ) {
@@ -481,6 +483,8 @@ class IcuCollation extends Collation {
        }
 
        /**
+        * @param string $index
+        * @return string
         * @since 1.16.3
         */
        public function getSortKeyByLetterIndex( $index ) {
@@ -488,6 +492,8 @@ class IcuCollation extends Collation {
        }
 
        /**
+        * @param string $index
+        * @return string
         * @since 1.16.3
         */
        public function getFirstLetterCount() {
@@ -496,6 +502,8 @@ class IcuCollation extends Collation {
 
        /**
         * Test if a code point is a CJK (Chinese, Japanese, Korean) character
+        * @param int $codepoint
+        * @return bool
         * @since 1.16.3
         */
        public static function isCjk( $codepoint ) {
index 8791e4c..d60c8e3 100644 (file)
@@ -90,7 +90,7 @@ function utf8ToCodepoint( $char ) {
  * Escape a string for inclusion in a PHP single-quoted string literal.
  *
  * @param string $string string to be escaped.
- * @return String: escaped string.
+ * @return string escaped string.
  * @public
  * @deprecated since 1.25, use UtfNormal\Utils directly
  */
index 589f7d3..6295371 100644 (file)
@@ -46,7 +46,7 @@ class GlobalVarConfig implements Config {
        }
 
        /**
-        * @see Config::get
+        * @inheritDoc
         */
        public function get( $name ) {
                if ( !$this->has( $name ) ) {
@@ -56,7 +56,7 @@ class GlobalVarConfig implements Config {
        }
 
        /**
-        * @see Config::has
+        * @inheritDoc
         */
        public function has( $name ) {
                return $this->hasWithPrefix( $this->prefix, $name );
index 4d6c68c..d020d20 100644 (file)
@@ -49,7 +49,7 @@ class HashConfig implements Config, MutableConfig {
        }
 
        /**
-        * @see Config::get
+        * @inheritDoc
         */
        public function get( $name ) {
                if ( !$this->has( $name ) ) {
@@ -60,7 +60,8 @@ class HashConfig implements Config, MutableConfig {
        }
 
        /**
-        * @see Config::has
+        * @inheritDoc
+        * @since 1.24
         */
        public function has( $name ) {
                return array_key_exists( $name, $this->settings );
@@ -68,6 +69,8 @@ class HashConfig implements Config, MutableConfig {
 
        /**
         * @see MutableConfig::set
+        * @param string $name
+        * @param mixed $value
         */
        public function set( $name, $value ) {
                $this->settings[$name] = $value;
index cbb65aa..2bbc84c 100644 (file)
@@ -45,7 +45,7 @@ class MultiConfig implements Config {
        }
 
        /**
-        * @see Config::get
+        * @inheritDoc
         */
        public function get( $name ) {
                foreach ( $this->configs as $config ) {
@@ -58,7 +58,7 @@ class MultiConfig implements Config {
        }
 
        /**
-        * @see Config::has
+        * @inheritDoc
         */
        public function has( $name ) {
                foreach ( $this->configs as $config ) {
index 1d472e0..c12d28d 100644 (file)
@@ -55,6 +55,7 @@ abstract class AbstractContent implements Content {
         * @since 1.21
         *
         * @see Content::getModel
+        * @return string
         */
        public function getModel() {
                return $this->model_id;
@@ -82,6 +83,7 @@ abstract class AbstractContent implements Content {
         * @since 1.21
         *
         * @see Content::getContentHandler
+        * @return ContentHandler
         */
        public function getContentHandler() {
                return ContentHandler::getForContent( $this );
@@ -91,6 +93,7 @@ abstract class AbstractContent implements Content {
         * @since 1.21
         *
         * @see Content::getDefaultFormat
+        * @return string
         */
        public function getDefaultFormat() {
                return $this->getContentHandler()->getDefaultFormat();
@@ -100,6 +103,7 @@ abstract class AbstractContent implements Content {
         * @since 1.21
         *
         * @see Content::getSupportedFormats
+        * @return string[]
         */
        public function getSupportedFormats() {
                return $this->getContentHandler()->getSupportedFormats();
@@ -334,6 +338,7 @@ abstract class AbstractContent implements Content {
        /**
         * @since 1.21
         *
+        * @param string|int $sectionId
         * @return null
         *
         * @see Content::getSection
@@ -345,6 +350,9 @@ abstract class AbstractContent implements Content {
        /**
         * @since 1.21
         *
+        * @param string|int|null|bool $sectionId
+        * @param Content $with
+        * @param string $sectionTitle
         * @return null
         *
         * @see Content::replaceSection
@@ -356,6 +364,9 @@ abstract class AbstractContent implements Content {
        /**
         * @since 1.21
         *
+        * @param Title $title
+        * @param User $user
+        * @param ParserOptions $popts
         * @return Content $this
         *
         * @see Content::preSaveTransform
@@ -367,6 +378,7 @@ abstract class AbstractContent implements Content {
        /**
         * @since 1.21
         *
+        * @param string $header
         * @return Content $this
         *
         * @see Content::addSectionHeader
@@ -378,6 +390,9 @@ abstract class AbstractContent implements Content {
        /**
         * @since 1.21
         *
+        * @param Title $title
+        * @param ParserOptions $popts
+        * @param array $params
         * @return Content $this
         *
         * @see Content::preloadTransform
@@ -389,6 +404,10 @@ abstract class AbstractContent implements Content {
        /**
         * @since 1.21
         *
+        * @param WikiPage $page
+        * @param int $flags
+        * @param int $parentRevId
+        * @param User $user
         * @return Status
         *
         * @see Content::prepareSave
@@ -405,7 +424,7 @@ abstract class AbstractContent implements Content {
         * @since 1.21
         *
         * @param WikiPage $page
-        * @param ParserOutput $parserOutput
+        * @param ParserOutput|null $parserOutput
         *
         * @return LinksDeletionUpdate[]
         *
index 2a50566..a395e0d 100644 (file)
@@ -61,7 +61,7 @@ class AvroFormatter implements FormatterInterface {
        protected $writer;
 
        /**
-        * @var array $schemas Map from Monolog channel to Avro schema.
+        * @param array $schemas Map from Monolog channel to Avro schema.
         *  Each schema can be either the JSON string or decoded into PHP
         *  arrays.
         */
@@ -120,7 +120,7 @@ class AvroFormatter implements FormatterInterface {
        /**
         * Get the writer for the named channel
         *
-        * @var string $channel Name of the schema to fetch
+        * @param string $channel Name of the schema to fetch
         * @return \AvroSchema|null
         */
        protected function getSchema( $channel ) {
@@ -147,7 +147,7 @@ class AvroFormatter implements FormatterInterface {
        /**
         * Get the writer for the named channel
         *
-        * @var string $channel Name of the schema
+        * @param string $channel Name of the schema
         * @return int|null
         */
        public function getSchemaRevisionId( $channel ) {
index cbeb1fc..2e5298c 100644 (file)
@@ -98,7 +98,7 @@ class WANCacheReapUpdate implements DeferrableUpdate {
         * @see WANObjectCacheRepear
         * @param WANObjectCache $cache
         * @param TitleValue $t
-        * @returns string[]
+        * @return string[]
         */
        public function getEventAffectedKeys( WANObjectCache $cache, TitleValue $t ) {
                /** @var WikiPage[]|LocalFile[]|User[] $entities */
index bf232e9..a2ec391 100644 (file)
@@ -441,6 +441,24 @@ TXT;
                return "[$id] $url   $type from line $line of $file: $message";
        }
 
+       /**
+        * Get a normalised message for formatting with PSR-3 log event context.
+        *
+        * Must be used together with `getLogContext()` to be useful.
+        *
+        * @since 1.30
+        * @param Exception|Throwable $e
+        * @return string
+        */
+       public static function getLogNormalMessage( $e ) {
+               $type = get_class( $e );
+               $file = $e->getFile();
+               $line = $e->getLine();
+               $message = $e->getMessage();
+
+               return "[{exception_id}] {exception_url}   $type from line $line of $file: $message";
+       }
+
        /**
         * @param Exception|Throwable $e
         * @return string
@@ -468,6 +486,7 @@ TXT;
                return [
                        'exception' => $e,
                        'exception_id' => WebRequest::getRequestId(),
+                       'exception_url' => self::getURL() ?: '[no req]',
                        'caught_by' => $catcher
                ];
        }
@@ -595,7 +614,7 @@ TXT;
                if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
                        $logger = LoggerFactory::getInstance( 'exception' );
                        $logger->error(
-                               self::getLogMessage( $e ),
+                               self::getLogNormalMessage( $e ),
                                self::getLogContext( $e, $catcher )
                        );
 
@@ -629,7 +648,7 @@ TXT;
                        $logger = LoggerFactory::getInstance( $channel );
                        $logger->log(
                                $level,
-                               self::getLogMessage( $e ),
+                               self::getLogNormalMessage( $e ),
                                self::getLogContext( $e, $catcher )
                        );
                }
diff --git a/includes/exception/ProcOpenError.php b/includes/exception/ProcOpenError.php
new file mode 100644 (file)
index 0000000..f00bcd4
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki;
+
+use Exception;
+
+class ProcOpenError extends Exception {
+       public function __construct() {
+               parent::__construct( 'proc_open() returned error!' );
+       }
+}
diff --git a/includes/exception/ShellDisabledError.php b/includes/exception/ShellDisabledError.php
new file mode 100644 (file)
index 0000000..203b58d
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki;
+
+use Exception;
+
+/**
+ * @since 1.30
+ */
+class ShellDisabledError extends Exception {
+       public function __construct() {
+               parent::__construct( 'Unable to run external programs, proc_open() is disabled' );
+       }
+}
index c1f0651..8e1e49f 100644 (file)
@@ -29,6 +29,9 @@
 class ExternalStoreHttp extends ExternalStoreMedium {
        /**
         * @see ExternalStoreMedium::fetchFromURL()
+        * @param string $url
+        * @return string|bool
+        * @throws MWException
         */
        public function fetchFromURL( $url ) {
                return Http::get( $url, [], __METHOD__ );
@@ -36,6 +39,10 @@ class ExternalStoreHttp extends ExternalStoreMedium {
 
        /**
         * @see ExternalStoreMedium::store()
+        * @param string $cluster
+        * @param string $data
+        * @return string|bool
+        * @throws MWException
         */
        public function store( $cluster, $data ) {
                throw new MWException( "ExternalStoreHttp is read-only and does not support store()." );
index b05843c..5395f56 100644 (file)
@@ -35,6 +35,8 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
         * The URL returned is of the form of the form mwstore://backend/container/wiki/id
         *
         * @see ExternalStoreMedium::fetchFromURL()
+        * @param string $url
+        * @return bool
         */
        public function fetchFromURL( $url ) {
                $be = FileBackendGroup::singleton()->backendFromPath( $url );
@@ -73,6 +75,10 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
 
        /**
         * @see ExternalStoreMedium::store()
+        * @param string $backend
+        * @param string $data
+        * @return string|bool
+        * @throws MWException
         */
        public function store( $backend, $data ) {
                $be = FileBackendGroup::singleton()->get( $backend );
index 0d5a15d..21b7ac2 100644 (file)
@@ -298,6 +298,7 @@ class FileBackendDBRepoWrapper extends FileBackend {
         *
         * @param string $function
         * @param array $params
+        * @return mixed
         */
        protected function translateSrcParams( $function, array $params ) {
                $latest = !empty( $params['latest'] );
index 55a19e8..45a5c82 100644 (file)
@@ -257,7 +257,7 @@ class ForeignAPIRepo extends FileRepo {
         * @param string $name
         * @param int $width
         * @param int $height
-        * @param array $result Out parameter that will be changed by the function.
+        * @param array &$result
         * @param string $otherParams
         *
         * @return bool
index 810f788..8aea7ab 100644 (file)
@@ -347,7 +347,7 @@ class LocalFile extends File {
        function getCacheFields( $prefix = 'img_' ) {
                static $fields = [ 'size', 'width', 'height', 'bits', 'media_type',
                        'major_mime', 'minor_mime', 'metadata', 'timestamp', 'sha1', 'user',
-                       'user_text', 'description' ];
+                       'user_text' ];
                static $results = [];
 
                if ( $prefix == '' ) {
@@ -359,6 +359,7 @@ class LocalFile extends File {
                        foreach ( $fields as $field ) {
                                $prefixedFields[] = $prefix . $field;
                        }
+                       $prefixedFields += CommentStore::newKey( "{$prefix}description" )->getFields();
                        $results[$prefix] = $prefixedFields;
                }
 
@@ -536,6 +537,10 @@ class LocalFile extends File {
                $this->dataLoaded = true;
                $this->extraDataLoaded = true;
 
+               $this->description = CommentStore::newKey( "{$prefix}description" )
+                       // $row is probably using getFields() from self::getCacheFields()
+                       ->getCommentLegacy( wfGetDB( DB_REPLICA ), $row )->text;
+
                $array = $this->decodeRow( $row, $prefix );
 
                foreach ( $array as $name => $value ) {
index b46e1e4..ee172e1 100644 (file)
@@ -396,6 +396,7 @@ class OldLocalFile extends LocalFile {
         *
         * This is the case for a couple files on Wikimedia servers where
         * the old version is "lost".
+        * @return bool
         */
        public function exists() {
                $archiveName = $this->getArchiveName();
index 3f1c590..dfd18ba 100644 (file)
@@ -660,6 +660,8 @@ abstract class HTMLFormField {
 
        /**
         * Get a FieldLayout (or subclass thereof) to wrap this field in when using OOUI output.
+        * @param string $inputField
+        * @param array $config
         * @return OOUI\FieldLayout|OOUI\ActionFieldLayout
         */
        protected function getFieldLayoutOOUI( $inputField, $config ) {
index f58acbe..38f9a0a 100644 (file)
@@ -23,6 +23,15 @@ class HTMLTagFilter extends HTMLFormField {
                return '';
        }
 
+       public function getOOUI( $value ) {
+               $this->tagFilter = ChangeTags::buildTagFilterSelector(
+                       $value, true, $this->mParent->getContext() );
+               if ( $this->tagFilter ) {
+                       return parent::getOOUI( $value );
+               }
+               return new OOUI\FieldLayout( new OOUI\Widget() );
+       }
+
        public function getInputHTML( $value ) {
                if ( $this->tagFilter ) {
                        // we only need the select field, HTMLForm should handle the label
@@ -30,4 +39,12 @@ class HTMLTagFilter extends HTMLFormField {
                }
                return '';
        }
+
+       public function getInputOOUI( $value ) {
+               if ( $this->tagFilter ) {
+                       // we only need the select field, HTMLForm should handle the label
+                       return $this->tagFilter[1];
+               }
+               return '';
+       }
 }
index c10b312..6eff6c9 100644 (file)
@@ -168,6 +168,7 @@ class Http {
        /**
         * Get a configured MultiHttpClient
         * @param array $options
+        * @return MultiHttpClient
         */
        public static function createMultiClient( $options = [] ) {
                global $wgHTTPConnectTimeout, $wgHTTPTimeout, $wgHTTPProxy;
index 3f3803b..0c5d162 100644 (file)
@@ -88,6 +88,8 @@ class PhpHttpRequest extends MWHttpRequest {
         * so normal methods of handling errors programmatically
         * like get_last_error() don't work.
         * @internal
+        * @param int $errno
+        * @param string $errstr
         */
        public function errorHandler( $errno, $errstr ) {
                $n = count( $this->fopenErrors ) + 1;
index bfb1a69..568ef51 100644 (file)
@@ -30,6 +30,8 @@ use MediaWiki\Session\SessionInfo;
 class InstallerSessionProvider extends SessionProvider {
        /**
         * Pretend there is a session, to avoid MWCryptRand overhead
+        * @param WebRequest $request
+        * @return SessionInfo
         */
        public function provideSessionInfo( WebRequest $request ) {
                return new SessionInfo( 1, [
@@ -40,6 +42,7 @@ class InstallerSessionProvider extends SessionProvider {
 
        /**
         * Yes we will treat your data with great care!
+        * @return bool
         */
        public function persistsSessionId() {
                return true;
@@ -47,6 +50,7 @@ class InstallerSessionProvider extends SessionProvider {
 
        /**
         * Sure, you can be whoever you want, as long as you have ID 0
+        * @return bool
         */
        public function canChangeUser() {
                return true;
index b4de44d..a2aa8c0 100644 (file)
@@ -125,6 +125,7 @@ class MssqlUpdater extends DatabaseUpdater {
         * @param string $updatekey
         * @param string $patch
         * @param bool $fullpath
+        * @return bool
         */
        protected function updateSchema( $table, $updatekey, $patch, $fullpath = false ) {
                if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
index dc63899..c5dd4dc 100644 (file)
@@ -223,6 +223,7 @@ class MysqlInstaller extends DatabaseInstaller {
 
        /**
         * @param string $s
+        * @param string $escapeChar
         * @return string
         */
        protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
@@ -342,6 +343,8 @@ class MysqlInstaller extends DatabaseInstaller {
        /**
         * Convert a wildcard (as used in LIKE) to a regex
         * Slashes are escaped, slash terminators included
+        * @param string $wildcard
+        * @return string
         */
        protected function likeToRegex( $wildcard ) {
                $r = preg_quote( $wildcard, '/' );
index 27300f3..e0e54c8 100644 (file)
@@ -1005,6 +1005,7 @@ class WebInstaller extends Installer {
         *
         * @see getRadioSet
         *
+        * @param mixed[] $params
         * @return array
         */
        public function getRadioElements( $params ) {
index a1935df..4e3409a 100644 (file)
@@ -138,6 +138,7 @@ class JobQueueSecondTestQueue extends JobQueue {
        /**
         * @see JobQueue::ack()
         * @param Job $job
+        * @return Job|bool
         */
        protected function doAck( Job $job ) {
                return $this->mainQueue->doAck( $job );
@@ -172,6 +173,7 @@ class JobQueueSecondTestQueue extends JobQueue {
 
        /**
         * @see JobQueue::delete()
+        * @return bool
         * @throws MWException
         */
        protected function doDelete() {
index 7ce2c74..f26beee 100644 (file)
@@ -79,6 +79,9 @@ abstract class JobQueueAggregator {
 
        /**
         * @see JobQueueAggregator::notifyQueueEmpty()
+        * @param string $wiki
+        * @param string $type
+        * @return bool
         */
        abstract protected function doNotifyQueueEmpty( $wiki, $type );
 
@@ -97,6 +100,9 @@ abstract class JobQueueAggregator {
 
        /**
         * @see JobQueueAggregator::notifyQueueNonEmpty()
+        * @param string $wiki
+        * @param string $type
+        * @return bool
         */
        abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
 
index 9f3550f..424fcec 100644 (file)
@@ -207,7 +207,7 @@ class RefreshLinksJob extends Job {
                        if ( $page->getTouched() >= $this->params['rootJobTimestamp'] || $opportunistic ) {
                                // Cache is suspected to be up-to-date. As long as the cache rev ID matches
                                // and it reflects the job's triggering change, then it is usable.
-                               $parserOutput = ParserCache::singleton()->getDirty( $page, $parserOptions );
+                               $parserOutput = $services->getParserCache()->getDirty( $page, $parserOptions );
                                if ( !$parserOutput
                                        || $parserOutput->getCacheRevisionId() != $revision->getId()
                                        || $parserOutput->getCacheTime() < $skewedTimestamp
@@ -234,7 +234,7 @@ class RefreshLinksJob extends Job {
                                && $parserOutput->isCacheable()
                        ) {
                                $ctime = wfTimestamp( TS_MW, (int)$start ); // cache time
-                               ParserCache::singleton()->save(
+                               $services->getParserCache()->save(
                                        $parserOutput, $page, $parserOptions, $ctime, $revision->getId()
                                );
                        }
index 3bfb531..1c48f49 100644 (file)
@@ -510,7 +510,7 @@ class IP {
         *     2001:0db8:85a3::7344 - 2001:0db8:85a3::7344   Explicit range
         *     2001:0db8:85a3::7344                          Single IP
         * @param string $range IP range
-        * @return array(string, string)
+        * @return array [ string, string ]
         */
        public static function parseRange( $range ) {
                // CIDR notation
index 90c7a64..14462f1 100644 (file)
@@ -75,6 +75,7 @@ class MemoizedCallable {
         *
         * @param string $key
         * @param bool &$success
+        * @return bool
         */
        protected function fetchResult( $key, &$success ) {
                $success = false;
@@ -148,6 +149,7 @@ class MemoizedCallable {
         * @param callable $callable
         * @param array $args
         * @param int $ttl
+        * @return mixed
         */
        public static function call( $callable, array $args = [], $ttl = 3600 ) {
                $instance = new self( $callable, $ttl );
index 016c9b1..e58d98f 100644 (file)
@@ -37,6 +37,7 @@ class Xhprof {
 
        /**
         * Start xhprof profiler
+        * @return bool
         */
        public static function isEnabled() {
                return self::$enabled;
@@ -44,6 +45,9 @@ class Xhprof {
 
        /**
         * Start xhprof profiler
+        * @param int $flags
+        * @param array $options
+        * @throws Exception
         */
        public static function enable( $flags = 0, $options = [] ) {
                if ( self::isEnabled() ) {
index 2383d2a..0be4ff6 100644 (file)
@@ -107,6 +107,7 @@ class XhprofData {
         * The resulting array is left padded with nulls, so a key
         * with no parent (eg 'main()') will return [null, 'function'].
         *
+        * @param string $key
         * @return array
         */
        public static function splitKey( $key ) {
index 77473d1..b8eec3f 100644 (file)
@@ -1714,7 +1714,7 @@ abstract class FileBackendStore extends FileBackend {
                        return; // invalid storage path
                }
                $mtime = ConvertibleTimestamp::convert( TS_UNIX, $val['mtime'] );
-               $ttl = $this->memCache->adaptiveTTL( $mtime, 7 * 86400, 300, .1 );
+               $ttl = $this->memCache->adaptiveTTL( $mtime, 7 * 86400, 300, 0.1 );
                $key = $this->fileCacheKey( $path );
                // Set the cache unless it is currently salted.
                $this->memCache->set( $key, $val, $ttl );
index dfc7c4b..e9fb11f 100644 (file)
@@ -333,7 +333,7 @@ class IEContentAnalyzer {
         * @param string $chunk the first 256 bytes of the file
         * @param string $proposed the MIME type proposed by the server
         *
-        * @return Array: map of IE version to detected MIME type
+        * @return array map of IE version to detected MIME type
         */
        public function getRealMimesFromData( $fileName, $chunk, $proposed ) {
                $types = $this->getMimesFromData( $fileName, $chunk, $proposed );
@@ -371,7 +371,7 @@ class IEContentAnalyzer {
         * @param string $chunk the first 256 bytes of the file
         * @param string $proposed the MIME type proposed by the server
         *
-        * @return Array: map of IE version to detected MIME type
+        * @return array map of IE version to detected MIME type
         */
        public function getMimesFromData( $fileName, $chunk, $proposed ) {
                $types = [];
index f834ccf..8a23db5 100644 (file)
@@ -476,7 +476,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                $lSince = microtime( true ); // lock timestamp
 
                return new ScopedCallback( function () use ( $key, $lSince, $expiry ) {
-                       $latency = .050; // latency skew (err towards keeping lock present)
+                       $latency = 0.050; // latency skew (err towards keeping lock present)
                        $age = ( microtime( true ) - $lSince + $latency );
                        if ( ( $age + $latency ) >= $expiry ) {
                                $this->logger->warning( "Lock for $key held too long ($age sec)." );
index 5128d82..0188991 100644 (file)
@@ -45,7 +45,7 @@ class MemcachedBagOStuff extends BagOStuff {
        protected function applyDefaultParams( $params ) {
                return $params + [
                        'compress_threshold' => 1500,
-                       'connect_timeout' => .5,
+                       'connect_timeout' => 0.5,
                        'debug' => false
                ];
        }
index c1c9cc1..1f757a4 100644 (file)
@@ -1424,7 +1424,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @return int Adaptive TTL
         * @since 1.28
         */
-       public function adaptiveTTL( $mtime, $maxTTL, $minTTL = 30, $factor = .2 ) {
+       public function adaptiveTTL( $mtime, $maxTTL, $minTTL = 30, $factor = 0.2 ) {
                if ( is_float( $mtime ) || ctype_digit( $mtime ) ) {
                        $mtime = (int)$mtime; // handle fractional seconds and string integers
                }
index af431a6..57a12a4 100644 (file)
@@ -39,7 +39,7 @@ class TransactionProfiler implements LoggerAwareInterface {
        /** @var float Seconds */
        protected $dbLockThreshold = 3.0;
        /** @var float Seconds */
-       protected $eventThreshold = .25;
+       protected $eventThreshold = 0.25;
        /** @var bool */
        protected $silenced = false;
 
index 64fbea3..c904092 100644 (file)
@@ -54,8 +54,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        const PING_TTL = 1.0;
        const PING_QUERY = 'SELECT 1 AS ping';
 
-       const TINY_WRITE_SEC = .010;
-       const SLOW_WRITE_SEC = .500;
+       const TINY_WRITE_SEC = 0.010;
+       const SLOW_WRITE_SEC = 0.500;
        const SMALL_WRITE_ROWS = 100;
 
        /** @var string SQL query */
@@ -2106,6 +2106,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        /**
         * @param string $s
+        * @param string $escapeChar
         * @return string
         */
        protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
@@ -2416,6 +2417,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * we don't want to select everything into memory
         *
         * @see IDatabase::insertSelect()
+        * @param string $destTable
+        * @param string|array $srcTable
+        * @param array $varMap
+        * @param array $conds
+        * @param string $fname
+        * @param array $insertOptions
+        * @param array $selectOptions
+        * @param array $selectJoinConds
+        * @return bool
         */
        protected function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
index 8f3cab8..4ebc623 100644 (file)
@@ -1110,6 +1110,7 @@ class DatabaseMssql extends Database {
         * MS SQL supports more pattern operators than other databases (ex: [,],^)
         *
         * @param string $s
+        * @param string $escapeChar
         * @return string
         */
        protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
index ac59bd6..672b345 100644 (file)
@@ -1158,8 +1158,8 @@ SQL;
        }
 
        /**
-        * @var string $table
-        * @var string $field
+        * @param string $table
+        * @param string $field
         * @return PostgresField|null
         */
        public function fieldInfo( $table, $field ) {
index fdc5ac8..8292c03 100644 (file)
@@ -157,7 +157,7 @@ class LoadMonitor implements ILoadMonitor {
                        $newWeight = $movAveRatio * $coefficient + ( 1 - $movAveRatio ) * $lastWeight;
 
                        // Scale from 10% to 100% of nominal weight
-                       $weightScales[$i] = max( $newWeight, .10 );
+                       $weightScales[$i] = max( $newWeight, 0.10 );
 
                        if ( !$conn ) {
                                $lagTimes[$i] = false;
index 7369751..d346f65 100644 (file)
@@ -40,8 +40,8 @@ class NullStatsdDataFactory implements IBufferingStatsdDataFactory {
         * and logged in users by sending the current userId of a user
         * with each request with a key of "uniques" (or similar).
         *
-        * @param  string|array $key The metric(s) to set.
-        * @param  float $value The value for the stats.
+        * @param string|array $key The metric(s) to set.
+        * @param float $value The value for the stats.
         *
         * @return array
         */
index a148a39..37a967f 100644 (file)
@@ -58,15 +58,14 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                        'url' => 'http://localhost:8000/',
                        'prefix' => 'localhost',
                        'domain' => 'localhost',
+                       'timeout' => null,
                        'forwardCookies' => false,
                        'HTTPProxy' => null,
                ], $params );
                // Ensure that the url parameter has a trailing slash.
-               $mparams['url'] = preg_replace(
-                       '#/?$#',
-                       '/',
-                       $mparams['url']
-               );
+               if ( substr( $mparams['url'], -1 ) !== '/' ) {
+                       $mparams['url'] .= '/';
+               }
                // Ensure the correct domain format: strip protocol, port,
                // and trailing slash if present.  This lets us use
                // $wgCanonicalServer as a default value, which is very convenient.
@@ -147,6 +146,10 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
         * Visual Editor "pretends" the V1 API is like.  A previous version of
         * ParsoidVirtualRESTService translated these to the "real" Parsoid v1
         * API.  We now translate these to the "real" Parsoid v3 API.
+        * @param array $req
+        * @param Closure $idGeneratorFunc
+        * @return array
+        * @throws Exception
         */
        public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
                $parts = explode( '/', $req['url'] );
index 90865ff..192b4bd 100644 (file)
@@ -112,6 +112,10 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
 
        /**
         * Remaps Parsoid v1/v3 requests to RESTBase v1 requests.
+        * @param array $reqs
+        * @param Closure $idGeneratorFunc
+        * @return array
+        * @throws Exception
         */
        public function onParsoidRequests( array $reqs, Closure $idGeneratorFunc ) {
                $result = [];
@@ -145,6 +149,10 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
         * NOTE: the POST APIs aren't "real" Parsoid v1 APIs, they are just what
         * Visual Editor "pretends" the V1 API is like.  (See
         * ParsoidVirtualRESTService.)
+        * @param array $req
+        * @param Closure $idGeneratorFunc
+        * @return array
+        * @throws Exception
         */
        public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
                $parts = explode( '/', $req['url'] );
@@ -233,6 +241,10 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
         *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
         *   * $title is optional
         *   * $revision is optional
+        * @param array $req
+        * @param Closure $idGeneratorFunc
+        * @return array
+        * @throws Exception
         */
        public function onParsoid3Request( array $req, Closure $idGeneratorFunc ) {
                $parts = explode( '/', $req['url'] );
index e12766a..c46acc6 100644 (file)
@@ -131,6 +131,7 @@ class XMPReader implements LoggerAwareInterface {
 
        /**
         * Primary job is to initialize the XMLParser
+        * @param LoggerInterface|null $logger
         */
        function __construct( LoggerInterface $logger = null ) {
                if ( !function_exists( 'xml_parser_create_ns' ) ) {
@@ -189,6 +190,7 @@ class XMPReader implements LoggerAwareInterface {
 
        /**
         * Check if this instance supports using this class
+        * @return bool
         */
        public static function isSupported() {
                return function_exists( 'xml_parser_create_ns' ) && class_exists( 'XMLReader' );
index 3e4731a..e23989d 100644 (file)
@@ -299,6 +299,8 @@ class WebPHandler extends BitmapHandler {
        /**
         * Must use "im" for XCF
         *
+        * @param string $dstPath
+        * @param bool $checkDstPath
         * @return string
         */
        protected function getScalerType( $dstPath, $checkDstPath = true ) {
index f52cd8d..5b03a22 100644 (file)
@@ -466,7 +466,7 @@ class Article implements Page {
                # Allow frames by default
                $outputPage->allowClickjacking();
 
-               $parserCache = ParserCache::singleton();
+               $parserCache = MediaWikiServices::getInstance()->getParserCache();
 
                $parserOptions = $this->getParserOptions();
                # Render printable version, use printable version cache
index bf8a597..6fc36f6 100644 (file)
@@ -213,6 +213,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @todo Move this UI stuff somewhere else
         *
         * @see ContentHandler::getActionOverrides
+        * @return array
         */
        public function getActionOverrides() {
                return $this->getContentHandler()->getActionOverrides();
@@ -1070,7 +1071,8 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( $useParserCache ) {
-                       $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
+                       $parserOutput = MediaWikiServices::getInstance()->getParserCache()
+                               ->get( $this, $parserOptions );
                        if ( $parserOutput !== false ) {
                                return $parserOutput;
                        }
@@ -2162,7 +2164,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Save it to the parser cache.
                // Make sure the cache time matches page_touched to avoid double parsing.
-               ParserCache::singleton()->save(
+               MediaWikiServices::getInstance()->getParserCache()->save(
                        $editInfo->output, $this, $editInfo->popts,
                        $revision->getTimestamp(), $editInfo->revid
                );
@@ -2732,6 +2734,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
         * @param array $tags Tags to apply to the deletion action
+        * @param string $logsubtype
         * @return Status Status object; if successful, $status->value is the log_id of the
         *   deletion log entry. If the page couldn't be deleted because it wasn't
         *   found, $status is a non-fatal 'cannotdelete' error
index 599fbf6..fab9ab7 100644 (file)
@@ -257,12 +257,17 @@ class BlockLevelPass {
                                        $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] );
                                }
 
+                               # Close an open <dt> if we have a <dd> (":") starting on this line
+                               if ( $this->DTopen && $commonPrefixLength > 0 && $prefix[$commonPrefixLength - 1] === ':' ) {
+                                       $output .= $this->nextItem( ':' );
+                               }
+
                                # Open prefixes where appropriate.
                                if ( $lastPrefix && $prefixLength > $commonPrefixLength ) {
                                        $output .= "\n";
                                }
                                while ( $prefixLength > $commonPrefixLength ) {
-                                       $char = substr( $prefix, $commonPrefixLength, 1 );
+                                       $char = $prefix[$commonPrefixLength];
                                        $output .= $this->openList( $char );
 
                                        if ( ';' === $char ) {
index 988e248..ff4936d 100644 (file)
@@ -3231,6 +3231,8 @@ class Parser {
                                        . wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text()
                                        . '</span>';
                                $this->addTrackingCategory( 'template-loop-category' );
+                               $this->mOutput->addWarning( wfMessage( 'template-loop-warning',
+                                       wfEscapeWikiText( $titleText ) )->text() );
                                wfDebug( __METHOD__ . ": template loop broken at '$titleText'\n" );
                        }
                }
index 2dd4085..06319e5 100644 (file)
@@ -223,7 +223,7 @@ class ParserOutput extends CacheTime {
        // finalizeAdaptiveCacheExpiry() uses TTL = MAX( m * PARSE_TIME + b, MIN_AR_TTL)
        // Current values imply that m=3933.333333 and b=-333.333333
        // See https://www.nngroup.com/articles/website-response-times/
-       const PARSE_FAST_SEC = .100; // perceived "fast" page parse
+       const PARSE_FAST_SEC = 0.100; // perceived "fast" page parse
        const PARSE_SLOW_SEC = 1.0; // perceived "slow" page parse
        const FAST_AR_TTL = 60; // adaptive TTL for "fast" pages
        const SLOW_AR_TTL = 3600; // adaptive TTL for "slow" pages
@@ -243,6 +243,7 @@ class ParserOutput extends CacheTime {
         * return value is suitable for writing back via setText() but is not valid
         * for display to the user.
         *
+        * @return string
         * @since 1.27
         */
        public function getRawText() {
@@ -298,7 +299,10 @@ class ParserOutput extends CacheTime {
                $this->mSpeculativeRevId = $id;
        }
 
-       /** @since 1.28 */
+       /**
+        * @return int|null
+        * @since 1.28
+        */
        public function getSpeculativeRevIdUsed() {
                return $this->mSpeculativeRevId;
        }
@@ -320,6 +324,7 @@ class ParserOutput extends CacheTime {
        }
 
        /**
+        * @return array
         * @since 1.25
         */
        public function getIndicators() {
@@ -382,7 +387,10 @@ class ParserOutput extends CacheTime {
                return $this->mModuleStyles;
        }
 
-       /** @since 1.23 */
+       /**
+        * @return array
+        * @since 1.23
+        */
        public function getJsConfigVars() {
                return $this->mJsConfigVars;
        }
@@ -471,6 +479,8 @@ class ParserOutput extends CacheTime {
        }
 
        /**
+        * @param string $id
+        * @param string $content
         * @since 1.25
         */
        public function setIndicator( $id, $content ) {
@@ -836,6 +846,8 @@ class ParserOutput extends CacheTime {
         * @code
         *    $parser->getOutput()->my_ext_foo = '...';
         * @endcode
+        * @param string $name
+        * @param mixed $value
         */
        public function setProperty( $name, $value ) {
                $this->mProperties[$name] = $value;
index 24474d5..627d112 100644 (file)
@@ -62,6 +62,7 @@ abstract class Preprocessor {
         *
         * @param string $text
         * @param int $flags
+        * @param string $tree
         */
        protected function cacheSetTree( $text, $flags, $tree ) {
                $config = RequestContext::getMain()->getConfig();
index 8e84cb2..332f8e9 100644 (file)
@@ -1869,6 +1869,8 @@ class PPNode_Hash_Tree implements PPNode {
 
        /**
         * Like splitArg() but for a raw child array. For internal use only.
+        * @param array $children
+        * @return array
         */
        public static function splitRawArg( array $children ) {
                $bits = [];
@@ -1910,6 +1912,8 @@ class PPNode_Hash_Tree implements PPNode {
 
        /**
         * Like splitExt() but for a raw child array. For internal use only.
+        * @param array $children
+        * @return array
         */
        public static function splitRawExt( array $children ) {
                $bits = [];
@@ -1953,6 +1957,8 @@ class PPNode_Hash_Tree implements PPNode {
 
        /**
         * Like splitHeading() but for a raw child array. For internal use only.
+        * @param array $children
+        * @return array
         */
        public static function splitRawHeading( array $children ) {
                $bits = [];
@@ -1984,6 +1990,8 @@ class PPNode_Hash_Tree implements PPNode {
 
        /**
         * Like splitTemplate() but for a raw child array. For internal use only.
+        * @param array $children
+        * @return array
         */
        public static function splitRawTemplate( array $children ) {
                $parts = [];
index 1f1add7..17b62d7 100644 (file)
@@ -17,6 +17,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 class PoolWorkArticleView extends PoolCounterWork {
        /** @var WikiPage */
@@ -28,6 +29,9 @@ class PoolWorkArticleView extends PoolCounterWork {
        /** @var int */
        private $revid;
 
+       /** @var ParserCache */
+       private $parserCache;
+
        /** @var ParserOptions */
        private $parserOptions;
 
@@ -66,7 +70,8 @@ class PoolWorkArticleView extends PoolCounterWork {
                $this->cacheable = $useParserCache;
                $this->parserOptions = $parserOptions;
                $this->content = $content;
-               $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
+               $this->parserCache = MediaWikiServices::getInstance()->getParserCache();
+               $this->cacheKey = $this->parserCache->getKey( $page, $parserOptions );
                $keyPrefix = $this->cacheKey ?: wfMemcKey( 'articleview', 'missingcachekey' );
                parent::__construct( 'ArticleView', $keyPrefix . ':revid:' . $revid );
        }
@@ -153,7 +158,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                }
 
                if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
-                       ParserCache::singleton()->save(
+                       $this->parserCache->save(
                                $this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid );
                }
 
@@ -175,7 +180,7 @@ class PoolWorkArticleView extends PoolCounterWork {
         * @return bool
         */
        public function getCachedWork() {
-               $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
+               $this->parserOutput = $this->parserCache->get( $this->page, $this->parserOptions );
 
                if ( $this->parserOutput === false ) {
                        wfDebug( __METHOD__ . ": parser cache miss\n" );
@@ -190,7 +195,7 @@ class PoolWorkArticleView extends PoolCounterWork {
         * @return bool
         */
        public function fallback() {
-               $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
+               $this->parserOutput = $this->parserCache->getDirty( $this->page, $this->parserOptions );
 
                if ( $this->parserOutput === false ) {
                        wfDebugLog( 'dirty', 'dirty missing' );
index 10ba83f..531a3eb 100644 (file)
 class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
        /**
         * @see RCFeedFormatter::getLine
+        * @param array $feed
+        * @param RecentChange $rc
+        * @param string|null $actionComment
+        * @return string|null
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment ) {
                global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwikis,
index 20f88bd..a90d648 100644 (file)
@@ -36,6 +36,10 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
        /**
         * Generates a notification that can be easily interpreted by a machine.
         * @see RCFeedFormatter::getLine
+        * @param array $feed
+        * @param RecentChange $rc
+        * @param string|null $actionComment
+        * @return string|null
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment ) {
                global $wgCanonicalServer, $wgServerName, $wgScriptPath;
index f0fcd7d..3abc9c1 100644 (file)
@@ -41,6 +41,9 @@ class RedisPubSubFeedEngine extends RCFeedEngine {
 
        /**
         * @see FormattedRCFeed::send
+        * @param array $feed
+        * @param string $line
+        * @return bool
         */
        public function send( array $feed, $line ) {
                $parsed = wfParseUrl( $feed['uri'] );
index 61ced5f..f76d771 100644 (file)
@@ -25,6 +25,9 @@
 class UDPRCFeedEngine extends RCFeedEngine {
        /**
         * @see RCFeedEngine::send
+        * @param array $feed
+        * @param string $line
+        * @return bool
         */
        public function send( array $feed, $line ) {
                $transport = UDPTransport::newFromString( $feed['uri'] );
index eac04a9..bf33c6c 100644 (file)
@@ -332,6 +332,12 @@ class ExtensionRegistry {
                }
 
                foreach ( $info['callbacks'] as $name => $cb ) {
+                       if ( !is_callable( $cb ) ) {
+                               if ( is_array( $cb ) ) {
+                                       $cb = '[ ' . implode( ', ', $cb ) . ' ]';
+                               }
+                               throw new UnexpectedValueException( "callback '$cb' is not callable" );
+                       }
                        call_user_func( $cb, $info['credits'][$name] );
                }
        }
index d26c961..cbcf5a0 100644 (file)
@@ -427,6 +427,8 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
 
        /**
         * Helper method for getDefinitionSummary.
+        * @param ResourceLoaderContext $context
+        * @return array
         */
        protected function getFileHashes( ResourceLoaderContext $context ) {
                $this->loadFromDefinition();
index 08641b0..236112e 100644 (file)
@@ -43,6 +43,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
        }
 
        /**
+        * @param ResourceLoaderContext|null $context
         * @return array
         */
        public function getDependencies( ResourceLoaderContext $context = null ) {
index d535ffc..8b9feeb 100644 (file)
@@ -297,6 +297,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        }
 
        /**
+        * @param ResourceLoaderContext $context
         * @return array
         */
        public function getPreloadLinks( ResourceLoaderContext $context ) {
index 9377ed6..1a390cf 100644 (file)
@@ -30,6 +30,7 @@ class ResourceLoaderUploadDialogModule extends ResourceLoaderModule {
        protected $targets = [ 'desktop', 'mobile' ];
 
        /**
+        * @param ResourceLoaderContext $context
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
index 8f58040..8e21381 100644 (file)
@@ -78,6 +78,7 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
        }
 
        /**
+        * @param ResourceLoaderContext|null $context
         * @return array
         */
        public function getDependencies( ResourceLoaderContext $context = null ) {
index ceb97e4..728deb8 100644 (file)
@@ -63,7 +63,7 @@ class RevDelLogList extends RevDelList {
        public function doQuery( $db ) {
                $ids = array_map( 'intval', $this->ids );
 
-               $commentQuery = CommentStore::getKey( 'log_comment' )->getJoin();
+               $commentQuery = CommentStore::newKey( 'log_comment' )->getJoin();
 
                return $db->select(
                        [ 'logging' ] + $commentQuery['tables'],
index df653f1..4b60a0c 100644 (file)
@@ -31,6 +31,7 @@ class ParserOutputSearchDataExtractor {
        /**
         * Get a list of categories, as an array with title text strings.
         *
+        * @param ParserOutput $parserOutput
         * @return string[]
         */
        public function getCategories( ParserOutput $parserOutput ) {
@@ -46,6 +47,7 @@ class ParserOutputSearchDataExtractor {
        /**
         * Get a list of external links from ParserOutput, as an array of strings.
         *
+        * @param ParserOutput $parserOutput
         * @return string[]
         */
        public function getExternalLinks( ParserOutput $parserOutput ) {
@@ -56,6 +58,7 @@ class ParserOutputSearchDataExtractor {
         * Get a list of outgoing wiki links (including interwiki links), as
         * an array of prefixed title strings.
         *
+        * @param ParserOutput $parserOutput
         * @return string[]
         */
        public function getOutgoingLinks( ParserOutput $parserOutput ) {
@@ -74,6 +77,7 @@ class ParserOutputSearchDataExtractor {
        /**
         * Get a list of templates used in the ParserOutput content, as prefixed title strings
         *
+        * @param ParserOutput $parserOutput
         * @return string[]
         */
        public function getTemplates( ParserOutput $parserOutput ) {
index 7c2f0f2..3c8fe60 100644 (file)
@@ -269,7 +269,7 @@ abstract class SearchEngine {
         * might support more. The default in all implementations should be 'relevance.'
         *
         * @since 1.25
-        * @return array(string) the valid sort directions for setSort
+        * @return string[] the valid sort directions for setSort
         */
        public function getValidSorts() {
                return [ 'relevance' ];
index 89d2299..f25c728 100644 (file)
@@ -152,6 +152,7 @@ class SearchResultSet {
        /**
         * Return a result set of hits on other (multiple) wikis associated with this one
         *
+        * @param int $type
         * @return SearchResultSet[]
         */
        function getInterwikiResults( $type = self::SECONDARY_RESULTS ) {
@@ -161,6 +162,7 @@ class SearchResultSet {
        /**
         * Check if there are results on other wikis
         *
+        * @param int $type
         * @return bool
         */
        function hasInterwikiResults( $type = self::SECONDARY_RESULTS ) {
index 6d54dad..aced5e1 100644 (file)
@@ -106,6 +106,7 @@ class SearchSuggestionSet {
 
        /**
         * Move the suggestion at index $key to the first position
+        * @param string $key
         */
        public function rescore( $key ) {
                $removed = array_splice( $this->suggestions, $key, 1 );
index 5831b09..a588aee 100644 (file)
@@ -167,6 +167,7 @@ class BotPasswordSessionProvider extends ImmutableSessionProviderWithCookie {
 
        /**
         * @codeCoverageIgnore
+        * @inheritDoc
         */
        public function preventSessionsForUser( $username ) {
                BotPassword::removeAllPasswordsForUser( $username );
index 12f16b6..23d9ab3 100644 (file)
@@ -654,6 +654,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
        /**
         * @note Despite the name, this seems to be intended to implement isset()
         *  rather than array_key_exists(). So do that.
+        * @inheritDoc
         */
        public function offsetExists( $offset ) {
                $data = &$this->backend->getData();
@@ -666,6 +667,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         *  data to detect such changes.
         * @note Accessing a nonexistent key via this mechanism causes that key to
         *  be created with a null value, and does not raise a PHP warning.
+        * @inheritDoc
         */
        public function &offsetGet( $offset ) {
                $data = &$this->backend->getData();
diff --git a/includes/shell/Command.php b/includes/shell/Command.php
new file mode 100644 (file)
index 0000000..864e69a
--- /dev/null
@@ -0,0 +1,377 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Shell;
+
+use Exception;
+use MediaWiki\ProcOpenError;
+use MediaWiki\ShellDisabledError;
+use Profiler;
+
+/**
+ * Class used for executing shell commands
+ *
+ * @since 1.30
+ */
+class Command {
+       /** @var string */
+       private $command = '';
+
+       /** @var array */
+       private $limits = [];
+
+       /** @var string[] */
+       private $env = [];
+
+       /** @var string */
+       private $method;
+
+       /** @var bool */
+       private $useStderr = false;
+
+       /** @var bool */
+       private $everExecuted = false;
+
+       /**
+        * Constructor. Don't call directly, instead use Shell::command()
+        */
+       public function __construct() {
+               if ( Shell::isDisabled() ) {
+                       throw new ShellDisabledError();
+               }
+       }
+
+       /**
+        * Destructor. Makes sure programmer didn't forget to execute the command after all
+        */
+       public function __destruct() {
+               if ( !$this->everExecuted ) {
+                       $message = __CLASS__ . " was instantiated, but execute() was never called.";
+                       if ( $this->method ) {
+                               $message .= " Calling method: {$this->method}.";
+                       }
+                       $message .= " Command: {$this->command}";
+                       trigger_error( $message, E_USER_NOTICE );
+               }
+       }
+
+       /**
+        * Adds parameters to the command. All parameters are sanitized via Shell::escape().
+        *
+        * @param string|string[] $args,...
+        * @return $this
+        */
+       public function params( /* ... */ ) {
+               $args = func_get_args();
+               if ( count( $args ) === 1 && is_array( reset( $args ) ) ) {
+                       // If only one argument has been passed, and that argument is an array,
+                       // treat it as a list of arguments
+                       $args = reset( $args );
+               }
+               $this->command .= ' ' . Shell::escape( $args );
+
+               return $this;
+       }
+
+       /**
+        * Adds unsafe parameters to the command. These parameters are NOT sanitized in any way.
+        *
+        * @param string|string[] $args,...
+        * @return $this
+        */
+       public function unsafeParams( /* ... */ ) {
+               $args = func_get_args();
+               if ( count( $args ) === 1 && is_array( reset( $args ) ) ) {
+                       // If only one argument has been passed, and that argument is an array,
+                       // treat it as a list of arguments
+                       $args = reset( $args );
+               }
+               $this->command .= implode( ' ', $args );
+
+               return $this;
+       }
+
+       /**
+        * Sets execution limits
+        *
+        * @param array $limits Optional array with limits(filesize, memory, time, walltime).
+        *   This overrides the global wgMaxShell* limits.
+        * @return $this
+        */
+       public function limits( array $limits ) {
+               $this->limits = $limits;
+
+               return $this;
+       }
+
+       /**
+        * Sets environment variables which should be added to the executed command environment
+        *
+        * @param string[] $env array of variable name => value
+        * @return $this
+        */
+       public function environment( array $env ) {
+               $this->env = $env;
+
+               return $this;
+       }
+
+       /**
+        * Sets calling function for profiler. By default, the caller for execute() will be used.
+        *
+        * @param string $method
+        * @return $this
+        */
+       public function profileMethod( $method ) {
+               $this->method = $method;
+
+               return $this;
+       }
+
+       /**
+        * Controls whether stderr should be included in stdout, including errors from limit.sh.
+        * Default: don't include.
+        *
+        * @param bool $yesno
+        * @return $this
+        */
+       public function includeStderr( $yesno = true ) {
+               $this->useStderr = $yesno;
+
+               return $this;
+       }
+
+       /**
+        * Executes command. Afterwards, getExitCode() and getOutput() can be used to access execution
+        * results.
+        *
+        * @return Result
+        * @throws Exception
+        * @throws ProcOpenError
+        * @throws ShellDisabledError
+        */
+       public function execute() {
+               global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
+                          $wgMaxShellWallClockTime, $wgShellCgroup;
+
+               $this->everExecuted = true;
+
+               $profileMethod = $this->method ?: wfGetCaller();
+
+               $envcmd = '';
+               foreach ( $this->env as $k => $v ) {
+                       if ( wfIsWindows() ) {
+                               /* Surrounding a set in quotes (method used by wfEscapeShellArg) makes the quotes themselves
+                                * appear in the environment variable, so we must use carat escaping as documented in
+                                * https://technet.microsoft.com/en-us/library/cc723564.aspx
+                                * Note however that the quote isn't listed there, but is needed, and the parentheses
+                                * are listed there but doesn't appear to need it.
+                                */
+                               $envcmd .= "set $k=" . preg_replace( '/([&|()<>^"])/', '^\\1', $v ) . '&& ';
+                       } else {
+                               /* Assume this is a POSIX shell, thus required to accept variable assignments before the command
+                                * http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_09_01
+                                */
+                               $envcmd .= "$k=" . escapeshellarg( $v ) . ' ';
+                       }
+               }
+
+               $cmd = $envcmd . trim( $this->command );
+
+               $useLogPipe = false;
+               if ( is_executable( '/bin/bash' ) ) {
+                       $time = intval( isset( $this->limits['time'] ) ? $this->limits['time'] : $wgMaxShellTime );
+                       if ( isset( $this->limits['walltime'] ) ) {
+                               $wallTime = intval( $this->limits['walltime'] );
+                       } elseif ( isset( $this->limits['time'] ) ) {
+                               $wallTime = $time;
+                       } else {
+                               $wallTime = intval( $wgMaxShellWallClockTime );
+                       }
+                       $mem = intval( isset( $this->limits['memory'] ) ? $this->limits['memory'] : $wgMaxShellMemory );
+                       $filesize = intval( isset( $this->limits['filesize'] )
+                               ? $this->limits['filesize']
+                               : $wgMaxShellFileSize );
+
+                       if ( $time > 0 || $mem > 0 || $filesize > 0 || $wallTime > 0 ) {
+                               $cmd = '/bin/bash ' . escapeshellarg( "$IP/includes/limit.sh" ) . ' ' .
+                                          escapeshellarg( $cmd ) . ' ' .
+                                          escapeshellarg(
+                                                  "MW_INCLUDE_STDERR=" . ( $this->useStderr ? '1' : '' ) . ';' .
+                                                  "MW_CPU_LIMIT=$time; " .
+                                                  'MW_CGROUP=' . escapeshellarg( $wgShellCgroup ) . '; ' .
+                                                  "MW_MEM_LIMIT=$mem; " .
+                                                  "MW_FILE_SIZE_LIMIT=$filesize; " .
+                                                  "MW_WALL_CLOCK_LIMIT=$wallTime; " .
+                                                  "MW_USE_LOG_PIPE=yes"
+                                          );
+                               $useLogPipe = true;
+                       } elseif ( $this->useStderr ) {
+                               $cmd .= ' 2>&1';
+                       }
+               } elseif ( $this->useStderr ) {
+                       $cmd .= ' 2>&1';
+               }
+               wfDebug( __METHOD__ . ": $cmd\n" );
+
+               // Don't try to execute commands that exceed Linux's MAX_ARG_STRLEN.
+               // Other platforms may be more accomodating, but we don't want to be
+               // accomodating, because very long commands probably include user
+               // input. See T129506.
+               if ( strlen( $cmd ) > SHELL_MAX_ARG_STRLEN ) {
+                       throw new Exception( __METHOD__ .
+                                                                '(): total length of $cmd must not exceed SHELL_MAX_ARG_STRLEN' );
+               }
+
+               $desc = [
+                       0 => [ 'file', 'php://stdin', 'r' ],
+                       1 => [ 'pipe', 'w' ],
+                       2 => [ 'file', 'php://stderr', 'w' ],
+               ];
+               if ( $useLogPipe ) {
+                       $desc[3] = [ 'pipe', 'w' ];
+               }
+               $pipes = null;
+               $scoped = Profiler::instance()->scopedProfileIn( __FUNCTION__ . '-' . $profileMethod );
+               $proc = proc_open( $cmd, $desc, $pipes );
+               if ( !$proc ) {
+                       wfDebugLog( 'exec', "proc_open() failed: $cmd" );
+                       throw new ProcOpenError();
+               }
+               $outBuffer = $logBuffer = '';
+               $emptyArray = [];
+               $status = false;
+               $logMsg = false;
+
+               /* According to the documentation, it is possible for stream_select()
+                * to fail due to EINTR. I haven't managed to induce this in testing
+                * despite sending various signals. If it did happen, the error
+                * message would take the form:
+                *
+                * stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
+                *
+                * where [4] is the value of the macro EINTR and "Interrupted system
+                * call" is string which according to the Linux manual is "possibly"
+                * localised according to LC_MESSAGES.
+                */
+               $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4;
+               $eintrMessage = "stream_select(): unable to select [$eintr]";
+
+               $running = true;
+               $timeout = null;
+               $numReadyPipes = 0;
+
+               while ( $running === true || $numReadyPipes !== 0 ) {
+                       if ( $running ) {
+                               $status = proc_get_status( $proc );
+                               // If the process has terminated, switch to nonblocking selects
+                               // for getting any data still waiting to be read.
+                               if ( !$status['running'] ) {
+                                       $running = false;
+                                       $timeout = 0;
+                               }
+                       }
+
+                       $readyPipes = $pipes;
+
+                       // Clear last error
+                       // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged
+                       @trigger_error( '' );
+                       $numReadyPipes = @stream_select( $readyPipes, $emptyArray, $emptyArray, $timeout );
+                       if ( $numReadyPipes === false ) {
+                               // @codingStandardsIgnoreEnd
+                               $error = error_get_last();
+                               if ( strncmp( $error['message'], $eintrMessage, strlen( $eintrMessage ) ) == 0 ) {
+                                       continue;
+                               } else {
+                                       trigger_error( $error['message'], E_USER_WARNING );
+                                       $logMsg = $error['message'];
+                                       break;
+                               }
+                       }
+                       foreach ( $readyPipes as $fd => $pipe ) {
+                               $block = fread( $pipe, 65536 );
+                               if ( $block === '' ) {
+                                       // End of file
+                                       fclose( $pipes[$fd] );
+                                       unset( $pipes[$fd] );
+                                       if ( !$pipes ) {
+                                               break 2;
+                                       }
+                               } elseif ( $block === false ) {
+                                       // Read error
+                                       $logMsg = "Error reading from pipe";
+                                       break 2;
+                               } elseif ( $fd == 1 ) {
+                                       // From stdout
+                                       $outBuffer .= $block;
+                               } elseif ( $fd == 3 ) {
+                                       // From log FD
+                                       $logBuffer .= $block;
+                                       if ( strpos( $block, "\n" ) !== false ) {
+                                               $lines = explode( "\n", $logBuffer );
+                                               $logBuffer = array_pop( $lines );
+                                               foreach ( $lines as $line ) {
+                                                       wfDebugLog( 'exec', $line );
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               foreach ( $pipes as $pipe ) {
+                       fclose( $pipe );
+               }
+
+               // Use the status previously collected if possible, since proc_get_status()
+               // just calls waitpid() which will not return anything useful the second time.
+               if ( $running ) {
+                       $status = proc_get_status( $proc );
+               }
+
+               if ( $logMsg !== false ) {
+                       // Read/select error
+                       $retval = -1;
+                       proc_close( $proc );
+               } elseif ( $status['signaled'] ) {
+                       $logMsg = "Exited with signal {$status['termsig']}";
+                       $retval = 128 + $status['termsig'];
+                       proc_close( $proc );
+               } else {
+                       if ( $status['running'] ) {
+                               $retval = proc_close( $proc );
+                       } else {
+                               $retval = $status['exitcode'];
+                               proc_close( $proc );
+                       }
+                       if ( $retval == 127 ) {
+                               $logMsg = "Possibly missing executable file";
+                       } elseif ( $retval >= 129 && $retval <= 192 ) {
+                               $logMsg = "Probably exited with signal " . ( $retval - 128 );
+                       }
+               }
+
+               if ( $logMsg !== false ) {
+                       wfDebugLog( 'exec', "$logMsg: $cmd" );
+               }
+
+               return new Result( $retval, $outBuffer );
+       }
+}
diff --git a/includes/shell/Result.php b/includes/shell/Result.php
new file mode 100644 (file)
index 0000000..c1429df
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Shell;
+
+/**
+ * Returned by MediaWiki\Shell\Command::execute()
+ *
+ * @since 1.30
+ */
+class Result {
+       /** @var int */
+       private $exitCode;
+
+       /** @var string */
+       private $stdout;
+
+       /**
+        * @param int $exitCode
+        * @param string $stdout
+        */
+       public function __construct( $exitCode, $stdout ) {
+               $this->exitCode = $exitCode;
+               $this->stdout = $stdout;
+       }
+
+       /**
+        * Returns exit code of the process
+        *
+        * @return int
+        */
+       public function getExitCode() {
+               return $this->exitCode;
+       }
+
+       /**
+        * Returns stdout of the process
+        *
+        * @return string
+        */
+       public function getStdout() {
+               return $this->stdout;
+       }
+}
diff --git a/includes/shell/Shell.php b/includes/shell/Shell.php
new file mode 100644 (file)
index 0000000..c293ff2
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+/**
+ * Class used for executing shell commands
+ *
+ * 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
+ */
+
+namespace MediaWiki\Shell;
+
+/**
+ * Executes shell commands
+ *
+ * @since 1.30
+ *
+ * Use call chaining with this class for expressiveness:
+ *  $result = Shell::command( 'some command' )
+ *       ->environment( [ 'ENVIRONMENT_VARIABLE' => 'VALUE' ] )
+ *       ->limits( [ 'time' => 300 ] )
+ *       ->execute();
+ *
+ *  ... = $result->getExitCode();
+ *  ... = $result->getStdout();
+ */
+class Shell {
+
+       /**
+        * Returns a new instance of this class
+        *
+        * @param string|string[] $command If string, a properly shell-escaped command line,
+        *   or an array of unescaped arguments, in which case each value will be escaped
+        *   Example:   [ 'convert', '-font', 'font name' ] would produce "'convert' '-font' 'font name'"
+        * @return Command
+        */
+       public static function command( $command ) {
+               $args = func_get_args();
+               if ( count( $args ) === 1 && is_array( reset( $args ) ) ) {
+                       // If only one argument has been passed, and that argument is an array,
+                       // treat it as a list of arguments
+                       $args = reset( $args );
+               }
+               $command = new Command();
+               return $command->params( $args );
+       }
+
+       /**
+        * Check if this class is effectively disabled via php.ini config
+        *
+        * @return bool
+        */
+       public static function isDisabled() {
+               static $disabled = null;
+
+               if ( is_null( $disabled ) ) {
+                       if ( !function_exists( 'proc_open' ) ) {
+                               wfDebug( "proc_open() is disabled\n" );
+                               $disabled = true;
+                       } else {
+                               $disabled = false;
+                       }
+               }
+
+               return $disabled;
+       }
+
+       /**
+        * Version of escapeshellarg() that works better on Windows.
+        *
+        * Originally, this fixed the incorrect use of single quotes on Windows
+        * (https://bugs.php.net/bug.php?id=26285) and the locale problems on Linux in
+        * PHP 5.2.6+ (bug backported to earlier distro releases of PHP).
+        *
+        * @param string $args,... strings to escape and glue together, or a single array of
+        *     strings parameter
+        * @return string
+        */
+       public static function escape( /* ... */ ) {
+               $args = func_get_args();
+               if ( count( $args ) === 1 && is_array( reset( $args ) ) ) {
+                       // If only one argument has been passed, and that argument is an array,
+                       // treat it as a list of arguments
+                       $args = reset( $args );
+               }
+
+               $first = true;
+               $retVal = '';
+               foreach ( $args as $arg ) {
+                       if ( !$first ) {
+                               $retVal .= ' ';
+                       } else {
+                               $first = false;
+                       }
+
+                       if ( wfIsWindows() ) {
+                               // Escaping for an MSVC-style command line parser and CMD.EXE
+                               // @codingStandardsIgnoreStart For long URLs
+                               // Refs:
+                               //  * https://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
+                               //  * https://technet.microsoft.com/en-us/library/cc723564.aspx
+                               //  * T15518
+                               //  * CR r63214
+                               // Double the backslashes before any double quotes. Escape the double quotes.
+                               // @codingStandardsIgnoreEnd
+                               $tokens = preg_split( '/(\\\\*")/', $arg, -1, PREG_SPLIT_DELIM_CAPTURE );
+                               $arg = '';
+                               $iteration = 0;
+                               foreach ( $tokens as $token ) {
+                                       if ( $iteration % 2 == 1 ) {
+                                               // Delimiter, a double quote preceded by zero or more slashes
+                                               $arg .= str_replace( '\\', '\\\\', substr( $token, 0, -1 ) ) . '\\"';
+                                       } elseif ( $iteration % 4 == 2 ) {
+                                               // ^ in $token will be outside quotes, need to be escaped
+                                               $arg .= str_replace( '^', '^^', $token );
+                                       } else { // $iteration % 4 == 0
+                                               // ^ in $token will appear inside double quotes, so leave as is
+                                               $arg .= $token;
+                                       }
+                                       $iteration++;
+                               }
+                               // Double the backslashes before the end of the string, because
+                               // we will soon add a quote
+                               $m = [];
+                               if ( preg_match( '/^(.*?)(\\\\+)$/', $arg, $m ) ) {
+                                       $arg = $m[1] . str_replace( '\\', '\\\\', $m[2] );
+                               }
+
+                               // Add surrounding quotes
+                               $retVal .= '"' . $arg . '"';
+                       } else {
+                               $retVal .= escapeshellarg( $arg );
+                       }
+               }
+               return $retVal;
+       }
+}
index 2c7965c..6d98e72 100644 (file)
@@ -113,6 +113,7 @@ class HashSiteStore implements SiteStore {
        /**
         * Deletes all sites from the database. After calling clear(), getSites() will return an empty
         * list and getSite() will return null until saveSite() or saveSites() is called.
+        * @return bool
         */
        public function clear() {
                $this->sites = [];
index 180a6df..4fcc865 100644 (file)
@@ -811,6 +811,9 @@ class SkinTemplate extends Skin {
 
        /**
         * @todo is this even used?
+        * @param string $name
+        * @param string $urlaction
+        * @return array
         */
        function makeArticleUrlDetails( $name, $urlaction = '' ) {
                $title = Title::newFromText( $name );
index 04d03f5..0762bf7 100644 (file)
@@ -573,10 +573,12 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /**
         * Include the modules and configuration for the RCFilters app.
         * Conditional on the user having the feature enabled.
+        *
+        * If it is disabled, add a <body> class marking that
         */
        protected function includeRcFiltersApp() {
+               $out = $this->getOutput();
                if ( $this->isStructuredFilterUiEnabled() ) {
-                       $out = $this->getOutput();
                        $jsData = $this->getStructuredFilterJsData();
 
                        $messages = [];
@@ -584,6 +586,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $messages[$key] = $this->msg( $key )->plain();
                        }
 
+                       $out->addBodyClasses( 'mw-rcfilters-enabled' );
+
                        $out->addHTML(
                                ResourceLoader::makeInlineScript(
                                        ResourceLoader::makeMessageSetScript( $messages )
@@ -616,6 +620,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                        'daysDefault' => $this->getDefaultDays(),
                                ]
                        );
+               } else {
+                       $out->addBodyClasses( 'mw-rcfilters-disabled' );
                }
        }
 
@@ -808,6 +814,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * ChangesListFilterGroup constructors.
         *
         * There is light processing to simplify core maintenance.
+        * @param array $definition
         */
        protected function registerFiltersFromDefinitions( array $definition ) {
                $autoFillPriority = -1;
@@ -1550,7 +1557,29 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return bool
         */
        public function isStructuredFilterUiEnabled() {
-               return $this->getUser()->getOption( 'rcenhancedfilters' );
+               if ( $this->getRequest()->getBool( 'rcfilters' ) ) {
+                       return true;
+               }
+
+               if ( $this->getConfig()->get( 'StructuredChangeFiltersShowPreference' ) ) {
+                       return !$this->getUser()->getOption( 'rcenhancedfilters-disable' );
+               } else {
+                       return $this->getUser()->getOption( 'rcenhancedfilters' );
+               }
+       }
+
+       /**
+        * Check whether the structured filter UI is enabled by default (regardless of
+        * this particular user's setting)
+        *
+        * @return bool
+        */
+       public function isStructuredFilterUiEnabledByDefault() {
+               if ( $this->getConfig()->get( 'StructuredChangeFiltersShowPreference' ) ) {
+                       return !$this->getUser()->getDefaultOption( 'rcenhancedfilters-disable' );
+               } else {
+                       return $this->getUser()->getDefaultOption( 'rcenhancedfilters' );
+               }
        }
 
        abstract function getDefaultLimit();
index d3e22a0..8d39c99 100644 (file)
@@ -35,6 +35,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 
        /**
         * @param string|null $subpage
+        * @return Title|bool
         */
        public function execute( $subpage ) {
                $redirect = $this->getRedirect( $subpage );
index 5318895..8b60387 100644 (file)
@@ -102,6 +102,7 @@ abstract class WantedQueryPage extends QueryPage {
         * @note This will only be run if the page is cached (ie $wgMiserMode = true)
         *   unless forceExistenceCheck() is true.
         * @since 1.24
+        * @param Title $title
         * @return bool
         */
        protected function existenceCheck( Title $title ) {
index 4d84e31..f9c917d 100644 (file)
@@ -341,7 +341,7 @@ class SpecialAllPages extends IncludableSpecialPage {
        /**
         * @param int $ns The namespace of the article
         * @param string $text The name of the article
-        * @return array( int namespace, string dbkey, string pagename ) or null on error
+        * @return array|null [ int namespace, string dbkey, string pagename ] or null on error
         */
        protected function getNamespaceKeyAndText( $ns, $text ) {
                if ( $text == '' ) {
index 252dc68..cd3c028 100644 (file)
@@ -484,7 +484,7 @@ class SpecialBlock extends FormSpecialPage {
         * @param string $par Subpage parameter passed to setup, or data value from
         *     the HTMLForm
         * @param WebRequest $request Optionally try and get data from a request too
-        * @return array( User|string|null, Block::TYPE_ constant|null )
+        * @return array [ User|string|null, Block::TYPE_ constant|null ]
         */
        public static function getTargetAndType( $par, WebRequest $request = null ) {
                $i = 0;
index dae6074..cda0854 100644 (file)
@@ -266,6 +266,7 @@ class LinkSearchPage extends QueryPage {
         *
         * @see T130058
         * @todo FIXME This special page should not use LIMIT for paging
+        * @return int
         */
        protected function getMaxResults() {
                return max( parent::getMaxResults(), 60000 );
index 61590d7..edfaa7c 100644 (file)
@@ -294,7 +294,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        /**
-        * @param stdClass $row Result row from recent changes
+        * @param stdClass $result Result row from recent changes
         * @return Revision|bool
         */
        protected function revisionFromRcResult( stdClass $result ) {
index 86bc7ed..b159fff 100644 (file)
@@ -21,6 +21,7 @@ class SpecialUnlinkAccounts extends AuthManagerSpecialPage {
 
        /**
         * Under which header this special page is listed in Special:SpecialPages.
+        * @return string
         */
        protected function getGroupName() {
                return 'users';
index d0eb8e3..b98fad1 100644 (file)
@@ -839,6 +839,7 @@ class SpecialUpload extends SpecialPage {
         * This controls js: mw.config.get( 'wgFileCanRotate' )
         *
         * @todo What about non-BitmapHandler handled files?
+        * @return bool
         */
        public static function rotationEnabled() {
                $bitmapHandler = new BitmapHandler();
index 3ea1d03..f176b40 100644 (file)
@@ -203,6 +203,7 @@ class SpecialVersion extends SpecialPage {
                        'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
                        'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
                        'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', 'Brad Jorsch',
+                       'Bartosz Dziewoński', 'Ed Sanders', 'Moriel Schottlender',
                        $othersLink, $translatorsLink
                ];
 
index 6d481f8..2ebbc2d 100644 (file)
@@ -74,6 +74,7 @@ class WantedFilesPage extends WantedQueryPage {
         * In its own function to allow subclasses to override.
         * @see SpecialWantedFilesGUOverride in GlobalUsage extension.
         * @since 1.24
+        * @return bool
         */
        protected function likelyToHaveFalsePositives() {
                return RepoGroup::singleton()->hasForeignRepos();
@@ -99,6 +100,7 @@ class WantedFilesPage extends WantedQueryPage {
         * Use wfFindFile so we still think file namespace pages without
         * files are missing, but valid file redirects and foreign files are ok.
         *
+        * @param Title $title
         * @return bool
         */
        protected function existenceCheck( Title $title ) {
index 7049744..ec64869 100644 (file)
@@ -112,9 +112,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        public function isStructuredFilterUiEnabled() {
-               return parent::isStructuredFilterUiEnabled()
-                       && ( $this->getConfig()->get( 'StructuredChangeFiltersOnWatchlist' )
-                               || $this->getRequest()->getBool( 'rcfilters' ) );
+               return $this->getRequest()->getBool( 'rcfilters' ) || (
+                       $this->getConfig()->get( 'StructuredChangeFiltersOnWatchlist' ) &&
+                       $this->getUser()->getOption( 'rcenhancedfilters' )
+               );
+       }
+
+       public function isStructuredFilterUiEnabledByDefault() {
+               return $this->getConfig()->get( 'StructuredChangeFiltersOnWatchlist' ) &&
+                       $this->getUser()->getDefaultOption( 'rcenhancedfilters' );
        }
 
        /**
index 947a572..fbe9270 100644 (file)
@@ -627,6 +627,7 @@ class BalanceElement {
 
        /**
         * Get a string key for the Noah's Ark algorithm
+        * @return string
         */
        public function getNoahKey() {
                if ( $this->noahKey === null ) {
@@ -710,6 +711,7 @@ class BalanceStack implements IteratorAggregate {
        /**
         * Insert a comment at the appropriate place for inserting a node.
         * @param string $value Content of the comment.
+        * @return string
         * @see https://html.spec.whatwg.org/multipage/syntax.html#insert-a-comment
         */
        public function insertComment( $value ) {
@@ -721,6 +723,7 @@ class BalanceStack implements IteratorAggregate {
         * Insert text at the appropriate place for inserting a node.
         * @param string $value
         * @param bool $isComment
+        * @return string
         * @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node
         */
        public function insertText( $value, $isComment = false ) {
@@ -901,6 +904,8 @@ class BalanceStack implements IteratorAggregate {
 
        /**
         * Return the adjusted current node.
+        * @param string $fragmentContext
+        * @return string
         */
        public function adjustedCurrentNode( $fragmentContext ) {
                return ( $fragmentContext && count( $this->elements ) === 1 ) ?
@@ -1513,6 +1518,8 @@ class BalanceActiveFormattingElements {
         * Find and return the last element with the specified tag between the
         * end of the list and the last marker on the list.
         * Used when parsing &lt;a&gt; "in body mode".
+        * @param string $tag
+        * @return null|Node
         */
        public function findElementByTag( $tag ) {
                $elt = $this->tail;
index 6e01894..f88b673 100644 (file)
@@ -14,6 +14,7 @@ abstract class TidyDriverBase {
 
        /**
         * Return true if validate() can be used
+        * @return bool
         */
        public function supportsValidate() {
                return false;
index 19f5100..4f639c1 100644 (file)
@@ -321,7 +321,7 @@ class ClassCollector {
        protected $alias;
 
        /**
-        * @var string $code PHP code (including <?php) to detect class names from
+        * @param string $code PHP code (including <?php) to detect class names from
         * @return array List of FQCN detected within the tokens
         */
        public function getClasses( $code ) {
index 6d0368c..67c0ca7 100644 (file)
@@ -662,7 +662,7 @@ class LanguageConverter {
         *
         * @param string $text Text to be converted
         * @param string $variant The target variant code
-        * @param int $startPos
+        * @param int &$startPos
         * @param int $depth Depth of recursion
         *
         * @throws MWException
index b2b0f63..525be3c 100644 (file)
@@ -7,7 +7,15 @@
                        "Tokoabibi"
                ]
        },
+       "tog-hidecategorization": "midimut kasabelih kakuniza",
+       "tog-numberheadings": "satangahan lunuk pabanggu",
+       "tog-watchlisthidecategorization": "midimut kasabelih kakuniza",
+       "tog-showhiddencats": "paazih madimutay a kakuniza",
+       "underline-always": "mahizatuay",
        "underline-never": "caaytu",
+       "editfont-default": "saazih sakaluk pataayaw tu kawaw a sulyang",
+       "editfont-monospace": "malecad ilaed a kataci nu silit",
+       "editfont-sansserif": "pacabay tu telay a kataci nu sulit",
        "sunday": "pilipayan",
        "monday": "sakacacay a demied nu lipay",
        "tuesday": "sakatusa a demied nu lipay",
        "subcategories": "sailuc-kasasizuma",
        "category-media-header": "kakuniza labuay \"$1\" a myiti",
        "hidden-categories": "{{PLURAL:$1|midimut kakuniza}}",
+       "hidden-category-category": "midimut kakuniza",
        "category-subcat-count": "{{PLURAL:$2|uyni kakuniza hatiza ku cacay yamalyilu sailuc-kakuniza. kina kakuniza yamalyilu isasa $2 a sailuc-kasasizuma, ilabu {{PLURAL:$1}}mahiza ku isasaay}}",
        "category-article-count": "{{PLURAL:$2|uyni kakuniza hatiza ku cacay yamalyilu sailuc-kakuniza. kina kakuniza yamalyilu isasa $2 a sailuc-kasasizuma, ilabu {{PLURAL:$1}}mahiza ku isasaay}}",
        "category-file-count": "{{PLURAL:$2|kakuniza yamalyilu isasaay a cacay ku tangan. kakuniza yamalyilu isasaay izaway $1 ku tangan, pulung $2 makalaan.}}",
        "listingcontinuesabbrev": "palalid",
        "about": "mahizaay",
+       "article": "lacul kasabelih",
        "newwindow": "(paynin baluhay a azih-sasingalan miwawah)",
        "cancel": "palawpes",
        "moredotdotdot": "yadah...",
        "anontalk": "sasukamu",
        "navigation": "pasubana’ tu miidangay",
        "and": "&#32;",
+       "faq": "sawsawniay a munday",
        "actions": "saungay",
        "namespaces": "pangangananay a salaedan",
        "variants": "masazumaay",
        "view": "ciwsace",
        "view-foreign": "i $1 miciwsace",
        "edit": "mikawaway-kalumyiti",
+       "edit-local": "itiniay buhci tu kamu nu mikawaway tu kalumyiti",
        "create": "patizeng",
        "create-local": "cunusen itiniay a buhci tu kamu",
        "delete": "misipu",
        "protect_change": "misumad",
+       "unprotect": "misumad tu midiputay",
        "newpage": "baluhayay a kasabelih",
        "talkpagelinktext": "sasukamu",
+       "specialpage": "sazumaay a kasabelih",
        "personaltools": "teked sakaluk",
        "talk": "matatengil",
        "views": "ciwsace",
        "redirectpagesub": "miliyaw tazuma kasabelih",
        "redirectto": "miliyaw tazuma tu:",
        "lastmodifiedat": "uyni kasabelih sazikuz mikawaway tu kalumyiti i $1 $2.",
+       "protectedpage": "madiputay a kasabelih",
        "jumpto": "taayaw:",
        "jumptonavigation": "pasubana’ tu miidangay",
        "jumptosearch": "kilim",
+       "pool-queuefull": "laylay saculuk matumestu",
+       "pool-errorunknown": "caay kapulita ku mungangaw",
        "aboutsite": "mahizaay {{SITENAME}}",
        "aboutpage": "Project:mahizaay",
        "copyright": "anu izaw ku zuma buhci tu kamu, kasabelih aazihen a lacul i labu, pisaungay hamin $1 sapabeli tu kinli a ceding.",
        "portal-url": "Project:komiyonityi sacumudan",
        "privacy": "salimek a mikuwanay a kawaw",
        "privacypage": "Project:salimek a mikuwanay a kawaw",
+       "badaccess": "mungangaw ku tungus",
        "ok": "malucekay",
        "retrievedfrom": "miala i \"$1\"",
        "editsection": "mikawaway-kalumyiti",
        "viewsourceold": "ciwsace sakatizeng bangu",
        "editlink": "mikawaway-kalumyiti",
        "viewsourcelink": "ciwsace sakatizeng bangu",
-       "editsectionhint": "mikawaway tu kalumyiti tusil: $1",
+       "editsectionhint": "mikawaway-kalumyiti tusil: $1",
        "toc": "dilyikotoling",
        "showtoc": "paazih",
        "hidetoc": "midimut",
        "site-atom-feed": "$1 a Atom saangangan",
        "page-atom-feed": "$1 a Atom saangangan",
        "red-link-title": "$1 (kasabelih nayai’ tu)",
+       "sort-descending": "nay tabakiay katukuh adidi  kasalaylay",
        "nstab-main": "kasabelih",
        "nstab-user": "misaungayay a kasabelih",
+       "nstab-media": "myiti kasabelih",
        "nstab-special": "sazumaay a kasabelih",
        "nstab-project": "cwanan kasabelih",
        "nstab-image": "tangan",
        "nstab-mediawiki": "palatuh",
        "nstab-template": "taazihan mitudung",
+       "nstab-help": "buhci tu kamu a kasabelih",
        "nstab-category": "kakuniza",
        "mainpage-nstab": "saayaway a belih",
        "error": "mungangaw",
+       "databaseerror": "sulu nu nasulitan  mungangaw",
        "databaseerror-query": "palalitemuh tu kawaw: $1",
        "databaseerror-function": "sakapaluwaluway: $1",
        "databaseerror-error": "mungangaw: $1",
+       "readonly": "pamutektu sulu nu nasulitan",
+       "internalerror": "ilabuay a mungangaw",
+       "internalerror_info": "ilabuay a mungangaw: $1",
        "badtitle": "a’cusay a pyawti",
        "badtitletext": "matuzu’ay a kasabelih pyawti u la’cusay、nayi’ ku cacan, caaysa tatenga’ay tu misiket kamu Wikiay a pyawti.\ntebanay pyawti akay amalyilu la’cusay pisaungay i pyawtayi a tatebanan nu nisulitan.",
        "viewsource": "ciwsace sakatizeng bangu",
+       "actionthrottled": "makelec saungay tuway",
        "exception-nologin": "caay henay patalabu",
        "welcomeuser": "manamuh tu tayniay, $1!",
        "yourname": "misaungayay a kalungangan:",
        "yourpassword": "mima:",
        "userlogin-yourpassword": "mima",
        "userlogin-yourpassword-ph": "suliten nu misuay a mima",
-       "createacct-yourpassword-ph": "pisulitan ku mima",
+       "createacct-yourpassword-ph": "pisuliten tu mima",
        "createacct-yourpasswordagain": "malucekay tu mima",
        "createacct-yourpasswordagain-ph": "pisulitan ku mima kinacacay aca",
        "userlogin-remembermypassword": "i balucu’en aku patalabu setyitase",
+       "cannotlogin-title": "la’cus patalabu",
+       "cannotloginnow-title": "la’cus patalabu ayza",
+       "cannotcreateaccount-title": "la’cusay panganganen ku canghaw",
+       "yourdomainname": "numisuay a calay-subal(wangyi):",
        "login": "patalabu",
        "nav-login-createaccount": "patalabu / panganganen ku canghaw",
        "logout": "katahkal",
        "createaccount": "panganganen ku canghaw",
        "userlogin-resetpassword-link": "maliyuh ku mima kisu haw?",
        "userlogin-helplink2": "patalabu miedap",
+       "createacct-emailrequired": "imyiyo(email) puenengan",
        "createacct-emailoptional": "imyiyo(email) tigami (u pili’ay sasulitan)",
        "createacct-email-ph": "pisulitan ku imyiyo(email) nu misu",
        "createacct-reason": "mahicaay",
        "createacct-submit": "panganganen ku misuay a canghaw",
        "createacct-another-submit": "panganganen ku canghaw",
+       "createacct-continue-submit": "palalid patizeng tu canghaw",
        "createacct-benefit-heading": "{{SITENAME}} paanin tu nisulitan tu nu tapangay mahiza kisuan.",
-       "createacct-benefit-body1": "saka{{PLURAL:$1|ku mikawaway tu kalumyiti}}",
+       "createacct-benefit-body1": "saka{{PLURAL:$1|mikawaway-kalumyiti}}",
        "createacct-benefit-body2": "{{PLURAL:$1| kasabelih}}",
        "createacct-benefit-body3": "cay katenesay{{PLURAL:$1|paaninay tu kalusasing}}",
+       "loginerror": "patalabu mungangaw",
+       "createacct-error": "canghaw patizeng mungangaw",
        "loginsuccesstitle": "patalabutu",
+       "mailmypassword": "miliyaw miteka setin mima",
+       "accountcreated": "panganganen tu ku canghaw",
        "loginlanguagelabel": "kamu: $1",
        "pt-login": "patalabu",
        "pt-login-button": "patalabu",
+       "pt-login-continue-button": "palalid patalabu",
        "pt-createaccount": "panganganen ku canghaw",
        "pt-userlogout": "katahkal",
+       "changepassword": "misumad tu mima",
+       "resetpass_header": "misumad canghaw mima",
+       "oldpassword": "malumannay a mima",
+       "newpassword": "baluhay a mima:",
+       "botpasswords": "kikay-tademaw a mima",
+       "botpasswords-label-appid": "kalungangan nu kikay-tademaw:",
        "botpasswords-label-create": "patizeng",
        "botpasswords-label-update": "misabaluhay",
        "botpasswords-label-cancel": "palawpes",
        "botpasswords-label-delete": "masipu",
+       "botpasswords-label-resetpassword": "miliyaw miteka setin mima",
+       "botpasswords-label-grants": "matatungusay a tungus:",
        "botpasswords-label-grants-column": "pabeli tu kinli",
+       "resetpass_forbidden": "la’cus misumad tu mima",
+       "resetpass_forbidden-reason": "la’cus misumad tu mima: $1",
+       "resetpass-submit-loggedin": "misumad tu mima",
        "resetpass-submit-cancel": "palawpes",
+       "resetpass-temp-password": "nanunuz a mima:",
        "passwordreset": "miliyaw miteka setin mima",
        "passwordreset-username": "misaungayay a kalungangan:",
+       "passwordreset-domain": "calay-subal(wangyi) kalungangan:",
+       "passwordreset-email": "imyiyo(email) puenengan:",
        "changeemail-none": "(nayi’)",
+       "changeemail-submit": "misumad imyiyo(email)",
+       "resettokens": "miliyaw patizeng sabuhat a mima",
        "resettokens-tokens": "sabuhat:",
        "bold_sample": "kibetulay a sulit",
        "bold_tip": "kibetulay a sulit",
        "hr_tip": "Sapisasuala (cayka yadah kawiza)",
        "summary": "pecu’ nu lacul:",
        "subject": "taazihan tu kawaw:",
-       "minoredit": "payni mikilulay a mikawaway tu kalumyiti",
+       "minoredit": "payni mikilulay a mikawaway-kalumyiti",
        "watchthis": "miazih tuyni kasabelih",
        "savearticle": "misuped kasabelih",
+       "savechanges": "misuped tu sumad",
+       "publishpage": "patiyak kasabelih",
+       "publishchanges": "patiyak misumad",
        "preview": "pataayaway miazih",
        "showpreview": "paazih pataayaway miazih",
        "showdiff": "paazih ku masumaday",
        "anoneditwarning": "<strong>patalaw:</strong>caay henay kisu patalabu. anu miteka mikawaway tu kalumyiti, IP adolyise nu misu ama mitilak. anu kisu <strong>[$1  patalabu ]</strong> acasa <strong>[$2 panganganen ku canghaw ]</strong>, misuay mikawaway tu kalumyiti payni tu nu misuay misaungayay kalungangan sacuzu’ ,izaway zuma kapahayay.",
+       "subject-preview": "pataayaway miazih  taazihan tu kawaw:",
+       "blockednoreason": "caay pasaheci tu mahicaay",
+       "nosuchsectiontitle": "caykatepa tu tusil",
+       "loginreqtitle": "maydih patalabu",
        "loginreqlink": "patalabu",
+       "accmailtitle": "mima patigamitu",
        "newarticle": "(baluhay)",
        "newarticletext": "masasiket kisu tu nayi’ay tu kasabelih.\namipatizeng tina kasabelih, kaisasa mikawaway tu kalumyiti atilad misulit ku lacul (kahica nu kawaw piazih tu tatenga’ay [$1 misaungay a buhci tu kamu  kasabelih ]).\namahica caay padeteng tayza tina kasabelih kisu haw, pihaymaw sapecec saazihay a <strong>tatiku</strong> pipenecan.",
        "noarticletext": "kina kasabelih inayi’ lacul ayza,kapah tu kisu i zumaay a kasabelih [[Special:Search/{{PAGENAME}}| mikilim kina kasabelih pyawti ]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  mikilim sasuala nasulitan nakawawan ] caay sa[{{fullurl:{{FULLPAGENAME}}|action=edit}} patizeng kina kasabelih ]</span>.",
        "noarticletext-nopermission": "tina kasabelih ayza inayi’ lacul,\nkapah tu kisu i zuma kasabelih [[Special:Search/{{PAGENAME}}| kilim kina kasabelih pyawti ]],acasa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  kilim sasuala nasulitan nakawawan ]</span>,uyzasa  inayi’  ku tungus patizeng tina kasabelih.",
-       "updated": "(misabaluhay)",
+       "updated": "(misabaluh tuway)",
+       "continue-editing": "taayaw mikawaway-kalumyiti nikatatapal",
        "editing": "mikawaway tu kalumyiti  $1 ayza",
        "creating": "patizeng ayza $1",
        "editingsection": "mikawaway tu kalumyiti ayza $1 (tusil)",
+       "yourtext": "numisuay a sulit",
+       "storedversion": "misupedtu tu sumad",
        "yourdiff": "sasizuma",
        "templatesused": "uyni kasabelih pisaungay tu isasaay {{PLURAL:$1|taazihan mitudung}}:",
        "template-protected": "(madiputay)",
        "template-semiprotected": "(madiputay a kasabelih - satizep mikawaway tu kalumyiti)",
        "hiddencategories": "kina kasabelih tungusay nu {{PLURAL:$1|1 midimut kakuniza }}mamikawaw:",
+       "permissionserrors": "mungangaw ku tungus",
        "permissionserrorstext-withaction": "namakay isasaay {{PLURAL:$1|mahicaay}}, inayi’ kisu situngus miteka $2 miteka tuway misaungay:",
        "moveddeleted-notice": "kina kasabelih masipu tu.\nisasa nipabeli kina kasabelihay a masipu atu milimad nasulitan nakawawan, taneng miazih tu tatenga’ay.",
+       "edit-conflict": "mikawaway-kalumyiti sasula’cus",
+       "defaultmessagetext": "pataayaw tu kawaw palatuh  a sulit",
+       "invalid-content-data": "lacul kalunasulitan la’cus",
        "content-model-text": "sulit a dada’",
        "content-json-empty-object": "inayi’ay a tuutuud",
        "content-json-empty-array": "inayi’ay a papazengan tu nisulitan",
        "viewpagelogs": "ciwsace kina kasabelih a nasulitan nakawawan",
+       "currentrev": "sabaluhay masumad",
        "currentrev-asof": "i $1 a sabaluhay masumad",
        "revisionasof": "$1 a sumad",
        "revision-info": "i $1 tuyni a {{GENDER:$6|$2}} u nasumad nu nikawawan",
        "next": "nuzikuzan",
        "last": "ayaway",
        "page_last": "sazikuzay a kasabelih",
+       "history-fieldset-title": "mikilim masumad nu ayaway",
        "histfirst": "sakasumamadan",
        "histlast": "sabaluhay",
        "historyempty": "(inayi’)",
+       "history-feed-title": "masumad nu ayaway a nazipa’an",
        "history-feed-item-nocomment": "$1 i $2",
+       "rev-delundel": "misumad ku maazihay",
        "rev-showdeleted": "paazih",
        "revdelete-show-file-submit": "hang",
+       "revdelete-legend": "misetin paazih a kelec",
+       "revdelete-hide-text": "masumad nu ayaway a sulit",
+       "revdelete-hide-image": "midimut lacul nu tangan",
+       "revdelete-hide-comment": "pecu’ nu lacul mikawaway-kalumyiti",
+       "revdelete-radio-same": "(amana misumad)",
        "revdelete-radio-set": "midimut",
        "revdelete-log": "mahicaay:",
+       "revdel-restore": "misumad ku maazihay",
+       "pagehist": "kasabelih nazipa’an",
+       "deletedhist": "masiputu tu nazipa’an",
+       "revdelete-reasonotherlist": "zuma a mahicaay",
+       "revdelete-edit-reasonlist": "masipu a mahicaay nu mikawaway-kalumyiti",
+       "revdelete-offender": "masumad nu ayaway  masacudaday:",
+       "mergehistory-from": "saangangan kasabelih:",
+       "mergehistory-into": "pabalucu’an kasabelih:",
        "mergehistory-reason": "mahicaay:",
+       "mergelog": "mikabu tu nasulitan nazipa’an",
+       "revertmerge": "palawpes makabuay",
        "history-title": "\"$1\" masumaday a nazipa’an",
        "difference-title": "\"$1\" misumad laeday sasizuma",
        "lineno": "silsil $1:",
        "editundo": "patiku",
+       "diff-empty": "(inayi’ sasizuma)",
        "diff-multi-sameuser": "(malecaday misaungayay {{PLURAL:$1| ilaed izaw ku $1 a sumad}}inayi’ paazih)",
        "searchresults": "heci nu makatepa",
        "searchresults-title": "$1 heci nu makatepa",
+       "titlematches": "kasabelih satangah matatungus",
+       "textmatches": "kasabelih lacul matatungus",
        "prevn": "ayaw saka {{PLURAL:$1|$1}}",
        "nextn": "zikuzan saka {{PLURAL:$1|$1}}",
        "prev-page": "ayaway a belih",
        "search-section": "(tusil $1)",
        "search-suggest": "u tuzu’ nu misu ku:$1 haw?",
        "search-interwiki-more": "(yadah)",
+       "search-interwiki-more-results": "sayadahay a heci",
        "search-relatedarticle": "mahizaay",
        "searchall": "hamin",
        "search-showingresults": "{{PLURAL:$4|saka <strong>$1</strong> a heci, pulung <strong>$3</strong>|saka <strong>$1-$2</strong> a heci, pulung <strong>$3</strong>}}",
        "search-nonefound": "nayi’ matatungusay palalitemuh tu kawaw maheciay.",
+       "powersearch-legend": "tapabaw mikilim",
+       "powersearch-togglelabel": "pipili’i:",
        "powersearch-toggleall": "hamin",
        "powersearch-togglenone": "nayi’",
+       "search-external": "mikilim i hekal",
+       "preferences": "setin tu kanamuhan",
        "mypreferences": "setin tu kanamuhan",
+       "prefs-edits": "kinapina ku mikawaway-kalumyiti:",
        "prefs-skin": "nuhekalan",
        "skin-preview": "pataayaway miazih",
        "datedefault": "sulyang nu pataayaw tu kawaw",
+       "prefs-labs": "mitanam henay a sasahicaan",
        "prefs-rc": "capi a demaiday a sumad",
+       "prefs-watchlist": "miazihay a piazihan tu sulit",
+       "prefs-editwatchlist": "miazihay a piazihan tu sulit nu mikawaway-kalumyiti",
        "prefs-misc": "zuma",
+       "prefs-resetpass": "misumad tu mima",
+       "prefs-email": "imyiyo(email) mapili’ay",
        "prefs-rendering": "nuhekalan",
        "saveprefs": "suped",
        "prefs-editing": "mikawaway-kalumyiti",
        "searchresultshead": "kilim",
        "stub-threshold-sample-link": "maaziahan",
        "stub-threshold-disabled": "mapasatezep",
+       "localtime": "itiniay a tuki:",
+       "servertime": "sefuci-kikay a tuki:",
        "timezoneregion-africa": "Afilika",
        "timezoneregion-america": "Amilikaco",
        "timezoneregion-antarctica": "Nancico",
        "timezoneregion-arctic": "Sasaamisan",
        "timezoneregion-asia": "Yaco",
        "timezoneregion-australia": "Awco",
-       "timezoneregion-europe": "Oco",
+       "timezoneregion-europe": "Ouco",
        "timezoneregion-indian": "Intuyang-bayu’",
        "timezoneregion-pacific": "Taypinyang-bayu’",
        "prefs-searchoptions": "kilim",
+       "prefs-namespaces": "pangangananay a salaedan",
        "default": "pataayaw tu kawaw",
        "prefs-custom-css": "pakuniza misanga’ CSS",
+       "prefs-registration": "pangangan a demiad:",
+       "yourrealname": "tatengaay a ngangan:",
        "yourlanguage": "kamu:",
+       "yournick": "baluhay sulitan a ngangan:",
+       "email": "imyiyo(email)",
+       "prefs-info": "anganganay a cesyun",
        "prefs-i18n": "masakitakiay",
        "prefs-signature": "sulitan a ngangan",
+       "prefs-dateformat": "demiad a kese",
        "prefs-timeoffset": "ilaed nu tuki",
+       "prefs-advancedediting": "habutuday a mapiliay",
        "prefs-editor": "mikawaway-kalumyitiay",
        "prefs-preview": "pataayaway miazih",
+       "prefs-advancedrc": "tapabaway a mapiliay",
+       "prefs-advancedsearchoptions": "tapabaway a mapiliay",
+       "prefs-displayrc": "paazih tu mapiliay",
        "prefs-tokenwatchlist": "sabuhat",
        "prefs-diffs": "sasizuma",
+       "userrights": "tungus nu misaungayay",
+       "userrights-lookup-user": "mipili’ misaungayay",
+       "userrights-groupsmember": "canan a luyaluy:",
        "userrights-reason": "mahicaay:",
        "userrights-expiry-current": "kakatekuhan $1",
+       "userrights-expiry-none": "inayi’ kakatekuhan",
        "userrights-expiry": "kakatekuhan:",
+       "userrights-expiry-othertime": "zuma a tatukian:",
        "group": "luyaluy:",
        "group-user": "misaungayay",
        "group-bot": "kikay a tademaw",
        "group-sysop": "mikuwanay",
        "group-bureaucrat": "situngusay a mikawaway",
+       "group-suppress": "misisipay",
        "group-all": "(hamin)",
        "group-bot-member": "{{GENDER:$1|kikay a tademaw}}",
        "grouppage-bot": "{{ns:project}}:kikay a tademaw",
        "grouppage-sysop": "{{ns:project}}:mikuwanay",
        "grouppage-bureaucrat": "{{ns:project}}:situngusay a mikawaway",
+       "right-read": "miasip kasabelih",
+       "right-edit": "kasabelih mikawaway-kalumyiti",
+       "right-createtalk": "patizeng matatengil  kasabelih",
+       "right-move": "milimad kasabelih",
+       "right-move-categorypages": "milimad kakuniza a kasabelih",
+       "right-movefile": "milimad tu tangan",
+       "right-upload": "patapabaw tu tangan",
        "right-writeapi": "pisaungay suliten API",
+       "right-delete": "misipu tu kasabelih",
+       "right-mergehistory": "mikabu kasabelih nazipa’an",
+       "grant-group-page-interaction": "kasasukamu tu kasabelih",
+       "grant-group-file-interaction": "kasasukamu tu myiti",
+       "grant-group-email": "pabahel imyiyo(email)",
+       "grant-group-high-volume": "mileku sayadah a saungay nu binawlan",
+       "grant-group-administration": "mileku tu mikuwanay a kawaw",
+       "grant-group-other": "zuma saungay nu binawlan",
        "grant-createaccount": "panganganen ku canghaw",
+       "grant-highvolume": "masibek mikawaway-kalumyiti",
+       "grant-privateinfo": "misuped-miala madimut kasikazan a cesyun",
+       "grant-uploadfile": "patapabaw ku baluhay a tangan",
+       "grant-basic": "anganganay a tungus",
        "newuserlogpage": "patizeng misaungayay nasulitan nakawawan",
-       "action-edit": "mikawaway tu kalumyiti uyni kasabelih",
+       "action-edit": "mikawaway-kalumyiti uyni a kasabelih",
+       "action-move-categorypages": "milimad kakuniza a kasabelih",
+       "action-movefile": "milimad tina tangan",
+       "action-upload": "patapabaw tina tangan",
+       "action-deleterevision": "misipu tu masumaday nu ayaway",
+       "action-deletelogentry": "masipu nasulitan nazipa’an  kasacacay",
+       "action-sendemail": "pabahel imyiyo(email)",
+       "nchanges": "$1 {{PLURAL:$1|misumad}}",
        "enhancedrc-history": "nazipa’an",
        "recentchanges": "capi a demaiday a sumad",
        "recentchanges-legend": "capi a demiad masumaday a mapiliay",
        "recentchanges-legend-heading": "<strong>u tinaku nu kulit:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (piazih tu tatenga’ay [[Special:NewPages| baluhayay a kasabelih]])",
        "recentchanges-submit": "paazih",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|tuki}}",
+       "rcfilters-quickfilters": "suped sebseb sakaluk",
+       "rcfilters-savedqueries-defaultlabel": "suped sebseb sakaluk",
+       "rcfilters-savedqueries-rename": "miliyaw miteka pangangan",
+       "rcfilters-savedqueries-setdefault": "paceken pataayaw tu kawaw",
        "rcfilters-savedqueries-new-name-label": "kalungangan",
        "rcfilters-savedqueries-cancel-label": "palawpes",
-       "rcfilters-filterlist-title": "kilim",
+       "rcfilters-filterlist-title": "sakacucek nu misapili’",
+       "rcfilters-highlightbutton-title": "pulita sacuzu’ a heci",
+       "rcfilters-highlightmenu-title": "mipili’ tu kilit",
+       "rcfilters-filterlist-noresults": "caykatepa sakacucek nu misapili’",
+       "rcfilters-filtergroup-authorship": "paaninay a masacudaday",
+       "rcfilters-filter-editsbyself-label": "numisuay a mikawaway-kalumyiti",
+       "rcfilters-filter-editsbyself-description": "numisuay a paanin",
+       "rcfilters-filter-editsbyother-label": "zumaay tatemaw a sumad",
+       "rcfilters-filter-user-experience-level-registered-label": "pangangan tuway",
+       "rcfilters-filter-user-experience-level-unregistered-label": "caay henay pangangan",
        "rcfilters-filter-user-experience-level-newcomer-label": "baluhayay a misaungayay",
        "rcfilters-filter-user-experience-level-learner-label": "mahananamay",
+       "rcfilters-filtergroup-automated": "palunukay a paanin",
        "rcfilters-filter-bots-label": "kikay a tademaw",
+       "rcfilters-filtergroup-reviewstatus": "ciwsya setyitase",
        "rcfilters-filter-patrolled-label": "tayza mikibi tuway",
+       "rcfilters-filter-unpatrolled-label": "caay henay tayza mikibi",
+       "rcfilters-filtergroup-significance": "kakilulen",
        "rcfilters-filter-minor-label": "cayka yadah ku misumad",
+       "rcfilters-filter-major-label": "caay mikilulay mikawaway-kalumyiti",
+       "rcfilters-filter-watchlist-watched-label": "miazih piazihan tu sulit",
+       "rcfilters-filtergroup-changetype": "misumad nikalahizaan",
+       "rcfilters-filter-pageedits-label": "mikawaway-kalumyiti nu kasabelih",
+       "rcfilters-filter-newpages-label": "patizeng kasabelih",
+       "rcfilters-filter-categorization-label": "kakuniza misumad",
+       "rcfilters-filter-logactions-label": "saungay a nasulitan nazipa’an",
+       "rcfilters-filtergroup-lastRevision": "sabaluhay masumad",
        "rclistfrom": "paazih nay $3 $2 baluhayay a sumad katukuh ayza",
-       "rcshowhideminor": "$1 mikilulay mikawaway tu kalumyiti",
+       "rcshowhideminor": "$1 mikilulay mikawaway-kalumyiti",
        "rcshowhideminor-show": "paazih",
-       "rcshowhideminor-hide": "Hide",
-       "rcshowhidebots": "$1 kikay a tademaw",
+       "rcshowhideminor-hide": "midimut",
+       "rcshowhidebots": "$1 kikay-tademaw",
        "rcshowhidebots-show": "paazih",
        "rcshowhidebots-hide": "midimut",
        "rcshowhideliu": "$1 mapangangan tuway a misaungayay",
        "rcshowhideanons": "$1 paceba panganganay a misaungayay",
        "rcshowhideanons-show": "paazih",
        "rcshowhideanons-hide": "midimut",
+       "rcshowhidepatr": "$1 tayza mikibi mikawaway-kalumyiti",
        "rcshowhidepatr-show": "paazih",
        "rcshowhidepatr-hide": "midimut",
        "rcshowhidemine": "$1 mikawaway tu kalumyiti nu maku",
        "rcshowhidemine-show": "paazih",
        "rcshowhidemine-hide": "midimut",
+       "rcshowhidecategorization": "$1 kasabelih nu kakuniza",
        "rcshowhidecategorization-show": "paazih",
        "rcshowhidecategorization-hide": "midimut",
        "rclinks": "paazih capi a demiad $2 a demiaday a saka $1 a sumad.",
        "minoreditletter": "adidi’",
        "newpageletter": "baluhay",
        "boteditletter": "kikay a tademaw",
+       "rc_categories_any": "amahicahica tu mipili’ay",
        "rc-change-size-new": "masumadtu sa u $1 {{PLURAL:$1|wyiyincu}}",
        "newsectionsummary": "/* $1 */ baluhay a tusil",
+       "rc-enhanced-expand": "paazih pulita kalunasulitan",
+       "rc-enhanced-hide": "midimut pulitaay a  kalunasulitan",
        "recentchangeslinked": "sasuala a sumad",
        "recentchangeslinked-feed": "sasuala a sumad",
        "recentchangeslinked-toolbox": "sasuala a sumad",
        "recentchangeslinked-to": "Show changes to pages linked to the given page instead\nmisumad ku paazih masasiket tayza matuzu’ay kasabelih a nisumad",
        "upload": "patapabaw ku tangan",
        "uploadnologin": "caay henay patalabu",
+       "uploaderror": "patapabaw mungangaw",
+       "uploadlogpage": "patapabaw nasulitan nazipa’an",
+       "filename": "kalungangan nu tangan",
        "filedesc": "pecu’ nu lacul",
        "fileuploadsummary": "pecu’ nu lacul:",
+       "filereuploadsummary": "tangan misaimed:",
+       "filestatus": "nisanga’an niza tu tungus a kawaw setyitase:",
        "filesource": "saangangan:",
+       "ignorewarnings": "sekipo sacahamin patalaw",
+       "uploadwarning": "patapabaw patalaw",
+       "savefile": "misuped tu tangan",
+       "upload-source": "saangangan a tangan",
+       "upload-description": "tangan sapuelac",
+       "upload-options": "patapabaw mapiliay",
+       "watchthisupload": "miazih tina tangan",
+       "upload-file-error": "ilabuay a mungangaw",
        "upload-dialog-button-cancel": "palawpes",
        "upload-dialog-button-back": "tatiku",
        "upload-dialog-button-done": "pahezek",
        "upload-dialog-button-save": "suped",
        "upload-dialog-button-upload": "patapabaw",
+       "upload-form-label-infoform-title": "pulitaay a kalunasulitan",
        "upload-form-label-infoform-name": "kalungangan",
        "upload-form-label-infoform-description": "patahkal",
        "upload-form-label-infoform-categories": "kakuniza",
        "upload-form-label-infoform-date": "demiad",
+       "uploadstash": "patapabaw ku sulu nu pisipetan",
+       "uploadstash-refresh": "misabaluhay tu tangan piazihan tu sulit",
+       "invalid-chunk-offset": "la’cus atilad kakitizaan",
+       "img-auth-accessdenied": "kakaian misuped-miala",
+       "upload-curl-error28": "patapabaw mautang",
        "license": "sapabeli tu kinli a cedang",
        "license-header": "sapabeli tu kinli a cedang",
+       "nolicense": "caay henay mipili’",
+       "license-nopreview": "(amana pataayaway miazih)",
        "listfiles-delete": "misipu",
        "imgfile": "tangan",
-       "listfiles": "tangan-tangan misiket",
+       "listfiles": "piazihan tu sulit nu tangan",
        "listfiles_thumb": "sukep tu zunga",
        "listfiles_date": "demiad",
        "listfiles_name": "kalungangan",
        "listfiles_size": "hacica-tabaki",
        "listfiles_description": "patahkal",
        "listfiles_count": "baziyong",
+       "listfiles-latestversion": "ayzaay a baziyong",
        "listfiles-latestversion-yes": "hang",
-       "listfiles-latestversion-no": "caay",
+       "listfiles-latestversion-no": "nayi’",
        "file-anchor-link": "tangan",
        "filehist": "tangan nu nazipa’an",
        "filehist-help": "sapecec ku demiad/tuki sapiciwsace ku tuki nina demiad a tangan baziyong",
+       "filehist-deleteall": "haminan misipu",
        "filehist-current": "ayza",
        "filehist-datetime": "demiad/tuki",
        "filehist-thumb": "sukep tu zunga",
        "filehist-thumbtext": "nu $1 baziyongay a sukep tu zunga",
+       "filehist-nothumb": "inayi’ patapabaw",
        "filehist-user": "misaungayay",
        "filehist-dimensions": "ditek",
+       "filehist-filesize": "hacica-tabaki ku tangan",
        "filehist-comment": "pacunus sakacaay kapawan",
-       "imagelinks": "tangan sadama tu kawaw",
+       "imagelinks": "sakapaluwaluway nu tangan",
        "linkstoimage": "isasaay {{PLURAL:$1| kasabelih  misiket |saka $1 a kasabelih misiket}}katukuh tina tangan:",
        "nolinkstoimage": "nayi’ ku kasabelih masasiket katukuh tini a tangan.",
        "sharedupload-desc-here": "kina tangan nay $1 hakay satu pisaungay tu zuma a cwanan.\nisasaay paazih kuyniay a tangan i [$2 tangan patahkal kasabelih] a patahkalay a lacul.",
        "shared-repo-from": "nay $1",
+       "shared-repo": "kapulung mizakecay a sulu nu tangan",
        "upload-disallowed-here": "la’cus kisu mitahpu tuyni a tangan.",
+       "filerevert": "patiku $1",
+       "filerevert-legend": "patiku tu tangan",
        "filerevert-comment": "mahicaay:",
+       "filedelete": "misipu \"$1\"",
+       "filedelete-legend": "misipu tu tangan",
        "filedelete-comment": "mahicaay:",
        "filedelete-submit": "masipu",
+       "filedelete-reason-otherlist": "zuma a mahicaay",
+       "filedelete-edit-reasonlist": "masipu a mahicaay nu mikawaway-kalumyiti",
+       "filedelete-maintenance-title": "la’cus masipu tu tangan",
        "download": "patasasa'",
+       "listredirects": "miliyaw patatuzu’ piazihan tu sulit",
+       "listduplicatedfiles": "misaliyaw tu tangan piazihan tu sulit",
        "randompage": "kakibalucu’ ay a kasabelih",
+       "randomincategory": "kakibalucu’ kakuniza a kasabelih",
+       "randomincategory-legend": "kakibalucu’ kakuniza a kasabelih",
        "randomincategory-submit": "mileku",
+       "randomredirect": "kakibalucu’ miliyaw patatuzu’",
        "statistics": "sausi",
+       "statistics-header-pages": "kasabelih sausi",
+       "statistics-header-edits": "sausi mikawaway-kalumyiti",
+       "statistics-header-hooks": "zuma a sausi",
+       "statistics-articles": "lacul kasabelih",
+       "statistics-users-active": "saungay nu binawlan a misaungayay",
+       "pageswithprop-prop": "susin kalungangan:",
        "pageswithprop-submit": "mileku",
        "brokenredirects-delete": "misipu",
        "withoutinterwiki-legend": "saayaway a sulit",
        "withoutinterwiki-submit": "paazih",
        "nbytes": "$1 {{PLURAL:$1|wyiyincu}}",
        "ncategories": "{{PLURAL:$1|kakuniza}}",
+       "nlinks": "$1 {{PLURAL:$1|masasiket}}",
        "nmembers": "$1 {{PLURAL:$1|ku mamikawaw}}",
+       "nrevisions": "$1 {{PLURAL:$1|masumad nu ayaway}}",
+       "nimagelinks": "{{PLURAL:$1|kasabelih}}",
+       "lonelypages": "masipulu’ a kasabelih",
+       "uncategorizedtemplates": "sapi kakuniza taazihan mitudung",
+       "wantedcategories": "maydihay a kakuniza",
+       "wantedpages": "maydihay a kasabelih",
+       "wantedfiles": "maydihay a tangan",
+       "wantedtemplates": "maydihay a taazihan mitudung",
        "prefixindex-submit": "paazih",
+       "shortpages": "ma’ngadisay a kasabelih",
+       "longpages": "mangasiway a kasabelih",
+       "deadendpages": "inayi’ masasiket kasabelih",
+       "protectedpages": "madiputay a kasabelih",
+       "protectedpages-timestamp": "demiad tatukian",
        "protectedpages-page": "kasabelih",
        "protectedpages-expiry": "kakatekuhan",
+       "protectedpages-performer": "midiput misaungayay",
+       "protectedpages-params": "midiput tu aazihen a sulyang",
        "protectedpages-reason": "mahicaay",
+       "protectedpages-submit": "paazih tu kasabelih",
+       "protectedtitles": "madiputay a satangahan",
+       "protectedtitles-submit": "paazih tu satangahan",
+       "listusers": "misaungayay a piazihan tu sulit",
+       "listusers-desc": "pisaungay nay tabakiay katukuh adidi’ kasalaylay",
        "newpages": "baluhay kasabelih",
        "newpages-submit": "paazih",
+       "newpages-username": "misaungayay a kalungangan:",
+       "ancientpages": "samalumanay a kasabelih",
        "move": "milimad",
        "notargettitle": "inayi’ ku pabalucu’an",
        "pager-older-n": "{{PLURAL:$1| kusa malumanay}}",
        "suppress": "malangat",
+       "apihelp": "buhci tu kamu nu API",
+       "apisandbox": "bunac haku nu API",
+       "apisandbox-fullscreen": "micuwat tu sapat",
+       "apisandbox-submit": "miawaw tu milunguc",
        "apisandbox-reset": "palawpis",
        "apisandbox-retry": "miliyaw mitaneng",
+       "apisandbox-helpurls": "buhci tu kamu masasiket",
        "apisandbox-examples": "tinaku",
+       "apisandbox-dynamic-parameters": "zuma aazihen a sulyang",
+       "apisandbox-dynamic-parameters-add-label": "micunus aazihen a sulyang:",
+       "apisandbox-dynamic-parameters-add-placeholder": "kalungangan nu aazihen a sulyang",
+       "apisandbox-deprecated-parameters": "mapasatezepay a aazihen a sulyang",
+       "apisandbox-fetch-token": "lunuk suliten mima-sacukcuk",
+       "apisandbox-submit-invalid-fields-title": "izaw tu ku langat la’cus",
        "apisandbox-results": "heci",
        "apisandbox-continue": "palalid",
        "apisandbox-continue-clear": "palawpis",
        "booksources": "nu cudad atu laculaculan",
        "booksources-search-legend": "mikilim ku cudad atu laculaculan",
        "booksources-search": "kilim",
+       "specialloguserlabel": "mileku-misaungayay:",
        "log": "nasulitan nakawawan",
        "logeventslist-submit": "paazih",
+       "all-logs-page": "sacahamin pabinawlan nasulitan nazipa’an",
        "checkbox-select": "mipili’: $1",
        "checkbox-all": "hamin",
        "checkbox-none": "nayi’",
+       "checkbox-invert": "kabelihan mipili’",
        "allpages": "hamin nu kasabelih",
        "nextpage": "zikuzan a belih ($1)",
        "prevpage": "ayaway a belih ($1)",
        "allpagessubmit": "mileku",
        "categories": "kakuniza",
        "categories-submit": "paazih",
+       "linksearch": "ihekal masasiket mikilim",
+       "linksearch-pat": "mikilim aazihen a sulit:",
        "linksearch-ns": "pangangananay a salaedan:",
        "linksearch-ok": "kilim",
        "listusers-submit": "paazih",
+       "listusers-noresult": "caykatepa misaungayay.",
+       "listusers-blocked": "(malangat tuway)",
+       "activeusers-noresult": "caykatepa misaungayay.",
        "listgrouprights-group": "luyaluy",
+       "listgrouprights-rights": "kinli",
+       "listgrouprights-members": "(sakawaway piazihan tu sulit)",
+       "listgrouprights-addgroup-all": "micunus sacahamin a luyaluy",
+       "listgrouprights-removegroup-all": "misipu sacahamin luyaluy",
+       "listgrouprights-namespaceprotection-header": "pangangananay a salaedan mikelec",
        "listgrants": "pabeli tu kinli",
        "listgrants-rights": "kinli",
+       "trackingcategories": "mikilul nazikuzan kakuniza",
+       "trackingcategories-desc": "kakuniza milisimet a tatungus",
+       "trackingcategories-disabled": "mapasatezep kakuniza tuway",
+       "mailnologin": "inayi’ pabahel puenengan",
+       "usermaildisabled": "mapasatezep imyiyo(email)",
+       "emailusername": "misaungayay a kalungangan:",
        "emailusernamesubmit": "patayzaan",
-       "emailfrom": "nay:",
+       "emailfrom": "patigamiay:",
        "emailto": "katukuh:",
        "emailsubject": "taazihan tu kawaw:",
        "emailmessage": "palatuh:",
        "mywatchlist": "miazihay a piazihan tu sulit",
        "watchnologin": "caay henay patalabu",
        "watch": "miazih",
+       "watchthispage": "miazih tuyni kasabelih",
+       "unwatch": "palawpes aazihan",
+       "unwatchthispage": "pahanhan miazih",
+       "notanarticle": "caay ku lacul nu kasabelih",
        "watchlist-hide": "midimut",
        "wlshowhideminor": "cayka yadah ku misumad",
        "wlshowhidebots": "kikay a tademaw",
+       "wlshowhideliu": "napangangan a misaungayay",
+       "wlshowhideanons": "paceba panganganay a misaungayay",
+       "wlshowhidepatr": "tayza mikibi mikawaway-kalumyiti",
+       "wlshowhidemine": "numakuay a mikawaway-kalumyiti",
+       "wlshowhidecategorization": "kasabelih nu kakuniza",
+       "unwatching": "palawpes aazihan...",
+       "enotif_anon_editor": "paceba panganganay a misaungayay $1",
+       "enotif_minoredit": "payni mikilulay a mikawaway-kalumyiti",
+       "deletepage": "misipu tu kasabelih",
        "confirm": "malucekaytu",
        "delete-confirm": "misipu \"$1\"",
        "historyaction-submit": "paazih",
+       "actioncomplete": "pahezek tu ku saungay",
+       "actionfailed": "saungay mungangaw",
        "dellogpage": "masipu ku nasulitan nakawawan",
+       "deletionlog": "masipu nasulitan nazipa’an",
        "deletecomment": "mahicaay:",
+       "deletereasonotherlist": "zuma a mahicaay",
+       "rollback": "panukasan mikawaway-kalumyiti",
        "rollbacklink": "panukasan",
        "rollbacklinkcount": "patiku {{PLURAL:$1|mikawaway tu kalumyiti}}",
+       "rollbackfailed": "patiku mungangaw",
+       "sessionfailure-title": "kasasiket mungangaw",
+       "changecontentmodel": "misumad lacul tatudungen misanga’",
+       "changecontentmodel-title-label": "kasabelih satangahan",
+       "changecontentmodel-model-label": "tatudungen misanga’ nu baluhay a lacul",
        "changecontentmodel-reason-label": "mahicaay:",
        "protectlogpage": "midiput nasulitan nakawawan",
+       "protect-legend": "malucekay tu midiputay",
        "protectcomment": "mahicaay:",
        "protectexpiry": "kakatekuhan:",
+       "protect_expiry_invalid": "la’cusay a kakatekuhan",
+       "protect_expiry_old": "Expiration time is in the past.",
+       "protect-level-sysop": "mahasa mikuwanay a cacay",
        "protect-summary-cascade": "patatusul",
        "protect-expiring": "kakatekuhan $1 (UTC)",
+       "protect-expiring-local": "kakatekuhan katukuh i $1",
        "protect-expiry-indefinite": "inayi’ u sungliw",
+       "protect-othertime": "zuma a tatukian:",
+       "protect-otherreason-op": "zuma a mahicaay",
+       "protect-edit-reasonlist": "midiput a mahicaay nu mikawaway-kalumyiti",
+       "restriction-type": "pabeli tu kinli mahasa:",
+       "restriction-level": "kelec kasaselal:",
+       "minimum-size": "makaadidi’ay a sausi",
+       "maximum-size": "sakatabakiay a sausi:",
+       "pagesize": "(wyiyincu)",
        "restriction-edit": "mikawaway-kalumyiti",
        "restriction-move": "milimad",
        "restriction-create": "patizeng",
        "restriction-upload": "patapabaw",
+       "restriction-level-sysop": "maenapay a diput",
+       "restriction-level-autoconfirmed": "madiputay a kasabelih - satizep mikawaway tu kalumyiti",
+       "restriction-level-all": "amahicahicaay a kasalelal",
+       "undelete-fieldset-title": "patiku misumad nu ayaway",
        "undeletebtn": "patiku",
        "undeletecomment": "mahicaay:",
        "undelete-search-submit": "kilim",
        "uctop": "(ayza)",
        "month": "sazikuzay demiad nabuladan:",
        "year": "sazikuzay demiad mihcaan:",
+       "sp-contributions-newbies-sub": "paanin nu baluhay a canghaw",
        "sp-contributions-blocklog": "milangat tu nasulitan nakawawan",
        "sp-contributions-uploads": "patapabaw",
        "sp-contributions-logs": "nasulitan nakawawan",
        "sp-contributions-talk": "sasukamu",
+       "sp-contributions-search": "mikilim tu paanin",
+       "sp-contributions-hideminor": "midimut mikilulay mikawaway-kalumyiti",
        "sp-contributions-submit": "kilim",
        "whatlinkshere": "masasiket katukuh uyniyay a kasabelih",
        "whatlinkshere-title": "masasiket tazumaay a \"$1\" kasabelih",
        "whatlinkshere-page": "Kasabelih:",
        "linkshere": "isasaay a kasabelih masasiket tazuma tu <strong>[[:$1]]</strong>:",
        "isredirect": "miliyaw tazuma kasabelih",
-       "istemplate": "nicaliwan",
+       "istemplate": "palaculen tu kasabelih",
        "isimage": "tangan-tangan misiket",
        "whatlinkshere-prev": "saka {{PLURAL:$1|nuayaway}}",
        "whatlinkshere-next": "saka {{PLURAL:$1|nuzikuzan}}",
        "whatlinkshere-hidetrans": "$1 nicaliwan",
        "whatlinkshere-hidelinks": "$1 masasiket",
        "whatlinkshere-hideimages": "$1 tangan-tangan misiket",
-       "whatlinkshere-filters": "kilim",
+       "whatlinkshere-filters": "sakacucek nu misapili’",
        "whatlinkshere-submit": "mileku",
+       "block": "milangat misaungayay",
+       "blockip-legend": "milangat misaungayay",
        "ipbexpiry": "kakatekuhan:",
        "ipbreason": "mahicaay:",
+       "ipbsubmit": "milangat tina misaungayay",
+       "ipbother": "zuma a tatukian:",
+       "ipb-confirm": "malucekay tu langat",
+       "blockipsuccesssub": "milangat malahci",
+       "ipb-edit-dropdown": "malangat a mahicaay nu mikawaway-kalumyiti",
        "ipb-blocklist-duration-left": "$1 pakawili",
+       "ipusubmit": "misipu tina langat",
        "autoblocklist-submit": "kilim",
+       "blocklist-userblocks": "midimut canghaw malangat",
+       "blocklist-tempblocks": "midimut nanunuz malangat",
+       "blocklist-timestamp": "demiad tatukian",
        "blocklist-target": "pabalucu’an",
        "blocklist-expiry": "kakatekuhan",
+       "blocklist-by": "milangat a mikuwanay",
+       "blocklist-params": "milangat tu aazihen a sulyang",
        "blocklist-reason": "mahicaay",
        "ipblocklist-submit": "kilim",
+       "ipblocklist-localblock": "milangat itiniay",
        "infiniteblock": "inayi’ u sungliw",
-       "blocklink": "malangat",
+       "noautoblockblock": "mapasatezep lunuk  milangat",
+       "emailblock": "mapasatezep imyiyo(email)",
+       "blocklink": "milangat",
+       "change-blocklink": "misumad tu langat",
        "contribslink": "paanin",
+       "emaillink": "pabahel imyiyo(email)",
        "blocklogpage": "milangat tu nasulitan nakawawan",
+       "block-log-flags-noautoblock": "mapasatezep lunuk  milangat",
+       "block-log-flags-noemail": "mapasatezep imyiyo(email)",
+       "lockdb": "pamutek tu sulu nu kalunasulitan",
+       "lockbtn": "pamutek tu sulu nu kalunasulitan",
+       "move-page": "milimad $1",
+       "move-page-legend": "milimad kasabelih",
+       "newtitle": "baluhay satangahan:",
+       "movepagebtn": "milimad kasabelih",
+       "pagemovedsub": "milimad malaheci tuway",
        "movelogpage": "milimad ku nasulitan nakawawan",
        "movereason": "mahicaay:",
        "export": "patahkal ku kasabelih",
+       "exportall": "patahkal sacahamin  kasabelih",
        "export-submit": "patahkal",
+       "export-download": "misuped sapatangan",
+       "export-templates": "yamalyilu taazihan mitudung",
+       "allmessages": "sisetyimo palatuh",
        "allmessagesname": "kalungangan",
+       "allmessagesdefault": "pataayaw tu kawaw palatuh  a sulit",
        "allmessages-filter-legend": "kilim",
+       "allmessages-filter-unmodified": "caay henay misumad",
        "allmessages-filter-all": "hamin",
        "allmessages-filter-modified": "masumad tuway",
+       "allmessages-prefix": "ahizan saayaway a sulit mikilim:",
        "allmessages-language": "kamu:",
        "allmessages-filter-submit": "mileku",
        "allmessages-filter-translate": "mibelih",
        "thumbnail-more": "patabaki(micuwat)",
+       "filemissing": "tangan mahedaw",
+       "import": "pacumuden kasabelih",
+       "import-interwiki-sourcepage": "saangangan kasabelih:",
+       "import-interwiki-templates": "yamalyilu sacahamin  taazihan mitudung",
        "import-interwiki-submit": "pacumud",
+       "import-upload-filename": "kalungangan nu tangan:",
        "import-comment": "pacunus sakacaay kapawan:",
+       "import-revision-count": "$1 {{PLURAL:$1|masumad nu ayaway}}",
+       "importsuccess": "pahezek tuway pacumud!",
+       "importlogpage": "pacumuden nasulitan nazipa’an",
        "tooltip-pt-userpage": "{{GENDER:|misaungayay nu misu}} kasabelih",
        "tooltip-pt-mytalk": "{{GENDER:|misuay }}sasukamu a kasabelih",
        "tooltip-pt-preferences": "{{GENDER:|misuay}} setin tu kanamuhan",
        "tooltip-pt-logout": "katahkal",
        "tooltip-pt-createaccount": "taneng kami pauuh kisuan panganganen tu cacay canghaw atu patalabu, anu caay ku tabakiay a pisaungay.",
        "tooltip-ca-talk": "matatengil tu mahizaay lacul nu kasabelih",
-       "tooltip-ca-edit": "mikawaway tu kalumyiti uyni kasabelih",
+       "tooltip-ca-edit": "mikawaway-kalumyiti uyni a kasabelih",
        "tooltip-ca-viewsource": "uyni kasabelih madiputay tuway.\nkapah kisu miciwsace tuyni kasabelih sakatizeng bangu",
        "tooltip-ca-history": "uyini kasabelih nasawniay a sumad",
        "tooltip-ca-move": "milimad tina kasabelih",
        "tooltip-ca-nstab-template": "ciwsace taazihan mitudung",
        "tooltip-ca-nstab-category": "ciwsace kakuniza a kasabelih",
        "tooltip-save": "misuped misuay a pisumad",
+       "tooltip-publish": "patiyak tu sumad nu misu",
        "tooltip-preview": "kay iayaw nu pisuped miazih tu nu misuay nisumad.",
        "tooltip-diff": "paazih hica sa kisu labuay a nisumadan",
        "tooltip-watch": "paynien kasabelih micunus misuay cyinse piazihan tu sulit",
+       "tooltip-watchlistedit-normal-submit": "misipu satangahan",
+       "tooltip-upload": "miteka patapabaw",
        "tooltip-rollback": "sapecec \"patiku\" misiket, kapah patiku tayza nuayawanay a paanin tu nisulitan tina kasabelih mikawaway tu kalumyiti",
        "tooltip-undo": "\"patiku\" kapah tu patiku tuyni mikawaway tu kalumyiti payni pataayaway miazih muse miwawah mikawaway tu kalumyiti aazihan cudad, saka caay cayaw nu labu micunus mahicaay.",
+       "tooltip-preferences-save": "pisuped tu setin nu kanamuhan",
        "tooltip-summary": "kapisulitan apuyu’ay a pecu’ nu lacul",
        "others": "zuma",
+       "creditspage": "kasabelih kasakumi nu misayingaay",
        "simpleantispam-label": "sapi tena’ babakahen a sulit kinsa.\nyu <strong>amana</strong> misulit kuyni pisinga’an!",
+       "pageinfo-header-basic": "anganganay a cesyun",
+       "pageinfo-header-edits": "nazipa’an nu mikawaway-kalumyiti",
+       "pageinfo-header-restrictions": "kasabelih midiput",
+       "pageinfo-header-properties": "susin nu kasabelih",
+       "pageinfo-display-title": "paazih tu satangahan",
+       "pageinfo-article-id": "kasabelih ID",
+       "pageinfo-language": "kasabelih lacul a kamu",
        "pageinfo-language-change": "misumad",
+       "pageinfo-content-model": "kasabelih a lacul tatudungen misanga’",
        "pageinfo-content-model-change": "misumad",
        "pageinfo-robot-noindex": "amana",
+       "pageinfo-watchers": "kasabelih miazihay a nikayadah",
+       "pageinfo-firstuser": "kasabelih patizengay",
+       "pageinfo-firsttime": "patizeng demiad nu kasabelih",
+       "pageinfo-lastuser": "capiay a mikawaway-kalumyiti",
+       "pageinfo-lasttime": "capiay a demiad nu mikawaway-kalumyiti",
+       "pageinfo-edits": "pulung nikayadah nu mikawaway-kalumyiti",
+       "pageinfo-authors": "papina nu masacudaday",
+       "pageinfo-recent-authors": "capiay masacudaday a nikayadah",
        "pageinfo-toolboxlink": "kasabelih cesyun",
        "pageinfo-redirectsto-info": "katinengan",
        "pageinfo-contentpage-yes": "hang",
        "pageinfo-protect-cascading-yes": "hang",
+       "pageinfo-protect-cascading-from": "patatusul midiput namakay",
+       "pageinfo-category-info": "kakuniza a cesyun",
+       "pageinfo-category-total": "papina nu sakawaway",
+       "pageinfo-category-pages": "kasabelih nikayadah",
+       "pageinfo-category-subcats": "sailuc-kasasizuma nikayadah",
+       "pageinfo-category-files": "tangan nikayadah",
+       "markaspatrolleddiff": "silusi natayza mikibi tuway",
+       "markedaspatrolled": "silusi natayza mikibi tuway",
+       "patrol-log-page": "tayza mikibi nasulitan nazipa’an",
+       "log-show-hide-patrol": "$1 tayza mikibi nasulitan nazipa’an",
+       "log-show-hide-tag": "$1 aazihen a paya nasulitan nazipa’an",
        "confirm-markpatrolled-button": "malucekay",
        "previousdiff": "← malumanay a mikawaway tu kalumyiti",
        "nextdiff": "baluhayay mikawaway tu kalumyit →",
+       "thumbsize": "sukep tu zunga hacica-tabaki:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|ku kasabelih}}",
        "file-info-size": "$1 × $2 syangsu, hacica ku tabaki nu tangan: $3, MIME kakuniza: $4",
        "file-info-size-pages": "$1 × $2 syangsu, hacica ku tabaki nu tangan:$3,MIME kakuniza: $4, $5 {{PLURAL:$5|ku kasabelih}}",
        "file-info-gif-looped": "palalacalen",
        "file-info-gif-frames": "$1 {{PLURAL:$1|misabacu}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|misabacu}}",
+       "newimages": "baluhay tangan a sulu nu zunga",
        "newimages-legend": "kilim",
+       "noimages": "inayi’ amahicahica tu zunga.",
+       "gallery-slideshow-toggle": "ketun mibalic sukep tu zunga",
        "ilsubmit": "kilim",
        "bydate": "ahizan tu demiad",
+       "minutes": "{{PLURAL:$1|$1 widi}}",
+       "hours": "{{PLURAL:$1|$1 tuki}}",
+       "days": "$1 {{PLURAL:$1|a demiad}}",
+       "ago": "ayaw nu $1",
        "just-now": "nasawni",
+       "monday-at": "sakacacay a demiad nu lipay i$1",
+       "friday-at": "sakalima a demied nu lipay i $1",
+       "saturday-at": "sakaenem a demiad nu lipay i $1",
        "metadata": "pulita tu kalunasulitan",
        "metadata-help": "uyni tangan labuay amin yamalyilu zuma cesyun, uyni a cesyun akay nay suewyi  sasasing asaca sapisekyin i tapang asaca suwyihwa saayaw katukuh pahzekan a nakawawan mapacunusay. anu nay tangan saayaway setyitase masumadtu, hatizaay pulita kalunasulitan akay la’cus mileku mabetil a misumad tu tangan.",
        "metadata-fields": "i tini palatuh patahkal i labuay a EXIF pulita tu kalunasulitanay a kakitizaan, yamalyilu i zunga paazih kasabelih, sapipulita tu cudad nu nasulitan malepi’ paazih palatuh.\nzumaay a pulita tu cudad pataayaw tu kawaw midimut.\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",
        "exif-imagewidth": "ahebal",
-       "exif-imagelength": "u takalaw",
+       "exif-imagelength": "takalaw sulyang",
+       "exif-bitspersample": "paysyangsuay a wyiyin",
+       "exif-compression": "piepian mipecec a sasakawawen",
+       "exif-photometricinterpretation": "pacamel-palacul tu syangsu",
        "exif-orientation": "papayzaan",
+       "exif-samplesperpixel": "syangsu nikayadah",
+       "exif-planarconfiguration": "kalunasulitan misilsil",
        "exif-xresolution": "sasuala katingalaw",
        "exif-yresolution": "mitelekay katingalaw",
+       "exif-stripoffsets": "iga kalunasulitan kakitizaan",
+       "exif-rowsperstrip": "cacay ku kaus papina ku tusil",
+       "exif-whitepoint": "sangelacay hacica-kulit",
+       "exif-primarychromaticities": "sausi sulyang nu kulit",
+       "exif-referenceblackwhite": "umeniay-sangelacay miazih tu tatenga’ay nikayadah",
        "exif-datetime": "tangan misumaday a demiad atu tuki",
-       "exif-make": "sasasing misanga’ay tu kalutuud",
-       "exif-model": "sasasing silosi nu nisanga’an",
+       "exif-imagedescription": "satangahan nu iga",
+       "exif-make": "sasasing-kikay misanga’ tu kalutuuday",
+       "exif-model": "sasasing nu nisanga’an a banggu",
        "exif-software": "pisaungay zwanti",
        "exif-artist": "masacudaday",
+       "exif-copyright": "nizaay nisanga’an tu tungus a kawaw",
        "exif-exifversion": "Exif baziyong / sapad",
        "exif-colorspace": "kalukulit salaedan",
+       "exif-componentsconfiguration": "paysyangsu yamalyilu",
+       "exif-compressedbitsperpixel": "iga piepian mipecec a muse",
+       "exif-pixelxdimension": "zunga nu hacica-ahebal",
+       "exif-pixelydimension": "zunga nu hacica-takalaw",
+       "exif-usercomment": "misaungayay a buhci tu kamu",
        "exif-datetimeoriginal": "kalunasulitan masangaay’ a demiad atu tuki",
        "exif-datetimedigitized": "suwyihwaay a demiad atu tuki",
+       "exif-exposuretime": "mapaedil a lawad",
+       "exif-exposureprogram": "mapaedil a muse",
+       "exif-spectralsensitivity": "edil-selal saahemi’han",
+       "exif-isospeedratings": "ISO suli",
+       "exif-maxaperturevalue": "satabakiay a likat-mulu i lala’ nu kitakit",
+       "exif-subjectdistance": "ilaed nu satangahan",
+       "exif-meteringmode": "miditek tu edil a muse",
        "exif-lightsource": "katahkalan nu likat",
        "exif-flash": "sabelabelatay a tinghuy",
        "exif-focallength": "saed nu sapisasing",
+       "exif-subjectarea": "sausi a kakitizaan",
+       "exif-flashenergy": "sabelabelatay a tinghuy u icelang",
+       "exif-subjectlocation": "kakitizaan nu satangahan",
+       "exif-exposureindex": "mapaedil a sulyang",
+       "exif-sensingmethod": "mise nu nikasumad nay edil",
+       "exif-filesource": "saangangan nu tangan",
+       "exif-scenetype": "makaazihay nikalahizaan",
+       "exif-customrendered": "pakuniza misanga’ iga",
+       "exif-whitebalance": "sapalalen nu salengacay",
+       "exif-scenecapturetype": "makaazihay masasing nikalahizaan",
+       "exif-gaincontrol": "makaazihay misimaw",
        "exif-contrast": "e-contrast",
+       "exif-saturation": "matumesay a sulyang",
+       "exif-devicesettingdescription": "sakaluk setin sapuelac",
+       "exif-gpslatituderef": "pyiwyi asaca nanwyi",
+       "exif-gpslongituderef": "tongcing asaca sicing",
+       "exif-gpsaltituderef": "nutakalaw namakay bayu’ miazih tu tatenga’ay a sulyang",
+       "exif-gpssatellites": "sapiditekay a zizuisi",
+       "exif-gpsstatus": "pizawis sakaluk setyitase",
+       "exif-gpsmeasuremode": "miditek a muse",
+       "exif-gpsdop": "miditek a tatungus",
+       "exif-gpsspeedref": "saduba’ kalamkam a sacacaycacay",
+       "exif-gpsdestlatitude": "pabalucu’an a wyitu",
+       "exif-gpsdestlongituderef": "pabalucu’an a cintu",
+       "exif-gpsdatestamp": "GPS a demiad",
        "exif-keywords": "aazihen dulit",
+       "exif-worldregioncreated": "zunga masasing a kakitizaan",
+       "exif-provinceorstatecreated": "yakuwanan a sasing",
+       "exif-citycreated": "yatukay a sasing",
+       "exif-countrydest": "paazih tu kanatal",
+       "exif-countrycodedest": "paazih kanatal a kodo",
+       "exif-provinceorstatedest": "paazih seng asaca cou",
+       "exif-citydest": "paazihay a tukay",
        "exif-objectname": "sapuyuay a ngangan",
+       "exif-specialinstructions": "sazumaay buhci tu kamu",
        "exif-headline": "satangahan",
+       "exif-credit": "misanga’/nipabeli’ay",
        "exif-source": "saangangan",
+       "exif-editstatus": "zunga setyitase nu binawlan sapuelac",
+       "exif-urgency": "hacica ku kalah",
+       "exif-locationdest": "patahkal kahicelaan",
+       "exif-locationdestcode": "kakitizaan kodo sapuelac",
+       "exif-contact": "patakusan a cesyun",
        "exif-writer": "misacudaday",
        "exif-languagecode": "kamu",
+       "exif-iimversion": "IIM baziyong",
        "exif-iimcategory": "kakuniza",
+       "exif-iimsupplementalcategory": "micunus kakuniza",
+       "exif-datetimereleased": "patiyak i",
        "exif-identifier": "mapulitaay a kodo",
+       "exif-lens": "pisaungay tu cingtou",
+       "exif-serialnumber": "sasasing salaylay a banggu",
+       "exif-cameraownername": "sasasing nizaay",
        "exif-label": "aazihen paya",
+       "exif-rightscertificate": "nisanga’an niza tu tungus a kawaw nu makuwanay a pincen",
+       "exif-copyrighted": "nisanga’an niza tu tungus a kawaw setyitase",
+       "exif-usageterms": "mamaala a cedang",
+       "exif-webstatement": "nabalucu'an nu i telay nisanga’an niza tu tungus a kawaw",
+       "exif-morepermissionsurl": "paliyuh pabeli tu kinli a cesyun",
+       "exif-disclaimer": "caay pimuku tu sikining",
+       "exif-contentwarning": "lacul mipatalaw",
+       "exif-intellectualgenre": "kasacacay nikalahizaan",
+       "exif-subjectnewscode": "kodo nu satangahan",
+       "exif-event": "sapuelac tu sikikawaw",
+       "exif-organisationinimage": "sapuelac nu mikumi",
+       "exif-personinimage": "sapuelac tu tademaw",
+       "exif-originalimageheight": "takalaway nu caayhen masait",
+       "exif-compression-1": "caay henay piepian mipecec",
+       "exif-copyrighted-true": "madiput nu nisanga’an niza tu tungus a kawaw",
+       "exif-copyrighted-false": "caay kapulita nu nisanga’an niza tu tungus a kawaw setyitase",
+       "exif-unknowndate": "caay kapulita ku demiad",
        "exif-orientation-1": "tatungus",
+       "exif-orientation-2": "mabelih tu zazay",
+       "exif-orientation-4": "mabelih tu mitelekay",
+       "exif-planarconfiguration-1": "pu’nel-kizemu a kese",
+       "exif-planarconfiguration-2": "kimpi’ a kese",
+       "exif-colorspace-65535": "caay henay masitudung ku kulit",
        "exif-componentsconfiguration-0": "inayi’",
        "exif-exposureprogram-0": "caay henay misaheci",
        "exif-exposureprogram-1": "palima",
+       "exif-exposureprogram-2": "tatungus a muse",
+       "exif-exposureprogram-3": "likat maluayaw",
+       "exif-exposureprogram-4": "kiyata maluayaw",
+       "exif-subjectdistance-value": "$1 mi",
+       "exif-meteringmode-2": "pikuwanan pacunus lalet",
+       "exif-meteringmode-5": "muse",
        "exif-meteringmode-255": "zuma",
-       "exif-lightsource-1": "edil",
+       "exif-lightsource-1": "likat",
        "exif-lightsource-2": "inkwang a tinghuy",
        "exif-lightsource-4": "sabelabelatay a tinghuy",
        "exif-lightsource-9": "cilalah a demiad",
        "exif-lightsource-10": "kenutan",
+       "exif-lightsource-11": "iduutay",
+       "exif-lightsource-255": "zuma katahkalan nu likat",
+       "exif-flash-fired-0": "sabelabelatay a tinghui caay henay miwawah",
+       "exif-flash-fired-1": "sabelabelatay a tinghui miwawah tuway",
+       "exif-flash-mode-3": "lunuk muse",
+       "exif-flash-function-1": "inayi’ sasahicaan nu sabelabelatay a tinghui",
+       "exif-flash-redeye-1": "muse nu kasatezep tu sumanahay a mata",
        "exif-focalplaneresolutionunit-2": "incun",
+       "exif-sensingmethod-1": "caay henay misaheci",
+       "exif-filesource-3": "sulyangay a sasasing",
+       "exif-scenetype-1": "besuc han misasingay a zunga",
+       "exif-customrendered-0": "habutuday a laylay",
+       "exif-customrendered-1": "pakuniza misanga’ay a laylay",
+       "exif-exposuremode-0": "lunuk mapaedil",
+       "exif-exposuremode-1": "lima-saungay mapaedil",
+       "exif-exposuremode-2": "lunuk laup mapacedil",
+       "exif-whitebalance-0": "lunuk sapalalen nu salengacay",
+       "exif-whitebalance-1": "lima-saungay sapalalen nu salengacay",
        "exif-scenecapturetype-0": "tatungus",
        "exif-scenecapturetype-1": "makaazihay",
        "exif-scenecapturetype-2": "sassing nu tademaw",
        "exif-contrast-1": "pu’nel",
        "exif-contrast-2": "takalaw",
        "exif-saturation-0": "tatungus",
+       "exif-saturation-1": "caykatumesay a kulit",
+       "exif-saturation-2": "takalaw atu matumes ku kulit",
        "exif-sharpness-0": "tatungus",
        "exif-sharpness-1": "pu’nel",
        "exif-sharpness-2": "takalaw",
+       "exif-subjectdistancerange-1": "ciyuci",
        "exif-subjectdistancerange-2": "pakatepalay a azih",
        "exif-subjectdistancerange-3": "pakabatatay a azih",
        "exif-gpslatitude-n": "pyiwyi",
        "exif-gpslatitude-s": "nanwyi",
        "exif-gpslongitude-e": "tongcing",
        "exif-gpslongitude-w": "sicing",
+       "exif-gpsstatus-a": "miditek miteka henay ayza",
+       "exif-gpsstatus-v": "miditek masasiketay a sausi",
+       "exif-gpsmeasuremode-2": "tusa-wei miditek",
+       "exif-gpsmeasuremode-3": "tulu-wei miditek",
+       "exif-gpsspeed-k": "paytuki a kungli",
+       "exif-gpsspeed-m": "paytuki a inli",
        "exif-gpsdestdistance-k": "kungli",
        "exif-gpsdestdistance-m": "inli",
        "exif-gpsdestdistance-n": "hayli",
        "exif-objectcycle-a": "namalamam a cacay",
        "exif-objectcycle-p": "nakalahukan a cacay",
+       "exif-objectcycle-b": "namalanam atu namalahuk",
+       "exif-gpsdirection-t": "tatengaay tatuzu’an",
+       "exif-gpsdirection-m": "tatuzu'an nu tyice",
+       "exif-ycbcrpositioning-2": "palecad miala tu maaziahan",
        "exif-dc-contributor": "paaninay tu kalusasing",
        "exif-dc-date": "demiad",
+       "exif-dc-publisher": "insacay",
+       "exif-dc-relation": "mahizaay u myiti",
        "exif-dc-rights": "kinli",
+       "exif-dc-source": "saangangan a myiti",
+       "exif-dc-type": "myiti nikalahizaan",
+       "exif-rating-rejected": "kakaian",
+       "exif-iimcategory-clj": "mungangaw atu hulic",
+       "exif-iimcategory-fin": "kyizay atu syubay",
        "exif-iimcategory-edu": "pasubana’ay a kawaw",
        "exif-iimcategory-evn": "liwliw",
        "exif-iimcategory-hth": "kapah ku uzip",
+       "exif-iimcategory-hum": "u zazan nu tademaw",
        "exif-iimcategory-lab": "makawaw",
+       "exif-iimcategory-lif": "nikauzip atu pahanhanan",
+       "exif-iimcategory-pol": "cengcey",
+       "exif-iimcategory-rel": "papazaan atu papayzaan",
+       "exif-iimcategory-sci": "kagak atu keci",
+       "exif-iimcategory-soi": "binawlan a munday",
        "exif-iimcategory-spo": "wundukay",
        "exif-iimcategory-wea": "demidad",
        "exif-urgency-normal": "tatungus ($1)",
+       "exif-urgency-high": "takalaw ($1)",
        "namespacesall": "hamin",
        "monthsall": "hamin",
+       "recreate": "miliyaw miteka patizeng",
        "confirm_purge_button": "malucekay",
        "confirm-watch-button": "malucekay",
        "confirm-unwatch-button": "malucekay",
        "confirm-rollback-button": "malucekay",
+       "quotation-marks": "\"$1\"",
        "imgmultipagenext": "zikuzan a belih →",
        "imgmultigo": "mileku!",
+       "img-lang-default": "(pataayaw tu kawaw a kamu)",
        "img-lang-go": "mileku",
        "ascending_abbrev": "masalaylay adidi’ay katukuh tabakiay",
        "descending_abbrev": "masalaylay tabakiay katukuh adidi’ay",
        "table_pager_next": "zikuzan a belih",
        "table_pager_last": "sazikuzay a kasabelih",
+       "table_pager_limit_label": "paybelih a sulit:",
        "table_pager_limit_submit": "mileku",
+       "table_pager_empty": "inayi’ ku heci",
+       "autosumm-blank": "nayi’ ku cacan a kasabelih",
+       "autosumm-newblank": "patizeng nayi’ ku cacan a kasabelih",
+       "watchlistedit-normal-title": "miazihay a piazihan tu sulit nu mikawaway-kalumyiti",
+       "watchlistedit-normal-submit": "misipu satangahan",
+       "watchlistedit-clear-title": "misipu miazihay a piazihan tu sulit",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1| sasukamu ]])",
        "timezone-local": "itizaay",
        "version": "baziyong",
+       "version-skins": "malacul tu nuhekalan",
        "version-specialpages": "sazumaay a kasabelih",
+       "version-parserhooks": "kulawid nu saheciay sakaluk",
        "version-other": "zuma",
+       "version-mediahandlers": "myiti saungayay a sakaluk",
        "version-hooks": "kulawid",
+       "version-hook-name": "kalawid a kalungangan",
        "version-hook-subscribedby": "pangangan",
+       "version-no-ext-name": "[caay henay pangangan]",
        "version-skin-colheader-name": "nuhekalan",
        "version-ext-colheader-version": "baziyong",
+       "version-ext-colheader-license": "sapabeli tu kinli a cedang",
        "version-ext-colheader-description": "patahkal",
        "version-ext-colheader-credits": "masacudaday",
        "version-poweredby-others": "zuma",
+       "version-software": "malacul tu ku zwanti",
        "version-software-product": "nasang’ay a tuutuud",
        "version-software-version": "baziyong",
+       "version-entrypoints": "sacumud URL",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "sulu nu cengse",
        "version-libraries-version": "baziyong",
+       "version-libraries-license": "sapabeli tu kinli a cedang",
        "version-libraries-description": "patahkal",
        "version-libraries-authors": "masacudaday",
        "redirect-submit": "mileku",
+       "redirect-page": "kasabelih ID",
+       "redirect-file": "kalungangan nu tangan",
+       "redirect-logid": "nasulitan nazipa’an ID",
+       "redirect-not-exists": "caykatepa ku sulyang",
+       "fileduplicatesearch": "mikilim masaliyaw a tangan",
+       "fileduplicatesearch-filename": "kalungangan nu tangan:",
        "fileduplicatesearch-submit": "kilim",
        "specialpages": "sazumaay a kasabelih",
+       "specialpages-group-maintenance": "aazihen a cudad nu midiputay",
+       "specialpages-group-other": "sazumaay cidek a kasabelih",
        "specialpages-group-login": "patalabu / panganganen ku canghaw",
+       "specialpages-group-highuse": "sawsawniay a kasabelih",
+       "specialpages-group-pages": "piazihan tu sulit nu kasabelih",
+       "specialpages-group-pagetools": "kasabelih sakaluk",
+       "specialpages-group-wiki": "kalunasulitan atu sakaluk",
+       "specialpages-group-developer": "saayaway miteka a misakakawaway sakaluk",
+       "blankpage": "salengacay a kasabelih",
        "tag-filter": "[[Special:Tags|aazihen paya]] kilim:",
        "tag-filter-submit": "kilim",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|aazihen paya’}}]]: $2)",
+       "tag-mw-contentmodelchange": "lacul tatudungen misanga’  misumad",
+       "tags-tag": "aazihen a paya  kalungangan",
        "tags-source-header": "saangangan",
        "tags-actions-header": "saungay",
        "tags-active-yes": "hang",
        "tags-active-no": "caay",
+       "tags-source-extension": "nay misaheci nu zwanti",
+       "tags-source-none": "caytu pisaungay",
        "tags-delete": "masipu",
        "tags-activate": "miteka’",
        "tags-deactivate": "mapasatezep",
+       "tags-hitcount": "$1 {{PLURAL:$1|misumad}}",
+       "tags-create-heading": "patizeng baluhay aazihen a paya",
+       "tags-create-tag-name": "aazihen a paya  kalungangan:",
        "tags-create-reason": "mahicaay:",
        "tags-create-submit": "patizeng",
+       "tags-delete-title": "misipu tu aazihen a paya",
        "tags-delete-reason": "mahicaay:",
+       "tags-activate-title": "miteka aazihen a paya",
        "tags-activate-reason": "mahicaay:",
        "tags-activate-submit": "miteka’",
+       "tags-deactivate-title": "mapasatezep tu aazihen a paya",
        "tags-deactivate-reason": "mahicaay:",
+       "tags-edit-title": "aazihen a paya mikawaway-kalumyiti",
+       "tags-edit-manage-link": "aazihen a paya nu kuwan",
+       "tags-edit-new-tags": "baluhay aazihen a paya:",
+       "tags-edit-chosen-placeholder": "mipili’ hatizaay aazihen a paya",
        "tags-edit-reason": "mahicaay:",
+       "comparepages": "sasutili’ay a kasabelih",
+       "compare-page1": "sakacacay a belih",
+       "compare-page2": "sakatusa a belih",
+       "compare-rev1": "misumad nu ayaway 1",
+       "compare-rev2": "misumad nu ayaway 2",
        "compare-submit": "sasutili’ay",
        "diff-form": "sasizuma",
        "permanentlink": "saluimengay misiket",
        "htmlform-submit": "patayzaan",
+       "htmlform-reset": "patiku masumaday",
        "htmlform-selectorother-other": "zuma",
        "htmlform-no": "caay",
        "htmlform-yes": "hang",
+       "htmlform-cloner-create": "ngalepen tu cunus",
        "htmlform-cloner-delete": "milimad",
        "htmlform-title-not-exists": "$1 inayi’",
        "htmlform-user-not-exists": "<strong>$1</strong> inayi’",
        "logentry-delete-delete": "$1 {{GENDER:$2|masiputu}} kasabelih $3",
        "restore-count-files": "{{PLURAL:$1|1 tangan}}",
+       "revdelete-content-hid": "madimut tu ku lacul",
+       "revdelete-content-unhid": "palawpes midimut tu lacul",
        "logentry-move-move": "$1 {{GENDER:$2|milimad tuway}} kasabelih $3 katukuh $4",
        "logentry-newusers-create": "{{GENDER:$2|patizeng}} misaungayay canghaw tuway $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|masayacay tuway}} $3",
+       "log-name-tag": "aazihen a paya nasulitan nazipa’an",
        "rightsnone": "(nayi’)",
        "feedback-back": "tatiku",
        "feedback-cancel": "palawpes",
        "feedback-close": "pahezek",
+       "feedback-external-bug-report-button": "munday nu patubeli",
        "feedback-message": "palatuh:",
        "feedback-subject": "taazihan tu kawaw:",
        "feedback-submit": "patayzaan",
+       "feedback-thanks-title": "kukay tisuwanan!",
        "searchsuggest-search": "kilim {{SITENAME}}",
+       "api-error-unknownerror": "caay kapulita ku mungangaw: \"$1\".",
+       "duration-seconds": "$1 {{PLURAL:$1|a beti}}",
+       "duration-hours": "$1 {{PLURAL:$1|tuki}}",
+       "duration-weeks": "$1 {{PLURAL:$1|a lipas}}",
+       "duration-years": "$1 {{PLURAL:$1|a mihca}}",
+       "duration-centuries": "$1 {{PLURAL:$1|lasubu a mihca}}",
+       "duration-millennia": "$1 {{PLURAL:$1|malebut a mihca}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|a beti}}",
+       "limitreport-walltime": "tatengaay pisaungay a lawad-tuki",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|a beti}}",
+       "limitreport-expansiondepth": "satakalaw micuwat ilabu",
+       "expandtemplates": "micuwat tu taazihan a mitudung",
+       "expand_templates_input": "suliten:",
        "expand_templates_output": "heci",
        "expand_templates_ok": "malucekay",
+       "expand_templates_remove_comments": "misipu buhci tu kamu",
        "expand_templates_preview": "pataayaway miazih",
+       "pagelanguage": "misumad kasabelih a kamu",
        "pagelang-language": "kamu",
+       "pagelang-select-lang": "mipili’ tu kamu",
        "pagelang-reason": "mahicaay:",
        "pagelang-submit": "patayzaan",
+       "right-pagelang": "misumad kasabelih a kamu",
+       "action-pagelang": "misumad kasabelih a kamu",
+       "log-name-pagelang": "kamu misumad a nasulitan nazipa’an",
+       "mediastatistics": "myiti sausi cesyun",
+       "mediastatistics-table-extensions": "kapah saungay a mikilulay a ngangan nu tangan",
+       "mediastatistics-table-count": "tangan nikayadah",
+       "mediastatistics-table-totalbytes": "pulung sausi nu hacica-tabaki",
        "mediastatistics-header-bitmap": "pacepacekan a zunga",
        "mediastatistics-header-audio": "ludihang",
        "mediastatistics-header-video": "yiga",
+       "mediastatistics-header-multimedia": "payadahay malocimyidiy",
        "mediastatistics-header-office": "zimusiw",
        "mediastatistics-header-executable": "kapah tu mileku",
+       "mediastatistics-header-archive": "piepian mipecec tuway a kese",
+       "mediastatistics-header-total": "sacahamin a tangan",
+       "json-error-syntax": "sakilul nu kamu mungangaw",
+       "headline-anchor-title": "misasiket tina tusil",
        "special-characters-group-latin": "u sulit nu Latin",
+       "special-characters-group-latinextended": "lalad tu sulit nu Lating",
+       "special-characters-group-ipa": "nu kanatalay a silusi nu ngiha’",
        "special-characters-group-symbols": "sawantan",
        "special-characters-group-greek": "u sulit nu Sila",
+       "special-characters-group-greekextended": "lalad tu sulit-bacu nu Sila",
+       "special-characters-group-cyrillic": "u sulit nu Selafu",
+       "special-characters-group-arabic": "u sulit nu Alapu",
+       "special-characters-group-arabicextended": "lalad tu sulit nu Alapo",
+       "special-characters-group-hebrew": "u kamu nu Hipulay",
+       "special-characters-group-bangla": "u sulit nu Muncyala",
+       "special-characters-group-tamil": "u sulit nu tanmil",
+       "special-characters-group-telugu": "u sulit nu telaku",
+       "special-characters-group-sinhala": "u sulit nu sencialo",
+       "special-characters-group-gujarati": "u sulit nu Kucilat",
        "special-characters-group-devanagari": "Devanagari a kamu",
        "special-characters-group-thai": "u sulit nu Tayko",
        "special-characters-group-lao": "u sulit nu Liau",
        "special-characters-group-khmer": "u sulit nu Kaomien",
+       "special-characters-title-endash": "apuyu’ay a pucehaw",
+       "special-characters-title-emdash": "tanaya’ay a pucehaw",
        "special-characters-title-minus": "selep a bacu",
+       "mw-widgets-dateinput-no-date": "caayhen mipili’ tu demiad",
+       "mw-widgets-mediasearch-noresults": "caykatepa ku heci.",
+       "mw-widgets-titleinput-description-new-page": "kasabelih nayai’ tu",
+       "mw-widgets-categoryselector-add-category-placeholder": "micunus tu kakuniza...",
+       "mw-widgets-usersmultiselect-placeholder": "micunus sangaleben...",
+       "randomrootpage": "kakibalucu’ lamitay kasabelih",
+       "log-action-filter-block": "milangat nikalahizaan:",
+       "log-action-filter-delete": "misipu nikalahizaan:",
+       "log-action-filter-import": "pacumud nikalahizaan:",
+       "log-action-filter-move": "milimad nikalahizaan:",
+       "log-action-filter-patrol": "tayza mikibi nikalahizaan:",
+       "log-action-filter-protect": "midiput nikalahizaan:",
+       "log-action-filter-upload": "nikalahizaan nu patapabaw:",
        "log-action-filter-all": "hamin",
-       "log-action-filter-block-block": "malangat",
+       "log-action-filter-block-block": "milangat",
+       "log-action-filter-block-reblock": "milangat tu sapisumad",
+       "log-action-filter-delete-delete": "misipu kasabelih",
+       "log-action-filter-delete-delete_redir": "miliyaw patatuzu’ mipakutay tu sulit",
+       "log-action-filter-delete-restore": "kasabelih milawpes tu sipu",
+       "log-action-filter-delete-event": "misipu nasulitan nazipa’an",
+       "log-action-filter-delete-revision": "misumad nu ayaway a sipu",
+       "log-action-filter-managetags-create": "patizeng aazihen paya",
+       "log-action-filter-managetags-delete": "misipu aazihen a paya",
+       "log-action-filter-managetags-activate": "aazihen a paya miteka",
+       "log-action-filter-newusers-autocreate": "lunuk patizeng",
+       "log-action-filter-patrol-patrol": "lima-saungay tayza mikibi",
+       "log-action-filter-patrol-autopatrol": "lunuk tayza mikibi",
        "log-action-filter-protect-protect": "midiput",
+       "log-action-filter-protect-modify": "midiput tu misumaday",
+       "log-action-filter-protect-unprotect": "mihulak midiputay",
+       "log-action-filter-protect-move_prot": "midiputay milimad tuway",
+       "log-action-filter-rights-rights": "lima-saungay misumad",
+       "log-action-filter-rights-autopromote": "lunuk misumad",
+       "log-action-filter-suppress-event": "nasulitan nazipa’an satezep  paazih",
+       "log-action-filter-suppress-revision": "masumad nu ayaway  satezep paazih",
+       "log-action-filter-suppress-delete": "kasabelih satezep paazih",
        "log-action-filter-upload-upload": "baluhay a patapabaw",
-       "authprovider-resetpass-skip-label": "sekipo"
+       "log-action-filter-upload-overwrite": "miliyaw patapabaw",
+       "authmanager-authplugin-setpass-failed-title": "misumad mima mungangaw",
+       "authmanager-authplugin-setpass-bad-domain": "la’cusay a calay-subal(wangyi).",
+       "authmanager-email-label": "imyiyo(email)",
+       "authmanager-email-help": "imyiyo(email) puenengan",
+       "authmanager-realname-label": "tatengaay a ngangan",
+       "authmanager-provider-temporarypassword": "nanunuz a mima",
+       "authprovider-confirmlink-request-label": "manakanca masasiket tu canghaw",
+       "authprovider-resetpass-skip-label": "sekipo",
+       "authform-wrongtoken": "mima-sacukcuk mungangaw",
+       "specialpage-securitylevel-not-allowed-title": "amana",
+       "cannotauth-not-allowed-title": "caykataneng ku tungus",
+       "changecredentials": "misumad tu sapangangan",
+       "removecredentials": "misipu sapangangan",
+       "credentialsform-provider": "pincen nikalahizaan:",
+       "credentialsform-account": "canghaw kalungangan:",
+       "linkaccounts": "masasiket tu canghaw",
+       "linkaccounts-submit": "masasiket tu canghaw",
+       "revid": "masumad nu ayaway $1",
+       "pageid": "kasabelih ID $1"
 }
index 725bb1b..85f4661 100644 (file)
        "logentry-newusers-autocreate": "أنشئ حساب {{GENDER:$2|المستخدم|المستخدمة}} $1 تلقائيًا",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|نقل}} إعدادات الحماية من $4 إلى $3",
        "logentry-protect-unprotect": "{{GENDER:$2|رفع|رفعت}} $1 الحماية عن $3",
-       "logentry-protect-protect": "$1 {{GENDER:$2|حمى|حمت}} $3 $4",
+       "logentry-protect-protect": "{{GENDER:$2|حمى|حمت}} $1 $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|حمى|حمت}} $3 $4 [مضمنة]",
        "logentry-protect-modify": "{{GENDER:$2|غير|غيرت}} $1 مستوى حماية $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|غير|غيرت}} مستوى الحماية ل$3 $4 [مضمن]",
index 3808631..e21d635 100644 (file)
        "searcharticle": "گئت",
        "history": "صفحه‌‌نین گئچمیشی",
        "history_short": "گئچمیش",
+       "history_small": "گئچمیش",
        "updatedmarker": "سوْن باخیشیمدان سوْنرا یئنی‌لنیب‌دیر",
        "printableversion": "چاپ اۆچون نۆسخه",
        "permalink": "قالیجی لینک",
        "createacct-yourpasswordagain-ph": "رمزی یئنی‌دن یازین",
        "userlogin-remembermypassword": "منی ایچری‌ده ساخلا",
        "userlogin-signwithsecure": "آرخایین باغلانتی ایشلدین",
+       "cannotlogin-title": "گیرمک اوْلمور",
+       "cannotlogin-text": "گیرمک مۆمکون دئییل.",
        "cannotloginnow-title": "ایندی گیریش اوْلونمازدیر",
        "cannotloginnow-text": "$1-ی ایشلدرکن گیریش اوْلونمازدیر",
+       "cannotcreateaccount-title": "حساب یاراتماق اوْلمور",
        "yourdomainname": "سیزین دامنه:",
        "password-change-forbidden": "بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.",
        "externaldberror": "بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.",
        "search-interwiki-caption": "قارداش پروژه‌لر",
        "search-interwiki-default": "$1 دان سونوجلار:",
        "search-interwiki-more": "(داها)",
+       "search-interwiki-more-results": "داها چوْخ سوْنوج‌لار",
        "search-relatedarticle": "ایلگیلی",
        "searchrelated": "ایلگیلی",
        "searchall": "بوتون",
        "search-external": "ائشیک آختاریش",
        "searchdisabled": "{{SITENAME}} آختاریشی باغلانیب‌دیر.\nایندی گوگل ایله آختارا بیلرسینیز.\nدیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.",
        "search-error": "آختاراندا بیر خطا قاباغا گلدی: $1",
+       "search-warning": "آختاراندا بیر خطا قاباغا گلدی: $1",
        "preferences": "ترجیحلر",
        "mypreferences": "ترجیحلر",
        "prefs-edits": "دَییشمه‌لرین سایی:",
        "prefs-help-prefershttps": "سیزین بو ترجیحینیزین اثری سیزین سونراکی گیریشینیز دن سونرا اولاجاق.",
        "prefswarning-warning": "ترجیحلرینیزه اولان دَییشیک لر هله آرتیریلمیب.\nایر بو صفحه نین \"$1\" اوستونه باسیلمامیشدان اونجه ترک ائتسز ترجیحلرینیز آرتیریلمییاجاق.",
        "prefs-tabs-navigation-hint": "ایپ اوجو : سیز ائلیه بیلرسیز ساغ و سول جهت نیما کیلید لریندن نیشانه نه نین دولانماسی نیشانه لر لیستینده ایستفاده ائده سیز.",
-       "userrights": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø­Ø§Ù\82Ù\84ارÛ\8c Ø§Û\8cدارÙ\87â\80\8cسی",
-       "userrights-lookup-user": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ú¯Ø±Ù\88Ù¾Ù\84ارÛ\8c Ø§Û\8cدارÙ\87â\80\8cسÛ\8c",
+       "userrights": "اÛ\8cØ´Ù\84دÛ\8cجÛ\8c Ø­Ø§Ù\82Ù\84اری",
+       "userrights-lookup-user": "بÛ\8cر Ø§Û\8cشدÛ\8cجÛ\8c Ø³Ø¦Ú\86",
        "userrights-user-editname": "ایستیفاده‌چی آدی‌نیزی یازین",
        "editusergroup": "ایستیفاده‌چی قروپونو دَییشدیر",
        "editinguser": "ایستیفاده‌چی '[[User:$1|$1]]' $2 اوچون ایستیفاده‌چی حقوق‌لاری دییشدیریلیر",
        "userrights-nodatabase": "$1 وئریلنلر بازاسی يا مؤوجود دئيیل، يا دا لوکال دئيیل.",
        "userrights-changeable-col": "ديَیشدیره بیلدیگینیز قروپلار",
        "userrights-unchangeable-col": "ديَیشدیره بیلمه‌دیگینیز قروپلار",
+       "userrights-expiry-current": "$1-ده قۇرتولور",
+       "userrights-expiry-othertime": "باشقا واخت",
        "userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً گوزله ین و دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
        "group": "گروه:",
        "group-user": "ایستفاده‌چیلر",
index 426e92d..ce6ae9e 100644 (file)
        "diff-form-revid": "Ідэнтыфікатар вэрсіі з адрозьненьнямі",
        "diff-form-submit": "Паказаць адрозьненьні",
        "permanentlink": "Сталая спасылка",
+       "permanentlink-revid": "Ідэнтыфікатар вэрсіі",
+       "permanentlink-submit": "Перайсьці да вэрсіі",
        "dberr-problems": "Прабачце! На гэтым сайце ўзьніклі тэхнічныя цяжкасьці.",
        "dberr-again": "Паспрабуйце пачакаць некалькі хвілінаў і абнавіць.",
        "dberr-info": "(Немагчыма злучыцца з базай зьвестак: $1)",
        "credentialsform-provider": "Тып уліковых зьвестак:",
        "credentialsform-account": "Назва рахунку:",
        "cannotlink-no-provider-title": "Няма рахункаў для далучэньня",
-       "cannotlink-no-provider": "Няма рахункаў для далучэньня."
+       "cannotlink-no-provider": "Няма рахункаў для далучэньня.",
+       "linkaccounts": "Далучэньне рахункаў",
+       "linkaccounts-success-text": "Рахунак быў далучаны."
 }
index 2ae95cb..da370bb 100644 (file)
@@ -48,6 +48,7 @@
        "tog-watchlisthideminor": "Къайладаха кегийра нисдарш тергаме могӀам чура",
        "tog-watchlisthideliu": "Къайладаха бовзийтина болу декъашхойн нисдарш тергаме могӀам чура",
        "tog-watchlistreloadautomatically": "Литтарна хийцам хилча авто-карлабаккха тергаме могӀам (оьшу JavaScript)",
+       "tog-watchlistunwatchlinks": "Тергаме могӀаман тӀетоха дӀаяздарш юкъарадохуш йолу хьажоргаш (оьшу JavaScript)",
        "tog-watchlisthideanons": "Къайладаха къайлаха болу декъашхойн нисдарш тергаме могӀам чура",
        "tog-watchlisthidepatrolled": "Къайладаха хьаьжина долу нисдарш тергаме могӀам чура",
        "tog-watchlisthidecategorization": "АгӀонашна тӀе категореш тохар къайладаккха",
        "htmlform-no": "ХӀахӀа",
        "htmlform-yes": "ХӀаъ",
        "htmlform-chosen-placeholder": "Харжа кеп",
-       "htmlform-cloner-create": "ТÓ\80еÑ\82оÑ\85а ÐºÑ\85ин",
+       "htmlform-cloner-create": "Ð\9aÑ\85ин Ñ\82Ó\80еÑ\82оÑ\85а",
        "htmlform-cloner-delete": "ДӀаяккха",
        "htmlform-date-placeholder": "ШШШШ-ББ-ДД",
        "htmlform-time-placeholder": "СС:ММ:СС",
        "mw-widgets-dateinput-placeholder-day": "ШШШШ-ББ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ШШШШ-ББ",
        "mw-widgets-titleinput-description-redirect": "ДӀасхьажорг $1 тӀе",
+       "mw-widgets-usersmultiselect-placeholder": "Кхин тӀетоха…",
        "date-range-from": "Терхьера:",
        "date-range-to": "Терхье:",
        "sessionprovider-generic": "$1 сесси",
index 4b01132..5dd8345 100644 (file)
        "parser-template-loop-warning": "Template loop detected: [[$1]]",
        "template-loop-category": "Pages with template loops",
        "template-loop-category-desc": "The page contains a template loop, ie. a template which calls itself recursively.",
+       "template-loop-warning": "<strong>Warning:</strong> This page calls [[:$1]] which causes a template loop (an infinite recursive call).",
        "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
        "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
        "node-count-exceeded-category": "Pages where node count is exceeded",
        "rcfilters-watchlist-markseen-button": "Mark all changes as seen",
        "rcfilters-watchlist-edit-watchlist-button": "Edit your list of watched pages",
        "rcfilters-watchlist-showupdated": "Changes to pages you haven't visited since the changes occurred are in <strong>bold</strong>, with solid markers.",
+       "rcfilters-preference-label": "Hide the improved version of Recent Changes",
+       "rcfilters-preference-help": "Rolls back the 2017 interface redesign and all tools added then and since.",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfromreset": "Reset date selection",
        "rclistfrom": "Show new changes starting from $2, $3",
index 2ccddbf..da6b360 100644 (file)
        "rcfilters-empty-filter": "Aktiivsed filtrid puuduvad. Näidatakse kogu kaastööd.",
        "rcfilters-filterlist-title": "Filtrid",
        "rcfilters-filterlist-whatsthis": "Kuidas see töötab?",
-       "rcfilters-filterlist-feedbacklink": "Anna uute filtrite beetaversiooni kohta tagasisidet",
+       "rcfilters-filterlist-feedbacklink": "Ütle meile, mida arvad neist uutest filtririistadest.",
        "rcfilters-highlightbutton-title": "Tulemuste esiletõst",
        "rcfilters-highlightmenu-title": "Vali värvus",
        "rcfilters-highlightmenu-help": "Vali värvus, et see atribuut esile tõsta",
        "rcfilters-liveupdates-button-title-on": "Lülita reaalajas uuendamine välja",
        "rcfilters-liveupdates-button-title-off": "Näita uusi muudatusi kohe nende tegemise järel",
        "rcfilters-watchlist-markseen-button": "Märgi kõik muudatused nähtuks",
+       "rcfilters-watchlist-edit-watchlist-button": "Muuda jälgimisloendit",
+       "rcfilters-watchlist-showupdated": "Muudatused lehekülgedel, mida sa pole pärast muudatuste tegemist külastanud, on <strong>rasvases</strong> kirjas ja tähistatud täidetud punktiga.",
        "rcnotefrom": "Allpool on toodud {{PLURAL:$5|muudatus|muudatused}} alates: <strong>$3, kell $4</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
        "rclistfromreset": "Lähtesta kuupäeva valik",
        "rclistfrom": "Näita muudatusi alates: $3, kell $2",
        "sp-contributions-newonly": "Näita ainult uute lehekülgedega alustamist",
        "sp-contributions-hideminor": "Peida pisimuudatused",
        "sp-contributions-submit": "Otsi",
+       "sp-contributions-outofrange": "Ei õnnestu näidata ühtegi tulemust. Päritud IP-aadressivahemik on suurem kui CIDR-vahemiku piirang /$1.",
        "whatlinkshere": "Lingid siia",
        "whatlinkshere-title": "Leheküljed, mis viitavad lehele \"$1\"",
        "whatlinkshere-page": "Lehekülg:",
index d376427..b356285 100644 (file)
        "rcfilters-filter-watchlistactivity-unseen-label": "تغییرات دیده نشده",
        "rcfilters-filter-watchlistactivity-unseen-description": "تغییرات در صفحاتی که شما تغییرات رخ داده در آنها را مشاهده نکردید.",
        "rcfilters-filter-watchlistactivity-seen-label": "تغییرات دیده‌شده",
+       "rcfilters-filter-watchlistactivity-seen-description": "تغییرات صفحاتی که شما بازدید کردید از زمانی که تغییرات اعمال شده‌است.",
        "rcfilters-filtergroup-changetype": "نوع تغییرات",
        "rcfilters-filter-pageedits-label": "ویرایش‌های صفحه",
        "rcfilters-filter-pageedits-description": "ویرایش‌های محتوای ویکی، بحث‌ها، توضیحات رده...",
        "rcfilters-liveupdates-button-title-off": "نمایش تغییرات جدید همچنان که رخ می‌دهند",
        "rcfilters-watchlist-markseen-button": "نشانه‌گذاری تمام تغییرات به‌عنوان خوانده‌شده",
        "rcfilters-watchlist-edit-watchlist-button": "ویرایش فهرست صفحه‌های پی‌گیری‌هایتان",
+       "rcfilters-watchlist-showupdated": "تغییرات صفحاتی که شما بازدید نکردید از زمانی که تغییرات رخ داده به صورت <strong>پررنگ</strong>، با نشانگر توپر.",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
        "rclistfromreset": "از نو کردن انتخاب تاریخ",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "sp-contributions-newonly": "فقط نمایش ویرایش‌هایی که ایجاد صفحه هستند",
        "sp-contributions-hideminor": "پنهان کردن ویرایش‌های جزئی",
        "sp-contributions-submit": "جستجو",
+       "sp-contributions-outofrange": "قادر به نمایش نتیجه‌ای نیست. محدوده IP درخواست شده بزرگتر از حد CIDR /$1 است.",
        "whatlinkshere": "پیوندها به این صفحه",
        "whatlinkshere-title": "صفحه‌هایی که به «$1» پیوند دارند",
        "whatlinkshere-page": "صفحه:",
index 3dcb491..9285cc3 100644 (file)
        "rcfilters-filter-lastrevision-label": "Viimeisin versio",
        "rcfilters-filter-lastrevision-description": "Vain viimeisin muutos sivulle.",
        "rcfilters-filter-previousrevision-label": "Ei viimeisin muutos",
+       "rcfilters-filter-excluded": "Poissuljettu",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:ei</strong> $1",
+       "rcfilters-exclude-button-off": "Poissulje valitut",
+       "rcfilters-exclude-button-on": "Poissuljetaan valitut",
        "rcfilters-view-advanced-filters-label": "Kehittyneet suodattimet",
        "rcfilters-view-namespaces-tooltip": "Suodata tuloksia nimiavaruuden mukaan",
        "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
index 29ad4a4..f6242e3 100644 (file)
        "returnto": "Revenir à la page $1.",
        "tagline": "De {{SITENAME}}",
        "help": "Aide",
-       "search": "Chercher",
+       "search": "Rechercher",
        "search-ignored-headings": " #<!-- ne pas modifier cette ligne --><pre>\n# Titres des sections qui seront ignorés par la recherche.\n# Les changements effectués ici prennent effet dès lors que la page avec le titre est indexée.\n# Vous pouvez forcer la réindexation de la page en effectuant une modification vide.\n# La syntaxe est la suivante :\n#   * Toute ce qui suit un « # » jusqu’à la fin de la ligne est un commentaire.\n#   * Toute ligne non-vide est le titre exact à ignorer, casse comprise.\nRéférences\nLiens externes\nVoir aussi\n #</pre><!-- ne pas modifier cette ligne -->",
-       "searchbutton": "Chercher",
+       "searchbutton": "Rechercher",
        "go": "Consulter",
        "searcharticle": "Continuer",
        "history": "Historique de la page",
        "botpasswords-no-provider": "BotPasswordsSessionProvider n’est pas disponible.",
        "botpasswords-restriction-failed": "Les restrictions de mot de passe de robots empêchent cette connexion.",
        "botpasswords-invalid-name": "Le nom d’utilisateur spécifié ne contient pas de séparateur de mot de passe de robots (« $1 »).",
-       "botpasswords-not-exist": "L’{{GENDER:$1|utilisateur|utilisatrice}} « $1 » n’a pas de mot de passe de robots intitulé « $2 ».",
+       "botpasswords-not-exist": "L’{{GENDER:$1|utilisateur|utilisatrice}} « $1 » n’a pas de mot de passe de robot nommé « $2 ».",
        "resetpass_forbidden": "Les mots de passe ne peuvent pas être changés",
        "resetpass_forbidden-reason": "Les mots de passe ne peuvent pas être modifiés : $1",
        "resetpass-no-info": "Vous devez être connecté pour avoir accès directement à cette page.",
        "tooltip-pt-login": "Vous êtes encouragé à vous connecter ; ce n’est cependant pas obligatoire.",
        "tooltip-pt-login-private": "Vous devez vous connecter pour utiliser ce wiki",
        "tooltip-pt-logout": "Se déconnecter",
-       "tooltip-pt-createaccount": "Vous êtes encouragé à créer un compte utilisateur pour vous connecter ; ce n’est cependant pas obligatoire.",
+       "tooltip-pt-createaccount": "Vous êtes encouragé à créer un compte utilisateur et vous connecter; ce n’est cependant pas obligatoire.",
        "tooltip-ca-talk": "Discussion au sujet de cette page de contenu",
        "tooltip-ca-edit": "Modifier le wikicode",
        "tooltip-ca-addsection": "Commencer une nouvelle section",
index c317226..d848eec 100644 (file)
@@ -78,6 +78,7 @@
        "category_header": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌹𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
        "subcategories": "𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
        "category-media-header": "𐌼𐌴𐌳𐌾𐌰 𐌹𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
+       "category-empty": "<em>𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌽𐌿 𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌻𐌰𐌿𐌱𐌰𐌽𐍃 𐌸𐌰𐌿 𐌼𐌰𐌹𐌳𐌾𐌰.</em>",
        "hidden-categories": "{{PLURAL:$1|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽 𐌺𐌿𐌽𐌹|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}",
        "hidden-category-category": "𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
        "category-subcat-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌴𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 {{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌹𐍆𐍄𐌿𐌼𐌰 $1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌺𐌿𐌽𐌾𐌴.}}",
        "protect_change": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
        "unprotect": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌼𐌿𐌽𐌳",
        "newpage": "𐌽𐌹𐌿𐌾𐌹𐍃 𐌻𐌰𐌿𐍆𐍃",
-       "talkpagelinktext": "ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¾ð\90\8c°",
+       "talkpagelinktext": "ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¹",
        "specialpage": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "personaltools": "𐍃𐍅𐌴𐍃𐌰𐌹 𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
-       "talk": "ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¾ð\90\8c°",
+       "talk": "ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c¹",
        "views": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃",
        "toolbox": "𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
        "mediawikipage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍅𐌰𐌿𐍂𐌳𐌰𐌻𐌰𐌿𐍆",
        "confirmable-yes": "𐌾𐌰",
        "confirmable-no": "𐌽𐌴",
        "site-rss-feed": "$1 RSS 𐍂𐌹𐌽𐌽𐍉",
-       "site-atom-feed": "$1 ð\90\8c°ð\90\8d\84ð\90\8d\89𐌼 𐍂𐌹𐌽𐌽𐍉",
+       "site-atom-feed": "$1 ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿𐌼 𐍂𐌹𐌽𐌽𐍉",
        "page-atom-feed": "\"$1\" 𐌰𐍄𐍉𐌼 𐍂𐌹𐌽𐌽𐍉",
        "red-link-title": "$1 (𐌻𐌰𐌿𐍆𐍃 𐌽𐌹𐍃𐍄)",
        "nstab-main": "𐌻𐌰𐌿𐍆𐍃",
        "nstab-user": "𐌱𐍂𐌿𐌺𐌾𐌰𐌻𐌰𐌿𐍆𐍃",
        "nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "nstab-project": "𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
-       "nstab-image": "ð\90\8d\86ð\90\8c°ð\90\8c´ð\90\8c¹𐌻",
+       "nstab-image": "ð\90\8d\86ð\90\8c°ð\90\8c¾𐌻",
        "nstab-mediawiki": "𐍅𐌰𐌿𐍂𐌳",
        "nstab-template": "𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐌹𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐍃",
        "nstab-help": "𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
        "nstab-category": "𐌺𐌿𐌽𐌹",
        "mainpage-nstab": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
+       "nosuchspecialpage": "𐌽𐌹𐍃𐍄 𐍃𐍅𐌰𐌻𐌴𐌹𐌺𐍃 𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "error": "𐌰𐌹𐍂𐌶𐌴𐌹",
        "databaseerror-error": "𐌰𐌹𐍂𐌶𐌴𐌹: $1",
        "missing-article": "𐌳𐌰𐍄𐌰𐌱𐌴𐍃 𐌽𐌹 𐌱𐌹𐌲𐌰𐍄 𐌱𐍉𐌺𐍉𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌸𐌹𐌶𐌴𐌹 𐍃𐌺𐌿𐌻𐌳𐌴𐌳𐌹 𐌱𐌹𐌲𐌹𐍄𐌰𐌽, 𐌷𐌰𐌹𐍄𐌰𐌽𐍃 \"$1\" $2. \n\n𐌸𐌰𐍄𐌰 𐌿𐍆𐍄𐌰 𐍅𐌰𐌹𐍂𐌸𐌹𐌸 𐌾𐌰𐌱𐌰𐌹 𐌻𐌰𐌹𐍃𐍄𐌾𐌰𐌳𐌰 𐍆𐌰𐌹𐍂𐌽𐌾𐌰 𐌳𐌹𐍆𐍆 𐌸𐌰𐌿 𐍃𐍀𐌹𐌻𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃 𐍃𐌴𐌹 𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌹𐌳𐌰 𐌹𐍃𐍄. 𐌽𐌹𐌱𐌰𐌹 𐌹𐍃𐍄, 𐌼𐌰𐌷𐍄𐍃 𐌹𐍃𐍄 𐌴𐌹 𐌱𐌹𐌲𐌴𐍄𐌴𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹𐌽 𐌹𐌽 𐍃𐌰𐌿𐍆𐍄𐍅𐌰𐌹𐍂𐌰. \n\n𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺, 𐌼𐌴𐍂𐌴𐌹 𐌸𐌰𐍄𐌰 𐌳𐌿 [[Special:ListUsers/sysop\n|𐍂𐌴𐌹𐌺]] 𐌲𐌹𐍆𐌿𐌷 𐌲𐌰𐍅𐌹𐍃𐍃.",
        "savearticle": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌻𐌰𐌿𐍆",
        "publishpage": "𐌼𐌴𐍂𐌴𐌹 𐌻𐌰𐌿𐍆",
        "preview": "𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃",
-       "showpreview": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽",
-       "showdiff": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
+       "showpreview": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽",
+       "showdiff": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
        "loginreqlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "newarticle": "(𐌽𐌹𐍅𐌹)",
        "newarticletext": "𐌻𐌰𐌹𐍃𐍄𐌹𐌳𐌴𐍃 𐌲𐌰𐍅𐌹𐍃 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐍃𐌰𐌴𐌹 𐌽𐌹𐍃𐍄. 𐌳𐌿 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆, 𐌰𐌽 𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌼𐌴𐌻𐌾𐌰𐌽 𐌹𐌽 𐌰𐍂𐌺𐌰𐌹 𐌿𐍆 (𐍃𐌰𐌹𐍈 [$1 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆] 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐌹𐌽 𐌺𐌿𐌽𐌸𐌾𐌰). 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃 𐌷𐌴𐍂 𐌹𐌽 𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃, 𐌲𐌰𐌲𐌲 𐌳𐌿 <𐍃𐍄𐍂𐍉𐌽𐌲>𐌹𐌱𐌿𐌺𐌰𐌷𐌰𐌿𐌱𐌹𐌳𐌹𐌻𐍉𐌽.",
        "noarticletext-nopermission": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼, 𐌸𐌰𐌿 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃]</span>, 𐌹𐌸 𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.",
        "updated": "(𐌰𐌽𐌰𐌽𐌹𐍅𐌹𐌸)",
        "previewnote": "<strong>𐌲𐌰𐌼𐌹𐌽𐌸𐌴𐌹 𐌸𐌰𐍄𐌴𐌹 𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃.</strong>\n𐌸𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌽𐌰𐌿𐌷 𐌽𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌽𐍉𐍃 𐍃𐌹𐌽𐌳!",
+       "continue-editing": "𐌲𐌰𐌲𐌲 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐍃𐍄𐌰𐌳𐌰",
        "editing": "{{GENDER:𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃}} $1",
        "creating": "{{GENDER:𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃|𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐌴𐌹|𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃\n}} $1",
        "editingsection": "{{GENDER:𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹}} $1 (𐌳𐌰𐌹𐌻)",
        "template-protected": "(𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳)",
        "template-semiprotected": "(𐌷𐌰𐌱𐌰𐌹𐌸 𐌷𐌰𐌻𐌱𐌰𐌼𐌿𐌽𐌸)",
        "hiddencategories": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄 𐌲𐌰𐌳𐌰𐌹𐌻𐌰 {{PLURAL:$1|1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌹𐍃 𐌺𐌿𐌽𐌾𐌹𐍃|$1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰𐌹𐌶𐌴 𐌺𐌿𐌽𐌾𐌴}}:‎",
+       "permissionserrors": "𐌰𐌹𐍂𐌶𐌴𐌹 𐌰𐌽𐌳𐌻𐌴𐍄𐌹𐍃",
        "permissionserrorstext-withaction": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 $2, 𐌹𐌽 {{PLURAL:$1|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉 𐍅𐌰𐌹𐌷𐍄𐌴}}:",
        "moveddeleted-notice": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌿𐍃𐌽𐌿𐌼𐌰𐌽𐍃 𐌹𐍃𐍄. 𐌿𐍃𐌽𐌿𐌼𐍄𐍃 𐌾𐌰𐌷 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐍃 𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹𐍃 𐌿𐍆 𐍃𐌹𐌽𐌳 𐌿𐍃𐍄𐌰𐌹𐌺𐌽𐌴𐌹𐌽𐌰𐌹.",
        "postedit-confirmation-created": "𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽𐍃 𐌹𐍃𐍄.",
        "nextn": "𐌹𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|$1}}",
        "prevn-title": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄(𐌰) $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐍉𐌾𐌰}}",
        "nextn-title": "𐌰𐍆𐍄𐌿𐌼(𐌰) $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐍉𐌾𐌰}}",
-       "shown-title": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐍉𐌾𐌰}} 𐍈𐌰𐍂𐌾𐌰𐌼𐌼𐌴𐌷 𐌻𐌰𐌿𐌱𐌰.",
+       "shown-title": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐍉𐌾𐌰}} 𐍈𐌰𐍂𐌾𐌰𐌼𐌼𐌴𐌷 𐌻𐌰𐌿𐌱𐌰.",
        "viewprevnext": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃 ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>𐍃𐌺𐌰𐍀𐌴𐌹 𐌻𐌰𐌿𐍆 \"[[:$1]]\" 𐌰𐌽𐌰 𐌸𐌹𐌶𐌰𐌹 𐍅𐌹𐌺𐌹!</strong> {{{{PLURAL:$2|0=|𐍃𐌰𐌹 𐌾𐌰𐌷 𐌻𐌰𐌿𐍆 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹.|𐍃𐌰𐌹 𐌾𐌰𐌷 𐍄𐍉𐌾𐌰 𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐌰.}}",
        "searchprofile-articles": "𐌷𐌰𐌱𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌰𐌿𐌱𐍉𐍃",
        "grouppage-sysop": "{{ns:project}}:𐍂𐌴𐌹𐌺𐍃",
        "right-writeapi": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐍃 API 𐌼𐌴𐌻𐌴𐌹𐌽𐌰𐌹𐍃",
        "rightslog": "Niutandis stutjanlog",
+       "action-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
        "nchanges": "$1 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
        "enhancedrc-history": "𐍃𐍀𐌹𐌻𐌻",
        "recentchanges": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (𐍃𐌰𐌹𐍈 𐌾𐌰𐌷[[Special:NewPages|𐍅𐌹𐌺𐍉 𐌽𐌹𐌿𐌾𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴]])",
        "rclistfrom": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌽𐌹𐌿𐌾𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃 𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌾𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $2, $3",
        "rcshowhideminor": "$1 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹𐌽𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
-       "rcshowhideminor-show": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹",
+       "rcshowhideminor-show": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹",
        "rcshowhideminor-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
        "rcshowhidebots": "$1 𐌼𐌰𐌷𐍄𐌹𐍃𐌺𐌰𐌻𐌺𐍉𐍃",
-       "rcshowhidebots-show": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹",
+       "rcshowhidebots-show": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹",
        "rcshowhidebots-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
        "rcshowhideliu": "$1 𐌰𐌽𐌰𐌼𐌴𐌻𐌹𐌳𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
        "rcshowhideliu-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
        "rcshowhideanons": "$1 𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
-       "rcshowhideanons-show": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹",
+       "rcshowhideanons-show": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹",
        "rcshowhideanons-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
        "rcshowhidemine": "$1 𐌼𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
-       "rcshowhidemine-show": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹",
+       "rcshowhidemine-show": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹",
        "rcshowhidemine-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
        "rclinks": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 $1 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃 𐌹𐌽 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌼 $2 𐌳𐌰𐌲𐌰𐌼",
        "diff": "𐌼𐌹𐍃𐍃",
        "hist": "𐍃𐍀𐌹𐌻𐌻",
        "hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
-       "show": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹",
+       "show": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹",
        "minoreditletter": "l",
        "newpageletter": "N",
        "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|𐌱𐌰𐌾𐍄|𐌱𐌰𐌾𐍄𐌰}} 𐌰𐍆𐌰𐍂 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌰𐌹",
        "recentchangeslinked": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "recentchangeslinked-feed": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "recentchangeslinked-toolbox": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "recentchangeslinked-title": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌼𐌹𐌸 \"$1\"",
        "recentchangeslinked-summary": "A𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐍅𐌹𐌺𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 𐌽𐌹𐌿𐌾𐌰𐌱𐌰 𐌲𐌰𐍄𐌰𐍅𐌹𐌳𐍉𐍃 𐌻𐌰𐌿𐌱𐌰𐌼 𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌹 𐍃𐌿𐌼𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰 (𐌸𐌰𐌿 𐌲𐌰𐌳𐌰𐌹𐌻𐌰𐌼 𐍃𐌿𐌼𐌹𐍃 𐌺𐌿𐌽𐌾𐌹𐍃). <strong>𐌻𐌰𐌿𐌱𐍉𐍃 𐌰𐌽𐌰 [[Special:Watchist|your]] 𐍃𐌹𐌽𐌳 </strong>𐍃𐍅𐌹𐌽𐌸𐌰𐌹.",
        "recentchangeslinked-page": "𐌻𐌰𐌿𐌱𐌰𐌽𐌰𐌼𐍉:",
-       "recentchangeslinked-to": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌻𐌰𐌿𐌱𐌴 𐌸𐌰𐌹𐌴𐌹 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐌰𐌹 𐌳𐌿 𐌲𐌹𐌱𐌰𐌽𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
-       "upload": "ð\90\8c¿ð\90\8d\83ð\90\8c·ð\90\8c»ð\90\8c°ð\90\8c¸ð\90\8c°ð\90\8c½ ð\90\8d\86ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c½ð\90\8d\83",
+       "recentchangeslinked-to": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌻𐌰𐌿𐌱𐌴 𐌸𐌰𐌹𐌴𐌹 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐌰𐌹 𐌳𐌿 𐌲𐌹𐌱𐌰𐌽𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
+       "upload": "ð\90\8c°ð\90\8d\84ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82 ð\90\8d\86ð\90\8c°ð\90\8c¾ð\90\8c»",
        "uploadbtn": "Ushlaþaiþ Feilans",
        "uploadlogpage": "Log af Ushlaþan",
        "filedesc": "𐌼𐌰𐌿𐍂𐌲𐌿𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃",
        "imgfile": "𐍆𐌰𐌴𐌹𐌻",
        "listfiles": "Feilans tala",
        "file-anchor-link": "𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
-       "filehist": "ð\90\8d\86ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c½ð\90\8d\83 ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c¹ð\90\8d\83",
+       "filehist": "ð\90\8d\86ð\90\8c°ð\90\8c¾ð\90\8c»ð\90\8c°ð\90\8d\83ð\90\8d\80ð\90\8c¹ð\90\8c»ð\90\8c»",
        "filehist-help": "𐌰𐍄𐍄𐌴𐌺 𐌳𐌰𐌲/𐌼𐌴𐌻 𐌳𐌿 𐌰𐍄𐌰𐌿𐌲𐌾𐌰𐌽 𐌳𐌰𐍄𐌰 𐍃𐍅𐌰𐍃𐍅𐌴 𐌲𐌰𐌱𐌰𐌹𐍂𐌷𐍄𐌹𐌳𐌰 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌼𐌴𐌻𐌰.",
        "filehist-current": "𐌽𐌿",
        "filehist-datetime": "𐌼𐌴𐌻",
        "filehist-dimensions": "𐍅𐌰𐌷𐍃𐍄𐌿𐍃",
        "filehist-filesize": "Feilans wahstus",
        "filehist-comment": "𐍅𐌰𐌿𐍂𐌳",
-       "imagelinks": "ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8d\86ð\90\8c°ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c´",
+       "imagelinks": "ð\90\8d\86ð\90\8c°ð\90\8c¾ð\90\8c»ð\90\8c°ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83",
        "linkstoimage": "𐌰𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐌻𐌴𐌹𐌽𐌺𐍉𐌸|𐌸𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳}} 𐌸𐌹𐌶𐍉𐌶𐌿𐌷 𐍆𐌴𐌹𐌻𐍉𐍃",
        "sharedupload-desc-here": "𐍃𐍉 𐌳𐌰𐍄𐌰 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 $1 𐌾𐌰𐌷 𐌼𐌰𐌲 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰 𐍆𐍂𐌰𐌼 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐍉𐌼.\n𐌲𐌰𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃 𐌰𐌽𐌰 𐍃𐌴𐌹𐌽𐌰𐌼𐌼𐌰 [$2 𐌳𐌰𐍄𐌰 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐌱𐌰] 𐌾𐌰𐌹𐌽𐌰𐍂 𐌰𐍄𐌰𐌿𐌲𐌹𐌸𐍃 𐌹𐍃𐍄 𐌿𐍆.",
+       "filepage-nofile": "𐍆𐌰𐌾𐌻 𐌼𐌹𐌸 𐌸𐌰𐌼𐌼𐌰 𐌽𐌰𐌼𐌹𐌽 𐌽𐌹𐍃𐍄.",
+       "upload-disallowed-here": "𐌽𐌹 𐌼𐌰𐌲𐍄 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐍆𐌰𐌾𐌻.",
        "filedelete-submit": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
        "mimesearch": "MIME 𐍃𐍉𐌺𐌴𐌹",
        "listredirects": "𐍄𐌰𐌻𐌰 𐌰𐍆 𐍄𐌰𐌹𐌺𐌾𐌰𐌽𐍃𐌴𐌹𐌳𐍉𐍃",
        "statistics": "𐍂𐌰𐌸𐌾𐍉𐌽𐍃",
        "brokenredirects-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
        "brokenredirects-delete": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
-       "nbytes": "$1 {{PLURAL:$1|ð\90\8c±ð\90\8c¹ð\90\8d\84\90\8c±ð\90\8c°𐍄𐌰}}",
+       "nbytes": "$1 {{PLURAL:$1|ð\90\8c±ð\90\8c°ð\90\8c¾ð\90\8d\84\90\8c±ð\90\8c°ð\90\8c¾𐍄𐌰}}",
        "ncategories": "$1 {{PLURAL:$1|𐌺𐌿𐌽𐌹|𐌺𐌿𐌽𐌾𐌰}}",
        "nlinks": "$1 {{PLURAL:$1|𐌲𐌰𐍅𐌹𐍃𐍃|𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃}}",
        "nmembers": "$1 {{PLURAL:$1|𐌲𐌰𐌳𐌰𐌹𐌻𐌰|𐌲𐌰𐌳𐌰𐌹𐌻𐌰𐌽𐍃}}",
        "undelete-search-submit": "𐍃𐍉𐌺𐌴𐌹",
        "namespace": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼:",
        "invert": "𐌲𐌰𐍅𐌰𐌽𐌳𐌴𐌹 𐌸𐌰𐍄𐌰 𐌲𐌰𐍅𐌰𐌻𐌹𐌳𐍉",
-       "blanknamespace": "(ð\90\8d\86ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\83)",
+       "blanknamespace": "(ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c¹ð\90\8c¸)",
        "contributions": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃 {{{{GENDER:$1|User}}",
        "mycontris": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃",
        "contribsub2": "𐍆𐌰𐌿𐍂 $1 ($2)",
        "sp-contributions-newbies-sub": "Faúr niujis niutandis",
        "sp-contributions-blocklog": "Logboka af afdraúsjan",
        "sp-contributions-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
+       "sp-contributions-submit": "𐍃𐍉𐌺𐌴𐌹",
        "whatlinkshere": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
        "whatlinkshere-title": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐍄𐌰𐌹𐌺𐌽𐌾𐌰𐌽𐌳 𐌳𐌿 \"$1\"",
        "whatlinkshere-page": "𐌻𐌰𐌿𐍆𐍃:",
        "tooltip-ca-move": "𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
        "tooltip-ca-watch": "𐌱𐌹𐌰𐌹𐌰𐌿𐌺 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆 𐌳𐌿 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽",
        "tooltip-search": "𐍃𐍉𐌺𐌴𐌹 {{SITENAME}}",
-       "tooltip-search-go": "ð\90\8c¾ð\90\8c°ð\90\8c±ð\90\8c°ð\90\8c¹ ð\90\8c¹ð\90\8d\83ð\90\8d\84, ð\90\8c²ð\90\8c°ð\90\8c²ð\90\8c² ð\90\8c³ð\90\8c¿ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c° ð\90\8c¼ð\90\8c¹ð\90\8c¸ ð\90\8d\83ð\90\8c°ð\90\8c¼ð\90\8c¹ð\90\8c½ ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c¹ð\90\8c½.",
+       "tooltip-search-go": "ð\90\8c²ð\90\8c°ð\90\8c²ð\90\8c² ð\90\8c³ð\90\8c¿ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c° ð\90\8c¼ð\90\8c¹ð\90\8c¸ ð\90\8c¸ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c²ð\90\8c°ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c¹ð\90\8c½",
        "tooltip-search-fulltext": "𐍃𐍉𐌺𐌴𐌹 𐌻𐌰𐌿𐌱𐌰𐌽𐍃 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
        "tooltip-p-logo": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
        "tooltip-n-mainpage": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
        "tooltip-t-recentchangeslinked": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌹𐌽 𐌻𐌰𐌿𐌱𐌰𐌼 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐌰𐌹𐌼 𐌰𐍆 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
        "tooltip-feed-atom": "𐌰𐍄𐍉𐌼 𐍆𐍉𐌳𐌴𐌹𐌽𐍃 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
        "tooltip-t-contributions": "𐍅𐌹𐌺𐍉 𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴 𐍆𐍂𐌰𐌼 {{GENDER:$1|𐌸𐌰𐌼𐌼𐌰 𐌱𐍂𐌿𐌺𐌾𐌹𐌽}}",
-       "tooltip-t-upload": "ð\90\8c¿ð\90\8d\83ð\90\8c·ð\90\8c»ð\90\8c°ð\90\8c¸ð\90\8c°ð\90\8c½ ð\90\8d\86ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c½ð\90\8d\83",
+       "tooltip-t-upload": "ð\90\8c°ð\90\8d\84ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82 ð\90\8d\86ð\90\8c°ð\90\8c¾ð\90\8c»ð\90\8c°",
        "tooltip-t-specialpages": "𐍅𐌹𐌺𐍉 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴",
        "tooltip-t-print": "𐌿𐍃𐌼𐌴𐍂𐌴𐌹𐌽𐍃 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌳𐌿 𐌿𐍃𐌼𐌴𐌻𐌾𐌰𐌽",
        "tooltip-t-permalink": "𐌰𐌹𐍅𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌹𐍃𐍃 𐌳𐌿 𐌸𐌹𐌶𐌰𐌹 𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
        "tooltip-ca-nstab-user": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌺𐌾𐌰𐌻𐌰𐌿𐍆",
        "tooltip-ca-nstab-special": "𐍃𐌰 𐌹𐍃𐍄 𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃 𐌾𐌰𐌷 𐌽𐌹 𐌼𐌰𐌲 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰.",
        "tooltip-ca-nstab-project": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆",
-       "tooltip-ca-nstab-image": "ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\88 ð\90\8d\86ð\90\8c°ð\90\8c´ð\90\8c¹𐌻𐌰𐌻𐌰𐌿𐍆",
+       "tooltip-ca-nstab-image": "ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85ð\90\8c´ð\90\8c¹ ð\90\8d\86ð\90\8c°ð\90\8c¾𐌻𐌰𐌻𐌰𐌿𐍆",
        "tooltip-ca-nstab-template": "𐍃𐌰𐌹𐍈 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽",
        "tooltip-ca-nstab-category": "𐍃𐌰𐌹𐍈 𐌺𐌿𐌽𐌾𐌰𐌻𐌰𐌿𐍆",
        "tooltip-save": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌸𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃",
        "tooltip-preview": "𐍆𐌰𐌿𐍂𐌰𐍃𐌰𐌹𐍈 𐌸𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃. 𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺, 𐌱𐍂𐌿𐌺𐌴𐌹 𐌸𐌹𐍃 𐌸𐌰𐍄𐌰 𐍆𐍂𐌿𐌼𐌹𐍃𐍄 𐍆𐌰𐌿𐍂𐌸𐌹𐌶𐌴𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐍃.",
-       "tooltip-diff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍈𐌹𐌻𐌴𐌹𐌺𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃 𐌲𐌰𐍄𐌰𐍅𐌹𐌳𐌴𐍃 𐌳𐌿 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
+       "tooltip-diff": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐍈𐌹𐌻𐌴𐌹𐌺𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃 𐌲𐌰𐍄𐌰𐍅𐌹𐌳𐌴𐍃 𐌳𐌿 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
+       "tooltip-watch": "𐌱𐌹𐌰𐌹𐌰𐌿𐌺 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆 𐌳𐌿 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽",
        "tooltip-rollback": "\"𐌰𐍆𐍅𐌰𐌻𐍅𐌴𐌹\" 𐌲𐌰𐌽𐌰𐍃𐌾𐌹𐌸 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽(𐍉𐍃) 𐌳𐌿 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌹𐍃 𐌱𐌹𐌰𐌿𐌺𐌰𐌽𐌳𐌹𐍃/𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌶𐍉𐍃 𐌱𐌹𐌰𐌿𐌺𐌰𐌽𐌳𐌾𐍉𐍃 𐌹𐌽 𐌰𐌹𐌽𐌰𐌼𐌼𐌰 𐍃𐌹𐌽𐌸𐌰",
        "tooltip-undo": "\"𐌽𐌹𐌿𐍃𐌺𐌰𐍀𐌾𐌰𐌽\" 𐌱𐌰𐌺𐌼𐌰𐌹𐌳𐌾𐌹𐌸 𐌹𐌽𐌼𐌰𐌹𐌳𐌲𐌴𐌹𐌽𐍃 𐌾𐌰𐌷 𐌿𐍃𐌻𐌿𐌺𐍉𐌸 𐌼𐌰𐌹𐌳𐌾𐌰𐍆𐍉𐍂𐌼𐍉𐌽 𐍃𐍅𐌴 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰 𐌷𐌹𐍅𐌾𐌰. 𐌸𐌰𐍄𐌰 𐌻𐌴𐍄 𐌰𐌽𐌰𐌿𐌺𐌰𐌽𐌰𐌽 𐍃𐌰𐌿𐌸𐌰 𐌹𐌽 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰.",
        "tooltip-summary": "𐌰𐍄𐌲𐌰𐌲𐌲𐌹𐍃 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰 𐌼𐌰𐌿𐍂𐌲𐌾𐌰",
+       "pageinfo-header-edits": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐍃𐍀𐌹𐌻𐌻",
+       "pageinfo-robot-index": "𐌰𐌽𐌳𐌻𐌴𐍄𐌰𐌽",
+       "pageinfo-firstuser": "𐌻𐌰𐌿𐌱𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃",
+       "pageinfo-lastuser": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃",
+       "pageinfo-recent-edits": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰 𐍂𐌰𐌸𐌾𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 (𐌹𐌽 $1)",
+       "pageinfo-recent-authors": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰 𐍂𐌰𐌸𐌾𐍉 𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺𐌰𐌹𐌶𐌴 𐌼𐌴𐌻𐌾𐌰𐌽𐌳𐌴",
+       "pageinfo-magic-words": "{{PLURAL:$1|𐌻𐌿𐌱𐌾𐌰𐌻𐌴𐌹𐍃|𐌻𐌿𐌱𐌾𐌰𐌻𐌴𐌹𐍃𐌰}} {{PLURAL:$1|𐍅𐌰𐌿𐍂𐌳|𐍅𐌰𐌿𐍂𐌳𐌰}} ($1)",
        "pageinfo-toolboxlink": "𐌺𐌿𐌽𐌸𐌹 𐌻𐌰𐌿𐌱𐌹𐍃",
+       "pageinfo-contentpage-yes": "𐌾𐌰𐌹",
        "previousdiff": "← 𐍆𐌰𐌹𐍂𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "nextdiff": "𐌽𐌹𐌿𐌾𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 →",
        "file-info-size": "$1 × $2 𐍀𐌹𐌺𐍃𐌴𐌻𐌰, 𐍆𐌴𐌹𐌻𐍅𐌰𐌷𐍃𐍄𐌿𐍃: $3, 𐌼𐌹𐌼𐌴 𐌺𐌿𐌽𐌹: $4",
-       "show-big-image": "ð\90\8d\86ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8d\86ð\90\8c°ð\90\8c´ð\90\8c¹𐌻",
+       "show-big-image": "ð\90\8d\86ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8d\86ð\90\8c°ð\90\8c¾𐌻",
        "show-big-image-preview": "𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌸𐌹𐌶𐍉𐍃 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹𐍃: $1.",
        "show-big-image-size": "$1 × $2 𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐌹𐍃𐍄𐌰𐌱𐌴𐌹𐍃",
        "ilsubmit": "𐍃𐍉𐌺𐌴𐌹",
        "namespacesall": "𐌰𐌻𐌻",
        "monthsall": "𐌰𐌻𐌻",
        "imgmultigo": "𐌲𐌰𐌲𐌲!",
+       "imgmultigoto": "𐌲𐌰𐌲𐌲 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 $1",
        "table_pager_limit_submit": "Affgaggan",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰]])",
        "version-other": "Anþar",
        "version-poweredby-translators": "translatewiki.net 𐌲𐌰𐍃𐌺𐌴𐌹𐍂𐌾𐌰𐌽𐍃",
+       "redirect-submit": "𐌲𐌰𐌲𐌲",
+       "redirect-value": "𐍅𐌰𐌹𐍂𐌸:",
+       "redirect-revision": "𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
+       "redirect-file": "𐍆𐌰𐌾𐌻𐌰𐌽𐌰𐌼𐍉",
        "specialpages": "𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
        "tag-filter": "[[Special:Tags|𐍄𐌰𐌹𐌺𐌽𐍉𐍃]] 𐍆𐌹𐌻𐌷𐌰",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳𐌰}}]]: $2)",
        "logentry-move-move": "$1 {{GENDER:$2|𐌼𐌹𐌸𐍃𐌰𐍄𐌹𐌳𐌰}} 𐌻𐌰𐌿𐍆 $3 𐌳𐌿 $4",
        "logentry-newusers-create": "𐌱𐍂𐌿𐌺𐌾𐌰𐌺𐌰𐍅𐍄𐍃𐌾𐍉 $1 𐍅𐌰𐍃 {{{{GENDER:$2|𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽𐌰}}",
        "rightsnone": "(𐌽𐌹)",
-       "searchsuggest-search": "𐍃𐍉𐌺𐌴𐌹"
+       "searchsuggest-search": "𐍃𐍉𐌺𐌴𐌹",
+       "duration-days": "$1 {{PLURAL:$1|𐌳𐌰𐌲𐍃|𐌳𐌰𐌲𐍉𐍃}}"
 }
index 27758c3..6a15951 100644 (file)
        "pool-timeout": "સમય સમાપ્ત -  સ્થગિતતા પ્રતિક્ષીત",
        "pool-queuefull": "(Pool) કતાર પૂરી ભરેલી છે",
        "pool-errorunknown": "અજ્ઞાત ત્રુટિ",
+       "pool-servererror": "પૂલ કાઉન્ટર સેવા ઉપલબ્ધ નથી ($1)",
        "poolcounter-usage-error": "વપરાશ ક્ષતિ: $1",
        "aboutsite": "{{SITENAME}} વિષે",
        "aboutpage": "Project:વિષે",
        "laggedslavemode": "\"ચેતવણી:\" પાનું તાજેતરના ફેરફાર ધરાવતું નથી.",
        "readonly": "ડેટાબેઝ સ્થગિત",
        "enterlockreason": "સ્થગિતતા ક્યારે દુર કરાશે તેના અંદાજ શાથે,સ્થગિત કરવાનું કારણ આપો",
-       "readonlytext": "નવી નોંધો અને ફેરફારો માટે ડેટાબેઝ હાલમાં સ્થગિત કરાયેલ છે,કદાચ નિયમિત ડેટાબેઝ સારસંભાળ માટે,તે પછી આ ફરી સામાન્ય થશે.\n\nસ્થગિત કરનાર પ્રબંધકનો ખુલાસો: $1",
+       "readonlytext": "નવી નોંધો અને ફેરફારો માટે ડેટાબેઝ હાલમાં સ્થગિત કરાયેલ છે,કદાચ નિયમિત ડેટાબેઝ સારસંભાળ માટે,તે પછી આ ફરી સામાન્ય થશે.\n\n\nસિસ્ટમ સંચાલક જેણે તેને લૉક કર્યું છે, તે આ સમજૂતી આપે છે: $1",
        "missing-article": "ડેટાબેઝને પાનાનાં જે શબ્દો (\"$1\" $2) મળવા જોઈતા હતા તે મળ્યા નથી.\n\nઆવું સામાન્ય રીતે ત્યારે બને જ્યારે તમે તફાવત કે ઈતિહાસની એવી જુની કડીને અનુસરીને અહીં આવ્યા હોવ કે જે પાનું હટાવી દીધું હોય.\n\nજો તમને ખાતરી છે કે આવું નથી, તો તમારા ભાગે સોફ્ટવેરમાં રહેલી ત્રુટી આવી છે.\nકૃપા કરી આ વાત, જે તે પાનાની પૂર્ણ યુ.આર.એલ. (URL) કડી સાથે, તમારા [[Special:ListUsers/sysop|પ્રબંધક]]ના ધ્યાન પર લાવો.",
        "missingarticle-rev": "(પુનરાવર્તન#: $1)",
        "missingarticle-diff": "(ભેદ: $1, $2)",
        "readonly_lag": "કનિષ્ઠ માહિતીસંચ સર્વરો મુખ્ય સર્વર સુધી પહોંચી ત્યા સુધી આ માહિતીસંચ પર સ્વયંચલિત રીતે તાળું મરાયું છે",
        "internalerror": "આંતરિક ત્રુટિ",
        "internalerror_info": "આંતરિક ત્રુટિ: $1",
+       "internalerror-fatal-exception": "\"$1\" પ્રકારનો ઘાતક અપવાદ",
        "filecopyerror": "\"$1\" થી \"$2\"માં નકલ નિષ્ફળ.",
        "filerenameerror": "\"$1\" નું નામ બદલીને \"$2\" કરવામાં નિષ્ફળ.",
        "filedeleteerror": "\"$1\" ફાઇલ હટાવી ન શકાઇ.",
index b4f87e5..0e3a579 100644 (file)
        "uploadlogpage": "יומן העלאות",
        "uploadlogpagetext": "להלן רשימה של העלאות הקבצים האחרונות שבוצעו.\nראו את [[Special:NewFiles|גלריית הקבצים החדשים]] להצגה ויזואלית שלהם.",
        "filename": "שם הקובץ",
-       "filedesc": "<div style=\"direction: rtl;\">תקציר</div>",
+       "filedesc": "תקציר",
        "fileuploadsummary": "תיאור:",
        "filereuploadsummary": "השינויים בקובץ:",
        "filestatus": "מעמד זכויות יוצרים:",
        "upload-curl-error28": "הסתיים זמן ההמתנה להעלאה",
        "upload-curl-error28-text": "לאתר לקח זמן רב מדי לענות. אנא בדקו שהאתר זמין, המתינו מעט ונסו שוב. ייתכן שתרצו לנסות בזמן פחות עמוס.",
        "license": "רישיון:",
-       "license-header": "<div style=\"direction: rtl;\">רישיון</div>",
+       "license-header": "רישיון",
        "nolicense": "אין",
        "licenses-edit": "עריכת אפשרויות רישיון",
        "license-nopreview": "(תצוגה מקדימה לא זמינה)",
        "sp-contributions-newonly": "הצגת עריכות שהן יצירות של דפים בלבד",
        "sp-contributions-hideminor": "הסתרת עריכות משניות",
        "sp-contributions-submit": "חיפוש",
+       "sp-contributions-outofrange": "לא ניתן להציג תוצאות. טווח ה־IP המבוקש גדול יותר ממגבלת ה־CIDR, שהיא /$1.",
        "whatlinkshere": "דפים המקושרים לכאן",
        "whatlinkshere-title": "דפים המקשרים לדף \"$1\"",
        "whatlinkshere-page": "דף:",
index 243da8f..9ab7810 100644 (file)
        "createacct-yourpassword-ph": "Unesite zaporku",
        "yourpasswordagain": "Ponovno upišite zaporku",
        "createacct-yourpasswordagain": "Potvrdi zaporku",
-       "createacct-yourpasswordagain-ph": "Unesite zaporku ponovno",
+       "createacct-yourpasswordagain-ph": "Unesite zaporku ponovo",
        "userlogin-remembermypassword": "Zapamti me",
        "userlogin-signwithsecure": "Rabi sigurnu vezu",
        "cannotlogin-title": "Prijava nije moguća",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate suradnički račun?",
        "userlogin-joinproject": "Pridružite se {{SITENAME}}",
-       "createaccount": "Otvori novi suradnički račun",
+       "createaccount": "Stvori račun",
        "userlogin-resetpassword-link": "Zaboravili ste zaporku?",
        "userlogin-helplink2": "Pomoć pri prijavi",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nRabite donji obrazac da biste se prijavili kao drugi suradnik.",
-       "userlogin-reauth": "Morate se ponovno prijaviti da biste potvrdili da ste Vi {{GENDER:$1|$1}}.",
+       "userlogin-reauth": "Morate se ponovo prijaviti da biste potvrdili da ste Vi {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Stvori još jedan račun",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte",
        "createaccountmail-help": "Može se rabiti da se nekome stvori račun bez da se sazna zaporka.",
        "createacct-realname": "Stvarno ime (neobvezatno)",
        "createacct-reason": "Razlog",
-       "createacct-reason-ph": "Zašto stvarate drugi račun",
+       "createacct-reason-ph": "Zašto stvarate još jedan račun?",
        "createacct-reason-help": "Poruka koja se prikazuje u evidenciji stvaranja suradničkih računa",
        "createacct-submit": "Stvorite svoj suradnički račun",
        "createacct-another-submit": "Otvori račun",
        "createacct-benefit-heading": "{{SITENAME}} su stvorili ljudi poput Vas.",
        "createacct-benefit-body1": "{{PLURAL:$1|uređivanje|uređivanja}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|nedavni suradnik|nedavnih suradnika}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|nedavni suradnik|nedavna suradnika|nedavnih suradnika}}",
        "badretype": "Unesene zaporke nisu istovjetne.",
        "usernameinprogress": "Stvaranje računa za ovo suradničko ime upravo je u tijeku.\nMolimo, pričekajte.",
        "userexists": "Uneseno suradničko ime već je u upotrebi.\nUnesite neko drugo ime.",
        "protectedpagewarning": "'''UPOZORENJE: Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima.'''\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "semiprotectedpagewarning": "'''Napomena:''' Ova stranica je zaključana tako da je mogu uređivati samo prijavljeni suradnici.\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "cascadeprotectedwarning": "'''UPOZORENJE:''' Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima, jer je uključena u {{PLURAL:$1|slijedeću stranicu|slijedeće stranice}} koje su zaštićene \"prenosivom\" zaštitom:",
-       "titleprotectedwarning": "'''UPOZORENJE:  Ova stranica je zaključana i samo je suradnici s [[Special:ListGroupRights|dodatnim pravima]] mogu stvoriti.'''\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
+       "titleprotectedwarning": "<strong>Upozorenje: Ova je stranica zaključana i samo ju suradnici s [[Special:ListGroupRights|određenim pravima]] mogu stvoriti.</strong>\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "templatesused": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} u ovom predpregledu:",
        "templatesusedsection": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} u ovom odjeljku:",
        "prefs-misc": "Razno",
        "prefs-resetpass": "promijeni zaporku",
        "prefs-changeemail": "promijeni ili ukloni adresu e-pošte",
-       "prefs-setemail": "Postavite E-mail adresu",
+       "prefs-setemail": "Postavite adresu e-pošte",
        "prefs-email": "Mogućnosti e-maila",
        "prefs-rendering": "Izgled",
        "saveprefs": "Spremi",
index fdfe56b..2b29e48 100644 (file)
        "recentchanges-submit": "Megjelenítés",
        "rcfilters-tag-remove": "$1 eltávolítása",
        "rcfilters-legend-heading": "<strong>Rövidítések listája:</strong>",
+       "rcfilters-other-review-tools": "<strong>Egyéb hasznos hivatkozások</strong>",
+       "rcfilters-group-results-by-page": "Csoportosítás eredményei lapok szerint",
        "rcfilters-grouping-title": "Csoportosítás",
        "rcfilters-activefilters": "Aktív szűrők",
        "rcfilters-advancedfilters": "Haladó szűrők",
        "rcfilters-highlighted-filters-list": "Kiemelve: $1",
        "rcfilters-quickfilters": "Mentett szűrők",
        "rcfilters-quickfilters-placeholder-title": "Nincs mentett hivatkozás",
+       "rcfilters-quickfilters-placeholder-description": "Hogy elmentsd szűrőid beállításait és később újra használhasd őket, kattints a könyvjelző ikonra az „aktív szűrők” mezőben, feljebb.",
        "rcfilters-savedqueries-defaultlabel": "Mentett szűrők",
        "rcfilters-savedqueries-rename": "Átnevezés",
        "rcfilters-savedqueries-setdefault": "Beállítás alapértelmezettként",
        "rcfilters-empty-filter": "Nincs aktív szűrő. Minden közreműködés látható.",
        "rcfilters-filterlist-title": "Szűrők",
        "rcfilters-filterlist-whatsthis": "Hogy működnek?",
-       "rcfilters-filterlist-feedbacklink": "Visszajelzés küldése az új (beta) szűrőkről",
+       "rcfilters-filterlist-feedbacklink": "Mond el nekünk, mit gondolsz az (új) szűrőkről",
        "rcfilters-highlightbutton-title": "Kiemelt találatok",
        "rcfilters-highlightmenu-title": "Válassz egy színt",
        "rcfilters-highlightmenu-help": "Válassz színt ennek a tulajdonságnak kijelöléséhez",
        "rcfilters-filterlist-noresults": "Nem található szűrő",
        "rcfilters-noresults-conflict": "Nincs találat, mert a keresési kritériumok konfliktusban vannak",
        "rcfilters-state-message-subset": "Ennek a szűrőnek nincs hatása, mert az eredményét {{PLURAL:$2|tartalmazza a következő, nagyobb szűrő|tartalmazzák a következő, nagyobb szűrők}} (próbáld meg kiemelni a megkülönböztetéshez): $1",
-       "rcfilters-state-message-fullcoverage": "Az összes szűrő kijelölése egy csoportban ugyanaz, mint ha semmit nem választanál ki, így ennek a szűrőnek nincs hatása. A csoport tartalmazza: $1",
+       "rcfilters-state-message-fullcoverage": "Az összes szűrő kijelölése ebben a csoportban ugyanaz, mintha semmit nem választanál ki, így ennek a szűrőnek nincs hatása. A csoport tartalmazza: $1",
        "rcfilters-filtergroup-authorship": "Hozzájárulás szerzője",
        "rcfilters-filter-editsbyself-label": "Saját változtatásaid",
        "rcfilters-filter-editsbyself-description": "A te hozzájárulásaid.",
        "rcfilters-filter-watchlist-watchednew-description": "A figyelőlistádon szereplő lapokon az utolsó látogatásod után történt változtatások.",
        "rcfilters-filter-watchlist-notwatched-label": "Figyelőlistán nem szereplők",
        "rcfilters-filter-watchlist-notwatched-description": "Minden változtatás, kivéve a figyelőlistádon szereplő lapoké.",
+       "rcfilters-filtergroup-watchlistactivity": "Figyelőlista aktivitás",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Még nem látott változtatások",
        "rcfilters-filtergroup-changetype": "Változtatás típusa",
        "rcfilters-filter-pageedits-label": "Lapszerkesztések",
        "rcfilters-filter-pageedits-description": "A wiki tartalom szerkesztése, beszélgetések, kategória leírások...",
        "rcfilters-filter-previousrevision-description": "Minden változtatás a legutóbbiak kivételével",
        "rcfilters-filter-excluded": "Kizárva",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:nem</strong> $1",
+       "rcfilters-exclude-button-off": "A kiválasztottak kizárása",
+       "rcfilters-exclude-button-on": "A kiválasztottak kizárva",
        "rcfilters-view-advanced-filters-label": "Haladó szűrők",
        "rcfilters-view-tags": "Megjelölt szerkesztések",
        "rcfilters-view-namespaces-tooltip": "Találatok szűrése névtér szerint",
        "rcfilters-view-return-to-default-tooltip": "Vissza a főszűrőmenübe.",
        "rcfilters-liveupdates-button": "Élő frissítések",
        "rcfilters-liveupdates-button-title-on": "Élő frissítések kikapcsolása",
+       "rcfilters-liveupdates-button-title-off": "A legfrissebb változtatások mutatása, amint megtörténnek",
        "rcfilters-watchlist-markseen-button": "Összes változtatás megjelölése olvasottként",
+       "rcfilters-watchlist-edit-watchlist-button": "A figyelőlistád szerkesztése",
        "rcnotefrom": "Alább a <strong>$3 $4</strong> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
        "rclistfromreset": "Dátumválasztás visszaállítása",
        "rclistfrom": "$3, $2 után történt változtatások megtekintése",
index eedcf28..aeef7e8 100644 (file)
@@ -17,7 +17,9 @@
                        "Matma Rex",
                        "Belkacem77",
                        "Mhenni",
-                       "Slimane AMIRI"
+                       "Slimane AMIRI",
+                       "SlimaneAmiri",
+                       "Sayem AtVkm"
                ]
        },
        "tog-underline": "Aderrer n iseɣwan:",
@@ -64,8 +66,8 @@
        "tog-norollbackdiff": "Ur skan  ara amgired seld aḥway",
        "tog-useeditwarning": "Σeggen iyid mi ara fγaγ seg usebter mebla ma skeslaγ ibeddilen.",
        "tog-prefershttps": "Seqdac yal tikelt tuqqna taɣelsant akken ad teqqneḍ",
-       "underline-always": "Daymen",
-       "underline-never": "Abaden",
+       "underline-always": "Yal tikelt",
+       "underline-never": "Werǧin",
        "underline-default": "Azal s lexṣas n iminig neɣ n usentel",
        "editfont-style": "Aɣanib n tasefsit n taɣzut ubeqqeḍ :",
        "editfont-default": "Tasefsit n iminig s lexṣas",
        "edit-conflict": "Amgirred n ubeddel.",
        "edit-no-change": "Abeddel inek/inem ur yetwexdam ara acku ur di ban ara abeddel deg uḍris.",
        "postedit-confirmation-created": "Asebter ittwarna.",
+       "postedit-confirmation-restored": "Asebter yuɣal-d.",
        "postedit-confirmation-saved": "Abeddel inek/inem yetwakles.",
        "edit-already-exists": "Asebter amaynut ur d yesnufu ara.\nYella yakan.",
        "defaultmessagetext": "Izen s lexṣas",
        "revdelete-legend": "Sbebd akref n tamuɣli",
        "revdelete-hide-text": "Aḍris n tacaggart",
        "revdelete-hide-image": "Ffer ayen yellan deg ufaylu",
-       "revdelete-hide-name": "Ffer tigawt d nnican",
+       "revdelete-hide-name": "Ffer iberdan d iɣewwaṛen",
        "revdelete-hide-comment": "Beddel agzul",
        "revdelete-hide-user": "Isem n umseqdac/Tansa IP n umaẓrag",
        "revdelete-hide-restricted": "Mḥu isefka agi i inedbalen d yimdanen wiyaḍ",
        "mergehistory-empty": "Ulac lqem i nezmer an zdi.",
        "mergehistory-done": "$3 {{PLURAL:$3|lqem|ileqman}} n $1 {{PLURAL:$3|yezdukel|zdukelen}} deg [[:$2]].",
        "mergehistory-fail": "Ulamek an zdukel imezruyen. Fru tikkelt nniḍen asebter d iɣewwaren is n uzmez.",
+       "mergehistory-fail-invalid-source": "Asebter aɣbalu d arameɣtu.",
        "mergehistory-no-source": "Azar n usebter $1 ulac-it.",
        "mergehistory-no-destination": "Aserken n usebter $1 ulac-it",
        "mergehistory-invalid-source": "Azar n usebter ilaq ad i sɛu azwel i ɣbelen.",
        "rcfilters-filter-editsbyself-label": "Asnifel-ik",
        "rcfilters-filter-editsbyself-description": "Ittekkiyen-ik",
        "rcfilters-filter-editsbyother-label": "Asnifel n wiyaḍ",
+       "rcfilters-filter-editsbyother-description": "Akk ibeddilen slid wid iynek(m).",
+       "rcfilters-filtergroup-userExpLevel": "Asekles n iseqdacen aked tarmit",
        "rcfilters-filter-user-experience-level-registered-label": "Yeqqen",
        "rcfilters-filter-user-experience-level-registered-description": "Imaẓragen uqqinen.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Ur yeqqin ara",
        "rcfilters-filter-user-experience-level-unregistered-description": "Imaẓragen ur yeqqinen ara.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Inebgawen imaynuten",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Imaẓragen uqqinen s udun n 10 ibeddilen aked 4 n ussan n urmud.",
        "rcfilters-filter-user-experience-level-learner-label": "Inelmaden",
+       "rcfilters-filter-user-experience-level-learner-description": "Imaẓragen uqqinen idegi tarmit tezga-d ger \"Iseqdacen imaynuten\" aked \"Iseqdacen imazzayen\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Iseqdacen s tirmitin",
+       "rcfilters-filter-user-experience-level-experienced-description": "Imaẓragen uqqinen s ugar n 500 ibeddilen aked 30 n ussan n urmud.",
        "rcfilters-filtergroup-automated": "Ittekkiyen iwurmanen",
        "rcfilters-filter-bots-label": "Aṛubut",
+       "rcfilters-filter-bots-description": "Ibeddilen yettwagan s ifecka iwurmanen.",
        "rcfilters-filter-humans-label": "Amdan (mačči d aṛubut)",
+       "rcfilters-filter-humans-description": "Ibeddilen yettwagan s imaẓragen inalsen.",
+       "rcfilters-filtergroup-significance": "Anamek",
+       "rcfilters-filter-watchlistactivity-seen-label": "Wali ibeddilen",
+       "rcfilters-filtergroup-changetype": "Anaw ubeddil",
+       "rcfilters-filter-pageedits-label": "Ibeddilen n usebter",
+       "rcfilters-filter-categorization-label": "Ibeddilen n taggayt",
        "rcnotefrom": "Ddaw-a{{PLURAL:$5|d abeddel|d ibeddilen}} si <strong>$3, $4</strong> (arama <strong>$1</strong> ad d-yettwaseknen).",
        "rclistfrom": "Ssken ibeddlen imaynuten seg $3 $2",
        "rcshowhideminor": "$1 ibeddlen ifessasen",
        "wlshowlast": "Sken wid n $1 n isragen ineggura, wid n $2 n wussan ineggura",
        "watchlist-hide": "Ffer",
        "watchlist-submit": "Sken",
+       "wlshowhideliu": "Iseqdacen yettwajerden",
+       "wlshowhideanons": "Iseqdacen udrigen",
        "watchlist-options": "Iɣewwaṛen n tebdart n uḍfaṛ",
        "watching": "Ad iɛass...",
        "unwatching": "Ad ifukk aɛessi...",
        "deletepage": "Mḥu asebter",
        "confirm": "Sentem",
        "excontent": "Ayen yella: '$1'",
-       "excontentauthor": "Ayen yella: '$1' ('[[Special:Contributions/$2|$2]]' kan i yekken deg-s)",
+       "excontentauthor": "yegber : \"$1\", udiɣ immttekki-ines d \"[[Special:Ittekkiyen/$2|$2]]\" ([[User talk:$2|asqerdec]])",
        "exbeforeblank": "Ayen yella uqbal ma yettumḥa: '$1'",
        "delete-confirm": "Kkes \"$1\"",
        "delete-legend": "Ekkes",
        "mycontris": "Ittekkiyen",
        "anoncontribs": "Ittekkiyen",
        "contribsub2": "I {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Amiḍan n useqdac \"$1\" ur yettwasekles ara.",
        "nocontribs": "Ur yufi ara abddel i tebɣiḍ.",
        "uctop": "(amiran)",
        "month": "Seg uggur (d wid uqbel) :",
        "sp-contributions-newbies-sub": "I yisem yimseqdacen imaynuten",
        "sp-contributions-newbies-title": "Ittekkiyen n imseqdacen gar imiḍanen imaynuten",
        "sp-contributions-blocklog": "Aɣmis n uɛeṭṭil",
-       "sp-contributions-deleted": "isekcam yemḥan",
+       "sp-contributions-suppresslog": "Attekki n {{GENDER:$1|useqdac|taseqdact}} yettwakkes",
+       "sp-contributions-deleted": "Attekki n {{GENDER:$1|useqdac|taseqdact}} yettwakkes",
        "sp-contributions-uploads": "izdamen",
        "sp-contributions-logs": "iɣmisen",
        "sp-contributions-talk": "Mmeslay",
-       "sp-contributions-userrights": "Laɛej iserfan n umseqdac",
+       "sp-contributions-userrights": "sefrek izerfan n {{GENDER:$1|useqdac}}",
        "sp-contributions-blocked-notice": "Aseqdac agi yekyef.\nAsekcem aneggaru n useklas n ikyafen yella ddaw agi :",
        "sp-contributions-blocked-notice-anon": "Tansa IP agi tekyef.\nAsekcem aneggaru n useklas n ikyafen yella ddaw agi :",
        "sp-contributions-search": "Nadi i tikkin",
        "autoblockid": "Asewḥel awurman #$1",
        "block": "Ɛekkel aseqdac",
        "unblock": "Aksasewḥel n umseqdac",
-       "blockip": "Ɛekkel aseqdac",
+       "blockip": "Sewḥel {{GENDER:$1|aseqdac|taseqdact}}",
        "blockip-legend": "Ɛekkel aseqdac",
        "blockiptext": "Seqdec tiferkit ddaw-agi iwakken ad  sewḥeleḍ ineɛruḍen n ubeddel seg yiwet tansa IP tulmist neɣ n yiwen isem umseqdac.\nAsket am wagi, ur ilaq ad yetwexddem kan iwakken ad yeεeggen axeṣṣar dɣa ilaq ad yemtawi s [[{{MediaWiki:Policy-url}}|ilugan igensanen]].\nEfked ddaw-agi taɣẓint tusdidt (amedya : efked isebtar yetwaxeṣṣren).",
        "ipaddressorusername": "Tansa IP neɣ isem n wemseqdac",
        "change-blocklink": "beddel asewḥel",
        "contribslink": "attekki",
        "emaillink": "Ceggaɛ e-mail",
-       "autoblocker": "Tetsewḥeleḍ s uwurman acku tansa IP inek/inem yeseqdac-itt « [[User:$1|$1]] ». Taɣzint id efkan i usewḥel agi d : « $2 ».",
+       "autoblocker": "Tweḥleḍ s wudem awurman acku tansa-ik IP yeseqdac-itt \"[[User:$1|$1]]\"\nTaɣzint i d-ittunefken i usewḥel n $1 d \"$2\"",
        "blocklogpage": "Aɣmis n isewḥelen",
        "blocklog-showlog": "Amseqdac agi, yetseweḥel uqbel. Ad affeḍ aɣmis n isewḥal ddaw-agi :",
        "blocklog-showsuppresslog": "Amseqdac agi, yetseweḥel dɣa yeweffer uqbel. Ad affeḍ aɣmis n tukksiwin ddaw-agi :",
        "pageinfo-category-pages": "Amḍan n isebtar",
        "pageinfo-category-subcats": "Amḍan n adutaggayin",
        "pageinfo-category-files": "Amḍan n ifuyla",
+       "pageinfo-user-id": "Asulay n useqdac",
        "markaspatrolleddiff": "Rcem \"yettwassenqden\"",
        "markaspatrolledtext": "Rcem amagrad-agi \"yettwassenqden\"",
        "markedaspatrolled": "Rcem belli yettwasenqed",
        "newimages-summary": "Asebtar agi uslig yebeqqeḍ ifuyla ineggura i kteren.",
        "newimages-legend": "Tastayt",
        "newimages-label": "Isem n ufaylu (naɣ aḥric ines) :",
+       "newimages-user": "Tansa IP neɣ isem n useqdac",
        "newimages-newbies": "Sken kan ittekkiyen n imiḍanen imaynuten",
        "noimages": "Tugna ulac-itt.",
        "ilsubmit": "Nadi",
        "tags-hitcount-header": "Ibeddilen yesɛan ticraḍ",
        "tags-active-yes": "Ih",
        "tags-active-no": "Ala",
+       "tags-source-manual": "Yettwasnes s ufus sɣur iseqdacen akked iṛubuten",
        "tags-edit": "beddel",
        "tags-hitcount": "$1 {{PLURAL:$1|abeddel|ibeddlen}}",
        "tags-create-heading": "Rnu taṛekkizt tamaynut",
        "special-characters-group-arabic": "Taɛṛabt",
        "randomrootpage": "Asebter aẓaṛ agacuran",
        "log-action-filter-upload-upload": "Asali amaynut",
-       "authprovider-confirmlink-ok-help": "Kemmel deffir n uskan n yiznan n usdukkel ur yeddin ara."
+       "authmanager-username-help": "Isem n useqdac i usesteb",
+       "authmanager-realname-help": "Isem ilaw n useqdac",
+       "authprovider-confirmlink-ok-help": "Kemmel deffir n uskan n yiznan n usdukkel ur yeddin ara.",
+       "userjsispublic": "Ma ulac aɣilif, wali: isebtar isnawanen, JavaScript ur issefk ara ad gebren isefka ibaḍniyen acku ttwalin-ten iseqdacen-nniḍen."
 }
index 6a2191c..28867f5 100644 (file)
@@ -15,7 +15,7 @@
        },
        "tog-underline": "Джибериулени черт:",
        "tog-hideminor": "Джангы тюрлениулени тизмесинде гитче тюрлениулени кёргюзме",
-       "tog-hidepatrolled": "Джангы тюрлениулени тизмесинде тинтилген тюрлениулени кёргюзме",
+       "tog-hidepatrolled": "Джангы тюрлениулени тизмесинден тинтилген тюрлениулени джашыр",
        "tog-newpageshidepatrolled": "Джангы бетлени тизмесинде тинтилген бетлени кёргюзме",
        "tog-extendwatchlist": "Кёзде тургъан тизмени, къуру ахыр тюл, бютеу тюрлениулени кёрюр ючюн кенгерт",
        "tog-usenewrc": "Ахыр тюрлениуледе эм кёздеги тизмеде бетлени тюрлениулерин къауумлашдыр",
        "anontalk": "Бу IP-адресге сюзюу бет",
        "navigation": "Навигация",
        "and": "&#32;эм",
-       "qbfind": "Излеу",
-       "qbbrowse": "Къарау",
-       "qbedit": "Тюрлендир",
-       "qbpageoptions": "Бу бет",
-       "qbmyoptions": "Бетлерим",
        "faq": "FAQ",
-       "faqpage": "Project:FAQ",
        "actions": "Этиуле",
        "namespaces": "Атланы аламы",
        "variants": "Вариантла",
        "edit-local": "Локал айгъакълауну тюрлендириу",
        "create": "Къура",
        "create-local": "Локал айгъакълау къош",
-       "editthispage": "Бу бетни тюрлендир",
-       "create-this-page": "Бу бетни къура",
        "delete": "Кетер",
-       "deletethispage": "Бу бетни кетер",
-       "undeletethispage": "Бу бетни ызына сал",
        "undelete_short": "{{PLURAL:$1|Бир тюрлендириуню$1 тюрлендириуню}} ызына сал",
        "viewdeleted_short": "{{PLURAL:$1|Бир кетерилген тюрлендириуню|$1 кетерилген тюрлендириуню}} кёрюу",
        "protect": "Джакъла",
        "protect_change": "тюрлендир",
-       "protectthispage": "Бу бетни джакъла",
        "unprotect": "Джакълауну тюрлендир",
-       "unprotectthispage": "Бу бетни джакълауун тюрлендир",
        "newpage": "Джангы бет",
-       "talkpage": "Бу бетни сюз",
        "talkpagelinktext": "сюзюу",
        "specialpage": "Къуллукъ бет",
        "personaltools": "Энчи адырла",
-       "articlepage": "Статьягъа къарау",
        "talk": "Сюзюу",
        "views": "Къараула",
        "toolbox": "Адырла",
-       "userpage": "Къошулуучуну энчи бетине къарау",
-       "projectpage": "Проектни бетине къара",
+       "tool-link-userrights": "{{GENDER:$1|Къошулуучуну}} группаларын тюрлендир",
+       "tool-link-emailuser": "Бу {{GENDER:$1|къошулуучугъа}} email джибер",
        "imagepage": "Файлны бетине къара",
        "mediawikipage": "Билдириуню бетине къара",
        "templatepage": "Шаблонну бетине къара",
        "nstab-template": "Шаблон",
        "nstab-help": "Болушлукъ бет",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Баш бет",
        "nosuchaction": "Быллай амал джокъду",
        "nosuchactiontext": "URL-да белгиленнген амал терсди.\nСиз URL-ну терс джазгъан болурсуз, неда терс джибериу бла кёчгенсиз.\nБу {{SITENAME}} проектде да хатаны кёргюзюрге боллукъду.",
        "nosuchspecialpage": "Быллай къуллукъ бет джокъду",
        "rightslogtext": "Бу къошулуучуну хакъларыны тюрлениуюню журналыды",
        "action-read": "бу бетни окъуу",
        "action-edit": "бу бетни тюрлендириу",
-       "action-createpage": "бетни къурау",
-       "action-createtalk": "сюзюу бетни къурау",
+       "action-createpage": "бу бетни къура",
+       "action-createtalk": "бу сюзюу бетни къурау",
        "action-createaccount": "бу тергеу джазыуну (аккаунтну) къурау",
        "action-minoredit": "бу тюрлениуню гитче кибик белгилеу",
        "action-move": "бу бетни атын тюрлендириу",
        "action-upload_by_url": "URL адресден бу файлны джюклеу",
        "action-writeapi": "API хайырландырыу тюрлендириулеге",
        "action-delete": "бу бетни кетериу",
-       "action-deleterevision": "беÑ\82ни Ð±Ñ\83 Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\81ын кетериу",
-       "action-deletedhistory": "бу бетни кетерилген тарихине къарау",
+       "action-deleterevision": "беÑ\82ни Ð²ÐµÑ\80Ñ\81иÑ\8fлаÑ\80ын кетериу",
+       "action-deletedhistory": "бетни кетерилген тарихине къарау",
        "action-browsearchive": "кетерилген бетлени излеу",
-       "action-undelete": "бу бетни ызына салыу",
-       "action-suppressrevision": "бу джашырылгъан версиясына бетни къарау эм ызына салыу",
+       "action-undelete": "бетни ызына салыу",
+       "action-suppressrevision": "бетни джашырылгъан версияларына къарау эм ызына салыу",
        "action-suppressionlog": "бу энчи журналгъа къарау",
        "action-block": "Къошулуучуну блок этиу, тюрлендириуле этерге къоймау",
        "action-protect": "бу бетни джакълау дараджасын тюрлендириу",
        "action-rollback": "бетни ахыр тюрлендирген къошулуучуну тюрлендириулерин дженгил ызына алыу",
-       "action-import": "бу бетни башха викиден импорт этиу",
-       "action-importupload": "бу бетни джюкленнген файлдан импорт этиу",
+       "action-import": "бетлени башха викиден импорт этиу",
+       "action-importupload": "бетлени джюкленнген файлдан импорт этиу",
        "action-patrol": "башхаланы тюрлендириулерин патруль этилиннгенлеча белгилеу",
        "action-autopatrol": "кесими тюрлендириулерими патруль этилиннгенлеча белгилеу",
        "action-unwatchedpages": "киши кёзюнде тутмагъан бетлени тизмесине къарау",
        "action-sendemail": "E-mail джибериу",
        "action-editmywatchlist": "кёзде тургъан тизменги тюрлендириу",
        "action-viewmywatchlist": "кёзде тургъан тизменги кёрюу",
-       "nchanges": "$1 {{PLURAL:$1|тюрлениу|тюрлениу}}",
+       "nchanges": "$1 {{PLURAL:$1|тюрлениу}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ахыр кере киргенден бери}}",
        "enhancedrc-history": "тарих",
        "recentchanges": "Ахыр тюрлениуле",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле",
+       "rcfilters-other-review-tools": "<strong>Башха тинтиу адырла</strong>",
+       "rcfilters-activefilters": "Актив фильтрле",
+       "rcfilters-limit-shownum": "Ахыр {{PLURAL:$1|тюрлениуню}} кёргюзт",
+       "rcfilters-quickfilters-placeholder-title": "Сакъланнган джибериуле алкъын джокъдула",
+       "rcfilters-savedqueries-defaultlabel": "Сакъланнган фильтрле",
+       "rcnotefrom": "Тюбюрекде <strong>$3, $4</strong> башлаб (<strong>$1</strong> дери) {{PLURAL:$5|тюрлендириу}} кёрюнедиле",
        "rclistfrom": "$3 $2 башлаб джангы тюрлениулени кёргюз",
        "rcshowhideminor": "гитче тюрлениулени $1",
        "rcshowhideminor-show": "кёргюз",
        "newpageletter": "Дж",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|кёзюнде тутуучу къошулуучу}}]",
-       "rc_categories": "Категориялагъа юлеш («|» бла айыр)",
-       "rc_categories_any": "Ð\9aÑ\8aайсы да",
+       "rc_categories": "Къуру бу категорияладан («|» бла айыр):",
+       "rc_categories_any": "Сайланнгандан ÐºÑ\8aайÑ\81Ñ\8bсы да",
        "rc-change-size": "$1",
        "rc-change-size-new": "Тюрлениуден сора ёлчеми: $1 {{PLURAL:$1|байт}}",
        "newsectionsummary": "/* $1 */ Джангы бёлюм",
        "reuploaddesc": "Джюклеу формасына ызына къайт",
        "upload-tryagain": "Тюрлетилген файл ангылатыуну джибер",
        "uploadnologin": "Сиситемагъа кирмегенсиз",
-       "uploadnologintext": "Файлла джюклер ючюн [[Special:UserLogin|системагъа кирирге]] керексиз.",
+       "uploadnologintext": "Файлла джюклер ючюн $1 керекди.",
        "upload_directory_missing": "Джюклеу директория ($1) табылмайды эмда веб-сервер бла къуралалмайды.",
        "upload_directory_read_only": "Веб-сервер файл джюкленнегн ($1) папкагъа джазыу эркинлиги джокъду.",
        "uploaderror": "Джюклеуню хатасы",
        "upload-recreate-warning": "'''Эс бёлюгюз. Быллай аты бла файл кетерилген этгенди неда аты тюрленилиннгенди.'''\n\nБу бетге кетериуле бла ат тюрлендириулени журналы тюбюрекде бериледи:",
        "uploadtext": "Файл джюклер ючюн тюбюндеги форманы хайырлан.\nАлландан джюкленнген файлланы кёрюр неда излер ючюн [[Special:FileList|джюкленнген файлланы тизмесине]] къарагъыз, (джангыдан) джюкленнгенле [[Special:Log/upload|джюклеу журналында]], кетерилгенле [[Special:Log/delete|кетериу журналында]] тутуладыла.\n\nБетге файл салыр ючюн байлмыгъызда тюбюндеги формаларыны бирин хайырланыгъыз;\n* Файлны бютеу ёлчемини салыр ючюн: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''\n* Сол къыйрда бир тёртгюл ичинде, тюбюндеда ангылатыуу бла, 200 пиксел ёлчеми бла хайырландырыргъа излей эсегиз: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|тюбюнде ангылатыу]]</nowiki></code>'''\n* Файлны кёргюзмей, файлгъа дижбиреиу берирге излей эсегиз: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
-       "upload-permitted": "Эркинлик берилген файлланы типлери: $1.",
-       "upload-preferred": "Изленнген файлланы типлери: $1.",
-       "upload-prohibited": "Джасакъ этилген файлланы типлери: $1.",
+       "upload-permitted": "Эркинлик берилген файлланы {{PLURAL:$2|типи|типлери}}: $1.",
+       "upload-preferred": "Изленнген файлланы {{PLURAL:$2|типи|типлери}}: $1.",
+       "upload-prohibited": "Джасакъ этилген файлланы {{PLURAL:$2|типи|типлери}}: $1.",
        "uploadlogpage": "Джюклеулени журналы",
        "uploadlogpagetext": "Тюбюнде эм ахыр къошулгъан файлланы тизмеси барды.\nДагъыда [[Special:NewFiles|dosyalджангы файлланы галереясына]] къара, анда джангы джюклеулени юсюнден билгиле толу кёрюгюзюлгендиле.",
        "filename": "Файлны аты",
        "filetype-mime-mismatch": "«.$1» файл MIME-типге ($2) келишмейди.",
        "filetype-badmime": "«$1» MIME типли файлланы джюклениуюне эркинлик берлимейди.",
        "filetype-bad-ie-mime": "Internet Explorer, буну эркинлик берилмеген эмда потенциал заран берлик «$1» файл тип кибик таныгъаны ючюн бу файл джюклениллик тюлдю.",
-       "filetype-unwanted-type": "'''\".$1\"''' изленмеген файл типиди.\nИзленнген {{PLURAL:$3|1=файл тип|файл типле}} $2.",
-       "filetype-banned-type": "'''«.$1»''' — {{PLURAL:$4|1=джасакъланнган файл типди|джасакъланнган файл типледиле}}.\nЭркинлик берилген {{PLURAL:$3|1=файл тип|файл типле}}: $2.",
+       "filetype-unwanted-type": "'''«.$1»''' — изленмеген файл типди.\nИзленнген {{PLURAL:$3|1=файл тип|файл типле}} — $2.",
+       "filetype-banned-type": "'''«.$1»''' — {{PLURAL:$4|1=джасакъланнган файл типди|джасакъланнган файл типледиле}}.\nЭркинлик берилген {{PLURAL:$3|1=файл тип|файл типле}} — $2.",
        "filetype-missing": "Файлны кенглешиуу джокъду (сёз ючюн, «.jpg» кибик)",
        "empty-file": "Сиз ийген файл бошду.",
        "file-too-large": "Сиз ийген файл асыры уллуду.",
        "alllogstext": "{{SITENAME}} ючюн бютеу бар болгъан журналланы бирлешген тизмеси.\nЖурнал типини, къошулуучу атны (уллу-гитче харифге кёре) неда тийилген бетни (ол да уллу-гитче харифге кёре) элерге боллукъсуз.",
        "logempty": "Журналлагъа келишген билги джокъду.",
        "log-title-wildcard": "Бу символладан башланнган башлыкъланы изле",
+       "checkbox-select": "Сайлау: $1",
+       "checkbox-all": "Барын да",
+       "checkbox-none": "Бирин да",
+       "checkbox-invert": "Инвертле",
        "allpages": "Бютеу бетле",
        "nextpage": "Эндиги бет ($1)",
        "prevpage": "Алдагъы бет ($1)",
        "tooltip-search": "Бу сёзню изле",
        "tooltip-search-go": "Тамам быллай аты болгъан бетге кёч",
        "tooltip-search-fulltext": "Бу текст болгъан бетлени таб",
-       "tooltip-p-logo": "Баш бет",
+       "tooltip-p-logo": "Баш бетге кёчюу",
        "tooltip-n-mainpage": "Баш бетге кёчюу",
        "tooltip-n-mainpage-description": "Баш бетге кёчюу",
        "tooltip-n-portal": "Проектни юсюнден, сизни не этерге боллугъугъузню юсюнден, хар не къайда болгъаныны юсюнден",
        "confirmrecreate-noreason": "Сиз тюрлендириуле этген заманда [[User:$1|$1]] ([[User talk:$1|сюзюу]]) къошулуучу бу бетни кетергенди. Бетни кертиси бла ызына салыргъа излегенигизни бегитигиз.",
        "recreate": "Джанландыр",
        "unit-pixel": "пикс.",
+       "confirm-purge-title": "Бу бетни кэшы ариула",
        "confirm_purge_button": "OK",
-       "confirm-purge-top": "Бу бетни кеши кетерилсинми?",
+       "confirm-purge-top": "Бу бетни кэшы ариулансынмы?",
        "confirm-purge-bottom": "Бетни кеши кетерилгенден сора, андан сора келген версиясы кёргюзюллюкдю.",
        "confirm-watch-button": "ОК",
        "confirm-unwatch-button": "ОК",
        "fileduplicatesearch-result-n": "«$1» файлны {{PLURAL:$2|1 келишген дубликаты|$2 келишген дубликаты}} барды.",
        "fileduplicatesearch-noresults": "«$1» деген файл табылмады.",
        "specialpages": "Къуллукъ бетле",
-       "specialpages-note": "* Тюз къуллукъ бетле.\n* <span class=\"mw-specialpagerestricted\">Кирирге эркинлик чекленнген къуллукъ бетле.</span>",
        "specialpages-group-maintenance": "Техника баджарыуну отчетлары",
        "specialpages-group-other": "Башха къуллукъ бетле",
        "specialpages-group-login": "Системагъа кириу / Аккаунт къурау",
        "compare-rev2": "Экинчи версия",
        "compare-submit": "Тенглешдир",
        "compare-title-not-exists": "Белгиленнген башлыкъ джокъду.",
+       "diff-form": "'''форма'''",
        "dberr-problems": "Кечериксиз! Бу сайтда техника джаны бла проблемала чыкъгъандыла.",
        "dberr-again": "Талай минутну сакълаб, джангыдан кириб кёрюгюз.",
        "dberr-info": "(билги базаны сервери бла байлам къурулалмайды: $1)",
index 7b13861..e70fc8a 100644 (file)
        "recentchanges-submit": "Weisen",
        "rcfilters-tag-remove": "'$1' ewechhuelen",
        "rcfilters-legend-heading": "<strong>Lëscht vun Ofkierzungen:</strong>",
+       "rcfilters-group-results-by-page": "Resultater no de Säite gruppéieren",
        "rcfilters-grouping-title": "Gruppéieren",
        "rcfilters-activefilters": "Aktiv Filteren",
        "rcfilters-advancedfilters": "Erweidert Filteren",
        "rcfilters-filter-previousrevision-description": "All Ännerungen, déi net déi 'rezentst Versioun' vun enger Säit sinn.",
        "rcfilters-filter-excluded": "Ausgeschloss",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:net</strong> $1",
+       "rcfilters-exclude-button-on": "Déi Ausgewielt ausschléissen",
        "rcfilters-view-advanced-filters-label": "Erweidert Filteren",
        "rcfilters-view-tags": "Markéiert Ännerungen",
        "rcfilters-view-namespaces-tooltip": "Resultater no Nummraum filteren",
        "rcfilters-liveupdates-button-title-off": "Nei Ännerunge weisen esoubal wéi se gemaach ginn",
        "rcfilters-watchlist-markseen-button": "All Ännerungen als gesi markéieren",
        "rcfilters-watchlist-edit-watchlist-button": "Ännert Är Lëscht vun iwwerwaachte säiten",
+       "rcfilters-watchlist-showupdated": "Ännerungen op Säiten déi Dir net besicht hutt zanter d'Ännerunge gemaach goufen si <strong>fett</strong> geschriwwen.",
        "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter <strong>$3, $4</strong> (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfrom": "Nei Ännerunge vum $3 $2 u weisen",
        "rcshowhideminor": "Kleng Ännerunge $1",
index 446a372..8df8bb1 100644 (file)
@@ -39,7 +39,7 @@
        "tog-shownumberswatching": "Mostra la numero de usores oservante",
        "tog-oldsig": "Tua suscrive presente",
        "tog-fancysig": "Trata la suscrive como vicitesto (sin lia automatica)",
-       "tog-uselivepreview": "Usa un previde direta",
+       "tog-uselivepreview": "Mostra prevides sin recarga la paje",
        "tog-forceeditsummary": "Recorda me cuando entera un resoma vacua de edita",
        "tog-watchlisthideown": "Asconde me editas de la lista de pajes oservada",
        "tog-watchlisthidebots": "Asconde editas par bot de la lista de pajes oservada",
        "jumptosearch": "xerca",
        "view-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atenta vide esta paje.\nPer favore espeta ante cuanto tu atenta vide esta paje denova.\n\n$1",
        "generic-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atentante vide esta recurso.\nPer favore espeta ante cuando tu atenta vide esta recurso denova.",
+       "pool-errorunknown": "Era nonconoseda",
        "aboutsite": "Sur {{SITENAME}}",
        "aboutpage": "Project:Sur",
        "copyright": "La contenida es disponeda su $1, estra diferes notada.",
        "myprivateinfoprotected": "Tu no ave permete per edita tua informa privata.",
        "mypreferencesprotected": "Tu no ave permete per edita tua preferes.",
        "ns-specialprotected": "La pajes spesial no pote es editada.",
+       "logouttext": "<strong>Tu es aora desautenticida.</strong>\n\nNota ce cisa alga pajes va continua es mostrada como si tu ta es ancora autenticida asta cuando tu vacui la memoria de tua surfador.",
+       "cannotlogoutnow-title": "Tu no pote desautentici a presente",
+       "cannotlogoutnow-text": "Desautentici no es posible cuando tu usa $1.",
        "welcomeuser": "Bonveni, $1!",
+       "welcomecreation-msg": "Tua conta ia es creada.\nTu pote cambia tua {{SITENAME}} [[Special:Preferences|preferes]] si tu desira.",
        "yourname": "Nom de usor:",
        "userlogin-yourname": "Nom de usor",
        "userlogin-yourname-ph": "Entra tua nom de usor",
+       "createacct-another-username-ph": "Tape tua nom de usor",
        "yourpassword": "Sinia de entra:",
        "userlogin-yourpassword": "Parola secreta",
        "userlogin-yourpassword-ph": "Tape tua parola secreta",
        "createacct-yourpasswordagain": "Confirma la parola secreta",
        "createacct-yourpasswordagain-ph": "Retape la parola secreta",
        "userlogin-remembermypassword": "Manteni mea identifia",
-       "yourdomainname": "Tu domina:",
-       "login": "Identifia",
-       "nav-login-createaccount": "Sinia per entra",
-       "logout": "Retira",
-       "userlogout": "Sinia per retira",
+       "userlogin-signwithsecure": "Usa un lia secur",
+       "cannotlogin-title": "Autentici no es posible",
+       "cannotlogin-text": "Autentici no es posible.",
+       "cannotloginnow-title": "Autentici aora no es posible.",
+       "cannotloginnow-text": "Autentici no es posible cuando tu usa $1.",
+       "cannotcreateaccount-title": "Crea de contas no es posible",
+       "cannotcreateaccount-text": "La crea direta de contas no es comutada en esta vici.",
+       "yourdomainname": "Tua domina:",
+       "password-change-forbidden": "Tu no pote cambia tua clave en esta vici.",
+       "externaldberror": "O un era de autentici ia aveni en la banco de datos, o tu no es permeteda a refresci tua conta esterna.",
+       "login": "Autentici",
+       "login-security": "Confirma tua identia",
+       "nav-login-createaccount": "Autentici / crea un conta",
+       "logout": "Desautentici",
+       "userlogout": "Desautentici",
+       "notloggedin": "No autenticida",
        "userlogin-noaccount": "Tu no ave un conta?",
        "userlogin-joinproject": "Crea un conta de {{SITENAME}}",
        "createaccount": "Crea un conta",
        "userlogin-resetpassword-link": "Tu ia oblida tua parola secreta?",
        "userlogin-helplink2": "Aida sur identifia",
-       "createacct-emailrequired": "Adirije de e-posta",
-       "createacct-emailoptional": "Adirije de e-posta (si desirada)",
-       "createacct-email-ph": "Entra tua adirije de e-posta",
-       "createacct-another-email-ph": "Entra tua adirije de e-posta",
+       "userlogin-loggedin": "Tu ia autentici ja como {{GENDER:$1|$1}}.\nUsa la formulario a su per autentici como un otra usor.",
+       "userlogin-reauth": "Tu debe reautentici per confirma ce tu es {{GENDER:$1|$1}}.",
+       "userlogin-createanother": "Crea un conta nova",
+       "createacct-emailrequired": "Adirije de eposta",
+       "createacct-emailoptional": "Adirije de eposta (si desirada)",
+       "createacct-email-ph": "Tape tua adirije de eposta",
+       "createacct-another-email-ph": "Tape tua adirije de eposta",
+       "createaccountmail": "Usa un clave tempora e acaso, e envia lo a la adirije spesifada de eposta",
+       "createaccountmail-help": "On pote usa esta per crea un conta per un otra person sin descovre la clave.",
+       "createacct-realname": "Nom vera (si desirada)",
        "createacct-reason": "Razona:",
+       "createacct-reason-ph": "Perce tu crea un conta nova",
        "createacct-submit": "Crea tua conta",
        "createacct-another-submit": "Crea un conta",
+       "createacct-continue-submit": "Continua la crea de conta",
+       "createacct-another-continue-submit": "Continua la crea de conta",
        "createacct-benefit-heading": "{{SITENAME}} es realida par persones como tu.",
        "createacct-benefit-body1": "{{PLURAL:$1|edita|editas}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paje|pajes}}",
        "nosuchuser": "On no ave un usor con la nom \"$1\".\nOn distingui entre leteras major e minor per nomes de usores.\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
        "nosuchusershort": "Es no usor con esta nom \"$1\". Esamina la spele.",
        "nouserspecified": "Tu debe indica un nom de usor.",
+       "login-userblocked": "Esta usor es impedida. Autentici no es permeteda.",
        "wrongpassword": "La sinia de entra no es coreta. Per favore, atenta ancora.",
        "wrongpasswordempty": "La sinia de entra es vacua. Per favore, atenta ancora.",
        "passwordtooshort": "Sinias secreta debe ave minima {{PLURAL:$1|1 simbol|$1 simboles}}.",
        "passwordtoolong": "Sinias secreta no pote ave plu ca {{PLURAL:$1|1 simbol|$1 simboles}}.",
        "passwordtoopopular": "Sinias secreta comun debe no es usada. Per favore, eleje un sinia plu unica.",
+       "password-name-match": "Tua clave debe es diferente de tua nom de usor.",
        "mailmypassword": "Cambia tua sinia secreta",
        "passwordremindertitle": "Sinia secreta temporer nova per {{SITENAME}}",
        "passwordremindertext": "Algun (tu, probable, de adirije IP $1)\nia demanda un sinia secreta nova per {{SITENAME}} ($4).\nLa sinia secreta tempora per usor \"$2\" es aora \"$3\". Si esta ia es tua intende, tu debe identifia tu denova per entra e eleje tua sinia nova aora.\nTua sinia tempora va desvalidi en {{PLURAL:$5|un dia|$5 dias}}.\n\nSi algun otra ca tu ia envia esta demanda a nos, o si tu ia recorda tua sinia secreta e no vole cambia lo aora, tu pote iniora esta mesaje e continua usa tua sinia secreta vea.",
        "noemail": "No es un adirije de eposta per usor \"$1\".",
        "passwordsent": "Un sinia secreta ia es enviada a la adirije de eposta per \"$1\".\nPer favore, sinia per entra ancora pos tu ia reseta el.",
        "eauthentsent": "Un eposta de serti ia es enviada a la adirije de eposta spesifada.\nAnte cualce otra epostas es enviada a tua conta, tu va nesesa segue la instruis en la eposta, per serti ce la conta es vera la tua.",
+       "mailerror": "Era en envia eposta: $1",
+       "acct_creation_throttle_hit": "Visitores a esta vici, usante tua adirije IP, ia crea {{PLURAL:$1|1 conta|$1 contas}} en la $2 la plu resente, cual es la masima permeteda en esta periodo.\nComo resulta, visitores con esta adirije IP no pote crea plu contas a esta tempo.",
        "emailconfirmlink": "Aproba tu adirije de eposta",
        "accountcreated": "Conta es creada",
        "loginlanguagelabel": "Lingua: $1",
        "pt-login": "Identifia se",
        "pt-login-button": "Identifia",
+       "pt-login-continue-button": "Continua autentici",
        "pt-createaccount": "Crea un conta",
        "pt-userlogout": "Desidentifia",
        "oldpassword": "Sinia secreta vea:",
        "newpassword": "Sinia secreta nova:",
        "retypenew": "Re-entra tu sinia secreta nova:",
+       "resetpass_submit": "Fisa la clave e autentici tu",
+       "changepassword-success": "Tua clave ia es cambiada!",
+       "changepassword-throttled": "Tu ia fa resente tro multe atentas de autentici.\nPer favore, pausa per $1 ante atenta denova.",
+       "botpasswords": "Claves de bot",
+       "botpasswords-summary": "<em>Claves de bot</em> permete ce on asede un conta de usor par API sin usa la identia xef de la conta. La diretos de usor disponable pos autentici par clave de bot es cisa restrinjeda.\n\nSi tu no sabe perce on ta vole fa esta, probable tu debe no fa lo. Nunca un otra person debe demanda ce tu jenera un de estas e dona lo a el.",
+       "botpasswords-no-central-id": "Per usa claves de bot, tu debe es autenticida con conta sentral.",
+       "botpasswords-existing": "Claves esistente de bot",
+       "botpasswords-createnew": "Crea un clave nova de bot",
+       "botpasswords-editexisting": "Edita un clave esistente de bot",
+       "botpasswords-label-appid": "Nom de bot:",
+       "botpasswords-label-create": "Crea",
+       "botpasswords-label-update": "Fisa",
+       "botpasswords-label-cancel": "Cansela",
+       "botpasswords-label-delete": "Sutrae",
+       "botpasswords-label-resetpassword": "Reinisia la clave",
+       "botpasswords-label-grants": "Permetes pertinente:",
+       "botpasswords-help-grants": "Permetes fa ce diretos ja pertinente a tua conta de usor deveni usable. La comuta de un permete asi no afeta diretos cual tua conta de usor no ave. Vide la [[Special:ListGrants|table de permetes]] per plu informas.",
+       "botpasswords-label-grants-column": "Permeteda",
+       "botpasswords-bad-appid": "La nom de bot \"$1\" no es valida.",
+       "botpasswords-insert-failed": "La clave de bot \"$1\" no ia pote es ajuntada. Esce on ia ajunta ja lo?",
+       "botpasswords-update-failed": "La clave de bot \"$1\" no ia pote es cambiada. Esce on ia sutrae lo?",
+       "botpasswords-created-title": "Clave de bot creada",
+       "botpasswords-created-body": "La clave de bot \"$1\" de usor \"$2\" ia es creada.",
+       "botpasswords-updated-title": "Clave de bot cambiada",
+       "botpasswords-updated-body": "La clave de bot \"$1\" de usor \"$2\" ia es cambiada.",
+       "resetpass_forbidden": "Claves no pote es cambiada",
+       "resetpass_forbidden-reason": "Claves no pote es cambiada: $1",
+       "resetpass-no-info": "Tu debe es autenticida per asede direta esta paje.",
        "resetpass-submit-loggedin": "Cambia la sinia secreta",
-       "resetpass-temp-password": "Sinia secreta tempora:",
-       "passwordreset": "Reinisia tua parola secreta",
+       "resetpass-submit-cancel": "Cansela",
+       "resetpass-wrong-oldpass": "La clave tempora o presente es nonvalida.\nCisa tu ia cambia ja tua clave o ia solisita un clave tempora nova.",
+       "resetpass-recycled": "Per favore, cambia tua clave a alga cosa diferente de tua clave presente.",
+       "resetpass-temp-emailed": "Tu ia autentici con un clave tempora epostada.\nPer fini autentici, tu debe defini un clave nova asi:",
+       "resetpass-temp-password": "Clave tempora:",
+       "resetpass-abort-generic": "La cambia de clave ia es abortada par un estendente.",
+       "resetpass-expired": "Tua clave es no plu valida. Per favore, defini un clave nova per autentici.",
+       "resetpass-expired-soft": "Tua clave es no plu valida e nesesa es reinisiada. Per favore, eleje aora un clave nova, o clica \"{{int:authprovider-resetpass-skip-label}}\" per reinisia plu tarda lo.",
+       "resetpass-validity-soft": "Tua clave es no plu valida: $1\n\nPer favore, eleje aora un clave nova, o clica \"{{int:authprovider-resetpass-skip-label}}\" per reinisia plu tarda lo.",
+       "passwordreset": "Reinisia clave",
+       "passwordreset-text-one": "Completi esta formulario per reseta un clave tempora par eposta.",
+       "passwordreset-text-many": "{{PLURAL:$1|Completi un de la campos per reseta un clave tempora par eposta.}}",
+       "passwordreset-disabled": "Reinisias de clave es descomutada en esta vici.",
+       "passwordreset-emaildisabled": "Capasias de eposta es descomutada en esta vici.",
        "passwordreset-username": "Nom de usor:",
        "passwordreset-domain": "Domina:",
        "passwordreset-email": "Adirije de e-posta",
-       "passwordreset-invalidemail": "Adirije de e-posta no es valida",
-       "changeemail-submit": "Cambia e-posta",
-       "bold_sample": "Testo en leteras spesa",
-       "bold_tip": "Testo en leteras spesa",
-       "italic_sample": "Testo en leteras apoiada",
-       "italic_tip": "Testo en leteras apoiada",
+       "passwordreset-emailtitle": "Detalias de conta de {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Algun (probable tu, de adirije IP $1) ia solisita un reinisia de tua\nclave per {{SITENAME}} ($4). La {{PLURAL:$3|conta|contas}} de usor seguente es\nasosiada con esta adirije de eposta:\n\n$2\n\nEsta {{PLURAL:$3|clave|claves}} tempora va desvalidi pos {{PLURAL:$5|un dia|$5 dias}}.\nTu debe autentici aora e eleje un clave nova. Si un otra person ia fa\nesta solisita, o si tu ia recorda tua clave orijinal e no vole\naora cambia lo, tu pote iniora esta mesaje e continua usa\ntua clave vea.",
+       "passwordreset-emailtext-user": "Usor $1 en {{SITENAME}} ia solisita un reinisia de tua\nclave per {{SITENAME}} ($4). La {{PLURAL:$3|conta|contas}} de usor seguente es\nasosiada con esta adirije de eposta:\n\n$2\n\nEsta {{PLURAL:$3|clave|claves}} tempora va desvalidi pos {{PLURAL:$5|un dia|$5 dias}}.\nTu debe autentici aora e eleje un clave nova. Si un otra person ia fa\nesta solisita, o si tu ia recorda tua clave orijinal e no vole\naora cambia lo, tu pote iniora esta mesaje e continua usa\ntua clave vea.",
+       "passwordreset-emailelement": "Nom de usor:\n$1\n\nClave tempora:\n$2",
+       "passwordreset-emailsentemail": "Si esta adirije de eposta es asosiada con tua conta, alora on va envia un eposta de reinisia de clave.",
+       "passwordreset-emailsentusername": "Si un adirije de eposta es asosiada con esta nom de usor, alora on va envia un eposta de reinisia de clave.",
+       "passwordreset-nocaller": "On nesesa furni un clamor",
+       "passwordreset-nosuchcaller": "Clamor no esiste: $1",
+       "passwordreset-ignored": "La reinisia de clave no ia susede. Cisa no furnor es definida?",
+       "passwordreset-invalidemail": "La adirije de eposta es nonvalida",
+       "passwordreset-nodata": "On ia furni no nom de usor e no adirije de eposta",
+       "changeemail": "Cambia o sutrae adirije de eposta",
+       "changeemail-header": "Completi esta formulario per cambia tua adirije de eposta. Si tu vole sutrae tota asosias de adirije de eposta de tua conta, lasa vacua la adirije nova cuando tu envia la formulario.",
+       "changeemail-no-info": "Tu debe es autenticida per asede direta esta paje.",
+       "changeemail-oldemail": "Adirije de eposta presente:",
+       "changeemail-newemail": "Adirije de eposta nova:",
+       "changeemail-newemail-help": "Lasa vacua esta campo si tu vole sutrae tua adirije de eposta. Si tu sutrae la adirije de eposta, tu no va pote reinisia un clave oblidada, e no va reseta epostas de esta vici.",
+       "changeemail-none": "(vacua)",
+       "changeemail-password": "Tua clave de {{SITENAME}}:",
+       "changeemail-submit": "Cambia eposta",
+       "changeemail-throttled": "Tu ia fa tro multe atentas de autentici.\nPer favore, pausa per $1 ante atenta denova.",
+       "changeemail-nochange": "Tape un adirije de eposta nova, per favore.",
+       "resettokens": "Reinisia marcas",
+       "resettokens-text": "Asi, tu pote reinisia marcas cual permete asede alga datos privata cual pertine a tua conta.\n\nTu debe fa esta si tu ia comparti los con algun sin intende, o si tua conta ia es atacada.",
+       "resettokens-no-tokens": "No marcas esiste per reinisia.",
+       "resettokens-tokens": "Marcas:",
+       "resettokens-token-label": "$1 (valua presente: $2)",
+       "resettokens-watchlist-token": "Marca per la flue ueb (Atom/RSS) de [[Special:Watchlist|cambias a tua pajes monitorida]]",
+       "resettokens-done": "Marcas reinisiada.",
+       "resettokens-resetbutton": "Reinisia marcas elejeda",
+       "bold_sample": "Testo spesa",
+       "bold_tip": "Testo spesa",
+       "italic_sample": "Testo apoiada",
+       "italic_tip": "Testo apoiada",
        "link_sample": "Titulo de lia",
        "link_tip": "Lia interna",
        "extlink_sample": "http://www.example.com titulo de lia",
        "sig_tip": "Tua suscrive con marca de ora",
        "hr_tip": "Linia orizonal (per usas rara)",
        "summary": "Resoma:",
-       "subject": "Sujeto:",
+       "subject": "Tema:",
        "minoredit": "Esta es un cambia minor",
        "watchthis": "Monitori esta paje",
        "savearticle": "Fisa la paje",
+       "savechanges": "Fisa cambias",
        "publishpage": "Publici paje",
        "publishchanges": "Publica la cambias",
        "preview": "Previde",
        "showpreview": "Mostra previde",
        "showdiff": "Mostra diferes",
+       "blankarticle": "<strong>Avisa:</strong> La paje cual tu crea es vacua.\nSi tu clica \"$1\" denova, la paje va es creada sin contenida.",
        "anoneditwarning": "<strong>Avisa:</strong> Tu no ia identifia tu. Tua adirije IP va es publica vidable si tu fa un edita. Si tu <strong>[$1 identifia tu]</strong> o <strong>[$2 crea un conta]</strong>, tua editas va es atribuida a tua nom de usor, entre otra beneficas.",
-       "summary-preview": "Previde soma:",
+       "missingcommenttext": "Tape un comenta a su, per favore.",
+       "missingcommentheader": "<strong>Avisa:</strong> Tu no ia furni un tema per esta comenta.\nSi tu clica \"$1\" denova, tua edita va es fisada sin tema.",
+       "summary-preview": "Previde de resoma:",
+       "subject-preview": "Previde de tema:",
+       "previewerrortext": "Un era ia aveni en atenta previde tua cambias.",
        "blockedtitle": "Usor es impedida",
        "blockedtext": "'''Tua nom de usor o adirije IP es impedida.'''\n\nLa impedi ia es fada par $1.\nLa razona donada es ''$2''.\n\n* Comensa de impedi: $8\n* Fini de impedi: $6\n* Conta impedida: $7\n\nTu pote contata $1 o un otra [[{{MediaWiki:Grouppage-sysop}}|dirijor]] per discute esta impedi.\nTu no pote usa la funsiona \"envia un e-posta a esta usor\" estra si un adirije valida de e-posta legal es spesifada en tua [[Special:Preferences|preferes de conta]] e tu no es impedida de usa lo.\nTua adirije IP presente es $3, e la numero de impedi es #$5.\nInclui tota esta detalias en cualce demandas cual tu fa, per favore.",
+       "autoblockedtext": "<strong>Tua nom de usor o adirije IP es impedida.</strong>\n\nLa impedi ia es fada par $1.\nLa razona donada es ''$2''.\n\n* Comensa de impedi: $8\n* Fini de impedi: $6\n* Conta impedida: $7\n\nTu pote contata $1 o un otra [[{{MediaWiki:Grouppage-sysop}}|dirijor]] per discute esta impedi.\nTu no pote usa la funsiona \"envia un eposta a esta usor\" estra si un adirije valida\nde eposta es spesifada en tua [[Special:Preferences|preferes de conta]] e tu no es impedida de usa lo.\nTua adirije IP presente es $3, e la numero de impedi es #$5.\nInclui tota esta detalias en cualce demandas cual tu fa, per favore.",
+       "systemblockedtext": "\nTua nom de usor o adirije IP ia es automata impedida par MediaWiki.\nLa razona donada es <em>$2</em>.\n\n* Comensa de impedi: $8\n* Fini de impedi: $6\n* Conta impedida: $7\n\\Tua adirije IP presente es $3.\nInclui tota esta detalias en cualce demandas cual tu fa, per favore.",
+       "blockednoreason": "no razona donada",
+       "whitelistedittext": "Per favore, $1 per edita pajes.",
+       "confirmedittext": "Tu debe confirma tua adirije de eposta ante edita pajes.\nPer favore, defini e validi tua adirije de eposta en tua [[Special:Preferences|preferes]].",
+       "nosuchsectiontitle": "Parte no trovada",
+       "nosuchsectiontext": "Tu ia atenta edita un parte cual no esiste.\nCisa on ia move o sutrae lo en cuando tu ia regarda la paje.",
        "loginreqtitle": "Entra de identia nesesada",
-       "loginreqlink": "identifia",
+       "loginreqlink": "autentici",
+       "loginreqpagetext": "Per favore, $1 per regarda otra pajes.",
+       "accmailtitle": "Clave enviada",
+       "accmailtext": "On ia envia un clave acaso jenerada per [[User talk:$1|$1]] a $2. Pos autentici, tu pote cambia esta a la paje de <em?[[Special:ChangePassword|cambia de clave]]</em>.",
        "newarticle": "(Nova)",
        "newarticletext": "Tu ia segue un lia a un paje cual ancora no esista. Per crea la paje, comensa tape en la caxa a su (vide la [$1 paje de aida] per plu informa).\nSi tu ia veni asi par era, clica la boton <strong>retro</strong> de tua surfador.",
        "anontalkpagetext": "<em>Esta es la paje de discute per un usor anonim ci ancora no ia crea un conta, o ci no usa lo.</em>\n Donce nos identifia el par adirije IP numeral.\nUn tal adirije pote es compartida par plu ca un usor.\nSi tu es un usor anonim e opina ce on ia dirije comentas nonpertinente a tu, per favore [[Special:CreateAccount|crea un conta]] o [[Special:UserLogin|identifia tu]] per evita confusas futur con otra usores anonim.",
        "noarticletext": "No testo esiste en esta paje. Tu pote [[Special:Search/{{PAGENAME}}|xerca la titulo de esta paje]] en otra pajes, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca en la arcivos relatada], o [{{fullurl:{{FULLPAGENAME}}|action=edit}} crea esta paje]</span>.",
        "noarticletext-nopermission": "No testo esiste en esta paje. Tu pote [[Special:Search/{{PAGENAME}}|xerca esta titulo de paje]] en otra pajes, o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca en arcivos relatada]</span>, ma on no permete ce tu crea esta paje.",
+       "missing-revision": "La revisa $1 de la paje nomida \"{{FULLPAGENAME}}\" no esiste.\n\nEsta es usual causada par segue un lia nonfresca de istoria a un paje cual on ia sutrae.\nDetalias es trovable en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistra de sutraes].",
+       "userpage-userdoesnotexist": "Conta de usor \"$1\" no es rejistrada.\nPer favore, deside esce tu vole crea/edita esta paje.",
        "userpage-userdoesnotexist-view": "La conta de usor \"$1\" no es rejistrada",
+       "blocked-notice-logextract": "Esta usor es impedida a presente.\nLa entrada la plu resente en la rejistra de impedis es presentada a su per clari:",
        "clearyourcache": "<strong>Nota:</strong> Pos fisa, tu debe cisa sircoveni la memoria de tua surfador per vide la cambias.\n* <strong>Firefox / Safari:</strong> Presa la tecla <em>Maj</em> (<em>Shift</em>) e clica <em>Refresci</em>, o presa o <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> a Mac)\n* <strong>Google Chrome:</strong> Presa <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> a Mac)\n* <strong>Internet Explorer:</strong> Presa <em>Ctrl</em> e clica <em>Refresci</em>, o presa <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vade a <em>Menu → Settings</em> (<em>Opera → Preferences</em> a Mac) e de ala a <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "usercssyoucanpreview": "<strong>Aviseta:</strong> Usa la boton \"{{int:showpreview}}\" per proba tua CSS nova ante fisa.",
+       "userjsyoucanpreview": "<strong>Aviseta:</strong> Usa la boton \"{{int:showpreview}}\" per proba tua JavaScript nova ante fisa.",
+       "usercsspreview": "<strong>Recorda ce tu regarda mera un previde de tua CSS de usor.\nLo es ancora no fisada!</strong>",
+       "userjspreview": "<strong>Recorda ce tu regarda mera un proba/previde de tua JavaScript de usor.\nLo es ancora no fisada!</strong>",
+       "sitecsspreview": "<strong>Recorda ce tu regarda mera un previde de esta CSS.\nLo es ancora no fisada!</strong>",
+       "sitejspreview": "<strong>Recorda ce tu regarda mera un previde de esta codigo JavaScript.\nLo es ancora no fisada!</strong>",
+       "userinvalidcssjstitle": "<strong>Avisa:</strong> No pel \"$1\" esiste.\nPajes .css e .js personal usa un titulo con leteras minor, pe {{ns:user}}:Foo/vector.css en loca de {{ns:user}}:Foo/Vector.css.",
+       "updated": "(Cambiada)",
+       "note": "<strong>Nota:</strong>",
        "previewnote": "<strong>Recorda ce esta es sola un previde.</strong> Tua cambias es ancora no fisada!",
        "continue-editing": "Vade a la loca de edita",
+       "previewconflict": "Esta previde refleta la testo en la caxa alta de edita, como lo va apare si tu eleje fisa.",
+       "session_fail_preview": "Pardona! Nos no ia pote trata tua edita par causa de un perde de datos de sesion.\n\nCisa tu ia deveni desautenticida. <strong>Per favore, serti ce tu es ancora autenticida e atenta denova.</strong>\nSi lo ancora no susede, proba [[Special:UserLogout|desautentici]] e reautentici, e serti ce tua surfador permete cucis de esta pajeria.",
+       "session_fail_preview_html": "Pardona! Nos no ia pote trata tua edita par causa de un perde de datos de sesion.\n\n<em>Car {{SITENAME}} ia comuta la usa cru de HTML, la previde es ascondeda per defende contra atacas par JavaScript.</em>\n\n<strong>Si esta es un atenta vera de edita, atenta denova, per favore.</strong>\nSi lo ancora no susede, proba [[Special:UserLogout|desautentici]] e reautentici, e serti ce tua surfador permete cucis de esta pajeria.",
+       "token_suffix_mismatch": "<strong>Tua edita ia es refusada car tua surfador ia malfa la sinias de puntua en la marca de edita.</strong>\nLa edita ia es refusada per preveni mali de la testo de la paje.\nEsta aveni a veses si on usa un proxi ueb anonim e defetosa.",
+       "edit_form_incomplete": "<strong>Alga partes de la formulario de edita no ia ateni la servador; serti ce tua editas es intata e atenta denova.</strong>",
        "editing": "Editante $1",
        "creating": "Creante $1",
        "editingsection": "Editante $1 (un parte)",
        "editingcomment": "Edita $1 (sesion nova)",
+       "editconflict": "Desacorda de editas: $1",
+       "explainconflict": "Un otra usor ia cambia esta paje pos cuando tu ia comensa edita lo.\nLa caxa alta de testo conteni la paje como lo esiste a presente.\nTua cambias apare en la caxa basa de testo.\nTu debe fusa tua cambias con la testo esistente.\n<strong>Sola</strong> la testo en la caxa alta va es fisada cuando tu clica \"$1\".",
+       "yourtext": "Tua testo",
+       "storedversion": "Testo esistente",
+       "nonunicodebrowser": "<strong>Avisa: Tua surfador no comprende Unicode.</strong>\nUn solve tempora es ativida per permete ce tu edita pajes sin problem: Sinias estra ASCII va apare en la caxa de edita como codigos exadesimal.",
+       "editingold": "<strong>Avisa: Tu edita un revisa nonfresca de esta paje.</strong>\nSi tu fisa lo, cualce cambias fada pos esta revisa va es perdeda.",
        "yourdiff": "Diferes",
-       "copyrightwarning": "Per favore nota ce tota labora a {{SITENAME}} es judida ce el es relasada su la $2 (vide $1 per detalias). Si tu no desira ce tu scrives ta es editada sin compati e redistribui sin tu permite, no sumita el asi!<br />\nTu ance promete a nos ce tu ia scriveda esta par tu mesma, o copiada esta de un domina publica o otra orijin libre.\n'''NO SUMITA LABORA SU DIRETOS DE AUTOR SIN PERMITE!!'''",
+       "copyrightwarning": "Per favore, nota ce tota contribuis a {{SITENAME}} es regardada como relasada su la $2 (vide $1 per detalias). Si tu no desira ce on edita tua scrives sin compatia e redistribui libre los, alora no ajunta los asi.<br />\nTu promete ance a nos ce tu mesma ia scrive esta, o ia copia lo de un recurso de domina publica o simil libre.\n<strong>No ajunta testo restrinjeda par direto de autor sin permete!</strong>",
+       "copyrightwarning2": "Per favore, nota ce tota contribuis a {{SITENAME}} pote es editada, alterada o sutraeda par otra contribuores.\nSi tu no desira ce on edita tua scrives sin compatia, alora no ajunta los asi.<br />\nTu promete ance a nos ce tu mesma ia scrive esta, o ia copia lo de un recurso de domina publica o simil libre.\n<strong>No ajunta testo restrinjeda par direto de autor sin permete!</strong>",
+       "editpage-cannot-use-custom-model": "La model de contenida de esta paje no pote es cambiada.",
+       "longpageerror": "<strong>Era: La testo cual tu ia envia ave un longia de {{PLURAL:$1|un cilobait|$1 cilobaites}}, cual es plu ca la masima de {{PLURAL:$2|un cilobait|$2 cilobaites}}.</strong>\nLo no pote es fisada.",
+       "readonlywarning": "<strong>Avisa:</strong> La banco de datos es cluida per manteni, donce tu no va pote fisa tua editas a esta tempo.</strong>\nCisa tu ta vole copia e coli tua testo a un fix de testo e fisa lo per plu tarda.\n\nLa dirijor ci ia fa la clui ia ofre esta esplica: $1",
        "templatesused": "{{PLURAL:$1|Modele|Modeles}} usada en esta paje:",
        "templatesusedpreview": "{{PLURAL:$1|Stensil|Stensiles}} usada en esta previde:",
        "template-protected": "(protejeda)",
        "template-semiprotected": "(partal protejeda)",
        "hiddencategories": "Esta paje es un membro de {{PLURAL:$1|1 categoria ascondeda|$1 categorias ascondeda}}:",
        "nocreatetext": "{{SITENAME}} ave un restringe a la capas per crea pajes nova.\nTu pote vade a retro e edita un paje esistente, o  [[Special:UserLogin|sinia per entra o crea un conta]].",
+       "nocreate-loggedin": "Tu no es permeteda a crea pajes nova.",
+       "sectioneditnotsupported-title": "La edita de partes no es suportada",
        "permissionserrors": "Era de permete",
        "permissionserrorstext-withaction": "Tu no pote $2, per la {{PLURAL:$1|razona|razonas}} seguente:",
        "recreate-moveddeleted-warn": "<strong>Avisa: Tu recrea un paje cual on ia sutrae a ante.</strong>\n\nConsidera esce lo conveni ce tu continua edita esta paje. La arcivos de sutrae e move per la paje es presentada asi per aida:",
-       "moveddeleted-notice": "On ia sutrae esta paje. La arcivos de sutrae e move per la paje es presentada a su per clari.",
+       "moveddeleted-notice": "On ia sutrae esta paje. La rejistras de sutrae e move per la paje es presentada a su per clari.",
        "content-model-wikitext": "vicitesto",
+       "content-model-text": "testo plata",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Ojeto vacua",
+       "content-json-empty-array": "Lista vacua",
+       "deprecated-self-close-category": "Pajes con eticetas HTML autocluinte nonvalida",
+       "deprecated-self-close-category-desc": "La paje conteni eticetas HTML autocluinte nonvalida, como <code>&lt;b/></code> o <code>&lt;span/></code>. La condui de estas va cambia en la futur prosima per coere con la spesifa HTML5, donce on desaproba usa los en vicitesto.",
+       "duplicate-args-warning": "<strong>Averti:</strong> [[:$1]] clama [[:$2]] con plu ca un valua per la parametre \"$3\". Sola la valua final furnida va es usada.",
+       "duplicate-args-category": "Pajes con parametres duplida en clamas de stensil",
+       "parser-unstrip-recursion-limit": "Esede de la recorsa masima de unstrip ($1)",
+       "converter-manual-rule-error": "Era detetada en regula nonautomata de converti de lingua",
+       "undo-success": "La edita pote es desfada.\nPer favore, esamina la compara a su per serti ce tu vole fa esta, e alora fisa la cambias a su per fini desfa la edita.",
        "undo-failure": "Esta edita no pote es desfada par causa de editas interveninte cual contradise lo.",
+       "undo-norev": "La edita no pote es desfada car lo no esiste o ia es sutraeda.",
+       "undo-nochange": "Lo pare ce la edita es ja desfada.",
        "viewpagelogs": "Mostra la arcivos per esta paje",
        "currentrev": "Cambia presente",
        "currentrev-asof": "Revisa la plu resente de $1",
        "history-feed-item-nocomment": "$1 a $2",
        "rev-delundel": "mostra/asconde",
        "rev-showdeleted": "mostra",
+       "revdelete-nooldid-title": "Revisa destinal nonvalida",
        "revdelete-show-file-submit": "Si",
        "revdelete-radio-set": "Ascondeda",
        "revdelete-radio-unset": "Vidable",
+       "revdelete-log": "Razona:",
        "pagehist": "Istoria de paje",
        "deletedhist": "Istoria sutraeda",
+       "mergehistory-from": "Paje fontal:",
+       "mergehistory-into": "Paje destinal:",
+       "mergehistory-list": "Istoria fusable de editas",
+       "mergehistory-merge": "La revisas seguente de [[:$1]] pote es fusada con [[:$2]].\nUsa la colona de botones de radio per fusa sola la revisas creada a e ante la tempo spesifada.\nNota ce si tu usa la lias de naviga, esta colona va es reinisiada.",
+       "mergehistory-go": "Mostra editas fusable",
+       "mergehistory-submit": "Fusa revisas",
+       "mergehistory-empty": "No revisas pote es fusada.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisa|revisas}} de $1 ia es fusada con [[:$2]].",
+       "mergehistory-fail-bad-timestamp": "La indica de ora no es valida.",
+       "mergehistory-fail-invalid-source": "La paje fontal no es valida.",
+       "mergehistory-fail-invalid-dest": "La pajes destinal no es valida.",
+       "mergehistory-fail-no-change": "La fusa de istoria ia fusa no revisas. Per favore, reesamina la parametres de paje e tempo.",
+       "mergehistory-invalid-destination": "La paje destinal debe es un titulo valida.",
+       "mergehistory-autocomment": "[[:$1]] ia es fusada con [[:$2]]",
+       "mergehistory-comment": "[[:$1]] ia es fusada con [[:$2]]: $3",
+       "mergehistory-same-destination": "La pajes fontal e destinal no pote es la mesma.",
+       "mergehistory-reason": "Razona:",
        "mergelog": "Fusa arcivo",
+       "revertmerge": "Desfusa",
+       "mergelogpagetext": "A su es un lista de la fusas la plu resente de la istoria de un paje con un otra.",
        "history-title": "Istoria de revisas de \"$1\"",
        "difference-title": "Difere entre revisas de \"$1\"",
        "lineno": "Linia $1:",
        "diff-multi-otherusers": "({{PLURAL:$1|Un revisa media|$1 revisas media}} par {{PLURAL:$2|un otra usor|$2 usores}} no es mostrada)",
        "searchresults": "Trovadas",
        "searchresults-title": "Trovadas per \"$1\"",
+       "titlematches": "Trovadas en titulo de paje",
+       "textmatches": "Trovadas en testo de paje",
+       "notextmatches": "No resultas trovada",
        "prevn": "{{PLURAL:$1|$1}} presedente",
        "nextn": "{{PLURAL:$1|$1}} seguente",
+       "prev-page": "paje presedente",
+       "next-page": "paje seguente",
        "prevn-title": "$1 {{PLURAL:$1|resulta|resultas}} presedente",
        "nextn-title": "$1 {{PLURAL:$1|resulta|resultas}} seguente",
        "shown-title": "Mostra $1 {{PLURAL:$1|resulta|resultas}} en cada paje",
        "searchall": "tota",
        "search-showingresults": "{{PLURAL:$4|Resulta <strong>$1</strong> de <strong>$3</strong>|Resultas <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "No resultas ia es trovada per la xerca.",
+       "powersearch-legend": "Xerca avansada",
+       "powersearch-ns": "Xerca en spasios de nom:",
+       "powersearch-togglelabel": "Eleje:",
        "powersearch-toggleall": "Tota",
        "powersearch-togglenone": "Zero",
+       "powersearch-remember": "Memori la eleje per xercas futur",
+       "search-external": "Xerca esterna",
        "preferences": "Preferis",
        "mypreferences": "Preferes",
        "skin-preview": "Previde",
        "prefs-help-realname": "Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.\n\nTu no debe entra tua nom vera. Ma si tu entra tua noma vera, lo pote es usada per atribui tua laboras a tu.",
        "prefs-signature": "Suscrive",
        "userrights": "Dirije de la diretos de usores",
-       "saveusergroups": "Fisa la grupo de usores",
+       "saveusergroups": "Fisa la grupo de {{GENDER:$1|usor}}",
        "group": "Grupo:",
        "group-user": "Usores",
        "group-bot": "Botes",
        "ancientpages": "Pajes la plu vea",
        "move": "Move",
        "movethispage": "Move esta paje",
-       "unusedimagestext": "<p>Nota ce otra locas de rede pote lia a un imaje con un URL direta, e donce el pote continua es listada asi contra ce el es usada ativa.</p>",
+       "unusedimagestext": "La fixes seguente esiste ma no apare en un paje.\nPer favore, nota ce otra pajerias pote usa un URL direta per lia a un imaje, donce los pote continua es listada asi an si vera usada.",
        "unusedcategoriestext": "La categorias seguente esiste sin es usada par otra articles o categorias.",
        "pager-newer-n": "{{PLURAL:$1|1 plu resente|$1 plu resentes}}",
        "pager-older-n": "{{PLURAL:$1|1 plu vea|$1 plu veas}}",
        "restriction-edit": "Edita",
        "restriction-move": "Move",
        "undelete": "Restora paje sutraeda",
+       "undeletepage": "Regarda e restora pajes sutraeda",
+       "undeletepagetitle": "<strong>La seguente es composada de revisas sutraeda de [[:$1|$1]]</strong>.",
+       "viewdeletedpage": "\nRegarda pajes sutraeda",
+       "undeletepagetext": "La {{PLURAL:$1|paje|$1 pajes}} seguente es sutraeda ma ancora en la arcivo e pote es rejistrada.\nLa arcivo es cisa periodal vacuida.",
+       "undelete-fieldset-title": "Restora revisas",
+       "undeleteextrahelp": "Per restora la istoria intera de la paje, desmarca tota caxas e clica <strong><em>{{int:undeletebtn}}</em></strong>.\nPer fa un restora partal, marca la caxas corespondente a la revisas cual tu vole restora, e clica <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleterevisions": "$1 {{PLURAL:$1|revisa|revisas}} sutraeda",
+       "undeletehistory": "Si tu restora la paje, tota revisas va es restorada a la istoria. Si un paje nova con la mesma nom ia es creada pos la sutrae, la revisas restorada va apare en la istoria presedente.",
+       "undeleterevdel": "Desutrae no va aveni si lo ta fa ce la revisa la plu resente de la paje o fix va es partal sutraeda.\n En tal casos, tu debe deseleje o desasconde la revisa sutraeda la plu resente.",
+       "undeletehistorynoadmin": "Esta paje es sutraeda.\nLa razona de sutrae es mostrada en la resoma a su, con ance detalias de la usores ci ia edita esta paje ante la sutrae.\nLa testo mesma de esta revisas sutraeda es sola disponable a dirijores.",
+       "undelete-revision": "Revisa sutraeda de $1 (a $4, a $5) par $3:",
+       "undeleterevision-missing": "Revisa nonvalida o mancante.\nTu ave cisa un mal lia, o cisa la revisa ia es restorada o sutraeda de la arcivo.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|One revisa|$1 revisas}} no ia pote es restorada, car sua <code>rev_id</code> ia es ja usada.",
+       "undelete-nodiff": "No revisa presedente ia es trovada.",
        "undeletebtn": "Restora",
+       "undeletelink": "\nregarda/restora",
+       "undeleteviewlink": "regarda",
+       "undeleteinvert": "Inversa la eleje",
+       "undeletecomment": "Razona:",
+       "cannotundelete": "Alga o tota de la desutrae ia fali:\n$1",
+       "undeletedpage": "<strong>$1 ia es restorada</strong>\n\nConsulta la [[Special:Log/delete|rejistra de sutraes]] per un lista de sutraes e restoras resente.",
+       "undelete-header": "Regarda [[Special:Log/delete|la rejistra de sutraes]] per pajes resente sutraeda.",
+       "undelete-search-title": "Xerca en pajes sutraeda",
+       "undelete-search-box": "Xerca en pajes sutraeda",
+       "undelete-search-prefix": "Mostra pajes comensante con:",
+       "undelete-search-full": "Mostra titulos de paje cual conteni:",
        "undelete-search-submit": "Xerca",
+       "undelete-no-results": "No pajes conteninte ia es trovada en la arcivo de sutraes.",
+       "undelete-filename-mismatch": "La revisa de fix con ora $1 no pote es desutraeda: Noncoresponde de nom de fix.",
+       "undelete-bad-store-key": "La revisa de fix con ora $1 no pote es desutraeda: Fix ia manca ante sutrae.",
+       "undelete-cleanup-error": "Era en sutrae fix arcivida nonusada \"$1\".",
        "namespace": "Spasio de nom:",
        "invert": "Inversa la eleje",
        "tooltip-invert": "Marca esta caxa per asconde cambias a pajes en la spasio elejeda (e ance la spasio asosiada si acel es marcada)",
index 6815b8e..13a9fd1 100644 (file)
        "sp-contributions-newonly": "Прикажувај само новосоздадени страници",
        "sp-contributions-hideminor": "Скриј ситни промени",
        "sp-contributions-submit": "Пребарај",
+       "sp-contributions-outofrange": "Не можам да прикажам исход. Бараниот опсег на IP-адреси е поголем од допуштените /$1 во CIDR.",
        "whatlinkshere": "Што води овде",
        "whatlinkshere-title": "Страници со врски што водат до „$1“",
        "whatlinkshere-page": "Страница:",
index a29fd02..377611c 100644 (file)
        "print": "Ampremir",
        "edit": "Eiditar",
        "create": "Criar",
+       "create-local": "Poner çcriçon lhocal",
        "delete": "Botar fuora",
        "protect": "Porteger",
        "protect_change": "demudar",
        "viewsource": "Ber código-fuonte",
        "actionthrottled": "Acion lhemitada",
        "viewsourcetext": "Tu puodes ber i copiar l código desta páigina.",
+       "translateinterface": "Pa poner ó altarar traduçones pa todas las wikis, cunsidre outelizar la [https://translatewiki.net/wiki/Main_Page?setlang=mwl translatewiki.net], un porjeto çtinado a la traduçon de l MediaWiki.",
        "virus-scanfailed": "la berificaçon falhou (código $1)",
        "virus-unknownscanner": "antibírus çcoincido:",
        "yourname": "Nome de outelizador(a):",
        "showdiff": "Amostrar altaraçones",
        "anoneditwarning": "<strong>Abiso</strong>: Tu nun stás outenticado(a). L tou IP será registrado ne l stórico de las eidiçones desta páigina. Se <strong>[$1 ampeçar sesson]</strong> ó <strong>[$2 criar ua cuonta]</strong>, las sues eidiçones seran registradas cul sou nome d'outelizador(a), an cunjunto cun outros benefícios.",
        "summary-preview": "Amostra de l sumário:",
-       "blockedtext": "<strong>L tou nome d'outelizador ó morada de IP foi bloquiado.</strong>\n\nL bloqueio fui feito por $1.\nLa rezon fui <em>$2</em>.\n\n* Ampeço de l bloqueio: $8\n* Balidade de l bloqueio: $6\n* Çtino de l bloqueio: $7\n\nTu puodes cuntatar $1 ó outro [[{{MediaWiki:Grouppage-sysop}}|admenistrador]] pa çcutir subre l bloqueio.\nBei que nun poderás outelizar la funcionalidade \"Cuntatar outelizador\" se nun tubires ua counta cun ua morada eiletrónica bálida andicada an las tues [[Special:Preferences|preferéncias d'outelizador]] i se tubires sido bloquiado de outelizar essa ferramienta.\nLa tue morada de IP atual ye $3 i la eidantificaçon (ID) de l bloqueio ye #$5.\nPor fabor, anclui un deilhes (ó dambos ls dous) dados an qualquier tentatibas de sclarecimentos.",
-       "autoblockedtext": "La sue morada de IP foi bloquiada de forma outomática porque fui outelizado recentemente por outro outelizador, l qual fui bloquiado por $1.\nLa rezon fui:\n\n:<em>$2</em>\n\n* Ampeço de l bloqueio: $8\n* Balidade de l bloqueio: $6\n* Çtino de l bloqueio: $7\n\nTu puodes cuntatar $1 ó outro [[{{MediaWiki:Grouppage-sysop}}|admenistrador]] pa çcutir subre l bloqueio.\n\nBei que nun poderás outelizar la funcionalidade \"Cuntatar outelizador\" se nun tubires ua counta cun ua morada eiletrónica bálida andicada an las tues [[Special:Preferences|preferéncias d'outelizador]] i se tubires sido bloquiado de outelizar essa ferramienta.\n\nLa tue morada de IP atual ye $3 i la eidantificaçon (ID) de l bloqueio ye #$5.\nPor fabor, anclui un deilhes (ó dambos ls dous) dados an qualquier tentatibas de sclarecimentos.",
+       "blockedtext": "<strong>L tou nome d'outelizador ó morada de IP foi bloquiado.</strong>\n\nL bloqueio fui feito por $1.\nLa rezon fui <em>$2</em>.\n\n* Ampeço de l bloqueio: $8\n* Balidade de l bloqueio: $6\n* Çtino de l bloqueio: $7\n\nTu puodes cuntatar $1 ó outro [[{{MediaWiki:Grouppage-sysop}}|admenistrador]] pa çcutir subre l bloqueio.\nBei que nun poderás outelizar la funcionalidade \"Cuntatar outelizador\" se nun tubires ua counta cun ua morada eiletrónica bálida andicada an las tues [[Special:Preferences|perfréncias d'outelizador]] i se tubires sido bloquiado de outelizar essa ferramienta.\nLa tue morada de IP atual ye $3 i la eidantificaçon (ID) de l bloqueio ye #$5.\nPor fabor, anclui un deilhes (ó dambos ls dous) dados an qualquier tentatibas de sclarecimentos.",
+       "autoblockedtext": "La sue morada de IP foi bloquiada de forma outomática porque fui outelizada recentemente por outro outelizador, l qual fui bloquiado por $1.\nLa rezon fui:\n\n:<em>$2</em>\n\n* Ampeço de l bloqueio: $8\n* Balidade de l bloqueio: $6\n* Çtino de l bloqueio: $7\n\nTu puodes cuntatar $1 ó outro [[{{MediaWiki:Grouppage-sysop}}|admenistrador]] pa çcutir subre l bloqueio.\n\nBei que nun poderás outelizar la funcionalidade \"Cuntatar outelizador\" se nun tubires ua counta cun ua morada eiletrónica bálida andicada an las tues [[Special:Preferences|perfréncias d'outelizador]] i se tubires sido bloquiado de outelizar essa ferramienta.\n\nLa tue morada de IP atual ye $3 i la eidantificaçon (ID) de l bloqueio ye #$5.\nPor fabor, anclui un deilhes (ó dambos ls dous) dados an qualquier tentatibas de sclarecimentos.",
        "systemblockedtext": "L sou nome d'outelizador ó morada de IP fúrun bloquiados outomaticamente pul MediaWiki.\nLa rezon fui:\n\n:<em>$2</em>\n\n* Ampeço de l bloqueio: $8\n* Balidade de l bloqueio: $6\n* Çtino de l bloqueio: $7\n\nLa tue morada de IP atual ye $3.\nPor fabor, anclui un deilhes (ó dambos ls dous) dados an qualquier tentatibas de sclarecimentos.",
        "loginreqtitle": "Outenticaçon oubrigatória",
        "loginreqlink": "antrar",
        "noarticletext": "Inda nun eisiste testo nesta páigina.\nTu puodes [[Special:Search/{{PAGENAME}}|percurar pul títalo desta páigina]] noutras páiginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} percurar ls registros que téngan a ber]\nó [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta páigina]</span>.",
        "note": "'''Abiso:'''",
        "previewnote": "<strong>Lhembra-te qu'esto ye solo ua amostra.</strong>\nLas altaraçones inda nun fúrun grabadas!",
+       "continue-editing": "Nabegar pa la ária d'eidiçon",
        "editing": "A eiditar $1",
        "editingsection": "A eiditar $1 (cacho)",
        "yourtext": "L tou testo",
        "filesource": "Fuonte:",
        "ignorewarnings": "Eignorar qualquiera abiso",
        "savefile": "Grabar fexeiro",
+       "uploaddisabled": "Ambio de fexeiros zatibado.",
        "watchthisupload": "Begiar este fexeiro",
+       "upload-dialog-title": "Cargar fexeiro",
        "upload-curl-error28": "Ultrapassado l tiempo lhemite pa l ambio de l fexeiro",
        "license": "Lhicença:",
        "license-header": "Lhicença",
        "shortpages": "Páiginas pequeinhas",
        "longpages": "Páiginas cumpridas",
        "deadendpages": "Páiginas sin salida",
-       "protectedpages": "Páiginas protegidas",
+       "protectedpages": "Páiginas portegidas",
        "protectedtitles": "Títalos portegidos",
        "listusers": "Lhista de outelizadores",
        "newpages": "Páiginas nuobas",
        "deletecomment": "Rezon:",
        "deleteotherreason": "Rezon adicional:",
        "deletereasonotherlist": "Outra rezon",
+       "deletereason-dropdown": "* Motibos d'eliminaçon quemuns\n** Spam\n** Bandalismo\n** Biolaçon de dreitos d'outor\n** Pedido de l'outor\n** Ancaminamiento ambálido",
        "rollbacklink": "retornar",
        "protectlogpage": "Registro de porteçon",
        "protectedarticle": "porteger \"[[$1]]\"",
        "year": "De l anho (i atrasados):",
        "sp-contributions-newbies": "Percurar solo an las cuntribuiçones de nuobas cuontas",
        "sp-contributions-newbies-sub": "Pa cuontas nuobas",
-       "sp-contributions-blocklog": "Registro de bloqueios",
+       "sp-contributions-blocklog": "registro de bloqueios",
        "sp-contributions-talk": "cumbersa",
        "sp-contributions-search": "Percurar cuntribuiçones",
        "sp-contributions-username": "Morada de IP ó outelizador:",
        "unblocklink": "zbloquiar",
        "change-blocklink": "altarar bloqueio",
        "contribslink": "cuntribs",
-       "blocklogpage": "Registro de l bloqueio",
+       "blocklogpage": "Registro de bloqueios",
        "blocklogentry": "\"[[$1]]\" fui bloquiado cun un tiempo de balidade de $2 $3",
        "unblocklogentry": "zbloqueste $1",
        "block-log-flags-nocreate": "criaçon de cuontas zatibada",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|arrastrou}} $3 pa $4 sin deixar un ancaminamiento",
        "logentry-move-move_redir": "$1 {{GENDER:$2|arrastrou}} $3 pa l sou ancaminamiento $4",
        "rightsnone": "(nanhun)",
+       "searchsuggest-search": "Percurar an {{SITENAME}}",
        "mediastatistics-header-multimedia": "Média anriquecida",
+       "mw-widgets-usersmultiselect-placeholder": "Poner mais...",
        "authmanager-email-label": "Correio eiletrónico",
        "changecredentials": "Altarar credenciales",
        "changecredentials-submit": "Altarar credenciales",
index 52e95e9..ff06964 100644 (file)
@@ -55,7 +55,7 @@
        "tog-shownumberswatching": "निगरानी गरिरहेका प्रयोगकर्ताहरूको संख्या देखाउने",
        "tog-oldsig": "वर्तमान हस्ताक्षर:",
        "tog-fancysig": "मेरो दस्तखतलाई विकि पाठको रुपमा लिने (स्वत लिङ्क बिना)",
-       "tog-uselivepreview": "पà¥\8dरतà¥\8dयà¤\95à¥\8dष à¤ªà¥\82रà¥\8dवरà¥\81प à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\81हà¥\8bस",
+       "tog-uselivepreview": "पà¥\83षà¥\8dठ à¤ªà¥\81नरà¥\8dभरण à¤¨à¤\97रà¥\80à¤\95न à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95नहरà¥\82 à¤¦à¥\87à¤\96ाà¤\89नà¥\81हà¥\8bसà¥\8d",
        "tog-forceeditsummary": "खाली सम्पादन शीर्षक प्रविष्टि गरेमा मलाई सोध्ने",
        "tog-watchlisthideown": "मेरा सम्पादनहरू निगनारी सूचीबाट लुकाउने",
        "tog-watchlisthidebots": "बोट सम्पादनहरू निगरानी सूचीबाट लुकाउने",
        "userlogin-resetpassword-link": "पासवर्ड भुल्नुभयो?",
        "userlogin-helplink2": "प्रवेश गर्नको लागि सहयोग",
        "userlogin-loggedin": "तपाईं {{GENDER:$1|$1}}को रूपमा प्रवेश (लग इन) भइ सक्नु भयो ।\nअर्को प्रयोगकर्ताको रूपमा प्रवेश (लग इन) गर्न तलको फारम प्रयोग गर्नुहोस् ।",
+       "userlogin-reauth": "तपाईं {{GENDER:$1|$1}} नै हो भनी प्रमाणित गर्न तपाईंले पुनः लगइन गर्नुपर्दछ।",
        "userlogin-createanother": "अर्को खाता खोल्नुहोस्",
        "createacct-emailrequired": "इमेल ठेगाना",
        "createacct-emailoptional": "इमेल ठेगाना (ऐच्छिक)",
        "createacct-reason-ph": "किन तपाईं नयाँ खाता खोलिरहनु भएको हो ?",
        "createacct-submit": "तपाईंको खाता सिर्जना गर्नुहोस",
        "createacct-another-submit": "खाता खोल्नुहोस्",
+       "createacct-continue-submit": "खाता निर्माणलाई निरन्तरता दिनुहोस्",
+       "createacct-another-continue-submit": "खाता निर्माणलाई निरन्तरता दिनुहोस्",
        "createacct-benefit-heading": "{{SITENAME}} तपाईं जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन|सम्पादनहरू}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ|पृष्ठहरू}}",
        "changepassword-success": "तपाईंको पासवर्ड सफलतापूर्वक परिवर्तन भयो!",
        "changepassword-throttled": "तपाईंले भर्खरै धेरै पल्ट प्रवेश (लग इन)को निम्ति प्रयास गर्नुभएको छ। \nकृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।",
        "botpasswords": "बोट पासवर्ड",
+       "botpasswords-disabled": "बोट पासवर्डहरू असक्षम गरिएका छन्।",
        "botpasswords-createnew": "नयाँ बोटको लागि पासवर्ड बनाउने",
        "botpasswords-label-appid": "बोट नाम",
        "botpasswords-label-create": "बनाउनुहोस्",
        "passwordreset-emailtext-user": "{{SITENAME}} को $1 प्रयोगकर्ताले  {{SITENAME}} ($4)को लागि खाता विवरणको निम्ति एउटा अनुस्मारकको अनुरोध गरेको छ । निम्न प्रयोगकर्ता {{PLURAL:$3|खाता यस इमेल ठेगानासित सम्बन्धित छ|खाताहरू यस इमेल ठेगानासित सम्बन्धित छन् ।}}:\n\n$2\n\n{{PLURAL:$3|यो अस्थाई पासवर्डको|यी अस्थाई पासवर्डहरूको}} समय {{PLURAL:$5|एक दिन|$5 दिन}}मा सकिनेछ ।\nतपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड छान्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनुहुन्न भने, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस् ।",
        "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsentemail": "पासवर्ड परिवर्तनको लागि इमेल पठाइएको छ।",
+       "passwordreset-invalidemail": "अमान्य इमेल ठेगाना",
        "changeemail": "इमेल ठेगाना परिवर्तन गर्नुहोस",
        "changeemail-header": "खाताको इमेल ठेगाना परिवर्तन गर्नुहोस",
        "changeemail-no-info": "यस पृष्ठमा सिधै जानको लागि प्रवेश गर्नु पर्ने हुन्छ ।",
        "sig_tip": "तपाईंको समयछाप सहितको दस्तखत",
        "hr_tip": "क्षितिजिय रेखा (कम प्रयोग गर्नुहोस्)",
        "summary": "सारांश:",
-       "subject": "विषय/शीर्षक:",
+       "subject": "विषय:",
        "minoredit": "यो सानो सम्पादन हो",
        "watchthis": "यो पृष्ठ अवलोकन गर्नुहोस्",
        "savearticle": "सङ्ग्रह गर्ने",
        "selfredirect": "<strong>चेतावनी:</strong> तपाईं यस पृष्ठलाई आफुमा पुनः निर्देशित गर्दै हुनुहुन्छ।\nहुनसक्छ तपाईं अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गर्दै हुनुहुन्छ, वा गलत पृष्ठको सम्पादन गर्दै हुनुहुन्छ।\nतपाईं पुनः एकपटक \"$1\" क्लिक गर्नुहुन्छ, पुनः निर्देशित त्यसै पनि बनाइनेछ।",
        "missingcommenttext": "कृपया टिप्पणी प्रविष्ठ गर्नुहोस् ।",
        "missingcommentheader": "<strong>याद गर्नुहोस् :</strong> तपाईंले टिप्पणीमा विषय /शीर्ष पंक्ति  दिनुभएको छैन ।\nतपाईंले फेरि \"$1\"  थिच्नु भएमा , तपाईंको सम्पादन यसै रुपमा सङ्ग्रहित हुनेछ ।",
-       "summary-preview": "साराà¤\82श पूर्वालोकन:",
-       "subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
+       "summary-preview": "समà¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82शà¤\95à¥\8b पूर्वालोकन:",
+       "subject-preview": "विषयको पूर्वावलोकन:",
        "previewerrortext": "तपाईंको परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आएको छ ।",
        "blockedtitle": "प्रयोककर्तालाई रोक लगाइएको छ",
        "blockedtext": "'''तपाईंको प्रयोगकर्ता नाम या आइ पी ठेगानालाई रोक लगाइएको छ ।'''\n\nरोक लगाउने  $1.\nरोक लगाउनाको कारण ''$2''.\n\n* रोक सुरू हुने : $8\n* रोक सकिने: $6\n* रोकबाट लक्षित: $7\n\nतपाईंले  $1 वा अरु कुनै  [[{{MediaWiki:Grouppage-sysop}}|प्रवन्धक]] सँग रोकको बारेमा छलफल गर्न सम्पर्क गर्न सक्नुहुन्छ ।\nतपाईँले  'प्रयोगकर्तालाई इ-मेल गर्ने ' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|अभिरुचीहरू]]मा नखुलाए सम्म प्रयोगगर्न पाउनुहुने छैन र यसको प्रयोग गर्नबाट रोक लगाइएको छैन ।\nतपाईंको IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तपाईँको प्रश्नमा सबै जानकारी खुलाउनुहोला ।",
        "page_last": "अन्तिम",
        "histlegend": "अन्तर चयन:संशोधनहरूको तुलनाको लागि रेडियो बाकसमा क्लिक गरेर इण्टर गर्नुहोस् अथवा तल दिएको बटनमा थिच्नुहोस् <br />\nलिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमा अन्तर, '''({{int:last}})''' = पहिलाका अवतरणको बीचमा अन्तर, '''{{int:minoreditletter}}''' = सानो परिवर्तन।",
        "history-fieldset-title": "संशोधनका लागि खोजी गर्नुहोस्",
-       "history-show-deleted": "मेटिएका मात्र",
+       "history-show-deleted": "सà¤\82शà¥\8bधन à¤®à¥\87à¤\9fिà¤\8fà¤\95ा à¤®à¤¾à¤¤à¥\8dर",
        "histfirst": "पुरानो",
        "histlast": "नयाँ",
        "historysize": "({{PLURAL:$1|१ बाइट |$1 बाइटहरू}})",
        "revdelete-unsuppress": "पुनर्स्थापित पुनरावृत्तिबाट बन्देज हटाउने",
        "revdelete-log": "कारण :",
        "revdelete-submit": "{{PLURAL:$1|छानिएको संशोधन|छानिएका संशोधनहरु}}मा प्रयोग गर्ने",
-       "revdelete-success": "'''संशोधन दृश्यता सफलतापूर्वक अद्यतन भयो।'''",
+       "revdelete-success": "संशोधन दृश्यता अद्यतन भयो।",
        "revdelete-failure": "'''संशोधन दृश्यता अद्यतन गर्न सकिएन:'''\n$1",
        "logdelete-success": "'''लग दृष्टि सफलतापूर्वक मिलाइयो ।'''",
        "logdelete-failure": "'''लग दृष्टि मिलाउन सकिएन :'''\n$1",
        "prefs-help-prefershttps": "यो अभिरूची तपाईंको अर्को प्रवेश (लग इन) बाट लागु हुनेछ ।",
        "prefswarning-warning": "तपाईंले आफ्नो अभिरूचीमा गर्नुभएको परिवर्तन अहिले सम्म सङ्ग्रह गरिएको छैन। यदि तपाईं \"$1\" मा क्लिक नगरी यस पृष्ठबाट बाहिर जानुभयो भने तपाईंको अभिरूची अपडेट गर्न सकिदैन।",
        "prefs-tabs-navigation-hint": "सुझाव: तपाईं ट्याबसहरूमा ट्याबसको बीच आवागमन गर्नका लागि देब्रे वा दाहिने तीर साँचोको प्रयोग गर्न सक्नुहुन्छ।",
-       "userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
+       "userrights": "प्रयोगकर्ता अधिकारहरू",
        "userrights-lookup-user": "प्रयोगकर्ता समूह व्यवस्थापन गर्नुहोस",
        "userrights-user-editname": "प्रयोगकर्ता नाम दिनुहोस् :",
        "editusergroup": "प्रयोगकर्ता समूह सम्पादन गर्नुहोस्",
index e2bb178..c33f954 100644 (file)
        "passwordreset-emailelement": "↓Brukarnamn: \n$1\n\nMellombels passord: \n$2",
        "passwordreset-emailsentemail": "Ein e-post for attendestilling av passord er vorten send",
        "changeemail": "Endre eller fjern e-postadresse",
-       "changeemail-header": "↓Endre kontoen si e-postadresse",
+       "changeemail-header": "Fyll ut dette skjemaet for å endre e-postadressa di. Ynskjer du å fjerne tilknytinga ei e-postadresse har til kontoen din, lat feltet for ny e-postadresse stå tomt når du sender inn skjemaet.",
        "changeemail-no-info": "↓Du må vera pålogga for å få tilgang direkte til denne sida.",
-       "changeemail-oldemail": "↓Noverande e-postadresse:",
+       "changeemail-oldemail": "Gjeldande e-postadresse:",
        "changeemail-newemail": "Ny e-postadresse:",
+       "changeemail-newemail-help": "Dette feltet skal stå tomt om du ynskjer å fjerne e-postadressa di. Du kan ikkje nullstille eit gløymt passord og kan heller ikkje ta imot e-postar frå denne wikien om e-postadressa er fjerna.",
        "changeemail-none": "↓(ingen)",
        "changeemail-password": "{{SITENAME}}-passordet ditt:",
-       "changeemail-submit": "Endre e-post",
+       "changeemail-submit": "Endre e-post",
        "changeemail-throttled": "Du har freista for mange gonger å logga inn. Du lyt venta $1 før du kan freista på nytt.",
        "bold_sample": "Halvfeit skrift",
        "bold_tip": "Halvfeit skrift",
        "prefs-watchlist-token": "Nykel for overvakingslista:",
        "prefs-misc": "Andre",
        "prefs-resetpass": "Endra passord",
-       "prefs-changeemail": "↓Endre e-postadresse",
+       "prefs-changeemail": "Endre eller fjern e-postadresse",
        "prefs-setemail": "↓Oppgje ei e-postadresse",
        "prefs-email": "Val for e-post",
        "prefs-rendering": "Utsjånad",
index c49bcd0..abeef09 100644 (file)
@@ -8,7 +8,8 @@
                        "Macofe",
                        "Amire80",
                        "Matma Rex",
-                       "Ibrahim khashrowdi"
+                       "Ibrahim khashrowdi",
+                       "Baloch Khan"
                ]
        },
        "tog-underline": "کرښنې تړنې:",
        "anontalk": "خبرې اترې",
        "navigation": "گرځښت",
        "and": "&#32;او",
-       "qbfind": "موندل",
-       "qbbrowse": "سپړل",
-       "qbedit": "سمول",
-       "qbpageoptions": "همدا مخ",
-       "qbmyoptions": "زما پاڼې",
        "faq": "ډ-ځ-پ",
-       "faqpage": "Project:ډ-ځ-پ",
        "actions": "کړنې",
        "namespaces": "نوم-تشيالونه",
        "variants": "ډولونه",
        "searcharticle": "ورځه",
        "history": "د مخ پېښليک",
        "history_short": "پېښليک",
+       "history_small": "تاریخ",
        "updatedmarker": "زما د وروستي راتگ نه راپدېخوا اوسمهاله شوی",
        "printableversion": "چاپي بڼه",
        "permalink": "تلپاتې تړنه",
        "edit-local": "سيمه ايزې څرگندونې سمول",
        "create": "جوړول",
        "create-local": "سيمه ايزې څرگندونې ورگډول",
-       "editthispage": "همدا مخ سمول",
-       "create-this-page": "همدا مخ ليکل",
        "delete": "ړنگول",
-       "deletethispage": "دا مخ ړنگول",
-       "undeletethispage": "دا مخ ناړنگول",
        "undelete_short": "{{PLURAL:$1|يو سمون|$1 سمونې}} ناړنگول",
        "viewdeleted_short": "{{PLURAL:$1|يو ړنگ شوی سمون|$1 ړنگ شوي سمونونه}} کتل",
        "protect": "ژغورل",
        "protect_change": "بدلون",
-       "protectthispage": "همدا مخ ژغورل",
        "unprotect": "ژغورنه بدلول",
-       "unprotectthispage": "د دې مخ ژغورنه بدلول",
        "newpage": "نوی مخ",
-       "talkpage": "د دې مخ په اړه خبرې اترې کول",
        "talkpagelinktext": "خبرې اترې",
        "specialpage": "ځانگړی مخ",
        "personaltools": "شخصي اوزار",
-       "articlepage": "د مخ مېنځپانگه ښکاره کول",
        "talk": "خبرې اترې",
        "views": "کتنې",
        "toolbox": "اوزارونه",
-       "userpage": "د کارن پاڼه کتل",
-       "projectpage": "د پروژې مخ کتل",
+       "tool-link-userrights": "د{{GENDER:$1|کارن}} ګروپونه بدل کړي",
+       "tool-link-userrights-readonly": "د{{GENDER:$1|کارن}} ګروپونه ښکاره کړي",
+       "tool-link-emailuser": "دې {{GENDER:$1|کارن}} ته برېښناليک لېږل",
        "imagepage": "د دوتنې مخ کتل",
        "mediawikipage": "پيغام مخ کتل",
        "templatepage": "د کينډۍ مخ کتل",
        "virus-scanfailed": "ځيرڅارنه بريالۍ نه شوه (کوډ $1)",
        "virus-unknownscanner": "ناڅرگند ضدويروس:",
        "logouttext": "'''اوس تاسې د غونډال څخه ووتلئ.'''\n\nدا په پام کې وساتۍ چې تر څو تاسې د خپل کتنمل حافظه نه وي سپينه کړې، نو ځينې مخونو کې به لا تر اوسه پورې په غونډال کې ننوتي ښکارۍ.",
+       "cannotlogoutnow-title": "وس نسم کولاي بهر تري ووځم",
        "welcomeuser": "$1، ښه راغلې!",
        "welcomecreation-msg": "گڼون مو جوړ شو.\nد [[Special:Preferences|{{SITENAME}} غوره توبونه]] بدلول مو مه هېروۍ.",
        "yourname": "کارن-نوم:",
        "createacct-yourpasswordagain-ph": "پټنوم مو بيا وټاپئ",
        "userlogin-remembermypassword": "غونډال کې مې ننوتلی وساته",
        "userlogin-signwithsecure": "خوندي اړيکتيا کارول",
+       "cannotloginnow-title": "نسم کولای چې دننه سم",
        "cannotcreateaccount-title": "گڼونونه نه شي جوړېدای",
        "yourdomainname": "ستاسې شپول:",
        "password-change-forbidden": "تاسې په دې ويکي باندې خپل پټنوم نه شی بدلولی.",
        "botpasswords-label-update": "اوسمهالول",
        "botpasswords-label-cancel": "ناگارل",
        "botpasswords-label-delete": "ړنگول",
+       "botpasswords-label-resetpassword": "پټوم بدل کړي",
+       "botpasswords-label-grants": "تطبیق وړ ګرانټ:",
        "resetpass_forbidden": "پټنومونه مو نه شي بدلېدلای",
        "resetpass-no-info": "دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.",
        "resetpass-submit-loggedin": "پټنوم بدلول",
        "editusergroup": "{{GENDER:$1|کارن}} ډلې سمول",
        "editinguser": "د <strong>[[User:$1|$1]]</strong> {{GENDER:$1|کارن}} رښتې بدلول $2",
        "userrights-editusergroup": "کارن ډلې سمول",
+       "userrights-viewusergroup": "د{{GENDER:$1|کارن}} ګروپونه ښکاره کړي",
        "saveusergroups": "{{GENDER:$1|کارن}} ډلې خوندي کول",
        "userrights-groupsmember": "غړی د:",
        "userrights-groupsmember-auto": "ضمني غړی د:",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ښکاره کول",
+       "rcfilters-tag-remove": "لرې کړئ'$1'",
+       "rcfilters-savedqueries-rename": "نوم بدلول",
        "rcfilters-filterlist-title": "چاڼگران",
        "rcfilters-filter-user-experience-level-newcomer-label": "نوي راغلي",
        "rcfilters-filter-user-experience-level-learner-label": "زده کوونکي",
        "unblocked-range": "له $1 بنديز ليرې شو",
        "unblocked-ip": "له [[Special:Contributions/$1|$1]] څخه بنديز ليرې شو.",
        "blocklist": "بنديز لگېدلي کارنان",
+       "autoblocklist-submit": "پلټل",
        "ipblocklist": "بنديز لگېدلي کارنان",
        "ipblocklist-legend": "يو بنديز شوی کارن موندل",
        "blocklist-userblocks": "گڼون بنديزونه پټول",
        "patrol-log-header": "دا د څارل شويو مخکتنو يو يادښت دی.",
        "log-show-hide-patrol": "د څارنې يادښت $1",
        "log-show-hide-tag": "نښلن يادښت $1",
+       "confirm-markpatrolled-button": "ښه",
        "deletedrevision": "د $1 زړه ړنگه شوې بڼه",
        "filedeleteerror-short": "د دوتنې د ړنگولو ستونزه: $1",
        "filedeleteerror-long": "د دوتنې په ړنگولو کې تېروتنې پېښې شوې:\n\n$1",
        "fileduplicatesearch-noresults": "د \"$1\" په نوم دوتنه و نه موندل شوه.",
        "specialpages": "ځانگړي مخونه",
        "specialpages-note-top": "څرگندونې",
-       "specialpages-note": "* نورماله ځانگړي مخونه.\n* <strong class=\"mw-specialpagerestricted\">محدوده ځانگړي مخونه.</strong>",
        "specialpages-group-maintenance": "د څارنې راپورونه",
        "specialpages-group-other": "نور ځانگړي مخونه",
        "specialpages-group-login": "ننوتل / گڼون جوړول",
        "authmanager-realname-label": "اصلي نوم",
        "authmanager-realname-help": "د کارن اصلي نوم",
        "authprovider-resetpass-skip-label": "تېرېدل",
+       "specialpage-securitylevel-not-allowed-title": "اجازه نسته",
        "changecredentials-submit": "بدلول",
        "removecredentials-submit": "غورځول",
        "credentialsform-account": "گڼون نوم:"
index 897728e..9d2e77d 100644 (file)
        "parser-template-loop-warning": "Parameters:\n* $1 - page title",
        "template-loop-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with template loops will be listed.",
        "template-loop-category-desc": "Pages with template loops category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Template-loop-category}}",
+       "template-loop-warning": "This message is displayed in edit preview when a template loop is detected on the previewed page.\n\nParameters:\n* $1 - the full title of template which causes the template loop.",
        "parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
        "language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
        "node-count-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.\n\nSee also:\n* {{msg-mw|Node-count-exceeded-warning}}",
        "rcfilters-watchlist-markseen-button": "Label for the button to mark all changes as seen on [[Special:Watchlist]] when using the structured filters interface.",
        "rcfilters-watchlist-edit-watchlist-button": "Label for the button to edit the watched pages on [[Special:Watchlist]] when using the structured filters interface.\n\nCf. {{msg-mw|watchlisttools-edit}}.",
        "rcfilters-watchlist-showupdated": "Message at the top of [[Special:Watchlist]] when the Structured filters are enabled that describes what unseen changes look like.\n\nCf. {{msg-mw|wlheader-showupdated}}",
+       "rcfilters-preference-label": "Option in RecentChanges tab of [[Special:Preferences]].",
+       "rcfilters-preference-help": "Explanation for the option in the RecentChanges tab of [[Special:Preferences]].",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfromreset": "Used on [[Special:RecentChanges]] to reset a selection of a certain date range.",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "diff-form-revid": "Label for the field of the new revision in the comparison for [[Special:Diff]]",
        "diff-form-submit": "Submit button on [[Special:Diff]]",
        "diff-form-summary": "{{doc-specialpagesummary|diff}}",
-       "permanentlink": "The title of [[Special:PermanentLink]]",
-       "permanentlink-revid": "Label for the field for the revision ID in [[Special:PermanentLink]]",
+       "permanentlink": "The title of [[Special:PermanentLink]]\n{{Identical|Permalink}}",
+       "permanentlink-revid": "Label for the field for the revision ID in [[Special:PermanentLink]]\n{{Identical|Revision ID}}",
        "permanentlink-submit": "Submit button on [[Special:PermanentLink]]",
        "permanentlink-summary": "{{doc-specialpagesummary|permanentlink}}",
        "dberr-problems": "This message does not allow any wiki nor html markup.",
index 5fb74ed..bc3f475 100644 (file)
@@ -45,6 +45,7 @@
        "tog-watchlisthideminor": "Scunne le cangiaminde stuèdeche da l'elenghe de le pàggene condrollate",
        "tog-watchlisthideliu": "Scunne le cangiaminde de l'utinde canusciute da l'elenghe de le pàggene condrollate",
        "tog-watchlistreloadautomatically": "Recareche automaticamende l'eleghe de le pàggene condrollate quanne cange 'nu filtre (richieste Javascript)",
+       "tog-watchlistunwatchlinks": "Aggiunge collegaminde dirette pe langià/non langià le eleminde jndr'à le pàggene condrollate (vole 'u JavaScript pe ausà sta funzionalità).",
        "tog-watchlisthideanons": "Scunne le cangiaminde de l'utinde scanusciute da l'elenghe de le pàggene condrollate",
        "tog-watchlisthidepatrolled": "Scunne le cangiaminde condrollate jndr'à l'elenghe de le pàggene condrollate",
        "tog-watchlisthidecategorization": "Scunne 'a categorizzazzione d'a vôsce",
        "recentchanges-legend-heading": "<strong>Leggende:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
        "recentchanges-submit": "Fà 'ndrucà",
+       "rcfilters-tag-remove": "Live '$1'",
+       "rcfilters-legend-heading": "<strong>Elenghe de le abbreviazziune:</strong>",
+       "rcfilters-other-review-tools": "<strong>Otre struminde de revisione</strong>",
+       "rcfilters-group-results-by-page": "Raggruppe le resultate pe pàgene",
        "rcfilters-grouping-title": "Stoche e raggruppe",
        "rcfilters-activefilters": "Filtre attive",
        "rcfilters-advancedfilters": "Filtre avanzate",
        "rcfilters-hours-title": "Urteme ore",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|sciurne}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ore}}",
+       "rcfilters-highlighted-filters-list": "Evidenziate: $1",
        "rcfilters-quickfilters": "Filtre reggistrate",
        "rcfilters-quickfilters-placeholder-title": "Nisciune collegamende reggistrate",
        "rcfilters-quickfilters-placeholder-description": "Pe reggistrà le 'mbostaziune d'u filtre tune e ausarle cchiù tarde, cazze sus a l'icone segnalibbre jndr'à l'arèe \"Fitlre attive\" aqquà sotte",
        "rcfilters-savedqueries-new-name-label": "Nome",
        "rcfilters-savedqueries-new-name-placeholder": "Dì a ce serve 'u filtre",
        "rcfilters-savedqueries-apply-label": "Ccrèje 'nu filtre",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Ccreje 'nu filtre de base",
        "rcfilters-savedqueries-cancel-label": "Annulle",
+       "rcfilters-savedqueries-add-new-title": "Reggìstre le 'mbostaziune de mò d'u filtre",
+       "rcfilters-restore-default-filters": "Repristine le filtre de base",
+       "rcfilters-clear-all-filters": "Pulizze tutte le filtre",
+       "rcfilters-show-new-changes": "'Ndruche le urteme cangiaminde",
        "rcfilters-invalid-filter": "Filtre invalide",
        "rcfilters-empty-filter": "Nisciune filtre attive. Tutte le condrebbute avènene fatte 'ndrucà.",
        "rcfilters-filterlist-title": "Filtre",
index f20985d..5ace4bf 100644 (file)
                        "Санюн Вадик",
                        "MustangDSG",
                        "Valeri'swiki",
-                       "Marat-avgust"
+                       "Marat-avgust",
+                       "Ernác"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показать",
        "rcfilters-tag-remove": "Удалить '$1'",
-       "rcfilters-legend-heading": "<strong>СпиÑ\81ок Ñ\81окÑ\80аÑ\89ений:</strong>",
+       "rcfilters-legend-heading": "<strong>Ð\9aÑ\8aÑ\8bÑ\81Ñ\85аÑ\80Ñ\82Ñ\8bÑ\83ланÑ\8b Ñ\82измеÑ\81и:</strong>",
        "rcfilters-other-review-tools": "<strong>Другие инструменты проверки</strong>",
        "rcfilters-group-results-by-page": "Группировать результаты по странице",
        "rcfilters-grouping-title": "Группировка",
index 047d508..81beea6 100644 (file)
@@ -26,8 +26,8 @@
        "tog-watchuploads": "منھنجا نوان چاڙهيل فائيلس نظر ۾ فھرست ۾ شامل ڪريو",
        "tog-watchrollback": "انهن صفحن کي منهنجي نظر ۾ فھرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي",
        "tog-minordefault": "سمورين تبديلين کي بنان چئي معمولي ترميم تصور ڪريو",
-       "tog-previewontop": "ترميمي دٻيءَ مٿان پيش نگاهہ ڏيکاريو",
-       "tog-previewonfirst": "پهرين ترميم تي پيش نگاهہ ڏيکاريو",
+       "tog-previewontop": "ترميمي دٻيءَ مٿان پيش نگاھ ڏيکاريو",
+       "tog-previewonfirst": "پهرين ترميم تي پيش نگاھ ڏيکاريو",
        "tog-enotifwatchlistpages": "منهنجي نظر ۾ فھرست اندر شامل ڪنهن صفحي يا فائيل ۾ تبديل پيش اچي مون کي برقٽپال اماڻيو",
        "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برقٽپال اماڻيو",
        "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برقٽپال ڪريو",
@@ -49,7 +49,7 @@
        "tog-norollbackdiff": "واپس ورائڻ کان پوءِ تفاوت نہ ڏيکاريو",
        "tog-useeditwarning": "مونکي خبردار ڪريو جڏهن مان هڪ ترميم وارو صفحو بغير تبديلين سانڍڻ جي ڇڏيان",
        "tog-prefershttps": "هميشہ محفوظ ڪنيڪشن استعمال ڪريو جڏهن داخل ٿيل هجو",
-       "underline-always": "هميشہ",
+       "underline-always": "سدائين",
        "underline-never": "ڪڏهن بہ نہ",
        "underline-default": "پيش طَي چَم يا جھانگُو",
        "editfont-style": "ايراضي جو فونٽ اسٽائيل سنواريو:",
        "category_header": "\"$1\" زمري جا صفحا",
        "subcategories": "ذيلي زمرا",
        "category-media-header": " \"$1\" زمري اندر ذريعات",
-       "category-empty": "''في‌الوقت هن زمري ۾ ڪي بہ صفحا يا ذريعات شامل ناهن.''",
+       "category-empty": "<em>في‌الوقت هن زمري ۾ ڪي بہ صفحا يا ذريعات شامل ناهن.</em>",
        "hidden-categories": "{{PLURAL:$1|لڪيل زمرو|لڪيل زمرا}}",
        "hidden-category-category": "لڪل زمرا",
        "category-subcat-count": "{{PLURAL:$2|ھن زمري ۾ رڳو ھيٺيون ذيلي زمرو آهي.|هن زمري ۾ ڪل $2 مان ھيٺيان {{PLURAL:$1|subcategory|$1 ذيلي زمرا}} آھن.}}",
        "article": "موادي صفحو",
        "newwindow": "(نئين دريءَ ۾ کلندو)",
        "cancel": "رد",
-       "moredotdotdot": "اڃا...",
+       "moredotdotdot": "وڌيڪ...",
        "morenotlisted": "ھي فھرست نامڪمل بہ ٿي سگھي ٿي.",
-       "mypage": "منهنجو صفحو",
+       "mypage": "صفحو",
        "mytalk": "بحث",
        "anontalk": "بحث",
        "navigation": "رھنمائي",
        "help": "مدد",
        "search": "ڳولا",
        "searchbutton": "ڳوليو",
-       "go": "کوليو",
+       "go": "هلو",
        "searcharticle": "وڃو",
        "history": "صفحي جي سوانح",
        "history_short": "سوانح",
        "undelete_short": "اڻڊاهيو {{PLURAL:$1|هڪ ترميم|$1 ترميمون}}",
        "viewdeleted_short": "ڏسو {{PLURAL:$1|هڪ ڊاٺل ترميم|$1 ڊاٺل ترميمون}}",
        "protect": "تحفظيو",
-       "protect_change": "تبديل ڪريو",
+       "protect_change": "مٽايو",
        "unprotect": "تحفظ بدلايو",
        "newpage": "نئون صفحو",
        "talkpagelinktext": "بحث",
        "talk": "بحث",
        "views": "ڏيٺون",
        "toolbox": "اوزارَ",
-       "tool-link-userrights": "{{GENDER:$1|Ù\8aÙ\88زر}} Ú¯Ø±Ù\88Ú¾ ØªØ¨Ø¯Ù\8aÙ\84 ÚªØ±يو",
+       "tool-link-userrights": "{{GENDER:$1|Ù\88اھپ}} Ú¯Ø±Ù\88Ú¾ Ù\85ٽايو",
        "tool-link-userrights-readonly": "{{GENDER:$1|يوزر}} گروھ ڏسو",
-       "tool-link-emailuser": "Ú¾Ù\86 {{GENDER:$1|Ù\8aÙ\88زر}} ڏانھن برقٽپال موڪليو",
-       "imagepage": "ذريعاتي صفحو ڏسو",
+       "tool-link-emailuser": "Ú¾Ù\86 {{GENDER:$1|Ù\88اھپ}} ڏانھن برقٽپال موڪليو",
+       "imagepage": "فائيل صفحو ڏسو",
        "mediawikipage": "نياپي جو صفحو ڏسو",
        "templatepage": "سانچي جو صفحو ڏسو",
-       "viewhelppage": "امدادي صفحو ڏسو",
+       "viewhelppage": "مددي صفحو ڏسو",
        "categorypage": "زمراتي صفحو ڏسو",
        "viewtalkpage": "بحث ڏسو",
        "otherlanguages": "ٻين ٻولين ۾",
        "poolcounter-usage-error": "استعمال جي خرابي: $1",
        "aboutsite": "{{SITENAME}} بابت",
        "aboutpage": "Project:بابت",
-       "copyright": "ڪجھہ ٻيو ڄاڻايل نہ هجڻ جي صورت ۾ سمورو مواد $1 تحت ميسر ڪجي ٿو.",
+       "copyright": "ڪجھ ٻيو ڄاڻايل نہ هجڻ جي صورت ۾ سمورو مواد $1 تحت ميسر ڪجي ٿو.",
        "copyrightpage": "{{ns:project}}:تاليف جا حق",
        "currentevents": "ھاڻوڪا واقعا",
        "currentevents-url": "Project:ھاڻوڪا واقعا",
        "portal-url": "Project:نياتي باب",
        "privacy": "ذاتيات پاليسي",
        "privacypage": "Project:ذاتيات پاليسي",
-       "badaccess": "اجازتÙ\86اÙ\85Û\81 چُڪَ",
+       "badaccess": "اجازتÙ\8a چُڪَ",
        "versionrequired": "ذريعات‌وڪي جو ورزن $1 درڪار",
        "versionrequiredtext": "هيءُ صفحو استعمال ڪرڻ لاءِ ذريعات‌وڪي جو ورزن $1 درڪار آهي. وڌيڪ ڄاڻڻ لاءِ [[Special:Version|ورزن بابت صفحو]] ڏسو.",
        "ok": "ٺيڪ",
        "retrievedfrom": "\"$1\" تان ورتل",
-       "youhavenewmessages": "توهان لاءِ $1 ($2) آهن.",
+       "youhavenewmessages": "{{PLURAL:$3|توھان وٽ}} $1 ($2) آھن.",
        "youhavenewmessagesmanyusers": "توهان لاءِ ڪيترن ئي يُوزرس ($2) طرفان $1 آيل آهن.",
        "newmessageslinkplural": "{{PLURAL:$1|ھڪ نئون پيغام|999=نوان پيغام}}",
        "newmessagesdifflinkplural": "آخري {{PLURAL:$1|تبديلي|999=تبديليون}}",
        "confirmable-confirm": "ڇا{{GENDER:$1|توهانکي}} پڪ آهي؟",
        "confirmable-yes": "ها",
        "confirmable-no": "نہ",
-       "thisisdeleted": "$1 کي ڏسڻ يا بحالڻ چاهيندا؟",
-       "viewdeleted": "$1 Ú\8fسÙ\86دا؟",
-       "restorelink": "{{PLURAL:$1|Ù\87ÚªÚ\99Ù\8a Ú\8aاٺÙ\84 ØªØ±Ù\85Ù\8aÙ\85|$1 Ú\8aاٺل ترميمون}}",
+       "thisisdeleted": "$1 کي ڏسندئو يا بحاليندئو؟",
+       "viewdeleted": "$1 Ú\8fسÙ\86دئÙ\88؟",
+       "restorelink": "{{PLURAL:$1|Ù\87ÚªÚ\99Ù\8a Ú\8aاٿÙ\84 ØªØ±Ù\85Ù\8aÙ\85|$1 Ú\8aاٿل ترميمون}}",
        "feedlinks": "روان رسد:",
-       "site-rss-feed": "$1 آر ايس ايس روان رسد",
+       "site-rss-feed": "$1 آرايسايس روان رسد",
        "site-atom-feed": "$1 اڻو روان رسد",
        "page-rss-feed": "\"$1\" RSS برق مواد",
        "page-atom-feed": "\"$1\" اڻو روان رسد",
        "nstab-image": "فائيل",
        "nstab-mediawiki": "نياپو",
        "nstab-template": "سانچو",
-       "nstab-help": "امدادي صفحو",
+       "nstab-help": "مددي صفحو",
        "nstab-category": "زمرو",
        "mainpage-nstab": "مک صفحو",
        "nosuchaction": "اهڙو ڪو بہ عمل نہ آهي",
        "changepassword-throttled": "توهان تازو ئي داخل ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
        "botpasswords": "بوٽ جو ڳجھولفظ",
        "botpasswords-disabled": "بوٽ ڳجھالفظ ناقابلِڪار ڪيل آھن.",
+       "botpasswords-label-appid": "باٽ جو نالو:",
        "botpasswords-label-create": "سرجيو",
        "botpasswords-label-update": "تجديد",
        "botpasswords-label-cancel": "رد",
        "prefs-diffs": "تفاوت",
        "prefs-help-prefershttps": "هيءَ ترجيح توهان جي ايند داخل ٿيڻ تي عمل ۾ ايندي.",
        "userrights": "يُوزر حق",
-       "userrights-lookup-user": "ÚªÙ\88 Ù\8aÙ\88زر چونڊيو",
+       "userrights-lookup-user": "ÚªÙ\88 Ù\88اھپ چونڊيو",
        "userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
-       "editusergroup": "Ù\8aÙ\88زر گروھ اتاريو",
+       "editusergroup": "Ù\88اھپ گروھ اتاريو",
        "userrights-editusergroup": "{{GENDER:$1|يوزر}} گروھ سنواريو",
-       "saveusergroups": "{{GENDER:$1|Ù\8aÙ\88زر}} گروھ سانڍيو",
+       "saveusergroups": "{{GENDER:$1|Ù\88اھپ}} گروھ سانڍيو",
        "userrights-groupsmember": "برڪن:",
        "userrights-groupsmember-auto": "رڪن واجبي:",
        "userrights-reason": "سبب:",
        "right-import": "ٻين وڪيز کان صفحا درآمديو",
        "right-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
        "right-mergehistory": "صفحن جي سوانح سنواريو",
-       "right-userrights": "سÚ\80 Ù\8aÙ\88زر Ø­Ù\82 ØªØ±Ù\85Ù\8aÙ\85 Úªريو",
+       "right-userrights": "سÚ\80 Ù\88اھپ Ø­Ù\82 Ø³Ù\86Ù\88اريو",
        "right-userrights-interwiki": "هن وڪي جي يوزرس جا حق ترميم ڪريو",
        "right-siteadmin": "اعدادخانو بنديو ۽ کوليو",
        "right-override-export-depth": "5ئين اونهائيءَ تائين ڳنڍيل صفحن سميت صفحا برآمديو",
        "grant-basic": "بنيادي حقَ",
        "grant-viewdeleted": "ڊَٺَلَ فائيلَ ۽ صفحا ڏسو",
        "grant-viewmywatchlist": "پنهنجي نظرھيٺ فھرست ڏسو",
-       "newuserlogpage": "Ù\8aÙ\88زر تخليق لاگ",
+       "newuserlogpage": "Ù\88اھپ تخليق لاگ",
        "rightslog": "يُوزر حق لاگ",
        "action-read": "هي صفحو پڙهو",
        "action-edit": "هن صفحي کي سسنواريو",
        "action-createpage": "ھي صفحو تخليق ڪريو",
        "action-createtalk": "ھي مباحثي صفحو تخليق ڪريو",
-       "action-createaccount": "هي يوزر کاتو تخليق ڪريو",
+       "action-createaccount": "ھي واھپ کاتو سرجيو",
        "action-history": "هن صفحي جي سوانح ڏسو",
        "action-minoredit": "هن ترميم کي معمولي طور نشان لڳايو",
        "action-move": "هيءَُ صفحو چوريو",
        "action-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
        "action-unwatchedpages": "اڻ ڏٺل صفحن جي فھرست ڏسو",
        "action-mergehistory": "هن صفحي جي سوانح ضم ڪريو",
-       "action-userrights": "سÚ\80 Ù\8aÙ\88زر Ø­Ù\82 ØªØ±Ù\85Ù\8aÙ\85 Úªريو",
+       "action-userrights": "سÚ\80 Ù\88اھپ Ø­Ù\82 Ø³Ù\86Ù\88اريو",
        "action-userrights-interwiki": "ٻين وڪيز جي يوزرس جا حق ترميم ڪريو",
        "action-siteadmin": "اعدادخاني کي بند ڪريو يا کوليو",
        "action-sendemail": "برقٽپال اماڻيو",
        "sp-deletedcontributions-contribs": "ڀاڱيداريون",
        "linksearch-ns": "نانءُپولار",
        "linksearch-ok": "ڳوليو",
-       "listusersfrom": "تÙ\8a Ø´Ø±Ù\88ع ÚªÙ\86دÚ\99 Ù\8aÙ\88زر ڏيکاريو:",
+       "listusersfrom": "تÙ\8a Ø´Ø±Ù\88ع ÚªÙ\86دÚ\99 Ù\88اھپ ڏيکاريو:",
        "listusers-submit": "ڏيکاريو",
        "listusers-noresult": "ڪو بہ يُوزر نہ لڌو",
        "listusers-blocked": "(بندشيل)",
        "activeusers-excludegroups": "گروھن سان تعلق رکندڙ گروھ ڇڏيو:",
        "activeusers-noresult": "ڪي بہ يُوزرس نہ لڌا.",
        "activeusers-submit": "سرگرم يُوزرس ڏيکاريو",
-       "listgrouprights": "Ù\8aÙ\88زر Ú¯Ø±Ù\88Ù¾ Ø¬Ø§ Ø­Ù\82",
+       "listgrouprights": "Ù\88اھپ Ú¯Ø±Ù\88Ú¾ Ø¬Ø§ Ø­Ù\82",
        "listgrouprights-group": "گروهہ:",
        "listgrouprights-rights": "حق",
        "listgrouprights-members": "(رڪنن جي فھرست)",
        "trackingcategories-nodesc": "ڪا به تشريح موجود نه آهي.",
        "trackingcategories-disabled": "زمرو ناقابلِ ڪار بڻايل آهي.",
        "emailuser": "هن واھپ کي برق ٽپال اماڻيو",
-       "emailuser-title-target": "Ú¾Ù\86 {{GENDER:$1|Ù\8aÙ\88زر}} ڏانھن برقٽپال موڪليو",
+       "emailuser-title-target": "Ú¾Ù\86 {{GENDER:$1|Ù\88اھپ}} ڏانھن برقٽپال موڪليو",
        "emailuser-title-notarget": "واھپ ڏانھن برقٽپال اماڻيو",
-       "usermaildisabled": "Ù\8aÙ\88زر Ø§Ù\8aÙ\85Ù\8aÙ\84 Ù\86اÙ\82ابÙ\84Ù\90 ڪار بڻيل",
+       "usermaildisabled": "Ù\88اھپ Ø¨Ø±Ù\82ٽپاÙ\84 Ù\86اÙ\82ابÙ\84Ù\90ڪار بڻيل",
        "usermaildisabledtext": "توهان هن وڪي تي ٻين يوزرس ڏانهن ايميل نٿا موڪلي سگھو",
        "noemailtitle": "برقٽپال پتو ناھي",
        "noemailtext": "هن واھپ ڪو بہ قابلِڪار برقٽپال پتو نہ ڄاڻايو آهي.",
        "unwatch": "نظر ۾ نہ رکو",
        "unwatchthispage": "نظر ۾ رکڻ ڇڏيو",
        "notanarticle": "غير موادي صفحو",
-       "watchlist-details": "{{PLURAL:$1|$1 صفحو|$1 صفحا}} توهان جي ٽيٽ فهرست، ڳالھ ٻولھ جا صفحا الڳ شمار نٿا ٿين.",
+       "watchlist-details": "توھان جي نظر ۾ فھرست (گڏوگڏ بحث صفحن تي) {{PLURAL:$1|$1 صفحو آھي|$1 صفحا آھن}}.",
        "wlshowlast": "گذريل $1 ڪلاڪ $2 ڏينهن ڏيکاريو",
        "watchlist-hide": "لڪايو",
        "watchlist-submit": "ڏيکاريو",
        "tooltip-invert": "هن دٻي تي نشان لڳايو صحفن ۾ تبديليون لڪائڻ لاءِ چونڊيل نانءَپولار مان (۽ لاڳاپيل نانءُپولار جيڪڏهن نشان لڳل)",
        "namespace_association": "منسلڪ نانءُپولار",
        "blanknamespace": "(مُک)",
-       "contributions": "{{GENDER:$1|Ù\8aÙ\88زر}} جون ڀاڱيداريون",
+       "contributions": "{{GENDER:$1|Ù\88اھپ}} جون ڀاڱيداريون",
        "contributions-title": "يُوزر ڀاڱيداريون براءِ $1",
        "mycontris": "ڀاڱيداريون",
        "anoncontribs": "ڀاڱيداريون",
        "import-upload-filename": "فائيل نانءُ:",
        "import-comment": "تاثر:",
        "importlogpage": "درآمد لاگ",
-       "tooltip-pt-userpage": "{{GENDER:|تÙ\88ھاÙ\86جÙ\88 Ù\8aÙ\88زر}} صفحو",
-       "tooltip-pt-mytalk": "{{GENDER:|تÙ\88ھاÙ\86جÙ\88}} Ù\8aÙ\88زر صفحو",
+       "tooltip-pt-userpage": "{{GENDER:|تÙ\88ھاÙ\86جÙ\88 Ù\88اھپ}} صفحو",
+       "tooltip-pt-mytalk": "{{GENDER:|تÙ\88ھاÙ\86جÙ\88}} Ù\88اھپ صفحو",
        "tooltip-pt-preferences": "{{GENDER:|توھانجون}} ترجيحون",
        "tooltip-pt-watchlist": "صفحن جي فھرست جيڪي توھان تبديلين لاءِ نظر ۾ رکيا آھن",
        "tooltip-pt-mycontris": "{{GENDER:|توھانجي}} ڀاڱيدارين جي فھرست",
        "tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
        "tooltip-feed-atom": "هن صفحي لاءِ ايٽم فيڊ",
        "tooltip-t-contributions": "{{GENDER:$1|ھن يوزر}} جي ڀاڱيدارين جي فھرست",
-       "tooltip-t-emailuser": "{{GENDER:$1|Ú¾Ù\86 Ù\8aÙ\88زر}} ڏانھن برقٽپال موڪليو",
+       "tooltip-t-emailuser": "{{GENDER:$1|Ú¾Ù\86 Ù\88اھپ}} ڏانھن برقٽپال موڪليو",
        "tooltip-t-upload": "فائيل چاڙهيو",
        "tooltip-t-specialpages": "سڀني خاص صفحن جي فھرست",
        "tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
        "tooltip-rollback": "\"واپس ورايو\" ھن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم(ن) کي ھڪ ٽڙڪ سان اڻڪري ٿو",
        "tooltip-preferences-save": "ترجيحون سانڍيو",
        "tooltip-summary": "ننڍو خلاصو ڏيو",
-       "anonymous": "گمنام {{PLURAL:$1|يوزر|يوزرس}} جو {{SITENAME}}",
+       "anonymous": "{{SITENAME}} جا گمنام {{PLURAL:$1|واھپ|واھپَ}}",
        "simpleantispam-label": "اينٽي-اسپام روڪ.\nھن کي <strong>نہ</strong> ڀريو!",
        "pageinfo-toolboxlink": "صفحي جي معلومات",
        "pageinfo-contentpage-yes": "ها",
        "pageinfo-category-total": "رڪنن جو ڪل تعداد",
        "pageinfo-category-subcats": "ذيلي زمرن جو تعداد",
        "pageinfo-category-files": "صفحن جو تعداد",
+       "markaspatrolledtext": "ھن صفحي کي گشت ڪيل طور نشان لڳايو",
        "previousdiff": "← اڳوڻي ترميم",
        "nextdiff": "نئين تر ترميم →",
        "file-info-size": "$1 × $2 عڪسلون، فائيل سائيز: $3، MIME ٽائيپ: $4",
        "noimages": "ڏسڻ لاءِ ڪجھہ ناهي.",
        "ilsubmit": "ڳوليو",
        "bydate": "تاريخوار",
+       "days-abbrev": "$1 ڏ",
        "hours": "{{PLURAL:$1|$1 ڪلاڪ|$1 ڪلاڪَ}}",
        "days": "{{PLURAL:$1|$1 ڏينهن|$1 ڏينهَن}}",
        "weeks": "{{PLURAL:$1|$1 هفتو|$1 هفتا}}",
        "logentry-delete-delete": "$1 {{GENDER:$2|ڊاٿو}} صفحو $3",
        "revdelete-uname-hid": "يُوزرنانءُ لڪل",
        "logentry-move-move": "$1 {{GENDER:$2|چوريو}} صفحو $3 ڏانهن $4",
-       "logentry-newusers-create": "Ù\8aÙ\88زر کاتو $1 {{GENDER:$2|سرجيو ويو}}",
+       "logentry-newusers-create": "Ù\88اھپ کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
        "rightsnone": "(ڪو بہ نہ)",
        "feedback-back": "پوئتي",
index c033af2..b61e6a3 100644 (file)
        "protect-othertime": "ٻیا ویلا:",
        "protect-othertime-op": "ٻیا ویلا",
        "restriction-edit": "لکھو",
-       "restriction-move": "ٹرو",
+       "restriction-move": "ٹورو",
        "restriction-create": "بݨاؤ",
        "restriction-upload": "اپلوڈ",
        "undelete": "مٹائے ڳئے ورقے ݙیکھو",
index 4126bac..69e3252 100644 (file)
        "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}",
        "rollbackfailed": "Неуспешно враћање",
        "cantrollback": "Не могу да вратим измену.\nПоследњи аутор је уједно и једини.",
-       "alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); неко други је већ изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) није успело; неко други је у међувремену изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Опис измене: <em>$1</em>.",
        "revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
        "revertpage-nouser": "Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
index 95b1797..2e290da 100644 (file)
        "rollbacklinkcount-morethan": "vrati više od $1 {{PLURAL:$1|izmene|izmene|izmena}}",
        "rollbackfailed": "Neuspešno vraćanje",
        "cantrollback": "Ne mogu da vratim izmenu.\nPoslednji autor je ujedno i jedini.",
-       "alreadyrolled": "Vraćanje poslednje izmene stranice [[:$1]] od strane {{GENDER:$2|korisnika|korisnice|korisnika}} [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmenio ili vratio stranicu.\n\nPoslednju izmenu je {{GENDER:$3|napravio|napravila|napravio}} [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Vraćanje poslednje izmene stranice [[:$1]] od strane {{GENDER:$2|korisnika|korisnice|korisnika}} [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) nije uspelo; neko drugi je u međuvremenu izmenio ili vratio stranicu.\n\nPoslednju izmenu je {{GENDER:$3|napravio|napravila|napravio}} [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Opis izmene: <em>$1</em>.",
        "revertpage": "Vraćene izmene [[Special:Contribs/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu korisnika [[User:$1|$1]]",
        "revertpage-nouser": "Vraćene su izmene skrivenog korisnika na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
index 54e4498..231f0ce 100644 (file)
        "sharedupload": "Ieu koropak téh ti $1 nu bisa jadi dipaké ku proyék-proyék lianna.",
        "sharedupload-desc-here": "Ieu berkas asalna ti $1 anu bisa jadi dipaké ku proyék séjén. \nPedaran ti [$2 kaca pedaranana] dipidangkeun di handap.",
        "filepage-nofile": "Taya berkas nu ngaranna kieu.",
+       "filepage-nofile-link": "Taya berkan nu ngaranna kieu, tapi anjeun bisa [$1 ngunjalkeunna].",
        "uploadnewversion-linktext": "ngamuatkeun vérsi anyar koropak ieu",
        "shared-repo-from": "ti $1",
        "shared-repo": "hiji répositori réréongan",
        "filerevert-submit": "Balikkeun",
        "filerevert-success": "'''[[Media:$1|$1]]''' geus dipulangkeun ka [vérsi $4, $3, $2].",
        "filerevert-badversion": "Euweuh vérsi lokal tiheula ti koropak ieu kalawan cap waktu anu dimaksud.",
+       "filerevert-identical": "Vérsi berkas ayeuna geus idéntik jeung berkas nu dipilih.",
        "filedelete": "Ngahapus $1",
        "filedelete-legend": "Ngahapus gambar",
        "filedelete-intro": "Anjeun rék ngahapus koropak '''[[Media:$1|$1]]''' katut sagala jujutanana.",
        "sp-contributions-newbies": "Témbongkeun kontribusi ti akun anyar wungkul",
        "sp-contributions-newbies-sub": "Pikeun akun anyar",
        "sp-contributions-blocklog": "log peungpeuk",
-       "sp-contributions-deleted": "kontribusi nu dihapus",
+       "sp-contributions-suppresslog": "kontribusi {{GENDER:$1|pamaké}} nu disamunikeun",
+       "sp-contributions-deleted": "kontribusi {{GENDER:$1|pamaké}} nu dipupus",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "obrolan",
-       "sp-contributions-userrights": "ngatur hak pamaké",
+       "sp-contributions-userrights": "Ménéjemén hak aksés {{GENDER:$1|pamaké}}",
        "sp-contributions-blocked-notice": "Ieu pamaké keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "sp-contributions-blocked-notice-anon": "Ieu alamat IP keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "sp-contributions-search": "Paluruh kontribusi",
        "blocklist-userblocks": "Sumputkeun peungpeukan akun",
        "blocklist-tempblocks": "Sumputkeun peungpeukan saheulaanan",
        "blocklist-addressblocks": "Sumputkeun pameungpeukan IP tunggal",
+       "blocklist-rangeblocks": "Nyumputkeun hontalan peungpeuk",
        "blocklist-timestamp": "Cap titimangsa",
        "blocklist-target": "Udagan",
        "blocklist-expiry": "Kadaluwarsa",
        "change-blocklink": "Robah status blokir",
        "contribslink": "kontribusi",
        "emaillink": "kirim surélék",
-       "autoblocker": "Otomatis dipeungpeuk kusabab alamat IP anjeun dipaké ku \"[[User:$1|$1]]\".\nAlesan: \"$2\"",
+       "autoblocker": "Otomatis dipeungpeuk kusabab alamat IP anjeun dipaké ku \"[[User:$1|$1]]\".\nAlesan nu dibikeun pikeun pameungpeukan nyaéta: \"$2\"",
        "blocklogpage": "Log_peungpeuk",
        "blocklog-showlog": "Ieu pamaké saméméhna geus kungsi dipeungpeuk.\nPikeun rujukan, logna dipidangkeun di handap ieu:",
        "blocklogentry": "meungpeuk [[$1]] nepi ka $2 $3",
        "range_block_disabled": "Pangabisa kuncén pikeun nyieun sarupaning peungpeuk geus ditumpurkeun.",
        "ipb_expiry_invalid": "Wanci daluwarsa teu bener.",
        "ipb_expiry_old": "Waktu kadaluwarsana mah baheula.",
+       "ipb_expiry_temp": "Pameungpeukan sandiasma nu samunikeun kudu permanén.",
        "ipb_already_blocked": "\"$1\" geus dipeungpeuk",
        "ipb-needreblock": "$1 geus dipeungpeuk. Rék dirobah sétinganana?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Peungpeuk|Peungpeuk}} lianna",
        "delete_and_move_confirm": "Enya, hapus kaca éta",
        "delete_and_move_reason": "Hapus sangkan bisa mindahkeun",
        "selfmove": "Judul sumber jeung tujuanana sarua, lain gé mindahkeun atuh!",
+       "immobile-source-namespace": "Teu bisa ngalihkeun kaca dina ngaranspasi \"$1\".",
+       "immobile-target-namespace": "Teu bisa ngalihkeun kaca ka ngaranspasi \"$1\".",
        "immobile-target-namespace-iw": "Tutumbu interwiki teu bisa dipaké salaku tujul pamindahan.",
        "immobile-source-page": "Ieu kaca teu bisa dipindahkeun.",
        "immobile-target-page": "Teu bisa mindahkeun ka judul nu ditujul.",
        "djvu_page_error": "Kaca DjVu teu kawadahan",
        "djvu_no_xml": "Hanteu bisa nyokot XML pikeun berkas DjVu",
        "thumbnail-temp-create": "Teu bisa nyieun berkas leutik témporer",
+       "thumbnail-dest-create": "Teu bisa nyimpen berkas leutik ka tujuan",
        "thumbnail_invalid_params": "Kasalahan paraméter miniatur",
        "thumbnail_toobigimagearea": "Berkas kalawan diménsi leuwih badag batan $1",
        "thumbnail_dest_directory": "Diréktori nu dituju teu bisa dijieun",
        "import-interwiki-submit": "Impor",
        "import-mapping-default": "Impor ka lokasi standar",
        "import-mapping-namespace": "Impor ka ngaranspasi:",
+       "import-mapping-subpage": "Impor minangka subkaca ti kaca di handap:",
        "import-upload-filename": "Ngaran berkas:",
        "import-comment": "Ringkesan:",
-       "importtext": "Mangga ékspor koropakna ti sumber nu dipaké ku wiki migunakeun fungsi Special:Export, simpen na piringan anjeun, teras muatkeun di dieu.",
+       "importtext": "Mangga ékspor koropakna ti sumber nu dipaké ku wiki ngagunakeun [[Special:Export|fungsi ékspor]], simpen na piringan anjeun, teras muatkeun di dieu.",
        "importstart": "Ngimpor kaca...",
        "import-revision-count": "$1 {{PLURAL:$1|vérsi heubeul}}",
        "importnopages": "henteu aya kaca keur diimpor.",
+       "imported-log-entries": "Geus diimpor $1 {{PLURAL:$1|saéntri log|éntri log}}.",
        "importfailed": "Ngimpor gagal: $1",
        "importunknownsource": "Tipeu sumber impor teu dipikawanoh",
        "importcantopen": "Teu bisa muka koropak impor",
        "importbadinterwiki": "Tutumbu antarwiki awon",
        "importsuccess": "Ngimpor geus hasil!",
-       "importnosources": "Teu aya sumber impor transwiki nu geus dijieun tur ngamuat jujutan sacara langsung geus dinon-aktifkeun.",
+       "importnosources": "Taya wiki ti nu diimpor nu geus dijieun sarta pamuatan jujuta sacara langsung geus di non-aktifkeun.",
        "importnofile": "Euweuh koropak impor nu dimuat.",
        "importuploaderrorsize": "Koropak impor gagal dimuat. Ukuranana ngaleuwihan wates nu diwenangkeun.",
        "importuploaderrorpartial": "Koropak impor gagal dimuat sagemblengna.",
        "exif-fixtureidentifier": "Ngaran fikstur",
        "exif-locationdest": "Lokasi nu digambarkeun",
        "exif-locationdestcode": "Kodeu lokasi nu digambarkeun",
+       "exif-contact": "Informasi kontak",
        "exif-writer": "Nu nulis",
        "exif-languagecode": "Basa",
        "exif-iimversion": "Vérsi IIM",
        "exif-lightsource-19": "Cahya baku C",
        "exif-lightsource-24": "Tungsten studio ISO",
        "exif-lightsource-255": "Sumber cahya séjén",
+       "exif-flash-fired-0": "Lampu kilat teu hurung",
        "exif-flash-fired-1": "Buricak hurung",
        "exif-flash-mode-3": "modeu otomatis",
        "exif-focalplaneresolutionunit-2": "inci",
        "blankpage": "Kaca kosong",
        "intentionallyblankpage": "Ieu kaca ngahaja dikosongkeun.",
        "external_image_whitelist": " #Antepkeun ieu baris sakumaha ayana<pre>\n#Paké fragmén éxprési régulér (ukur bagian anu aya di antara //) di handap\n#Ieu fragmén bakal dicocogkeun jeung URL gambar-gambar éksternal\n#Fragmén anu cocog bakal dipidangkeun minangka gambar, lamun henteu nu katémbong ukur tutumbuna #Baris nu dimimitian ku # bakal dianggap koméntar\n#Ieu teu ngabédakeun gedé leutikna aksara\n#Teundeun sakabéh fragmén éxprési régulér luhureun ieu baris. Antepkeun ieu baris sakumaha ayana</pre>",
+       "tags": "Tag parobahan valid",
        "tag-filter": "Saringan [[Special:Tags|tag]]:",
        "tag-filter-submit": "Saring",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
+       "tag-mw-contentmodelchange": "parobahan modél kontén",
        "tags-title": "Tag",
        "tags-tag": "Ngaran tag",
        "tags-source-header": "Sumber",
        "tags-deactivate-reason": "Alesan:",
        "tags-deactivate-submit": "Pareuman",
        "tags-edit-title": "Édit tag",
+       "tags-edit-manage-link": "Kokola tag",
        "tags-edit-existing-tags": "Tag nu aya:",
        "tags-edit-existing-tags-none": "<em>Taya</em>",
        "tags-edit-new-tags": "Tag anyar:",
        "tags-edit-chosen-no-results": "Euweuh tag nu luyu",
        "tags-edit-reason": "Alesan:",
        "tags-edit-revision-submit": "Larapkeun parobahan kana {{PLURAL:$1|ieu révisi|$1 révisi}}",
+       "tags-edit-success": "Parobahan dilarapkeun.",
        "comparepages": "Bandinkeun kaca",
        "compare-page1": "Kaca 1",
        "compare-page2": "Kaca 2",
        "htmlform-float-invalid": "Niléy anu diasupkeun lain angka.",
        "htmlform-int-toolow": "Niléy anu diasupkeun kurang ti $1 anu pangleutikna",
        "htmlform-int-toohigh": "Niléy anu diasupkeun leuwih ti $1 anu panggedéna",
+       "htmlform-required": "Ieu niléy diperlukeun",
        "htmlform-submit": "Kirim",
        "htmlform-reset": "Bolaykeun parobahan",
        "htmlform-selectorother-other": "Lianna",
        "htmlform-date-placeholder": "TTTT-BB-HH",
        "htmlform-time-placeholder": "JJ:MM:DD",
        "htmlform-datetime-placeholder": "TTTT-BB-HH JJ:MM:DD",
+       "htmlform-title-not-creatable": "\"$1\" lain mangrupa judul kaca nu bisa dijieun",
        "htmlform-title-not-exists": "$1 euweuh.",
        "htmlform-user-not-exists": "<strong>$1</strong> taya.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngahapus}} kaca $3",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngamuat}} $3",
        "log-name-tag": "Log tag",
        "rightsnone": "(euweuh)",
+       "rightslogentry-temporary-group": "$1 (samentara, nika $2)",
        "feedback-adding": "Nambahkeun eupan balik kana kaca...",
        "feedback-back": "Balik deui",
        "feedback-cancel": "Bolay",
        "feedback-useragent": "Agén pamaké:",
        "searchsuggest-search": "Paluruh {{SITENAME}}",
        "searchsuggest-containing": "ngandung...",
+       "api-error-badtoken": "Kasalahan internal: Token goréng.",
        "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "authmanager-realname-label": "Ngaran asli",
        "authmanager-realname-help": "Ngaran asli pamaké",
        "authmanager-provider-password": "Oténtikasi dumasar kecap sandi",
+       "authmanager-provider-temporarypassword": "Kecap sandi samentara",
+       "authprovider-confirmlink-success-line": "$1: Numbukeun ngahasil.",
        "authprovider-resetpass-skip-label": "Liwatan",
        "authprovider-resetpass-skip-help": "Liwatan pamulangan kecap sandi",
        "authform-newtoken": "Token leungit. $1",
        "cannotauth-not-allowed": "Anjeun teu diidinan pikeun maké ieu kaca",
        "changecredentials": "Robah krédensial",
        "changecredentials-submit": "Robah krédensial",
+       "changecredentials-invalidsubpage": "$1 téh jinis krédensial nu teu sah.",
        "removecredentials": "Pupus krédensial",
        "removecredentials-submit": "Pupus krédensial",
        "removecredentials-success": "Krédensial Anda geus dipupus.",
        "restrictionsfield-help": "Hiji alamat IP atawa pantengan CIDR per baris. Pikeun ngahurungkeun sakumna, paké:\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "révisi $1",
        "pageid": "ID kaca $1",
+       "rawhtml-notallowed": "Tag &lt;html&gt; teu bisa dipaké di luar kaca normal.",
        "gotointerwiki": "Ninggalkeun{{SITENAME}}",
        "gotointerwiki-invalid": "Judul nu ditangtukeun teu sah.",
        "undelete-cantedit": "Anjeun teu bisa ngabolaykeun pamupusan ieu kaca lantaran anjeun teu bisa ngédit ieu kaca.",
index 909b2a6..1ecebde 100644 (file)
        "sp-contributions-newonly": "Visa endast redigeringar där sidor skapas",
        "sp-contributions-hideminor": "Dölj mindre redigeringar",
        "sp-contributions-submit": "Sök",
+       "sp-contributions-outofrange": "Kunde inte visa några resultat. Det begärda IP-intervallet är större än CIDR-gränsen på /$1.",
        "whatlinkshere": "Vad som länkar hit",
        "whatlinkshere-title": "Sidor som länkar till \"$1\"",
        "whatlinkshere-page": "Sida:",
index 547c09c..359ce58 100644 (file)
        "createacct-realname": "అసలు పేరు (ఐచ్చికం)",
        "createacct-reason": "కారణం",
        "createacct-reason-ph": "మీరు మరో ఖాతాను ఎందుకు సృష్టించుకుంటున్నారు",
+       "createacct-reason-help": "సృష్టించిన ఖాతాల చిట్టాలో చూపించే సందేశం",
        "createacct-submit": "మీ ఖాతాను సృష్టించుకోండి",
        "createacct-another-submit": "ఖాతాను సృష్టించు",
        "createacct-continue-submit": "ఖాతా సృష్టిని కొనసాగించండి",
        "changepassword-success": "మీ సంకేతపదం మార్చబడింది!",
        "changepassword-throttled": "కొద్దిసేపటిగా మీరు చాలా లాగిన్ ప్రయత్నాలు చేసారు.\nమళ్ళీ ప్రయత్నించే ముందు $1 ఆగండి.",
        "botpasswords": "బాట్ సంకేతపదాలు",
+       "botpasswords-disabled": "బాట్ సంకేతపదాలను అచేతనం చేసాం.",
+       "botpasswords-no-central-id": "బాఅత్ సంకేతపదాలను వాడాలంటే, మీరు ఒక కేంద్రీకృత ఖాతాలోకి లాగినవ్వాలి.",
+       "botpasswords-createnew": "ఓ కొత్త బాట్ సంకేతపదాన్ని సృష్టించండి",
+       "botpasswords-editexisting": "ఉనికిలో ఉన్న బాట్ సంకేతపదాన్ని మార్చండి",
        "botpasswords-label-appid": "బాట్ పేరు:",
        "botpasswords-label-create": "సృష్టించు",
        "botpasswords-label-update": "తాజాకరించు",
        "passwordreset-emailelement": "వాడుకరిపేరు: \n$1\n\nతాత్కాలిక సంకేతపదం: \n$2",
        "passwordreset-emailsentemail": "ఈ ఈమెయిలు చిరునామా మీ ఖాతాకు అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
        "passwordreset-emailsentusername": "ఈ వాడుకరిపేరుకు ఏదైనా ఈమెయిలు చిరునామా అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
+       "passwordreset-nosuchcaller": "కాలర్ ఉనికిలో లేరు: $1",
        "passwordreset-invalidemail": "తప్పు ఈ-మెయిలు చిరునామా",
        "passwordreset-nodata": "వాడుకరిపేరుగానీ, ఈ-మెయిలు చిరునామా గానీ ఇవ్వలేదు",
        "changeemail": "ఈ-మెయిలు చిరునామా మార్పు లేదా తొలగింపు",
        "missingcommentheader": "<strong>గుర్తు చేస్తున్నాం:</strong> ఈ వ్యాఖ్యకు మీరు విషయం పెట్టలేదు.\n\"$1\"ని మళ్ళీ నొక్కితే, అది లేకుండానే మీ మార్పును భద్రపరుస్తాం.",
        "summary-preview": "దిద్దుబాటు సారాంశం మునుజూపు:",
        "subject-preview": "విషయపు మునుజూపు:",
-       "previewerrortext": "à°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°®à±\81à°¨à±\81à°\9cà±\82à°ªà±\81 à°\9aà±\82à°¡à°\9fà°\82à°²à±\8b à°¤à°ªà±\8dపిదమయింది.",
+       "previewerrortext": "à°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°®à±\81à°¨à±\81à°\9cà±\82à°ªà±\81 à°\9aà±\82పడà°\82à°²à±\8b à°²à±\8bà°ªà°\82 à°¦à±\8aà°°à±\8dà°²ింది.",
        "blockedtitle": "వాడుకరి నిరోధించబడ్డారు",
        "blockedtext": "<strong>మీ వాడుకరి పేరు లేదా ఐ.పీ. చిరునామా నిరోధించబడింది.</strong>\n\nనిరోధించినది $1.\nఅందుకు ఇచ్చిన కారణం: <em>$2</em>.\n\n* నిరోధం మొదలైన సమయం: $8\n* నిరోధించిన కాలం: $6\n* నిరోధానికి గురైనవారు: $7\n\nఈ నిరోధంపై చర్చించేందుకు మీరు $1 ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించవచ్చు.\nమీ [[Special:Preferences|ఖాతా అభిరుచులలో]] సరైన ఈ-మెయిలు చిరునామా ఇచ్చివుండకపోయినా లేదా మిమ్మల్ని  'ఈ వాడుకరికి ఈ-మెయిలు పంపు' సౌలభ్యాన్ని వాడుకోవడం నుండి నిరోధించివున్నా మీరు ఈమెయిలు ద్వారా సంప్రదించలేరు.\nమీ ప్రస్తుత ఐ.పీ. చిరునామా $3, మరియు నిరోధపు ID #$5.\nమీ సంప్రదింపులన్నిటిలోనూ వీటిని పేర్కొనండి.",
        "autoblockedtext": "మీ ఐపీ చిరునామా ఆటోమాటిగ్గా నిరోధించబడింది. ఎందుకంటే ఇదే ఐపీ చిరునామాని ఓ నిరోధిత వాడుకరి ఉపయోగించారు. ఆ వాడుకరిని $1 నిరోధించారు.\nఅందుకు ఇచ్చిన కారణం ఇదీ:\n\n:<em>$2</em>\n\n* నిరోధం మొదలైన సమయం: $8\n* నిరోధించిన కాలం: $6\n* ఉద్దేశించిన నిరోధిత వాడుకరి: $7\n\nఈ నిరోధం గురించి చర్చించేందుకు మీరు $1 ను గానీ, లేదా ఇతర [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గానీ సంప్రదించండి.\n\nమీ [[Special:Preferences|అభిరుచులలో]] సరైన ఈమెయిలు ఐడీని ఇచ్చి ఉంటే తప్ప, మీరు \"ఈ సభ్యునికి మెయిలు పంపు\" అనే అంశాన్ని వాడజాలరని గమనించండి. ఆ సౌలభ్యాన్ని వాడటం నుండి మిమ్మల్ని నిరోధించలేదు.\n\nమీ ప్రస్తుత ఐపీ చిరునామా $3, మరియు నిరోధపు ఐడీ: $5.\nమీ సంప్రదింపులన్నిటిలోను అన్ని పై వివరాలను ఉదహరించండి.",
        "history-edit-tags": "ఎంచుకున్న సంస్కరణల ట్యాగులను సవరించు",
        "rev-deleted-comment": "(మార్పుల సంగ్రహాన్ని తొలగించారు)",
        "rev-deleted-user": "(వాడుకరి పేరుని తొలగించారు)",
-       "rev-deleted-event": "(à°\9aà°¿à°\9fà±\8dà°\9fà°¾ à°µà°¿à°µà°°à°¾à°²à°¨à±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81)",
+       "rev-deleted-event": "(à°\9aà°¿à°\9fà±\8dà°\9fà°¾ à°µà°¿à°µà°°à°¾à°²à°¨à±\81 à°¤à±\80à°¸à±\87సాà°\82)",
        "rev-deleted-user-contribs": "[వాడుకరిపేరు లేదా ఐపీ చిరునామాని తొలగించారు  - మార్పుచేర్పుల నుండి మార్పుని దాచారు]",
        "rev-deleted-text-permission": "ఈ పేజీ కూర్పుని <strong>తొలగించారు</strong>.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో పూర్తి వివరాలు చూడవచ్చు.",
        "rev-deleted-text-unhide": "పేజీ యొక్క ఈ కూర్పును '''తొలగించాం'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు చూడవచ్చు.\nమీరు కావాలనుకుంటే, [$1 ఈ కూర్పుని చూడవచ్చు].",
        "mergehistory-go": "విలీనం చెయ్యదగ్గ దిద్దుబాట్లను చూపించు",
        "mergehistory-submit": "కూర్పులను విలీనం చెయ్యి",
        "mergehistory-empty": "ఏ కూర్పులనూ విలీనం చెయ్యలేము.",
-       "mergehistory-done": "$1 à°¯à±\8aà°\95à±\8dà°\95 $3 {{PLURAL:$3|à°\95à±\82à°°à±\8dà°ªà±\81ని|à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81}} [[:$2]] à°²à±\8bనిà°\95à°¿ à°\9cయపà±\8dà°°à°¦à°\82à°\97à°¾ à°µà°¿à°²à±\80à°¨à°\82 à°\9aà±\87సాà°\82.",
+       "mergehistory-done": "$1 à°¯à±\8aà°\95à±\8dà°\95 $3 {{PLURAL:$3|à°\95à±\82à°°à±\8dà°ªà±\81à°¨à±\81|à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81}} [[:$2]] à°²à±\8bనిà°\95à°¿ à°µà°¿à°²à±\80à°¨à°\82 {{PLURAL:$3|à°\9aà±\87సాà°\82|à°\9aà±\87సాà°\82}}.",
        "mergehistory-fail": "చరితాన్ని విలీనం చెయ్యలేకపోయాం. పేజీని, సమయాలను సరిచూసుకోండి.",
        "mergehistory-fail-bad-timestamp": "కాలముద్ర చెల్లదు.",
+       "mergehistory-fail-invalid-source": "మూలపు పేజీ సరైనది కాదు.",
+       "mergehistory-fail-invalid-dest": "లక్ష్యిత పేజీ సరైనది కాదు.",
+       "mergehistory-fail-permission": "చరిత్ర విలీనానికి సరిపడా అనుమతులు లేవు.",
+       "mergehistory-fail-self-merge": "మూలం, లక్ష్యం పేజీలు ఒకటే.",
        "mergehistory-no-source": "మూలం పేజీ, $1 లేదు.",
        "mergehistory-no-destination": "గమ్యం పేజీ, $1 లేదు.",
        "mergehistory-invalid-source": "మూలం పేజీకి సరైన పేరు ఉండాలి.",
        "search-file-match": "(ఫైలు విషయంతో సరిపోలుతోంది)",
        "search-suggest": "మీరు అంటున్నది ఇదా: $1",
        "search-rewritten": "$1 కు ఫలితాలు చూపిస్తున్నాం. లేదంటే $2 కోసం వెతకండి.",
-       "search-interwiki-caption": "సోదర ప్రాజెక్టులు",
+       "search-interwiki-caption": "à°¸à±\8bదర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8bని à°«à°²à°¿à°¤à°¾à°²à±\81",
        "search-interwiki-default": "$1 నుండి ఫలితాలు:",
        "search-interwiki-more": "(మరిన్ని)",
        "search-interwiki-more-results": "మరిన్ని ఫలితాలు",
        "search-external": "బయటి అన్వేషణ",
        "searchdisabled": "{{SITENAME}} అన్వేషణ తాత్కాలికంగా పని చెయ్యడం లేదు. ఈలోగా మీరు గూగుల్‌ ఉపయోగించి అన్వేషించవచ్చు. గమనిక: గూగుల్‌ వారి {{SITENAME}} ఫలితాలు కాలదోషం పట్టి ఉండే అవకాశం ఉంది.",
        "search-error": "$1 కోసం వెతికేటపుడు లోపమేదో దొర్లింది.",
+       "search-warning": "వెతుకుతూండగా ఓ హెచ్చరిక ఎదురైంది: $1",
        "preferences": "అభిరుచులు",
        "mypreferences": "అభిరుచులు",
        "prefs-edits": "దిద్దుబాట్ల సంఖ్య:",
        "prefs-editwatchlist-clear": "మీ వీక్షణజాబితాను తుడిచివేయండి",
        "prefs-watchlist-days": "వీక్షణ జాబితాలో చూపించవలసిన రోజులు:",
        "prefs-watchlist-days-max": "గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజులు}}",
-       "prefs-watchlist-edits": "విసà±\8dà°¤à±\83à°¤ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాలà±\8b à°\9aà±\82పిà°\82à°\9aవలసిన à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dà°²à±\81:",
+       "prefs-watchlist-edits": "à°µà±\80à°\95à±\8dà°·à°£à°\9cాబితాలà±\8b à°\9aà±\82పిà°\82à°\9aవలసిన à°\97à°°à°¿à°·à±\8dà°  à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dà°² à°¸à°\82à°\96à±\8dà°¯:",
        "prefs-watchlist-edits-max": "గరిష్ఠ సంఖ్య: 1000",
        "prefs-watchlist-token": "వీక్షణాజాబితా టోకెను:",
        "prefs-misc": "ఇతరత్రా",
        "prefs-help-prefershttps": "ఈ అభిరుచి మీరు పైసారి లాగినైనపుడు అమలౌతుంది.",
        "prefswarning-warning": "మీ అభిరుచులలో మీరు చేసిన మార్పులను ఇంకా భద్రపరచలేదు. మీరు \"$1\" ను నొక్కకుండా ఈ పేజీని వదలి వెళ్తే, మీ అభిరుచులు భద్రం కావు.",
        "prefs-tabs-navigation-hint": "చిట్కా: ట్యాబుల జాబితాలో ఓ ట్యాబు నుండి మరోదానికి వెళ్ళేందుకు కుడి ఎడమ బాణాల కీలను వాడవచ్చు.",
-       "userrights": "వాడుకరి హక్కుల నిర్వహణ",
+       "userrights": "వాడుకరి హక్కుల",
        "userrights-lookup-user": "వాడుకరిని ఎంచుకోండి",
        "userrights-user-editname": "వాడుకరిపేరును ఇవ్వండి:",
        "editusergroup": "వాడుకరి గుంపులను చూపించు",
        "editinguser": "{{GENDER:$1|user}} వాడుకరి హక్కులను మారుస్తున్నారు <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "{{GENDER:$1|వాడుకరి}} <strong>[[User:$1|$1]]</strong> హక్కులను చూస్తున్నారు $2",
        "userrights-editusergroup": "{{GENDER:$1|వాడుకరి}} సమూహాలను మార్చండి",
        "userrights-viewusergroup": "{{GENDER:$1|వాడుకరి}} గుంపులను చూడండి",
        "saveusergroups": "{{GENDER:$1|వాడుకరి}} గుంపులను భద్రపరచు",
        "userrights-groupsmember": "సభ్యులు:",
        "userrights-groupsmember-auto": "సంభావిత సభ్యులు:",
-       "userrights-groups-help": "à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\8fà°¯à±\87 à°\97à±\81à°\82à°ªà±\81లలà±\8b à°\89à°\82డాలà±\8b à°®à±\80à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°µà°\9aà±\8dà°\9aà±\81.\n* à°\9fà°¿à°\95à±\8dà°\95à±\81 à°ªà±\86à°\9fà±\8dà°\9fà°¿à°µà±\81à°\82à°\9fà±\87 à°\86 à°\97à±\81à°\82à°ªà±\81à°²à±\8b à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\89à°¨à±\8dà°¨à°\9fà±\8dà°\9fà±\81.\n* à°\9fà°¿à°\95à±\8dà°\95à±\81 à°²à±\87à°\95à±\81à°\82à°\9fà±\87 à°\86 à°\97à±\81à°\82à°ªà±\81à°²à±\8b à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°²à±\87à°¨à°\9fà±\8dà°\9fà±\81.\n* à°\88 * à°\97à±\81à°°à±\8dà°¤à±\81 à°\89à°\82à°\9fà±\87 à°\92à°\95సారి à°\86 à°\97à±\81à°\82à°ªà±\81ని చేర్చాక మీరు తీసివేయలేరు, లేదా తీసివేసాక తిరిగి చేర్చలేరు.\n* ఈ # గుర్తు ఉంటే ఆ గుంపు కాలం తీరిపోయే సమయాన్ని పెంచగలరు; దాన్ని తగ్గించలేరు.",
+       "userrights-groups-help": "à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\8fà°¯à±\87 à°\97à±\81à°\82à°ªà±\81లలà±\8b à°\89à°\82డాలà±\8b à°®à±\80à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°µà°\9aà±\8dà°\9aà±\81.\n* à°\9fà°¿à°\95à±\8dà°\95à±\81 à°ªà±\86à°\9fà±\8dà°\9fà°¿à°µà±\81à°\82à°\9fà±\87 à°¸à°¦à°°à±\81 à°\97à±\81à°\82à°ªà±\81à°²à±\8b à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\89à°¨à±\8dà°¨à°\9fà±\8dà°\9fà±\81.\n* à°\9fà°¿à°\95à±\8dà°\95à±\81 à°²à±\87à°\95à±\81à°\82à°\9fà±\87 à°¸à°¦à°°à±\81 à°\97à±\81à°\82à°ªà±\81à°²à±\8b à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°²à±\87à°¨à°\9fà±\8dà°\9fà±\81.\n* * à°\97à±\81à°°à±\8dà°¤à±\81 à°\89à°\82à°\9fà±\87 à°\92à°\95సారి à°\86 à°\97à±\81à°\82à°ªà±\81à°\95à±\81 చేర్చాక మీరు తీసివేయలేరు, లేదా తీసివేసాక తిరిగి చేర్చలేరు.\n* ఈ # గుర్తు ఉంటే ఆ గుంపు కాలం తీరిపోయే సమయాన్ని పెంచగలరు; దాన్ని తగ్గించలేరు.",
        "userrights-reason": "కారణం:",
        "userrights-no-interwiki": "ఇతర వికీలలో వాడుకరి హక్కులను మార్చడానికి మీకు అనుమతి లేదు.",
        "userrights-nodatabase": "$1 అనే డేటాబేసు లేదు లేదా అది స్థానికం కాదు.",
        "userrights-changeable-col": "మీరు మార్చదగిన గుంపులు",
        "userrights-unchangeable-col": "మీరు మార్చలేని గుంపులు",
+       "userrights-expiry-current": "కాలంతీరే వ్యవధి $1",
        "userrights-expiry-none": "ఎన్నటికీ కాలం తీరిపోదు",
        "userrights-expiry": "కాలం తీరిపోయే వ్యవధి",
        "userrights-expiry-existing": "ప్రస్తుత కాలం తీరిపోయే సమయం: $3, $2",
        "grant-group-email": "ఈమెయిలు పంపించడం",
        "grant-group-administration": "నిర్వాహక చర్యలు చేపట్టడం",
        "grant-group-private-information": "మీ గోపనీయ డేటాను చూడడం",
+       "grant-createaccount": "ఖాతాల సృష్టి",
+       "grant-createeditmovepage": "పేజీల సృష్టి, దిద్దుబాటు, తరలింపు",
+       "grant-delete": "పేజీలు, కూర్పులు, లాగ్ ఎంట్రీల తొలగింపు",
+       "grant-editinterface": "MediaWiki పేరుబరిలోను, వాడుకరి CSS/JavaScript కూ దిద్దుబాట్లు.",
+       "grant-editmycssjs": "వాడుకరి CSS/JavaScript దిద్దుబాటు",
+       "grant-editmyoptions": "మీ అభిరుచుల దిద్దుబాటు",
+       "grant-editmywatchlist": "మీ వీక్షణజాబితా దిద్దుబాటు",
+       "grant-editpage": "ఉనికిలో ఉన్న పేజీల దిద్దుబాటు",
+       "grant-editprotected": "సంరక్షిత పేజీల్లో దిద్దుబాట్లు",
+       "grant-highvolume": "అధిక మొత్తంలో దిద్దుబాట్లు",
+       "grant-oversight": "వాడుకరులను దాచడం, కూర్పులను అణచిపెట్టడం",
+       "grant-patrol": "పేజీల్లో మార్పులపై నిఘా",
+       "grant-privateinfo": "గోపనీయ సమాచారం అందుబాటు",
+       "grant-protect": "పేజీల సంరక్షణ, అరక్షణ",
+       "grant-rollback": "పేజీల్లో చేసిన మార్పుల తిరుగుసేత (రోల్‌బ్యాక్)",
+       "grant-sendemail": "ఇతర వాడుకరులకు ఈమెయిలు పంపడం",
+       "grant-uploadeditmovefile": "దస్త్రాల ఎక్కింపు, రీప్లేసు, తరలింపు",
+       "grant-uploadfile": "కొత్త దస్త్రాల ఎక్కింపు",
        "grant-basic": "ప్రాథమిక హక్కులు",
+       "grant-viewdeleted": "తొలగించిన దస్త్రాలు, పేజీలను చూడడం",
+       "grant-viewmywatchlist": "మీ వీక్షణజాబితాను చూడడం",
        "newuserlogpage": "కొత్త వాడుకరుల చిట్టా",
        "newuserlogpagetext": "ఇది వాడుకరి నమోదుల చిట్టా.",
        "rightslog": "వాడుకరుల హక్కుల మార్పుల చిట్టా",
        "action-createpage": "ఈ పేజీని సృష్టించే",
        "action-createtalk": "ఈ చర్చాపేజీని సృష్టించే",
        "action-createaccount": "ఈ వాడుకరి ఖాతాని సృష్టించే",
+       "action-autocreateaccount": "ఈ బయటి వాడుకరి ఖాతాను ఆటోమాటిగ్గా సృష్టించే",
        "action-history": "ఈ పేజీ యొక్క చరిత్రని చూడండి",
        "action-minoredit": "ఈ మార్పుని చిన్నదిగా గుర్తించే",
        "action-move": "ఈ పేజీని తరలించే",
        "action-viewmywatchlist": "మీ వీక్షణ జాబితాను చూడండి",
        "action-viewmyprivateinfo": "మీ గోపనీయ సమాచారాన్ని చూడండి",
        "action-editmyprivateinfo": "మీ గోపనీయ సమాచారాన్ని సరిదిద్దండి",
-       "action-editcontentmodel": "à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\95à°\82à°\9fà±\86à°\82à°\9fà±\81 à°®à±\8bà°¡à°²à±\81à°¨à±\81 à°¸à°µà°°à°¿à°\82à°\9aà±\81",
+       "action-editcontentmodel": "à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\95à°\82à°\9fà±\86à°\82à°\9fà±\81 à°®à±\8bà°¡à°²à±\81à°¨à±\81 à°¸à°µà°°à°¿à°\82à°\9aà±\87",
        "action-managechangetags": "ట్యాగులను చేర్చే, (అ)చేతనం చేసే",
        "action-applychangetags": "మీ మార్పులతో ట్యాగులను ఆపాదించే",
        "action-deletechangetags": "డేటాబేసు నుండి ట్యాగులను తొలగించే",
+       "action-purge": "ఈ పేజీని పర్జ్ చేసే",
        "nchanges": "{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|చివరి సందర్శన తరువాత}}, $1",
        "enhancedrc-history": "చరితం",
        "recentchanges-legend-heading": "<strong>సూచిక :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
        "recentchanges-submit": "చూపించు",
+       "rcfilters-tag-remove": "'$1'ను తీసివెయ్యి",
+       "rcfilters-legend-heading": "<strong>సంక్షేపాల (ఎబ్రీవియేషన్లు) జాబితా:</strong>",
+       "rcfilters-other-review-tools": "<strong>ఇతర సమీక్షా ఉపకరణాలు</strong>",
+       "rcfilters-group-results-by-page": "ఫలితాలను పేజీవారీగా గుదిగుచ్చు",
+       "rcfilters-grouping-title": "గుదిగుచ్చడం",
+       "rcfilters-activefilters": "సచేతనమైన వడపోతలు",
+       "rcfilters-advancedfilters": "ఉన్నత వడపోతలు",
+       "rcfilters-limit-title": "చూపించాల్సిన మార్పులు",
+       "rcfilters-limit-shownum": "చివరి {{PLURAL:$1|మార్పును|$1 మార్పులను}} చూపించు",
+       "rcfilters-days-title": "ఇటీవలి రోజులు",
+       "rcfilters-hours-title": "ఇటీవలి గంటలు",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|రోజు|రోజులు}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|గంట|గంటలు}}",
+       "rcfilters-highlighted-filters-list": "హైలైటు చేసినవి: $1",
+       "rcfilters-quickfilters": "భద్రపరచిన వడపోతకాలు",
+       "rcfilters-quickfilters-placeholder-title": "ఇంకా లింకులు వేటినీ భద్రపరచలేదు",
+       "rcfilters-quickfilters-placeholder-description": "మీ వడపోత సెట్టింగులను భద్రపరచి తరువాత వాడుకోవాలంటే, కింద ఉన్న యాక్టివ్ ఫిల్టర్ ఏరియా లోని పేజీక (బుక్‌మార్కు) ఐకన్ను నొక్కండి.",
+       "rcfilters-savedqueries-defaultlabel": "భద్రపరచిన వడపోతకాలు",
+       "rcfilters-savedqueries-rename": "పేరుమార్చు",
+       "rcfilters-savedqueries-setdefault": "డిఫాల్టుగా సెట్ చెయ్యండి",
+       "rcfilters-savedqueries-unsetdefault": "డిఫాల్టును తీసివెయ్యి",
        "rcfilters-savedqueries-remove": "తొలగించు",
        "rcfilters-savedqueries-new-name-label": "పేరు",
+       "rcfilters-savedqueries-new-name-placeholder": "వడపోతకపు ఉద్దేశమేంటో వివరించండి",
+       "rcfilters-savedqueries-apply-label": "వడపోతకాన్ని సృష్టించు",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "డిఫాల్టు వడపోతకాన్ని సృష్టించు",
+       "rcfilters-savedqueries-cancel-label": "రద్దు చెయ్యి",
+       "rcfilters-savedqueries-add-new-title": "ప్రస్తుత వడపోత సెట్టింగులను భద్రపరచు",
+       "rcfilters-restore-default-filters": "డిఫాల్టు వడపోతకాలను పునఃస్థాపించు",
+       "rcfilters-clear-all-filters": "వడపోతకాలన్నింటినీ తుడిచెయ్యి",
+       "rcfilters-show-new-changes": "సరికొత్త మార్పులను చూడండి",
+       "rcfilters-search-placeholder": "ఇటీవలి మార్పులను వడకట్టు (శోధించండి లేదా టైపించడం మొదలుపెట్టండి)",
+       "rcfilters-invalid-filter": "తప్పు వడపోతకం",
+       "rcfilters-empty-filter": "చేతనంగా ఉన్న వడపోతకాలేమీ లేవు. మార్పుచేర్పు లన్నిటినీ చూపించాం.",
        "rcfilters-filterlist-title": "వడపోతలు",
+       "rcfilters-filterlist-whatsthis": "ఇవి ఎలా పనిచేస్తాయి?",
+       "rcfilters-filterlist-feedbacklink": "ఈ (కొత్త) వడపోత పరికరాలు ఎలా ఉన్నాయో మాకు చెప్పండి",
+       "rcfilters-highlightbutton-title": "ఫలితాలను హైలైటు చెయ్యి",
        "rcfilters-highlightmenu-title": "ఒక రంగును ఎంచుకోండి",
+       "rcfilters-highlightmenu-help": "ఈ లక్షణాన్ని హైలైటు చేసేందుకు ఓ రంగును ఎంచుకోండి",
+       "rcfilters-filterlist-noresults": "వడపోతకాలేమీ కనబడలేదు",
+       "rcfilters-noresults-conflict": "వెతకాల్సిన పదాలు పరస్పరం ఘర్షిస్తున్నందువలన ఫలితాలేమీ రాలేదు.",
+       "rcfilters-state-message-fullcoverage": "ఈగుంపులోని వడపోతలన్నిటినీ ఎంచుకోవడమూ, అసలు దేన్నీ ఎంచుకోకపోవడమూ ఒక్కటే. అంచేత ఈ వడపోత ప్రభావమేమీ ఉండదు. గుంపులో ఈ వడపోతలున్నాయి: $1",
+       "rcfilters-filtergroup-authorship": "కర్తృత్వం",
        "rcfilters-filter-editsbyself-label": "మీ దిద్దుబాట్లు",
        "rcfilters-filter-editsbyself-description": "మీ స్వంత దిద్దుబాట్లు.",
        "rcfilters-filter-editsbyother-label": "ఇతరుల దిద్దుబాట్లు",
        "rcfilters-filter-editsbyother-description": "మీరు చేసినవి కాకుండా మిగిలిన దిద్దుబాట్లన్నీ.",
-       "rcfilters-filtergroup-userExpLevel": "అనుభవ స్థాయి (నమోదైన వాడుకరులకు మాత్రమే)",
-       "rcfilters-filter-user-experience-level-registered-label": "నమోదైనది",
+       "rcfilters-filtergroup-userExpLevel": "వాడుకరి నమోదు, అనుభవం",
+       "rcfilters-filter-user-experience-level-registered-label": "నమోదైనవారు",
+       "rcfilters-filter-user-experience-level-registered-description": "లాగినై ఉన్న వాడుకరులు.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "నమోదు కానివారు",
+       "rcfilters-filter-user-experience-level-unregistered-description": "లాగినై లేని వాడుకరులు.",
        "rcfilters-filter-user-experience-level-newcomer-label": "కొత్తవారు",
-       "rcfilters-filter-user-experience-level-newcomer-description": "10 కంటే తక్కువ దిద్దుబాట్లు, 4 రోజుల కంటే తక్కువ పని.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10 కంటే తక్కువ దిద్దుబాట్లు, 4 రోజుల కంటే తక్కువ పని చేసిన నమోదైన వాడుకరులు.",
        "rcfilters-filter-user-experience-level-learner-label": "నేర్చుకుంటున్నవారు",
-       "rcfilters-filter-user-experience-level-learner-description": "\"కొత్తవారి\" కంటే ఎక్కువ, \"అనుభవజ్ఞులైన వాడుకరుల\" కంటే తక్కువ అనుభవం.",
+       "rcfilters-filter-user-experience-level-learner-description": "అనుభవ స్థాయి \"కొత్తవారి\"కి, \"అనుభవజ్ఞులైన వాడుకరుల\"కూ మధ్యలో ఉన్న వాడుకరులు.",
        "rcfilters-filter-user-experience-level-experienced-label": "అనుభవజ్ఞులైన వాడుకరులు",
-       "rcfilters-filter-user-experience-level-experienced-description": "30 రోజుల కంటే ఎక్కువ పని, 500 పైచిలుకు దిద్దుబాట్లు.",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 రోజుల కంటే ఎక్కువ పని, 500 కు పైగా దిద్దుబాట్లూ చేసిన వాడుకరులు.",
+       "rcfilters-filtergroup-automated": "ఆటోమాటిక్ మార్పులు",
        "rcfilters-filter-bots-label": "బాట్",
+       "rcfilters-filter-bots-description": "ఆటోమాటిక్ ఉపకరణాలు చేసిన మార్పులు.",
+       "rcfilters-filter-humans-label": "మనిషి (బాట్ కాదు)",
+       "rcfilters-filter-humans-description": "మనుష్యులు చేసిన మార్పులు.",
+       "rcfilters-filtergroup-reviewstatus": "సమీక్ష స్థాయి",
+       "rcfilters-filter-patrolled-label": "నిఘాలో ఉన్నవి",
+       "rcfilters-filter-patrolled-description": "నిఘాలో ఉన్నట్లు గుర్తించిన మార్పులు",
+       "rcfilters-filter-unpatrolled-label": "నిఘాలో లేనివి",
+       "rcfilters-filter-unpatrolled-description": "నిఘాలో ఉన్నట్లు గుర్తించని మార్పులు",
        "rcfilters-filtergroup-significance": "ప్రాముఖ్యం",
        "rcfilters-filter-minor-label": "చిన్న మార్పులు",
        "rcfilters-filter-minor-description": "రచయిత చిన్నవిగా గుర్తు పెట్టిన దిద్దుబాట్లు.",
        "rcfilters-filter-major-label": "చిన్నవి కాని దిద్దుబాట్లు",
        "rcfilters-filter-major-description": "చిన్నవిగా గుర్తు పెట్టని దిద్దుబాట్లు.",
+       "rcfilters-filtergroup-watchlist": "వీక్షణలో ఉన్న పేజీలు",
+       "rcfilters-filter-watchlist-watched-label": "వీక్షణజాబితాలో",
+       "rcfilters-filter-watchlist-watched-description": "మీ వీక్షణ జబితాలో ఉన్న పేజీల్లో జరిగిన మార్పులు.",
+       "rcfilters-filter-watchlist-watchednew-label": "కొత్త వీక్షణజాబితా మార్పులు",
+       "rcfilters-filter-watchlist-watchednew-description": "మార్పులు జరిగాక ఇంకా మీరు చూడని మీ వీక్షణజాబితా లోని పేజీలు.",
+       "rcfilters-filter-watchlist-notwatched-label": "వీక్షణజాబితాలో లేనివి",
+       "rcfilters-filter-watchlist-notwatched-description": "మీ వీక్షణజాబితాలో ఉన్న పేజీల్లో జరిగినవి తప్ప మిగతా మార్పులన్నీ.",
+       "rcfilters-filtergroup-watchlistactivity": "వీక్షణజాబితా కార్యకలాపం",
+       "rcfilters-filter-watchlistactivity-unseen-label": "చూడని మార్పులు",
+       "rcfilters-filter-watchlistactivity-unseen-description": "పేజీల్లో మార్పులు జరిగిన తరువాత మీరింకా చూడనివి.",
+       "rcfilters-filter-watchlistactivity-seen-label": "చూసిన మార్పులు",
+       "rcfilters-filter-watchlistactivity-seen-description": "మార్పులు జరిగాక మీరు చూసేసినవి.",
        "rcfilters-filtergroup-changetype": "దిద్దుబాటు రకం",
        "rcfilters-filter-pageedits-label": "పేజీ దిద్దుబాట్లు",
+       "rcfilters-filter-pageedits-description": "వికీ పాఠ్యంలో, చర్చల్లో, వర్గ వివరణల్లో జరిగిన మార్పులు...",
        "rcfilters-filter-newpages-label": "పేజీల సృష్టి",
        "rcfilters-filter-newpages-description": "కొత్త పేజీలను సృష్టించే దిద్దుబాట్లు.",
        "rcfilters-filter-categorization-label": "వర్గాల దిద్దుబాట్లు",
-       "rcfilters-filter-logactions-description": "నిర్వాహక పనులు, ఖాతా పనులు, పేజీ తొలగింపులు, ఎక్కింపులు....",
+       "rcfilters-filter-categorization-description": "వర్గాల్లో చేర్చిన, తీసేసిన పేజీల రికార్డు.",
+       "rcfilters-filter-logactions-label": "చిట్టాల్లోకి చేరిన కార్యకలాపాలు",
+       "rcfilters-filter-logactions-description": "నిర్వాహక పనులు, ఖాతాల సృష్టి, పేజీ తొలగింపులు, ఎక్కింపులు...",
+       "rcfilters-hideminor-conflicts-typeofchange": "కొన్ని రకాల మార్పులను \"చిన్న\" మార్పులుగా సూచించ జాలరు. అంచేత ఈ వడపోత కింది మార్పు రకాల వడపోతలతో ఘర్షిస్తోంది: $1",
+       "rcfilters-filtergroup-lastRevision": "ఇటీవలి కూర్పులు",
+       "rcfilters-filter-lastrevision-label": "ఇటీవలి కూర్పు",
+       "rcfilters-filter-lastrevision-description": "పేజీలో ఇటీవల జరిగిన చిట్టచివరి మార్పు.",
+       "rcfilters-filter-previousrevision-label": "ఇటీవలి కూర్పు కాదు",
+       "rcfilters-filter-previousrevision-description": "\"చిట్టచివరి కూర్పు\" కాని మార్పులన్నీ.",
+       "rcfilters-filter-excluded": "వదిలేసినవి",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:not</strong> $1",
+       "rcfilters-exclude-button-off": "ఎంచుకున్నవాటిని వదిలెయ్యి",
+       "rcfilters-exclude-button-on": "ఎంచుకున్నవాటిని వదిలేస్తున్నాం",
+       "rcfilters-view-advanced-filters-label": "ఉన్నత వడపోతలు",
+       "rcfilters-view-tags": "ట్యాగ్ ఉన్న మార్పులు",
+       "rcfilters-view-namespaces-tooltip": "ఫలితాలను పేరుబరి ప్రకారం వడపోయి",
+       "rcfilters-liveupdates-button": "లైవ్ తాజాకరణలు",
+       "rcfilters-liveupdates-button-title-on": "లైవ్ తాజాకరణలను ఆఫ్ చెయ్యి",
+       "rcfilters-liveupdates-button-title-off": "కొత్త మార్పులు, జరుగుతూండగానే చూపించు",
+       "rcfilters-watchlist-markseen-button": "మాఅర్పులన్నీ చూసినట్లుగా గుర్తించు",
+       "rcfilters-watchlist-edit-watchlist-button": "మీ వీక్షణ జాబితాను సవరించండి",
        "rcnotefrom": "<strong>$3, $4</strong> తరువాత జరిగిన {{PLURAL:$5|మార్పు|మార్పులు}} కింద ఇచ్చాం (<strong>$1</strong> దాకా చూపించాం).",
-       "rclistfrom": "$3, $2 కు ముందు  జరిగిన మార్పులను చూపించు",
+       "rclistfromreset": "తేదీ ఎంపికను రీసెట్ చెయ్యి",
+       "rclistfrom": "$3, $2 తో మొదలుపెట్టి ఆ తరువాత జరిగిన మార్పులను చూపించు",
        "rcshowhideminor": "చిన్న మార్పులను $1",
        "rcshowhideminor-show": "చూపించు",
        "rcshowhideminor-hide": "దాచు",
        "rcshowhidemine": "నా మార్పులను $1",
        "rcshowhidemine-show": "చూపించు",
        "rcshowhidemine-hide": "దాచు",
-       "rcshowhidecategorization": "à°ªà±\87à°\9cà°¿  వర్గీకరణ $1",
+       "rcshowhidecategorization": "à°ªà±\87à°\9cà±\80 వర్గీకరణ $1",
        "rcshowhidecategorization-show": "చూపించు",
        "rcshowhidecategorization-hide": "దాచు",
        "rclinks": "గత  $2 రోజుల లోని చివరి $1 మార్పులను చూపించు",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] వర్గానికి చేర్చబడింది, [[Special:WhatLinksHere/$1|ఈ పేజీ ఇతర పేజీల్లో చేర్చబడింది]]",
        "recentchanges-page-removed-from-category": "[[:$1]] వర్గం నుండి తీసివేయబడింది",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] వర్గం నుండి తీసివేయబడింది, [[Special:WhatLinksHere/$1|ఈ పేజీ ఇతర పేజీల్లో చేర్చబడింది]]",
+       "autochange-username": "MediaWiki ఆటోమాటిక్ మార్పు",
        "upload": "దస్త్రపు ఎక్కింపు",
        "uploadbtn": "దస్త్రాన్ని ఎక్కించు",
        "reuploaddesc": "మళ్ళీ అప్‌లోడు ఫారంకు వెళ్ళు.",
        "wantedtemplates": "కావాల్సిన మూసలు",
        "mostlinked": "అధిక లింకులు చూపే పేజీలు",
        "mostlinkedcategories": "అధిక లింకులు చూపే వర్గాలు",
-       "mostlinkedtemplates": "à°\8eà°\95à±\8dà°\95à±\81à°µà°\97à°¾ à°\89పయà±\8bà°\97à°¿à°\82à°\9aిన పేజీలు",
+       "mostlinkedtemplates": "à°\8eà°\95à±\8dà°\95à±\81à°µà°\97à°¾ à°\9fà±\8dరానà±\8dà°¸à±\8dâ\80\8cà°\95à±\8dà°²à±\82à°¡à°¯ిన పేజీలు",
        "mostcategories": "అధిక వర్గాలలో చేరిన వ్యాసాలు",
        "mostimages": "అధిక లింకులు గల బొమ్మలు",
        "mostinterwikis": "అత్యధిక అంతరవికీ లింకులు కలిగిన పేజీలు",
        "protectedpages-unknown-timestamp": "తెలియని",
        "protectedpages-unknown-performer": "తెలియని వాడుకరి",
        "protectedtitles": "సంరక్షిత శీర్షికలు",
-       "protectedtitles-summary": "à°¯à±\80 à°ªà±\87à°\9cà±\80à°²à±\8b à°ªà±\8dà°°à°¸à±\8dà°¤à±\81తానిà°\95à°¿ à°¨à°¿à°°à±\8dమాణà°\82 à°¨à°¿à°·à°¿à°¦à±\8dదమà±\88à°¨ à°¶à±\80à°°à±\8dణిà°\95లనà±\8dà°¨à±\80 à°ªà±\8aà°\82à°¦à±\81పరà°\9aబడà±\8dడాయి.à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°\89à°¨à±\8dà°¨ à°°à°\95à±\8dà°·à°¿à°¤ à°ªà±\87à°\9cà±\80à°²à°\95à±\8bà°¸à°\82 à°¯à°¿à°\95à±\8dà°\95à°¡ à°\9aà±\82à°¡à°\82à°¡à°¿ [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "à°¯à±\80 à°ªà±\87à°\9cà±\80à°²à±\8b à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°\95à±\81à°\82à°¡à°¾ à°¨à°¿à°°à±\8bధిà°\82à°\9aబడà±\8dà°¡ à°¶à±\80à°°à±\8dణిà°\95లనà±\8dà°¨à±\80 à°ªà±\8aà°\82à°¦à±\81పరà°\9aబడà±\8dడాయి. à°¸à°\82à°°à°\95à±\8dà°·à°¿à°\82à°\9aబడà±\8dà°¦ à°ªà±\87à°\9cà±\80à°²à°\95à±\8bà°¸à°\82 à°¯à°¿à°\95à±\8dà°\95à°¡ à°\9aà±\82à°¡à°\82à°¡à°¿: [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "ఈ పరామితులతో ప్రస్తుతం శీర్షికలేమీ సరక్షించబడి లేవు.",
        "listusers": "వాడుకరుల జాబితా",
        "listusers-editsonly": "మార్పులు చేసిన వాడుకరులను మాత్రమే చూపించు",
        "apihelp-no-such-module": "\"$1\" మాడ్యూలు కనబడలేదు.",
        "apisandbox": "API ప్రయోగశాల",
        "apisandbox-api-disabled": "ఈ సైటులో API అచేతనమై ఉంది.",
-       "apisandbox-unfullscreen": "à°ªà±\87à°\9cà±\80à°¨à±\81 చూపించు",
+       "apisandbox-unfullscreen": "à°ªà±\87à°\9cà±\80ని చూపించు",
        "apisandbox-submit": "అభ్యర్ధించు",
        "apisandbox-reset": "తుడిచివేయి",
        "apisandbox-retry": "మళ్ళీ ప్రయత్నించు",
        "listgrants-grant": "గ్రాంటు",
        "listgrants-rights": "హక్కులు",
        "trackingcategories": "పహారా కాయు వర్గాలు",
-       "trackingcategories-msg": "పహారా à°\95ారà±\8dà°¯à±\81 à°µà°°à±\8dà°\97à°®à±\81",
+       "trackingcategories-msg": "పహారా కాయు వర్గము",
        "trackingcategories-name": "సందేశం పేరు",
        "trackingcategories-desc": "వర్గపు చేర్పు క్రైటేరియా",
        "broken-file-category-desc": "ఈ పుటలో విరిగిన దస్త్ర లంకె ఉన్నది (దస్త్రం ఉనికిలో లేనప్పుడు దస్త్రానికి ఎంబెడ్ చేయు లంకె).",
        "protectlogpage": "సంరక్షణల చిట్టా",
        "protectlogtext": "ఈ క్రింద ఉన్నది పేజీల సంరక్షణలకు జరిగిన మార్పుల జాబితా.\nప్రస్తుతం అమలులో ఉన్న సంరక్షణలకై [[Special:ProtectedPages|సంరక్షిత పేజీల జాబితా]]ను చూడండి.",
        "protectedarticle": "\"[[$1]]\" సంరక్షించబడింది.",
-       "modifiedarticleprotection": "\"[[$1]]\" సరక్షణ స్థాయిని మార్చాం",
-       "unprotectedarticle": "\"[[$1]]\" à°¯à±\8aà°\95à±\8dà°\95 à°¸à°\82à°°à°\95à±\8dషణనà±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81",
+       "modifiedarticleprotection": "\"[[$1]]\" à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయిని à°®à°¾à°°à±\8dà°\9aà°¾à°\82",
+       "unprotectedarticle": "\"[[$1]]\" à°¯à±\8aà°\95à±\8dà°\95 à°¸à°\82à°°à°\95à±\8dషణనà±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¾à°\82",
        "movedarticleprotection": "సంరక్షణా అమరికని \"[[$2]]\" నుండి \"[[$1]]\"కి మార్చారు",
        "protectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షించారు}}",
        "modifiedarticleprotection-comment": "\"[[$1]]\" యొక్క {{GENDER:$2|సంరక్షణ స్థాయిని మార్చారు}}",
        "unprotectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షణ నుండి తీసివేసారు}}",
-       "protect-title": "\"$1\" à°¯à±\8aà°\95à±\8dà°\95 à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయి à°\85à°®ర్పు",
+       "protect-title": "\"$1\" à°¯à±\8aà°\95à±\8dà°\95 à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయి à°®à°¾ర్పు",
        "protect-title-notallowed": "\"$1\" యొక్క సంరక్షణ స్థాయి",
        "prot_1movedto2": "$1, $2కు తరలించబడింది",
        "protect-badnamespace-title": "సంరక్షించజాలని పేరుబరి",
        "protectcomment": "కారణం:",
        "protectexpiry": "గడువు:",
        "protect_expiry_invalid": "గడువు సమయాన్ని సరిగ్గా ఇవ్వలేదు.",
-       "protect_expiry_old": "à°®à±\80à°°à°¿à°\9aà±\8dà°\9aà°¿à°¨ à°\97à°¡à±\81à°µà±\81 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤ à°¸à°®à°¯à°\82 à°\95à°\82à°\9fà±\87 à°®à±\81à°\82à°¦à±\81 ఉంది.",
+       "protect_expiry_old": "à°\97à°¡à±\81à°µà±\81 à°\97à°¤ à°\95ాలà°\82à°²à±\8b ఉంది.",
        "protect-unchain-permissions": "మరిన్ని సంరక్షణ వికల్పాలను తెరువు",
        "protect-text": "ఈ పెజీ '''$1''' ఎంత సంరక్షణలొ వుందో మీరు ఇక్కడ చూడవచ్చు, మార్చవచ్చు.",
        "protect-locked-blocked": "నిరోధించబడి ఉండగా మీరు సంరక్షణ స్థాయిని మార్చలేరు. ప్రస్తుతం '''$1''' పేజీకి ఉన్న సెట్టింగులివి:",
        "protect-level-autoconfirmed": "స్వయన్నిర్ధారిత వాడుకరులను మాత్రమే అనుమతించు",
        "protect-level-sysop": "నిర్వాహకులను మాత్రమే అనుమతించు",
        "protect-summary-cascade": "కాస్కేడింగు",
-       "protect-expiring": "$1 (UTC)న కాలంచెల్లుతుంది",
-       "protect-expiring-local": "$1న కాలంచెల్లుతుంది",
+       "protect-expiring": "$1 (UTC)న కాలం చెల్లుతుంది",
+       "protect-expiring-local": "$1న కాలం చెల్లుతుంది",
        "protect-expiry-indefinite": "నిరవధికం",
        "protect-cascade": "ఈ పేజీకి జతపరిచిన పేజీలను కూడా రక్షించు (కాస్కేడింగు రక్షణ)",
        "protect-cantedit": "ఈ పేజీ యొక్క సంరక్షణా స్థాయిని మీరు మార్చలేరు, ఎందుకంటే దాన్ని మార్చే అనుమతి మీకు లేదు.",
        "pagesize": "(బైట్లు)",
        "restriction-edit": "మార్చడం",
        "restriction-move": "తరలించడం",
-       "restriction-create": "à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\81",
-       "restriction-upload": "à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà±\81",
+       "restriction-create": "à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°¡à°\82",
+       "restriction-upload": "à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà°¡à°\82",
        "restriction-level-sysop": "పూర్తి సంరక్షణ",
        "restriction-level-autoconfirmed": "అర్థ సంరక్షణ",
        "restriction-level-all": "ఏ స్థాయి అయినా",
        "undelete": "తుడిచివేయబడ్డ పేజీలను చూపించు",
        "undeletepage": "తుడిచివేయబడిన పేజీలను చూపించు, పునఃస్థాపించు",
-       "undeletepagetitle": "'''క్రింద చూపిస్తున్నవి [[:$1]] యొక్క తొలగించిన మార్పులు'''.",
+       "undeletepagetitle": "<strong>క్రింద చూపిస్తున్న వాటిలో [[:$1|$1]] యొక్క తొలగించిన కూర్పు లున్నాయి</strong>.",
        "viewdeletedpage": "తొలగించిన పేజీలను చూడండి",
        "undeletepagetext": "క్రింది {{PLURAL:$1|పేజీని|$1 పేజీలను}} తొలగించారు, కానీ పునఃస్థాపనకు వీలుగా భండాగారంలో ఉన్నాయి.\nభండాగారం నిర్ణీత వ్యవధులలో పూర్తిగా ఖాళీ చేయబడుతుంటుంది.",
        "undelete-fieldset-title": "కూర్పులను పునఃస్థాపించండి",
        "month": "ఈ నెల నుండి (అంతకు ముందువి):",
        "year": "ఈ సంవత్సరం నుండి (అంతకు ముందువి):",
        "sp-contributions-newbies": "కొత్త ఖాతాల యొక్క రచనలని మాత్రమే చూపించు",
-       "sp-contributions-newbies-sub": "కొత్తవారి కోసం",
+       "sp-contributions-newbies-sub": "కొత్త ఖాతాల కోసం",
        "sp-contributions-newbies-title": "కొత్త ఖాతాల వాడుకరుల మార్పుచేర్పులు",
        "sp-contributions-blocklog": "నిరోధాల చిట్టా",
        "sp-contributions-suppresslog": "అణచిపెట్టబడిన {{GENDER:$1|వాడుకరి}} రచనలు",
        "whatlinkshere-hideimages": "$1 దస్త్రపు లంకెలు",
        "whatlinkshere-filters": "వడపోతలు",
        "whatlinkshere-submit": "వెళ్ళు",
-       "autoblockid": "tanaDDu #$1",
+       "autoblockid": "ఆటోనిరోధం #$1",
        "block": "వాడుకరి నిరోధం",
        "unblock": "వాడుకరిపై నిరోధాన్ని తీసెయ్యండి",
        "blockip": "{{GENDER:$1|వాడుకరిని}} నిరోధించు",
        "ipaddressorusername": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
        "ipbexpiry": "అంతమయ్యే గడువు",
        "ipbreason": "కారణం:",
-       "ipbreason-dropdown": "*సాధారణ నిరోధ కారణాలు\n** తప్పు సమాచారాన్ని చొప్పించడం\n** పేజీల్లోని సమాచారాన్ని తీసెయ్యడం\n** బయటి సైట్లకు లంకెలతో స్పాము చెయ్యడం\n** పేజీల్లోకి చెత్తను ఎక్కించడం\n** బెదిరింపు ప్రవర్తన/వేధింపులు\n** అనేక ఖాతాలను సృష్టించి దుశ్చర్యకు పాల్పడడం\n** అనుచితమైన వాడుకరి పేరు\n** అదుపు తప్పిన బాటు",
+       "ipbreason-dropdown": "*సాధారణ నిరోధ కారణాలు\n** తప్పు సమాచారాన్ని చొప్పించడం\n** పేజీల్లోని సమాచారాన్ని తీసెయ్యడం\n** బయటి సైట్లకు లంకెలతో స్పాము చెయ్యడం\n** పేజీల్లోకి చెత్తను ఎక్కించడం\n** బెదిరింపు ప్రవర్తన/వేధింపులు\n** అనేక ఖాతాలను సృష్టించి దుశ్చర్యకు పాల్పడడం\n** అనుచితమైన వాడుకరి పేరు",
        "ipb-hardblock": "లాగినై ఉన్న వాడుకరులు ఈ ఐపీ అడ్రసు నుంచి మార్పుచేర్పులు చెయ్యకుండా నిరోధించండి",
-       "ipbcreateaccount": "à°\96ాతా à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°ªà±\81ని à°¨à°¿à°µà°¾à°°à°¿à°\82à°\9aà±\81",
+       "ipbcreateaccount": "ఖాతా సృష్టిని నివారించు",
        "ipbemailban": "వాడుకరిని ఈ-మెయిల్ చెయ్యకుండా నివారించు",
        "ipbenableautoblock": "ఈ వాడుకరి వాడిన చివరి ఐపీ అడ్రసును, అలాగే ఆ తరువాత వాడే అడ్రసులను కూడా ఆటోమాటిగ్గా నిరోధించు",
        "ipbsubmit": "ఈ సభ్యుని నిరోధించు",
        "ipb-unblock": "వాడుకరి పేరుపై లేదా ఐపీ చిరునామాపై ఉన్న నిరోధాన్ని తొలగించండి",
        "ipb-blocklist": "అమల్లో ఉన్న నిరోధాలను చూపించు",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} మార్పులు-చేర్పులు",
-       "ipb-blocklist-duration-left": "$1 మిగిలివున్నాయి",
-       "unblockip": "సభà±\8dà°¯à±\81à°¨ిపై నిరోధాన్ని తొలగించు",
+       "ipb-blocklist-duration-left": "ఇంకా $1 మిగిలి ఉంది.",
+       "unblockip": "వాడà±\81à°\95à°°ిపై నిరోధాన్ని తొలగించు",
        "unblockiptext": "కింది ఫారం ఉపయోగించి, నిరోధించబడిన ఐ.పీ. చిరునామా లేదా సభ్యునికి తిరిగి రచనలు చేసే అధికారం ఇవ్వవచ్చు.",
        "ipusubmit": "ఈ నిరోధాన్ని తొలగించు",
        "unblocked": "[[User:$1|$1]]పై నిరోధం తొలగించబడింది",
        "block-log-flags-noemail": "ఈ-మెయిలుని నిరోధించాం",
        "block-log-flags-nousertalk": "తమ చర్చాపేజీని మార్చలేరు",
        "block-log-flags-angry-autoblock": "మరింత ధృడమైన స్వయంనిరోధకం సచేతనం చేయబడింది",
-       "block-log-flags-hiddenname": "వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\81ని à°¦à°¾à°\9aారà±\81",
+       "block-log-flags-hiddenname": "వాడà±\81à°\95à°°à°¿à°ªà±\87à°°à±\81ని à°¦à°¾à°\9aà°¾à°\82",
        "range_block_disabled": "శ్రేణి(రేంజి) నిరోధం చెయ్యగల నిర్వాహక అనుమతిని అశక్తం చేసాం.",
        "ipb_expiry_invalid": "అంతమయ్యే గడువు సరైనది కాదు.",
        "ipb_expiry_temp": "దాచిన వాడుకరిపేరు నిరోధాలు శాశ్వతంగా ఉండాలి.",
index 43c0c77..aab3113 100644 (file)
        "sp-contributions-search": "Maghanap ng ambag",
        "sp-contributions-username": "IP Address o bansag:",
        "sp-contributions-toponly": "Ipakita lang ang mga pamamatnugot na mga huling rebisyon",
+       "sp-contributions-newonly": "Ipakita lang ang mga pamamatnugot na mga nalikhang pahina",
        "sp-contributions-submit": "Hanapin",
        "sp-contributions-explain": "",
        "whatlinkshere": "Mga nakaturo dito",
index 168b9db..77474e8 100644 (file)
        "and": "和",
        "faq": "常见问题",
        "actions": "操作",
-       "namespaces": "å\91½å\90\8d空间",
+       "namespaces": "å\90\8då­\97空间",
        "variants": "变种",
        "navigation-heading": "导航菜单",
        "errorpagetitle": "错误",
        "unwatchthispage": "停止监视",
        "notanarticle": "非内容页面",
        "notvisiblerev": "上次由不同用户所作的版本已经删除",
-       "watchlist-details": "æ\82¨ç\9a\84ç\9b\91è§\86å\88\97表中æ\9c\89{{PLURAL:$1|$1个页é\9d¢}}ï¼\88å¤\96å\8a 讨论页)。",
+       "watchlist-details": "æ\82¨ç\9a\84ç\9b\91è§\86å\88\97表中æ\9c\89{{PLURAL:$1|$1个页é\9d¢}}ï¼\88å\8c\85å\90«讨论页)。",
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面<strong>加粗</strong>显示。",
        "wlnote": "下面是{{PLURAL:$2|过去<strong>$2</strong>小时}}的{{PLURAL:$1|最后<strong>$1</strong>个更改}},截至$3 $4。",
index 46fdcf4..a3b7d5a 100644 (file)
        "unwatchthispage": "停止監視",
        "notanarticle": "非內容的頁面",
        "notvisiblerev": "最後一次由其他使用者所作的修訂已經被刪除",
-       "watchlist-details": "您的監視清單上共有 $1 個頁面 (不包含對話頁面)。",
+       "watchlist-details": "您的監視清單上共有 $1 個頁面(包含對話頁面)。",
        "wlheader-enotif": "已開啟電子郵件通知功能。",
        "wlheader-showupdated": "在您最後一次檢視過後修改的頁面會以 <strong>粗體</strong> 顯示。",
        "wlnote": "以下為自 $3 $4 之前的 <strong>$2</strong> 小時內所做的 <strong>$1</strong> 次變更。",
index 89e8089..ecbbb85 100644 (file)
@@ -1244,8 +1244,8 @@ abstract class Maintenance {
         * This function has the same parameters as wfGetDB()
         *
         * @param int $db DB index (DB_REPLICA/DB_MASTER)
-        * @param array $groups; default: empty array
-        * @param string|bool $wiki; default: current wiki
+        * @param array $groups default: empty array
+        * @param string|bool $wiki default: current wiki
         * @return IMaintainableDatabase
         */
        protected function getDB( $db, $groups = [], $wiki = false ) {
index 1ebc4f6..04158ae 100644 (file)
@@ -35,6 +35,7 @@ class AddSite extends Maintenance {
        /**
         * Imports the site described by the parameters (see self::__construct()) passed to this
         * maintenance sccript into the sites table of MediaWiki.
+        * @return bool
         */
        public function execute() {
                $siteStore = MediaWikiServices::getInstance()->getSiteStore();
index 8bd060f..504c7d7 100644 (file)
@@ -21,6 +21,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup Maintenance
  */
@@ -41,6 +43,7 @@ class CompareParserCache extends Maintenance {
                $scanned = 0;
                $withcache = 0;
                $withdiff = 0;
+               $parserCache = MediaWikiServices::getInstance()->getParserCache();
                while ( $pages-- > 0 ) {
                        $row = $dbr->selectRow( 'page', '*',
                                [
@@ -66,7 +69,7 @@ class CompareParserCache extends Maintenance {
 
                        $parserOptions = $page->makeParserOptions( 'canonical' );
 
-                       $parserOutputOld = ParserCache::singleton()->get( $page, $parserOptions );
+                       $parserOutputOld = $parserCache->get( $page, $parserOptions );
 
                        if ( $parserOutputOld ) {
                                $t1 = microtime( true );
index 94b7fb4..6128d23 100644 (file)
@@ -69,6 +69,8 @@ class DeprecatedInterfaceFinder extends FileAwareNodeVisitor {
        /**
         * Check whether a function or method includes a call to wfDeprecated(),
         * indicating that it is a hard-deprecated interface.
+        * @param PhpParser\Node $node
+        * @return bool
         */
        public function isHardDeprecated( PhpParser\Node $node ) {
                if ( !$node->stmts ) {
index d273a6a..26a9c39 100644 (file)
@@ -410,7 +410,7 @@ class GenerateSitemap extends Maintenance {
        /**
         * gzwrite() / fwrite() wrapper
         *
-        * @param resource $handle
+        * @param resource &$handle
         * @param string $str
         */
        function write( &$handle, $str ) {
@@ -427,7 +427,7 @@ class GenerateSitemap extends Maintenance {
        /**
         * gzclose() / fclose() wrapper
         *
-        * @param resource $handle
+        * @param resource &$handle
         */
        function close( &$handle ) {
                if ( $this->compress ) {
index 4313806..9d4e261 100644 (file)
@@ -222,7 +222,7 @@ class MigrateComments extends LoggedUpdateMaintenance {
         * comment ID field.
         * Blanks the old fields while migrating.
         *
-        * @param string $oldTable Table to migrate
+        * @param string $table Table to migrate
         * @param string $primaryKey Primary key of the table.
         * @param string $oldField Old comment field name
         * @param string $newPrimaryKey Primary key of the new table.
index 01cf3c3..8ac7f91 100644 (file)
@@ -106,6 +106,7 @@ class UserOptions {
 
        /**
         * Dumb stuff to run a mode.
+        * @return bool
         */
        public function run() {
                if ( !$this->mReady ) {
index 4c5266e..bd9890b 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -20,6 +20,9 @@
                <exclude name="MediaWiki.Usage.DbrQueryUsage.DbrQueryFound" />
                <exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionVarUsage" />
                <exclude name="MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals" />
+               <exclude name="MediaWiki.Files.ClassMatchesFilename.WrongCase" />
+               <exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
+               <exclude name="MediaWiki.Files.OneClassPerFile.MultipleFound" />
        </rule>
        <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
                <properties>
index 3a5de66..f0aa9ec 100644 (file)
@@ -1506,6 +1506,9 @@ return [
        'mediawiki.action.view.postEdit' => [
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.js',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.less',
+               'skinStyles' => [
+                       'monobook' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.monobook.css',
+               ],
                'dependencies' => [
                        'mediawiki.jqueryMsg',
                        'mediawiki.notification'
index 467928d..e1fa925 100644 (file)
        }
 }
 
-// TODO: Move to monobook skin
-.skin-monobook .postedit {
-       top: 6em !important; /* stylelint-disable-line declaration-no-important */
-}
-
 .postedit-faded {
        opacity: 0;
 }
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.postEdit.monobook.css b/resources/src/mediawiki.action/mediawiki.action.view.postEdit.monobook.css
new file mode 100644 (file)
index 0000000..50f0c8a
--- /dev/null
@@ -0,0 +1,3 @@
+.postedit {
+       top: 6em;
+}
index bace9d0..9930525 100644 (file)
@@ -145,7 +145,7 @@ span.comment {
 li span.deleted,
 span.history-deleted {
        text-decoration: line-through;
-       color: #888;
+       color: #72777d;
        font-style: italic;
 }
 
@@ -278,7 +278,7 @@ p.mw-delete-editreasons {
 
 /* The auto-generated edit comments */
 .autocomment {
-       color: #808080;
+       color: #72777d;
 }
 
 /** Generic minor/bot/newpage styling (recent changes) */
@@ -361,11 +361,11 @@ a.mw-selflink:visited {
  * keep in sync with commonPrint.css
  */
 table.wikitable {
-       margin: 1em 0;
        background-color: #f8f9fa;
+       color: #222;
+       margin: 1em 0;
        border: 1px solid #a2a9b1;
        border-collapse: collapse;
-       color: #000;
 }
 
 table.wikitable > tr > th,
index 8d0aa05..f37229f 100644 (file)
                        'liveUpdate',
                        {
                                limit: 1,
-                               peek: 1, // bypasses all UI
+                               // temporarily disabled ( T173613#3591657 )
+                               // peek: 1, // bypasses all UI
                                from: this.changesListModel.getNextFrom()
                        }
                );
index 3b98936..b37cf2f 100644 (file)
@@ -51,6 +51,7 @@
        background-color: #f8f9fa;
        margin-top: 1em;
        border: 1px solid #c8ccd1;
+       border-radius: 2px;
 }
 .search-types {
        float: left;
 /*==========================*/
 
 #mw-searchoptions {
-       margin: 0;
        padding: 0.5em 0.75em 0.75em 0.75em;
        background-color: #f8f9fa;
+       margin: -1px 0 0;
        border: 1px solid #c8ccd1;
-       border-top-width: 0;
+       border-radius: 0 0 2px 2px;
 }
 #mw-searchoptions legend {
        display: none;
index 4a48f46..2366249 100644 (file)
@@ -40,11 +40,12 @@ section.mw-form-header {
 }
 
 .fancycaptcha-captcha-container {
-       background-color: #f8f8f8;
-       border: 1px solid #c9c9c9;
-       padding: 10px;
-       text-align: center;
+       background-color: #f8f9fa;
        margin-bottom: 15px;
+       border: 1px solid #c8ccd1;
+       border-radius: 2px;
+       padding: 8px;
+       text-align: center;
 }
 
 .mw-createacct-captcha-assisted {
@@ -54,13 +55,20 @@ section.mw-form-header {
 
 /* Put a border around the fancycaptcha-image-container. */
 .fancycaptcha-captcha-and-reload {
-       border: 1px solid #c9c9c9;
+       border: 1px solid #c8ccd1;
+       border-radius: 2px 2px 0 0;
        /* Other display formats end up too wide */
        display: table-cell;
        width: 270px;
        background-color: #fff;
 }
 
+.fancycaptcha-captcha-container .mw-ui-input {
+       margin-top: -1px;
+       border-color: #c8ccd1;
+       border-radius: 0 0 2px 2px;
+}
+
 /* Make the fancycaptcha-image-container full-width within its parent. */
 .fancycaptcha-image-container {
        width: 100%;
index 877c99b..24ca434 100644 (file)
@@ -1,7 +1,7 @@
 .mw-foreignStructuredUpload-bookletLayout-license {
        font-size: 90%;
        line-height: 1.4em;
-       color: #555;
+       color: #54595d;
 }
 
 .mw-foreignStructuredUploa-bookletLayout-small-notice {
@@ -13,7 +13,7 @@
                .oo-ui-labelWidget {
                        line-height: 1.2em;
                        font-size: 0.9em;
-                       color: #555;
+                       color: #54595d;
                }
        }
 }
index 7ef32ea..d3e4950 100644 (file)
@@ -45,11 +45,11 @@ div.apihelp-linktrail {
 }
 
 .apihelp-unknown {
-       color: #888;
+       color: #72777d;
 }
 
 .apihelp-empty {
-       color: #888;
+       color: #72777d;
 }
 
 .apihelp-help-urls ul {
index 6a93fdd..c4363ed 100644 (file)
 
 .mw-feedbackDialog-welcome-message,
 .mw-feedbackDialog-feedback-terms {
-       line-height: 1.2em;
+       line-height: 1.4;
 }
 
-.mw-feedbackDialog-feedback-form {
-       margin-top: 1em;
+.mw-feedbackDialog-welcome-message {
+       margin-bottom: 1em;
+}
+
+/* Overwriting OOUI is no fun */
+.mw-feedbackDialog-feedback-form .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+       min-width: 4.2em;
+       width: 10%;
+}
+.mw-feedbackDialog-feedback-form .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+       width: 80%;
 }
 
 .mw-feedbackDialog-feedback-termsofuse {
-       margin-left: 2.5em;
+       margin-left: 2em;
 }
index be7aa63..bf9634f 100644 (file)
@@ -16,7 +16,7 @@
        }
 
        .mediawiki-filewarning-footer {
-               color: #888;
+               color: #72777d;
        }
 
        .empty {
index 34f7eba..fb34a89 100644 (file)
                 * @return {string} Encoded string
                 */
                escapeIdForLink: function ( str ) {
-                       var mode = mw.config.get( 'wgFragmentMode' )[ 0 ],
-                               id = escapeIdInternal( str, mode );
-
-                       if ( mode === 'html5' ) {
-                               id = encodeURIComponent( id ).replace( /%3A/g, ':' );
-                       }
+                       var mode = mw.config.get( 'wgFragmentMode' )[ 0 ];
 
-                       return id;
+                       return escapeIdInternal( str, mode );
                },
 
                /**
index 5457696..81473df 100644 (file)
@@ -234,7 +234,7 @@ class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * Asserts that the cookie jar does not have the given cookie.
-        * @param string $expectedName Cookie name
+        * @param string $name Cookie name
         * @param CookieJar $cookieJar
         */
        protected function assertNotHasCookie( $name, CookieJar $cookieJar ) {
index 784c29c..33aee7d 100644 (file)
@@ -29,6 +29,8 @@ class DbTestPreviewer extends TestRecorder {
 
        /**
         * This should be called before the table prefix is changed
+        * @param IDatabase $db
+        * @param bool|string $filter
         */
        function __construct( $db, $filter = false ) {
                $this->db = $db;
index ac9f150..94d226c 100644 (file)
@@ -280,6 +280,7 @@ class ParserTestPrinter extends TestRecorder {
 
        /**
         * Show a warning to the user
+        * @param string $message
         */
        public function warning( $message ) {
                echo "$message\n";
@@ -287,6 +288,8 @@ class ParserTestPrinter extends TestRecorder {
 
        /**
         * Mark a test skipped
+        * @param string $test
+        * @param string $subtest
         */
        public function skipped( $test, $subtest ) {
                if ( $this->showProgress ) {
index 37ed85f..61aa0d7 100644 (file)
@@ -78,6 +78,7 @@ class ParserTestResultNormalizer {
 
        /**
         * Serialize the XML DOM for comparison purposes. This does not generate HTML.
+        * @return string
         */
        protected function serialize() {
                return strtr( $this->doc->saveXML( $this->body ),
index 46c551b..5fe2177 100644 (file)
@@ -518,6 +518,8 @@ class ParserTestRunner {
        /**
         * Ensure a given setup stage has been done, throw an exception if it has
         * not.
+        * @param string $funcName
+        * @param string|null $funcName2
         */
        protected function checkSetupDone( $funcName, $funcName2 = null ) {
                if ( !$this->setupDone[$funcName]
@@ -700,6 +702,8 @@ class ParserTestRunner {
        /**
         * Determine whether the current parser has the hooks registered in it
         * that are required by a file read by TestFileReader.
+        * @param array $requirements
+        * @return bool
         */
        public function meetsRequirements( $requirements ) {
                foreach ( $requirements as $requirement ) {
@@ -1600,12 +1604,15 @@ class ParserTestRunner {
                // get a reference to the mock object.
                MessageCache::singleton()->getParser();
                $restore = $this->executeSetupSnippets( [ 'wgParser' => new ParserTestMockParser ] );
-               $status = $page->doEditContent(
-                       ContentHandler::makeContent( $text, $title ),
-                       '',
-                       EDIT_NEW | EDIT_INTERNAL
-               );
-               $restore();
+               try {
+                       $status = $page->doEditContent(
+                               ContentHandler::makeContent( $text, $title ),
+                               '',
+                               EDIT_NEW | EDIT_INTERNAL
+                       );
+               } finally {
+                       $restore();
+               }
 
                if ( !$status->isOK() ) {
                        throw new MWException( $status->getWikiText( false, false, 'en' ) );
index 238d018..2f82ca7 100644 (file)
@@ -9,6 +9,8 @@ class PhpunitTestRecorder extends TestRecorder {
 
        /**
         * Mark a test skipped
+        * @param string $test
+        * @param string $reason
         */
        public function skipped( $test, $reason ) {
                $this->testCase->markTestSkipped( "SKIPPED: $reason" );
index 39c9ca5..6aed02f 100644 (file)
@@ -29,6 +29,7 @@ class TidySupport {
 
        /**
         * Determine if there is a usable tidy.
+        * @param bool $useConfiguration
         */
        public function __construct( $useConfiguration = false ) {
                global $IP, $wgUseTidy, $wgTidyBin, $wgTidyInternal, $wgTidyConfig,
index 3f93793..00d2538 100644 (file)
@@ -4332,6 +4332,21 @@ Definition Lists: Mixed Lists: Test 10
 
 !! end
 
+# This is a regression test for T175099
+# html/php+tidy is insufficient since Tidy covers up the bug.
+# But once Tidy is replaced with RemexHTML, html/php+tidy is good enough
+!! test
+Definition Lists: Mixed Lists: Test 11
+!! wikitext
+;a
+:*b
+!! html
+<dl><dt>a</dt>
+<dd>
+<ul><li>b</li></ul></dd></dl>
+
+!! end
+
 # The Parsoid team disagrees with the PHP parser's seemingly-random
 # rules regarding dd/dt on the next two tests.  Parsoid is more
 # consistent, and recognizes the shared nesting and keeps the
@@ -4339,7 +4354,7 @@ Definition Lists: Mixed Lists: Test 10
 # (And tidy again converts <dt> to <dd> before 'bar'.)
 
 !! test
-Definition Lists: Mixed Lists: Test 11
+Definition Lists: Mixed Lists: Test 12
 !! wikitext
 *#*#;*;;foo :bar
 *#*#;boo :baz
@@ -29307,10 +29322,10 @@ wgFragmentMode=[ 'html5', 'legacy' ]
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_bar"><span class="tocnumber">1</span> <span class="toctext">Foo bar</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext">foo Bar</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#%D0%A2%D0%B5%D1%81%D1%82"><span class="tocnumber">3</span> <span class="toctext">Тест</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#%D0%A2%D0%B5%D1%81%D1%82_2"><span class="tocnumber">4</span> <span class="toctext">Тест</span></a></li>
-<li class="toclevel-1 tocsection-5"><a href="#%D1%82%D0%B5%D1%81%D1%82"><span class="tocnumber">5</span> <span class="toctext">тест</span></a></li>
-<li class="toclevel-1 tocsection-6"><a href="#Hey_%3C_%23_%22_%3E_%25_:_%27"><span class="tocnumber">6</span> <span class="toctext">Hey &lt; # " &gt;&#160;%&#160;: '</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#Тест"><span class="tocnumber">3</span> <span class="toctext">Тест</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#Тест_2"><span class="tocnumber">4</span> <span class="toctext">Тест</span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#тест"><span class="tocnumber">5</span> <span class="toctext">тест</span></a></li>
+<li class="toclevel-1 tocsection-6"><a href="#Hey_&lt;_#_&quot;_&gt;_%_:_'"><span class="tocnumber">6</span> <span class="toctext">Hey &lt; # " &gt;&#160;%&#160;: '</span></a></li>
 </ul>
 </div>
 
@@ -29320,9 +29335,9 @@ wgFragmentMode=[ 'html5', 'legacy' ]
 <h2><span id=".D0.A2.D0.B5.D1.81.D1.82_2"></span><span class="mw-headline" id="Тест_2">Тест</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Тест">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span id=".D1.82.D0.B5.D1.81.D1.82"></span><span class="mw-headline" id="тест">тест</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: тест">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span id="Hey_.3C_.23_.22_.3E_.25_:_.27"></span><span class="mw-headline" id="Hey_&lt;_#_&quot;_&gt;_%_:_'">Hey &lt; # " &gt;&#160;%&#160;: '</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Hey &lt; # &quot; &gt; % : '">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p><a href="#Foo_bar">#Foo bar</a> <a href="#foo_Bar">#foo Bar</a> <a href="#%D0%A2%D0%B5%D1%81%D1%82">#Тест</a> <a href="#%D1%82%D0%B5%D1%81%D1%82">#тест</a> <a href="#Hey_%3C_%23_%22_%3E_%25_:_%27">#Hey &lt; # " &gt;&#160;%&#160;: '</a>
-</p><p>%F0%9F%92%A9 <span id="%F0%9F%92%A9"></span>
-</p><p><a href="#%E5%95%A4%E9%85%92">#啤酒</a> <a href="#%E5%95%A4%E9%85%92">#啤酒</a>
+<p><a href="#Foo_bar">#Foo bar</a> <a href="#foo_Bar">#foo Bar</a> <a href="#Тест">#Тест</a> <a href="#тест">#тест</a> <a href="#Hey_&lt;_#_&quot;_&gt;_%_:_'">#Hey &lt; # " &gt;&#160;%&#160;: '</a>
+</p><p>💩 <span id="💩"></span>
+</p><p><a href="#啤酒">#啤酒</a> <a href="#啤酒">#啤酒</a>
 </p>
 !! end
 
@@ -29401,10 +29416,10 @@ wgFragmentMode=[ 'html5' ]
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_bar"><span class="tocnumber">1</span> <span class="toctext">Foo bar</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext">foo Bar</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#%D0%A2%D0%B5%D1%81%D1%82"><span class="tocnumber">3</span> <span class="toctext">Тест</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#%D0%A2%D0%B5%D1%81%D1%82_2"><span class="tocnumber">4</span> <span class="toctext">Тест</span></a></li>
-<li class="toclevel-1 tocsection-5"><a href="#%D1%82%D0%B5%D1%81%D1%82"><span class="tocnumber">5</span> <span class="toctext">тест</span></a></li>
-<li class="toclevel-1 tocsection-6"><a href="#Hey_%3C_%23_%22_%3E_%25_:_%27"><span class="tocnumber">6</span> <span class="toctext">Hey &lt; # " &gt;&#160;%&#160;: '</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#Тест"><span class="tocnumber">3</span> <span class="toctext">Тест</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#Тест_2"><span class="tocnumber">4</span> <span class="toctext">Тест</span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#тест"><span class="tocnumber">5</span> <span class="toctext">тест</span></a></li>
+<li class="toclevel-1 tocsection-6"><a href="#Hey_&lt;_#_&quot;_&gt;_%_:_'"><span class="tocnumber">6</span> <span class="toctext">Hey &lt; # " &gt;&#160;%&#160;: '</span></a></li>
 </ul>
 </div>
 
@@ -29414,8 +29429,8 @@ wgFragmentMode=[ 'html5' ]
 <h2><span class="mw-headline" id="Тест_2">Тест</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Тест">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span class="mw-headline" id="тест">тест</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: тест">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span class="mw-headline" id="Hey_&lt;_#_&quot;_&gt;_%_:_'">Hey &lt; # " &gt;&#160;%&#160;: '</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Hey &lt; # &quot; &gt; % : '">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<p><a href="#Foo_bar">#Foo bar</a> <a href="#foo_Bar">#foo Bar</a> <a href="#%D0%A2%D0%B5%D1%81%D1%82">#Тест</a> <a href="#%D1%82%D0%B5%D1%81%D1%82">#тест</a> <a href="#Hey_%3C_%23_%22_%3E_%25_:_%27">#Hey &lt; # " &gt;&#160;%&#160;: '</a>
-</p><p>%F0%9F%92%A9 <span id="%F0%9F%92%A9"></span>
-</p><p><a href="#%E5%95%A4%E9%85%92">#啤酒</a> <a href="#%E5%95%A4%E9%85%92">#啤酒</a>
+<p><a href="#Foo_bar">#Foo bar</a> <a href="#foo_Bar">#foo Bar</a> <a href="#Тест">#Тест</a> <a href="#тест">#тест</a> <a href="#Hey_&lt;_#_&quot;_&gt;_%_:_'">#Hey &lt; # " &gt;&#160;%&#160;: '</a>
+</p><p>💩 <span id="💩"></span>
+</p><p><a href="#啤酒">#啤酒</a> <a href="#啤酒">#啤酒</a>
 </p>
 !! end
index 91aaff5..f04eec7 100644 (file)
@@ -213,6 +213,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @param Config|null $bootstrapConfig The bootstrap config to use with the new
         *        MediaWikiServices.
+        * @return MediaWikiServices
         */
        protected static function resetGlobalServices( Config $bootstrapConfig = null ) {
                $oldServices = MediaWikiServices::getInstance();
@@ -1591,7 +1592,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @since 1.20
         *
-        * @param array $array
+        * @param array &$array
         */
        protected function objectAssociativeSort( array &$array ) {
                uasort(
@@ -1609,7 +1610,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @since 1.20
         *
-        * @param mixed $r The array to remove string keys from.
+        * @param mixed &$r The array to remove string keys from.
         */
        protected static function stripStringKeys( &$r ) {
                if ( !is_array( $r ) ) {
@@ -1832,6 +1833,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
+        * @param string $buffer
         * @return string
         */
        public static function wfResetOutputBuffersBarrier( $buffer ) {
index f75cc22..1024ecd 100644 (file)
@@ -17,6 +17,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
         * - string 'modules' Pipe-separated list of module names
         * - string|null 'only' "scripts" (unwrapped script), "styles" (stylesheet), or null
         *    (mw.loader.implement).
+        * @param ResourceLoader|null $rl
         * @return ResourceLoaderContext
         */
        protected function getResourceLoaderContext( $options = [], ResourceLoader $rl = null ) {
index b6682f7..a70f136 100644 (file)
@@ -21,7 +21,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                        [ -30281104, TS_MW, '19690115123456', 'Negative TS_UNIX to TS_MW' ],
                        [ $t, TS_UNIX, 979562096, 'TS_UNIX to TS_UNIX' ],
                        [ $t, TS_DB, '2001-01-15 12:34:56', 'TS_UNIX to TS_DB' ],
-                       [ $t + .01, TS_MW, '20010115123456', 'TS_UNIX float to TS_MW' ],
+                       [ $t + 0.01, TS_MW, '20010115123456', 'TS_UNIX float to TS_MW' ],
 
                        [ $t, TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_ISO_8601_BASIC to TS_DB' ],
 
index d506623..7472fb9 100644 (file)
@@ -456,7 +456,6 @@ class SanitizerTest extends MediaWikiTestCase {
                $text = 'foo тест_#%!\'()[]:<>';
                $legacyEncoded = 'foo_.D1.82.D0.B5.D1.81.D1.82_.23.25.21.27.28.29.5B.5D:.3C.3E';
                $html5Encoded = 'foo_тест_#%!\'()[]:<>';
-               $html5Escaped = 'foo_%D1%82%D0%B5%D1%81%D1%82_%23%25%21%27%28%29%5B%5D:%3C%3E';
                $html5Experimental = 'foo_тест_!_()[]:<>';
 
                // Settings: last element is $wgExternalInterwikiFragmentMode, the rest is $wgFragmentMode
@@ -484,20 +483,20 @@ class SanitizerTest extends MediaWikiTestCase {
                        // New world: HTML5 links, legacy fallbacks
                        [ 'Attribute', $newLegacy, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
                        [ 'Attribute', $newLegacy, $text, $legacyEncoded, Sanitizer::ID_FALLBACK ],
-                       [ 'Link', $newLegacy, $text, $html5Escaped ],
+                       [ 'Link', $newLegacy, $text, $html5Encoded ],
                        [ 'ExternalInterwiki', $newLegacy, $text, $legacyEncoded ],
 
                        // Distant future: no legacy fallbacks, but still linking to leagacy wikis
                        [ 'Attribute', $new, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
                        [ 'Attribute', $new, $text, false, Sanitizer::ID_FALLBACK ],
-                       [ 'Link', $new, $text, $html5Escaped ],
+                       [ 'Link', $new, $text, $html5Encoded ],
                        [ 'ExternalInterwiki', $new, $text, $legacyEncoded ],
 
                        // Just before the heat death of universe: external interwikis are also HTML5 \m/
                        [ 'Attribute', $allNew, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
                        [ 'Attribute', $allNew, $text, false, Sanitizer::ID_FALLBACK ],
-                       [ 'Link', $allNew, $text, $html5Escaped ],
-                       [ 'ExternalInterwiki', $allNew, $text, $html5Escaped ],
+                       [ 'Link', $allNew, $text, $html5Encoded ],
+                       [ 'ExternalInterwiki', $allNew, $text, $html5Encoded ],
 
                        // Someone flipped $wgExperimentalHtmlIds on
                        [ 'Attribute', $experimentalLegacy, $text, $html5Experimental, Sanitizer::ID_PRIMARY ],
@@ -508,7 +507,7 @@ class SanitizerTest extends MediaWikiTestCase {
                        // Migration from $wgExperimentalHtmlIds to modern HTML5
                        [ 'Attribute', $newExperimental, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
                        [ 'Attribute', $newExperimental, $text, $html5Experimental, Sanitizer::ID_FALLBACK ],
-                       [ 'Link', $newExperimental, $text, $html5Escaped ],
+                       [ 'Link', $newExperimental, $text, $html5Encoded ],
                        [ 'ExternalInterwiki', $newExperimental, $text, $legacyEncoded ],
                ];
        }
index 8af3434..d9c01cb 100644 (file)
@@ -305,6 +305,7 @@ class TitleMethodsTest extends MediaWikiLangTestCase {
                        [ 'Help:Main Page', 'Help talk:Main Page' ],
                        [ 'Help talk:Main Page', 'Help:Main Page' ],
                        [ 'Special:FooBar', null ],
+                       [ 'Media:File.jpg', null ],
                ];
        }
 
index 7770cbc..b0febe8 100644 (file)
@@ -637,6 +637,28 @@ class TitleTest extends MediaWikiTestCase {
                ];
        }
 
+       /**
+        * @covers Title::isValid
+        * @dataProvider provideIsValid
+        * @param Title $title
+        * @param bool $isValid
+        */
+       public function testIsValid( Title $title, $isValid ) {
+               $this->assertEquals( $isValid, $title->isValid(), $title->getPrefixedText() );
+       }
+
+       public static function provideIsValid() {
+               return [
+                       [ Title::makeTitle( NS_MAIN, '' ), false ],
+                       [ Title::makeTitle( NS_MAIN, '<>' ), false ],
+                       [ Title::makeTitle( NS_MAIN, '|' ), false ],
+                       [ Title::makeTitle( NS_MAIN, '#' ), false ],
+                       [ Title::makeTitle( NS_MAIN, 'Test' ), true ],
+                       [ Title::makeTitle( -33, 'Test' ), false ],
+                       [ Title::makeTitle( 77663399, 'Test' ), false ],
+               ];
+       }
+
        /**
         * @covers Title::isAlwaysKnown
         */
index 9ed8f15..d19d998 100644 (file)
@@ -53,6 +53,7 @@ class DatabaseTestHelper extends Database {
        /**
         * Returns SQL queries grouped by '; '
         * Clear the list of queries that have been done so far.
+        * @return string
         */
        public function getLastSqls() {
                $lastSqls = implode( '; ', $this->lastSqls );
index 881ace2..c762aa7 100644 (file)
@@ -1184,11 +1184,11 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase {
 
        public static function provideAdaptiveTTL() {
                return [
-                       [ 3600, 900, 30, .2, 720 ],
-                       [ 3600, 500, 30, .2, 500 ],
-                       [ 3600, 86400, 800, .2, 800 ],
-                       [ false, 86400, 800, .2, 800 ],
-                       [ null, 86400, 800, .2, 800 ]
+                       [ 3600, 900, 30, 0.2, 720 ],
+                       [ 3600, 500, 30, 0.2, 500 ],
+                       [ 3600, 86400, 800, 0.2, 800 ],
+                       [ false, 86400, 800, 0.2, 800 ],
+                       [ null, 86400, 800, 0.2, 800 ]
                ];
        }
 
index cb18fb3..b6ea426 100644 (file)
@@ -112,10 +112,10 @@ class TransactionProfilerTest extends PHPUnit_Framework_TestCase {
                $tp->setLogger( $logger );
                $tp->setExpectation( 'queries', 2, __METHOD__ );
 
-               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - .01, false, 0 );
-               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - .01, false, 0 );
-               $tp->recordQueryCompletion( "SQL 3", microtime( true ) - .01, false, 0 ); // warn
-               $tp->recordQueryCompletion( "SQL 4", microtime( true ) - .01, false, 0 ); // warn
+               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - 0.01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - 0.01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 3", microtime( true ) - 0.01, false, 0 ); // warn
+               $tp->recordQueryCompletion( "SQL 4", microtime( true ) - 0.01, false, 0 ); // warn
        }
 
        public function testWriteQueryCount() {
@@ -126,16 +126,16 @@ class TransactionProfilerTest extends PHPUnit_Framework_TestCase {
                $tp->setLogger( $logger );
                $tp->setExpectation( 'writes', 2, __METHOD__ );
 
-               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - .01, false, 0 );
-               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - .01, false, 0 );
-               $tp->recordQueryCompletion( "SQL 3", microtime( true ) - .01, false, 0 );
-               $tp->recordQueryCompletion( "SQL 4", microtime( true ) - .01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - 0.01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - 0.01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 3", microtime( true ) - 0.01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 4", microtime( true ) - 0.01, false, 0 );
 
                $tp->transactionWritingIn( 'srv1', 'db1', '123' );
-               $tp->recordQueryCompletion( "SQL 1w", microtime( true ) - .01, true, 2 );
-               $tp->recordQueryCompletion( "SQL 2w", microtime( true ) - .01, true, 5 );
-               $tp->recordQueryCompletion( "SQL 3w", microtime( true ) - .01, true, 3 );
-               $tp->recordQueryCompletion( "SQL 4w", microtime( true ) - .01, true, 1 );
+               $tp->recordQueryCompletion( "SQL 1w", microtime( true ) - 0.01, true, 2 );
+               $tp->recordQueryCompletion( "SQL 2w", microtime( true ) - 0.01, true, 5 );
+               $tp->recordQueryCompletion( "SQL 3w", microtime( true ) - 0.01, true, 3 );
+               $tp->recordQueryCompletion( "SQL 4w", microtime( true ) - 0.01, true, 1 );
                $tp->transactionWritingOut( 'srv1', 'db1', '123', 1, 1 );
        }
 }
index b564310..456447f 100644 (file)
@@ -352,8 +352,8 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
                $db->setLBInfo( 'clusterMasterHost', 'db1052' );
                $lagEst = $db->getLag();
 
-               $this->assertGreaterThan( $lag - .010, $lagEst, "Correct heatbeat lag" );
-               $this->assertLessThan( $lag + .010, $lagEst, "Correct heatbeat lag" );
+               $this->assertGreaterThan( $lag - 0.010, $lagEst, "Correct heatbeat lag" );
+               $this->assertLessThan( $lag + 0.010, $lagEst, "Correct heatbeat lag" );
        }
 
        public static function provideLagAmounts() {
diff --git a/tests/phpunit/includes/shell/CommandTest.php b/tests/phpunit/includes/shell/CommandTest.php
new file mode 100644 (file)
index 0000000..33a7f44
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+
+use MediaWiki\Shell\Command;
+
+/**
+ * @group Shell
+ */
+class CommandTest extends PHPUnit_Framework_TestCase {
+       /**
+        * @expectedException PHPUnit_Framework_Error_Notice
+        */
+       public function testDestruct() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'destructors are unreliable in HHVM' );
+               }
+               $command = new Command();
+               $command->params( 'true' );
+       }
+
+       private function requirePosix() {
+               if ( wfIsWindows() ) {
+                       $this->markTestSkipped( 'This test requires a POSIX environment.' );
+               }
+       }
+
+       /**
+        * @dataProvider provideExecute
+        */
+       public function testExecute( $commandInput, $expectedExitCode, $expectedOutput ) {
+               $this->requirePosix();
+
+               $command = new Command();
+               $result = $command
+                       ->params( $commandInput )
+                       ->execute();
+
+               $this->assertSame( $expectedExitCode, $result->getExitCode() );
+               $this->assertSame( $expectedOutput, $result->getStdout() );
+       }
+
+       public function provideExecute() {
+               return [
+                       'success status' => [ 'true', 0, '' ],
+                       'failure status' => [ 'false', 1, '' ],
+                       'output' => [ [ 'echo', '-n', 'x', '>', 'y' ], 0, 'x > y' ],
+               ];
+       }
+
+       public function testEnvironment() {
+               $this->requirePosix();
+
+               $command = new Command();
+               $result = $command
+                       ->params( [ 'printenv', 'FOO' ] )
+                       ->environment( [ 'FOO' => 'bar' ] )
+                       ->execute();
+               $this->assertSame( "bar\n", $result->getStdout() );
+       }
+
+       public function testOutput() {
+               global $IP;
+
+               $this->requirePosix();
+
+               $command = new Command();
+               $result = $command
+                       ->params( [ 'ls', "$IP/index.php" ] )
+                       ->execute();
+               $this->assertSame( "$IP/index.php", trim( $result->getStdout() ) );
+
+               $command = new Command();
+               $result = $command
+                       ->params( [ 'ls', 'index.php', 'no-such-file' ] )
+                       ->includeStderr()
+                       ->execute();
+               $this->assertRegExp( '/^.+no-such-file.*$/m', $result->getStdout() );
+       }
+
+       public function testT69870() {
+               $commandLine = wfIsWindows()
+                       // 333 = 331 + CRLF
+                       ? ( 'for /l %i in (1, 1, 1001) do @echo ' . str_repeat( '*', 331 ) )
+                       : 'printf "%-333333s" "*"';
+
+               // Test several times because it involves a race condition that may randomly succeed or fail
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $command = new Command();
+                       $output = $command->unsafeParams( $commandLine )
+                               ->execute()
+                               ->getStdout();
+                       $this->assertEquals( 333333, strlen( $output ) );
+               }
+       }
+}
diff --git a/tests/phpunit/includes/shell/ShellTest.php b/tests/phpunit/includes/shell/ShellTest.php
new file mode 100644 (file)
index 0000000..1e91074
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+use MediaWiki\Shell\Shell;
+
+/**
+ * @group Shell
+ */
+class ShellTest extends PHPUnit_Framework_TestCase {
+       public function testIsDisabled() {
+               $this->assertInternalType( 'bool', Shell::isDisabled() ); // sanity
+       }
+
+       /**
+        * @dataProvider provideEscape
+        */
+       public function testEscape( $args, $expected ) {
+               if ( wfIsWindows() ) {
+                       $this->markTestSkipped( 'This test requires a POSIX environment.' );
+               }
+               $this->assertSame( $expected, call_user_func_array( [ Shell::class, 'escape' ], $args ) );
+       }
+
+       public function provideEscape() {
+               return [
+                       'simple' => [ [ 'true' ], "'true'" ],
+                       'with args' => [ [ 'convert', '-font', 'font name' ], "'convert' '-font' 'font name'" ],
+                       'array' => [ [ [ 'convert', '-font', 'font name' ] ], "'convert' '-font' 'font name'" ],
+               ];
+       }
+}
index 2f7b767..e7cfca7 100644 (file)
@@ -15,7 +15,7 @@ class SpecialPageExecutor {
         * @param User|null $user The user which should be used in the context of this special page
         *
         * @throws Exception
-        * @return array( string, WebResponse ) A two-elements array containing the HTML output
+        * @return array [ string, WebResponse ] A two-elements array containing the HTML output
         * generated by the special page as well as the response object.
         */
        public function executeSpecialPage(
index 2f091d5..930bbe4 100644 (file)
@@ -51,7 +51,7 @@ abstract class SpecialPageTestBase extends MediaWikiTestCase {
         * @param User|null $user The user which should be used in the context of this special page
         *
         * @throws Exception
-        * @return array( string, WebResponse ) A two-elements array containing the HTML output
+        * @return array [ string, WebResponse ] A two-elements array containing the HTML output
         * generated by the special page as well as the response object.
         */
        protected function executeSpecialPage(
index d712254..6b9b782 100644 (file)
@@ -34,6 +34,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
 
        /**
         * Creates an empty Content object of the type supported by this ContentHandler.
+        * @return DummyContentForTesting
         */
        public function makeEmptyContent() {
                return new DummyContentForTesting( '' );
index 098181d..9d91d4a 100644 (file)
@@ -34,6 +34,7 @@ class DummyNonTextContentHandler extends DummyContentHandlerForTesting {
 
        /**
         * Creates an empty Content object of the type supported by this ContentHandler.
+        * @return DummyNonTextContent
         */
        public function makeEmptyContent() {
                return new DummyNonTextContent( '' );
index 047c03a..ef1caa5 100644 (file)
@@ -41,6 +41,7 @@ class MockFSFile extends FSFile {
        /**
         * August 22 – The theft of the Mona Lisa is discovered in the Louvre."
         * T22281
+        * @return int
         */
        public function getSize() {
                return 1911;
index 4ea1090..07b18f5 100644 (file)
@@ -155,6 +155,6 @@ class ParserTestTopLevelSuite extends PHPUnit_Framework_TestSuite {
         * @param string $msg Message to log
         */
        protected static function debug( $msg ) {
-               return wfDebugLog( 'tests-parser', wfGetCaller() . ' ' . $msg );
+               wfDebugLog( 'tests-parser', wfGetCaller() . ' ' . $msg );
        }
 }
index 2efe9cd..bb27626 100644 (file)
                // Test cases are kept in sync with SanitizerTest.php
                var text = 'foo тест_#%!\'()[]:<>',
                        legacyEncoded = 'foo_.D1.82.D0.B5.D1.81.D1.82_.23.25.21.27.28.29.5B.5D:.3C.3E',
-                       html5Escaped = 'foo_%D1%82%D0%B5%D1%81%D1%82_%23%25!\'()%5B%5D:%3C%3E',
+                       html5Encoded = 'foo_тест_#%!\'()[]:<>',
                        html5Experimental = 'foo_тест_!_()[]:<>',
                        // Settings: this is wgFragmentMode
                        legacy = [ 'legacy' ],
                        // Transition to a new world: legacy links with HTML5 fallback
                        [ legacyNew, text, legacyEncoded ],
                        // New world: HTML5 links, legacy fallbacks
-                       [ newLegacy, text, html5Escaped ],
+                       [ newLegacy, text, html5Encoded ],
                        // Distant future: no legacy fallbacks
-                       [ allNew, text, html5Escaped ],
+                       [ allNew, text, html5Encoded ],
                        // Someone flipped wgExperimentalHtmlIds on
                        [ experimentalLegacy, text, html5Experimental ],
                        // Migration from wgExperimentalHtmlIds to modern HTML5
-                       [ newExperimental, text, html5Escaped ]
+                       [ newExperimental, text, html5Encoded ]
                ], function ( index, testCase ) {
                        mw.config.set( 'wgFragmentMode', testCase[ 0 ] );