source 'https://rubygems.org'
-gem 'mediawiki_selenium', '~> 1.2.0'
+gem 'mediawiki_selenium', '~> 1.2.1'
gem 'rubocop', require: false
http-cookie (1.0.2)
domain_name (~> 0.5)
i18n (0.7.0)
- json (1.8.2)
+ json (1.8.3)
mediawiki_api (0.3.1)
faraday (~> 0.9, >= 0.9.0)
faraday-cookie_jar (~> 0.0, >= 0.0.6)
- mediawiki_selenium (1.2.0)
+ mediawiki_selenium (1.2.1)
cucumber (~> 1.3, >= 1.3.10)
headless (~> 1.0, >= 1.0.1)
json (~> 1.8, >= 1.8.1)
watir-webdriver (>= 0.6.11)
page_navigation (0.9)
data_magic (>= 0.14)
- parser (2.2.0.3)
+ parser (2.2.2.5)
ast (>= 1.1, < 3.0)
- powerpack (0.1.0)
+ powerpack (0.1.1)
rainbow (2.0.0)
rest-client (1.8.0)
http-cookie (>= 1.0.2, < 2.0)
netrc (~> 0.7)
rspec-expectations (2.99.2)
diff-lcs (>= 1.1.3, < 2.0)
- rubocop (0.29.1)
+ rubocop (0.31.0)
astrolabe (~> 1.3)
- parser (>= 2.2.0.1, < 3.0)
+ parser (>= 2.2.2.1, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.4)
- ruby-progressbar (1.7.1)
+ ruby-progressbar (1.7.5)
rubyzip (1.1.7)
selenium-webdriver (2.45.0)
childprocess (~> 0.5)
ruby
DEPENDENCIES
- mediawiki_selenium (~> 1.2.0)
+ mediawiki_selenium (~> 1.2.1)
rubocop
production.
=== Configuration changes in 1.26 ===
+* $wgEnableParserCache was deprecated, set $wgParserCacheType to CACHE_NONE
+ instead if you want to disable the parser cache.
=== New features in 1.26 ===
* Change tags can now be hidden in the interface by disabling the associated
Parser Cache:
stored in: $parserMemc
- controlled by: $wgEnableParserCache
key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash
$pageid: id of the page
$renderkey: 1 if action=render, 0 otherwise
wfMessage( $msg2, $args )->inLanguage( 'en' )->text()
);
- header( 'HTTP/1.0 403 Forbidden' );
+ HttpStatus::header( 403 );
header( 'Cache-Control: no-cache' );
header( 'Content-Type: text/html; charset=utf-8' );
echo <<<ENDS
function sendHeaders() {
if ( $this->mResponseCode ) {
$n = preg_replace( '/^ *(\d+)/', '\1', $this->mResponseCode );
- header( "Status: " . $this->mResponseCode, true, (int)$n );
+ HttpStatus::header( $n );
}
header ( "Content-Type: " . $this->mContentType );
$wgFileCacheDepth = 2;
/**
- * Keep parsed pages in a cache (objectcache table or memcached)
- * to speed up output of the same page viewed by another user with the
- * same options.
- *
- * This can provide a significant speedup for medium to large pages,
- * so you probably want to keep it on. Extensions that conflict with the
- * parser cache should disable the cache on a per-page basis instead.
+ * Kept for extension compatibility; see $wgParserCacheType
+ * @deprecated 1.26
*/
$wgEnableParserCache = true;
* @return string
*/
function setup7zCommand( $file ) {
- $command = "7za a -bd -si " . wfEscapeShellArg( $file );
+ $command = "7za a -bd -si -mx=4 " . wfEscapeShellArg( $file );
// Suppress annoying useless crap from p7zip
// Unfortunately this could suppress real error messages too
$command .= ' >' . wfGetNull() . ' 2>&1';
*/
function wfHttpError( $code, $label, $desc ) {
global $wgOut;
- header( "HTTP/1.0 $code $label" );
- header( "Status: $code $label" );
+ HttpStatus::header( $code );
if ( $wgOut ) {
$wgOut->disable();
$wgOut->sendCacheControl();
}
header( 'Content-type: text/html; charset=utf-8' );
- print "<!doctype html>" .
+ print '<!DOCTYPE html>' .
'<html><head><title>' .
htmlspecialchars( $label ) .
'</title></head><body><h1>' .
list( $host, $lag ) = wfGetLB()->getMaxLag();
if ( $lag > $maxLag ) {
$resp = $this->context->getRequest()->response();
- $resp->header( 'HTTP/1.1 503 Service Unavailable' );
+ $resp->statusHeader( 503 );
$resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
$resp->header( 'X-Database-Lag: ' . intval( $lag ) );
$resp->header( 'Content-Type: text/plain' );
* @file
*/
+use MediaWiki\Logger\LoggerFactory;
+
/**
* This class should be covered by a general architecture document which does
* not exist as of January 2011. This is one of the Core classes and should
}
# Not modified
- # Give a 304 response code and disable body output
+ # Give a 304 Not Modified response code and disable body output
wfDebug( __METHOD__ . ": NOT MODIFIED, $info\n", 'log' );
ini_set( 'zlib.output_compression', 0 );
- $this->getRequest()->response()->header( "HTTP/1.1 304 Not Modified" );
+ $this->getRequest()->response()->statusHeader( 304 );
$this->sendCacheControl();
$this->disable();
if ( Hooks::run( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
if ( $code == '301' || $code == '303' ) {
if ( !$config->get( 'DebugRedirects' ) ) {
- $message = HttpStatus::getMessage( $code );
- $response->header( "HTTP/1.1 $code $message" );
+ $response->statusHeader( $code );
}
$this->mLastModified = wfTimestamp( TS_RFC2822 );
}
return;
} elseif ( $this->mStatusCode ) {
- $message = HttpStatus::getMessage( $this->mStatusCode );
- if ( $message ) {
- $response->header( 'HTTP/1.1 ' . $this->mStatusCode . ' ' . $message );
- }
+ $response->statusHeader( $this->mStatusCode );
}
# Buffer output; final headers may depend on later processing
*/
public function getResourceLoader() {
if ( is_null( $this->mResourceLoader ) ) {
- $this->mResourceLoader = new ResourceLoader( $this->getConfig() );
+ $this->mResourceLoader = new ResourceLoader(
+ $this->getConfig(),
+ LoggerFactory::getInstance( 'resourceloader' )
+ );
}
return $this->mResourceLoader;
}
if ( $wgCompressRevisions ) {
if ( function_exists( 'gzdeflate' ) ) {
- $text = gzdeflate( $text );
- $flags[] = 'gzip';
+ $deflated = gzdeflate( $text );
+
+ if ( $deflated === false ) {
+ wfLogWarning( __METHOD__ . ': gzdeflate() failed' );
+ } else {
+ $text = $deflated;
+ $flags[] = 'gzip';
+ }
} else {
wfDebug( __METHOD__ . " -- no zlib support, not compressing\n" );
}
# This can be done periodically via maintenance/compressOld.php, and
# as pages are saved if $wgCompressRevisions is set.
$text = gzinflate( $text );
+
+ if ( $text === false ) {
+ wfLogWarning( __METHOD__ . ': gzinflate() failed' );
+ return false;
+ }
}
if ( in_array( 'object', $flags ) ) {
$wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo";
}
+if ( $wgEnableParserCache === false ) {
+ $wgParserCacheType = CACHE_NONE;
+}
+
// Fix path to icon images after they were moved in 1.24
if ( $wgRightsIcon ) {
$wgRightsIcon = str_replace(
) {
if ( !is_array( $info ) ) {
if ( $sendErrors ) {
- header( 'HTTP/1.0 404 Not Found' );
+ HttpStatus::header( 404 );
header( 'Cache-Control: no-cache' );
header( 'Content-Type: text/html; charset=utf-8' );
$encFile = htmlspecialchars( $path );
$modsince = preg_replace( '/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
if ( wfTimestamp( TS_UNIX, $info['mtime'] ) <= strtotime( $modsince ) ) {
ini_set( 'zlib.output_compression', 0 );
- header( "HTTP/1.0 304 Not Modified" );
+ HttpStatus::header( 304 );
return self::NOT_MODIFIED; // ok
}
}
class WebResponse {
/**
- * Output a HTTP header, wrapper for PHP's header()
+ * Output an HTTP header, wrapper for PHP's header()
* @param string $string Header to output
* @param bool $replace Replace current similar header
* @param null|int $http_response_code Forces the HTTP response code to the specified value.
return null;
}
+ /**
+ * Output an HTTP status code header
+ * @since 1.26
+ * @param int $code Status code
+ */
+ public function statusHeader( $code ) {
+ HttpStatus::header( $code );
+ }
+
/**
* Set the browser cookie
* @param string $name The name of the cookie.
}
}
+ /**
+ * @since 1.26
+ * @param int $code Status code
+ */
+ public function statusHeader( $code ) {
+ $this->code = intval( $code );
+ }
+
/**
* @param string $key The name of the header to get (case insensitive).
* @return string|null The header value (if set); null otherwise.
$text = $this->getRawText();
+ // Don't return a 404 response for CSS or JavaScript;
+ // 404s aren't generally cached and it would create
+ // extra hits when user CSS/JS are on and the user doesn't
+ // have the pages.
if ( $text === false && $contentType == 'text/x-wiki' ) {
- # Don't return a 404 response for CSS or JavaScript;
- # 404s aren't generally cached and it would create
- # extra hits when user CSS/JS are on and the user doesn't
- # have the pages.
- $response->header( 'HTTP/1.x 404 Not Found' );
+ $response->statusHeader( 404 );
}
if ( !Hooks::run( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
if ( !in_array( $originParam, $origins ) ) {
// origin parameter set but incorrect
// Send a 403 response
- $message = HttpStatus::getMessage( 403 );
- $response->header( "HTTP/1.1 403 $message", true, 403 );
+ $response->statusHeader( 403 );
$response->header( 'Cache-Control: no-cache' );
echo "'origin' parameter does not match Origin header\n";
"apihelp-main-param-format": "Фармат вываду.",
"apihelp-main-param-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі <samp>maxlag</samp> з паведамленьнем кшталту <samp>Чаканьне $host: $lag сэкундаў затрымкі</samp>.<br />Глядзіце [[mw:Manual:Maxlag_parameter|Інструкцыя:Парамэтар maxlag]] дзеля дадатковай інфармацыі.",
"apihelp-main-param-smaxage": "Выстаўце HTTP-загаловак кантролю кэшу <code>s-maxage</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
- "apihelp-main-param-maxage": "Выстаўляе загаловак <code>max-age</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
+ "apihelp-main-param-maxage": "Выстаўляе HTTP-загаловак кантролю кэшу <code>max-age</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
"apihelp-main-param-assert": "Упэўніцеся, што ўдзельнік увайшоў у сыстэму, калі зададзена <kbd>user</kbd>, або мае правы робата, калі зададзена <kbd>bot</kbd>.",
"apihelp-main-param-requestid": "Любое значэньне, пададзенае тут, будзе ўключанае ў адказ. Можа быць выкарыстанае для адрозьненьня запытаў.",
"apihelp-main-param-servedby": "Уключае ў вынік назву сэрвэра, які апрацаваў запыт.",
"api-pageset-param-revids": "En Leß vun Kännonge vun Väsjohne för ze beärbeide.",
"api-help-title": "Hölp för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> vum MehdijaWikki.",
"api-help-main-header": "Houp_Moduhl",
- "api-help-flag-deprecated": "Dat Moduhl es nimmieh johd jeligge.",
+ "api-help-flag-deprecated": "Dat Moduhl es nimmih johd jeligge.",
"api-help-flag-readrights": "Heh da Modhul bruch et Rääsch zum Lässe.",
"api-help-flag-writerights": "Heh da Modhul bruch et Rääsch zom Schriive.",
"api-help-flag-mustbeposted": "Heh da Modhul nemm blohß POST_Opräschd aan.",
public function report() {
$this->doLog();
- $httpMessage = HttpStatus::getMessage( $this->httpCode );
-
- header( "Status: {$this->httpCode} {$httpMessage}", true, $this->httpCode );
+ HttpStatus::header( $this->httpCode );
header( 'Content-type: text/html; charset=utf-8' );
print $this->getHTML();
} elseif ( self::isCommandLine() ) {
MWExceptionHandler::printError( $this->getText() );
} else {
- self::header( 'HTTP/1.1 500 Internal Server Error' );
- self::header( 'Status: 500 Internal Server Error' );
+ self::statusHeader( 500 );
self::header( "Content-Type: $wgMimeType; charset=utf-8" );
$this->reportHTML();
header( $header );
}
}
+ private static function statusHeader( $code ) {
+ if ( !headers_sent() ) {
+ HttpStatus::header( $code );
+ }
+ }
}
}
// Evil hack for mobile :(
- if ( !$this->getConfig()->get( 'HTMLFormAllowTableFormat' ) && $this->displayFormat === 'table' ) {
+ if (
+ !$this->getConfig()->get( 'HTMLFormAllowTableFormat' )
+ && $this->displayFormat === 'table'
+ ) {
$this->displayFormat = 'div';
}
* @throws MWException
* @return HTMLFormField Instance of a subclass of HTMLFormField
*/
- public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+ public static function loadInputFromParameters( $fieldname, $descriptor,
+ HTMLForm $parent = null
+ ) {
$class = static::getClassFromDescriptor( $fieldname, $descriptor );
$descriptor['fieldname'] = $fieldname;
"config-db-install-help": "Donn dä Name un et Paßwoot vun däm Aanwänder för der Zohjreff op de Daatebangk jäz för et Enreeshte aanjävve.",
"config-db-account-lock": "Donn dersälve Name un et sälve Paßwoot för der nomaale Bedrief vum Wiki bruche",
"config-db-wiki-account": "Dä Name vun däm Aanwender för dä Zohjref op de Daatebangk em nomaale Bedrief:",
- "config-db-wiki-help": "Jiv ene Name un e Paßwoot aan, för dä Aanwender för dä Zohjref op de Daatebangk, wann et wiki nommaal aam Loufe es.\nWan et dä Name en der Daatebangk noch it jit, un dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere\njenooch Beräschtijunge hät, läät dä heh dä Aanwender en der Daatebangk aan un jidd_em di Rääschde, di dä nüüdesch hät, ävver nit mieh.",
+ "config-db-wiki-help": "Jiv ene Nahme un e Paßwoot aan, för dä Aanwänder för dä Zohjref op de Dahtebangk, wann et Wikki nommahl aam Loufe es.\nWann et dä Nahme en der Dahtebangk noch nit jit, un dä Aanwender för dä Zohjrevv op de Dahtebangk beim Enschtallehre jenohch Berääschtejonge hät, läht dä heh dä Aanwänder en der Dahtebangk aan un jidd_em di Rääschde, di dä nühdesch hät, ävver nit mih.",
"config-db-prefix": "Vörsaz för de Name vun de Tabälle en de Daatebangk:",
"config-db-prefix-help": "Wann ein Daatebangk för mieh wi ein Wiki udder e Wiki uns söns jät zosamme jebruch weed, dann kam_mer noch jet vör de Tabälle ier Name säze. Esu ene Vörsaz sull dubblte Tabällename vermeide hälfe.\nDonn kein Zwescheräum enjävve!\n\nJewöhnlesch bliev dat Feld heh ävver läddesch.",
"config-db-charset": "Dä Daatebangk iere Zeischesaz",
if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
// If there's no backing content, send a 404 Not Found
// for better machine handling of broken links.
- $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
+ $this->getContext()->getRequest()->response()->statusHeader( 404 );
}
// Also apply the robot policy for nonexisting pages (even if a 404 was used for sanity)
$out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
if ( !$this->getID() && $wgSend404Code ) {
// If there is no image, no shared image, and no description page,
- // output a 404, to be consistent with articles.
- $request->response()->header( 'HTTP/1.1 404 Not Found' );
+ // output a 404, to be consistent with Article::showMissingArticle.
+ $request->response()->statusHeader( 404 );
}
}
$out->setFileVersion( $this->displayImg );
* @return bool
*/
public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
- global $wgEnableParserCache;
-
- return $wgEnableParserCache
- && $parserOptions->getStubThreshold() == 0
+ return $parserOptions->getStubThreshold() == 0
&& $this->exists()
&& ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
&& $this->getContentHandler()->isParserCacheSupported();
* - 'no-change': don't update the article count, ever
*/
public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
- global $wgEnableParserCache;
-
$options += array(
'changed' => true,
'created' => false,
}
// Save it to the parser cache
- if ( $wgEnableParserCache ) {
- $parserCache = ParserCache::singleton();
- $parserCache->save(
- $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
- );
- }
+ ParserCache::singleton()->save(
+ $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
+ );
// Update the links tables and other secondary data
if ( $content ) {
* @author Trevor Parscal
*/
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
/**
* Dynamic JavaScript and CSS resource loading system.
*
* Most of the documentation is on the MediaWiki documentation wiki starting at:
* https://www.mediawiki.org/wiki/ResourceLoader
*/
-class ResourceLoader {
+class ResourceLoader implements LoggerAwareInterface {
/** @var int */
protected static $filterCacheVersion = 7;
*/
protected $blobStore;
+ /**
+ * @var LoggerInterface
+ */
+ private $logger;
+
/**
* Load information stored in the database about modules.
*
}
if ( !in_array( $filter, array( 'minify-js', 'minify-css' ) ) ) {
- wfDebugLog( 'resourceloader', __METHOD__ . ": Invalid filter: $filter" );
+ $this->logger->info( __METHOD__ . ": Invalid filter: $filter" );
return $data;
}
$cache->set( $key, $result );
} catch ( Exception $e ) {
MWExceptionHandler::logException( $e );
- wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $e" );
+ $this->logger->info( __METHOD__ . ": minification failed: $e" );
$this->errors[] = self::formatExceptionNoComment( $e );
}
}
* Register core modules and runs registration hooks.
* @param Config|null $config
*/
- public function __construct( Config $config = null ) {
+ public function __construct( Config $config = null, LoggerInterface $logger = null ) {
global $IP;
- if ( $config === null ) {
- wfDebug( __METHOD__ . ' was called without providing a Config instance' );
- $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+ if ( !$logger ) {
+ $logger = new NullLogger();
}
+ $this->setLogger( $logger );
+ if ( !$config ) {
+ $this->logger->info( __METHOD__ . ' was called without providing a Config instance' );
+ $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+ }
$this->config = $config;
// Add 'local' source first
return $this->config;
}
+ public function setLogger( LoggerInterface $logger ) {
+ $this->logger = $logger;
+ }
+
/**
* @param MessageBlobStore $blobStore
* @since 1.25
// Do not allow private modules to be loaded from the web.
// This is a security issue, see bug 34907.
if ( $module->getGroup() === 'private' ) {
- wfDebugLog( 'resourceloader', __METHOD__ . ": request for private module '$name' denied" );
+ $this->logger->info( __METHOD__ . ": request for private module '$name' denied" );
$this->errors[] = "Cannot show private module \"$name\"";
continue;
}
$this->preloadModuleInfo( array_keys( $modules ), $context );
} catch ( Exception $e ) {
MWExceptionHandler::logException( $e );
- wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
+ $this->logger->info( __METHOD__ . ": preloading module info failed: $e" );
$this->errors[] = self::formatExceptionNoComment( $e );
}
$versionHash = $this->getCombinedVersion( $context, array_keys( $modules ) );
} catch ( Exception $e ) {
MWExceptionHandler::logException( $e );
- wfDebugLog( 'resourceloader', __METHOD__ . ": calculating version hash failed: $e" );
+ $this->logger->info( __METHOD__ . ": calculating version hash failed: $e" );
$this->errors[] = self::formatExceptionNoComment( $e );
}
// sending the 304.
wfResetOutputBuffers( /* $resetGzipEncoding = */ true );
- header( 'HTTP/1.0 304 Not Modified' );
- header( 'Status: 304 Not Modified' );
+ HttpStatus::header( 304 );
$this->sendResponseHeaders( $context, $etag, false );
return true;
$blobs = $this->blobStore->get( $this, $modules, $context->getLanguage() );
} catch ( Exception $e ) {
MWExceptionHandler::logException( $e );
- wfDebugLog(
- 'resourceloader',
+ $this->logger->info(
__METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e"
);
$this->errors[] = self::formatExceptionNoComment( $e );
}
} catch ( Exception $e ) {
MWExceptionHandler::logException( $e );
- wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
+ $this->logger->info( __METHOD__ . ": generating module package failed: $e" );
$this->errors[] = self::formatExceptionNoComment( $e );
// Respond to client with error-state instead of module implementation
* @author Roan Kattouw
*/
+use MediaWiki\Logger\LoggerFactory;
+
/**
* Object passed around to modules which contains information about the state
* of a specific loader request
*/
public static function newDummyContext() {
return new self( new ResourceLoader(
- ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+ ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+ LoggerFactory::getInstance( 'resourceloader' )
), new FauxRequest( array() ) );
}
$files = array_values( array_unique( $files ) );
$filesMtime = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
- return max(
- $filesMtime,
- $this->getDefinitionMtime( $context )
- );
+ return $filesMtime;
}
/**
);
}
- /**
- * @param ResourceLoaderContext $context
- * @return int UNIX timestamp
- */
- public function getModifiedTime( ResourceLoaderContext $context ) {
- return max( 1, $this->getHashMtime( $context ) );
- }
-
/**
* @param ResourceLoaderContext $context
* @return string Hash
return array( 'mediawiki.language.init' );
}
- /**
- * @param ResourceLoaderContext $context
- * @return int UNIX timestamp
- */
- public function getModifiedTime( ResourceLoaderContext $context ) {
- return max( 1, $this->getHashMtime( $context ) );
- }
-
/**
* @param ResourceLoaderContext $context
* @return string Hash
return false;
}
- /**
- * @param $context ResourceLoaderContext
- * @return int|mixed
- */
- public function getModifiedTime( ResourceLoaderContext $context ) {
- $parentMTime = parent::getModifiedTime( $context );
- return max( $parentMTime, $this->getHashMtime( $context ) );
- }
-
/**
* @param $context ResourceLoaderContext
* @return string: Hash
);
}
- /**
- * @param ResourceLoaderContext $context
- * @return int UNIX timestamp
- */
- public function getModifiedTime( ResourceLoaderContext $context ) {
- return static::safeFilemtime( $this->path );
- }
-
/**
* @param ResourceLoaderContext $context
* @return string Hash
*/
class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
- /* Protected Members */
-
- protected $modifiedTime = array();
-
protected $origin = self::ORIGIN_CORE_INDIVIDUAL;
- /* Methods */
-
/**
* @param ResourceLoaderContext $context
* @return array|int|mixed
*/
public function getModifiedTime( ResourceLoaderContext $context ) {
- $hash = $context->getHash();
- if ( !isset( $this->modifiedTime[$hash] ) ) {
- $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
- }
-
- return $this->modifiedTime[$hash];
+ return wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
}
/**
return md5( serialize( User::getDefaultOptions() ) );
}
- /**
- * @param ResourceLoaderContext $context
- * @return int
- */
- public function getModifiedTime( ResourceLoaderContext $context ) {
- return $this->getHashMtime( $context );
- }
-
/**
* @param ResourceLoaderContext $context
* @return string
*/
class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
- /* Protected Members */
-
- protected $modifiedTime = array();
-
protected $origin = self::ORIGIN_CORE_INDIVIDUAL;
protected $targets = array( 'desktop', 'mobile' );
- /* Methods */
-
/**
* @return array List of module names as strings
*/
* @return int
*/
public function getModifiedTime( ResourceLoaderContext $context ) {
- $hash = $context->getHash();
- if ( !isset( $this->modifiedTime[$hash] ) ) {
- $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
- }
-
- return $this->modifiedTime[$hash];
+ return wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
}
/**
* Abstraction for resource loader modules which pull from wiki pages
*
* This can only be used for wiki pages in the MediaWiki and User namespaces,
- * because of its dependence on the functionality of
- * Title::isCssJsSubpage.
+ * because of its dependence on the functionality of Title::isCssJsSubpage.
+ *
+ * This module supports being used as a placeholder for a module on a remote wiki.
+ * To do so, getDB() must be overloaded to return a foreign database object that
+ * allows local wikis to query page metadata.
+ *
+ * Safe for calls on local wikis are:
+ * - Option getters:
+ * - getGroup()
+ * - getPosition()
+ * - getPages()
+ * - Basic methods that strictly involve the foreign database
+ * - getDB()
+ * - isKnownEmpty()
+ * - getTitleInfo()
*/
class ResourceLoaderWikiModule extends ResourceLoaderModule {
/** @var string Position on the page to load this module at */
// Origin defaults to users with sitewide authority
protected $origin = self::ORIGIN_USER_SITEWIDE;
- // In-object cache for title info
+ // In-process cache for title info
protected $titleInfo = array();
// List of page names that contain CSS
}
/**
- * Get the Database object used in getTitleMTimes(). Defaults to the local slave DB
- * but subclasses may want to override this to return a remote DB object, or to return
- * null if getTitleMTimes() shouldn't access the DB at all.
+ * Get the Database object used in getTitleInfo().
+ *
+ * Defaults to the local slave DB. Subclasses may want to override this to return a foreign
+ * database object, or null if getTitleInfo() shouldn't access the database.
*
- * NOTE: This ONLY works for getTitleMTimes() and getModifiedTime(), NOT FOR ANYTHING ELSE.
- * In particular, it doesn't work for getting the content of JS and CSS pages. That functionality
- * will use the local DB irrespective of the return value of this method.
+ * NOTE: This ONLY works for getTitleInfo() and isKnownEmpty(), NOT FOR ANYTHING ELSE.
+ * In particular, it doesn't work for getContent() or getScript() etc.
*
* @return IDatabase|null
*/
}
/**
- * @param Title $title
+ * @param string $title
* @return null|string
*/
- protected function getContent( $title ) {
+ protected function getContent( $titleText ) {
+ $title = Title::newFromText( $titleText );
+ if ( !$title || $title->isRedirect() ) {
+ return null;
+ }
+
$handler = ContentHandler::getForTitle( $title );
if ( $handler->isSupportedFormat( CONTENT_FORMAT_CSS ) ) {
$format = CONTENT_FORMAT_CSS;
if ( $options['type'] !== 'script' ) {
continue;
}
- $title = Title::newFromText( $titleText );
- if ( !$title || $title->isRedirect() ) {
- continue;
- }
- $script = $this->getContent( $title );
+ $script = $this->getContent( $titleText );
if ( strval( $script ) !== '' ) {
$script = $this->validateScriptFile( $titleText, $script );
$scripts .= ResourceLoader::makeComment( $titleText ) . $script . "\n";
if ( $options['type'] !== 'style' ) {
continue;
}
- $title = Title::newFromText( $titleText );
- if ( !$title || $title->isRedirect() ) {
- continue;
- }
$media = isset( $options['media'] ) ? $options['media'] : 'all';
- $style = $this->getContent( $title );
+ $style = $this->getContent( $titleText );
if ( strval( $style ) === '' ) {
continue;
}
return $styles;
}
- /**
- * @param ResourceLoaderContext $context
- * @return int
- */
- public function getModifiedTime( ResourceLoaderContext $context ) {
- $modifiedTime = 1;
- $titleInfo = $this->getTitleInfo( $context );
- if ( count( $titleInfo ) ) {
- $mtimes = array_map( function ( $value ) {
- return $value['timestamp'];
- }, $titleInfo );
- $modifiedTime = max( $modifiedTime, max( $mtimes ) );
- }
- $modifiedTime = max(
- $modifiedTime,
- $this->getMsgBlobMtime( $context->getLanguage() ),
- $this->getDefinitionMtime( $context )
- );
- return $modifiedTime;
- }
-
/**
* @param ResourceLoaderContext $context
* @return array
$summary = parent::getDefinitionSummary( $context );
$summary[] = array(
'pages' => $this->getPages( $context ),
+ // Includes SHA1 of content
+ 'titleInfo' => $this->getTitleInfo( $context ),
);
return $summary;
}
* @return bool
*/
public function isKnownEmpty( ResourceLoaderContext $context ) {
- $titleInfo = $this->getTitleInfo( $context );
- // Bug 68488: For modules in the "user" group, we should actually
- // check that the pages are empty (page_len == 0), but for other
- // groups, just check the pages exist so that we don't end up
- // caching temporarily-blank pages without the appropriate
- // <script> or <link> tag.
- if ( $this->getGroup() !== 'user' ) {
- return count( $titleInfo ) === 0;
- }
+ $revisions = $this->getTitleInfo( $context );
- foreach ( $titleInfo as $info ) {
- if ( $info['length'] !== 0 ) {
- // At least one non-0-lenth page, not empty
- return false;
+ // For user modules, don't needlessly load if there are no non-empty pages
+ if ( $this->getGroup() === 'user' ) {
+ foreach ( $revisions as $revision ) {
+ if ( $revision['rev_len'] > 0 ) {
+ // At least one non-empty page, module should be loaded
+ return false;
+ }
}
+ return true;
}
- // All pages are 0-length, so it's empty
- return true;
+ // Bug 68488: For other modules (i.e. ones that are called in cached html output) only check
+ // page existance. This ensures that, if some pages in a module are temporarily blanked,
+ // we don't end omit the module's script or link tag on some pages.
+ return count( $revisions ) === 0;
}
/**
- * Get the modification times of all titles that would be loaded for
- * a given context.
- * @param ResourceLoaderContext $context Context object
- * @return array Keyed by page dbkey. Value is an array with 'length' and 'timestamp'
- * keys, where the timestamp is a UNIX timestamp
+ * Get the information about the wiki pages for a given context.
+ * @param ResourceLoaderContext $context
+ * @return array Keyed by page name. Contains arrays with 'rev_len' and 'rev_sha1' keys
*/
protected function getTitleInfo( ResourceLoaderContext $context ) {
$dbr = $this->getDB();
return array();
}
- $hash = $context->getHash();
- if ( isset( $this->titleInfo[$hash] ) ) {
- return $this->titleInfo[$hash];
- }
+ $pages = $this->getPages( $context );
+ $key = implode( '|', array_keys( $pages ) );
+ if ( !isset( $this->titleInfo[$key] ) ) {
- $this->titleInfo[$hash] = array();
- $batch = new LinkBatch;
- foreach ( $this->getPages( $context ) as $titleText => $options ) {
- $batch->addObj( Title::newFromText( $titleText ) );
- }
+ $this->titleInfo[$key] = array();
+ $batch = new LinkBatch;
+ foreach ( $pages as $titleText => $options ) {
+ $batch->addObj( Title::newFromText( $titleText ) );
+ }
- if ( !$batch->isEmpty() ) {
- $res = $dbr->select( 'page',
- array( 'page_namespace', 'page_title', 'page_touched', 'page_len' ),
- $batch->constructSet( 'page', $dbr ),
- __METHOD__
- );
- foreach ( $res as $row ) {
- $title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $this->titleInfo[$hash][$title->getPrefixedDBkey()] = array(
- 'timestamp' => wfTimestamp( TS_UNIX, $row->page_touched ),
- 'length' => $row->page_len,
+ if ( !$batch->isEmpty() ) {
+ $res = $dbr->select( array( 'page', 'revision' ),
+ array( 'page_namespace', 'page_title', 'rev_len', 'rev_sha1' ),
+ $batch->constructSet( 'page', $dbr ),
+ __METHOD__,
+ array(),
+ array( 'revision' => array( 'INNER JOIN', array( 'page_latest=rev_id' ) ) )
);
+ foreach ( $res as $row ) {
+ // Avoid including ids or timestamps of revision/page tables so
+ // that versions are not wasted
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ $this->titleInfo[$key][$title->getPrefixedText()] = array(
+ 'rev_len' => $row->rev_len,
+ 'rev_sha1' => $row->rev_sha1,
+ );
+ }
}
}
- return $this->titleInfo[$hash];
+ return $this->titleInfo[$key];
}
public function getPosition() {
$this->getOutput()->disable();
if ( wfReadOnly() ) {
- header( "HTTP/1.0 423 Locked" );
+ // HTTP 423 Locked
+ HttpStatus::header( 423 );
print 'Wiki is in read-only mode';
return;
} elseif ( !$this->getRequest()->wasPosted() ) {
- header( "HTTP/1.0 400 Bad Request" );
+ HttpStatus::header( 400 );
print 'Request must be POSTed';
-
return;
}
$params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
$missing = array_diff_key( $required, $params );
if ( count( $missing ) ) {
- header( "HTTP/1.0 400 Bad Request" );
+ HttpStatus::header( 400 );
print 'Missing parameters: ' . implode( ', ', array_keys( $missing ) );
-
return;
}
$verified = is_string( $providedSignature )
&& hash_equals( $correctSignature, $providedSignature );
if ( !$verified || $params['sigexpiry'] < time() ) {
- header( "HTTP/1.0 400 Bad Request" );
+ HttpStatus::header( 400 );
print 'Invalid or stale signature provided';
-
return;
}
// but it needs to know when it is safe to disconnect. Until this
// reaches ignore_user_abort(), it is not safe as the jobs won't run.
ignore_user_abort( true ); // jobs may take a bit of time
- header( "HTTP/1.0 202 Accepted" );
+ // HTTP 202 Accepted
+ HttpStatus::header( 202 );
ob_flush();
flush();
// Once the client receives this response, it can disconnect
return false;
} else {
$fallbacks = self::getFallbacksFor( $code );
- $first = array_shift( $fallbacks );
- return $first;
+ return $fallbacks[0];
}
}
*
* @since 1.19
* @param string $code Language code
- * @return array
+ * @return array Non-empty array, ending in "en"
*/
public static function getFallbacksFor( $code ) {
if ( $code === 'en' || !Language::isValidBuiltInCode( $code ) ) {
return array();
- } else {
- $v = self::getLocalisationCache()->getItem( $code, 'fallback' );
- $v = array_map( 'trim', explode( ',', $v ) );
- if ( $v[count( $v ) - 1] !== 'en' ) {
- $v[] = 'en';
- }
- return $v;
}
+ // For unknown languages, fallbackSequence returns an empty array,
+ // hardcode fallback to 'en' in that case.
+ return self::getLocalisationCache()->getItem( $code, 'fallbackSequence' ) ?: array( 'en' );
}
/**
"Xethron",
"පසිඳු කාවින්ද",
"아라",
- "Macofe"
+ "Macofe",
+ "Fwolff"
]
},
"tog-underline": "Onderstreep skakels.",
"resetpass-wrong-oldpass": "Die huidige of tydelike wagwoord is ongeldig.\nU het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
"resetpass-temp-password": "Tydelike wagwoord:",
"resetpass-abort-generic": "Wysiging van wagwoord is deur 'n uitbreiding gestop.",
- "passwordreset": "Wagwoord herstel",
+ "passwordreset": "Herstel wagwoord",
"passwordreset-text-one": "Voltooi hierdie vorm om u wagwoord te herstel.",
"passwordreset-text-many": "{{PLURAL:$1|Vul een van die velde in om 'n tydelike wagwoord per e-pos te ontvang.}}",
"passwordreset-legend": "Kry nuwe wagwoord",
"watchnologin": "Nie ingeteken nie",
"addwatch": "Voeg by dophoulys",
"addedwatchtext": "Die bladsy \"[[:$1]]\" is by u [[Special:Watchlist|dophoulys]] bygevoeg.\nToekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal hier gelys word.",
+ "addedwatchtext-short": "Die bladsy \"$1\" is by u dophoulys gevoeg.",
"removewatch": "Verwyder van dophoulys",
"removedwatchtext": "Die bladsy \"[[:$1]]\" is van [[Special:Watchlist|u dophoulys]] afgehaal.",
+ "removedwatchtext-short": "Die bladsy \"$1\" is uit die dophoulys verwyder.",
"watch": "Hou dop",
"watchthispage": "Hou hierdie bladsy dop",
"unwatch": "Verwyder van dophoulys",
"uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.",
"uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў <code>$1=\"$2\"</code> не дазволена для SVG-файлаў.",
"uploaded-href-attribute-svg": "Href-атрыбуты <code><$1 $2=\"$3\"></code> зь нелякальнай мэтай (напрыклад, http://, javascript:, і г. д.) не дазволеныя ў SVG-файлах.",
+ "uploaded-href-unsafe-target-svg": "У загружаным SVG-файле знойдзеная спасылка на небясьпечную мэту <code><$1 $2=\"$3\"></code>.",
"uploadscriptednamespace": "Гэты SVG-файл утрымлівае няслушную прастору назваў «$1»",
"uploadinvalidxml": "Не атрымалася прааналізаваць XML у загружаным файле.",
"uploadvirus": "Файл утрымлівае вірус! Падрабязнасьці: $1",
"revdelete-reasonotherlist": "अन्य कारण",
"revdelete-edit-reasonlist": "हटावे के कारण बदलीं",
"revdelete-offender": "संशोधन सम्पादक:",
+ "mergehistory": "पन्नवन के इतिहास विलय करीं",
+ "mergehistory-box": "दू गो पन्नवन के अवतरण विलय करीं",
"mergehistory-from": "स्रोत पन्ना:",
+ "mergehistory-into": "लक्ष्य पन्ना:",
+ "mergehistory-list": "विलय जोग्य संपादन इतिहास",
+ "mergehistory-submit": "अवतरण विलय करीं",
+ "mergehistory-empty": "कौनों अवतरण विलय नइखे कइल जा सकत।",
+ "mergehistory-success": " [[:$1]] के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
+ "mergehistory-fail": "इतिहास विलय करे में अक्षम, पन्ना आ एकर टाइम पैरामीटर चेक करीं।",
"mergehistory-reason": "कारण:",
"revertmerge": "अलग करीं",
"mergelogpagetext": "एक पन्ना इतिहास के दुसर पन्ना इतिहास में तुरंत विलय भइले के एगो सूची नीचे दिहल बा।",
"yourgender": "रउआँ के का बोलावल जाय?",
"gender-unknown": "हम न बताइब",
"email": "ईमेल",
+ "prefs-help-email-required": "ईमेल पता चाहत बाटे।",
"prefs-info": "बेसिक जानकारी",
"prefs-i18n": "वैश्वीकरण",
"prefs-signature": "दसखत",
"prefs-editor": "संपादक",
"prefs-preview": "पूर्वावलोकन",
"prefs-advancedrc": "एडवांस बिकल्प",
+ "prefs-advancedrendering": "एडवांस बिकल्प",
+ "prefs-advancedsearchoptions": "एडवांस बिकल्प",
+ "prefs-advancedwatchlist": "एडवांस बिकल्प",
+ "prefs-displayrc": "डिस्प्ले बिकल्प",
+ "prefs-displaywatchlist": "डिस्प्ले बिकल्प",
+ "prefs-tokenwatchlist": "टोकन",
+ "prefs-diffs": "अंतर",
+ "prefs-help-prefershttps": "राउर ई पसंद के सेटिंग अगिला बेर लॉग इन कइले पर लागू होई।",
"group": "मंडली (ग्रुप):",
"group-user": "सदस्य",
"group-autoconfirmed": "खुद परीक्षित सदस्य",
"group-bureaucrat": "ब्यूरोक्रेट",
"group-suppress": "ओवरसाइटर",
"group-all": "(सब)",
+ "group-user-member": "{{GENDER:$1|सदस्य}}",
+ "group-autoconfirmed-member": "{{GENDER:$1|खुद अस्थापित सदस्य}}",
+ "group-bot-member": "{{GENDER:$1|बॉट}}",
+ "group-sysop-member": "{{GENDER:$1|प्रबंधक}}",
+ "group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
+ "group-suppress-member": "{{GENDER:$1|ओवरसाइट}}",
+ "grouppage-user": "{{ns:project}}:सदस्य सभ",
+ "grouppage-autoconfirmed": "{{ns:project}}:खुद अस्थापित सदस्य सभ",
+ "grouppage-bot": "{{ns:project}}:बॉट सभ",
+ "grouppage-sysop": "{{ns:project}}:प्रबंधक सभ",
+ "grouppage-bureaucrat": "{{ns:project}}:प्रशासक सभ",
+ "grouppage-suppress": "{{ns:project}}:ओवरसाइटर सभ",
"right-read": "पन्ना पढ़ीं",
+ "right-edit": "पन्नवन के संपादन करीं",
"right-createpage": "पन्ना बनाईं (बातचीत पन्ना की अलावा)",
"right-createtalk": "बातचीत पन्ना बनाईं",
"right-createaccount": "नया सदस्य खाता बनाईं",
"right-upload": "फाइल अपलोड करीं",
"right-reupload": "पुरान फाइल की ऊपर नया लादीं",
"right-reupload-own": "खुदे लादल फाइल पर नया फाइल लादीं",
+ "right-reupload-shared": "लोकल में साझा मीडिया भण्डार के फाइल सभ के ओवरराइड करीं",
+ "right-upload_by_url": "यूआरयल से फाइल अपलोड करीं",
+ "right-purge": "बिना पुछले कौनों पन्ना के साइट कैश के फिर लोड करीं",
+ "right-autoconfirmed": "आइ पी आधारित रेट के सीमा से प्रभावित ना होखे",
+ "right-bot": "ऑटोमेटेड प्रोसेस मानल जाय",
"right-writeapi": "API लेखन के इस्तेमाल",
"right-delete": "पन्ना हटाईं",
"right-bigdelete": "लंबा इतिहास वाला पन्ना हटाईं",
"ignorewarnings": "चेतावनी छोड़ीं",
"minlength1": "फाइलनाँव कमसेकम एक अच्छर के चाही",
"unknown-error": "अज्ञात त्रुटि उत्पन्न हो गईल बा।",
+ "upload-source": "सोर्स फाइल",
+ "sourcefilename": "सोर्स फाइलनाँव:",
+ "sourceurl": "सोर्स यूआरयल:",
+ "destfilename": "लक्ष्य फाइलनाँव:",
+ "upload-maxfilesize": "अधिक से अधिक फाइल साइज: $1",
+ "upload-description": "फाइल के विवरण",
+ "upload-options": "अपलोड बिकल्प",
+ "watchthisupload": "ई फाइल के धियान रखीं",
+ "filewasdeleted": "एही नाँव के एगो फाइल पहिले अपलोड भइल रहे आ बाद में हटावल गइल। पहिले आप $1 के जाँच लीं फिर अपलोड करे खातिर आगे बढ़ीं।",
+ "upload-success-subj": "सफलता से अपलोड भइल",
+ "upload-failure-subj": "अपलोड समस्या",
+ "upload-warning-subj": "अपलोड चेतावनी",
+ "upload-proto-error": "गलत प्रोटोकाल",
+ "upload-file-error": "इंटरनल खराबी",
+ "upload-misc-error": "नामालूम अपलोड खराबी",
+ "backend-fail-alreadyexists": "फाइल $1 पहिले से मौजूद बाटे",
+ "backend-fail-store": "फाइल $1 के $2 पर सहेजल ना जा सकल।",
+ "backend-fail-copy": "फाइल $1 के $2 पर कॉपी ना कइल जा सकल।",
+ "backend-fail-move": "फाइल $1 के $2 पर स्थानांतरण ना हो सकल।",
+ "backend-fail-opentemp": "टेम्परेरी फाइल के ना खोलल जा सकल।",
+ "backend-fail-writetemp": "टेम्परेरी फाइल में ना राइट कइल जा सकल।",
+ "backend-fail-closetemp": "टेम्परेरी फाइल के बंद ना कइल जा सकल।",
"license": "लाइसेंस जानकारी:",
"license-header": "लाइसेंसिंग",
"nolicense": "कौनों नइखे",
]
},
"tog-underline": "सम्बन्ध निम्न रेखाङ्कन:",
- "tog-hideminor": "à¤\90à¤\88लका मामूली सम्पादनलाई लुकाउन्या",
+ "tog-hideminor": "à¤\85हिलका मामूली सम्पादनलाई लुकाउन्या",
"tog-hidepatrolled": "गस्ती(patrolled)सम्पादनलाई लुकाउन्या",
"tog-newpageshidepatrolled": "गस्ती गरिया पानानलाई नयाँ पाना सूचीबठेई लुकाउन्या",
"tog-extendwatchlist": "निगरानी सूचीलाई सबै परिवर्तन धेकुन्या गरी बढुन्या , ऐईलका बाहेक",
- "tog-usenewrc": "पानाà¤\95ा à¤\90à¤\88लà¤\95ा परिवरà¥\8dतन र à¤\85वलà¥\8bà¤\95न सà¥\82à¤\9aà¥\80à¤\95ा à¤\86धारमà¥\80 सामà¥\82हिà¤\95 परिवरà¥\8dतनहरà¥\81",
- "tog-numberheadings": "शà¥\80रà¥\8dषà¤\95हरà¥\81लाई स्वत:अङ्कित गर",
+ "tog-usenewrc": "पानाà¤\95ा à¤\85हिलà¤\95ा परिवरà¥\8dतन र à¤\85वलà¥\8bà¤\95न सà¥\82à¤\9aà¥\80à¤\95ा à¤\86धारमà¥\80 सामà¥\82हिà¤\95 परिवरà¥\8dतनहरà¥\82",
+ "tog-numberheadings": "शà¥\80रà¥\8dषà¤\95हरà¥\82लाई स्वत:अङ्कित गर",
"tog-showtoolbar": "सम्पादन औजारबट्टा धेकौन्या",
"tog-editondblclick": "दोहोरो क्लिकमा पाना सम्पादन गर्ने",
"tog-editsectiononrightclick": "शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पारन्या",
"tog-watchdefault": "मुइले सम्पादन गरयाको पाना र फाइल ध्यान सूचीमाई थप्दया",
"tog-watchmoves": "मुइले सारया पानाहरु र फाइलहरूलाई ध्यान सूचीमी थप्दया",
"tog-watchdeletion": "मुइले हटाएका पानाहरु र फाइलहरूलाई ध्यान सूचीमी थप्दया",
- "tog-watchrollback": "मà¥\81à¤\87लà¥\87 लà¥\87à¤\96à¥\8dयाà¤\95ा पाना र फाà¤\87ल हà¥\87रिनà¥\8dया सà¥\81à¤\9aिमà¥\80 थप्या ।",
+ "tog-watchrollback": "मà¥\81à¤\87लà¥\87 रà¥\8bलबà¥\8dयाà¤\95 à¤\97रà¥\8dयाà¤\95ा पानाहरà¥\82 मà¥\87रà¥\8b धà¥\8dयानसà¥\82à¤\9aà¥\80मà¥\80 थपà¥\8dद्या ।",
"tog-minordefault": "सबै सम्पादनहरुलाई पहिल्लईनिर्धारित रुपमी सामान्य चिनो लगाउन्या",
"tog-previewontop": "सम्पादन बाकस अगि पहिलाकोरूप देखाउन्या",
- "tog-previewonfirst": "नà¥\87पालà¥\80",
+ "tog-previewonfirst": "पà¥\88लà¥\8dलà¥\80à¤\95à¥\8b समà¥\8dपादनमà¥\80 à¤\9dलà¤\95 धà¥\87à¤\95ाà¤\89नà¥\8dया",
"tog-enotifwatchlistpages": "मेरा ध्यान सूचीमी रहेयाका पाना अथवा चित्र बदलिएका मुलाई ई-मेल गरियोस्",
- "tog-enotifusertalkpages": "ramesh.bohara25@gmail.com",
+ "tog-enotifusertalkpages": "मेरो कुरडी पानामी परिवर्तन भया मलाई इमेल पठाउन्या",
"tog-enotifminoredits": "पानाहरु र फाइलहरूमी सामान्य सम्पादन भयालै मुइलाई ई-मेल गरियोस्",
- "tog-enotifrevealaddr": "à¤\9cानà¤\95ारà¥\80 à¤\87-मà¥\87लहरà¥\81मी मेरो इ-मेल खुलाउन्या",
+ "tog-enotifrevealaddr": "à¤\9cानà¤\95ारà¥\80 à¤\87-मà¥\87लहरà¥\82मी मेरो इ-मेल खुलाउन्या",
"tog-shownumberswatching": "निगरानी गरिरहेका प्रयोगकर्ताहरूको संख्या धेखाउन्या",
- "tog-oldsig": "यà¥\88लको हस्ताक्षर:",
+ "tog-oldsig": "à¤\85हिलको हस्ताक्षर:",
"tog-fancysig": "मेरा दस्तखतलाई विकि पाठको रुपमी लिने (स्वत लिङ्क बिना)",
"tog-uselivepreview": "प्रत्यक्ष पैल्लीकोरुप प्रयोग गर",
"tog-forceeditsummary": "खाली सम्पादन शीर्षक प्रविष्टि गरेपछा मलाई सोधन्या",
"sun": "आइत",
"mon": "सौउ",
"tue": "मांगल",
- "wed": "वुध",
+ "wed": "बुध",
"thu": "बिपै",
"fri": "शुक",
"sat": "छन्चर",
"december-date": "डिसेम्बर $1",
"pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणीहरू}}",
"category_header": "\"$1\" श्रेणीमी भया लेखहरू",
- "subcategories": "à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\81",
+ "subcategories": "à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\82",
"category-media-header": "\"$1\" श्रेणीमी भया लेखहरू",
- "category-empty": "''यà¥\87 श्रेणीमी हाल कोइलै पाना या मिडिया रया नाइँथिन ।''",
+ "category-empty": "''यà¥\88 श्रेणीमी हाल कोइलै पाना या मिडिया रया नाइँथिन ।''",
"hidden-categories": "{{PLURAL:$1|लुकाया श्रेणी|लुकायाका श्रेणीहरू}}",
"hidden-category-category": "लुकाइया श्रेणीहरू",
"category-subcat-count": "{{PLURAL:$2|यै श्रेणीमी निम्न उपश्रेणीहरू मात्र रया छन्।|यै श्रेणीको निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}}, $2 कुल मध्ये श्रेणीहरू रया छन् ।}}",
"category-file-count": "{{PLURAL:$2|यै श्रेणीमी एक मात्र पानो रया छ।|कुल $2 मध्ये यै श्रेणीमी {{PLURAL:$1|पानो|$1 पानाहरु}} रहेका छन् । }}",
"category-file-count-limited": "निम्न {{PLURAL:$1|पानो|$1 पानाहरू}} ये श्रेणीमी रया छ ।",
"listingcontinuesabbrev": "निरन्तरता...",
- "index-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95ित पानाहरà¥\81",
- "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95न नà¤\97रयाà¤\95ा पानाहरà¥\81",
+ "index-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95ित पानाहरà¥\82",
+ "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95न नà¤\97रà¥\80याà¤\95ा पानाहरà¥\82",
"broken-file-category": "टुटेको फाइल लिङ्कहरूसितको पाना",
"about": "बारेमी",
"article": "सामाग्री पानो",
- "newwindow": "(नà¥\8cलà¥\8b विनà¥\8dडà¥\8bमा à¤\96à¥\81ल्छ)",
+ "newwindow": "(नà¥\8cलà¥\8b विनà¥\8dडà¥\8bमà¥\80 à¤\96à¥\81लन्छ)",
"cancel": "रद्द",
"moredotdotdot": "झिक्कु...",
"morenotlisted": "यो सूची पूरा नाइँ हो ।",
"mypage": "पानो",
"mytalk": "मेरी कुरडी",
- "anontalk": "यà¥\87 IP à¤\95ा वारेमी कुरडी गर",
+ "anontalk": "यà¥\88 à¤\86à¤\87. पà¥\80. à¤\95ा बारेमी कुरडी गर",
"navigation": "खोज",
"and": " र",
"qbfind": "तम जाण",
"qbedit": "सम्पादन",
"qbpageoptions": "ये पानो",
"qbmyoptions": "मेरो पानो",
- "faq": "à¤à¥\8cत सà¥\8bधिà¤\8fà¤\95ा पà¥\8dरशà¥\8dनहरà¥\81",
+ "faq": "à¤à¥\8cत सà¥\8bधिनà¥\8dया पà¥\8dरशà¥\8dनहरà¥\82",
"faqpage": "Project:भौत सोधिएका प्रश्नहरु",
- "actions": "à¤\95ारà¥\8dयहरà¥\81",
+ "actions": "à¤\95ारà¥\8dयहरà¥\82",
"namespaces": "नेमस्पेस",
- "variants": "बहà¥\81रà¥\81पहरà¥\81",
+ "variants": "बहà¥\81रà¥\81पहरà¥\82",
"navigation-heading": "नेविगेशन मेनू",
- "errorpagetitle": "à¤\97लत",
+ "errorpagetitle": "तà¥\8dरà¥\81à¤\9fà¥\80",
"returnto": "$1 मी फर्क।",
"tagline": "{{SITENAME}}बाट",
"help": "सहायता",
"undelete_short": "{{PLURAL:$1|एउटा मेटियाको सम्पादन|$1 मेटियाका सम्पादनहरु}} फर्काउन्या",
"viewdeleted_short": "{{PLURAL:$1|मेटियाको सम्पादन |$1 मेटियाका सम्पादनहरू}}",
"protect": "सुरक्षित राख",
- "protect_change": "बदलन्या",
+ "protect_change": "बदलà¥\8dनà¥\8dया",
"protectthispage": "यै पानाकी सुरक्षित गर",
"unprotect": "सुरक्षा परिवर्तन गर",
"unprotectthispage": "यै पानाको सुरक्षा परिवर्तन गर",
"newpage": "नयाँ पाना",
- "talkpage": "यà¥\87 पानाका बारेमी छलफल गर",
+ "talkpage": "यà¥\88 पानाका बारेमी छलफल गर",
"talkpagelinktext": "कुरडी",
"specialpage": "खास पानो",
- "personaltools": "व्यक्तिगत औजार",
+ "personaltools": "व्यक्तिगत औजारहरू",
"articlepage": "कन्टेन्ट पानो हेर",
"talk": "कुरडी कानी",
"views": "अवलोकन गर",
"viewcount": "यो पाना हेरियाको थियो {{PLURAL:$1|एकपटक|$1 पटक}}",
"protectedpage": "सुरक्षित गरिएका पानाहरु",
"jumpto": "यैमी जाओ:",
- "jumptonavigation": "à¤\96à¥\8bà¤\9c",
+ "jumptonavigation": "à¤à¥\8dरमण à¤\97र",
"jumptosearch": "खोज",
"view-pool-error": "माफ गरया , ये समयमी सर्भरहरुमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरु ये पाना हेद्या प्रयास गरी रहनु भएको छ।\nकृपया यो पाना पुन: हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।\n\n$1",
"generic-pool-error": "माफ गरया , ये समयमी सर्भरहरुमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरु ये पाना हेद्या प्रयास गरी रहनु भएको छ।\nकृपया यो पाना पुन: हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।",
"badaccess-groups": "तमले अनुरोध गरया काम {{PLURAL:$2|समूह |कोइ एक समूह}}: $1 मी रया प्रयोगकर्ताहरुले मात्र अद्दु सक्दान ।",
"versionrequired": "MediaWiki संस्करण $1 चाईन्या",
"versionrequiredtext": "ये पाना प्रयोग गर्नका लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर [[Special:Version|version page]]",
- "ok": "हà¥\81नà¥\87",
+ "ok": "à¤à¤¯à¥\8b",
"retrievedfrom": " \"$1\" बठे निकालिया",
"youhavenewmessages": "तमरा लागि($2)मी $1 छ।",
- "youhavenewmessagesfromusers": "तमरा लाà¤\97ि {{PLURAL:$3|पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता|$3 पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\81}}($2)बठे$1",
- "youhavenewmessagesmanyusers": "तमलाà¤\88 धà¥\87रà¥\88 पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82($2) बाà¤\9f $1 छ ।",
- "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\95 नयाà¤\81 सनà¥\8dदà¥\87श|999=नयाà¤\81 सनà¥\8dदà¥\87शहरू}}",
- "newmessagesdifflinkplural": "छाड्डीबारो {{PLURAL:$1|परिवर्तन|999=परिवर्तनहरू}}",
- "youhavenewmessagesmulti": "तमरा लाà¤\97ि $1 मà¥\80 नयाà¤\81 सनà¥\8dदà¥\87शहरू छन्",
+ "youhavenewmessagesfromusers": "तमरा लाà¤\97ि {{PLURAL:$3|पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता|$3 पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82}}($2)बठे$1",
+ "youhavenewmessagesmanyusers": "तमलाà¤\88 धà¥\87रà¥\88 पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82($2) बठà¥\87 $1 छ ।",
+ "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\95 नयाà¤\81 रà¥\88बार|999=नयाà¤\81 रà¥\88बारहरू}}",
+ "newmessagesdifflinkplural": "à¤\9bाडà¥\8dडà¥\80बारà¤\95à¥\8b {{PLURAL:$1|परिवरà¥\8dतन|999=परिवरà¥\8dतनहरà¥\82}}",
+ "youhavenewmessagesmulti": "तमरा लाà¤\97ि $1 मà¥\80 नयाà¤\81 रà¥\88बारहरू छन्",
"editsection": "सम्पादन",
"editold": "सम्पादन गर्न्या",
"viewsourceold": "स्रोत हेर",
"viewsourcelink": "स्रोत हेर",
"editsectionhint": "खण्ड: $1 सम्पादन गर",
"toc": "विषयसूची",
- "showtoc": "धेका",
- "hidetoc": "लुका",
+ "showtoc": "धेकाउन्या",
+ "hidetoc": "लुकाउन्या",
"collapsible-collapse": "खुम्च्याउन्या",
"collapsible-expand": "फैलाउ",
"confirmable-confirm": "तमरो {{GENDER:$1|लिङ्ग}} हो?",
"sort-descending": "अवरोहण क्रममी मिलाउन्या",
"sort-ascending": "आरोहण क्रममी मिलाउन्या",
"nstab-main": "लेख",
- "nstab-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता पाना",
+ "nstab-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता पानà¥\8b",
"nstab-media": "माध्यम पाना",
"nstab-special": "खास पानो",
"nstab-project": "आयोजना पानो",
"nstab-image": "फाइल",
- "nstab-mediawiki": "à¤\96बर",
+ "nstab-mediawiki": "रà¥\88बार",
"nstab-template": "ढाँचा",
"nstab-help": "सहायता पानो",
"nstab-category": "श्रेणी",
"nosuchaction": "यसो काम हैन",
"nosuchactiontext": "URL ले खुलाएको काम मान्य छैन ।\nतमुले URL गलत टाइपगरेका हौ , वा गलत लिंकक पछाडी लागेका हुनसक्देहौ ।\nयै{{SITENAME}}ले सफ्टवेयरमी भएको गल्ति देखायाको पनि हुनसक्छ ।",
"nosuchspecialpage": "तसो विशेष पानो छैन",
- "nospecialpagetext": "<strong>तमà¥\81लà¥\87 à¤\85नà¥\81रà¥\8bध à¤\97रयाà¤\95à¥\8b विशà¥\87ष पानà¥\8b à¤\85मानà¥\8dय à¤\9b ।</strong>\n\nमानà¥\8dय पानाहरà¥\81को सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
- "error": "à¤\97लत",
+ "nospecialpagetext": "<strong>तमà¥\80लà¥\87 à¤\85नà¥\81रà¥\8bध à¤\97रयाà¤\95à¥\8b विशà¥\87ष पानà¥\8b à¤\85मानà¥\8dय à¤\9b ।</strong>\n\nमानà¥\8dय पानाहरà¥\82को सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
+ "error": "तà¥\8dरà¥\81à¤\9fà¥\80",
"databaseerror": "डेटावेस गल्ति",
- "databaseerror-text": "डà¥\87à¤\9fाबà¥\87स à¤\95à¥\8dवà¥\87रà¥\80मा à¤\96राबà¥\80 दà¥\87à¤\96ा पणयà¥\8b ।\nयà¥\87ले सफ्टवेयरमी गल्ती रयाको धेकाउन सकन्छ ।",
- "databaseerror-textcl": "डà¥\87à¤\9fावà¥\87स à¤\95à¥\8dवà¥\87रà¥\80मà¥\80 à¤\96राबà¥\80 दà¥\87à¤\96ियो ।",
- "databaseerror-query": "à¤\95à¥\8dवà¥\87रà¥\80: $1",
+ "databaseerror-text": "डà¥\87à¤\9fाबà¥\87स à¤\95ावà¥\87रà¥\80मà¥\80 à¤\96राबà¥\80 धà¥\87à¤\95ियà¥\8b ।\nयà¥\88ले सफ्टवेयरमी गल्ती रयाको धेकाउन सकन्छ ।",
+ "databaseerror-textcl": "डà¥\87à¤\9fावà¥\87स à¤\95ावà¥\87रà¥\80मà¥\80 à¤\96राबà¥\80 धà¥\87à¤\95ियो ।",
+ "databaseerror-query": "à¤\85नà¥\81रà¥\8bध: $1",
"databaseerror-function": "फङ्सन : $1",
"databaseerror-error": "गल्ती: $1",
"laggedslavemode": "<strong>चेतावनी:</strong> पानामी हालका अद्यतनहरू नहुनस्कदान ।",
"readonly": "डेटाबेस बन्द गरिया छ",
"enterlockreason": "ताल्चा मार्नुको कारण दिया, साथै ताल्चा हटाउने समयको अवधि अनुमान लगा।",
"readonlytext": "सम्भवतः नियमित डेटाबेस रख-रखाउको कारण अहिलेलाई नयाँ डेटाबेस प्रविष्टी र अन्य संशोधनहरु बन्द राखिया छ, जईलाई पछि बठे सामान्य गरिन्या छ। \nप्रबन्धक जईले यो बन्द गरयाछन्, यो स्पष्टीकरण दिएकाछन्: $1",
- "missing-article": "नाम \"$1\" $2 भया भेटिनु पडडे पाना पाठ डेटाबेसले भेटाइएन, \n\nयिसो प्राय: मिति नाघिसक्या भिन्न वा इतिहास वा कुनै मेटिसक्याको पानाको लिंक पहिल्याउनाले हुन्छ ।\n\nयदि यसो भया नाइँहो भणे सफ्टवेयरको गल्ती लै हुनसकुन्छ ।\nकृपया यैको url खुलाइ [[Special:ListUsers/sysop|प्रबन्धक]]लाई उजुरी गर",
+ "missing-article": "नाम \"$1\" $2 भयाको भेटिनु पड्डे पानो पाठ डेटाबेसले भेटाएन, \n\nयिसो प्राय: मिति नाघिसक्याको भिन्न वा इतिहास वा कुनै मेटिसक्याको पानाको लिंक पहिल्याउनाले हुन्छ ।\n\nयदि यसो भया नाइँहो भणे सफ्टवेयरको गल्ती लै हुनसकुन्छ ।\nकृपया यैको url खुलाइ [[Special:ListUsers/sysop|प्रबन्धक]]लाई उजुरी गर",
"missingarticle-rev": "(संशोधन #: $1)",
- "missingarticle-diff": "(परि: $1, $2)",
+ "missingarticle-diff": "(à¤à¤¿à¤¨à¥\8dनता: $1, $2)",
"readonly_lag": "डेटाबेस स्वतः बन्द गरिया छ जबकि अधिनस्थ डेटाबेस सर्वरले मूल पहिल्याउँनाछ।",
"internalerror": "भित्रका गल्ती",
"internalerror_info": "भित्रका गल्ती: $1",
"filenotfound": "\"$1\" फाइल नाइँ भेटियो ।",
"unexpected": "अप्रत्यासित मान :\"$1\"=\"$2\" ।",
"formerror": "गल्ती : फर्म बुझाउन सकिएन",
- "badarticleerror": "यà¥\87 à¤\95ारà¥\8dय यà¥\88 पनà¥\8dनामा à¤\97रà¥\8dन मिलà¥\87न।",
- "cannotdelete": "\"$1\" पाना वा फ़ाà¤\87ल मà¥\87à¤\9fà¥\8dà¤\9fà¥\82 सà¤\95िà¤\8fन।\nयà¥\8b पà¥\88लà¥\8dलà¥\80बठà¥\87 मà¥\87à¤\9fिया हà¥\81नà¥\81 पडà¥\81न्छ।",
+ "badarticleerror": "यà¥\8b à¤\95ारà¥\8dय यà¥\88 पनामà¥\80 à¤\97रà¥\8dन नाà¤\88à¤\82मिलà¥\8dलà¥\8b।",
+ "cannotdelete": "\"$1\" पाना वा फाà¤\87ल मà¥\87à¤\9fà¥\8dà¤\9f सà¤\95िà¤\8fन।\nयà¥\8b पà¥\88लà¥\8dलà¥\80बठà¥\87 मà¥\87à¤\9fियाà¤\95à¥\8b हà¥\81नà¥\81 पडन्छ।",
"cannotdelete-title": "पाना \"$1\" लाई मेट्टू सकिएन",
"delete-hook-aborted": "हुकले सम्पादनकार्य बन्द गरिदियो ।\nकोइ कारण दिइएन ।",
"no-null-revision": "$1 पाना लागि खालि पुनरावलोकन सिर्जना गर्न सकिएन",
"createacct-yourpasswordagain-ph": "आजी पासवर्ड लेख",
"yourdomainname": "तमरो ज्ञानक्षेत्र(डोमेन):",
"password-change-forbidden": "ये विकिमी पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
- "login": "प्रवेश",
+ "login": "प्रवेश (लगईन)",
"nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउन्या",
"userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउन्या",
"userloginnocreate": "प्रवेश",
"createaccounterror": "खाता बनाउन सकिएन: $1",
"loginsuccesstitle": "प्रवेश सफल",
"loginsuccess": "'''तमले {{SITENAME}}मी \"$1\" को रुपमी प्रवेश गरया छौ।'''",
- "nouserspecified": "तमलà¥\87 पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b नाम à¤\9cनाà¤\89नà¥\81 पडà¥\81नà¥\8dछ।",
+ "nouserspecified": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता नाम दिनà¥\81 à¤\85निवारà¥\8dय छ।",
"mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
"passwordremindertitle": "{{SITENAME}}का लागि नयाँ अस्थायी पासवर्ड",
"mailerror": " चिठी :$1 पठाउँदा गल्ती भयो",
"watchthis": "यै पानाको ध्यान राख",
"savearticle": "सङ्ग्रह गर",
"preview": "पूर्वावलोकन",
- "showpreview": "पूर्वालोकन धेका",
- "showdiff": "परिवर्तन धेका",
+ "showpreview": "पूर्वालोकन धेकाउन्या",
+ "showdiff": "परिवर्तन धेकाउन्या",
"summary-preview": "सारांश पूर्वालोकन:",
"subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
"blockedtitle": "प्रयोककर्तालाई रोक लगाइया छ",
"newarticle": "(नयाँ)",
"updated": "नौला",
"note": "'''सूचना:'''",
- "continue-editing": "सम्पादन क्षेत्रमी जा",
+ "continue-editing": "सम्पादन क्षेत्रमी जाओ",
"editing": "$1 सम्पादन गरिँदै",
"creating": "$1 बनाइँदै",
"editingsection": "$1 (खण्ड) सम्पादन गरिँदै",
"editingcomment": "$1 सम्पादन गर्दै(नयाँ खण्ड)",
"editconflict": "सम्पादन बाँझ्यो: $1",
- "yourtext": "तमरा पाठहरà¥\81",
+ "yourtext": "तमरा पाठहरà¥\82",
"storedversion": "संग्रहित पुनरावलोकन",
- "yourdiff": "à¤à¤¿à¤¨à¥\8dनताहरà¥\81",
+ "yourdiff": "à¤à¤¿à¤¨à¥\8dनताहरà¥\82",
"template-protected": "(सुरक्षित)",
"template-semiprotected": "(अर्ध-सुरक्षित)",
- "permissionserrors": "à¤\85नà¥\81मति नà¤à¤¯à¤¾",
+ "permissionserrors": "à¤\85धिà¤\95ारमà¥\80 तà¥\8dरà¥\81à¤\9fà¥\80",
"log-fulllog": "पूरा लग हेर",
"edit-hook-aborted": "हुकले सम्पादन बन्द गरिदियो ।\nयेले कोइ कारण दिएन ।",
"edit-gone-missing": "पाना अद्यतन गर्न सकिएन\nयो मेटिया जसो धेकिन्छ ।",
- "edit-conflict": "दà¥\8dवनà¥\8dदà¥\8dव समà¥\8dपादन à¤\97रà¥\8dनà¥\8dया ।",
+ "edit-conflict": "समà¥\8dपादन दà¥\8dवनà¥\8dदà¥\8dव à¤à¤¯à¥\8b",
"postedit-confirmation-created": "पाना सिर्जना गरियो ।",
"postedit-confirmation-restored": "पाना पूर्वरूपमी फर्कायो ।",
"postedit-confirmation-saved": "तमरो सम्पादन संग्रह गरिया छ ।",
"converter-manual-rule-error": "म्यानुअल भाषा अनुवाद सिध्दान्तमी समस्या धेखियो",
"cantcreateaccounttitle": "खाता बनाउन सकिएन",
"viewpagelogs": "यै पानाका लगहरू हेर",
- "currentrev": "à¤\90à¤\88लको पुनरावलोकन",
- "currentrev-asof": "$1à¤\95à¥\8b रà¥\81पमà¥\80 à¤\90à¤\88लà¤\95à¥\8b पà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+ "currentrev": "à¤\85हिलको पुनरावलोकन",
+ "currentrev-asof": "$1à¤\95à¥\8b रà¥\81पमà¥\80 à¤\85हिलà¤\95à¥\8b पà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
"revisionasof": "$1 जस्तै गरी पुनरावलोकन",
"revision-info": "{{GENDER:$6|$2}}$7 द्वारा $1को संशोधन",
"previousrevision": "← पुरानो संशोधन",
"nextrevision": "नयाँ संशोधन →",
- "currentrevisionlink": "à¤\90à¤\88लको पुनरावलोकन",
+ "currentrevisionlink": "à¤\85हिलको पुनरावलोकन",
"cur": "वर्तमान पाना लिङ्क इतिहास",
"next": "दोसरो",
"last": "पल्लिको",
"page_first": "पैल्लो",
- "page_last": "छाड्डीबारो",
+ "page_last": "à¤\9bाडà¥\8dडà¥\80बारà¤\95à¥\8b",
"history-fieldset-title": "इतिहासको विचरण गर्ने",
"history-show-deleted": "मेटिएका मात्र",
"histfirst": "सबहै पुरानो",
"histlast": "नयाँ",
- "historysize": "({{PLURAL:$1|१ बाà¤\87à¤\9f |$1 बाà¤\87à¤\9fहरà¥\81}})",
+ "historysize": "({{PLURAL:$1|१ बाà¤\87à¤\9f |$1 बाà¤\87à¤\9fहरà¥\82}})",
"historyempty": "(खाली)",
"history-feed-title": "पुनरावलोकन इतिहास",
"history-feed-description": "विकीमा यो पानको पुनरावलोकन इतिहास",
"rev-deleted-user": "(प्रयोगकर्ता नाम हटाइयो)",
"rev-deleted-event": "(लग विवरण हटाइयो)",
"rev-delundel": "दधेखाउने/लुकाउन्या",
- "rev-showdeleted": "धेका",
+ "rev-showdeleted": "धेकाउन्या",
"revisiondelete": "मेटाउन्या/मेटाईया रद्दगर्ने पुनरावलोकनहरु",
"revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
"revdelete-no-file": "खुलाइएको पाना अस्तित्वमी छैन",
"revdelete-suppress": "प्रवन्धक वा अरुबठे डेटा थोका लिन्या",
"revdelete-unsuppress": "पुनर्स्थापित पुनरावृत्तिबठे बन्देज हटाउन्या",
"revdelete-log": "कारण:",
- "revdelete-submit": "{{PLURAL:$1|à¤\9bानिया सà¤\82शà¥\8bधन|à¤\9bानà¥\8dनिया सà¤\82शà¥\8bधनहरà¥\81}}मा पà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\87",
+ "revdelete-submit": "{{PLURAL:$1|à¤\9bानिया सà¤\82शà¥\8bधन|à¤\9bानà¥\8dनिया सà¤\82शà¥\8bधनहरà¥\82}}मà¥\80 पà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\8dया",
"revdelete-success": "'''संशोधन दृश्यता सफलतापूर्वक अद्यतन भयो।'''",
"revdelete-failure": "'''संशोधन दृश्यता अद्यतन गर्न सकिएन:'''\n$1",
"logdelete-success": "'''लग दृष्टि सफलतापूर्वक मिलाइयो ।'''",
"revdelete-reasonotherlist": "और कारण",
"revdelete-edit-reasonlist": "मेट्ने कार्यहरु सम्पादन गर्ने",
"revdelete-offender": "संशोधन कर्ता:",
- "suppressionlog": "थà¥\8bà¤\95ाà¤\97रया लग",
- "mergehistory": "पाना इतिहासहरु मिसाउन्या",
- "mergehistory-box": "दà¥\81à¤\88 पानाहरà¥\81à¤\95à¥\8b पà¥\81नरावलà¥\8bà¤\95न à¤\9cà¥\8bड :",
+ "suppressionlog": "लà¥\81à¤\95ाà¤\89नà¥\8dया लग",
+ "mergehistory": "पानाका इतिहासहरू मिसाउन्या",
+ "mergehistory-box": "दà¥\81à¤\88 पानाहरà¥\82à¤\95à¥\8b पà¥\81नरावलà¥\8bà¤\95न à¤\9cà¥\8bडà¥\8dनà¥\8dया :",
"mergehistory-from": "स्रोत पाना:",
"mergehistory-into": "गन्तब्य पाना :",
- "mergehistory-list": "à¤\9cà¥\8bडडà¥\81 मिल्या इतिहास सम्पादन",
- "mergehistory-go": "à¤\9cà¥\8bडडà¥\81 मिलà¥\8dया समà¥\8dपादनहरà¥\81",
- "mergehistory-submit": "पà¥\81नरावलà¥\8bà¤\95हरà¥\81 जोड",
- "mergehistory-empty": "à¤\95à¥\8bà¤\87लà¥\88 पà¥\81नरावलà¥\8bà¤\95नहरà¥\81 à¤\9cà¥\8bडडà¥\81 मिलà¥\8dलà¥\8bनाà¤\87à¤\81 ।",
+ "mergehistory-list": "à¤\9cà¥\8bडà¥\8dड मिलà¥\8dन्या इतिहास सम्पादन",
+ "mergehistory-go": "à¤\9cà¥\8bडà¥\8dड मिलà¥\8dनà¥\8dया समà¥\8dपादनहरà¥\82",
+ "mergehistory-submit": "पà¥\81नरावलà¥\8bà¤\95हरà¥\82 जोड",
+ "mergehistory-empty": "à¤\95à¥\8bà¤\87लà¥\88 पà¥\81नरावलà¥\8bà¤\95नहरà¥\82 à¤\9cà¥\8bडà¥\8dड नाà¤\87à¤\81मिलà¥\8dलà¥\8b ।",
"mergehistory-success": "$3 {{PLURAL:$3|संस्करण|संस्करणहरु}} [[:$1]]बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
"mergehistory-autocomment": " [[:$1]] लाई [[:$2]] मी जोडियो",
"mergehistory-comment": " [[:$1]] लाई[[:$2]] मी जोडियो : $3",
"history-title": "\"$1\" को दोहरिया इतिहास",
"difference-title": "\"$1\" को बिचमी भिन्नता",
"difference-title-multipage": "\"$1\" तथा \"$2\" को बिचमी भिन्नता",
- "difference-multipage": "(पानाहरà¥\81मा भिन्नता)",
+ "difference-multipage": "(पानाहरà¥\82मà¥\80 भिन्नता)",
"lineno": "पंक्ति $1:",
"compareselectedversions": "छानिईया संस्करणहरू दाँज",
- "showhideselectedversions": "छानिईया पुनरावलोकनहरु धेखाउने/लुकाउन्या",
+ "showhideselectedversions": "छानिईयाका पुनरावलोकनहरू धेखाउने/लुकाउन्या",
"editundo": "रद्द गर्न्या",
"diff-empty": "(कोइ भिन्नता छैन)",
"searchresults": "खोज नतिजाहरू",
"searchresults-title": " \"$1\"को लागि खोज नतिजाहरु",
- "titlematches": "पाना शिरà¥\8dषà¤\95 मिलà¥\8dनछ",
- "textmatches": "पाना पाठमिलà¥\8dनछ",
- "notextmatches": "à¤\85à¤\95à¥\8dषरसà¥\8d पà¥\87à¤\9c भेटिएन",
+ "titlematches": "पाना शिरà¥\8dषà¤\95 मिलनà¥\8dछ",
+ "textmatches": "पाना पाठमिलनà¥\8dछ",
+ "notextmatches": "à¤\95à¥\81नà¥\88 पानामà¥\80 लà¥\88 यà¥\8b सामाà¤\97à¥\8dरà¥\80 भेटिएन",
"prevn": "पैल्लिको{{PLURAL:$1|$1}}",
"nextn": "अर्को {{PLURAL:$1|$1}}",
"prev-page": "अघिल्लो पाना",
"next-page": "अर्को पाना",
- "prevn-title": "पà¥\88लà¥\8dलिà¤\95à¥\8b $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\81}}",
- "nextn-title": "यà¥\87 पà¤\9bाà¤\95ा $1 {{PLURAL:$1|नतिà¤\9cा |नतिà¤\9cाहरà¥\81}}",
- "shown-title": "धà¥\87à¤\96ाà¤\89नà¥\87 $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\81}} प्रति पाना",
+ "prevn-title": "पà¥\88लà¥\8dलिà¤\95à¥\8b $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\82}}",
+ "nextn-title": "यà¥\88 पà¤\9bाà¤\95ा $1 {{PLURAL:$1|नतिà¤\9cा |नतिà¤\9cाहरà¥\82}}",
+ "shown-title": "धà¥\87à¤\96ाà¤\89नà¥\87 $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\82}} प्रति पाना",
"viewprevnext": "हेर ($1 {{int:pipe-separator}} $2) ($3)",
"searchmenu-exists": "''' \"[[:$1]]\" नाम गरया पाना ये विकीमी रह्या छ'''",
- "searchprofile-articles": "सामà¤\97à¥\8dरà¥\80 पानाहरà¥\81",
+ "searchprofile-articles": "सामà¤\97à¥\8dरà¥\80 पानाहरà¥\82",
"searchprofile-images": "मल्टिमिडिया(श्रव्य दृश्य)",
"searchprofile-everything": "सबै थोक",
"searchprofile-advanced": "उन्नत",
"searchprofile-everything-tooltip": "सबै सामग्री खोज्या (वार्तालाप लै )",
"searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्या",
"search-result-size": "$1 ({{PLURAL:$2|1 शव्द|$2 शव्दहरु}})",
- "search-result-category-size": "{{PLURAL:$1|à¤\8fà¤\95 सदसà¥\8dय|$1 सदसà¥\8dयहरà¥\81}} ({{PLURAL:$2|1 à¤\89पशà¥\8dरà¥\87णà¥\80|$2 à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\81}}, {{PLURAL:$3|à¤\8fà¤\89à¤\9fा फाà¤\87ल|$3 फाà¤\87लहरà¥\81}})",
+ "search-result-category-size": "{{PLURAL:$1|à¤\8fà¤\95 सदसà¥\8dय|$1 सदसà¥\8dयहरà¥\82}} ({{PLURAL:$2|1 à¤\89पशà¥\8dरà¥\87णà¥\80|$2 à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\82}}, {{PLURAL:$3|à¤\8fà¤\89à¤\9fा फाà¤\87ल|$3 फाà¤\87लहरà¥\82}})",
"search-redirect": "(जान्या $1)",
"search-section": "(खण्ड $1)",
"search-category": "(श्रेणी $1)",
"prefs-skin": "काँचुली",
"skin-preview": "पूर्वावलोकन",
"datedefault": "कोइ अभिरुचि नाइँथिन",
- "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शाला à¤\97à¥\81णहरà¥\81",
+ "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शाला à¤\97à¥\81णहरà¥\82",
"prefs-user-pages": "प्रयोगकर्ता पानाहरु",
"prefs-personal": "प्रयोगकर्ताको विवरण",
"prefs-rc": "नौला परिवर्तनहरू",
"prefs-rendering": "स्वरुप",
"saveprefs": "संग्रह",
"prefs-editing": "सम्पादन",
- "rows": "हरफहरà¥\81 :",
+ "rows": "हरफहरà¥\82 :",
"columns": "स्तम्भहरू :",
"searchresultshead": "खोज",
"stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
"stub-threshold-disabled": "निष्क्रिय",
- "recentchangesdays": "हालà¤\95à¥\8b परिवरà¥\8dतनमà¥\80 धà¥\87à¤\96ाà¤\89नà¥\87 दिनहरà¥\81:",
+ "recentchangesdays": "हालà¤\95à¥\8b परिवरà¥\8dतनमà¥\80 धà¥\87à¤\96ाà¤\89नà¥\87 दिनहरà¥\82:",
"recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिन|दिन}}",
"timezonelegend": "समय क्षेत्र :",
"localtime": "स्थानिय समय:",
"content-model-css": "CSS",
"content-json-empty-object": "Oggetto vuoto",
"content-json-empty-array": "Array vuoto",
+ "duplicate-args-warning": "<strong>Avvertenza:</strong> [[:$1]] è chiamata [[:$2]] con più di un valore per il parametro \"$3\". Solo l'ultimo valore fornito sarà utilizzati.",
"duplicate-args-category": "Pagine contenenti chiamate a template con parametri duplicati",
"duplicate-args-category-desc": "La pagina contiene chiamate a template che utilizzano argomenti duplicati, come ad esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.",
"uploaddisabledtext": "Il caricamento dei file non è attivo.",
"php-uploaddisabledtext": "Il caricamento di file tramite PHP è disabilitato. Controlla la configurazione di file_uploads.",
"uploadscripted": "Questo file contiene codice HTML o di script, che potrebbe essere interpretato erroneamente da un browser web.",
+ "uploaded-script-svg": "Trovato elemento di script \"$1\" nel file caricato in formato SVG.",
"uploaded-hostile-svg": "Trovato CSS non sicuro nell'elemento di stile del file in formato SVG caricato.",
"uploaded-image-filter-svg": "Trovato filtro immagine con URL: <code><$1 $2=\"$3\"></code> nel file in formato SVG caricato.",
"uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
"passwordreset-capture-help": "Wann De heh e Krüzje määß, kriß de di <i lang=\"en\">e-mail</i> met däm neue Paßwoot aanjezeish, ußer dat dä Metmaacher se och zohjescheck kritt.",
"passwordreset-email": "De Adräß för de <i lang=\"en\">e-mail</i>:",
"passwordreset-emailtitle": "Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}",
- "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
- "passwordreset-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nför Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
+ "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
+ "passwordreset-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nför Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
"passwordreset-emailelement": "Metmaacher Name: $1\nEijmohl-Paßwoot: $2",
"passwordreset-emailsent": "En <i lang=\"en\">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck.",
"passwordreset-emailsent-capture": "En <i lang=\"en\">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.",
"revdelete-edit-reasonlist": "De Jrönde för et Fottschmieße beärbeide",
"revdelete-offender": "Dä Väsion iere Schriever:",
"suppressionlog": "Et Logbohch fum Verschteiche",
- "suppressionlogtext": "Heh noh kütt et Logbohch fum Verschteiche, woh Versione fun Sigge, Zosammefassunge, Quelle, Metmaachername un Metmaacher-Sperre ze fenge sin, di fun de Oure vun de Öffentleschkeit, un och fun de Wiki-Köbesse verstoche woodte, udder widder zeröck op nommaal jebraat woodte.\nLoor en de [[Special:BlockList|{{int:ipblocklist}}]] öm ze sinn, wää un wat em Momang wie jesperrt es.",
+ "suppressionlogtext": "Heh noh kütt et Logbohch fum Verschteiche, woh Versione fun Sigge, Zosammefassunge, Quelle, Metmaachername un Metmaacher-Sperre ze fenge sin, di fun de Oure vun de Öffentleschkeit, un och fun de Wiki-Köbesse verstoche woodte, udder widder zeröck op nommahl jebraat woodte.\nLoor en de [[Special:BlockList|{{int:ipblocklist}}]] öm ze sinn, wää un wat em Momang wie jesperrt es.",
"mergehistory": "Versione fun Sigge zosamme schmiiße",
"mergehistory-header": "Met hee dä Sündersigge kanns Du de Versione fun en Urshprongssigg met de Versione fun en neuer Zielsigg zosamme läje. Donn drop aade, dat der Zosammehang fun dä Versione am Engk reschtesch es.",
"mergehistory-box": "Versione fun zwei Sigge zosamme läje",
"undelete-search-submit": "Söhke",
"undelete-no-results": "Mer han em Aschiif kei Sigg, wo dä Bejreff drop paß, womet De am Söke beß.",
"undelete-filename-mismatch": "Dä Dattei ier Version fun dä Zick $1 kunnte mer nit zeröck holle: Di Datteiname paßße nit zersamme.",
- "undelete-bad-store-key": "Dä Dattei ier Version fun dä Zick $1 kunnte mer nit zeröck holle: Di Datei wohr ald beim Fottschmieße ja nimmieh do.",
+ "undelete-bad-store-key": "Dä Dattei ier Väsjohn fun dä Zigg $1 kunnte mer nit zerök holle: Di Dattei wohr ald beim Fottschmihße ja nimmih do.",
"undelete-cleanup-error": "Fähler beim Fottschmieße vun de Archiv-Version „$1“, die nit jebruch wood.",
"undelete-missing-filearchive": "De Datei met dä Archiv-Nommer $1 künne mer nit zerök holle. Di ham_mer nit in de Datebangk. Künnt sinn, di es ald zeröckjehollt.",
"undelete-error": "Ene Fähler es opjetrodde beim Zerökholle",
"tooltip-watchlistedit-raw-submit": "Oppassliss neu fasshallde",
"tooltip-recreate": "En fottjeschmesse Sigg widder zeröckholle",
"tooltip-upload": "Mem Dattei-Huhlaade loßlääje",
- "tooltip-rollback": "Nemmp alle Änderonge zeröck, di dä Läzde jemaat hät, dä aan dä heh Sigg övverhoup jet jedonn hät. Deiht nimmieh frohre, un mähd automattesch ene Endraach onger „{{int:Summary}}“ en et Logbohch eren.",
+ "tooltip-rollback": "Nemmp alle Ännderonge zeröck, di dä Läzde jemaat hät, dä aan dä heh Sigg övverhoup jet jedonn hät. Deiht nimmih frohre, un mähd automattesch ene Endrahch onger „{{int:Summary}}“ en et Logbohch eren.",
"tooltip-undo": "„{{UCfirst:{{int:editundo}}}}“ määt der förije Zostand\nfun dä Sigg op, zom Beärbeide un widder Afspeichere.\nEsu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.",
"tooltip-preferences-save": "Ennschtällonge faßhallde",
"tooltip-summary": "Jif en koote Zesammefassung en",
"exif-photometricinterpretation-2": "RJB",
"exif-photometricinterpretation-6": "<i lang=\"en\">YCbCr</i>",
"exif-unknowndate": "Dattum onbikannt",
- "exif-orientation-1": "Nommaal",
+ "exif-orientation-1": "Nommahl",
"exif-orientation-2": "Op der Kopp jespeejelt",
"exif-orientation-3": "Op der Kopp jedrieht",
"exif-orientation-4": "Links-Räähß jespehjelt",
"exif-exposuremode-2": "Beleeshtungsreih",
"exif-whitebalance-0": "Automattesche Wiiß-Affjleich",
"exif-whitebalance-1": "Wieß-Affjleisch fun Hand jemaat",
- "exif-scenecapturetype-0": "Nomaal",
+ "exif-scenecapturetype-0": "Nommahl",
"exif-scenecapturetype-1": "Queerfommaat",
"exif-scenecapturetype-2": "Huhkant",
"exif-scenecapturetype-3": "Et Naakß",
"exif-gaincontrol-2": "Vill heller",
"exif-gaincontrol-3": "E beßje dungkeler",
"exif-gaincontrol-4": "Vill dungkeler",
- "exif-contrast-0": "Nomal",
+ "exif-contrast-0": "Nommahl",
"exif-contrast-1": "Weijsch",
"exif-contrast-2": "Hatt",
- "exif-saturation-0": "Nomal",
+ "exif-saturation-0": "Nommahl",
"exif-saturation-1": "Winnisch Sättejung",
"exif-saturation-2": "En hue Sättejung",
- "exif-sharpness-0": "Nomal",
+ "exif-sharpness-0": "Nommahl",
"exif-sharpness-1": "Nit esu scharf",
"exif-sharpness-2": "Scharf",
"exif-subjectdistancerange-0": "Onbikannt",
"exif-iimcategory-spo": "Shpocht",
"exif-iimcategory-war": "Kreesch, Zängk, Opshtänd",
"exif-iimcategory-wea": "Wädder",
- "exif-urgency-normal": "Nommaal ($1)",
+ "exif-urgency-normal": "Nommahl ($1)",
"exif-urgency-low": "Klein ($1)",
"exif-urgency-high": "Huh ($1)",
"exif-urgency-other": "Selfs faßjelaat ($1)",
"searchall": "sadayana",
"showingresults": "Di handap ieu némbongkeun {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimimitianku #'''$2'''.",
"showingresultsinrange": "Di handap dipidangkeun nepi ka {{PLURAL:$1|<strong>1</strong> hasil}} ti #<strong>$2</strong> nepi ka #<strong>$3</strong>.",
- "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> ti <strong>$3</strong>}}",
+ "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> ti <strong>$3</strong>|Hasil <strong>$1 - $2</strong> ti <strong>$3</strong>}}",
"search-nonefound": "Euweuh hasil nu cocog jeung kueri.",
"powersearch-legend": "Panéangan tuluy",
"powersearch-ns": "Téangan di ngaranspasi:",
"recentchanges-label-bot": "Ieu parobahan dijieun ku bot",
"recentchanges-label-unpatrolled": "Ieu éditan can karoris",
"recentchanges-legend-heading": "'''Pedaran:'''",
- "recentchanges-legend-newpage": "$1 - kaca anyar",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tempo ogé [[Special:NewPages|béréndélan kaca anyar]])",
"rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
"rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
"rcshowhideminor": "$1 éditan minor",
"sharedupload-desc-here": "Ieu berkas asalna ti $1 anu bisa jadi dipaké ku proyék séjén. \nPedaran ti [$2 kaca pedaranana] dipidangkeun di handap.",
"uploadnewversion-linktext": "ngamuatkeun vérsi anyar koropak ieu",
"shared-repo-from": "ti $1",
+ "upload-disallowed-here": "Anjeun teu bisa nimpah ieu berkas.",
"filerevert": "balikkeun $1",
"filerevert-legend": "Balikkeun gambar",
"filerevert-intro": "Anjeun keur mulangkeun '''[[Media:$1|$1]]''' ka [vérsi $4, $3, $2].",
"namespace": "Ngaranspasi:",
"invert": "Balikkeun pilihan",
"blanknamespace": "(Utama)",
- "contributions": "Kontribusi ti kontributor",
+ "contributions": "Kontribusi {{GENDER:$1|pamaké}}",
"contributions-title": "Sumbangan tulisan ti $1",
"mycontris": "Kontribusi",
"contribsub2": "Pikeun {{GENDER:$3|$1}} ($2)",
"tooltip-pt-mycontris": "Daptar tulisan Anjeun",
"tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib",
"tooltip-pt-logout": "Kaluar log",
+ "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log",
"tooltip-ca-talk": "Sawala ngeunaan eusi kaca",
"tooltip-ca-edit": "Anjeun bisa ngédit kaca ieu. Paké tombol pramidang méméh nyimpen.",
"tooltip-ca-addsection": "Jieun bahasan anyar",
"pageinfo-watchers": "Jumlah nu ngawaskeun",
"pageinfo-edits": "Jumlah éditan",
"pageinfo-authors": "Jumlah kontributor nu béda",
+ "pageinfo-toolboxlink": "Émbaran kaca",
"pageinfo-contentpage-yes": "Enya",
"pageinfo-protect-cascading-yes": "Enya",
"markaspatrolleddiff": "Tandaan salaku geus diriksa",
"watchlisttools-view": "Témbongkeun parobahan nu patali",
"watchlisttools-edit": "Témbongkeun sarta édit béréndélan awaskeuneun",
"watchlisttools-raw": "Robah béréndélan awaskeuneun",
+ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|obrolan]])",
"duplicate-defaultsort": "'''Awas''': Konci runtuyan asal \"$2\" ngalindih konci runtuyan asal \"$1\" anu saméméhna.",
"version": "Vérsi",
"version-extensions": "Éksténsi nu diinstal",
"external_image_whitelist": " #Antepkeun ieu baris sakumaha ayana<pre>\n#Paké fragmén éxprési régulér (ukur bagian anu aya di antara //) di handap\n#Ieu fragmén bakal dicocogkeun jeung URL gambar-gambar éksternal\n#Fragmén anu cocog bakal dipidangkeun minangka gambar, lamun henteu nu katémbong ukur tutumbuna #Baris nu dimimitian ku # bakal dianggap koméntar\n#Ieu teu ngabédakeun gedé leutikna aksara\n#Teundeun sakabéh fragmén éxprési régulér luhureun ieu baris. Antepkeun ieu baris sakumaha ayana</pre>",
"tag-filter": "Saringan [[Special:Tags|tag]]:",
"tag-filter-submit": "Saring",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
"tags-title": "Tag",
"tags-tag": "Ngaran tag",
"tags-edit": "édit",
"htmlform-submit": "Kirim",
"htmlform-reset": "Bolaykeun parobahan",
"htmlform-selectorother-other": "Lianna",
+ "logentry-delete-delete": "$1 {{GENDER:$2|ngahapus}} kaca $3",
"revdelete-restricted": "akses geus dibatesan ukur keur kuncén",
"revdelete-unrestricted": "Watesan akses kuncén dihapuskeun",
+ "logentry-newusers-create": "Akun pamaké $1 jeus {{GENDER:$2|dijieun}}",
"rightsnone": "(euweuh)",
"revdelete-summary": "ringkesan ngédit",
"feedback-cancel": "Bolay",
"revdelete-restricted": "satte begränsningar för administratörer",
"revdelete-unrestricted": "tog bort begränsningar för administratörer",
"logentry-block-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
- "logentry-block-unblock": "$1 {{GENDER:$2|upphävde blockeringen för}} {{GENDER:$4|$3}}",
+ "logentry-block-unblock": "$1 {{GENDER:$2|avblockerade}} {{GENDER:$4|$3}}",
"logentry-block-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
"logentry-suppress-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
"logentry-suppress-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
* @author Trevor Parscal
*/
+use MediaWiki\Logger\LoggerFactory;
+
// Bail on old versions of PHP, or if composer has not been run yet to install
// dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
require_once dirname( __FILE__ ) . '/includes/PHPVersionCheck.php';
// Respond to resource loading request.
// foo()->bar() syntax is not supported in PHP4, and this file needs to *parse* in PHP4.
$configFactory = ConfigFactory::getDefaultInstance();
-$resourceLoader = new ResourceLoader( $configFactory->makeConfig( 'main' ) );
+$resourceLoader = new ResourceLoader(
+ $configFactory->makeConfig( 'main' ),
+ LoggerFactory::getInstance( 'resourceloader' )
+);
$resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
Profiler::instance()->setTemplated( true );
// Used in the web installer. Test it after modifying this definition!
'mediawiki.skinning.interface' => array(
'position' => 'top',
- // Display wiki logo on .mw-wiki-logo elements.
'class' => 'ResourceLoaderSkinModule',
'styles' => array(
'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
),
),
- // Display wiki logo on .mw-wiki-logo elements.
- // This is also part of 'mediawiki.skinning.interface' module; the skin shouldn't load them both.
- 'mediawiki.skinning.logo' => array(
- 'position' => 'top',
- 'class' => 'ResourceLoaderSkinModule',
- ),
-
/* jQuery */
'jquery' => array(
// Whether the store is in use on this page.
enabled: null,
+ // Modules whose string representation exceeds 100 kB are ineligible
+ // for storage due to bug T66721.
+ MODULE_SIZE_MAX: 100000,
+
// The contents of the store, mapping '[module name]@[version]' keys
// to module implementations.
items: {},
* @param {Object} descriptor The module's descriptor as set in the registry
*/
set: function ( module, descriptor ) {
- var args, key;
+ var args, key, src;
if ( !mw.loader.store.enabled ) {
return false;
return;
}
- mw.loader.store.items[key] = 'mw.loader.implement(' + args.join( ',' ) + ');';
+ src = 'mw.loader.implement(' + args.join( ',' ) + ');';
+ if ( src.length > mw.loader.store.MODULE_SIZE_MAX ) {
+ return false;
+ }
+ mw.loader.store.items[key] = src;
mw.loader.store.update();
},
if ( mw.loader.store.getModuleKey( module ) !== key ) {
mw.loader.store.stats.expired++;
delete mw.loader.store.items[key];
+ } else if ( mw.loader.store.items[key].length > mw.loader.store.MODULE_SIZE_MAX ) {
+ // This value predates the enforcement of a size limit on cached modules.
+ delete mw.loader.store.items[key];
}
}
},
$region: $searchRegion
} );
- // If the form includes any fallback fulltext search buttons, remove them
- $searchInput.closest( 'form' ).find( '.mw-fallbackSearchButton' ).remove();
+ $searchInput.closest( 'form' )
+ // track the form submit event
+ .on( 'submit', function () {
+ var context = $searchInput.data( 'suggestionsContext' );
+ mw.track( 'mediawiki.searchSuggest', {
+ action: 'submit-form',
+ numberOfResults: context.config.suggestions.length
+ } );
+ } )
+ // If the form includes any fallback fulltext search buttons, remove them
+ .find( '.mw-fallbackSearchButton' ).remove();
} );
}( mediaWiki, jQuery ) );
static function setUp() {
global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
+ $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
$wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
$wgExtraInterlanguageLinkPrefixes, $wgLocalInterwikis,
$parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
$wgParserCacheType = CACHE_NONE;
}
- $wgEnableParserCache = false;
DeferredUpdates::clearPendingUpdates();
$wgMemc = wfGetMainCache(); // checks $wgMainCacheType
$messageMemc = wfGetMessageCacheStorage();
}
public function getScript( ResourceLoaderContext $context ) {
- return $this->script;
+ return $this->validateScriptFile( 'input', $this->script );
}
public function getStyles( ResourceLoaderContext $context ) {
'Third parameter overrides the HTTP/... header'
);
+ $this->response->statusHeader( 210 );
+ $this->assertEquals(
+ 210,
+ $this->response->getStatusCode(),
+ 'Handle statusHeader method'
+ );
+
$this->response->header( 'Location: http://localhost/', false, 206 );
$this->assertEquals(
206,
);
$tmpGlobals['wgForeignFileRepos'] = array();
$tmpGlobals['wgDefaultExternalStore'] = array();
- $tmpGlobals['wgEnableParserCache'] = false;
+ $tmpGlobals['wgParserCacheType'] = CACHE_NONE;
$tmpGlobals['wgCapitalLinks'] = true;
$tmpGlobals['wgNoFollowLinks'] = true;
$tmpGlobals['wgNoFollowDomainExceptions'] = array();
'Class is significant'
);
}
+
+ /**
+ * @covers ResourceLoaderModule::validateScriptFile
+ */
+ public function testValidateScriptFile() {
+ $context = $this->getResourceLoaderContext();
+
+ $module = new ResourceLoaderTestModule( array(
+ 'script' => "var a = 'this is';\n {\ninvalid"
+ ) );
+ $this->assertEquals(
+ $module->getScript( $context ),
+ 'mw.log.error("JavaScript parse error: Parse error: Unexpected token; token } expected in file \'input\' on line 3");',
+ 'Replace invalid syntax with error logging'
+ );
+
+ $module = new ResourceLoaderTestModule( array(
+ 'script' => "\n'valid';"
+ ) );
+ $this->assertEquals(
+ $module->getScript( $context ),
+ "\n'valid';",
+ 'Leave valid scripts as-is'
+ );
+ }
}
array( array(), 'test1', true ),
// 'site' module with a non-empty page
array(
- array(
- 'MediaWiki:Common.js' => array(
- 'timestamp' => 123456789,
- 'length' => 1234
- )
- ), 'site', false,
+ array( 'MediaWiki:Common.js' => array( 'rev_sha1' => 'dmh6qn', 'rev_len' => 1234 ) ),
+ 'site',
+ false,
),
// 'site' module with an empty page
array(
- array(
- 'MediaWiki:Monobook.js' => array(
- 'timestamp' => 987654321,
- 'length' => 0,
- ),
- ), 'site', false,
+ array( 'MediaWiki:Foo.js' => array( 'rev_sha1' => 'phoi', 'rev_len' => 0 ) ),
+ 'site',
+ false,
),
// 'user' module with a non-empty page
array(
- array(
- 'User:FooBar/common.js' => array(
- 'timestamp' => 246813579,
- 'length' => 25,
- ),
- ), 'user', false,
+ array( 'User:Example/common.js' => array( 'rev_sha1' => 'j7ssba', 'rev_len' => 25 ) ),
+ 'user',
+ false,
),
// 'user' module with an empty page
array(
- array(
- 'User:FooBar/monobook.js' => array(
- 'timestamp' => 1357924680,
- 'length' => 0,
- ),
- ), 'user', true,
+ array( 'User:Example/foo.js' => array( 'rev_sha1' => 'phoi', 'rev_len' => 0 ) ),
+ 'user',
+ true,
),
);
}
protected function setUp() {
global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgUser,
$wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
- $wgEnableParserCache, $wgNamespaceAliases, $wgNamespaceProtection,
+ $wgParserCacheType, $wgNamespaceAliases, $wgNamespaceProtection,
$parserMemc;
$tmpGlobals = array();
$wgNamespaceAliases['Image'] = NS_FILE;
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
- $wgEnableParserCache = false;
+ $wgParserCacheType = CACHE_NONE;
DeferredUpdates::clearPendingUpdates();
$wgMemc = wfGetMainCache();
$messageMemc = wfGetMessageCacheStorage();
if ( $redirectedLocation ) {
// File has been moved. Give redirect.
$response = RequestContext::getMain()->getRequest()->response();
- $response->header( "HTTP/1.1 302 " . HttpStatus::getMessage( 302 ) );
+ $response->statusHeader( 302 );
$response->header( 'Location: ' . $redirectedLocation );
$response->header( 'Expires: ' .
gmdate( 'D, d M Y H:i:s', time() + 12 * 3600 ) . ' GMT' );
$imsUnix = strtotime( $imsString );
wfRestoreWarnings();
if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
- header( 'HTTP/1.1 304 Not Modified' );
+ HttpStatus::header( 304 );
return;
}
}
} elseif ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName2 ) ) {
// Request for the "long" thumbnail name; redirect to canonical name
$response = RequestContext::getMain()->getRequest()->response();
- $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+ $response->statusHeader( 301 );
$response->header( 'Location: ' .
wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
$response->header( 'Expires: ' .
header( 'Cache-Control: no-cache' );
header( 'Content-Type: text/html; charset=utf-8' );
if ( $status == 400 ) {
- header( 'HTTP/1.1 400 Bad request' );
+ HttpStatus::header( 400 );
} elseif ( $status == 404 ) {
- header( 'HTTP/1.1 404 Not found' );
+ HttpStatus::header( 404 );
} elseif ( $status == 403 ) {
- header( 'HTTP/1.1 403 Forbidden' );
+ HttpStatus::header( 403 );
header( 'Vary: Cookie' );
} else {
- header( 'HTTP/1.1 500 Internal server error' );
+ HttpStatus::header( 500 );
}
if ( $wgShowHostnames ) {
header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );