--- /dev/null
+root = true
+
+[*]
+indent_style = tab
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
Whitelist existing violations, but enable the sniff to prevent
any new occurrences.
-->
- <exclude-pattern>*/includes/api/ApiUsageException\.php</exclude-pattern>
<exclude-pattern>*/includes/media/XCF\.php</exclude-pattern>
<exclude-pattern>*/includes/Feed\.php</exclude-pattern>
<exclude-pattern>*/includes/libs/xmp/XMP\.php</exclude-pattern>
* (T140807) The wgResourceLoaderLESSImportPaths configuration option was removed
from ResourceLoader. Instead, use `@import` statements in LESS to import
files directly from nearby directories within the same project.
+* The protected methods PHPSessionHandler::returnSuccess() and returnFailure(),
+ only needed for PHP5 compatibility, have been removed. It now uses the boolean
+ values `true` and `false` respectively.
=== Deprecations in 1.32 ===
* Use of a StartProfiler.php file is deprecated in favour of placing
'UploadStashWrongOwnerException' => __DIR__ . '/includes/upload/UploadStash.php',
'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
'UppercaseCollation' => __DIR__ . '/includes/collation/UppercaseCollation.php',
- 'UsageException' => __DIR__ . '/includes/api/ApiUsageException.php',
+ 'UsageException' => __DIR__ . '/includes/api/UsageException.php',
'User' => __DIR__ . '/includes/user/User.php',
'UserArray' => __DIR__ . '/includes/user/UserArray.php',
'UserArrayFromResult' => __DIR__ . '/includes/user/UserArrayFromResult.php',
* @throws MWException
*/
public function inLanguage( $lang ) {
+ $previousLanguage = $this->language;
+
if ( $lang instanceof Language ) {
$this->language = $lang;
} elseif ( is_string( $lang ) ) {
. "passed a String or Language object; $type given"
);
}
- $this->message = null;
+
+ if ( $this->language !== $previousLanguage ) {
+ // The language has changed. Clear the message cache.
+ $this->message = null;
+ }
$this->interface = false;
return $this;
}
$response->header( 'Content-type: ' . $config->get( 'MimeType' ) . '; charset=UTF-8' );
$response->header( 'Content-language: ' . $wgContLang->getHtmlCode() );
- // Avoid Internet Explorer "compatibility view" in IE 8-10, so that
- // jQuery etc. can work correctly.
- $response->header( 'X-UA-Compatible: IE=Edge' );
-
if ( !$this->mArticleBodyOnly ) {
$sk = $this->getSkin();
const DELETED_COMMENT = 2;
const DELETED_USER = 4;
const DELETED_RESTRICTED = 8;
- const SUPPRESSED_USER = 12; // convenience
- const SUPPRESSED_ALL = 15; // convenience
+ const SUPPRESSED_USER = self::DELETED_USER | self::DELETED_RESTRICTED; // convenience
+ const SUPPRESSED_ALL = self::DELETED_TEXT | self::DELETED_COMMENT | self::DELETED_USER |
+ self::DELETED_RESTRICTED; // convenience
// Audience options for accessors
const FOR_PUBLIC = 1;
* probably wrong.
* @since 1.25
*/
- const NO_VALIDATE = 12;
+ const NO_VALIDATE = self::NO_SIZE_CHECK | 8;
/**
* Key for the 'indexed tag name' metadata item. Value is string.
* @file
*/
-/**
- * This exception will be thrown when dieUsage is called to stop module execution.
- *
- * @ingroup API
- * @deprecated since 1.29, use ApiUsageException instead
- */
-class UsageException extends MWException {
-
- private $mCodestr;
-
- /**
- * @var null|array
- */
- private $mExtraData;
-
- /**
- * @param string $message
- * @param string $codestr
- * @param int $code
- * @param array|null $extradata
- */
- public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
- parent::__construct( $message, $code );
- $this->mCodestr = $codestr;
- $this->mExtraData = $extradata;
-
- if ( !$this instanceof ApiUsageException ) {
- wfDeprecated( __METHOD__, '1.29' );
- }
-
- // This should never happen, so throw an exception about it that will
- // hopefully get logged with a backtrace (T138585)
- if ( !is_string( $codestr ) || $codestr === '' ) {
- throw new InvalidArgumentException( 'Invalid $codestr, was ' .
- ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
- );
- }
- }
-
- /**
- * @return string
- */
- public function getCodeString() {
- wfDeprecated( __METHOD__, '1.29' );
- return $this->mCodestr;
- }
-
- /**
- * @return array
- */
- public function getMessageArray() {
- wfDeprecated( __METHOD__, '1.29' );
- $result = [
- 'code' => $this->mCodestr,
- 'info' => $this->getMessage()
- ];
- if ( is_array( $this->mExtraData ) ) {
- $result = array_merge( $result, $this->mExtraData );
- }
-
- return $result;
- }
-
- /**
- * @return string
- */
- public function __toString() {
- return "{$this->getCodeString()}: {$this->getMessage()}";
- }
-}
-
/**
* Exception used to abort API execution with an error
*
--- /dev/null
+<?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
+ */
+
+/**
+ * This exception will be thrown when dieUsage is called to stop module execution.
+ *
+ * @ingroup API
+ * @deprecated since 1.29, use ApiUsageException instead
+ */
+class UsageException extends MWException {
+
+ private $mCodestr;
+
+ /**
+ * @var null|array
+ */
+ private $mExtraData;
+
+ /**
+ * @param string $message
+ * @param string $codestr
+ * @param int $code
+ * @param array|null $extradata
+ */
+ public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
+ parent::__construct( $message, $code );
+ $this->mCodestr = $codestr;
+ $this->mExtraData = $extradata;
+
+ if ( !$this instanceof ApiUsageException ) {
+ wfDeprecated( __METHOD__, '1.29' );
+ }
+
+ // This should never happen, so throw an exception about it that will
+ // hopefully get logged with a backtrace (T138585)
+ if ( !is_string( $codestr ) || $codestr === '' ) {
+ throw new InvalidArgumentException( 'Invalid $codestr, was ' .
+ ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
+ );
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getCodeString() {
+ wfDeprecated( __METHOD__, '1.29' );
+ return $this->mCodestr;
+ }
+
+ /**
+ * @return array
+ */
+ public function getMessageArray() {
+ wfDeprecated( __METHOD__, '1.29' );
+ $result = [
+ 'code' => $this->mCodestr,
+ 'info' => $this->getMessage()
+ ];
+ if ( is_array( $this->mExtraData ) ) {
+ $result = array_merge( $result, $this->mExtraData );
+ }
+
+ return $result;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString() {
+ return "{$this->getCodeString()}: {$this->getMessage()}";
+ }
+}
/** @var int Read from the master/quorum */
const READ_LATEST = 1;
/* @var int Read from the master/quorum and lock out other writers */
- const READ_LOCKING = 3; // READ_LATEST (1) and "LOCK IN SHARE MODE" (2)
+ const READ_LOCKING = self::READ_LATEST | 2; // READ_LATEST (1) and "LOCK IN SHARE MODE" (2)
/** @var int Read from the master/quorum and lock out other writers and locking readers */
- const READ_EXCLUSIVE = 7; // READ_LOCKING (3) and "FOR UPDATE" (4)
+ const READ_EXCLUSIVE = self::READ_LOCKING | 4; // READ_LOCKING (3) and "FOR UPDATE" (4)
/** @var int Read from a replica DB or without a quorum, using the master/quorum on miss */
const READ_LATEST_IMMUTABLE = 8;
$this->maxDifferences = ceil( ( $this->m + $this->n ) / 2.0 );
if ( $this->m * $this->n > $this->tooLong ) {
// limit complexity to D^POW_LIMIT for long sequences
- $this->maxDifferences = floor( pow( $this->maxDifferences, $this->powLimit - 1.0 ) );
+ $this->maxDifferences = floor( $this->maxDifferences ** ( $this->powLimit - 1.0 ) );
wfDebug( "Limiting max number of differences to $this->maxDifferences\n" );
}
}
if ( $this->sslVerifyHost ) {
- // PHP 5.6.0 deprecates CN_match, in favour of peer_name which
- // actually checks SubjectAltName properly.
- if ( version_compare( PHP_VERSION, '5.6.0', '>=' ) ) {
- $options['ssl']['peer_name'] = $this->parsedUrl['host'];
- } else {
- $options['ssl']['CN_match'] = $this->parsedUrl['host'];
- }
+ $options['ssl']['peer_name'] = $this->parsedUrl['host'];
}
$options['ssl'] += $this->getCertOptions();
restore_error_handler();
if ( !$fh ) {
- // HACK for instant commons.
- // If we are contacting (commons|upload).wikimedia.org
- // try again with CN_match for en.wikipedia.org
- // as php does not handle SubjectAltName properly
- // prior to "peer_name" option in php 5.6
- if ( isset( $options['ssl']['CN_match'] )
- && ( $options['ssl']['CN_match'] === 'commons.wikimedia.org'
- || $options['ssl']['CN_match'] === 'upload.wikimedia.org' )
- ) {
- $options['ssl']['CN_match'] = 'en.wikipedia.org';
- $context = stream_context_create( $options );
- continue;
- }
break;
}
"config-type-oracle": "Oracle",
"config-type-mssql": "Microsoft SQL Server",
"config-support-info": "O MediaWiki suporta os sistemas de banco de dados a seguir:\n\n$1\n\nSe você não vê o sistema de banco de dados que você está tentando usar listados abaixo, siga as instruções relacionadas acima, para ativar o suporte.",
- "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] é o principal alvo para o MediaWiki e é melhor suportado. O MediaWiki também funciona com [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], que são compatíveis com MySQL. ([Http://www.php.net/manual/en/mysqli.installation.php Como compilar PHP com suporte a MySQL])",
+ "config-dbsupport-mysql": "* O [{{int:version-db-mysql-url}} MySQL] é a base de dados preferida para o MediaWiki e a melhor suportada. O MediaWiki também trabalha com [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], que são compatíveis com MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Como compilar PHP com suporte para MySQL].)",
"config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] é um popular sistema de banco de dados de código aberto como uma alternativa para o MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Como compilar o PHP com suporte PostgreSQL])",
"config-dbsupport-sqlite": "* O [{{int:version-db-sqlite-url}} SQLite] é uma plataforma de base de dados ligeira muito bem suportada. ([https://secure.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte para SQLite], usa PDO.)",
"config-dbsupport-oracle": "* A [{{int:version-db-oracle-url}} Oracle] é uma base de dados comercial para empresas. ([https://secure.php.net/manual/en/oci8.installation.php Como compilar PHP com suporte para OCI8].)",
"config-env-bad": "מ'האט קאנטראלירט די סביבה.\nאיר קענט נישט אינסטאלירן מעדיעוויקי.",
"config-env-php": "PHP $1 איז אינצטאלירט.",
"config-env-hhvm": "HHVM $1 איז אינסטאלירט.",
- "config-apc": "[https://secure.php.net/apc APC] איז אינסטאלירט",
- "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] איז אינסטאלירט",
+ "config-apc": "[https://secure.php.net/apc APC] איז אינסטאַלירט",
+ "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] איז אינסטאַלירט",
"config-diff3-bad": "GNU diff3 נישט געטראפן.",
"config-using-server": "באניצן סארווער־נאמען \"<nowiki>$1</nowiki>\".",
"config-using-uri": "באניצן סארווער־אדרעס \"<nowiki>$1$2</nowiki>\".",
*/
const STRIP_COMMENTS = 0x400;
- /**
- * Regex that matches whitespace inside empty arrays and objects.
- *
- * This doesn't affect regular strings inside the JSON because those can't
- * have a real line break (\n) in them, at this point they are already escaped
- * as the string "\n" which this doesn't match.
- *
- * @private
- */
- const WS_CLEANUP_REGEX = '/(?<=[\[{])\n\s*+(?=[\]}])/';
-
/**
* Characters problematic in JavaScript.
*
$pretty = $pretty ? ' ' : false;
}
- static $bug66021;
- if ( $pretty !== false && $bug66021 === null ) {
- $bug66021 = json_encode( [], JSON_PRETTY_PRINT ) !== '[]';
- }
-
// PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
// which is hardly useful when '<' and '>' are escaped (and inadequate), and such
// escaping negatively impacts the human readability of URLs and similar strings.
}
if ( $pretty !== false ) {
- // Workaround for <https://bugs.php.net/bug.php?id=66021>
- if ( $bug66021 ) {
- $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
- }
if ( $pretty !== ' ' ) {
// Change the four-space indent to a tab indent
$json = str_replace( "\n ", "\n\t", $json );
$ip = self::sanitizeIP( $ip );
$n = ip2long( $ip );
if ( $n < 0 ) {
- $n += pow( 2, 32 );
+ $n += 2 ** 32;
# On 32-bit platforms (and on Windows), 2^32 does not fit into an int,
# so $n becomes a float. We convert it to string instead.
if ( is_float( $n ) ) {
}
# Convert to unsigned
if ( $network < 0 ) {
- $network += pow( 2, 32 );
+ $network += 2 ** 32;
}
} else {
$network = false;
$start = $end = false;
} else {
$start = sprintf( '%08X', $network );
- $end = sprintf( '%08X', $network + pow( 2, ( 32 - $bits ) ) - 1 );
+ $end = sprintf( '%08X', $network + 2 ** ( 32 - $bits ) - 1 );
}
// Explicit range
} elseif ( strpos( $range, '-' ) !== false ) {
$shards = [];
list( $digits, $base ) = $this->getContainerHashLevels( $container );
if ( $digits > 0 ) {
- $numShards = pow( $base, $digits );
+ $numShards = $base ** $digits;
for ( $index = 0; $index < $numShards; $index++ ) {
$shards[] = '.' . Wikimedia\base_convert( $index, 10, $base, $digits );
}
if ( $ret === false ) {
if ( $this->trxLevel ) {
- if ( !$this->wasKnownStatementRollbackError() ) {
- # Either the query was aborted or all queries after BEGIN where aborted.
- if ( $this->explicitTrxActive() || $priorWritesPending ) {
- # In the first case, the only options going forward are (a) ROLLBACK, or
- # (b) ROLLBACK TO SAVEPOINT (if one was set). If the later case, the only
- # option is ROLLBACK, since the snapshots would have been released.
- $this->trxStatus = self::STATUS_TRX_ERROR;
- $this->trxStatusCause =
- $this->makeQueryException( $lastError, $lastErrno, $sql, $fname );
- $tempIgnore = false; // cannot recover
- } else {
- # Nothing prior was there to lose from the transaction,
- # so just roll it back.
- $this->rollback( __METHOD__ . " ($fname)", self::FLUSHING_INTERNAL );
- }
- $this->trxStatusIgnoredCause = null;
- } else {
+ if ( $this->wasKnownStatementRollbackError() ) {
# We're ignoring an error that caused just the current query to be aborted.
- # But log the cause so we can log a deprecation notice if a
- # caller actually does ignore it.
+ # But log the cause so we can log a deprecation notice if a caller actually
+ # does ignore it.
$this->trxStatusIgnoredCause = [ $lastError, $lastErrno, $fname ];
+ } else {
+ # Either the query was aborted or all queries after BEGIN where aborted.
+ # In the first case, the only options going forward are (a) ROLLBACK, or
+ # (b) ROLLBACK TO SAVEPOINT (if one was set). If the later case, the only
+ # option is ROLLBACK, since the snapshots would have been released.
+ $this->trxStatus = self::STATUS_TRX_ERROR;
+ $this->trxStatusCause =
+ $this->makeQueryException( $lastError, $lastErrno, $sql, $fname );
+ $tempIgnore = false; // cannot recover
+ $this->trxStatusIgnoredCause = null;
}
}
$this->trxIdleCallbacks = []; // consumed (and recursion guard)
$this->trxEndCallbacks = []; // consumed (recursion guard)
foreach ( $callbacks as $callback ) {
+ ++$count;
+ list( $phpCallback ) = $callback;
+ $this->clearFlag( self::DBO_TRX ); // make each query its own transaction
try {
- ++$count;
- list( $phpCallback ) = $callback;
- $this->clearFlag( self::DBO_TRX ); // make each query its own transaction
call_user_func( $phpCallback, $trigger, $this );
- if ( $autoTrx ) {
- $this->setFlag( self::DBO_TRX ); // restore automatic begin()
- } else {
- $this->clearFlag( self::DBO_TRX ); // restore auto-commit
- }
} catch ( Exception $ex ) {
call_user_func( $this->errorLogger, $ex );
$e = $e ?: $ex;
if ( $this->trxLevel() ) {
$this->rollback( __METHOD__, self::FLUSHING_INTERNAL );
}
+ } finally {
+ if ( $autoTrx ) {
+ $this->setFlag( self::DBO_TRX ); // restore automatic begin()
+ } else {
+ $this->clearFlag( self::DBO_TRX ); // restore auto-commit
+ }
}
}
} while ( count( $this->trxIdleCallbacks ) );
const DELETED_RESTRICTED = 8;
// Convenience fields
- const SUPPRESSED_USER = 12;
- const SUPPRESSED_ACTION = 9;
+ const SUPPRESSED_USER = self::DELETED_USER | self::DELETED_RESTRICTED;
+ const SUPPRESSED_ACTION = self::DELETED_ACTION | self::DELETED_RESTRICTED;
/** @var bool */
public $updateRecentChanges;
}
}
if ( is_numeric( $val ) ) {
- $fNumber = pow( 2, $val / 2 );
+ $fNumber = 2 ** ( $val / 2 );
if ( $fNumber !== false ) {
$val = $this->msg( 'exif-maxaperturevalue-value',
$this->formatNum( $val ),
*/
static function readGCT( $fh, $bpp ) {
if ( $bpp > 0 ) {
- $max = pow( 2, $bpp );
+ $max = 2 ** $bpp;
for ( $i = 1; $i <= $max; ++$i ) {
fread( $fh, 3 );
}
const RECOVER_COMMENTS = 16;
const NO_TAGS = 32;
- const RECOVER_ORIG = 59; // = 1|2|8|16|32 no constant expression support in PHP yet
+ const RECOVER_ORIG = self::NO_ARGS | self::NO_TEMPLATES | self::NO_IGNORE |
+ self::RECOVER_COMMENTS | self::NO_TAGS;
/** This constant exists when $indexOffset is supported in newChild() */
const SUPPORTS_INDEX_OFFSET = 1;
protected function submitForm( array $formData, HTMLForm $form ) {
$res = $this->saveFormData( $formData, $form );
- if ( $res ) {
+ if ( $res === true ) {
$context = $form->getContext();
-
$urlOptions = [];
if ( $res === 'eauth' ) {
$context->getOutput()->redirect( $url );
}
- return Status::newGood();
+ return ( $res === true ? Status::newGood() : $res );
}
/**
}
if ( isset( $info['AutoloadNamespaces'] ) ) {
$autoloadNamespaces += $this->processAutoLoader( $dir, $info['AutoloadNamespaces'] );
+ AutoLoader::$psr4Namespaces += $autoloadNamespaces;
}
// get all requirements/dependencies for this extension
* Subclass with context specific LESS variables
*/
class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule {
- protected $lessVariables = [
- 'collapsible-collapse',
- 'collapsible-expand',
- ];
+ protected $lessVariables = [];
+
+ /**
+ * @inheritDoc
+ */
+ public function __construct(
+ $options = [],
+ $localBasePath = null,
+ $remoteBasePath = null
+ ) {
+ if ( isset( $options['lessMessages'] ) ) {
+ $this->lessVariables = $options['lessMessages'];
+ }
+ parent::__construct( $options, $localBasePath, $remoteBasePath );
+ }
/**
* @inheritDoc
/**
* Exclude a set of messages from a JSON string representation
+ *
* @param string $blob
* @param array $exclusions
* @return array $blob
foreach ( $exclusions as $key ) {
unset( $data[$key] );
}
- return $data;
+ return (object)$data;
}
/**
* (ModifyVars) method so that the variable can be loaded and made available to stylesheets.
* Note this does not take care of CSS escaping. That will be taken care of as part
* of CSS Janus.
+ *
* @param string $msg
* @return string wrapped LESS variable definition
*/
}
/**
- * @param \ResourceLoaderContext $context
+ * Get language-specific LESS variables for this module.
+ *
+ * @param ResourceLoaderContext $context
* @return array LESS variables
*/
- protected function getLessVars( \ResourceLoaderContext $context ) {
+ protected function getLessVars( ResourceLoaderContext $context ) {
$blob = parent::getMessageBlob( $context );
$lessMessages = $this->excludeMessagesFromBlob( $blob, $this->messages );
- $vars = [];
+ $vars = parent::getLessVars( $context );
foreach ( $lessMessages as $msgKey => $value ) {
$vars['msg-' . $msgKey] = self::wrapAndEscapeMessage( $value );
}
}
}
- /**
- * Workaround for PHP5 bug
- *
- * PHP5 has a bug in handling boolean return values for
- * SessionHandlerInterface methods, it expects 0 or -1 instead of true or
- * false. See <https://wiki.php.net/rfc/session.user.return-value>.
- *
- * PHP7 and HHVM are not affected.
- *
- * @todo When we drop support for Zend PHP 5, this can be removed.
- * @return bool|int
- * @codeCoverageIgnore
- */
- protected static function returnSuccess() {
- return defined( 'HHVM_VERSION' ) || version_compare( PHP_VERSION, '7.0.0', '>=' ) ? true : 0;
- }
-
- /**
- * Workaround for PHP5 bug
- * @see self::returnSuccess()
- * @return bool|int
- * @codeCoverageIgnore
- */
- protected static function returnFailure() {
- return defined( 'HHVM_VERSION' ) || version_compare( PHP_VERSION, '7.0.0', '>=' ) ? false : -1;
- }
-
/**
* Initialize the session (handler)
* @private For internal use only
* @param string $save_path Path used to store session files (ignored)
* @param string $session_name Session name (ignored)
- * @return bool|int Success (see self::returnSuccess())
+ * @return true
*/
public function open( $save_path, $session_name ) {
if ( self::$instance !== $this ) {
if ( !$this->enable ) {
throw new \BadMethodCallException( 'Attempt to use PHP session management' );
}
- return self::returnSuccess();
+ return true;
}
/**
* Close the session (handler)
* @private For internal use only
- * @return bool|int Success (see self::returnSuccess())
+ * @return true
*/
public function close() {
if ( self::$instance !== $this ) {
throw new \UnexpectedValueException( __METHOD__ . ': Wrong instance called!' );
}
$this->sessionFieldCache = [];
- return self::returnSuccess();
+ return true;
}
/**
* @param string $dataStr Session data. Not that you should ever call this
* directly, but note that this has the same issues with code injection
* via user-controlled data as does PHP's unserialize function.
- * @return bool|int Success (see self::returnSuccess())
+ * @return bool
*/
public function write( $id, $dataStr ) {
if ( self::$instance !== $this ) {
[
'session' => $id,
] );
- return self::returnSuccess();
+ return true;
}
// First, decode the string PHP handed us
$data = \Wikimedia\PhpSessionSerializer::decode( $dataStr );
if ( $data === null ) {
// @codeCoverageIgnoreStart
- return self::returnFailure();
+ return false;
// @codeCoverageIgnoreEnd
}
$session->persist();
- return self::returnSuccess();
+ return true;
}
/**
* Destroy a session
* @private For internal use only
* @param string $id Session id
- * @return bool|int Success (see self::returnSuccess())
+ * @return true
*/
public function destroy( $id ) {
if ( self::$instance !== $this ) {
if ( $session ) {
$session->clear();
}
- return self::returnSuccess();
+ return true;
}
/**
* Execute garbage collection.
* @private For internal use only
* @param int $maxlifetime Maximum session life time (ignored)
- * @return bool|int Success (see self::returnSuccess())
+ * @return true
* @codeCoverageIgnore See T135576
*/
public function gc( $maxlifetime ) {
}
$before = date( 'YmdHis', time() );
$this->store->deleteObjectsExpiringBefore( $before );
- return self::returnSuccess();
+ return true;
}
}
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $this->getPageTitle( 'reset' ) ); // Reset subpage
- $htmlForm = HTMLForm::factory(
- $this->oouiEnabled ? 'ooui' : 'vform', [], $context, 'prefs-restore'
- );
+ $htmlForm = HTMLForm::factory( 'ooui', [], $context, 'prefs-restore' );
$htmlForm->setSubmitTextMsg( 'restoreprefs' );
$htmlForm->setSubmitDestructive();
// Write back the new counter value
ftruncate( $handle, 0 );
rewind( $handle );
- fwrite( $handle, fmod( $counter, pow( 2, 48 ) ) ); // warp-around as needed
+ fwrite( $handle, fmod( $counter, 2 ** 48 ) ); // warp-around as needed
fflush( $handle );
// Release the UID lock file
flock( $handle, LOCK_UN );
}
$ids = [];
- $divisor = pow( 2, $bits );
+ $divisor = 2 ** $bits;
$currentId = floor( $counter - $count ); // pre-increment counter value
for ( $i = 0; $i < $count; ++$i ) {
$ids[] = fmod( ++$currentId, $divisor );
protected function millisecondsSinceEpochBinary( array $time ) {
list( $sec, $msec ) = $time;
$ts = 1000 * $sec + $msec;
- if ( $ts > pow( 2, 52 ) ) {
+ if ( $ts > 2 ** 52 ) {
throw new RuntimeException( __METHOD__ .
': sorry, this function doesn\'t work after the year 144680' );
}
$offset = '122192928000000000';
if ( PHP_INT_SIZE >= 8 ) { // 64 bit integers
$ts = ( 1000 * $sec + $msec ) * 10000 + (int)$offset + $delta;
- $id_bin = str_pad( decbin( $ts % pow( 2, 60 ) ), 60, '0', STR_PAD_LEFT );
+ $id_bin = str_pad( decbin( $ts % ( 2 ** 60 ) ), 60, '0', STR_PAD_LEFT );
} elseif ( extension_loaded( 'gmp' ) ) {
$ts = gmp_add( gmp_mul( (string)$sec, '1000' ), (string)$msec ); // ms
$ts = gmp_add( gmp_mul( $ts, '10000' ), $offset ); // 100ns intervals
}
// Throw an exception if there was loss of precision
- if ( $value > pow( 2, 52 ) ) {
+ if ( $value > 2 ** 52 ) {
$this->error( 'zip-unsupported', 'number too large to be stored in a double. ' .
'This could happen if we tried to unpack a 64-bit structure ' .
'at an invalid location.' );
"copyrightwarning2": "অনুগ্ৰহ কৰি মন কৰক যে {{SITENAME}}লৈ কৰা সকলো বৰঙণি আন সদস্যই সম্পাদনা কৰিব, সলনি কৰিব অথবা মচি পেলাব পাৰে ।\nআপুনি যদি আপোনাৰ লিখনি নিৰ্দয়ভাৱে সম্পাদনা কৰা ভাল নাপায়, তেনেহলে নিজৰ লিখনি ইয়াত নিদিব ।<br />\nইয়াত আপোনাৰ লিখনি দিয়াৰ লগে লগে আপুনি আপোনা-আপুনি প্ৰতিশ্ৰুতি দিছে যে এই লিখনিটো আপোনাৰ মৌলিক লিখনি, বা কোনো স্বত্বাধিকাৰ নথকা বা কোনো ৰাজহুৱা ৱেবছাইট বা তেনে কোনো মুকলি উৎসৰ পৰা আহৰণ কৰা । (অধিক জানিবলৈ $1 চাওক)\n\n'''স্বত্বাধিকাৰযুক্ত কোনো সমল অনুমতি অবিহনে দাখিল নকৰে যেন!'''",
"longpageerror": "'''ভুল: আপুনি জমা দিয়া পাঠ {{PLURAL:$1|এক কিলো-বাইট|$1 কিলো-বাইট}} আকাৰৰ, যি {{PLURAL:$2|এক কিলো-বাইট|$2 কিলো-বাইট}} সীমাতকৈ বেছি।'''\nইয়াক সাঁচিব পৰা নাযাব।",
"readonlywarning": "'''সতৰ্কবাণী: চোৱা-চিতাৰ হেতু এই তথ্যকোষ বন্ধ কৰি ৰখা হৈছে, গতিকে আপুনি এই মূহুৰ্তত আপোনাৰ সম্পাদনা সাঁচিব নোৱাৰিব।'''\nআপুনি লেখাটো টেক্সট-ফাইলত কপী-পে'ষ্ট কৰি পিছলৈ ব্যৱহাৰৰ বাবে সাঁচি ৰাখিব পাৰে।\n\nতথ্যকোষ বন্ধ কৰি ৰখা প্ৰশাসকজনে এই ব্যাখ্যা দিছে: $1",
- "protectedpagewarning": "'''সতৰ্কবাণী: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল প্ৰশাসকৰৰ মৰ্যদাৰ সদস্যইহে সম্পাদনা কৰিব পাৰিব ।'''\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল ।",
+ "protectedpagewarning": "<strong>সতৰ্কবাণী: এই পৃষ্ঠা সুৰক্ষিত কৰা হৈছে; কেৱল প্ৰশাসনিক মৰ্যাদাৰ সদস্যইহে ইয়াক সম্পাদনা কৰিব পাৰিব।</strong>\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ অন্তৰ্ভুক্তি তলত দিয়া হ'ল ।",
"semiprotectedpagewarning": "টোকা: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল পঞ্জীভূত সদস্যই হে সম্পাদনা কৰিব পাৰিব ।\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল ।",
"cascadeprotectedwarning": "<strong>সতৰ্কবাণী:</strong> এই পৃষ্ঠাটো সুৰক্ষিত কৰি ৰখা হৈছে যাতে কেৱল প্ৰশাসনিক ক্ষমতা থকা সদস্যই ইয়াক সম্পাদনা কৰিব পাৰে, কাৰণ ই প্ৰপাতাকাৰ-সুৰক্ষিত {{PLURAL:$1|পৃষ্ঠাটোৰ|পৃষ্ঠাবোৰৰ}} অন্তৰ্ভুক্ত:",
"titleprotectedwarning": "'''সতৰ্কবাণী: এই পৃষ্ঠাটো সুৰক্ষিত কৰা হৈছে যাতে কেৱল [[Special:ListGroupRights|specific rights]] সদস্যই ইয়াক তৈয়াৰ কৰিব পাৰে ।'''\nআপোনাৰ সুবিধাৰ্থে অভিলেখৰ শেহতীয়া ভৰ্তি তলত দিয়া হ’ল।",
"passwordpolicies-policy-minimalpasswordlength": "Пароль мусіць мець даўжыню найменей $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}",
"passwordpolicies-policy-minimumpasswordlengthtologin": "Пароль мусіць мець даўжыню найменш $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}, каб уваходзіць у сыстэму",
"passwordpolicies-policy-passwordcannotmatchusername": "Пароль ня можа супадаць зь імем ўдзельніка",
- "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль ня можа супадаць з паролямі з чорнага сьпісу"
+ "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль ня можа супадаць з паролямі з чорнага сьпісу",
+ "passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}"
}
{
"@metadata": {
"authors": [
- "Simartampua"
+ "Simartampua",
+ "Apundung"
]
},
"sunday": "Akad",
"pagecategories": "{{PLURAL:$1|Category|Kategori}}",
"category_header": "Alaman i kategori \"$1\"",
"subcategories": "Subkategori",
- "category-media-header": "Media in jategori \"$1\"",
+ "category-media-header": "Media i kategori \"$1\"",
"category-empty": "<em>Kategori on sonnari indadong alaman dot media.</em>",
"hidden-categories": "{{PLURAL:$1|Hidden category|Kategori monjap}}",
"category-subcat-count": "{{PLURAL:$2|Kategori on umna puna subkategori ima.|Kategori on puna ima {{PLURAL:$1|subkategori|$1 subkategori}}, tingon bahat $2.}}",
"category-article-count": "{{PLURAL:$2|Kategori on umna marisi alaman ima.|Onma{{PLURAL:$1|alaman ima|$1 alaman}} i kategori on, tingon bahat $2.}}",
"category-file-count": "{{PLURAL:$2|Kategori on umna marisi alaman ima.|Onma{{PLURAL:$1|alaman ima|$1 alaman}} i kategori on, tingon bahat $2.}}",
"listingcontinuesabbrev": "Sat",
+ "noindex-category": "Alaman naso tarindeks",
"broken-file-category": "Alaman dot link berkas sega",
"about": "Satontang",
"newwindow": "(bukak i tingkap nabaru)",
"mytalk": "Dokon",
"navigation": "Navigasi",
"and": " dot",
- "namespaces": "Namespaces",
+ "namespaces": "Ruang gorar",
"variants": "Mocoman",
"navigation-heading": "Menu Navigasi",
"returnto": "Keimulak tu $1",
"personaltools": "Alat pribadi",
"talk": "Marpokat",
"views": "Sise",
- "toolbox": "Alat",
+ "toolbox": "Parkuas",
"otherlanguages": "I saro nalain",
"redirectedfrom": "(Ialihkon tingon $1)",
"redirectpagesub": "Alihkon alaman",
"jumptosearch": "jalaki",
"aboutsite": "Satontang {{SITENAME}}",
"aboutpage": "Project:Satontang",
+ "copyright": "Konten tarsadio itoru $1 lainkon adong parnyataan nalain.",
"copyrightpage": "{{ns:project}}:Hak cipta",
"currentevents": "Namasa sonnari",
"currentevents-url": "Project:Kajadian nabaru",
"privacy": "Kabijakan privasi",
"privacypage": "Project:Kabijakan privasi",
"retrievedfrom": "Dapot tingon \"$1\"",
+ "youhavenewmessages": "{{PLURAL:$3|Amu puna}} $1 ($2).",
"youhavenewmessagesfromusers": "{{PLURAL:$4|Amu puna}} $1 tingon {{PLURAL:$3|another user|$3 pamake}} ($2).",
"newmessageslinkplural": "{{PLURAL:$1|a new message|999=tona na baru}}",
"newmessagesdifflinkplural": "Parpudi {{PLURAL:$1|change|999=parubaan}}",
"nosuchspecialpage": "Inda adong alaman husus songon i",
"nospecialpagetext": "<strong>Amu madung mangido alaman husus naso valid.</strong>\n\nDaftar alaman husus bisa iligi i[[Special:SpecialPages|{{int:specialpages}}]].",
"badtitle": "Judul na jat",
- "badtitletext": "Judul alaman na naipaido inda valid, kosong, sanga judul inter-sare sanga antar-wiki na sala ikaitkon. On mungkin marisi sada sanga lobi karakter na inda bisa ipake i judul.",
+ "badtitletext": "Judul alaman na naipaido inda valid, kosong, sanga judul antar-saro sanga antar-wiki na sala ikaitkon. On mungkin marisi sada sanga lobi karakter na inda bisa ipake i judul.",
"viewsource": "Sise sumber",
"viewsource-title": "Sise sumber ni $1",
"viewsourcetext": "Amu bisa manyise dot mangkopi sumber ni alaman on",
"createacct-yourpasswordagain": "Konfirmasi hata kunci",
"createacct-yourpasswordagain-ph": "Pamasuk hata kunci mulak",
"userlogin-remembermypassword": "Jago totop masuk log",
- "login": "Masuk",
+ "login": "Masuk log",
"userlogin-noaccount": "Ulang adong akun",
"userlogin-joinproject": "Martop {{SITENAME}}",
"createaccount": "Baen akun",
"createacct-benefit-body2": "{{PLURAL:$1|page|alaman}}",
"createacct-benefit-body3": "{{PLURAL:$1|contributor|kontributor}} baru",
"loginlanguagelabel": "Saro: $1",
- "pt-login": "Masuk",
+ "pt-login": "Masuk log",
"pt-login-button": "Masuk log",
"pt-createaccount": "Baen akun",
- "pt-userlogout": "Kaluar",
+ "pt-userlogout": "Kaluar log",
"botpasswords-label-needsreset": "(sandi porlu isitel mulak)",
"botpasswords-needs-reset": "Hata sandi bot tu gorar bot \"$2\" ni {{GENDER:$1|user}} \"$1\" angkon na isitel mulak.",
"passwordreset": "Gonti hata kunci",
"watchthis": "Pamatai alamanon",
"savearticle": "Simpan alaman",
"preview": "Cimak",
- "showpreview": "Pitidaon pratayang",
+ "showpreview": "Patidaon pratayang",
"showdiff": "Patidaon parubaan",
"anoneditwarning": "<strong> Paringatan: </ strong> Amu indape masuk. Alamat IP Muyu nangkan tarida sacara publik molo Amu mambaen pangeditan. Molo Amu <strong> [$1 masuk] </ strong> sanga<strong> [$2 mambaen akun] </ strong>, hasil pangeditan Muyu nangkan ikaitkon dohot gorar pamake Muyu, rap dohot manfaat lainna.",
"blockedtext": "<strong>Alamat IP muyu madung iblokir sacara otomatis arani ipake ni pamake nalain,.</strong>\n\nNa iblokir ni $1.\nPamvlokiran ibaen arani <em>$2</em>.\n\n* Iblokir sian: $8\n* Blokir kadaluarsa i: $6\n* Sasarab pamblokiran: $7\n\nAmu bisa mayapai $1 sanga [[{{MediaWiki:Grouppage-sysop}}|administrator]] lainna tuna mamokatkon hal on.\n\nAmu inda bisa mamake fitur \"{{int:emailuser}}\" kacuali amu madung mamasukkon alamat surel na sah i [[Special:Preferences|preferensi akun]] dot amu inda iblokir mamakena.\n\nAlama IP muyu saonnari ima $3, dot ID pamblokiran ima #$5.\nTolong baen informasi-informasi in i satiop parsapaan muyu.",
"autoblockedtext": "Alamat IP mu nangkan otomatis iblokir arani ipake pamake nalain, na madung iblokir ni $1.\nAlasanna ima:\n\n:<em>$2</em>\n\n* Muloi i blokir: $8\n* Kadaluarsa blokir: $6\n* Blokir na ituju: $7\n\nSapai amuma $1 sanga sada tingon nalainnai [[{{MediaWiki:Grouppage-sysop}}|administrators]] giot mamokatkon blokiran on.\n\nRoaon molo Amu inda tola mamake fitur \"{{int: emailuser}}\" kacuali Amu puna alamat surel valid na tardaftar i [[Special:Preferences|preferensi pamake]] dot Amu indape iblokir mamakena.\n\nAlamat IP mu sonnari ima $3, dot blokir ID ima #$5.\nIaropkon baen sude rincian na iginjang singkop molo mambaen parsaapaan na ibaen muyu.",
- "loginreqlink": "Masuk",
- "newarticletext": "Amu madung paiut tautan tu alaman na so adong dope. Giot mambaen alaman, muloima mangetik i kotak i toru on (ligin [$1 alaman bantuan] giot info lobi lanjut). Molo Amu adong i son arani kasalahan, klik tombol <strong> back </ strong> i browser Muyu.\n\nTERJEMAHKAN",
+ "loginreqlink": "Masuk log",
+ "newarticletext": "Amu madung paiut tautan tu alaman na so adong dope. Giot mambaen alaman, muloima mangetik i kotak i toru on (ligin [$1 alaman bantuan] giot info lobi lanjut). Molo Amu adong i son arani kasalahan, klik tombol <strong> mulam </ strong> i browser Muyu.",
+ "anontalkpagetext": "---- \n\n<em> on ima alaman marpokat tu pangguna anonim naso mambaen akun dope, sanga na inda mamakena. </em> Arani i ami angkon mamake alamat IP numerik tu mangidentifikasi ia. Songon alamat IP bisa ibagi ni bahat pengguna. Molo Amu ima pangguna anonim dot marasa molo komentar na inda relevan madung iarahkon tu Amu, kehemamu [[Special:CreateAccount|baen akun]] sanga [[Special:UserLogin|masuk log]] tu mangilakkon gamang i tu jolo niari dohot pengguna anonim laina.",
"noarticletext": "Saonnari inda adong teks i alaman on. Amu bisa [[Special:Search/{{PAGENAME}}|manjalai judul alaman on]] i alaman lain, <span class = \"plainlinks\"> [{{fullurl: {{# Special: Log}} | page = { {FULLPAGENAMEE}}}} telusuri log terkait], atau [{{fullurl: {{FULLPAGENAME}} | action = edit}} baen alaman on] </ span>.",
"noarticletext-nopermission": "Saonnari inda adong teks i alaman on. Amu bisa [[Special:Search/{{PAGENAME}}|manjalai judul alaman on]] i alaman lain, sanga <span class = \"plainlinks\"> [{{fullurl:{{#Special:Log}}|alaman={{FULLPAGENAMEE}}}} jalai log tarkait] </ span>, tai Amu inda puna izin giot mambaen alaman on.",
"userpage-userdoesnotexist-view": "Akun pangguna ''$1'' inda tardaftar",
+ "clearyourcache": "<strong> Catatan: </strong> Sidung manyimpan, Amu mungkin angkon malewati cache browser Muyu anso mangida parubaanna. \n* <strong> Firefox/Safari:</strong> Tahan <em> Shift </em> atia mangklik <em> Reload </em>, sanga pisat <em> Ctrl-F5 </em> sanga <em> Ctrl-R </em> (<em> ⌘-R </ em> pada Mac) \n* <strong> Google Chrome: </strong> Pisat <em> Ctrl-Shift-R </em> (<em> ⌘ -Shift-R </em> i Mac) \n* <strong> Internet Explorer: </strong> Tahan <em> Ctrl </em> atia mangklik <em> Segarkon </em>, sanga pisat <em> Ctrl-F5 </em> \n* <strong> Opera: </ strong> Kei tu <em> Menu → Pangaturan </em> (<em> Opera → Preferensi </ em> i Mac) dot sidungi ke <em> Privasi & kaamanan → Apus data panjalajahan → Tembolok gambar dot file </em>.",
+ "previewnote": "<strong> Ingot molo on umna pratinjau. </strong> Parubaan Muyu indape isimpan!",
+ "continue-editing": "Kei tu ganan pangeditan",
"editing": "Mangedit $1",
"creating": "Baen $1",
"editingsection": "Patureon $1 (bagian)",
"templatesused": "{{PLURAL:$1|Template|Templat}} baen tu alaman on:",
+ "templatesusedpreview": "{{PLURAL:$1|Template|Templat}} ipake i pratinjau on:",
"template-protected": "Larangan",
"template-semiprotected": "(satonga-larangan)",
"hiddencategories": "Alaman on ima anggota {{PLURAL:$1|1 kategori namonjap|$1 kategori namonjap}}:",
"permissionserrors": "Santabi sega",
"permissionserrorstext-withaction": "Amu inda iizinkon $2, tu naonan {{PLURAL:$1|reason|alasan}}:",
+ "recreate-moveddeleted-warn": "<strong> Paringotan: Amu mambaen mulak laman na unjung ihapus. </strong> Amu angkon mapartimbangkon sanga sasue giot malanjutkon mangedit alaman on. Log pangapusan dot pamindahan tu alaman on isadioon i son so tagi:",
"moveddeleted-notice": "Alaman on nangkan iapus. \nCatatan pangapusan, palarangan, dot pamindahan tu alaman ilehen i toru on manjadi referensi.",
"content-model-wikitext": "Tekswiki",
+ "undo-failure": "Pangeditan inda bisa iantai arani pangeditan dompak na konflik.",
"viewpagelogs": "Sise log ni alaman on",
"currentrev-asof": "Parubaan parpudi ima $1",
"revisionasof": "Revisi par $1",
"history-feed-description": "Sejarah revisi tu alaman i wiki",
"history-feed-item-nocomment": "$1 i $2",
"rev-delundel": "Uba visibilitas",
+ "mergelog": "Pasada log",
"history-title": "Sejarah Revisi ni \"$1\"",
"difference-title": "Parbedaan antara revisi \"$1\"",
"lineno": "Baris $1:",
"compareselectedversions": "Bandingkon dot revisi tarpili",
"editundo": "Mambuka",
+ "diff-empty": "(Inda dong parbedaan)",
"diff-multi-sameuser": "({{PLURAL:$1|Sada revisi manonga|$1 revisi manonga}} ni pangguna na sarupo inda ipatidaon)",
+ "diff-multi-otherusers": "({{PLURAL:$1|Sada revisi sedang|$1 revisi sedang}} ibaen {{PLURAL:$2|sada pangguna lainna|$2 pangguna}} inda ipatidaon)",
"searchresults": "Jalaki sude hasil",
"searchresults-title": "Jalaki sude hasil tu \"$1\"",
"prevn": "Cimak {{PLURAL:$1|$1}}",
"group-bot": "Bot",
"group-sysop": "Administrator",
"grouppage-bot": "{{ns:project}}:Bot",
+ "grouppage-sysop": "{{ns:project}}:Administrator",
"right-writeapi": "Pamakean ni API tulis",
"newuserlogpage": "Log pambaenan pamake",
+ "rightslog": "Log hak pangguna",
"action-edit": "Pature alaman on",
"action-createaccount": "baen akun pamake on",
"enhancedrc-history": "sejarah",
"recentchanges-summary": "Lacak parubaan tarbaru i wiki i alaman on.",
"recentchanges-noresult": "Inda adong parubaan saonok periode na ilehen sasuae dohot kriteria on.",
"recentchanges-feed-description": "Jalaki parubaan tarbaru i wiki i umpan on.",
- "recentchanges-label-newpage": "Patureon on mammbaen alaman baru",
- "recentchanges-label-minor": "On pature na menek",
+ "recentchanges-label-newpage": "Editan on mammbaen alaman baru",
+ "recentchanges-label-minor": "On edit na menek",
"recentchanges-label-bot": "Naipature ni bot",
"recentchanges-label-unpatrolled": "Suntingan on indape ipareso",
"recentchanges-label-plusminus": "Ukuran alamanon iuba dohot bahatni byte",
- "recentchanges-legend-heading": "<strong>tarombo:</strong>",
+ "recentchanges-legend-heading": "<strong>Tando:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ligin juo [[Special:NewPages|daftar alaman nabaru]])",
"rcnotefrom": "Itoru {{PLURAL:$5|is the change|ima parubaan}} saonok<strong>$3, $4</strong> (sampe tu <strong>$1</strong> patidaon).",
"rclistfrom": "Patidaon parubaan tarbaru imuloi tingon $2, $3",
"rcshowhideanons": "$1 pamake anonim",
"rcshowhideanons-show": "Patidaon",
"rcshowhideanons-hide": "Bunion",
+ "rcshowhidepatr": "$1 edit nai pareso",
"rcshowhidemine": "$1 naupature",
"rcshowhidemine-show": "Patidaon",
"rcshowhidemine-hide": "Bunion",
"minoreditletter": "m",
"newpageletter": "B",
"boteditletter": "b",
- "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} sidung maruba",
+ "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} sidung iuba",
+ "rc-old-title": "Aslina ibaen i ''$1''",
"recentchangeslinked": "Parubaan tarkait",
"recentchangeslinked-feed": "Parubaan tarkait",
"recentchangeslinked-toolbox": "Parubaan tarkait",
"file-anchor-link": "Berkas",
"filehist": "Sejarah berkas",
"filehist-help": "Klik tanggal / woktu giot maligi file songon na na i woktu i.",
+ "filehist-revert": "Mulak",
"filehist-current": "Saonnari",
"filehist-datetime": "Tangagal/Woktu",
- "filehist-thumb": "Thumbnail",
- "filehist-thumbtext": "Thumbnail tu versi par $1",
+ "filehist-thumb": "Gambar",
+ "filehist-thumbtext": "Gambar tu versi par $1",
+ "filehist-nothumb": "Inda adong gambar",
"filehist-user": "Pamake",
"filehist-dimensions": "Ukuran",
"filehist-comment": "Komentar",
"imagelinks": "Berkas ipake",
- "linkstoimage": "Namamatai {{PLURAL:$1|page links|$1 tautan alaman}} tu berkas on:",
+ "linkstoimage": "Onma {{PLURAL:$1|page links|$1 tautan alaman}} tu berkas on:",
+ "linkstoimage-more": "Lobi tingon $1 {{PLURAL:$1|page links|tautan alaman}} tu berkas on. Daftar naonan patidaon {{PLURAL:$1|first page link|tautan alaman parjolo $1}} tu berkas on sajo. A [[Special:WhatLinksHere/$2|daftar singkop]] tarsadio.",
"nolinkstoimage": "Inda adong alaman na martaut tu berkason",
+ "linkstoimage-redirect": "$1 (pangalihan berkas) $2",
"sharedupload-desc-here": "File on tingon $1 dot bisa ipake ni proyek lain. Deskripsi i [alaman deskripsi file $2] i sadun ipatidaon naitoruon.",
+ "filepage-nofile": "Inda adong berkas dohot gorar on.",
"upload-disallowed-here": "Amu inda bisa manimpo berkas on.",
"randompage": "Gaor alaman",
"statistics": "Statistik",
+ "double-redirect-fixer": "Papas Pangalihan",
"nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
- "nmembers": "$1 {{PLURAL:$1|member|members}}",
+ "nmembers": "$1 {{PLURAL:$1|member|anggota}}",
"prefixindex": "Sude alaman na prefix",
"listusers": "Daptar pamake",
"newpages": "Alaman baru",
"booksources": "Sumber buku",
"booksources-search-legend": "Jalai tu sumber buku",
"booksources-search": "Jalai",
+ "specialloguserlabel": "Panampil:",
+ "speciallogtitlelabel": "Target (judul sanga {{ns:user}}:gorar pangguna tu pangguna):",
"log": "Masuk",
"all-logs-page": "Sude log",
+ "alllogstext": "Tampilan gabungan tingon sude log na tarsadio tingon {{SITENAME}}. Amu bisa mamparsompit tampilan dohot mamili jenis log, gorar pangguna (sensitif huruf), sanga alaman na tarpangaruh (juo kasus-sensitive).",
"logempty": "Inda adong item nacocok i log",
"allpages": "Sude alaman",
"allarticles": "Sude alaman",
"allpagessubmit": "Kehe",
"allpages-hide-redirects": "Bunion pangalihan",
"categories": "Kategori",
+ "listgrouprights-members": "(daftar anggota)",
"emailuser": "Email ni pamake on",
"usermessage-editor": "Tona ni sistem",
"watchlist": "Pamataan",
"watch": "Pamatai",
"unwatch": "Inda ipamatai",
"watchlist-details": "{{PLURAL:$1|$1 page is|$1 alaman}} i pamataanmu (dot alaman parkobaran).",
+ "wlheader-showupdated": "Laman na madung iubah sian parpudi Amu ligi, ipatidaon i huruf <strong> naapal </strong>.",
+ "wlnote": "Itoruon {{PLURAL:$1|is the last change|ima parpudi<strong>$1</strong> parubaan}} i {{PLURAL:$2|hour|<strong>$2</strong> jom}}, i $3, $4.",
"wlshowlast": "Patidaon parpudi $1 jom $2 ari",
"watchlist-options": "Opsi pamataan",
"enotif_reset": "Tandai sude alaman namadung iligi",
"rollbacklinkcount": "Paulak $1 {{PLURAL:$1|edit|edits}}",
"protectlogpage": "Log nai jago",
"protectedarticle": "larangan \"[[$1]]\"",
+ "modifiedarticleprotection": "Gonti tingkat larangan tu ''[[$1]]''",
"protect-default": "Patola sude pangguna",
"restriction-edit": "Pature",
"restriction-move": "Pindah",
- "namespace": "Namespace:",
+ "namespace": "Ruanggorar:",
"invert": "Pilian sabalikna",
- "tooltip-invert": "Centang kotak on giot mambunion parubaan tu alaman i ruang gorar na ipili (dot ruang girar tarkait molo icentang)",
+ "tooltip-invert": "Centang kotak on giot mambunion parubaan tu alaman i ruang gorar na ipili (dot ruang gorar tarkait molo icentang)",
"namespace_association": "Kumpulan ruang gorar",
"tooltip-namespace_association": "Centang kotak on giot mambunion ruang gorar pangecean sanga subjek na tarkait dohot ruang gorar na ipili",
"blanknamespace": "(Utamo)",
"contributions": "{{GENDER:$1|User}} kontribusi",
- "contributions-title": "Kontribusi pannguna tu $1",
+ "contributions-title": "Kontribusi pangguna tu $1",
"mycontris": "Kontribusi",
"anoncontribs": "Kontribusingku",
"contribsub2": "Tu {{GENDER:$3|$1}} ($2)",
+ "nocontribs": "Inda adong parubaan na sasue dohot kriteria on.",
"uctop": "(sonnari)",
"month": "Tingon bulan (dot nasolpu)",
"year": "Tingon taon (dot nasolpu)",
"whatlinkshere-hideimages": "$1 tautan berkas",
"whatlinkshere-filters": "Saringan",
"ipboptions": "2 jom:2 hours,1 ari:1 day,3 ari:3 days,1 poken:1 week,2 poken:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taon:1 year,onok:infinite",
+ "infiniteblock": "Inda tarbatas",
"blocklink": "blokir",
"contribslink": "Kontributor",
"blocklogpage": "Blokir log",
"blocklogentry": "blokir [[$1]] dot woktu kadaluarsa $2 $3",
+ "reblock-logentry": "Gonti sitelan blokir tu [[$1]] dot maso kadaluarsa tu $2 $3",
+ "block-log-flags-nocreate": "Pambaenan akun inonaktipkon",
"proxyblocker": "Blokir proxi",
"movelogpage": "Pindah log",
"export": "Expor alaman",
"tooltip-pt-watchlist": "Daftar nialaman na parubaanna ipamataimu",
"tooltip-pt-mycontris": "Daftar {{GENDER:|your}} kontribusi",
"tooltip-pt-login": "Amu iaropkon masuk, tai inda wajib",
- "tooltip-pt-logout": "Kaluar",
+ "tooltip-pt-logout": "Kaluar log",
"tooltip-pt-createaccount": "Amu iaropkon mambaen akun dot masuk; taiba, i inda wajib",
"tooltip-ca-talk": "Pokat satontang isi ni alaman",
"tooltip-ca-edit": "Pature alamanon",
"tooltip-ca-protect": "Jago alamanon",
"tooltip-ca-delete": "Apus alaman on",
"tooltip-ca-move": "Papindah alamanon",
- "tooltip-ca-watch": "Baen alamanon tu pangawasanmu",
+ "tooltip-ca-watch": "Baen alamanon tu pamataanmu",
"tooltip-ca-unwatch": "Apus alaman on tingon pamataanmu",
"tooltip-search": "Jalaki {{SITENAME}}",
"tooltip-search-go": "Kehe tu alaman dohot gorar naonan molo adong.",
"tooltip-n-randompage": "Muat alaman sumbarang",
"tooltip-n-help": "Inganan anso binoto",
"tooltip-t-whatlinkshere": "Daftar alaman wiki na martaut tuson",
- "tooltip-t-recentchangeslinked": "Parubaan tarbaru i sude alaman namartautan tingon alaman on",
+ "tooltip-t-recentchangeslinked": "Parubaan tarbaru i sude alaman namartautan tu alaman on",
"tooltip-feed-atom": "Umpan atom ni alamaon",
"tooltip-t-contributions": "Daftar kontribusi ni {{GENDER:$1|pamake on}}",
"tooltip-t-emailuser": "Kirim email tu {{GENDER:$1|pamake on}}",
"tooltip-t-permalink": "Tautan permanen tu revisi ni alamanon",
"tooltip-ca-nstab-main": "Sise isi ni alaman",
"tooltip-ca-nstab-user": "Sise alaman pamake",
- "tooltip-ca-nstab-special": "On alaman spesial, dot on inda bisa ipature",
+ "tooltip-ca-nstab-special": "On alaman husus, dot on inda bisa ipature",
"tooltip-ca-nstab-project": "Sise alaman proyek",
"tooltip-ca-nstab-image": "Sise alaman berkas",
"tooltip-ca-nstab-mediawiki": "Sise sistem tona",
"pageinfo-default-sort": "Kunci panyortiran default",
"pageinfo-length": "Lanjang alaman (i byte)",
"pageinfo-article-id": "ID alaman",
- "pageinfo-language": "Bahasa isi ni alaman",
+ "pageinfo-language": "Saro isi ni alaman",
"pageinfo-content-model": "Model konten alaman",
"pageinfo-robot-policy": "Pangindeksan ni robot",
+ "pageinfo-robot-index": "Iizinkon",
+ "pageinfo-robot-noindex": "Inda iizinkon",
"pageinfo-watchers": "Bahatni alaman naipamatai",
+ "pageinfo-few-watchers": "Urang tingon $1 {{PLURAL:$1|pamatai|napamatai}}",
"pageinfo-redirects-name": "Bahatni pangalihan tu alaman on",
+ "pageinfo-subpages-name": "Bahatni sub alaman ni alaman on",
+ "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|pangalihan}}; $3 {{PLURAL:$3|non-redirect|inda pangalihan}})",
"pageinfo-firstuser": "Pambaen alaman",
"pageinfo-firsttime": "Tanggal ibaen alaman",
+ "pageinfo-lastuser": "Pangedit parpudi",
+ "pageinfo-lasttime": "Tanggal edit parpudi",
"pageinfo-edits": "Bahat ni edit",
+ "pageinfo-authors": "Bahatni sude panulis namarbeda",
+ "pageinfo-recent-edits": "Bahat pangeditan tarbaru (i $1 pardudi)",
+ "pageinfo-recent-authors": "Bahat ni panulis namarbeda i ari nalewat",
+ "pageinfo-magic-words": "Ajaib {{PLURAL:$1|word|hata}} ($1)",
"pageinfo-hidden-categories": "Bunion {{PLURAL:$1|category|Kategori}} ($1)",
- "pageinfo-templates": "Transclusi {{PLURAL:$1|template|templat}} ($1)",
+ "pageinfo-templates": "Transklusi {{PLURAL:$1|template|templat}} ($1)",
"pageinfo-toolboxlink": "Informasi alaman",
"pageinfo-contentpage": "Ietong manjadi sada alaman",
"pageinfo-contentpage-yes": "Olo",
"nextdiff": "Edit tarbaru →",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|alaman}}",
"file-info-size": "$1 × $2 piksel, ukuran berkas: $3, Type MIME: $4",
+ "file-info-size-pages": "$1 × $2 piksel, ukuran berkas: $3, tipe MIME : $4, $5 {{PLURAL:$5|page|alaman}}",
"file-nohires": "Indadongbe resolusi naum ginjang",
"svg-long-desc": "Berkas SVG, nominall $1 × $2 piksel, ukuran berkas: $3",
"show-big-image": "Berkas asli",
"watchlisttools-clear": "Paias pamataan",
"watchlisttools-view": "Sise parubaan na pas",
"watchlisttools-edit": "Sise dot pature pamataan",
+ "watchlisttools-raw": "Pature daptar pamataan",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|obarkon]])",
"redirect": "Pangalihan ni berkas, pamake, alaman, revisi, sanga log ID",
"redirect-summary": "Alaman husus on mangalihkon tu berkas (ilehen gorar berkas), alaman (ilehen ID revisi sanga ID alaman), alaman pangguna (ilehen ID pangguna numerik), sanga entri log (ilehen ID log). Pamakean:\n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], sanga [[{{#Special:Redirect}}/logid/186]].",
"redirect-page": "ID alaman",
"redirect-revision": "Revisi alaman",
"redirect-file": "Gorarberkas:",
- "specialpages": "Alaman Spesial",
+ "specialpages": "Alaman husus",
"tag-filter": "[[Special:Tags|Tag]] saring:",
- "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]:$2)",
"tags-active-yes": "Olo",
"tags-active-no": "Inda",
"tags-hitcount": "$1 {{PLURAL:$1|change|parubaan}}",
"logentry-delete-delete": "$1 {{GENDER:$2|iapus}} alaman $3",
+ "logentry-delete-restore": "$1 {{GENDER:$2|restored}} alaman $3 ($4)",
"logentry-delete-revision": "$1 {{GENDER:$2|iuba}} visibilitas {{PLURAL:$5|a revision|$5 revisi}} i alaman $3: $4",
"revdelete-content-hid": "Isi naibunion",
"logentry-move-move": "$1 {{GENDER:$2|pindah}} alam $3 to $4",
"logentry-newusers-create": "Akun pamake $1 ima {{GENDER:$2|baen}}",
"logentry-newusers-autocreate": "Akun pangguna $1 madung {{GENDER:$2|ibaen}} otomatis",
"logentry-upload-upload": "$1 {{GENDER:$2|maiunggah}} $3",
+ "logentry-upload-overwrite": "$1 {{GENDER:$2|iunggah}} versi nabaru tingon $3",
"searchsuggest-search": "Jalaki {{SITENAME}}",
"duration-days": "$1 {{PLURAL:$1|day|ari}}",
- "randomrootpage": "Alaman urat kocok"
+ "randomrootpage": "Gaor alaman urat"
}
"february": "Gucige",
"march": "Adar",
"april": "Nisane",
- "may_long": "Gulan",
+ "may_long": "Gulane",
"june": "Heziran",
"july": "Temuz",
"august": "Tebaxe",
"february-gen": "Sıbat",
"march-gen": "Adar",
"april-gen": "Nisane",
- "may-gen": "Gulan",
+ "may-gen": "Gulane",
"june-gen": "Heziran",
"july-gen": "Temuz",
"august-gen": "Tebaxe",
"jan": "Çel",
"feb": "Sbt",
"mar": "Adr",
- "apr": "Lsn",
- "may": "Gln",
+ "apr": "Nsn",
+ "may": "Gul",
"jun": "Hez",
"jul": "Tmz",
"aug": "Tbx",
"february-date": "$1 Sıbat",
"march-date": "$1 Adar",
"april-date": "$1 Nisane",
- "may-date": "$1 Gulan",
+ "may-date": "$1 Gulane",
"june-date": "$1 Heziran",
"july-date": "$1 Temuze",
"august-date": "$1 Tebaxe",
"badipaddress": "כתובת IP שגויה",
"blockipsuccesssub": "החסימה הושלמה בהצלחה",
"blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.<br />\nניתן לעיין ב[[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
- "ipb-blockingself": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לחסום את {{GENDER:|עצמך|עצמך|עצמכם}}! האם {{GENDER:|אתה בטוח שאתה רוצה|את בטוחה שאת רוצה|אתם בטוחים שאתם רוצים}} לעשות את זה?",
- "ipb-confirmhideuser": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לחסום משתמש עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות את זה?",
+ "ipb-blockingself": "החשבון שלך ייחסם! האם ברצונך לעשות זאת?",
+ "ipb-confirmhideuser": "החשבון ייחסם עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם ברצונך לעשות זאת?",
"ipb-confirmaction": "אם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות זאת, אנא {{GENDER:|סמן|סמני|סמנו}} את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
"ipb-edit-dropdown": "עריכת סיבות החסימה",
"ipb-unblock-addr": "שחרור חסימה של $1",
"protectedtitles-submit": "Leírások mutatása",
"listusers": "Szerkesztők",
"listusers-editsonly": "Csak a szerkesztéssel rendelkező szerkesztők mutatása",
+ "listusers-temporarygroupsonly": "Csak az ideiglenes szerkesztői csoportokban szereplő szerkesztők mutatása",
"listusers-creationsort": "Rendezés létrehozási dátum szerint",
"listusers-desc": "Rendezés csökkenő sorrendben",
"usereditcount": "{{PLURAL:$1|egy|$1}} szerkesztés",
"unlinkaccounts-success": "A fiókok szétkapcsolva.",
"authenticationdatachange-ignored": "A hitelesítő adatok változtatása nincs kezelve. Talán nincs beállítva szolgáltató?",
"userjsispublic": "Figyelem: JavaScript-allapokon ne tárolj bizalmas adatokat, mivel minden felhasználó számára láthatóak.",
+ "userjsonispublic": "Figyelem: JSON-allapokon ne tárolj bizalmas adatokat, mivel minden felhasználó számára láthatóak.",
"usercssispublic": "Figyelem: CSS-allapokon ne tárolj bizalmas adatokat, mivel minden felhasználó számára láthatóak.",
"restrictionsfield-badip": "Érvénytelen IP-cím vagy -tartomány: $1",
"restrictionsfield-label": "Engedélyezett IP-tartományok:",
"pagedata-bad-title": "Érvénytelen cím: $1.",
"unregistered-user-config": "Biztonsági okokból JavaScript, CSS és JSON szerkesztői alapok nem töltődnek be regisztrálatlan felhasználóknak.",
"passwordpolicies": "Jelszóirányelvek",
+ "passwordpolicies-summary": "Ez egy lista a hatékony jelszóirányelvekről a wikin használt felhasználói csoportok szerint.",
"passwordpolicies-group": "Csoport",
"passwordpolicies-policies": "Irányelvek",
"passwordpolicies-policy-minimalpasswordlength": "A jelszónak legalább $1 karakterből kell állnia",
"passwordpolicies-policy-minimumpasswordlengthtologin": "A jelszónak legalább $1 karakterből kell állnia a bejelentkezéshez",
"passwordpolicies-policy-passwordcannotmatchusername": "A jelszó nem lehet azonos a felhasználónévvel",
+ "passwordpolicies-policy-passwordcannotmatchblacklist": "A jelszó nem lehet azonos a feketelistán szereplő jelszavakkal.",
"passwordpolicies-policy-maximalpasswordlength": "A jelszó legfeljebb $1 karakter hosszú lehet"
}
"searchprofile-images-tooltip": "Файлаш лахар",
"searchprofile-everything-tooltip": "Массайолча оагIонаш тIа лахар (дувцара оагIонаш чу а лоацаш)",
"searchprofile-advanced-tooltip": "Лаха хьахержача цIерий аренашка",
- "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
+ "search-result-size": "$1 ({{PLURAL:$2|$2 дош}})",
"search-result-category-size": "$1 {{PLURAL:$1|юкъедахар}} ($2 {{PLURAL:$2|кIалоагIат}}, $3 {{PLURAL:$3|файл}})",
"search-redirect": "($1 яхача оагIон тIара дIа-хьа хьожадар)",
"search-section": "(дáкъа «$1»)",
"prefs-watchlist-token": "Зема хьаязъяьра токен:",
"prefs-resetpass": "ДIахувца пароль",
"prefs-changeemail": "дIахувца е дIаяккха электронни пошт",
+ "prefs-setemail": "Электронни пошта цIай дӀаоттадар",
"prefs-email": "Электронни поштан оттамаш",
"prefs-rendering": "ТIера куц",
"saveprefs": "ДIаязде",
"noarticletext-nopermission": "Исятда и ччина са текстни авач.\nКвевай [[Special:Search/{{PAGENAME}}| и тӀвар алай ччин]] муькуь ччинра жугъуриз ва я\n<span class=\"plainlinks\"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затӀар жугъуриз] жеда.",
"blocked-notice-logextract": "И уртах алайчIава блокарнава.\nАгъадихъ блокарунин журналдикай эхиримжи кхьинар къалурнава:",
"previewnote": "'''Рикlел хуьх хьи, им анжах сифтедин килигун я.''' \nКуь масакIавилер гьеле хвенвач!",
- "editing": "$1 Ð\94уьзар хъувун",
+ "editing": "$1 дуьзар хъувун",
"editingsection": "Дуьзар хъувун $1 (пай)",
"editingcomment": "$1 дуьзар хъувун (цIийи пай)",
"editconflict": "Дуьзар хъувунрин акьунар: $1",
"listusers-submit": "Mostra",
"listusers-noresult": "No usor trovada.",
"listusers-blocked": "(impedida)",
- "activeusers": "Lista ativa de usores",
+ "activeusers": "Lista de usores ativa",
"activeusers-intro": "Esta es un lista de usores ci ia es ativa en alga modo en la {{PLURAL:$1|dia|dias}} la plu resente.",
"activeusers-count": "$1 {{PLURAL:$1|ata|atas}} en la {{PLURAL:$3|dia|$3 dias}} la plu resente.",
"activeusers-from": "Mostra usores comensante a:",
"rcfilters-filter-categorization-description": "Registraments de paginas apondudas o suprimidas de las categorias.",
"rcfilters-filter-logactions-label": "Accions traçadas",
"rcfilters-filter-logactions-description": "Accions dels administrators, creacions de comptes, supressions de paginas, telecargaments...",
+ "rcfilters-hideminor-conflicts-typeofchange": "D'unes tipes de cambiament pòdon pas èsser designats coma \"minors\", doncas aqueste filtre es en conflicte amb los filtres de Tipe de cambiament seguent: $1",
+ "rcfilters-typeofchange-conflicts-hideminor": "Aqueste filtre «Tipe de cambiament» es en conflicte amb lo filtre «Edicions minoras». D'unes tipes de cambiaments pòdon pas èstre considerats coma «minors».",
+ "rcfilters-filtergroup-lastRevision": "Darrièras revisions",
+ "rcfilters-filter-lastrevision-label": "Darrièra revision",
+ "rcfilters-filter-lastrevision-description": "Sonque lo cambiament de pagina lo mai recent.",
+ "rcfilters-filter-previousrevision-label": "Pas la darrièra revision",
+ "rcfilters-filter-previousrevision-description": "Totes los cambiaments que son pas «la darrièra revision».",
+ "rcfilters-filter-excluded": "Exclús",
+ "rcfilters-tag-prefix-namespace-inverted": "<strong>:Pas</strong> $1",
+ "rcfilters-exclude-button-off": "Exclure los seleccionats",
+ "rcfilters-exclude-button-on": "Seleccionats excluses",
+ "rcfilters-view-tags": "Cambiaments marcats",
+ "rcfilters-view-namespaces-tooltip": "Resultat del filtratge per espaci de noms",
+ "rcfilters-view-tags-tooltip": "Resultat del filtratge per etiqueta d'edicion",
+ "rcfilters-view-return-to-default-tooltip": "Tornar al menut de filtres principal",
+ "rcfilters-view-tags-help-icon-tooltip": "Ne saber mai suls cambiaments marcats",
+ "rcfilters-liveupdates-button": "Actualizacion en dirècte",
+ "rcfilters-liveupdates-button-title-on": "Desactivar los cambiaments en dirècte",
"rcnotefrom": "Çaijós {{PLURAL:$5|la modificacion efectuada|las modificacions efectuadas}} dempuèi lo <strong>$3, $4</strong> (afichadas fins a <strong>$1</strong>).",
"rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
"rcshowhideminor": "$1 los cambiaments menors",
"savechanges": "Değişiklikleri kaydet",
"publishpage": "Sayfayı yayımla",
"publishchanges": "Değişiklikleri yayımla",
+ "savearticle-start": "Sayfayı kaydet...",
+ "savechanges-start": "Değişiklikleri kaydet...",
+ "publishpage-start": "Sayfayı yayımla...",
+ "publishchanges-start": "Değişiklikleri yayımla...",
"preview": "Önizleme",
"showpreview": "Önizlemeyi göster",
"showdiff": "Değişiklikleri göster",
"postedit-confirmation-created": "Sayfa oluşturuldu.",
"postedit-confirmation-restored": "Sayfa geri yüklendi.",
"postedit-confirmation-saved": "Değişikliğiniz kaydedildi.",
+ "postedit-confirmation-published": "Değişikliğiniz yayımlandı.",
"edit-already-exists": "Yeni sayfa oluşturulamıyor.\nSayfa zaten mevcut.",
"defaultmessagetext": "Varsayılan mesaj metni",
"content-failed-to-parse": "$1 modeli için $2 içerik türü çözümlenemedi: $3",
"invalid-content-data": "Geçersiz içerik verisi",
"content-not-allowed-here": "\"$1\" içeriğine, [[$2]] sayfasında izin verilmemekte.",
"editwarning-warning": "Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.\nEğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin \"{{int:prefs-editing}}\" bölümünde devre dışı bırakabilirsiniz.",
+ "editpage-invalidcontentmodel-title": "İçerik modeli desteklenmiyor",
"editpage-invalidcontentmodel-text": "\"$1\" içerik modeli desteklenmemektedir.",
"editpage-notsupportedcontentformat-title": "İçerik biçimi desteklenmiyor",
"editpage-notsupportedcontentformat-text": "$1 içerik biçimi $2 içerik modeli tarafından desteklenmiyor.",
"content-model-css": "CSS",
"content-json-empty-object": "Boş nesne",
"content-json-empty-array": "Boş dizi",
+ "deprecated-self-close-category": "Kendiliğinden geçersiz HTML etiketlerini kullanan sayfalar",
"duplicate-args-warning": "<strong>Uyarı:</strong>[[:$1]] [[:$2]] şablonunu \"$3\" parametresi için birden fazla değerle çağırıyor. Sadece sağlanan son değer kullanılacak.",
"duplicate-args-category": "Yinelenen şablon değişkenleri kullanan sayfalar",
"duplicate-args-category-desc": "Sayfada içeren şablonları çağırmak için bu terimler kullanılır <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"post-expand-template-argument-warning": "'''Uyarı:''' Bu sayfa çok fazla genişleme boyutuna sahip en az bir şablon değişkeni içeriyor.\nBu değişkenler atlandı.",
"post-expand-template-argument-category": "Geçersiz şablon değiştirgenleri içeren sayfalar",
"parser-template-loop-warning": "Şablon düğümü tespit edildi: [[$1]]",
+ "template-loop-category": "Şablon döngülü sayfalar",
"parser-template-recursion-depth-warning": "Şablon özyineleme yoğunluğu sınırı aşıldı ($1)",
"language-converter-depth-warning": "Dil çevirici derinlik sınırı aşıldı ($1)",
"node-count-exceeded-category": "Düğüm sayısı aşılan sayfalar",
"right-applychangetags": "Değişiklikleriyle beraber [[Special:Tags|etiketleri]] uygula",
"right-changetags": "Tekil sürümler ve günlük kayıtlarına rastgele [[Special:Tags|etiket]] ekleme veya çıkarma",
"grant-group-email": "E-posta gönder",
+ "grant-group-other": "Çeşitli aktivite",
"grant-createeditmovepage": "Sayfaları oluşturma, düzenleme ve taşıma",
"grant-editmycssjs": "Kullanıcı CSS/JavaScript'ini düzenle",
"grant-editmyoptions": "Kullanıcı tercihlerini Düzenle",
"Renamerr",
"Avatar6",
"Fitoschido",
- "Movses"
+ "Movses",
+ "Esk78"
]
},
"tog-underline": "Підкреслювання посилань:",
"tog-watchlisthideminor": "Приховати незначні редагування у списку спостереження",
"tog-watchlisthideliu": "Приховати редагування зареєстрованих дописувачів у списку спостереження",
"tog-watchlistreloadautomatically": "Перезавантажувати список спостереження автоматично кожного разу, коли зміниться фільтр (вимагається JavaScript)",
- "tog-watchlistunwatchlinks": "Ð\94одаÑ\82и можливÑ\96Ñ\81Ñ\82Ñ\8c длÑ\8f виклÑ\8eÑ\87еннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок пÑ\80Ñ\8fмо зÑ\96 Ñ\81Ñ\82оÑ\80Ñ\96нки Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f (потрібен JavaScript для функціонування)",
+ "tog-watchlistunwatchlinks": "Ð\94одаÑ\82и пÑ\80Ñ\8fмÑ\96 маÑ\80кеÑ\80и вклÑ\8eÑ\87еннÑ\8f/виклÑ\8eÑ\87еннÑ\8f зÑ\96 Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) длÑ\8f Ñ\81Ñ\82еженнÑ\8f за Ñ\81Ñ\82оÑ\80Ñ\96нками Ñ\96з змÑ\96нами (потрібен JavaScript для функціонування)",
"tog-watchlisthideanons": "Приховати редагування анонімних користувачів у списку спостереження",
"tog-watchlisthidepatrolled": "Приховати відпатрульовані редагування у списку спостереження",
"tog-watchlisthidecategorization": "Приховати категоризацію сторінок",
"botpasswords-existing": "Існуючі паролі бота",
"botpasswords-createnew": "Створити новий пароль бота",
"botpasswords-editexisting": "Редагувати існуючий пароль бота",
+ "botpasswords-label-needsreset": "(необхідно скинути пароль)",
"botpasswords-label-appid": "Назва бота:",
"botpasswords-label-create": "Створити",
"botpasswords-label-update": "Оновити",
"botpasswords-restriction-failed": "Вхід не було здійснено через обмеження для паролю бота.",
"botpasswords-invalid-name": "Вказане ім'я користувача не містить роздільник для пароля бота («$1»).",
"botpasswords-not-exist": "У користувача «$1» нема пароля для бота «$2».",
+ "botpasswords-needs-reset": "Пароль бота з ім'ям «$2» {{GENDER:$1|користувача|користувачки}} «$1» необхідно скинути.",
"resetpass_forbidden": "Пароль не можна змінити",
"resetpass_forbidden-reason": "Пароль не можна змінити: $1",
"resetpass-no-info": "Щоб звертатися безпосередньо до цієї сторінки, вам слід увійти до системи.",
"previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
"blockedtitle": "Користувача заблоковано",
"blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете використати функцію \"{{int:emailuser}}\", якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
- "autoblockedtext": "Ð\92аÑ\88а IP-адÑ\80еÑ\81а авÑ\82омаÑ\82иÑ\87но заблокована Ñ\83 зв'Ñ\8fзкÑ\83 з Ñ\82им, Ñ\89о вона Ñ\80анÑ\96Ñ\88е викоÑ\80иÑ\81Ñ\82овÑ\83валаÑ\81Ñ\8f кимоÑ\81Ñ\8c Ñ\96з заблокованиÑ\85 коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в. Ð\90дмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80 ($1), Ñ\89о Ñ\97Ñ\97 заблокÑ\83вав, зазнаÑ\87ив наÑ\81Ñ\82Ñ\83пнÑ\83 пÑ\80иÑ\87инÑ\83 блокÑ\83ваннÑ\8f:\n\n:''$2''\n\n* Ð\9fоÑ\87аÑ\82ок блокÑ\83ваннÑ\8f: $8\n* Ð\97акÑ\96нÑ\87еннÑ\8f блокÑ\83ваннÑ\8f: $6\n* Ð\91локÑ\83ваннÑ\8f виконав: $7\n\nÐ\92и можеÑ\82е надÑ\96Ñ\81лаÑ\82и лиÑ\81Ñ\82а коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87евÑ\96 $1 або бÑ\83дÑ\8c-Ñ\8fкомÑ\83 Ñ\96нÑ\88омÑ\83 [[{{MediaWiki:Grouppage-sysop}}|адмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]], Ñ\89об обговоÑ\80иÑ\82и блокÑ\83ваннÑ\8f.\n\nÐ\97веÑ\80нÑ\96Ñ\82Ñ\8c Ñ\83вагÑ\83, Ñ\89о ви не зможеÑ\82е надÑ\96Ñ\81лаÑ\82и лиÑ\81Ñ\82а адмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80овÑ\96, Ñ\8fкÑ\89о ви не заÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96 Ñ\83 пÑ\80оекÑ\82Ñ\96 або не пÑ\96дÑ\82веÑ\80дили Ñ\81воÑ\8e елекÑ\82Ñ\80оннÑ\83 адÑ\80еÑ\81Ñ\83 в [[Special:Preferences|оÑ\81обиÑ\81Ñ\82иÑ\85 налаÑ\88Ñ\82Ñ\83ваннÑ\8fÑ\85]], а Ñ\82акож Ñ\8fкÑ\89о вам бÑ\83ло забоÑ\80онено надÑ\81илаÑ\82и лиÑ\81Ñ\82и пÑ\80и блокÑ\83ваннÑ\96.\n\nÐ\92аÑ\88а поÑ\82оÑ\87на IP-адÑ\80еÑ\81а â\80\94 $3, Ñ\96денÑ\82иÑ\84Ñ\96каÑ\82оÑ\80 блокÑ\83ваннÑ\8f â\80\94 #$5. Ð\91Ñ\83дÑ\8c лаÑ\81ка, зазнаÑ\87айÑ\82е його у своїх запитах.",
+ "autoblockedtext": "Ð\92аÑ\88а IP-адÑ\80еÑ\81а авÑ\82омаÑ\82иÑ\87но заблокована Ñ\83 зв'Ñ\8fзкÑ\83 з Ñ\82им, Ñ\89о вона Ñ\80анÑ\96Ñ\88е викоÑ\80иÑ\81Ñ\82овÑ\83валаÑ\81Ñ\8f кимоÑ\81Ñ\8c Ñ\96з коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в, Ñ\8fкого заблокÑ\83вав $1.\nÐ\9fÑ\80иÑ\87ина блокÑ\83ваннÑ\8f блокÑ\83ваннÑ\8f:\n\n:<em>$2</em>\n\n* Ð\9fоÑ\87аÑ\82ок блокÑ\83ваннÑ\8f: $8\n* Ð\97акÑ\96нÑ\87еннÑ\8f блокÑ\83ваннÑ\8f: $6\n* Ð\91локÑ\83ваннÑ\8f виконав: $7\n\nÐ\92и можеÑ\82е надÑ\96Ñ\81лаÑ\82и лиÑ\81Ñ\82а коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87евÑ\96 $1 або бÑ\83дÑ\8c-Ñ\8fкомÑ\83 Ñ\96нÑ\88омÑ\83 [[{{MediaWiki:Grouppage-sysop}}|адмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]], Ñ\89об обговоÑ\80иÑ\82и блокÑ\83ваннÑ\8f.\n\nÐ\97веÑ\80нÑ\96Ñ\82Ñ\8c Ñ\83вагÑ\83, Ñ\89о ви не зможеÑ\82е Ñ\81коÑ\80иÑ\81Ñ\82аÑ\82иÑ\81Ñ\8f Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\94Ñ\8e \"{{int:emailuser}}\", Ñ\82ак Ñ\8fк не маÑ\94Ñ\82е дÑ\96йÑ\81ноÑ\97 елекÑ\82Ñ\80онноÑ\97 поÑ\88Ñ\82и, заÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованоÑ\97 в [[Special:Preferences|оÑ\81обиÑ\81Ñ\82иÑ\85 налаÑ\88Ñ\82Ñ\83ваннÑ\8fÑ\85]], а Ñ\82акож Ñ\8fкÑ\89о вам бÑ\83ло забоÑ\80онено надÑ\81илаÑ\82и лиÑ\81Ñ\82и пÑ\80и блокÑ\83ваннÑ\96.\n\nÐ\92аÑ\88а поÑ\82оÑ\87на IP-адÑ\80еÑ\81а â\80\94 $3, Ñ\96денÑ\82иÑ\84Ñ\96каÑ\82оÑ\80 блокÑ\83ваннÑ\8f â\80\94 #$5. Ð\91Ñ\83дÑ\8c лаÑ\81ка, зазнаÑ\87айÑ\82е Ñ\86Ñ\96 данÑ\96 у своїх запитах.",
"systemblockedtext": "Ваше ім'я користувача або IP-адресу було автоматично заблоковано MediaWiki.\nВказана причина:\n\n:<em>$2</em>\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.",
"blockednoreason": "не вказано причини",
"whitelistedittext": "Ви повинні $1, щоб редагувати сторінки.",
"longpageerror": "'''Помилка: Поданий вами текст становить $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}}, що більше за встановлену межу у {{PLURAL:$2|кілобайт|кілобайти|кілобайтів}}.'''\nЙого неможливо зберегти.",
"readonlywarning": "<strong>Попередження: База даних заблокована на обслуговування, тому, на даний момент, ви не можете записати ваші зміни.\n</strong>\nМожливо, вам варто скопіювати текст у файл на вашому комп'ютері й зберегти його на пізніше.\n\nАдміністратор, що заблокував базу даних, залишив наступне пояснення: $1",
"protectedpagewarning": "'''Попередження: Ця сторінка була захищена від змін так, що тільки користувачі з правами адміністратора можуть її редагувати.'''\nОстанній запис журналу наведений нижче для довідки:",
- "semiprotectedpagewarning": "'''Зауваження:''' Ця сторінка захищена так, що її можуть редагувати тільки зареєстровані користувачі.\nОстанній запис журналу наведений нижче для довідки:",
+ "semiprotectedpagewarning": "<strong>Зауваження:</strong> Ця сторінка захищена так, що її можуть редагувати тільки зареєстровані користувачі.\nОстанній запис журналу наведений нижче для довідки:",
"cascadeprotectedwarning": "<strong>Попередження:</strong> Цю сторінку можуть редагувати лише користувачі зі [[Special:ListGroupRights|специфічними правами]], оскільки вона включена на {{PLURAL:$1|1=сторінці|сторінках}}, де встановлено каскадний захист:",
"titleprotectedwarning": "'''Попередження. Ця сторінка була захищена так, що для її створення потрібні [[Special:ListGroupRights|особливі права]].'''\nОстанній запис журналу наведений нижче для довідки:",
"templatesused": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} на цій сторінці:",
"prefs-watchlist-edits": "Максимальна кількість змін, яку можна виводити у списку спостереження:",
"prefs-watchlist-edits-max": "Максимально: 1000",
"prefs-watchlist-token": "Токен списку спостереження:",
+ "prefs-watchlist-managetokens": "Управління токенами",
"prefs-misc": "Інші налаштування",
"prefs-resetpass": "Змінити пароль",
"prefs-changeemail": "Змінити або вилучити адресу електронної пошти",
"recentchangescount": "Кількість редагувань для показу за замовчуванням на сторінках нових редагувань, історій сторінок та в журналах:",
"prefs-help-recentchangescount": "Максимальна кількість: 1000",
"prefs-help-watchlist-token2": "Це секретний ключ до веб-каналу вашого списку спостереження.\nБудь-хто, хто його знає, матиме можливість читати ваш список спостереження, тому не поширюйте його.\nЯкщо вам потрібно, [[Special:ResetTokens|ви можете скинути його]].",
+ "prefs-help-tokenmanagement": "Ви можете переглянути і скинути секретний ключ свого облікового запису, який дає доступ до веб-каналу вашого списку спостереження. Кожен, хто його знає, матиме можливість читати ваш список спостереження, тому не поширюйте його.",
"savedprefs": "Ваші налаштування збережено.",
"savedrights": "Групи {{GENDER:$1|користувача $1|користувачки $1}} було збережено.",
"timezonelegend": "Часовий пояс:",
"prefs-dateformat": "Формат дати",
"prefs-timeoffset": "Зсув часу",
"prefs-advancedediting": "Загальні параметри",
+ "prefs-developertools": "Інструменти розробника",
"prefs-editor": "Редактор",
"prefs-preview": "Попередній перегляд",
"prefs-advancedrc": "Розширені налаштування",
"rcfilters-filter-humans-label": "Людина (не бот)",
"rcfilters-filter-humans-description": "Редагування, зроблені людиною.",
"rcfilters-filtergroup-reviewstatus": "Статус перевірки",
+ "rcfilters-filter-reviewstatus-unpatrolled-description": "Зміни, не позначені вручну або автоматично як патрульовані.",
"rcfilters-filter-reviewstatus-unpatrolled-label": "Неперевірені",
+ "rcfilters-filter-reviewstatus-manual-description": "Зміни, позначені вручну як патрульовані.",
+ "rcfilters-filter-reviewstatus-manual-label": "Патрульовані вручну",
+ "rcfilters-filter-reviewstatus-auto-description": "Зміни довірених користувачів, які відмічаються як автопатрульовані.",
+ "rcfilters-filter-reviewstatus-auto-label": "Автопатрульовані",
"rcfilters-filtergroup-significance": "Важливість",
"rcfilters-filter-minor-label": "Незначні редагування",
"rcfilters-filter-minor-description": "Редагування, позначені авторами як незначні.",
"deadendpages": "Сторінки без посилань",
"deadendpagestext": "Наступні сторінки не містять посилань на інші сторінки цієї вікі.",
"protectedpages": "Захищені сторінки",
+ "protectedpages-filters": "Фільтри:",
"protectedpages-indef": "Тільки безстроково захищені",
"protectedpages-summary": "На цій сторінці перераховані сторінки, які на цей момент захищені. Список назв, які захищені від створення див. [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
"protectedpages-cascade": "Тільки каскадний захист",
"protectedtitles-submit": "Показувати заголовки",
"listusers": "Список користувачів",
"listusers-editsonly": "Показати лише користувачів, які зробили принаймні одне редагування",
+ "listusers-temporarygroupsonly": "Показувати лише користувачів із тимчасових груп",
"listusers-creationsort": "Сортувати за датою створення",
"listusers-desc": "Сортувати за спадним порядком",
"usereditcount": "$1 {{PLURAL:$1|редагування|редагування|редагувань}}",
"apisandbox-dynamic-parameters-add-label": "Додати параметр:",
"apisandbox-dynamic-parameters-add-placeholder": "Назва параметра",
"apisandbox-dynamic-error-exists": "Параметр з назвою «$1» вже існує.",
+ "apisandbox-templated-parameter-reason": "Цей [[Special:ApiHelp/main#main/templatedparams|шаблонний параметр]] запропонований на основі {{PLURAL:$1|значення|значень}} з $2.",
"apisandbox-deprecated-parameters": "Застарілі параметри",
"apisandbox-fetch-token": "Автозаповнення токена",
+ "apisandbox-add-multi": "Додати",
"apisandbox-submit-invalid-fields-title": "Деякі поля недійсні",
"apisandbox-submit-invalid-fields-message": "Будь ласка, виправте відмічені поля і спробуйте знову.",
"apisandbox-results": "Результати",
"fix-double-redirects": "Виправити всі перенаправлення на попередню назву",
"move-leave-redirect": "Залишити перенаправлення",
"protectedpagemovewarning": "'''Попередження:''' Ця сторінка захищена так, що її можуть перейменовувати тільки адміністратори.\nОстанній запис журналу наведений нижче для довідки:",
- "semiprotectedpagemovewarning": "'''Зауваження:''' Ця сторінка захищена так, що перейменовувати її можуть тільки зареєстровані користувачі.\nОстанній запис журналу наведений нижче для довідки:",
+ "semiprotectedpagemovewarning": "<strong>Зауваження:</strong> Ця сторінка захищена так, що перемістити її можуть тільки зареєстровані користувачі.\nОстанній запис журналу наведений нижче для довідки:",
"move-over-sharedrepo": "У спільному сховищі існує [[:$1]]. Перейменування файлу на цю назву призведе до перекриття файлу зі спільного сховища.",
"file-exists-sharedrepo": "Обрана назва файлу вже використовується у спільному сховищі.\nБудь ласка, оберіть іншу назву.",
"export": "Експорт статей",
"version-specialpages": "Спеціальні сторінки",
"version-parserhooks": "Перехоплювачі синтаксичного аналізатора",
"version-variables": "Змінні",
+ "version-editors": "Редактори",
"version-antispam": "Захист від спаму",
"version-api": "API",
"version-other": "Інше",
"pagedata-title": "Дані сторінки",
"pagedata-text": "Ця сторінка надає сторінкам інтерфейс даних. Будь ласка, вкажіть назву сторінки в URL-адресі, скориставшись синтаксисом підсторінок.\n* Переговори щодо контенту застосовуються на основі прийнятних форматів Вашого клієнта. Це означає, що дані сторінки будуть надані в тому форматі, якому віддає перевагу Ваш клієнт.",
"pagedata-not-acceptable": "Не знайдено підхожого формату. Підтримувані MIME-типи: $1",
- "pagedata-bad-title": "Недійсна назва: $1."
+ "pagedata-bad-title": "Недійсна назва: $1.",
+ "unregistered-user-config": "З міркувань безпеки користувальницькі підсторінки JavaScript, CSS та JSON не можуть бути завантажені для незареєстрованих учасників.",
+ "passwordpolicies": "Політика щодо паролів",
+ "passwordpolicies-summary": "Це список ефективних правил щодо паролів для груп користувачів, визначених у цій вікі.",
+ "passwordpolicies-group": "Група",
+ "passwordpolicies-policies": "Політика",
+ "passwordpolicies-policy-minimalpasswordlength": "Пароль має містити принаймні $1 {{PLURAL:$1|символ|символи|символів}}",
+ "passwordpolicies-policy-minimumpasswordlengthtologin": "Пароль має містити принаймні $1 {{PLURAL:$1|символ|символи|символів}} щоб мати можливість увійти до свого облікового запису",
+ "passwordpolicies-policy-passwordcannotmatchusername": "Пароль не може збігатися з назвою облікового запису",
+ "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль не може збігатися з паролями із чорного списку",
+ "passwordpolicies-policy-maximalpasswordlength": "Пароль повинен бути коротшим $1 {{PLURAL:$1|символа|символів}}",
+ "passwordpolicies-policy-passwordcannotbepopular": "Пароль не може бути {{PLURAL:$1|часто вживаним|будь-яким з $1 часто вживаних паролів}}"
}
"whatlinkshere": "װאָס פֿאַרבינדט אַהער",
"whatlinkshere-title": "בלעטער וואס פֿארבינדן צו $1",
"whatlinkshere-page": "בלאַט:",
- "linkshere-2": "די פאלגנדע בלעטער פארבינדן צום בלאט '''$1''':",
- "nolinkshere-2": "קיין שום בלאט פארבינדט נישט צו '''$1'''.",
- "nolinkshere-ns-2": "קיין בלעטער פֿאַרבינדן נישט צו '''$1''' אינעם אויסגעקליבענעם נאמענטייל.",
+ "linkshere-2": "די פאָלגנדיקע בלעטער פאַרבינדן צום בלאַט '''$1''':",
+ "nolinkshere-2": "קיין שום בלאַט פאַרבינדט נישט צו '''$1'''.",
+ "nolinkshere-ns-2": "קיין בלעטער פאַרבינדן נישט צו '''$1''' אינעם אויסגעקליבענעם נאָמענטייל.",
"isredirect": "ווײַטערפירן בלאט",
"istemplate": "אײַנשליסן",
"isimage": "!טעקע לינק",
"ipboptions": "2 小時:2 hours,1 天:1 day,3 天:3 days,1 週:1 week,2 週:2 weeks,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year,無限期:infinite",
"ipbhidename": "在編輯及清單中隱藏使用者名稱",
"ipbwatchuser": "監視這位使用者的使用者頁面及其對話頁面",
- "ipb-disableusertalk": "阻止此使用者在封鎖期間編輯自己的對話頁面",
+ "ipb-disableusertalk": "禁止使用者在封鎖期間編輯自己的對話頁面",
"ipb-change-block": "使用現有設定重新封鎖使用者",
"ipb-confirm": "確認封鎖",
"badipaddress": "無效的 IP 位址",
public function execute() {
$this->setNamespacePriorities();
$this->url_limit = 50000;
- $this->size_limit = pow( 2, 20 ) * 10;
+ $this->size_limit = ( 2 ** 20 ) * 10;
# Create directory if needed
$fspath = $this->getOption( 'fspath', getcwd() );
exit( 1 );
}
- $binSize = intval( pow( 10, floor( log10( $endId ) ) - 3 ) );
+ $binSize = intval( 10 ** ( floor( log10( $endId ) ) - 3 ) );
if ( $binSize < 100 ) {
$binSize = 100;
}
'jquery.makeCollapsible.styles' => [
'targets' => [ 'desktop', 'mobile' ],
'class' => ResourceLoaderLessVarFileModule::class,
+ 'lessMessages' => [
+ 'collapsible-collapse',
+ 'collapsible-expand',
+ ],
'styles' => [
'resources/src/jquery/jquery.makeCollapsible.styles.less',
],
'resources/src/mediawiki/mediawiki.js',
'resources/src/mediawiki/mediawiki.requestIdleCallback.js',
'resources/src/mediawiki/mediawiki.errorLogger.js',
+ 'resources/src/mediawiki/mediawiki.base.js',
],
'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
'targets' => [ 'desktop', 'mobile' ],
// we can trim the previous one).
// See https://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
// the order and characteristics of the key events.
- $el.on( eventKeys, function () {
+
+ function enforceLimit() {
var res = trimFn(
prevSafeVal,
this.value,
// trimFn to compare the new value to an empty string instead of the
// old value, resulting in trimming always from the end (T42850).
prevSafeVal = res.newVal;
+ }
+
+ $el.on( eventKeys, function ( e ) {
+ if ( e.type === 'cut' || e.type === 'paste' ) {
+ // For 'cut'/'paste', the input value is only updated after the event handlers resolve.
+ setTimeout( enforceLimit.bind( this ) );
+ } else {
+ enforceLimit.call( this );
+ }
} );
} );
}
--- /dev/null
+/*!
+ * This file is currently loaded as part of the 'mediawiki' module and therefore
+ * concatenated to mediawiki.js and executed at the same time. This file exists
+ * to help prepare for splitting up the 'mediawiki' module.
+ * This effort is tracked at https://phabricator.wikimedia.org/T192623
+ *
+ * In short:
+ *
+ * - mediawiki.js will be reduced to the minimum needed to define mw.loader and
+ * mw.config, and then moved to its own private "mediawiki.loader" module that
+ * can be embedded within the StartupModule response.
+ *
+ * - mediawiki.base.js and other files in this directory will remain part of the
+ * "mediawiki" module, and will remain a default/implicit dependency for all
+ * regular modules, just like jquery and wikibits already are.
+ */
+/* globals mw */
+( function () {
+ /**
+ * @class mw
+ * @singleton
+ */
+
+ /**
+ * @inheritdoc mw.inspect#runReports
+ * @method
+ */
+ mw.inspect = function () {
+ var args = arguments;
+ mw.loader.using( 'mediawiki.inspect', function () {
+ mw.inspect.runReports.apply( mw.inspect, args );
+ } );
+ };
+}() );
}
}
+ /**
+ * @private
+ * @param {Object} params Map of parameter names to values
+ * @return {string}
+ */
+ function makeQueryString( params ) {
+ return Object.keys( params ).map( function ( key ) {
+ return encodeURIComponent( key ) + '=' + encodeURIComponent( params[ key ] );
+ } ).join( '&' );
+ }
+
/**
* Create network requests for a batch of modules.
*
// combining versions from the module query string in-order. (T188076)
query.version = getCombinedVersion( packed.list );
query = sortQuery( query );
- addScript( sourceLoadScript + '?' + $.param( query ) );
+ addScript( sourceLoadScript + '?' + makeQueryString( query ) );
}
if ( !batch.length ) {
// > '&modules='.length === 9
// > '&version=1234567'.length === 16
// > 9 + 16 = 25
- currReqBaseLength = $.param( currReqBase ).length + 25;
+ currReqBaseLength = makeQueryString( currReqBase ).length + 25;
// We may need to split up the request to honor the query string length limit,
// so build it piece by piece.
return registry[ moduleName ].module.exports;
},
- /**
- * @inheritdoc mw.inspect#runReports
- * @method
- */
- inspect: function () {
- var args = slice.call( arguments );
- mw.loader.using( 'mediawiki.inspect', function () {
- mw.inspect.runReports.apply( mw.inspect, args );
- } );
- },
-
/**
* On browsers that implement the localStorage API, the module store serves as a
* smart complement to the browser cache. Unlike the browser cache, the module store
--- /dev/null
+{
+ "manifest_version": 2,
+ "name": "WithAutoloadNamespaces",
+ "AutoloadNamespaces": {
+ "Test\\MediaWiki\\AutoLoader\\": "../autoloader/psr4/"
+ }
+}
$dbw = wfGetDB( DB_MASTER );
$dbw->update(
'revision',
- [ 'rev_timestamp' => wfTimestamp( TS_MW, time() - 86400 ) ],
+ [ 'rev_timestamp' => $dbw->timestamp( time() - 86400 ) ],
[ 'rev_id' => $revId1 ],
__METHOD__
);
$spec['height'] = mt_rand( $this->minHeight, $this->maxHeight );
$spec['fill'] = $this->getRandomColor();
- $diagonalLength = sqrt( pow( $spec['width'], 2 ) + pow( $spec['height'], 2 ) );
+ $diagonalLength = sqrt( $spec['width'] ** 2 + $spec['height'] ** 2 );
$draws = [];
for ( $i = 0; $i <= $this->shapesToDraw; $i++ ) {
$this->database->setFlag( Database::DBO_TRX );
- // Implicit transaction gets silently rolled back
+ // Implicit transaction does not get silently rolled back
$this->database->begin( __METHOD__, Database::TRANSACTION_INTERNAL );
call_user_func( $doError );
- $this->database->delete( 'x', [ 'field' => 1 ], __METHOD__ );
- $this->database->commit( __METHOD__, Database::FLUSHING_INTERNAL );
- // phpcs:ignore
- $this->assertLastSql( 'BEGIN; DELETE FROM error WHERE 1; ROLLBACK; BEGIN; DELETE FROM x WHERE field = \'1\'; COMMIT' );
+ try {
+ $this->database->delete( 'x', [ 'field' => 1 ], __METHOD__ );
+ $this->fail( 'Expected exception not thrown' );
+ } catch ( DBTransactionError $e ) {
+ $this->assertEquals(
+ 'Cannot execute query from ' . __METHOD__ . ' while transaction status is ERROR.',
+ $e->getMessage()
+ );
+ }
+ try {
+ $this->database->commit( __METHOD__, Database::FLUSHING_INTERNAL );
+ $this->fail( 'Expected exception not thrown' );
+ } catch ( DBTransactionError $e ) {
+ $this->assertEquals(
+ 'Cannot execute query from ' . __METHOD__ . ' while transaction status is ERROR.',
+ $e->getMessage()
+ );
+ }
+ $this->database->rollback( __METHOD__, Database::FLUSHING_INTERNAL );
+ $this->assertLastSql( 'BEGIN; DELETE FROM error WHERE 1; ROLLBACK' );
- // ... unless there were prior writes
+ // Likewise if there were prior writes
$this->database->begin( __METHOD__, Database::TRANSACTION_INTERNAL );
$this->database->delete( 'x', [ 'field' => 1 ], __METHOD__ );
call_user_func( $doError );
$lbFactory->commitMasterChanges( __METHOD__ );
$this->assertFalse( $called, 'Not called in next round commit' );
+
+ $db->setFlag( DBO_TRX );
+ try {
+ $db->onTransactionCommitOrIdle( function () {
+ throw new RuntimeException( 'test' );
+ } );
+ $this->fail( "Exception not thrown" );
+ } catch ( RuntimeException $e ) {
+ $this->assertTrue( $db->getFlag( DBO_TRX ) );
+ }
}
/**
] );
}
+ public function testReadFromQueueInitializeAutoloaderWithPsr4Namespaces() {
+ $registry = new ExtensionRegistry();
+ $registry->readFromQueue( [
+ "{$this->dataDir}/autoload_namespaces.json" => 1
+ ] );
+ $this->assertTrue(
+ class_exists( 'Test\\MediaWiki\\AutoLoader\\TestFooBar' ),
+ "Registry initializes Autoloader from AutoloadNamespaces"
+ );
+ }
+
/**
* @dataProvider provideExportExtractedDataGlobals
*/
/**
* @covers ResourceLoader::respond
*/
- public function testRespond() {
+ public function testRespondEmpty() {
$rl = $this->getMockBuilder( EmptyResourceLoader::class )
->setMethods( [
'tryRespondNotModified',
$rl->respond( $context );
}
+ /**
+ * @covers ResourceLoader::respond
+ */
+ public function testRespondSimple() {
+ $module = new ResourceLoaderTestModule( [ 'script' => 'foo();' ] );
+ $rl = $this->getMockBuilder( EmptyResourceLoader::class )
+ ->setMethods( [
+ 'measureResponseTime',
+ 'tryRespondNotModified',
+ 'sendResponseHeaders',
+ 'makeModuleResponse',
+ ] )
+ ->getMock();
+ $rl->register( 'test', $module );
+ $context = $this->getResourceLoaderContext(
+ [ 'modules' => 'test', 'only' => null ],
+ $rl
+ );
+
+ $rl->expects( $this->once() )->method( 'makeModuleResponse' )
+ ->with( $context, [ 'test' => $module ] )
+ ->willReturn( 'implement_foo;' );
+ $this->expectOutputRegex( '/^implement_foo;/' );
+
+ $rl->respond( $context );
+ }
+
+ /**
+ * @covers ResourceLoader::respond
+ */
+ public function testRespondInternalFailures() {
+ $module = new ResourceLoaderTestModule( [ 'script' => 'foo();' ] );
+ $rl = $this->getMockBuilder( EmptyResourceLoader::class )
+ ->setMethods( [
+ 'measureResponseTime',
+ 'preloadModuleInfo',
+ 'getCombinedVersion',
+ 'tryRespondNotModified',
+ 'makeModuleResponse',
+ 'sendResponseHeaders',
+ ] )
+ ->getMock();
+ $rl->register( 'test', $module );
+ $context = $this->getResourceLoaderContext( [ 'modules' => 'test' ], $rl );
+ // Disable logging from outputErrorAndLog
+ $this->setLogger( 'exception', new Psr\Log\NullLogger() );
+
+ $rl->expects( $this->once() )->method( 'preloadModuleInfo' )
+ ->willThrowException( new Exception( 'Preload error' ) );
+ $rl->expects( $this->once() )->method( 'getCombinedVersion' )
+ ->willThrowException( new Exception( 'Version error' ) );
+ $rl->expects( $this->once() )->method( 'makeModuleResponse' )
+ ->with( $context, [ 'test' => $module ] )
+ ->willReturn( 'foo;' );
+ // Internal errors should be caught and logged without affecting module output
+ $this->expectOutputRegex( '/^\/\*.+Preload error.+Version error.+\*\/.*foo;/ms' );
+
+ $rl->respond( $context );
+ }
+
/**
* @covers ResourceLoader::measureResponseTime
*/
"1 gigabyte"
],
[
- pow( 1024, 4 ),
+ 1024 ** 4,
"1 TB",
"1 terabyte"
],
[
- pow( 1024, 5 ),
+ 1024 ** 5,
"1 PB",
"1 petabyte"
],
[
- pow( 1024, 6 ),
+ 1024 ** 6,
"1 EB",
"1,024 exabyte"
],
[
- pow( 1024, 7 ),
+ 1024 ** 7,
"1 ZB",
"1 zetabyte"
],
[
- pow( 1024, 8 ),
+ 1024 ** 8,
"1 YB",
"1 yottabyte"
],
"1 megabit per second"
],
[
- pow( 10, 9 ),
+ 10 ** 9,
"1 Gbps",
"1 gigabit per second"
],
[
- pow( 10, 12 ),
+ 10 ** 12,
"1 Tbps",
"1 terabit per second"
],
[
- pow( 10, 15 ),
+ 10 ** 15,
"1 Pbps",
"1 petabit per second"
],
[
- pow( 10, 18 ),
+ 10 ** 18,
"1 Ebps",
"1 exabit per second"
],
[
- pow( 10, 21 ),
+ 10 ** 21,
"1 Zbps",
"1 zetabit per second"
],
[
- pow( 10, 24 ),
+ 10 ** 24,
"1 Ybps",
"1 yottabit per second"
],
[
- pow( 10, 27 ),
+ 10 ** 27,
"1,000 Ybps",
"1,000 yottabits per second"
],
}
private function insertLoggingData() {
+ $dbw = wfGetDB( DB_MASTER );
$logs = [];
// Manual patrolling
'log_action' => 'patrol',
'log_user' => 7251,
'log_params' => '',
- 'log_timestamp' => 20041223210426
+ 'log_timestamp' => $dbw->timestamp( '20041223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Autopatrol #1
'log_action' => 'autopatrol',
'log_user' => 7252,
'log_params' => '',
- 'log_timestamp' => 20051223210426
+ 'log_timestamp' => $dbw->timestamp( '20051223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Block
'log_action' => 'block',
'log_user' => 7253,
'log_params' => '',
- 'log_timestamp' => 20061223210426
+ 'log_timestamp' => $dbw->timestamp( '20061223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Very old/ invalid patrol
'log_action' => 'patrol',
'log_user' => 7253,
'log_params' => 'nanana',
- 'log_timestamp' => 20061223210426
+ 'log_timestamp' => $dbw->timestamp( '20061223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Autopatrol #2
'log_action' => 'autopatrol',
'log_user' => 7254,
'log_params' => '',
- 'log_timestamp' => 20071223210426
+ 'log_timestamp' => $dbw->timestamp( '20071223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Autopatrol #3 old way
'log_action' => 'patrol',
'log_user' => 7255,
'log_params' => serialize( [ '6::auto' => true ] ),
- 'log_timestamp' => 20081223210426
+ 'log_timestamp' => $dbw->timestamp( '20081223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Manual patrol #2 old way
'log_action' => 'patrol',
'log_user' => 7256,
'log_params' => serialize( [ '6::auto' => false ] ),
- 'log_timestamp' => 20091223210426
+ 'log_timestamp' => $dbw->timestamp( '20091223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Autopatrol #4 very old way
'log_action' => 'patrol',
'log_user' => 7257,
'log_params' => "9227851\n0\n1",
- 'log_timestamp' => 20081223210426
+ 'log_timestamp' => $dbw->timestamp( '20081223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
// Manual patrol #3 very old way
'log_action' => 'patrol',
'log_user' => 7258,
'log_params' => "9227851\n0\n0",
- 'log_timestamp' => 20091223210426
+ 'log_timestamp' => $dbw->timestamp( '20091223210426' ),
+ 'log_namespace' => NS_MAIN,
+ 'log_title' => 'DeleteAutoPatrolLogs',
];
- wfGetDB( DB_MASTER )->insert( 'logging', $logs );
+ $dbw->insert( 'logging', $logs );
}
public function runProvider() {
/** Include non core files as set in $wgParserTestFiles */
const NO_CORE = 2;
/** Include anything set via $wgParserTestFiles */
- const WITH_ALL = 3; # CORE_ONLY | NO_CORE
+ const WITH_ALL = self::CORE_ONLY | self::NO_CORE;
/** @} */
'tests/qunit/suites/resources/mediawiki.rcfilters/dm.SavedQueryItemModel.test.js',
'tests/qunit/suites/resources/mediawiki.rcfilters/dm.SavedQueriesModel.test.js',
'tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js',
+ 'tests/qunit/suites/resources/mediawiki.widgets/' .
+ 'MediaSearch/mediawiki.widgets.APIResultsQueue.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
'mediawiki.experiments',
'mediawiki.inspect',
'mediawiki.visibleTimeout',
+ 'mediawiki.widgets.MediaSearch',
'test.mediawiki.qunit.testrunner',
],
]
--- /dev/null
+/*!
+ * VisualEditor DataModel ResourceQueue tests.
+ *
+ * @copyright 2011-2018 VisualEditor Team and others; see http://ve.mit-license.org
+ */
+
+QUnit.module( 'mediawiki.widgets.APIResultsQueue' );
+
+( function ( $, mw ) {
+ var itemCounter, FullResourceProvider, EmptyResourceProvider, SingleResultResourceProvider;
+
+ itemCounter = 0;
+ FullResourceProvider = function ( config ) {
+ this.timer = null;
+ this.responseDelay = 1;
+ // Inheritance
+ FullResourceProvider.super.call( this, '', config );
+ };
+ EmptyResourceProvider = function ( config ) {
+ this.timer = null;
+ this.responseDelay = 1;
+ // Inheritance
+ EmptyResourceProvider.super.call( this, '', config );
+ };
+ SingleResultResourceProvider = function ( config ) {
+ this.timer = null;
+ this.responseDelay = 1;
+ // Inheritance
+ SingleResultResourceProvider.super.call( this, '', config );
+ };
+
+ OO.inheritClass( FullResourceProvider, mw.widgets.APIResultsProvider );
+ OO.inheritClass( EmptyResourceProvider, mw.widgets.APIResultsProvider );
+ OO.inheritClass( SingleResultResourceProvider, mw.widgets.APIResultsProvider );
+
+ FullResourceProvider.prototype.getResults = function ( howMany ) {
+ var i, timer,
+ result = [],
+ deferred = $.Deferred();
+
+ for ( i = itemCounter; i < itemCounter + howMany; i++ ) {
+ result.push( 'result ' + ( i + 1 ) );
+ }
+ itemCounter = i;
+
+ timer = setTimeout(
+ function () {
+ // Always resolve with some values
+ deferred.resolve( result );
+ },
+ this.responseDelay );
+
+ return deferred.promise( { abort: function () { clearTimeout( timer ); } } );
+ };
+
+ EmptyResourceProvider.prototype.getResults = function () {
+ var provider = this,
+ deferred = $.Deferred(),
+ timer = setTimeout(
+ function () {
+ provider.toggleDepleted( true );
+ // Always resolve with empty value
+ deferred.resolve( [] );
+ },
+ this.responseDelay );
+
+ return deferred.promise( { abort: function () { clearTimeout( timer ); } } );
+ };
+
+ SingleResultResourceProvider.prototype.getResults = function ( howMany ) {
+ var timer,
+ provider = this,
+ deferred = $.Deferred();
+
+ timer = setTimeout(
+ function () {
+ provider.toggleDepleted( howMany > 1 );
+ // Always resolve with one value
+ deferred.resolve( [ 'one result (' + ( itemCounter++ + 1 ) + ')' ] );
+ },
+ this.responseDelay );
+
+ return deferred.promise( { abort: function () { clearTimeout( timer ); } } );
+ };
+
+ /* Tests */
+
+ QUnit.test( 'Query providers', function ( assert ) {
+ var done = assert.async(),
+ providers = [
+ new FullResourceProvider(),
+ new EmptyResourceProvider(),
+ new SingleResultResourceProvider()
+ ],
+ queue = new mw.widgets.APIResultsQueue( {
+ threshold: 2
+ } );
+
+ assert.expect( 15 );
+
+ // Add providers to queue
+ queue.setProviders( providers );
+
+ // Set parameters and fetch
+ queue.setParams( { foo: 'bar' } );
+
+ queue.get( 10 )
+ .then( function ( data ) {
+ // Check that we received all requested results
+ assert.equal( data.length, 10, 'Query 1: Results received.' );
+ // We've asked for 10 items + 2 threshold from all providers.
+ // Provider 1 returned 12 results
+ // Provider 2 returned 0 results
+ // Provider 3 returned 1 results
+ // Overall 13 results. 10 were retrieved. 3 left in queue.
+ assert.equal( queue.getQueueSize(), 3, 'Query 1: Remaining queue size.' );
+
+ // Check if sources are depleted
+ assert.ok( !providers[ 0 ].isDepleted(), 'Query 1: Full provider not depleted.' );
+ assert.ok( providers[ 1 ].isDepleted(), 'Query 1: Empty provider is depleted.' );
+ assert.ok( providers[ 2 ].isDepleted(), 'Query 1: Single result provider is depleted.' );
+
+ // Ask for more results
+ return queue.get( 10 );
+ } )
+ .then( function ( data1 ) {
+ // This time, only provider 1 was queried, because the other
+ // two were marked as depleted.
+ // * We asked for 10 items
+ // * There are currently 3 items in the queue
+ // * The queue queried provider #1 for 12 items
+ // * The queue returned 10 results as requested
+ // * 5 results are now left in the queue.
+ assert.equal( data1.length, 10, 'Query 1: Second set of results received.' );
+ assert.equal( queue.getQueueSize(), 5, 'Query 1: Remaining queue size.' );
+
+ // Change the query
+ queue.setParams( { foo: 'baz' } );
+ // Check if sources are depleted
+ assert.ok( !providers[ 0 ].isDepleted(), 'Query 2: Full provider not depleted.' );
+ assert.ok( !providers[ 1 ].isDepleted(), 'Query 2: Empty provider not depleted.' );
+ assert.ok( !providers[ 2 ].isDepleted(), 'Query 2: Single result provider not depleted.' );
+
+ return queue.get( 10 );
+ } )
+ .then( function ( data2 ) {
+ // This should be the same as the very first result
+ assert.equal( data2.length, 10, 'Query 2: Results received.' );
+ assert.equal( queue.getQueueSize(), 3, 'Query 2: Remaining queue size.' );
+ // Check if sources are depleted
+ assert.ok( !providers[ 0 ].isDepleted(), 'Query 2: Full provider not depleted.' );
+ assert.ok( providers[ 1 ].isDepleted(), 'Query 2: Empty provider is not depleted.' );
+ assert.ok( providers[ 2 ].isDepleted(), 'Query 2: Single result provider is not depleted.' );
+ } )
+ // Finish the async test
+ .then( done );
+ } );
+
+ QUnit.test( 'Abort providers', function ( assert ) {
+ var done = assert.async(),
+ completed = false,
+ biggerQueue = new mw.widgets.APIResultsQueue( {
+ threshold: 5
+ } ),
+ providers = [
+ new FullResourceProvider(),
+ new EmptyResourceProvider(),
+ new SingleResultResourceProvider()
+ ];
+
+ assert.expect( 1 );
+
+ // Make the delay higher
+ providers.forEach( function ( provider ) { provider.responseDelay = 3; } );
+
+ // Add providers to queue
+ biggerQueue.setProviders( providers );
+
+ biggerQueue.setParams( { foo: 'bar' } );
+ biggerQueue.get( 100 )
+ .always( function () {
+ // This should only run if the promise wasn't aborted
+ completed = true;
+ } );
+
+ // Make the delay higher
+ providers.forEach( function ( provider ) { provider.responseDelay = 5; } );
+
+ biggerQueue.setParams( { foo: 'baz' } );
+ biggerQueue.get( 10 )
+ .then( function () {
+ assert.ok( !completed, 'Provider promises aborted.' );
+ } )
+ // Finish the async test
+ .then( done );
+ } );
+}( jQuery, mediaWiki ) );