* Removed deprecated $wgDisabledActions as it is hardly used anywhere.
* $wgRateLimitLog has been deprecated and replaced by
$wgDebugLogGroup['ratelimit'].
+* $wgLocalInterwikis is an array containing multiple local interwiki prefixes
+ (interwiki prefixes that point back to the current wiki). This effectively
+ allows more than one value of $wgLocalInterwiki to be specified and
+ understood by the parser. The value of $wgLocalInterwiki is automatically
+ prepended to the start of this array.
=== New features in 1.23 ===
* ResourceLoader can utilize the Web Storage API to cache modules client-side.
creations, similar to the topOnly option.
* Add mediawiki.ui.button styling to all pages so wiki content can use styled
buttons.
+* Special:UserLogin/signup now does AJAX checks for invalid and taken usernames,
+ displaying the error live.
+* Added BaseTemplateAfterPortlet hook to allow injecting html after portlets in skins.
=== Bug fixes in 1.23 ===
* (bug 41759) The "updated since last visit" markers (on history pages, recent
* (bug 26811) When a DBUnexpectedError occurs, DB server hostnames are now
hidden unless $wgShowExceptionDetails is true, and $wgShowDBErrorBacktrace
no longer applies in such cases.
+* (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
+ warnings to be printed on Windows due to large path length.
=== Web API changes in 1.23 ===
* (bug 54884) action=parse&prop=categories now indicates hidden and missing
table.mw-prefixindex-list-table to avoid duplicate ids when the special page
is transcluded.
* (bug 62198) window.$j has been deprecated.
+* Preference "Disable link title conversion" was removed.
+* SpecialRecentChanges no longer includes any functionality for generating feeds
+ - it has been factored out to ApiFeedRecentChanges. Old URLs redirect to new
+ ones.
+* RecentChange::mExtra['lang'] is no longer set and should no longer be used.
+ Extensions should read from other configuration variables, including
+ $wgLocalInterwikis, to identify the current wiki.
+* Sections in the parser test framework have been renamed and the old
+ section names are deprecated. Please use "!!wikitext" and "!!html"
+ (or "!!html/php") instead of "!!input" and "!!result". This allows
+ us to extend parser tests to accommodate additional input/output
+ pairs, such as "!!html/parsoid" (for the output of the Parsoid
+ parser, where it differs from the PHP parser).
==== Removed classes ====
* FakeMemCachedClient (deprecated in 1.18)
$processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
// Last chance hook before executing the API
-wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
+try {
+ wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
+ if ( !$processor instanceof ApiMain ) {
+ throw new MWException( 'ApiBeforMain hook set $processor to a non-ApiMain class' );
+ }
+} catch ( Exception $e ) {
+ // Crap. Try to report the exception in API format to be friendly to clients.
+ ApiMain::handleApiBeforeMainException( $e );
+ $processor = false;
+}
// Process data & print results
-$processor->execute();
+if ( $processor ) {
+ $processor->execute();
+}
if ( function_exists( 'fastcgi_finish_request' ) ) {
fastcgi_finish_request();
$_SERVER['HTTP_USER_AGENT']
);
$items[] = $wgRequest->wasPosted() ? 'POST' : 'GET';
- $module = $processor->getModule();
- if ( $module->mustBePosted() ) {
- $items[] = "action=" . $wgRequest->getVal( 'action' );
+ if ( $processor ) {
+ $module = $processor->getModule();
+ if ( $module->mustBePosted() ) {
+ $items[] = "action=" . $wgRequest->getVal( 'action' );
+ } else {
+ $items[] = wfArrayToCgi( $wgRequest->getValues() );
+ }
} else {
- $items[] = wfArrayToCgi( $wgRequest->getValues() );
+ $items[] = "failed in ApiBeforeMain";
}
wfErrorLog( implode( ',', $items ) . "\n", $wgAPIRequestLog );
wfDebug( "Logged API request to $wgAPIRequestLog\n" );
$name: Image name being checked
&$bad: Whether or not the image is "bad"
+'BaseTemplateAfterPortlet': After output of portlets, allow injecting
+custom HTML after the section. Any uses of the hook need to handle escaping.
+$template BaseTemplate
+$portlet: string portlet name
+&$html: string
+
'BeforeDisplayNoArticleText': Before displaying message key "noarticletext" or
"noarticletext-nopermission" at Article::showMissingArticle().
$article: article object
$isWatch: (No longer used)
$section: (No longer used)
$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
+$revision: New Revision of the article (can be null for edits that change nothing)
$status: Status object about to be returned by doEditContent()
$baseRevId: the rev ID (or false) this edit was based on
return "custom: var1 is $var1, var2 is $var2";
}
-Note: the 'ParserFirstCallInit' hook is only aviable since 1.12. To work with
+Note: the 'ParserFirstCallInit' hook is only available since 1.12. To work with
an older version, you'll need to use an extension function.
Online documentation (contains more informations):
Magic words: https://www.mediawiki.org/wiki/Manual:Magic_words
Variables: https://www.mediawiki.org/wiki/Manual:Variable
-Parser functions: https://www.mediawiki.org/wiki/Manual:Parser_functions
\ No newline at end of file
+Parser functions: https://www.mediawiki.org/wiki/Manual:Parser_functions
/**
* Image authorisation script
*
- * To use this, see http://www.mediawiki.org/wiki/Manual:Image_Authorization
+ * To use this, see https://www.mediawiki.org/wiki/Manual:Image_Authorization
*
* - Set $wgUploadDirectory to a non-public directory (not web accessible)
* - Set $wgUploadPath to point to this file
if ( strpos( $path, $prefix ) === 0 ) {
$be = FileBackendGroup::singleton()->backendFromPath( $storageDir );
$filename = $storageDir . substr( $path, strlen( $prefix ) ); // strip prefix
- // Check basic user authorization
- if ( !RequestContext::getMain()->getUser()->isAllowed( 'read' ) ) {
- wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $path );
- return;
- }
+ // Check basic user authorization
+ if ( !RequestContext::getMain()->getUser()->isAllowed( 'read' ) ) {
+ wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $path );
+ return;
+ }
if ( $be->fileExists( array( 'src' => $filename ) ) ) {
wfDebugLog( 'img_auth', "Streaming `" . $filename . "`." );
$be->streamFile( array( 'src' => $filename ),
$fname = 'AjaxResponse::checkLastModified';
if ( !$timestamp || $timestamp == '19700101000000' ) {
- wfDebug( "$fname: CACHE DISABLED, NO TIMESTAMP\n" );
+ wfDebug( "$fname: CACHE DISABLED, NO TIMESTAMP\n", 'log' );
return false;
}
* Authentication plugin interface
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
'HTMLFloatField' => 'includes/htmlform/HTMLFloatField.php',
'HTMLForm' => 'includes/htmlform/HTMLForm.php',
'HTMLFormField' => 'includes/htmlform/HTMLFormField.php',
- 'HTMLFormFieldRequiredOptionsException' => 'includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
+ 'HTMLFormFieldRequiredOptionsException' =>
+ 'includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
'HTMLHiddenField' => 'includes/htmlform/HTMLHiddenField.php',
'HTMLInfoField' => 'includes/htmlform/HTMLInfoField.php',
'HTMLIntField' => 'includes/htmlform/HTMLIntField.php',
'ApiEmailUser' => 'includes/api/ApiEmailUser.php',
'ApiExpandTemplates' => 'includes/api/ApiExpandTemplates.php',
'ApiFeedContributions' => 'includes/api/ApiFeedContributions.php',
+ 'ApiFeedRecentChanges' => 'includes/api/ApiFeedRecentChanges.php',
'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php',
'ApiFileRevert' => 'includes/api/ApiFileRevert.php',
'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php',
'OldChangesList' => 'includes/changes/OldChangesList.php',
'RCCacheEntry' => 'includes/changes/RCCacheEntry.php',
+ 'RCCacheEntryFactory' => 'includes/changes/RCCacheEntryFactory.php',
'RecentChange' => 'includes/changes/RecentChange.php',
# includes/clientpool
'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
# includes/job
- 'IJobSpecification' => 'includes/job/JobSpecification.php',
- 'Job' => 'includes/job/Job.php',
- 'JobQueue' => 'includes/job/JobQueue.php',
- 'JobQueueAggregator' => 'includes/job/aggregator/JobQueueAggregator.php',
- 'JobQueueAggregatorMemc' => 'includes/job/aggregator/JobQueueAggregatorMemc.php',
- 'JobQueueAggregatorRedis' => 'includes/job/aggregator/JobQueueAggregatorRedis.php',
- 'JobQueueDB' => 'includes/job/JobQueueDB.php',
- 'JobQueueConnectionError' => 'includes/job/JobQueue.php',
- 'JobQueueError' => 'includes/job/JobQueue.php',
- 'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
- 'JobQueueFederated' => 'includes/job/JobQueueFederated.php',
- 'JobQueueRedis' => 'includes/job/JobQueueRedis.php',
- 'JobSpecification' => 'includes/job/JobSpecification.php',
-
- # includes/job/jobs
- 'DoubleRedirectJob' => 'includes/job/jobs/DoubleRedirectJob.php',
- 'DuplicateJob' => 'includes/job/jobs/DuplicateJob.php',
- 'EmaillingJob' => 'includes/job/jobs/EmaillingJob.php',
- 'EnotifNotifyJob' => 'includes/job/jobs/EnotifNotifyJob.php',
- 'HTMLCacheUpdateJob' => 'includes/job/jobs/HTMLCacheUpdateJob.php',
- 'NullJob' => 'includes/job/jobs/NullJob.php',
- 'RefreshLinksJob' => 'includes/job/jobs/RefreshLinksJob.php',
- 'RefreshLinksJob2' => 'includes/job/jobs/RefreshLinksJob2.php',
- 'UploadFromUrlJob' => 'includes/job/jobs/UploadFromUrlJob.php',
- 'AssembleUploadChunksJob' => 'includes/job/jobs/AssembleUploadChunksJob.php',
- 'PublishStashedFileJob' => 'includes/job/jobs/PublishStashedFileJob.php',
-
- # includes/job/utils
- 'BacklinkJobUtils' => 'includes/job/utils/BacklinkJobUtils.php',
+ 'IJobSpecification' => 'includes/jobqueue/JobSpecification.php',
+ 'Job' => 'includes/jobqueue/Job.php',
+ 'JobQueue' => 'includes/jobqueue/JobQueue.php',
+ 'JobQueueAggregator' => 'includes/jobqueue/aggregator/JobQueueAggregator.php',
+ 'JobQueueAggregatorMemc' => 'includes/jobqueue/aggregator/JobQueueAggregatorMemc.php',
+ 'JobQueueAggregatorRedis' => 'includes/jobqueue/aggregator/JobQueueAggregatorRedis.php',
+ 'JobQueueDB' => 'includes/jobqueue/JobQueueDB.php',
+ 'JobQueueConnectionError' => 'includes/jobqueue/JobQueue.php',
+ 'JobQueueError' => 'includes/jobqueue/JobQueue.php',
+ 'JobQueueGroup' => 'includes/jobqueue/JobQueueGroup.php',
+ 'JobQueueFederated' => 'includes/jobqueue/JobQueueFederated.php',
+ 'JobQueueRedis' => 'includes/jobqueue/JobQueueRedis.php',
+ 'JobSpecification' => 'includes/jobqueue/JobSpecification.php',
+
+ # includes/jobqueue/jobs
+ 'DoubleRedirectJob' => 'includes/jobqueue/jobs/DoubleRedirectJob.php',
+ 'DuplicateJob' => 'includes/jobqueue/jobs/DuplicateJob.php',
+ 'EmaillingJob' => 'includes/jobqueue/jobs/EmaillingJob.php',
+ 'EnotifNotifyJob' => 'includes/jobqueue/jobs/EnotifNotifyJob.php',
+ 'HTMLCacheUpdateJob' => 'includes/jobqueue/jobs/HTMLCacheUpdateJob.php',
+ 'NullJob' => 'includes/jobqueue/jobs/NullJob.php',
+ 'RefreshLinksJob' => 'includes/jobqueue/jobs/RefreshLinksJob.php',
+ 'RefreshLinksJob2' => 'includes/jobqueue/jobs/RefreshLinksJob2.php',
+ 'UploadFromUrlJob' => 'includes/jobqueue/jobs/UploadFromUrlJob.php',
+ 'AssembleUploadChunksJob' => 'includes/jobqueue/jobs/AssembleUploadChunksJob.php',
+ 'PublishStashedFileJob' => 'includes/jobqueue/jobs/PublishStashedFileJob.php',
+
+ # includes/jobqueue/utils
+ 'BacklinkJobUtils' => 'includes/jobqueue/utils/BacklinkJobUtils.php',
# includes/json
'FormatJson' => 'includes/json/FormatJson.php',
}
if ( isset( self::$autoloadLocalClassesLower[$lowerClass] ) ) {
- if ( function_exists( 'wfDebug' ) ) {
- wfDebug( "Class {$className} was loaded using incorrect case.\n" );
+ if ( function_exists( 'wfDebugLog' ) ) {
+ wfDebugLog( 'autoloader', "Class {$className} was loaded using incorrect case" );
}
$filename = self::$autoloadLocalClassesLower[$lowerClass];
}
}
if ( !$filename ) {
- if ( function_exists( 'wfDebug' ) ) {
+ if ( function_exists( 'wfDebugLog' ) ) {
# FIXME: This is not very polite. Assume we do not manage the class.
- wfDebug( "Class {$className} not found; skipped loading\n" );
+ wfDebugLog( 'autoloader', "Class {$className} not found; skipped loading" );
}
# Give up
'cachedspecial-viewing-cached-ttl',
$context->getLanguage()->formatDuration( $this->cacheExpiry )
)->escaped();
- }
- else {
+ } else {
$message = $context->msg(
'cachedspecial-viewing-cached-ts'
)->escaped();
if ( !is_integer( $itemKey ) ) {
wfWarn( "Attempted to get item with non-numeric key while the next item in the queue has a key ($itemKey) in " . __METHOD__ );
- }
- elseif ( is_null( $itemKey ) ) {
+ } elseif ( is_null( $itemKey ) ) {
wfWarn( "Attempted to get an item while the queue is empty in " . __METHOD__ );
- }
- else {
+ } else {
$value = array_shift( $this->cachedChunks );
}
- }
- else {
+ } else {
if ( array_key_exists( $key, $this->cachedChunks ) ) {
$value = $this->cachedChunks[$key];
unset( $this->cachedChunks[$key] );
- }
- else {
+ } else {
wfWarn( "There is no item with key '$key' in this->cachedChunks in " . __METHOD__ );
}
}
- }
- else {
+ } else {
if ( !is_array( $args ) ) {
$args = array( $args );
}
if ( $this->cacheEnabled ) {
if ( is_null( $key ) ) {
$this->cachedChunks[] = $value;
- }
- else {
+ } else {
$this->cachedChunks[$key] = $value;
}
}
return $cat;
}
- /** @return mixed DB key name, or false on failure */
+ /**
+ * @return mixed DB key name, or false on failure
+ */
public function getName() {
return $this->getX( 'mName' );
}
- /** @return mixed Category ID, or false on failure */
+ /**
+ * @return mixed Category ID, or false on failure
+ */
public function getID() {
return $this->getX( 'mID' );
}
- /** @return mixed Total number of member pages, or false on failure */
+ /**
+ * @return mixed Total number of member pages, or false on failure
+ */
public function getPageCount() {
return $this->getX( 'mPages' );
}
- /** @return mixed Number of subcategories, or false on failure */
+ /**
+ * @return mixed Number of subcategories, or false on failure
+ */
public function getSubcatCount() {
return $this->getX( 'mSubcats' );
}
- /** @return mixed Number of member files, or false on failure */
+ /**
+ * @return mixed Number of member files, or false on failure
+ */
public function getFileCount() {
return $this->getX( 'mFiles' );
}
/**
* Generates feed's content
*
- * @param $feed ChannelFeed subclass object (generally the one returned by getFeedObject())
- * @param $rows ResultWrapper object with rows in recentchanges table
- * @param $lastmod Integer: timestamp of the last item in the recentchanges table (only used for the cache key)
- * @param $opts FormOptions as in SpecialRecentChanges::getDefaultOptions()
+ * @param ChannelFeed $feed ChannelFeed subclass object (generally the one returned
+ * by getFeedObject())
+ * @param ResultWrapper $rows ResultWrapper object with rows in recentchanges table
+ * @param int $lastmod Timestamp of the last item in the recentchanges table (only
+ * used for the cache key)
+ * @param FormOptions $opts As in SpecialRecentChanges::getDefaultOptions()
* @return null|bool True or null
*/
public function execute( $feed, $rows, $lastmod, $opts ) {
}
/**
- * Generate the feed items given a row from the database.
+ * Generate the feed items given a row from the database, printing the feed.
* @param $rows DatabaseBase resource with recentchanges rows
* @param $feed Feed object
*/
public static function generateFeed( $rows, &$feed ) {
wfProfileIn( __METHOD__ );
-
+ $items = self::buildItems( $rows );
$feed->outHeader();
+ foreach ( $items as $item ) {
+ $feed->outItem( $item );
+ }
+ $feed->outFooter();
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Generate the feed items given a row from the database.
+ * @param $rows DatabaseBase resource with recentchanges rows
+ */
+ public static function buildItems( $rows ) {
+ wfProfileIn( __METHOD__ );
+ $items = array();
# Merge adjacent edits by one user
$sorted = array();
foreach ( $sorted as $obj ) {
$title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
- $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullURL() : '';
+ $talkpage = MWNamespace::canTalk( $obj->rc_namespace )
+ ? $title->getTalkPage()->getFullURL()
+ : '';
+
// Skip items with deleted content (avoids partially complete/inconsistent output)
if ( $obj->rc_deleted ) {
continue;
$url = $title->getFullURL();
}
- $item = new FeedItem(
+ $items[] = new FeedItem(
$title->getPrefixedText(),
FeedUtils::formatDiff( $obj ),
$url,
? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
$talkpage
);
- $feed->outItem( $item );
}
- $feed->outFooter();
+
wfProfileOut( __METHOD__ );
+ return $items;
}
-
}
* performed in LocalSettings.php.
*
* Documentation is in the source and on:
- * http://www.mediawiki.org/wiki/Manual:Configuration_settings
+ * https://www.mediawiki.org/wiki/Manual:Configuration_settings
*
* @warning Note: this (and other things) will break if the autoloader is not
* enabled. Please include includes/AutoLoader.php before including this file.
* although they are referred to as Squid settings for historical reasons.
*
* Achieving a high hit ratio with an HTTP proxy requires special
- * configuration. See http://www.mediawiki.org/wiki/Manual:Squid_caching for
+ * configuration. See https://www.mediawiki.org/wiki/Manual:Squid_caching for
* more details.
*
* @{
/**
* Enable/disable Squid.
- * See http://www.mediawiki.org/wiki/Manual:Squid_caching
+ * See https://www.mediawiki.org/wiki/Manual:Squid_caching
*/
$wgUseSquid = false;
/**
* The interwiki prefix of the current wiki, or false if it doesn't have one.
+ *
+ * @deprecated since 1.23; use $wgLocalInterwikis instead
*/
$wgLocalInterwiki = false;
+/**
+ * Array for multiple $wgLocalInterwiki values, in case there are several
+ * interwiki prefixes that point to the current wiki. If $wgLocalInterwiki is
+ * set, its value is prepended to this array, for backwards compatibility.
+ *
+ * Note, recent changes feeds use only the first entry in this array (or
+ * $wgLocalInterwiki, if it is set). See $wgRCFeeds
+ */
+$wgLocalInterwikis = array();
+
/**
* Expiry time for cache of interwiki table
*/
* if $wgUseCommaCount is false, it will be 'link', if it is true
* it will be 'comma'
*
- * See also See http://www.mediawiki.org/wiki/Manual:Article_count
+ * See also See https://www.mediawiki.org/wiki/Manual:Article_count
*
* Retroactively changing this variable will not affect the existing count,
* to update it, you will need to run the maintenance/updateArticleCount.php
'minordefault' => 0,
'newpageshidepatrolled' => 0,
'nickname' => '',
- 'noconvertlink' => 0,
'norollbackdiff' => 0,
'numberheadings' => 0,
'previewonfirst' => 0,
*
* @note Also that this will only protect _pages in the wiki_. Uploaded files
* will remain readable. You can use img_auth.php to protect uploaded files,
- * see http://www.mediawiki.org/wiki/Manual:Image_Authorization
+ * see https://www.mediawiki.org/wiki/Manual:Image_Authorization
*/
$wgWhitelistRead = false;
*/
/**
- * Filename for debug logging. See http://www.mediawiki.org/wiki/How_to_debug
+ * Filename for debug logging. See https://www.mediawiki.org/wiki/How_to_debug
* The debug log file should be not be publicly accessible if it is used, as it
* may contain private data.
*/
*
* Something like this:
* $wgParserTestRemote = array(
- * 'api-url' => 'http://www.mediawiki.org/w/api.php',
+ * 'api-url' => 'https://www.mediawiki.org/w/api.php',
* 'repo' => 'MediaWiki',
* 'suite' => 'ParserTests',
* 'path' => '/trunk/phase3', // not used client-side; for reference
$wgRC2UDPPrefix = '';
/**
- * If this is set to true, $wgLocalInterwiki will be prepended to links in the
- * IRC feed. If this is set to a string, that string will be used as the prefix.
+ * If this is set to true, the first entry in the $wgLocalInterwikis array (or
+ * the value of $wgLocalInterwiki, if set) will be prepended to links in the IRC
+ * feed. If this is set to a string, that string will be used as the prefix.
*
* @deprecated since 1.22, use $wgRCFeeds
*/
* * 'omit_bots' -- whether the bot edits should be in the feed
* The IRC-specific options are:
* * 'add_interwiki_prefix' -- whether the titles should be prefixed with
- * $wgLocalInterwiki.
+ * the first entry in the $wgLocalInterwikis array (or the value of
+ * $wgLocalInterwiki, if set)
* The JSON-specific options are:
* * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
*
- * To ensure backwards-compatability, whenever $wgRC2UDPAddress is set, a
+ * To ensure backwards-compatibility, whenever $wgRC2UDPAddress is set, a
* 'default' feed will be created reusing the deprecated $wgRC2UDP* variables.
*
* @example $wgRCFeeds['example'] = array(
* Enable the MediaWiki API for convenient access to
* machine-readable data via api.php
*
- * See http://www.mediawiki.org/wiki/API
+ * See https://www.mediawiki.org/wiki/API
*/
$wgEnableAPI = true;
$this->sectiontitle = $request->getVal( 'preloadtitle' );
// Once wpSummary isn't being use for setting section titles, we should delete this.
$this->summary = $request->getVal( 'preloadtitle' );
- }
- elseif ( $this->section != 'new' && $request->getVal( 'summary' ) ) {
+ } elseif ( $this->section != 'new' && $request->getVal( 'summary' ) ) {
$this->summary = $request->getText( 'summary' );
if ( $this->summary !== '' ) {
$this->hasPresetSummary = true;
* Base classes for dumps and export
*
* Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Available feeds are defined in Defines.php
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* @see http://php.net/manual/en/class.arrayaccess.php
*/
/* @{ */
- /** Whether the option exists. */
+ /**
+ * Whether the option exists.
+ * @return bool
+ */
public function offsetExists( $name ) {
return isset( $this->options[$name] );
}
- /** Retrieve an option value. */
+ /**
+ * Retrieve an option value.
+ * @return mixed
+ */
public function offsetGet( $name ) {
return $this->getValue( $name );
}
- /** Set an option to given value. */
+ /**
+ * Set an option to given value.
+ */
public function offsetSet( $name, $value ) {
$this->setValue( $name, $value );
}
- /** Delete the option. */
+ /**
+ * Delete the option.
+ */
public function offsetUnset( $name ) {
$this->delete( $name );
}
* @return string The HEAD
*/
public function getHead() {
- $HEADfile = "{$this->basedir}/HEAD";
+ $headFile = "{$this->basedir}/HEAD";
- if ( !is_readable( $HEADfile ) ) {
+ if ( !is_readable( $headFile ) ) {
return false;
}
- $HEAD = file_get_contents( $HEADfile );
+ $head = file_get_contents( $headFile );
- if ( preg_match( "/ref: (.*)/", $HEAD, $m ) ) {
+ if ( preg_match( "/ref: (.*)/", $head, $m ) ) {
return rtrim( $m[1] );
} else {
- return rtrim( $HEAD );
+ return rtrim( $head );
}
}
* @return string A SHA1 or false
*/
public function getHeadSHA1() {
- $HEAD = $this->getHead();
+ $head = $this->getHead();
// If detached HEAD may be a SHA1
- if ( self::isSHA1( $HEAD ) ) {
- return $HEAD;
+ if ( self::isSHA1( $head ) ) {
+ return $head;
}
// If not a SHA1 it may be a ref:
- $REFfile = "{$this->basedir}/{$HEAD}";
- if ( !is_readable( $REFfile ) ) {
+ $refFile = "{$this->basedir}/{$head}";
+ if ( !is_readable( $refFile ) ) {
return false;
}
- $sha1 = rtrim( file_get_contents( $REFfile ) );
+ $sha1 = rtrim( file_get_contents( $refFile ) );
return $sha1;
}
* @return string The branch name, HEAD, or false
*/
public function getCurrentBranch() {
- $HEAD = $this->getHead();
- if ( $HEAD && preg_match( "#^refs/heads/(.*)$#", $HEAD, $m ) ) {
+ $head = $this->getHead();
+ if ( $head && preg_match( "#^refs/heads/(.*)$#", $head, $m ) ) {
return $m[1];
} else {
- return $HEAD;
+ return $head;
}
}
public $mMaxSize = 10000000;
public $mMaxCount = 100;
- /** Constructor */
+ /**
+ * Constructor
+ */
public function __construct() {
if ( !function_exists( 'gzdeflate' ) ) {
throw new MWException( "Need zlib support to read or write this kind of history object (ConcatenatedGzipHistoryBlob)\n" );
}
return self::element( 'textarea', $attribs, $spacedValue );
}
+
/**
* Build a drop-down box for selecting a namespace
*
* MediaWiki page data importer.
*
* Copyright © 2003,2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
// trust the file extension
$mime = $this->guessTypesForExtension( $ext );
}
- }
- elseif ( $mime === 'application/x-opc+zip' ) {
+ } elseif ( $mime === 'application/x-opc+zip' ) {
if ( $this->isMatchingExtension( $ext, $mime ) ) {
// A known file extension for an OPC file,
// find the proper mime type for that file extension
return false;
}
if ( !$wgCachePages ) {
- wfDebug( __METHOD__ . ": CACHE DISABLED\n", 'log' );
+ wfDebug( __METHOD__ . ": CACHE DISABLED\n" );
return false;
}
</p>
<p>
If for some reason you are unable to upgrade your PHP version, you will need to
- <a href="http://www.mediawiki.org/wiki/Download">download</a> an older version
+ <a href="https://www.mediawiki.org/wiki/Download">download</a> an older version
of MediaWiki from our website. See our
- <a href="http://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
+ <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
for details of which versions are compatible with prior versions of PHP.
</p>
</div>
function setOffset( $offset ) {
$this->mOffset = $offset;
}
+
/**
* Set the limit from an other source than the request
*
*/
static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
global $wgAuth, $wgContLang, $wgParser, $wgCookieExpiration, $wgLanguageCode,
- $wgDisableTitleConversion, $wgDisableLangConversion, $wgMaxSigChars,
+ $wgDisableLangConversion, $wgMaxSigChars,
$wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
$wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress,
$wgSecureLogin;
'section' => 'personal/i18n',
'help-message' => 'prefs-help-variant',
);
-
- if ( !$wgDisableTitleConversion ) {
- $defaultPreferences['noconvertlink'] = array(
- 'type' => 'toggle',
- 'section' => 'personal/i18n',
- 'label-message' => 'tog-noconvertlink',
- );
- }
} else {
$defaultPreferences["variant-$langCode"] = array(
'type' => 'api',
* Page protection
*
* Copyright © 2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* HTML sanitizer for %MediaWiki.
*
* Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
# Remove the comment, leading and trailing
# spaces, and leave only one newline.
$text = substr_replace( $text, "\n", $spaceStart, $spaceLen + 1 );
- }
- else {
+ } else {
# Remove just the comment.
$text = substr_replace( $text, '', $start, $end - $start );
}
array( 'Sanitizer', 'normalizeCharReferencesCallback' ),
$text );
}
+
/**
* @param string $matches
* @return string
$rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
$rfc1034_ldh_str = "a-z0-9\\-";
- $HTML5_email_regexp = "/
+ $html5_email_regexp = "/
^ # start of string
[$rfc5322_atext\\.]+ # user part which is liberal :p
@ # 'apostrophe'
$ # End of string
/ix"; // case Insensitive, eXtended
- return (bool)preg_match( $HTML5_email_regexp, $addr );
+ return (bool)preg_match( $html5_email_regexp, $addr );
}
}
$wgSkipSkins[] = $wgSkipSkin;
}
+if ( $wgLocalInterwiki ) {
+ array_unshift( $wgLocalInterwikis, $wgLocalInterwiki );
+}
+
# Set default shared prefix
if ( $wgSharedPrefix === false ) {
$wgSharedPrefix = $wgDBprefix;
$parserMemc = wfGetParserCacheStorage();
$wgLangConvMemc = wfGetLangConverterCacheStorage();
-wfDebug( 'CACHES: ' . get_class( $wgMemc ) . '[main] ' .
+wfDebugLog( 'caches', get_class( $wgMemc ) . '[main] ' .
get_class( $messageMemc ) . '[message] ' .
- get_class( $parserMemc ) . "[parser]\n" );
+ get_class( $parserMemc ) . '[parser]' );
wfProfileOut( $fname . '-memcached' );
return $skin;
}
- /** @return string skin name */
+ /**
+ * @return string skin name
+ */
public function getSkinName() {
return $this->skinname;
}
wfProfileOut( __METHOD__ );
return $bar;
}
+
/**
* Add content from a sidebar system message
* Currently only used for MediaWiki:Sidebar (but may be used by Extensions)
// that interface elements are in a different language.
$tpl->set( 'userlangattributes', '' );
$tpl->set( 'specialpageattributes', '' ); # obsolete
+ // Used by VectorBeta to insert HTML before content but after the heading for the page title. Defaults to empty string.
+ $tpl->set( 'prebodyhtml', '' );
if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) {
$escUserlang = htmlspecialchars( $userLangCode );
return $boxes;
}
+ /**
+ * @param string $name
+ */
+ protected function renderAfterPortlet( $name ) {
+ $content = '';
+ wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
+
+ if ( $content !== '' ) {
+ echo "<div class='after-portlet after-portlet-$name'>$content</div>";
+ }
+
+ }
+
/**
* Makes a link, usually used by makeListItem to generate a link for an item
* in a list used in navigation lists, portlets, portals, sidebars, etc...
* @return Bool true on success
*/
private function secureAndSplit() {
- global $wgContLang, $wgLocalInterwiki;
+ global $wgContLang, $wgLocalInterwikis;
# Initialisation
$this->mInterwiki = '';
$this->mInterwiki = $wgContLang->lc( $p );
# Redundant interwiki prefix to the local wiki
- if ( $wgLocalInterwiki !== false
- && 0 == strcasecmp( $this->mInterwiki, $wgLocalInterwiki )
- ) {
- if ( $dbkey == '' ) {
- # Can't have an empty self-link
- return false;
+ foreach ( $wgLocalInterwikis as $localIW ) {
+ if ( 0 == strcasecmp( $this->mInterwiki, $localIW ) ) {
+ if ( $dbkey == '' ) {
+ # Can't have an empty self-link
+ return false;
+ }
+ $this->mInterwiki = '';
+ $firstPass = false;
+ # Do another namespace split...
+ continue 2;
}
- $this->mInterwiki = '';
- $firstPass = false;
- # Do another namespace split...
- continue;
}
# If there's an initial colon after the interwiki, that also
// Don't bother storing default values
$defaultOption = self::getDefaultOption( $key );
if ( ( is_null( $defaultOption ) &&
- !( $value === false || is_null( $value ) ) ) ||
- $value != $defaultOption ) {
+ !( $value === false || is_null( $value ) ) ) ||
+ $value != $defaultOption
+ ) {
$insert_rows[] = array(
- 'up_user' => $userId,
- 'up_property' => $key,
- 'up_value' => $value,
- );
+ 'up_user' => $userId,
+ 'up_property' => $key,
+ 'up_value' => $value,
+ );
}
}
$dbw = wfGetDB( DB_MASTER );
- $hasRows = $dbw->selectField( 'user_properties', '1',
- array( 'up_user' => $userId ), __METHOD__ );
-
- if ( $hasRows ) {
- // Only do this delete if there is something there. A very large portion of
+ // Find and delete any prior preference rows...
+ $res = $dbw->select( 'user_properties',
+ array( 'up_property' ), array( 'up_user' => $userId ), __METHOD__ );
+ $priorKeys = array();
+ foreach ( $res as $row ) {
+ $priorKeys[] = $row->up_property;
+ }
+ if ( count( $priorKeys ) ) {
+ // Do the DELETE by PRIMARY KEY for prior rows. A very large portion of
// calls to this function are for setting 'rememberpassword' for new accounts.
- // Doing this delete for new accounts with no rows in the table rougly causes
- // gap locks on [max user ID,+infinity) which causes high contention since many
- // updates will pile up on each other since they are for higher (newer) user IDs.
- $dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
+ // Doing a blanket per-user DELETE for new accounts with no rows in the table
+ // causes gap locks on [max user ID,+infinity) which causes high contention since
+ // updates will pile up on each other as they are for higher (newer) user IDs.
+ $dbw->delete( 'user_properties',
+ array( 'up_user' => $userId, 'up_property' => $priorKeys ), __METHOD__ );
}
+ // Insert the new preference rows
$dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
}
wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
// remove the html body for text email fall back
$body = $body['text'];
- }
- else {
+ } else {
require_once 'Mail/mime.php';
if ( wfIsWindows() ) {
$body['text'] = str_replace( "\n", "\r\n", $body['text'] );
return $this->mTitle;
}
- /** Helper to retrieve the title namespace */
+ /**
+ * Helper to retrieve the title namespace
+ * @return int
+ */
protected function getTitleNs() {
return $this->getTitle()->getNamespace();
}
- /** Helper to retrieve the title DBkey */
+ /**
+ * Helper to retrieve the title DBkey
+ * @return string
+ */
protected function getTitleDBkey() {
return $this->getTitle()->getDBkey();
}
- /** Helper to retrieve the user id */
+
+ /**
+ * Helper to retrieve the user id
+ * @return int
+ */
protected function getUserId() {
return $this->mUser->getId();
}
* Deal with importing all those nasty globals and things
*
* Copyright © 2003 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
class WikiReference {
private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
private $mMajor; ///< 'wiki', 'wiktionary', etc
- private $mCanonicalServer; ///< canonical server URL, e.g. 'http://www.mediawiki.org'
+ private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org'
private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
private $mPath; ///< path, '/wiki/$1'
}
public function getDescription() {
- return 'Block a user';
+ return 'Block a user.';
}
public function getPossibleErrors() {
public function getDescription() {
return array(
- 'Get the difference between 2 pages',
- 'You must pass a revision number or a page title or a page ID id for each part (1 and 2)'
+ 'Get the difference between 2 pages.',
+ 'You must pass a revision number or a page title or a page ID id for each part (1 and 2).'
);
}
}
public function getDescription() {
- return 'Delete a page';
+ return 'Delete a page.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'This module has been disabled';
+ return 'This module has been disabled.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Expands all templates in wikitext';
+ return 'Expands all templates in wikitext.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Returns a user contributions feed';
+ return 'Returns a user contributions feed.';
}
public function getPossibleErrors() {
--- /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
+ * @since 1.23
+ */
+
+/**
+ * Recent changes feed.
+ *
+ * @ingroup API
+ */
+class ApiFeedRecentChanges extends ApiBase {
+
+ /**
+ * This module uses a custom feed wrapper printer.
+ *
+ * @return ApiFormatFeedWrapper
+ */
+ public function getCustomPrinter() {
+ return new ApiFormatFeedWrapper( $this->getMain() );
+ }
+
+ /**
+ * Format the rows (generated by SpecialRecentchanges or SpecialRecentchangeslinked)
+ * as an RSS/Atom feed.
+ */
+ public function execute() {
+ global $wgFeed, $wgFeedClasses;
+
+ $this->params = $this->extractRequestParams();
+
+ if ( !$wgFeed ) {
+ $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+ }
+
+ if ( !isset( $wgFeedClasses[$this->params['feedformat']] ) ) {
+ $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+ }
+
+ $feedFormat = $this->params['feedformat'];
+ $specialClass = $this->params['target'] !== null
+ ? 'SpecialRecentchangeslinked'
+ : 'SpecialRecentchanges';
+
+ $formatter = $this->getFeedObject( $feedFormat, $specialClass );
+
+ // Everything is passed implicitly via $wgRequest… :(
+ // The row-getting functionality should maybe be factored out of ChangesListSpecialPage too…
+ $rc = new $specialClass();
+ $rows = $rc->getRows();
+
+ $feedItems = $rows ? ChangesFeed::buildItems( $rows ) : array();
+
+ ApiFormatFeedWrapper::setResult( $this->getResult(), $formatter, $feedItems );
+ }
+
+ /**
+ * Return a ChannelFeed object.
+ *
+ * @param string $feedFormat Feed's format (either 'rss' or 'atom')
+ * @param string $specialClass Relevant special page name (either 'SpecialRecentchanges' or
+ * 'SpecialRecentchangeslinked')
+ * @return ChannelFeed
+ */
+ public function getFeedObject( $feedFormat, $specialClass ) {
+ if ( $specialClass === 'SpecialRecentchangeslinked' ) {
+ $title = Title::newFromText( $this->params['target'] );
+ $feed = new ChangesFeed( $feedFormat, false );
+ $feedObj = $feed->getFeedObject(
+ $this->msg( 'recentchangeslinked-title', $title->getPrefixedText() )
+ ->inContentLanguage()->text(),
+ $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
+ SpecialPage::getTitleFor( 'Recentchangeslinked' )->getFullURL()
+ );
+ } else {
+ $feed = new ChangesFeed( $feedFormat, 'rcfeed' );
+ $feedObj = $feed->getFeedObject(
+ $this->msg( 'recentchanges' )->inContentLanguage()->text(),
+ $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
+ SpecialPage::getTitleFor( 'Recentchanges' )->getFullURL()
+ );
+ }
+
+ return $feedObj;
+ }
+
+ public function getAllowedParams() {
+ global $wgFeedClasses, $wgAllowCategorizedRecentChanges, $wgFeedLimit;
+ $feedFormatNames = array_keys( $wgFeedClasses );
+
+ $ret = array(
+ 'feedformat' => array(
+ ApiBase::PARAM_DFLT => 'rss',
+ ApiBase::PARAM_TYPE => $feedFormatNames,
+ ),
+
+ 'namespace' => array(
+ ApiBase::PARAM_TYPE => 'namespace',
+ ),
+ 'invert' => false,
+ 'associated' => false,
+
+ 'days' => array(
+ ApiBase::PARAM_DFLT => 7,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_TYPE => 'integer',
+ ),
+ 'limit' => array(
+ ApiBase::PARAM_DFLT => 50,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => $wgFeedLimit,
+ ApiBase::PARAM_TYPE => 'integer',
+ ),
+ 'from' => array(
+ ApiBase::PARAM_TYPE => 'timestamp',
+ ),
+
+ 'hideminor' => false,
+ 'hidebots' => false,
+ 'hideanons' => false,
+ 'hideliu' => false,
+ 'hidepatrolled' => false,
+ 'hidemyself' => false,
+
+ 'tagfilter' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ),
+
+ 'target' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ),
+ 'showlinkedto' => false,
+ );
+
+ if ( $wgAllowCategorizedRecentChanges ) {
+ $ret += array(
+ 'categories' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ 'categories_any' => false,
+ );
+ }
+
+ return $ret;
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'feedformat' => 'The format of the feed',
+ 'namespace' => 'Namespace to limit the results to',
+ 'invert' => 'All namespaces but the selected one',
+ 'associated' => 'Include associated (talk or main) namespace',
+ 'days' => 'Days to limit the results to',
+ 'limit' => 'Maximum number of results to return',
+ 'from' => 'Show changes since then',
+ 'hideminor' => 'Hide minor changes',
+ 'hidebots' => 'Hide changes made by bots',
+ 'hideanons' => 'Hide changes made by anonymous users',
+ 'hideliu' => 'Hide changes made by registered users',
+ 'hidepatrolled' => 'Hide patrolled changes',
+ 'hidemyself' => 'Hide changes made by yourself',
+ 'tagfilter' => 'Filter by tag',
+ 'target' => 'Show only changes on pages linked from this page',
+ 'showlinkedto' => 'Show changes on pages linked to the selected page instead',
+ 'categories' => 'Show only changes on pages in all of these categories',
+ 'categories_any' => 'Show only changes on pages in any of the categories instead',
+ );
+ }
+
+ public function getDescription() {
+ return 'Returns a recent changes feed';
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'code' => 'feed-unavailable', 'info' => 'Syndication feeds are not available' ),
+ array( 'code' => 'feed-invalid', 'info' => 'Invalid subscription feed type' ),
+ ) );
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=feedrecentchanges',
+ 'api.php?action=feedrecentchanges&days=30'
+ );
+ }
+}
}
public function getDescription() {
- return 'Returns a watchlist feed';
+ return 'Returns a watchlist feed.';
}
public function getPossibleErrors() {
public function getDescription() {
return array(
- 'Revert a file to an old version'
+ 'Revert a file to an old version.'
);
}
// identify requests to api.php
$text = preg_replace( '#^(\s*)(api\.php\?[^ <\n\t]+)$#m', '\1<a href="\2">\2</a>', $text );
if ( $this->mHelp ) {
- // make strings inside * bold
- $text = preg_replace( "#\\*[^<>\n]+\\*#", '<b>\\0</b>', $text );
+ // make lines inside * bold
+ $text = preg_replace( '#^(\s*)(\*[^<>\n]+\*)(\s*)$#m', '$1<b>$2</b>$3', $text );
}
// Armor links (bug 61362)
}
public function getDescription() {
- return 'Display this help screen. Or the help screen for the specified module';
+ return 'Display this help screen. Or the help screen for the specified module.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Rotate one or more images';
+ return 'Rotate one or more images.';
}
public function needsToken() {
'In the event of a successful log-in, a cookie will be attached to your session.',
'In the event of a failed log-in, you will not be able to attempt another log-in',
'through this method for 5 seconds. This is to prevent password guessing by',
- 'automated password crackers'
+ 'automated password crackers.'
);
}
}
public function getDescription() {
- return 'Log out and clear session data';
+ return 'Log out and clear session data.';
}
public function getExamples() {
'parse' => 'ApiParse',
'opensearch' => 'ApiOpenSearch',
'feedcontributions' => 'ApiFeedContributions',
+ 'feedrecentchanges' => 'ApiFeedRecentChanges',
'feedwatchlist' => 'ApiFeedWatchlist',
'help' => 'ApiHelp',
'paraminfo' => 'ApiParamInfo',
try {
$this->executeAction();
} catch ( Exception $e ) {
- // Allow extra cleanup and logging
- wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
-
- // Log it
- if ( !( $e instanceof UsageException ) ) {
- MWExceptionHandler::logException( $e );
- }
-
- // Handle any kind of exception by outputting properly formatted error message.
- // If this fails, an unhandled exception should be thrown so that global error
- // handler will process and log it.
-
- $errCode = $this->substituteResultWithError( $e );
-
- // Error results should not be cached
- $this->setCacheMode( 'private' );
-
- $response = $this->getRequest()->response();
- $headerStr = 'MediaWiki-API-Error: ' . $errCode;
- if ( $e->getCode() === 0 ) {
- $response->header( $headerStr );
- } else {
- $response->header( $headerStr, true, $e->getCode() );
- }
-
- // Reset and print just the error message
- ob_clean();
-
- // If the error occurred during printing, do a printer->profileOut()
- $this->mPrinter->safeProfileOut();
- $this->printResult( true );
+ $this->handleException( $e );
}
// Log the request whether or not there was an error
ob_end_flush();
}
+ /**
+ * Handle an exception as an API response
+ *
+ * @since 1.23
+ * @param Exception $e
+ */
+ protected function handleException( Exception $e ) {
+ // Allow extra cleanup and logging
+ wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
+
+ // Log it
+ if ( !( $e instanceof UsageException ) ) {
+ MWExceptionHandler::logException( $e );
+ }
+
+ // Handle any kind of exception by outputting properly formatted error message.
+ // If this fails, an unhandled exception should be thrown so that global error
+ // handler will process and log it.
+
+ $errCode = $this->substituteResultWithError( $e );
+
+ // Error results should not be cached
+ $this->setCacheMode( 'private' );
+
+ $response = $this->getRequest()->response();
+ $headerStr = 'MediaWiki-API-Error: ' . $errCode;
+ if ( $e->getCode() === 0 ) {
+ $response->header( $headerStr );
+ } else {
+ $response->header( $headerStr, true, $e->getCode() );
+ }
+
+ // Reset and print just the error message
+ ob_clean();
+
+ // If the error occurred during printing, do a printer->profileOut()
+ $this->mPrinter->safeProfileOut();
+ $this->printResult( true );
+ }
+
+ /**
+ * Handle an exception from the ApiBeforeMain hook.
+ *
+ * This tries to print the exception as an API response, to be more
+ * friendly to clients. If it fails, it will rethrow the exception.
+ *
+ * @since 1.23
+ * @param Exception $e
+ */
+ public static function handleApiBeforeMainException( Exception $e ) {
+ ob_start();
+
+ try {
+ $main = new self( RequestContext::getMain(), false );
+ $main->handleException( $e );
+ } catch ( Exception $e2 ) {
+ // Nope, even that didn't work. Punt.
+ throw $e;
+ }
+
+ // Log the request and reset cache headers
+ $main->logRequest( 0 );
+ $main->sendCacheHeaders();
+
+ ob_end_flush();
+ }
+
/**
* Check the &origin= query parameter against the Origin: HTTP header and respond appropriately.
*
'',
'Status: All features shown on this page should be working, but the API',
' is still in active development, and may change at any time.',
- ' Make sure to monitor our mailing list for any updates',
+ ' Make sure to monitor our mailing list for any updates.',
'',
'Erroneous requests: When erroneous requests are sent to the API, a HTTP header will be sent',
' with the key "MediaWiki-API-Error" and then both the value of the',
- ' header and the error code sent back will be set to the same value',
+ ' header and the error code sent back will be set to the same value.',
'',
' In the case of an invalid action being passed, these will have a value',
- ' of "unknown_action"',
+ ' of "unknown_action".',
'',
' For more information see https://www.mediawiki.org' .
'/wiki/API:Errors_and_warnings',
protected function getCredits() {
return array(
'API developers:',
- ' Roan Kattouw - roan . kattouw @ gmail . com (lead developer Sep 2007-2009)',
- ' Victor Vasiliev - vasilvv @ gmail . com',
- ' Bryan Tong Minh - bryan . tongminh @ gmail . com',
- ' Sam Reed - sam @ reedyboy . net',
- ' Yuri Astrakhan - yuri . astrakhan @ gmail . com (creator, lead ' .
- 'developer Sep 2006-Sep 2007, 2012-present)',
+ ' Roan Kattouw (lead developer Sep 2007-2009)',
+ ' Victor Vasiliev',
+ ' Bryan Tong Minh',
+ ' Sam Reed',
+ ' Yuri Astrakhan (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
'',
'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
'or file a bug report at https://bugzilla.wikimedia.org/'
}
public function getDescription() {
- return 'Move a page';
+ return 'Move a page.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Search the wiki using the OpenSearch protocol';
+ return 'Search the wiki using the OpenSearch protocol.';
}
public function getExamples() {
'token' => 'An options token previously obtained through the action=tokens',
'reset' => 'Resets preferences to the site defaults',
'resetkinds' => 'List of types of options to reset when the "reset" option is set',
- 'change' => 'List of changes, formatted name=value (e.g. skin=vector), ' .
- 'value cannot contain pipe characters. If no value is given (not ' .
+ 'change' => array( 'List of changes, formatted name=value (e.g. skin=vector), ' .
+ 'value cannot contain pipe characters. If no value is given (not ',
'even an equals sign), e.g., optionname|otheroption|..., the ' .
- 'option will be reset to its default value',
+ 'option will be reset to its default value'
+ ),
'optionname' => 'A name of a option which should have an optionvalue set',
'optionvalue' => 'A value of the option specified by the optionname, ' .
'can contain pipe characters',
public function getDescription() {
return array(
- 'Change preferences of the current user',
+ 'Change preferences of the current user.',
'Only options which are registered in core or in one of installed extensions,',
'or as options with keys prefixed with \'userjs-\' (intended to be used by user',
'scripts), can be set.'
}
public function getDescription() {
- return 'Obtain information about certain API parameters and errors';
+ return 'Obtain information about certain API parameters and errors.';
}
public function getExamples() {
$p = $this->getModulePrefix();
return array(
- 'Parses content and returns parser output',
+ 'Parses content and returns parser output.',
'See the various prop-Modules of action=query to get information from the current' .
- 'version of a page',
+ 'version of a page.',
'There are several ways to specify the text to parse:',
"1) Specify a page or revision, using {$p}page, {$p}pageid, or {$p}oldid.",
"2) Specify content explicitly, using {$p}text, {$p}title, and {$p}contentmodel.",
}
public function getDescription() {
- return 'Patrol a page or revision';
+ return 'Patrol a page or revision.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Change the protection level of a page';
+ return 'Change the protection level of a page.';
}
public function getPossibleErrors() {
'from the MediaWiki databases,',
'and is loosely based on the old query.php interface.',
'All data modifications will first have to use query to acquire a ' .
- 'token to prevent abuse from malicious sites'
+ 'token to prevent abuse from malicious sites.'
);
}
}
public function getDescription() {
- return 'Enumerate all categories';
+ return 'Enumerate all categories.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Enumerate all images sequentially';
+ return 'Enumerate all images sequentially.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Return messages from this site';
+ return 'Return messages from this site.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Enumerate all pages sequentially in a given namespace';
+ return 'Enumerate all pages sequentially in a given namespace.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Enumerate all registered users';
+ return 'Enumerate all registered users.';
}
public function getPossibleErrors() {
public function getDescription() {
switch ( $this->getModuleName() ) {
case 'backlinks':
- return 'Find all pages that link to the given page';
+ return 'Find all pages that link to the given page.';
case 'embeddedin':
- return 'Find all pages that embed (transclude) the given title';
+ return 'Find all pages that embed (transclude) the given title.';
case 'imageusage':
return 'Find all pages that use the given image title.';
default:
- ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
+ ApiBase::dieDebug( __METHOD__, 'Unknown module name.' );
}
}
}
public function getDescription() {
- return 'List all blocked users and IP addresses';
+ return 'List all blocked users and IP addresses.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'List all categories the page(s) belong to';
+ return 'List all categories the page(s) belong to.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Returns information about the given categories';
+ return 'Returns information about the given categories.';
}
public function getExamples() {
}
public function getDescription() {
- return 'List all pages in a given category';
+ return 'List all pages in a given category.';
}
public function getPossibleErrors() {
public function getDescription() {
return 'Get the list of logged-in contributors and ' .
- 'the count of anonymous contributors to a page';
+ 'the count of anonymous contributors to a page.';
}
public function getExamples() {
return array(
'List deleted revisions.',
'Operates in three modes:',
- ' 1) List deleted revisions for the given title(s), sorted by timestamp',
- ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified)',
+ ' 1) List deleted revisions for the given title(s), sorted by timestamp.',
+ ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified).',
" 3) List all deleted revisions in the given namespace, sorted by title and timestamp',
- ' (no titles specified, {$p}user not set)",
+ ' (no titles specified, {$p}user not set).",
'Certain parameters only apply to some modes and are ignored in others.',
- 'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3',
+ 'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3.',
);
}
}
public function getDescription() {
- return 'List all files that are duplicates of the given file(s) based on hash values';
+ return 'List all files that are duplicates of the given file(s) based on hash values.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Enumerate pages that contain a given URL';
+ return 'Enumerate pages that contain a given URL.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Returns all external URLs (not interwikis) from the given page(s)';
+ return 'Returns all external URLs (not interwikis) from the given page(s).';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Enumerate all deleted files sequentially';
+ return 'Enumerate all deleted files sequentially.';
}
public function getPossibleErrors() {
return array( 'Find all pages that link to the given interwiki link.',
'Can be used to find all links with a prefix, or',
'all links to a title (with a given prefix).',
- 'Using neither parameter is effectively "All IW Links"',
+ 'Using neither parameter is effectively "All IW Links".',
);
}
}
public function getDescription() {
- return 'Returns all interwiki links from the given page(s)';
+ return 'Returns all interwiki links from the given page(s).';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Returns image information and upload history';
+ return 'Returns image information and upload history.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Returns all images contained on the given page(s)';
+ return 'Returns all images contained on the given page(s).';
}
public function getExamples() {
}
public function getDescription() {
- return 'Returns all interlanguage links from the given page(s)';
+ return 'Returns all interlanguage links from the given page(s).';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return "Returns all {$this->description}s from the given page(s)";
+ return "Returns all {$this->description}s from the given page(s).";
}
public function getExamples() {
}
if ( !is_null( $params['action'] ) ) {
- list( $type, $action ) = explode( '/', $params['action'] );
+ // Do validation of action param, list of allowed actions can contains wildcards
+ // Allow the param, when the actions is in the list or a wildcard version is listed.
+ $logAction = $params['action'];
+ if ( strpos( $logAction, '/' ) === false ) {
+ // all items in the list have a slash
+ $valid = false;
+ } else {
+ $logActions = array_flip( $this->getAllowedLogActions() );
+ list( $type, $action ) = explode( '/', $logAction, 2 );
+ $valid = isset( $logActions[$logAction] ) || isset( $logActions[$type . '/*'] );
+ }
+
+ if ( !$valid ) {
+ $valueName = $this->encodeParamName( 'action' );
+ $this->dieUsage(
+ "Unrecognized value for parameter '$valueName': {$logAction}",
+ "unknown_$valueName"
+ );
+ }
+
$this->addWhereFld( 'log_type', $type );
$this->addWhereFld( 'log_action', $action );
} elseif ( !is_null( $params['type'] ) ) {
return $vals;
}
+ private function getAllowedLogActions() {
+ global $wgLogActions, $wgLogActionsHandlers;
+
+ return array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) );
+ }
+
public function getCacheMode( $params ) {
if ( $this->userCanSeeRevDel() ) {
return 'private';
}
}
- public function getAllowedParams() {
- global $wgLogTypes, $wgLogActions, $wgLogActionsHandlers;
+ public function getAllowedParams( $flags = 0 ) {
+ global $wgLogTypes;
return array(
'prop' => array(
ApiBase::PARAM_TYPE => $wgLogTypes
),
'action' => array(
- ApiBase::PARAM_TYPE => array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) )
+ // validation on request is done in execute()
+ ApiBase::PARAM_TYPE => ( $flags & ApiBase::GET_VALUES_FOR_HELP )
+ ? $this->getAllowedLogActions()
+ : null
),
'start' => array(
ApiBase::PARAM_TYPE => 'timestamp'
' tags - Lists tags for the event',
),
'type' => 'Filter log entries to only this type',
- 'action' => "Filter log actions to only this type. Overrides {$p}type",
+ 'action' => array(
+ "Filter log actions to only this action. Overrides {$p}type",
+ "Wildcard actions like 'action/*' allows to specify any string for the asterisk"
+ ),
'start' => 'The timestamp to start enumerating from',
'end' => 'The timestamp to end enumerating',
'dir' => $this->getDirectionDescription( $p ),
}
public function getDescription() {
- return 'Get events from logs';
+ return 'Get events from logs.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'List all page prop names in use on the wiki';
+ return 'List all page prop names in use on the wiki.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Get various properties defined in the page content';
+ return 'Get various properties defined in the page content.';
}
public function getExamples() {
}
public function getDescription() {
- return 'List all pages using a given page prop';
+ return 'List all pages using a given page prop.';
}
public function getExamples() {
}
public function getDescription() {
- return 'List all titles protected from creation';
+ return 'List all titles protected from creation.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Get a list provided by a QueryPage-based special page';
+ return 'Get a list provided by a QueryPage-based special page.';
}
public function getPossibleErrors() {
public function getDescription() {
return array(
- 'Get a set of random pages',
+ 'Get a set of random pages.',
'NOTE: Pages are listed in a fixed sequence, only the starting point is random.',
' This means that if, for example, "Main Page" is the first random page on',
' your list, "List of fictional monkeys" will *always* be second, "List of',
- ' people on stamps of Vanuatu" third, etc',
+ ' people on stamps of Vanuatu" third, etc.',
'NOTE: If the number of pages in the namespace is lower than rnlimit, you will',
- ' get fewer pages. You will not get the same page twice'
+ ' get fewer pages. You will not get the same page twice.'
);
}
}
public function getDescription() {
- return 'Enumerate recent changes';
+ return 'Enumerate recent changes.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Returns all redirects to the given page(s)';
+ return 'Returns all redirects to the given page(s).';
}
public function getExamples() {
public function getDescription() {
return array(
- 'Get revision information',
+ 'Get revision information.',
'May be used in several ways:',
- ' 1) Get data about a set of pages (last revision), by setting titles or pageids parameter',
- ' 2) Get revisions for one given page, by using titles/pageids with start/end/limit params',
- ' 3) Get data about a set of revisions by setting their IDs with revids parameter',
- 'All parameters marked as (enum) may only be used with a single page (#2)'
+ ' 1) Get data about a set of pages (last revision), by setting titles or pageids parameter.',
+ ' 2) Get revisions for one given page, by using titles/pageids with start/end/limit params.',
+ ' 3) Get data about a set of revisions by setting their IDs with revids parameter.',
+ 'All parameters marked as (enum) may only be used with a single page (#2).'
);
}
}
public function getDescription() {
- return 'Perform a full text search';
+ return 'Perform a full text search.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Return general information about the site';
+ return 'Return general information about the site.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Returns image information for stashed images';
+ return 'Returns image information for stashed images.';
}
public function getExamples() {
}
public function getDescription() {
- return 'List change tags';
+ return 'List change tags.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Get all edits by a user';
+ return 'Get all edits by a user.';
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Get information about the current user';
+ return 'Get information about the current user.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Get information about a list of users';
+ return 'Get information about a list of users.';
}
public function getExamples() {
}
public function getDescription() {
- return "Get all recent changes to pages in the logged in user's watchlist";
+ return "Get all recent changes to pages in the logged in user's watchlist.";
}
public function getPossibleErrors() {
}
public function getDescription() {
- return "Get all pages on the logged in user's watchlist";
+ return "Get all pages on the logged in user's watchlist.";
}
public function getPossibleErrors() {
}
public function getDescription() {
- return 'Delete/undelete revisions';
+ return 'Delete/undelete revisions.';
}
public function getPossibleErrors() {
public function getDescription() {
return array(
'Undo the last edit to the page. If the last user who edited the page made',
- 'multiple edits in a row, they will all be rolled back'
+ 'multiple edits in a row, they will all be rolled back.'
);
}
}
public function getDescription() {
- return 'Export an RSD (Really Simple Discovery) schema';
+ return 'Export an RSD (Really Simple Discovery) schema.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Perform periodic tasks or run jobs from the queue';
+ return 'Perform periodic tasks or run jobs from the queue.';
}
public function getExamples() {
}
public function getDescription() {
- return 'Gets tokens for data-modifying actions';
+ return 'Gets tokens for data-modifying actions.';
}
protected function getExamples() {
}
public function getDescription() {
- return 'Unblock a user';
+ return 'Unblock a user.';
}
public function getPossibleErrors() {
public function getDescription() {
return array(
'Restore certain revisions of a deleted page. A list of deleted revisions ',
- '(including timestamps) can be retrieved through list=deletedrevs'
+ '(including timestamps) can be retrieved through list=deletedrevs.'
);
}
' * Have the MediaWiki server fetch a file from a URL, using the "url" parameter',
' * Complete an earlier upload that failed due to warnings, using the "filekey" parameter',
'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when',
- 'sending the "file". Also you must get and send an edit token before doing any upload stuff'
+ 'sending the "file". Also you must get and send an edit token before doing any upload stuff.'
);
}
}
public function getDescription() {
- return 'Add/remove a user to/from groups';
+ return 'Add/remove a user to/from groups.';
}
public function needsToken() {
}
public function getDescription() {
- return 'Add or remove pages from/to the current user\'s watchlist';
+ return 'Add or remove pages from/to the current user\'s watchlist.';
}
public function getPossibleErrors() {
*/
class EnhancedChangesList extends ChangesList {
- /** @var array Array of array of RCCacheEntry */
+
+ /**
+ * @var RCCacheEntryFactory
+ */
+ protected $cacheEntryFactory;
+
+ /**
+ * @var array Array of array of RCCacheEntry
+ */
protected $rc_cache;
+ /**
+ * @param IContextSource|Skin $obj
+ */
+ public function __construct( $obj ) {
+ if ( $obj instanceof Skin ) {
+ // @todo: deprecate constructing with Skin
+ $context = $obj->getContext();
+ } else {
+ if ( ! $obj instanceof IContextSource ) {
+ throw new MWException( 'EnhancedChangesList must be constructed with a '
+ . 'context source or skin.' );
+ }
+
+ $context = $obj;
+ }
+
+ parent::__construct( $context );
+
+ // message is set by the parent ChangesList class
+ $this->cacheEntryFactory = new RCCacheEntryFactory(
+ $context,
+ $this->message
+ );
+ }
+
/**
* Add the JavaScript file for enhanced changeslist
* @return string
$this->lastdate = $date;
}
- # Create a specialised object
- $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
-
- $curIdEq = array( 'curid' => $cacheEntry->mAttribs['rc_cur_id'] );
-
- # Should patrol-related stuff be shown?
- $cacheEntry->unpatrolled = $this->showAsUnpatrolled( $cacheEntry );
-
- $showdifflinks = true;
-
- # Make article link
- $type = $cacheEntry->mAttribs['rc_type'];
- $logType = $cacheEntry->mAttribs['rc_log_type'];
-
- // Page moves, very old style, not supported anymore
- if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
- $clink = '';
- // New unpatrolled pages
- } elseif ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
- $clink = Linker::linkKnown( $cacheEntry->getTitle() );
- // Log entries
- } elseif ( $type == RC_LOG ) {
- if ( $logType ) {
- $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
- $logpage = new LogPage( $logType );
- $logname = $logpage->getName()->escaped();
- $clink = $this->msg( 'parentheses' )
- ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
- } else {
- $clink = Linker::link( $cacheEntry->getTitle() );
- }
- $watched = false;
- // Log entries (old format) and special pages
- } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
- wfDebug( "Unexpected special page in recentchanges\n" );
- $clink = '';
- // Edits
- } else {
- $clink = Linker::linkKnown( $cacheEntry->getTitle() );
- }
-
- # Don't show unusable diff links
- if ( !ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $this->getUser() ) ) {
- $showdifflinks = false;
- }
-
- $time = $this->getLanguage()->userTime( $cacheEntry->mAttribs['rc_timestamp'], $this->getUser() );
-
- $cacheEntry->watched = $watched;
- $cacheEntry->link = $clink;
- $cacheEntry->timestamp = $time;
- $cacheEntry->numberofWatchingusers = $baseRC->numberofWatchingusers;
-
- # Make "cur" and "diff" links. Do not use link(), it is too slow if
- # called too many times (50% of CPU time on RecentChanges!).
- $thisOldid = $cacheEntry->mAttribs['rc_this_oldid'];
- $lastOldid = $cacheEntry->mAttribs['rc_last_oldid'];
-
- $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
- $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid );
-
- if ( !$showdifflinks ) {
- $curLink = $this->message['cur'];
- $diffLink = $this->message['diff'];
- } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
- if ( $type != RC_NEW ) {
- $curLink = $this->message['cur'];
- } else {
- $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $querycur ) );
- $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
- }
- $diffLink = $this->message['diff'];
- } else {
- $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $querydiff ) );
- $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $querycur ) );
- $diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
- $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
- }
-
- # Make "last" link
- if ( !$showdifflinks || !$lastOldid ) {
- $lastLink = $this->message['last'];
- } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
- $lastLink = $this->message['last'];
- } else {
- $lastLink = Linker::linkKnown( $cacheEntry->getTitle(), $this->message['last'],
- array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) );
- }
-
- # Make user links
- if ( $this->isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
- $cacheEntry->userlink = ' <span class="history-deleted">' .
- $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
- } else {
- $cacheEntry->userlink = Linker::userLink(
- $cacheEntry->mAttribs['rc_user'],
- $cacheEntry->mAttribs['rc_user_text']
- );
-
- $cacheEntry->usertalklink = Linker::userToolLinks(
- $cacheEntry->mAttribs['rc_user'],
- $cacheEntry->mAttribs['rc_user_text']
- );
- }
-
- $cacheEntry->lastlink = $lastLink;
- $cacheEntry->curlink = $curLink;
- $cacheEntry->difflink = $diffLink;
+ $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $baseRC, $watched );
# Put accumulated information into the cache, for later display
# Page moves go on their own line
$title = $cacheEntry->getTitle();
$secureName = $title->getPrefixedDBkey();
+ $type = $cacheEntry->mAttribs['rc_type'];
+
if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
# Use an @ character to prevent collision with page names
$this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $cacheEntry );
} else {
# Logs are grouped by type
if ( $type == RC_LOG ) {
- $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
+ $secureName = SpecialPage::getTitleFor(
+ 'Log',
+ $cacheEntry->mAttribs['rc_log_type']
+ )->getPrefixedDBkey();
}
if ( !isset( $this->rc_cache[$secureName] ) ) {
$this->rc_cache[$secureName] = array();
--- /dev/null
+<?php
+/**
+ * Creates a RCCacheEntry from a RecentChange to use in EnhancedChangesList
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class RCCacheEntryFactory {
+
+ /* @var IContextSource */
+ private $context;
+
+ /* @var string[] */
+ private $messages;
+
+ /**
+ * @param IContextSource $context
+ * @param string[] $messages
+ */
+ public function __construct( IContextSource $context, $messages ) {
+ $this->context = $context;
+ $this->messages = $messages;
+ }
+
+ /**
+ * @param RecentChange $baseRC
+ * @param boolean $watched
+ *
+ * @return RCCacheEntry
+ */
+ public function newFromRecentChange( RecentChange $baseRC, $watched ) {
+ $user = $this->context->getUser();
+ $counter = $baseRC->counter;
+
+ $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
+
+ // Should patrol-related stuff be shown?
+ $cacheEntry->unpatrolled = ChangesList::isUnpatrolled( $baseRC, $user );
+
+ $cacheEntry->watched = $cacheEntry->mAttribs['rc_type'] == RC_LOG ? false : $watched;
+ $cacheEntry->numberofWatchingusers = $baseRC->numberofWatchingusers;
+
+ $cacheEntry->link = $this->buildCLink( $cacheEntry );
+ $cacheEntry->timestamp = $this->buildTimestamp( $cacheEntry );
+
+ // Make "cur" and "diff" links. Do not use link(), it is too slow if
+ // called too many times (50% of CPU time on RecentChanges!).
+ $showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
+
+ $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
+ $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
+ $cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
+
+ // Make user links
+ $cacheEntry->userlink = $this->getUserLink( $cacheEntry );
+
+ if ( !ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
+ $cacheEntry->usertalklink = Linker::userToolLinks(
+ $cacheEntry->mAttribs['rc_user'],
+ $cacheEntry->mAttribs['rc_user_text']
+ );
+ }
+
+ return $cacheEntry;
+ }
+
+ /**
+ * @param RecentChange $cacheEntry
+ * @param User $user
+ *
+ * @return boolean
+ */
+ private function showDiffLinks( RecentChange $cacheEntry, User $user ) {
+ return ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $user );
+ }
+
+ /**
+ * @param RecentChange $cacheEntry
+ *
+ * @return string
+ */
+ private function buildCLink( RecentChange $cacheEntry ) {
+ $type = $cacheEntry->mAttribs['rc_type'];
+
+ // Page moves, very old style, not supported anymore
+ if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+ $clink = '';
+ // New unpatrolled pages
+ } elseif ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
+ $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+ // Log entries
+ } elseif ( $type == RC_LOG ) {
+ $logType = $cacheEntry->mAttribs['rc_log_type'];
+
+ if ( $logType ) {
+ $clink = $this->getLogLink( $logType );
+ } else {
+ wfDebugLog( 'recentchanges', 'Unexpected log entry with no log type in recent changes' );
+ $clink = Linker::link( $cacheEntry->getTitle() );
+ }
+ // Log entries (old format) and special pages
+ } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+ wfDebugLog( 'recentchanges', 'Unexpected special page in recentchanges' );
+ $clink = '';
+ // Edits
+ } else {
+ $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+ }
+
+ return $clink;
+ }
+
+ private function getLogLink( $logType ) {
+ $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
+ $logpage = new LogPage( $logType );
+ $logname = $logpage->getName()->escaped();
+
+ $logLink = $this->context->msg( 'parentheses' )
+ ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+
+ return $logLink;
+ }
+
+ /**
+ * @param RecentChange $cacheEntry
+ *
+ * @return string
+ */
+ private function buildTimestamp( RecentChange $cacheEntry ) {
+ return $this->context->getLanguage()->userTime(
+ $cacheEntry->mAttribs['rc_timestamp'],
+ $this->context->getUser()
+ );
+ }
+
+ /**
+ * @param RecentChange $recentChange
+ *
+ * @return array
+ */
+ private function buildCurQueryParams( RecentChange $recentChange ) {
+ return array(
+ 'curid' => $recentChange->mAttribs['rc_cur_id'],
+ 'diff' => 0,
+ 'oldid' => $recentChange->mAttribs['rc_this_oldid']
+ );
+ }
+
+ /**
+ * @param RecentChange $cacheEntry
+ * @param boolean $showDiffLinks
+ * @param int $counter
+ *
+ * @return string
+ */
+ private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+ $queryParams = $this->buildCurQueryParams( $cacheEntry );
+ $curMessage = $this->getMessage( 'cur' );
+ $logTypes = array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+
+ if ( !$showDiffLinks || in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
+ $curLink = $curMessage;
+ } else {
+ $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
+ $curLink = "<a href=\"$curUrl\" tabindex=\"$counter\">$curMessage</a>";
+ }
+
+ return $curLink;
+ }
+
+ /**
+ * @param RecentChange $recentChange
+ *
+ * @return array
+ */
+ private function buildDiffQueryParams( RecentChange $recentChange ) {
+ return array(
+ 'curid' => $recentChange->mAttribs['rc_cur_id'],
+ 'diff' => $recentChange->mAttribs['rc_this_oldid'],
+ 'oldid' => $recentChange->mAttribs['rc_last_oldid']
+ );
+ }
+
+ /**
+ * @param RecentChange $cacheEntry
+ * @param boolean $showDiffLinks
+ * @param int $counter
+ *
+ * @return string
+ */
+ private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+ $queryParams = $this->buildDiffQueryParams( $cacheEntry );
+ $diffMessage = $this->getMessage( 'diff' );
+ $logTypes = array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+
+ if ( !$showDiffLinks ) {
+ $diffLink = $diffMessage;
+ } elseif ( in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
+ $diffLink = $diffMessage;
+ } else {
+ $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
+ $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
+ }
+
+ return $diffLink;
+ }
+
+ /**
+ * @param RecentChange $cacheEntry
+ * @param boolean $showDiffLinks
+ *
+ * @return string
+ */
+ private function buildLastLink( RecentChange $cacheEntry, $showDiffLinks ) {
+ $lastOldid = $cacheEntry->mAttribs['rc_last_oldid'];
+ $lastMessage = $this->getMessage( 'last' );
+ $type = $cacheEntry->mAttribs['rc_type'];
+ $logTypes = array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT );
+
+ // Make "last" link
+ if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
+ $lastLink = $lastMessage;
+ } else {
+ $lastLink = Linker::linkKnown(
+ $cacheEntry->getTitle(),
+ $lastMessage,
+ array(),
+ $this->buildDiffQueryParams( $cacheEntry )
+ );
+ }
+
+ return $lastLink;
+ }
+
+ /**
+ * @param RecentChange $cacheEntry
+ *
+ * @return string
+ */
+ private function getUserLink( RecentChange $cacheEntry ) {
+ if ( ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
+ $userLink = ' <span class="history-deleted">' .
+ $this->context->msg( 'rev-deleted-user' )->escaped() . '</span>';
+ } else {
+ $userLink = Linker::userLink(
+ $cacheEntry->mAttribs['rc_user'],
+ $cacheEntry->mAttribs['rc_user_text']
+ );
+ }
+
+ return $userLink;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return string
+ */
+ private function getMessage( $key ) {
+ return $this->messages[$key];
+ }
+
+}
* mExtra:
* prefixedDBkey prefixed db key, used by external app via msg queue
* lastTimestamp timestamp of previous entry, used in WHERE clause during update
- * lang the interwiki prefix, automatically set in save()
* oldSize text size before the change
* newSize text size after the change
* pageStatus status of the page: created, deleted, moved, restored, changed
* @param $noudp bool
*/
public function save( $noudp = false ) {
- global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
+ global $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
$dbw = wfGetDB( DB_MASTER );
if ( !is_array( $this->mExtra ) ) {
$this->mExtra = array();
}
- $this->mExtra['lang'] = $wgLocalInterwiki;
if ( !$wgPutIPinRC ) {
$this->mAttribs['rc_ip'] = '';
* Helper class for making a copy of the database, mostly for unit testing.
*
* Copyright © 2010 Chad Horohoe <chad@anyonecanedit.org>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
<?php
+
/**
* @defgroup Database Database
*
}
/**
- * Make UPDATE options for the DatabaseBase::update function
+ * Make UPDATE options array for DatabaseBase::makeUpdateOptions
*
- * @param array $options The options passed to DatabaseBase::update
- * @return string
+ * @param array $options
+ * @return array
*/
- protected function makeUpdateOptions( $options ) {
+ protected function makeUpdateOptionsArray( $options ) {
if ( !is_array( $options ) ) {
$options = array( $options );
}
$opts[] = 'IGNORE';
}
+ return $opts;
+ }
+
+ /**
+ * Make UPDATE options for the DatabaseBase::update function
+ *
+ * @param array $options The options passed to DatabaseBase::update
+ * @return string
+ */
+ protected function makeUpdateOptions( $options ) {
+ $opts = $this->makeUpdateOptionsArray( $options );
+
return implode( ' ', $opts );
}
}
$retJOIN[] = $tableClause;
- // Is there an INDEX clause for this table?
} elseif ( isset( $use_index[$alias] ) ) {
+ // Is there an INDEX clause for this table?
$tableClause = $this->tableNameWithAlias( $table, $alias );
$tableClause .= ' ' . $this->useIndexClause(
- implode( ',', (array)$use_index[$alias] ) );
+ implode( ',', (array)$use_index[$alias] )
+ );
$ret[] = $tableClause;
} else {
}
$ret = '0x';
- for ( $i = 0; $i < strlen( $this->mData ); $i++ ) {
+ $dataLength = strlen( $this->mData );
+ for ( $i = 0; $i < $dataLength; $i++ ) {
$ret .= bin2hex( pack( 'C', ord( $this->mData[$i] ) ) );
}
. " have you compiled PHP with the --with-mysqli option?\n" );
}
+ // Other than mysql_connect, mysqli_real_connect expects an explicit port
+ // parameter. So we need to parse the port out of $realServer
+ $port = null;
+ $hostAndPort = IP::splitHostAndPort( $realServer );
+ if ( $hostAndPort ) {
+ $realServer = $hostAndPort[0];
+ if ( $hostAndPort[1] ) {
+ $port = $hostAndPort[1];
+ }
+ }
+
$connFlags = 0;
if ( $this->mFlags & DBO_SSL ) {
$connFlags |= MYSQLI_CLIENT_SSL;
usleep( 1000 );
}
if ( $mysqli->real_connect( $realServer, $this->mUser,
- $this->mPassword, $this->mDBname, null, null, $connFlags )
+ $this->mPassword, $this->mDBname, $port, null, $connFlags )
) {
return $mysqli;
}
// add sequence column to each list of columns, when not set
foreach ( $rows as &$row ) {
if ( !isset( $row[$sequenceData['column']] ) ) {
- $row[$sequenceData['column']] = $this->addIdentifierQuotes('GET_SEQUENCE_VALUE(\'' . $sequenceData['sequence'] . '\')');
+ $row[$sequenceData['column']] =
+ $this->addIdentifierQuotes( 'GET_SEQUENCE_VALUE(\'' .
+ $sequenceData['sequence'] . '\')' );
}
}
}
$table = strtoupper( $this->removeIdentifierQuotes( $table ) );
$index = strtoupper( $index );
$owner = strtoupper( $this->mDBname );
- $SQL = "SELECT 1 FROM all_indexes WHERE owner='$owner' AND index_name='{$table}_{$index}'";
- $res = $this->doQuery( $SQL );
+ $sql = "SELECT 1 FROM all_indexes WHERE owner='$owner' AND index_name='{$table}_{$index}'";
+ $res = $this->doQuery( $sql );
if ( $res ) {
$count = $res->numRows();
$res->free();
$table = $this->tableName( $table );
$table = $this->addQuotes( strtoupper( $this->removeIdentifierQuotes( $table ) ) );
$owner = $this->addQuotes( strtoupper( $this->mDBname ) );
- $SQL = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
- $res = $this->doQuery( $SQL );
+ $sql = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
+ $res = $this->doQuery( $sql );
if ( $res && $res->numRows() > 0 ) {
$exists = true;
} else {
}
function hasConstraint( $name ) {
- $SQL = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n " .
+ $sql = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n " .
"WHERE c.connamespace = n.oid AND conname = '" .
pg_escape_string( $this->mConn, $name ) . "' AND n.nspname = '" .
pg_escape_string( $this->mConn, $this->getCoreSchema() ) . "'";
- $res = $this->doQuery( $SQL );
+ $res = $this->doQuery( $sql );
return $this->numRows( $res );
}
$table = $this->realTableName( $table, 'raw' );
$etable = $this->addQuotes( $table );
$eschema = $this->addQuotes( $schema );
- $SQL = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n "
+ $sql = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n "
. "WHERE c.relnamespace = n.oid AND c.relname = $etable AND n.nspname = $eschema "
. "AND c.relkind IN ('" . implode( "','", $types ) . "')";
- $res = $this->query( $SQL );
+ $res = $this->query( $sql );
$count = $res ? $res->numRows() : 0;
return (bool)$count;
}
function constraintExists( $table, $constraint ) {
- $SQL = sprintf( "SELECT 1 FROM information_schema.table_constraints " .
+ $sql = sprintf( "SELECT 1 FROM information_schema.table_constraints " .
"WHERE constraint_schema = %s AND table_name = %s AND constraint_name = %s",
$this->addQuotes( $this->getCoreSchema() ),
$this->addQuotes( $table ),
$this->addQuotes( $constraint )
);
- $res = $this->query( $SQL );
+ $res = $this->query( $sql );
if ( !$res ) {
return null;
}
* @param array $options
* @return string
*/
- protected function makeUpdateOptions( $options ) {
+ protected function makeUpdateOptionsArray( $options ) {
+ $options = parent::makeUpdateOptionsArray( $options );
$options = self::fixIgnore( $options );
- return parent::makeUpdateOptions( $options );
+ return $options;
}
/**
public function reuseConnection( $conn ) {
$serverIndex = $conn->getLBInfo( 'serverIndex' );
$refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
- $dbName = $conn->getDBname();
- $prefix = $conn->tablePrefix();
- if ( strval( $prefix ) !== '' ) {
- $wiki = "$dbName-$prefix";
- } else {
- $wiki = $dbName;
- }
if ( $serverIndex === null || $refCount === null ) {
wfDebug( __METHOD__ . ": this connection was not opened as a foreign connection\n" );
return;
}
+
+ $dbName = $conn->getDBname();
+ $prefix = $conn->tablePrefix();
+ if ( strval( $prefix ) !== '' ) {
+ $wiki = "$dbName-$prefix";
+ } else {
+ $wiki = $dbName;
+ }
if ( $this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn ) {
throw new MWException( __METHOD__ . ": connection not found, has " .
"the connection been freed already?" );
// Get a list of old thumbnails and URLs
$files = $this->getThumbnails( $archiveName );
- $dir = array_shift( $files );
- $this->purgeThumbList( $dir, $files );
// Purge any custom thumbnail caches
wfRunHooks( 'LocalFilePurgeThumbnails', array( $this, $archiveName ) );
+ $dir = array_shift( $files );
+ $this->purgeThumbList( $dir, $files );
+
// Purge the squid
if ( $wgUseSquid ) {
$urls = array();
}
}
- $dir = array_shift( $files );
- $this->purgeThumbList( $dir, $files );
-
// Purge any custom thumbnail caches
wfRunHooks( 'LocalFilePurgeThumbnails', array( $this, false ) );
+ $dir = array_shift( $files );
+ $this->purgeThumbList( $dir, $files );
+
// Purge the squid
if ( $wgUseSquid ) {
SquidUpdate::purge( $urls );
* the HTML for the input field to be placed in the table.
*
* You can find extensive documentation on the www.mediawiki.org wiki:
- * - http://www.mediawiki.org/wiki/HTMLForm
- * - http://www.mediawiki.org/wiki/HTMLForm/tutorial
+ * - https://www.mediawiki.org/wiki/HTMLForm
+ * - https://www.mediawiki.org/wiki/HTMLForm/tutorial
*
* The constructor input is an associative array of $fieldname => $info,
* where $info is an Associative Array with any of the following:
'edittools' => 'HTMLEditTools',
'checkmatrix' => 'HTMLCheckMatrix',
// HTMLTextField will output the correct type="" attribute automagically.
- // There are about four zillion other HTML5 input types, like url, but
+ // There are about four zillion other HTML5 input types, like range, but
// we don't use those at the moment, so no point in adding all of them.
'email' => 'HTMLTextField',
'password' => 'HTMLTextField',
+ 'url' => 'HTMLTextField',
);
public $mFieldData;
# is essentially just a clone of this one.
if ( isset( $this->mParams['type'] ) ) {
switch ( $this->mParams['type'] ) {
- case 'email':
- $attribs['type'] = 'email';
- break;
case 'int':
$attribs['type'] = 'number';
break;
$attribs['step'] = 'any';
break;
# Pass through
+ case 'email':
case 'password':
case 'file':
+ case 'url':
$attribs['type'] = $this->mParams['type'];
break;
}
}
protected function replaceConfigLinks( $matches ) {
- return '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:' .
+ return '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:' .
$matches[1] . ' ' . $matches[1] . ']</span>';
}
}
# file, not there.
#
# Further documentation for configuration settings may be found at:
-# http://www.mediawiki.org/wiki/Manual:Configuration_settings
+# https://www.mediawiki.org/wiki/Manual:Configuration_settings
# Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs
## (like /w/index.php/Page_title to /wiki/Page_title) please see:
-## http://www.mediawiki.org/wiki/Manual:Short_URL
+## https://www.mediawiki.org/wiki/Manual:Short_URL
\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
${serverSetting}
<div id="mw-panel">
<div class="portal" id="p-logo">
<a style="background-image: url(../skins/common/images/mediawiki.png);"
- href="http://www.mediawiki.org/"
+ href="https://www.mediawiki.org/"
title="Main Page"></a>
</div>
<div class="portal"><div class="body">
+++ /dev/null
-<?php
-/**
- * Job queue task base code.
- *
- * 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
- * @defgroup JobQueue JobQueue
- */
-
-/**
- * Class to both describe a background job and handle jobs.
- * The queue aspects of this class are now deprecated.
- * Using the class to push jobs onto queues is deprecated (use JobSpecification).
- *
- * @ingroup JobQueue
- */
-abstract class Job implements IJobSpecification {
- /** @var string */
- public $command;
-
- /** @var array|bool Array of job parameters or false if none */
- public $params;
-
- /** @var array Additional queue metadata */
- public $metadata = array();
-
- /** @var Title */
- protected $title;
-
- /** @var bool Expensive jobs may set this to true */
- protected $removeDuplicates;
-
- /** @var string Text for error that occurred last */
- protected $error;
-
- /*-------------------------------------------------------------------------
- * Abstract functions
- *------------------------------------------------------------------------*/
-
- /**
- * Run the job
- * @return bool Success
- */
- abstract public function run();
-
- /*-------------------------------------------------------------------------
- * Static functions
- *------------------------------------------------------------------------*/
-
- /**
- * Create the appropriate object to handle a specific job
- *
- * @param string $command Job command
- * @param Title $title Associated title
- * @param array|bool $params Job parameters
- * @throws MWException
- * @return Job
- */
- public static function factory( $command, Title $title, $params = false ) {
- global $wgJobClasses;
- if ( isset( $wgJobClasses[$command] ) ) {
- $class = $wgJobClasses[$command];
-
- return new $class( $title, $params );
- }
- throw new MWException( "Invalid job command `{$command}`" );
- }
-
- /**
- * Batch-insert a group of jobs into the queue.
- * This will be wrapped in a transaction with a forced commit.
- *
- * This may add duplicate at insert time, but they will be
- * removed later on, when the first one is popped.
- *
- * @param array $jobs of Job objects
- * @return bool
- * @deprecated since 1.21
- */
- public static function batchInsert( $jobs ) {
- return JobQueueGroup::singleton()->push( $jobs );
- }
-
- /**
- * Insert a group of jobs into the queue.
- *
- * Same as batchInsert() but does not commit and can thus
- * be rolled-back as part of a larger transaction. However,
- * large batches of jobs can cause slave lag.
- *
- * @param array $jobs of Job objects
- * @return bool
- * @deprecated since 1.21
- */
- public static function safeBatchInsert( $jobs ) {
- return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
- }
-
- /**
- * Pop a job of a certain type. This tries less hard than pop() to
- * actually find a job; it may be adversely affected by concurrent job
- * runners.
- *
- * @param $type string
- * @return Job|bool Returns false if there are no jobs
- * @deprecated since 1.21
- */
- public static function pop_type( $type ) {
- return JobQueueGroup::singleton()->get( $type )->pop();
- }
-
- /**
- * Pop a job off the front of the queue.
- * This is subject to $wgJobTypesExcludedFromDefaultQueue.
- *
- * @return Job|bool False if there are no jobs
- * @deprecated since 1.21
- */
- public static function pop() {
- return JobQueueGroup::singleton()->pop();
- }
-
- /*-------------------------------------------------------------------------
- * Non-static functions
- *------------------------------------------------------------------------*/
-
- /**
- * @param $command
- * @param $title
- * @param $params array|bool
- */
- public function __construct( $command, $title, $params = false ) {
- $this->command = $command;
- $this->title = $title;
- $this->params = $params;
-
- // expensive jobs may set this to true
- $this->removeDuplicates = false;
- }
-
- /**
- * @return string
- */
- public function getType() {
- return $this->command;
- }
-
- /**
- * @return Title
- */
- public function getTitle() {
- return $this->title;
- }
-
- /**
- * @return array
- */
- public function getParams() {
- return $this->params;
- }
-
- /**
- * @return int|null UNIX timestamp to delay running this job until, otherwise null
- * @since 1.22
- */
- public function getReleaseTimestamp() {
- return isset( $this->params['jobReleaseTimestamp'] )
- ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
- : null;
- }
-
- /**
- * @return bool Whether only one of each identical set of jobs should be run
- */
- public function ignoreDuplicates() {
- return $this->removeDuplicates;
- }
-
- /**
- * @return bool Whether this job can be retried on failure by job runners
- * @since 1.21
- */
- public function allowRetries() {
- return true;
- }
-
- /**
- * @return integer Number of actually "work items" handled in this job
- * @see $wgJobBackoffThrottling
- * @since 1.23
- */
- public function workItemCount() {
- return 1;
- }
-
- /**
- * Subclasses may need to override this to make duplication detection work.
- * The resulting map conveys everything that makes the job unique. This is
- * only checked if ignoreDuplicates() returns true, meaning that duplicate
- * jobs are supposed to be ignored.
- *
- * @return array Map of key/values
- * @since 1.21
- */
- public function getDeduplicationInfo() {
- $info = array(
- 'type' => $this->getType(),
- 'namespace' => $this->getTitle()->getNamespace(),
- 'title' => $this->getTitle()->getDBkey(),
- 'params' => $this->getParams()
- );
- if ( is_array( $info['params'] ) ) {
- // Identical jobs with different "root" jobs should count as duplicates
- unset( $info['params']['rootJobSignature'] );
- unset( $info['params']['rootJobTimestamp'] );
- // Likewise for jobs with different delay times
- unset( $info['params']['jobReleaseTimestamp'] );
- }
-
- return $info;
- }
-
- /**
- * @see JobQueue::deduplicateRootJob()
- * @param string $key A key that identifies the task
- * @return array Map of:
- * - rootJobSignature : hash (e.g. SHA1) that identifies the task
- * - rootJobTimestamp : TS_MW timestamp of this instance of the task
- * @since 1.21
- */
- public static function newRootJobParams( $key ) {
- return array(
- 'rootJobSignature' => sha1( $key ),
- 'rootJobTimestamp' => wfTimestampNow()
- );
- }
-
- /**
- * @see JobQueue::deduplicateRootJob()
- * @return array
- * @since 1.21
- */
- public function getRootJobParams() {
- return array(
- 'rootJobSignature' => isset( $this->params['rootJobSignature'] )
- ? $this->params['rootJobSignature']
- : null,
- 'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
- ? $this->params['rootJobTimestamp']
- : null
- );
- }
-
- /**
- * @see JobQueue::deduplicateRootJob()
- * @return bool
- * @since 1.22
- */
- public function hasRootJobParams() {
- return isset( $this->params['rootJobSignature'] )
- && isset( $this->params['rootJobTimestamp'] );
- }
-
- /**
- * Insert a single job into the queue.
- * @return bool true on success
- * @deprecated since 1.21
- */
- public function insert() {
- return JobQueueGroup::singleton()->push( $this );
- }
-
- /**
- * @return string
- */
- public function toString() {
- $paramString = '';
- if ( $this->params ) {
- foreach ( $this->params as $key => $value ) {
- if ( $paramString != '' ) {
- $paramString .= ' ';
- }
- if ( is_array( $value ) ) {
- $value = "array(" . count( $value ) . ")";
- } elseif ( is_object( $value ) && !method_exists( $value, '__toString' ) ) {
- $value = "object(" . get_class( $value ) . ")";
- }
- $value = (string)$value;
- if ( mb_strlen( $value ) > 1024 ) {
- $value = "string(" . mb_strlen( $value ) . ")";
- }
-
- $paramString .= "$key=$value";
- }
- }
-
- if ( is_object( $this->title ) ) {
- $s = "{$this->command} " . $this->title->getPrefixedDBkey();
- if ( $paramString !== '' ) {
- $s .= ' ' . $paramString;
- }
-
- return $s;
- } else {
- return "{$this->command} $paramString";
- }
- }
-
- protected function setLastError( $error ) {
- $this->error = $error;
- }
-
- public function getLastError() {
- return $this->error;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job queue base code.
- *
- * 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
- * @defgroup JobQueue JobQueue
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle enqueueing and running of background jobs
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-abstract class JobQueue {
- /** @var string Wiki ID */
- protected $wiki;
-
- /** @var string Job type */
- protected $type;
-
- /** @var string Job priority for pop() */
- protected $order;
-
- /** @var int Time to live in seconds */
- protected $claimTTL;
-
- /** @var int Maximum number of times to try a job */
- protected $maxTries;
-
- /** @var bool Allow delayed jobs */
- protected $checkDelay;
-
- /** @var BagOStuff */
- protected $dupCache;
-
- const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions
-
- const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
-
- /**
- * @param array $params
- * @throws MWException
- */
- protected function __construct( array $params ) {
- $this->wiki = $params['wiki'];
- $this->type = $params['type'];
- $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
- $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
- if ( isset( $params['order'] ) && $params['order'] !== 'any' ) {
- $this->order = $params['order'];
- } else {
- $this->order = $this->optimalOrder();
- }
- if ( !in_array( $this->order, $this->supportedOrders() ) ) {
- throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
- }
- $this->checkDelay = !empty( $params['checkDelay'] );
- if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
- throw new MWException( __CLASS__ . " does not support delayed jobs." );
- }
- $this->dupCache = wfGetCache( CACHE_ANYTHING );
- }
-
- /**
- * Get a job queue object of the specified type.
- * $params includes:
- * - class : What job class to use (determines job type)
- * - wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
- * - type : The name of the job types this queue handles
- * - order : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
- * If "fifo" is used, the queue will effectively be FIFO. Note that job
- * completion will not appear to be exactly FIFO if there are multiple
- * job runners since jobs can take different times to finish once popped.
- * If "timestamp" is used, the queue will at least be loosely ordered
- * by timestamp, allowing for some jobs to be popped off out of order.
- * If "random" is used, pop() will pick jobs in random order.
- * Note that it may only be weakly random (e.g. a lottery of the oldest X).
- * If "any" is choosen, the queue will use whatever order is the fastest.
- * This might be useful for improving concurrency for job acquisition.
- * - claimTTL : If supported, the queue will recycle jobs that have been popped
- * but not acknowledged as completed after this many seconds. Recycling
- * of jobs simple means re-inserting them into the queue. Jobs can be
- * attempted up to three times before being discarded.
- * - checkDelay : If supported, respect Job::getReleaseTimestamp() in the push functions.
- * This lets delayed jobs wait in a staging area until a given timestamp is
- * reached, at which point they will enter the queue. If this is not enabled
- * or not supported, an exception will be thrown on delayed job insertion.
- *
- * Queue classes should throw an exception if they do not support the options given.
- *
- * @param array $params
- * @return JobQueue
- * @throws MWException
- */
- final public static function factory( array $params ) {
- $class = $params['class'];
- if ( !class_exists( $class ) ) {
- throw new MWException( "Invalid job queue class '$class'." );
- }
- $obj = new $class( $params );
- if ( !( $obj instanceof self ) ) {
- throw new MWException( "Class '$class' is not a " . __CLASS__ . " class." );
- }
-
- return $obj;
- }
-
- /**
- * @return string Wiki ID
- */
- final public function getWiki() {
- return $this->wiki;
- }
-
- /**
- * @return string Job type that this queue handles
- */
- final public function getType() {
- return $this->type;
- }
-
- /**
- * @return string One of (random, timestamp, fifo, undefined)
- */
- final public function getOrder() {
- return $this->order;
- }
-
- /**
- * @return bool Whether delayed jobs are enabled
- * @since 1.22
- */
- final public function delayedJobsEnabled() {
- return $this->checkDelay;
- }
-
- /**
- * Get the allowed queue orders for configuration validation
- *
- * @return array Subset of (random, timestamp, fifo, undefined)
- */
- abstract protected function supportedOrders();
-
- /**
- * Get the default queue order to use if configuration does not specify one
- *
- * @return string One of (random, timestamp, fifo, undefined)
- */
- abstract protected function optimalOrder();
-
- /**
- * Find out if delayed jobs are supported for configuration validation
- *
- * @return bool Whether delayed jobs are supported
- */
- protected function supportsDelayedJobs() {
- return false; // not implemented
- }
-
- /**
- * Quickly check if the queue has no available (unacquired, non-delayed) jobs.
- * Queue classes should use caching if they are any slower without memcached.
- *
- * If caching is used, this might return false when there are actually no jobs.
- * If pop() is called and returns false then it should correct the cache. Also,
- * calling flushCaches() first prevents this. However, this affect is typically
- * not distinguishable from the race condition between isEmpty() and pop().
- *
- * @return bool
- * @throws JobQueueError
- */
- final public function isEmpty() {
- wfProfileIn( __METHOD__ );
- $res = $this->doIsEmpty();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueue::isEmpty()
- * @return bool
- */
- abstract protected function doIsEmpty();
-
- /**
- * Get the number of available (unacquired, non-delayed) jobs in the queue.
- * Queue classes should use caching if they are any slower without memcached.
- *
- * If caching is used, this number might be out of date for a minute.
- *
- * @return int
- * @throws JobQueueError
- */
- final public function getSize() {
- wfProfileIn( __METHOD__ );
- $res = $this->doGetSize();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueue::getSize()
- * @return int
- */
- abstract protected function doGetSize();
-
- /**
- * Get the number of acquired jobs (these are temporarily out of the queue).
- * Queue classes should use caching if they are any slower without memcached.
- *
- * If caching is used, this number might be out of date for a minute.
- *
- * @return int
- * @throws JobQueueError
- */
- final public function getAcquiredCount() {
- wfProfileIn( __METHOD__ );
- $res = $this->doGetAcquiredCount();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueue::getAcquiredCount()
- * @return int
- */
- abstract protected function doGetAcquiredCount();
-
- /**
- * Get the number of delayed jobs (these are temporarily out of the queue).
- * Queue classes should use caching if they are any slower without memcached.
- *
- * If caching is used, this number might be out of date for a minute.
- *
- * @return int
- * @throws JobQueueError
- * @since 1.22
- */
- final public function getDelayedCount() {
- wfProfileIn( __METHOD__ );
- $res = $this->doGetDelayedCount();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueue::getDelayedCount()
- * @return int
- */
- protected function doGetDelayedCount() {
- return 0; // not implemented
- }
-
- /**
- * Get the number of acquired jobs that can no longer be attempted.
- * Queue classes should use caching if they are any slower without memcached.
- *
- * If caching is used, this number might be out of date for a minute.
- *
- * @return int
- * @throws JobQueueError
- */
- final public function getAbandonedCount() {
- wfProfileIn( __METHOD__ );
- $res = $this->doGetAbandonedCount();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueue::getAbandonedCount()
- * @return int
- */
- protected function doGetAbandonedCount() {
- return 0; // not implemented
- }
-
- /**
- * Push one or more jobs into the queue.
- * This does not require $wgJobClasses to be set for the given job type.
- * Outside callers should use JobQueueGroup::push() instead of this function.
- *
- * @param Job|array $jobs A single job or an array of Jobs
- * @param int $flags Bitfield (supports JobQueue::QOS_ATOMIC)
- * @return bool Returns false on failure
- * @throws JobQueueError
- */
- final public function push( $jobs, $flags = 0 ) {
- return $this->batchPush( is_array( $jobs ) ? $jobs : array( $jobs ), $flags );
- }
-
- /**
- * Push a batch of jobs into the queue.
- * This does not require $wgJobClasses to be set for the given job type.
- * Outside callers should use JobQueueGroup::push() instead of this function.
- *
- * @param array $jobs List of Jobs
- * @param int $flags Bitfield (supports JobQueue::QOS_ATOMIC)
- * @throws MWException
- * @return bool Returns false on failure
- */
- final public function batchPush( array $jobs, $flags = 0 ) {
- if ( !count( $jobs ) ) {
- return true; // nothing to do
- }
-
- foreach ( $jobs as $job ) {
- if ( $job->getType() !== $this->type ) {
- throw new MWException(
- "Got '{$job->getType()}' job; expected a '{$this->type}' job." );
- } elseif ( $job->getReleaseTimestamp() && !$this->checkDelay ) {
- throw new MWException(
- "Got delayed '{$job->getType()}' job; delays are not supported." );
- }
- }
-
- wfProfileIn( __METHOD__ );
- $ok = $this->doBatchPush( $jobs, $flags );
- wfProfileOut( __METHOD__ );
-
- return $ok;
- }
-
- /**
- * @see JobQueue::batchPush()
- * @param array $jobs
- * @param $flags
- * @return bool
- */
- abstract protected function doBatchPush( array $jobs, $flags );
-
- /**
- * Pop a job off of the queue.
- * This requires $wgJobClasses to be set for the given job type.
- * Outside callers should use JobQueueGroup::pop() instead of this function.
- *
- * @throws MWException
- * @return Job|bool Returns false if there are no jobs
- */
- final public function pop() {
- global $wgJobClasses;
-
- if ( $this->wiki !== wfWikiID() ) {
- throw new MWException( "Cannot pop '{$this->type}' job off foreign wiki queue." );
- } elseif ( !isset( $wgJobClasses[$this->type] ) ) {
- // Do not pop jobs if there is no class for the queue type
- throw new MWException( "Unrecognized job type '{$this->type}'." );
- }
-
- wfProfileIn( __METHOD__ );
- $job = $this->doPop();
- wfProfileOut( __METHOD__ );
-
- // Flag this job as an old duplicate based on its "root" job...
- try {
- if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
- JobQueue::incrStats( 'job-pop-duplicate', $this->type );
- $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
- }
- } catch ( MWException $e ) {
- // don't lose jobs over this
- }
-
- return $job;
- }
-
- /**
- * @see JobQueue::pop()
- * @return Job
- */
- abstract protected function doPop();
-
- /**
- * Acknowledge that a job was completed.
- *
- * This does nothing for certain queue classes or if "claimTTL" is not set.
- * Outside callers should use JobQueueGroup::ack() instead of this function.
- *
- * @param Job $job
- * @throws MWException
- * @return bool
- */
- final public function ack( Job $job ) {
- if ( $job->getType() !== $this->type ) {
- throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
- }
- wfProfileIn( __METHOD__ );
- $ok = $this->doAck( $job );
- wfProfileOut( __METHOD__ );
-
- return $ok;
- }
-
- /**
- * @see JobQueue::ack()
- * @param Job $job
- * @return bool
- */
- abstract protected function doAck( Job $job );
-
- /**
- * Register the "root job" of a given job into the queue for de-duplication.
- * This should only be called right *after* all the new jobs have been inserted.
- * This is used to turn older, duplicate, job entries into no-ops. The root job
- * information will remain in the registry until it simply falls out of cache.
- *
- * This requires that $job has two special fields in the "params" array:
- * - rootJobSignature : hash (e.g. SHA1) that identifies the task
- * - rootJobTimestamp : TS_MW timestamp of this instance of the task
- *
- * A "root job" is a conceptual job that consist of potentially many smaller jobs
- * that are actually inserted into the queue. For example, "refreshLinks" jobs are
- * spawned when a template is edited. One can think of the task as "update links
- * of pages that use template X" and an instance of that task as a "root job".
- * However, what actually goes into the queue are range and leaf job subtypes.
- * Since these jobs include things like page ID ranges and DB master positions,
- * and can morph into smaller jobs recursively, simple duplicate detection
- * for individual jobs being identical (like that of job_sha1) is not useful.
- *
- * In the case of "refreshLinks", if these jobs are still in the queue when the template
- * is edited again, we want all of these old refreshLinks jobs for that template to become
- * no-ops. This can greatly reduce server load, since refreshLinks jobs involves parsing.
- * Essentially, the new batch of jobs belong to a new "root job" and the older ones to a
- * previous "root job" for the same task of "update links of pages that use template X".
- *
- * This does nothing for certain queue classes.
- *
- * @param Job $job
- * @throws MWException
- * @return bool
- */
- final public function deduplicateRootJob( Job $job ) {
- if ( $job->getType() !== $this->type ) {
- throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
- }
- wfProfileIn( __METHOD__ );
- $ok = $this->doDeduplicateRootJob( $job );
- wfProfileOut( __METHOD__ );
-
- return $ok;
- }
-
- /**
- * @see JobQueue::deduplicateRootJob()
- * @param Job $job
- * @throws MWException
- * @return bool
- */
- protected function doDeduplicateRootJob( Job $job ) {
- if ( !$job->hasRootJobParams() ) {
- throw new MWException( "Cannot register root job; missing parameters." );
- }
- $params = $job->getRootJobParams();
-
- $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
- // Callers should call batchInsert() and then this function so that if the insert
- // fails, the de-duplication registration will be aborted. Since the insert is
- // deferred till "transaction idle", do the same here, so that the ordering is
- // maintained. Having only the de-duplication registration succeed would cause
- // jobs to become no-ops without any actual jobs that made them redundant.
- $timestamp = $this->dupCache->get( $key ); // current last timestamp of this job
- if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
- return true; // a newer version of this root job was enqueued
- }
-
- // Update the timestamp of the last root job started at the location...
- return $this->dupCache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
- }
-
- /**
- * Check if the "root" job of a given job has been superseded by a newer one
- *
- * @param Job $job
- * @throws MWException
- * @return bool
- */
- final protected function isRootJobOldDuplicate( Job $job ) {
- if ( $job->getType() !== $this->type ) {
- throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
- }
- wfProfileIn( __METHOD__ );
- $isDuplicate = $this->doIsRootJobOldDuplicate( $job );
- wfProfileOut( __METHOD__ );
-
- return $isDuplicate;
- }
-
- /**
- * @see JobQueue::isRootJobOldDuplicate()
- * @param Job $job
- * @return bool
- */
- protected function doIsRootJobOldDuplicate( Job $job ) {
- if ( !$job->hasRootJobParams() ) {
- return false; // job has no de-deplication info
- }
- $params = $job->getRootJobParams();
-
- $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
- // Get the last time this root job was enqueued
- $timestamp = $this->dupCache->get( $key );
-
- // Check if a new root job was started at the location after this one's...
- return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
- }
-
- /**
- * @param string $signature Hash identifier of the root job
- * @return string
- */
- protected function getRootJobCacheKey( $signature ) {
- list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
- }
-
- /**
- * Deleted all unclaimed and delayed jobs from the queue
- *
- * @return bool Success
- * @throws JobQueueError
- * @since 1.22
- */
- final public function delete() {
- wfProfileIn( __METHOD__ );
- $res = $this->doDelete();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueue::delete()
- * @throws MWException
- * @return bool Success
- */
- protected function doDelete() {
- throw new MWException( "This method is not implemented." );
- }
-
- /**
- * Wait for any slaves or backup servers to catch up.
- *
- * This does nothing for certain queue classes.
- *
- * @return void
- * @throws JobQueueError
- */
- final public function waitForBackups() {
- wfProfileIn( __METHOD__ );
- $this->doWaitForBackups();
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * @see JobQueue::waitForBackups()
- * @return void
- */
- protected function doWaitForBackups() {
- }
-
- /**
- * Return a map of task names to task definition maps.
- * A "task" is a fast periodic queue maintenance action.
- * Mutually exclusive tasks must implement their own locking in the callback.
- *
- * Each task value is an associative array with:
- * - name : the name of the task
- * - callback : a PHP callable that performs the task
- * - period : the period in seconds corresponding to the task frequency
- *
- * @return array
- */
- final public function getPeriodicTasks() {
- $tasks = $this->doGetPeriodicTasks();
- foreach ( $tasks as $name => &$def ) {
- $def['name'] = $name;
- }
-
- return $tasks;
- }
-
- /**
- * @see JobQueue::getPeriodicTasks()
- * @return array
- */
- protected function doGetPeriodicTasks() {
- return array();
- }
-
- /**
- * Clear any process and persistent caches
- *
- * @return void
- */
- final public function flushCaches() {
- wfProfileIn( __METHOD__ );
- $this->doFlushCaches();
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * @see JobQueue::flushCaches()
- * @return void
- */
- protected function doFlushCaches() {
- }
-
- /**
- * Get an iterator to traverse over all available jobs in this queue.
- * This does not include jobs that are currently acquired or delayed.
- * Note: results may be stale if the queue is concurrently modified.
- *
- * @return Iterator
- * @throws JobQueueError
- */
- abstract public function getAllQueuedJobs();
-
- /**
- * Get an iterator to traverse over all delayed jobs in this queue.
- * Note: results may be stale if the queue is concurrently modified.
- *
- * @return Iterator
- * @throws JobQueueError
- * @since 1.22
- */
- public function getAllDelayedJobs() {
- return new ArrayIterator( array() ); // not implemented
- }
-
- /**
- * Do not use this function outside of JobQueue/JobQueueGroup
- *
- * @return string
- * @since 1.22
- */
- public function getCoalesceLocationInternal() {
- return null;
- }
-
- /**
- * Check whether each of the given queues are empty.
- * This is used for batching checks for queues stored at the same place.
- *
- * @param array $types List of queues types
- * @return array|null (list of non-empty queue types) or null if unsupported
- * @throws MWException
- * @since 1.22
- */
- final public function getSiblingQueuesWithJobs( array $types ) {
- $section = new ProfileSection( __METHOD__ );
-
- return $this->doGetSiblingQueuesWithJobs( $types );
- }
-
- /**
- * @see JobQueue::getSiblingQueuesWithJobs()
- * @param array $types List of queues types
- * @return array|null (list of queue types) or null if unsupported
- */
- protected function doGetSiblingQueuesWithJobs( array $types ) {
- return null; // not supported
- }
-
- /**
- * Check the size of each of the given queues.
- * For queues not served by the same store as this one, 0 is returned.
- * This is used for batching checks for queues stored at the same place.
- *
- * @param array $types List of queues types
- * @return array|null (job type => whether queue is empty) or null if unsupported
- * @throws MWException
- * @since 1.22
- */
- final public function getSiblingQueueSizes( array $types ) {
- $section = new ProfileSection( __METHOD__ );
-
- return $this->doGetSiblingQueueSizes( $types );
- }
-
- /**
- * @see JobQueue::getSiblingQueuesSize()
- * @param array $types List of queues types
- * @return array|null (list of queue types) or null if unsupported
- */
- protected function doGetSiblingQueueSizes( array $types ) {
- return null; // not supported
- }
-
- /**
- * Call wfIncrStats() for the queue overall and for the queue type
- *
- * @param string $key Event type
- * @param string $type Job type
- * @param int $delta
- * @since 1.22
- */
- public static function incrStats( $key, $type, $delta = 1 ) {
- wfIncrStats( $key, $delta );
- wfIncrStats( "{$key}-{$type}", $delta );
- }
-
- /**
- * Namespace the queue with a key to isolate it for testing
- *
- * @param string $key
- * @return void
- * @throws MWException
- */
- public function setTestingPrefix( $key ) {
- throw new MWException( "Queue namespacing not supported for this queue type." );
- }
-}
-
-/**
- * @ingroup JobQueue
- * @since 1.22
- */
-class JobQueueError extends MWException {
-}
-
-class JobQueueConnectionError extends JobQueueError {
-}
+++ /dev/null
-<?php
-/**
- * Database-backed job queue code.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle job queues stored in the DB
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-class JobQueueDB extends JobQueue {
- const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
- const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
- const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
- const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
- const MAX_OFFSET = 255; // integer; maximum number of rows to skip
-
- /** @var BagOStuff */
- protected $cache;
-
- /** @var bool|string Name of an external DB cluster. False if not set */
- protected $cluster = false;
-
- /**
- * Additional parameters include:
- * - cluster : The name of an external cluster registered via LBFactory.
- * If not specified, the primary DB cluster for the wiki will be used.
- * This can be overridden with a custom cluster so that DB handles will
- * be retrieved via LBFactory::getExternalLB() and getConnection().
- * @param array $params
- */
- protected function __construct( array $params ) {
- global $wgMemc;
-
- parent::__construct( $params );
-
- $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
- // Make sure that we don't use the SQL cache, which would be harmful
- $this->cache = ( $wgMemc instanceof SqlBagOStuff ) ? new EmptyBagOStuff() : $wgMemc;
- }
-
- protected function supportedOrders() {
- return array( 'random', 'timestamp', 'fifo' );
- }
-
- protected function optimalOrder() {
- return 'random';
- }
-
- /**
- * @see JobQueue::doIsEmpty()
- * @return bool
- */
- protected function doIsEmpty() {
- $key = $this->getCacheKey( 'empty' );
-
- $isEmpty = $this->cache->get( $key );
- if ( $isEmpty === 'true' ) {
- return true;
- } elseif ( $isEmpty === 'false' ) {
- return false;
- }
-
- $dbr = $this->getSlaveDB();
- try {
- $found = $dbr->selectField( // unclaimed job
- 'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
- );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
- $this->cache->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
-
- return !$found;
- }
-
- /**
- * @see JobQueue::doGetSize()
- * @return int
- */
- protected function doGetSize() {
- $key = $this->getCacheKey( 'size' );
-
- $size = $this->cache->get( $key );
- if ( is_int( $size ) ) {
- return $size;
- }
-
- try {
- $dbr = $this->getSlaveDB();
- $size = (int)$dbr->selectField( 'job', 'COUNT(*)',
- array( 'job_cmd' => $this->type, 'job_token' => '' ),
- __METHOD__
- );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
- $this->cache->set( $key, $size, self::CACHE_TTL_SHORT );
-
- return $size;
- }
-
- /**
- * @see JobQueue::doGetAcquiredCount()
- * @return int
- */
- protected function doGetAcquiredCount() {
- if ( $this->claimTTL <= 0 ) {
- return 0; // no acknowledgements
- }
-
- $key = $this->getCacheKey( 'acquiredcount' );
-
- $count = $this->cache->get( $key );
- if ( is_int( $count ) ) {
- return $count;
- }
-
- $dbr = $this->getSlaveDB();
- try {
- $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
- array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
- __METHOD__
- );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
- $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
-
- return $count;
- }
-
- /**
- * @see JobQueue::doGetAbandonedCount()
- * @return int
- * @throws MWException
- */
- protected function doGetAbandonedCount() {
- global $wgMemc;
-
- if ( $this->claimTTL <= 0 ) {
- return 0; // no acknowledgements
- }
-
- $key = $this->getCacheKey( 'abandonedcount' );
-
- $count = $wgMemc->get( $key );
- if ( is_int( $count ) ) {
- return $count;
- }
-
- $dbr = $this->getSlaveDB();
- try {
- $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
- array(
- 'job_cmd' => $this->type,
- "job_token != {$dbr->addQuotes( '' )}",
- "job_attempts >= " . $dbr->addQuotes( $this->maxTries )
- ),
- __METHOD__
- );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
- $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
-
- return $count;
- }
-
- /**
- * @see JobQueue::doBatchPush()
- * @param array $jobs
- * @param $flags
- * @throws DBError|Exception
- * @return bool
- */
- protected function doBatchPush( array $jobs, $flags ) {
- $dbw = $this->getMasterDB();
-
- $that = $this;
- $method = __METHOD__;
- $dbw->onTransactionIdle(
- function () use ( $dbw, $that, $jobs, $flags, $method ) {
- $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
- }
- );
-
- return true;
- }
-
- /**
- * This function should *not* be called outside of JobQueueDB
- *
- * @param IDatabase $dbw
- * @param array $jobs
- * @param int $flags
- * @param string $method
- * @throws DBError
- * @return bool
- */
- public function doBatchPushInternal( IDatabase $dbw, array $jobs, $flags, $method ) {
- if ( !count( $jobs ) ) {
- return true;
- }
-
- $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
- $rowList = array(); // list of jobs for jobs that are are not de-duplicated
- foreach ( $jobs as $job ) {
- $row = $this->insertFields( $job );
- if ( $job->ignoreDuplicates() ) {
- $rowSet[$row['job_sha1']] = $row;
- } else {
- $rowList[] = $row;
- }
- }
-
- if ( $flags & self::QOS_ATOMIC ) {
- $dbw->begin( $method ); // wrap all the job additions in one transaction
- }
- try {
- // Strip out any duplicate jobs that are already in the queue...
- if ( count( $rowSet ) ) {
- $res = $dbw->select( 'job', 'job_sha1',
- array(
- // No job_type condition since it's part of the job_sha1 hash
- 'job_sha1' => array_keys( $rowSet ),
- 'job_token' => '' // unclaimed
- ),
- $method
- );
- foreach ( $res as $row ) {
- wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate.\n" );
- unset( $rowSet[$row->job_sha1] ); // already enqueued
- }
- }
- // Build the full list of job rows to insert
- $rows = array_merge( $rowList, array_values( $rowSet ) );
- // Insert the job rows in chunks to avoid slave lag...
- foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
- $dbw->insert( 'job', $rowBatch, $method );
- }
- JobQueue::incrStats( 'job-insert', $this->type, count( $rows ) );
- JobQueue::incrStats(
- 'job-insert-duplicate',
- $this->type,
- count( $rowSet ) + count( $rowList ) - count( $rows )
- );
- } catch ( DBError $e ) {
- if ( $flags & self::QOS_ATOMIC ) {
- $dbw->rollback( $method );
- }
- throw $e;
- }
- if ( $flags & self::QOS_ATOMIC ) {
- $dbw->commit( $method );
- }
-
- $this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
-
- return true;
- }
-
- /**
- * @see JobQueue::doPop()
- * @return Job|bool
- */
- protected function doPop() {
- if ( $this->cache->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
- return false; // queue is empty
- }
-
- $dbw = $this->getMasterDB();
- try {
- $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
- $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
- $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
- $scopedReset = new ScopedCallback( function () use ( $dbw, $autoTrx ) {
- $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
- } );
-
- $uuid = wfRandomString( 32 ); // pop attempt
- $job = false; // job popped off
- do { // retry when our row is invalid or deleted as a duplicate
- // Try to reserve a row in the DB...
- if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
- $row = $this->claimOldest( $uuid );
- } else { // random first
- $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
- $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
- $row = $this->claimRandom( $uuid, $rand, $gte );
- }
- // Check if we found a row to reserve...
- if ( !$row ) {
- $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
- break; // nothing to do
- }
- JobQueue::incrStats( 'job-pop', $this->type );
- // Get the job object from the row...
- $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
- if ( !$title ) {
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- wfDebug( "Row has invalid title '{$row->job_title}'." );
- continue; // try again
- }
- $job = Job::factory( $row->job_cmd, $title,
- self::extractBlob( $row->job_params ), $row->job_id );
- $job->metadata['id'] = $row->job_id;
- break; // done
- } while ( true );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
-
- return $job;
- }
-
- /**
- * Reserve a row with a single UPDATE without holding row locks over RTTs...
- *
- * @param string $uuid 32 char hex string
- * @param $rand integer Random unsigned integer (31 bits)
- * @param bool $gte Search for job_random >= $random (otherwise job_random <= $random)
- * @return stdClass|bool Row|false
- */
- protected function claimRandom( $uuid, $rand, $gte ) {
- $dbw = $this->getMasterDB();
- // Check cache to see if the queue has <= OFFSET items
- $tinyQueue = $this->cache->get( $this->getCacheKey( 'small' ) );
-
- $row = false; // the row acquired
- $invertedDirection = false; // whether one job_random direction was already scanned
- // This uses a replication safe method for acquiring jobs. One could use UPDATE+LIMIT
- // instead, but that either uses ORDER BY (in which case it deadlocks in MySQL) or is
- // not replication safe. Due to http://bugs.mysql.com/bug.php?id=6980, subqueries cannot
- // be used here with MySQL.
- do {
- if ( $tinyQueue ) { // queue has <= MAX_OFFSET rows
- // For small queues, using OFFSET will overshoot and return no rows more often.
- // Instead, this uses job_random to pick a row (possibly checking both directions).
- $ineq = $gte ? '>=' : '<=';
- $dir = $gte ? 'ASC' : 'DESC';
- $row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
- array(
- 'job_cmd' => $this->type,
- 'job_token' => '', // unclaimed
- "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
- __METHOD__,
- array( 'ORDER BY' => "job_random {$dir}" )
- );
- if ( !$row && !$invertedDirection ) {
- $gte = !$gte;
- $invertedDirection = true;
- continue; // try the other direction
- }
- } else { // table *may* have >= MAX_OFFSET rows
- // Bug 42614: "ORDER BY job_random" with a job_random inequality causes high CPU
- // in MySQL if there are many rows for some reason. This uses a small OFFSET
- // instead of job_random for reducing excess claim retries.
- $row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
- array(
- 'job_cmd' => $this->type,
- 'job_token' => '', // unclaimed
- ),
- __METHOD__,
- array( 'OFFSET' => mt_rand( 0, self::MAX_OFFSET ) )
- );
- if ( !$row ) {
- $tinyQueue = true; // we know the queue must have <= MAX_OFFSET rows
- $this->cache->set( $this->getCacheKey( 'small' ), 1, 30 );
- continue; // use job_random
- }
- }
-
- if ( $row ) { // claim the job
- $dbw->update( 'job', // update by PK
- array(
- 'job_token' => $uuid,
- 'job_token_timestamp' => $dbw->timestamp(),
- 'job_attempts = job_attempts+1' ),
- array( 'job_cmd' => $this->type, 'job_id' => $row->job_id, 'job_token' => '' ),
- __METHOD__
- );
- // This might get raced out by another runner when claiming the previously
- // selected row. The use of job_random should minimize this problem, however.
- if ( !$dbw->affectedRows() ) {
- $row = false; // raced out
- }
- } else {
- break; // nothing to do
- }
- } while ( !$row );
-
- return $row;
- }
-
- /**
- * Reserve a row with a single UPDATE without holding row locks over RTTs...
- *
- * @param string $uuid 32 char hex string
- * @return stdClass|bool Row|false
- */
- protected function claimOldest( $uuid ) {
- $dbw = $this->getMasterDB();
-
- $row = false; // the row acquired
- do {
- if ( $dbw->getType() === 'mysql' ) {
- // Per http://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
- // same table being changed in an UPDATE query in MySQL (gives Error: 1093).
- // Oracle and Postgre have no such limitation. However, MySQL offers an
- // alternative here by supporting ORDER BY + LIMIT for UPDATE queries.
- $dbw->query( "UPDATE {$dbw->tableName( 'job' )} " .
- "SET " .
- "job_token = {$dbw->addQuotes( $uuid ) }, " .
- "job_token_timestamp = {$dbw->addQuotes( $dbw->timestamp() )}, " .
- "job_attempts = job_attempts+1 " .
- "WHERE ( " .
- "job_cmd = {$dbw->addQuotes( $this->type )} " .
- "AND job_token = {$dbw->addQuotes( '' )} " .
- ") ORDER BY job_id ASC LIMIT 1",
- __METHOD__
- );
- } else {
- // Use a subquery to find the job, within an UPDATE to claim it.
- // This uses as much of the DB wrapper functions as possible.
- $dbw->update( 'job',
- array(
- 'job_token' => $uuid,
- 'job_token_timestamp' => $dbw->timestamp(),
- 'job_attempts = job_attempts+1' ),
- array( 'job_id = (' .
- $dbw->selectSQLText( 'job', 'job_id',
- array( 'job_cmd' => $this->type, 'job_token' => '' ),
- __METHOD__,
- array( 'ORDER BY' => 'job_id ASC', 'LIMIT' => 1 ) ) .
- ')'
- ),
- __METHOD__
- );
- }
- // Fetch any row that we just reserved...
- if ( $dbw->affectedRows() ) {
- $row = $dbw->selectRow( 'job', self::selectFields(),
- array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
- );
- if ( !$row ) { // raced out by duplicate job removal
- wfDebug( "Row deleted as duplicate by another process." );
- }
- } else {
- break; // nothing to do
- }
- } while ( !$row );
-
- return $row;
- }
-
- /**
- * @see JobQueue::doAck()
- * @param Job $job
- * @throws MWException
- * @return Job|bool
- */
- protected function doAck( Job $job ) {
- if ( !isset( $job->metadata['id'] ) ) {
- throw new MWException( "Job of type '{$job->getType()}' has no ID." );
- }
-
- $dbw = $this->getMasterDB();
- try {
- $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
- $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
- $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
- $scopedReset = new ScopedCallback( function () use ( $dbw, $autoTrx ) {
- $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
- } );
-
- // Delete a row with a single DELETE without holding row locks over RTTs...
- $dbw->delete( 'job',
- array( 'job_cmd' => $this->type, 'job_id' => $job->metadata['id'] ), __METHOD__ );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
-
- return true;
- }
-
- /**
- * @see JobQueue::doDeduplicateRootJob()
- * @param Job $job
- * @throws MWException
- * @return bool
- */
- protected function doDeduplicateRootJob( Job $job ) {
- $params = $job->getParams();
- if ( !isset( $params['rootJobSignature'] ) ) {
- throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
- } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
- throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
- }
- $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
- // Callers should call batchInsert() and then this function so that if the insert
- // fails, the de-duplication registration will be aborted. Since the insert is
- // deferred till "transaction idle", do the same here, so that the ordering is
- // maintained. Having only the de-duplication registration succeed would cause
- // jobs to become no-ops without any actual jobs that made them redundant.
- $dbw = $this->getMasterDB();
- $cache = $this->dupCache;
- $dbw->onTransactionIdle( function () use ( $cache, $params, $key, $dbw ) {
- $timestamp = $cache->get( $key ); // current last timestamp of this job
- if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
- return true; // a newer version of this root job was enqueued
- }
-
- // Update the timestamp of the last root job started at the location...
- return $cache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
- } );
-
- return true;
- }
-
- /**
- * @see JobQueue::doDelete()
- * @return bool
- */
- protected function doDelete() {
- $dbw = $this->getMasterDB();
- try {
- $dbw->delete( 'job', array( 'job_cmd' => $this->type ) );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
-
- return true;
- }
-
- /**
- * @see JobQueue::doWaitForBackups()
- * @return void
- */
- protected function doWaitForBackups() {
- wfWaitForSlaves();
- }
-
- /**
- * @return array
- */
- protected function doGetPeriodicTasks() {
- return array(
- 'recycleAndDeleteStaleJobs' => array(
- 'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
- 'period' => ceil( $this->claimTTL / 2 )
- )
- );
- }
-
- /**
- * @return void
- */
- protected function doFlushCaches() {
- foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
- $this->cache->delete( $this->getCacheKey( $type ) );
- }
- }
-
- /**
- * @see JobQueue::getAllQueuedJobs()
- * @return Iterator
- */
- public function getAllQueuedJobs() {
- $dbr = $this->getSlaveDB();
- try {
- return new MappedIterator(
- $dbr->select( 'job', self::selectFields(),
- array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
- function ( $row ) use ( $dbr ) {
- $job = Job::factory(
- $row->job_cmd,
- Title::makeTitle( $row->job_namespace, $row->job_title ),
- strlen( $row->job_params ) ? unserialize( $row->job_params ) : false
- );
- $job->metadata['id'] = $row->job_id;
- return $job;
- }
- );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
- }
-
- public function getCoalesceLocationInternal() {
- return $this->cluster
- ? "DBCluster:{$this->cluster}:{$this->wiki}"
- : "LBFactory:{$this->wiki}";
- }
-
- protected function doGetSiblingQueuesWithJobs( array $types ) {
- $dbr = $this->getSlaveDB();
- $res = $dbr->select( 'job', 'DISTINCT job_cmd',
- array( 'job_cmd' => $types ), __METHOD__ );
-
- $types = array();
- foreach ( $res as $row ) {
- $types[] = $row->job_cmd;
- }
-
- return $types;
- }
-
- protected function doGetSiblingQueueSizes( array $types ) {
- $dbr = $this->getSlaveDB();
- $res = $dbr->select( 'job', array( 'job_cmd', 'COUNT(*) AS count' ),
- array( 'job_cmd' => $types ), __METHOD__, array( 'GROUP BY' => 'job_cmd' ) );
-
- $sizes = array();
- foreach ( $res as $row ) {
- $sizes[$row->job_cmd] = (int)$row->count;
- }
-
- return $sizes;
- }
-
- /**
- * Recycle or destroy any jobs that have been claimed for too long
- *
- * @return int Number of jobs recycled/deleted
- */
- public function recycleAndDeleteStaleJobs() {
- $now = time();
- $count = 0; // affected rows
- $dbw = $this->getMasterDB();
-
- try {
- if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
- return $count; // already in progress
- }
-
- // Remove claims on jobs acquired for too long if enabled...
- if ( $this->claimTTL > 0 ) {
- $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
- // Get the IDs of jobs that have be claimed but not finished after too long.
- // These jobs can be recycled into the queue by expiring the claim. Selecting
- // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
- $res = $dbw->select( 'job', 'job_id',
- array(
- 'job_cmd' => $this->type,
- "job_token != {$dbw->addQuotes( '' )}", // was acquired
- "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
- "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
- __METHOD__
- );
- $ids = array_map(
- function ( $o ) {
- return $o->job_id;
- }, iterator_to_array( $res )
- );
- if ( count( $ids ) ) {
- // Reset job_token for these jobs so that other runners will pick them up.
- // Set the timestamp to the current time, as it is useful to now that the job
- // was already tried before (the timestamp becomes the "released" time).
- $dbw->update( 'job',
- array(
- 'job_token' => '',
- 'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
- array(
- 'job_id' => $ids ),
- __METHOD__
- );
- $count += $dbw->affectedRows();
- JobQueue::incrStats( 'job-recycle', $this->type, $dbw->affectedRows() );
- $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
- }
- }
-
- // Just destroy any stale jobs...
- $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
- $conds = array(
- 'job_cmd' => $this->type,
- "job_token != {$dbw->addQuotes( '' )}", // was acquired
- "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
- );
- if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
- $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
- }
- // Get the IDs of jobs that are considered stale and should be removed. Selecting
- // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
- $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
- $ids = array_map(
- function ( $o ) {
- return $o->job_id;
- }, iterator_to_array( $res )
- );
- if ( count( $ids ) ) {
- $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
- $count += $dbw->affectedRows();
- JobQueue::incrStats( 'job-abandon', $this->type, $dbw->affectedRows() );
- }
-
- $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
- } catch ( DBError $e ) {
- $this->throwDBException( $e );
- }
-
- return $count;
- }
-
- /**
- * @param IJobSpecification $job
- * @return array
- */
- protected function insertFields( IJobSpecification $job ) {
- $dbw = $this->getMasterDB();
-
- return array(
- // Fields that describe the nature of the job
- 'job_cmd' => $job->getType(),
- 'job_namespace' => $job->getTitle()->getNamespace(),
- 'job_title' => $job->getTitle()->getDBkey(),
- 'job_params' => self::makeBlob( $job->getParams() ),
- // Additional job metadata
- 'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
- 'job_timestamp' => $dbw->timestamp(),
- 'job_sha1' => wfBaseConvert(
- sha1( serialize( $job->getDeduplicationInfo() ) ),
- 16, 36, 31
- ),
- 'job_random' => mt_rand( 0, self::MAX_JOB_RANDOM )
- );
- }
-
- /**
- * @throws JobQueueConnectionError
- * @return DBConnRef
- */
- protected function getSlaveDB() {
- try {
- return $this->getDB( DB_SLAVE );
- } catch ( DBConnectionError $e ) {
- throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
- }
- }
-
- /**
- * @throws JobQueueConnectionError
- * @return DBConnRef
- */
- protected function getMasterDB() {
- try {
- return $this->getDB( DB_MASTER );
- } catch ( DBConnectionError $e ) {
- throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
- }
- }
-
- /**
- * @param $index integer (DB_SLAVE/DB_MASTER)
- * @return DBConnRef
- */
- protected function getDB( $index ) {
- $lb = ( $this->cluster !== false )
- ? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
- : wfGetLB( $this->wiki );
-
- return $lb->getConnectionRef( $index, array(), $this->wiki );
- }
-
- /**
- * @param $property
- * @return string
- */
- private function getCacheKey( $property ) {
- list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
- $cluster = is_string( $this->cluster ) ? $this->cluster : 'main';
-
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $cluster, $this->type, $property );
- }
-
- /**
- * @param $params
- * @return string
- */
- protected static function makeBlob( $params ) {
- if ( $params !== false ) {
- return serialize( $params );
- } else {
- return '';
- }
- }
-
- /**
- * @param $blob
- * @return bool|mixed
- */
- protected static function extractBlob( $blob ) {
- if ( (string)$blob !== '' ) {
- return unserialize( $blob );
- } else {
- return false;
- }
- }
-
- /**
- * @param DBError $e
- * @throws JobQueueError
- */
- protected function throwDBException( DBError $e ) {
- throw new JobQueueError( get_class( $e ) . ": " . $e->getMessage() );
- }
-
- /**
- * Return the list of job fields that should be selected.
- * @since 1.23
- * @return array
- */
- public static function selectFields() {
- return array(
- 'job_id',
- 'job_cmd',
- 'job_namespace',
- 'job_title',
- 'job_timestamp',
- 'job_params',
- 'job_random',
- 'job_attempts',
- 'job_token',
- 'job_token_timestamp',
- 'job_sha1',
- );
- }
-}
+++ /dev/null
-<?php
-/**
- * Job queue code for federated queues.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle enqueueing and running of background jobs for federated queues
- *
- * This class allows for queues to be partitioned into smaller queues.
- * A partition is defined by the configuration for a JobQueue instance.
- * For example, one can set $wgJobTypeConf['refreshLinks'] to point to a
- * JobQueueFederated instance, which itself would consist of three JobQueueRedis
- * instances, each using their own redis server. This would allow for the jobs
- * to be split (evenly or based on weights) accross multiple servers if a single
- * server becomes impractical or expensive. Different JobQueue classes can be mixed.
- *
- * The basic queue configuration (e.g. "order", "claimTTL") of a federated queue
- * is inherited by the partition queues. Additional configuration defines what
- * section each wiki is in, what partition queues each section uses (and their weight),
- * and the JobQueue configuration for each partition. Some sections might only need a
- * single queue partition, like the sections for groups of small wikis.
- *
- * If used for performance, then $wgMainCacheType should be set to memcached/redis.
- * Note that "fifo" cannot be used for the ordering, since the data is distributed.
- * One can still use "timestamp" instead, as in "roughly timestamp ordered". Also,
- * queue classes used by this should ignore down servers (with TTL) to avoid slowness.
- *
- * @ingroup JobQueue
- * @since 1.22
- */
-class JobQueueFederated extends JobQueue {
- /** @var array (partition name => weight) reverse sorted by weight */
- protected $partitionMap = array();
-
- /** @var array (partition name => JobQueue) reverse sorted by weight */
- protected $partitionQueues = array();
-
- /** @var HashRing */
- protected $partitionPushRing;
-
- /** @var BagOStuff */
- protected $cache;
-
- /** @var int Maximum number of partitions to try */
- protected $maxPartitionsTry;
-
- const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
- const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
-
- /**
- * @params include:
- * - sectionsByWiki : A map of wiki IDs to section names.
- * Wikis will default to using the section "default".
- * - partitionsBySection : Map of section names to maps of (partition name => weight).
- * A section called 'default' must be defined if not all wikis
- * have explicitly defined sections.
- * - configByPartition : Map of queue partition names to configuration arrays.
- * These configuration arrays are passed to JobQueue::factory().
- * The options set here are overriden by those passed to this
- * the federated queue itself (e.g. 'order' and 'claimTTL').
- * - partitionsNoPush : List of partition names that can handle pop() but not push().
- * This can be used to migrate away from a certain partition.
- * - maxPartitionsTry : Maximum number of times to attempt job insertion using
- * different partition queues. This improves availability
- * during failure, at the cost of added latency and somewhat
- * less reliable job de-duplication mechanisms.
- * @param array $params
- * @throws MWException
- */
- protected function __construct( array $params ) {
- parent::__construct( $params );
- $section = isset( $params['sectionsByWiki'][$this->wiki] )
- ? $params['sectionsByWiki'][$this->wiki]
- : 'default';
- if ( !isset( $params['partitionsBySection'][$section] ) ) {
- throw new MWException( "No configuration for section '$section'." );
- }
- $this->maxPartitionsTry = isset( $params['maxPartitionsTry'] )
- ? $params['maxPartitionsTry']
- : 2;
- // Get the full partition map
- $this->partitionMap = $params['partitionsBySection'][$section];
- arsort( $this->partitionMap, SORT_NUMERIC );
- // Get the partitions jobs can actually be pushed to
- $partitionPushMap = $this->partitionMap;
- if ( isset( $params['partitionsNoPush'] ) ) {
- foreach ( $params['partitionsNoPush'] as $partition ) {
- unset( $partitionPushMap[$partition] );
- }
- }
- // Get the config to pass to merge into each partition queue config
- $baseConfig = $params;
- foreach ( array( 'class', 'sectionsByWiki', 'maxPartitionsTry',
- 'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o
- ) {
- unset( $baseConfig[$o] ); // partition queue doesn't care about this
- }
- // Get the partition queue objects
- foreach ( $this->partitionMap as $partition => $w ) {
- if ( !isset( $params['configByPartition'][$partition] ) ) {
- throw new MWException( "No configuration for partition '$partition'." );
- }
- $this->partitionQueues[$partition] = JobQueue::factory(
- $baseConfig + $params['configByPartition'][$partition] );
- }
- // Get the ring of partitions to push jobs into
- $this->partitionPushRing = new HashRing( $partitionPushMap );
- // Aggregate cache some per-queue values if there are multiple partition queues
- $this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
- }
-
- protected function supportedOrders() {
- // No FIFO due to partitioning, though "rough timestamp order" is supported
- return array( 'undefined', 'random', 'timestamp' );
- }
-
- protected function optimalOrder() {
- return 'undefined'; // defer to the partitions
- }
-
- protected function supportsDelayedJobs() {
- return true; // defer checks to the partitions
- }
-
- protected function doIsEmpty() {
- $key = $this->getCacheKey( 'empty' );
-
- $isEmpty = $this->cache->get( $key );
- if ( $isEmpty === 'true' ) {
- return true;
- } elseif ( $isEmpty === 'false' ) {
- return false;
- }
-
- $empty = true;
- $failed = 0;
- foreach ( $this->partitionQueues as $queue ) {
- try {
- $empty = $empty && $queue->doIsEmpty();
- } catch ( JobQueueError $e ) {
- ++$failed;
- MWExceptionHandler::logException( $e );
- }
- }
- $this->throwErrorIfAllPartitionsDown( $failed );
-
- $this->cache->add( $key, $empty ? 'true' : 'false', self::CACHE_TTL_LONG );
- return $empty;
- }
-
- protected function doGetSize() {
- return $this->getCrossPartitionSum( 'size', 'doGetSize' );
- }
-
- protected function doGetAcquiredCount() {
- return $this->getCrossPartitionSum( 'acquiredcount', 'doGetAcquiredCount' );
- }
-
- protected function doGetDelayedCount() {
- return $this->getCrossPartitionSum( 'delayedcount', 'doGetDelayedCount' );
- }
-
- protected function doGetAbandonedCount() {
- return $this->getCrossPartitionSum( 'abandonedcount', 'doGetAbandonedCount' );
- }
-
- /**
- * @param string $type
- * @param string $method
- * @return int
- */
- protected function getCrossPartitionSum( $type, $method ) {
- $key = $this->getCacheKey( $type );
-
- $count = $this->cache->get( $key );
- if ( is_int( $count ) ) {
- return $count;
- }
-
- $failed = 0;
- foreach ( $this->partitionQueues as $queue ) {
- try {
- $count += $queue->$method();
- } catch ( JobQueueError $e ) {
- ++$failed;
- MWExceptionHandler::logException( $e );
- }
- }
- $this->throwErrorIfAllPartitionsDown( $failed );
-
- $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
-
- return $count;
- }
-
- protected function doBatchPush( array $jobs, $flags ) {
- // Local ring variable that may be changed to point to a new ring on failure
- $partitionRing = $this->partitionPushRing;
- // Try to insert the jobs and update $partitionsTry on any failures.
- // Retry to insert any remaning jobs again, ignoring the bad partitions.
- $jobsLeft = $jobs;
- for ( $i = $this->maxPartitionsTry; $i > 0 && count( $jobsLeft ); --$i ) {
- $jobsLeft = $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags );
- }
- if ( count( $jobsLeft ) ) {
- throw new JobQueueError(
- "Could not insert job(s), {$this->maxPartitionsTry} partitions tried." );
- }
-
- return true;
- }
-
- /**
- * @param array $jobs
- * @param HashRing $partitionRing
- * @param int $flags
- * @throws JobQueueError
- * @return array List of Job object that could not be inserted
- */
- protected function tryJobInsertions( array $jobs, HashRing &$partitionRing, $flags ) {
- $jobsLeft = array();
-
- // Because jobs are spread across partitions, per-job de-duplication needs
- // to use a consistent hash to avoid allowing duplicate jobs per partition.
- // When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded.
- $uJobsByPartition = array(); // (partition name => job list)
- /** @var Job $job */
- foreach ( $jobs as $key => $job ) {
- if ( $job->ignoreDuplicates() ) {
- $sha1 = sha1( serialize( $job->getDeduplicationInfo() ) );
- $uJobsByPartition[$partitionRing->getLocation( $sha1 )][] = $job;
- unset( $jobs[$key] );
- }
- }
- // Get the batches of jobs that are not de-duplicated
- if ( $flags & self::QOS_ATOMIC ) {
- $nuJobBatches = array( $jobs ); // all or nothing
- } else {
- // Split the jobs into batches and spread them out over servers if there
- // are many jobs. This helps keep the partitions even. Otherwise, send all
- // the jobs to a single partition queue to avoids the extra connections.
- $nuJobBatches = array_chunk( $jobs, 300 );
- }
-
- // Insert the de-duplicated jobs into the queues...
- foreach ( $uJobsByPartition as $partition => $jobBatch ) {
- /** @var JobQueue $queue */
- $queue = $this->partitionQueues[$partition];
- try {
- $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
- } catch ( JobQueueError $e ) {
- $ok = false;
- MWExceptionHandler::logException( $e );
- }
- if ( $ok ) {
- $key = $this->getCacheKey( 'empty' );
- $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
- } else {
- $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
- if ( !$partitionRing ) {
- throw new JobQueueError( "Could not insert job(s), no partitions available." );
- }
- $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
- }
- }
-
- // Insert the jobs that are not de-duplicated into the queues...
- foreach ( $nuJobBatches as $jobBatch ) {
- $partition = ArrayUtils::pickRandom( $partitionRing->getLocationWeights() );
- $queue = $this->partitionQueues[$partition];
- try {
- $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
- } catch ( JobQueueError $e ) {
- $ok = false;
- MWExceptionHandler::logException( $e );
- }
- if ( $ok ) {
- $key = $this->getCacheKey( 'empty' );
- $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
- } else {
- $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
- if ( !$partitionRing ) {
- throw new JobQueueError( "Could not insert job(s), no partitions available." );
- }
- $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
- }
- }
-
- return $jobsLeft;
- }
-
- protected function doPop() {
- $key = $this->getCacheKey( 'empty' );
-
- $isEmpty = $this->cache->get( $key );
- if ( $isEmpty === 'true' ) {
- return false;
- }
-
- $partitionsTry = $this->partitionMap; // (partition => weight)
-
- $failed = 0;
- while ( count( $partitionsTry ) ) {
- $partition = ArrayUtils::pickRandom( $partitionsTry );
- if ( $partition === false ) {
- break; // all partitions at 0 weight
- }
-
- /** @var JobQueue $queue */
- $queue = $this->partitionQueues[$partition];
- try {
- $job = $queue->pop();
- } catch ( JobQueueError $e ) {
- ++$failed;
- MWExceptionHandler::logException( $e );
- $job = false;
- }
- if ( $job ) {
- $job->metadata['QueuePartition'] = $partition;
-
- return $job;
- } else {
- unset( $partitionsTry[$partition] ); // blacklist partition
- }
- }
- $this->throwErrorIfAllPartitionsDown( $failed );
-
- $this->cache->set( $key, 'true', JobQueueDB::CACHE_TTL_LONG );
-
- return false;
- }
-
- protected function doAck( Job $job ) {
- if ( !isset( $job->metadata['QueuePartition'] ) ) {
- throw new MWException( "The given job has no defined partition name." );
- }
-
- return $this->partitionQueues[$job->metadata['QueuePartition']]->ack( $job );
- }
-
- protected function doIsRootJobOldDuplicate( Job $job ) {
- $params = $job->getRootJobParams();
- $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
- try {
- return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job );
- } catch ( JobQueueError $e ) {
- if ( isset( $partitions[1] ) ) { // check fallback partition
- return $this->partitionQueues[$partitions[1]]->doIsRootJobOldDuplicate( $job );
- }
- }
-
- return false;
- }
-
- protected function doDeduplicateRootJob( Job $job ) {
- $params = $job->getRootJobParams();
- $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
- try {
- return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job );
- } catch ( JobQueueError $e ) {
- if ( isset( $partitions[1] ) ) { // check fallback partition
- return $this->partitionQueues[$partitions[1]]->doDeduplicateRootJob( $job );
- }
- }
-
- return false;
- }
-
- protected function doDelete() {
- $failed = 0;
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- try {
- $queue->doDelete();
- } catch ( JobQueueError $e ) {
- ++$failed;
- MWExceptionHandler::logException( $e );
- }
- }
- $this->throwErrorIfAllPartitionsDown( $failed );
- return true;
- }
-
- protected function doWaitForBackups() {
- $failed = 0;
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- try {
- $queue->waitForBackups();
- } catch ( JobQueueError $e ) {
- ++$failed;
- MWExceptionHandler::logException( $e );
- }
- }
- $this->throwErrorIfAllPartitionsDown( $failed );
- }
-
- protected function doGetPeriodicTasks() {
- $tasks = array();
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $partition => $queue ) {
- foreach ( $queue->getPeriodicTasks() as $task => $def ) {
- $tasks["{$partition}:{$task}"] = $def;
- }
- }
-
- return $tasks;
- }
-
- protected function doFlushCaches() {
- static $types = array(
- 'empty',
- 'size',
- 'acquiredcount',
- 'delayedcount',
- 'abandonedcount'
- );
-
- foreach ( $types as $type ) {
- $this->cache->delete( $this->getCacheKey( $type ) );
- }
-
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- $queue->doFlushCaches();
- }
- }
-
- public function getAllQueuedJobs() {
- $iterator = new AppendIterator();
-
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- $iterator->append( $queue->getAllQueuedJobs() );
- }
-
- return $iterator;
- }
-
- public function getAllDelayedJobs() {
- $iterator = new AppendIterator();
-
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- $iterator->append( $queue->getAllDelayedJobs() );
- }
-
- return $iterator;
- }
-
- public function getCoalesceLocationInternal() {
- return "JobQueueFederated:wiki:{$this->wiki}" .
- sha1( serialize( array_keys( $this->partitionMap ) ) );
- }
-
- protected function doGetSiblingQueuesWithJobs( array $types ) {
- $result = array();
-
- $failed = 0;
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- try {
- $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types );
- if ( is_array( $nonEmpty ) ) {
- $result = array_unique( array_merge( $result, $nonEmpty ) );
- } else {
- return null; // not supported on all partitions; bail
- }
- if ( count( $result ) == count( $types ) ) {
- break; // short-circuit
- }
- } catch ( JobQueueError $e ) {
- ++$failed;
- MWExceptionHandler::logException( $e );
- }
- }
- $this->throwErrorIfAllPartitionsDown( $failed );
-
- return array_values( $result );
- }
-
- protected function doGetSiblingQueueSizes( array $types ) {
- $result = array();
- $failed = 0;
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- try {
- $sizes = $queue->doGetSiblingQueueSizes( $types );
- if ( is_array( $sizes ) ) {
- foreach ( $sizes as $type => $size ) {
- $result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size;
- }
- } else {
- return null; // not supported on all partitions; bail
- }
- } catch ( JobQueueError $e ) {
- ++$failed;
- MWExceptionHandler::logException( $e );
- }
- }
- $this->throwErrorIfAllPartitionsDown( $failed );
-
- return $result;
- }
-
- /**
- * Throw an error if no partitions available
- *
- * @param int $down The number of up partitions down
- * @return void
- * @throws JobQueueError
- */
- protected function throwErrorIfAllPartitionsDown( $down ) {
- if ( $down >= count( $this->partitionQueues ) ) {
- throw new JobQueueError( 'No queue partitions available.' );
- }
- }
-
- public function setTestingPrefix( $key ) {
- /** @var JobQueue $queue */
- foreach ( $this->partitionQueues as $queue ) {
- $queue->setTestingPrefix( $key );
- }
- }
-
- /**
- * @param $property
- * @return string
- */
- private function getCacheKey( $property ) {
- list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
- }
-}
+++ /dev/null
-<?php
-/**
- * Job queue base code.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle enqueueing of background jobs
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-class JobQueueGroup {
- /** @var array */
- protected static $instances = array();
-
- /** @var ProcessCacheLRU */
- protected $cache;
-
- /** @var string Wiki ID */
- protected $wiki;
-
- /** @var array Map of (bucket => (queue => JobQueue, types => list of types) */
- protected $coalescedQueues;
-
- const TYPE_DEFAULT = 1; // integer; jobs popped by default
- const TYPE_ANY = 2; // integer; any job
-
- const USE_CACHE = 1; // integer; use process or persistent cache
-
- const PROC_CACHE_TTL = 15; // integer; seconds
-
- const CACHE_VERSION = 1; // integer; cache version
-
- /**
- * @param string $wiki Wiki ID
- */
- protected function __construct( $wiki ) {
- $this->wiki = $wiki;
- $this->cache = new ProcessCacheLRU( 10 );
- }
-
- /**
- * @param bool|string $wiki Wiki ID
- * @return JobQueueGroup
- */
- public static function singleton( $wiki = false ) {
- $wiki = ( $wiki === false ) ? wfWikiID() : $wiki;
- if ( !isset( self::$instances[$wiki] ) ) {
- self::$instances[$wiki] = new self( $wiki );
- }
-
- return self::$instances[$wiki];
- }
-
- /**
- * Destroy the singleton instances
- *
- * @return void
- */
- public static function destroySingletons() {
- self::$instances = array();
- }
-
- /**
- * Get the job queue object for a given queue type
- *
- * @param string $type
- * @return JobQueue
- */
- public function get( $type ) {
- global $wgJobTypeConf;
-
- $conf = array( 'wiki' => $this->wiki, 'type' => $type );
- if ( isset( $wgJobTypeConf[$type] ) ) {
- $conf = $conf + $wgJobTypeConf[$type];
- } else {
- $conf = $conf + $wgJobTypeConf['default'];
- }
-
- return JobQueue::factory( $conf );
- }
-
- /**
- * Insert jobs into the respective queues of with the belong.
- *
- * This inserts the jobs into the queue specified by $wgJobTypeConf
- * and updates the aggregate job queue information cache as needed.
- *
- * @param Job|array $jobs A single Job or a list of Jobs
- * @throws MWException
- * @return bool
- */
- public function push( $jobs ) {
- $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
- if ( !count( $jobs ) ) {
- return true;
- }
-
- $jobsByType = array(); // (job type => list of jobs)
- foreach ( $jobs as $job ) {
- if ( $job instanceof IJobSpecification ) {
- $jobsByType[$job->getType()][] = $job;
- } else {
- throw new MWException( "Attempted to push a non-Job object into a queue." );
- }
- }
-
- $ok = true;
- foreach ( $jobsByType as $type => $jobs ) {
- if ( $this->get( $type )->push( $jobs ) ) {
- JobQueueAggregator::singleton()->notifyQueueNonEmpty( $this->wiki, $type );
- } else {
- $ok = false;
- }
- }
-
- if ( $this->cache->has( 'queues-ready', 'list' ) ) {
- $list = $this->cache->get( 'queues-ready', 'list' );
- if ( count( array_diff( array_keys( $jobsByType ), $list ) ) ) {
- $this->cache->clear( 'queues-ready' );
- }
- }
-
- return $ok;
- }
-
- /**
- * Pop a job off one of the job queues
- *
- * This pops a job off a queue as specified by $wgJobTypeConf and
- * updates the aggregate job queue information cache as needed.
- *
- * @param int|string $qtype JobQueueGroup::TYPE_* constant or job type string
- * @param int $flags Bitfield of JobQueueGroup::USE_* constants
- * @param array $blacklist List of job types to ignore
- * @return Job|bool Returns false on failure
- */
- public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0, array $blacklist = array() ) {
- $job = false;
-
- if ( is_string( $qtype ) ) { // specific job type
- if ( !in_array( $qtype, $blacklist ) ) {
- $job = $this->get( $qtype )->pop();
- if ( !$job ) {
- JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
- }
- }
- } else { // any job in the "default" jobs types
- if ( $flags & self::USE_CACHE ) {
- if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
- $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
- }
- $types = $this->cache->get( 'queues-ready', 'list' );
- } else {
- $types = $this->getQueuesWithJobs();
- }
-
- if ( $qtype == self::TYPE_DEFAULT ) {
- $types = array_intersect( $types, $this->getDefaultQueueTypes() );
- }
-
- $types = array_diff( $types, $blacklist ); // avoid selected types
- shuffle( $types ); // avoid starvation
-
- foreach ( $types as $type ) { // for each queue...
- $job = $this->get( $type )->pop();
- if ( $job ) { // found
- break;
- } else { // not found
- JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $type );
- $this->cache->clear( 'queues-ready' );
- }
- }
- }
-
- return $job;
- }
-
- /**
- * Acknowledge that a job was completed
- *
- * @param Job $job
- * @return bool
- */
- public function ack( Job $job ) {
- return $this->get( $job->getType() )->ack( $job );
- }
-
- /**
- * Register the "root job" of a given job into the queue for de-duplication.
- * This should only be called right *after* all the new jobs have been inserted.
- *
- * @param Job $job
- * @return bool
- */
- public function deduplicateRootJob( Job $job ) {
- return $this->get( $job->getType() )->deduplicateRootJob( $job );
- }
-
- /**
- * Wait for any slaves or backup queue servers to catch up.
- *
- * This does nothing for certain queue classes.
- *
- * @return void
- * @throws MWException
- */
- public function waitForBackups() {
- global $wgJobTypeConf;
-
- wfProfileIn( __METHOD__ );
- // Try to avoid doing this more than once per queue storage medium
- foreach ( $wgJobTypeConf as $type => $conf ) {
- $this->get( $type )->waitForBackups();
- }
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Get the list of queue types
- *
- * @return array List of strings
- */
- public function getQueueTypes() {
- return array_keys( $this->getCachedConfigVar( 'wgJobClasses' ) );
- }
-
- /**
- * Get the list of default queue types
- *
- * @return array List of strings
- */
- public function getDefaultQueueTypes() {
- global $wgJobTypesExcludedFromDefaultQueue;
-
- return array_diff( $this->getQueueTypes(), $wgJobTypesExcludedFromDefaultQueue );
- }
-
- /**
- * Get the list of job types that have non-empty queues
- *
- * @return array List of job types that have non-empty queues
- */
- public function getQueuesWithJobs() {
- $types = array();
- foreach ( $this->getCoalescedQueues() as $info ) {
- $nonEmpty = $info['queue']->getSiblingQueuesWithJobs( $this->getQueueTypes() );
- if ( is_array( $nonEmpty ) ) { // batching features supported
- $types = array_merge( $types, $nonEmpty );
- } else { // we have to go through the queues in the bucket one-by-one
- foreach ( $info['types'] as $type ) {
- if ( !$this->get( $type )->isEmpty() ) {
- $types[] = $type;
- }
- }
- }
- }
-
- return $types;
- }
-
- /**
- * Get the size of the queus for a list of job types
- *
- * @return array Map of (job type => size)
- */
- public function getQueueSizes() {
- $sizeMap = array();
- foreach ( $this->getCoalescedQueues() as $info ) {
- $sizes = $info['queue']->getSiblingQueueSizes( $this->getQueueTypes() );
- if ( is_array( $sizes ) ) { // batching features supported
- $sizeMap = $sizeMap + $sizes;
- } else { // we have to go through the queues in the bucket one-by-one
- foreach ( $info['types'] as $type ) {
- $sizeMap[$type] = $this->get( $type )->getSize();
- }
- }
- }
-
- return $sizeMap;
- }
-
- /**
- * @return array
- */
- protected function getCoalescedQueues() {
- global $wgJobTypeConf;
-
- if ( $this->coalescedQueues === null ) {
- $this->coalescedQueues = array();
- foreach ( $wgJobTypeConf as $type => $conf ) {
- $queue = JobQueue::factory(
- array( 'wiki' => $this->wiki, 'type' => 'null' ) + $conf );
- $loc = $queue->getCoalesceLocationInternal();
- if ( !isset( $this->coalescedQueues[$loc] ) ) {
- $this->coalescedQueues[$loc]['queue'] = $queue;
- $this->coalescedQueues[$loc]['types'] = array();
- }
- if ( $type === 'default' ) {
- $this->coalescedQueues[$loc]['types'] = array_merge(
- $this->coalescedQueues[$loc]['types'],
- array_diff( $this->getQueueTypes(), array_keys( $wgJobTypeConf ) )
- );
- } else {
- $this->coalescedQueues[$loc]['types'][] = $type;
- }
- }
- }
-
- return $this->coalescedQueues;
- }
-
- /**
- * Execute any due periodic queue maintenance tasks for all queues.
- *
- * A task is "due" if the time ellapsed since the last run is greater than
- * the defined run period. Concurrent calls to this function will cause tasks
- * to be attempted twice, so they may need their own methods of mutual exclusion.
- *
- * @return int Number of tasks run
- */
- public function executeReadyPeriodicTasks() {
- global $wgMemc;
-
- list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
- $key = wfForeignMemcKey( $db, $prefix, 'jobqueuegroup', 'taskruns', 'v1' );
- $lastRuns = $wgMemc->get( $key ); // (queue => task => UNIX timestamp)
-
- $count = 0;
- $tasksRun = array(); // (queue => task => UNIX timestamp)
- foreach ( $this->getQueueTypes() as $type ) {
- $queue = $this->get( $type );
- foreach ( $queue->getPeriodicTasks() as $task => $definition ) {
- if ( $definition['period'] <= 0 ) {
- continue; // disabled
- } elseif ( !isset( $lastRuns[$type][$task] )
- || $lastRuns[$type][$task] < ( time() - $definition['period'] )
- ) {
- try {
- if ( call_user_func( $definition['callback'] ) !== null ) {
- $tasksRun[$type][$task] = time();
- ++$count;
- }
- } catch ( JobQueueError $e ) {
- MWExceptionHandler::logException( $e );
- }
- }
- }
- // The tasks may have recycled jobs or release delayed jobs into the queue
- if ( isset( $tasksRun[$type] ) && !$queue->isEmpty() ) {
- JobQueueAggregator::singleton()->notifyQueueNonEmpty( $this->wiki, $type );
- }
- }
-
- $wgMemc->merge( $key, function ( $cache, $key, $lastRuns ) use ( $tasksRun ) {
- if ( is_array( $lastRuns ) ) {
- foreach ( $tasksRun as $type => $tasks ) {
- foreach ( $tasks as $task => $timestamp ) {
- if ( !isset( $lastRuns[$type][$task] )
- || $timestamp > $lastRuns[$type][$task]
- ) {
- $lastRuns[$type][$task] = $timestamp;
- }
- }
- }
- } else {
- $lastRuns = $tasksRun;
- }
-
- return $lastRuns;
- } );
-
- return $count;
- }
-
- /**
- * @param $name string
- * @return mixed
- */
- private function getCachedConfigVar( $name ) {
- global $wgConf, $wgMemc;
-
- if ( $this->wiki === wfWikiID() ) {
- return $GLOBALS[$name]; // common case
- } else {
- list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
- $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
- $value = $wgMemc->get( $key ); // ('v' => ...) or false
- if ( is_array( $value ) ) {
- return $value['v'];
- } else {
- $value = $wgConf->getConfig( $this->wiki, $name );
- $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
-
- return $value;
- }
- }
- }
-}
+++ /dev/null
-<?php
-/**
- * Redis-backed job queue code.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle job queues stored in Redis
- *
- * This is faster, less resource intensive, queue that JobQueueDB.
- * All data for a queue using this class is placed into one redis server.
- *
- * There are eight main redis keys used to track jobs:
- * - l-unclaimed : A list of job IDs used for ready unclaimed jobs
- * - z-claimed : A sorted set of (job ID, UNIX timestamp as score) used for job retries
- * - z-abandoned : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
- * - z-delayed : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
- * - h-idBySha1 : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
- * - h-sha1ById : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
- * - h-attempts : A hash of (job ID => attempt count) used for job claiming/retries
- * - h-data : A hash of (job ID => serialized blobs) for job storage
- * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
- * If an ID appears in any of those lists, it should have a h-data entry for its ID.
- * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
- * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1ById
- * entry and every h-sha1ById must refer to an ID that is l-unclaimed. If a job has its
- * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
- *
- * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
- * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
- * All the keys are prefixed with the relevant wiki ID information.
- *
- * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
- * Additionally, it should be noted that redis has different persistence modes, such
- * as rdb snapshots, journaling, and no persistent. Appropriate configuration should be
- * made on the servers based on what queues are using it and what tolerance they have.
- *
- * @ingroup JobQueue
- * @ingroup Redis
- * @since 1.22
- */
-class JobQueueRedis extends JobQueue {
- /** @var RedisConnectionPool */
- protected $redisPool;
-
- /** @var string Server address */
- protected $server;
-
- /** @var string Compression method to use */
- protected $compression;
-
- const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
-
- /** @var string Key to prefix the queue keys with (used for testing) */
- protected $key;
-
- /**
- * @var null|int maximum seconds between execution of periodic tasks. Used to speed up
- * testing but should otherwise be left unset.
- */
- protected $maximumPeriodicTaskSeconds;
-
- /**
- * @params include:
- * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
- * Note that the serializer option is ignored as "none" is always used.
- * - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
- * If a hostname is specified but no port, the standard port number
- * 6379 will be used. Required.
- * - compression : The type of compression to use; one of (none,gzip).
- * - maximumPeriodicTaskSeconds : Maximum seconds between check periodic tasks. Set to
- * force faster execution of periodic tasks for inegration tests that
- * rely on checkDelay. Without this the integration tests are very very
- * slow. This really shouldn't be set in production.
- * @param array $params
- */
- public function __construct( array $params ) {
- parent::__construct( $params );
- $params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
- $this->server = $params['redisServer'];
- $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
- $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
- $this->maximumPeriodicTaskSeconds = isset( $params['maximumPeriodicTaskSeconds'] ) ?
- $params['maximumPeriodicTaskSeconds'] : null;
- }
-
- protected function supportedOrders() {
- return array( 'timestamp', 'fifo' );
- }
-
- protected function optimalOrder() {
- return 'fifo';
- }
-
- protected function supportsDelayedJobs() {
- return true;
- }
-
- /**
- * @see JobQueue::doIsEmpty()
- * @return bool
- * @throws MWException
- */
- protected function doIsEmpty() {
- return $this->doGetSize() == 0;
- }
-
- /**
- * @see JobQueue::doGetSize()
- * @return int
- * @throws MWException
- */
- protected function doGetSize() {
- $conn = $this->getConnection();
- try {
- return $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * @see JobQueue::doGetAcquiredCount()
- * @return int
- * @throws JobQueueError
- */
- protected function doGetAcquiredCount() {
- if ( $this->claimTTL <= 0 ) {
- return 0; // no acknowledgements
- }
- $conn = $this->getConnection();
- try {
- $conn->multi( Redis::PIPELINE );
- $conn->zSize( $this->getQueueKey( 'z-claimed' ) );
- $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
-
- return array_sum( $conn->exec() );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * @see JobQueue::doGetDelayedCount()
- * @return int
- * @throws JobQueueError
- */
- protected function doGetDelayedCount() {
- if ( !$this->checkDelay ) {
- return 0; // no delayed jobs
- }
- $conn = $this->getConnection();
- try {
- return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * @see JobQueue::doGetAbandonedCount()
- * @return int
- * @throws JobQueueError
- */
- protected function doGetAbandonedCount() {
- if ( $this->claimTTL <= 0 ) {
- return 0; // no acknowledgements
- }
- $conn = $this->getConnection();
- try {
- return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * @see JobQueue::doBatchPush()
- * @param array $jobs
- * @param $flags
- * @return bool
- * @throws JobQueueError
- */
- protected function doBatchPush( array $jobs, $flags ) {
- // Convert the jobs into field maps (de-duplicated against each other)
- $items = array(); // (job ID => job fields map)
- foreach ( $jobs as $job ) {
- $item = $this->getNewJobFields( $job );
- if ( strlen( $item['sha1'] ) ) { // hash identifier => de-duplicate
- $items[$item['sha1']] = $item;
- } else {
- $items[$item['uuid']] = $item;
- }
- }
-
- if ( !count( $items ) ) {
- return true; // nothing to do
- }
-
- $conn = $this->getConnection();
- try {
- // Actually push the non-duplicate jobs into the queue...
- if ( $flags & self::QOS_ATOMIC ) {
- $batches = array( $items ); // all or nothing
- } else {
- $batches = array_chunk( $items, 500 ); // avoid tying up the server
- }
- $failed = 0;
- $pushed = 0;
- foreach ( $batches as $itemBatch ) {
- $added = $this->pushBlobs( $conn, $itemBatch );
- if ( is_int( $added ) ) {
- $pushed += $added;
- } else {
- $failed += count( $itemBatch );
- }
- }
- if ( $failed > 0 ) {
- wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
-
- return false;
- }
- JobQueue::incrStats( 'job-insert', $this->type, count( $items ) );
- JobQueue::incrStats( 'job-insert-duplicate', $this->type,
- count( $items ) - $failed - $pushed );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
-
- return true;
- }
-
- /**
- * @param RedisConnRef $conn
- * @param array $items List of results from JobQueueRedis::getNewJobFields()
- * @return int Number of jobs inserted (duplicates are ignored)
- * @throws RedisException
- */
- protected function pushBlobs( RedisConnRef $conn, array $items ) {
- $args = array(); // ([id, sha1, rtime, blob [, id, sha1, rtime, blob ... ] ] )
- foreach ( $items as $item ) {
- $args[] = (string)$item['uuid'];
- $args[] = (string)$item['sha1'];
- $args[] = (string)$item['rtimestamp'];
- $args[] = (string)$this->serialize( $item );
- }
- static $script =
-<<<LUA
- local kUnclaimed, kSha1ById, kIdBySha1, kDelayed, kData = unpack(KEYS)
- if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
- local pushed = 0
- for i = 1,#ARGV,4 do
- local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
- if sha1 == '' or redis.call('hExists',kIdBySha1,sha1) == 0 then
- if 1*rtimestamp > 0 then
- -- Insert into delayed queue (release time as score)
- redis.call('zAdd',kDelayed,rtimestamp,id)
- else
- -- Insert into unclaimed queue
- redis.call('lPush',kUnclaimed,id)
- end
- if sha1 ~= '' then
- redis.call('hSet',kSha1ById,id,sha1)
- redis.call('hSet',kIdBySha1,sha1,id)
- end
- redis.call('hSet',kData,id,blob)
- pushed = pushed + 1
- end
- end
- return pushed
-LUA;
- return $conn->luaEval( $script,
- array_merge(
- array(
- $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
- $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
- $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
- $this->getQueueKey( 'z-delayed' ), # KEYS[4]
- $this->getQueueKey( 'h-data' ), # KEYS[5]
- ),
- $args
- ),
- 5 # number of first argument(s) that are keys
- );
- }
-
- /**
- * @see JobQueue::doPop()
- * @return Job|bool
- * @throws JobQueueError
- */
- protected function doPop() {
- $job = false;
-
- // Push ready delayed jobs into the queue every 10 jobs to spread the load.
- // This is also done as a periodic task, but we don't want too much done at once.
- if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
- $this->recyclePruneAndUndelayJobs();
- }
-
- $conn = $this->getConnection();
- try {
- do {
- if ( $this->claimTTL > 0 ) {
- // Keep the claimed job list down for high-traffic queues
- if ( mt_rand( 0, 99 ) == 0 ) {
- $this->recyclePruneAndUndelayJobs();
- }
- $blob = $this->popAndAcquireBlob( $conn );
- } else {
- $blob = $this->popAndDeleteBlob( $conn );
- }
- if ( $blob === false ) {
- break; // no jobs; nothing to do
- }
-
- JobQueue::incrStats( 'job-pop', $this->type );
- $item = $this->unserialize( $blob );
- if ( $item === false ) {
- wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
- continue;
- }
-
- // If $item is invalid, recyclePruneAndUndelayJobs() will cleanup as needed
- $job = $this->getJobFromFields( $item ); // may be false
- } while ( !$job ); // job may be false if invalid
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
-
- return $job;
- }
-
- /**
- * @param RedisConnRef $conn
- * @return array serialized string or false
- * @throws RedisException
- */
- protected function popAndDeleteBlob( RedisConnRef $conn ) {
- static $script =
-<<<LUA
- local kUnclaimed, kSha1ById, kIdBySha1, kData = unpack(KEYS)
- -- Pop an item off the queue
- local id = redis.call('rpop',kUnclaimed)
- if not id then return false end
- -- Get the job data and remove it
- local item = redis.call('hGet',kData,id)
- redis.call('hDel',kData,id)
- -- Allow new duplicates of this job
- local sha1 = redis.call('hGet',kSha1ById,id)
- if sha1 then redis.call('hDel',kIdBySha1,sha1) end
- redis.call('hDel',kSha1ById,id)
- -- Return the job data
- return item
-LUA;
- return $conn->luaEval( $script,
- array(
- $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
- $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
- $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
- $this->getQueueKey( 'h-data' ), # KEYS[4]
- ),
- 4 # number of first argument(s) that are keys
- );
- }
-
- /**
- * @param RedisConnRef $conn
- * @return array serialized string or false
- * @throws RedisException
- */
- protected function popAndAcquireBlob( RedisConnRef $conn ) {
- static $script =
-<<<LUA
- local kUnclaimed, kSha1ById, kIdBySha1, kClaimed, kAttempts, kData = unpack(KEYS)
- -- Pop an item off the queue
- local id = redis.call('rPop',kUnclaimed)
- if not id then return false end
- -- Allow new duplicates of this job
- local sha1 = redis.call('hGet',kSha1ById,id)
- if sha1 then redis.call('hDel',kIdBySha1,sha1) end
- redis.call('hDel',kSha1ById,id)
- -- Mark the jobs as claimed and return it
- redis.call('zAdd',kClaimed,ARGV[1],id)
- redis.call('hIncrBy',kAttempts,id,1)
- return redis.call('hGet',kData,id)
-LUA;
- return $conn->luaEval( $script,
- array(
- $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
- $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
- $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
- $this->getQueueKey( 'z-claimed' ), # KEYS[4]
- $this->getQueueKey( 'h-attempts' ), # KEYS[5]
- $this->getQueueKey( 'h-data' ), # KEYS[6]
- time(), # ARGV[1] (injected to be replication-safe)
- ),
- 6 # number of first argument(s) that are keys
- );
- }
-
- /**
- * @see JobQueue::doAck()
- * @param Job $job
- * @return Job|bool
- * @throws MWException|JobQueueError
- */
- protected function doAck( Job $job ) {
- if ( !isset( $job->metadata['uuid'] ) ) {
- throw new MWException( "Job of type '{$job->getType()}' has no UUID." );
- }
- if ( $this->claimTTL > 0 ) {
- $conn = $this->getConnection();
- try {
- static $script =
-<<<LUA
- local kClaimed, kAttempts, kData = unpack(KEYS)
- -- Unmark the job as claimed
- redis.call('zRem',kClaimed,ARGV[1])
- redis.call('hDel',kAttempts,ARGV[1])
- -- Delete the job data itself
- return redis.call('hDel',kData,ARGV[1])
-LUA;
- $res = $conn->luaEval( $script,
- array(
- $this->getQueueKey( 'z-claimed' ), # KEYS[1]
- $this->getQueueKey( 'h-attempts' ), # KEYS[2]
- $this->getQueueKey( 'h-data' ), # KEYS[3]
- $job->metadata['uuid'] # ARGV[1]
- ),
- 3 # number of first argument(s) that are keys
- );
-
- if ( !$res ) {
- wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." );
-
- return false;
- }
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- return true;
- }
-
- /**
- * @see JobQueue::doDeduplicateRootJob()
- * @param Job $job
- * @return bool
- * @throws MWException|JobQueueError
- */
- protected function doDeduplicateRootJob( Job $job ) {
- if ( !$job->hasRootJobParams() ) {
- throw new MWException( "Cannot register root job; missing parameters." );
- }
- $params = $job->getRootJobParams();
-
- $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
-
- $conn = $this->getConnection();
- try {
- $timestamp = $conn->get( $key ); // current last timestamp of this job
- if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
- return true; // a newer version of this root job was enqueued
- }
-
- // Update the timestamp of the last root job started at the location...
- return $conn->set( $key, $params['rootJobTimestamp'], self::ROOTJOB_TTL ); // 2 weeks
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * @see JobQueue::doIsRootJobOldDuplicate()
- * @param Job $job
- * @return bool
- * @throws JobQueueError
- */
- protected function doIsRootJobOldDuplicate( Job $job ) {
- if ( !$job->hasRootJobParams() ) {
- return false; // job has no de-deplication info
- }
- $params = $job->getRootJobParams();
-
- $conn = $this->getConnection();
- try {
- // Get the last time this root job was enqueued
- $timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
-
- // Check if a new root job was started at the location after this one's...
- return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
- }
-
- /**
- * @see JobQueue::doDelete()
- * @return bool
- * @throws JobQueueError
- */
- protected function doDelete() {
- static $props = array( 'l-unclaimed', 'z-claimed', 'z-abandoned',
- 'z-delayed', 'h-idBySha1', 'h-sha1ById', 'h-attempts', 'h-data' );
-
- $conn = $this->getConnection();
- try {
- $keys = array();
- foreach ( $props as $prop ) {
- $keys[] = $this->getQueueKey( $prop );
- }
-
- return ( $conn->delete( $keys ) !== false );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * @see JobQueue::getAllQueuedJobs()
- * @return Iterator
- */
- public function getAllQueuedJobs() {
- $conn = $this->getConnection();
- try {
- $that = $this;
-
- return new MappedIterator(
- $conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 ),
- function ( $uid ) use ( $that, $conn ) {
- return $that->getJobFromUidInternal( $uid, $conn );
- },
- array( 'accept' => function ( $job ) {
- return is_object( $job );
- } )
- );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * @see JobQueue::getAllQueuedJobs()
- * @return Iterator
- */
- public function getAllDelayedJobs() {
- $conn = $this->getConnection();
- try {
- $that = $this;
-
- return new MappedIterator( // delayed jobs
- $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
- function ( $uid ) use ( $that, $conn ) {
- return $that->getJobFromUidInternal( $uid, $conn );
- },
- array( 'accept' => function ( $job ) {
- return is_object( $job );
- } )
- );
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- public function getCoalesceLocationInternal() {
- return "RedisServer:" . $this->server;
- }
-
- protected function doGetSiblingQueuesWithJobs( array $types ) {
- return array_keys( array_filter( $this->doGetSiblingQueueSizes( $types ) ) );
- }
-
- protected function doGetSiblingQueueSizes( array $types ) {
- $sizes = array(); // (type => size)
- $types = array_values( $types ); // reindex
- $conn = $this->getConnection();
- try {
- $conn->multi( Redis::PIPELINE );
- foreach ( $types as $type ) {
- $conn->lSize( $this->getQueueKey( 'l-unclaimed', $type ) );
- }
- $res = $conn->exec();
- if ( is_array( $res ) ) {
- foreach ( $res as $i => $size ) {
- $sizes[$types[$i]] = $size;
- }
- }
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
-
- return $sizes;
- }
-
- /**
- * This function should not be called outside JobQueueRedis
- *
- * @param $uid string
- * @param $conn RedisConnRef
- * @return Job|bool Returns false if the job does not exist
- * @throws MWException|JobQueueError
- */
- public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
- try {
- $data = $conn->hGet( $this->getQueueKey( 'h-data' ), $uid );
- if ( $data === false ) {
- return false; // not found
- }
- $item = $this->unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $uid ) );
- if ( !is_array( $item ) ) { // this shouldn't happen
- throw new MWException( "Could not find job with ID '$uid'." );
- }
- $title = Title::makeTitle( $item['namespace'], $item['title'] );
- $job = Job::factory( $item['type'], $title, $item['params'] );
- $job->metadata['uuid'] = $item['uuid'];
-
- return $job;
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
- }
-
- /**
- * Recycle or destroy any jobs that have been claimed for too long
- * and release any ready delayed jobs into the queue
- *
- * @return int Number of jobs recycled/deleted/undelayed
- * @throws MWException|JobQueueError
- */
- public function recyclePruneAndUndelayJobs() {
- $count = 0;
- // For each job item that can be retried, we need to add it back to the
- // main queue and remove it from the list of currenty claimed job items.
- // For those that cannot, they are marked as dead and kept around for
- // investigation and manual job restoration but are eventually deleted.
- $conn = $this->getConnection();
- try {
- $now = time();
- static $script =
-<<<LUA
- local kClaimed, kAttempts, kUnclaimed, kData, kAbandoned, kDelayed = unpack(KEYS)
- local released,abandoned,pruned,undelayed = 0,0,0,0
- -- Get all non-dead jobs that have an expired claim on them.
- -- The score for each item is the last claim timestamp (UNIX).
- local staleClaims = redis.call('zRangeByScore',kClaimed,0,ARGV[1])
- for k,id in ipairs(staleClaims) do
- local timestamp = redis.call('zScore',kClaimed,id)
- local attempts = redis.call('hGet',kAttempts,id)
- if attempts < ARGV[3] then
- -- Claim expired and retries left: re-enqueue the job
- redis.call('lPush',kUnclaimed,id)
- redis.call('hIncrBy',kAttempts,id,1)
- released = released + 1
- else
- -- Claim expired and no retries left: mark the job as dead
- redis.call('zAdd',kAbandoned,timestamp,id)
- abandoned = abandoned + 1
- end
- redis.call('zRem',kClaimed,id)
- end
- -- Get all of the dead jobs that have been marked as dead for too long.
- -- The score for each item is the last claim timestamp (UNIX).
- local deadClaims = redis.call('zRangeByScore',kAbandoned,0,ARGV[2])
- for k,id in ipairs(deadClaims) do
- -- Stale and out of retries: remove any traces of the job
- redis.call('zRem',kAbandoned,id)
- redis.call('hDel',kAttempts,id)
- redis.call('hDel',kData,id)
- pruned = pruned + 1
- end
- -- Get the list of ready delayed jobs, sorted by readiness (UNIX timestamp)
- local ids = redis.call('zRangeByScore',kDelayed,0,ARGV[4])
- -- Migrate the jobs from the "delayed" set to the "unclaimed" list
- for k,id in ipairs(ids) do
- redis.call('lPush',kUnclaimed,id)
- redis.call('zRem',kDelayed,id)
- end
- undelayed = #ids
- return {released,abandoned,pruned,undelayed}
-LUA;
- $res = $conn->luaEval( $script,
- array(
- $this->getQueueKey( 'z-claimed' ), # KEYS[1]
- $this->getQueueKey( 'h-attempts' ), # KEYS[2]
- $this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
- $this->getQueueKey( 'h-data' ), # KEYS[4]
- $this->getQueueKey( 'z-abandoned' ), # KEYS[5]
- $this->getQueueKey( 'z-delayed' ), # KEYS[6]
- $now - $this->claimTTL, # ARGV[1]
- $now - self::MAX_AGE_PRUNE, # ARGV[2]
- $this->maxTries, # ARGV[3]
- $now # ARGV[4]
- ),
- 6 # number of first argument(s) that are keys
- );
- if ( $res ) {
- list( $released, $abandoned, $pruned, $undelayed ) = $res;
- $count += $released + $pruned + $undelayed;
- JobQueue::incrStats( 'job-recycle', $this->type, $released );
- JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
- }
- } catch ( RedisException $e ) {
- $this->throwRedisException( $conn, $e );
- }
-
- return $count;
- }
-
- /**
- * @return array
- */
- protected function doGetPeriodicTasks() {
- $periods = array( 3600 ); // standard cleanup (useful on config change)
- if ( $this->claimTTL > 0 ) {
- $periods[] = ceil( $this->claimTTL / 2 ); // avoid bad timing
- }
- if ( $this->checkDelay ) {
- $periods[] = 300; // 5 minutes
- }
- $period = min( $periods );
- $period = max( $period, 30 ); // sanity
- // Support override for faster testing
- if ( $this->maximumPeriodicTaskSeconds !== null ) {
- $period = min( $period, $this->maximumPeriodicTaskSeconds );
- }
- return array(
- 'recyclePruneAndUndelayJobs' => array(
- 'callback' => array( $this, 'recyclePruneAndUndelayJobs' ),
- 'period' => $period,
- )
- );
- }
-
- /**
- * @param IJobSpecification $job
- * @return array
- */
- protected function getNewJobFields( IJobSpecification $job ) {
- return array(
- // Fields that describe the nature of the job
- 'type' => $job->getType(),
- 'namespace' => $job->getTitle()->getNamespace(),
- 'title' => $job->getTitle()->getDBkey(),
- 'params' => $job->getParams(),
- // Some jobs cannot run until a "release timestamp"
- 'rtimestamp' => $job->getReleaseTimestamp() ?: 0,
- // Additional job metadata
- 'uuid' => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
- 'sha1' => $job->ignoreDuplicates()
- ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
- : '',
- 'timestamp' => time() // UNIX timestamp
- );
- }
-
- /**
- * @param $fields array
- * @return Job|bool
- */
- protected function getJobFromFields( array $fields ) {
- $title = Title::makeTitleSafe( $fields['namespace'], $fields['title'] );
- if ( $title ) {
- $job = Job::factory( $fields['type'], $title, $fields['params'] );
- $job->metadata['uuid'] = $fields['uuid'];
-
- return $job;
- }
-
- return false;
- }
-
- /**
- * @param array $fields
- * @return string Serialized and possibly compressed version of $fields
- */
- protected function serialize( array $fields ) {
- $blob = serialize( $fields );
- if ( $this->compression === 'gzip'
- && strlen( $blob ) >= 1024
- && function_exists( 'gzdeflate' )
- ) {
- $object = (object)array( 'blob' => gzdeflate( $blob ), 'enc' => 'gzip' );
- $blobz = serialize( $object );
-
- return ( strlen( $blobz ) < strlen( $blob ) ) ? $blobz : $blob;
- } else {
- return $blob;
- }
- }
-
- /**
- * @param string $blob
- * @return array|bool Unserialized version of $blob or false
- */
- protected function unserialize( $blob ) {
- $fields = unserialize( $blob );
- if ( is_object( $fields ) ) {
- if ( $fields->enc === 'gzip' && function_exists( 'gzinflate' ) ) {
- $fields = unserialize( gzinflate( $fields->blob ) );
- } else {
- $fields = false;
- }
- }
-
- return is_array( $fields ) ? $fields : false;
- }
-
- /**
- * Get a connection to the server that handles all sub-queues for this queue
- *
- * @return RedisConnRef
- * @throws JobQueueConnectionError
- */
- protected function getConnection() {
- $conn = $this->redisPool->getConnection( $this->server );
- if ( !$conn ) {
- throw new JobQueueConnectionError( "Unable to connect to redis server." );
- }
-
- return $conn;
- }
-
- /**
- * @param $conn RedisConnRef
- * @param $e RedisException
- * @throws JobQueueError
- */
- protected function throwRedisException( RedisConnRef $conn, $e ) {
- $this->redisPool->handleError( $conn, $e );
- throw new JobQueueError( "Redis server error: {$e->getMessage()}\n" );
- }
-
- /**
- * @param $prop string
- * @param $type string|null
- * @return string
- */
- private function getQueueKey( $prop, $type = null ) {
- $type = is_string( $type ) ? $type : $this->type;
- list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
- if ( strlen( $this->key ) ) { // namespaced queue (for testing)
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $this->key, $prop );
- } else {
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $prop );
- }
- }
-
- /**
- * @param $key string
- * @return void
- */
- public function setTestingPrefix( $key ) {
- $this->key = $key;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job queue task description base code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job queue task description interface
- *
- * @ingroup JobQueue
- * @since 1.23
- */
-interface IJobSpecification {
- /**
- * @return string Job type
- */
- public function getType();
-
- /**
- * @return array
- */
- public function getParams();
-
- /**
- * @return int|null UNIX timestamp to delay running this job until, otherwise null
- */
- public function getReleaseTimestamp();
-
- /**
- * @return bool Whether only one of each identical set of jobs should be run
- */
- public function ignoreDuplicates();
-
- /**
- * Subclasses may need to override this to make duplication detection work.
- * The resulting map conveys everything that makes the job unique. This is
- * only checked if ignoreDuplicates() returns true, meaning that duplicate
- * jobs are supposed to be ignored.
- *
- * @return array Map of key/values
- */
- public function getDeduplicationInfo();
-
- /**
- * @return Title Descriptive title (this can simply be informative)
- */
- public function getTitle();
-}
-
-/**
- * Job queue task description base code
- *
- * Example usage:
- * <code>
- * $job = new JobSpecification(
- * 'null',
- * array( 'lives' => 1, 'usleep' => 100, 'pi' => 3.141569 ),
- * array( 'removeDuplicates' => 1 ),
- * Title::makeTitle( NS_SPECIAL, 'nullity' )
- * );
- * JobQueueGroup::singleton()->push( $job )
- * </code>
- *
- * @ingroup JobQueue
- * @since 1.23
- */
-class JobSpecification implements IJobSpecification {
- /** @var string */
- protected $type;
-
- /** @var array Array of job parameters or false if none */
- protected $params;
-
- /** @var Title */
- protected $title;
-
- /** @var bool Expensive jobs may set this to true */
- protected $ignoreDuplicates;
-
- /**
- * @param string $type
- * @param array $params Map of key/values
- * @param array $opts Map of key/values
- * @param Title $title Optional descriptive title
- */
- public function __construct(
- $type, array $params, array $opts = array(), Title $title = null
- ) {
- $this->validateParams( $params );
-
- $this->type = $type;
- $this->params = $params;
- $this->title = $title ?: Title::newMainPage();
- $this->ignoreDuplicates = !empty( $opts['removeDuplicates'] );
- }
-
- /**
- * @param array $params
- */
- protected function validateParams( array $params ) {
- foreach ( $params as $p => $v ) {
- if ( is_array( $v ) ) {
- $this->validateParams( $v );
- } elseif ( !is_scalar( $v ) && $v !== null ) {
- throw new UnexpectedValueException( 'Job parameters are not JSON serializable.' );
- }
- }
- }
-
- /**
- * @return string
- */
- public function getType() {
- return $this->type;
- }
-
- /**
- * @return Title
- */
- public function getTitle() {
- return $this->title;
- }
-
- /**
- * @return array
- */
- public function getParams() {
- return $this->params;
- }
-
- /**
- * @return int|null UNIX timestamp to delay running this job until, otherwise null
- */
- public function getReleaseTimestamp() {
- return isset( $this->params['jobReleaseTimestamp'] )
- ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
- : null;
- }
-
- /**
- * @return bool Whether only one of each identical set of jobs should be run
- */
- public function ignoreDuplicates() {
- return $this->ignoreDuplicates;
- }
-
- /**
- * Subclasses may need to override this to make duplication detection work.
- * The resulting map conveys everything that makes the job unique. This is
- * only checked if ignoreDuplicates() returns true, meaning that duplicate
- * jobs are supposed to be ignored.
- *
- * @return array Map of key/values
- */
- public function getDeduplicationInfo() {
- $info = array(
- 'type' => $this->getType(),
- 'namespace' => $this->getTitle()->getNamespace(),
- 'title' => $this->getTitle()->getDBkey(),
- 'params' => $this->getParams()
- );
- if ( is_array( $info['params'] ) ) {
- // Identical jobs with different "root" jobs should count as duplicates
- unset( $info['params']['rootJobSignature'] );
- unset( $info['params']['rootJobTimestamp'] );
- // Likewise for jobs with different delay times
- unset( $info['params']['jobReleaseTimestamp'] );
- }
-
- return $info;
- }
-}
+++ /dev/null
-/*!
-\ingroup JobQueue
-\page jobqueue_design Job queue design
-
-Notes on the Job queuing system architecture.
-
-\section intro Introduction
-
-The data model consist of the following main components:
-* The Job object represents a particular deferred task that happens in the
- background. All jobs subclass the Job object and put the main logic in the
- function called run().
-* The JobQueue object represents a particular queue of jobs of a certain type.
- For example there may be a queue for email jobs and a queue for squid purge
- jobs.
-
-\section jobqueue Job queues
-
-Each job type has its own queue and is associated to a storage medium. One
-queue might save its jobs in redis while another one uses would use a database.
-
-Storage medium are defined in a queue class. Before using it, you must
-define in $wgJobTypeConf a mapping of the job type to a queue class.
-
-The factory class JobQueueGroup provides helper functions:
-- getting the queue for a given job
-- route new job insertions to the proper queue
-
-The following queue classes are available:
-* JobQueueDB (stores jobs in the `job` table in a database)
-* JobQueueRedis (stores jobs in a redis server)
-
-All queue classes support some basic operations (though some may be no-ops):
-* enqueueing a batch of jobs
-* dequeueing a single job
-* acknowledging a job is completed
-* checking if the queue is empty
-
-Some queue classes (like JobQueueDB) may dequeue jobs in random order while other
-queues might dequeue jobs in exact FIFO order. Callers should thus not assume jobs
-are executed in FIFO order.
-
-Also note that not all queue classes will have the same reliability guarantees.
-In-memory queues may lose data when restarted depending on snapshot and journal
-settings (including journal fsync() frequency). Some queue types may totally remove
-jobs when dequeued while leaving the ack() function as a no-op; if a job is
-dequeued by a job runner, which crashes before completion, the job will be
-lost. Some jobs, like purging squid caches after a template change, may not
-require durable queues, whereas other jobs might be more important.
-
-\section aggregator Job queue aggregator
-
-The aggregators are used by nextJobDB.php, which is a script that will return a
-random ready queue (on any wiki in the farm) that can be used with runJobs.php.
-This can be used in conjunction with any scripts that handle wiki farm job queues.
-Note that $wgLocalDatabases defines what wikis are in the wiki farm.
-
-Since each job type has its own queue, and wiki-farms may have many wikis,
-there might be a large number of queues to keep track of. To avoid wasting
-large amounts of time polling empty queues, aggregators exists to keep track
-of which queues are ready.
-
-The following queue aggregator classes are available:
-* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
-* JobQueueAggregatorRedis (uses a redis server to track ready queues)
-
-Some aggregators cache data for a few minutes while others may be always up to date.
-This can be an important factor for jobs that need a low pickup time (or latency).
-
-\section jobs Jobs
-
-Callers should also try to make jobs maintain correctness when executed twice.
-This is useful for queues that actually implement ack(), since they may recycle
-dequeued but un-acknowledged jobs back into the queue to be attempted again. If
-a runner dequeues a job, runs it, but then crashes before calling ack(), the
-job may be returned to the queue and run a second time. Jobs like cache purging can
-happen several times without any correctness problems. However, a pathological case
-would be if a bug causes the problem to systematically keep repeating. For example,
-a job may always throw a DB error at the end of run(). This problem is trickier to
-solve and more obnoxious for things like email jobs, for example. For such jobs,
-it might be useful to use a queue that does not retry jobs.
+++ /dev/null
-<?php
-/**
- * Job queue aggregator code.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle tracking information about all queues
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-abstract class JobQueueAggregator {
- /** @var JobQueueAggregator */
- protected static $instance = null;
-
- /**
- * @param array $params
- */
- protected function __construct( array $params ) {
- }
-
- /**
- * @throws MWException
- * @return JobQueueAggregator
- */
- final public static function singleton() {
- global $wgJobQueueAggregator;
-
- if ( !isset( self::$instance ) ) {
- $class = $wgJobQueueAggregator['class'];
- $obj = new $class( $wgJobQueueAggregator );
- if ( !( $obj instanceof JobQueueAggregator ) ) {
- throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
- }
- self::$instance = $obj;
- }
-
- return self::$instance;
- }
-
- /**
- * Destroy the singleton instance
- *
- * @return void
- */
- final public static function destroySingleton() {
- self::$instance = null;
- }
-
- /**
- * Mark a queue as being empty
- *
- * @param string $wiki
- * @param string $type
- * @return bool Success
- */
- final public function notifyQueueEmpty( $wiki, $type ) {
- wfProfileIn( __METHOD__ );
- $ok = $this->doNotifyQueueEmpty( $wiki, $type );
- wfProfileOut( __METHOD__ );
-
- return $ok;
- }
-
- /**
- * @see JobQueueAggregator::notifyQueueEmpty()
- */
- abstract protected function doNotifyQueueEmpty( $wiki, $type );
-
- /**
- * Mark a queue as being non-empty
- *
- * @param string $wiki
- * @param string $type
- * @return bool Success
- */
- final public function notifyQueueNonEmpty( $wiki, $type ) {
- wfProfileIn( __METHOD__ );
- $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
- wfProfileOut( __METHOD__ );
-
- return $ok;
- }
-
- /**
- * @see JobQueueAggregator::notifyQueueNonEmpty()
- */
- abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
-
- /**
- * Get the list of all of the queues with jobs
- *
- * @return array (job type => (list of wiki IDs))
- */
- final public function getAllReadyWikiQueues() {
- wfProfileIn( __METHOD__ );
- $res = $this->doGetAllReadyWikiQueues();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueueAggregator::getAllReadyWikiQueues()
- */
- abstract protected function doGetAllReadyWikiQueues();
-
- /**
- * Purge all of the aggregator information
- *
- * @return bool Success
- */
- final public function purge() {
- wfProfileIn( __METHOD__ );
- $res = $this->doPurge();
- wfProfileOut( __METHOD__ );
-
- return $res;
- }
-
- /**
- * @see JobQueueAggregator::purge()
- */
- abstract protected function doPurge();
-
- /**
- * Get all databases that have a pending job.
- * This poll all the queues and is this expensive.
- *
- * @return array (job type => (list of wiki IDs))
- */
- protected function findPendingWikiQueues() {
- global $wgLocalDatabases;
-
- $pendingDBs = array(); // (job type => (db list))
- foreach ( $wgLocalDatabases as $db ) {
- foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
- $pendingDBs[$type][] = $db;
- }
- }
-
- return $pendingDBs;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job queue aggregator code that uses BagOStuff.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle tracking information about all queues using BagOStuff
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-class JobQueueAggregatorMemc extends JobQueueAggregator {
- /** @var BagOStuff */
- protected $cache;
-
- protected $cacheTTL; // integer; seconds
-
- /**
- * @params include:
- * - objectCache : Name of an object cache registered in $wgObjectCaches.
- * This defaults to the one specified by $wgMainCacheType.
- * - cacheTTL : Seconds to cache the aggregate data before regenerating.
- * @param array $params
- */
- protected function __construct( array $params ) {
- parent::__construct( $params );
- $this->cache = isset( $params['objectCache'] )
- ? wfGetCache( $params['objectCache'] )
- : wfGetMainCache();
- $this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
- }
-
- /**
- * @see JobQueueAggregator::doNotifyQueueEmpty()
- */
- protected function doNotifyQueueEmpty( $wiki, $type ) {
- $key = $this->getReadyQueueCacheKey();
- // Delist the queue from the "ready queue" list
- if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
- $curInfo = $this->cache->get( $key );
- if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
- if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
- $curInfo['pendingDBs'][$type] = array_diff(
- $curInfo['pendingDBs'][$type], array( $wiki ) );
- $this->cache->set( $key, $curInfo );
- }
- }
- $this->cache->delete( "$key:lock" ); // unlock
- }
-
- return true;
- }
-
- /**
- * @see JobQueueAggregator::doNotifyQueueNonEmpty()
- */
- protected function doNotifyQueueNonEmpty( $wiki, $type ) {
- return true; // updated periodically
- }
-
- /**
- * @see JobQueueAggregator::doAllGetReadyWikiQueues()
- */
- protected function doGetAllReadyWikiQueues() {
- $key = $this->getReadyQueueCacheKey();
- // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
- // regenerate the cache. Use any available stale cache if another process is
- // currently regenerating the pending DB information.
- $pendingDbInfo = $this->cache->get( $key );
- if ( !is_array( $pendingDbInfo )
- || ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
- || mt_rand( 0, 999 ) == 0
- ) {
- if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
- $pendingDbInfo = array(
- 'pendingDBs' => $this->findPendingWikiQueues(),
- 'timestamp' => time()
- );
- for ( $attempts = 1; $attempts <= 25; ++$attempts ) {
- if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
- $this->cache->set( $key, $pendingDbInfo );
- $this->cache->delete( "$key:lock" ); // unlock
- break;
- }
- }
- $this->cache->delete( "$key:rebuild" ); // unlock
- }
- }
-
- return is_array( $pendingDbInfo )
- ? $pendingDbInfo['pendingDBs']
- : array(); // cache is both empty and locked
- }
-
- /**
- * @see JobQueueAggregator::doPurge()
- */
- protected function doPurge() {
- return $this->cache->delete( $this->getReadyQueueCacheKey() );
- }
-
- /**
- * @return string
- */
- private function getReadyQueueCacheKey() {
- return "jobqueue:aggregator:ready-queues:v1"; // global
- }
-}
+++ /dev/null
-<?php
-/**
- * Job queue aggregator code that uses PhpRedis.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle tracking information about all queues using PhpRedis
- *
- * @ingroup JobQueue
- * @ingroup Redis
- * @since 1.21
- */
-class JobQueueAggregatorRedis extends JobQueueAggregator {
- /** @var RedisConnectionPool */
- protected $redisPool;
-
- /** @var array List of Redis server addresses */
- protected $servers;
-
- /**
- * @params include:
- * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
- * - redisServers : Array of server entries, the first being the primary and the
- * others being fallback servers. Each entry is either a hostname/port
- * combination or the absolute path of a UNIX socket.
- * If a hostname is specified but no port, the standard port number
- * 6379 will be used. Required.
- * @param array $params
- */
- protected function __construct( array $params ) {
- parent::__construct( $params );
- $this->servers = isset( $params['redisServers'] )
- ? $params['redisServers']
- : array( $params['redisServer'] ); // b/c
- $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
- }
-
- protected function doNotifyQueueEmpty( $wiki, $type ) {
- $conn = $this->getConnection();
- if ( !$conn ) {
- return false;
- }
- try {
- $conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
-
- return true;
- } catch ( RedisException $e ) {
- $this->handleException( $conn, $e );
-
- return false;
- }
- }
-
- protected function doNotifyQueueNonEmpty( $wiki, $type ) {
- $conn = $this->getConnection();
- if ( !$conn ) {
- return false;
- }
- try {
- $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
-
- return true;
- } catch ( RedisException $e ) {
- $this->handleException( $conn, $e );
-
- return false;
- }
- }
-
- protected function doGetAllReadyWikiQueues() {
- $conn = $this->getConnection();
- if ( !$conn ) {
- return array();
- }
- try {
- $conn->multi( Redis::PIPELINE );
- $conn->exists( $this->getReadyQueueKey() );
- $conn->hGetAll( $this->getReadyQueueKey() );
- list( $exists, $map ) = $conn->exec();
-
- if ( $exists ) { // cache hit
- $pendingDBs = array(); // (type => list of wikis)
- foreach ( $map as $key => $time ) {
- list( $type, $wiki ) = $this->dencQueueName( $key );
- $pendingDBs[$type][] = $wiki;
- }
- } else { // cache miss
- // Avoid duplicated effort
- $rand = wfRandomString( 32 );
- $conn->multi( Redis::MULTI );
- $conn->setex( "{$rand}:lock", 3600, 1 );
- $conn->renamenx( "{$rand}:lock", $this->getReadyQueueKey() . ":lock" );
- if ( $conn->exec() !== array( true, true ) ) { // lock
- $conn->delete( "{$rand}:lock" );
- return array(); // already in progress
- }
-
- $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
-
- $conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
-
- $now = time();
- $map = array();
- foreach ( $pendingDBs as $type => $wikis ) {
- foreach ( $wikis as $wiki ) {
- $map[$this->encQueueName( $type, $wiki )] = $now;
- }
- }
- $conn->hMSet( $this->getReadyQueueKey(), $map );
- }
-
- return $pendingDBs;
- } catch ( RedisException $e ) {
- $this->handleException( $conn, $e );
-
- return array();
- }
- }
-
- protected function doPurge() {
- $conn = $this->getConnection();
- if ( !$conn ) {
- return false;
- }
- try {
- $conn->delete( $this->getReadyQueueKey() );
- } catch ( RedisException $e ) {
- $this->handleException( $conn, $e );
-
- return false;
- }
-
- return true;
- }
-
- /**
- * Get a connection to the server that handles all sub-queues for this queue
- *
- * @return RedisConnRef|bool Returns false on failure
- * @throws MWException
- */
- protected function getConnection() {
- $conn = false;
- foreach ( $this->servers as $server ) {
- $conn = $this->redisPool->getConnection( $server );
- if ( $conn ) {
- break;
- }
- }
-
- return $conn;
- }
-
- /**
- * @param RedisConnRef $conn
- * @param RedisException $e
- * @return void
- */
- protected function handleException( RedisConnRef $conn, $e ) {
- $this->redisPool->handleError( $conn, $e );
- }
-
- /**
- * @return string
- */
- private function getReadyQueueKey() {
- return "jobqueue:aggregator:h-ready-queues:v1"; // global
- }
-
- /**
- * @param string $type
- * @param string $wiki
- * @return string
- */
- private function encQueueName( $type, $wiki ) {
- return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
- }
-
- /**
- * @param string $name
- * @return string
- */
- private function dencQueueName( $name ) {
- list( $type, $wiki ) = explode( '/', $name, 2 );
-
- return array( rawurldecode( $type ), rawurldecode( $wiki ) );
- }
-}
+++ /dev/null
-<?php
-/**
- * Assemble the segments of a chunked upload.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Upload
- */
-
-/**
- * Assemble the segments of a chunked upload.
- *
- * @ingroup Upload
- */
-class AssembleUploadChunksJob extends Job {
- public function __construct( $title, $params ) {
- parent::__construct( 'AssembleUploadChunks', $title, $params );
- $this->removeDuplicates = true;
- }
-
- public function run() {
- $scope = RequestContext::importScopedSession( $this->params['session'] );
- $context = RequestContext::getMain();
- try {
- $user = $context->getUser();
- if ( !$user->isLoggedIn() ) {
- $this->setLastError( "Could not load the author user from session." );
-
- return false;
- }
-
- if ( count( $_SESSION ) === 0 ) {
- // Empty session probably indicates that we didn't associate
- // with the session correctly. Note that being able to load
- // the user does not necessarily mean the session was loaded.
- // Most likely cause by suhosin.session.encrypt = On.
- $this->setLastError( "Error associating with user session. " .
- "Try setting suhosin.session.encrypt = Off" );
-
- return false;
- }
-
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
- );
-
- $upload = new UploadFromChunks( $user );
- $upload->continueChunks(
- $this->params['filename'],
- $this->params['filekey'],
- $context->getRequest()
- );
-
- // Combine all of the chunks into a local file and upload that to a new stash file
- $status = $upload->concatenateChunks();
- if ( !$status->isGood() ) {
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
- );
- $this->setLastError( $status->getWikiText() );
-
- return false;
- }
-
- // We have a new filekey for the fully concatenated file
- $newFileKey = $upload->getLocalFile()->getFileKey();
-
- // Remove the old stash file row and first chunk file
- $upload->stash->removeFileNoAuth( $this->params['filekey'] );
-
- // Build the image info array while we have the local reference handy
- $apiMain = new ApiMain(); // dummy object (XXX)
- $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
-
- // Cleanup any temporary local file
- $upload->cleanupTempFile();
-
- // Cache the info so the user doesn't have to wait forever to get the final info
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array(
- 'result' => 'Success',
- 'stage' => 'assembling',
- 'filekey' => $newFileKey,
- 'imageinfo' => $imageInfo,
- 'status' => Status::newGood()
- )
- );
- } catch ( MWException $e ) {
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array(
- 'result' => 'Failure',
- 'stage' => 'assembling',
- 'status' => Status::newFatal( 'api-error-stashfailed' )
- )
- );
- $this->setLastError( get_class( $e ) . ": " . $e->getText() );
-
- return false;
- }
-
- return true;
- }
-
- public function getDeduplicationInfo() {
- $info = parent::getDeduplicationInfo();
- if ( is_array( $info['params'] ) ) {
- $info['params'] = array( 'filekey' => $info['params']['filekey'] );
- }
-
- return $info;
- }
-
- public function allowRetries() {
- return false;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job to fix double redirects after moving a page.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job to fix double redirects after moving a page
- *
- * @ingroup JobQueue
- */
-class DoubleRedirectJob extends Job {
- /** @var string Reason for the change, 'maintenance' or 'move'. Suffix fo
- * message key 'double-redirect-fixed-'.
- */
- private $reason;
-
- /** @var Title The title which has changed, redirects pointing to this
- * title are fixed
- */
- private $redirTitle;
-
- /** @var User */
- private static $user;
-
- /**
- * Insert jobs into the job queue to fix redirects to the given title
- * @param string $reason the reason for the fix, see message
- * "double-redirect-fixed-<reason>"
- * @param $redirTitle Title: the title which has changed, redirects
- * pointing to this title are fixed
- * @param bool $destTitle Not used
- */
- public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
- # Need to use the master to get the redirect table updated in the same transaction
- $dbw = wfGetDB( DB_MASTER );
- $res = $dbw->select(
- array( 'redirect', 'page' ),
- array( 'page_namespace', 'page_title' ),
- array(
- 'page_id = rd_from',
- 'rd_namespace' => $redirTitle->getNamespace(),
- 'rd_title' => $redirTitle->getDBkey()
- ), __METHOD__ );
- if ( !$res->numRows() ) {
- return;
- }
- $jobs = array();
- foreach ( $res as $row ) {
- $title = Title::makeTitle( $row->page_namespace, $row->page_title );
- if ( !$title ) {
- continue;
- }
-
- $jobs[] = new self( $title, array(
- 'reason' => $reason,
- 'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
- # Avoid excessive memory usage
- if ( count( $jobs ) > 10000 ) {
- JobQueueGroup::singleton()->push( $jobs );
- $jobs = array();
- }
- }
- JobQueueGroup::singleton()->push( $jobs );
- }
-
- /**
- * @param Title $title
- * @param array|bool $params
- * @param int $id
- */
- function __construct( $title, $params = false ) {
- parent::__construct( 'fixDoubleRedirect', $title, $params );
- $this->reason = $params['reason'];
- $this->redirTitle = Title::newFromText( $params['redirTitle'] );
- }
-
- /**
- * @return bool
- */
- function run() {
- if ( !$this->redirTitle ) {
- $this->setLastError( 'Invalid title' );
-
- return false;
- }
-
- $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
- if ( !$targetRev ) {
- wfDebug( __METHOD__ . ": target redirect already deleted, ignoring\n" );
-
- return true;
- }
- $content = $targetRev->getContent();
- $currentDest = $content ? $content->getRedirectTarget() : null;
- if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
- wfDebug( __METHOD__ . ": Redirect has changed since the job was queued\n" );
-
- return true;
- }
-
- // Check for a suppression tag (used e.g. in periodically archived discussions)
- $mw = MagicWord::get( 'staticredirect' );
- if ( $content->matchMagicWord( $mw ) ) {
- wfDebug( __METHOD__ . ": skipping: suppressed with __STATICREDIRECT__\n" );
-
- return true;
- }
-
- // Find the current final destination
- $newTitle = self::getFinalDestination( $this->redirTitle );
- if ( !$newTitle ) {
- wfDebug( __METHOD__ .
- ": skipping: single redirect, circular redirect or invalid redirect destination\n" );
-
- return true;
- }
- if ( $newTitle->equals( $this->redirTitle ) ) {
- // The redirect is already right, no need to change it
- // This can happen if the page was moved back (say after vandalism)
- wfDebug( __METHOD__ . " : skipping, already good\n" );
- }
-
- // Preserve fragment (bug 14904)
- $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
- $currentDest->getFragment(), $newTitle->getInterwiki() );
-
- // Fix the text
- $newContent = $content->updateRedirect( $newTitle );
-
- if ( $newContent->equals( $content ) ) {
- $this->setLastError( 'Content unchanged???' );
-
- return false;
- }
-
- $user = $this->getUser();
- if ( !$user ) {
- $this->setLastError( 'Invalid user' );
-
- return false;
- }
-
- // Save it
- global $wgUser;
- $oldUser = $wgUser;
- $wgUser = $user;
- $article = WikiPage::factory( $this->title );
-
- // Messages: double-redirect-fixed-move, double-redirect-fixed-maintenance
- $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
- $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
- )->inContentLanguage()->text();
- $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $user );
- $wgUser = $oldUser;
-
- return true;
- }
-
- /**
- * Get the final destination of a redirect
- *
- * @param $title Title
- *
- * @return bool if the specified title is not a redirect, or if it is a circular redirect
- */
- public static function getFinalDestination( $title ) {
- $dbw = wfGetDB( DB_MASTER );
-
- // Circular redirect check
- $seenTitles = array();
- $dest = false;
-
- while ( true ) {
- $titleText = $title->getPrefixedDBkey();
- if ( isset( $seenTitles[$titleText] ) ) {
- wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
-
- return false;
- }
- $seenTitles[$titleText] = true;
-
- if ( $title->isExternal() ) {
- // If the target is interwiki, we have to break early (bug 40352).
- // Otherwise it will look up a row in the local page table
- // with the namespace/page of the interwiki target which can cause
- // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
- break;
- }
-
- $row = $dbw->selectRow(
- array( 'redirect', 'page' ),
- array( 'rd_namespace', 'rd_title', 'rd_interwiki' ),
- array(
- 'rd_from=page_id',
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey()
- ), __METHOD__ );
- if ( !$row ) {
- # No redirect from here, chain terminates
- break;
- } else {
- $dest = $title = Title::makeTitle(
- $row->rd_namespace,
- $row->rd_title,
- '',
- $row->rd_interwiki
- );
- }
- }
-
- return $dest;
- }
-
- /**
- * Get a user object for doing edits, from a request-lifetime cache
- * False will be returned if the user name specified in the
- * 'double-redirect-fixer' message is invalid.
- *
- * @return User|bool
- */
- function getUser() {
- if ( !self::$user ) {
- $username = wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text();
- self::$user = User::newFromName( $username );
- # User::newFromName() can return false on a badly configured wiki.
- if ( self::$user && !self::$user->isLoggedIn() ) {
- self::$user->addToDatabase();
- }
- }
-
- return self::$user;
- }
-}
+++ /dev/null
-<?php
-/**
- * No-op job that does nothing.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- */
-
-/**
- * No-op job that does nothing. Used to represent duplicates.
- *
- * @ingroup JobQueue
- */
-final class DuplicateJob extends Job {
- /**
- * Callers should use DuplicateJob::newFromJob() instead
- *
- * @param Title $title
- * @param array $params job parameters
- */
- function __construct( $title, $params ) {
- parent::__construct( 'duplicate', $title, $params );
- }
-
- /**
- * Get a duplicate no-op version of a job
- *
- * @param Job $job
- * @return Job
- */
- public static function newFromJob( Job $job ) {
- $djob = new self( $job->getTitle(), $job->getParams() );
- $djob->command = $job->getType();
- $djob->params = is_array( $djob->params ) ? $djob->params : array();
- $djob->params = array( 'isDuplicate' => true ) + $djob->params;
- $djob->metadata = $job->metadata;
-
- return $djob;
- }
-
- public function run() {
- return true;
- }
-}
+++ /dev/null
-<?php
-/**
- * Old job for notification emails.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Old job used for sending single notification emails;
- * kept for backwards-compatibility
- *
- * @ingroup JobQueue
- */
-class EmaillingJob extends Job {
- function __construct( $title, $params ) {
- parent::__construct( 'sendMail', Title::newMainPage(), $params );
- }
-
- function run() {
- $status = UserMailer::send(
- $this->params['to'],
- $this->params['from'],
- $this->params['subj'],
- $this->params['body'],
- $this->params['replyto']
- );
-
- return $status->isOK();
- }
-}
+++ /dev/null
-<?php
-/**
- * Job for notification emails.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job for email notification mails
- *
- * @ingroup JobQueue
- */
-class EnotifNotifyJob extends Job {
- function __construct( $title, $params ) {
- parent::__construct( 'enotifNotify', $title, $params );
- }
-
- function run() {
- $enotif = new EmailNotification();
- // Get the user from ID (rename safe). Anons are 0, so defer to name.
- if ( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
- $editor = User::newFromId( $this->params['editorID'] );
- // B/C, only the name might be given.
- } else {
- # @todo FIXME: newFromName could return false on a badly configured wiki.
- $editor = User::newFromName( $this->params['editor'], false );
- }
- $enotif->actuallyNotifyOnPageChange(
- $editor,
- $this->title,
- $this->params['timestamp'],
- $this->params['summary'],
- $this->params['minorEdit'],
- $this->params['oldid'],
- $this->params['watchers'],
- $this->params['pageStatus']
- );
-
- return true;
- }
-}
+++ /dev/null
-<?php
-/**
- * HTML cache invalidation of all pages linking to a given title.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- */
-
-/**
- * Job to purge the cache for all pages that link to or use another page or file
- *
- * This job comes in a few variants:
- * - a) Recursive jobs to purge caches for backlink pages for a given title.
- * These jobs have have (recursive:true,table:<table>) set.
- * - b) Jobs to purge caches for a set of titles (the job title is ignored).
- * These jobs have have (pages:(<page ID>:(<namespace>,<title>),...) set.
- *
- * @ingroup JobQueue
- */
-class HTMLCacheUpdateJob extends Job {
- function __construct( $title, $params = '' ) {
- parent::__construct( 'htmlCacheUpdate', $title, $params );
- // Base backlink purge jobs can be de-duplicated
- $this->removeDuplicates = ( !isset( $params['range'] ) && !isset( $params['pages'] ) );
- }
-
- function run() {
- global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery, $wgMaxBacklinksInvalidate;
-
- static $expected = array( 'recursive', 'pages' ); // new jobs have one of these
-
- $oldRangeJob = false;
- if ( !array_intersect( array_keys( $this->params ), $expected ) ) {
- // B/C for older job params formats that lack these fields:
- // a) base jobs with just ("table") and b) range jobs with ("table","start","end")
- if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
- $oldRangeJob = true;
- } else {
- $this->params['recursive'] = true; // base job
- }
- }
-
- // Job to purge all (or a range of) backlink pages for a page
- if ( !empty( $this->params['recursive'] ) ) {
- // @TODO: try to use delayed jobs if possible?
- if ( !isset( $this->params['range'] ) && $wgMaxBacklinksInvalidate !== false ) {
- $numRows = $this->title->getBacklinkCache()->getNumLinks(
- $this->params['table'], $wgMaxBacklinksInvalidate );
- if ( $numRows > $wgMaxBacklinksInvalidate ) {
- return true;
- }
- }
- // Convert this into no more than $wgUpdateRowsPerJob HTMLCacheUpdateJob per-title
- // jobs and possibly a recursive HTMLCacheUpdateJob job for the rest of the backlinks
- $jobs = BacklinkJobUtils::partitionBacklinkJob(
- $this,
- $wgUpdateRowsPerJob,
- $wgUpdateRowsPerQuery, // jobs-per-title
- // Carry over information for de-duplication
- array( 'params' => $this->getRootJobParams() )
- );
- JobQueueGroup::singleton()->push( $jobs );
- // Job to purge pages for for a set of titles
- } elseif ( isset( $this->params['pages'] ) ) {
- $this->invalidateTitles( $this->params['pages'] );
- // B/C for job to purge a range of backlink pages for a given page
- } elseif ( $oldRangeJob ) {
- $titleArray = $this->title->getBacklinkCache()->getLinks(
- $this->params['table'], $this->params['start'], $this->params['end'] );
-
- $pages = array(); // same format BacklinkJobUtils uses
- foreach ( $titleArray as $tl ) {
- $pages[$tl->getArticleId()] = array( $tl->getNamespace(), $tl->getDbKey() );
- }
-
- $jobs = array();
- foreach ( array_chunk( $pages, $wgUpdateRowsPerJob ) as $pageChunk ) {
- $jobs[] = new HTMLCacheUpdateJob( $this->title,
- array(
- 'table' => $this->params['table'],
- 'pages' => $pageChunk
- ) + $this->getRootJobParams() // carry over information for de-duplication
- );
- }
- JobQueueGroup::singleton()->push( $jobs );
- }
-
- return true;
- }
-
- /**
- * @param array $pages Map of (page ID => (namespace, DB key)) entries
- */
- protected function invalidateTitles( array $pages ) {
- global $wgUpdateRowsPerQuery, $wgUseFileCache, $wgUseSquid;
-
- // Get all page IDs in this query into an array
- $pageIds = array_keys( $pages );
- if ( !$pageIds ) {
- return;
- }
-
- $dbw = wfGetDB( DB_MASTER );
-
- // The page_touched field will need to be bumped for these pages.
- // Only bump it to the present time if no "rootJobTimestamp" was known.
- // If it is known, it can be used instead, which avoids invalidating output
- // that was in fact generated *after* the relevant dependency change time
- // (e.g. template edit). This is particularily useful since refreshLinks jobs
- // save back parser output and usually run along side htmlCacheUpdate jobs;
- // their saved output would be invalidated by using the current timestamp.
- if ( isset( $this->params['rootJobTimestamp'] ) ) {
- $touchTimestamp = $this->params['rootJobTimestamp'];
- } else {
- $touchTimestamp = wfTimestampNow();
- }
-
- // Update page_touched (skipping pages already touched since the root job).
- // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
- foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
- $dbw->update( 'page',
- array( 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
- array( 'page_id' => $batch,
- // don't invalidated pages that were already invalidated
- "page_touched < " . $dbw->addQuotes( $dbw->timestamp( $touchTimestamp ) )
- ),
- __METHOD__
- );
- }
- // Get the list of affected pages (races only mean something else did the purge)
- $titleArray = TitleArray::newFromResult( $dbw->select(
- 'page',
- array( 'page_namespace', 'page_title' ),
- array( 'page_id' => $pageIds, 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
- __METHOD__
- ) );
-
- // Update squid
- if ( $wgUseSquid ) {
- $u = SquidUpdate::newFromTitles( $titleArray );
- $u->doUpdate();
- }
-
- // Update file cache
- if ( $wgUseFileCache ) {
- foreach ( $titleArray as $title ) {
- HTMLFileCache::clearFileCache( $title );
- }
- }
- }
-
- public function workItemCount() {
- return isset( $this->params['pages'] ) ? count( $this->params['pages'] ) : 1;
- }
-}
+++ /dev/null
-<?php
-/**
- * Degenerate job that does nothing.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- */
-
-/**
- * Degenerate job that does nothing, but can optionally replace itself
- * in the queue and/or sleep for a brief time period. These can be used
- * to represent "no-op" jobs or test lock contention and performance.
- *
- * @par Example:
- * Inserting a null job in the configured job queue:
- * @code
- * $ php maintenance/eval.php
- * > $queue = JobQueueGroup::singleton();
- * > $job = new NullJob( Title::newMainPage(), array( 'lives' => 10 ) );
- * > $queue->push( $job );
- * @endcode
- * You can then confirm the job has been enqueued by using the showJobs.php
- * maintenance utility:
- * @code
- * $ php maintenance/showJobs.php --group
- * null: 1 queue; 0 claimed (0 active, 0 abandoned)
- * $
- * @endcode
- *
- * @ingroup JobQueue
- */
-class NullJob extends Job {
- /**
- * @param Title $title
- * @param array $params job parameters (lives, usleep)
- */
- function __construct( $title, $params ) {
- parent::__construct( 'null', $title, $params );
- if ( !isset( $this->params['lives'] ) ) {
- $this->params['lives'] = 1;
- }
- if ( !isset( $this->params['usleep'] ) ) {
- $this->params['usleep'] = 0;
- }
- $this->removeDuplicates = !empty( $this->params['removeDuplicates'] );
- }
-
- public function run() {
- if ( $this->params['usleep'] > 0 ) {
- usleep( $this->params['usleep'] );
- }
- if ( $this->params['lives'] > 1 ) {
- $params = $this->params;
- $params['lives']--;
- $job = new self( $this->title, $params );
- JobQueueGroup::singleton()->push( $job );
- }
-
- return true;
- }
-}
+++ /dev/null
-<?php
-/**
- * Upload a file from the upload stash into the local file repo.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Upload
- */
-
-/**
- * Upload a file from the upload stash into the local file repo.
- *
- * @ingroup Upload
- */
-class PublishStashedFileJob extends Job {
- public function __construct( $title, $params ) {
- parent::__construct( 'PublishStashedFile', $title, $params );
- $this->removeDuplicates = true;
- }
-
- public function run() {
- $scope = RequestContext::importScopedSession( $this->params['session'] );
- $context = RequestContext::getMain();
- try {
- $user = $context->getUser();
- if ( !$user->isLoggedIn() ) {
- $this->setLastError( "Could not load the author user from session." );
-
- return false;
- }
-
- if ( count( $_SESSION ) === 0 ) {
- // Empty session probably indicates that we didn't associate
- // with the session correctly. Note that being able to load
- // the user does not necessarily mean the session was loaded.
- // Most likely cause by suhosin.session.encrypt = On.
- $this->setLastError( "Error associating with user session. " .
- "Try setting suhosin.session.encrypt = Off" );
-
- return false;
- }
-
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
- );
-
- $upload = new UploadFromStash( $user );
- // @todo initialize() causes a GET, ideally we could frontload the antivirus
- // checks and anything else to the stash stage (which includes concatenation and
- // the local file is thus already there). That way, instead of GET+PUT, there could
- // just be a COPY operation from the stash to the public zone.
- $upload->initialize( $this->params['filekey'], $this->params['filename'] );
-
- // Check if the local file checks out (this is generally a no-op)
- $verification = $upload->verifyUpload();
- if ( $verification['status'] !== UploadBase::OK ) {
- $status = Status::newFatal( 'verification-error' );
- $status->value = array( 'verification' => $verification );
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
- );
- $this->setLastError( "Could not verify upload." );
-
- return false;
- }
-
- // Upload the stashed file to a permanent location
- $status = $upload->performUpload(
- $this->params['comment'],
- $this->params['text'],
- $this->params['watch'],
- $user
- );
- if ( !$status->isGood() ) {
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
- );
- $this->setLastError( $status->getWikiText() );
-
- return false;
- }
-
- // Build the image info array while we have the local reference handy
- $apiMain = new ApiMain(); // dummy object (XXX)
- $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
-
- // Cleanup any temporary local file
- $upload->cleanupTempFile();
-
- // Cache the info so the user doesn't have to wait forever to get the final info
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array(
- 'result' => 'Success',
- 'stage' => 'publish',
- 'filename' => $upload->getLocalFile()->getName(),
- 'imageinfo' => $imageInfo,
- 'status' => Status::newGood()
- )
- );
- } catch ( MWException $e ) {
- UploadBase::setSessionStatus(
- $this->params['filekey'],
- array(
- 'result' => 'Failure',
- 'stage' => 'publish',
- 'status' => Status::newFatal( 'api-error-publishfailed' )
- )
- );
- $this->setLastError( get_class( $e ) . ": " . $e->getText() );
-
- return false;
- }
-
- return true;
- }
-
- public function getDeduplicationInfo() {
- $info = parent::getDeduplicationInfo();
- if ( is_array( $info['params'] ) ) {
- $info['params'] = array( 'filekey' => $info['params']['filekey'] );
- }
-
- return $info;
- }
-
- public function allowRetries() {
- return false;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job to update link tables for pages
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job to update link tables for pages
- *
- * This job comes in a few variants:
- * - a) Recursive jobs to update links for backlink pages for a given title.
- * These jobs have have (recursive:true,table:<table>) set.
- * - b) Jobs to update links for a set of pages (the job title is ignored).
- * These jobs have have (pages:(<page ID>:(<namespace>,<title>),...) set.
- * - c) Jobs to update links for a single page (the job title)
- * These jobs need no extra fields set.
- *
- * @ingroup JobQueue
- */
-class RefreshLinksJob extends Job {
- const PARSE_THRESHOLD_SEC = 1.0;
-
- function __construct( $title, $params = '' ) {
- parent::__construct( 'refreshLinks', $title, $params );
- // Base backlink update jobs and per-title update jobs can be de-duplicated.
- // If template A changes twice before any jobs run, a clean queue will have:
- // (A base, A base)
- // The second job is ignored by the queue on insertion.
- // Suppose, many pages use template A, and that template itself uses template B.
- // An edit to both will first create two base jobs. A clean FIFO queue will have:
- // (A base, B base)
- // When these jobs run, the queue will have per-title and remnant partition jobs:
- // (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
- // Some these jobs will be the same, and will automatically be ignored by
- // the queue upon insertion. Some title jobs will run before the duplicate is
- // inserted, so the work will still be done twice in those cases. More titles
- // can be de-duplicated as the remnant jobs continue to be broken down. This
- // works best when $wgUpdateRowsPerJob, and either the pages have few backlinks
- // and/or the backlink sets for pages A and B are almost identical.
- $this->removeDuplicates = !isset( $params['range'] )
- && ( !isset( $params['pages'] ) || count( $params['pages'] ) == 1 );
- }
-
- function run() {
- global $wgUpdateRowsPerJob;
-
- // Job to update all (or a range of) backlink pages for a page
- if ( !empty( $this->params['recursive'] ) ) {
- // Carry over information for de-duplication
- $extraParams = $this->getRootJobParams();
- // Avoid slave lag when fetching templates.
- // When the outermost job is run, we know that the caller that enqueued it must have
- // committed the relevant changes to the DB by now. At that point, record the master
- // position and pass it along as the job recursively breaks into smaller range jobs.
- // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
- if ( isset( $this->params['masterPos'] ) ) {
- $extraParams['masterPos'] = $this->params['masterPos'];
- } elseif ( wfGetLB()->getServerCount() > 1 ) {
- $extraParams['masterPos'] = wfGetLB()->getMasterPos();
- } else {
- $extraParams['masterPos'] = false;
- }
- // Convert this into no more than $wgUpdateRowsPerJob RefreshLinks per-title
- // jobs and possibly a recursive RefreshLinks job for the rest of the backlinks
- $jobs = BacklinkJobUtils::partitionBacklinkJob(
- $this,
- $wgUpdateRowsPerJob,
- 1, // job-per-title
- array( 'params' => $extraParams )
- );
- JobQueueGroup::singleton()->push( $jobs );
- // Job to update link tables for for a set of titles
- } elseif ( isset( $this->params['pages'] ) ) {
- foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
- list( $ns, $dbKey ) = $nsAndKey;
- $this->runForTitle( Title::makeTitleSafe( $ns, $dbKey ) );
- }
- // Job to update link tables for a given title
- } else {
- $this->runForTitle( $this->title );
- }
-
- return true;
- }
-
- protected function runForTitle( Title $title = null ) {
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
-
- if ( is_null( $title ) ) {
- $this->setLastError( "refreshLinks: Invalid title" );
- return false;
- }
-
- // Wait for the DB of the current/next slave DB handle to catch up to the master.
- // This way, we get the correct page_latest for templates or files that just changed
- // milliseconds ago, having triggered this job to begin with.
- if ( isset( $this->params['masterPos'] ) && $this->params['masterPos'] !== false ) {
- wfGetLB()->waitFor( $this->params['masterPos'] );
- }
-
- $page = WikiPage::factory( $title );
-
- // Fetch the current revision...
- $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
- if ( !$revision ) {
- $this->setLastError( "refreshLinks: Article not found {$title->getPrefixedDBkey()}" );
- return false; // XXX: what if it was just deleted?
- }
- $content = $revision->getContent( Revision::RAW );
- if ( !$content ) {
- // If there is no content, pretend the content is empty
- $content = $revision->getContentHandler()->makeEmptyContent();
- }
-
- $parserOutput = false;
- $parserOptions = $page->makeParserOptions( 'canonical' );
- // If page_touched changed after this root job (with a good slave lag skew factor),
- // then it is likely that any views of the pages already resulted in re-parses which
- // are now in cache. This can be reused to avoid expensive parsing in some cases.
- if ( isset( $this->params['rootJobTimestamp'] ) ) {
- $skewedTimestamp = wfTimestamp( TS_UNIX, $this->params['rootJobTimestamp'] ) + 5;
- if ( $page->getLinksTimestamp() > wfTimestamp( TS_MW, $skewedTimestamp ) ) {
- // Something already updated the backlinks since this job was made
- return true;
- }
- if ( $page->getTouched() > wfTimestamp( TS_MW, $skewedTimestamp ) ) {
- $parserOutput = ParserCache::singleton()->getDirty( $page, $parserOptions );
- if ( $parserOutput && $parserOutput->getCacheTime() <= $skewedTimestamp ) {
- $parserOutput = false; // too stale
- }
- }
- }
- // Fetch the current revision and parse it if necessary...
- if ( $parserOutput == false ) {
- $start = microtime( true );
- // Revision ID must be passed to the parser output to get revision variables correct
- $parserOutput = $content->getParserOutput(
- $title, $revision->getId(), $parserOptions, false );
- $ellapsed = microtime( true ) - $start;
- // If it took a long time to render, then save this back to the cache to avoid
- // wasted CPU by other apaches or job runners. We don't want to always save to
- // cache as this cause cause high cache I/O and LRU churn when a template changes.
- if ( $ellapsed >= self::PARSE_THRESHOLD_SEC
- && $page->isParserCacheUsed( $parserOptions, $revision->getId() )
- && $parserOutput->isCacheable()
- ) {
- $ctime = wfTimestamp( TS_MW, (int)$start ); // cache time
- ParserCache::singleton()->save( $parserOutput, $page, $parserOptions, $ctime );
- }
- }
-
- $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
- DataUpdate::runUpdates( $updates );
-
- InfoAction::invalidateCache( $title );
-
- return true;
- }
-
- public function getDeduplicationInfo() {
- $info = parent::getDeduplicationInfo();
- if ( is_array( $info['params'] ) ) {
- // Don't let highly unique "masterPos" values ruin duplicate detection
- unset( $info['params']['masterPos'] );
- // For per-pages jobs, the job title is that of the template that changed
- // (or similar), so remove that since it ruins duplicate detection
- if ( isset( $info['pages'] ) ) {
- unset( $info['namespace'] );
- unset( $info['title'] );
- }
- }
-
- return $info;
- }
-
- public function workItemCount() {
- return isset( $this->params['pages'] ) ? count( $this->params['pages'] ) : 1;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job to update links for a given title.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Background job to update links for titles in certain backlink range by page ID.
- * Newer version for high use templates. This is deprecated by RefreshLinksPartitionJob.
- *
- * @ingroup JobQueue
- * @deprecated 1.23
- */
-class RefreshLinksJob2 extends Job {
- function __construct( $title, $params ) {
- parent::__construct( 'refreshLinks2', $title, $params );
- // Base jobs for large templates can easily be de-duplicated
- $this->removeDuplicates = !isset( $params['start'] ) && !isset( $params['end'] );
- }
-
- /**
- * Run a refreshLinks2 job
- * @return boolean success
- */
- function run() {
- global $wgUpdateRowsPerJob;
-
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
-
- if ( is_null( $this->title ) ) {
- $this->error = "refreshLinks2: Invalid title";
- return false;
- }
-
- // Back compat for pre-r94435 jobs
- $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
-
- // Avoid slave lag when fetching templates.
- // When the outermost job is run, we know that the caller that enqueued it must have
- // committed the relevant changes to the DB by now. At that point, record the master
- // position and pass it along as the job recursively breaks into smaller range jobs.
- // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
- if ( isset( $this->params['masterPos'] ) ) {
- $masterPos = $this->params['masterPos'];
- } elseif ( wfGetLB()->getServerCount() > 1 ) {
- $masterPos = wfGetLB()->getMasterPos();
- } else {
- $masterPos = false;
- }
-
- $tbc = $this->title->getBacklinkCache();
-
- $jobs = array(); // jobs to insert
- if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
- # This is a partition job to trigger the insertion of leaf jobs...
- $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
- } else {
- # This is a base job to trigger the insertion of partitioned jobs...
- if ( $tbc->getNumLinks( $table, $wgUpdateRowsPerJob + 1 ) <= $wgUpdateRowsPerJob ) {
- # Just directly insert the single per-title jobs
- $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
- } else {
- # Insert the partition jobs to make per-title jobs
- foreach ( $tbc->partition( $table, $wgUpdateRowsPerJob ) as $batch ) {
- list( $start, $end ) = $batch;
- $jobs[] = new RefreshLinksJob2( $this->title,
- array(
- 'table' => $table,
- 'start' => $start,
- 'end' => $end,
- 'masterPos' => $masterPos,
- ) + $this->getRootJobParams() // carry over information for de-duplication
- );
- }
- }
- }
-
- if ( count( $jobs ) ) {
- JobQueueGroup::singleton()->push( $jobs );
- }
-
- return true;
- }
-
- /**
- * @param $table string
- * @param $masterPos mixed
- * @return Array
- */
- protected function getSingleTitleJobs( $table, $masterPos ) {
- # The "start"/"end" fields are not set for the base jobs
- $start = isset( $this->params['start'] ) ? $this->params['start'] : false;
- $end = isset( $this->params['end'] ) ? $this->params['end'] : false;
- $titles = $this->title->getBacklinkCache()->getLinks( $table, $start, $end );
- # Convert into single page refresh links jobs.
- # This handles well when in sapi mode and is useful in any case for job
- # de-duplication. If many pages use template A, and that template itself
- # uses template B, then an edit to both will create many duplicate jobs.
- # Roughly speaking, for each page, one of the "RefreshLinksJob" jobs will
- # get run first, and when it does, it will remove the duplicates. Of course,
- # one page could have its job popped when the other page's job is still
- # buried within the logic of a refreshLinks2 job.
- $jobs = array();
- foreach ( $titles as $title ) {
- $jobs[] = new RefreshLinksJob( $title,
- array( 'masterPos' => $masterPos ) + $this->getRootJobParams()
- ); // carry over information for de-duplication
- }
- return $jobs;
- }
-
- /**
- * @return Array
- */
- public function getDeduplicationInfo() {
- $info = parent::getDeduplicationInfo();
- // Don't let highly unique "masterPos" values ruin duplicate detection
- if ( is_array( $info['params'] ) ) {
- unset( $info['params']['masterPos'] );
- }
- return $info;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job for asynchronous upload-by-url.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job for asynchronous upload-by-url.
- *
- * This job is in fact an interface to UploadFromUrl, which is designed such
- * that it does not require any globals. If it does, fix it elsewhere, do not
- * add globals in here.
- *
- * @ingroup JobQueue
- */
-class UploadFromUrlJob extends Job {
- const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
-
- /** @var UploadFromUrl */
- public $upload;
-
- /** @var User */
- protected $user;
-
- public function __construct( $title, $params ) {
- parent::__construct( 'uploadFromUrl', $title, $params );
- }
-
- public function run() {
- global $wgCopyUploadAsyncTimeout;
- # Initialize this object and the upload object
- $this->upload = new UploadFromUrl();
- $this->upload->initialize(
- $this->title->getText(),
- $this->params['url'],
- false
- );
- $this->user = User::newFromName( $this->params['userName'] );
-
- # Fetch the file
- $opts = array();
- if ( $wgCopyUploadAsyncTimeout ) {
- $opts['timeout'] = $wgCopyUploadAsyncTimeout;
- }
- $status = $this->upload->fetchFile( $opts );
- if ( !$status->isOk() ) {
- $this->leaveMessage( $status );
-
- return true;
- }
-
- # Verify upload
- $result = $this->upload->verifyUpload();
- if ( $result['status'] != UploadBase::OK ) {
- $status = $this->upload->convertVerifyErrorToStatus( $result );
- $this->leaveMessage( $status );
-
- return true;
- }
-
- # Check warnings
- if ( !$this->params['ignoreWarnings'] ) {
- $warnings = $this->upload->checkWarnings();
- if ( $warnings ) {
-
- # Stash the upload
- $key = $this->upload->stashFile();
-
- // @todo FIXME: This has been broken for a while.
- // User::leaveUserMessage() does not exist.
- if ( $this->params['leaveMessage'] ) {
- $this->user->leaveUserMessage(
- wfMessage( 'upload-warning-subj' )->text(),
- wfMessage( 'upload-warning-msg',
- $key,
- $this->params['url'] )->text()
- );
- } else {
- wfSetupSession( $this->params['sessionId'] );
- $this->storeResultInSession( 'Warning',
- 'warnings', $warnings );
- session_write_close();
- }
-
- return true;
- }
- }
-
- # Perform the upload
- $status = $this->upload->performUpload(
- $this->params['comment'],
- $this->params['pageText'],
- $this->params['watch'],
- $this->user
- );
- $this->leaveMessage( $status );
-
- return true;
- }
-
- /**
- * Leave a message on the user talk page or in the session according to
- * $params['leaveMessage'].
- *
- * @param Status $status
- */
- protected function leaveMessage( $status ) {
- if ( $this->params['leaveMessage'] ) {
- if ( $status->isGood() ) {
- // @todo FIXME: user->leaveUserMessage does not exist.
- $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
- wfMessage( 'upload-success-msg',
- $this->upload->getTitle()->getText(),
- $this->params['url']
- )->text() );
- } else {
- // @todo FIXME: user->leaveUserMessage does not exist.
- $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
- wfMessage( 'upload-failure-msg',
- $status->getWikiText(),
- $this->params['url']
- )->text() );
- }
- } else {
- wfSetupSession( $this->params['sessionId'] );
- if ( $status->isOk() ) {
- $this->storeResultInSession( 'Success',
- 'filename', $this->upload->getLocalFile()->getName() );
- } else {
- $this->storeResultInSession( 'Failure',
- 'errors', $status->getErrorsArray() );
- }
- session_write_close();
- }
- }
-
- /**
- * Store a result in the session data. Note that the caller is responsible
- * for appropriate session_start and session_write_close calls.
- *
- * @param string $result the result (Success|Warning|Failure)
- * @param string $dataKey the key of the extra data
- * @param mixed $dataValue The extra data itself
- */
- protected function storeResultInSession( $result, $dataKey, $dataValue ) {
- $session =& self::getSessionData( $this->params['sessionKey'] );
- $session['result'] = $result;
- $session[$dataKey] = $dataValue;
- }
-
- /**
- * Initialize the session data. Sets the intial result to queued.
- */
- public function initializeSessionData() {
- $session =& self::getSessionData( $this->params['sessionKey'] );
- $$session['result'] = 'Queued';
- }
-
- /**
- * @param $key
- * @return mixed
- */
- public static function &getSessionData( $key ) {
- if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
- $_SESSION[self::SESSION_KEYNAME][$key] = array();
- }
-
- return $_SESSION[self::SESSION_KEYNAME][$key];
- }
-}
+++ /dev/null
-<?php
-/**
- * Job to update links for a given title.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- * @author Aaron Schulz
- */
-
-/**
- * Class with Backlink related Job helper methods
- *
- * @ingroup JobQueue
- * @since 1.23
- */
-class BacklinkJobUtils {
- /**
- * Break down $job into approximately ($bSize/$cSize) leaf jobs and a single partition
- * job that covers the remaining backlink range (if needed). Jobs for the first $bSize
- * titles are collated ($cSize per job) into leaf jobs to do actual work. All the
- * resulting jobs are of the same class as $job. No partition job is returned if the
- * range covered by $job was less than $bSize, as the leaf jobs have full coverage.
- *
- * The leaf jobs have the 'pages' param set to a (<page ID>:(<namespace>,<DB key>),...)
- * map so that the run() function knows what pages to act on. The leaf jobs will keep
- * the same job title as the parent job (e.g. $job).
- *
- * The partition jobs have the 'range' parameter set to a map of the format
- * (start:<integer>, end:<integer>, batchSize:<integer>, subranges:((<start>,<end>),...)),
- * the 'table' parameter set to that of $job, and the 'recursive' parameter set to true.
- * This method can be called on the resulting job to repeat the process again.
- *
- * The job provided ($job) must have the 'recursive' parameter set to true and the 'table'
- * parameter must be set to a backlink table. The job title will be used as the title to
- * find backlinks for. Any 'range' parameter must follow the same format as mentioned above.
- * This should be managed by recursive calls to this method.
- *
- * The first jobs return are always the leaf jobs. This lets the caller use push() to
- * put them directly into the queue and works well if the queue is FIFO. In such a queue,
- * the leaf jobs have to get finished first before anything can resolve the next partition
- * job, which keeps the queue very small.
- *
- * $opts includes:
- * - params : extra job parameters to include in each job
- *
- * @param Job $job
- * @param int $bSize BacklinkCache partition size; usually $wgUpdateRowsPerJob
- * @param int $cSize Max titles per leaf job; Usually 1 or a modest value
- * @param array $opts Optional parameter map
- * @return Job[] List of Job objects
- */
- public static function partitionBacklinkJob( Job $job, $bSize, $cSize, $opts = array() ) {
- $class = get_class( $job );
- $title = $job->getTitle();
- $params = $job->getParams();
-
- if ( isset( $params['pages'] ) || empty( $params['recursive'] ) ) {
- $ranges = array(); // sanity; this is a leaf node
- wfWarn( __METHOD__ . " called on {$job->getType()} leaf job (explosive recursion)." );
- } elseif ( isset( $params['range'] ) ) {
- // This is a range job to trigger the insertion of partitioned/title jobs...
- $ranges = $params['range']['subranges'];
- $realBSize = $params['range']['batchSize'];
- } else {
- // This is a base job to trigger the insertion of partitioned jobs...
- $ranges = $title->getBacklinkCache()->partition( $params['table'], $bSize );
- $realBSize = $bSize;
- }
-
- $extraParams = isset( $opts['params'] ) ? $opts['params'] : array();
-
- $jobs = array();
- // Combine the first range (of size $bSize) backlinks into leaf jobs
- if ( isset( $ranges[0] ) ) {
- list( $start, $end ) = $ranges[0];
- $titles = $title->getBacklinkCache()->getLinks( $params['table'], $start, $end );
- foreach ( array_chunk( iterator_to_array( $titles ), $cSize ) as $titleBatch ) {
- $pages = array();
- foreach ( $titleBatch as $tl ) {
- $pages[$tl->getArticleId()] = array( $tl->getNamespace(), $tl->getDBKey() );
- }
- $jobs[] = new $class(
- $title, // maintain parent job title
- array( 'pages' => $pages ) + $extraParams
- );
- }
- }
- // Take all of the remaining ranges and build a partition job from it
- if ( isset( $ranges[1] ) ) {
- $jobs[] = new $class(
- $title, // maintain parent job title
- array(
- 'recursive' => true,
- 'table' => $params['table'],
- 'range' => array(
- 'start' => $ranges[1][0],
- 'end' => $ranges[count( $ranges ) - 1][1],
- 'batchSize' => $realBSize,
- 'subranges' => array_slice( $ranges, 1 )
- ),
- ) + $extraParams
- );
- }
-
- return $jobs;
- }
-}
--- /dev/null
+<?php
+/**
+ * Job queue task base code.
+ *
+ * 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
+ * @defgroup JobQueue JobQueue
+ */
+
+/**
+ * Class to both describe a background job and handle jobs.
+ * The queue aspects of this class are now deprecated.
+ * Using the class to push jobs onto queues is deprecated (use JobSpecification).
+ *
+ * @ingroup JobQueue
+ */
+abstract class Job implements IJobSpecification {
+ /** @var string */
+ public $command;
+
+ /** @var array|bool Array of job parameters or false if none */
+ public $params;
+
+ /** @var array Additional queue metadata */
+ public $metadata = array();
+
+ /** @var Title */
+ protected $title;
+
+ /** @var bool Expensive jobs may set this to true */
+ protected $removeDuplicates;
+
+ /** @var string Text for error that occurred last */
+ protected $error;
+
+ /*-------------------------------------------------------------------------
+ * Abstract functions
+ *------------------------------------------------------------------------*/
+
+ /**
+ * Run the job
+ * @return bool Success
+ */
+ abstract public function run();
+
+ /*-------------------------------------------------------------------------
+ * Static functions
+ *------------------------------------------------------------------------*/
+
+ /**
+ * Create the appropriate object to handle a specific job
+ *
+ * @param string $command Job command
+ * @param Title $title Associated title
+ * @param array|bool $params Job parameters
+ * @throws MWException
+ * @return Job
+ */
+ public static function factory( $command, Title $title, $params = false ) {
+ global $wgJobClasses;
+ if ( isset( $wgJobClasses[$command] ) ) {
+ $class = $wgJobClasses[$command];
+
+ return new $class( $title, $params );
+ }
+ throw new MWException( "Invalid job command `{$command}`" );
+ }
+
+ /**
+ * Batch-insert a group of jobs into the queue.
+ * This will be wrapped in a transaction with a forced commit.
+ *
+ * This may add duplicate at insert time, but they will be
+ * removed later on, when the first one is popped.
+ *
+ * @param array $jobs of Job objects
+ * @return bool
+ * @deprecated since 1.21
+ */
+ public static function batchInsert( $jobs ) {
+ return JobQueueGroup::singleton()->push( $jobs );
+ }
+
+ /**
+ * Insert a group of jobs into the queue.
+ *
+ * Same as batchInsert() but does not commit and can thus
+ * be rolled-back as part of a larger transaction. However,
+ * large batches of jobs can cause slave lag.
+ *
+ * @param array $jobs of Job objects
+ * @return bool
+ * @deprecated since 1.21
+ */
+ public static function safeBatchInsert( $jobs ) {
+ return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
+ }
+
+ /**
+ * Pop a job of a certain type. This tries less hard than pop() to
+ * actually find a job; it may be adversely affected by concurrent job
+ * runners.
+ *
+ * @param $type string
+ * @return Job|bool Returns false if there are no jobs
+ * @deprecated since 1.21
+ */
+ public static function pop_type( $type ) {
+ return JobQueueGroup::singleton()->get( $type )->pop();
+ }
+
+ /**
+ * Pop a job off the front of the queue.
+ * This is subject to $wgJobTypesExcludedFromDefaultQueue.
+ *
+ * @return Job|bool False if there are no jobs
+ * @deprecated since 1.21
+ */
+ public static function pop() {
+ return JobQueueGroup::singleton()->pop();
+ }
+
+ /*-------------------------------------------------------------------------
+ * Non-static functions
+ *------------------------------------------------------------------------*/
+
+ /**
+ * @param $command
+ * @param $title
+ * @param $params array|bool
+ */
+ public function __construct( $command, $title, $params = false ) {
+ $this->command = $command;
+ $this->title = $title;
+ $this->params = $params;
+
+ // expensive jobs may set this to true
+ $this->removeDuplicates = false;
+ }
+
+ /**
+ * @return string
+ */
+ public function getType() {
+ return $this->command;
+ }
+
+ /**
+ * @return Title
+ */
+ public function getTitle() {
+ return $this->title;
+ }
+
+ /**
+ * @return array
+ */
+ public function getParams() {
+ return $this->params;
+ }
+
+ /**
+ * @return int|null UNIX timestamp to delay running this job until, otherwise null
+ * @since 1.22
+ */
+ public function getReleaseTimestamp() {
+ return isset( $this->params['jobReleaseTimestamp'] )
+ ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
+ : null;
+ }
+
+ /**
+ * @return bool Whether only one of each identical set of jobs should be run
+ */
+ public function ignoreDuplicates() {
+ return $this->removeDuplicates;
+ }
+
+ /**
+ * @return bool Whether this job can be retried on failure by job runners
+ * @since 1.21
+ */
+ public function allowRetries() {
+ return true;
+ }
+
+ /**
+ * @return integer Number of actually "work items" handled in this job
+ * @see $wgJobBackoffThrottling
+ * @since 1.23
+ */
+ public function workItemCount() {
+ return 1;
+ }
+
+ /**
+ * Subclasses may need to override this to make duplication detection work.
+ * The resulting map conveys everything that makes the job unique. This is
+ * only checked if ignoreDuplicates() returns true, meaning that duplicate
+ * jobs are supposed to be ignored.
+ *
+ * @return array Map of key/values
+ * @since 1.21
+ */
+ public function getDeduplicationInfo() {
+ $info = array(
+ 'type' => $this->getType(),
+ 'namespace' => $this->getTitle()->getNamespace(),
+ 'title' => $this->getTitle()->getDBkey(),
+ 'params' => $this->getParams()
+ );
+ if ( is_array( $info['params'] ) ) {
+ // Identical jobs with different "root" jobs should count as duplicates
+ unset( $info['params']['rootJobSignature'] );
+ unset( $info['params']['rootJobTimestamp'] );
+ // Likewise for jobs with different delay times
+ unset( $info['params']['jobReleaseTimestamp'] );
+ }
+
+ return $info;
+ }
+
+ /**
+ * @see JobQueue::deduplicateRootJob()
+ * @param string $key A key that identifies the task
+ * @return array Map of:
+ * - rootJobSignature : hash (e.g. SHA1) that identifies the task
+ * - rootJobTimestamp : TS_MW timestamp of this instance of the task
+ * @since 1.21
+ */
+ public static function newRootJobParams( $key ) {
+ return array(
+ 'rootJobSignature' => sha1( $key ),
+ 'rootJobTimestamp' => wfTimestampNow()
+ );
+ }
+
+ /**
+ * @see JobQueue::deduplicateRootJob()
+ * @return array
+ * @since 1.21
+ */
+ public function getRootJobParams() {
+ return array(
+ 'rootJobSignature' => isset( $this->params['rootJobSignature'] )
+ ? $this->params['rootJobSignature']
+ : null,
+ 'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
+ ? $this->params['rootJobTimestamp']
+ : null
+ );
+ }
+
+ /**
+ * @see JobQueue::deduplicateRootJob()
+ * @return bool
+ * @since 1.22
+ */
+ public function hasRootJobParams() {
+ return isset( $this->params['rootJobSignature'] )
+ && isset( $this->params['rootJobTimestamp'] );
+ }
+
+ /**
+ * Insert a single job into the queue.
+ * @return bool true on success
+ * @deprecated since 1.21
+ */
+ public function insert() {
+ return JobQueueGroup::singleton()->push( $this );
+ }
+
+ /**
+ * @return string
+ */
+ public function toString() {
+ $paramString = '';
+ if ( $this->params ) {
+ foreach ( $this->params as $key => $value ) {
+ if ( $paramString != '' ) {
+ $paramString .= ' ';
+ }
+ if ( is_array( $value ) ) {
+ $value = "array(" . count( $value ) . ")";
+ } elseif ( is_object( $value ) && !method_exists( $value, '__toString' ) ) {
+ $value = "object(" . get_class( $value ) . ")";
+ }
+ $value = (string)$value;
+ if ( mb_strlen( $value ) > 1024 ) {
+ $value = "string(" . mb_strlen( $value ) . ")";
+ }
+
+ $paramString .= "$key=$value";
+ }
+ }
+
+ if ( is_object( $this->title ) ) {
+ $s = "{$this->command} " . $this->title->getPrefixedDBkey();
+ if ( $paramString !== '' ) {
+ $s .= ' ' . $paramString;
+ }
+
+ return $s;
+ } else {
+ return "{$this->command} $paramString";
+ }
+ }
+
+ protected function setLastError( $error ) {
+ $this->error = $error;
+ }
+
+ public function getLastError() {
+ return $this->error;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue base code.
+ *
+ * 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
+ * @defgroup JobQueue JobQueue
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueue {
+ /** @var string Wiki ID */
+ protected $wiki;
+
+ /** @var string Job type */
+ protected $type;
+
+ /** @var string Job priority for pop() */
+ protected $order;
+
+ /** @var int Time to live in seconds */
+ protected $claimTTL;
+
+ /** @var int Maximum number of times to try a job */
+ protected $maxTries;
+
+ /** @var bool Allow delayed jobs */
+ protected $checkDelay;
+
+ /** @var BagOStuff */
+ protected $dupCache;
+
+ const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions
+
+ const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
+
+ /**
+ * @param array $params
+ * @throws MWException
+ */
+ protected function __construct( array $params ) {
+ $this->wiki = $params['wiki'];
+ $this->type = $params['type'];
+ $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
+ $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
+ if ( isset( $params['order'] ) && $params['order'] !== 'any' ) {
+ $this->order = $params['order'];
+ } else {
+ $this->order = $this->optimalOrder();
+ }
+ if ( !in_array( $this->order, $this->supportedOrders() ) ) {
+ throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
+ }
+ $this->checkDelay = !empty( $params['checkDelay'] );
+ if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
+ throw new MWException( __CLASS__ . " does not support delayed jobs." );
+ }
+ $this->dupCache = wfGetCache( CACHE_ANYTHING );
+ }
+
+ /**
+ * Get a job queue object of the specified type.
+ * $params includes:
+ * - class : What job class to use (determines job type)
+ * - wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
+ * - type : The name of the job types this queue handles
+ * - order : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+ * If "fifo" is used, the queue will effectively be FIFO. Note that job
+ * completion will not appear to be exactly FIFO if there are multiple
+ * job runners since jobs can take different times to finish once popped.
+ * If "timestamp" is used, the queue will at least be loosely ordered
+ * by timestamp, allowing for some jobs to be popped off out of order.
+ * If "random" is used, pop() will pick jobs in random order.
+ * Note that it may only be weakly random (e.g. a lottery of the oldest X).
+ * If "any" is choosen, the queue will use whatever order is the fastest.
+ * This might be useful for improving concurrency for job acquisition.
+ * - claimTTL : If supported, the queue will recycle jobs that have been popped
+ * but not acknowledged as completed after this many seconds. Recycling
+ * of jobs simple means re-inserting them into the queue. Jobs can be
+ * attempted up to three times before being discarded.
+ * - checkDelay : If supported, respect Job::getReleaseTimestamp() in the push functions.
+ * This lets delayed jobs wait in a staging area until a given timestamp is
+ * reached, at which point they will enter the queue. If this is not enabled
+ * or not supported, an exception will be thrown on delayed job insertion.
+ *
+ * Queue classes should throw an exception if they do not support the options given.
+ *
+ * @param array $params
+ * @return JobQueue
+ * @throws MWException
+ */
+ final public static function factory( array $params ) {
+ $class = $params['class'];
+ if ( !class_exists( $class ) ) {
+ throw new MWException( "Invalid job queue class '$class'." );
+ }
+ $obj = new $class( $params );
+ if ( !( $obj instanceof self ) ) {
+ throw new MWException( "Class '$class' is not a " . __CLASS__ . " class." );
+ }
+
+ return $obj;
+ }
+
+ /**
+ * @return string Wiki ID
+ */
+ final public function getWiki() {
+ return $this->wiki;
+ }
+
+ /**
+ * @return string Job type that this queue handles
+ */
+ final public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * @return string One of (random, timestamp, fifo, undefined)
+ */
+ final public function getOrder() {
+ return $this->order;
+ }
+
+ /**
+ * @return bool Whether delayed jobs are enabled
+ * @since 1.22
+ */
+ final public function delayedJobsEnabled() {
+ return $this->checkDelay;
+ }
+
+ /**
+ * Get the allowed queue orders for configuration validation
+ *
+ * @return array Subset of (random, timestamp, fifo, undefined)
+ */
+ abstract protected function supportedOrders();
+
+ /**
+ * Get the default queue order to use if configuration does not specify one
+ *
+ * @return string One of (random, timestamp, fifo, undefined)
+ */
+ abstract protected function optimalOrder();
+
+ /**
+ * Find out if delayed jobs are supported for configuration validation
+ *
+ * @return bool Whether delayed jobs are supported
+ */
+ protected function supportsDelayedJobs() {
+ return false; // not implemented
+ }
+
+ /**
+ * Quickly check if the queue has no available (unacquired, non-delayed) jobs.
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this might return false when there are actually no jobs.
+ * If pop() is called and returns false then it should correct the cache. Also,
+ * calling flushCaches() first prevents this. However, this affect is typically
+ * not distinguishable from the race condition between isEmpty() and pop().
+ *
+ * @return bool
+ * @throws JobQueueError
+ */
+ final public function isEmpty() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doIsEmpty();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::isEmpty()
+ * @return bool
+ */
+ abstract protected function doIsEmpty();
+
+ /**
+ * Get the number of available (unacquired, non-delayed) jobs in the queue.
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return int
+ * @throws JobQueueError
+ */
+ final public function getSize() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetSize();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getSize()
+ * @return int
+ */
+ abstract protected function doGetSize();
+
+ /**
+ * Get the number of acquired jobs (these are temporarily out of the queue).
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return int
+ * @throws JobQueueError
+ */
+ final public function getAcquiredCount() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetAcquiredCount();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getAcquiredCount()
+ * @return int
+ */
+ abstract protected function doGetAcquiredCount();
+
+ /**
+ * Get the number of delayed jobs (these are temporarily out of the queue).
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return int
+ * @throws JobQueueError
+ * @since 1.22
+ */
+ final public function getDelayedCount() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetDelayedCount();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getDelayedCount()
+ * @return int
+ */
+ protected function doGetDelayedCount() {
+ return 0; // not implemented
+ }
+
+ /**
+ * Get the number of acquired jobs that can no longer be attempted.
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return int
+ * @throws JobQueueError
+ */
+ final public function getAbandonedCount() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetAbandonedCount();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getAbandonedCount()
+ * @return int
+ */
+ protected function doGetAbandonedCount() {
+ return 0; // not implemented
+ }
+
+ /**
+ * Push one or more jobs into the queue.
+ * This does not require $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::push() instead of this function.
+ *
+ * @param Job|array $jobs A single job or an array of Jobs
+ * @param int $flags Bitfield (supports JobQueue::QOS_ATOMIC)
+ * @return bool Returns false on failure
+ * @throws JobQueueError
+ */
+ final public function push( $jobs, $flags = 0 ) {
+ return $this->batchPush( is_array( $jobs ) ? $jobs : array( $jobs ), $flags );
+ }
+
+ /**
+ * Push a batch of jobs into the queue.
+ * This does not require $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::push() instead of this function.
+ *
+ * @param array $jobs List of Jobs
+ * @param int $flags Bitfield (supports JobQueue::QOS_ATOMIC)
+ * @throws MWException
+ * @return bool Returns false on failure
+ */
+ final public function batchPush( array $jobs, $flags = 0 ) {
+ if ( !count( $jobs ) ) {
+ return true; // nothing to do
+ }
+
+ foreach ( $jobs as $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException(
+ "Got '{$job->getType()}' job; expected a '{$this->type}' job." );
+ } elseif ( $job->getReleaseTimestamp() && !$this->checkDelay ) {
+ throw new MWException(
+ "Got delayed '{$job->getType()}' job; delays are not supported." );
+ }
+ }
+
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doBatchPush( $jobs, $flags );
+ wfProfileOut( __METHOD__ );
+
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::batchPush()
+ * @param array $jobs
+ * @param $flags
+ * @return bool
+ */
+ abstract protected function doBatchPush( array $jobs, $flags );
+
+ /**
+ * Pop a job off of the queue.
+ * This requires $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::pop() instead of this function.
+ *
+ * @throws MWException
+ * @return Job|bool Returns false if there are no jobs
+ */
+ final public function pop() {
+ global $wgJobClasses;
+
+ if ( $this->wiki !== wfWikiID() ) {
+ throw new MWException( "Cannot pop '{$this->type}' job off foreign wiki queue." );
+ } elseif ( !isset( $wgJobClasses[$this->type] ) ) {
+ // Do not pop jobs if there is no class for the queue type
+ throw new MWException( "Unrecognized job type '{$this->type}'." );
+ }
+
+ wfProfileIn( __METHOD__ );
+ $job = $this->doPop();
+ wfProfileOut( __METHOD__ );
+
+ // Flag this job as an old duplicate based on its "root" job...
+ try {
+ if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
+ JobQueue::incrStats( 'job-pop-duplicate', $this->type );
+ $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
+ }
+ } catch ( MWException $e ) {
+ // don't lose jobs over this
+ }
+
+ return $job;
+ }
+
+ /**
+ * @see JobQueue::pop()
+ * @return Job
+ */
+ abstract protected function doPop();
+
+ /**
+ * Acknowledge that a job was completed.
+ *
+ * This does nothing for certain queue classes or if "claimTTL" is not set.
+ * Outside callers should use JobQueueGroup::ack() instead of this function.
+ *
+ * @param Job $job
+ * @throws MWException
+ * @return bool
+ */
+ final public function ack( Job $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doAck( $job );
+ wfProfileOut( __METHOD__ );
+
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::ack()
+ * @param Job $job
+ * @return bool
+ */
+ abstract protected function doAck( Job $job );
+
+ /**
+ * Register the "root job" of a given job into the queue for de-duplication.
+ * This should only be called right *after* all the new jobs have been inserted.
+ * This is used to turn older, duplicate, job entries into no-ops. The root job
+ * information will remain in the registry until it simply falls out of cache.
+ *
+ * This requires that $job has two special fields in the "params" array:
+ * - rootJobSignature : hash (e.g. SHA1) that identifies the task
+ * - rootJobTimestamp : TS_MW timestamp of this instance of the task
+ *
+ * A "root job" is a conceptual job that consist of potentially many smaller jobs
+ * that are actually inserted into the queue. For example, "refreshLinks" jobs are
+ * spawned when a template is edited. One can think of the task as "update links
+ * of pages that use template X" and an instance of that task as a "root job".
+ * However, what actually goes into the queue are range and leaf job subtypes.
+ * Since these jobs include things like page ID ranges and DB master positions,
+ * and can morph into smaller jobs recursively, simple duplicate detection
+ * for individual jobs being identical (like that of job_sha1) is not useful.
+ *
+ * In the case of "refreshLinks", if these jobs are still in the queue when the template
+ * is edited again, we want all of these old refreshLinks jobs for that template to become
+ * no-ops. This can greatly reduce server load, since refreshLinks jobs involves parsing.
+ * Essentially, the new batch of jobs belong to a new "root job" and the older ones to a
+ * previous "root job" for the same task of "update links of pages that use template X".
+ *
+ * This does nothing for certain queue classes.
+ *
+ * @param Job $job
+ * @throws MWException
+ * @return bool
+ */
+ final public function deduplicateRootJob( Job $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doDeduplicateRootJob( $job );
+ wfProfileOut( __METHOD__ );
+
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::deduplicateRootJob()
+ * @param Job $job
+ * @throws MWException
+ * @return bool
+ */
+ protected function doDeduplicateRootJob( Job $job ) {
+ if ( !$job->hasRootJobParams() ) {
+ throw new MWException( "Cannot register root job; missing parameters." );
+ }
+ $params = $job->getRootJobParams();
+
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+ // Callers should call batchInsert() and then this function so that if the insert
+ // fails, the de-duplication registration will be aborted. Since the insert is
+ // deferred till "transaction idle", do the same here, so that the ordering is
+ // maintained. Having only the de-duplication registration succeed would cause
+ // jobs to become no-ops without any actual jobs that made them redundant.
+ $timestamp = $this->dupCache->get( $key ); // current last timestamp of this job
+ if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+ return true; // a newer version of this root job was enqueued
+ }
+
+ // Update the timestamp of the last root job started at the location...
+ return $this->dupCache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+ }
+
+ /**
+ * Check if the "root" job of a given job has been superseded by a newer one
+ *
+ * @param Job $job
+ * @throws MWException
+ * @return bool
+ */
+ final protected function isRootJobOldDuplicate( Job $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ wfProfileIn( __METHOD__ );
+ $isDuplicate = $this->doIsRootJobOldDuplicate( $job );
+ wfProfileOut( __METHOD__ );
+
+ return $isDuplicate;
+ }
+
+ /**
+ * @see JobQueue::isRootJobOldDuplicate()
+ * @param Job $job
+ * @return bool
+ */
+ protected function doIsRootJobOldDuplicate( Job $job ) {
+ if ( !$job->hasRootJobParams() ) {
+ return false; // job has no de-deplication info
+ }
+ $params = $job->getRootJobParams();
+
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+ // Get the last time this root job was enqueued
+ $timestamp = $this->dupCache->get( $key );
+
+ // Check if a new root job was started at the location after this one's...
+ return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+ }
+
+ /**
+ * @param string $signature Hash identifier of the root job
+ * @return string
+ */
+ protected function getRootJobCacheKey( $signature ) {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+ }
+
+ /**
+ * Deleted all unclaimed and delayed jobs from the queue
+ *
+ * @return bool Success
+ * @throws JobQueueError
+ * @since 1.22
+ */
+ final public function delete() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doDelete();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::delete()
+ * @throws MWException
+ * @return bool Success
+ */
+ protected function doDelete() {
+ throw new MWException( "This method is not implemented." );
+ }
+
+ /**
+ * Wait for any slaves or backup servers to catch up.
+ *
+ * This does nothing for certain queue classes.
+ *
+ * @return void
+ * @throws JobQueueError
+ */
+ final public function waitForBackups() {
+ wfProfileIn( __METHOD__ );
+ $this->doWaitForBackups();
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * @see JobQueue::waitForBackups()
+ * @return void
+ */
+ protected function doWaitForBackups() {
+ }
+
+ /**
+ * Return a map of task names to task definition maps.
+ * A "task" is a fast periodic queue maintenance action.
+ * Mutually exclusive tasks must implement their own locking in the callback.
+ *
+ * Each task value is an associative array with:
+ * - name : the name of the task
+ * - callback : a PHP callable that performs the task
+ * - period : the period in seconds corresponding to the task frequency
+ *
+ * @return array
+ */
+ final public function getPeriodicTasks() {
+ $tasks = $this->doGetPeriodicTasks();
+ foreach ( $tasks as $name => &$def ) {
+ $def['name'] = $name;
+ }
+
+ return $tasks;
+ }
+
+ /**
+ * @see JobQueue::getPeriodicTasks()
+ * @return array
+ */
+ protected function doGetPeriodicTasks() {
+ return array();
+ }
+
+ /**
+ * Clear any process and persistent caches
+ *
+ * @return void
+ */
+ final public function flushCaches() {
+ wfProfileIn( __METHOD__ );
+ $this->doFlushCaches();
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * @see JobQueue::flushCaches()
+ * @return void
+ */
+ protected function doFlushCaches() {
+ }
+
+ /**
+ * Get an iterator to traverse over all available jobs in this queue.
+ * This does not include jobs that are currently acquired or delayed.
+ * Note: results may be stale if the queue is concurrently modified.
+ *
+ * @return Iterator
+ * @throws JobQueueError
+ */
+ abstract public function getAllQueuedJobs();
+
+ /**
+ * Get an iterator to traverse over all delayed jobs in this queue.
+ * Note: results may be stale if the queue is concurrently modified.
+ *
+ * @return Iterator
+ * @throws JobQueueError
+ * @since 1.22
+ */
+ public function getAllDelayedJobs() {
+ return new ArrayIterator( array() ); // not implemented
+ }
+
+ /**
+ * Do not use this function outside of JobQueue/JobQueueGroup
+ *
+ * @return string
+ * @since 1.22
+ */
+ public function getCoalesceLocationInternal() {
+ return null;
+ }
+
+ /**
+ * Check whether each of the given queues are empty.
+ * This is used for batching checks for queues stored at the same place.
+ *
+ * @param array $types List of queues types
+ * @return array|null (list of non-empty queue types) or null if unsupported
+ * @throws MWException
+ * @since 1.22
+ */
+ final public function getSiblingQueuesWithJobs( array $types ) {
+ $section = new ProfileSection( __METHOD__ );
+
+ return $this->doGetSiblingQueuesWithJobs( $types );
+ }
+
+ /**
+ * @see JobQueue::getSiblingQueuesWithJobs()
+ * @param array $types List of queues types
+ * @return array|null (list of queue types) or null if unsupported
+ */
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ return null; // not supported
+ }
+
+ /**
+ * Check the size of each of the given queues.
+ * For queues not served by the same store as this one, 0 is returned.
+ * This is used for batching checks for queues stored at the same place.
+ *
+ * @param array $types List of queues types
+ * @return array|null (job type => whether queue is empty) or null if unsupported
+ * @throws MWException
+ * @since 1.22
+ */
+ final public function getSiblingQueueSizes( array $types ) {
+ $section = new ProfileSection( __METHOD__ );
+
+ return $this->doGetSiblingQueueSizes( $types );
+ }
+
+ /**
+ * @see JobQueue::getSiblingQueuesSize()
+ * @param array $types List of queues types
+ * @return array|null (list of queue types) or null if unsupported
+ */
+ protected function doGetSiblingQueueSizes( array $types ) {
+ return null; // not supported
+ }
+
+ /**
+ * Call wfIncrStats() for the queue overall and for the queue type
+ *
+ * @param string $key Event type
+ * @param string $type Job type
+ * @param int $delta
+ * @since 1.22
+ */
+ public static function incrStats( $key, $type, $delta = 1 ) {
+ wfIncrStats( $key, $delta );
+ wfIncrStats( "{$key}-{$type}", $delta );
+ }
+
+ /**
+ * Namespace the queue with a key to isolate it for testing
+ *
+ * @param string $key
+ * @return void
+ * @throws MWException
+ */
+ public function setTestingPrefix( $key ) {
+ throw new MWException( "Queue namespacing not supported for this queue type." );
+ }
+}
+
+/**
+ * @ingroup JobQueue
+ * @since 1.22
+ */
+class JobQueueError extends MWException {
+}
+
+class JobQueueConnectionError extends JobQueueError {
+}
--- /dev/null
+<?php
+/**
+ * Database-backed job queue code.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in the DB
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueDB extends JobQueue {
+ const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
+ const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+ const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
+ const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
+ const MAX_OFFSET = 255; // integer; maximum number of rows to skip
+
+ /** @var BagOStuff */
+ protected $cache;
+
+ /** @var bool|string Name of an external DB cluster. False if not set */
+ protected $cluster = false;
+
+ /**
+ * Additional parameters include:
+ * - cluster : The name of an external cluster registered via LBFactory.
+ * If not specified, the primary DB cluster for the wiki will be used.
+ * This can be overridden with a custom cluster so that DB handles will
+ * be retrieved via LBFactory::getExternalLB() and getConnection().
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ global $wgMemc;
+
+ parent::__construct( $params );
+
+ $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
+ // Make sure that we don't use the SQL cache, which would be harmful
+ $this->cache = ( $wgMemc instanceof SqlBagOStuff ) ? new EmptyBagOStuff() : $wgMemc;
+ }
+
+ protected function supportedOrders() {
+ return array( 'random', 'timestamp', 'fifo' );
+ }
+
+ protected function optimalOrder() {
+ return 'random';
+ }
+
+ /**
+ * @see JobQueue::doIsEmpty()
+ * @return bool
+ */
+ protected function doIsEmpty() {
+ $key = $this->getCacheKey( 'empty' );
+
+ $isEmpty = $this->cache->get( $key );
+ if ( $isEmpty === 'true' ) {
+ return true;
+ } elseif ( $isEmpty === 'false' ) {
+ return false;
+ }
+
+ $dbr = $this->getSlaveDB();
+ try {
+ $found = $dbr->selectField( // unclaimed job
+ 'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ $this->cache->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
+
+ return !$found;
+ }
+
+ /**
+ * @see JobQueue::doGetSize()
+ * @return int
+ */
+ protected function doGetSize() {
+ $key = $this->getCacheKey( 'size' );
+
+ $size = $this->cache->get( $key );
+ if ( is_int( $size ) ) {
+ return $size;
+ }
+
+ try {
+ $dbr = $this->getSlaveDB();
+ $size = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array( 'job_cmd' => $this->type, 'job_token' => '' ),
+ __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ $this->cache->set( $key, $size, self::CACHE_TTL_SHORT );
+
+ return $size;
+ }
+
+ /**
+ * @see JobQueue::doGetAcquiredCount()
+ * @return int
+ */
+ protected function doGetAcquiredCount() {
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+
+ $key = $this->getCacheKey( 'acquiredcount' );
+
+ $count = $this->cache->get( $key );
+ if ( is_int( $count ) ) {
+ return $count;
+ }
+
+ $dbr = $this->getSlaveDB();
+ try {
+ $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+ __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+
+ return $count;
+ }
+
+ /**
+ * @see JobQueue::doGetAbandonedCount()
+ * @return int
+ * @throws MWException
+ */
+ protected function doGetAbandonedCount() {
+ global $wgMemc;
+
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+
+ $key = $this->getCacheKey( 'abandonedcount' );
+
+ $count = $wgMemc->get( $key );
+ if ( is_int( $count ) ) {
+ return $count;
+ }
+
+ $dbr = $this->getSlaveDB();
+ try {
+ $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbr->addQuotes( '' )}",
+ "job_attempts >= " . $dbr->addQuotes( $this->maxTries )
+ ),
+ __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
+
+ return $count;
+ }
+
+ /**
+ * @see JobQueue::doBatchPush()
+ * @param array $jobs
+ * @param $flags
+ * @throws DBError|Exception
+ * @return bool
+ */
+ protected function doBatchPush( array $jobs, $flags ) {
+ $dbw = $this->getMasterDB();
+
+ $that = $this;
+ $method = __METHOD__;
+ $dbw->onTransactionIdle(
+ function () use ( $dbw, $that, $jobs, $flags, $method ) {
+ $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
+ }
+ );
+
+ return true;
+ }
+
+ /**
+ * This function should *not* be called outside of JobQueueDB
+ *
+ * @param IDatabase $dbw
+ * @param array $jobs
+ * @param int $flags
+ * @param string $method
+ * @throws DBError
+ * @return bool
+ */
+ public function doBatchPushInternal( IDatabase $dbw, array $jobs, $flags, $method ) {
+ if ( !count( $jobs ) ) {
+ return true;
+ }
+
+ $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
+ $rowList = array(); // list of jobs for jobs that are are not de-duplicated
+ foreach ( $jobs as $job ) {
+ $row = $this->insertFields( $job );
+ if ( $job->ignoreDuplicates() ) {
+ $rowSet[$row['job_sha1']] = $row;
+ } else {
+ $rowList[] = $row;
+ }
+ }
+
+ if ( $flags & self::QOS_ATOMIC ) {
+ $dbw->begin( $method ); // wrap all the job additions in one transaction
+ }
+ try {
+ // Strip out any duplicate jobs that are already in the queue...
+ if ( count( $rowSet ) ) {
+ $res = $dbw->select( 'job', 'job_sha1',
+ array(
+ // No job_type condition since it's part of the job_sha1 hash
+ 'job_sha1' => array_keys( $rowSet ),
+ 'job_token' => '' // unclaimed
+ ),
+ $method
+ );
+ foreach ( $res as $row ) {
+ wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate.\n" );
+ unset( $rowSet[$row->job_sha1] ); // already enqueued
+ }
+ }
+ // Build the full list of job rows to insert
+ $rows = array_merge( $rowList, array_values( $rowSet ) );
+ // Insert the job rows in chunks to avoid slave lag...
+ foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
+ $dbw->insert( 'job', $rowBatch, $method );
+ }
+ JobQueue::incrStats( 'job-insert', $this->type, count( $rows ) );
+ JobQueue::incrStats(
+ 'job-insert-duplicate',
+ $this->type,
+ count( $rowSet ) + count( $rowList ) - count( $rows )
+ );
+ } catch ( DBError $e ) {
+ if ( $flags & self::QOS_ATOMIC ) {
+ $dbw->rollback( $method );
+ }
+ throw $e;
+ }
+ if ( $flags & self::QOS_ATOMIC ) {
+ $dbw->commit( $method );
+ }
+
+ $this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doPop()
+ * @return Job|bool
+ */
+ protected function doPop() {
+ if ( $this->cache->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
+ return false; // queue is empty
+ }
+
+ $dbw = $this->getMasterDB();
+ try {
+ $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ $scopedReset = new ScopedCallback( function () use ( $dbw, $autoTrx ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+ } );
+
+ $uuid = wfRandomString( 32 ); // pop attempt
+ $job = false; // job popped off
+ do { // retry when our row is invalid or deleted as a duplicate
+ // Try to reserve a row in the DB...
+ if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
+ $row = $this->claimOldest( $uuid );
+ } else { // random first
+ $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+ $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+ $row = $this->claimRandom( $uuid, $rand, $gte );
+ }
+ // Check if we found a row to reserve...
+ if ( !$row ) {
+ $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
+ break; // nothing to do
+ }
+ JobQueue::incrStats( 'job-pop', $this->type );
+ // Get the job object from the row...
+ $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
+ if ( !$title ) {
+ $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+ wfDebug( "Row has invalid title '{$row->job_title}'." );
+ continue; // try again
+ }
+ $job = Job::factory( $row->job_cmd, $title,
+ self::extractBlob( $row->job_params ), $row->job_id );
+ $job->metadata['id'] = $row->job_id;
+ break; // done
+ } while ( true );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+
+ return $job;
+ }
+
+ /**
+ * Reserve a row with a single UPDATE without holding row locks over RTTs...
+ *
+ * @param string $uuid 32 char hex string
+ * @param $rand integer Random unsigned integer (31 bits)
+ * @param bool $gte Search for job_random >= $random (otherwise job_random <= $random)
+ * @return stdClass|bool Row|false
+ */
+ protected function claimRandom( $uuid, $rand, $gte ) {
+ $dbw = $this->getMasterDB();
+ // Check cache to see if the queue has <= OFFSET items
+ $tinyQueue = $this->cache->get( $this->getCacheKey( 'small' ) );
+
+ $row = false; // the row acquired
+ $invertedDirection = false; // whether one job_random direction was already scanned
+ // This uses a replication safe method for acquiring jobs. One could use UPDATE+LIMIT
+ // instead, but that either uses ORDER BY (in which case it deadlocks in MySQL) or is
+ // not replication safe. Due to http://bugs.mysql.com/bug.php?id=6980, subqueries cannot
+ // be used here with MySQL.
+ do {
+ if ( $tinyQueue ) { // queue has <= MAX_OFFSET rows
+ // For small queues, using OFFSET will overshoot and return no rows more often.
+ // Instead, this uses job_random to pick a row (possibly checking both directions).
+ $ineq = $gte ? '>=' : '<=';
+ $dir = $gte ? 'ASC' : 'DESC';
+ $row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
+ array(
+ 'job_cmd' => $this->type,
+ 'job_token' => '', // unclaimed
+ "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
+ __METHOD__,
+ array( 'ORDER BY' => "job_random {$dir}" )
+ );
+ if ( !$row && !$invertedDirection ) {
+ $gte = !$gte;
+ $invertedDirection = true;
+ continue; // try the other direction
+ }
+ } else { // table *may* have >= MAX_OFFSET rows
+ // Bug 42614: "ORDER BY job_random" with a job_random inequality causes high CPU
+ // in MySQL if there are many rows for some reason. This uses a small OFFSET
+ // instead of job_random for reducing excess claim retries.
+ $row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
+ array(
+ 'job_cmd' => $this->type,
+ 'job_token' => '', // unclaimed
+ ),
+ __METHOD__,
+ array( 'OFFSET' => mt_rand( 0, self::MAX_OFFSET ) )
+ );
+ if ( !$row ) {
+ $tinyQueue = true; // we know the queue must have <= MAX_OFFSET rows
+ $this->cache->set( $this->getCacheKey( 'small' ), 1, 30 );
+ continue; // use job_random
+ }
+ }
+
+ if ( $row ) { // claim the job
+ $dbw->update( 'job', // update by PK
+ array(
+ 'job_token' => $uuid,
+ 'job_token_timestamp' => $dbw->timestamp(),
+ 'job_attempts = job_attempts+1' ),
+ array( 'job_cmd' => $this->type, 'job_id' => $row->job_id, 'job_token' => '' ),
+ __METHOD__
+ );
+ // This might get raced out by another runner when claiming the previously
+ // selected row. The use of job_random should minimize this problem, however.
+ if ( !$dbw->affectedRows() ) {
+ $row = false; // raced out
+ }
+ } else {
+ break; // nothing to do
+ }
+ } while ( !$row );
+
+ return $row;
+ }
+
+ /**
+ * Reserve a row with a single UPDATE without holding row locks over RTTs...
+ *
+ * @param string $uuid 32 char hex string
+ * @return stdClass|bool Row|false
+ */
+ protected function claimOldest( $uuid ) {
+ $dbw = $this->getMasterDB();
+
+ $row = false; // the row acquired
+ do {
+ if ( $dbw->getType() === 'mysql' ) {
+ // Per http://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
+ // same table being changed in an UPDATE query in MySQL (gives Error: 1093).
+ // Oracle and Postgre have no such limitation. However, MySQL offers an
+ // alternative here by supporting ORDER BY + LIMIT for UPDATE queries.
+ $dbw->query( "UPDATE {$dbw->tableName( 'job' )} " .
+ "SET " .
+ "job_token = {$dbw->addQuotes( $uuid ) }, " .
+ "job_token_timestamp = {$dbw->addQuotes( $dbw->timestamp() )}, " .
+ "job_attempts = job_attempts+1 " .
+ "WHERE ( " .
+ "job_cmd = {$dbw->addQuotes( $this->type )} " .
+ "AND job_token = {$dbw->addQuotes( '' )} " .
+ ") ORDER BY job_id ASC LIMIT 1",
+ __METHOD__
+ );
+ } else {
+ // Use a subquery to find the job, within an UPDATE to claim it.
+ // This uses as much of the DB wrapper functions as possible.
+ $dbw->update( 'job',
+ array(
+ 'job_token' => $uuid,
+ 'job_token_timestamp' => $dbw->timestamp(),
+ 'job_attempts = job_attempts+1' ),
+ array( 'job_id = (' .
+ $dbw->selectSQLText( 'job', 'job_id',
+ array( 'job_cmd' => $this->type, 'job_token' => '' ),
+ __METHOD__,
+ array( 'ORDER BY' => 'job_id ASC', 'LIMIT' => 1 ) ) .
+ ')'
+ ),
+ __METHOD__
+ );
+ }
+ // Fetch any row that we just reserved...
+ if ( $dbw->affectedRows() ) {
+ $row = $dbw->selectRow( 'job', self::selectFields(),
+ array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
+ );
+ if ( !$row ) { // raced out by duplicate job removal
+ wfDebug( "Row deleted as duplicate by another process." );
+ }
+ } else {
+ break; // nothing to do
+ }
+ } while ( !$row );
+
+ return $row;
+ }
+
+ /**
+ * @see JobQueue::doAck()
+ * @param Job $job
+ * @throws MWException
+ * @return Job|bool
+ */
+ protected function doAck( Job $job ) {
+ if ( !isset( $job->metadata['id'] ) ) {
+ throw new MWException( "Job of type '{$job->getType()}' has no ID." );
+ }
+
+ $dbw = $this->getMasterDB();
+ try {
+ $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ $scopedReset = new ScopedCallback( function () use ( $dbw, $autoTrx ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+ } );
+
+ // Delete a row with a single DELETE without holding row locks over RTTs...
+ $dbw->delete( 'job',
+ array( 'job_cmd' => $this->type, 'job_id' => $job->metadata['id'] ), __METHOD__ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doDeduplicateRootJob()
+ * @param Job $job
+ * @throws MWException
+ * @return bool
+ */
+ protected function doDeduplicateRootJob( Job $job ) {
+ $params = $job->getParams();
+ if ( !isset( $params['rootJobSignature'] ) ) {
+ throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
+ } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
+ throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
+ }
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+ // Callers should call batchInsert() and then this function so that if the insert
+ // fails, the de-duplication registration will be aborted. Since the insert is
+ // deferred till "transaction idle", do the same here, so that the ordering is
+ // maintained. Having only the de-duplication registration succeed would cause
+ // jobs to become no-ops without any actual jobs that made them redundant.
+ $dbw = $this->getMasterDB();
+ $cache = $this->dupCache;
+ $dbw->onTransactionIdle( function () use ( $cache, $params, $key, $dbw ) {
+ $timestamp = $cache->get( $key ); // current last timestamp of this job
+ if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+ return true; // a newer version of this root job was enqueued
+ }
+
+ // Update the timestamp of the last root job started at the location...
+ return $cache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+ } );
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doDelete()
+ * @return bool
+ */
+ protected function doDelete() {
+ $dbw = $this->getMasterDB();
+ try {
+ $dbw->delete( 'job', array( 'job_cmd' => $this->type ) );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doWaitForBackups()
+ * @return void
+ */
+ protected function doWaitForBackups() {
+ wfWaitForSlaves();
+ }
+
+ /**
+ * @return array
+ */
+ protected function doGetPeriodicTasks() {
+ return array(
+ 'recycleAndDeleteStaleJobs' => array(
+ 'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+ 'period' => ceil( $this->claimTTL / 2 )
+ )
+ );
+ }
+
+ /**
+ * @return void
+ */
+ protected function doFlushCaches() {
+ foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
+ $this->cache->delete( $this->getCacheKey( $type ) );
+ }
+ }
+
+ /**
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllQueuedJobs() {
+ $dbr = $this->getSlaveDB();
+ try {
+ return new MappedIterator(
+ $dbr->select( 'job', self::selectFields(),
+ array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
+ function ( $row ) use ( $dbr ) {
+ $job = Job::factory(
+ $row->job_cmd,
+ Title::makeTitle( $row->job_namespace, $row->job_title ),
+ strlen( $row->job_params ) ? unserialize( $row->job_params ) : false
+ );
+ $job->metadata['id'] = $row->job_id;
+ return $job;
+ }
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ }
+
+ public function getCoalesceLocationInternal() {
+ return $this->cluster
+ ? "DBCluster:{$this->cluster}:{$this->wiki}"
+ : "LBFactory:{$this->wiki}";
+ }
+
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ $dbr = $this->getSlaveDB();
+ $res = $dbr->select( 'job', 'DISTINCT job_cmd',
+ array( 'job_cmd' => $types ), __METHOD__ );
+
+ $types = array();
+ foreach ( $res as $row ) {
+ $types[] = $row->job_cmd;
+ }
+
+ return $types;
+ }
+
+ protected function doGetSiblingQueueSizes( array $types ) {
+ $dbr = $this->getSlaveDB();
+ $res = $dbr->select( 'job', array( 'job_cmd', 'COUNT(*) AS count' ),
+ array( 'job_cmd' => $types ), __METHOD__, array( 'GROUP BY' => 'job_cmd' ) );
+
+ $sizes = array();
+ foreach ( $res as $row ) {
+ $sizes[$row->job_cmd] = (int)$row->count;
+ }
+
+ return $sizes;
+ }
+
+ /**
+ * Recycle or destroy any jobs that have been claimed for too long
+ *
+ * @return int Number of jobs recycled/deleted
+ */
+ public function recycleAndDeleteStaleJobs() {
+ $now = time();
+ $count = 0; // affected rows
+ $dbw = $this->getMasterDB();
+
+ try {
+ if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
+ return $count; // already in progress
+ }
+
+ // Remove claims on jobs acquired for too long if enabled...
+ if ( $this->claimTTL > 0 ) {
+ $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
+ // Get the IDs of jobs that have be claimed but not finished after too long.
+ // These jobs can be recycled into the queue by expiring the claim. Selecting
+ // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+ $res = $dbw->select( 'job', 'job_id',
+ array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbw->addQuotes( '' )}", // was acquired
+ "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
+ "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
+ __METHOD__
+ );
+ $ids = array_map(
+ function ( $o ) {
+ return $o->job_id;
+ }, iterator_to_array( $res )
+ );
+ if ( count( $ids ) ) {
+ // Reset job_token for these jobs so that other runners will pick them up.
+ // Set the timestamp to the current time, as it is useful to now that the job
+ // was already tried before (the timestamp becomes the "released" time).
+ $dbw->update( 'job',
+ array(
+ 'job_token' => '',
+ 'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
+ array(
+ 'job_id' => $ids ),
+ __METHOD__
+ );
+ $count += $dbw->affectedRows();
+ JobQueue::incrStats( 'job-recycle', $this->type, $dbw->affectedRows() );
+ $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
+ }
+ }
+
+ // Just destroy any stale jobs...
+ $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
+ $conds = array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbw->addQuotes( '' )}", // was acquired
+ "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
+ );
+ if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
+ $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
+ }
+ // Get the IDs of jobs that are considered stale and should be removed. Selecting
+ // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+ $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
+ $ids = array_map(
+ function ( $o ) {
+ return $o->job_id;
+ }, iterator_to_array( $res )
+ );
+ if ( count( $ids ) ) {
+ $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
+ $count += $dbw->affectedRows();
+ JobQueue::incrStats( 'job-abandon', $this->type, $dbw->affectedRows() );
+ }
+
+ $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+
+ return $count;
+ }
+
+ /**
+ * @param IJobSpecification $job
+ * @return array
+ */
+ protected function insertFields( IJobSpecification $job ) {
+ $dbw = $this->getMasterDB();
+
+ return array(
+ // Fields that describe the nature of the job
+ 'job_cmd' => $job->getType(),
+ 'job_namespace' => $job->getTitle()->getNamespace(),
+ 'job_title' => $job->getTitle()->getDBkey(),
+ 'job_params' => self::makeBlob( $job->getParams() ),
+ // Additional job metadata
+ 'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+ 'job_timestamp' => $dbw->timestamp(),
+ 'job_sha1' => wfBaseConvert(
+ sha1( serialize( $job->getDeduplicationInfo() ) ),
+ 16, 36, 31
+ ),
+ 'job_random' => mt_rand( 0, self::MAX_JOB_RANDOM )
+ );
+ }
+
+ /**
+ * @throws JobQueueConnectionError
+ * @return DBConnRef
+ */
+ protected function getSlaveDB() {
+ try {
+ return $this->getDB( DB_SLAVE );
+ } catch ( DBConnectionError $e ) {
+ throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
+ }
+ }
+
+ /**
+ * @throws JobQueueConnectionError
+ * @return DBConnRef
+ */
+ protected function getMasterDB() {
+ try {
+ return $this->getDB( DB_MASTER );
+ } catch ( DBConnectionError $e ) {
+ throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
+ }
+ }
+
+ /**
+ * @param $index integer (DB_SLAVE/DB_MASTER)
+ * @return DBConnRef
+ */
+ protected function getDB( $index ) {
+ $lb = ( $this->cluster !== false )
+ ? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
+ : wfGetLB( $this->wiki );
+
+ return $lb->getConnectionRef( $index, array(), $this->wiki );
+ }
+
+ /**
+ * @param $property
+ * @return string
+ */
+ private function getCacheKey( $property ) {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ $cluster = is_string( $this->cluster ) ? $this->cluster : 'main';
+
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $cluster, $this->type, $property );
+ }
+
+ /**
+ * @param $params
+ * @return string
+ */
+ protected static function makeBlob( $params ) {
+ if ( $params !== false ) {
+ return serialize( $params );
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * @param $blob
+ * @return bool|mixed
+ */
+ protected static function extractBlob( $blob ) {
+ if ( (string)$blob !== '' ) {
+ return unserialize( $blob );
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @param DBError $e
+ * @throws JobQueueError
+ */
+ protected function throwDBException( DBError $e ) {
+ throw new JobQueueError( get_class( $e ) . ": " . $e->getMessage() );
+ }
+
+ /**
+ * Return the list of job fields that should be selected.
+ * @since 1.23
+ * @return array
+ */
+ public static function selectFields() {
+ return array(
+ 'job_id',
+ 'job_cmd',
+ 'job_namespace',
+ 'job_title',
+ 'job_timestamp',
+ 'job_params',
+ 'job_random',
+ 'job_attempts',
+ 'job_token',
+ 'job_token_timestamp',
+ 'job_sha1',
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue code for federated queues.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs for federated queues
+ *
+ * This class allows for queues to be partitioned into smaller queues.
+ * A partition is defined by the configuration for a JobQueue instance.
+ * For example, one can set $wgJobTypeConf['refreshLinks'] to point to a
+ * JobQueueFederated instance, which itself would consist of three JobQueueRedis
+ * instances, each using their own redis server. This would allow for the jobs
+ * to be split (evenly or based on weights) accross multiple servers if a single
+ * server becomes impractical or expensive. Different JobQueue classes can be mixed.
+ *
+ * The basic queue configuration (e.g. "order", "claimTTL") of a federated queue
+ * is inherited by the partition queues. Additional configuration defines what
+ * section each wiki is in, what partition queues each section uses (and their weight),
+ * and the JobQueue configuration for each partition. Some sections might only need a
+ * single queue partition, like the sections for groups of small wikis.
+ *
+ * If used for performance, then $wgMainCacheType should be set to memcached/redis.
+ * Note that "fifo" cannot be used for the ordering, since the data is distributed.
+ * One can still use "timestamp" instead, as in "roughly timestamp ordered". Also,
+ * queue classes used by this should ignore down servers (with TTL) to avoid slowness.
+ *
+ * @ingroup JobQueue
+ * @since 1.22
+ */
+class JobQueueFederated extends JobQueue {
+ /** @var array (partition name => weight) reverse sorted by weight */
+ protected $partitionMap = array();
+
+ /** @var array (partition name => JobQueue) reverse sorted by weight */
+ protected $partitionQueues = array();
+
+ /** @var HashRing */
+ protected $partitionPushRing;
+
+ /** @var BagOStuff */
+ protected $cache;
+
+ /** @var int Maximum number of partitions to try */
+ protected $maxPartitionsTry;
+
+ const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
+ const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+
+ /**
+ * @params include:
+ * - sectionsByWiki : A map of wiki IDs to section names.
+ * Wikis will default to using the section "default".
+ * - partitionsBySection : Map of section names to maps of (partition name => weight).
+ * A section called 'default' must be defined if not all wikis
+ * have explicitly defined sections.
+ * - configByPartition : Map of queue partition names to configuration arrays.
+ * These configuration arrays are passed to JobQueue::factory().
+ * The options set here are overriden by those passed to this
+ * the federated queue itself (e.g. 'order' and 'claimTTL').
+ * - partitionsNoPush : List of partition names that can handle pop() but not push().
+ * This can be used to migrate away from a certain partition.
+ * - maxPartitionsTry : Maximum number of times to attempt job insertion using
+ * different partition queues. This improves availability
+ * during failure, at the cost of added latency and somewhat
+ * less reliable job de-duplication mechanisms.
+ * @param array $params
+ * @throws MWException
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $section = isset( $params['sectionsByWiki'][$this->wiki] )
+ ? $params['sectionsByWiki'][$this->wiki]
+ : 'default';
+ if ( !isset( $params['partitionsBySection'][$section] ) ) {
+ throw new MWException( "No configuration for section '$section'." );
+ }
+ $this->maxPartitionsTry = isset( $params['maxPartitionsTry'] )
+ ? $params['maxPartitionsTry']
+ : 2;
+ // Get the full partition map
+ $this->partitionMap = $params['partitionsBySection'][$section];
+ arsort( $this->partitionMap, SORT_NUMERIC );
+ // Get the partitions jobs can actually be pushed to
+ $partitionPushMap = $this->partitionMap;
+ if ( isset( $params['partitionsNoPush'] ) ) {
+ foreach ( $params['partitionsNoPush'] as $partition ) {
+ unset( $partitionPushMap[$partition] );
+ }
+ }
+ // Get the config to pass to merge into each partition queue config
+ $baseConfig = $params;
+ foreach ( array( 'class', 'sectionsByWiki', 'maxPartitionsTry',
+ 'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o
+ ) {
+ unset( $baseConfig[$o] ); // partition queue doesn't care about this
+ }
+ // Get the partition queue objects
+ foreach ( $this->partitionMap as $partition => $w ) {
+ if ( !isset( $params['configByPartition'][$partition] ) ) {
+ throw new MWException( "No configuration for partition '$partition'." );
+ }
+ $this->partitionQueues[$partition] = JobQueue::factory(
+ $baseConfig + $params['configByPartition'][$partition] );
+ }
+ // Get the ring of partitions to push jobs into
+ $this->partitionPushRing = new HashRing( $partitionPushMap );
+ // Aggregate cache some per-queue values if there are multiple partition queues
+ $this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
+ }
+
+ protected function supportedOrders() {
+ // No FIFO due to partitioning, though "rough timestamp order" is supported
+ return array( 'undefined', 'random', 'timestamp' );
+ }
+
+ protected function optimalOrder() {
+ return 'undefined'; // defer to the partitions
+ }
+
+ protected function supportsDelayedJobs() {
+ return true; // defer checks to the partitions
+ }
+
+ protected function doIsEmpty() {
+ $key = $this->getCacheKey( 'empty' );
+
+ $isEmpty = $this->cache->get( $key );
+ if ( $isEmpty === 'true' ) {
+ return true;
+ } elseif ( $isEmpty === 'false' ) {
+ return false;
+ }
+
+ $empty = true;
+ $failed = 0;
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $empty = $empty && $queue->doIsEmpty();
+ } catch ( JobQueueError $e ) {
+ ++$failed;
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ $this->throwErrorIfAllPartitionsDown( $failed );
+
+ $this->cache->add( $key, $empty ? 'true' : 'false', self::CACHE_TTL_LONG );
+ return $empty;
+ }
+
+ protected function doGetSize() {
+ return $this->getCrossPartitionSum( 'size', 'doGetSize' );
+ }
+
+ protected function doGetAcquiredCount() {
+ return $this->getCrossPartitionSum( 'acquiredcount', 'doGetAcquiredCount' );
+ }
+
+ protected function doGetDelayedCount() {
+ return $this->getCrossPartitionSum( 'delayedcount', 'doGetDelayedCount' );
+ }
+
+ protected function doGetAbandonedCount() {
+ return $this->getCrossPartitionSum( 'abandonedcount', 'doGetAbandonedCount' );
+ }
+
+ /**
+ * @param string $type
+ * @param string $method
+ * @return int
+ */
+ protected function getCrossPartitionSum( $type, $method ) {
+ $key = $this->getCacheKey( $type );
+
+ $count = $this->cache->get( $key );
+ if ( is_int( $count ) ) {
+ return $count;
+ }
+
+ $failed = 0;
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $count += $queue->$method();
+ } catch ( JobQueueError $e ) {
+ ++$failed;
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ $this->throwErrorIfAllPartitionsDown( $failed );
+
+ $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+
+ return $count;
+ }
+
+ protected function doBatchPush( array $jobs, $flags ) {
+ // Local ring variable that may be changed to point to a new ring on failure
+ $partitionRing = $this->partitionPushRing;
+ // Try to insert the jobs and update $partitionsTry on any failures.
+ // Retry to insert any remaning jobs again, ignoring the bad partitions.
+ $jobsLeft = $jobs;
+ for ( $i = $this->maxPartitionsTry; $i > 0 && count( $jobsLeft ); --$i ) {
+ $jobsLeft = $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags );
+ }
+ if ( count( $jobsLeft ) ) {
+ throw new JobQueueError(
+ "Could not insert job(s), {$this->maxPartitionsTry} partitions tried." );
+ }
+
+ return true;
+ }
+
+ /**
+ * @param array $jobs
+ * @param HashRing $partitionRing
+ * @param int $flags
+ * @throws JobQueueError
+ * @return array List of Job object that could not be inserted
+ */
+ protected function tryJobInsertions( array $jobs, HashRing &$partitionRing, $flags ) {
+ $jobsLeft = array();
+
+ // Because jobs are spread across partitions, per-job de-duplication needs
+ // to use a consistent hash to avoid allowing duplicate jobs per partition.
+ // When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded.
+ $uJobsByPartition = array(); // (partition name => job list)
+ /** @var Job $job */
+ foreach ( $jobs as $key => $job ) {
+ if ( $job->ignoreDuplicates() ) {
+ $sha1 = sha1( serialize( $job->getDeduplicationInfo() ) );
+ $uJobsByPartition[$partitionRing->getLocation( $sha1 )][] = $job;
+ unset( $jobs[$key] );
+ }
+ }
+ // Get the batches of jobs that are not de-duplicated
+ if ( $flags & self::QOS_ATOMIC ) {
+ $nuJobBatches = array( $jobs ); // all or nothing
+ } else {
+ // Split the jobs into batches and spread them out over servers if there
+ // are many jobs. This helps keep the partitions even. Otherwise, send all
+ // the jobs to a single partition queue to avoids the extra connections.
+ $nuJobBatches = array_chunk( $jobs, 300 );
+ }
+
+ // Insert the de-duplicated jobs into the queues...
+ foreach ( $uJobsByPartition as $partition => $jobBatch ) {
+ /** @var JobQueue $queue */
+ $queue = $this->partitionQueues[$partition];
+ try {
+ $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
+ } catch ( JobQueueError $e ) {
+ $ok = false;
+ MWExceptionHandler::logException( $e );
+ }
+ if ( $ok ) {
+ $key = $this->getCacheKey( 'empty' );
+ $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+ } else {
+ $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+ if ( !$partitionRing ) {
+ throw new JobQueueError( "Could not insert job(s), no partitions available." );
+ }
+ $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+ }
+ }
+
+ // Insert the jobs that are not de-duplicated into the queues...
+ foreach ( $nuJobBatches as $jobBatch ) {
+ $partition = ArrayUtils::pickRandom( $partitionRing->getLocationWeights() );
+ $queue = $this->partitionQueues[$partition];
+ try {
+ $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
+ } catch ( JobQueueError $e ) {
+ $ok = false;
+ MWExceptionHandler::logException( $e );
+ }
+ if ( $ok ) {
+ $key = $this->getCacheKey( 'empty' );
+ $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+ } else {
+ $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+ if ( !$partitionRing ) {
+ throw new JobQueueError( "Could not insert job(s), no partitions available." );
+ }
+ $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+ }
+ }
+
+ return $jobsLeft;
+ }
+
+ protected function doPop() {
+ $key = $this->getCacheKey( 'empty' );
+
+ $isEmpty = $this->cache->get( $key );
+ if ( $isEmpty === 'true' ) {
+ return false;
+ }
+
+ $partitionsTry = $this->partitionMap; // (partition => weight)
+
+ $failed = 0;
+ while ( count( $partitionsTry ) ) {
+ $partition = ArrayUtils::pickRandom( $partitionsTry );
+ if ( $partition === false ) {
+ break; // all partitions at 0 weight
+ }
+
+ /** @var JobQueue $queue */
+ $queue = $this->partitionQueues[$partition];
+ try {
+ $job = $queue->pop();
+ } catch ( JobQueueError $e ) {
+ ++$failed;
+ MWExceptionHandler::logException( $e );
+ $job = false;
+ }
+ if ( $job ) {
+ $job->metadata['QueuePartition'] = $partition;
+
+ return $job;
+ } else {
+ unset( $partitionsTry[$partition] ); // blacklist partition
+ }
+ }
+ $this->throwErrorIfAllPartitionsDown( $failed );
+
+ $this->cache->set( $key, 'true', JobQueueDB::CACHE_TTL_LONG );
+
+ return false;
+ }
+
+ protected function doAck( Job $job ) {
+ if ( !isset( $job->metadata['QueuePartition'] ) ) {
+ throw new MWException( "The given job has no defined partition name." );
+ }
+
+ return $this->partitionQueues[$job->metadata['QueuePartition']]->ack( $job );
+ }
+
+ protected function doIsRootJobOldDuplicate( Job $job ) {
+ $params = $job->getRootJobParams();
+ $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+ try {
+ return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job );
+ } catch ( JobQueueError $e ) {
+ if ( isset( $partitions[1] ) ) { // check fallback partition
+ return $this->partitionQueues[$partitions[1]]->doIsRootJobOldDuplicate( $job );
+ }
+ }
+
+ return false;
+ }
+
+ protected function doDeduplicateRootJob( Job $job ) {
+ $params = $job->getRootJobParams();
+ $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+ try {
+ return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job );
+ } catch ( JobQueueError $e ) {
+ if ( isset( $partitions[1] ) ) { // check fallback partition
+ return $this->partitionQueues[$partitions[1]]->doDeduplicateRootJob( $job );
+ }
+ }
+
+ return false;
+ }
+
+ protected function doDelete() {
+ $failed = 0;
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $queue->doDelete();
+ } catch ( JobQueueError $e ) {
+ ++$failed;
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ $this->throwErrorIfAllPartitionsDown( $failed );
+ return true;
+ }
+
+ protected function doWaitForBackups() {
+ $failed = 0;
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $queue->waitForBackups();
+ } catch ( JobQueueError $e ) {
+ ++$failed;
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ $this->throwErrorIfAllPartitionsDown( $failed );
+ }
+
+ protected function doGetPeriodicTasks() {
+ $tasks = array();
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $partition => $queue ) {
+ foreach ( $queue->getPeriodicTasks() as $task => $def ) {
+ $tasks["{$partition}:{$task}"] = $def;
+ }
+ }
+
+ return $tasks;
+ }
+
+ protected function doFlushCaches() {
+ static $types = array(
+ 'empty',
+ 'size',
+ 'acquiredcount',
+ 'delayedcount',
+ 'abandonedcount'
+ );
+
+ foreach ( $types as $type ) {
+ $this->cache->delete( $this->getCacheKey( $type ) );
+ }
+
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ $queue->doFlushCaches();
+ }
+ }
+
+ public function getAllQueuedJobs() {
+ $iterator = new AppendIterator();
+
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ $iterator->append( $queue->getAllQueuedJobs() );
+ }
+
+ return $iterator;
+ }
+
+ public function getAllDelayedJobs() {
+ $iterator = new AppendIterator();
+
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ $iterator->append( $queue->getAllDelayedJobs() );
+ }
+
+ return $iterator;
+ }
+
+ public function getCoalesceLocationInternal() {
+ return "JobQueueFederated:wiki:{$this->wiki}" .
+ sha1( serialize( array_keys( $this->partitionMap ) ) );
+ }
+
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ $result = array();
+
+ $failed = 0;
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types );
+ if ( is_array( $nonEmpty ) ) {
+ $result = array_unique( array_merge( $result, $nonEmpty ) );
+ } else {
+ return null; // not supported on all partitions; bail
+ }
+ if ( count( $result ) == count( $types ) ) {
+ break; // short-circuit
+ }
+ } catch ( JobQueueError $e ) {
+ ++$failed;
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ $this->throwErrorIfAllPartitionsDown( $failed );
+
+ return array_values( $result );
+ }
+
+ protected function doGetSiblingQueueSizes( array $types ) {
+ $result = array();
+ $failed = 0;
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $sizes = $queue->doGetSiblingQueueSizes( $types );
+ if ( is_array( $sizes ) ) {
+ foreach ( $sizes as $type => $size ) {
+ $result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size;
+ }
+ } else {
+ return null; // not supported on all partitions; bail
+ }
+ } catch ( JobQueueError $e ) {
+ ++$failed;
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ $this->throwErrorIfAllPartitionsDown( $failed );
+
+ return $result;
+ }
+
+ /**
+ * Throw an error if no partitions available
+ *
+ * @param int $down The number of up partitions down
+ * @return void
+ * @throws JobQueueError
+ */
+ protected function throwErrorIfAllPartitionsDown( $down ) {
+ if ( $down >= count( $this->partitionQueues ) ) {
+ throw new JobQueueError( 'No queue partitions available.' );
+ }
+ }
+
+ public function setTestingPrefix( $key ) {
+ /** @var JobQueue $queue */
+ foreach ( $this->partitionQueues as $queue ) {
+ $queue->setTestingPrefix( $key );
+ }
+ }
+
+ /**
+ * @param $property
+ * @return string
+ */
+ private function getCacheKey( $property ) {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue base code.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueGroup {
+ /** @var array */
+ protected static $instances = array();
+
+ /** @var ProcessCacheLRU */
+ protected $cache;
+
+ /** @var string Wiki ID */
+ protected $wiki;
+
+ /** @var array Map of (bucket => (queue => JobQueue, types => list of types) */
+ protected $coalescedQueues;
+
+ const TYPE_DEFAULT = 1; // integer; jobs popped by default
+ const TYPE_ANY = 2; // integer; any job
+
+ const USE_CACHE = 1; // integer; use process or persistent cache
+
+ const PROC_CACHE_TTL = 15; // integer; seconds
+
+ const CACHE_VERSION = 1; // integer; cache version
+
+ /**
+ * @param string $wiki Wiki ID
+ */
+ protected function __construct( $wiki ) {
+ $this->wiki = $wiki;
+ $this->cache = new ProcessCacheLRU( 10 );
+ }
+
+ /**
+ * @param bool|string $wiki Wiki ID
+ * @return JobQueueGroup
+ */
+ public static function singleton( $wiki = false ) {
+ $wiki = ( $wiki === false ) ? wfWikiID() : $wiki;
+ if ( !isset( self::$instances[$wiki] ) ) {
+ self::$instances[$wiki] = new self( $wiki );
+ }
+
+ return self::$instances[$wiki];
+ }
+
+ /**
+ * Destroy the singleton instances
+ *
+ * @return void
+ */
+ public static function destroySingletons() {
+ self::$instances = array();
+ }
+
+ /**
+ * Get the job queue object for a given queue type
+ *
+ * @param string $type
+ * @return JobQueue
+ */
+ public function get( $type ) {
+ global $wgJobTypeConf;
+
+ $conf = array( 'wiki' => $this->wiki, 'type' => $type );
+ if ( isset( $wgJobTypeConf[$type] ) ) {
+ $conf = $conf + $wgJobTypeConf[$type];
+ } else {
+ $conf = $conf + $wgJobTypeConf['default'];
+ }
+
+ return JobQueue::factory( $conf );
+ }
+
+ /**
+ * Insert jobs into the respective queues of with the belong.
+ *
+ * This inserts the jobs into the queue specified by $wgJobTypeConf
+ * and updates the aggregate job queue information cache as needed.
+ *
+ * @param Job|array $jobs A single Job or a list of Jobs
+ * @throws MWException
+ * @return bool
+ */
+ public function push( $jobs ) {
+ $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
+ if ( !count( $jobs ) ) {
+ return true;
+ }
+
+ $jobsByType = array(); // (job type => list of jobs)
+ foreach ( $jobs as $job ) {
+ if ( $job instanceof IJobSpecification ) {
+ $jobsByType[$job->getType()][] = $job;
+ } else {
+ throw new MWException( "Attempted to push a non-Job object into a queue." );
+ }
+ }
+
+ $ok = true;
+ foreach ( $jobsByType as $type => $jobs ) {
+ if ( $this->get( $type )->push( $jobs ) ) {
+ JobQueueAggregator::singleton()->notifyQueueNonEmpty( $this->wiki, $type );
+ } else {
+ $ok = false;
+ }
+ }
+
+ if ( $this->cache->has( 'queues-ready', 'list' ) ) {
+ $list = $this->cache->get( 'queues-ready', 'list' );
+ if ( count( array_diff( array_keys( $jobsByType ), $list ) ) ) {
+ $this->cache->clear( 'queues-ready' );
+ }
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Pop a job off one of the job queues
+ *
+ * This pops a job off a queue as specified by $wgJobTypeConf and
+ * updates the aggregate job queue information cache as needed.
+ *
+ * @param int|string $qtype JobQueueGroup::TYPE_* constant or job type string
+ * @param int $flags Bitfield of JobQueueGroup::USE_* constants
+ * @param array $blacklist List of job types to ignore
+ * @return Job|bool Returns false on failure
+ */
+ public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0, array $blacklist = array() ) {
+ $job = false;
+
+ if ( is_string( $qtype ) ) { // specific job type
+ if ( !in_array( $qtype, $blacklist ) ) {
+ $job = $this->get( $qtype )->pop();
+ if ( !$job ) {
+ JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
+ }
+ }
+ } else { // any job in the "default" jobs types
+ if ( $flags & self::USE_CACHE ) {
+ if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
+ $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+ }
+ $types = $this->cache->get( 'queues-ready', 'list' );
+ } else {
+ $types = $this->getQueuesWithJobs();
+ }
+
+ if ( $qtype == self::TYPE_DEFAULT ) {
+ $types = array_intersect( $types, $this->getDefaultQueueTypes() );
+ }
+
+ $types = array_diff( $types, $blacklist ); // avoid selected types
+ shuffle( $types ); // avoid starvation
+
+ foreach ( $types as $type ) { // for each queue...
+ $job = $this->get( $type )->pop();
+ if ( $job ) { // found
+ break;
+ } else { // not found
+ JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $type );
+ $this->cache->clear( 'queues-ready' );
+ }
+ }
+ }
+
+ return $job;
+ }
+
+ /**
+ * Acknowledge that a job was completed
+ *
+ * @param Job $job
+ * @return bool
+ */
+ public function ack( Job $job ) {
+ return $this->get( $job->getType() )->ack( $job );
+ }
+
+ /**
+ * Register the "root job" of a given job into the queue for de-duplication.
+ * This should only be called right *after* all the new jobs have been inserted.
+ *
+ * @param Job $job
+ * @return bool
+ */
+ public function deduplicateRootJob( Job $job ) {
+ return $this->get( $job->getType() )->deduplicateRootJob( $job );
+ }
+
+ /**
+ * Wait for any slaves or backup queue servers to catch up.
+ *
+ * This does nothing for certain queue classes.
+ *
+ * @return void
+ * @throws MWException
+ */
+ public function waitForBackups() {
+ global $wgJobTypeConf;
+
+ wfProfileIn( __METHOD__ );
+ // Try to avoid doing this more than once per queue storage medium
+ foreach ( $wgJobTypeConf as $type => $conf ) {
+ $this->get( $type )->waitForBackups();
+ }
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Get the list of queue types
+ *
+ * @return array List of strings
+ */
+ public function getQueueTypes() {
+ return array_keys( $this->getCachedConfigVar( 'wgJobClasses' ) );
+ }
+
+ /**
+ * Get the list of default queue types
+ *
+ * @return array List of strings
+ */
+ public function getDefaultQueueTypes() {
+ global $wgJobTypesExcludedFromDefaultQueue;
+
+ return array_diff( $this->getQueueTypes(), $wgJobTypesExcludedFromDefaultQueue );
+ }
+
+ /**
+ * Get the list of job types that have non-empty queues
+ *
+ * @return array List of job types that have non-empty queues
+ */
+ public function getQueuesWithJobs() {
+ $types = array();
+ foreach ( $this->getCoalescedQueues() as $info ) {
+ $nonEmpty = $info['queue']->getSiblingQueuesWithJobs( $this->getQueueTypes() );
+ if ( is_array( $nonEmpty ) ) { // batching features supported
+ $types = array_merge( $types, $nonEmpty );
+ } else { // we have to go through the queues in the bucket one-by-one
+ foreach ( $info['types'] as $type ) {
+ if ( !$this->get( $type )->isEmpty() ) {
+ $types[] = $type;
+ }
+ }
+ }
+ }
+
+ return $types;
+ }
+
+ /**
+ * Get the size of the queus for a list of job types
+ *
+ * @return array Map of (job type => size)
+ */
+ public function getQueueSizes() {
+ $sizeMap = array();
+ foreach ( $this->getCoalescedQueues() as $info ) {
+ $sizes = $info['queue']->getSiblingQueueSizes( $this->getQueueTypes() );
+ if ( is_array( $sizes ) ) { // batching features supported
+ $sizeMap = $sizeMap + $sizes;
+ } else { // we have to go through the queues in the bucket one-by-one
+ foreach ( $info['types'] as $type ) {
+ $sizeMap[$type] = $this->get( $type )->getSize();
+ }
+ }
+ }
+
+ return $sizeMap;
+ }
+
+ /**
+ * @return array
+ */
+ protected function getCoalescedQueues() {
+ global $wgJobTypeConf;
+
+ if ( $this->coalescedQueues === null ) {
+ $this->coalescedQueues = array();
+ foreach ( $wgJobTypeConf as $type => $conf ) {
+ $queue = JobQueue::factory(
+ array( 'wiki' => $this->wiki, 'type' => 'null' ) + $conf );
+ $loc = $queue->getCoalesceLocationInternal();
+ if ( !isset( $this->coalescedQueues[$loc] ) ) {
+ $this->coalescedQueues[$loc]['queue'] = $queue;
+ $this->coalescedQueues[$loc]['types'] = array();
+ }
+ if ( $type === 'default' ) {
+ $this->coalescedQueues[$loc]['types'] = array_merge(
+ $this->coalescedQueues[$loc]['types'],
+ array_diff( $this->getQueueTypes(), array_keys( $wgJobTypeConf ) )
+ );
+ } else {
+ $this->coalescedQueues[$loc]['types'][] = $type;
+ }
+ }
+ }
+
+ return $this->coalescedQueues;
+ }
+
+ /**
+ * Execute any due periodic queue maintenance tasks for all queues.
+ *
+ * A task is "due" if the time ellapsed since the last run is greater than
+ * the defined run period. Concurrent calls to this function will cause tasks
+ * to be attempted twice, so they may need their own methods of mutual exclusion.
+ *
+ * @return int Number of tasks run
+ */
+ public function executeReadyPeriodicTasks() {
+ global $wgMemc;
+
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ $key = wfForeignMemcKey( $db, $prefix, 'jobqueuegroup', 'taskruns', 'v1' );
+ $lastRuns = $wgMemc->get( $key ); // (queue => task => UNIX timestamp)
+
+ $count = 0;
+ $tasksRun = array(); // (queue => task => UNIX timestamp)
+ foreach ( $this->getQueueTypes() as $type ) {
+ $queue = $this->get( $type );
+ foreach ( $queue->getPeriodicTasks() as $task => $definition ) {
+ if ( $definition['period'] <= 0 ) {
+ continue; // disabled
+ } elseif ( !isset( $lastRuns[$type][$task] )
+ || $lastRuns[$type][$task] < ( time() - $definition['period'] )
+ ) {
+ try {
+ if ( call_user_func( $definition['callback'] ) !== null ) {
+ $tasksRun[$type][$task] = time();
+ ++$count;
+ }
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ }
+ // The tasks may have recycled jobs or release delayed jobs into the queue
+ if ( isset( $tasksRun[$type] ) && !$queue->isEmpty() ) {
+ JobQueueAggregator::singleton()->notifyQueueNonEmpty( $this->wiki, $type );
+ }
+ }
+
+ $wgMemc->merge( $key, function ( $cache, $key, $lastRuns ) use ( $tasksRun ) {
+ if ( is_array( $lastRuns ) ) {
+ foreach ( $tasksRun as $type => $tasks ) {
+ foreach ( $tasks as $task => $timestamp ) {
+ if ( !isset( $lastRuns[$type][$task] )
+ || $timestamp > $lastRuns[$type][$task]
+ ) {
+ $lastRuns[$type][$task] = $timestamp;
+ }
+ }
+ }
+ } else {
+ $lastRuns = $tasksRun;
+ }
+
+ return $lastRuns;
+ } );
+
+ return $count;
+ }
+
+ /**
+ * @param $name string
+ * @return mixed
+ */
+ private function getCachedConfigVar( $name ) {
+ global $wgConf, $wgMemc;
+
+ if ( $this->wiki === wfWikiID() ) {
+ return $GLOBALS[$name]; // common case
+ } else {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
+ $value = $wgMemc->get( $key ); // ('v' => ...) or false
+ if ( is_array( $value ) ) {
+ return $value['v'];
+ } else {
+ $value = $wgConf->getConfig( $this->wiki, $name );
+ $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
+
+ return $value;
+ }
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * Redis-backed job queue code.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in Redis
+ *
+ * This is faster, less resource intensive, queue that JobQueueDB.
+ * All data for a queue using this class is placed into one redis server.
+ *
+ * There are eight main redis keys used to track jobs:
+ * - l-unclaimed : A list of job IDs used for ready unclaimed jobs
+ * - z-claimed : A sorted set of (job ID, UNIX timestamp as score) used for job retries
+ * - z-abandoned : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
+ * - z-delayed : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
+ * - h-idBySha1 : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
+ * - h-sha1ById : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
+ * - h-attempts : A hash of (job ID => attempt count) used for job claiming/retries
+ * - h-data : A hash of (job ID => serialized blobs) for job storage
+ * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
+ * If an ID appears in any of those lists, it should have a h-data entry for its ID.
+ * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
+ * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1ById
+ * entry and every h-sha1ById must refer to an ID that is l-unclaimed. If a job has its
+ * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
+ *
+ * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
+ * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
+ * All the keys are prefixed with the relevant wiki ID information.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ * Additionally, it should be noted that redis has different persistence modes, such
+ * as rdb snapshots, journaling, and no persistent. Appropriate configuration should be
+ * made on the servers based on what queues are using it and what tolerance they have.
+ *
+ * @ingroup JobQueue
+ * @ingroup Redis
+ * @since 1.22
+ */
+class JobQueueRedis extends JobQueue {
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+
+ /** @var string Server address */
+ protected $server;
+
+ /** @var string Compression method to use */
+ protected $compression;
+
+ const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
+
+ /** @var string Key to prefix the queue keys with (used for testing) */
+ protected $key;
+
+ /**
+ * @var null|int maximum seconds between execution of periodic tasks. Used to speed up
+ * testing but should otherwise be left unset.
+ */
+ protected $maximumPeriodicTaskSeconds;
+
+ /**
+ * @params include:
+ * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+ * Note that the serializer option is ignored as "none" is always used.
+ * - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+ * If a hostname is specified but no port, the standard port number
+ * 6379 will be used. Required.
+ * - compression : The type of compression to use; one of (none,gzip).
+ * - maximumPeriodicTaskSeconds : Maximum seconds between check periodic tasks. Set to
+ * force faster execution of periodic tasks for inegration tests that
+ * rely on checkDelay. Without this the integration tests are very very
+ * slow. This really shouldn't be set in production.
+ * @param array $params
+ */
+ public function __construct( array $params ) {
+ parent::__construct( $params );
+ $params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
+ $this->server = $params['redisServer'];
+ $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
+ $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+ $this->maximumPeriodicTaskSeconds = isset( $params['maximumPeriodicTaskSeconds'] ) ?
+ $params['maximumPeriodicTaskSeconds'] : null;
+ }
+
+ protected function supportedOrders() {
+ return array( 'timestamp', 'fifo' );
+ }
+
+ protected function optimalOrder() {
+ return 'fifo';
+ }
+
+ protected function supportsDelayedJobs() {
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doIsEmpty()
+ * @return bool
+ * @throws MWException
+ */
+ protected function doIsEmpty() {
+ return $this->doGetSize() == 0;
+ }
+
+ /**
+ * @see JobQueue::doGetSize()
+ * @return int
+ * @throws MWException
+ */
+ protected function doGetSize() {
+ $conn = $this->getConnection();
+ try {
+ return $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doGetAcquiredCount()
+ * @return int
+ * @throws JobQueueError
+ */
+ protected function doGetAcquiredCount() {
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+ $conn = $this->getConnection();
+ try {
+ $conn->multi( Redis::PIPELINE );
+ $conn->zSize( $this->getQueueKey( 'z-claimed' ) );
+ $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+
+ return array_sum( $conn->exec() );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doGetDelayedCount()
+ * @return int
+ * @throws JobQueueError
+ */
+ protected function doGetDelayedCount() {
+ if ( !$this->checkDelay ) {
+ return 0; // no delayed jobs
+ }
+ $conn = $this->getConnection();
+ try {
+ return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doGetAbandonedCount()
+ * @return int
+ * @throws JobQueueError
+ */
+ protected function doGetAbandonedCount() {
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+ $conn = $this->getConnection();
+ try {
+ return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doBatchPush()
+ * @param array $jobs
+ * @param $flags
+ * @return bool
+ * @throws JobQueueError
+ */
+ protected function doBatchPush( array $jobs, $flags ) {
+ // Convert the jobs into field maps (de-duplicated against each other)
+ $items = array(); // (job ID => job fields map)
+ foreach ( $jobs as $job ) {
+ $item = $this->getNewJobFields( $job );
+ if ( strlen( $item['sha1'] ) ) { // hash identifier => de-duplicate
+ $items[$item['sha1']] = $item;
+ } else {
+ $items[$item['uuid']] = $item;
+ }
+ }
+
+ if ( !count( $items ) ) {
+ return true; // nothing to do
+ }
+
+ $conn = $this->getConnection();
+ try {
+ // Actually push the non-duplicate jobs into the queue...
+ if ( $flags & self::QOS_ATOMIC ) {
+ $batches = array( $items ); // all or nothing
+ } else {
+ $batches = array_chunk( $items, 500 ); // avoid tying up the server
+ }
+ $failed = 0;
+ $pushed = 0;
+ foreach ( $batches as $itemBatch ) {
+ $added = $this->pushBlobs( $conn, $itemBatch );
+ if ( is_int( $added ) ) {
+ $pushed += $added;
+ } else {
+ $failed += count( $itemBatch );
+ }
+ }
+ if ( $failed > 0 ) {
+ wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
+
+ return false;
+ }
+ JobQueue::incrStats( 'job-insert', $this->type, count( $items ) );
+ JobQueue::incrStats( 'job-insert-duplicate', $this->type,
+ count( $items ) - $failed - $pushed );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+
+ return true;
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @param array $items List of results from JobQueueRedis::getNewJobFields()
+ * @return int Number of jobs inserted (duplicates are ignored)
+ * @throws RedisException
+ */
+ protected function pushBlobs( RedisConnRef $conn, array $items ) {
+ $args = array(); // ([id, sha1, rtime, blob [, id, sha1, rtime, blob ... ] ] )
+ foreach ( $items as $item ) {
+ $args[] = (string)$item['uuid'];
+ $args[] = (string)$item['sha1'];
+ $args[] = (string)$item['rtimestamp'];
+ $args[] = (string)$this->serialize( $item );
+ }
+ static $script =
+<<<LUA
+ local kUnclaimed, kSha1ById, kIdBySha1, kDelayed, kData = unpack(KEYS)
+ if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
+ local pushed = 0
+ for i = 1,#ARGV,4 do
+ local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
+ if sha1 == '' or redis.call('hExists',kIdBySha1,sha1) == 0 then
+ if 1*rtimestamp > 0 then
+ -- Insert into delayed queue (release time as score)
+ redis.call('zAdd',kDelayed,rtimestamp,id)
+ else
+ -- Insert into unclaimed queue
+ redis.call('lPush',kUnclaimed,id)
+ end
+ if sha1 ~= '' then
+ redis.call('hSet',kSha1ById,id,sha1)
+ redis.call('hSet',kIdBySha1,sha1,id)
+ end
+ redis.call('hSet',kData,id,blob)
+ pushed = pushed + 1
+ end
+ end
+ return pushed
+LUA;
+ return $conn->luaEval( $script,
+ array_merge(
+ array(
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+ $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+ $this->getQueueKey( 'z-delayed' ), # KEYS[4]
+ $this->getQueueKey( 'h-data' ), # KEYS[5]
+ ),
+ $args
+ ),
+ 5 # number of first argument(s) that are keys
+ );
+ }
+
+ /**
+ * @see JobQueue::doPop()
+ * @return Job|bool
+ * @throws JobQueueError
+ */
+ protected function doPop() {
+ $job = false;
+
+ // Push ready delayed jobs into the queue every 10 jobs to spread the load.
+ // This is also done as a periodic task, but we don't want too much done at once.
+ if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
+ $this->recyclePruneAndUndelayJobs();
+ }
+
+ $conn = $this->getConnection();
+ try {
+ do {
+ if ( $this->claimTTL > 0 ) {
+ // Keep the claimed job list down for high-traffic queues
+ if ( mt_rand( 0, 99 ) == 0 ) {
+ $this->recyclePruneAndUndelayJobs();
+ }
+ $blob = $this->popAndAcquireBlob( $conn );
+ } else {
+ $blob = $this->popAndDeleteBlob( $conn );
+ }
+ if ( $blob === false ) {
+ break; // no jobs; nothing to do
+ }
+
+ JobQueue::incrStats( 'job-pop', $this->type );
+ $item = $this->unserialize( $blob );
+ if ( $item === false ) {
+ wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
+ continue;
+ }
+
+ // If $item is invalid, recyclePruneAndUndelayJobs() will cleanup as needed
+ $job = $this->getJobFromFields( $item ); // may be false
+ } while ( !$job ); // job may be false if invalid
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+
+ return $job;
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @return array serialized string or false
+ * @throws RedisException
+ */
+ protected function popAndDeleteBlob( RedisConnRef $conn ) {
+ static $script =
+<<<LUA
+ local kUnclaimed, kSha1ById, kIdBySha1, kData = unpack(KEYS)
+ -- Pop an item off the queue
+ local id = redis.call('rpop',kUnclaimed)
+ if not id then return false end
+ -- Get the job data and remove it
+ local item = redis.call('hGet',kData,id)
+ redis.call('hDel',kData,id)
+ -- Allow new duplicates of this job
+ local sha1 = redis.call('hGet',kSha1ById,id)
+ if sha1 then redis.call('hDel',kIdBySha1,sha1) end
+ redis.call('hDel',kSha1ById,id)
+ -- Return the job data
+ return item
+LUA;
+ return $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+ $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+ $this->getQueueKey( 'h-data' ), # KEYS[4]
+ ),
+ 4 # number of first argument(s) that are keys
+ );
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @return array serialized string or false
+ * @throws RedisException
+ */
+ protected function popAndAcquireBlob( RedisConnRef $conn ) {
+ static $script =
+<<<LUA
+ local kUnclaimed, kSha1ById, kIdBySha1, kClaimed, kAttempts, kData = unpack(KEYS)
+ -- Pop an item off the queue
+ local id = redis.call('rPop',kUnclaimed)
+ if not id then return false end
+ -- Allow new duplicates of this job
+ local sha1 = redis.call('hGet',kSha1ById,id)
+ if sha1 then redis.call('hDel',kIdBySha1,sha1) end
+ redis.call('hDel',kSha1ById,id)
+ -- Mark the jobs as claimed and return it
+ redis.call('zAdd',kClaimed,ARGV[1],id)
+ redis.call('hIncrBy',kAttempts,id,1)
+ return redis.call('hGet',kData,id)
+LUA;
+ return $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+ $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+ $this->getQueueKey( 'z-claimed' ), # KEYS[4]
+ $this->getQueueKey( 'h-attempts' ), # KEYS[5]
+ $this->getQueueKey( 'h-data' ), # KEYS[6]
+ time(), # ARGV[1] (injected to be replication-safe)
+ ),
+ 6 # number of first argument(s) that are keys
+ );
+ }
+
+ /**
+ * @see JobQueue::doAck()
+ * @param Job $job
+ * @return Job|bool
+ * @throws MWException|JobQueueError
+ */
+ protected function doAck( Job $job ) {
+ if ( !isset( $job->metadata['uuid'] ) ) {
+ throw new MWException( "Job of type '{$job->getType()}' has no UUID." );
+ }
+ if ( $this->claimTTL > 0 ) {
+ $conn = $this->getConnection();
+ try {
+ static $script =
+<<<LUA
+ local kClaimed, kAttempts, kData = unpack(KEYS)
+ -- Unmark the job as claimed
+ redis.call('zRem',kClaimed,ARGV[1])
+ redis.call('hDel',kAttempts,ARGV[1])
+ -- Delete the job data itself
+ return redis.call('hDel',kData,ARGV[1])
+LUA;
+ $res = $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+ $this->getQueueKey( 'h-data' ), # KEYS[3]
+ $job->metadata['uuid'] # ARGV[1]
+ ),
+ 3 # number of first argument(s) that are keys
+ );
+
+ if ( !$res ) {
+ wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." );
+
+ return false;
+ }
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doDeduplicateRootJob()
+ * @param Job $job
+ * @return bool
+ * @throws MWException|JobQueueError
+ */
+ protected function doDeduplicateRootJob( Job $job ) {
+ if ( !$job->hasRootJobParams() ) {
+ throw new MWException( "Cannot register root job; missing parameters." );
+ }
+ $params = $job->getRootJobParams();
+
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+
+ $conn = $this->getConnection();
+ try {
+ $timestamp = $conn->get( $key ); // current last timestamp of this job
+ if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+ return true; // a newer version of this root job was enqueued
+ }
+
+ // Update the timestamp of the last root job started at the location...
+ return $conn->set( $key, $params['rootJobTimestamp'], self::ROOTJOB_TTL ); // 2 weeks
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doIsRootJobOldDuplicate()
+ * @param Job $job
+ * @return bool
+ * @throws JobQueueError
+ */
+ protected function doIsRootJobOldDuplicate( Job $job ) {
+ if ( !$job->hasRootJobParams() ) {
+ return false; // job has no de-deplication info
+ }
+ $params = $job->getRootJobParams();
+
+ $conn = $this->getConnection();
+ try {
+ // Get the last time this root job was enqueued
+ $timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+
+ // Check if a new root job was started at the location after this one's...
+ return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+ }
+
+ /**
+ * @see JobQueue::doDelete()
+ * @return bool
+ * @throws JobQueueError
+ */
+ protected function doDelete() {
+ static $props = array( 'l-unclaimed', 'z-claimed', 'z-abandoned',
+ 'z-delayed', 'h-idBySha1', 'h-sha1ById', 'h-attempts', 'h-data' );
+
+ $conn = $this->getConnection();
+ try {
+ $keys = array();
+ foreach ( $props as $prop ) {
+ $keys[] = $this->getQueueKey( $prop );
+ }
+
+ return ( $conn->delete( $keys ) !== false );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllQueuedJobs() {
+ $conn = $this->getConnection();
+ try {
+ $that = $this;
+
+ return new MappedIterator(
+ $conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 ),
+ function ( $uid ) use ( $that, $conn ) {
+ return $that->getJobFromUidInternal( $uid, $conn );
+ },
+ array( 'accept' => function ( $job ) {
+ return is_object( $job );
+ } )
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllDelayedJobs() {
+ $conn = $this->getConnection();
+ try {
+ $that = $this;
+
+ return new MappedIterator( // delayed jobs
+ $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
+ function ( $uid ) use ( $that, $conn ) {
+ return $that->getJobFromUidInternal( $uid, $conn );
+ },
+ array( 'accept' => function ( $job ) {
+ return is_object( $job );
+ } )
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ public function getCoalesceLocationInternal() {
+ return "RedisServer:" . $this->server;
+ }
+
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ return array_keys( array_filter( $this->doGetSiblingQueueSizes( $types ) ) );
+ }
+
+ protected function doGetSiblingQueueSizes( array $types ) {
+ $sizes = array(); // (type => size)
+ $types = array_values( $types ); // reindex
+ $conn = $this->getConnection();
+ try {
+ $conn->multi( Redis::PIPELINE );
+ foreach ( $types as $type ) {
+ $conn->lSize( $this->getQueueKey( 'l-unclaimed', $type ) );
+ }
+ $res = $conn->exec();
+ if ( is_array( $res ) ) {
+ foreach ( $res as $i => $size ) {
+ $sizes[$types[$i]] = $size;
+ }
+ }
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+
+ return $sizes;
+ }
+
+ /**
+ * This function should not be called outside JobQueueRedis
+ *
+ * @param $uid string
+ * @param $conn RedisConnRef
+ * @return Job|bool Returns false if the job does not exist
+ * @throws MWException|JobQueueError
+ */
+ public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
+ try {
+ $data = $conn->hGet( $this->getQueueKey( 'h-data' ), $uid );
+ if ( $data === false ) {
+ return false; // not found
+ }
+ $item = $this->unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $uid ) );
+ if ( !is_array( $item ) ) { // this shouldn't happen
+ throw new MWException( "Could not find job with ID '$uid'." );
+ }
+ $title = Title::makeTitle( $item['namespace'], $item['title'] );
+ $job = Job::factory( $item['type'], $title, $item['params'] );
+ $job->metadata['uuid'] = $item['uuid'];
+
+ return $job;
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+ }
+
+ /**
+ * Recycle or destroy any jobs that have been claimed for too long
+ * and release any ready delayed jobs into the queue
+ *
+ * @return int Number of jobs recycled/deleted/undelayed
+ * @throws MWException|JobQueueError
+ */
+ public function recyclePruneAndUndelayJobs() {
+ $count = 0;
+ // For each job item that can be retried, we need to add it back to the
+ // main queue and remove it from the list of currenty claimed job items.
+ // For those that cannot, they are marked as dead and kept around for
+ // investigation and manual job restoration but are eventually deleted.
+ $conn = $this->getConnection();
+ try {
+ $now = time();
+ static $script =
+<<<LUA
+ local kClaimed, kAttempts, kUnclaimed, kData, kAbandoned, kDelayed = unpack(KEYS)
+ local released,abandoned,pruned,undelayed = 0,0,0,0
+ -- Get all non-dead jobs that have an expired claim on them.
+ -- The score for each item is the last claim timestamp (UNIX).
+ local staleClaims = redis.call('zRangeByScore',kClaimed,0,ARGV[1])
+ for k,id in ipairs(staleClaims) do
+ local timestamp = redis.call('zScore',kClaimed,id)
+ local attempts = redis.call('hGet',kAttempts,id)
+ if attempts < ARGV[3] then
+ -- Claim expired and retries left: re-enqueue the job
+ redis.call('lPush',kUnclaimed,id)
+ redis.call('hIncrBy',kAttempts,id,1)
+ released = released + 1
+ else
+ -- Claim expired and no retries left: mark the job as dead
+ redis.call('zAdd',kAbandoned,timestamp,id)
+ abandoned = abandoned + 1
+ end
+ redis.call('zRem',kClaimed,id)
+ end
+ -- Get all of the dead jobs that have been marked as dead for too long.
+ -- The score for each item is the last claim timestamp (UNIX).
+ local deadClaims = redis.call('zRangeByScore',kAbandoned,0,ARGV[2])
+ for k,id in ipairs(deadClaims) do
+ -- Stale and out of retries: remove any traces of the job
+ redis.call('zRem',kAbandoned,id)
+ redis.call('hDel',kAttempts,id)
+ redis.call('hDel',kData,id)
+ pruned = pruned + 1
+ end
+ -- Get the list of ready delayed jobs, sorted by readiness (UNIX timestamp)
+ local ids = redis.call('zRangeByScore',kDelayed,0,ARGV[4])
+ -- Migrate the jobs from the "delayed" set to the "unclaimed" list
+ for k,id in ipairs(ids) do
+ redis.call('lPush',kUnclaimed,id)
+ redis.call('zRem',kDelayed,id)
+ end
+ undelayed = #ids
+ return {released,abandoned,pruned,undelayed}
+LUA;
+ $res = $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
+ $this->getQueueKey( 'h-data' ), # KEYS[4]
+ $this->getQueueKey( 'z-abandoned' ), # KEYS[5]
+ $this->getQueueKey( 'z-delayed' ), # KEYS[6]
+ $now - $this->claimTTL, # ARGV[1]
+ $now - self::MAX_AGE_PRUNE, # ARGV[2]
+ $this->maxTries, # ARGV[3]
+ $now # ARGV[4]
+ ),
+ 6 # number of first argument(s) that are keys
+ );
+ if ( $res ) {
+ list( $released, $abandoned, $pruned, $undelayed ) = $res;
+ $count += $released + $pruned + $undelayed;
+ JobQueue::incrStats( 'job-recycle', $this->type, $released );
+ JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
+ }
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $conn, $e );
+ }
+
+ return $count;
+ }
+
+ /**
+ * @return array
+ */
+ protected function doGetPeriodicTasks() {
+ $periods = array( 3600 ); // standard cleanup (useful on config change)
+ if ( $this->claimTTL > 0 ) {
+ $periods[] = ceil( $this->claimTTL / 2 ); // avoid bad timing
+ }
+ if ( $this->checkDelay ) {
+ $periods[] = 300; // 5 minutes
+ }
+ $period = min( $periods );
+ $period = max( $period, 30 ); // sanity
+ // Support override for faster testing
+ if ( $this->maximumPeriodicTaskSeconds !== null ) {
+ $period = min( $period, $this->maximumPeriodicTaskSeconds );
+ }
+ return array(
+ 'recyclePruneAndUndelayJobs' => array(
+ 'callback' => array( $this, 'recyclePruneAndUndelayJobs' ),
+ 'period' => $period,
+ )
+ );
+ }
+
+ /**
+ * @param IJobSpecification $job
+ * @return array
+ */
+ protected function getNewJobFields( IJobSpecification $job ) {
+ return array(
+ // Fields that describe the nature of the job
+ 'type' => $job->getType(),
+ 'namespace' => $job->getTitle()->getNamespace(),
+ 'title' => $job->getTitle()->getDBkey(),
+ 'params' => $job->getParams(),
+ // Some jobs cannot run until a "release timestamp"
+ 'rtimestamp' => $job->getReleaseTimestamp() ?: 0,
+ // Additional job metadata
+ 'uuid' => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
+ 'sha1' => $job->ignoreDuplicates()
+ ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
+ : '',
+ 'timestamp' => time() // UNIX timestamp
+ );
+ }
+
+ /**
+ * @param $fields array
+ * @return Job|bool
+ */
+ protected function getJobFromFields( array $fields ) {
+ $title = Title::makeTitleSafe( $fields['namespace'], $fields['title'] );
+ if ( $title ) {
+ $job = Job::factory( $fields['type'], $title, $fields['params'] );
+ $job->metadata['uuid'] = $fields['uuid'];
+
+ return $job;
+ }
+
+ return false;
+ }
+
+ /**
+ * @param array $fields
+ * @return string Serialized and possibly compressed version of $fields
+ */
+ protected function serialize( array $fields ) {
+ $blob = serialize( $fields );
+ if ( $this->compression === 'gzip'
+ && strlen( $blob ) >= 1024
+ && function_exists( 'gzdeflate' )
+ ) {
+ $object = (object)array( 'blob' => gzdeflate( $blob ), 'enc' => 'gzip' );
+ $blobz = serialize( $object );
+
+ return ( strlen( $blobz ) < strlen( $blob ) ) ? $blobz : $blob;
+ } else {
+ return $blob;
+ }
+ }
+
+ /**
+ * @param string $blob
+ * @return array|bool Unserialized version of $blob or false
+ */
+ protected function unserialize( $blob ) {
+ $fields = unserialize( $blob );
+ if ( is_object( $fields ) ) {
+ if ( $fields->enc === 'gzip' && function_exists( 'gzinflate' ) ) {
+ $fields = unserialize( gzinflate( $fields->blob ) );
+ } else {
+ $fields = false;
+ }
+ }
+
+ return is_array( $fields ) ? $fields : false;
+ }
+
+ /**
+ * Get a connection to the server that handles all sub-queues for this queue
+ *
+ * @return RedisConnRef
+ * @throws JobQueueConnectionError
+ */
+ protected function getConnection() {
+ $conn = $this->redisPool->getConnection( $this->server );
+ if ( !$conn ) {
+ throw new JobQueueConnectionError( "Unable to connect to redis server." );
+ }
+
+ return $conn;
+ }
+
+ /**
+ * @param $conn RedisConnRef
+ * @param $e RedisException
+ * @throws JobQueueError
+ */
+ protected function throwRedisException( RedisConnRef $conn, $e ) {
+ $this->redisPool->handleError( $conn, $e );
+ throw new JobQueueError( "Redis server error: {$e->getMessage()}\n" );
+ }
+
+ /**
+ * @param $prop string
+ * @param $type string|null
+ * @return string
+ */
+ private function getQueueKey( $prop, $type = null ) {
+ $type = is_string( $type ) ? $type : $this->type;
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ if ( strlen( $this->key ) ) { // namespaced queue (for testing)
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $this->key, $prop );
+ } else {
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $prop );
+ }
+ }
+
+ /**
+ * @param $key string
+ * @return void
+ */
+ public function setTestingPrefix( $key ) {
+ $this->key = $key;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue task description base code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job queue task description interface
+ *
+ * @ingroup JobQueue
+ * @since 1.23
+ */
+interface IJobSpecification {
+ /**
+ * @return string Job type
+ */
+ public function getType();
+
+ /**
+ * @return array
+ */
+ public function getParams();
+
+ /**
+ * @return int|null UNIX timestamp to delay running this job until, otherwise null
+ */
+ public function getReleaseTimestamp();
+
+ /**
+ * @return bool Whether only one of each identical set of jobs should be run
+ */
+ public function ignoreDuplicates();
+
+ /**
+ * Subclasses may need to override this to make duplication detection work.
+ * The resulting map conveys everything that makes the job unique. This is
+ * only checked if ignoreDuplicates() returns true, meaning that duplicate
+ * jobs are supposed to be ignored.
+ *
+ * @return array Map of key/values
+ */
+ public function getDeduplicationInfo();
+
+ /**
+ * @return Title Descriptive title (this can simply be informative)
+ */
+ public function getTitle();
+}
+
+/**
+ * Job queue task description base code
+ *
+ * Example usage:
+ * <code>
+ * $job = new JobSpecification(
+ * 'null',
+ * array( 'lives' => 1, 'usleep' => 100, 'pi' => 3.141569 ),
+ * array( 'removeDuplicates' => 1 ),
+ * Title::makeTitle( NS_SPECIAL, 'nullity' )
+ * );
+ * JobQueueGroup::singleton()->push( $job )
+ * </code>
+ *
+ * @ingroup JobQueue
+ * @since 1.23
+ */
+class JobSpecification implements IJobSpecification {
+ /** @var string */
+ protected $type;
+
+ /** @var array Array of job parameters or false if none */
+ protected $params;
+
+ /** @var Title */
+ protected $title;
+
+ /** @var bool Expensive jobs may set this to true */
+ protected $ignoreDuplicates;
+
+ /**
+ * @param string $type
+ * @param array $params Map of key/values
+ * @param array $opts Map of key/values
+ * @param Title $title Optional descriptive title
+ */
+ public function __construct(
+ $type, array $params, array $opts = array(), Title $title = null
+ ) {
+ $this->validateParams( $params );
+
+ $this->type = $type;
+ $this->params = $params;
+ $this->title = $title ?: Title::newMainPage();
+ $this->ignoreDuplicates = !empty( $opts['removeDuplicates'] );
+ }
+
+ /**
+ * @param array $params
+ */
+ protected function validateParams( array $params ) {
+ foreach ( $params as $p => $v ) {
+ if ( is_array( $v ) ) {
+ $this->validateParams( $v );
+ } elseif ( !is_scalar( $v ) && $v !== null ) {
+ throw new UnexpectedValueException( 'Job parameters are not JSON serializable.' );
+ }
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * @return Title
+ */
+ public function getTitle() {
+ return $this->title;
+ }
+
+ /**
+ * @return array
+ */
+ public function getParams() {
+ return $this->params;
+ }
+
+ /**
+ * @return int|null UNIX timestamp to delay running this job until, otherwise null
+ */
+ public function getReleaseTimestamp() {
+ return isset( $this->params['jobReleaseTimestamp'] )
+ ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
+ : null;
+ }
+
+ /**
+ * @return bool Whether only one of each identical set of jobs should be run
+ */
+ public function ignoreDuplicates() {
+ return $this->ignoreDuplicates;
+ }
+
+ /**
+ * Subclasses may need to override this to make duplication detection work.
+ * The resulting map conveys everything that makes the job unique. This is
+ * only checked if ignoreDuplicates() returns true, meaning that duplicate
+ * jobs are supposed to be ignored.
+ *
+ * @return array Map of key/values
+ */
+ public function getDeduplicationInfo() {
+ $info = array(
+ 'type' => $this->getType(),
+ 'namespace' => $this->getTitle()->getNamespace(),
+ 'title' => $this->getTitle()->getDBkey(),
+ 'params' => $this->getParams()
+ );
+ if ( is_array( $info['params'] ) ) {
+ // Identical jobs with different "root" jobs should count as duplicates
+ unset( $info['params']['rootJobSignature'] );
+ unset( $info['params']['rootJobTimestamp'] );
+ // Likewise for jobs with different delay times
+ unset( $info['params']['jobReleaseTimestamp'] );
+ }
+
+ return $info;
+ }
+}
--- /dev/null
+/*!
+\ingroup JobQueue
+\page jobqueue_design Job queue design
+
+Notes on the Job queuing system architecture.
+
+\section intro Introduction
+
+The data model consist of the following main components:
+* The Job object represents a particular deferred task that happens in the
+ background. All jobs subclass the Job object and put the main logic in the
+ function called run().
+* The JobQueue object represents a particular queue of jobs of a certain type.
+ For example there may be a queue for email jobs and a queue for squid purge
+ jobs.
+
+\section jobqueue Job queues
+
+Each job type has its own queue and is associated to a storage medium. One
+queue might save its jobs in redis while another one uses would use a database.
+
+Storage medium are defined in a queue class. Before using it, you must
+define in $wgJobTypeConf a mapping of the job type to a queue class.
+
+The factory class JobQueueGroup provides helper functions:
+- getting the queue for a given job
+- route new job insertions to the proper queue
+
+The following queue classes are available:
+* JobQueueDB (stores jobs in the `job` table in a database)
+* JobQueueRedis (stores jobs in a redis server)
+
+All queue classes support some basic operations (though some may be no-ops):
+* enqueueing a batch of jobs
+* dequeueing a single job
+* acknowledging a job is completed
+* checking if the queue is empty
+
+Some queue classes (like JobQueueDB) may dequeue jobs in random order while other
+queues might dequeue jobs in exact FIFO order. Callers should thus not assume jobs
+are executed in FIFO order.
+
+Also note that not all queue classes will have the same reliability guarantees.
+In-memory queues may lose data when restarted depending on snapshot and journal
+settings (including journal fsync() frequency). Some queue types may totally remove
+jobs when dequeued while leaving the ack() function as a no-op; if a job is
+dequeued by a job runner, which crashes before completion, the job will be
+lost. Some jobs, like purging squid caches after a template change, may not
+require durable queues, whereas other jobs might be more important.
+
+\section aggregator Job queue aggregator
+
+The aggregators are used by nextJobDB.php, which is a script that will return a
+random ready queue (on any wiki in the farm) that can be used with runJobs.php.
+This can be used in conjunction with any scripts that handle wiki farm job queues.
+Note that $wgLocalDatabases defines what wikis are in the wiki farm.
+
+Since each job type has its own queue, and wiki-farms may have many wikis,
+there might be a large number of queues to keep track of. To avoid wasting
+large amounts of time polling empty queues, aggregators exists to keep track
+of which queues are ready.
+
+The following queue aggregator classes are available:
+* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
+* JobQueueAggregatorRedis (uses a redis server to track ready queues)
+
+Some aggregators cache data for a few minutes while others may be always up to date.
+This can be an important factor for jobs that need a low pickup time (or latency).
+
+\section jobs Jobs
+
+Callers should also try to make jobs maintain correctness when executed twice.
+This is useful for queues that actually implement ack(), since they may recycle
+dequeued but un-acknowledged jobs back into the queue to be attempted again. If
+a runner dequeues a job, runs it, but then crashes before calling ack(), the
+job may be returned to the queue and run a second time. Jobs like cache purging can
+happen several times without any correctness problems. However, a pathological case
+would be if a bug causes the problem to systematically keep repeating. For example,
+a job may always throw a DB error at the end of run(). This problem is trickier to
+solve and more obnoxious for things like email jobs, for example. For such jobs,
+it might be useful to use a queue that does not retry jobs.
--- /dev/null
+<?php
+/**
+ * Job queue aggregator code.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueueAggregator {
+ /** @var JobQueueAggregator */
+ protected static $instance = null;
+
+ /**
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ }
+
+ /**
+ * @throws MWException
+ * @return JobQueueAggregator
+ */
+ final public static function singleton() {
+ global $wgJobQueueAggregator;
+
+ if ( !isset( self::$instance ) ) {
+ $class = $wgJobQueueAggregator['class'];
+ $obj = new $class( $wgJobQueueAggregator );
+ if ( !( $obj instanceof JobQueueAggregator ) ) {
+ throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
+ }
+ self::$instance = $obj;
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Destroy the singleton instance
+ *
+ * @return void
+ */
+ final public static function destroySingleton() {
+ self::$instance = null;
+ }
+
+ /**
+ * Mark a queue as being empty
+ *
+ * @param string $wiki
+ * @param string $type
+ * @return bool Success
+ */
+ final public function notifyQueueEmpty( $wiki, $type ) {
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doNotifyQueueEmpty( $wiki, $type );
+ wfProfileOut( __METHOD__ );
+
+ return $ok;
+ }
+
+ /**
+ * @see JobQueueAggregator::notifyQueueEmpty()
+ */
+ abstract protected function doNotifyQueueEmpty( $wiki, $type );
+
+ /**
+ * Mark a queue as being non-empty
+ *
+ * @param string $wiki
+ * @param string $type
+ * @return bool Success
+ */
+ final public function notifyQueueNonEmpty( $wiki, $type ) {
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
+ wfProfileOut( __METHOD__ );
+
+ return $ok;
+ }
+
+ /**
+ * @see JobQueueAggregator::notifyQueueNonEmpty()
+ */
+ abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
+
+ /**
+ * Get the list of all of the queues with jobs
+ *
+ * @return array (job type => (list of wiki IDs))
+ */
+ final public function getAllReadyWikiQueues() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetAllReadyWikiQueues();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueueAggregator::getAllReadyWikiQueues()
+ */
+ abstract protected function doGetAllReadyWikiQueues();
+
+ /**
+ * Purge all of the aggregator information
+ *
+ * @return bool Success
+ */
+ final public function purge() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doPurge();
+ wfProfileOut( __METHOD__ );
+
+ return $res;
+ }
+
+ /**
+ * @see JobQueueAggregator::purge()
+ */
+ abstract protected function doPurge();
+
+ /**
+ * Get all databases that have a pending job.
+ * This poll all the queues and is this expensive.
+ *
+ * @return array (job type => (list of wiki IDs))
+ */
+ protected function findPendingWikiQueues() {
+ global $wgLocalDatabases;
+
+ $pendingDBs = array(); // (job type => (db list))
+ foreach ( $wgLocalDatabases as $db ) {
+ foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
+ $pendingDBs[$type][] = $db;
+ }
+ }
+
+ return $pendingDBs;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue aggregator code that uses BagOStuff.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using BagOStuff
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorMemc extends JobQueueAggregator {
+ /** @var BagOStuff */
+ protected $cache;
+
+ protected $cacheTTL; // integer; seconds
+
+ /**
+ * @params include:
+ * - objectCache : Name of an object cache registered in $wgObjectCaches.
+ * This defaults to the one specified by $wgMainCacheType.
+ * - cacheTTL : Seconds to cache the aggregate data before regenerating.
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->cache = isset( $params['objectCache'] )
+ ? wfGetCache( $params['objectCache'] )
+ : wfGetMainCache();
+ $this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueEmpty()
+ */
+ protected function doNotifyQueueEmpty( $wiki, $type ) {
+ $key = $this->getReadyQueueCacheKey();
+ // Delist the queue from the "ready queue" list
+ if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+ $curInfo = $this->cache->get( $key );
+ if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
+ if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
+ $curInfo['pendingDBs'][$type] = array_diff(
+ $curInfo['pendingDBs'][$type], array( $wiki ) );
+ $this->cache->set( $key, $curInfo );
+ }
+ }
+ $this->cache->delete( "$key:lock" ); // unlock
+ }
+
+ return true;
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+ */
+ protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+ return true; // updated periodically
+ }
+
+ /**
+ * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+ */
+ protected function doGetAllReadyWikiQueues() {
+ $key = $this->getReadyQueueCacheKey();
+ // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
+ // regenerate the cache. Use any available stale cache if another process is
+ // currently regenerating the pending DB information.
+ $pendingDbInfo = $this->cache->get( $key );
+ if ( !is_array( $pendingDbInfo )
+ || ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
+ || mt_rand( 0, 999 ) == 0
+ ) {
+ if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
+ $pendingDbInfo = array(
+ 'pendingDBs' => $this->findPendingWikiQueues(),
+ 'timestamp' => time()
+ );
+ for ( $attempts = 1; $attempts <= 25; ++$attempts ) {
+ if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+ $this->cache->set( $key, $pendingDbInfo );
+ $this->cache->delete( "$key:lock" ); // unlock
+ break;
+ }
+ }
+ $this->cache->delete( "$key:rebuild" ); // unlock
+ }
+ }
+
+ return is_array( $pendingDbInfo )
+ ? $pendingDbInfo['pendingDBs']
+ : array(); // cache is both empty and locked
+ }
+
+ /**
+ * @see JobQueueAggregator::doPurge()
+ */
+ protected function doPurge() {
+ return $this->cache->delete( $this->getReadyQueueCacheKey() );
+ }
+
+ /**
+ * @return string
+ */
+ private function getReadyQueueCacheKey() {
+ return "jobqueue:aggregator:ready-queues:v1"; // global
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job queue aggregator code that uses PhpRedis.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using PhpRedis
+ *
+ * @ingroup JobQueue
+ * @ingroup Redis
+ * @since 1.21
+ */
+class JobQueueAggregatorRedis extends JobQueueAggregator {
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+
+ /** @var array List of Redis server addresses */
+ protected $servers;
+
+ /**
+ * @params include:
+ * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+ * - redisServers : Array of server entries, the first being the primary and the
+ * others being fallback servers. Each entry is either a hostname/port
+ * combination or the absolute path of a UNIX socket.
+ * If a hostname is specified but no port, the standard port number
+ * 6379 will be used. Required.
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->servers = isset( $params['redisServers'] )
+ ? $params['redisServers']
+ : array( $params['redisServer'] ); // b/c
+ $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+ }
+
+ protected function doNotifyQueueEmpty( $wiki, $type ) {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
+
+ return true;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+
+ return false;
+ }
+ }
+
+ protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
+
+ return true;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+
+ return false;
+ }
+ }
+
+ protected function doGetAllReadyWikiQueues() {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return array();
+ }
+ try {
+ $conn->multi( Redis::PIPELINE );
+ $conn->exists( $this->getReadyQueueKey() );
+ $conn->hGetAll( $this->getReadyQueueKey() );
+ list( $exists, $map ) = $conn->exec();
+
+ if ( $exists ) { // cache hit
+ $pendingDBs = array(); // (type => list of wikis)
+ foreach ( $map as $key => $time ) {
+ list( $type, $wiki ) = $this->dencQueueName( $key );
+ $pendingDBs[$type][] = $wiki;
+ }
+ } else { // cache miss
+ // Avoid duplicated effort
+ $rand = wfRandomString( 32 );
+ $conn->multi( Redis::MULTI );
+ $conn->setex( "{$rand}:lock", 3600, 1 );
+ $conn->renamenx( "{$rand}:lock", $this->getReadyQueueKey() . ":lock" );
+ if ( $conn->exec() !== array( true, true ) ) { // lock
+ $conn->delete( "{$rand}:lock" );
+ return array(); // already in progress
+ }
+
+ $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
+
+ $conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
+
+ $now = time();
+ $map = array();
+ foreach ( $pendingDBs as $type => $wikis ) {
+ foreach ( $wikis as $wiki ) {
+ $map[$this->encQueueName( $type, $wiki )] = $now;
+ }
+ }
+ $conn->hMSet( $this->getReadyQueueKey(), $map );
+ }
+
+ return $pendingDBs;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+
+ return array();
+ }
+ }
+
+ protected function doPurge() {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->delete( $this->getReadyQueueKey() );
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Get a connection to the server that handles all sub-queues for this queue
+ *
+ * @return RedisConnRef|bool Returns false on failure
+ * @throws MWException
+ */
+ protected function getConnection() {
+ $conn = false;
+ foreach ( $this->servers as $server ) {
+ $conn = $this->redisPool->getConnection( $server );
+ if ( $conn ) {
+ break;
+ }
+ }
+
+ return $conn;
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @param RedisException $e
+ * @return void
+ */
+ protected function handleException( RedisConnRef $conn, $e ) {
+ $this->redisPool->handleError( $conn, $e );
+ }
+
+ /**
+ * @return string
+ */
+ private function getReadyQueueKey() {
+ return "jobqueue:aggregator:h-ready-queues:v1"; // global
+ }
+
+ /**
+ * @param string $type
+ * @param string $wiki
+ * @return string
+ */
+ private function encQueueName( $type, $wiki ) {
+ return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
+ }
+
+ /**
+ * @param string $name
+ * @return string
+ */
+ private function dencQueueName( $name ) {
+ list( $type, $wiki ) = explode( '/', $name, 2 );
+
+ return array( rawurldecode( $type ), rawurldecode( $wiki ) );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * @ingroup Upload
+ */
+class AssembleUploadChunksJob extends Job {
+ public function __construct( $title, $params ) {
+ parent::__construct( 'AssembleUploadChunks', $title, $params );
+ $this->removeDuplicates = true;
+ }
+
+ public function run() {
+ $scope = RequestContext::importScopedSession( $this->params['session'] );
+ $context = RequestContext::getMain();
+ try {
+ $user = $context->getUser();
+ if ( !$user->isLoggedIn() ) {
+ $this->setLastError( "Could not load the author user from session." );
+
+ return false;
+ }
+
+ if ( count( $_SESSION ) === 0 ) {
+ // Empty session probably indicates that we didn't associate
+ // with the session correctly. Note that being able to load
+ // the user does not necessarily mean the session was loaded.
+ // Most likely cause by suhosin.session.encrypt = On.
+ $this->setLastError( "Error associating with user session. " .
+ "Try setting suhosin.session.encrypt = Off" );
+
+ return false;
+ }
+
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
+ );
+
+ $upload = new UploadFromChunks( $user );
+ $upload->continueChunks(
+ $this->params['filename'],
+ $this->params['filekey'],
+ $context->getRequest()
+ );
+
+ // Combine all of the chunks into a local file and upload that to a new stash file
+ $status = $upload->concatenateChunks();
+ if ( !$status->isGood() ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
+ );
+ $this->setLastError( $status->getWikiText() );
+
+ return false;
+ }
+
+ // We have a new filekey for the fully concatenated file
+ $newFileKey = $upload->getLocalFile()->getFileKey();
+
+ // Remove the old stash file row and first chunk file
+ $upload->stash->removeFileNoAuth( $this->params['filekey'] );
+
+ // Build the image info array while we have the local reference handy
+ $apiMain = new ApiMain(); // dummy object (XXX)
+ $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+ // Cleanup any temporary local file
+ $upload->cleanupTempFile();
+
+ // Cache the info so the user doesn't have to wait forever to get the final info
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Success',
+ 'stage' => 'assembling',
+ 'filekey' => $newFileKey,
+ 'imageinfo' => $imageInfo,
+ 'status' => Status::newGood()
+ )
+ );
+ } catch ( MWException $e ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Failure',
+ 'stage' => 'assembling',
+ 'status' => Status::newFatal( 'api-error-stashfailed' )
+ )
+ );
+ $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ if ( is_array( $info['params'] ) ) {
+ $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+ }
+
+ return $info;
+ }
+
+ public function allowRetries() {
+ return false;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job to fix double redirects after moving a page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job to fix double redirects after moving a page
+ *
+ * @ingroup JobQueue
+ */
+class DoubleRedirectJob extends Job {
+ /** @var string Reason for the change, 'maintenance' or 'move'. Suffix fo
+ * message key 'double-redirect-fixed-'.
+ */
+ private $reason;
+
+ /** @var Title The title which has changed, redirects pointing to this
+ * title are fixed
+ */
+ private $redirTitle;
+
+ /** @var User */
+ private static $user;
+
+ /**
+ * Insert jobs into the job queue to fix redirects to the given title
+ * @param string $reason the reason for the fix, see message
+ * "double-redirect-fixed-<reason>"
+ * @param $redirTitle Title: the title which has changed, redirects
+ * pointing to this title are fixed
+ * @param bool $destTitle Not used
+ */
+ public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
+ # Need to use the master to get the redirect table updated in the same transaction
+ $dbw = wfGetDB( DB_MASTER );
+ $res = $dbw->select(
+ array( 'redirect', 'page' ),
+ array( 'page_namespace', 'page_title' ),
+ array(
+ 'page_id = rd_from',
+ 'rd_namespace' => $redirTitle->getNamespace(),
+ 'rd_title' => $redirTitle->getDBkey()
+ ), __METHOD__ );
+ if ( !$res->numRows() ) {
+ return;
+ }
+ $jobs = array();
+ foreach ( $res as $row ) {
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ if ( !$title ) {
+ continue;
+ }
+
+ $jobs[] = new self( $title, array(
+ 'reason' => $reason,
+ 'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
+ # Avoid excessive memory usage
+ if ( count( $jobs ) > 10000 ) {
+ JobQueueGroup::singleton()->push( $jobs );
+ $jobs = array();
+ }
+ }
+ JobQueueGroup::singleton()->push( $jobs );
+ }
+
+ /**
+ * @param Title $title
+ * @param array|bool $params
+ * @param int $id
+ */
+ function __construct( $title, $params = false ) {
+ parent::__construct( 'fixDoubleRedirect', $title, $params );
+ $this->reason = $params['reason'];
+ $this->redirTitle = Title::newFromText( $params['redirTitle'] );
+ }
+
+ /**
+ * @return bool
+ */
+ function run() {
+ if ( !$this->redirTitle ) {
+ $this->setLastError( 'Invalid title' );
+
+ return false;
+ }
+
+ $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
+ if ( !$targetRev ) {
+ wfDebug( __METHOD__ . ": target redirect already deleted, ignoring\n" );
+
+ return true;
+ }
+ $content = $targetRev->getContent();
+ $currentDest = $content ? $content->getRedirectTarget() : null;
+ if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
+ wfDebug( __METHOD__ . ": Redirect has changed since the job was queued\n" );
+
+ return true;
+ }
+
+ // Check for a suppression tag (used e.g. in periodically archived discussions)
+ $mw = MagicWord::get( 'staticredirect' );
+ if ( $content->matchMagicWord( $mw ) ) {
+ wfDebug( __METHOD__ . ": skipping: suppressed with __STATICREDIRECT__\n" );
+
+ return true;
+ }
+
+ // Find the current final destination
+ $newTitle = self::getFinalDestination( $this->redirTitle );
+ if ( !$newTitle ) {
+ wfDebug( __METHOD__ .
+ ": skipping: single redirect, circular redirect or invalid redirect destination\n" );
+
+ return true;
+ }
+ if ( $newTitle->equals( $this->redirTitle ) ) {
+ // The redirect is already right, no need to change it
+ // This can happen if the page was moved back (say after vandalism)
+ wfDebug( __METHOD__ . " : skipping, already good\n" );
+ }
+
+ // Preserve fragment (bug 14904)
+ $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
+ $currentDest->getFragment(), $newTitle->getInterwiki() );
+
+ // Fix the text
+ $newContent = $content->updateRedirect( $newTitle );
+
+ if ( $newContent->equals( $content ) ) {
+ $this->setLastError( 'Content unchanged???' );
+
+ return false;
+ }
+
+ $user = $this->getUser();
+ if ( !$user ) {
+ $this->setLastError( 'Invalid user' );
+
+ return false;
+ }
+
+ // Save it
+ global $wgUser;
+ $oldUser = $wgUser;
+ $wgUser = $user;
+ $article = WikiPage::factory( $this->title );
+
+ // Messages: double-redirect-fixed-move, double-redirect-fixed-maintenance
+ $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
+ $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
+ )->inContentLanguage()->text();
+ $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $user );
+ $wgUser = $oldUser;
+
+ return true;
+ }
+
+ /**
+ * Get the final destination of a redirect
+ *
+ * @param $title Title
+ *
+ * @return bool if the specified title is not a redirect, or if it is a circular redirect
+ */
+ public static function getFinalDestination( $title ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ // Circular redirect check
+ $seenTitles = array();
+ $dest = false;
+
+ while ( true ) {
+ $titleText = $title->getPrefixedDBkey();
+ if ( isset( $seenTitles[$titleText] ) ) {
+ wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
+
+ return false;
+ }
+ $seenTitles[$titleText] = true;
+
+ if ( $title->isExternal() ) {
+ // If the target is interwiki, we have to break early (bug 40352).
+ // Otherwise it will look up a row in the local page table
+ // with the namespace/page of the interwiki target which can cause
+ // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
+ break;
+ }
+
+ $row = $dbw->selectRow(
+ array( 'redirect', 'page' ),
+ array( 'rd_namespace', 'rd_title', 'rd_interwiki' ),
+ array(
+ 'rd_from=page_id',
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey()
+ ), __METHOD__ );
+ if ( !$row ) {
+ # No redirect from here, chain terminates
+ break;
+ } else {
+ $dest = $title = Title::makeTitle(
+ $row->rd_namespace,
+ $row->rd_title,
+ '',
+ $row->rd_interwiki
+ );
+ }
+ }
+
+ return $dest;
+ }
+
+ /**
+ * Get a user object for doing edits, from a request-lifetime cache
+ * False will be returned if the user name specified in the
+ * 'double-redirect-fixer' message is invalid.
+ *
+ * @return User|bool
+ */
+ function getUser() {
+ if ( !self::$user ) {
+ $username = wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text();
+ self::$user = User::newFromName( $username );
+ # User::newFromName() can return false on a badly configured wiki.
+ if ( self::$user && !self::$user->isLoggedIn() ) {
+ self::$user->addToDatabase();
+ }
+ }
+
+ return self::$user;
+ }
+}
--- /dev/null
+<?php
+/**
+ * No-op job that does nothing.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * No-op job that does nothing. Used to represent duplicates.
+ *
+ * @ingroup JobQueue
+ */
+final class DuplicateJob extends Job {
+ /**
+ * Callers should use DuplicateJob::newFromJob() instead
+ *
+ * @param Title $title
+ * @param array $params job parameters
+ */
+ function __construct( $title, $params ) {
+ parent::__construct( 'duplicate', $title, $params );
+ }
+
+ /**
+ * Get a duplicate no-op version of a job
+ *
+ * @param Job $job
+ * @return Job
+ */
+ public static function newFromJob( Job $job ) {
+ $djob = new self( $job->getTitle(), $job->getParams() );
+ $djob->command = $job->getType();
+ $djob->params = is_array( $djob->params ) ? $djob->params : array();
+ $djob->params = array( 'isDuplicate' => true ) + $djob->params;
+ $djob->metadata = $job->metadata;
+
+ return $djob;
+ }
+
+ public function run() {
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Old job for notification emails.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Old job used for sending single notification emails;
+ * kept for backwards-compatibility
+ *
+ * @ingroup JobQueue
+ */
+class EmaillingJob extends Job {
+ function __construct( $title, $params ) {
+ parent::__construct( 'sendMail', Title::newMainPage(), $params );
+ }
+
+ function run() {
+ $status = UserMailer::send(
+ $this->params['to'],
+ $this->params['from'],
+ $this->params['subj'],
+ $this->params['body'],
+ $this->params['replyto']
+ );
+
+ return $status->isOK();
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job for notification emails.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job for email notification mails
+ *
+ * @ingroup JobQueue
+ */
+class EnotifNotifyJob extends Job {
+ function __construct( $title, $params ) {
+ parent::__construct( 'enotifNotify', $title, $params );
+ }
+
+ function run() {
+ $enotif = new EmailNotification();
+ // Get the user from ID (rename safe). Anons are 0, so defer to name.
+ if ( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
+ $editor = User::newFromId( $this->params['editorID'] );
+ // B/C, only the name might be given.
+ } else {
+ # @todo FIXME: newFromName could return false on a badly configured wiki.
+ $editor = User::newFromName( $this->params['editor'], false );
+ }
+ $enotif->actuallyNotifyOnPageChange(
+ $editor,
+ $this->title,
+ $this->params['timestamp'],
+ $this->params['summary'],
+ $this->params['minorEdit'],
+ $this->params['oldid'],
+ $this->params['watchers'],
+ $this->params['pageStatus']
+ );
+
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * HTML cache invalidation of all pages linking to a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * Job to purge the cache for all pages that link to or use another page or file
+ *
+ * This job comes in a few variants:
+ * - a) Recursive jobs to purge caches for backlink pages for a given title.
+ * These jobs have have (recursive:true,table:<table>) set.
+ * - b) Jobs to purge caches for a set of titles (the job title is ignored).
+ * These jobs have have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *
+ * @ingroup JobQueue
+ */
+class HTMLCacheUpdateJob extends Job {
+ function __construct( $title, $params = '' ) {
+ parent::__construct( 'htmlCacheUpdate', $title, $params );
+ // Base backlink purge jobs can be de-duplicated
+ $this->removeDuplicates = ( !isset( $params['range'] ) && !isset( $params['pages'] ) );
+ }
+
+ function run() {
+ global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery, $wgMaxBacklinksInvalidate;
+
+ static $expected = array( 'recursive', 'pages' ); // new jobs have one of these
+
+ $oldRangeJob = false;
+ if ( !array_intersect( array_keys( $this->params ), $expected ) ) {
+ // B/C for older job params formats that lack these fields:
+ // a) base jobs with just ("table") and b) range jobs with ("table","start","end")
+ if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
+ $oldRangeJob = true;
+ } else {
+ $this->params['recursive'] = true; // base job
+ }
+ }
+
+ // Job to purge all (or a range of) backlink pages for a page
+ if ( !empty( $this->params['recursive'] ) ) {
+ // @TODO: try to use delayed jobs if possible?
+ if ( !isset( $this->params['range'] ) && $wgMaxBacklinksInvalidate !== false ) {
+ $numRows = $this->title->getBacklinkCache()->getNumLinks(
+ $this->params['table'], $wgMaxBacklinksInvalidate );
+ if ( $numRows > $wgMaxBacklinksInvalidate ) {
+ return true;
+ }
+ }
+ // Convert this into no more than $wgUpdateRowsPerJob HTMLCacheUpdateJob per-title
+ // jobs and possibly a recursive HTMLCacheUpdateJob job for the rest of the backlinks
+ $jobs = BacklinkJobUtils::partitionBacklinkJob(
+ $this,
+ $wgUpdateRowsPerJob,
+ $wgUpdateRowsPerQuery, // jobs-per-title
+ // Carry over information for de-duplication
+ array( 'params' => $this->getRootJobParams() )
+ );
+ JobQueueGroup::singleton()->push( $jobs );
+ // Job to purge pages for for a set of titles
+ } elseif ( isset( $this->params['pages'] ) ) {
+ $this->invalidateTitles( $this->params['pages'] );
+ // B/C for job to purge a range of backlink pages for a given page
+ } elseif ( $oldRangeJob ) {
+ $titleArray = $this->title->getBacklinkCache()->getLinks(
+ $this->params['table'], $this->params['start'], $this->params['end'] );
+
+ $pages = array(); // same format BacklinkJobUtils uses
+ foreach ( $titleArray as $tl ) {
+ $pages[$tl->getArticleId()] = array( $tl->getNamespace(), $tl->getDbKey() );
+ }
+
+ $jobs = array();
+ foreach ( array_chunk( $pages, $wgUpdateRowsPerJob ) as $pageChunk ) {
+ $jobs[] = new HTMLCacheUpdateJob( $this->title,
+ array(
+ 'table' => $this->params['table'],
+ 'pages' => $pageChunk
+ ) + $this->getRootJobParams() // carry over information for de-duplication
+ );
+ }
+ JobQueueGroup::singleton()->push( $jobs );
+ }
+
+ return true;
+ }
+
+ /**
+ * @param array $pages Map of (page ID => (namespace, DB key)) entries
+ */
+ protected function invalidateTitles( array $pages ) {
+ global $wgUpdateRowsPerQuery, $wgUseFileCache, $wgUseSquid;
+
+ // Get all page IDs in this query into an array
+ $pageIds = array_keys( $pages );
+ if ( !$pageIds ) {
+ return;
+ }
+
+ $dbw = wfGetDB( DB_MASTER );
+
+ // The page_touched field will need to be bumped for these pages.
+ // Only bump it to the present time if no "rootJobTimestamp" was known.
+ // If it is known, it can be used instead, which avoids invalidating output
+ // that was in fact generated *after* the relevant dependency change time
+ // (e.g. template edit). This is particularily useful since refreshLinks jobs
+ // save back parser output and usually run along side htmlCacheUpdate jobs;
+ // their saved output would be invalidated by using the current timestamp.
+ if ( isset( $this->params['rootJobTimestamp'] ) ) {
+ $touchTimestamp = $this->params['rootJobTimestamp'];
+ } else {
+ $touchTimestamp = wfTimestampNow();
+ }
+
+ // Update page_touched (skipping pages already touched since the root job).
+ // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
+ foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
+ $dbw->update( 'page',
+ array( 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
+ array( 'page_id' => $batch,
+ // don't invalidated pages that were already invalidated
+ "page_touched < " . $dbw->addQuotes( $dbw->timestamp( $touchTimestamp ) )
+ ),
+ __METHOD__
+ );
+ }
+ // Get the list of affected pages (races only mean something else did the purge)
+ $titleArray = TitleArray::newFromResult( $dbw->select(
+ 'page',
+ array( 'page_namespace', 'page_title' ),
+ array( 'page_id' => $pageIds, 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
+ __METHOD__
+ ) );
+
+ // Update squid
+ if ( $wgUseSquid ) {
+ $u = SquidUpdate::newFromTitles( $titleArray );
+ $u->doUpdate();
+ }
+
+ // Update file cache
+ if ( $wgUseFileCache ) {
+ foreach ( $titleArray as $title ) {
+ HTMLFileCache::clearFileCache( $title );
+ }
+ }
+ }
+
+ public function workItemCount() {
+ return isset( $this->params['pages'] ) ? count( $this->params['pages'] ) : 1;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Degenerate job that does nothing.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * Degenerate job that does nothing, but can optionally replace itself
+ * in the queue and/or sleep for a brief time period. These can be used
+ * to represent "no-op" jobs or test lock contention and performance.
+ *
+ * @par Example:
+ * Inserting a null job in the configured job queue:
+ * @code
+ * $ php maintenance/eval.php
+ * > $queue = JobQueueGroup::singleton();
+ * > $job = new NullJob( Title::newMainPage(), array( 'lives' => 10 ) );
+ * > $queue->push( $job );
+ * @endcode
+ * You can then confirm the job has been enqueued by using the showJobs.php
+ * maintenance utility:
+ * @code
+ * $ php maintenance/showJobs.php --group
+ * null: 1 queue; 0 claimed (0 active, 0 abandoned)
+ * $
+ * @endcode
+ *
+ * @ingroup JobQueue
+ */
+class NullJob extends Job {
+ /**
+ * @param Title $title
+ * @param array $params job parameters (lives, usleep)
+ */
+ function __construct( $title, $params ) {
+ parent::__construct( 'null', $title, $params );
+ if ( !isset( $this->params['lives'] ) ) {
+ $this->params['lives'] = 1;
+ }
+ if ( !isset( $this->params['usleep'] ) ) {
+ $this->params['usleep'] = 0;
+ }
+ $this->removeDuplicates = !empty( $this->params['removeDuplicates'] );
+ }
+
+ public function run() {
+ if ( $this->params['usleep'] > 0 ) {
+ usleep( $this->params['usleep'] );
+ }
+ if ( $this->params['lives'] > 1 ) {
+ $params = $this->params;
+ $params['lives']--;
+ $job = new self( $this->title, $params );
+ JobQueueGroup::singleton()->push( $job );
+ }
+
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * @ingroup Upload
+ */
+class PublishStashedFileJob extends Job {
+ public function __construct( $title, $params ) {
+ parent::__construct( 'PublishStashedFile', $title, $params );
+ $this->removeDuplicates = true;
+ }
+
+ public function run() {
+ $scope = RequestContext::importScopedSession( $this->params['session'] );
+ $context = RequestContext::getMain();
+ try {
+ $user = $context->getUser();
+ if ( !$user->isLoggedIn() ) {
+ $this->setLastError( "Could not load the author user from session." );
+
+ return false;
+ }
+
+ if ( count( $_SESSION ) === 0 ) {
+ // Empty session probably indicates that we didn't associate
+ // with the session correctly. Note that being able to load
+ // the user does not necessarily mean the session was loaded.
+ // Most likely cause by suhosin.session.encrypt = On.
+ $this->setLastError( "Error associating with user session. " .
+ "Try setting suhosin.session.encrypt = Off" );
+
+ return false;
+ }
+
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
+ );
+
+ $upload = new UploadFromStash( $user );
+ // @todo initialize() causes a GET, ideally we could frontload the antivirus
+ // checks and anything else to the stash stage (which includes concatenation and
+ // the local file is thus already there). That way, instead of GET+PUT, there could
+ // just be a COPY operation from the stash to the public zone.
+ $upload->initialize( $this->params['filekey'], $this->params['filename'] );
+
+ // Check if the local file checks out (this is generally a no-op)
+ $verification = $upload->verifyUpload();
+ if ( $verification['status'] !== UploadBase::OK ) {
+ $status = Status::newFatal( 'verification-error' );
+ $status->value = array( 'verification' => $verification );
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+ );
+ $this->setLastError( "Could not verify upload." );
+
+ return false;
+ }
+
+ // Upload the stashed file to a permanent location
+ $status = $upload->performUpload(
+ $this->params['comment'],
+ $this->params['text'],
+ $this->params['watch'],
+ $user
+ );
+ if ( !$status->isGood() ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+ );
+ $this->setLastError( $status->getWikiText() );
+
+ return false;
+ }
+
+ // Build the image info array while we have the local reference handy
+ $apiMain = new ApiMain(); // dummy object (XXX)
+ $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+ // Cleanup any temporary local file
+ $upload->cleanupTempFile();
+
+ // Cache the info so the user doesn't have to wait forever to get the final info
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Success',
+ 'stage' => 'publish',
+ 'filename' => $upload->getLocalFile()->getName(),
+ 'imageinfo' => $imageInfo,
+ 'status' => Status::newGood()
+ )
+ );
+ } catch ( MWException $e ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Failure',
+ 'stage' => 'publish',
+ 'status' => Status::newFatal( 'api-error-publishfailed' )
+ )
+ );
+ $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ if ( is_array( $info['params'] ) ) {
+ $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+ }
+
+ return $info;
+ }
+
+ public function allowRetries() {
+ return false;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job to update link tables for pages
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job to update link tables for pages
+ *
+ * This job comes in a few variants:
+ * - a) Recursive jobs to update links for backlink pages for a given title.
+ * These jobs have have (recursive:true,table:<table>) set.
+ * - b) Jobs to update links for a set of pages (the job title is ignored).
+ * These jobs have have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ * - c) Jobs to update links for a single page (the job title)
+ * These jobs need no extra fields set.
+ *
+ * @ingroup JobQueue
+ */
+class RefreshLinksJob extends Job {
+ const PARSE_THRESHOLD_SEC = 1.0;
+
+ function __construct( $title, $params = '' ) {
+ parent::__construct( 'refreshLinks', $title, $params );
+ // Base backlink update jobs and per-title update jobs can be de-duplicated.
+ // If template A changes twice before any jobs run, a clean queue will have:
+ // (A base, A base)
+ // The second job is ignored by the queue on insertion.
+ // Suppose, many pages use template A, and that template itself uses template B.
+ // An edit to both will first create two base jobs. A clean FIFO queue will have:
+ // (A base, B base)
+ // When these jobs run, the queue will have per-title and remnant partition jobs:
+ // (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
+ // Some these jobs will be the same, and will automatically be ignored by
+ // the queue upon insertion. Some title jobs will run before the duplicate is
+ // inserted, so the work will still be done twice in those cases. More titles
+ // can be de-duplicated as the remnant jobs continue to be broken down. This
+ // works best when $wgUpdateRowsPerJob, and either the pages have few backlinks
+ // and/or the backlink sets for pages A and B are almost identical.
+ $this->removeDuplicates = !isset( $params['range'] )
+ && ( !isset( $params['pages'] ) || count( $params['pages'] ) == 1 );
+ }
+
+ function run() {
+ global $wgUpdateRowsPerJob;
+
+ // Job to update all (or a range of) backlink pages for a page
+ if ( !empty( $this->params['recursive'] ) ) {
+ // Carry over information for de-duplication
+ $extraParams = $this->getRootJobParams();
+ // Avoid slave lag when fetching templates.
+ // When the outermost job is run, we know that the caller that enqueued it must have
+ // committed the relevant changes to the DB by now. At that point, record the master
+ // position and pass it along as the job recursively breaks into smaller range jobs.
+ // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
+ if ( isset( $this->params['masterPos'] ) ) {
+ $extraParams['masterPos'] = $this->params['masterPos'];
+ } elseif ( wfGetLB()->getServerCount() > 1 ) {
+ $extraParams['masterPos'] = wfGetLB()->getMasterPos();
+ } else {
+ $extraParams['masterPos'] = false;
+ }
+ // Convert this into no more than $wgUpdateRowsPerJob RefreshLinks per-title
+ // jobs and possibly a recursive RefreshLinks job for the rest of the backlinks
+ $jobs = BacklinkJobUtils::partitionBacklinkJob(
+ $this,
+ $wgUpdateRowsPerJob,
+ 1, // job-per-title
+ array( 'params' => $extraParams )
+ );
+ JobQueueGroup::singleton()->push( $jobs );
+ // Job to update link tables for for a set of titles
+ } elseif ( isset( $this->params['pages'] ) ) {
+ foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
+ list( $ns, $dbKey ) = $nsAndKey;
+ $this->runForTitle( Title::makeTitleSafe( $ns, $dbKey ) );
+ }
+ // Job to update link tables for a given title
+ } else {
+ $this->runForTitle( $this->title );
+ }
+
+ return true;
+ }
+
+ protected function runForTitle( Title $title = null ) {
+ $linkCache = LinkCache::singleton();
+ $linkCache->clear();
+
+ if ( is_null( $title ) ) {
+ $this->setLastError( "refreshLinks: Invalid title" );
+ return false;
+ }
+
+ // Wait for the DB of the current/next slave DB handle to catch up to the master.
+ // This way, we get the correct page_latest for templates or files that just changed
+ // milliseconds ago, having triggered this job to begin with.
+ if ( isset( $this->params['masterPos'] ) && $this->params['masterPos'] !== false ) {
+ wfGetLB()->waitFor( $this->params['masterPos'] );
+ }
+
+ $page = WikiPage::factory( $title );
+
+ // Fetch the current revision...
+ $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
+ if ( !$revision ) {
+ $this->setLastError( "refreshLinks: Article not found {$title->getPrefixedDBkey()}" );
+ return false; // XXX: what if it was just deleted?
+ }
+ $content = $revision->getContent( Revision::RAW );
+ if ( !$content ) {
+ // If there is no content, pretend the content is empty
+ $content = $revision->getContentHandler()->makeEmptyContent();
+ }
+
+ $parserOutput = false;
+ $parserOptions = $page->makeParserOptions( 'canonical' );
+ // If page_touched changed after this root job (with a good slave lag skew factor),
+ // then it is likely that any views of the pages already resulted in re-parses which
+ // are now in cache. This can be reused to avoid expensive parsing in some cases.
+ if ( isset( $this->params['rootJobTimestamp'] ) ) {
+ $skewedTimestamp = wfTimestamp( TS_UNIX, $this->params['rootJobTimestamp'] ) + 5;
+ if ( $page->getLinksTimestamp() > wfTimestamp( TS_MW, $skewedTimestamp ) ) {
+ // Something already updated the backlinks since this job was made
+ return true;
+ }
+ if ( $page->getTouched() > wfTimestamp( TS_MW, $skewedTimestamp ) ) {
+ $parserOutput = ParserCache::singleton()->getDirty( $page, $parserOptions );
+ if ( $parserOutput && $parserOutput->getCacheTime() <= $skewedTimestamp ) {
+ $parserOutput = false; // too stale
+ }
+ }
+ }
+ // Fetch the current revision and parse it if necessary...
+ if ( $parserOutput == false ) {
+ $start = microtime( true );
+ // Revision ID must be passed to the parser output to get revision variables correct
+ $parserOutput = $content->getParserOutput(
+ $title, $revision->getId(), $parserOptions, false );
+ $ellapsed = microtime( true ) - $start;
+ // If it took a long time to render, then save this back to the cache to avoid
+ // wasted CPU by other apaches or job runners. We don't want to always save to
+ // cache as this cause cause high cache I/O and LRU churn when a template changes.
+ if ( $ellapsed >= self::PARSE_THRESHOLD_SEC
+ && $page->isParserCacheUsed( $parserOptions, $revision->getId() )
+ && $parserOutput->isCacheable()
+ ) {
+ $ctime = wfTimestamp( TS_MW, (int)$start ); // cache time
+ ParserCache::singleton()->save( $parserOutput, $page, $parserOptions, $ctime );
+ }
+ }
+
+ $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
+ DataUpdate::runUpdates( $updates );
+
+ InfoAction::invalidateCache( $title );
+
+ return true;
+ }
+
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ if ( is_array( $info['params'] ) ) {
+ // Don't let highly unique "masterPos" values ruin duplicate detection
+ unset( $info['params']['masterPos'] );
+ // For per-pages jobs, the job title is that of the template that changed
+ // (or similar), so remove that since it ruins duplicate detection
+ if ( isset( $info['pages'] ) ) {
+ unset( $info['namespace'] );
+ unset( $info['title'] );
+ }
+ }
+
+ return $info;
+ }
+
+ public function workItemCount() {
+ return isset( $this->params['pages'] ) ? count( $this->params['pages'] ) : 1;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job to update links for a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Background job to update links for titles in certain backlink range by page ID.
+ * Newer version for high use templates. This is deprecated by RefreshLinksPartitionJob.
+ *
+ * @ingroup JobQueue
+ * @deprecated 1.23
+ */
+class RefreshLinksJob2 extends Job {
+ function __construct( $title, $params ) {
+ parent::__construct( 'refreshLinks2', $title, $params );
+ // Base jobs for large templates can easily be de-duplicated
+ $this->removeDuplicates = !isset( $params['start'] ) && !isset( $params['end'] );
+ }
+
+ /**
+ * Run a refreshLinks2 job
+ * @return boolean success
+ */
+ function run() {
+ global $wgUpdateRowsPerJob;
+
+ $linkCache = LinkCache::singleton();
+ $linkCache->clear();
+
+ if ( is_null( $this->title ) ) {
+ $this->error = "refreshLinks2: Invalid title";
+ return false;
+ }
+
+ // Back compat for pre-r94435 jobs
+ $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
+
+ // Avoid slave lag when fetching templates.
+ // When the outermost job is run, we know that the caller that enqueued it must have
+ // committed the relevant changes to the DB by now. At that point, record the master
+ // position and pass it along as the job recursively breaks into smaller range jobs.
+ // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
+ if ( isset( $this->params['masterPos'] ) ) {
+ $masterPos = $this->params['masterPos'];
+ } elseif ( wfGetLB()->getServerCount() > 1 ) {
+ $masterPos = wfGetLB()->getMasterPos();
+ } else {
+ $masterPos = false;
+ }
+
+ $tbc = $this->title->getBacklinkCache();
+
+ $jobs = array(); // jobs to insert
+ if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
+ # This is a partition job to trigger the insertion of leaf jobs...
+ $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
+ } else {
+ # This is a base job to trigger the insertion of partitioned jobs...
+ if ( $tbc->getNumLinks( $table, $wgUpdateRowsPerJob + 1 ) <= $wgUpdateRowsPerJob ) {
+ # Just directly insert the single per-title jobs
+ $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
+ } else {
+ # Insert the partition jobs to make per-title jobs
+ foreach ( $tbc->partition( $table, $wgUpdateRowsPerJob ) as $batch ) {
+ list( $start, $end ) = $batch;
+ $jobs[] = new RefreshLinksJob2( $this->title,
+ array(
+ 'table' => $table,
+ 'start' => $start,
+ 'end' => $end,
+ 'masterPos' => $masterPos,
+ ) + $this->getRootJobParams() // carry over information for de-duplication
+ );
+ }
+ }
+ }
+
+ if ( count( $jobs ) ) {
+ JobQueueGroup::singleton()->push( $jobs );
+ }
+
+ return true;
+ }
+
+ /**
+ * @param $table string
+ * @param $masterPos mixed
+ * @return Array
+ */
+ protected function getSingleTitleJobs( $table, $masterPos ) {
+ # The "start"/"end" fields are not set for the base jobs
+ $start = isset( $this->params['start'] ) ? $this->params['start'] : false;
+ $end = isset( $this->params['end'] ) ? $this->params['end'] : false;
+ $titles = $this->title->getBacklinkCache()->getLinks( $table, $start, $end );
+ # Convert into single page refresh links jobs.
+ # This handles well when in sapi mode and is useful in any case for job
+ # de-duplication. If many pages use template A, and that template itself
+ # uses template B, then an edit to both will create many duplicate jobs.
+ # Roughly speaking, for each page, one of the "RefreshLinksJob" jobs will
+ # get run first, and when it does, it will remove the duplicates. Of course,
+ # one page could have its job popped when the other page's job is still
+ # buried within the logic of a refreshLinks2 job.
+ $jobs = array();
+ foreach ( $titles as $title ) {
+ $jobs[] = new RefreshLinksJob( $title,
+ array( 'masterPos' => $masterPos ) + $this->getRootJobParams()
+ ); // carry over information for de-duplication
+ }
+ return $jobs;
+ }
+
+ /**
+ * @return Array
+ */
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ // Don't let highly unique "masterPos" values ruin duplicate detection
+ if ( is_array( $info['params'] ) ) {
+ unset( $info['params']['masterPos'] );
+ }
+ return $info;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This job is in fact an interface to UploadFromUrl, which is designed such
+ * that it does not require any globals. If it does, fix it elsewhere, do not
+ * add globals in here.
+ *
+ * @ingroup JobQueue
+ */
+class UploadFromUrlJob extends Job {
+ const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
+
+ /** @var UploadFromUrl */
+ public $upload;
+
+ /** @var User */
+ protected $user;
+
+ public function __construct( $title, $params ) {
+ parent::__construct( 'uploadFromUrl', $title, $params );
+ }
+
+ public function run() {
+ global $wgCopyUploadAsyncTimeout;
+ # Initialize this object and the upload object
+ $this->upload = new UploadFromUrl();
+ $this->upload->initialize(
+ $this->title->getText(),
+ $this->params['url'],
+ false
+ );
+ $this->user = User::newFromName( $this->params['userName'] );
+
+ # Fetch the file
+ $opts = array();
+ if ( $wgCopyUploadAsyncTimeout ) {
+ $opts['timeout'] = $wgCopyUploadAsyncTimeout;
+ }
+ $status = $this->upload->fetchFile( $opts );
+ if ( !$status->isOk() ) {
+ $this->leaveMessage( $status );
+
+ return true;
+ }
+
+ # Verify upload
+ $result = $this->upload->verifyUpload();
+ if ( $result['status'] != UploadBase::OK ) {
+ $status = $this->upload->convertVerifyErrorToStatus( $result );
+ $this->leaveMessage( $status );
+
+ return true;
+ }
+
+ # Check warnings
+ if ( !$this->params['ignoreWarnings'] ) {
+ $warnings = $this->upload->checkWarnings();
+ if ( $warnings ) {
+
+ # Stash the upload
+ $key = $this->upload->stashFile();
+
+ // @todo FIXME: This has been broken for a while.
+ // User::leaveUserMessage() does not exist.
+ if ( $this->params['leaveMessage'] ) {
+ $this->user->leaveUserMessage(
+ wfMessage( 'upload-warning-subj' )->text(),
+ wfMessage( 'upload-warning-msg',
+ $key,
+ $this->params['url'] )->text()
+ );
+ } else {
+ wfSetupSession( $this->params['sessionId'] );
+ $this->storeResultInSession( 'Warning',
+ 'warnings', $warnings );
+ session_write_close();
+ }
+
+ return true;
+ }
+ }
+
+ # Perform the upload
+ $status = $this->upload->performUpload(
+ $this->params['comment'],
+ $this->params['pageText'],
+ $this->params['watch'],
+ $this->user
+ );
+ $this->leaveMessage( $status );
+
+ return true;
+ }
+
+ /**
+ * Leave a message on the user talk page or in the session according to
+ * $params['leaveMessage'].
+ *
+ * @param Status $status
+ */
+ protected function leaveMessage( $status ) {
+ if ( $this->params['leaveMessage'] ) {
+ if ( $status->isGood() ) {
+ // @todo FIXME: user->leaveUserMessage does not exist.
+ $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
+ wfMessage( 'upload-success-msg',
+ $this->upload->getTitle()->getText(),
+ $this->params['url']
+ )->text() );
+ } else {
+ // @todo FIXME: user->leaveUserMessage does not exist.
+ $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
+ wfMessage( 'upload-failure-msg',
+ $status->getWikiText(),
+ $this->params['url']
+ )->text() );
+ }
+ } else {
+ wfSetupSession( $this->params['sessionId'] );
+ if ( $status->isOk() ) {
+ $this->storeResultInSession( 'Success',
+ 'filename', $this->upload->getLocalFile()->getName() );
+ } else {
+ $this->storeResultInSession( 'Failure',
+ 'errors', $status->getErrorsArray() );
+ }
+ session_write_close();
+ }
+ }
+
+ /**
+ * Store a result in the session data. Note that the caller is responsible
+ * for appropriate session_start and session_write_close calls.
+ *
+ * @param string $result the result (Success|Warning|Failure)
+ * @param string $dataKey the key of the extra data
+ * @param mixed $dataValue The extra data itself
+ */
+ protected function storeResultInSession( $result, $dataKey, $dataValue ) {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $session['result'] = $result;
+ $session[$dataKey] = $dataValue;
+ }
+
+ /**
+ * Initialize the session data. Sets the intial result to queued.
+ */
+ public function initializeSessionData() {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $$session['result'] = 'Queued';
+ }
+
+ /**
+ * @param $key
+ * @return mixed
+ */
+ public static function &getSessionData( $key ) {
+ if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
+ $_SESSION[self::SESSION_KEYNAME][$key] = array();
+ }
+
+ return $_SESSION[self::SESSION_KEYNAME][$key];
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job to update links for a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class with Backlink related Job helper methods
+ *
+ * @ingroup JobQueue
+ * @since 1.23
+ */
+class BacklinkJobUtils {
+ /**
+ * Break down $job into approximately ($bSize/$cSize) leaf jobs and a single partition
+ * job that covers the remaining backlink range (if needed). Jobs for the first $bSize
+ * titles are collated ($cSize per job) into leaf jobs to do actual work. All the
+ * resulting jobs are of the same class as $job. No partition job is returned if the
+ * range covered by $job was less than $bSize, as the leaf jobs have full coverage.
+ *
+ * The leaf jobs have the 'pages' param set to a (<page ID>:(<namespace>,<DB key>),...)
+ * map so that the run() function knows what pages to act on. The leaf jobs will keep
+ * the same job title as the parent job (e.g. $job).
+ *
+ * The partition jobs have the 'range' parameter set to a map of the format
+ * (start:<integer>, end:<integer>, batchSize:<integer>, subranges:((<start>,<end>),...)),
+ * the 'table' parameter set to that of $job, and the 'recursive' parameter set to true.
+ * This method can be called on the resulting job to repeat the process again.
+ *
+ * The job provided ($job) must have the 'recursive' parameter set to true and the 'table'
+ * parameter must be set to a backlink table. The job title will be used as the title to
+ * find backlinks for. Any 'range' parameter must follow the same format as mentioned above.
+ * This should be managed by recursive calls to this method.
+ *
+ * The first jobs return are always the leaf jobs. This lets the caller use push() to
+ * put them directly into the queue and works well if the queue is FIFO. In such a queue,
+ * the leaf jobs have to get finished first before anything can resolve the next partition
+ * job, which keeps the queue very small.
+ *
+ * $opts includes:
+ * - params : extra job parameters to include in each job
+ *
+ * @param Job $job
+ * @param int $bSize BacklinkCache partition size; usually $wgUpdateRowsPerJob
+ * @param int $cSize Max titles per leaf job; Usually 1 or a modest value
+ * @param array $opts Optional parameter map
+ * @return Job[] List of Job objects
+ */
+ public static function partitionBacklinkJob( Job $job, $bSize, $cSize, $opts = array() ) {
+ $class = get_class( $job );
+ $title = $job->getTitle();
+ $params = $job->getParams();
+
+ if ( isset( $params['pages'] ) || empty( $params['recursive'] ) ) {
+ $ranges = array(); // sanity; this is a leaf node
+ wfWarn( __METHOD__ . " called on {$job->getType()} leaf job (explosive recursion)." );
+ } elseif ( isset( $params['range'] ) ) {
+ // This is a range job to trigger the insertion of partitioned/title jobs...
+ $ranges = $params['range']['subranges'];
+ $realBSize = $params['range']['batchSize'];
+ } else {
+ // This is a base job to trigger the insertion of partitioned jobs...
+ $ranges = $title->getBacklinkCache()->partition( $params['table'], $bSize );
+ $realBSize = $bSize;
+ }
+
+ $extraParams = isset( $opts['params'] ) ? $opts['params'] : array();
+
+ $jobs = array();
+ // Combine the first range (of size $bSize) backlinks into leaf jobs
+ if ( isset( $ranges[0] ) ) {
+ list( $start, $end ) = $ranges[0];
+ $titles = $title->getBacklinkCache()->getLinks( $params['table'], $start, $end );
+ foreach ( array_chunk( iterator_to_array( $titles ), $cSize ) as $titleBatch ) {
+ $pages = array();
+ foreach ( $titleBatch as $tl ) {
+ $pages[$tl->getArticleId()] = array( $tl->getNamespace(), $tl->getDBKey() );
+ }
+ $jobs[] = new $class(
+ $title, // maintain parent job title
+ array( 'pages' => $pages ) + $extraParams
+ );
+ }
+ }
+ // Take all of the remaining ranges and build a partition job from it
+ if ( isset( $ranges[1] ) ) {
+ $jobs[] = new $class(
+ $title, // maintain parent job title
+ array(
+ 'recursive' => true,
+ 'table' => $params['table'],
+ 'range' => array(
+ 'start' => $ranges[1][0],
+ 'end' => $ranges[count( $ranges ) - 1][1],
+ 'batchSize' => $realBSize,
+ 'subranges' => array_slice( $ranges, 1 )
+ ),
+ ) + $extraParams
+ );
+ }
+
+ return $jobs;
+ }
+}
$rFlags = PREG_OFFSET_CAPTURE | PREG_SET_ORDER;
if ( preg_match_all( '/' . self::URL_REGEX . '/', $source, $matches, $rFlags ) ) {
foreach ( $matches as $match ) {
- $file = $path . $match['file'][0];
- // Only proceed if we can access the file
+ $url = $match['file'][0];
+
+ // Skip fully-qualified and protocol-relative URLs and data URIs
+ if ( substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME ) ) {
+ break;
+ }
+
+ $file = $path . $url;
+ // Skip non-existent files
if ( file_exists( $file ) ) {
- $files[] = $file;
+ break;
}
+
+ $files[] = $file;
}
}
return $files;
$url = $file . $query;
// Skip fully-qualified and protocol-relative URLs and data URIs
- $urlScheme = substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME );
- if ( $urlScheme ) {
+ if ( substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME ) ) {
return $url;
}
* Contain classes to list log entries
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Contain log classes
*
* Copyright © 2002, 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Contain classes to list log entries
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* DjVu image handler.
*
* Copyright © 2006 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* difference. Will run forever until it finds one or you kill it.
*
* Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Unicode normalization routines
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Approximate benchmark for some basic operations.
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* and supplementary files.
*
* Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* to test regression on mem usage (bug 28146)
*
* Copyright © 2004-2011 Brion Vibber <brion@wikimedia.org>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Should probably merge them for consistency.
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Classes to cache objects in PHP accelerators, SQL database or DBA files
*
* Copyright © 2003-2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Renders a thumbnail list of the given images, with optional captions.
* Full syntax documented on the wiki:
*
- * http://www.mediawiki.org/wiki/Help:Images#Gallery_syntax
+ * https://www.mediawiki.org/wiki/Help:Images#Gallery_syntax
*
* @todo break Parser::renderImageGallery out here too.
*
if ( substr( $m[0], 0, 3 ) === 'RFC' ) {
$keyword = 'RFC';
$urlmsg = 'rfcurl';
- $CssClass = 'mw-magiclink-rfc';
+ $cssClass = 'mw-magiclink-rfc';
$id = $m[4];
} elseif ( substr( $m[0], 0, 4 ) === 'PMID' ) {
$keyword = 'PMID';
$urlmsg = 'pubmedurl';
- $CssClass = 'mw-magiclink-pmid';
+ $cssClass = 'mw-magiclink-pmid';
$id = $m[4];
} else {
throw new MWException( __METHOD__ . ': unrecognised match type "' .
substr( $m[0], 0, 20 ) . '"' );
}
$url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
- return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $CssClass );
+ return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $cssClass );
} elseif ( isset( $m[5] ) && $m[5] !== '' ) {
# ISBN
$isbn = $m[5];
wfProfileOut( __METHOD__ );
return $s;
}
+
/**
* Get the rel attribute for a particular external link.
*
}
return null;
}
+
/**
* Get an associative array of additional HTML attributes appropriate for a
* particular external link. This currently may include rel => nofollow
# Strip external link markup
# @todo FIXME: Not tolerant to blank link text
- # I.E. [http://www.mediawiki.org] will render as [1] or something depending
+ # I.E. [https://www.mediawiki.org] will render as [1] or something depending
# on how many empty links there are on the page - need to figure that out.
$text = preg_replace( '/\[(?i:' . $this->mUrlProtocols . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
|| ( $flags & PPFrame::STRIP_COMMENTS )
) {
$out .= '';
- }
- # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
- # Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+ } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+ # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
+ # Not in RECOVER_COMMENTS mode (extractSections) though
$out .= $this->parser->insertStripItem( $contextNode->textContent );
- }
- # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
- else {
+ } else {
+ # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
$out .= $contextNode->textContent;
}
} elseif ( $contextNode->nodeName == 'ignore' ) {
$extNode->addChild( PPNode_Hash_Tree::newWithText( 'close', $close ) );
}
$accum->addNode( $extNode );
- }
-
- elseif ( $found == 'line-start' ) {
+ } elseif ( $found == 'line-start' ) {
// Is this the start of a heading?
// Line break belongs before the heading element in any case
if ( $fakeLineStart ) {
|| ( $flags & PPFrame::STRIP_COMMENTS )
) {
$out .= '';
- }
- # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
- # Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+ } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+ # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
+ # Not in RECOVER_COMMENTS mode (extractSections) though
$out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
- }
- # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
- else {
+ } else {
+ # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
$out .= $contextNode->firstChild->value;
}
} elseif ( $contextNode->name == 'ignore' ) {
$s .= '}';
return $s;
}
+
/**
* Returns true if there are no arguments in this frame
*
$bit = array_pop( $this->mWorkStack );
if ( !$bit ) {
- $this->debug( "Profiling error, !\$bit: $functionname\n" );
+ $this->debugGroup( 'profileerror', "Profiling error, !\$bit: $functionname" );
} else {
if ( $functionname == 'close' ) {
- $message = "Profile section ended by close(): {$bit[0]}";
- $this->debug( "$message\n" );
- $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+ if ( $bit[0] != '-total' ) {
+ $message = "Profile section ended by close(): {$bit[0]}";
+ $this->debugGroup( 'profileerror', $message );
+ $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+ }
} elseif ( $bit[0] != $functionname ) {
$message = "Profiling error: in({$bit[0]}), out($functionname)";
- $this->debug( "$message\n" );
+ $this->debugGroup( 'profileerror', $message );
$this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
}
$bit[] = $time;
list( $method, $realtime ) = $info;
$msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
}
- wfDebugLog( 'DBPerformance', $msg );
+ $this->debugGroup( 'DBPerformance', $msg );
}
unset( $this->mDBTrxHoldingLocks[$name] );
unset( $this->mDBTrxMethodTimes[$name] );
}
}
+ /**
+ * Add an entry in the debug log group
+ *
+ * @param string $group Group to send the message to
+ * @param string $s to output
+ */
+ function debugGroup( $group, $s ) {
+ if ( function_exists( 'wfDebugLog' ) ) {
+ wfDebugLog( $group, $s );
+ }
+ }
+
/**
* Get the content type sent out to the client.
* Used for profilers that output instead of store data.
// Check for unbalanced profileIn / profileOut calls.
// Bad entries are logged but not sent.
if ( $inName !== $outName ) {
- wfDebugLog( 'ProfilerUnbalanced', json_encode( array( $inName, $outName ) ) );
+ $this->debugGroup( 'ProfilerUnbalanced', json_encode( array( $inName, $outName ) ) );
return;
}
list( $ofname, /* $ocount */, $ortime, $octime ) = array_pop( $this->mWorkStack );
if ( !$ofname ) {
- $this->debug( "Profiling error: $functionname\n" );
+ $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
} else {
if ( $functionname == 'close' ) {
- $message = "Profile section ended by close(): {$ofname}";
- $functionname = $ofname;
- $this->debug( "$message\n" );
- $this->mCollated[$message] = $this->errorEntry;
- }
- elseif ( $ofname != $functionname ) {
+ if ( $ofname != '-total' ) {
+ $message = "Profile section ended by close(): {$ofname}";
+ $functionname = $ofname;
+ $this->debugGroup( 'profileerror', $message );
+ $this->mCollated[$message] = $this->errorEntry;
+ }
+ } elseif ( $ofname != $functionname ) {
$message = "Profiling error: in({$ofname}), out($functionname)";
- $this->debug( "$message\n" );
+ $this->debugGroup( 'profileerror', $message );
$this->mCollated[$message] = $this->errorEntry;
}
$elapsedcpu = $this->getTime( 'cpu' ) - $octime;
* @see RCFeedFormatter::getLine
*/
public function getLine( array $feed, RecentChange $rc, $actionComment ) {
- global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwiki,
+ global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwikis,
$wgCanonicalServer, $wgScript;
$attribs = $rc->getAttributes();
if ( $attribs['rc_type'] == RC_LOG ) {
$flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
}
- if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwiki !== false ) {
- $prefix = $wgLocalInterwiki;
+ if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwikis ) {
+ // we use the first entry in $wgLocalInterwikis in recent changes feeds
+ $prefix = $wgLocalInterwikis[0];
} elseif ( $feed['add_interwiki_prefix'] ) {
$prefix = $feed['add_interwiki_prefix'];
} else {
$wgEnableAPI, $wgEnableWriteAPI, $wgDBname,
$wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
$wgCookiePrefix, $wgResourceLoaderMaxQueryLength,
- $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion;
+ $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion,
+ $wgSearchType;
$mainPage = Title::newMainPage();
'wgScriptPath' => $wgScriptPath,
'wgScriptExtension' => $wgScriptExtension,
'wgScript' => $wgScript,
+ 'wgSearchType' => $wgSearchType,
'wgVariantArticlePath' => $wgVariantArticlePath,
// Force object to avoid "empty" associative array from
// becoming [] instead of {} in JS (bug 34604)
// seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
$moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
$mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
- // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
- // mw.loader.register()
+
if ( !count( $deps ) && $group === null && $source === 'local' ) {
+ // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
+ // mw.loader.register()
$registrations[] = array( $name, $mtime );
- }
- // Modules with dependencies but no group or foreign source pass three arguments
- // (name, timestamp, dependencies) to mw.loader.register()
- elseif ( $group === null && $source === 'local' ) {
+ } elseif ( $group === null && $source === 'local' ) {
+ // Modules with dependencies but no group or foreign source pass three arguments
+ // (name, timestamp, dependencies) to mw.loader.register()
$registrations[] = array( $name, $mtime, $deps );
- }
- // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
- // to mw.loader.register()
- elseif ( $source === 'local' ) {
+ } elseif ( $source === 'local' ) {
+ // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
+ // to mw.loader.register()
$registrations[] = array( $name, $mtime, $deps, $group );
- }
- // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
- // to mw.loader.register()
- else {
+ } else {
+ // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+ // to mw.loader.register()
$registrations[] = array( $name, $mtime, $deps, $group, $source );
}
}
return wfAppendQuery( wfScript( 'load' ), $query );
}
-
/**
* @param $context ResourceLoaderContext
* @return string
}
return '<span class="history-deleted">' . $link . '</span>';
}
+
/**
* Generate a user tool link cluster if the current user is allowed to view it
* @return string HTML
$lc = $this->legalSearchChars();
return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
}
+
/**
* Load up the appropriate search engine class for the currently
* active database backend, and return a configured instance.
$result->initFromTitle( $title );
return $result;
}
+
/**
* Return a new SearchResult and initializes it with a row.
*
return false;
}
}
+
/**
* A SearchResultSet wrapper for SearchEngine::getNearMatch
*/
class SearchNearMatchResultSet extends SearchResultSet {
private $fetched = false;
+
/**
* @param $match mixed Title if matched, else null
*/
public function __construct( $match ) {
$this->result = $match;
}
+
public function hasResult() {
return (bool)$this->result;
}
+
public function numRows() {
return $this->hasResults() ? 1 : 0;
}
+
public function next() {
if ( $this->fetched || !$this->result ) {
return false;
* MySQL search engine
*
* Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* Oracle search engine
*
* Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
$t = preg_replace( '/([-&|])/', '\\\\$1', $t );
return $t;
}
+
/**
* Create or update the search index record for the given page.
* Title and text should be pre-processed.
* PostgreSQL search engine
*
* Copyright © 2006-2007 Greg Sabino Mullane <greg@turnstep.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
$searchstring = $this->parseQuery( $term );
## We need a separate query here so gin does not complain about empty searches
- $SQL = "SELECT to_tsquery($searchstring)";
- $res = $this->db->query( $SQL );
+ $sql = "SELECT to_tsquery($searchstring)";
+ $res = $this->db->query( $sql );
if ( !$res ) {
## TODO: Better output (example to catch: one 'two)
die( "Sorry, that was not a valid search string. Please go back and try again" );
function update( $pageid, $title, $text ) {
## We don't want to index older revisions
- $SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN " .
+ $sql = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN " .
"(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
" ORDER BY rev_text_id DESC OFFSET 1)";
- $this->db->query( $SQL );
+ $this->db->query( $sql );
return true;
}
parent::__construct( $row );
$this->score = $row->score;
}
+
function getScore() {
return $this->score;
}
* @ingroup SpecialPage
*/
abstract class ChangesListSpecialPage extends SpecialPage {
- var $rcSubpage, $rcOptions; // @todo Rename these, make protected
- protected $customFilters;
+ /** @var string */
+ protected $rcSubpage;
- /**
- * The feed format to output as (either 'rss' or 'atom'), or null if no
- * feed output was requested
- *
- * @var string $feedFormat
- */
- protected $feedFormat;
+ /** @var FormOptions */
+ protected $rcOptions;
+
+ /** @var array */
+ protected $customFilters;
/**
* Main execution point
*/
public function execute( $subpage ) {
$this->rcSubpage = $subpage;
- $this->feedFormat = $this->including() ? null : $this->getRequest()->getVal( 'feed' );
- if ( $this->feedFormat !== 'atom' && $this->feedFormat !== 'rss' ) {
- $this->feedFormat = null;
- }
$this->setHeaders();
$this->outputHeader();
$this->addModules();
+ $rows = $this->getRows();
$opts = $this->getOptions();
- // Fetch results, prepare a batch link existence check query
- $conds = $this->buildMainQueryConds( $opts );
- $rows = $this->doMainQuery( $conds, $opts );
if ( $rows === false ) {
if ( !$this->including() ) {
$this->doHeader( $opts );
return;
}
- if ( !$this->feedFormat ) {
- $batch = new LinkBatch;
- foreach ( $rows as $row ) {
- $batch->add( NS_USER, $row->rc_user_text );
- $batch->add( NS_USER_TALK, $row->rc_user_text );
- $batch->add( $row->rc_namespace, $row->rc_title );
- }
- $batch->execute();
- }
- if ( $this->feedFormat ) {
- list( $changesFeed, $formatter ) = $this->getFeedObject( $this->feedFormat );
- /** @var ChangesFeed $changesFeed */
- $changesFeed->execute( $formatter, $rows, $this->checkLastModified( $this->feedFormat ), $opts );
- } else {
- $this->webOutput( $rows, $opts );
+ $batch = new LinkBatch;
+ foreach ( $rows as $row ) {
+ $batch->add( NS_USER, $row->rc_user_text );
+ $batch->add( NS_USER_TALK, $row->rc_user_text );
+ $batch->add( $row->rc_namespace, $row->rc_title );
}
+ $batch->execute();
+
+ $this->webOutput( $rows, $opts );
$rows->free();
}
+ /**
+ * Get the database result for this special page instance. Used by ApiFeedRecentChanges.
+ *
+ * @return bool|ResultWrapper Result or false
+ */
+ public function getRows() {
+ $opts = $this->getOptions();
+ $conds = $this->buildMainQueryConds( $opts );
+ return $this->doMainQuery( $conds, $opts );
+ }
+
/**
* Get the current FormOptions for this request
*
$out->addModules( 'mediawiki.special.changeslist.legend.js' );
}
- /**
- * Return an array with a ChangesFeed object and ChannelFeed object.
- *
- * This is intentionally not abstract not to require subclasses which don't
- * use feeds functionality to implement it.
- *
- * @param string $feedFormat Feed's format (either 'rss' or 'atom')
- * @return array
- */
- public function getFeedObject( $feedFormat ) {
- throw new MWException( "Not implemented" );
- }
-
- /**
- * Get last-modified date, for client caching. Not implemented by default
- * (returns current time).
- *
- * @param string $feedFormat
- * @return string|bool
- */
- public function checkLastModified( $feedFormat ) {
- return wfTimestampNow();
- }
-
protected function getGroupName() {
return 'changes';
}
function isListed() {
return $this->mListed;
}
+
/**
* Set whether this page is listed in Special:Specialpages, at run-time
* @since 1.3
function setListed( $listed ) {
return wfSetVar( $this->mListed, $listed );
}
+
/**
* Get or set whether this special page is listed in Special:SpecialPages
* @since 1.6
* Implements Special:Import
*
* Copyright © 2003,2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* 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
* @ingroup SpecialPage
*/
class SpecialRecentChanges extends ChangesListSpecialPage {
-
+ // @codingStandardsIgnoreStart Needed "useless" override to change parameters.
public function __construct( $name = 'Recentchanges', $restriction = '' ) {
parent::__construct( $name, $restriction );
}
+ // @codingStandardsIgnoreEnd
/**
* Main execution point
* @param string $subpage
*/
public function execute( $subpage ) {
+ // Backwards-compatibility: redirect to new feed URLs
+ $feedFormat = $this->getRequest()->getVal( 'feed' );
+ if ( !$this->including() && $feedFormat ) {
+ $query = $this->getFeedQuery();
+ $query['feedformat'] = $feedFormat === 'atom' ? 'atom' : 'rss';
+ $this->getOutput()->redirect( wfAppendQuery( wfScript( 'api' ), $query ) );
+ return;
+ }
+
// 10 seconds server-side caching max
$this->getOutput()->setSquidMaxage( 10 );
// Check if the client has a cached version
- $lastmod = $this->checkLastModified( $this->feedFormat );
+ $lastmod = $this->checkLastModified();
if ( $lastmod === false ) {
return;
}
}
public function validateOptions( FormOptions $opts ) {
- global $wgFeedLimit;
- $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
+ $opts->validateIntBounds( 'limit', 0, 5000 );
parent::validateOptions( $opts );
}
return $rows;
}
+ public function outputFeedLinks() {
+ $this->addFeedLinks( $this->getFeedQuery() );
+ }
+
/**
- * Output feed links.
+ * Get URL query parameters for action=feedrecentchanges API feed of current recent changes view.
+ *
+ * @return array
*/
- public function outputFeedLinks() {
- $feedQuery = $this->getFeedQuery();
- if ( $feedQuery !== '' ) {
- $this->getOutput()->setFeedAppendQuery( $feedQuery );
- } else {
- $this->getOutput()->setFeedAppendQuery( false );
- }
+ private function getFeedQuery() {
+ global $wgFeedLimit;
+ $query = array_filter( $this->getOptions()->getAllValues(), function ( $value ) {
+ // API handles empty parameters in a different way
+ return $value !== '';
+ } );
+ $query['action'] = 'feedrecentchanges';
+ if ( $query['limit'] > $wgFeedLimit ) {
+ $query['limit'] = $wgFeedLimit;
+ }
+ return $query;
}
/**
$limit = $opts['limit'];
- $showWatcherCount = $wgRCShowWatchingUsers && $this->getUser()->getOption( 'shownumberswatching' );
+ $showWatcherCount = $wgRCShowWatchingUsers
+ && $this->getUser()->getOption( 'shownumberswatching' );
$watcherCache = array();
$dbr = $this->getDB();
if ( $rows->numRows() === 0 ) {
$this->getOutput()->addHtml(
- '<div class="mw-changeslist-empty">' . $this->msg( 'recentchanges-noresult' )->parse() . '</div>'
+ '<div class="mw-changeslist-empty">' .
+ $this->msg( 'recentchanges-noresult' )->parse() .
+ '</div>'
);
} else {
$this->getOutput()->addHTML( $rclistOutput );
* Don't use this if we are using the patrol feature, patrol changes don't
* update the timestamp
*
- * @param string $feedFormat
* @return string|bool
*/
- public function checkLastModified( $feedFormat ) {
+ public function checkLastModified() {
$dbr = $this->getDB();
$lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
- if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
- if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
- # Client cache fresh and headers sent, nothing more to do.
- return false;
- }
- }
-
return $lastmod;
}
- /**
- * Return an array with a ChangesFeed object and ChannelFeed object.
- *
- * @param string $feedFormat Feed's format (either 'rss' or 'atom')
- * @return array
- */
- public function getFeedObject( $feedFormat ) {
- $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
- $formatter = $changesFeed->getFeedObject(
- $this->msg( 'recentchanges' )->inContentLanguage()->text(),
- $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
- $this->getPageTitle()->getFullURL()
- );
-
- return array( $changesFeed, $formatter );
- }
-
- /**
- * Get the query string to append to feed link URLs.
- *
- * @return string
- */
- public function getFeedQuery() {
- global $wgFeedLimit;
-
- $options = $this->getOptions()->getChangedValues();
-
- // wfArrayToCgi() omits options set to null or false
- foreach ( $options as &$value ) {
- if ( $value === false ) {
- $value = '0';
- }
- }
- unset( $value );
-
- if ( isset( $options['limit'] ) && $options['limit'] > $wgFeedLimit ) {
- $options['limit'] = $wgFeedLimit;
- }
-
- return wfArrayToCgi( $options );
- }
-
/**
* Creates the choose namespace selection
*
'hideliu' => 'rcshowhideliu',
'hidepatrolled' => 'rcshowhidepatr',
'hidemyself' => 'rcshowhidemine'
- );
+ );
$showhide = array( 'show', 'hide' );
* @ingroup SpecialPage
*/
class SpecialRecentChangesLinked extends SpecialRecentChanges {
- var $rclTargetTitle;
+ /** @var bool|Title */
+ protected $rclTargetTitle;
function __construct() {
parent::__construct( 'Recentchangeslinked' );
$outputPage = $this->getOutput();
$title = Title::newFromURL( $target );
if ( !$title || $title->isExternal() ) {
- $outputPage->addHtml( '<div class="errorbox">' . $this->msg( 'allpagesbadtitle' )->parse() . '</div>' );
+ $outputPage->addHtml( '<div class="errorbox">' . $this->msg( 'allpagesbadtitle' )
+ ->parse() . '</div>' );
return false;
}
$opts['tagfilter']
);
- if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) ) {
+ if ( !wfRunHooks( 'SpecialRecentChangesQuery',
+ array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) )
+ ) {
return false;
}
}
// field name prefixes for all the various tables we might want to join with
- $prefix = array( 'pagelinks' => 'pl', 'templatelinks' => 'tl', 'categorylinks' => 'cl', 'imagelinks' => 'il' );
+ $prefix = array(
+ 'pagelinks' => 'pl',
+ 'templatelinks' => 'tl',
+ 'categorylinks' => 'cl',
+ 'imagelinks' => 'il'
+ );
$subsql = array(); // SELECT statements to combine with UNION
foreach ( $link_tables as $link_table ) {
$pfx = $prefix[$link_table];
- // imagelinks and categorylinks tables have no xx_namespace field, and have xx_to instead of xx_title
+ // imagelinks and categorylinks tables have no xx_namespace field,
+ // and have xx_to instead of xx_title
if ( $link_table == 'imagelinks' ) {
$link_ns = NS_FILE;
} elseif ( $link_table == 'categorylinks' ) {
return $extraOpts;
}
- public function getFeedObject( $feedFormat ) {
- $feed = new ChangesFeed( $feedFormat, false );
- $feedObj = $feed->getFeedObject(
- $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
- ->inContentLanguage()->text(),
- $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
- $this->getPageTitle()->getFullURL()
- );
- return array( $feed, $feedObj );
- }
-
/**
* @return Title
*/
*/
static $UILabels = array(
'revision' => array(
- 'check-label' => 'revdelete-hide-text',
- 'success' => 'revdelete-success',
- 'failure' => 'revdelete-failure',
+ 'check-label' => 'revdelete-hide-text',
+ 'success' => 'revdelete-success',
+ 'failure' => 'revdelete-failure',
+ 'text' => 'revdelete-text-text',
),
'archive' => array(
- 'check-label' => 'revdelete-hide-text',
- 'success' => 'revdelete-success',
- 'failure' => 'revdelete-failure',
+ 'check-label' => 'revdelete-hide-text',
+ 'success' => 'revdelete-success',
+ 'failure' => 'revdelete-failure',
+ 'text' => 'revdelete-text-text',
),
'oldimage' => array(
- 'check-label' => 'revdelete-hide-image',
- 'success' => 'revdelete-success',
- 'failure' => 'revdelete-failure',
+ 'check-label' => 'revdelete-hide-image',
+ 'success' => 'revdelete-success',
+ 'failure' => 'revdelete-failure',
+ 'text' => 'revdelete-text-file',
),
'filearchive' => array(
- 'check-label' => 'revdelete-hide-image',
- 'success' => 'revdelete-success',
- 'failure' => 'revdelete-failure',
+ 'check-label' => 'revdelete-hide-image',
+ 'success' => 'revdelete-success',
+ 'failure' => 'revdelete-failure',
+ 'text' => 'revdelete-text-file',
),
'logging' => array(
- 'check-label' => 'revdelete-hide-name',
- 'success' => 'logdelete-success',
- 'failure' => 'logdelete-failure',
+ 'check-label' => 'revdelete-hide-name',
+ 'success' => 'logdelete-success',
+ 'failure' => 'logdelete-failure',
+ 'text' => 'logdelete-text',
),
);
* which will allow the user to choose new visibility settings.
*/
protected function showForm() {
- $UserAllowed = true;
+ $userAllowed = true;
if ( $this->typeName == 'logging' ) {
$this->getOutput()->addWikiMsg( 'logdelete-selected', $this->getLanguage()->formatNum( count( $this->ids ) ) );
if ( !$this->submitClicked ) {
throw new PermissionsError( 'suppressrevision' );
}
- $UserAllowed = false;
+ $userAllowed = false;
}
$numRevisions++;
$this->getOutput()->addHTML( $item->getHTML() );
$this->addUsageText();
// Normal sysops can always see what they did, but can't always change it
- if ( !$UserAllowed ) {
+ if ( !$userAllowed ) {
return;
}
* @todo FIXME: Wikimedia-specific policy text
*/
protected function addUsageText() {
- $this->getOutput()->addWikiMsg( 'revdelete-text' );
+ $this->getOutput()->wrapWikiMsg( "<strong>$1</strong>\n$2", $this->typeLabels['text'], 'revdelete-text-others' );
if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
$this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
}
$t = $result->getTitle();
- $titleSnippet = $result->getTitleSnippet( $terms );
+ $titleSnippet = $result->getTitleSnippet();
if ( $titleSnippet == '' ) {
$titleSnippet = null;
// format redirect if any
$redirectTitle = $result->getRedirectTitle();
- $redirectText = $result->getRedirectSnippet( $terms );
+ $redirectText = $result->getRedirectSnippet();
$redirect = '';
if ( !is_null( $redirectTitle ) ) {
if ( $redirectText == '' ) {
$this->getLanguage()->formatNum( $this->images ),
array( 'class' => 'mw-statistics-files' ) );
}
+
private function getEditStats() {
return Xml::openElement( 'tr' ) .
Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-edits' )->parse() ) .
$form->setSubmitText( $this->msg( 'upload-tryagain' )->escaped() );
$this->showUploadForm( $form );
}
+
/**
* Stashes the upload, shows the main form, but adds a "continue anyway button".
* Also checks whether there are actually warnings to display.
<section class="mw-form-header">
<?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
</section>
+ <!-- This element is used by the mediawiki.special.userlogin.signup.js module. -->
+ <div
+ id="mw-createacct-status-area"
+ <?php if ( $this->data['message'] ) { ?>
+ class="<?php echo $this->data['messagetype']; ?>box"
+ <?php } else { ?>
+ style="display: none;"
+ <?php } ?>
+ >
<?php if ( $this->data['message'] ) { ?>
- <div class="<?php $this->text( 'messagetype' ); ?>box">
<?php if ( $this->data['messagetype'] == 'error' ) { ?>
<strong><?php $this->msg( 'createacct-error' ); ?></strong>
<br />
<?php } ?>
<?php $this->html( 'message' ); ?>
- </div>
<?php } ?>
+ </div>
<div>
<label for='wpName2'>
echo 'checked="checked"';
} ?>
>
- <?php $this->msg( $inputItem['msg'] ); ?>
+ <?php $this->msgHtml( $inputItem['msg'] ); ?>
</label>
<?php
} else {
<div>
<?php
- echo Html::input( 'wpLoginAttempt', $this->getMsg( 'pt-login' )->text(), 'submit', array(
+ echo Html::input( 'wpLoginAttempt', $this->getMsg( 'pt-login-button' )->text(), 'submit', array(
'id' => 'wpLoginAttempt',
'tabindex' => '6',
'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-constructive'
return $this->mTitle;
} elseif ( $blackListedExtensions ||
( $wgCheckFileExtensions && $wgStrictFileExtensions &&
- !$this->checkFileExtensionList( $ext, $wgFileExtensions ) ) ) {
+ !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) ) ) {
$this->mBlackListedExtensions = $blackListedExtensions;
$this->mTitleError = self::FILETYPE_BADTYPE;
$this->mTitle = null;
return;
}
- global $wgDisableLangConversion, $wgDisableTitleConversion, $wgRequest,
- $wgUser;
+ global $wgDisableLangConversion, $wgDisableTitleConversion, $wgRequest;
$isredir = $wgRequest->getText( 'redirect', 'yes' );
$action = $wgRequest->getText( 'action' );
$linkconvert = $wgRequest->getText( 'linkconvert', 'yes' );
( $isredir == 'no'
|| $action == 'edit'
|| $action == 'submit'
- || $linkconvert == 'no'
- || $wgUser->getOption( 'noconvertlink' ) == 1 ) ) ) {
+ || $linkconvert == 'no' ) ) ) {
return;
}
'ф' => 'f', 'Ф' => 'F',
'ц' => 'c', 'Ц' => 'C',
'ў' => 'oʻ', 'Ў' => 'Oʻ',
- 'ц' => 'ts', 'Ц' => 'Ts', // note: at the beginning of a word and right after a consonant, only "s" is used
+ // note: at the beginning of a word and right after a consonant, only "s" is used
+ 'ц' => 'ts', 'Ц' => 'Ts',
'қ' => 'q', 'Қ' => 'Q',
'ё' => 'yo', 'Ё' => 'Yo',
'ю' => 'yu', 'Ю' => 'Yu',
'a' => 'а', 'A' => 'А',
'b' => 'б', 'B' => 'Б',
'd' => 'д', 'D' => 'Д',
- 'e' => 'э', 'E' => 'Э', // at the beginning of a word and after a vowel, "э" is used instead of "e" (see regex below)
+ // at the beginning of a word and after a vowel, "э" is used instead of "e"
+ // (see regex below)
+ 'e' => 'э', 'E' => 'Э',
'f' => 'ф', 'F' => 'Ф',
'g' => 'г', 'G' => 'Г',
'g‘' => 'ғ', 'G‘' => 'Ғ', 'gʻ' => 'ғ', 'Gʻ' => 'Ғ',
$text = str_replace( 'ye', 'е', $text );
$text = str_replace( 'Ye', 'Е', $text );
$text = str_replace( 'YE', 'Е', $text );
+ // "е" after consonants, otherwise "э" (see above)
$text = preg_replace( '/([BVGDJZYKLMNPRSTFXCWQʻ‘H])E/u', '$1Е', $text );
$text = preg_replace( '/([bvgdjzyklmnprstfxcwqʻ‘h])e/ui', '$1е', $text );
}
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''Geselekteerde {{PLURAL:$2|wysiging|wysigings}} vir [[:$1]]:'''",
'logdelete-selected' => "'''Geselekteerde {{PLURAL:$1|logboek aksie|logboek aksies}}:'''",
-'revdelete-text' => "'''Geskrapte wysigings en aksies sal in die geskiedenis en logboeke sigbaar bly, maar dele van die inhoud sal nie publiek toeganklik wees nie.'''
-Ander administrateurs van {{SITENAME}} kan steeds die verborge inhoud sien en die verwydering met behulp van die vorm ongedaan maak, tensy aanvullende beperkinge deur die stelseladministrateur opgelê is.",
'revdelete-confirm' => 'Bevestig asseblief dat u dit wil doen, dat u die nagevolge verstaan en dat u dit doen in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]].',
'revdelete-suppress-text' => "Verberging van weergawes mag '''slegs''' in die volgende gevalle gebruik word:
* Potensieel lasterlike inligting
'tog-ccmeonemails' => 'Më ço kopje të mesazheve qi ua dërgoj të tjerëve',
'tog-diffonly' => 'Mos e trego përmbajtjen e faqes nën ndryshimin',
'tog-showhiddencats' => 'Trego kategoritë e mshefta',
-'tog-noconvertlink' => 'Mos lejo konvertimin e titullit vegëz',
'tog-norollbackdiff' => 'Trego ndryshimin mbas procedurës së kthimit mbrapa',
'tog-useeditwarning' => 'Paralajmëron mua kur unë të lë një redakto faqe me ndryshimet e para shpëtimit',
'revdelete-no-file' => 'Skeda e dhënë nuk ekziston.',
'revdelete-selected' => "'''{{PLURAL:$2|Versioni i zgjedhur i|Versionet e zgjedhura të}} [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Veprimi i zgjedhur në regjistër|Veprimet e zgjedhura në regjistër}}:'''",
-'revdelete-text' => "'''Përmbajtja dhe pjesët e tjera nuk janë të dukshme për të gjithë, por figurojnë në historikun e versioneve.''' Administratorët munden përmbajtjen e larguar ta shikojnë dhe restaurojnë, përveç në rastet kur një gjë e tillë është ndaluar ekstra.",
'revdelete-legend' => 'Vendosni kufizimet për versionin:',
'revdelete-hide-text' => 'Fshihe tekstin e versionit',
'revdelete-hide-image' => 'Fshih përmbajtjen skedare',
'tog-ccmeonemails' => 'Recibir copias de os correus que ninvío ta atros usuarios',
'tog-diffonly' => "No amostrar o conteniu d'a pachina debaixo d'as esferencias",
'tog-showhiddencats' => 'Amostrar categorías amagatas',
-'tog-noconvertlink' => 'Desactivar a conversión de titol de vinclo',
'tog-norollbackdiff' => 'No amostrar as diferencias dimpués de revertir',
'tog-useeditwarning' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
'revdelete-show-file-submit' => 'Sí',
'revdelete-selected' => "'''{{PLURAL:$2|Versión trigata|Versions trigatas}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Escaicimiento d'o rechistro trigato|Escaicimientos d'o rechistro trigatos}}:'''",
-'revdelete-text' => "'''As versions y esdevenimientos borratos encara apareixerán en o historial d'a pachina y en os rechistros, pero bellas partes d'o suyo conteniu serán inaccesibles ta o publico.'''
-Atros admenistradors de {{SITENAME}} encara podrán acceder t'o conteniu amagato y podrán desfer o borrau a traviés d'ista mesma interfaz, fueras de si s'estableixen restriccions adicionals.",
'revdelete-confirm' => "Por favor confirme que ye mirando de fer ísto, que entiende as conseqüencias, y que lo ye fendo d'alcuerdo con [[{{MediaWiki:Policy-url}}|as politicas]].",
'revdelete-suppress-text' => "Os borraus de versions '''nomás''' s'habrían de fer en os siguients casos:
* Información potencialment difamatoria o libelo grieu.
'tog-ccmeonemails' => 'Sendan mē gelīcnessa þāra spearcǣrenda þe ic ōðrum brūcendum sende',
'tog-diffonly' => 'Nā īwan trametes innunge under scādungum',
'tog-showhiddencats' => 'Īwan gehȳdede floccas',
-'tog-noconvertlink' => 'Ne lǣt hlencena titula āwendunge',
'tog-norollbackdiff' => 'Forlǣtan scādunge siþþan edweorc sīe gedōn',
'tog-useeditwarning' => 'Cȳðan mē þǣr ic afare fram adihtunge tramete þe gīet hæbbe unhordoda andwendunga.',
'tog-prefershttps' => 'Brūc ā sicore þēodednesse þā þū sī inmeldod',
'tog-ccmeonemails' => 'أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين',
'tog-diffonly' => 'لا تعرض محتوى الصفحة أسفل الفرق',
'tog-showhiddencats' => 'أظهر التصنيفات المخفية',
-'tog-noconvertlink' => 'عطل تحويل عناوين الروابط',
'tog-norollbackdiff' => 'أزل الفرق بعد إحداث استرجاع',
'tog-useeditwarning' => 'حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها',
'tog-prefershttps' => 'دائما استخدم اتصالا آمنا بعد الدخول',
'revdelete-show-file-submit' => 'نعم',
'revdelete-selected' => "'''{{PLURAL:$2|المراجعة المختارة|المراجعات المختارة}} ل[[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:'''",
-'revdelete-text' => "'''المراجعات والأحداث المحذوفة ستظل تظهر في تاريخ الصفحة والسجلات،'''
-لكن أجزاء من محتواها لن يكون مسموحا للعامة برؤيتها.",
'revdelete-confirm' => 'الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.
من فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].',
'revdelete-suppress-text' => "ينبغي للإخفاء أن يستخدم '''فقط''' في الحالات التالية:
'rcshowhideminor-show' => 'أظهر',
'rcshowhideminor-hide' => 'أخف',
'rcshowhidebots' => '$1 البوتات',
+'rcshowhidebots-show' => 'أظهر',
+'rcshowhidebots-hide' => 'أخف',
'rcshowhideliu' => '$1 {{GENDER:$1|مستخدمين مسجلين|مستخدمات مسجلات|مستخدمون مسجلون}}',
+'rcshowhideliu-show' => 'أظهر',
+'rcshowhideliu-hide' => 'أخف',
'rcshowhideanons' => '$1 المستخدمين المجهولين',
+'rcshowhideanons-show' => 'أظهر',
+'rcshowhideanons-hide' => 'أخف',
'rcshowhidepatr' => '$1 التعديلات المراجعة',
+'rcshowhidepatr-show' => 'أظهر',
+'rcshowhidepatr-hide' => 'أخف',
'rcshowhidemine' => '$1 تعديلاتي',
+'rcshowhidemine-show' => 'أظهر',
+'rcshowhidemine-hide' => 'أخف',
'rclinks' => 'أظهر آخر $1 تعديل في آخر $2 يوم<br />$3',
'diff' => 'فرق',
'hist' => 'تاريخ',
'sp-contributions-search' => 'بحث عن مساهمات',
'sp-contributions-username' => 'عنوان أيبي أو اسم مستخدم:',
'sp-contributions-toponly' => 'أظهر أعلى المراجعات فقط',
+'sp-contributions-newonly' => 'أظهر إنشاء الصفحات فقط',
'sp-contributions-submit' => 'بحث',
# What links here
'tog-ccmeonemails' => 'sift liya noskha mn rasaail lbarid lelectroni likansiftha lmostkhdimin lkhrin',
'tog-diffonly' => 'matbiynch mohtawa sfha tht lforoqat',
'tog-showhiddencats' => 'biyn tsnifat lmkhfiya',
-'tog-noconvertlink' => 'aattl thwil anwan lwslat',
'tog-norollbackdiff' => 'hiyd lfrq ila drt istirjaa',
'underline-always' => 'Dima',
'tog-ccmeonemails' => 'ابعتلى نسخ من رسايل الايميل اللى بابعتها لليوزرز التانيين',
'tog-diffonly' => 'ما تبين ش محتوى الصفحة تحت الفروقات',
'tog-showhiddencats' => 'بين التّصنيفات المستخبية',
-'tog-noconvertlink' => 'عطل تحويل عناوين الوصلات',
'tog-norollbackdiff' => 'الغى الاختلافات بعد ما تعمل الرول باك',
'tog-useeditwarning' => 'حذّرنى لما اسيب صفحة تعديل فيها تغييرات مش متسييڤه',
'tog-prefershttps' => 'إستخدم وصله متأمنه بعد الدخول',
'revdelete-show-file-submit' => 'ايوه',
'revdelete-selected' => "'''{{PLURAL:$2|المراجعه المختاره|المراجعات المختاره}} بتاعة [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:'''",
-'revdelete-text' => "'''المراجعات و الاحداث الممسوحه ح تنيها تظهر فى تاريخ الصفحه و فى السجلات, بس فى اجزاء من محتواها مش ح تبقا متاحه لكل الناس .'''
-الاداريين التانيين فى {{SITENAME}} ح يقدرو يوصول للمحتوى المخفىو كمان ممكن يرجعو المسح عن طريق نفس الواجه دى ، الا اذا اتحطت قيود اضافيه.",
'revdelete-confirm' => 'لو سمحت اتأكدد انك ناوى تعمل كدا, و انك فاهم اللى ح يترتب على كدا, و انك بتعمل كدا بالتوافق مع مع [[{{MediaWiki:Policy-url}}|السياسه]].',
'revdelete-suppress-text' => "الكبت لازم ييتعمل '''بس''' فى الحالات دى:
* معلومات شخصيه مش مناسبه
'revdelete-show-file-submit' => 'হয়',
'revdelete-selected' => "'''[[:$1]]-ৰ {{PLURAL:$2|নিৰ্বাচিত সংশোধন|নিৰ্বাচিত সংশোধনসমূহ}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|টা নিৰ্বাচিত ল’গ ভৰ্তি|টা নিৰ্বাচিত ল’গ ভৰ্তি}}:'''",
-'revdelete-text' => "'''বিলোপ কৰা সংশোধনবোৰ আৰু ঘটনাবোৰ পৃষ্ঠাৰ ইতিহাস আৰু ল’গত পোৱা যাব, কিন্তু তাৰ কিছু অংশ সৰ্বসাধাৰণৰ বাবে মুকলি নহ’ব ।'''
-{{SITENAME}} ৰ অন্য প্ৰশাসকসকলে তথাপিও লুকুৱাই থোৱা বিষয়বস্তু দেখা পাব আৰু কোনো সীমাবদ্ধতা নাথাকিলে একেটা ইণ্টাৰফে’চৰ জৰিয়তে ইয়াক পুনৰুদ্ধাৰ কৰিব পাৰিব ।",
'revdelete-confirm' => 'অনুগ্ৰহ কৰি সাব্যস্ত কৰক যে আপুনি ইয়াৰ পৰিণাম বুজি আৰু [[{{MediaWiki:Policy-url}}|the policy]] ৰ সৈতে সহমত হৈ এই কামটো কৰিব বিচাৰিছে |',
'revdelete-suppress-text' => "নিবাৰণ '''কেৱল''' তলত দিয়া কাৰণসমূহত ব্যৱহৃত হ’ব:
* সম্ভাব্য ক্ষতিকাৰক তথ্য
'tog-ccmeonemails' => "Mandame copies de los correos qu'unvio a otros usuarios",
'tog-diffonly' => 'Nun amosar el conteníu de la páxina embaxo de les diferencies',
'tog-showhiddencats' => 'Amosar categoríes anubríes',
-'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
'tog-useeditwarning' => "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
'tog-prefershttps' => 'Usar siempre una conexón segura en aniciando sesión',
'revdelete-show-file-submit' => 'Sí',
'revdelete-selected' => "'''{{PLURAL:$2|Revisión seleicionada|Revisiones seleicionaes}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Socesu del rexistru seleicionáu|Socesos del rexistru seleicionaos}}:'''",
-'revdelete-text' => "'''Les revisiones y socesos desaniciaos van siguir apaeciendo nel historial de la páxina y nos rexistros, pero parte del so conteníu nun va ser accesible pal públicu.'''
-Otros alministradores de {{SITENAME}} van siguir pudiendo acceder al conteníu anubríu y puen restauralu de nuevo al traviés d'esta mesma interfaz, a nun ser que s'establezan otres restricciones.",
'revdelete-confirm' => "Confirma que quies facer esto, qu'entiendes les consecuencies, y que vas facer esto d'alcuerdo [[{{MediaWiki:Policy-url}}|cola política]].",
'revdelete-suppress-text' => "La supresión '''namái''' tendría d'usase nos casos darréu:
* Información que pudiere ser bilordiosa
* @author Emperyan
* @author Erdemaslancan
* @author Gulmammad
+ * @author Interfase
* @author Kaganer
* @author Khan27
* @author Matma Rex
'moredotdotdot' => 'Daha...',
'morenotlisted' => 'Bu siyahı tam deyil.',
'mypage' => 'Səhifə',
-'mytalk' => 'Danışıqlarım',
+'mytalk' => 'Müzakirə',
'anontalk' => 'Bu IP-yə aid müzakirə',
'navigation' => 'Naviqasiya',
'and' => ' və',
'articlepage' => 'Məqaləni nəzərdən keçir',
'talk' => 'Müzakirə',
'views' => 'Görünüş',
-'toolbox' => 'Alətlər qutusu',
+'toolbox' => 'Alətlər',
'userpage' => 'İstifadəçi səhifəsini göstər',
'projectpage' => 'Layihə səhifəsini göstər',
'imagepage' => 'Fayl səhifəsini göstər',
'suspicious-userlogout' => 'Sizin çıxış üçün cəhdiniz uğursuz alındı. Bu, brouzerin yaxud proksi-keşləmənin düzgün işləməməsindən qaynaqlanır.',
'createacct-another-realname-tip' => 'Gərçək adınız istəyə bağlıdır.
Əgər gərçək adınızı göstərsəniz, çalışmalarınıza müraciət etmək üçün istifadə ediləcəkdir.',
+'pt-login' => 'Daxil ol',
+'pt-createaccount' => 'Akkaunt yarat',
+'pt-userlogout' => 'Çıxış',
# Email sending
'php-mail-error-unknown' => 'PHP-nin mail() funksiyasında naməlum xəta',
'newpassword' => 'Yeni parol:',
'retypenew' => 'Yeni parolu təkrar yazın:',
'resetpass_submit' => 'Parol yaradın və sistemə daxil olun',
-'changepassword-success' => 'Parolunuz dəyişdirldi! Hazırda sistemə daxil olursunuz...',
+'changepassword-success' => 'Sizin parol uğurla dəyişdirildi!',
'resetpass_forbidden' => 'Parolu dəyişmək mümkün deyil',
'resetpass-no-info' => 'Bu səhifəni birbaşa açmaq üçün sistemə daxil olmalısınız.',
'resetpass-submit-loggedin' => 'Parolu dəyiş',
'noarticletext' => 'Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adda səhifəni [[Special:Search/{{PAGENAME}}| axtara]], əlaqəli qeydlərə
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} baxa],
və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> edə bilərsiniz.',
-'noarticletext-nopermission' => 'Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adda səhifəni [[Special:Search/{{PAGENAME}}| axtara]], əlaqəli qeydlərə
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} baxa],
-və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> edə bilərsiniz.',
+'noarticletext-nopermission' => 'Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adlı səhifəni [[Special:Search/{{PAGENAME}}| axtara]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} əlaqəli qeydlərə baxa],
+və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə edə bilərsiniz]</span>, lakin sizin bu məqaləni yaratmaq hüququnuz yoxdur.',
'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" istifadəçi adı qeydiyyata alınmayıb.
Əgər siz bu səhifəni yaratmaq/redaktə etmək istəyirsinizsə, xahiş edirik bunu yoxlayın.',
'userpage-userdoesnotexist-view' => '"$1" istifadəçi hesabı qeydiyyatda deyil',
'shown-title' => 'Səhifə üçün $1 {{PLURAL:$1|nəticə|nəticəyə}} bax',
'viewprevnext' => 'Göstər ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Bu vikidə \"[[:\$1]]\" adında səhifə mövcuddur'''",
-'searchmenu-new' => "'''Bu vikidə \"[[:\$1]]\" səhifəsini yarat!'''",
+'searchmenu-new' => '<strong>Bu vikidə "[[:$1]]" səhifəsini yarat!</strong> {{PLURAL:$2|0=|Həmçinin, axtarışınız əsasında çıxan səhifəyə baxın.|Həmçinin, axtarışınız əsasında çıxan nəticələrə baxın.}}',
'searchprofile-articles' => 'Məqalələr',
'searchprofile-project' => 'Kömək və Layihə səhifələri',
'searchprofile-images' => 'Multimedia',
'rc-change-size' => '$1',
'rc-change-size-new' => '$1 üçün dəyişiklikdən sonrakı həcm: {{PLURAL:$1|bayt|bayt|bayt}}',
'newsectionsummary' => '/* $1 */ yeni bölmə',
-'rc-enhanced-expand' => 'Detalları göstər (JavaScript istifadə edir)',
+'rc-enhanced-expand' => 'Ətraflı göstər',
'rc-enhanced-hide' => 'Redaktələri gizlət',
'rc-old-title' => 'Əvvəlcə "$1" kimi yaradılmış',
# Watchlist
'watchlist' => 'İzlədiyim səhifələr',
-'mywatchlist' => 'İzlədiyim səhifələr',
+'mywatchlist' => 'İzləmə siyahısı',
'watchlistfor2' => '$1 $2 üçün',
'nowatchlist' => 'İzləmə siyahınız böşdur.',
'watchlistanontext' => 'Lütfən, izlədiyiniz səhifələri görmək və ya redaktə etmək üçün $1.',
'blanknamespace' => '(Ana)',
# Contributions
-'contributions' => 'İstifadəçi fəaliyyəti',
+'contributions' => '{{GENDER:$1|İstifadəçinin}} fəaliyyəti',
'contributions-title' => '$1 istifadəçi fəaliyyətləri',
'mycontris' => 'Fəaliyyətim',
'contribsub2' => '$1 ($2)',
'file-info-size' => '$1 × $2 piksel, fayl həcmi: $3, MIME növü: $4',
'file-nohires' => 'Daha dəqiq versiyası yoxdur.',
'svg-long-desc' => 'SVG fayl, nominal olaraq $1 × $2 piksel, faylın ölçüsü: $3',
-'show-big-image' => 'Daha yüksək keyfiyyətli şəkil',
+'show-big-image' => 'Faylın əsli',
'show-big-image-preview' => 'Sınaq göstərişi ölçüsü: $1.',
'show-big-image-other' => "Dig'r {{PLURAL:$2|nəticə|nəticələr}}: $1.",
'show-big-image-size' => '$1 × $2 piksel',
'revdelete-show-file-submit' => 'بلی',
'revdelete-selected' => "[[:$1]] صحیفهسینین {{PLURAL:$2|سئچیلمیش نوسخه لری|سئچیلمیش نوسخه لری }}:'",
'logdelete-selected' => "'ژورنالین {{PLURAL:$1|سئچیلمیش قئیدی|سئچیلمیش قئیدلری}}:'",
-'revdelete-text' => "' 'سیلینئن رئویزیونلار و حادثهلر هله صحیفه کئچمیشینده و گوندهلیکلرده گؤرونهجک، لاکین ترکیبین پارچالاری عمومی اولاراق ائریشیلئمئیئجئکتیر.'
-{{SITENAME}} سایتینداکی دیگر ایدارهچیلر گیزلی مزمونا چاتا بیلر و علاوه محدودیتلر آیارلانمادییسا بو اینتئرفئیس ایله گئری گتیره بیلر.",
'revdelete-confirm' => 'خاهیش ائدیریک، بونو ائتمک ایستدیگینیزی، نتیجهلرینی آنلادیغینیزی، و بونو [[{{MediaWiki:Policy-url}}| پرینسیپلره]] گؤره ائدیر اولدوغونوزو تسدیق ائدین.',
'revdelete-suppress-text' => "ساخلاما 'یالنیز آشاغیداکی حاللار اوچون ایستیفاده ائدیلمهلیدیر:
* اویگونسوز فردی معلومات
'revdelete-show-file-submit' => 'Эйе',
'revdelete-selected' => "'''[[:$1]] битенең {{PLURAL:$2|1=һайланған версияһы|һайланған версиялары}}:'''",
'logdelete-selected' => "'''Яҙманың {{PLURAL:$1|1=һайланған яҙыуы|һайланған яҙыуҙары}}:'''",
-'revdelete-text' => "'''Биттәрҙең юйылған версиялары һәм ваҡиғалар, бит тарихында һәм яҙмаларҙа күрһәтеләсәк, ләкин уларҙың эстәлектәренең бер өлөшө ябай ҡулланыусыларға асыҡ булмаясаҡ.'''
-{{SITENAME}} проектының хакимдәре йәшерен эстәлеккә керә һәм өҫтәмә сикләүҙәр ҡуйылған осраҡтарҙан тыш, ошо уҡ арайөҙ аша тергеҙә аласаҡтар.",
'revdelete-confirm' => 'Зинһар, был ғәмәлде үтәргә теләүегеҙҙе, буласаҡ һөҙөмтәләрҙә аңлауығыҙҙы, [[{{MediaWiki:Policy-url}}|ҡағиҙәләр]] буйынса эшләүегеҙҙе раҫлағыҙ.',
'revdelete-suppress-text' => "Йәшереү '''тик''' киләһе осраҡтарҙа ғына башҡарыла:
Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].</div>',
'rev-delundel' => 'zoagn / vastecka',
'revdelete-nooldid-title' => 'Koa Version ogem',
-'revdelete-text' => "'''Der Inhalt oder andere Bestandteile gelöschter Versionen sind nicht mehr öffentlich einsehbar, erscheinen jedoch weiterhin als Einträge in der Versionsgeschichte.'''
-{{SITENAME}}-Administratoren können den entfernten Inhalt oder andere entfernte Bestandteile weiterhin einsehen und wiederherstellen, es sei denn, es wurde festgelegt, dass die Zugangsbeschränkungen auch für Administratoren gelten.",
'revdel-restore' => 'Siachtborkeit endan',
'pagehist' => 'Versiónsgschicht',
'deletedhist' => 'Gléschde Versiónen',
'revdelete-show-file-submit' => 'بله',
'revdelete-selected' => "'''{{PLURAL:$2|بازبینی انتخابی|بازبینی ان انتخابی}} چه [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|رویداد آمار انتخابی|رویداد ان آمار انتخابی}}:'''",
-'revdelete-text' => "'''حذفین بازبینی آن و رویداد ان هنگت ته تاریح و آمار صفحه جاه کاینت، بله لهتی چه محتوا آيان په عام قابل دسترسی نه بنت.'''
-
-دگه مدیران ته {{SITENAME}} هنگت نوننت په پناهین محتوا دسترسیش بیت و توننت آیء چه طریق همی دستبری آی> تریننت، مگر شی که گیشین محدودیت بلیت.
-لطفا تایید کنیت که شما لوٹیت ای کارءَ انجام دهید و چه آیی نتیجه سهی گیت و ای کار هم داب په [[{{MediaWiki:Policy-url}}|سیاست]]انجام دهید",
'revdelete-suppress-text' => "فرونشانی بایدن '''فقط''' په جهلگین موارد استفاده بیت:
* اطلاعات نامناسب شخصی
*: ''نشانی لوگ، شماره تلفن، شماره تامین اجتماعی و دگه.''",
'revdelete-show-file-submit' => 'Iyo tabi',
'revdelete-selected' => "'''{{PLURAL:$2|Selected revision|Mga piniling pagbabago}} kan [[:$1]]'''",
'logdelete-selected' => "'''{{PLURAL:$1|Selected log event|Mga piniling talaan kan mga pangyayari}}:'''",
-'revdelete-text' => "'''Pinagpurang mga pagbabago asin mga pangyayari mahihiling pa man sa historiyang pahina asin mga talaan, pero an mga parte kan saindang laman dae puwedeng magamit kan publiko.'''
-An ibang administrador sa {{SITENAME}} puwede pa man makagamit sa pinagtagong laman asin balewalaon an pagpura kaini giraray sa paagi nin kaparehong panlaog-olay, laen lang kun may kadagdagang pangilin an inilapat.",
'revdelete-confirm' => 'Pakikumpirma tabi na ika tuyong gumibo kaini, na saimong naintindihan an mga konsekuwensiya, asin ta ika pinaghihimo ini na uyon sa [[{{MediaWiki:Policy-url}}|an palisiya]].',
'revdelete-suppress-text' => "An paglulubog dapat '''sana''' magagamit para sa minasunod na mga kaso:
*Potensiyal na libeloso an impormasyon
'tog-extendwatchlist' => 'Паказваць усе змяненні, а не толькі апошнія',
'tog-usenewrc' => 'Групаваць змены па старонках у апошніх зменах і спісе назірання',
'tog-numberheadings' => 'Аўта-нумараваць падзагалоўкі',
-'tog-showtoolbar' => 'Паказваць рэдактарскую стужку (Яваскрыпт)',
-'tog-editondblclick' => 'Ð\9fÑ\80аÑ\9eка Ñ\81Ñ\82аÑ\80онак па падвойнÑ\8bм пÑ\81Ñ\82Ñ\80Ñ\8bкÑ\83 (ЯваÑ\81кÑ\80Ñ\8bпÑ\82)',
-'tog-editsectiononrightclick' => 'Праўка падраздзелаў па правым пстрыку на загалоўку (Яваскрыпт)',
+'tog-showtoolbar' => 'Паказваць панэль інструментаў рэдактара',
+'tog-editondblclick' => 'Ð\9fÑ\80аÑ\9eка Ñ\81Ñ\82аÑ\80онак па двайнÑ\8bм пÑ\81Ñ\82Ñ\80Ñ\8bкÑ\83',
+'tog-editsectiononrightclick' => 'Правіць падраздзелы па правым пстрыку на загалоўку',
'tog-rememberpassword' => 'Памятаць уваходныя даныя ў гэтым браўзеры (не даўжэй за $1 {{PLURAL:$1|дзень|дні|дзён}})',
'tog-watchcreations' => 'Дабаўляць створаныя мною старонкі і файлы ў мой спіс назірання',
'tog-watchdefault' => 'Дабаўляць старонкі і файлы пасля маіх правак у мой спіс назірання',
'tog-minordefault' => 'Пачынаць кожную праўку як дробную',
'tog-previewontop' => 'Папярэдні паказ — над рэдактарскім полем',
'tog-previewonfirst' => 'Папярэдні паказ пры першай праўцы',
-'tog-enotifwatchlistpages' => 'СлаÑ\86Ñ\8c мне Ñ\8dл.поÑ\88Ñ\82Ñ\83, калÑ\96 мÑ\8fнÑ\8fеÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онка Ñ\9e маÑ\96м Ñ\81пÑ\96Ñ\81е назÑ\96Ñ\80анага',
+'tog-enotifwatchlistpages' => 'СлаÑ\86Ñ\8c мне Ñ\8dл.поÑ\88Ñ\82Ñ\83, калÑ\96 мÑ\8fнÑ\8fеÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онка Ñ\9e маÑ\96м Ñ\81пÑ\96Ñ\81е назÑ\96Ñ\80аннÑ\8f',
'tog-enotifusertalkpages' => 'Слаць эл.пошту пра мены ў маёй размоўнай старонцы',
-'tog-enotifminoredits' => 'СлаÑ\86Ñ\8c Ñ\8dл.поÑ\88Ñ\82Ñ\83 пÑ\80а дÑ\80обнÑ\8bÑ\8f пÑ\80аÑ\9eкÑ\96',
+'tog-enotifminoredits' => 'Ð\9fаведамÑ\8fÑ\86Ñ\8c мне на Ñ\8dл.поÑ\88Ñ\82Ñ\83 пÑ\80а дÑ\80обнÑ\8bÑ\8f пÑ\80аÑ\9eкÑ\96 Ñ\81Ñ\82аÑ\80онак Ñ\96 Ñ\84айлаÑ\9e',
'tog-enotifrevealaddr' => 'Не скрываць майго адрасу эл.пошты ў паведамленнях',
'tog-shownumberswatching' => 'Паказваць колькасць назіральнікаў',
'tog-oldsig' => 'Існуючы подпіс:',
'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
-'tog-uselivepreview' => 'Жывы перадпаказ (Яваскрыпт, эксперыментальн.)',
+'tog-uselivepreview' => 'Жывы перадпаказ (эксперыментальн.)',
'tog-forceeditsummary' => 'Папярэджваць пра пустое поле тлумачэння праўкі',
'tog-watchlisthideown' => 'Не паказваць у назіраным сваіх правак',
'tog-watchlisthidebots' => 'Не паказваць у назіраным правак, зробленых робатамі',
'tog-showhiddencats' => 'Паказаць схаваныя катэгорыі',
'tog-norollbackdiff' => 'Не паказваць розніцу ў выніку адкату',
'tog-useeditwarning' => 'Папярэдзіць мяне, калі я пакідаю старонку з незахаванымі праўкамі',
+'tog-prefershttps' => 'Заўсёды выкарыстоўваць абароненае злучэнне пасля ўваходу ў сістэму',
'underline-always' => 'Заўсёды',
'underline-never' => 'Ніколі',
'newwindow' => '(адкрыецца ў новым акне)',
'cancel' => 'Нічога',
'moredotdotdot' => 'Яшчэ...',
-'morenotlisted' => 'Ð\91олÑ\8cÑ\88 нÑ\96Ñ\87ога нÑ\8fма...',
+'morenotlisted' => 'Ð\93Ñ\8dÑ\82Ñ\8b Ñ\81пÑ\96Ñ\81 не поÑ\9eнÑ\8b.',
'mypage' => 'Старонка',
'mytalk' => 'Размовы',
'anontalk' => 'Размова для гэтага IP',
'protectedpagetext' => 'Старонка ахоўваецца, каб нельга было яе правіць.',
'viewsourcetext' => 'Можна бачыць і капіраваць зыходны тэкст гэтай старонкі:',
'viewyourtext' => "Вы можаце праглядзець і скапіяваць зыходны тэкст '''вашых правак''' на гэтай старонцы:",
-'protectedinterface' => 'Старонка ахоўваецца, таму што ўваходзіць у склад інтэрфейсу гэтай праграмы.',
+'protectedinterface' => 'Старонка ўтрымлівае інтэрфейснае паведамленне праграмнага забеспячэння гэтага вікі-праекта і ахоўваецца, каб прадухіліць вандалізм.
+Каб дабавіць ці змяніць пераклады ва ўсіх вікі-праектах, калі ласка, выкарыстоўвайце сайт лакалізацыі MediaWiki [//translatewiki.net/ translatewiki.net].',
'editinginterface' => "'''Увага:''' Вы правіце старонку, якая ўтрымлівае тэкст карыстальніцкага інтэрфейсу.
Яе змяненне паўплывае на вонкавы выгляд праграмы для ўсіх удзельнікаў.
Праект лакалізацыі MediaWiki: [//translatewiki.net/wiki/Main_Page?setlang=be translatewiki.net].",
'postedit-confirmation' => 'Вашая праўка была захаваная.',
'edit-already-exists' => 'Не ўдалося стварыць новую старонку.
Такая ўжо існуе.',
-'editwarning-warning' => 'Ð\92Ñ\8bÑ\85ад з гÑ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онкÑ\96 пÑ\80Ñ\8bвÑ\8fдзе да Ñ\81Ñ\82Ñ\80аÑ\82Ñ\8b пÑ\80авак, Ñ\8fкÑ\96Ñ\8f вÑ\8b зÑ\80абÑ\96лі.
-Калі Вы зарэгістраваныя ў сістэме, Вы можаце адключыць гэта папярэджанне ў закладцы "Праца" Вашых настаўленняў.',
+'editwarning-warning' => 'Ð\9fеÑ\80аÑ\85од на Ñ\96нÑ\88Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83 можа пÑ\80Ñ\8bвеÑ\81Ñ\86Ñ\96 да Ñ\81Ñ\82Ñ\80аÑ\82Ñ\8b пÑ\80авак, зÑ\80обленÑ\8bÑ\85 Ð\92амі.
+Калі Вы ўвайшлі ў сістэму, Вы можаце адключыць гэта папярэджанне ў раздзеле "{{int:prefs-editing}}" Вашых настроек.',
# Content models
'content-model-wikitext' => 'вікі-тэкст',
'revdelete-show-file-submit' => 'Так',
'revdelete-selected' => "'''{{PLURAL:$2|Выбраная версія|Выбраныя версіі}} [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Выбраны запіс|Выбраныя запісы}} журналу:'''",
-'revdelete-text' => "'''Сцёртыя версіі і падзеі надалей будуць паказвацца ў гісторыі старонкі і ў журналах, але часткі іх зместу не будуць даступныя для публікі.'''
-Іншыя адміністратары пляцоўкі {{SITENAME}} надалей змогуць бачыць схаваны змест і аднаўляць яго праз гэты самы інтэрфейс, калі не будзе ўведзена дадатковых абмежаванняў.",
'revdelete-confirm' => 'Пацвердзіце, што вы жадаеце гэта зрабіць, што вы разумееце наступствы, і што вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|арганізацыйнымі правіламі]].',
'revdelete-suppress-text' => "Заглушэнне належыць ужываць '''выключна''' ў наступных выпадках:
* Недапушчальная асабістая інфармацыя
'recentchanges-label-bot' => 'Праўка была зробленая праграмай-робатам',
'recentchanges-label-unpatrolled' => 'Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць "патруль")',
'recentchanges-legend-newpage' => '$1 - новая старонка',
-'rcnotefrom' => 'Ð\9dÑ\96жÑ\8dй знаÑ\85одзÑ\8fÑ\86Ñ\86а зменÑ\8b з <b>$2</b> (да <b>$1</b> на Ñ\81Ñ\82аÑ\80онкÑ\83).',
+'rcnotefrom' => 'Ð\9dÑ\96жÑ\8dй знаÑ\85одзÑ\8fÑ\86Ñ\86а зменÑ\8b з <b>$2</b> (паказана не болÑ\8cÑ\88 Ñ\87Ñ\8bм <b>$1</b>).',
'rclistfrom' => 'Паказаць змены з $1',
'rcshowhideminor' => '$1 дробных правак',
+'rcshowhideminor-hide' => 'Схаваць',
'rcshowhidebots' => '$1 робатаў',
+'rcshowhidebots-show' => 'Паказаць',
+'rcshowhidebots-hide' => 'Схаваць',
'rcshowhideliu' => '$1 пазнаных удзельнікаў',
+'rcshowhideliu-show' => 'Паказаць',
+'rcshowhideliu-hide' => 'Схаваць',
'rcshowhideanons' => '$1 ананімных удзельнікаў',
+'rcshowhideanons-show' => 'Паказаць',
+'rcshowhideanons-hide' => 'Схаваць',
'rcshowhidepatr' => '$1 ухваленых правак',
+'rcshowhidepatr-show' => 'Паказаць',
+'rcshowhidepatr-hide' => 'Схаваць',
'rcshowhidemine' => '$1 ўласных правак',
+'rcshowhidemine-show' => 'Паказаць',
+'rcshowhidemine-hide' => 'Схаваць',
'rclinks' => 'Паказаць апошнія $1 змен за мінулыя $2 дзён<br />$3',
'diff' => 'розн.',
'hist' => 'гіст.',
'rc_categories_any' => 'Усе',
'rc-change-size-new' => '$1 {{PLURAL:$1|байт|байта|байтаў}} пасля змены',
'newsectionsummary' => '/* $1 */ новы падраздзел',
-'rc-enhanced-expand' => 'Ð\9fаказваÑ\86Ñ\8c падÑ\80абÑ\8fзнаÑ\81Ñ\86Ñ\96 (паÑ\82Ñ\80абÑ\83еÑ\86Ñ\86а ЯваÑ\81кÑ\80Ñ\8bпÑ\82)',
+'rc-enhanced-expand' => 'Ð\9fаказаÑ\86Ñ\8c падÑ\80абÑ\8fзнаÑ\81Ñ\86Ñ\96',
'rc-enhanced-hide' => 'Не паказваць падрабязнасцяў',
# Recent changes linked
'upload_source_file' => ' (файл на вашай машыне)',
# Special:ListFiles
-'listfiles-summary' => 'Гэтая службовая старонка паказвае ўсе загружаныя файлы.
-Пры адборы па ўдзельніку, паказваюцца толькі нядаўнія загрузкі гэтага ўдзельніка.',
+'listfiles-summary' => 'Гэтая службовая старонка паказвае ўсе загружаныя файлы.',
'listfiles_search_for' => 'Знайсці назву выявы:',
'imgfile' => 'файл',
'listfiles' => 'Усе файлы',
'protectedpages' => 'Старонкі пад аховай',
'protectedpages-indef' => 'Толькі бестэрміновыя аховы',
'protectedpages-cascade' => 'Толькі каскадныя засцераганні',
+'protectedpages-noredirect' => 'Схаваць перанакіраванні',
'protectedpagesempty' => 'Ніякія старонкі такім чынам не ахоўваюцца.',
'protectedtitles' => 'Назвы пад аховай',
'protectedtitlesempty' => 'Няма назваў, якія зараз бы ахоўваліся з такімі параметрамі.',
'allpagesprefix' => 'Паказваць старонкі з прэфіксам:',
'allpagesbadtitle' => 'Гэтая назва старонкі недапушчальная або ўтрымлівае між-моўны або між-вікавы прэфікс. Магчыма, у назве ёсць знак ці знакі, якія нельга ўжываць у назвах.',
'allpages-bad-ns' => 'На {{SITENAME}} прастора назваў "$1" не падтрымліваецца.',
+'allpages-hide-redirects' => 'Схаваць перанакіраванні',
# Special:Categories
'categories' => 'Катэгорыі',
'tog-ccmeonemails' => 'Адпраўляць мне копіі лістоў, якія я дасылаю іншым удзельнікам',
'tog-diffonly' => 'Не паказваць зьмест старонкі пад параўнаньнем зьменаў',
'tog-showhiddencats' => 'Паказваць схаваныя катэгорыі',
-'tog-noconvertlink' => 'Забараніць канвэртацыю назваў спасылак',
'tog-norollbackdiff' => 'Не паказваць зьмены пасьля выкарыстаньня функцыі адкату',
'tog-useeditwarning' => 'Папярэджваць мяне, калі я буду пакідаць старонку рэдагаваньня зь незахаванымі зьменамі',
'tog-prefershttps' => 'Заўсёды карыстацца бясьпечным злучэньнем па ўваходзе ў сыстэму',
'createacct-another-realname-tip' => 'Сапраўднае імя паведамляць неабавязкова.
Калі Вы яго пазначыце, яно будзе выкарыстоўвацца для пазначэньня Вашай працы.',
'pt-login' => 'Увайсьці',
+'pt-login-button' => 'Увайсьці',
'pt-createaccount' => 'Стварыць рахунак',
'pt-userlogout' => 'Выйсьці',
'revdelete-show-file-submit' => 'Так',
'revdelete-selected' => "'''{{PLURAL:$2|1=Выбраная вэрсія|Выбраныя вэрсіі}} старонкі [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|1=Выбраны запіс|Выбраныя запісы}} журнала:'''",
-'revdelete-text' => "'''Выдаленыя вэрсіі і падзеі будуць паказвацца ў гісторыі старонкі і журналах, але частка іх зьместу ня будзе даступная для звычайных удзельнікаў.'''
-Іншыя адміністратары {{GRAMMAR:родны|{{SITENAME}}}} будуць мець магчымасьць прагляду зьместу і аднаўленьня старонкі праз гэты інтэрфэйс, калі ня будуць уведзеныя дадатковыя абмежаваньні.",
'revdelete-confirm' => 'Калі ласка, пацьвердзіце, што Вы сапраўды жадаеце зрабіць гэта, разумееце наступствы і робіце гэта ў адпаведнасьці з [[{{MediaWiki:Policy-url}}|правіламі]].',
'revdelete-suppress-text' => "Скрываньне можа выкарыстоўвацца '''толькі''' ў наступных выпадках:
* патэнцыйна паклёпніцкая інфармацыя
'search-file-match' => '(супадае зь зьмесьцівам файла)',
'search-suggest' => 'Магчыма, вы мелі на ўвазе: $1',
'search-interwiki-caption' => 'Сумежныя праекты',
-'search-interwiki-default' => 'вынікі з $1:',
+'search-interwiki-default' => 'Ð\92ынікі з $1:',
'search-interwiki-more' => '(яшчэ)',
'search-relatedarticle' => 'Зьвязаны',
'searcheverything-enable' => 'Шукаць ва ўсіх прасторах назваў',
'uploaddisabledtext' => 'Загрузка файлаў забароненая.',
'php-uploaddisabledtext' => 'Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».',
'uploadscripted' => 'Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.',
+'uploadscriptednamespace' => 'Гэты SVG-файл утрымлівае няслушную прастору назваў «$1»',
'uploadinvalidxml' => 'Не атрымалася прааналізаваць XML у загружаным файле.',
'uploadvirus' => 'Файл утрымлівае вірус! Падрабязнасьці: $1',
'uploadjava' => 'Файл зьяўляецца ZIP-архівам, які зьмяшчае .class-файл Java.
Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.',
'delete-warning-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
Яе выдаленьне можа выклікаць праблемы ў працы базы зьвестак {{GRAMMAR:родны|{{SITENAME}}}}; будзьце асьцярожны.',
-'deleting-backlinks-warning' => "'''Увага:''' іншыя старонкі ўключаюць або спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
+'deleting-backlinks-warning' => "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|іншыя старонкі]] ўключаюць або спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
# Rollback
'rollback' => 'Адкаціць рэдагаваньні',
'sp-contributions-blocked-notice-anon' => 'Гэты IP-адрас у дадзены момант заблякаваны.
Апошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:',
'sp-contributions-search' => 'Пошук унёску',
+'sp-contributions-suppresslog' => 'выдалены ўнёсак удзельніка',
'sp-contributions-username' => 'IP-адрас альбо імя ўдзельніка/ўдзельніцы:',
'sp-contributions-toponly' => 'Паказваць толькі зьмены, якія зьяўляюцца апошнімі вэрсіямі',
+'sp-contributions-newonly' => 'Паказваць толькі праўкі, якімі былі створаныя старонкі',
'sp-contributions-submit' => 'Шукаць',
# What links here
'thumbnail_image-type' => 'Тып выявы не падтрымліваецца',
'thumbnail_gd-library' => 'Няпоўная канфігурацыя бібліятэкі GD: няма функцыі $1',
'thumbnail_image-missing' => 'Верагодна няма файла $1',
+'thumbnail_image-failure-limit' => 'Было зроблена зашмат няўдалых спробаў ($1 ці болей) сфармаваць гэтую мініятуру. Калі ласка, паспрабуйце пазьней.',
# Special:Import
'import' => 'Імпартаваць старонкі',
'import-error-special' => 'Старонка «$1» не была імпартаваная, таму што яна належыць да спэцыяльнай прасторы назваў, старонкі ў якой не дазволеныя.',
'import-error-invalid' => 'Старонка «$1» не была імпартаваная з-за няслушнасьці назвы.',
'import-error-unserialize' => 'Не атрымалася дэсэрыялізаваць вэрсію $2 старонкі «$1». Меркавалася, што вэрсія выкарыстоўвала мадэль зьвестак $3 і была сэрыялізавана ў фармаце $4.',
+'import-error-bad-location' => 'Праўка $2, якая выкарыстоўвае мадэль зьместу $3, ня можа быць захаваная ў «$1» гэтай вікі, таму што такая мадэль не падтрымліваецца на гэтай старонцы.',
'import-options-wrong' => '{{PLURAL:$2|1=Няслушная налада|Няслушныя налады}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Пазначаная назва карнявой старонкі няслушная.',
'import-rootpage-nosubpage' => 'Падстаронкі ў прасторы назваў «$1» карнявой старонкі не дазволеныя.',
'revdelete-show-file-submit' => 'Да',
'revdelete-selected' => "'''{{PLURAL:$2|Избрана версия|Избрани версии}} от '''$1:''''''",
'logdelete-selected' => "'''{{PLURAL:$1|Избрано събитие|Избрани събития}}:'''",
-'revdelete-text' => "'''Изтритите версии ше се показват в историята на страницата, но тяхното съдържание ще бъде недостъпно за обикновенните потребители.'''
-Администраторите на {{SITENAME}} ще имат достъп до скритото съдържание и ще могат да го възстановят, с изключение на случаите, когато има наложено допълнително ограничение.",
'revdelete-confirm' => 'Необходимо е да потвърдите, че велаете да извършите действието, разбирате последствията и го правите според [[{{MediaWiki:Policy-url}}|политиката]].',
'revdelete-suppress-text' => "Премахването трябва да се използва '''само''' при следните случаи:
*Неподходяща или неприемлива лична информация
'revdelete-show-file-submit' => 'Iya-ai',
'revdelete-selected' => "'''{{PLURAL:$2|Ralatan tapilih|Raralatan tapilih}} matan [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Log kajadian tapilih|Log kakajadian tapilih}}:'''",
-'revdelete-text' => "'''Raralatan tahapus wan kakajadian akan magun cungul dalam halam tungkaran wan log, tagal hagian matan isinya akan kada kawa diungkai umum.'''
-Pambakal lain pada {{SITENAME}} akan magun kawa maungkai isi tasungkup wan kawa mambulikakan hapusan pulang mangguna'akan antarmuha sama, kacuali ada panambahan pahalatan lain nang disetél.",
'revdelete-confirm' => 'Muhun yakinakan bahwasa Pian handak manggawi ini, bahwasa Pian paham sabab akibat, wan bahwasa Pian manggawi ini bapandal awan [[{{MediaWiki:Policy-url}}|kaaripan]].',
'revdelete-suppress-text' => "Panikinan parlu dipuruk gasan kakasus baumpat ini:
* Pina kawa jadi panjalasan pitnah
'revdelete-show-file-submit' => 'হ্যাঁ',
'revdelete-selected' => "'''[[:$1]] পাতার {{PLURAL:$2|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|টি নির্বাচিত লগ-ঘটনা|টি নির্বাচিত লগ-ঘটনা}}:'''",
-'revdelete-text' => "'''মুছে ফেলা সংশোধনগুলো এবং ঘটনাগুলি এখনও পাতার ইতিহাস ও লগগুলোতে দেখাবে, কিন্তু তাদের বিষয়বস্তুর অংশবিশেষ সর্বোসাধারণের জন্য উন্মুক্ত থাকবে না।'''
-
-{{SITENAME}} এর অন্যান্য প্রশাসকগণ লুকানো এই বিষয়বস্তু দেখতে পাবেন এবং বাড়তি কোনো সীমাবদ্ধতা না থাকলে একই ইন্টারফেসের মাধ্যমে এটি পুনরুদ্ধার করতে পারবেন।",
'revdelete-confirm' => 'অনুগ্রহ করে নিশ্চিত করুন যে আপনি এটি করতে চাচ্ছিলেন, আপনি এর ফলাফল সম্পর্কে অবগত আছেন, এবং [[{{MediaWiki:Policy-url}}|নীতিমালার]] উপর ভিত্তি করেই এই কাজটি করছেন।',
'revdelete-suppress-text' => "নিচের বিষয়গুলোর ক্ষেত্রেই '''কেবলমাত্র''' চাপাচাপি করা যাবে:
* সম্ভাব্য মানহানিকর তথ্য
'php-uploaddisabledtext' => 'পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।
অনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।',
'uploadscripted' => 'এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।',
+'uploadscriptednamespace' => 'এই SVG ফাইলে অবৈধ নামস্থান "$1" রয়েছে',
'uploadvirus' => 'এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1',
'uploadjava' => 'এটি একটি ZIP ফরম্যাটের ফাইল, যেখানে একটি জাভা .class ফরম্যাটের ফাইল রয়েছে।
জাভা ফাইল আপলোডের কোনো অনুমতি নেই, কারণ এই ধরনের ফাইল সিস্টেমে নিরাপত্তা ত্রুটি তৈরী করতে পারে।',
'watchmethod-list' => 'নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে',
'watchlistcontains' => 'আপনার নজরতালিকায় $1 টি {{PLURAL:$1|পাতা|পাতা}} রয়েছে।',
'iteminvalidname' => "'$1'নং আইটেমে সমস্যা, অবৈধ নাম...",
+'wlnote2' => '$3, $2 অনুসারে, সর্বশেষ {{PLURAL:$1|ঘণ্টার|<strong>$1</strong> ঘণ্টার}} পরিবর্তন নিচে দেয়া হয়েছে।',
'wlshowlast' => 'দেখাও সর্বশেষ $1 ঘন্টা $2 দিন $3',
'watchlist-options' => 'নজর তালিকা পছন্দসমূহ',
'delete-warning-toobig' => 'এই পাতাটির একটি বৃহৎ সম্পাদনা ইতিহাস রয়েছে, যা $1 {{PLURAL:$1|সংস্করণেরও|সংস্করণেরও}} বেশি।
এই পাতাটি মুছে ফেললে তা {{SITENAME}} সাইটের ডেটাবেজ সমস্যার কারণ হতে পারে;
সাবধানতার সাথে এগিয়ে যান।',
-'deleting-backlinks-warning' => "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা অন্যান্য পাতাসমূহের সাথে সংযুক্ত অথবা অন্তর্ভুক্ত করা আছে।",
+'deleting-backlinks-warning' => "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা [[Special:WhatLinksHere/{{FULLPAGENAME}}|অন্যান্য পাতাসমূহে]] সংযুক্ত অথবা অন্তর্ভুক্ত রয়েছে।",
# Rollback
'rollback' => 'সম্পাদনা ফিরিয়ে নিন',
'sp-contributions-blocked-notice-anon' => 'এই আইপি ঠিকানাটি বর্তমানে বাধাদানকৃত অবস্থায় রয়েছে।
তথ্যসূত্র হিসেবে সাম্প্রতিক বাধাদান লগের ভুক্তিটি নিচে দেওয়া হলো:',
'sp-contributions-search' => 'অবদানসমূহের জন্য অনুসন্ধান',
+'sp-contributions-suppresslog' => 'মুছে ফেলা ব্যবহারকারী অবদান',
'sp-contributions-username' => 'আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:',
-'sp-contributions-toponly' => 'শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত।',
+'sp-contributions-toponly' => 'শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত',
+'sp-contributions-newonly' => 'শুধুমাত্র পাতা সৃষ্টি করা সম্পাদনাগুলি দেখাও',
'sp-contributions-submit' => 'অনুসন্ধান',
# What links here
'change-blocklink' => 'ব্লক অবস্থার পরিবর্তন করুন',
'contribslink' => 'অবদান',
'emaillink' => 'ই-মেইল পাঠাও',
-'autoblocker' => 'আপনাকে স্বয়ংক্রিয়ভাবে বাধা দেওয়া হয়েছে, কারণ আপনার আইপি ঠিকানাটি সম্প্রতি "[[User:$1|$1]]" ব্যবহার করেছেন। $1-কে বাধাদানের কারণ: "$2"',
+'autoblocker' => 'আপনাকে স্বয়ংক্রিয়ভাবে বাধা দেওয়া হয়েছে, কারণ আপনার আইপি ঠিকানাটি সম্প্রতি "[[User:$1|$1]]" ব্যবহার করেছেন। $1-কে বাধাদানের কারণ "$2"',
'blocklogpage' => 'বাধা দানের লগ',
'blocklog-showlog' => 'এই ব্যবহারকারীকে পূর্বেও বাধা প্রদান করা হয়েছিলো।
তথ্যসূত্র হিসেবে তাই পূর্বের বাধাদানের লগটি নিচে প্রদর্শন করা হচ্ছে:',
'tog-enotifrevealaddr' => 'ངའི་གློག་འཕྲིན་ཁ་བྱང་འདི་བརྡ་ཐོའི་ཁ་བྱང་ནང་གསལ་སྟོན་བྱེད་རོགས།',
'tog-shownumberswatching' => 'ཤོག་ངོས་ལ་ལྟ་བཞིན་པའི་སྤྱོད་མིའི་ཁ་གྲངས་སྟོན།',
'tog-oldsig' => 'ད་ཡོད་མིང་རྟགས།',
+'tog-fancysig' => 'མིང་རྟགས་རྣམས་ཝེ་ཁེ་ཡི་གེར་བརྩིས་རོགས། (རང་འགུལ་གྱི་སྦྲེལ་མཐུད་མེད་པ།)',
+'tog-uselivepreview' => 'འཆར་བཞིན་པའི་སྔོན་ལྟ་སྟོན་རོགས། (ཚོད་ལྟའི་ཆེད།)',
+'tog-forceeditsummary' => 'རྩོམ་སྒྲིག་ཀྱི་བསྡུས་དོན་སྟོང་པ་ནང་འཇུག་བྱེད་སྐབས་ང་ལ་དྲན་སྐུལ་བྱེད་རོགས།',
'tog-watchlisthideown' => 'ངའི་རྩོམ་སྒྲིག་རྣམས་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།',
'tog-watchlisthidebots' => 'རང་འགུལ་འཕྱུལ་ཆས་ཀྱི་བཟོ་འཅོས་བྱས་པ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།',
'tog-watchlisthideminor' => 'རྩོམ་སྒྲིག་ཕལ་བ་རྣམས་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།',
'tog-watchlisthideliu' => 'ཐོ་འཛུལ་སྤྱོད་མིའི་རྩོམ་སྒྲིག་རྣམས་ལྟ་ཐོ་ལས་སྦས་རོགས།',
+'tog-watchlisthideanons' => 'མིང་མེད་པའི་སྤྱོད་མིས་རྩོམ་སྒྲིག་བྱས་པ་རྣམས་ལྟ་ཐོ་ལས་སྦས་རོགས།',
+'tog-watchlisthidepatrolled' => 'མྱལ་ཞིབ་བྱས་པའི་རྩོམ་སྒྲིག་རྣམས་ལྟ་ཐོ་ལས་སྦས་རོགས།',
'tog-ccmeonemails' => 'ངས་གཞན་ལ་བཏང་བའི་གློག་འཕྲིན་གྱི་འདྲ་བཤུས་སྐུར་རོགས།',
+'tog-diffonly' => 'ཁྱད་པར་འཚོལ་སྐབས་ཤོག་ངོས་གྱི་ནང་དོན་མ་སྟོན་རོགས།',
'tog-showhiddencats' => 'སྦས་བའི་དཀར་ཆག་སྟོན་རོགས།',
+'tog-norollbackdiff' => 'སྒྲེ་ལོག་རྒྱག་སྐབས་ཁྱད་པར་རྣམས་སྐྱུར་རོགས།',
+'tog-useeditwarning' => 'ངས་རྩོམ་སྒྲིག་ཤོག་ངོས་གང་རུང་ཐོག་བཟོ་འཅོས་རྣམས་ཉར་གཆོག་མ་བྱས་པར་འདོར་ན་ཉེན་བརྡ་གཏོང་རོགས།',
+'tog-prefershttps' => 'རྒྱན་དུ་ནང་འཛུལ་བྱས་བའི་སྐབས་བདེ་འཇགས་འབྲེལ་ལམ་བརྒྱུད་རོགས།',
'underline-always' => 'དུས་རྒྱུན་དུ་',
'underline-never' => 'གཏན་ནས་མ་བྱེད།',
'category-subcat-count' => '{{PLURAL:$2|སྡེ་ཙན་འདི་ནང་ཁྱོན་སྡོམས་པས་ $2 ནས་ གཤམ་གྱི་བྱེ་བྲག་སྡེ་ཚན།{{PLURAL:$1|subcategory|$1 subcategories}}ཙམ་འདུག།}}',
'category-subcat-count-limited' => 'སྡེ་ཚན་འདིར་གཤམ་གྱི་བྱེ་བྲག་སྡེ་ཚན་{{PLURAL:$1|subcategory|$1 subcategories}}ཡོད།',
'category-article-count' => '{{PLURAL:$2|སྡེ་ཚན་འདིར་གཤམ་གྱི་ཤོག་ངོས་ཁོ་ན་བསྡུས་ཡོད། |The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}',
+'category-article-count-limited' => 'གཤམ་གྱི་{{PLURAL:$1|ཤོག་ངོས་འདི་|$1 ཤོག་ངོས་རྣམས་}}ད་གནས་སྡེ་ཚན་འདི་ནང་ཡོད།',
+'category-file-count' => '{{PLURAL:$2|སྡེ་ཚན་འདི་ནང་གཤམ་གྱི་ཡིག་ཆ་ཁོ་ན་ཡོད།|གཤམ་གྱི་ {{PLURAL:$1|ཡིག་ཆ་འདི་|$1 ཡིག་ཆ་རྣམས་}} སྡེ་ཚན་འདི་ནང་གི་,ཁྱོན་བསྡོམས་གྱི་ $2 ནས་ཡིན།}}',
+'category-file-count-limited' => 'གཤམ་གྱི་{{PLURAL:$1|ཡིག་ཆ་འདི་|$1ཡིག་ཆ་རྣམས་}}ད་གནས་སྡེ་ཚན་འདི་ནང་ཡོད།',
+'listingcontinuesabbrev' => 'མུ་འཐུད།',
+'index-category' => 'དཀར་ཆག་ཅན་གྱི་ཤོག་ངོས།',
+'noindex-category' => 'དཀར་ཆག་མེད་པའི་ཤོག་ངོས།',
+'broken-file-category' => 'ཡིག་ཆའི་སྦྲེལ་མཐུད་འབོར་བརླག་སོང་བའི་ཤོག་ངོས།',
'about' => 'སྐོར།',
'article' => 'ནང་དོན་ཤོག་ངོས།',
'vector-action-delete' => 'སུབས།',
'vector-action-move' => 'སྤོར་བ།',
'vector-action-protect' => 'འགོག་སྲུང།',
-'vector-action-undelete' => 'à½\96སུà½\96སà¼\8bà½\94à¼\8bà½\82སོà¼\8bà½\96à¼\8d',
+'vector-action-undelete' => 'à½\98ིà¼\8bà½\96སུà½\96སà¼\8b',
'vector-action-unprotect' => 'སྲུང་སྐྱོབ་གློད་པ།',
'vector-view-create' => 'གསར་བཟོ།',
'vector-view-edit' => 'རྩོམ་སྒྲིག',
'redirectedfrom' => '$1 ནས་ཁ་ཕྱོགས་བསྐྱར་དུ་བཟོས་པ།',
'redirectpagesub' => 'རིམ་འགྲེམ་ཤོག་ངོས།',
'lastmodifiedat' => 'ཤོག་ངོས་འདི་ཡི་བཟོ་བཅོས་མཐའ་མ་$1 ཀྱི་ $2 ལ་རེད།',
+'viewcount' => 'ཤོགངོས་འདི་{{PLURAL:$1|ཐེངས་གཅིག་|ཐེངས་ $1}}བལྟས་འདུག།',
'protectedpage' => 'སྲུང་སྐྱོབ་བྱས་པའི་ཤོག་ངོས།',
'jumpto' => 'གནས་སྤོ།',
'jumptonavigation' => 'ཕྱོགས་ཁྲིད།',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
'aboutsite' => '{{SITENAME}}ཡི་སྐོར།',
'aboutpage' => 'Project:སྐོར།',
-'copyright' => 'à½\91ྲà¼\8bà½\96འིà¼\8bà½\93à½\84à¼\8bà½\91ོà½\93à¼\8b$1སྟེང་དུ་ཡོད།',
+'copyright' => 'à½\91ེà¼\8bà½\98ིà½\93à¼\8bà½\82ྱིà¼\8bà½\98à½\86à½\93à¼\8bའà½\82ྲེལà¼\8bཡོà½\91à¼\8bà½\93à¼\8bà½\98à¼\8bà½\82à½\8fོà½\82སà¼\8d à½\91ྲà¼\8bà½\96འིà¼\8bà½\93à½\84à¼\8bà½\91ོà½\93à¼\8b $1 སྟེང་དུ་ཡོད།',
'copyrightpage' => '{{ns:project}}:པར་དབང་།',
'currentevents' => 'ད་ལྟའི་དོན་གནད།',
'currentevents-url' => 'Project:ད་ལྟའི་དོན་གནད།',
'privacypage' => 'Project: གསང་དོན་གན་རྒྱ།',
'badaccess' => 'ཆོག་ཆན་ལ་ནོར་འཁྲུལ།',
+'badaccess-group0' => 'ཁྱེད་ཀྱི་རེ་ཞུ་བྱས་པའི་བྱ་བ་འདི་ཁྱེད་ཉིད་ནས་ལག་ལེན་བསྟར་མི་ཆོག།',
+'badaccess-groups' => 'ཁྱེད་ཀྱི་རེ་ཞུ་བྱས་པའི་བྱ་བ་འདི་ {{PLURAL:$2|ཚོགས་པ་|ཚོགས་པ་གཅིག་}}: $1 གྱི་སྤྱིད་མི་ཚད་གཞི་ངེས་ཅན་རྣམས་ལ་ཡོད་',
'versionrequired' => 'ཝེ་ཁེ་བརྒྱུད་ལམ་གྱི་འགྱུར། MediaWiki Version $1 དེ་དགོས་འདུག།',
-'versionrequiredtext' => 'ཤོག་ངོས་འདི་བེད་སྤྱོད་པར་ཝེ་ཁེ་བརྒྱུད་ལམ་གྱི་འགྱུར་$1འདི་དགོས། [[Special:འགྱུར། |འགྱུར་ཤོག་ངོས།]] འདེར་གཟིགས་རོགས།',
+'versionrequiredtext' => 'ཤོག་ངོས་འདི་བེད་སྤྱོད་པར་ཝེ་ཁེ་བརྒྱུད་ལམ་གྱི་འགྱུར་ $1 འདི་དགོས། [[Special:Version|version page]] འདིར་གཟིགས་རོགས།',
'ok' => 'འགྲིག',
'retrievedfrom' => '"$1"ལས་སླར་རྙེད་སོང།',
'youhavenewmessages' => 'ཁྱེད་ལ་འཕྲིན་གསར་$1($2)ཡོད།',
+'youhavenewmessagesmanyusers' => 'ཁྱེད་ལ་ $1 སྤྱོད་མི་མང་པོ་ཞིག་ནས་ ($2)འདུག།',
+'newmessageslinkplural' => '{{PLURAL:$1|འཕྲིན་ཐུང་གསར་པ་ཞིག་|999= འཕྲིན་ཐུང་གསར་པ།}}',
+'newmessagesdifflinkplural' => 'མཐའ་མའི་ {{PLURAL:$1|འགྱུར་བཅོས།|999=འགྱུར་བཅོས།}}',
'youhavenewmessagesmulti' => 'ཁྱེད་ལ་ $1 སྟེང་དུ་འཕྲིན་ཡིག་འདུག',
'editsection' => 'རྩོམ་སྒྲིག།',
'editold' => 'རྩོམ་སྒྲིག',
'collapsible-expand' => 'རྒྱ་སྐྱེད།',
'thisisdeleted' => '$1 ལ་ལྟ་བའམ་རང་ལོགས་བྱེད་རོགས།',
'viewdeleted' => ' $1 ལ་ལྟ་དགོས་སམ།',
+'restorelink' => '{{PLURAL:$1|བསུབས་པའི་རྩོམ་སྒྲིག|$1 བསུབས་པའི་རྩོམ་སྒྲིག}}',
'feedlinks' => 'འདྲན་ཆས། :',
+'feed-invalid' => 'རྒྱུན་མངགས་ཡ་ལན་ཕན་མེད་རེད་འདུག།',
'site-rss-feed' => '$1 ཡི་RSS འབྱུང་ཁུངས།',
'site-atom-feed' => '$1 ཡི་ཆ་ཤས་ཡ་ལན།',
'page-rss-feed' => '$1 ཡི་RSS འབྱུང་ཁུངས།',
# Main script and global functions
'nosuchaction' => 'བྱ་འགུལ་འདི་འདྲ་མེད།',
+'nosuchactiontext' => 'དྲ་ཚིགས་གཞིར་གཟུངས་ཀྱི་བྱ་བ་ཕན་མེད་རེད་འདུག།
+ཁྱེད་ཀྱི་དྲ་ཚིགས་ཁ་བྱང་འབྲི་སྟངས་ནོར་བ་ཡིན་སྲིད། ཡང་ན་དྲ་ཚིགས་ཁ་བྱང་ནོར་བ་ཞིག་ལ་སྦྲེལ་མཐུད་བྱེད་འདུག།
+{{SITENAME}} འདིར་གཉེན་ཆས་ཀྱི་ལས་རྩོལ་ཡིན་སྲིད།',
'nosuchspecialpage' => 'དམིགས་བསལ་ཤོག་ངོས་འདི་འདྲ་ཞིག་མི་འདུག',
+'nospecialpagetext' => '<strong>ཁྱེད་ཀྱི་ལུགས་མཐུན་མིན་པའི་དམིགས་བསལ་ཤོག་ངོས་ཞིག་ལ་རེ་ཞུ་བྱས་འདུག།</strong>
+ལུགས་མཐུན་གྱི་དམིགས་བསལ་ཤོག་ངོས་རྣམས་འདིར་གཟིགས་རོགས།
+[[Special:SpecialPages|{{int:specialpages}}]]',
# General errors
'error' => 'ནོར་འཁྲུལ།',
+'databaseerror' => 'རྨང་གཞིའི་གྲངས་མཛོད་ལ་ནོར་འཁྲུལ་འདུག།',
+'databaseerror-text' => 'རྨང་གཞིའི་གྲངས་མཛོད་ལ་ནོར་འཁྲུལ་འདོན་སོང།
+འདི་ཕལ་ཆེར་གཉེན་ཆས་ཀྱི་ལས་རྩོལ་ཡིན་སྲིད།',
+'databaseerror-textcl' => 'རྨང་གཞིའི་གྲངས་མཛོད་ལ་ནོར་འཁྲུལ་འདོན་སོང།',
+'databaseerror-query' => 'འཚོལ་འདྲི། $1',
+'databaseerror-function' => 'རྩོལ་ནུས། $1',
+'databaseerror-error' => 'ནོར་སྐྱོན། $1',
+'laggedslavemode' => '<strong>ཉེན་བརྡ།</strong> ཤོག་ངོས་འདི་ཐོག་ཉེ་ཆར་གྱི་དུས་བསྟུན་ཁ་གསབ་བྱས་མེད།',
'readonly' => 'གཞི་གྲངས་མཛོད་ཟྭ་བརྒྱབ་པ།',
+'enterlockreason' => 'བཀག་སྡོམ་བྱས་དགོས་རྐྱེན་བཀོད་རོགས དེ་མིན་བཀག་སྡོམ་འདི་དུས་ཚོད་ནམ་ཞིག་ལ་བཀྲོལ་རྒྱུ་ཡིན་མིན་སོགས་བཀོད་རོགས།',
+'readonlytext' => 'རྨང་གཞི་གྲངས་མཛོད་འདི་གནས་སྐབས་བཀག་སྡོམ་བྱས་འདུག། ཕལ་ཆེར་རྨང་གཞི་གྲངས་མཛོད་འདི་ཉར་འཚག་བྱད་བཞིན་འདུག།
+$1 རྒྱུ་རྐྱེན་འདི་འོག་དོ་དམ་པས་བཀག་སྡོམ་བྱས་འདུག།',
'missing-article' => 'གཞི་གྲངས་མཛོད་ནང་ཤོག་ངོས་ཀྱི་ཡི་གེ་བཙལ་ཐུབ་ཀྱི་མི་འདུག་པས། "$1" $2
ཕལ་ཆེར་འདི་གཤམ་ཀྱི་འགོག་རྐྱེན་ལོ་རྒྱུས་སུབ་པ་འམ་དུས་ཡོལ་ཀྱི་ཁྱད་པར་སོགས་ཀྱི་རྒྱུ་རྐྱེན་ཡིན།
གལ་སྲིད་དེ་ལྟར་མིན་ཚེ། ཕལ་ཆེར་ཁྱེད་ཀྱི་ནོར་སྐྱོན་འཙལ་རྙེད་བྱང་བས། [[Special:ListUsers/sysop|administrator]], དྲ་རྒྱའི་ས་ཚིགས་འདི་ཐོག་ཞུ་ཡིག་འབུལ་གནང་ཡོང་བ་མཁྱེན།',
'internalerror' => 'ནང་ལོག་ནོར་སྐྱོན།',
'internalerror_info' => 'ནང་ལོགས་ནོར་སྐྱོན། $1',
'filecopyerror' => '"$1" "$2"ལ་འདྲ་བཤུ་བྱེད་མ་ཐུབ།',
+'filerenameerror' => '"$1" ནས་ "$2" བར་མིང་བརྗེ་སྒྱུར་ཐུབ་མ་སོང།',
'filedeleteerror' => '"$1"ཟེར་བ་སུབ་མ་ཐུབ།',
-'filenotfound' => '"$1"ཟེར་བའི་ཡིག་ཆ་མ་རྙེད་པ།',
+'directorycreateerror' => 'དཀར་ཆག་ "$1" འདི་བཟོ་ཐུབ་མ་སོང།',
+'filenotfound' => '"$1" ཟེར་བའི་ཡིག་ཆ་རྙེད་ཀྱི་མིན་འདུག།',
+'fileexistserror' => 'ཡིག་ཆ་ "$1" འདི་འབྲི་ཐུབ་ཀྱིན་མི་འདུག། ཡིག་ཆ་འདི་བཞིན་འདི་སྔ་ནས་འདུག།',
+'unexpected' => 'ཡོང་མི་སྲིད་པའི་ཁྱད་ཆོས། : "$1"="$2"',
+'formerror' => 'ནོར་འཁྲུལ།:འགེངས་ཤོག་འབུལ་ཐུབ་མ་སོང།',
+'badarticleerror' => 'ཤོག་ངོས་འདི་ཐོག་ལག་བསྟར་བྱེད་ཐུབ་ཀྱི་མ་རེད།',
+'cannotdelete' => 'ཤོག་ངོས་འམ་ཡིག་ཆ་ "$1" འདི་སུབས་ཐུབ་མ་ཀྱི་མིན་འདུག། ཕལ་ཆེར་གཞན་ཞིག་གི་སུབས་ཚར་འདུག།',
+'cannotdelete-title' => 'ཤོག་ངོས་ "$1" འདི་སུབས་ཐུབ་མ་སོང།',
+'delete-hook-aborted' => 'འབྲི་སུབས་འདི་བཀག་འགོག་བྱས་སོང། རྒྱུ་རྐྱེན་བྲིས་མིན་འདུག།',
'badtitle' => 'ཁ་བྱང་སྐྱོན་ཅན།',
'viewsource' => 'ཁོངས་ལ་ལྟ་བ།',
'actionthrottled' => 'བྱ་འགུལ་ཁེགས་སོང་།',
'gotaccount' => '$1 སྔོན་ཚུད་ནས་རྩིས་ཁྲ་ཡོད་དམ།',
'gotaccountlink' => 'ནང་འཛུལ།',
'userlogin-resetlink' => 'ཁྱེད་ཀྱི་ནང་འཛུལ་ཀྱི་ཞིབ་ཕྲའི་གནད་དོན་བརྗེད་འདུག་གམ།',
-'createaccountmail' => 'à½\82ློà½\82à¼\8bའà½\95ྲིà½\93à¼\8bསྤྱà½\91à¼\8bà½\91ེ།',
+'createaccountmail' => 'སà¾\90à½\96སà¼\8bའà½\95ྲལà¼\8bརà½\84à¼\8bà½\98ོསà¼\8bà½\82ྱིà¼\8bà½\82སà½\84à¼\8bà½\96འིà¼\8bཨà½\84à¼\8bà½\82ྲà½\84སà¼\8bà½\96ེà½\91à¼\8bསྤྱà½\91à¼\8bà½\94à¼\8bà½\91à½\84à¼\8d ལྷà½\93à¼\8bà½\91ུà¼\8bà½\82ློà½\82à¼\8bའà½\95ྲིà½\93à¼\8bà½\81à¼\8bà½\96ྱà½\84à¼\8bà½\84ེསà¼\8bà½\82à½\8fà½\93à¼\8bà½\9eིà½\82à¼\8bལà¼\8bà½\96སà¾\90ུརà¼\8bརོà½\82ས།',
'createaccountreason' => 'རྒྱུ་མཚན།',
'badretype' => 'ལམ་ཡིག་གང་བཅུག་པ་ཐོ་ཐུག་མ་བྱུང་།',
-'userexists' => 'à½\98ིà½\84à¼\8bའà½\91ིà¼\8bà½\96ེà½\91à¼\8bསྤྱོà½\91à¼\8bà½\96ྱསà¼\8bà½\9fིà½\93à¼\8bà½\94སà¼\8bà½\98ིà½\84à¼\8bà½\82à½\9eà½\93à¼\8bà½\9eིà½\82à¼\8bà½\82à½\91à½\98་རོགས།',
+'userexists' => 'སྤྱོà½\91à¼\8bà½\98ིà½\84à¼\8bའà½\91ིà¼\8bསà¾\94ོà½\93à¼\8bà½\9aུà½\91à¼\8bà½\93སà¼\8bà½\96ེà½\91à¼\8bསྤྱོà½\91à¼\8bà½\96ྱསà¼\8bà½\9fིà½\93à¼\8bའà½\91ུà½\82à¼\8bà½\94སà¼\8d à½\98ིà½\84à¼\8bà½\82à½\9eà½\93à¼\8bà½\9eིà½\82à¼\8bà½\82à½\91à½\98à¼\8bà½\82à½\93à½\84་རོགས།',
'loginerror' => 'ནང་འཛུལ་ནོར་སྐྱོན།',
'loginsuccesstitle' => 'ནང་འཛུལ་བདེ་བར་གྲུབ།',
'nosuchusershort' => 'སྤྱོད་མི་"$1"ཟེར་བ་མི་འདུག དག་ཆར་བསྐྱར་ཞིབ་བྱོས།',
'newpassword' => 'ལམ་ཡིག་གསར་བ།',
'retypenew' => 'ལམ་ཡིག་གསར་བ་བསྐྱར་འཇུག་བྱོས།',
'resetpass_submit' => 'ལམ་ཡིག་བསྒྲིགས་ནས་ནང་འཛུལ་བྱེད་པ།',
-'changepassword-success' => 'ལà½\98à¼\8bཡིà½\82à¼\8bà½\96à½\91ེà¼\8bལེà½\82སà¼\8bà½\84à½\84à¼\8bà½\96རà¾\97ེསà¼\8bà½\9fིà½\93à¼\8d à½\91à¼\8bà½\93ིà¼\8bà½\93à½\84à¼\8bའà½\9bུལà¼\8bà½\96ྱེà½\91à¼\8bà½\96à½\9eིà½\93à¼\8bà½\94à¼\8bà¼\8bà¼\8b',
+'changepassword-success' => 'à½\81ྱེà½\91à¼\8bà½\80ྱིà¼\8bà½\82སà½\84à¼\8bà½\96འིà¼\8bཨà½\84à¼\8bà½\96རà¾\97ེà¼\8bའà½\82ྱུརà¼\8bལེà½\82སà¼\8bà½\82ྲུà½\96à¼\8bà½\96ྱུà½\84à¼\8bསོà½\84à¼\8d',
'resetpass_forbidden' => 'ལམ་ཡིག་བརྗེ་མི་ཐུབ།',
'resetpass-submit-loggedin' => 'ལམ་ཡིག་བརྗེ་བ།',
'resetpass-submit-cancel' => 'རྩིས་མེད་ཐོངས།',
'loginreqpagetext' => 'ཤོག་ངོས་གཞན་རྣམས་ལྟ་བར་ངེས་པར་དུ་$1བྱ་དགོས།',
'accmailtitle' => 'ལམ་ཡིག་བཏང་ཟིན།',
'newarticle' => '(གསར་བ)',
+'noarticletext' => 'ཤོག་ངོས་འདི་ནང་ད་གནས་ཡིག་གེ་མིན་འདུག།
+ཁྱེད་ཀྱིས་ཤོགངོས་གཞན་ཁག་ནང་ [[Special:Search/{{PAGENAME}}|ཤོག་ངོས་འདིའི་འགོ་བརྗོད་འཚོལ་རོགས།]] <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} དེ་དང་འབྲེལ་བའི་དོ་ཟླའི་ཐོར་འཚོལ་རོགས།],',
+'noarticletext-nopermission' => 'ཤོག་ངོས་འདི་ནང་ད་གནས་ཡི་གེ་མིན་འདུག།
+ཁྱེད་ཀྱིས་ཤོགངོས་གཞན་ཁག་ནང་ [[Special:Search/{{PAGENAME}}|ཤོག་ངོས་འདིའི་འགོ་བརྗོད་འཚོལ་རོགས།]] དེ་མིན་ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} དེ་དང་འབྲེལ་བའི་དོ་ཟླའི་ཐོར་འཚོལ་རོགས།]</span> ཡིན་ནའང་ཁྱེད་ལ་ཤོག་ངོས་འདི་གསར་སྐྲུན་བྱེད་པའི་ཆོག་མཆན་མིན་འདུག།',
'previewnote' => '"འདི་ནི་སྔོན་ལྟ་ཙམ་ཡིན་པ་ཡིད་ལ་འཇགས་རོགས། "ཁྱེད་ཀྱི་བཟོ་བཅོས་ད་དུང་ཉར་ཚགས་བྱས་མི་འདུག',
'editing' => '$1རྩོམ་སྒྲིག་བྱེད་བཞིན་པ།',
'editingsection' => ' $1 (སྡེ་ཚན) ལ་རྩོམ་སྒྲིག་བྱེད་བཞིན་པ།',
'recreate-moveddeleted-warn' => "'''ཉེན་བརྡ་:རང་གིས་སུབ་ཚར་བའི་ཤོག་ལེ་ཞིག་བསྐྱར་བཟོ་བྱེད་ཀྱི་འདུག་ '''
ཁྱེད་རང་གལ་སྲིད་མུ་མཐུད་ཤོག་ལེ་འདི་བཟོ་ཅོས་བྱེད་འདོད་ན་སྟབས་བདེ་ཞིག་ལ་ང་ཚོས་སུབ་བཟིན་པའི་ཤོག་ལེ་འདིར་ཉར་ཡོད།",
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '<strong> ཉེན་བརྡ།</strong> དཔེ་དཔང་གི་ཚད་གཞི་ཧ་ཅང་ཆེན་པོ་འདུག། དཔེ་དཔང་ཁ་ཅིག་ཚུད་ཐུབ་ཀྱི་མ་རེད།',
+'post-expand-template-inclusion-category' => 'དཔེ་དཔང་གི་ཚད་གཞི་བརྒལ་བའི་ཤོག་ངོས།',
+
# History pages
'viewpagelogs' => 'ཤོག་ངོས་འདིའི་ཉིན་ཐོ་ལ་ལྟ་བ།',
'currentrev-asof' => 'མཐའ་འཇུག་ཀྱི་ཞིབ་བཤེར། $1',
'rev-showdeleted' => 'སྟོན།',
'revdelete-show-file-submit' => 'ཡིན།',
'revdelete-radio-same' => 'བཟོ་བཅོས་མ་བྱེད།',
-'revdelete-radio-set' => 'ཡིà½\93།',
+'revdelete-radio-set' => 'à½\98à½\84ོà½\93à¼\8bà½\98ེà½\91à¼\8bà½\80ྱི།',
'revdel-restore' => 'བཅོས་སུ་རུང་བ།',
'pagehist' => 'ཤོག་ངོས་ལོ་རྒྱུས།',
'revdelete-reasonotherlist' => 'རྒྱུ་མཚན་གཞན་པ།',
# Diffs
'lineno' => 'ཐིག་ཕྲེང་$1:',
+'compareselectedversions' => 'འདེམས་བཞིན་པའི་བཟོ་འཅོས་དཔར་གཞིའི་ཁྱད་པར་སྟོན།',
'editundo' => 'ཕྱིར་འཐེན།',
# Search results
'notextmatches' => 'ཤོག་ངོས་ཡིག་འབྲུ་མཚུངས་པ་མི་འདུག',
'prevn' => 'སྔོན་མ་{{PLURAL:$1|$1}}',
'nextn' => 'རྗེས་མ་{{PLURAL:$1|$1}}',
+'prevn-title' => 'དེ་སྔོན་ $1{{PLURAL:$1|གྲུབ་འབྲས།}}',
+'nextn-title' => 'དེ་རྗེས་ཀྱི་ $1{{PLURAL:$1|གྲུབ་འབྲས།}}',
'shown-title' => 'མིག་སྔར་སྟོན་པ། $1{{PLURAL:$1|གྲུབ་འབྲས།}}ཤོག་ངོས་ལྟར།',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)ལ་ལྟ་བ།',
'searchmenu-new' => 'ཝེ་ཁི་སྟེང་ལ་ <strong>ཤོག་ངོས་གསར་པ་</strong> "[[:$1]]" བཟོས། {{PLURAL:$2|0=|ཁྱེད་ཀྱི་འཚོལ་ཞིབ་བྱས་པའི་ཤོག་ངོས་རྣམས་ལ་ཡང་གཟིགས་རོགས།.|མ་ཟད་འཚོལ་ཞིབ་བྱས་པའི་གྲུབ་འབྲས་གཞན་རྣམས་ལ་ཡང་གཟིགས་རོགས།}}',
'searchprofile-articles' => 'ནང་དོན་ཤོག་ངོས།',
'searchprofile-project' => 'རོགས་རམ་དང་འཆར་གཞིའི་ཤོག་ངོས་',
+'searchprofile-images' => 'སྨྱན་མང་བརྒྱུད་ལམ།',
'searchprofile-everything' => 'ཚང་མ་',
'searchprofile-advanced' => 'མཐོ་རིམ་',
'searchprofile-articles-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
'searchprofile-project-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
'searchprofile-images-tooltip' => 'ཡིག་ཆ་འཚོལ་བ།',
'searchprofile-everything-tooltip' => 'བརྗོད་དོན་ཚང་མ་འཚོལ་གཞིབ་བྱེད་(གྲོས་མེས་ཤོག་ངོས་ཡང་འཚུད་པ་)',
+'searchprofile-advanced-tooltip' => 'རང་སྒྲུབ་མིང་བར་ནང་འཚོལ་རོགས།',
'search-result-size' => '$1({{PLURAL:$2|1 ཚིག། |$2 ཚིག།}})',
'search-redirect' => '($1རིམ་འགྲེམ།)',
'search-section' => '(ཚན་པ $1)',
'search-suggest' => '$1 ལ་ཟེར་བ་ཡིན་ནམ།',
'search-interwiki-caption' => 'སྲིང་མོའི་ལས་འཆར།',
-'search-interwiki-default' => '$1ལས་རྙེད་པ།',
+'search-interwiki-default' => '$1 ནས་འབྱུང་བའི་གྲུབ་འབྲས།',
'search-interwiki-more' => '(དེ་ལས་མང་བ།)',
'search-relatedarticle' => 'འབྲེལ་ཡོད།',
'searchrelated' => 'འབྲེལ་ཡོད།',
'searchall' => 'ཚང་མ།',
+'showingresultsheader' => '{{PLURAL:$5|གྲུབ་འབྲས་ <strong>$1</strong> ཡི་<strong>$3</strong>གྲབ་འབྲས། <strong>$1 - $2</strong> ཡི་ <strong>$3</strong>}} ཆེད་དུ་ <strong>$4</strong>',
'search-nonefound' => 'ཁྱེད་ཀྱི་འདྲི་ཞིབ་དང་མཐུན་པའི་ལན་མི་འདུག་',
'powersearch-legend' => 'ཞིབ་ཏུ་འཚོལ་བ།',
'powersearch-ns' => 'མིང་གནས་ནང་འཚོལ་བ།',
'prefs-personal' => 'སྤྱོད་མིའི་སྤྱི་ཁོག',
'prefs-rc' => 'ཉེ་བའི་བཟོ་བཅོས།',
'prefs-watchlist' => 'མཉམ་འཇོག་ཐོ།',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'མང་མཐར་ཡང་ $1 {{PLURAL:$1|ཉིན།|ཉིན།}}',
'prefs-watchlist-edits-max' => 'མང་ཚད་ཨང་གྲངས། ༡༠༠༠',
'prefs-resetpass' => 'ལམ་ཡིག་བརྗེ་བ།',
'prefs-changeemail' => 'དྲ་འཕྲིན་བརྗེ་བ།',
'stub-threshold-disabled' => 'ནུས་མེད་དུ་བཟོས་ཟིན།',
'timezoneregion-africa' => 'ཨ་ཧྥི་རི་ཀ',
'youremail' => 'གློག་འཕྲིན།:',
-'username' => 'དྲ་མིང་།:',
-'uid' => 'ནང་འཛུལ་ཐོ་མིང་།',
+'username' => '{{GENDER:$1|དྲ་མིང་།}}:',
+'uid' => '{{GENDER:$1|སྤྱོད་མིའི་}}ནང་འཛུལ་ཐོ་མིང་།:',
'yourrealname' => 'དངོས་མིང་།',
'yourlanguage' => 'སྐད་རིགས།',
'yournick' => 'མིང་རྟགས་སོ་མ།',
-'yourgender' => 'à½\95ོà¼\8bà½\98ོ།',
-'gender-male' => 'à½\95ོ།',
-'gender-female' => 'མོ།',
+'yourgender' => 'à½\81ྱེà½\91à¼\8bལà¼\8bà½\82à½\84à¼\8bའà½\91ྲà¼\8bà½\96ྱསà¼\8bà½\93སà¼\8bའà½\96ོà½\91à¼\8bà½\91à½\82ོསà¼\8bསà½\98།',
+'gender-male' => 'à½\81ོà¼\8bརà½\84à¼\8bà½\82ིསà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱསà¼\8bསོà½\84།',
+'gender-female' => 'à½\98ོà¼\8bརà½\84à¼\8bà½\82ིསà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bཤོà½\82à¼\8bà½\84ོསà¼\8bà½\90ོà½\82à¼\8bརྩོà½\98à¼\8bསà¾\92ྲིà½\82à¼\8bà½\96ྱསà¼\8bསོà½\84à¼\8d',
'email' => 'དྲ་འཕྲིན།',
'prefs-help-email' => 'གློག་འཕྲིན་ཁ་བྱང་ནི་རང་མོས་ཡིན། ཡིན་ན་འང་གལ་སྲིད་ཁྱེད་ཀྱི་གསང་བའི་ཨང་གྲངས་འརྗེད་པ་སོགས་བྱུང་ཚེ། གསང་བའི་ཨང་བསྐྱར་སྒྲིག་སྐབས་ངེས་པར་དུ་དགོས།',
'prefs-help-email-others' => 'ཁྱེད་ཀྱི་ཐད་ཀར་གློག་འཕྲིན་འམ་ཡང་ན་འགྲོ་གླེང་ཤོག་ངོས་བརྒྱུད་སྤྱོད་མི་གཞན་རྣམས་ཀྱི་ཁྱེད་ལ་འབྲེལ་བ་བྱེད་ཐུབ། ཁྱེད་རང་གི་གློག་འཕྲིན་ཁ་བྱང་སྤྱོད་མི་གཞན་གྱི་འབྲེལ་བ་བྱེད་སྐབས་གསང་གཏོལ་བྱེད་མི་སྲིད།',
'action-undelete' => 'ཤོག་ངོས་འདི་བསུབས་ཟིན་གསོ་བ།',
'action-block' => 'སྤྱོད་མི་འདི་རྩོམ་སྒྲིག་ལ་ཁོག་ཅིག',
'action-protect' => 'ཤོག་ངོས་འདིའི་སྲུང་སྐྱོབ་རིམ་པ་བསྒྱུར་བཅོས་གཏོང་བ།',
-'action-import' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bà½\9dེà¼\8bà½\81ེà¼\8bà½\82à½\9eà½\93à¼\8bà½\93སà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94།',
-'action-importupload' => 'ཤོà½\82à¼\8bà½\84ོསà¼\8bའà½\91ིà¼\8bཡིà½\82à¼\8bà½\86à¼\8bཡརà¼\8bའà½\87ུà½\82à¼\8bལསà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94།',
+'action-import' => 'à½\9dེà¼\8bà½\81ེà¼\8bà½\82à½\9eà½\93à¼\8bà½\93སà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94འིà¼\8bཤོà½\82à¼\8bà½\84ོས།',
+'action-importupload' => 'ཡིà½\82à¼\8bà½\86à¼\8bཡརà¼\8bའà½\87ུà½\82à¼\8bལསà¼\8bà½\93à½\84à¼\8bའà½\91ྲེà½\93à¼\8bà½\96ྱེà½\91à¼\8bà½\94འིà¼\8bཤོà½\82à¼\8bà½\84ོས།',
'action-unwatchedpages' => 'མ་བལྟས་ཤོག་ངོས་ཀྱི་ཐོ་ལ་ལྟ་བ།',
'action-userrights' => 'སྤྱོད་མིའི་ཐོབ་ཐང་ཡོངས་ལ་རྩོམ་སྒྲིག་བྱེད་པ།',
'action-userrights-interwiki' => 'ཝེ་ཁེ་གཞན་གྱི་སྤྱོད་མི་ཚོའི་སྤྱོད་མིའི་ཐོབ་ཐང་རྩོམ་སྒྲིག་བྱེད་པ།',
'recentchanges-legend' => 'ཉེ་བའི་བཟོ་བཅོས་འདེམས་ཚན།',
'recentchanges-label-newpage' => 'རྩོམ་སྒྲིག་འདིས་ཤོག་ངོས་གསར་བ་ཞིག་བཟོས་འདུག',
'recentchanges-label-minor' => 'འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིན།',
+'recentchanges-label-bot' => 'བཟོ་འཅོས་འདི་རང་འགུལ་འཕྲུལ་ཆས་ཀྱིས་བྱས་སོང།',
+'recentchanges-label-unpatrolled' => 'རྩོམ་སྒྲིག་འདི་སྐོར་ཞིབ་བྱེད་རྒྱུ་རེད་འདུག།',
'rclistfrom' => '$1 ལས་འགོ་བཙུགས་ཏེ་འགྱུར་བཅོས་གསར་བ་སྟོན་ཅིག',
'rcshowhideminor' => '$1 རྩོམ་སྒྲིག་ཕལ་བ།',
+'rcshowhidebots' => '$1 རང་འགུལ་འཕྲུལ་ཆས།',
'rcshowhideliu' => '$1 ཐོ་འགོད་སྤྱོད་མི།',
'rcshowhideanons' => 'མིང་མེད་སྤྱོད་མི $1',
'rcshowhidemine' => '$1ངའི་རྩོམ་སྒྲིག',
'recentchangeslinked-title' => '"$1" དང་འབྲེལ་བའི་འགྱུར་བཅོས།',
'recentchangeslinked-summary' => "འདི་ནི་དམིགས་གསལ་ཤོག་ངོས་༼ཡང་ན་དམིགས་གསལ་རྣམ་གྲངས་ཀྱི་ཁོངས་མི་༽དང་འབྲེལ་བའི་ཉེ་བའི་བཟོ་བཅོས་རེད།[[Special:Watchlist|yourwatchlist]] ནང་གི་ཤོག་ངོས་རྣམས་'''ཡིག་གཟུགས་སྦོམ་པོ་'''ཡིན།",
'recentchangeslinked-page' => 'ཤོག་ངོས་མིང་།',
+'recentchangeslinked-to' => 'ཤོག་ངོས་འདི་ཐོག་གི་བཟོ་འཅོས་རྣམས་ཤོག་ངོས་དེ་དང་འབྲེལ་བའི་འགྱུར་བ་སྟོན་རོགས།',
# Upload
'upload' => 'ཡིག་ཆ་ཡར་འཇུག',
'uploaddisabled' => 'ཡར་འཇུག་ནུས་མེད་བཟོས་འདུག',
'watchthisupload' => 'ཡིག་ཆ་འདི་ལ་གཟིགས།',
+'license' => 'གན་རྒྱ་ནང་ཞུགས་པ།',
'license-header' => 'གན་རྒྱ་ནང་ཞུགས་པ།',
# Special:ListFiles
'filehist-missing' => 'ཡིག་ཆ་ཆད་པ།',
'imagelinks' => 'ཡིག་ཆ་བེད་སྤྱོད་ཁུལ།',
'linkstoimage' => '{{PLURAL:$1|pagelinks|$1pagelink}} འདི་ལ་སྦྲེལ་ཡོད།',
+'sharedupload-desc-here' => 'ཡིག་ཆ་འདི་ནས་$1 རེད་འདུག། ལས་འཆར་གཞན་ཁག་ནང་བེད་སྤྱོད་ཡོད་ངེས།
+[$2 འགྲེལ་བརྗོད་ཤོག་ངོས་]འདིའི་འགྲེལ་བརྗོད་གཤམ་དུ་འཁོད་ཡོད།',
'shared-repo-from' => '$1 ནས།',
# File deletion
'allarticles' => 'ཤོག་ངོས་ཆ་ཚང་།',
'allpagessubmit' => 'སོང་།',
+# Special:Categories
+'categories' => 'སྡེ་ཚན།',
+
# Special:LinkSearch
-'linksearch' => 'ཕྱི་རོལ་སྦྲེལ་མཐུད།',
+'linksearch' => 'à½\95ྱིà¼\8bརོལà¼\8bསྦྲེལà¼\8bà½\98à½\90ུà½\91à¼\8bའà½\9aོལà¼\8bà½\9eིà½\96à¼\8d',
# Special:ListGroupRights
'listgrouprights-members' => 'ཁོངས་མིའི་ཐོ་ཡིག',
# Email user
'emailuser' => 'སྤྱོད་མི་འདིར་གློག་འཕྲིན་སྐུར་བ།',
-'emailmessage' => 'སà¾\90à½\91à¼\8bà½\86།',
+'emailmessage' => 'à½\96རྡà¼\8bའà½\95ྲིà½\93།',
# Watchlist
'watchlist' => 'ལྟ་ཞིབ་ཐོ།',
'protectexpiry' => 'དུས་ཡུན་རྫོགས་ཚད།',
'protect_expiry_invalid' => 'དུས་ཡུན་རྫོགས་ཚད་ནོར་བ།',
'protect-default' => 'སྤྱོད་མི་ཡོངས་ལ་ཕྱེ་བ།',
-'protect-fallback' => '"$1" ཆོག་མཆན་དགོས།',
-'protect-level-autoconfirmed' => 'སྤྱོà½\91à¼\8bà½\98ིà¼\8bà½\82སརà¼\8bà½\96à¼\8bà½\91à½\84à¼\8bà½\90ོà¼\8bà½\98ེà½\91à¼\8bརྣà½\98སà¼\8bà½\96à½\80à½\82à¼\8bའà½\82ོà½\82',
-'protect-level-sysop' => 'དོ་དམ་པ་ཁོ་ནར།',
+'protect-fallback' => 'སྤྱོད་མི་ "$1" གྱི་ཆོག་མཆན་ཡོད་པ་ཁོ་ནར་བྱེད་དབང་ཡོད།',
+'protect-level-autoconfirmed' => 'རà½\84à¼\8bའà½\82ུལà¼\8bà½\84ོསà¼\8bའà½\9bིà½\93à¼\8bà½\96ྱསà¼\8bà½\94འིà¼\8bསྤྱོà½\91à¼\8bà½\98ིà¼\8bà½\81ོà¼\8bà½\93རà¼\8bà½\96ྱེà½\91à¼\8bà½\91à½\96à½\84à¼\8bཡོà½\91à¼\8d',
+'protect-level-sysop' => 'à½\91ོà¼\8bà½\91à½\98à¼\8bà½\94à¼\8bà½\81ོà¼\8bà½\93རà¼\8bà½\96ྱེà½\91à¼\8bà½\91à½\96à½\84à¼\8bཡོà½\91à¼\8d',
'protect-cantedit' => 'ཁྱོད་ལ་ཤོག་ངོས་འདི་རྩོམ་སྒྲིག་གི་ཆོག་མཆན་མེད་པས་ངོས་འདི་ཡི་སྲུང་སྐྱོབ་རིམ་པ་ལ་བཟོ་བཅོས་བྱེད་མི་ཆོག',
'restriction-type' => 'ཆོག་མཆན།',
'restriction-level' => 'དམ་བསྒྲགས་ཚད་རིམ།',
'tooltip-save' => 'བཟོ་བཅོས་ཉར་ཚགས་བྱོས།',
'tooltip-preview' => 'ཉར་ཚགས་ཀྱི་སྔོན་དུ་བཟོ་བཅོས་ལ་བསྐྱར་ཞིབ་གནང་རོགས།',
'tooltip-diff' => 'གང་ལ་བཟོ་བཅོས་བྱས་པའི་ཡིག་འབྲུ་སྟོན་པ།',
+'tooltip-compareselectedversions' => 'ཤོག་ངོས་འདེམས་བཞིན་བ་གཉིས་ཀྱི་བར་བཟོ་འཅོས་དཔར་གཞིའི་ཁྱད་པར་སྟོན།',
+'tooltip-rollback' => '"རྒྱབ་སྒྲིལ།" ཞེས་པ་འདིས་ཤོག་ངོས་སྟེང་གི་དེ་སྔོན་གི་རྩོམ་སྒྲིག་མཐུན་འགྱུར་རྣམས་མཐེབ་གཞོང་གནོན་ཐེངས་གཅིག་ལ་ཕྱིར་ལྡོག་བྱེད་རྒྱུ་ཡིན།',
'tooltip-undo' => '"ཕྱིར་འཐེན།" ཞེས་པ་དེས་ཁྱེད་ཀྱི་རྩོམ་སྒྲིག་ཕྱིར་ལྡོག་པ་དང་སྔོན་འཚུད་བལྟ་ཞིབ་ཤོག་ངོས་ཁ་ཕྱེ་རྒྱུ་ཡིན། མཇུག་སྡོམ་ཀྱི་རྒྱུ་རྐྱེན་གླེང་འཇུག་རྒྱུ་ཡིན།',
'tooltip-summary' => 'ཕྱོགས་བསྡོམས་ཐུང་ངུ་ཞིག་འབྲིས་',
'nextdiff' => 'རྩོམ་སྒྲིག་གསར་གྲས། →',
# Media information
+'file-info-size' => '$1 × $2 བརྙན་རྒྱུ།, ཡིག་ཆ་ཆེ་ཆུང།: $3, རྣམ་གཞག།: $4',
'show-big-image' => 'ཐོག་མའི་ཡིག་ཆ།',
# Special:NewFiles
'ilsubmit' => 'འཚོལ།',
+# Bad image list
+'bad_image_list' => 'གཤམ་གྱི་རྣམ་གཞག་ལྟར་རྗེས་སུ་འབྲང་རོགས།:
+རེའུ་མིག་ཡོད་པ་ཁོ་ན་ཆ་འཇོག་བྱེད་རྒྱ་ཡིན།',
+
+# Metadata
+'metadata' => 'རྒྱུ་གཞི་གྲངས།',
+'metadata-help' => 'ཡིག་ཆ་འདིར་ཆ་འཕྲིན་གཞན་དག་པ་ཁ་ཅིག་འདུག། ཕལ་ཆེར་གྲངས་འཛིན་དཔར་ཆས་འམ་འབེབས་ཆས་ལས་གྲངས་འཛིན་ཡོང་ཆེད་བཟོས་པ་ཡིན།
+གལ་སྲིད་ཡིག་ཆ་འདིར་འགྱུར་བ་གཏོང་གནང་ན། དེ་སྔོན་གྱི་ལྟར་ཞིབས་ཚག་སྟོན་མི་ཐུབ།',
+'metadata-fields' => 'དཔར་རིས་ཀྱི་ནང་དོན་འདིར་ཡོད་པ་རྣམས་ནང་དོན་ཞིབ་ཕྲའི་སྐབས་སྟོན་རྒྱུ་ཡིན། དེ་མིན་རྣམས་རང་འགུལ་གྱི་འབས་ཞོགས་རྒྱུ་ཡིན།
+* བཟོ་སྐྲུན།
+* དབྱབས་གཟུགས།',
+
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'ཚང་མ།',
'namespacesall' => 'ཡོངས་རྫོགས།',
# Special:SpecialPages
'specialpages' => 'ཆེད་ལས་ཤོག་ངོས།',
+# Special:Tags
+'tag-filter' => 'འདེམས་འཚག། [[Special:Tags|Tag]]',
+
# New logging system
'rightsnone' => '(སྟོང་པ།)',
'tog-ccmeonemails' => 'Kas din un eilskrid eus ar posteloù a gasan da implijerien all',
'tog-diffonly' => "Arabat diskouez danvez ar pennadoù dindan an diforc'hioù",
'tog-showhiddencats' => 'Diskouez ar rummadoù kuzhet',
-'tog-noconvertlink' => 'Diweredekaat amdroadur an titloù',
'tog-norollbackdiff' => 'Na ziskouez an diff goude un distaoladenn',
'tog-useeditwarning' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
'tog-prefershttps' => "Implijout bepred ur c'hevreadur suraet pa vezit kevreet",
'revdelete-show-file-submit' => 'Ya',
'revdelete-selected' => "'''{{PLURAL:$2|Stumm dibabet|Stummoù dibabet}} eus [[:$1]] :'''",
'logdelete-selected' => "'''{{PLURAL:$1|Darvoud eus ar marilh diuzet|Darvoud eus ar marilh diuzet}} :'''",
-'revdelete-text' => "'''Derc'hel a raio ar stummoù ha darvoudoù diverket da zont war wel war istor ar bajenn hag er marilhoù, met dazrn eus ar boued n'hallo ket bezañ gwelet gant an dud.'''
-Gouest e vo merourien all {{SITENAME}} da dapout krog en testennoù kuzhet ha da ziziverkañ anezho en-dro dre an hevelep etrefas, nemet e vije bet lakaet e plas strishadurioù ouzhpenn.",
'revdelete-confirm' => "Kadarnait eo mat an dra-se a fell deoc'h ober, e komprenit mat ar pezh a empleg, hag en grit en ur zoujañ d'ar [[{{MediaWiki:Policy-url}}|reolennoù]].",
'revdelete-suppress-text' => "Ne zlefe an dilemel bezañ implijet '''nemet''' abalamour d'an abegoù da-heul :
* Titouroù personel dizere
'tog-ccmeonemails' => 'Pošalji mi kopije emailova koje pošaljem drugim korisnicima',
'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod prikaza razlika',
'tog-showhiddencats' => 'Prikaži skrivene kategorije',
-'tog-noconvertlink' => 'Onemogući konverziju naslova linkova',
'tog-norollbackdiff' => 'Nakon vraćanja zanemari prikaz razlika',
'tog-useeditwarning' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
'tog-prefershttps' => 'Uvijek koristi sigurnu konekciju kada sam prijavljen.',
'revdelete-show-file-submit' => 'Da',
'revdelete-selected' => "'''{{PLURAL:$2|Odabrana revizija|Odabrane revizije}} od [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Označena stavka zapisa|Označene stavke zapisa}}:'''",
-'revdelete-text' => "'''Obrisane revizije i događaji će i dalje biti vidljivi u historiji stranice i zapisima, ali dijelovi njenog sadržaja neće biti dostupni javnosti.'''
-Drugi administratori projekta {{SITENAME}} će i dalje moći pristupiti sakrivenom sadržaju i mogu ga ponovo vratiti kroz ovaj interfejs, osim ako nisu postavljena dodatna ograničenja.",
'revdelete-confirm' => 'Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].',
'revdelete-suppress-text' => "Ograničenja bi trebala biti korištena '''samo''' u slijedećim slučajevima:
* Osjetljive korisničke informacije
'tog-ccmeonemails' => "Envia'm còpia dels missatges que enviï als altres usuaris",
'tog-diffonly' => 'Amaga el contingut de la pàgina davall de la taula de diferències',
'tog-showhiddencats' => 'Mostra les categories ocultes',
-'tog-noconvertlink' => 'Inhabilita la conversió dels títols dels enllaços',
'tog-norollbackdiff' => 'Omet la pàgina de diferències després de realitzar una reversió',
'tog-useeditwarning' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
'tog-prefershttps' => 'Utilitza sempre una connexió segura en iniciar una sessió',
'revdelete-show-file-submit' => 'Sí',
'revdelete-selected' => "'''{{PLURAL:$2|Revisió seleccionada|Revisions seleccionades}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Esdeveniment del registre seleccionat|Esdeveniments del registre seleccionats}}:'''",
-'revdelete-text' => "'''Les revisions esborrades es mostraran encara als historials de les pàgines i als registres, si bé part del seu contingut serà inaccessible al públic.'''
-Els altres administradors de {{SITENAME}} encara podran accedir al contingut amagat i restituir-lo de nou mitjançant aquesta mateixa interfície, si no hi ha cap altra restricció addicional.",
'revdelete-confirm' => "Si us plau, confirmeu que és això el que desitgeu fer, que enteneu les conseqüències, i que esteu fent-ho d'acord amb [[{{MediaWiki:Policy-url}}|les polítiques acordades]].",
'revdelete-suppress-text' => "Les supressions '''només''' han de ser portades a terme en els següents casos:
* Informació potencialment difamatòria
'delete-edit-reasonlist' => "Edita els motius d'eliminació",
'delete-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. L'eliminació d'aquestes pàgines està restringida per a prevenir que hi pugui haver un desajustament seriós de la base de dades de tot el projecte {{SITENAME}} per accident.",
'delete-warning-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu en compte abans dur a terme l'acció.",
-'deleting-backlinks-warning' => "'''Avís:''' Altres pàgines enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
+'deleting-backlinks-warning' => "'''Avís:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
# Rollback
'rollback' => 'Reverteix edicions',
'tog-ccmeonemails' => 'Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.',
'tog-diffonly' => 'Ма гайта агlон чулацам шина башхонца цхьатерра йолуш',
'tog-showhiddencats' => 'Гайта къайлаха йолу категореш',
-'tog-noconvertlink' => 'Хааман хьажораг кхуллу гӀирс дӀабайа',
'tog-norollbackdiff' => 'Юха яккхиначул тӀаьхьа ма гайта версешан башхо',
'tog-useeditwarning' => 'Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь',
'tog-prefershttps' => 'Даима лела йе лардина системин чудалар',
'policy-url' => 'Project:Бакъо',
'portal' => 'Юкъараллин ков',
'portal-url' => 'Project:Юкъараллин ков',
-'privacy' => 'Ð\9fолиÑ\82ика кÑ\8aайлаÑ\85а',
-'privacypage' => 'Project:Ð\9fолиÑ\82ика кÑ\8aайлаÑ\85а',
+'privacy' => 'Ð\9aÑ\8aайлаÑ\85а полиÑ\82ика',
+'privacypage' => 'Project:Ð\9aÑ\8aайлаÑ\85а полиÑ\82ика',
'badaccess' => 'ТӀекхачарехь гӀалат',
'badaccess-group0' => 'Шуьга кхочуш далур дац дехарца деш дерг',
'nstab-main' => 'Яззам',
'nstab-user' => 'Декъашхо',
'nstab-media' => 'Медиа агӀо',
-'nstab-special' => 'Белха агlо',
+'nstab-special' => 'Белха агӀо',
'nstab-project' => 'Проектах лаьцна',
'nstab-image' => 'Файл',
'nstab-mediawiki' => 'Хаам',
'ns-specialprotected' => 'ХӀокху «{{ns:special}}» цӀерийн меттигашан агӀонаш таян йиш яц.',
'titleprotected' => "[[Декъашхочо:$1|$1]] дихкина ишта корта болуш агӀо кхоллар.
Гайтина бахьна: ''$2''.",
+'filereadonlyerror' => "файл хийца цатарло «$1», «$2» Ӏалаш ечехь ешаран хьолехь хилар бахьнехь.
+
+ХӀара хьал хӀоттиначу куьйгалхочо битина хаам: «''$3''».",
+'invalidtitle-knownnamespace' => 'Магийна боцу коьртамогӀа цӀерийн меттигца «$2» йоза «$3»',
+'invalidtitle-unknownnamespace' => 'Магийна боцу коьртамогӀа ца йовза меттигца $1 «$2» йозанца',
'exception-nologin' => 'ХӀинца а ахьа системин чохь болх беш бац',
+'exception-nologin-text-manual' => 'АгӀо тӀекхача луш хилийта оьшу $1.',
# Virus scanner
+'virus-badscanner' => "Нисяран гӀалат. Ца йовза вирусийн сканер: ''$1''",
'virus-scanfailed' => 'сканиран гӀалат (код $1)',
'virus-unknownscanner' => 'йозуш йоцу антивирус:',
'yourpasswordagain' => 'Юха язъе пароль:',
'createacct-yourpasswordagain' => 'Бакъ йе пароль',
'createacct-yourpasswordagain-ph' => 'Кхин цкъа язъе пароль',
-'remembermypassword' => 'Даглаца сан дӀаяздар хӀокху компьютеран тӀехь (цхьан $1 {{PLURAL:$1|динахь}})',
+'remembermypassword' => 'Ð\94аглаÑ\86а Ñ\81ан дÓ\80аÑ\8fздаÑ\80 Ñ\85Ó\80окÑ\85Ñ\83 компÑ\8cÑ\8eÑ\82еÑ\80ан Ñ\82Ó\80еÑ\85Ñ\8c (Ñ\86Ñ\85Ñ\8cан $1 {{PLURAL:$1|дийнаÑ\85Ñ\8c}})',
'userlogin-remembermypassword' => 'Дагахь латт ве/е со',
'userlogin-signwithsecure' => 'Ларийна цхьаьнакхетар',
'yourdomainname' => 'Хьан машан меттиг:',
'createacct-another-email-ph' => 'ДӀаязде электронан почтан адрес',
'createaccountmail' => 'хааман зӀене хула',
'createacct-realname' => 'Хьан цӀе (ца язйича мега)',
-'createaccountreason' => 'Ð\91аÑ\85Ñ\8cан:',
+'createaccountreason' => 'Ð\91аÑ\85Ñ\8cна:',
'createacct-reason' => 'Бахьна',
'createacct-reason-ph' => 'Стен кхуллуш ду ахьа керла декъашхочун дӀаяздар',
'createacct-captcha' => 'Кхерамзалла хьажар',
'login-abort-generic' => 'Сестемин довзийта тарцаделира',
'loginlanguagelabel' => 'Мотт: $1',
'pt-login' => 'ЧугӀо',
+'pt-login-button' => 'ЧугӀо',
'pt-createaccount' => 'Кхолла декъашхочун дӀаяздар',
'pt-userlogout' => 'Болх дӀаберзор',
# Change password dialog
'changepassword' => 'Хийца пароль',
+'resetpass_announce' => 'Чудахар чекх далийта хӀотта йе керла пароль.',
'resetpass_text' => '<!-- Кхузахь язъде хьай йоза -->',
'resetpass_header' => 'Хийца дӀаяздаран пароль',
'oldpassword' => 'Шираелла пароль:',
'resetpass-no-info' => 'ХӀара агӀо лело системин чугӀо.',
'resetpass-submit-loggedin' => 'Хийца пароль',
'resetpass-submit-cancel' => 'Цаоьшу',
+'resetpass-recycled' => 'Дехар до, хӀинца йолччул башха пароль хӀотта йе.',
+'resetpass-temp-emailed' => 'Ахьа чугӀош язйина цкъачунна электронан почте яийтина пароль. Чудахар чекхдалийта язъян еза керла пароль.',
'resetpass-temp-password' => 'Цхьан хана пароль:',
'resetpass-abort-generic' => 'Пароль хийцар дӀахедар',
+'resetpass-expired' => 'Хьан паролан хан чекхелла. Дехар до керла пароль хӀоттаяр.',
+'resetpass-expired-soft' => 'Хьа паролан хан чекхелла. Дехар до, харжа керла пароль я тӀетаӀе «{{int:resetpass-submit-cancel}}», и тӀехо хица.',
# Special:PasswordReset
'passwordreset' => 'Пароль кхоссар',
'passwordreset-text-many' => '{{PLURAL:$1|Пароль кхосса юза лахара цхьа меттиг.}}',
'passwordreset-legend' => 'Пароль кхоссар',
+'passwordreset-disabled' => 'ХӀокху вики чохь пароль кхоссар дӀадайина ду.',
+'passwordreset-emaildisabled' => 'Электронан почтан функцеш хӀокху вики чохь дӀаяйина ю.',
'passwordreset-username' => 'Декъашхочун цӀе:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Хьажа беанчу хааме?',
'post-expand-template-argument-category' => 'Кепашан аргументаш юкъахь йитина агӀонаш',
'parser-template-loop-warning' => 'Карийна кепаш юкъахь хилла шад: [[$1]]',
'parser-template-recursion-depth-warning' => 'Дозанал хьаладаьлла кӀоргенца юх юха дина кеп ($1)',
+'parser-unstrip-loop-warning' => 'ДӀачӀагӀанца pre карина',
# "Undo" feature
'undo-success' => 'Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.',
'rev-deleted-comment' => '(нисдарах лаьцна хаам дӀабаьккхина)',
'rev-deleted-user' => '(авторан цӏе дӏаяйина)',
'rev-deleted-event' => '(дӀаяздар дӀаяьккхина)',
+'rev-deleted-user-contribs' => '[декъашхочун цӀе я IP-адрес дӀаяхина — къинхьегаман агӀонгара нисдар къайлаяьккхина]',
+'rev-deleted-text-permission' => "ХӀара агӀона верси '''дӀаяьккхина''' ю.
+Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
'rev-deleted-text-unhide' => "ХӀара агӀона верси '''дӀаяьккхина''' ю.
Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].
Хьайна лаахь хьа йиш ю [$1 и верси хьажа].",
+'rev-suppressed-text-unhide' => "ХӀара агӀона верси '''къайлаяьккхина''' ю.
+Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].
+Хьайна лаахь хьа йиш ю [$1 и верси хьажа].",
'rev-deleted-text-view' => "ХӀара агӀона верси '''дӀаяьккхина''' ю.
Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
+'rev-suppressed-text-view' => "ХӀара агӀона верси '''къайлаяьккхина''' ю.
+Бахьна далина [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяьхнарш йолу тептар чохь].",
'rev-deleted-no-diff' => "АгӀона цхьа верси '''дӀаяьккхина''' хилар бахьнехь, хӀуна версийн башхалла хьажа цало.
Мадарра каро мега [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀаяккхаран тептар чохь].",
+'rev-suppressed-no-diff' => "Хьо хӀокху версешан башхала хьажа цало, царах цхьаъ '''дӀаяьккхина''' хилар бахьнехь.",
'rev-delundel' => 'гайта/къайла',
'rev-showdeleted' => 'гайта',
'revisiondelete' => 'ДӀаяха / меттахӀотае агӀона версеш',
'revdelete-show-file-confirm' => 'Бакъалла лаьий хьуна дӀаяьккхина файлан версега хьажа «<nowiki>$1</nowiki>» $2 тӀера, $3?',
'revdelete-show-file-submit' => 'Хlаъ',
'revdelete-selected' => "'''АгӀона [[:$1]] {{PLURAL:$2|1=къастина верси|къастина версеш}}:'''",
-'logdelete-selected' => "'''Тептар чура {{PLURAL:$1|1=хаьржина дӀаяздар|хаьржина дӀаяздарш}}:'''",
-'revdelete-text' => "'''ДӀаяхна агӀонашан версеш а хелларш а гуш хир ду агӀона истори а тептаран а чохь, амма цара чулацам куьйгалхошна бен тӀекхочу чохь хир бац.'''
-{{SITENAME}} проектан куьйгалхойн йиш хир ю хӀокху интерфейс чухула дӀааьхинарш меттахӀотта я.",
+'logdelete-selected' => '<strong>Тептар чура {{PLURAL:$1|хаьржина дӀаяздар|хаьржина дӀаяздарш}}:</strong>',
'revdelete-confirm' => 'Дехар до, бакъдар ахьа деш дерг [[{{MediaWiki:Policy-url}}|бакъонашца]] деш хилар.',
'revdelete-legend' => 'Доза тохар',
'revdelete-hide-text' => 'Къайладаккха хӀокху агӀона чура йоза',
'revdelete-radio-unset' => 'Гуш ерг',
'revdelete-suppress' => 'Къайлабаха хаамаш куьйгалхойх а',
'revdelete-unsuppress' => 'МеттахӀоьттина версешан дихкар къайладаккха',
-'revdelete-log' => 'Ð\91аÑ\85Ñ\8cан:',
+'revdelete-log' => 'Ð\91аÑ\85Ñ\8cна:',
'revdelete-submit' => 'Кхочушде {{PLURAL:$1|1=къастина версин|къастина версийн}}',
'revdelete-success' => "'''Версеш гуш хилар кхиамца хийцина.'''",
'revdelete-failure' => "'''Версеш гуш хилар хийца йиш яц:'''
** Бита йиш йоцу шех лаьцна хаам
** Бакъдоцург зуламан хаам',
'revdelete-otherreason' => 'Кхин бахьна/тӀетохар:',
-'revdelete-reasonotherlist' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cан',
+'revdelete-reasonotherlist' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cна',
'revdelete-edit-reasonlist' => 'Бахьанин список нисяр',
'revdelete-offender' => 'АгӀона версен автор:',
'mergehistory-invalid-destination' => 'Юзийна агӀона нийса корта хила еза.',
'mergehistory-autocomment' => 'Дехьа яьккхина [[:$1]] [[:$2]] чу',
'mergehistory-comment' => 'Дехьа яьккхина [[:$1]] [[:$2]] чу: $3',
-'mergehistory-reason' => 'Ð\91аÑ\85Ñ\8cан:',
+'mergehistory-reason' => 'Ð\91аÑ\85Ñ\8cна:',
# Merge log
'mergelog' => 'Цхьаьнатохаршан тептар',
'diff-empty' => '(башхалла яц)',
'diff-multi-sameuser' => '(ца {{PLURAL:$1|гайтина юккъера цхьа верси|гайтина юккъера цхьа версеш}} оьцу декъашхочун)',
'diff-multi-otherusers' => '(ца {{PLURAL:$1|гайтина юккъера верси|гайтина юккъера версеш}} {{PLURAL:$2|кхин цхьан декъашхочун|$2 декъашхойн}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|гайтина яц $1 юккъера верси, йина|не показаны $1 юккъера версеш, йина}} {{PLURAL:$2|$2 декъашхочо|$2 декъашхоша}})',
# Search results
'searchresults' => 'Лахарна хилам',
'preferences' => 'Гlирс нисбан',
'mypreferences' => 'ГӀирс нисбан',
'prefs-edits' => 'Нисдарши дукхалла:',
+'prefsnologintext2' => 'Оьшу $1, гӀирс дӀанисбан.',
'prefs-skin' => 'Кечяран тема',
'skin-preview' => 'Хьалха муха ю хьажа',
'datedefault' => 'Iад йитарца',
'prefs-rc' => 'Керла нисдарш',
'prefs-watchlist' => 'Тергаме могӀам',
'prefs-watchlist-days' => 'Денойн дукхалла:',
-'prefs-watchlist-days-max' => 'Къезиг $1 {{PLURAL:$1|дена}}',
+'prefs-watchlist-days-max' => 'Къезиг $1 {{PLURAL:$1|дена}}',
'prefs-watchlist-edits' => 'Тергаме могӀам чохь гойтучу нисдаршан максимальни дукхалла:',
'prefs-watchlist-edits-max' => 'Уггар дукха: 1000',
'prefs-watchlist-token' => 'Тергаме могӀанан токен:',
'prefs-misc' => 'Кхин гlирсаш',
'prefs-resetpass' => 'Хийца пароль',
'prefs-changeemail' => 'Хийца электрони почт',
+'prefs-setemail' => 'Электронан почтан адрес дӀахӀоттор',
'prefs-email' => 'Электронан почтан параметраш',
'prefs-rendering' => 'Арахьара хатl',
-'saveprefs' => 'lалашдан',
+'saveprefs' => 'Ӏалашдан',
'restoreprefs' => 'МеттахӀоттабе гӀирс Iад битарца',
'prefs-editing' => 'Тадар',
'rows' => 'МогӀанаш:',
'stub-threshold' => 'Кеч яран доза <a href="#" class="stub">коьртамогӀамна хьажорагаш</a> (байташках):',
'stub-threshold-disabled' => 'ДӀадайина',
'recentchangesdays' => 'Керла нисдар гайта динахь:',
-'recentchangesdays-max' => 'Къезиг $1 {{PLURAL:$1|дена}}',
+'recentchangesdays-max' => 'Къезиг $1 {{PLURAL:$1|дена}}',
'recentchangescount' => 'Iад йитарца гойтуш долу нисдаршан дукхалла',
'prefs-help-recentchangescount' => 'Гойту керла нисдарш, агӀонашан истори, тептарш.',
'prefs-help-watchlist-token2' => 'Иза хьан тергаме могӀан къайла догӀа ду.
'youremail' => 'Кехат яздо зlе цlе:',
'username' => '{{GENDER:$1|Декъашхочун цӀе}}:',
'uid' => 'Декъашхочун {{GENDER:$1|код}}:',
-'prefs-memberingroups' => '{{GENDER:$2|Тобана|Тобана}} {{PLURAL:$1|1=декъашхо|декъашхо}}:',
+'prefs-memberingroups' => '{{GENDER:$1|Тобана|Тобаншан}} {{PLURAL:$2|декъашхо|декъашхой}}:',
'prefs-registration' => 'ДӀаяздар кхолийна хан:',
'yourrealname' => 'Хьан бакъ цlе:',
'yourlanguage' => 'Мотт:',
'email' => 'Email',
'prefs-help-email' => 'Электронан почтан адрес цахӀоттийча а хӀумма дац, амма иза оьшар ю, нагахь хьуна хьай пароль йицлахь.',
'prefs-help-email-others' => 'Кхин дӀа цо кхечу декъашхошна йиш хуьлуьйту хьога электронан кехат даийта хьан агӀона чохь йолу хьажориган гӀоьнца.',
+'prefs-help-email-required' => 'Электронан почтан адрес яздан деза.',
'prefs-info' => 'Коьрта хаам',
'prefs-i18n' => 'Юкъардекъа мотт',
'prefs-signature' => 'КуьгтаӀор',
'right-bigdelete' => 'еха хийцаман истори йолу агӀонаш дӀаяхар',
'right-deletelogentry' => 'тептар чура билгала дӀаяздарш дӀадахар а меттахӀиттадар а.',
'right-deleterevision' => 'агӀонийн билгала версеш дӀаяхар а меттахӀиттаяр а',
-'right-deletedhistory' => 'дӀаяхна агӀонийн исторега хьажар дӀадаьккхина йоза тӀекхочехь доцуш',
-'right-deletedtext' => 'дӀадаьккхина йозане а хийцамашка а хьажар агӀонийн дӀаяхна версин юккъахь',
+'right-deletedhistory' => 'дÓ\80аÑ\8fÑ\8cÑ\85на агÓ\80онийн иÑ\81Ñ\82оÑ\80ега Ñ\85Ñ\8cажаÑ\80 дÓ\80адаÑ\8cккÑ\85ина йоза Ñ\82Ó\80екÑ\85оÑ\87еÑ\85Ñ\8c доÑ\86Ñ\83Ñ\88',
+'right-deletedtext' => 'дÓ\80адаÑ\8cккÑ\85ина йозане а Ñ\85ийÑ\86амаÑ\88ка а Ñ\85Ñ\8cажаÑ\80 агÓ\80онийн дÓ\80аÑ\8fÑ\8cÑ\85на веÑ\80Ñ\81ин Ñ\8eккÑ\8aаÑ\85Ñ\8c',
'right-browsearchive' => 'дӀаяхна агӀонаш лахар',
'right-undelete' => 'АгӀонаш меттахӀоттор',
'right-suppressrevision' => 'куьйгалхойх хьулйина йолу агӀонийн версеш меттахӀиттаяр а хьажар а',
'action-movefile' => 'хӀокху файлан цӀе хийца',
'action-upload' => 'чуяккха хӀара файл',
'action-reupload' => 'йолуш йолу файлан тӀехула дӀаязъяр',
+'action-upload_by_url' => 'URL адресан тӀера хӀара файл чуяккхар',
'action-writeapi' => 'нисдеш лелойо API',
'action-delete' => 'дӀаяккха хӀара агӀо',
'action-deleterevision' => 'агӀона хӀара верси дӀаяккхар',
'action-deletedhistory' => 'хӀокху агӀона дӀаяккхинцу исторега хьажар',
'action-browsearchive' => 'ДӀаяхна агӀонаш лахар',
'action-undelete' => 'хӀара агӀо меттахӀоттор',
+'action-suppressrevision' => 'хӀокху къайлаха йолу агӀон версеш хьажар а меттахӀоттор а',
'action-suppressionlog' => 'хӀокху долара тептаре хьажар',
'action-block' => 'хӀокху декъашхошка тадарш ца дайта дехкар хӀоттор',
+'action-protect' => 'хӀокху агӀона гӀоралин хьал хийцар',
+'action-rollback' => 'билгала агӀона тӀехьарчу декъашхочо дина нисдарш сиха юхадахар',
+'action-import' => 'кхечу википедешкара агӀонаш импорт ян',
+'action-importupload' => 'файлаш чуяхарца агӀонаш импорт ян',
'action-patrol' => 'кхечера нисдарш хьаьжна сана билгалдар',
'action-autopatrol' => 'шен нисдарш хьаьжна сана билгалдар',
+'action-unwatchedpages' => 'тергамехь йоцу агӀонийн могӀане хьажар',
+'action-mergehistory' => 'хӀокху агӀона хийцаман истори вовшахтохар',
+'action-userrights' => 'декъашхойн массо бакъонаш хийцар',
+'action-userrights-interwiki' => 'кхечу викеш чура декъашхойн бакъонаш хийцар',
'action-siteadmin' => 'хаамийн гуламан блоктохар а блокдӀаяккхар а',
'action-sendemail' => 'Электронан кехат дӀадахьийтар',
'action-editmywatchlist' => 'хьан тергаме могӀам табар',
'action-viewmywatchlist' => 'шен тергаме могӀане хьажар',
+'action-viewmyprivateinfo' => 'хьан долара хааме хьажар',
+'action-editmyprivateinfo' => 'хьан долара хаам табар',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
+'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|тӀеххьара чудаларца}}',
'enhancedrc-history' => 'истори',
'recentchanges' => 'Керла нисдарш',
'recentchanges-legend' => 'Гlирс нисбарна керла нисдарш',
'recentchanges-summary' => 'Лахахь гайтина хене хьаьжна Википедин агӀонашкахь тӀаьхьара бина хийцамаш',
-'recentchanges-noresult' => 'Билгал йинчу хенахь цӀа хийцамаш бина бац.',
+'recentchanges-noresult' => 'Билгал йинчу хенахь цхьа хийцамаш бина бац.',
'recentchanges-feed-description' => 'Тергам бе тlаьхьара вики хийцаман хlокху ларца.',
-'recentchanges-label-newpage' => 'Оцу нисдарца кхоллина керла агlо.',
+'recentchanges-label-newpage' => 'Оцу нисдарца кхоьллина керла агӀо.',
'recentchanges-label-minor' => 'Хlара нисдинарг къастийна жимо долушсан',
'recentchanges-label-bot' => 'ХӀара нисдар шаболх бечо дина',
'recentchanges-label-unpatrolled' => 'ХӀара нисдар хӀинца цхьано патрулировать дина дац',
'upload-prohibited' => 'Магийна доцу файлийн тайпанаш: $1.',
'uploadlog' => 'Чуяхаран тéптар',
'uploadlogpage' => 'Чуяхаран тéптар',
-'uploadlogpagetext' => 'Лахахьа гойтуш бу тӀаьххьара чуяхна файлийн могӀам.
+'uploadlogpagetext' => 'Ð\9bаÑ\85аÑ\85Ñ\8cа гойÑ\82Ñ\83Ñ\88 бÑ\83 Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\87Ñ\83Ñ\8fÑ\8cÑ\85на Ñ\84айлийн могÓ\80ам.
Ишта хьажа [[Special:NewFiles|керлачу файлийн галерей]].',
'filename' => 'Файлан цӀе',
'filedesc' => 'Файлах лаьцна',
'filetype-mime-mismatch' => 'Файлан шоръелла «.$1» оцунна MIME-тайпанца йогӀуш яц ($2).',
'filetype-banned-type' => "'''«.$1»''' — {{PLURAL:$4|1=ца магийна файлан тайп|ца магийна файлийн тайпанаш}}.
{{PLURAL:$3|1=Магийна файлан тайп ю|Магийна файлийн тайпанаш ю:}} $2.",
+'filetype-missing' => 'Файлан шоралла яц (масала, «.jpg»).',
+'empty-file' => 'Ахьа яхьийтина файл еса ю.',
+'file-too-large' => 'Ахьа яхьийтина файл тӀех йоккха ю.',
+'filename-tooshort' => 'Файлан цӀе тӀехь йоца ю.',
+'filetype-banned' => 'ХӀара файлийн тайп магийна яц.',
+'verification-error' => 'ХӀара файл хьаран чекх цаяьлла.',
+'illegal-filename' => 'Магийна йоцу файлан цӀе.',
+'overwrite' => 'йолуш йолу файл хийца магийна дац.',
+'unknown-error' => 'Ца довза гӀалат даьлла',
+'tmp-create-error' => 'Цатарло хана файл кхолла.',
+'tmp-write-error' => 'Хана файлан дӀаяздаран гӀалат',
'emptyfile' => 'Ахьа чуйоккхуш йолу файл еса хийла там бу. Иза гӀалат хийла мега файлан цӀе нийса язйина йоцу дела. Дехар до хьажа бакъалла и юьй ахьа чуйоккхуш йолу файл.',
'fileexists' => 'Иштта цӀе йолу файл йолуш ю. Дехар до, хьажа <strong>[[:$1]]</strong>, лаьий хьуна и хийца.
[[$1|thumb]]',
'savefile' => 'ДӀаязе йе файл',
'uploadedimage' => 'чуяьккхина «[[$1]]»',
'overwroteimage' => 'Чуяьккхина файлан керла верси «[[$1]]»',
+'uploaddisabled' => 'Чуяккхар магийна дац',
+'copyuploaddisabled' => 'URL тӀера чуяккхар дӀадайина ду.',
+'uploadfromurl-queued' => 'Хьа чуяккхар рогӀехь ду.',
+'uploaddisabledtext' => 'Файлаш чуяхар дӀадайина ду.',
+'uploadscriptednamespace' => "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '$1'",
'upload-source' => 'ДIайолалун файл',
'sourcefilename' => 'ДIайолалун файл:',
+'sourceurl' => 'Хьостан URL-адрес:',
'destfilename' => 'Файлан керла цӀе:',
'upload-maxfilesize' => 'Файлан: $1 максимальни барам',
'upload-description' => 'Файлах лаьцна',
MGP # Pentax
PICT # тайп тайпан
#</pre> <!-- битийша хlара могlа ша мабарра -->',
+'upload-success-subj' => 'Чуяккхар кхиамца чекхделира.',
+'upload-success-msg' => 'Хьа чуяккхар [$2] кхиамца чекхделира. Хиллачуьнга хьажа йиш ю кхузахь: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Чуяккхаран бала',
+'upload-failure-msg' => 'Хьа чуяккхаран бала карина [$2]:
+$1',
+'upload-warning-subj' => 'ДӀахьедар',
+'upload-warning-msg' => 'Чуйоккхуш [$2] гӀалат даьлла. И нисдан юхагӀо [[Special:Upload/stash/$1|upload form]] чу.',
+
+'upload-proto-error' => 'Нийса йоцу протокол',
'upload-file-error' => 'Чоьхьара гӀалат',
'upload-unknown-size' => 'Хууш доцу барам',
'upload-http-error' => 'Даьлла гӀалат HTTP: $1',
# File backend
'backend-fail-readonly' => 'ХӀара «$1» хӀинца еша бен таро яц. Бахьна: «$2»',
+# Special:UploadStash
+'uploadstash' => 'Къайлаха чуяккхар',
+
# HTTP errors
'http-timed-out' => 'Хьежаран хан чекхели HTTP-жоп дехаран.',
'license' => 'Бакъойалар:',
'license-header' => 'Бакъойалар',
'nolicense' => 'Яц',
+'license-nopreview' => '(Хьалха муха ю хьажа цало)',
'upload_source_file' => ' (файл хьан компьютер чохь ю)',
# Special:ListFiles
'listfiles_search_for' => 'Лаха хIуман цIарца:',
'imgfile' => 'файл',
'listfiles' => 'Файлаш',
+'listfiles_thumb' => 'Жима',
'listfiles_date' => 'Терахь',
'listfiles_name' => 'Файлан цӀе',
'listfiles_user' => 'Декъашхо',
'listfiles_description' => 'Цуьнах лаьцна',
'listfiles_count' => 'Верси',
'listfiles-show-all' => 'Гайта суьртийн шира версеш',
+'listfiles-latestversion' => 'Карара верси',
'listfiles-latestversion-yes' => 'ХӀаъ',
+'listfiles-latestversion-no' => 'ХӀахӀа',
# File description page
'file-anchor-link' => 'Файл',
'filehist-datetime' => 'Терахь/Хан',
'filehist-thumb' => 'Жима',
'filehist-thumbtext' => 'Жимо башхо оцу $1',
+'filehist-nothumb' => 'Миниатюра яц',
'filehist-user' => 'Декъашхо',
'filehist-dimensions' => 'Файлан барам',
'filehist-filesize' => 'Файлан барам',
'filehist-comment' => 'Билгалдаккхар',
+'filehist-missing' => 'Файл яц',
'imagelinks' => 'Файл лелор',
'linkstoimage' => '{{PLURAL:$1|ТӀаьхьайогӀу $1 агӀо тӀетойжина|ТӀаьхьайогlу $1 агӀонаш тӀетойжина|ТӀаьхьайогӀу $1 агӀонаш тӀетойжина}} хӀокху файлан:',
'nolinkstoimage' => 'АгӀонашчохь файл лелош яц.',
+'linkstoimage-redirect' => '$1 (файлан дӀасахьажораг) $2',
'duplicatesoffile' => '{{PLURAL:$1|Лахара файл ю дубликат|Лахара $1 файлаш ю дубликаташ}} хӀокху файлан ([[Special:FileDuplicateSearch/$2|мадарра]]):',
'sharedupload' => 'ХӀара хӀума оцун $1 чура ю иза хила мега лелош кхечу проекташкахь.',
'sharedupload-desc-here' => 'ХӀара файл $1 чура ю и лело йиш ю массо проекташкахь.
'filepage-nofile-link' => 'Ишта цӀе йолуш файл яц. Хьа йиш ю и [$1 чуяккха].',
'uploadnewversion-linktext' => 'Чуяккха керла верси хӀокху файлан',
'shared-repo-from' => '$1 чура',
-'shared-repo-name-wikimediacommons' => 'Ð\92икидlайÑ\83ллÑ\83Ñ\87е',
+'shared-repo-name-wikimediacommons' => 'Ð\92икигÑ\83лам',
# File reversion
'filerevert' => 'Тохарлера верси юхаерзор $1',
'filerevert-legend' => 'Файлан верси юхаерзо',
'filerevert-intro' => '<span class="plainlinks">Файл юхаерзош ю \'\'\'[[Media:$1|$1]]\'\'\' оцу [$4 верси $3, $2].</span>',
-'filerevert-comment' => 'Ð\91аÑ\85Ñ\8cан:',
+'filerevert-comment' => 'Ð\91аÑ\85Ñ\8cна:',
'filerevert-defaultcomment' => 'Юхаерзош ю оцу $2, $1 хенахь хила верси',
'filerevert-submit' => 'Юхаяккха',
'filerevert-success' => "Юхаерзина файл '''[[Media:$1|$1]]''' оцу [$4 верси $3, $2].",
'filedelete-legend' => 'ДӀаяккха файл',
'filedelete-intro' => "Хьо файл '''[[Media:$1|$1]]''' дӀаяккха гӀерта цунна массо истори цхьан.",
'filedelete-intro-old' => '<span class="plainlinks">Ахьа дӀайоккхуш ю верси \'\'\'[[Media:$1|$1]]\'\'\' цу [$4 $3, $2].</span>',
-'filedelete-comment' => 'Ð\91аÑ\85Ñ\8cан:',
+'filedelete-comment' => 'Ð\91аÑ\85Ñ\8cна:',
'filedelete-submit' => 'ДӀаяккха',
'filedelete-success' => '$1 дӀаяккхи.',
'filedelete-success-old' => "Верси '''[[Media:$1|$1]]''' цу $3 $2 дӀаяьккхина.",
'filedelete-nofile' => "'''$1''' яц.",
-'filedelete-otherreason' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cан:',
-'filedelete-reason-otherlist' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cан',
+'filedelete-otherreason' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cна:',
+'filedelete-reason-otherlist' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cна',
'filedelete-reason-dropdown' => '* Даржина долу дӀаяккхаран баьхьанаш
** Авторан бакъонаш талхор
** ЦхӀатера файлаш хилар',
'unusedtemplates' => 'Лелош доцу кепаш',
'unusedtemplatestext' => 'Кхузахь дагар йина «{{ns:template}}» цӀерийн меттиган агӀонаш, кхечу агӀонийн юкъа тоьхна йоцу.
Диц ма делахь хьажа кеп агӀонашкахь лелош юй.',
-'unusedtemplateswlh' => 'кÑ\85ин Ñ\85Ñ\8cажоÑ\80агаÑ\88',
+'unusedtemplateswlh' => 'кхин хьажоргаш',
# Random page
'randompage' => 'Цахууш нисйелла агӀо',
'statistics-files' => 'Чуйаьхна файлаш',
'statistics-edits' => 'Нисдаран дукхалла {{grammar:genitive|{{SITENAME}}}} дlа йолайаларца',
'statistics-edits-average' => 'Юккъера агӀонан нисдаран терахь',
+'statistics-views-total' => 'Массо хьажарш',
+'statistics-views-peredit' => 'Нисдаре хьажарш',
'statistics-users' => '[[ВП:Дlаязвалар|Дlаязбелларш]] шаберигге декъашхой чохь болу [[Special:ListUsers|(могlам)]]',
'statistics-users-active' => 'Жигара декъашхой',
'statistics-users-active-desc' => 'Декъашхой, муьлха цхьа хlум дина болу, кху {{PLURAL:$1|1=тlаьххьара $1 динахь|тlаьххьара $1 дийнахь}}',
+'statistics-mostpopular' => 'Дукху хьоьжу агӀонаш',
'pageswithprop' => 'АгӀонаш цхьадолу къастамашца',
'pageswithprop-legend' => 'АгӀонаш цхьадолу къастамашца',
'pageswithprop-text' => 'Кхузахь гойтуш ю агӀонаш цхьадолу къастамаш куьйга юху билгал даьхнарш.',
'pageswithprop-prop' => 'Къастаман цӀе:',
+'pageswithprop-submit' => 'Лаха',
'doubleredirects' => 'Шалха дIасахьажийнарш',
'doubleredirectstext' => 'ХӀокху агӀонехь ю дӀасахьажорашан тӀе хьажийна йолу дӀасахьажораш.
<del>ТӀехула сиз хаькхна </del>нисйина чарна.',
'double-redirect-fixed-move' => 'АгӀон [[$1]] цӀе хийцина, хӀинца иза дӀахьажийна оцу [[$2]]',
+'double-redirect-fixer' => 'ДӀасахьажинарш нисерг',
'brokenredirects' => 'ДIахаьдна долу дIасахьажораш',
'brokenredirectstext' => 'Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|байт}}',
-'ncategories' => '$1 {{PLURAL:$1|категори|категореш|категореш}}',
-'ninterwikis' => '$1 {{PLURAL:$1|1=Ñ\8eкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80аг|Ñ\8eкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80агаÑ\88}}',
-'nlinks' => '$1 {{PLURAL:$1|1=Ñ\85Ñ\8cажоÑ\80аг|Ñ\85Ñ\8cажоÑ\80агаÑ\88}}',
+'ncategories' => '$1 {{PLURAL:$1|категори|категореш}}',
+'ninterwikis' => '$1 {{PLURAL:$1|1=юкъарвики-хьажораг|юкъарвики-хьажоргаш}}',
+'nlinks' => '$1 {{PLURAL:$1|1=хьажораг|хьажоргаш}}',
'nmembers' => '$1 {{PLURAL:$1|1=хӀума|хӀумнаш}}',
-'nimagelinks' => 'Лелош ю $1 {{PLURAL:$1|агӀоначохь|агӀонашкахь|агӀонашкахь}}',
-'ntransclusions' => 'лелош ю $1 {{PLURAL:$1|агӀоначохь|агӀонашкахь|агӀонашкахь}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|хӀума|хӀумнаш}}',
+'nrevisions' => '$1 {{PLURAL:$1|верси|версеш}}',
+'nviews' => '$1 {{PLURAL:$1|хьажар}}',
+'nimagelinks' => 'Лелош ю $1 {{PLURAL:$1|агӀонгахь|агӀонашкахь}}',
+'ntransclusions' => 'лелош ю $1 {{PLURAL:$1|агӀонгахь|агӀонашкахь}}',
'specialpage-empty' => 'Дехаро хӀумма ца елла.',
'lonelypages' => 'Байлахь йисина агIонаш',
'lonelypagestext' => 'Кхузахь ю {{grammar:genitive|{{SITENAME}}}} кхечу агӀонашкахь тӀе хьажийна хьажорагаш йоцу агӀонаш.',
'uncategorizedtemplates' => 'Категореш йоцу кепаш',
'unusedcategories' => 'Йаьсса категореш',
'unusedimages' => 'Лелош доцу файлаш',
+'popularpages' => 'ГӀараяьлла агӀонаш',
'wantedcategories' => 'Оьшуш йолу категореш',
'wantedpages' => 'Оьшуш йолу агIонаш',
'wantedfiles' => 'Оьшуш йолу файлаш',
'protectedpages' => 'ГIаролла дина агIонаш',
'protectedpages-indef' => 'Хан йоцуш гӀоралла динарш бен',
'protectedpages-cascade' => 'Чахчарин гӀоралла бен',
+'protectedpages-noredirect' => 'Къайлаяха дӀасахьажийнарш',
'protectedpages-timestamp' => 'Терахь/хан',
'protectedpages-page' => 'АгӀо',
'protectedpages-expiry' => 'Чекхйолу',
'protectedpages-performer' => 'Декъашхо ларор',
'protectedpages-params' => 'ГӀаролийн параметраш',
-'protectedpages-reason' => 'Ð\91аÑ\85Ñ\8cан',
+'protectedpages-reason' => 'Ð\91аÑ\85Ñ\8cна',
'protectedpages-unknown-timestamp' => 'Хууш дац',
'protectedpages-unknown-performer' => 'Хууш доцу декъашхо',
'protectedtitles' => 'ГIаролла дина цIераш',
'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
'listusers-creationsort' => 'Кхоьллина хене хьаьжна нисъяр',
'listusers-desc' => 'Харжа къезиг хиларца',
+'usereditcount' => '$1 {{PLURAL:$1|нисдар|нисдарш}}',
'usercreated' => '{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2',
'newpages' => 'Керла агlонаш',
'newpages-username' => 'Декъашхо:',
'nopagetext' => 'Ишта агӀо яц.',
'pager-newer-n' => '{{PLURAL:$1|алсамо керла 1|алсамо керланаш $1}}',
'pager-older-n' => '{{PLURAL:$1|алсамо шира 1|алсамо ширниш $1}}',
+'suppress' => 'Хьулдар',
# Book sources
'booksources' => 'Жайнан хьосташ',
'allpages-bad-ns' => '{{SITENAME}} кху чохь ана цlераш яц «$1».',
'allpages-hide-redirects' => 'Къайлаяха дӀасахьажийнарш',
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Хьажа тӀехьарчу версега.',
+
# Special:Categories
'categories' => 'Категореш',
'categoriespagetext' => '{{PLURAL:$1|1=Лахара категореш чохь ю|Лахара категореш чохь ю}} агӀонаш я медиа-файлаш.
Кхузахь гойтуш яц [[Special:UnusedCategories|лелош йоцу категореш]].
Кхин дӀа [[Special:WantedCategories| хийла еза категореш]].',
'categoriesfrom' => 'Гучé яха категореш, оцу:',
+'special-categories-sort-count' => 'нисъе дукхаллица',
+'special-categories-sort-abc' => 'нисъе абатца',
# Special:DeletedContributions
'deletedcontributions' => 'Декъашхочун дӀабяккхина къинхьегам',
# Special:LinkSearch
'linksearch' => 'Арахьара хьажораг',
'linksearch-pat' => 'Лаха кеп:',
+'linksearch-ns' => 'ЦӀерийн ана:',
'linksearch-ok' => 'Лаха',
'linksearch-text' => 'Лело мега хӀоттош йолу символаш, масала, <code>*.wikipedia.org</code>.
Лакхара даржан домен мукъа хила еза , масала<code>*.org</code><br />
'listusersfrom' => 'Гучé баха декъашхой, болалуш болу тӀера:',
'listusers-submit' => 'Гайта',
'listusers-noresult' => 'Декъашхой цакарий.',
+'listusers-blocked' => '(блоктоьхна)',
# Special:ActiveUsers
'activeusers' => 'Жигар декъашхой могlам',
'listgrouprights-rights' => 'Бакъонаш',
'listgrouprights-helppage' => 'Help:Тобан бакъонаш',
'listgrouprights-members' => '(тобан могlам)',
+'listgrouprights-addgroup' => '{{PLURAL:$2|тоба|тобанаш}} тӀетоха ло: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|тобан чура дӀабаха|тобанаш чура дӀабаха}} ло: $1',
'listgrouprights-addgroup-all' => 'массо тобанийн юкъатоха йиш ю',
+'listgrouprights-removegroup-all' => 'тобан чура дӀабаха ло',
# Email user
'mailnologintext' => 'Электронан кехаташ кхехьийта йиш хилийта [[Special:UserLogin|системин чугӀо]] кхин декъашхошка хаамаш кхехьийта хьа [[Special:Preferences|гӀирса чохь]] бакъалла долу электронан почтан адрес хила деза.',
'emailuser' => 'Декъашхочун хааман кехат',
'emailuser-title-target' => 'Декъашхочунга кехат яздар',
'emailuser-title-notarget' => 'Декъашхочунга кехат яздар',
+'emailpage' => 'Декъашхочунга кехат яздар',
'emailpagetext' => 'ХӀокху агӀона гӀоьнца йиш ю {{GENDER:$1|декъашхочун}} электронан почте хаам бахьийта.
Хьоьга жоп лур ду ахьа [[Special:Preferences|хьайн гӀирса чу]] дӀаяздина долу адрес тӀе.',
'defemailsubject' => 'Хаам {{grammar:genitive|{{SITENAME}}}} чура бу',
'emailsenttext' => 'Хьан электроннан хаам дӏабахьийтина.',
'emailuserfooter' => 'ХӀара хаам бахийтинера $1 {{GENDER:$1|декъащхочо}} $2 {{GENDER:$2|декъащхочунга}} «декъашхочунга хаам» олучу функцин гӀоьнца {{SITENAME}} проектан.',
+# User Messenger
+'usermessage-summary' => 'Битта системан хаам.',
+'usermessage-editor' => 'Системан дӀакхачор',
+
# Watchlist
'watchlist' => 'Тергаме могӀам',
'mywatchlist' => 'Тергаме могӀам',
'watchlistfor2' => 'Цунна $1 $2',
+'nowatchlist' => 'Ха тергаме могӀа баьсса бу.',
'watchlistanontext' => 'Тергаме могӀоме хьажа я тая кхочушде $1.',
'watchnologin' => 'Системин чугӀо',
'addwatch' => 'Тергаме могӀам юкъа тоха',
'watch' => 'Тидам бе',
'watchthispage' => 'Тергам бé хlокху агlон',
'unwatch' => 'Тергамах къаста',
+'unwatchthispage' => 'ДӀадаккха терго яр',
'notanarticle' => 'Бац яззам',
+'notvisiblerev' => 'Верси дӀаяьккхина хила',
'watchlist-details' => 'Хьан тергаме могlамца $1 {{PLURAL:$1|агlо|агlонаш|агlонаш}} ю, дийцаре агlонаша йоцуш.',
'wlheader-enotif' => 'Электронан почте хаамаш байтар латина ду.',
'wlheader-showupdated' => "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
'wlnote2' => 'Лахахьа гайтина {{PLURAL:$1|тӀеххьара сахьт}} чохь бина хийцамаш $2 $3.',
-'wlshowlast' => 'Гайта тlаьххьара $1 сахьташ $2 денош $3',
+'wlshowlast' => 'Гайта тӀаьххьара $1 сахьт $2 де $3',
'watchlist-options' => 'Тергаме могlаман гlирс нисбар',
# Displayed when you click the "watch" button and it is in the process of watching
'unwatching' => 'Тергаме могӀанан чура дӀаяккхар…',
'enotif_reset' => 'Билгал йаь ерриге агӀонаш хьаьжна санна',
+'enotif_impersonal_salutation' => 'Декъашхо {{grammar:genitive|{{SITENAME}}}}',
+'enotif_subject_deleted' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 дӀаяьккхина',
+'enotif_subject_created' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 кхоьллина',
+'enotif_subject_moved' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 цӀе хийцина',
+'enotif_subject_restored' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 меттахӀоьттина',
+'enotif_subject_changed' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 хийцам бина',
+'enotif_body_intro_deleted' => 'Проектан «{{SITENAME}}» агӀо «$1» {{gender:$2|декъашхочо}} $2 дӀаяьккхина, хьажа $3',
+'enotif_body_intro_created' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 кхоьллина, карара верси ю : $3',
+'enotif_body_intro_moved' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 цӀе хийцина, карара верси ю : $3',
+'enotif_body_intro_restored' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 кхоьллина, карара верси ю : $3',
+'enotif_body_intro_changed' => 'Проектан «{{SITENAME}}» агӀо «$1» $PAGEEDITDATE {{gender:$2|декъашхочо}} $2 хийцам бина, карара верси ю : $3',
'changed' => 'хийцина',
# Delete
'dellogpage' => 'ДӀадаьхнарш долу тéптар',
'dellogpagetext' => 'Лахахь гойтуш ду дӀадахаршан тептар.',
'deletionlog' => 'дӀадаьхнарш долу тéптар',
-'deletecomment' => 'Ð\91аÑ\85Ñ\8cан:',
-'deleteotherreason' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cан/Ñ\82lетохар:',
-'deletereasonotherlist' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cан',
+'deletecomment' => 'Ð\91аÑ\85Ñ\8cна:',
+'deleteotherreason' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cна/Ñ\82Ó\80етохар:',
+'deletereasonotherlist' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cна',
'deletereason-dropdown' => '* Даржина долу дӀаяккхаран баьхьанаш
** зулма
** авторан лаамца
** авторан бакъонаш талхор',
'delete-edit-reasonlist' => 'Бахьанин список нисяр',
-'deleting-backlinks-warning' => "'''ДӀахьедар.''' Ахьа дӀайоккхуш йолчун тӀе товжийна кхин агӀонаш ю.",
+'deleting-backlinks-warning' => "'''ДӀахьедар:''' Ахьа дӀайоккхуш йолчун тӀе товжийна [[Special:WhatLinksHere/{{FULLPAGENAME}}|кхин агӀонаш]] ю.",
# Rollback
'rollback' => 'Юхабаккха хийцам',
'protect-title' => 'Оцунна «$1» гӀоралла дар',
'prot_1movedto2' => '«[[$1]]» цӀе хийцина оцу «[[$2]]»',
'protect-legend' => 'Бакъде гӀоралла дар',
-'protectcomment' => 'Ð\91аÑ\85Ñ\8cан:',
+'protectcomment' => 'Ð\91аÑ\85Ñ\8cна:',
'protectexpiry' => 'Чекхйолу:',
'protect_expiry_invalid' => 'Нийса йоцу хан гlаролла дlайаларехь.',
'protect_expiry_old' => 'Хан чаккхе — хьалхалера.',
'protect-othertime' => 'Кхин хан:',
'protect-othertime-op' => 'кхин хан',
'protect-otherreason' => 'Кхин бахьна/тӀетохар:',
-'protect-otherreason-op' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cан',
+'protect-otherreason-op' => 'Ð\9aÑ\85ин баÑ\85Ñ\8cна',
'protect-dropdown' => '* ГӀоралла дарна баьхьаш
** сих-сиха зулам дар
** дуккха спам хилар
'restriction-level-all' => 'массо барам',
# Undelete
-'undelete' => 'ДӀаяхна агӀонашка хьажар',
-'undeletepage' => 'Ð\94Ó\80аÑ\8fÑ\85ина агӀонашка хьажар а меттахӀоттор а',
+'undelete' => 'Ð\94Ó\80аÑ\8fÑ\8cÑ\85на агÓ\80онаÑ\88ка Ñ\85Ñ\8cажаÑ\80',
+'undeletepage' => 'Ð\94Ó\80аÑ\8fÑ\8cÑ\85на агӀонашка хьажар а меттахӀоттор а',
'undeletepagetitle' => "'''Лахахь гайтина хӀокху [[:$1]] агӀона дӀаяхина версеш'''.",
-'viewdeletedpage' => 'ДӀаяхна йолу агӀонашка хьажар',
+'viewdeletedpage' => 'Ð\94Ó\80аÑ\8fÑ\8cÑ\85на йолÑ\83 агÓ\80онаÑ\88ка Ñ\85Ñ\8cажаÑ\80',
'undelete-fieldset-title' => 'МеттахӀоттае версеш',
'undeleteextrahelp' => "Ерриге агӀонан истори меттахӀоттая массо а билгалонаш еса а йити '''«{{int:undeletebtn}}»''' тӀетаӀае.
ЦхӀайолу агӀонан версеш меттахӀоттая хьалха меттахӀоттош йолу версеш билгалъяьхна тӀетагӀе '''«{{int:undeletebtn}}»'''.",
'undeletelink' => 'хьажа/меттахӀоттае',
'undeleteviewlink' => 'хьажа',
'undeleteinvert' => 'Къастае массо',
-'undeletecomment' => 'Ð\91аÑ\85Ñ\8cан:',
-'undeletedrevisions' => '$1 {{PLURAL:$1|хийцамаш|хийцамаш|хийцамаш}} меттахӀоттайина',
+'undeletecomment' => 'Ð\91аÑ\85Ñ\8cна:',
+'undeletedrevisions' => '{{PLURAL:$1|меттахӀоттайина}} $1 {{PLURAL:$1|хийцам}}',
'undeletedfiles' => '$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина|файлаш меттахӀоттайина}}',
'undeletedpage' => "'''МеттахӀоттайина агӀо «$1».'''
'sp-contributions-blocked-notice-anon' => 'ХӀара IP-адрес хӀинца блоктоьхна ду.
Лахахь гойту блоктохаршан тептар чура тӀаьхьарлера дӀаяздар:',
'sp-contributions-search' => 'Къинхьегам лахар',
+'sp-contributions-suppresslog' => 'Декъашхочун дӀабаьккхина къинхьегам',
'sp-contributions-username' => 'IP-адрес я декъашхочун цӀе:',
'sp-contributions-toponly' => 'ТӀаьхьара бина хийцамаш гайта',
+'sp-contributions-newonly' => 'АгӀонаш кхоллар бен ма гайта',
'sp-contributions-submit' => 'Лаха',
# What links here
-'whatlinkshere' => 'Ð¥Ñ\8cажоÑ\80агаÑ\88 кÑ\85Ñ\83зе',
+'whatlinkshere' => 'Хьажоргаш кхузе',
'whatlinkshere-title' => 'ХӀокхунца «$1» йолу агӀонаш',
'whatlinkshere-page' => 'Агlо:',
'linkshere' => "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажорагца ю",
'isimage' => 'Файлан хьажораг',
'whatlinkshere-prev' => '{{PLURAL:$1|1=хьалхайодарг|хьалхайодарш}} $1',
'whatlinkshere-next' => '{{PLURAL:$1|тlаьхьайогlург|тlаьхьайогlурш|тlаьхьайогlурш}} $1',
-'whatlinkshere-links' => 'â\86\90 Ñ\85Ñ\8cажоÑ\80агаÑ\88',
-'whatlinkshere-hideredirs' => '$1 дlасахьажйар',
+'whatlinkshere-links' => '← хьажоргаш',
+'whatlinkshere-hideredirs' => '$1 дӀасахьажорш',
'whatlinkshere-hidetrans' => '$1 латораш',
-'whatlinkshere-hidelinks' => '$1 Ñ\85Ñ\8cажоÑ\80агаÑ\88',
+'whatlinkshere-hidelinks' => '$1 хьажоргаш',
'whatlinkshere-hideimages' => '$1 файлийн хьажорагаш',
'whatlinkshere-filters' => 'Литтарш',
Лахахь билгалде блоктохарна бахьна.',
'ipadressorusername' => 'IP-адрес я декъашхочун цӀе:',
'ipbexpiry' => 'Хан чекхйолу:',
-'ipbreason' => 'Ð\91аÑ\85Ñ\8cан:',
+'ipbreason' => 'Ð\91аÑ\85Ñ\8cна:',
'ipbreason-dropdown' => '* Белхан некъ дӀакъовлар бахьанаш:
** Харца хаам бар
** АгӀонан чураниг дӀаяккхар
'blocklist-expiry' => 'Чекхйолу',
'blocklist-by' => 'Цунна блоктоьхана куьйгалхо',
'blocklist-params' => 'Блоктохаран параметраш',
-'blocklist-reason' => 'Ð\91аÑ\85Ñ\8cан:',
+'blocklist-reason' => 'Ð\91аÑ\85Ñ\8cна:',
'ipblocklist-submit' => 'Лаха',
'infiniteblock' => 'хан чаккхе йоцуш',
'expiringblock' => 'чекхйолу $1 $2',
'block-log-flags-nousertalk' => 'шин дийцаре агӀо тая лууш дац',
'block-log-flags-hiddenname' => 'декъашхочун цӀе къайлаяьккхина',
'ipb-needreblock' => 'ХӀара $1 {{GENDER:$1|блоктоьхна ву|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметраш хийца?',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Кхин блоктохар|Кхин блоктохарш}}',
'unblock-hideuser' => 'Декъашхочун тӀера блокдӀаяккха хьа таро яц, цуна цӀе хьулйина хилар бахьанехь.',
# Move page
'movesubpage' => '{{PLURAL:$1|1=Бухара агӀо|Бухара агӀонаш}}',
'movesubpagetext' => 'ХӀокху агӀона $1 {{PLURAL:$1|1=бухара агӀо ю|бухара агӀонаш ю}}.',
'movenosubpage' => 'ХӀокху агӀона бухара агӀонаш яц.',
-'movereason' => 'Ð\91аÑ\85Ñ\8cан:',
+'movereason' => 'Ð\91аÑ\85Ñ\8cна:',
'revertmove' => 'юхаяккха',
'delete_and_move' => 'Цle а хуьйцуш дӀаяккха',
'delete_and_move_text' => '== ДӀаяккха хьокъ ю ==
'tooltip-pt-userpage' => 'Декъашхочуьна агlо',
'tooltip-pt-mytalk' => 'Сан дийцаре агlо',
'tooltip-pt-preferences' => 'Хьан гlирс нисбар',
-'tooltip-pt-watchlist' => 'Ахьа тергам бо агlонаши хийцаман могlам',
+'tooltip-pt-watchlist' => 'Ахьа тергам бо агӀонийн хийцаман могӀам',
'tooltip-pt-mycontris' => 'Хьан нисдаран могlам',
'tooltip-pt-login' => 'Хlокху гlирса чохь дlавазвала/яла мега, амма иза тlедожош дац.',
'tooltip-pt-logout' => 'Дlадерзадо болх бар',
'tooltip-t-contributions' => 'ХӀокху декъашхочо хийцина йолу агӀонийн могӀам',
'tooltip-t-emailuser' => 'ДӀабахьийта хаам оцу декъашхона',
'tooltip-t-upload' => 'Чуйаха файлаш',
-'tooltip-t-specialpages' => 'Белха агlонаши могlам',
+'tooltip-t-specialpages' => 'Белха агӀонанийн могӀам',
'tooltip-t-print' => 'Хlокху агlонна зорба туху башхо',
'tooltip-t-permalink' => 'Даима йолу хьажораг хӀокху башха агӀонна',
'tooltip-ca-nstab-main' => 'Яззамна чулацам',
'tooltip-compareselectedversions' => 'Хlокху шина хаьржина агlона башхо муха ю хьажа.',
'tooltip-watch' => 'ТӀетоха хӀара агӀо сан тергаме могӀанан юкъа',
'tooltip-rollback' => 'Цхьоз тlетаlийча дlабаккха кхечо бина болу тlаьххьара хийцам',
-'tooltip-undo' => 'Дlабаккха бина болу хийцам а хьалхьажар гойтуш, дlайаккхарна бахьан гайта аьтту беш',
+'tooltip-undo' => 'ДӀабаккха бина болу хийцам а хьалхьажар гойтуш, дӀаяккхарна бахьна гайта аьтту беш',
'tooltip-summary' => 'Язъе йоца цӀе',
# Stylesheets
'specialpages-group-media' => 'Жамlаш оцу медиа-гlирсашан а чуяхарш',
'specialpages-group-users' => 'Декъашхой а бакъонаш',
'specialpages-group-highuse' => 'Уггаре дукха лелайо агlонаш',
-'specialpages-group-pages' => 'Агlонаши могlамаш',
+'specialpages-group-pages' => 'АгӀонийн могӀанаш',
'specialpages-group-pagetools' => 'ГӀирсаш оцу агӀонашан',
'specialpages-group-wiki' => 'Хаамаш а гӀирсаш а',
'specialpages-group-redirects' => 'Дlасахьажош йолу гlуллакхан агlонаш',
'tog-extendwatchlist' => 'لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.',
'tog-usenewrc' => 'گۆڕانکارییەکان لە دوایین گۆڕانکارییەکان و لیستی چاودێریدا بە پێی پەڕە پۆلێن بکە (پێویستی بە جاڤاسکریپتە)',
'tog-numberheadings' => 'ژمارەکردنی خۆگەڕی سەردێڕەکان',
-'tog-showtoolbar' => 'شرÛ\8cتÛ\8c ئاÙ\85رازÛ\95کاÙ\86Û\8c دÛ\95ستکارÛ\8c Ù\86Û\8cشاÙ\86 بدÛ\95 (JavaScript Ù¾Û\8eÙ\88Û\8cستÛ\95)',
-'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکلیک لەسەر دەق (JavaScript پێویستە)',
-'tog-editsectiononrightclick' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی کلیکی ڕاست کردن لەسەر سەردێڕی بەشەکان (JavaScript پێویستە)',
+'tog-showtoolbar' => 'تÙ\88Ù\88ڵاÙ\85رازÛ\8c دÛ\95ستکارÛ\8c Ù\86Û\8cشاÙ\86 بدÛ\95',
+'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکرتە',
+'tog-editsectiononrightclick' => 'دەستکاریی بەشەکان بە کرتەی ڕاست لەسەر سەردێڕی بەشەکان',
'tog-rememberpassword' => 'چوونە ژوورەوەم لەسەر ئەم وێبگەڕە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
'tog-watchcreations' => 'ئەو پەڕانەی من دروستم کردوون و ئەو پەڕگانە من بارم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
'tog-watchdefault' => 'ئەو پەڕانە و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم',
'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
'tog-oldsig' => 'واژووی ئێستا:',
'tog-fancysig' => 'وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)',
-'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەرگرە (جاڤاسکریپت پێویستە) (تاقیکاری)',
+'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەربگرە (تاقیکاری)',
'tog-forceeditsummary' => 'ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ',
'tog-watchlisthideown' => 'دەستکارییەکانم بشارەوە لە پێرستی چاودێری',
'tog-watchlisthidebots' => 'دەستکارییەکانی بات بشارەوە لە لیستی چاودێری',
'tog-ccmeonemails' => 'کۆپییەک لەو ئیمەیلانە کە بۆ بەکارھێنەرانی تر دەنێرم بۆ خۆشم بنێرە',
'tog-diffonly' => 'ناوەرۆکی پەڕە لە ژێرەوەی جیاوازییەکاندا نیشان مەدە',
'tog-showhiddencats' => 'پۆلە شاردراوەکان نیشان بدە',
-'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
'tog-useeditwarning' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوتنەکراو دەردەچم',
'youhavenewmessages' => '$1ت ھەیە ($2).',
'youhavenewmessagesfromusers' => 'لە {{PLURAL:$3|بەکارھێنەرێک|$3 بەکارھێنەران}} $1ت ھەیە ($2).',
'youhavenewmessagesmanyusers' => '$1ت لە ژمارەیەک بەکارھێنەر ھەیە ( $2 ).',
-'newmessageslinkplural' => '{{PLURAL:$1|پەیامێکی نوێ|پەیامی نوێ}}',
-'newmessagesdifflinkplural' => 'دوایین {{PLURAL:$1|گۆڕانکاری|گۆڕانکارییەکان}}',
+'newmessageslinkplural' => '{{PLURAL:$1|پەیامێکی نوێ|999=پەیامی نوێ}}',
+'newmessagesdifflinkplural' => 'دوایین {{PLURAL:$1|گۆڕانکاری|999=گۆڕانکارییەکان}}',
'youhavenewmessagesmulti' => 'لە $1 دا پەیامی نوێت ھەیە',
'editsection' => 'دەستکاری',
'editold' => 'دەستکاری',
تکایە هەوڵ بدەوە.',
'passwordtooshort' => 'تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.',
'password-name-match' => 'تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.',
-'mailmypassword' => 'تێپەڕوشەیەکی نوێ بنێرە بۆ ئیمەیلەکەم',
+'mailmypassword' => 'تێپەڕوشەکە ڕێک بخەوە',
'passwordremindertitle' => 'تێپەڕوشەیەکی نوێی کاتی بۆ {{SITENAME}}',
'passwordremindertext' => 'کەسێک (لەوانەیە خۆت، لە ئایپی ئەدرەسی $1) داوای تێپەڕوشەیەکی نوێی کردووە بۆ {{SITENAME}} ($4). تێپەڕوشەیەکی کاتی بۆ بەکارهێنەر «$2» دروستکراو و وەک «$3» دانراوه. ئەگەر ئەمە داخوازی تۆ بووە، پێویستت بەوەیە ئێستا بچیتە ژوورەوە و تێپەڕوشەیەکی نوێ هەڵبژێریت. ماوەی تێپەڕوشە کاتییەکەت لە {{PLURAL:$5|یەک ڕۆژدا|$5 ڕۆژدا}} بەسەردەچێت.
'passwordsent' => 'تێپەڕوشەیەکی نوێ ناردرا بۆ ئەدرەسی ئیمەیلی تۆمارکراوی «$1».
تکایە دوای وەرگرتنی دیسان بچۆ ژوورەوە.',
'blocked-mailpassword' => 'ئادرەسی ئایپی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.',
-'eauthentsent' => 'ئیمەیلێکی بڕواپێکردن ناردرا بۆ ئەدرەسی ئیمەیلی پاڵێوراو. <br />
-پێش ئەوەی ئیمەیلیتر بنێردرێ بۆ ئەم هەژمارە، بۆ ئەوەی بڕوات پێبکرێ کە ئەو هەژمارە بەڕاستی هین تۆیە، دەبێ ڕێنوماییەکانی ناو ئەو ئیمەیلە هەنگاو بە هەنگاو ئەنجام بدەیت.',
+'eauthentsent' => 'ئیمەیلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمەیلی دیاریکراو ناردرا.
+پێش ئەوەی ئیمەیلی تر بۆ ئەم هەژمارە بنێردرێ، بۆ پشتڕاستکردنەوەی ئەمەی ئەم هەژمارە بەڕاستی ھی تۆیە، دەبێ پەیڕەوی ڕێکارەکانی ناو ئیمەیلەکە بکەیت.',
'throttled-mailpassword' => 'بیرهێنەرەوەیەکی وشەی نهێنی پێش ئەمە لە {{PLURAL:$1|کاتژمێر}}ی ڕابردوودا ناردراوە.
بۆ بەرگری لە بەکارهێنانی خراپ، تاکە یەک بیرهێنەرەوەی وشەی نهێنی هەر {{PLURAL:$1|کاتژمێر}} دەنێردرێت.',
'mailerror' => 'هەڵە ڕوویدا لە ناردنی ئیمەیل: $1',
'acct_creation_throttle_hit' => 'بینەرانی ویکی بەکەڵک وەرگرتن لەم ئایپی ئەدرەسەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووستکردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوەدایە.
وەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئایپی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووستبکەن.',
-'emailauthenticated' => 'ئیمەیلەکەت بە ڕاست ناسرا لە $3ی $2 دا',
-'emailnotauthenticated' => 'ئیمەیلەکەت ھێشتا نەناسراوە.
-Ú¾Û\8cÚ\86 ئÛ\8cÙ\85Û\95Û\8cÙ\84Û\8eÚ© بÛ\86 ئÛ\95Ù\85 بابÛ\95تاÙ\86Û\95Û\8c Ø®Ù\88ارەوە نانێردرێت.',
+'emailauthenticated' => 'ناونیشانی ئیمەیلەکەت پشتڕاست کرایەوە لە $3ی $2دا.',
+'emailnotauthenticated' => 'ناونیشانی ئیمەیلەکەت ھێشتا پشتڕاست نەکراوتەوە.
+Ú¾Û\8cÚ\86 ئÛ\8cÙ\85Û\95Û\8cÙ\84Û\8eÚ© بÛ\86 ئÛ\95Ù\85 تاÛ\8cبÛ\95تÙ\85Û\95Ù\86دÛ\8cÛ\8cاÙ\86Û\95Û\8c Ú\98Û\8eرەوە نانێردرێت.',
'noemailprefs' => 'بۆ کەوتنە کاری ئەو تایبەتمەندیانە، لە هەڵبژاردەکانت ئەدرەسەکی ئیمێڵ دابین بکە.',
'emailconfirmlink' => 'ئیمەیلەکەت پشتڕاست بکەرەوە',
'invalidemailaddress' => 'ناونیشانی ئیمەیل پەسند نەکرا، چون لەوە دەچێت شێوازێکی نادروستی ھەبێت.
'login-throttled' => 'ژمارەیەکی زۆر هەوڵت داوە بۆ چوونە ژوورەوە.
تکایە پێش هەوڵی دووبارە، نەختێک بوەستە.',
'loginlanguagelabel' => 'زمان: $1',
+'pt-login' => 'بچۆ ژوورەوە',
+'pt-createaccount' => 'ھەژمار دروست بکە',
'pt-userlogout' => 'بچۆ دەرەوە',
# Change password dialog
'revdelete-show-file-submit' => 'بەڵێ',
'revdelete-selected' => "'''{{PLURAL:$2|پێداچوونەوەی هەڵبژێراوی|پێداچوونەوەکانی هەڵبژێراوی}} [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|لۆگی ڕووداوەی هەڵبژێراو|لۆگی ڕووداوە هەڵبژێراوەکان}}:'''",
-'revdelete-text' => "'''پێداچوون و ڕووداوە سڕاوەکان هێشتا لە لاپەڕەی مێژوو و لۆگەکان دەست دەکەون، بەڵام ناوەڕۆکی ھێندێکیان بەرچاوی گشتیی ناکەون.'''<br />
-بەڕێوبەرانی دیکە لە {{SITENAME}}دا، هێشتا دەتوانن دەستکارییە شاراوەکان ببینن و لە ڕێگەی ھەر ئەم فۆڕمەوە بیانگەڕێننەوە، مەگەر ئەوەی بەربەستی دیکە داندرابێت.",
'revdelete-confirm' => 'تکایە بەڵێن بدە کە دەتەوێ ئەوە بکەی و لە ئەنجامەکانی ئەوە ئاگاداریت و بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتنامە]] ئەنجامی ئەدەی.',
'revdelete-suppress-text' => "بەرگری دەبێ '''تەنها''' بۆ ئەم بابەتانە بەکاربهێندرێت:<br />
* سووکایەتیکردن بە کەسایەتییەک<br />
* بڵاوکردنەوەی زانیاریی تاکەکەسی نەگونجاو<br />
*: '' ناونیشانی ماڵ یا ژمارە تەلەفۆن و وەک ئەمانە.''<br />",
'revdelete-legend' => 'سنووردارکردنی دەرکەوتن',
-'revdelete-hide-text' => 'شاردÙ\86Û\95Ù\88Û\95Û\8c دÛ\95Ù\82Û\8c Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95',
+'revdelete-hide-text' => 'دەقی پێداچوونەوە',
'revdelete-hide-image' => 'ناوەڕۆکی پەڕگە بشارەوە',
'revdelete-hide-name' => 'داشاردنی مەبەست و کردەوە',
-'revdelete-hide-comment' => 'شاردنەوەی کورتەی دەستکاری',
-'revdelete-hide-user' => 'شاردÙ\86Û\95Ù\88Û\95Û\8c Ù\86اÙ\88Û\8c بÛ\95کارھÛ\8eÙ\86Û\95رÛ\8c/ئاÛ\8c-â\80\8cÙ¾Û\8c دÛ\95ستکارÛ\8cÚ©Û\95ر',
+'revdelete-hide-comment' => 'کورتەی دەستکاری',
+'revdelete-hide-user' => 'Ù\86اÙ\88Û\8c بÛ\95کارھÛ\8eÙ\86Û\95ر/Ù\86اÙ\88Ù\86Û\8cشاÙ\86Û\8c ئاÛ\8cÙ¾Û\8c دÛ\95ستکارÛ\8cÚ©Û\95ر',
'revdelete-hide-restricted' => 'بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە',
'revdelete-radio-same' => '(مەیگۆڕە)',
-'revdelete-radio-set' => 'بÛ\95ÚµÛ\8e',
-'revdelete-radio-unset' => 'نا',
+'revdelete-radio-set' => 'شاردراÙ\88Û\95',
+'revdelete-radio-unset' => 'دیار',
'revdelete-suppress' => 'بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە',
'revdelete-unsuppress' => 'لابردنی بەربەستەکان لە سەر پێداچوونەوە گەڕێندراوەکان',
'revdelete-log' => 'هۆکار:',
'shown-title' => 'لە هەر پەڕەیەک $1 {{PLURAL:$1|ئەنجام|ئەنجام}} نیشان بدە',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) ببینە',
'searchmenu-exists' => "'''پەڕەیەک بە ناوی «[[:$1]]» لەم ویکییەدا ھەیە.'''",
-'searchmenu-new' => "'''لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!'''",
+'searchmenu-new' => '<strong>لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!</strong> {{PLURAL:$2|0=|ھەروەھا بڕوانە پەڕەی دۆزراوەی گەڕانەکەت.|ھەروەھا بڕوانە ئاکامە دۆزراوەکانی گەڕانەکە.}}',
'searchprofile-articles' => 'پەڕە بە ناوەڕۆکەکان',
'searchprofile-project' => 'پەڕەکانی یارمەتی و پرۆژە',
'searchprofile-images' => 'ڕەنگاڵە',
'prefs-email' => 'ھەڵبژاردەکانی ئیمەیل',
'prefs-rendering' => 'ڕواڵەت',
'saveprefs' => 'پاشەکەوت',
-'restoreprefs' => 'ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی',
+'restoreprefs' => 'ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی (لە ھەموو بەشەکاندا)',
'prefs-editing' => 'دەستکاریکردن',
'rows' => 'ڕیزەکان:',
'columns' => 'ستوونەکان:',
'badsig' => 'ئیمزاكه ههڵهیه، تهماشای كۆدی HTML بكه',
'badsiglength' => 'واژووەکەت زۆر درێژە.
واژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.',
-'yourgender' => 'زایەند:',
-'gender-unknown' => 'ئاشکرا نەکراو',
+'yourgender' => 'پێت خۆشە چۆن وەسف بکرێیت؟',
+'gender-unknown' => 'پێم خۆشە باسی نەکەم',
'gender-male' => 'پیاو',
'gender-female' => 'ژن',
'prefs-help-gender' => 'دڵخواز: بۆ بانگ کردنی دروست بە دەستی نەرمامێر.
'action-block' => 'بەربەست کردنی ئەم بەکارهێنەرە بۆ دەستکاریکردن',
'action-protect' => 'گۆڕانی ئاستی پارێزراوی بۆ ئەم لاپەڕە',
'action-rollback' => 'گەڕاندنەوەی خێرای دەستکاریەکانی دوایین بەکارھێنەر کە پەڕەیەکی دیاریکراوی دەستکاری کردووە',
-'action-import' => 'هێنانەناوەی ئەم لاپەڕە لە ویکییەکی دیکە',
-'action-importupload' => 'هێنانەناوەی ئەم لاپەڕە لە پەڕگەیەکی بارکراو',
+'action-import' => 'ھاوردنی پەڕەکان لە ویکییەکی ترەوە',
+'action-importupload' => 'ھاوردنی پەڕەکان لە پەڕگەیەکی بارکراو',
'action-patrol' => 'نیشانکردنی دەستکاریەکانی کەسانی تر وەک پاس دراو',
'action-autopatrol' => 'دەستکارییەکانت وەک پاس دراو نیشان بکرێ',
'action-unwatchedpages' => 'دیتنی پێرستێک لە پەڕە چاودێری نەکراوەکان',
'recentchanges' => 'دوایین گۆڕانکارییەکان',
'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
'recentchanges-summary' => 'لەم پەڕەیەدا شوێنی دوایین گۆڕانکارییەکانی ویکی بکەوە.',
+'recentchanges-noresult' => 'ھیچ گۆڕانکارییەک لە نێوان ماوەی پێدراو لەگەڵ ئەم پێوەرانە وێک نەھاتەوە.',
'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە لەم «فید»ەوە.',
'recentchanges-label-newpage' => 'ئەم دەستکارییە پەڕەیەکی نوێی دروست کرد',
'recentchanges-label-minor' => 'ئەمە دەستکارییەکی بچووکە',
'recentchanges-legend-heading' => "'''کورتکراوەکان:'''",
'recentchanges-legend-newpage' => '(ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])',
'recentchanges-legend-plusminus' => "(''±۱٢٣'')",
-'rcnotefrom' => "ئەوی خوارەوە گۆڕانکارییەکانە لە '''$2'''ەوە (ھەتا '''$1''' نیشاندراو).",
+'rcnotefrom' => 'ژێرەوە گۆڕانکارییەکانە لە <strong>$2</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).',
'rclistfrom' => 'گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $1',
'rcshowhideminor' => 'دەستکارییە بچووکەکان $1',
'rcshowhideminor-show' => 'نیشان بدە',
'rcshowhideminor-hide' => 'بشارەوە',
'rcshowhidebots' => 'بۆتەکان $1',
+'rcshowhidebots-show' => 'نیشان بدە',
+'rcshowhidebots-hide' => 'بشارەوە',
'rcshowhideliu' => 'بەکارھێنەرە تۆمارکراوەکان $1',
+'rcshowhideliu-show' => 'نیشان بدە',
+'rcshowhideliu-hide' => 'بشارەوە',
'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
+'rcshowhideanons-show' => 'نیشان بدە',
+'rcshowhideanons-hide' => 'بشارەوە',
'rcshowhidepatr' => 'گۆرانکارییە پاس دراوەکان $1',
'rcshowhidemine' => 'دەستکارییەکانم $1',
+'rcshowhidemine-show' => 'نیشان بدە',
+'rcshowhidemine-hide' => 'بشارەوە',
'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
'diff' => 'جیاوازی',
'hist' => 'مێژوو',
'rc_categories_any' => 'هەرکام',
'rc-change-size-new' => '$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری',
'newsectionsummary' => '/* $1 */ بەشی نوێ',
-'rc-enhanced-expand' => 'Ù\88ردÛ\95کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù¾Û\8cشاÙ\86 بدÛ\95 (Ù¾Û\8eÙ\88Û\8cستÛ\8c بÛ\95 جاڤاسکرÛ\8cپتÛ\95)',
+'rc-enhanced-expand' => 'Ù\88ردÛ\95کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\86Û\8cشاÙ\86 بدÛ\95',
'rc-enhanced-hide' => 'وردەکارییەکان بشارەوە',
'rc-old-title' => 'بە ناوی سەرەکیی «$1» دروست کراوە',
'upload_source_file' => ' (پەڕگەیەک لەسەر کۆمپیوتەرەکەت)',
# Special:ListFiles
-'listfiles-summary' => 'ئەم پەڕە تایبەتە هەموو پەڕگە بارکراوەکانت پێ نیشان دەدات.
-لە کاتی پاڵاوتن بۆ بەکارھێنەرێکی تایبەت، تەنیا ئەو پەڕگانە کە بەکارھێنەرەکە دوایین وەشانیانی بارکردبێت نیشان دەدرێن.',
+'listfiles-summary' => 'ئەم پەڕە تایبەتە ھەموو پەڕگە بارکراوەکان نیشان دەدات.',
'listfiles_search_for' => 'بگەڕێ بۆ ناوی میدیای:',
'imgfile' => 'پەڕگە',
'listfiles' => 'پێرستی پەڕگەکان',
'contributions' => 'بەشدارییەکانی {{GENDER:$1|بەکارھێنەر}}',
'contributions-title' => 'بەشدارییەکانی بەکارھێنەر $1',
'mycontris' => 'بەشدارییەکان',
-'contribsub2' => 'بۆ $1 ($2)',
+'contribsub2' => 'بۆ {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'هیچ گۆڕانکاریەکی هاوتای ئەم پێوەرانە نودۆزرایەوە',
'uctop' => '(ھەنووکە)',
'month' => 'لە مانگی (و پێشترەوە):',
بوخچەیەکی کاتی بزر بووە.',
'import-parse-failure' => 'سەرنەکەوتن لە شیکردنەوەی ھاوردنی XML',
'import-noarticle' => 'ھیچ پەڕەیەک بۆ ھاوردن نییە!',
-'import-nonewrevisions' => 'Ú¾Û\95Ù\85Ù\88Ù\88 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95کاÙ\86 Ù¾Û\8eشتر ھاÙ\88ردÛ\95 کراÙ\88Ù\86.',
+'import-nonewrevisions' => 'Ú¾Û\8cÚ\86 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cÛ\95Ú© ھاÙ\88ردÛ\95 Ù\86Û\95کراÙ\88Û\95 (Ú¾Û\95Ù\85Ù\88Ù\88Û\8c Û\8cا Ú¾Û\95ر ئÛ\8eستا Ú¾Û\95Û\8cÛ\95Ø\8c Û\8cاÙ\86 Ù\84Û\95بÛ\95ر Ú¾Û\95ÚµÛ\95کاÙ\86 Ú\86اÙ\88Ù¾Û\86Ø´Û\8c Ù\84Û\8e کراÙ\88Û\95).',
'xml-error-string' => '$1 لە دێڕی $2، ستوونی $3 (بایت $4): $5',
'import-upload' => 'بارکردنی دراوەی XML',
'import-token-mismatch' => 'لەدەستدانی دراوەکانی کۆڕ.
'pageinfo-article-id' => 'زنجیرەی پەڕە',
'pageinfo-language' => 'زمانی ناوەرۆکی پەڕە',
'pageinfo-robot-policy' => 'چۆنێتیی مۆتۆڕی گەڕان',
-'pageinfo-robot-index' => 'شیاو بۆ پێرستکردن',
-'pageinfo-robot-noindex' => 'نەشیاو بۆ پێرستکردن',
+'pageinfo-robot-index' => 'ڕێ پێدراو',
+'pageinfo-robot-noindex' => 'ڕێ پێنەدراوه',
'pageinfo-views' => 'ژمارەی بینینەکان',
'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاودێر}}',
-'pageinfo-redirects-name' => 'ڕەوانەکەرەکان بۆ ئەم پەڕەیە',
+'pageinfo-redirects-name' => 'Ú\98Ù\85ارÛ\95Û\8c Ú\95Û\95Ù\88اÙ\86Û\95Ú©Û\95رÛ\95کاÙ\86 بÛ\86 ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95',
'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ڕەوانەکەر}}; $3 {{PLURAL:$3|ڕەوانەنەکەر}})',
'pageinfo-firstuser' => 'دروستکەری پەڕە',
'file-nohires' => 'رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.',
'svg-long-desc' => 'پەڕگەی SVG، بە ناو $1 × $2 پیکسەڵ، قەبارەی پەڕگە: $3',
'svg-long-error' => 'پەڕگەی SVGی نادروست: $1',
-'show-big-image' => 'گەورەکردنەوە',
+'show-big-image' => 'پەڕگەی سەرەکی',
'show-big-image-preview' => 'قەبارەی ئەم پێشبینینە: $1.',
'show-big-image-other' => '{{PLURAL:$2|ڕەزەلووشنی|ڕەزەلووشنەکانی}} تر: $1.',
'show-big-image-size' => '$1 لە $2 پیکسەڵ',
$5
ئەم کۆدی بڕواپێکردنە لە $4 ماوەی بەسەردێت.',
-'confirmemail_body_set' => 'کەسێک، لەوانەیە خۆت، لە ئایپی ئەدرەسی $1،
-ئەدرەسی ئەیمەیلی ھەژماری «$2» لە {{SITENAME}}دا کردووە بەم ئەدرەسە.
+'confirmemail_body_set' => 'کەسێک، لەوانەیە خۆت، لە ناونیشانی ئایپیی $1،
+ناونیشانیی ئەیمەیلی ھەژماری «$2» لە {{SITENAME}}دا کردووە بەم ناونیشانە.
-بۆ ئەوەی بڕوا بکرێت کە ئەم ھەژمارە لە ڕاستیدا بۆتۆیە و بۆ چالاککردنەوەی تایبەتمەندیەکانی ئیمەیل لە {{SITENAME}}دا، ئەم بەستەرەی خوارەوە لە وێبگەڕەکەتدا بکەوە:
+بۆ پشتڕاستکردنەوەی ئەمەی ئەم ھەژمارە بەڕاستی ھی تۆیە و بۆ چالاککردنی تایبەتمەندیەکانی ئیمەیل لە {{SITENAME}}دا، ئەم بەستەرە لە وێبگەڕەکەتدا بکەوە:
$3
-ئەگەر ھەژمارە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی بڕواپێکردنی ئەدرەسی ئیمەیل بەدوای ئەم بەستەرە بکەوە:
+ئەگەر ھەژمارەکە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی پشتڕاستکردنەوەی ناونیشانی ئیمەیل، شوێنی ئەم بەستەرە بکەوە:
$5
-ئÛ\95Ù\85 Ú©Û\86دÛ\8c بÚ\95Ù\88اپÛ\8eکردÙ\86Û\95 Ù\84Û\95 $4 Ù\85اÙ\88Û\95Û\8c بÛ\95سÛ\95ردێت.',
+ئÛ\95Ù\85 Ú©Û\86دÛ\95Û\8c پشتÚ\95استکردÙ\86Û\95Ù\88Û\95Û\8cÛ\95 Ù\84Û\95 $4 Ù\85اÙ\88Û\95Û\8c بÛ\95سÛ\95ر دÛ\95Ú\86ێت.',
'confirmemail_invalidated' => 'بڕواپیکردنی ناونیشانی ئیمەیل هەڵوەشێندراوە',
'invalidateemail' => 'هەڵوەشاندنەوەی بڕواپێکردنی ئیمەیل',
'version-hook-name' => 'ناوی قولاپ',
'version-hook-subscribedby' => 'بەشداربوو لە لایەن',
'version-version' => '(وەشانی $1)',
-'version-license' => 'مۆڵەت',
+'version-license' => 'مۆڵەتنامە',
'version-poweredby-others' => 'دیکە',
'version-software' => 'نەرمەکاڵای دامەزراو',
'version-software-product' => 'بەرهەم',
'tog-ccmeonemails' => 'Zasílat mi kopie e-mailů, které pošlu jiným uživatelům',
'tog-diffonly' => 'Nezobrazovat obsah stránky pod rozdílem verzí',
'tog-showhiddencats' => 'Zobrazit skryté kategorie',
-'tog-noconvertlink' => 'Vypnout konverzi názvů',
'tog-norollbackdiff' => 'Po vrácení změny nezobrazovat porovnání rozdílů',
'tog-useeditwarning' => 'Upozornit, když budu opouštět editaci bez uložení změn',
'tog-prefershttps' => 'Po přihlášení používat vždy zabezpečené spojení',
'resetpass-temp-password' => 'Dočasné heslo:',
'resetpass-abort-generic' => 'Změna hesla byla zablokována rozšířením.',
'resetpass-expired' => 'Platnost vašeho hesla vypršela. Pro přihlášení si nastavte nové heslo.',
-'resetpass-expired-soft' => 'Platnost vašeho hesla vypršela, musíte si nastavit nové. Zvolte si nové heslo nebo klikněte na storno a nastavte si ho později.',
+'resetpass-expired-soft' => 'Platnost vašeho hesla vypršela, musíte si nastavit nové. Zvolte si nové heslo nebo klikněte na „{{int:resetpass-submit-cancel}}“ a nastavte si ho později.',
# Special:PasswordReset
'passwordreset' => 'Reset hesla',
'revdelete-show-file-submit' => 'Ano',
'revdelete-selected' => "'''{{PLURAL:$2|Vybraná|Vybrané}} revize stránky [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Vybraná protokolovaná událost|Vybrané protokolované události}}:'''",
-'revdelete-text' => "'''Smazané verze a události budou nadále zobrazeny v historii stránky a protokolovacích záznamech, ale některé jejich části nebudou veřejně dostupné.'''
-Ostatní správci {{GRAMMAR:2sg|{{SITENAME}}}} si budou moci skrytý obsah prohlížet a pomocí stejného rozhraní jej také obnovit,
-pokud nebyla nastavena další omezení.",
'revdelete-confirm' => 'Prosím potvrďte, že to opravdu chcete učinit, že si uvědomujete důsledky a že je to v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].',
'revdelete-suppress-text' => "Utajování by se mělo používat '''pouze''' v následujících případech:
* Potenciálně pomlouvačné informace
'revdelete-hide-text' => 'Text revize',
'revdelete-hide-image' => 'Skrýt obsah souboru',
'revdelete-hide-name' => 'Skrýt událost a cíl',
-'revdelete-hide-comment' => 'Editační komentář',
+'revdelete-hide-comment' => 'Shrnutí editace',
'revdelete-hide-user' => 'Uživatelské jméno / IP adresa',
'revdelete-hide-restricted' => 'Utajit data i před správci',
'revdelete-radio-same' => '(neměnit)',
'recentchanges-legend-heading' => "'''Legenda:'''",
'recentchanges-legend-newpage' => '(vizte též [[Special:NewPages|seznam nových stránek]])',
'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => 'Níže {{PLURAL:$1|je|jsou|je}} nejvýše <b>$1</b> {{PLURAL:$1|změna|změny|změn}} od <b>$2</b>.',
+'rcnotefrom' => 'Níže jsou změny od <strong>$2</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).',
'rclistfrom' => 'Ukázat nové změny, počínaje od $1',
'rcshowhideminor' => '$1 malé editace',
'rcshowhideminor-show' => 'Zobrazit',
'uploaddisabledtext' => 'Načítání souborů je vypnuto.',
'php-uploaddisabledtext' => 'V PHP je vypnuto načítání souborů. Prosím, zkontrolujte nastavení file_uploads.',
'uploadscripted' => 'Tento soubor obsahuje HTML nebo kód skriptu, který by mohl být prohlížečem chybně interpretován.',
+'uploadscriptednamespace' => 'Tento SVG soubor obsahuje nedovolený jmenný prostor „$1“',
'uploadinvalidxml' => 'XML v načteném souboru nelze zpracovat.',
'uploadvirus' => 'Tento soubor obsahuje virus! Podrobnosti: $1',
'uploadjava' => 'Tento soubor je ZIP, který obsahuje javový soubor .class.
'delete-edit-reasonlist' => 'Editovat důvody smazání',
'delete-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek je omezeno, aby se předešlo nechtěnému narušení {{grammar:2sg|{{SITENAME}}}}.',
'delete-warning-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek může narušit databázové operace {{grammar:2sg|{{SITENAME}}}}; postupujte opatrně.',
-'deleting-backlinks-warning' => "'''Upozornění:''' Stránka, kterou se chystáte smazat, je na jiných stránkách odkazována nebo je do nich vložena.",
+'deleting-backlinks-warning' => "'''Upozornění:''' Stránka, kterou se chystáte smazat, je [[Special:WhatLinksHere/{{FULLPAGENAME}}|na jiných stránkách]] odkazována nebo je do nich vložena.",
# Rollback
'rollback' => 'Vrátit zpět editace',
'sp-contributions-blocked-notice-anon' => 'Tato IP adresa je momentálně zablokována.
Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
'sp-contributions-search' => 'Zobrazení příspěvků',
+'sp-contributions-suppresslog' => 'utajené příspěvky uživatele',
'sp-contributions-username' => 'IP adresa nebo uživatelské jméno:',
-'sp-contributions-toponly' => 'Zobrazit pouze aktuální revize',
+'sp-contributions-toponly' => 'Zobrazit pouze editace na aktuální revizi',
+'sp-contributions-newonly' => 'Zobrazovat pouze editace zakládající stránku',
'sp-contributions-submit' => 'Zobrazit',
# What links here
'tog-ccmeonemails' => 'Sélôj do mie kòpije e-mailów, chtërné sélóm do jinych brëkòwników',
'tog-diffonly' => 'Nie wëskrzëniôj zamkłoscë starnë niżi przërónaniô zjinaków',
'tog-showhiddencats' => 'Wëskrzëni zataconé kategòrëje',
-'tog-noconvertlink' => 'Wëłączë kònwersëjã titlów w lënkach',
'tog-norollbackdiff' => 'Pòcësni wëskrzënianié zjinaków pò copniãcô sã',
'underline-always' => 'Wiedno',
'contributions' => '{{GENDER:$1|польꙃєватєлꙗ}} добродѣꙗниꙗ',
'contributions-title' => 'польꙃєватєлꙗ ⁖ $1 ⁖ добродѣꙗниꙗ',
'mycontris' => 'добродѣꙗниꙗ',
-'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
+'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ {{GENDER:$3|$1}} ⁖ ѥстъ ($2)',
'uctop' => '(нꙑнѣщьн҄ь обраꙁъ)',
'sp-contributions-blocklog' => 'ꙁаграждєниꙗ їсторїꙗ',
# Media information
'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
-'show-big-image' => 'плÑ\8cнÑ\8a вида обраꙁъ',
+'show-big-image' => 'иÑ\81Ñ\82оÑ\87Ñ\8cнÑ\8a дѣла обраꙁъ',
'show-big-image-size' => '$1 × $2 пиѯєлъ',
# Special:NewFiles
'suspicious-userlogout' => 'Gwrthodwyd eich cais i allgofnodi oherwydd ei fod yn ymddangos mai gweinydd wedi torri neu ddirprwy gelc a anfonodd y cais.',
'createacct-another-realname-tip' => "Gallwch ddewis roi eich enw go iawn.
Os y gwnewch, fe gaiff yr enw go iawn ei defnyddio wrth dadogi'ch gwaith.",
-'pt-login' => 'Mewngofnodwch',
+'pt-login' => 'Mewngofnodi',
'pt-createaccount' => 'Creu cyfri',
'pt-userlogout' => 'Allgofnodi',
'resetpass-temp-password' => 'Cyfrinair dros dro:',
'resetpass-abort-generic' => 'Mae estyniad wedi atal newid y cyfrinair.',
'resetpass-expired' => 'Mae oes eich cyfrinair wedi dod i ben. Gosodwch gyfrinair newydd i fewngofnodi.',
-'resetpass-expired-soft' => "Mae eich cyfrinair wedi dod i ben ac mae'n rhaid ei ailosod. Dewisiwch gyfrinair newydd sbon nawr, neu ailosodwch ef rywdro eto.",
+'resetpass-expired-soft' => 'Mae eich cyfrinair wedi dod i ben ac mae\'n rhaid ei ailosod. Dewisiwch gyfrinair newydd sbon nawr, neu cliciwch "{{int:resetpass-submit-cancel}}" a\'i ailosod rywdro eto.',
# Special:PasswordReset
'passwordreset' => 'Ailosod cyfrinair',
'editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "{{int:prefs-editing}}" yn eich dewisiadau.',
'editpage-notsupportedcontentformat-title' => 'Dydy fformat y cynnwys hwn ddim yn cael ei gefnogi gennym.',
-'editpage-notsupportedcontentformat-text' => 'Dydy fformat y cynnwys ddim yn cael ei gefnogi gan gynnwys model $2.',
+'editpage-notsupportedcontentformat-text' => "Dydy'r fformat $1 ar y cynnwys ddim yn cael ei gefnogi gan y model $2.",
# Content models
'content-model-wikitext' => 'cystrawen wici',
'revdelete-show-file-submit' => 'Ydw',
'revdelete-selected' => "'''Y {{PLURAL:$2|golygiad|golygiad|golygiadau|golygiadau|golygiadau|golygiadau}} dewisedig o [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Digwyddiad|Digwyddiad|Digwyddiadau|Digwyddiadau|Digwyddiadau|Digwyddiadau}} a ddewiswyd o'r lòg:'''",
-'revdelete-text' => "'''Fe fydd y golygiadau a'r digwyddiadau sydd wedi eu diddymu i'w gweld o hyd yn hanes y dudalen ac yn y logiau, ond ni fydd y cyhoedd yn gallu gweld y cynnwys i gyd.'''
-Fe fydd gweinyddwyr eraill {{SITENAME}} o hyd yn gallu gweld yr hyn a guddiwyd. Fe allant ei ddatguddio trwy ddefnyddio'r dudalen arbennig hon, cyhyd ag nad oes cyfyngiadau ychwanegol wedi eu gosod.",
'revdelete-confirm' => "Byddwch gystal â chadarnhau eich bod yn bwriadu gwneud hyn, eich bod yn deall yr effaith a gaiff, a'ch bod yn ei wneud yn ôl y [[{{MediaWiki:Policy-url}}|y polisi]].",
'revdelete-suppress-text' => "'''Dim ond''' yn yr achosion sy'n dilyn y dylech fentro cuddio gwybodaeth:
* Gwybodaeth a all fod yn enllib
'showhideselectedversions' => 'Dangos/cuddio y diwygiadau dewisedig',
'editundo' => 'dadwneud',
'diff-empty' => '(Dim gwahaniaeth)',
-'diff-multi-sameuser' => 'Mae ({{PLURAL:$1|un golygiad|$1 golygiadau}} gan yr un defnyddiwr heb ei ddangos.',
+'diff-multi-sameuser' => '(Ni ddangosir y {{PLURAL:$1||golygiad|$1 olygiad|$1 golygiad}} yn y canol gan yr un defnyddiwr)',
+'diff-multi-otherusers' => '(Ni ddangosir y {{PLURAL:$1||golygiad|$1 olygiad|$1 golygiad}} yn y canol gan {{PLURAL:$2||ddefnyddiwr|$2 ddefnyddiwr|$2 defnyddiwr}} arall)',
'diff-multi-manyusers' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan mwy na $2 {{PLURAL:$2|o ddefnyddwyr}}.)',
'difference-missing-revision' => "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.
'searchrelated' => 'erthyglau eraill tebyg',
'searchall' => 'oll',
'showingresults' => "Yn dangos $1 {{PLURAL:$1|canlyniad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} isod gan ddechrau gyda rhif '''$2'''.",
-'showingresultsinrange' => 'Yn cael ei ddangos isod yn y rhediad Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} #<strong>$2</strong> i #<strong>$3</strong>.',
+'showingresultsinrange' => 'Yn dangos hyd at {{PLURAL:$1||<strong>1</strong> canlyniad|<strong>$1</strong> ganlyniad|$1 o ganlyniadau}} isod yn yr ystod #<strong>$2</strong> i #<strong>$3</strong>.',
'showingresultsnum' => "Yn dangos $3 {{PLURAL:$3|canlyniad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} isod gan ddechrau gyda rhif '''$2'''.",
'showingresultsheader' => "{{PLURAL:$5||Canlyniad '''$1''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''|Canlyniadau '''$1 - $2''' o blith '''$3'''}} ar gyfer '''$4'''",
'search-nonefound' => "Ni chafwyd dim canlyniadau i'r ymholiad.",
'recentchanges-legend-heading' => "'''Allwedd:'''",
'recentchanges-legend-newpage' => '(gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])',
'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Isod rhestrir pob newid ers '''$2''' (hyd at '''$1''' ohonynt).",
+'rcnotefrom' => "Isod rhestrir pob newid er <strong>'''$2'''</strong> (ymddengys hyd at <strong>'''$1'''</strong> ohonynt).",
'rclistfrom' => 'Dangos newidiadau newydd, gan ddechrau ers $1',
'rcshowhideminor' => '$1 golygiadau bychain',
+'rcshowhideminor-show' => 'Dangoser',
+'rcshowhideminor-hide' => 'Cuddier',
'rcshowhidebots' => '$1 botiau',
+'rcshowhidebots-show' => 'Dangoser',
+'rcshowhidebots-hide' => 'Cuddier',
'rcshowhideliu' => '$1 o ddefnyddwyr cofrestredig',
+'rcshowhideliu-show' => 'Dangoser',
+'rcshowhideliu-hide' => 'Cuddier',
'rcshowhideanons' => '$1 defnyddwyr anhysbys',
+'rcshowhideanons-show' => 'Dangoser',
+'rcshowhideanons-hide' => 'Cuddier',
'rcshowhidepatr' => '$1 golygiadau wedi derbyn ymweliad patrôl',
+'rcshowhidepatr-show' => 'Dangoser',
+'rcshowhidepatr-hide' => 'Cuddier',
'rcshowhidemine' => '$1 fy ngolygiadau',
+'rcshowhidemine-show' => 'Dangoser',
+'rcshowhidemine-hide' => 'Cuddier',
'rclinks' => 'Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf<br />$3',
'diff' => 'gwahan',
'hist' => 'hanes',
'php-uploaddisabledtext' => 'Anablwyd uwchlwytho ffeiliau yn PHP.
Gwiriwch y gosodiad ar file_uploads.',
'uploadscripted' => "Mae'r ffeil hon yn cynnwys HTML neu sgript a all achosi problemau i borwyr gwe.",
+'uploadscriptednamespace' => "Mae'r ffeil SVG hon yn cynnwys yr enw '$1' sy'n enw annilys ar barth",
'uploadinvalidxml' => "Ni ellid dosrannu'r XML yn y ffeil a uwchlwythwyd.",
'uploadvirus' => 'Mae firws gan y ffeil hon! Manylion: $1',
'uploadjava' => "Ffeil ZIP yw hwn sy'n cynnwys ffeil Java .class.
'watchmethod-list' => "yn chwilio'r tudalennau ar y rhestr wylio am ddiwygiadau diweddar",
'watchlistcontains' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio.',
'iteminvalidname' => "Problem gyda'r eitem '$1', enw annilys...",
-'wlnote2' => 'Isod, fe welwch y newidiadau yn yr {{PLURAL:$1|hour|<strong>$1</strong> awr diwethaf}}, a hynny ar $2, $3.',
+'wlnote2' => 'Isod, fe welwch y newidiadau yn ystod {{PLURAL:$1|yr awr|yr awr|y ddwyawr ddiwethaf|teirawr diwethaf|<strong>$1</strong> awr diwethaf}}, hyd at $2, $3.',
'wlshowlast' => "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r $3 newidiadau.",
'watchlist-options' => 'Dewisiadau ar gyfer y rhestr wylio',
Cyfyngwyd ar y gallu i ddileu tudalennau sydd wedi eu golygu cymaint â hyn, er mwyn osgoi amharu ar weithrediad databas {{SITENAME}} yn ddamweiniol.",
'delete-warning-toobig' => "Cafwyd dros $1 {{PLURAL:$1|o olygiadau}} i'r dudalen hon.
Gallai dileu tudalen, gyda hanes golygu cymaint â hyn iddi, beri dryswch i weithrediadau'r databas ar {{SITENAME}}; ewch ati'n ofalus.",
-'deleting-backlinks-warning' => "'''Rhybudd:''' Mae tudalennau eraill yn cysylltu i'r dudalen yr ydych ar fin ei dileu, neu'n trawsgynnwys y dudalen hon.",
+'deleting-backlinks-warning' => "'''Rhybudd:''' Mae [[Special:WhatLinksHere/{{FULLPAGENAME}}|tudalennau eraill]] yn cysylltu i'r dudalen yr ydych ar fin ei dileu, neu'n trawsgynnwys y dudalen hon.",
# Rollback
'rollback' => 'Gwrthdroi golygiadau',
'sp-contributions-search' => 'Chwilio am gyfraniadau',
'sp-contributions-username' => 'Cyfeiriad IP neu enw defnyddiwr:',
'sp-contributions-toponly' => "Dangos golygiadau sy'n olygiadau diweddaraf yn unig",
+'sp-contributions-newonly' => "Dangos y golygiadau hynny sy'n dechrau tudalen yn unig",
'sp-contributions-submit' => 'Chwilier',
# What links here
'thumbnail_image-type' => "Nid yw'r math hwn o ddelwedd yn cael ei gynnal",
'thumbnail_gd-library' => 'Mae ffurfwedd y llyfrgell GD yn anghyflawn: y ffwythiant $1 yn eisiau',
'thumbnail_image-missing' => "Mae'n debyg bod y ffeil yn eisiau: $1",
-'thumbnail_image-failure-limit' => "'Da chi 'di methu gormod o weithiau (\$ neu fwy) i rendro'r ciplun. Ceisiwch eto nes ymlaen.",
+'thumbnail_image-failure-limit' => "'Da chi 'di methu gormod o weithiau ($1 neu fwy) i rendro'r ciplun. Ceisiwch eto nes ymlaen.",
# Special:Import
'import' => 'Mewnforio tudalennau',
'tog-ccmeonemails' => 'Send mig kopier af e-mails som jeg sender til andre brugere',
'tog-diffonly' => 'Vis ikke sideindhold neden under versionssammenligninger',
'tog-showhiddencats' => 'Vis skjulte kategorier',
-'tog-noconvertlink' => 'Slå konvertering af sidetitler fra',
'tog-norollbackdiff' => 'Vis ikke forskel efter tilbagerulning',
'tog-useeditwarning' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
'tog-prefershttps' => 'Brug altid en sikker forbindelse, når du er logget ind',
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Valgte version|Valgte versioner}} af '''$1:''''''",
'logdelete-selected' => "'''{{PLURAL:$1|Valgt logindførsel|Valgte logindførsler}}:'''",
-'revdelete-text' => "'''Slettede versioner vil fortsat vises i sidehistorik og på logsider, men dele af deres indhold vil ikke være offentligt tilgængeligt.'''
-Andre administratorer på {{SITENAME}} vil fortsat være i stand til at se det skjulte indhold og kan gendanne det igen, medmindre der laves yderligere restriktioner.",
'revdelete-confirm' => 'Vær venlig at bekræfte at du vil gøre dette, at du forstår konsekvenserne, og at du gør det i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjerne]].',
'revdelete-suppress-text' => "Der bør '''kun''' skjules i de følgende tilfælde:
* Potentielt injurierende oplysninger
'tog-ccmeonemails' => 'Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende',
'tog-diffonly' => 'Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen',
'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
-'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
'tog-useeditwarning' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
'tog-prefershttps' => 'Wenn angemeldet, immer eine sichere Verbindung benutzen.',
'createacct-another-realname-tip' => 'Der bürgerliche Name ist optional.
Wenn du ihn angibst, wird er für die Zuordnung der Beiträge verwendet.',
'pt-login' => 'Anmelden',
+'pt-login-button' => 'Anmelden',
'pt-createaccount' => 'Benutzerkonto erstellen',
'pt-userlogout' => 'Abmelden',
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Gewählte Version|Gewählte Versionen}} von [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Gewählter Logbucheintrag|Gewählte Logbucheinträge}}:'''",
-'revdelete-text' => "'''Gelöschte Versionen und Aktionen verbleiben in der Versionsgeschichte und den Logbüchern, jedoch sind Teile davon für die Öffentlichkeit unzugänglich.'''
-Andere Administratoren auf {{SITENAME}} haben Zugriff auf den versteckten Inhalt und können ihn mit der gleichen Seite wiederherstellen, sofern nicht zusätzliche Einschränkungen bestehen.",
+'revdelete-text-text' => 'Gelöschte Versionen verbleiben noch in der Versionsgeschichte, jedoch sind Teile ihres Inhalts für die Öffentlichkeit nicht zugänglich.',
+'revdelete-text-file' => 'Gelöschte Dateiversionen verbleiben noch in der Datei-Versionsgeschichte, jedoch sind Teile ihres Inhalts für die Öffentlichkeit nicht zugänglich.',
+'logdelete-text' => 'Gelöschte Logbucheinträge verbleiben noch in den Logbüchern, jedoch sind Teile ihres Inhalts für die Öffentlichkeit nicht zugänglich.',
+'revdelete-text-others' => 'Andere Administratoren auf {{SITENAME}} haben noch Zugriff auf den versteckten Inhalt und können ihn auch mithilfe dieser Spezialseite wiederherstellen, falls keine zusätzlichen Beschränkungen festgelegt wurden.',
'revdelete-confirm' => 'Bitte bestätige, dass du beabsichtigst, dies zu tun, die Konsequenzen verstehst und es in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] tust.',
'revdelete-suppress-text' => "Unterdrückungen sollten '''nur''' in den folgenden Fällen vorgenommen werden:
* Potentiell beleidigende Informationen
'search-file-match' => '(treffende Dateiinhalte)',
'search-suggest' => 'Meintest du „$1“?',
'search-interwiki-caption' => 'Schwesterprojekte',
-'search-interwiki-default' => '$1 Ergebnisse:',
+'search-interwiki-default' => 'Ergebnisse von $1:',
'search-interwiki-more' => '(weitere)',
'search-relatedarticle' => 'Verwandte',
'searcheverything-enable' => 'In allen Namensräumen suchen',
'delete-edit-reasonlist' => 'Löschgründe bearbeiten',
'delete-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen solcher Seiten wurde eingeschränkt, um eine versehentliche Überlastung der Server zu verhindern.',
'delete-warning-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen kann zu Störungen im Datenbankbetrieb führen.',
-'deleting-backlinks-warning' => "'''Warnung:''' Es verweisen noch andere Seiten auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.",
+'deleting-backlinks-warning' => "'''Warnung:''' Es verweisen noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere Seiten]] auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.",
# Rollback
'rollback' => 'Zurücksetzen der Änderungen',
'tog-ccmeonemails' => 'E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe',
'tog-diffonly' => 'Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê',
'tog-showhiddencats' => 'Kategoriyanê dızdiye bımocne',
-'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
'tog-useeditwarning' => 'Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de',
'tog-prefershttps' => 'Ronışten akerden de greyo itimadın bıkarne',
'revdelete-show-file-submit' => 'E',
'revdelete-selected' => "'''[[:$1]]: ra {{PLURAL:$2|çımraviyarnayışo weçinıte|çımraviyarnayışê weçinıtey}}'''",
'logdelete-selected' => "'''{{PLURAL:$1|Qeydbiyayışo weçinıte|Qeydbiyayışê weçinıtey}}:'''",
-'revdelete-text' => "'''Çımraviyarnayışê esterıtey u kerdışi hewna tarixê pele u qeydan de asenê, hema parçeyê zerrekê dinan areze nêbenê.'''
-Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşenê hewna bıresê zerrekê nımıtey u şenê ey anciya na eyni miyanpele ra peyser biarê.",
'revdelete-confirm' => 'Ma rica keno testiq bike ti ena hereket keno u ti zano neticeyanê herketanê xo u ti ena hereket pê ena [[{{MediaWiki:Policy-url}}|polici]] ra keno.',
'revdelete-suppress-text' => "Wedardış gani '''tenya''' nê halanê cêrênan de bıxebıtiyo:
* Melumatê kıfırio mıhtemel
'search-section' => '(qısmê $1)',
'search-file-match' => '(zerreyê dosya yewbini gêno)',
'search-suggest' => 'To va: $1',
-'search-interwiki-caption' => 'Projey Bıray',
+'search-interwiki-caption' => 'Proceyê bıray',
'search-interwiki-default' => '$1 neticeyan:',
'search-interwiki-more' => '(véşi)',
'search-relatedarticle' => 'Eleqeyın',
Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.',
'removewatch' => 'Listedê mınê seyr kerdışi ra hewad',
'removedwatchtext' => 'Ena pela "[[:$1]]" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].',
-'watch' => 'Temaşe ke',
+'watch' => 'Seyr ke',
'watchthispage' => 'Ena pele seyr ke',
'unwatch' => 'Teqib mekerê',
'unwatchthispage' => 'temaşa kerdışê peli vındarn.',
'tooltip-p-logo' => 'Şo pela seri',
'tooltip-n-mainpage' => 'Şo pela seri',
'tooltip-n-mainpage-description' => 'Şo pela seri',
-'tooltip-n-portal' => 'Heqa projey de, kes çı şeno bıkero, çıçiyo koti deyo',
+'tooltip-n-portal' => 'Heqa procey de, çı şenay bıkerê, çı koti vêniyeno',
'tooltip-n-currentevents' => 'Vurnayışanê peyênan de melumatê pey bıvêne',
'tooltip-n-recentchanges' => 'Wiki de lista vurnayışanê peyênan',
'tooltip-n-randompage' => 'Perake raşt amé',
'descending_abbrev' => 'nızm',
'table_pager_next' => 'Pela peyêne',
'table_pager_prev' => 'Pela verêne',
-'table_pager_first' => 'Pela jûyıne',
+'table_pager_first' => 'Pela sıfteyêne',
'table_pager_last' => 'Pela peyêne',
'table_pager_limit' => 'her per de $1 unsuran bımocne',
'table_pager_limit_label' => 'Her pele ra xacetan',
'createacct-another-realname-tip' => 'Napšawdne mě jo opcionalne.
Jolic jo pódajoš, buźo se to wužywaś, aby pśinoski pśirědowało.',
'pt-login' => 'Pśizjawiś',
+'pt-login-button' => 'Pśizjawiś',
'pt-createaccount' => 'Konto załožyś',
'pt-userlogout' => 'Wótzjawiś',
'revdelete-show-file-submit' => 'Jo',
'revdelete-selected' => "'''{{PLURAL:$2|Wuzwólona wersija|Wuzwólonej wersiji|Wuzwólone wersije}} wót [[:$1]].'''",
'logdelete-selected' => "'''{{PLURAL:$1|Wuzwólony protokolowe tšojenje|Wuzwólonej protokolowe tšojeni|wuzwólone protokolowe tšojenja}}:'''",
-'revdelete-text' => "'''Wulašowane wersije a tšojenja budu se dalej w stawiznach boka a w protokolach pokazaś, ale źěle jich wopśimjeśa njebudu pśistupne za zjawnosć.'''
-Dalšne administratory na {{GRAMMAR:lokatiw|{{SITENAME}}}} mógu ale pśecej hyšći pśistup na schowane wopśimjeśe měś a mógu jo pśez samki interfejs wótnowiś, snaźkuli su pśidatne wobgranicowanja.",
'revdelete-confirm' => 'Pšosym wobkšuś, až coš to cyniś, až rozmějoš konsekwence a až cyniš to pó [[{{MediaWiki:Policy-url}}|pšawidłach]].',
'revdelete-suppress-text' => "Pódtłocenje by dejało se '''jano''' za slědujuce pady wužywaś:
* Potencielnje ranjece informacije
'search-file-match' => '(wótpowědujo datajowemu wopśimjeśeju)',
'search-suggest' => 'Měnjašo $1?',
'search-interwiki-caption' => 'Sotšine projekty',
-'search-interwiki-default' => '$1 wuslědki:',
+'search-interwiki-default' => 'Wuslědki z $1:',
'search-interwiki-more' => '(wěcej)',
'search-relatedarticle' => 'swójźbne',
'searcheverything-enable' => 'We wšych mjenjowych rumach pytaś',
'delete-toobig' => 'Toś ten bok ma z wěcej nježli $1 {{PLURAL:$1|wersiju|wersijomaj|wersijami|wersijami}} dłujku historiju. Lašowanje takich bokow bu wobgranicowane, aby wobškoźenju {{GRAMMAR:genitiw|{{SITENAME}}}} z pśigódy zajźowało.',
'delete-warning-toobig' => 'Toś ten bok ma z wěcej ako $1 {{PLURAL:$1|wersiju|wersijomaj|wersijami|wersijami}} dłujke stawizny. Jich wulašowanje móžo źěło datoweje banki na {{SITENAME}} kazyś;
póstupujśo z glědanim.',
-'deleting-backlinks-warning' => "'''Warnowanje:''' Druge boki wótkazuju k bokoju abo bok jo hynźi zapśěgnjony, kótaryž coš wulašowaś.",
+'deleting-backlinks-warning' => "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge boki]] wótkazuju k bokoju abo bok jo hynźi zapśěgnjony, kótaryž coš wulašowaś.",
# Rollback
'rollback' => 'Wobźěłanja slědk wześ',
'suspicious-userlogout' => "La tó dmânda per destachêret l'é stēda rifiutêda perchè la sèmbra spidîda da un navigadōr ch' al funsiòuna mìa o da un proxy di caching.",
'createacct-another-realname-tip' => "Druvêr al nòm vèira l'é 'na siēlta personêla; s' es pèinsa 'd ruvêrel al gnirâ uşê per dêr la paternitê di lavōr spidî.",
'pt-login' => 'Và dèinter',
+'pt-login-button' => 'Và dèinter',
'pt-createaccount' => 'Fà la tó inscrisiòun',
'pt-userlogout' => 'Và fōra',
'resetpass-wrong-oldpass' => "Cêva 'd ingrès pruvişôria o còla 'd adès mìa vâlida.
La cêva 'd ingrès la pré èser stêda bèle cambiêda, opór n'in pré èser stê dmandê 'na nōva pruvişôria.",
'resetpass-recycled' => "Mèt dèinter 'na cêva 'd ingrès divêrsa da còla 'd adès.",
+'resetpass-temp-emailed' => "L'ingrès l'é stê fât cun un côdis pruvişôri. Per finîr la registrasiòun, l'é necesâri impustêr 'na nōva cêva 'd ingrès ché:",
'resetpass-temp-password' => "Cêva 'd ingrès pruvişôria:",
'resetpass-abort-generic' => "La mudéfica 'd la cêva 'd ingrès l'é stêda fermêda da un şlungamèint.",
'resetpass-expired' => "La cêva 'd ingrès l'é scadûda. Mèt dèinter 'na cêva 'd ingrès nōva per fêr l'ingrès.",
'editingsection' => 'Mudéfica ed $1 (sesiòun)',
'editingcomment' => 'Mudéfica e $1 (sesiòun nōva)',
'editconflict' => "Cuntrâst 'd edisiòun só $1",
+'explainconflict' => "Un êter utèint l'à salvê 'na nōva versiòun ed la pàgina mèinter t'ēr adrē fêr dal mudéfichi. Int la caşèla 'd mudéfica ché 'd sōver a gh'é al tèst ed la pàgina che adès l'é in lénia, acsé cme l'é stêda salvêda da cl'êter utèint. La versiòun cun al tō mudéfichi invēci l'é int la caşèla dal mudéfichi ché sòta. S' ét vō cunfermêri, ét dēv purtêr al tō mudéfichi int al tèst che gh'é bèle (caşèla ché 'd sōver). Se té schés al ptòun '{{int:savearticle}}', a gnirà salvê '''sōl''' al tèst dèinter a la caşèla 'd mudéfica ché 'd sōver.",
'yourtext' => 'Al tó tèst',
+'storedversion' => 'La versiòun in memôria',
+'nonunicodebrowser' => "'''Atèinti: a s'é drē druvêr un navigadōr ch' al và mìa d' acôrdi cun i carâter ''Unicode''. Per permèter la mudéfica dal pàgini sèinsa fêr d' incunveniĵnt, int la caşèla ed mudéfica i carâter mia ASCII a vînen fât vèder cme côdis eşadecimêl.'''",
+'editingold' => "<strong>Atèinti: a s'é drē mudifichêr 'na versiòun mìa arnuvêda 'd la pàgina.</strong>
+S'es pèinsa ed salvêrla, tót i cambiamèint fât dōp cla mudéfica ché andrân pêrs.",
'yourdiff' => 'Diferèinsi',
+'copyrightwarning' => "Per piaşèir tîn cûnt che tót al colaborasiòun a {{SITENAME}} a vînen cunsidrêdi publichêdi sòta la licèinsa $2 (per i particulêr guêrda $1). S' an 't vō mìa che i tō tèst a pôsen èser cambiê e turnê a publichêr da tót sèinsa lémit, an publichêri mìa ché.<br/> In pió, se 't i póblich ché, a 't dichiâr, sòta la tó responsabilitê, che còl ch' è stê scrét a 't l'ê scrét té personalmèint opór l'é ste cupiê da documèint sèinsa ch' al sìa quacê da nisûn dirét 'd autōr. <strong> Ché insém an pubblichêr mìa materiêl quacê da dirét 'd autōr sèinsa autorişâsiòun! </strong>",
+'copyrightwarning2' => "Per piaşèir tîn cûnt che tót al colaborasiòun a {{SITENAME}} a pōlen èser mudifichê, arversê o scanşlê da êtra gînta cla dà 'na mân. S' an 't vō mìa che i tō tèst a pôsen èser cambiê alōra an publichêri mìa ché.<br/>In pió, se 't i póblich ché, a 't dichiâr, sòta la tó responsabilitê, che còl ch' è stê scrét a 't l'ê scrét té personalmèint opór l'é ste cupiê da documèint sèinsa ch' al sìa quacê da nisûn dirét 'd autōr (per i particulêr guêrda $1). <strong> Ché insém an pubblichêr mìa materiêl quacê da dirét 'd autōr sèinsa autorişâsiòun! </strong>",
+'longpageerror' => "<strong> Erōr: al tèst spidî l'é lòngh {{PLURAL:$1|1|$1}} kilobyte, ch'l'é pió grôs ed l'amzûra mâsima permésa {{PLURAL:$2|1|$2}} kilobyte). </strong> Al tèst al pôl mìa èser salvê.",
'templatesused' => '{{PLURAL:$1|Mudèl druvê|Mudē druvê}} in cla pàgina ché:',
'template-protected' => '(prutèt)',
'template-semiprotected' => '(mèz-prutèt)',
* @author Aitolos
* @author Assassingr
* @author Astralnet
+ * @author Axil
* @author Azimout
* @author Badseed
* @author Chomwitt
'tog-ccmeonemails' => 'Να μου αποστέλλονται αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες',
'tog-diffonly' => 'Να μην εμφανίζεται περιεχόμενο σελίδων κάτω από τις διαφορές των εκδόσεων',
'tog-showhiddencats' => 'Εμφάνιση κρυμμένων κατηγοριών',
-'tog-noconvertlink' => 'Απενεργοποίησε την μετατροπή τίτλου συνδέσμου',
'tog-norollbackdiff' => 'Παράλειψη διαφοράς μετά την εκτέλεση επαναφοράς',
'tog-useeditwarning' => 'Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές',
'tog-prefershttps' => 'Να γίνεται πάντα χρήση ασφαλούς σύνδεσης όταν ο χρήστης είναι συνδεδεμένος',
# Change password dialog
'changepassword' => 'Αλλαγή κωδικού',
-'resetpass_announce' => 'ΣÏ\85νδεθήκαÏ\84ε με Îνα Ï\80Ï\81οÏ\83Ï\89Ï\81ινÏ\8c κÏ\89δικÏ\8c, Ï\83Ï\84αλμÎνο με e-mail. Î\93ια να ολοκληÏ\81Ï\8eÏ\83εÏ\84ε Ï\84ην Ï\83Ï\8dνδεÏ\83η, Ï\80Ï\81ÎÏ\80ει να Ï\83Ï\84είλεÏ\84ε Îνα νÎο κÏ\89δικÏ\8c εδÏ\8e:',
+'resetpass_announce' => 'Για να ολοκληρώσετε την σύνδεση, πρέπει να στείλετε ένα νέο κωδικό εδώ:',
'resetpass_text' => '<!-- Προσθέστε κείμενο εδώ -->',
'resetpass_header' => 'Αλλαγή κωδικού πρόσβασης',
'oldpassword' => 'Παλιός κωδικός',
'resetpass-submit-cancel' => 'Ακύρωση',
'resetpass-wrong-oldpass' => 'Λάθος προσωρινός ή κανονικός κωδικός.
Μπορεί να έχετε ήδη αλλάξει επιτυχώς τον κωδικό σας ή να έχετε ζητήσει έναν νέο προσωρινό κωδικό.',
+'resetpass-recycled' => 'Παρακαλούμε επαναφέρετε τον κωδικό πρόσβασής σας σε κάτι διαφορετικό από τον τρέχοντα κωδικό πρόσβασης.',
'resetpass-temp-password' => 'Προσωρινός κωδικός:',
'resetpass-abort-generic' => 'Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.',
'revdelete-show-file-submit' => 'Ναι',
'revdelete-selected' => "'''{{PLURAL:$2|Επιλεγμένη έκδοση|Επιλεγμένες εκδόσεις}} της [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Επιλεγμένο γεγονός αρχείου καταγραφής|Επιλεγμένα γεγονότα αρχείου καταγραφής}}:'''",
-'revdelete-text' => "'''Οι διεγραμμένες αναθεωρήσεις και τα γεγονότα θα εμφανίζονται ακόμα στο ιστορικό της σελίδας και στα αρχεία καταγραφών, αλλά μέρη του περιεχομένου τους θα είναι απροσπέλαστα στο κοινό.'''
-Άλλοι διαχειριστές στον ιστότοπο {{SITENAME}} θα είναι ακόμα ικανοί να προσπελάσουν το κρυμμένο περιεχόμενο και μπορούν να το επαναφέρουν ξανά μέσω αυτής της διεπαφής, εκτός αν τεθούν πρόσθετοι περιορισμοί.",
'revdelete-confirm' => 'Παρακαλούμε επιβεβαιώστε ότι σκοπεύετε να το κάνετε αυτό, ότι αντιλαμβάνεσθε τις συνέπειες, και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].',
'revdelete-suppress-text' => 'Η καταστολή μπορεί να χρησιμοποιηθεί <strong> μόνο </strong> για τις ακόλουθες περιπτώσεις:
* Ενδεχόμενη συκοφαντική δυσφήμιση
'tog-ccmeonemails' => 'Send me copies of emails I send to other users',
'tog-diffonly' => 'Do not show page content below diffs',
'tog-showhiddencats' => 'Show hidden categories',
-'tog-noconvertlink' => 'Disable link title conversion', # only translate this message to other languages if you have to change it
'tog-norollbackdiff' => 'Omit diff after performing a rollback',
'tog-useeditwarning' => 'Warn me when I leave an edit page with unsaved changes',
'tog-prefershttps' => 'Always use a secure connection when logged in',
'createacct-another-realname-tip' => 'Real name is optional.
If you choose to provide it, this will be used for giving the user attribution for their work.',
'pt-login' => 'Log in',
+'pt-login-button' => 'Log in',
'pt-createaccount' => 'Create account',
'pt-userlogout' => 'Log out',
'revdelete-show-file-submit' => 'Yes',
'revdelete-selected' => '<strong>{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:</strong>',
'logdelete-selected' => '<strong>{{PLURAL:$1|Selected log event|Selected log events}}:</strong>',
-'revdelete-text' => '<strong>Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.</strong>
-Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.',
+'revdelete-text-text' => 'Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.',
+'revdelete-text-file' => 'Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.',
+'logdelete-text' => 'Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.',
+'revdelete-text-others' => 'Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.',
'revdelete-confirm' => 'Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].',
'revdelete-suppress-text' => 'Suppression should <strong>only</strong> be used for the following cases:
* potentially libelous information
'search-file-match' => '(matches file content)',
'search-suggest' => 'Did you mean: $1',
'search-interwiki-caption' => 'Sister projects',
-'search-interwiki-default' => '$1 results:',
+'search-interwiki-default' => 'Results from $1:',
'search-interwiki-custom' => '', # do not translate or duplicate this message to other languages
'search-interwiki-more' => '(more)',
'search-relatedarticle' => 'Related',
'delete-warning-toobig' => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
Deleting it may disrupt database operations of {{SITENAME}};
proceed with caution.',
-'deleting-backlinks-warning' => "'''Warning:''' Other pages link to or transclude the page you are about to delete.",
+'deleting-backlinks-warning' => "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
# Rollback
'rollback' => 'Roll back edits',
'dberr-cachederror' => 'This is a cached copy of the requested page, and may not be up to date.',
# HTML forms
-'htmlform-invalid-input' => 'There are problems with some of your input',
+'htmlform-invalid-input' => 'There are problems with some of your input.',
'htmlform-select-badoption' => 'The value you specified is not a valid option.',
'htmlform-int-invalid' => 'The value you specified is not an integer.',
'htmlform-float-invalid' => 'The value you specified is not a number.',
-'htmlform-int-toolow' => 'The value you specified is below the minimum of $1',
-'htmlform-int-toohigh' => 'The value you specified is above the maximum of $1',
-'htmlform-required' => 'This value is required',
+'htmlform-int-toolow' => 'The value you specified is below the minimum of $1.',
+'htmlform-int-toohigh' => 'The value you specified is above the maximum of $1.',
+'htmlform-required' => 'This value is required.',
'htmlform-submit' => 'Submit',
'htmlform-reset' => 'Undo changes',
'htmlform-selectorother-other' => 'Other',
'revdelete-show-file-submit' => 'Jes',
'revdelete-selected' => "'''{{PLURAL:$2|Selektata versio|Selektataj versioj}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Selektata protokola evento|Selektataj protokolaj eventoj}}:'''",
-'revdelete-text' => "'''Forigitaj versioj kaj eventoj plu aperos en la historipaĝoj, sed iliaj tekstoj ne estos alireblaj de la publiko.'''
-Aliaj administrantoj ĉe {{SITENAME}} plu povos aliri la kaŝitan entenon kaj restarigi ĝin per la sama interfaco, krom se plia limigo estas metita de la paĝaradministrantoj.",
'revdelete-confirm' => 'Bonvolu konfirmi ke vi intencias fari ĉi tion, ke vi komprenas la konsekvencojn kaj ke vi faras ĉi tion laŭ [[{{MediaWiki:Policy-url}}|la regularo]].',
'revdelete-suppress-text' => "Subpremo '''nur''' estu uzata por la jenaj kazoj:
* Ebla kalumnia informo
* @author Sethladan
* @author Shirayuki
* @author Spacebirdy
+ * @author Sporeunai
* @author Stephensuleeman
* @author Technorum
* @author The Evil IP address
'img_link' => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
'sitename' => array( '1', 'NOMBREDELSITIO', 'SITENAME' ),
'ns' => array( '0', 'EN:', 'NS:' ),
- 'localurl' => array( '0', 'URLLOCAL', 'LOCALURL:' ),
+ 'localurl' => array( '0', 'URLLOCAL:', 'LOCALURL:' ),
'localurle' => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
'server' => array( '0', 'SERVIDOR', 'SERVER' ),
'servername' => array( '0', 'NOMBRESERVIDOR', 'SERVERNAME' ),
'fullurle' => array( '0', 'URLCOMPLETAC:', 'FULLURLE:' ),
'canonicalurl' => array( '0', 'URLCANONICA:', 'CANONICALURL:' ),
'canonicalurle' => array( '0', 'URLCANONICAC:', 'CANONICALURLE:' ),
- 'lcfirst' => array( '0', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+ 'lcfirst' => array( '0', 'PRIMEROMINUS:', 'PRIMEROMINÚS:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'PRIMEROMAYUS:', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
'lc' => array( '0', 'MINUS:', 'MINÚS:', 'LC:' ),
'uc' => array( '0', 'MAYUS:', 'MAYÚS:', 'UC:' ),
- 'raw' => array( '0', 'SINFORMATO', 'SINPUNTOS', 'RAW:' ),
+ 'raw' => array( '0', 'SINFORMATO:', 'SINPUNTOS:', 'RAW:' ),
'displaytitle' => array( '1', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
'rawsuffix' => array( '1', 'SF', 'R' ),
'newsectionlink' => array( '1', '__VINCULARANUEVASECCION__', '__ENLACECREARSECCIÓN__', '__NEWSECTIONLINK__' ),
'tog-ccmeonemails' => 'Recibir copias de los correos que envío a otros usuarios',
'tog-diffonly' => "No mostrar bajo las ''diferencias'' el contenido de la página",
'tog-showhiddencats' => 'Mostrar las categorías escondidas',
-'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
'tog-norollbackdiff' => 'Omitir la diferencia después de revertir',
'tog-useeditwarning' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
'tog-prefershttps' => 'Utiliza una conexión segura siempre que haya iniciado una sesión',
'resetpass-temp-password' => 'Contraseña temporal:',
'resetpass-abort-generic' => 'Una extensión ha cancelado el cambio de la contraseña.',
'resetpass-expired' => 'Tu contraseña ha caducado. Por favor, establece una nueva contraseña para iniciar sesión.',
-'resetpass-expired-soft' => 'Tu contraseña ha expirado y necesita ser restablecida. Elije una nueva contraseña ahora, o haz clic en cancelar para restablecerla más tarde.',
+'resetpass-expired-soft' => 'Su contraseña ha caducado y necesita reajustarse. Elija una nueva contraseña ahora, o haga clic en "{{int:resetpass-enviar-cancelar}}" para restaurarla más adelante.',
# Special:PasswordReset
'passwordreset' => 'Restablecimiento de contraseña',
'revdelete-show-file-submit' => 'Sí',
'revdelete-selected' => "'''{{PLURAL:$2|Revisión seleccionada|Revisiones seleccionadas}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Seleccionado un evento|Seleccionados eventos}}:'''",
-'revdelete-text' => "Las revisiones borradas aún aparecerán en el historial de la página y en los registros, pero sus contenidos no serán accesibles al público.'''
-Otros administradores de {{SITENAME}} aún podrán acceder al contenido oculto y podrán deshacer el borrado a través de la misma interfaz, a menos que se establezcan restricciones adicionales.",
'revdelete-confirm' => 'Por favor confirma que deseas realizar la operación, que entiendes las consecuencias y que estás ejecutando dicha acción acorde con [[{{MediaWiki:Policy-url}}|las políticas]].',
'revdelete-suppress-text' => "La herramienta de supresión '''solo''' debería usarse en los siguientes casos:
* información potencialmente injuriosa o calumniante.
'recentchanges-label-plusminus' => 'El tamaño de la página cambió esta cantidad de bytes',
'recentchanges-legend-heading' => "'''Leyenda:'''",
'recentchanges-legend-newpage' => '(véase también la [[Special:NewPages|lista de páginas nuevas]])',
-'rcnotefrom' => 'A continuación se muestran los cambios desde <b>$2</b> (hasta <b>$1</b>).',
+'rcnotefrom' => 'A continuación se presentan los cambios desde <strong> $2 </strong> (hasta <strong> $1 </strong> se muestra).',
'rclistfrom' => 'Mostrar nuevos cambios desde $1',
'rcshowhideminor' => '$1 ediciones menores',
'rcshowhideminor-show' => 'Mostrar',
'revdelete-show-file-submit' => 'Jah',
'revdelete-selected' => "'''Valitud {{PLURAL:$2|redaktsioon|redaktsioonid}} leheküljest [[:$1]]:'''",
'logdelete-selected' => "'''Valitud {{PLURAL:$1|logisissekanne|logisissekanded}}:'''",
-'revdelete-text' => "'''Kustutatud redaktsioonid ja sündmused kajastuvad endiselt lehekülje ajaloos ja logides, kuid osa nende sisust pole avalikult nähtav.'''
-{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad peidetud sisu siiski vaadata ning seda vajadusel selle liidese kaudu taastada, kui see pole just täiendavalt keelatud.",
'revdelete-confirm' => 'Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].',
'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgmistel juhtudel:
* võimalik laim
'search-file-match' => '(vastab faili sisule)',
'search-suggest' => 'Kas mõtlesid: $1',
'search-interwiki-caption' => 'Sõsarprojektid',
-'search-interwiki-default' => '$1 tulemused:',
+'search-interwiki-default' => 'Tulemused asukohast $1:',
'search-interwiki-more' => '(veel)',
'search-relatedarticle' => 'Seotud',
'searcheverything-enable' => 'Otsi kõigist nimeruumidest',
Selle kustutamine on keelatud, et ära hoida ekslikku {{GRAMMAR:genitive|{{SITENAME}}}} töö häirimist.',
'delete-warning-toobig' => 'See lehekülg on pika redigeerimislooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.
Ettevaatust, selle kustutamine võib esile kutsuda häireid {{GRAMMAR:genitive|{{SITENAME}}}} andmebaasi töös.',
-'deleting-backlinks-warning' => "'''Hoiatus:''' Teised leheküljed viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
+'deleting-backlinks-warning' => "'''Hoiatus:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
# Rollback
'rollback' => 'Tühista muudatused',
'vector-action-unprotect' => 'Babesa aldatu',
'vector-view-create' => 'Sortu',
'vector-view-edit' => 'Aldatu',
-'vector-view-history' => 'Historia ikusi',
+'vector-view-history' => 'Ikusi historia',
'vector-view-view' => 'Irakurri',
'vector-view-viewsource' => 'Kodea ikusia',
'actions' => 'Ekintzak',
'revdelete-show-file-submit' => 'Bai',
'revdelete-selected' => "'''{{PLURAL:$2|[[:$1]](r)en hautatutako berrikuspena:|[[:$1]](r)en hautatutako berrikuspenak}}'''",
'logdelete-selected' => "'''{{PLURAL:$1|Aukeratutako log gertakaria|Aukeratutako log gertakariak}}:'''",
-'revdelete-text' => "'''Ezabatutako berrikuspenek orrialdearen historian agertzen jarraituko dute, baina bere edukiak ez dira publikoki eskuratu ahal izango.'''
-{{SITENAME}}ko administratzaileek ezkutuko eduki hau ikusteko aukera izango dute, eta baita leheneratzeko ere, gunearen arduradunek beste mugapenen bat ezartzen ez badute behintzat.",
'revdelete-confirm' => 'Baiezta ezazu hori dela zure asmoa, ulertzen dituzula ondorioak, eta [[{{MediaWiki:Policy-url}}|irizpideak]] errespetatuz egiten ari zarela hau.',
'revdelete-suppress-text' => "Ezabaketa '''bakarrik''' arrazoi hauek direla eta erabili beharko litzateke:
* Informazio pertsonal desegokia
'action-writeapi' => 'idazteko APIa erabili',
'action-delete' => 'orrialde hau ezabatu',
'action-deleterevision' => 'berrikuspen hau ezabatu',
-'action-deletedhistory' => 'orrialde honetako ezabatutako historia ikusi',
+'action-deletedhistory' => 'ikusi orri honen historia ezabatua',
'action-browsearchive' => 'ezabatutako orrialdeak bilatu',
'action-undelete' => 'ezabatutako orrialde hau bergaitu',
'action-suppressrevision' => 'izkutuko berrikuspen hau berrikusi eta gaitu',
'revdelete-show-file-submit' => 'Sí',
'revdelete-selected' => "'''{{PLURAL:$2|Revisión aseñalá e|Revisionis aseñalás de}} '''[[:$1]]''':'''",
'logdelete-selected' => "'''{{PLURAL:$1|Eventu el rustrihu aseñalau|Eventus del rustrihu aseñalaus}}:'''",
-'revdelete-text' => "'''Las revisionis esborrás entovia apaicirán nel estorial la páhina, peru el su continiu nu sedrá acesibri pal púbricu.'''
-
-El restu e çahorilis desti güiqui sí tendrán premisu pa visoreal el continiu açonchau, i revertil el esborrau si es mestel, a nu sel que los alministraoris del güiqui crein una restrición aicional.",
'revdelete-legend' => 'Establecel restricionis de visibiliá',
'revdelete-hide-text' => 'Açonchal el testu la revisión',
'revdelete-hide-image' => 'Açonchal el continiu el archivu',
* @author Asoxor
* @author Baqeri
* @author Behdarvandyani
+ * @author Calak
* @author Dalba
* @author E THP
* @author Ebraminio
'tog-ccmeonemails' => 'رونوشتی از نامهای که به دیگران ارسال میکنم برای خودم هم فرستاده شود',
'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
'tog-showhiddencats' => 'ردههای پنهان نمایش داده شود',
-'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
'tog-norollbackdiff' => 'بعد از واگردانی تفاوت نشان داده نشود',
'tog-useeditwarning' => 'زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایشهای ذخیرهنشده به من هشدار داده شود',
'tog-prefershttps' => 'در حالت ورود به سامانه همواره از اتصال امن استفاده شود',
'createacct-emailoptional' => 'نشانی رایانامه (اختیاری)',
'createacct-email-ph' => 'نشانی رایانامه را وارد کنید',
'createacct-another-email-ph' => 'نشانی رایانامه را وارد کنید',
-'createaccountmail' => 'استÙ\81ادÙ\87 از رÙ\85ز عبÙ\88ر Ù\85Ù\88Ù\82ت تصادÙ\81Û\8c Ù\88 Ù\81رستادÙ\86 Ø¢Ù\86 بÙ\87 Ù\86شاÙ\86Û\8c اÛ\8cÙ\85Û\8cÙ\84 مشخصشده',
+'createaccountmail' => 'استÙ\81ادÙ\87 از رÙ\85ز عبÙ\88ر Ù\85Ù\88Ù\82ت تصادÙ\81Û\8c Ù\88 Ù\81رستادÙ\86 Ø¢Ù\86 بÙ\87 Ù\86شاÙ\86Û\8c راÛ\8cاÙ\86اÙ\85Ù\87 مشخصشده',
'createacct-realname' => 'نام واقعی (اختیاری)',
'createaccountreason' => 'دلیل:',
'createacct-reason' => 'دلیل',
*'''گوگل کروم:'''کلیدهای ''Ctrl+Shift+R'' را با هم فشار دهید. (در رایانههای اپل مکینتاش کلیدهای ''⌘-Shift-R'')
*'''اینترنت اکسپلورر:''' کلید ''Ctrl'' را نگهدارید و روی دکمهٔ ''Refresh'' کلیک کنید، یا کلیدهای ''Ctrl-F5'' را با هم فشار دهید
*'''اپرا:''' حافظهٔ نهانی مرورگر را از طریق منوی ''Tools → Preferences'' پاک کنید",
-'usercssyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ از ذخÛ\8cرÙ\87â\80\8cکردÙ\86 Ù\81اÛ\8cÙ\84 سیاساس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
-'userjsyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ از ذخÛ\8cرÙ\87â\80\8cکردÙ\86 Ù\81اÛ\8cÙ\84 جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'usercssyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ از ذخÛ\8cرÙ\87â\80\8cکردÙ\86 پرÙ\88Ù\86دÙ\87 سیاساس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'userjsyoucanpreview' => "'''Ù\86کتÙ\87:''' Ù¾Û\8cØ´ از ذخÛ\8cرÙ\87â\80\8cکردÙ\86 پرÙ\88Ù\86دÙ\87Ù\94 جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
'usercsspreview' => "'''فراموش مکنید که شما فقط دارید پیشنمایش سیاساس کاربریتان را میبینید.'''
'''این سیاساس هنوز ذخیره نشدهاست!'''",
'userjspreview' => "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربریتان را امتحان میکنید/پیشنمایش آن را میبینید.'''
'session_fail_preview' => "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمیتوانیم ویرایش شما را پردازش کنیم.'''
لطفاً دوباره سعی کنید.
اگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
-'session_fail_preview_html' => "'''Ù\85تاسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''
+'session_fail_preview_html' => "'''Ù\85تأسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''
''با توجه به این که در {{SITENAME}} امکان درج اچتیامال خام فعال است، پیشنمایش صفحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''
'revdelete-show-file-submit' => 'بله',
'revdelete-selected' => "'''{{PLURAL:$2|نسخهٔ|نسخههای}} انتخاب شده از [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|مورد|موارد}} انتخاب شده از سیاهه:'''",
-'revdelete-text' => "'''نسخهها و موارد حذف شده کماکان از طریق تاریخچهٔ صفحه و سیاههها قابل مشاهده هستند، اما بخشهایی از محتوای آنها توسط عموم قابل مشاهده نخواهد بود.'''
-سایر مدیران {{SITENAME}} هنوز میتوانند این محتوای پنهان را ببینند و از همین طریق موارد حذف شده را احیا کنند، مگر آن که محدودیتهای دیگری اعمال گردد.",
'revdelete-confirm' => 'لطفاً تأیید کنید که میخواهید این کار را انجام دهید، عواقب آن را درک میکنید و این کار را طبق [[{{MediaWiki:Policy-url}}|سیاستها]] انجام میدهید.',
'revdelete-suppress-text' => "فرونشانی باید '''تنها''' برای موارد زیر استفاده شود:
* اطلاعات به طور بالقوه افتراآمیز
'rcshowhidebots' => '$1 رباتها',
'rcshowhidebots-show' => 'نمایش',
'rcshowhidebots-hide' => 'پنهان کردن',
-'rcshowhideliu' => 'کاربران نسخهٔ $1 ثبتنام کردند',
+'rcshowhideliu' => '$1 کاربران ثبتنامکردە',
'rcshowhideliu-show' => 'نمایش',
'rcshowhideliu-hide' => 'پنهان کردن',
'rcshowhideanons' => '$1 کاربران ناشناس',
'file-exists-duplicate' => 'به نظر میرسد این پرونده نسخهای تکراری از {{PLURAL:$1|پروندهٔ|پروندههای}} زیر باشد:',
'file-deleted-duplicate' => 'یک پرونده نظیر این پرونده ([[:$1]]) قبلاً حذف شدهاست.
شما باید تاریخچهٔ حذف آن پرونده را قبل از بارگذاری مجدد آن ببینید.',
-'file-deleted-duplicate-notitle' => 'یک پرونده یکسان بااین پرونده قبلا حذف شده است و عنوان متوقف شدهاست.
-Ø´Ù\85ا باÛ\8cد از کسÛ\8c Ú©Ù\87 دسترسÛ\8c Ù\85شاÙ\87دÙ\87Ù\94 Ù\81اÛ\8cÙ\84 متوقف شده را دارد، درخواست کنید تا شرایط را قبل از بارگذاری مجدد بررسی کند.',
+'file-deleted-duplicate-notitle' => 'یک پرونده یکسان بااین پرونده قبلاً حذف شده است و عنوان متوقف شدهاست.
+Ø´Ù\85ا باÛ\8cد از کسÛ\8c Ú©Ù\87 دسترسÛ\8c Ù\85شاÙ\87دÙ\87Ù\94 پرÙ\88Ù\86دÙ\87 متوقف شده را دارد، درخواست کنید تا شرایط را قبل از بارگذاری مجدد بررسی کند.',
'uploadwarning' => 'هشدار بارگذاری',
'uploadwarning-text' => 'لطفاً توضیحات پرونده را در زیر تغییر دهید و دوباره تلاش کنید.',
'savefile' => 'ذخیرهٔ پرونده',
'shared-repo-from' => 'از $1',
'shared-repo' => 'یک مخزن مشترک',
'shared-repo-name-wikimediacommons' => 'ویکیانبار',
-'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c توانید این پرونده را بازنویس کنید.',
+'upload-disallowed-here' => 'Ù\85تأسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8câ\80\8cتوانید این پرونده را بازنویس کنید.',
# File reversion
'filerevert' => 'واگردانی $1',
'delete-warning-toobig' => 'این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.
حذف آن ممکن است که عملکرد پایگاه دادهٔ {{SITENAME}} را مختل کند;
با احتیاط ادامه دهید.',
-'deleting-backlinks-warning' => "''' هشدار:''' صفحات دیگر پیوند یا تراگنجایش به صفحه شما برای حذف هستند.",
+'deleting-backlinks-warning' => "''' هشدار:''' پیوند [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحات دیگر]] یا تراگنجایش صفحهٔ شما برای حذف.",
# Rollback
'rollback' => 'واگردانی ویرایشها',
# Info page
'pageinfo-title' => 'اطلاعات در مورد «$1»',
-'pageinfo-not-current' => 'Ù\85تاسفانه تهیه اطلاعات ویرایشهای قدیمی غیرممکن است.',
+'pageinfo-not-current' => 'Ù\85تأسفانه تهیه اطلاعات ویرایشهای قدیمی غیرممکن است.',
'pageinfo-header-basic' => 'اطلاعات اولیه',
'pageinfo-header-edits' => 'ویرایش تاریخچه',
'pageinfo-header-restrictions' => 'حفاظت از صفحه',
'logentry-newusers-newusers' => 'حساب کاربری $1 {{GENDER:$2|ایجاد شد}}',
'logentry-newusers-create' => 'حساب کاربری $1 {{GENDER:$2|ایجاد شد}}',
'logentry-newusers-create2' => 'حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}}',
-'logentry-newusers-byemail' => 'حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور به وسیلهٔ ایمیل ارسال شد',
+'logentry-newusers-byemail' => 'حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور بهوسیلهٔ رایانامه ارسال شد',
'logentry-newusers-autocreate' => 'حساب $1 به شکل خودکار {{GENDER:$2|ایجاد شد}}',
'logentry-rights-rights' => '$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}',
'logentry-rights-rights-legacy' => '$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}',
'tog-ccmeonemails' => 'Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista',
'tog-diffonly' => 'Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella',
'tog-showhiddencats' => 'Näytä piilotetut luokat',
-'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään',
'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia, kun olet palauttanut muokkauksen palauta-työkalulla',
'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
'tog-prefershttps' => 'Käytä aina suojattua yhteyttä, kun olet kirjautunut sisään',
'youhavenewmessagesmulti' => 'Sinulla on uusia viestejä sivuilla $1',
'editsection' => 'muokkaa',
'editold' => 'muokkaa',
-'viewsourceold' => 'näytä lähdekoodi',
+'viewsourceold' => 'näytä wikiteksti',
'editlink' => 'muokkaa',
'viewsourcelink' => 'näytä lähdekoodi',
'editsectionhint' => 'Muokkaa osiota $1',
'createacct-another-realname-tip' => 'Vapaaehtoinen.
Nimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.',
'pt-login' => 'Kirjaudu sisään',
+'pt-login-button' => 'Kirjaudu sisään',
'pt-createaccount' => 'Luo tunnus',
'pt-userlogout' => 'Kirjaudu ulos',
'resetpass-temp-password' => 'Väliaikainen salasana:',
'resetpass-abort-generic' => 'Laajennus keskeytti salasanan vaihdon.',
'resetpass-expired' => 'Salasanasi on vanhentunut. Valitse uusi salasana, jotta pääset kirjautumaan sisään.',
-'resetpass-expired-soft' => 'Salasanasi on vanhentunut ja se pitää uudistaa. Valitse nyt uusi salasana tai peruuta toiminto, niin voit uudistaa salasanan myöhemmin.',
+'resetpass-expired-soft' => 'Salasanasi on vanhentunut ja se pitää uudistaa. Valitse uusi salasana nyt tai paina "{{int:resetpass-submit-cancel}}", niin voit uudistaa salasanan myöhemmin.',
# Special:PasswordReset
'passwordreset' => 'Salasanan uudistus',
'revdelete-show-file-submit' => 'Kyllä',
'revdelete-selected' => "'''{{PLURAL:$2|Valittu versio|Valitut versiot}} sivusta [[:$1]]'''",
'logdelete-selected' => "'''{{PLURAL:$1|Valittu lokimerkintä|Valitut lokimerkinnät}}:'''",
-'revdelete-text' => "'''Poistetut versiot ja lokitapahtumat näkyvät edelleen sivun historiassa ja lokeissa, mutta osa niiden sisällöstä ei ole julkisesti saatavilla.'''
-Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti tarkastella piilotettua sisältöä, ja he voivat palauttaa sen näkyviin tämän käyttöliittymän kautta, ellei tätä ole erikseen rajoitettu.",
'revdelete-confirm' => 'Varmista, että haluat tehdä tämän – ymmärrät seuraukset ja teet tämän [[{{MediaWiki:Policy-url}}|käytäntöjen]] mukaisesti.',
'revdelete-suppress-text' => "Häivytystä pitäisi käyttää '''vain''' seuraavissa tapauksissa:
* Mahdollisesti henkilön kunniaa loukkaavia tietoja
'sp-contributions-blocked-notice-anon' => 'Tämä IP-osoite on tällä hetkellä estetty.
Alla on viimeisin estolokin tapahtuma:',
'sp-contributions-search' => 'Etsi muokkauksia',
+'sp-contributions-suppresslog' => 'häivytetyt käyttäjän muokkaukset',
'sp-contributions-username' => 'IP-osoite tai käyttäjätunnus',
'sp-contributions-toponly' => 'Näytä vain muokkaukset, jotka ovat viimeisimpiä versioita',
'sp-contributions-newonly' => 'Näytä vain muokkaukset, joilla on luotu sivu',
'import-error-special' => 'Sivua $1 ei tuotu, koska se kuuluu erityiseen nimiavaruuteen, joka ei salli sivuja.',
'import-error-invalid' => 'Sivua $1 ei tuotu, koska sen nimi ei kelpaa.',
'import-error-unserialize' => 'Versiota $2 sivusta $1 ei voida jakaa osiin. Version ilmoitettiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.',
+'import-error-bad-location' => 'Sivun versiota $2, joka käyttää sisällön mallia $3, ei voi tallettaa kohteeseen "$1" tässä wikissä, koska tuota mallia ei tueta kyseisellä sivulla.',
'import-options-wrong' => '{{PLURAL:$2|Väärä asetus|Väärät asetukset}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Annettu perussivun nimi ei kelpaa.',
'import-rootpage-nosubpage' => 'Annetun perussivun nimiavaruus "$1" ei salli alasivuja.',
* @author Lucyin
* @author Manohisoa
* @author Mattho69
+ * @author Maxim21
* @author Maxime Corbin
* @author McDutchie
* @author Meithal
* @author Nobody
* @author Od1n
* @author Omnipaedista
+ * @author Orlodrim
* @author Peter17
* @author PieRRoMaN
* @author ProgVal
$messages = array(
# User preference toggles
-'tog-underline' => 'Lien hypertexte:',
+'tog-underline' => 'Souligner les liens :',
'tog-hideminor' => 'Masquer les modifications mineures dans les changements récents',
-'tog-hidepatrolled' => 'Masquer les modifications surveillées dans les changements récents',
+'tog-hidepatrolled' => 'Masquer les modifications surveillées dans les modifications récentes',
'tog-newpageshidepatrolled' => 'Masquer les pages surveillées dans la liste des nouvelles pages',
-'tog-extendwatchlist' => 'Développer la liste de suivi pour voir tous les changements, non seulement le plus récent',
+'tog-extendwatchlist' => 'Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes',
'tog-usenewrc' => 'Grouper les changements par page dans les modifications récentes et la liste de suivi (nécessite JavaScript)',
'tog-numberheadings' => 'Numéroter automatiquement les titres de section',
'tog-showtoolbar' => "Afficher la barre d'outils de modification (nécessite JavaScript)",
'tog-rememberpassword' => 'Me reconnecter automatiquement lors des prochaines visites avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
'tog-watchcreations' => "Ajouter les pages que je crée et les fichiers que j'importe à ma liste de suivi",
'tog-watchdefault' => 'Ajouter les pages et les fichiers que je modifie à ma liste de suivi',
-'tog-watchmoves' => 'Ajouter les pages et les fichiers que je déplace à ma liste de suivi',
+'tog-watchmoves' => 'Ajouter les pages et les fichiers que je renomme à ma liste de suivi',
'tog-watchdeletion' => 'Ajouter les pages et les fichiers que je supprime à ma liste de suivi',
-'tog-minordefault' => 'Marquer toutes les modifications mineures par défaut',
+'tog-minordefault' => 'Marquer toutes mes modifications comme mineures par défaut',
'tog-previewontop' => 'Afficher la prévisualisation au-dessus de la zone de modification',
'tog-previewonfirst' => 'Afficher la prévisualisation lors de la première modification',
'tog-enotifwatchlistpages' => "M'avertir par courriel lorsqu'une page ou un fichier de ma liste de suivi est modifiée",
'tog-ccmeonemails' => "M'envoyer une copie des courriels que j'envoie aux autres utilisateurs",
'tog-diffonly' => 'Ne pas afficher le contenu des pages sous les diffs',
'tog-showhiddencats' => 'Afficher les catégories cachées',
-'tog-noconvertlink' => 'Désactiver la conversion des titres',
'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
'tog-useeditwarning' => "M'avertir quand je quitte une page de modification sans publier les changements",
'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté',
'underline-always' => 'Toujours',
'underline-never' => 'Jamais',
-'underline-default' => 'Navigateur ou thème par défaut',
+'underline-default' => 'Valeur par défaut du navigateur ou du thème',
# Font style option in Special:Preferences
'editfont-style' => 'Style de police de la zone de modification :',
-'editfont-default' => 'Navigateur par défaut',
-'editfont-monospace' => 'Police Monospaced',
-'editfont-sansserif' => 'Police Sans-serif',
-'editfont-serif' => 'Police Serif',
+'editfont-default' => 'Police par défaut du navigateur',
+'editfont-monospace' => 'Police à chasse fixe',
+'editfont-sansserif' => 'Police sans-serif',
+'editfont-serif' => 'Police serif',
# Dates
-'sunday' => 'Dimanche',
-'monday' => 'Lundi',
-'tuesday' => 'Mardi',
-'wednesday' => 'Mercredi',
-'thursday' => 'Jeudi',
-'friday' => 'Vendredi',
-'saturday' => 'Samedi',
+'sunday' => 'dimanche',
+'monday' => 'lundi',
+'tuesday' => 'mardi',
+'wednesday' => 'mercredi',
+'thursday' => 'jeudi',
+'friday' => 'vendredi',
+'saturday' => 'samedi',
'sun' => 'Dim.',
'mon' => 'Lun.',
'tue' => 'Mar.',
'category_header' => 'Pages dans la catégorie « $1 »',
'subcategories' => 'Sous-catégories',
'category-media-header' => 'Fichiers multimédias dans la catégorie « $1 »',
-'category-empty' => "''Cette catégorie ne contient aucune page, sous-catégorie ou fichier multimédia.''",
+'category-empty' => '<em>Cette catégorie ne contient aucune page, sous-catégorie ou fichier multimédia.</em>',
'hidden-categories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}}',
'hidden-category-category' => 'Catégories cachées',
'category-subcat-count' => 'Cette catégorie comprend {{PLURAL:$2|la sous-catégorie|$2 sous-catégories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.',
'createacct-another-realname-tip' => 'Le vrai nom est optionnel.
Si vous décidez de le fournir, il sera utilisé pour attribuer à l’utilisateur ses travaux.',
'pt-login' => 'Se connecter',
+'pt-login-button' => 'Se connecter',
'pt-createaccount' => 'Créer un compte',
'pt-userlogout' => 'Se déconnecter',
'revdelete-show-file-submit' => 'Oui',
'revdelete-selected' => "'''{{PLURAL:$2|Version sélectionnée|Versions sélectionnées}} de '''[[:$1]]''' :'''",
'logdelete-selected' => "'''{{PLURAL:$1|Événement d'historique sélectionné|Événements d'historique sélectionnés}} :'''",
-'revdelete-text' => "'''Les versions et événements supprimés seront encore présents dans l'historique de la page et dans les journaux, mais leur contenu textuel sera inaccessible au public.'''
-Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu caché et le restaurer à travers cette même interface, à moins que des restrictions supplémentaires ne soient mises en place.",
+'revdelete-text-text' => "Les révisions supprimées continueront à apparaître dans l'historique de la page, mais une partie de leur contenu sera inaccessible au public.",
+'revdelete-text-file' => "Les versions de fichier supprimées continueront à apparaître dans l'historique des fichiers, mais une partie de leur contenu sera indisponible au public.",
+'logdelete-text' => 'Les évènements du journal supprimés continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.',
+'revdelete-text-others' => "Les autres administrateurs de {{SITENAME}} seront toujours capables d'accéder au contenu caché et peuvent le restaurer à nouveau par cette interface, à moins que des restrictions additionnelles soient définies.",
'revdelete-confirm' => 'Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].',
'revdelete-suppress-text' => "La suppression ne doit être utilisée '''que''' dans les cas suivants :
* Informations potentiellement diffamatoires
'search-file-match' => '(correspond au contenu du fichier)',
'search-suggest' => 'Essayez avec cette orthographe : $1',
'search-interwiki-caption' => 'Projets frères',
-'search-interwiki-default' => 'Résultats sur $1 :',
+'search-interwiki-default' => 'Résultats de $1 :',
'search-interwiki-more' => '(plus)',
'search-relatedarticle' => 'Reliés',
'searcheverything-enable' => 'Rechercher dans tous les espaces de noms',
'prefs-files' => 'Fichiers',
'prefs-custom-css' => 'CSS personnalisé',
'prefs-custom-js' => 'JavaScript personnalisé',
-'prefs-common-css-js' => 'JavaScript et CSS partagé pour tous les habillages :',
+'prefs-common-css-js' => 'CSS et JavaScript communs à tous les habillages :',
'prefs-reset-intro' => 'Vous pouvez utiliser cette page pour restaurer vos préférences aux valeurs par défaut du site. Ceci ne peut pas être défait.',
'prefs-emailconfirm-label' => 'Confirmation du courriel :',
'youremail' => 'Courriel :',
'deadendpagestext' => "Les pages suivantes ne contiennent aucun lien vers d'autres pages du wiki.",
'protectedpages' => 'Pages protégées',
'protectedpages-indef' => 'Uniquement les protections permanentes',
-'protectedpages-summary' => 'Cette page liste les pages existantes actuellement protégées. Pour une liste des titres protégés depuis leur création, voir [[{{#special:ProtectedTitles}}]].',
+'protectedpages-summary' => 'Cette page liste les pages existantes actuellement protégées. Pour une liste des titres protégés contre la création, voir [[{{#special:ProtectedTitles}}]].',
'protectedpages-cascade' => 'Uniquement les protections en cascade',
'protectedpages-noredirect' => 'Masquer les redirections',
'protectedpagesempty' => "Aucune page n'est protégée de cette façon.",
'protectedpages-unknown-timestamp' => 'Inconnu',
'protectedpages-unknown-performer' => 'Utilisateur inconnu',
'protectedtitles' => 'Titres protégés',
-'protectedtitles-summary' => 'Cette page liste les titres actuellement protégés depuis leur création. Pour une liste des pages protégées existantes, voir [[{{#special:ProtectedPages}}]].',
+'protectedtitles-summary' => 'Cette page liste les titres actuellement protégés contre la création. Pour une liste des pages protégées existantes, voir [[{{#special:ProtectedPages}}]].',
'protectedtitlesempty' => "Aucun titre n'est actuellement protégé avec ces paramètres.",
'listusers' => 'Liste des utilisateurs',
'listusers-editsonly' => 'Ne montrer que les utilisateurs ayant au moins une contribution',
'delete-warning-toobig' => "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.
La supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;
veuiller ne procéder qu'avec prudence.",
-'deleting-backlinks-warning' => "'''Attention :''' D’autres pages ont un lien vers ou incorporent la page que vous allez supprimer.",
+'deleting-backlinks-warning' => "'''Attention :''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’autres pages]] ont un lien vers ou incorporent la page que vous allez supprimer.",
# Rollback
'rollback' => 'Révoquer les modifications',
'tog-ccmeonemails' => 'Mè mandar na copia des mèssâjos que mando ux ôtros utilisators',
'tog-diffonly' => 'Pas montrar lo contegnu de les pâges desot les difs',
'tog-showhiddencats' => 'Montrar les catègories cachiêes',
-'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros des lims',
'tog-norollbackdiff' => 'Pas fâre vêre la dif pendent na rèvocacion',
'tog-useeditwarning' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
'revdelete-show-file-submit' => 'Ouè',
'revdelete-selected' => "'''{{PLURAL:$2|Vèrsion chouèsia|Vèrsions chouèsies}} de [[:$1]] :'''",
'logdelete-selected' => "'''{{PLURAL:$1|Èvènement du jornal chouèsi|Èvènements du jornal chouèsis}} :'''",
-'revdelete-text' => "'''Les vèrsions et los èvènements suprimâ(ye)s aparètront adés dedens l’historico de la pâge et pués sur los jornals, mas quârques parties de lor contegnu seront inaccèssibles u publico.'''
-Los ôtros administrators de {{SITENAME}} porront tojorn arrevar u contegnu cachiê et lo refâre per cela mém’entèrface, du muens que des rèstriccions de ples seyont pas dèfenies.",
'revdelete-confirm' => 'Se vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].',
'revdelete-suppress-text' => "La rèprèssion dêt étre empleyêe '''ren que''' dens cetos câs :
* Enformacions que pôvont étre difamatouères
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Ütjsoocht werjuun|Ütjsoocht werjuunen}} faan [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Ütjsoocht logbukiindrach|Ütjsoocht logbukiindracher}}:'''",
-'revdelete-text' => "'''Stregen werjuunen an aktjuunen bliiw uun di ferluup an uun a logbuken, man det koon ei arken efterlees.'''
-
-Ööder administratooren üüb {{SITENAME}} kön oober üüb di ferbürgen ferluup tugrip an tu nuad en ual werjuun weder iinstel.",
'revdelete-confirm' => 'Ferseekre noch ans, dat dü det würelk du wel, dat dü witjst, wat dü dääst, an dat det mä a [[{{MediaWiki:Policy-url}}|bestemangen]] auerian stemet.',
'revdelete-suppress-text' => "Det skul '''bluas''' onertrakt wurd bi:
* Persöönelk informatsjuunen, diar näämen wat uungung
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''Spesifisearre {{PLURAL:$2|ferzje|ferzjes}} fan [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|keazen lochboekregel|keazen lochboekregels}}:'''",
-'revdelete-text' => "'''Fuorthelle bewurkings binne sichtber yn 'e skiednis, mar de ynhâld is net langer publyk tagonklik.'''
-Oare behearders fan {{SITENAME}} kinne de ferburgen ynhâld benaderje en it fuortheljen ûngedien meitsje mei help fan dit skerm, of der moatte oanfoljende beheinings jilde dy't ynsteld binne troch de systeembehearder.",
'revdelete-legend' => 'Sichtberensbeheinings ynstelle.',
'revdelete-hide-text' => 'De bewurke tekst ferskûlje',
'revdelete-hide-image' => 'Triem ynhâld ferskûlje',
'revdelete-nooldid-text' => '倷冇话个只操作𠮶目标修改。',
'revdelete-selected' => "'''拣[[:$1]]𠮶$2回修订:'''",
'logdelete-selected' => "'''拣'''$1'''𠮶$2只日志事件:'''",
-'revdelete-text' => "'''删吥𠮶改动哈会到页面历史里头显示, 但公众浏览伓正佢𠮶内容。'''
-
-个站别𠮶管理员哈系能眵吖弆到𠮶内容,同到通过同佢一样𠮶界面恢复删除,除非设正嘞附加𠮶限制。",
'revdelete-legend' => '设置可见性𠮶限制',
'revdelete-hide-text' => '弆到修改内容',
'revdelete-hide-image' => '弆到档内容',
'revdelete-nooldid-text' => '倷冇话箇隻操作嗰目标修改。',
'revdelete-selected' => "'''揀[[:$1]]嗰$2回修訂:'''",
'logdelete-selected' => "'''揀'''$1'''嗰$2隻日誌事件:'''",
-'revdelete-text' => "'''刪吥嗰改動哈會到頁面歷史裡頭顯示, 但公眾瀏覽伓正佢嗰內容。'''
-
-箇站別嗰管理員哈係能眵吖弆到嗰內容,同到通過同佢一樣嗰界面恢復刪除,除非設正嘞附加嗰限制。",
'revdelete-legend' => '設置可見性嗰限制',
'revdelete-hide-text' => '弆到修改內容',
'revdelete-hide-image' => '弆到檔內容',
'revdelete-show-file-submit' => 'Tha',
'revdelete-selected' => "'''{{PLURAL:$2|Lèirmheas|Lèirmheasan}} de [[:$1]] a thagh thu:'''",
'logdelete-selected' => "'''{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:'''",
-'revdelete-text' => "'''Nochdaidh lèirmheasan is tachartasan fhathast ann an eachdraidh 's logaichean na duilleige ach bidh cuid a shusbaint ann nach fhaic am poball.'''
-Gheibh rianairean eile air {{SITENAME}} greim fhathast air an t-susbaint fhalaichte agus gabhaidh an sguabadh às a neo-dhèanamh a-rithist san aon eadar-aghaidh mur an deach cuingeachaidhean eile a shuidheachadh.",
'revdelete-confirm' => "Dearbh gu bheil thu airson seo a dhèanamh, gu bheil thu a' tuigsinn na thachras ri linn agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
'revdelete-suppress-text' => "Cha bu chòir dhut mùchadh a chleachdadh '''ach''' ann an suidheachaidhean mar seo:
* Fiosrachadh a dh'fhaodadh a bhith dìteachail
'tog-ccmeonemails' => 'Enviádeme ao meu enderezo unha copia das mensaxes de correo electrónico que envíe a outros usuarios',
'tog-diffonly' => 'Non mostrar o contido da páxina debaixo das diferenzas entre edicións',
'tog-showhiddencats' => 'Mostrar as categorías ocultas',
-'tog-noconvertlink' => 'Desactivar a conversión dos títulos de ligazón',
'tog-norollbackdiff' => 'Omitir as diferenzas despois de levar a cabo unha reversión de edicións',
'tog-useeditwarning' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
'tog-prefershttps' => 'Utilizar unha conexión segura sempre que acceda ao sistema',
'suspicious-userlogout' => 'Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.',
'createacct-another-realname-tip' => 'O nome real é opcional.
Se escolle dalo utilizarase para atribuír ao usuario o seu traballo.',
-'pt-login' => 'Iniciar sesión',
+'pt-login' => 'Acceder ao sistema',
'pt-createaccount' => 'Crear unha conta',
-'pt-userlogout' => 'Pechar sesión',
+'pt-userlogout' => 'Saír',
# Email sending
'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP.',
'resetpass-temp-password' => 'Contrasinal temporal:',
'resetpass-abort-generic' => 'Unha extensión cancelou a modificación do contrasinal.',
'resetpass-expired' => 'O seu contrasinal caducou. Defina un novo contrasinal para acceder.',
-'resetpass-expired-soft' => 'O seu contrasinal caducou e debe restablecelo. Escolla un novo contrasinal ou prema «Cancelar» para restablecelo máis tarde.',
+'resetpass-expired-soft' => 'O seu contrasinal caducou e debe restablecelo. Escolla un novo contrasinal ou prema en "{{int:resetpass-submit-cancel}}" para restablecelo máis tarde.',
# Special:PasswordReset
'passwordreset' => 'Restablecer o contrasinal',
'page_last' => 'derradeira',
'histlegend' => "Selección de diferenzas: Marque as versións que queira comparar e prema no botón ao final.<br />
Lenda: '''({{int:cur}})''' = diferenza coa versión actual, '''({{int:last}})''' = diferenza coa versión precedente, '''{{int:minoreditletter}}''' = edición pequena.",
-'history-fieldset-title' => 'Navegar polo historial',
+'history-fieldset-title' => 'Explorar o historial',
'history-show-deleted' => 'Borrados soamente',
'histfirst' => 'as máis antigas',
'histlast' => 'as máis novas',
'revdelete-show-file-submit' => 'Si',
'revdelete-selected' => "'''{{PLURAL:\$2|Revisión seleccionada|Revisións seleccionadas}} de \"[[:\$1]]\":'''",
'logdelete-selected' => "'''{{PLURAL:$1|Rexistro de evento seleccionado|Rexistro de eventos seleccionados}}:'''",
-'revdelete-text' => "'''As revisións borradas seguirán aparecendo no historial da páxina e nos rexistros, pero partes do seu contido serán inaccesibles de cara ao público.'''
-Os demais administradores de {{SITENAME}} poderán acceder ao contido agochado e poderán restaurar a páxina de novo a través desta mesma interface, a non ser que se estableza algunha restrición adicional.",
'revdelete-confirm' => 'Por favor, confirme que quere levar a cabo esta acción, que comprende as consecuencias e que o fai de acordo [[{{MediaWiki:Policy-url}}|coas políticas]].',
'revdelete-suppress-text' => "A eliminación '''unicamente''' debería utilizarse nos seguintes casos:
* Información potencialmente difamatoria
'recentchanges-legend-heading' => "'''Lenda:'''",
'recentchanges-legend-newpage' => '(véxase tamén a [[Special:NewPages|lista de páxinas novas]])',
'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "A continuación móstranse os cambios feitos desde o '''$3''' ás '''$4''' (móstranse '''$1''' como máximo).",
-'rclistfrom' => 'Mostrar os cambios novos desde o $1',
+'rcnotefrom' => 'A continuación móstranse os cambios feitos desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).',
+'rclistfrom' => 'Mostrar os cambios novos desde o $3 ás $2',
'rcshowhideminor' => '$1 as edicións pequenas',
'rcshowhideminor-show' => 'Mostrar',
'rcshowhideminor-hide' => 'Agochar',
'uploaddisabledtext' => 'A carga de ficheiros está desactivada.',
'php-uploaddisabledtext' => 'As cargas de ficheiros PHP están desactivadas. Por favor, comprobe a característica file_uploads.',
'uploadscripted' => 'Este ficheiro contén código HTML ou script que pode producir erros ao ser interpretado polo navegador.',
-'uploadscriptednamespace' => "Este ficheiro SVG contén un espazo de nome non permitido '$1'",
+'uploadscriptednamespace' => 'Este ficheiro SVG contén o espazo de nomes non permitido "$1"',
'uploadinvalidxml' => 'Non se puido analizar o XML do ficheiro cargado.',
'uploadvirus' => 'O ficheiro contén un virus! Detalles: $1',
'uploadjava' => 'O ficheiro é un ZIP que contén un ficheiro .class de Java.
'deadendpagestext' => 'Estas páxinas non ligan con ningunha outra páxina de {{SITENAME}}.',
'protectedpages' => 'Páxinas protexidas',
'protectedpages-indef' => 'Só as proteccións indefinidas',
-'protectedpages-summary' => 'Esta páxina lista páxinas existentes protexidas. Para obter unha lista de páxinas cuxa creación está prohibida, vexa [[{{#special:ProtectedTitles}}]].',
+'protectedpages-summary' => 'Esta páxina lista as páxinas existentes que están protexidas actualmente. Para obter unha lista de páxinas cuxa creación está prohibida, consulte [[{{#special:ProtectedTitles}}]].',
'protectedpages-cascade' => 'Só as proteccións en serie',
'protectedpages-noredirect' => 'Agochar as redireccións',
'protectedpagesempty' => 'Actualmente non hai ningunha páxina protexida con eses parámetros.',
'protectedpages-unknown-timestamp' => 'Descoñecido',
'protectedpages-unknown-performer' => 'Usuario descoñecido',
'protectedtitles' => 'Títulos protexidos',
-'protectedtitles-summary' => 'Esta páxina lista títulos que están prohibidos para páxinas novas. Para obter unha lista de páxinas existentes protexidas, vexa [[{{#special:ProtectedPages}}]].',
+'protectedtitles-summary' => 'Esta páxina lista os títulos que están protexidos actualmente fronte á creación. Para obter unha lista de páxinas existentes protexidas, consulte [[{{#special:ProtectedPages}}]].',
'protectedtitlesempty' => 'Actualmente non hai ningún título protexido con eses parámetros.',
'listusers' => 'Lista de usuarios',
'listusers-editsonly' => 'Mostrar só os usuarios con edicións',
'delete-warning-toobig' => 'Esta páxina conta cun historial de edicións longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.
Ao eliminala pódense provocar problemas de funcionamento nas operacións da base de datos de {{SITENAME}};
proceda con coidado.',
-'deleting-backlinks-warning' => "'''Atención:''' Outras páxinas conteñen unha ligazón ou unha transclusión da páxina que está a piques de borrar.",
+'deleting-backlinks-warning' => "'''Atención:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páxinas]] conteñen unha ligazón ou unha transclusión da páxina que está a piques de borrar.",
# Rollback
'rollback' => 'Reverter as edicións',
'sp-contributions-blocked-notice-anon' => 'Este enderezo IP está bloqueado.
Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:',
'sp-contributions-search' => 'Busca de contribucións',
+'sp-contributions-suppresslog' => 'contribucións borradas do usuario',
'sp-contributions-username' => 'Enderezo IP ou nome de usuario:',
'sp-contributions-toponly' => 'Mostrar só as últimas revisións',
-'sp-contributions-newonly' => 'Mostrar só edicións que son creacións de páxinas',
+'sp-contributions-newonly' => 'Mostrar só as edicións que crearon páxinas',
'sp-contributions-submit' => 'Procurar',
# What links here
'thumbnail_image-type' => 'Tipo de imaxe non soportado',
'thumbnail_gd-library' => 'Configuración da libraría GD incompleta: Falta a función $1',
'thumbnail_image-missing' => 'Parece que falta o ficheiro: $1',
-'thumbnail_image-failure-limit' => 'Producíronse demasiados ($1 ou máis) intentos fallidos recentes de renderizar esta miniatura. Vólvao intentar máis tarde.',
+'thumbnail_image-failure-limit' => 'Producíronse demasiados ($1 ou máis) intentos fallidos recentes de renderizar esta miniatura. Inténteo de novo máis tarde.',
# Special:Import
'import' => 'Importar páxinas',
'version-ext-colheader-credits' => 'Autores',
'version-license-title' => 'Licenza para $1',
'version-license-not-found' => 'Non se atopou información detallada de licenza para esta extensión.',
-'version-credits-title' => 'Receñecemento para $1',
+'version-credits-title' => 'Recoñecemento para $1',
'version-credits-not-found' => 'Non se atopou información detallada de recoñecemento para esta extensión.',
'version-poweredby-credits' => "Este wiki está desenvolvido por '''[https://www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autoría © 2001-$1 $2.",
'version-poweredby-others' => 'outros',
'revdelete-show-file-submit' => 'Ναί',
'revdelete-selected' => "'''{{PLURAL:$2|Ἐπειλεγμένη ἀναθεώρησις|Ἐπειλεγμέναι ἀναθεωρήσεις}} τοῦ [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Ἐπειλεγμένον γεγονὸς καταλόγου|Ἐπειλεγμένα γεγονὀτα καταλόγου}}:'''",
-'revdelete-text' => "'''Αἱ διαγεγραμμέναι ἀναθεωρήσεις καὶ τὰ γεγονότα ἐμφανίσονται ἐν τῷ ἱστορικῷ τῆς δέλτου καὶ τοῖς καταλόγοις, ὰλλὰ μέρη τοῦ περιεχομένου σφῶν ἔσονται δημοσίως ἀπροσπέλαστα.'''
-Ἐξέσται δὲ ἑτέροις ἐπιτρόποις ἐν τῷ ἱστοτόπῳ {{SITENAME}} προσπελάζειν τῷ κρυμμένῳ περιεχομένῳ καὶ ἐπανιστάναι τόδε δία αὐτῆς τῆς διεπαφῆς ἐὰν μὴ θῶνται πρόσθετοι περιορισμοί τινές.",
'revdelete-legend' => 'Θέτειν περιορισμοῦς ὁρατότητος',
'revdelete-hide-text' => 'Κρύπτειν κείμενον ἀναθεωρήσεως',
'revdelete-hide-image' => 'Κρύπτειν περιεχόμενον ἀρχείου',
'tog-ccmeonemails' => 'Schick mr Kopie vo de E-Mails, won i andere schick.',
'tog-diffonly' => 'Numme Versionsunterschiid aazeige, ohni d Syte',
'tog-showhiddencats' => 'Zeig di versteckte Kategorie',
-'tog-noconvertlink' => 'Konvertierig vum Titel deaktiviere',
'tog-norollbackdiff' => 'Unterschid noch em Zrucksetze unterdrucke',
'tog-useeditwarning' => 'Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin',
'tog-prefershttps' => 'Wänn aagmäldet, alliwyl e sicheri Verbindig bruuche',
'revdelete-show-file-submit' => 'Jo',
'revdelete-selected' => "'''{{PLURAL:$2|Usgwehlti Version|Usgwehlti Versione}} vu [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Usgwehlte Logbuechyytrag|Usgwehlti Logbuechyytreg}}:'''",
-'revdelete-text' => "'''Dr Inhalt oder anderi Bstandteil vu gleschte Versione chenne nimi aagluegt wäre, si erschyyne aber alno as Yytreg in dr Versiongschicht.'''
-{{SITENAME}}-Ammanne chenne dr Inhalt, wu glescht isch, oder di andre gleschte Bstandteil alno aaluege un au widerherstelle, user s isch feschtgleit, ass d Zuegangsbschränkige au fir Ammanne gälte.",
'revdelete-confirm' => 'Bitte tue bstetige, ass Du vor hesch, des z mache, d Konsequänze drus verstohsch un s machsch in Inbereinstimmig mit dr [[{{MediaWiki:Policy-url}}|Richtlinie]].',
'revdelete-suppress-text' => "Unterdruckige sotte '''nume''' in däne Fäll bruucht wäre:
* Nit aabrochti Informatione
'tog-ccmeonemails' => 'મે અન્યોને મોકલેલા ઇમેલની નકલ મને મોકલો',
'tog-diffonly' => 'તફાવતની નીચે લેખ ન બતાવશો',
'tog-showhiddencats' => 'છુપી શ્રેણીઓ દર્શાવો',
-'tog-noconvertlink' => 'Disable link title conversion',
'tog-norollbackdiff' => 'રોલબેક કર્યા પછીના તફાવતો છુપાવો',
'tog-useeditwarning' => 'સાચવ્યા વગર જો હું પૃષ્ઠ છોડું તો મને ચેતવણી આપો',
'tog-prefershttps' => 'સભ્યનામથી પ્રવેશ કર્યો હોય ત્યારે સુરક્ષિત જોડાણ (https) જ વાપરો',
'postcomment' => 'નવો વિભાગ',
'articlepage' => 'લેખનું પાનું જુઓ',
'talk' => 'ચર્ચા',
-'views' => 'દેખાવ',
+'views' => 'દેખાવો',
'toolbox' => 'સાધનો',
'userpage' => 'સભ્યનું પાનું જુઓ',
'projectpage' => 'પ્રકલ્પનું પાનું જુઓ',
'viewsourceold' => 'સ્રોત જુઓ',
'editlink' => 'ફેરફાર',
'viewsourcelink' => 'સ્રોત જુઓ',
-'editsectionhint' => 'ફà«\87રફાર àª\95રà«\8b - પરિàª\9aà«\8dàª\9bà«\87દ: $1',
+'editsectionhint' => 'પરિàª\9aà«\8dàª\9bà«\87દ ફà«\87રફાર àª\95રà«\8b: $1',
'toc' => 'અનુક્રમણિકા',
'showtoc' => 'બતાવો',
'hidetoc' => 'છુપાવો',
'sort-ascending' => 'ચડતા ક્રમમાં ગોઠવો',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'લà«\87àª\96',
+'nstab-main' => 'પાનà«\81àª\82',
'nstab-user' => 'સભ્ય પાનું',
'nstab-media' => 'મિડીયા પાનું',
'nstab-special' => 'ખાસ પાનું',
'revdelete-show-file-submit' => 'હા',
'revdelete-selected' => "''' [[:$1]] ના {{PLURAL:$2|પસંદ કરેલ ફેરફાર |પસંદ કરેલ ફેરફારો}}: '''",
'logdelete-selected' => "'''{{PLURAL:$1|પસંદગી કરેલ લોગ ઘટના | પસંદગી કરેલ લોગ ઘટનાઓ }}:'''",
-'revdelete-text' => "''' રદ્દ કરાયેલ ફેરફારો અને ઘટનાઓ પાનાના ઈતિહાસ અને લોગમાં દેખાશે , પણ તેની અંદરની માહિતી જન સમુદાયથી અદ્રશ્ય રહેશે. '''
-{{SITENAME}} પરના અન્ય પ્રબંધકો આ અદ્રશ્ય માહિતે જોઇ શકશે અને તેને પુનઃ જીવિત કરી શકશે સિવાય કે તેના પર વધારાની પાબંદી ન મુકાઇ હોય.",
'revdelete-confirm' => 'કૃપયા પુષ્ટિ કરો કે તમે શું કરી રહ્યા છો તેની અને તેના પરિણામોની તમને જાણ છે અને તમે આ બધું [[{{MediaWiki:Policy-url}}|the policy]] અ6તર્ગત કરી રહ્યાં છો.',
'revdelete-suppress-text' => "બળ પૂર્વક છુપાવવું \"માત્ર\" આજ સંજોગોમાં કરી શકાશે:
* સંભવતઃ ભયાજનક માહિતી
'shown-title' => 'પ્રતિ પાને $1 {{PLURAL:$1|પરિણામ|પરિણામો}} બતાવો',
'viewprevnext' => 'જુઓ: ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "''' આ વિકિ પર \"[[:\$1]]\" નામે પાનું પહેલેથી અસ્તિત્વમાં છે.'''",
-'searchmenu-new' => "'''આ વિકિ પર \"[[:\$1]]\" નામે પાનું બનાવો!'''",
+'searchmenu-new' => '<strong>આ વિકિ પર "[[:$1]]" પાનું બનાવો!</strong> {{PLURAL:$2|0=|તમારી શોધમાં મળેલ પાનું પણ જુઓ.|તમારી શોધમાં મળેલ પરિણામો પણ જુઓ.}}',
'searchprofile-articles' => 'લેખનું પાનું',
'searchprofile-project' => 'મદદ અને યોજના પાનું',
'searchprofile-images' => 'દ્રશ્ય શ્રાવ્ય માધ્યમ',
'searchprofile-images-tooltip' => 'ફાઇલ શોધો',
'searchprofile-everything-tooltip' => 'બધે જ શોધો (ચર્ચાનાં પાના સહિત)',
'searchprofile-advanced-tooltip' => 'સ્થાનીય નામસ્થળોમાં શોધો:',
-'search-result-size' => '$1 ({{PLURAL:$2|1 શબ્દ|$2 શબ્દો}})',
+'search-result-size' => '$1 ({{PLURAL:$2|૧ શબ્દ|$2 શબ્દો}})',
'search-result-category-size' => '{{PLURAL:$1|1 સભ્ય|$1 સભ્યો}} ({{PLURAL:$2|1 ઉપ શ્રેણી|$2 ઉપ શ્રેણીઓ}}, {{PLURAL:$3|1 ફાઇલ|$3 ફાઇલો}})',
'search-result-score' => 'પ્રસ્તુતિ: $1%',
'search-redirect' => '(અન્યત્ર પ્રસ્થાન $1)',
'search-section' => '(વિભાગ $1)',
'search-suggest' => 'શું તમે $1 કહેવા માંગો છો?',
'search-interwiki-caption' => 'બંધુ પ્રકલ્પ',
-'search-interwiki-default' => '$1 પરીણામો:',
+'search-interwiki-default' => '$1 માàª\82થà«\80 પરà«\80ણામà«\8b:',
'search-interwiki-more' => '(વધુ)',
'search-relatedarticle' => 'શોધ સંબંધિત',
'searcheverything-enable' => 'નામસ્થળોમાં શોધો:',
'recentchanges-label-unpatrolled' => 'આ ફેરફાર હજી ચકાસાયો નથી',
'recentchanges-label-plusminus' => 'પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.',
'recentchanges-legend-newpage' => '([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)',
-'rcnotefrom' => "નીચે '''$2'''થી થયેલાં '''$1''' ફેરફારો દર્શાવ્યાં છે.",
+'rcnotefrom' => 'નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).',
'rclistfrom' => '$1 બાદ થયેલા નવા ફેરફારો બતાવો',
'rcshowhideminor' => 'નાના ફેરફારો $1',
'rcshowhideminor-show' => 'બતાવો',
'change-blocklink' => 'પ્રતિબંધમાં ફેરફાર કરો',
'contribslink' => 'યોગદાન',
'emaillink' => 'ઈ-મેલ મોકલો',
-'autoblocker' => 'તમારા પર સ્વયંચાલિત રીતે રોક લગાવાઇ છે કેમકે તમારો IP હાલમાં "[[User:$1|$1]]" સભ્ય દ્વારા વપરાયો છે.
-તેનું કારણ આ છે : "$2"',
+'autoblocker' => 'તમારા પર સ્વયંચાલિત રીતે રોક લગાવાઇ છે કેમ કે તમારું IP સરનામું હાલમાં "[[User:$1|$1]]" સભ્ય દ્વારા વપરાયેલ છે.
+
+$1નાં પ્રતિબંધનું કારણ "$2" છે',
'blocklogpage' => 'પ્રતિબંધ સૂચિ',
'blocklog-showlog' => 'આ સભ્ય પર પહેલા રોક લગાવાઈ છે.
રોકા લગાવાયેલા સભ્યોની યાદિ આ મુજબ છે',
'range_block_disabled' => 'પ્રબંધકના સમૂહીક રોક લગાડવાનો અધિકાર નીષ્ક્રિય',
'ipb_expiry_invalid' => 'સમાપ્તિનો સમય માન્ય નથી.',
'ipb_expiry_temp' => 'સંતાડેલા સભ્યનામ પ્રતિબંધનો કાયમી જ હોવા જોઇએ.',
-'ipb_hide_invalid' => 'àª\86 પાનાનà«\87 àª\9bà«\81પાવવà«\8b સàª\82àªàªµ નથà«\80 તà«\87માàª\82 àª\98ણા બધાàª\82 ફà«\87રફારà«\8b àª\9bà«\87',
+'ipb_hide_invalid' => 'àª\86 àª\96ાતાàª\82નà«\87 àª\9bà«\81પાવવાàª\82 àª\85સàª\95à«\8dષમ; તà«\87માàª\82 {{PLURAL:$1|àª\8fàª\95 ફà«\87રફાર|$1 ફà«\87રફારà«\8b}} àª\9bà«\87.',
'ipb_already_blocked' => ' "$1" પહેલેથી પ્રતિબંધિત છે',
'ipb-needreblock' => '$1 પહેલેથી પ્રતિબંધિત છે.
તમારે આ સેટીંગ બદલવી છે?',
'allmessages-prefix' => 'ઉપસર્ગ દ્વારા અલગ તારવો',
'allmessages-language' => 'ભાષા:',
'allmessages-filter-submit' => 'કરો',
+'allmessages-filter-translate' => 'ભાષાંતર કરો',
# Thumbnails
'thumbnail-more' => 'વિસ્તૃત કરો',
'tooltip-pt-preferences' => 'તમારી પસંદગીઓ',
'tooltip-pt-watchlist' => 'તમે દેખરેખ રાખી રહ્યાં હોવ તેવા પાનાઓની યાદી',
'tooltip-pt-mycontris' => 'તમારા યોગદાનની યાદી',
-'tooltip-pt-login' => 'àª\86પનà«\87 લà«\8bàª\97 àª\87ન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી',
+'tooltip-pt-login' => 'àª\86પનà«\87 પà«\8dરવà«\87શ કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી',
'tooltip-pt-logout' => 'બહાર નીકળો/લૉગ આઉટ કરો',
'tooltip-ca-talk' => 'અનુક્રમણિકાનાં પાના વિષે ચર્ચા',
'tooltip-ca-edit' => "આપ આ પાનામાં ફેરફાર કરી શકો છો, કાર્ય સુરક્ષિત કરતાં પહેલાં 'ઝલક' બટન ઉપર ક્લિક કરીને જોઇ લેશો",
'tooltip-ca-unwatch' => 'આ પાનું તમારી ધ્યાનસૂચીમાંથી કાઢી નાખો',
'tooltip-search' => '{{SITENAME}} શોધો',
'tooltip-search-go' => 'આ ચોક્કસ જોડણી વાળુ પાનુ જો અસ્તિત્વમાં હોય તો તેના પર જાવ',
-'tooltip-search-fulltext' => 'àª\86 લàª\96ાણ વાળા પાનાઓ શોધો',
-'tooltip-p-logo' => 'મુખપૃષ્ઠ',
+'tooltip-search-fulltext' => 'àª\86 લàª\96ાણ ધરાવતાàª\82 પાનાઓ શોધો',
+'tooltip-p-logo' => 'મુખપૃષ્ઠની મુલાકાત લો',
'tooltip-n-mainpage' => 'મુખપૃષ્ઠ પર જાઓ',
'tooltip-n-mainpage-description' => 'મુખ્ય પાના પર જાઓ',
'tooltip-n-portal' => 'પરિયોજના વિષે, આપ શું કરી શકો અને વસ્તુઓ ક્યાં શોધશો',
'tooltip-t-contributions' => 'આ સભ્યનાં યોગદાનોની યાદી જુઓ',
'tooltip-t-emailuser' => 'આ સભ્યને ઇ-મેલ મોકલો',
'tooltip-t-upload' => 'ફાઇલ ચડાવો',
-'tooltip-t-specialpages' => 'બધા àª\96ાસ પાનાàª\93નà«\80 સà«\82àª\9aિ',
+'tooltip-t-specialpages' => 'બધા àª\96ાસ પાનાàª\82àª\93નà«\80 યાદà«\80',
'tooltip-t-print' => 'આ પાનાની છાપવા માટેની આવૃત્તિ',
'tooltip-t-permalink' => 'પાનાનાં આ પુનરાવર્તનની સ્થાયી કડી',
'tooltip-ca-nstab-main' => 'સૂચિ વાળું પાનુ જુઓ',
'fileduplicatesearch-noresults' => ' "$1" નામ ધરાવતી કોઇ ફાઇલ ન મળી',
# Special:SpecialPages
-'specialpages' => 'ખાસ પાનાં',
+'specialpages' => 'ખાસ પાનાંઓ',
'specialpages-note' => '* નિયમિત ખાસ પાનાં.
* <span class="mw-specialpagerestricted">પ્રતિબંધિત ખાસ પાનાં.</span>',
'specialpages-group-maintenance' => 'સમારકામ અહેવાલ',
'revdelete-show-file-submit' => '係',
'revdelete-selected' => "'''選取[[:$1]]嘅$2次修訂:'''",
'logdelete-selected' => "'''Chhí-chhṳ '''$1''' ke $2-ke ngit-ki hong-muk:'''",
-'revdelete-text' => "'''Chhù-thet ke siû-thin yìn-yèn chiông-voi hién-sṳ chhai vùn-chông li̍t-sṳ́ chûng, than vùn-sṳ nui-yùng yí-kîn put-nèn pûn chung-ngìn fóng-mun.''' Chhai chhṳ́ miong-chham ke khì-thâ kón-lî-yèn chiông chhòi-nèn fóng-mun yún-chhòng ke nui-yùng pin theu-ko siông-thùng ke kie-mien fî-fu̍k chhù-hi, chhù-fî miong-chham kûng-chok-chá chin-hàng han-chṳ.",
'revdelete-legend' => 'Sat-thin siû-thin han-chṳ:',
'revdelete-hide-text' => '隱藏修訂版本文字',
'revdelete-hide-image' => '隱藏文件內容',
$messages = array(
# User preference toggles
'tog-underline' => 'Kahalalo i nā loulou:',
-'tog-hideminor' => 'E hoʻohūnā i nā ho‘opololei iki ma nā loli hou',
-'tog-hidepatrolled' => 'E hoʻohūnā i nā loli kiaʻi kaʻahele i loko o nā lolina hanawale',
+'tog-hideminor' => 'E hoʻohūnā i nā ho‘ololi iki ma nā loli hou',
+'tog-hidepatrolled' => 'E hoʻohūnā i nā loli kiaʻi kaʻahele ma nā loli hou',
'tog-newpageshidepatrolled' => 'E hoʻohūnā i nā ʻaoʻao kiaʻi kaʻahele mai ka papahelu ʻaoʻao hou',
-'tog-extendwatchlist' => 'E hoʻākea i ka papa nānā pono no ka hōʻike ʻana i nā loli apau, ʻaʻole nā mea hanawale wale nō',
-'tog-usenewrc' => 'Nā lolina hui mao ka ʻaoʻao ma loko o lolina hanawale a me ka papa nānā pono',
+'tog-extendwatchlist' => 'E hoʻākea i ka papakiaʻi no ka hōʻike ʻana i nā loli apau, ʻaʻole nā mea hanawale wale nō',
+'tog-usenewrc' => 'Nā loli hui mao ka ʻaoʻao ma loko o ka loli hou a me ka papakiaʻi',
'tog-numberheadings' => 'E hikahelu i nā poʻo',
'tog-showtoolbar' => 'E hōʻike i ka pahu hāmeʻa hoʻololi',
'tog-editondblclick' => 'E ho‘ololi i nā ‘ao‘ao me ke kōmi pālua',
'tog-editsectiononrightclick' => 'E hoʻokuʻu i ka hoʻololi mahele mao ka paʻina ʻākau ma nā poʻoinoa māhele',
'tog-rememberpassword' => 'E hoʻomanaʻo iaʻu ma kēia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lā|mau lā}})',
-'tog-watchcreations' => 'E ho‘ohui i nā ‘ao‘ao aʻu i hana ai a me nā faila aʻu i hoʻouka ai i ka‘u papa nānā pono',
-'tog-watchdefault' => 'E ho‘ohui i nā ‘ao‘ao a me nā faila aʻu e hoʻololi ai i ka‘u papa nānā pono',
-'tog-watchmoves' => 'E ho‘ohui i nā ‘ao‘ao a me nā faila aʻu e ne‘e ai i ka‘u papa nānā pono',
-'tog-watchdeletion' => 'E ho‘ohui i nā ‘ao‘ao a me nā faila aʻu e holoi ai i ka‘u papa nānā pono',
-'tog-minordefault' => 'E kaha i nā loli apau i ka loli liʻi mao ka paʻamau',
+'tog-watchcreations' => 'E ho‘ohui i nā ‘ao‘ao aʻu i hana ai a me nā waihona aʻu i hoʻouka ai i ka‘u papakiaʻi',
+'tog-watchdefault' => 'E ho‘ohui i nā ‘ao‘ao a me nā waihona aʻu e hoʻololi ai i ka‘u papakiaʻi',
+'tog-watchmoves' => 'E ho‘ohui i nā ‘ao‘ao a me nā waihona aʻu e ne‘e ai i ka‘u papakiaʻi',
+'tog-watchdeletion' => 'E ho‘ohui i nā ‘ao‘ao a me nā waihona aʻu e holoi ai i ka‘u papakiaʻi',
+'tog-minordefault' => 'E kaha i nā loli apau i ka loli iki mao ka paʻamau',
'tog-previewontop' => 'E hō‘ike i ka nāmua mamua o ka pahu hoʻololi',
'tog-previewonfirst' => 'E hō‘ike i ka nāmua ma ka ho‘ololi mua',
-'tog-enotifwatchlistpages' => 'E leka uila iaʻu i ka loli ʻana o kekahi faila aiʻole kekahi ʻaoʻao ma kaʻu papa nānā pono',
-'tog-enotifusertalkpages' => 'E leka uila iaʻu i ka loli ʻana o kaʻu ʻaoʻao kūkākūkā',
-'tog-enotifminoredits' => 'E leka uila iaʻu no nā loli liʻi o nā ʻaoʻao a me nā faila',
-'tog-enotifrevealaddr' => 'E hō‘ike i ko‘u leka uila ma nā leka uila hō‘ike',
+'tog-enotifwatchlistpages' => 'E leka uila iaʻu i ka loli ʻana o kekahi waihona aiʻole kekahi ʻaoʻao ma kaʻu papakiaʻi',
+'tog-enotifusertalkpages' => 'E leka uila iaʻu i ka loli ʻana o kaʻu ʻaoʻao walaʻau',
+'tog-enotifminoredits' => 'E leka uila iaʻu no nā loli iki o nā ʻaoʻao a me nā waihona',
+'tog-enotifrevealaddr' => 'E hō‘ike i kaʻu wahinoho lekauila ma nā lekauila notikala',
'tog-shownumberswatching' => 'E hō‘ike i ka helu o nā mea ho‘ohana e nānā nei',
'tog-oldsig' => 'Pūlima hananei:',
'tog-fancysig' => 'E hana i ka pūlima me he wikitext (me ʻole i ka loulou hanawale)',
'tog-uselivepreview' => 'E hana i ka nāmua ʻānō (hoʻokolohua)',
'tog-forceeditsummary' => 'E kono iaʻu i ka hoʻokomo ʻana i kekahi hōʻuluʻulu manaʻo hoʻololi hou',
-'tog-watchlisthideown' => 'E hoʻohūnā i ko‘u mau ho‘ololi mai ka papa nānā pono',
-'tog-watchlisthidebots' => 'E hoʻohūnā i nā loli o nā lopako mai ka papa nānā pono',
-'tog-watchlisthideminor' => 'E hoʻohūnā i nā loli iki mai ka papa nānā pono',
-'tog-watchlisthideliu' => 'E hoʻohūnā i nā loli e nā mea hoʻohana ʻeʻeia mai ka papa nānā pono',
-'tog-watchlisthideanons' => 'E hoʻohūnā i nā loli e nā mea hoʻohana inoaʻole mai ka papa nānā pono',
-'tog-watchlisthidepatrolled' => 'E hoʻohūnā i nā loli kiaʻi kaʻahele mai ka papa nānā pono',
-'tog-ccmeonemails' => 'E hoʻouna mai i nā kope o nā leka uila aʻu i hāʻawi ai i kekahi mau mea hoʻohana.',
-'tog-diffonly' => 'Mai hōʻike i nā mealoko ʻaoʻao ma lolo o ka pōlamu difē',
-'tog-showhiddencats' => 'E hōʻike i nā māhele huna',
-'tog-norollbackdiff' => 'E wehe i ka pōlamu difē ma hope o ka hana hoʻimua',
-'tog-useeditwarning' => 'E aʻo mai iaʻu i kaʻu haʻalele ʻana i ka ʻaoʻao hoʻololi inā loaʻa i nā loli mālamaia ʻole',
+'tog-watchlisthideown' => 'E hoʻohūnā i ko‘u mau ho‘ololi mai ka papakiaʻi',
+'tog-watchlisthidebots' => 'E hoʻohūnā i nā loli o nā lopako mai ka papakiaʻi',
+'tog-watchlisthideminor' => 'E hoʻohūnā i nā loli iki mai ka papakiaʻi',
+'tog-watchlisthideliu' => 'E hoʻohūnā i nā loli e nā mea hoʻohana ʻeʻeia mai ka papakiaʻi',
+'tog-watchlisthideanons' => 'E hoʻohūnā i nā loli e nā mea hoʻohana inoaʻole mai ka papakiaʻi',
+'tog-watchlisthidepatrolled' => 'E hoʻohūnā i nā loli kiaʻi kaʻahele mai ka papakiaʻi',
+'tog-ccmeonemails' => 'E hoʻouna mai i nā kope o nā lekauila aʻu i hāʻawi ai i kekahi mau mea hoʻohana ʻē aʻe.',
+'tog-diffonly' => 'Mai hōʻike i nā mealoko ʻaoʻao ma lalo o ka ʻokoʻa',
+'tog-showhiddencats' => 'E hōʻike i nā māhele hūnā',
+'tog-norollbackdiff' => 'E waiho i ka ʻokoʻa ma hope o ka hana hoʻihoʻi',
+'tog-useeditwarning' => 'E aʻo mai iaʻu i kaʻu haʻalele ʻana i ka ʻaoʻao hoʻololi inā loaʻa i nā loli mālama ʻia ʻole',
'tog-prefershttps' => 'E hana mau i ka hoʻokuʻi paʻa ma loko o ka ʻeʻe ʻana',
'underline-always' => 'I nā manawa apau',
'underline-default' => 'Paʻamau ʻike aiʻole pōlamu pūnaewele',
# Font style option in Special:Preferences
-'editfont-style' => 'E hoʻololi i kahi ʻanohua:',
-'editfont-default' => 'Paʻamau pōlamu pūnaewele',
+'editfont-style' => 'E hoʻololi i kahi kaila hua:',
+'editfont-default' => 'Pōlamu pūnaewele paʻamau',
'editfont-monospace' => 'Hua pukakahi',
'editfont-sansserif' => 'Hua Sanā-selifa',
'editfont-serif' => 'Hua Selifa',
'oct' => 'ʻOk',
'nov' => 'Now',
'dec' => 'Kek',
-'january-date' => 'Ianuali $1',
-'february-date' => 'Pepeluali $1',
-'march-date' => 'Malaki $1',
-'april-date' => 'ʻApelila $1',
-'may-date' => 'Mei $1',
-'june-date' => 'Iune $1',
-'july-date' => 'Iulai $1',
-'august-date' => 'ʻAukake $1',
-'september-date' => 'Kepakemapa $1',
-'october-date' => 'ʻOkakopa $1',
-'november-date' => 'Nowemapa $1',
-'december-date' => 'Kēkēmapa $1',
+'january-date' => '$1 Ianuali',
+'february-date' => '$1 Pepeluali',
+'march-date' => '$1 Malaki',
+'april-date' => '$1 ʻApelila',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Iune',
+'july-date' => '$1 Iulai',
+'august-date' => '$1 ʻAukake',
+'september-date' => '$1 Kepakemapa',
+'october-date' => '$1 ʻOkakopa',
+'november-date' => '$1 Nowemapa',
+'december-date' => '$1 Kēkēmapa',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Mahele|Māhele}}',
+'pagecategories' => '{{PLURAL:$1|Mahele| mau Māhele}}',
'category_header' => 'Nā ʻaoʻao i loko o ka mahele "$1"',
-'subcategories' => 'Nā māhele laloiho',
-'category-media-header' => 'Nā pāpaho i loko o ka mahele "$1"',
-'category-empty' => "''ʻAʻohe moʻolelo a me pāpaho o kēia mahele i kēia manawa.''",
-'hidden-categories' => '{{PLURAL:$1|Mahele hūnā|Māhele hūnā}}',
+'subcategories' => 'Nā Māhele kūloko',
+'category-media-header' => 'Nā Pāpaho i loko o ka mahele "$1"',
+'category-empty' => "''ʻAʻohe ʻaoʻao a me pāpaho a kēia mahele i kēia manawa.''",
+'hidden-categories' => '{{PLURAL:$1|mahele hūnā|mau māhele hūnā}}',
'hidden-category-category' => 'Nā māhele hūnā',
-'listingcontinuesabbrev' => '(ho‘omauia)',
-
-'about' => 'Pilina',
-'newwindow' => '(wehe i loko o kekahi pukaaniani hou)',
+'category-subcat-count' => '{{PLURAL:$2|Hoʻokahi mahele kūloko wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia mahele kūloko|$1 mau māhele kūloko}} i loko o kēia mahele, $2 ka huina.}}',
+'category-article-count' => '{{PLURAL:$2|Hoʻokahi ʻaoʻao wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia ʻaoʻao|$1 mau ʻaoʻao}} i loko o kēia mahele, $2 ka huina.}}',
+'category-file-count' => '{{PLURAL:$2|Hoʻokahi waihona wale nō o kēia mahele.|Aia {{PLURAL:$1|i kēia waihona|$1 mau waihona}} i loko o kēia mahele, $2 ka huina.}}',
+'listingcontinuesabbrev' => '(homaʻia)',
+'noindex-category' => 'Nā ʻAoʻao i hoʻopapakuhikuhi kikoʻī ʻia',
+
+'about' => 'No ia',
+'newwindow' => '(wehe ʻia i loko o kekahi pukaaniani hou)',
'cancel' => 'Ho‘ōki',
'moredotdotdot' => 'Nā mea ʻē aʻe...',
-'mypage' => 'Ko‘u ‘ao‘ao',
-'mytalk' => 'Ka‘u kūkākūkā',
-'anontalk' => 'Ke kūkākūkā no kēia IP',
+'mypage' => 'Ka‘u ‘ao‘ao',
+'mytalk' => 'Ka‘u walaʻau',
+'anontalk' => 'Walaʻau no kēia IP',
'navigation' => 'Kelena',
'and' => ' a me',
# Cologne Blue skin
-'qbfind' => 'Loa‘a',
+'qbfind' => 'Loa‘a iā',
'qbbrowse' => 'Kele',
'qbedit' => 'Hoʻololi',
'qbpageoptions' => 'Kēia ‘ao‘ao',
'qbmyoptions' => 'Ka‘u mau ‘ao‘ao',
+'faq' => 'NNP',
+'faqpage' => 'Project:NNP',
# Vector skin
+'vector-action-addsection' => 'Hoʻohui kumuhana',
'vector-action-delete' => 'Holoi',
-'vector-action-move' => 'Neʻe',
-'vector-action-protect' => 'Hoʻomalu',
+'vector-action-move' => 'E hoʻoneʻe',
+'vector-action-protect' => 'E hoʻomalu',
'vector-action-undelete' => 'Holoiʻole',
'vector-action-unprotect' => 'E hoʻololi i ka hoʻomalu',
'vector-view-create' => 'Haku',
'vector-view-history' => 'Nānā i ka mōʻaukala',
'vector-view-view' => 'Heluhelu',
'vector-view-viewsource' => 'Nānā i ke kumu',
-'actions' => 'Hana',
+'actions' => 'Nā Hana',
'namespaces' => 'Lewainoa',
+'variants' => 'Nā Lolina',
+'navigation-heading' => 'Papa kelena',
'errorpagetitle' => 'Hewa',
'returnto' => 'Ho‘i iā $1.',
'tagline' => 'Mai {{SITENAME}}',
'search' => 'Huli',
'searchbutton' => 'Huli',
'go' => 'E huli',
-'searcharticle' => 'Hele',
-'history' => 'Mo‘olelo o ka ‘ao‘ao',
+'searcharticle' => 'E huli',
+'history' => 'Mōʻaukala ʻaoʻao',
'history_short' => 'Mōʻaukala',
'printableversion' => 'Mana paʻi pono',
-'permalink' => 'Ka loulou paʻa',
+'permalink' => 'Loulou paʻa',
'print' => 'Pa‘i',
'view' => 'Nānā',
'edit' => 'Hoʻololi',
'editthispage' => 'E hoʻololi i kēia ‘ao‘ao',
'create-this-page' => 'E haku i keia ‘ao‘ao',
'delete' => 'Holoi',
-'deletethispage' => 'E holoi i kēia mo‘olelo',
+'deletethispage' => 'E holoi i kēia ʻaoʻao',
'undeletethispage' => 'E holoiʻole i kēia ʻaoʻao',
'undelete_short' => 'E holoiʻole i {{PLURAL:$1|hoʻokahi loli|$1 mau loli}}',
-'viewdeleted_short' => 'E ʻike i {{{{PLURAL:$1|hoʻokahi loli holoi|$1 mau loli holoi}}',
+'viewdeleted_short' => 'E ʻike i {{PLURAL:$1|hoʻokahi loli holoi|$1 mau loli holoi}}',
'protect' => 'Hoʻomalu',
'protect_change' => 'hoʻololi',
'protectthispage' => 'E ho‘omalu i kēia ‘ao‘ao',
'unprotectthispage' => 'E hoʻololi i ka hoʻomalu o kēia ʻaoʻao',
'newpage' => '‘Ao‘ao hou',
'talkpage' => 'Kūkākūkā i keia ‘ao‘ao',
-'talkpagelinktext' => 'Kūkākūkā',
+'talkpagelinktext' => 'Walaʻau',
'specialpage' => '‘Ao‘ao kūikawā',
'personaltools' => 'Hāmeʻa ponoʻī',
'postcomment' => 'Māhele hou',
-'talk' => 'Kūkākūkā',
-'views' => 'Nā nānaina',
+'articlepage' => 'Nānā i ka ʻaoʻao mealoko',
+'talk' => 'walaʻau',
+'views' => 'Nānaina',
'toolbox' => 'Hāmeʻa',
'userpage' => 'Nānā i ka ‘ao‘ao mea ho‘ohana',
'projectpage' => 'Nānā i ka ‘ao‘ao papahana',
-'imagepage' => 'Nānā i ka ‘ao‘ao pāpaho',
-'mediawikipage' => 'Nānā i ka ‘ao‘ao memo',
+'imagepage' => 'Nānā i ka ‘ao‘ao waihona',
+'mediawikipage' => 'Nānā i ka ‘ao‘ao pūlono',
'templatepage' => 'Nānā i ka ‘ao‘ao anakuhi',
'viewhelppage' => 'Nānā i ka ‘ao‘ao kōkua',
'categorypage' => 'Nānā i ka ‘ao‘ao mahele',
'viewtalkpage' => 'Nānā i ke kūkākūkā',
'otherlanguages' => 'Ma nā leo ʻē aʻe',
-'redirectedfrom' => '(Hoʻoili hou mai $1)',
-'redirectpagesub' => '‘Ao‘ao hoʻoili hou',
-'lastmodifiedat' => 'Ua hoʻololi ʻia kēia ʻaoʻao ma ka lā $1, i ka manawa $2.',
+'redirectedfrom' => '(Kia hou mai $1)',
+'redirectpagesub' => 'ʻAoʻao kia hou',
+'lastmodifiedat' => 'Ua kāloli ʻia kēia ʻaoʻao i ka lā $1, ma ka hola $2.',
'viewcount' => 'Ua komo ʻia kēia ʻaoʻao i {{PLURAL:$1|hoʻokahi manawa|$1 mau manawa}}',
'protectedpage' => '‘Ao‘ao ho‘omalu',
-'jumpto' => 'Lele i:',
+'jumpto' => 'Lele iā:',
'jumptonavigation' => 'kelena',
'jumptosearch' => 'huli',
'view-pool-error' => 'E kala mai, ua hoʻoili nui ʻino nā pūnaewele i kēia manawa. Hoʻāʻo nā mea hoʻohana nui kā e ʻike i kēia ʻaoʻao. E ʻoluʻolu, e kali no kekahi mau minuke a hana hou.
'pool-errorunknown' => 'Hewa ʻikeʻole',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => 'E pili ana iā {{SITENAME}}',
-'aboutpage' => 'Project:Pilina',
-'copyrightpage' => '{{ns:project}}:Ponokope',
+'aboutsite' => 'No {{SITENAME}}',
+'aboutpage' => 'Project:No translatewiki.net',
+'copyrightpage' => '{{ns:project}}:Kūleana kope',
'currentevents' => 'Nūhou',
'currentevents-url' => 'Project:Nūhou',
'disclaimers' => 'Nā Akahele',
-'disclaimerpage' => 'Project:Akahele laulaha',
+'disclaimerpage' => 'Project:Akahele Laulaha',
'edithelp' => 'Kōkua ho‘ololi',
'helppage' => 'Help:Papakuhikuhi',
-'mainpage' => 'ʻAoʻao kinohi',
-'mainpage-description' => 'ʻAoʻao kinohi',
+'mainpage' => 'Papa Kinohi',
+'mainpage-description' => 'Papa Kinohi',
'policy-url' => 'Project:Kulekele',
-'portal' => 'Puka kaiāulu',
-'portal-url' => 'Project:Puka kaiāulu',
+'portal' => 'Puka Kaiāulu',
+'portal-url' => 'Project:Puka Kaiāulu',
'privacy' => 'Kulekele pilikino',
'privacypage' => 'Project:Kulekele pilikino',
'youhavenewmessagesmulti' => '$1 kāu',
'editsection' => 'ho‘ololi',
'editold' => 'ho‘ololi',
-'viewsourceold' => 'nānā i ke kumu kanawai',
+'viewsourceold' => 'nānā i ke kumu',
'editlink' => 'hoʻololi',
'viewsourcelink' => 'nānā i ke kumu',
'editsectionhint' => 'E hoʻololi i ka paukū: $1',
-'toc' => 'Papakuhikuhi',
+'toc' => 'Nā Mealoko',
'showtoc' => 'hō‘ike',
'hidetoc' => 'hoʻohūnā',
'collapsible-collapse' => 'Hoʻoliʻi',
'collapsible-expand' => 'Hoʻākea',
-'thisisdeleted' => 'Nānā ai‘ole hō‘āla i $1?',
-'viewdeleted' => 'Nānā i $1?',
+'thisisdeleted' => 'Nānā ai‘ole hō‘āla iā $1?',
+'viewdeleted' => 'Nānā iā $1?',
'restorelink' => '{{PLURAL:$1|kekahi loli holoi|$1 mau loli holoi}}',
+'feedlinks' => 'Hānaīke:',
'site-rss-feed' => 'Hānaīke RSS o $1',
'site-atom-feed' => 'Hānaīke Atom o $1',
'page-rss-feed' => 'Hānaīke RSS o "$1"',
'page-atom-feed' => 'Hānaīke Atom o "$1"',
-'red-link-title' => '$1 (hakuia ʻole)',
+'red-link-title' => '$1 (haku ʻia ʻole)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'ʻAoʻao',
-'nstab-user' => 'Mea ho‘ohana',
-'nstab-media' => 'Pāpaho',
-'nstab-special' => 'ʻaoʻao kūikawā',
-'nstab-project' => 'Papahana',
+'nstab-user' => 'ʻAoʻao mea ho‘ohana',
+'nstab-media' => 'ʻAoʻao Pāpaho',
+'nstab-special' => 'ʻAoʻao kūikawā',
+'nstab-project' => 'ʻAoʻao papahana',
'nstab-image' => 'Waihona',
-'nstab-mediawiki' => 'Memo',
+'nstab-mediawiki' => 'Pūlono',
'nstab-template' => 'Anakuhi',
'nstab-help' => 'Kōkua',
'nstab-category' => 'Mahele',
+# Main script and global functions
+'nosuchaction' => 'ʻAʻohe hana',
+'nosuchspecialpage' => 'ʻAʻohe ʻaoʻao kūikawā',
+
# General errors
'error' => 'Hewa',
+'databaseerror' => 'Hewa hōkeo ʻikepili',
'databaseerror-query' => 'Nīnau: $1',
'databaseerror-function' => 'Hana: $1',
'databaseerror-error' => 'Hewa: $1',
-'laggedslavemode' => '<strong>E akahele:</strong> ʻAʻole loaʻa paha i ka ʻaoʻao na hoʻouka hou hanawale.',
+'laggedslavemode' => '<strong>E akahele:</strong> ʻAʻole loaʻa paha i ka ʻaoʻao na hoʻouka hou hou.',
'readonly' => 'Laka ‘ia ka hōkeo ‘ikepili',
-'missingarticle-diff' => '(Difē: $1, $2)',
+'missing-article' => 'Loaʻa ʻole i ka hōkeo ʻikepili ke kikokikona o ka ʻaoʻao i pono e loaʻa ʻia i kapa ʻia ʻo "$1" $2.
+
+Hana ʻia kēia pilikia e ka hāhai ʻana o kekahi ʻokoʻa kahiko aiʻole i kekahi loulou mōʻaukala i kekahi ʻaoʻao i holoi ʻia.
+
+Inā ʻaʻole ka hana, ua loaʻa paha iā ʻoe i kekahi mū i loko o ka lako pōlamu.
+E ʻoluʻolu, e lono kēia pilikia i kekahi [[Special:ListUsers/sysop|kahu]], mai poina i ka URL.',
+'missingarticle-rev' => '(kāmua#: $1)',
+'missingarticle-diff' => '(ʻOkoʻa: $1, $2)',
'internalerror' => 'Hewa koloko',
'internalerror_info' => 'Hewa koloko:$1',
'fileappenderrorread' => 'ʻAʻole hiki ke heluhelu iā "$1" ma loko o ka pākuʻi ʻana.',
'directorycreateerror' => 'ʻAʻole hiki ke haku ka papakuhi waihona "$1"',
'filenotfound' => '‘A‘ole hiki ke loa‘a ka waihona "$1".',
'fileexistserror' => 'ʻAʻole hiki ke kākau i ka waihona "$1": Aia no ia.',
-'badtitle' => 'Inoa ‘ino',
-'viewsource' => 'E nānā i ke kumu',
+'badtitle' => 'Inoa ʻohe',
+'badtitletext' => 'ʻAʻohe paha, hakahaka paha aiʻole loulou hewa paha ka poʻoinoa ʻaoʻao.
+Loaʻa paha nā hua kikokikona e hiki ʻole ke hana i nā poʻoinoa.',
+'viewsource' => 'Nānā i ke kumu',
+'viewsource-title' => 'Nānā i ke kumu no $1',
'cascadeprotected' => 'Ho‘omalu ‘ia kēia ‘ao‘ao mai e ho‘opololei ana, no ka mea, hoʻokomo pū ‘ia ‘oia ma aia {{PLURAL:$1|‘ao‘ao|nā ‘ao‘ao}} i lalo, ho‘omalu ‘ia me ka "e wailele ana" koho:
$2',
'ns-specialprotected' => '‘A‘ole hiki ke ho‘ololi i nā ‘ao‘ao kūikawā',
+'exception-nologin' => 'ʻE‘e ʻole',
# Login and logout pages
'welcomeuser' => 'Welina mai e $1!',
'createacct-yourpasswordagain' => 'E hōʻoia i ka ʻōlelo hūnā',
'createacct-yourpasswordagain-ph' => 'E kikokiko hou i ka ʻōlelo hūnā',
'remembermypassword' => 'Hoʻomanaʻo iaʻu ma kēia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lā|mau lā}})',
+'userlogin-remembermypassword' => 'Hoʻomanaʻo iaʻu',
'login' => 'ʻEʻe',
'nav-login-createaccount' => 'ʻEʻe / Kāinoa',
-'loginprompt' => 'Pono ʻoe e hoʻā i nā makana (cookies) no ka ʻeʻe ʻana iā {{SITENAME}}.',
+'loginprompt' => 'Pono ʻoe e hoʻā i nā makana no ka ʻeʻe ʻana iā {{SITENAME}}.',
'userlogin' => 'ʻEʻe / Kāinoa',
'userloginnocreate' => 'ʻEʻe',
'logout' => 'Haʻalele',
'userlogin-noaccount' => 'ʻAʻohe āu moʻokāki?',
'userlogin-joinproject' => 'E komo mai iā {{SITENAME}}',
'nologin' => "ʻAʻohe āu moʻokāki? '''$1'''.",
-'nologinlink' => 'E kāinoa',
-'createaccount' => 'E kāinoa',
+'nologinlink' => 'E Kāinoa',
+'createaccount' => 'E Kāinoa',
'gotaccount' => "He moʻokāki kāu? '''$1'''.",
'gotaccountlink' => 'ʻEʻe',
-'userlogin-resetlink' => 'Ua poina i kāu inoa mea hoʻohana?',
+'userlogin-resetlink' => 'Ua poina i kāu ʻike ʻeʻe?',
'userlogin-resetpassword-link' => 'Ua poina i kāu ʻōlelo hūnā?',
'helplogin-url' => 'Help:ʻEʻe',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Kōkua me ka ʻeʻe ʻana]]',
Hoʻouna ʻole i kekahi lekauila no kēia mau helena.',
'emailconfirmlink' => 'E hō‘oia i kāu wahinoho lekauila',
'accountcreated' => 'Ua kāinoa',
-'accountcreatedtext' => 'Ua kāinoa ka moʻokāki no [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|kūkākūkā]]',
+'accountcreatedtext' => 'Ua kāinoa ka moʻokāki no [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|walaʻau]])',
'createaccount-title' => 'Kāinoa moʻokāki no {{SITENAME}}',
-'loginlanguagelabel' => "Kou 'ōlelo: $1",
+'loginlanguagelabel' => 'ʻŌlelo: $1',
'pt-login' => 'ʻEʻe',
'pt-createaccount' => 'Kāinoa',
'pt-userlogout' => 'Haʻalele',
'italic_sample' => 'Ho‘ohiō',
'italic_tip' => 'Ho‘ohiō',
'link_sample' => 'Inoa loulou',
-'link_tip' => 'Loulou lokoiho',
+'link_tip' => 'Loulou kūloko',
'extlink_sample' => 'http://www.example.com inoa loulou',
'extlink_tip' => 'Loulou kūwaho (e ho‘omana‘o i ka poʻo pāʻālua http://)',
'headline_sample' => 'Po‘o‘ōlelo',
+'headline_tip' => 'Poʻomanaʻo kau 2',
+'nowiki_sample' => 'Hoʻokomo i nā kikokikona huluʻole ma ʻaneʻi',
+'nowiki_tip' => 'Nānaʻole i ka hulu wiki',
+'image_tip' => 'Waihona kauloko',
'media_tip' => 'Loulou waihona',
-'sig_tip' => 'Kou pūlima me ka manawa',
+'sig_tip' => 'Kau pūlima me ka manawa',
'hr_tip' => 'Laina ‘ilikai (e hana pākiko)',
# Edit pages
'summary' => 'Hōʻuluʻulu manaʻo:',
'subject' => 'Kumumanaʻo/poʻo laina:',
'minoredit' => 'He hoʻololi iki kēia',
-'watchthis' => 'E nānā pono i kēia ʻaoʻao',
+'watchthis' => 'E kiaʻi i kēia ʻaoʻao',
'savearticle' => 'E mālama i ka ʻaoʻao',
'preview' => 'Nāmua',
'showpreview' => "E hō'ike i ka nāmua",
'showlivepreview' => 'Nāmua ʻānō',
'showdiff' => "E hō'ike i nā loli",
-'anoneditwarning' => '<strong>E akahele:</strong> ʻAʻole ʻoe e ʻeʻe nei.
+'anoneditwarning' => '<strong>E akahele:</strong> ʻAʻole ʻoe ʻeʻe nei.
E hoʻopaʻa ʻia ana kāu IP ma ko kēia ʻaoʻao mōʻaukala hoʻololi.',
'blockedtitle' => 'Ua pale ‘ia ka mea ho‘ohana',
'blockednoreason' => '‘a‘ohe kumu',
'loginreqlink' => 'ʻeʻe',
'accmailtitle' => 'Ua ho‘ouna ‘ia ka ‘ōlelo hūnā',
'newarticle' => '(Hou)',
+'newarticletext' => 'Ua hāhai ʻoe i kekahi loulou i kekahi ʻaoʻao e haku ʻole.
+No ka haku ʻana i ka ʻaoʻao, kikokiko i loko o ka pahu i lalo (ʻike i ka [[{{MediaWiki:Helppage}}|ʻaoʻao kōkua]] no nā ʻike ʻē aʻe).
+Inā hewa kou hele ʻana, kāomi i ka pihi <strong>hoʻi</strong>.',
'anontalkpagetext' => "----
<em>ʻO kēia ka ʻaoʻao kūkākūkā no kekahi mea ho‘ohana me ka inoa ʻole.</em>
No laila, pono mākou e ho‘ohana i ka IP no ka hōʻoia ʻana iā ia a hiki i kekahi mau mea hoʻohana ke hoʻokaʻana i kēia IP.
Inā he mea ho‘ohana inoa ʻole ʻoe a loaʻa kekahi mau manaʻo nāuʻole, e ʻoluʻolu [[Special:UserLogin/signup|e kāinoa]] a i ʻole [[Special:UserLogin|e ʻeʻe]].''",
'noarticletext' => 'ʻAʻohe kikokikona a kēia ʻaoʻao.
Hiki iā ʻoe ke [[Special:Search/{{PAGENAME}}|huli no kēia inoa ʻaoʻao]] i nā ʻaoʻao ʻē aʻe, <span class="plainlinks">[{{fullurl:SpecialLog|page={{FULLPAGENAMEE}}}} huli i nā moʻolelo pili], a i ʻole [{{fullurl:{{FULLPAGENAME}}|action=edit}} hoʻololi i kēia ʻaoʻao]</span>.',
+'noarticletext-nopermission' => 'ʻAʻohe kikokikona a kēia ʻaoʻao.
+Hiki iā ʻoe ke [[Special:Search/{{PAGENAME}}|huli no kēia inoa ʻaoʻao]] i nā ʻaoʻao ʻē aʻe aiʻole <span class="plainlinks">[{{fullurl:SpecialLog|page={{FULLPAGENAMEE}}}} huli i nā moʻolelo pili]</span>, akā hiki ʻole iā ʻoe ke hoʻololi i kēia ʻaoʻao.',
'previewnote' => '<strong>ʻO kēia ka nāmua wale nō.</strong>
‘A‘ole mālama ‘ia nā ho‘ololi!',
-'continue-editing' => 'Hele i kahi hoʻololi',
+'continue-editing' => 'Kele i kahi hoʻololi',
'editing' => 'Ke ho‘ololi nei iā $1',
'creating' => 'Ke haku nei iā $1',
-'editingsection' => 'Ke hoʻololi nei iā $1 (mahele)',
+'editingsection' => 'Hoʻololi nei iā $1 (mahele)',
'editingcomment' => 'Ke ho‘ololi nei iā $1 (paukū hou)',
'editconflict' => 'He pilikia hoʻololi: $1',
'yourtext' => 'Kāu kikokikona',
-'storedversion' => 'Loihape waihoia',
+'storedversion' => 'Loihape waiho ʻia',
'yourdiff' => 'Nā mea ‘oko‘a',
'copyrightwarning' => 'E ʻoluʻolu, hoʻokuʻu ʻia nā mea lūlū iā {{SITENAME}} ma lalo o ka laikini $2 (no nā mea kikoʻī, kele iā $1).
Inā ʻaʻole ʻoe makemake i ka hoʻololi ʻana kūnoa o kou kākau ʻana a ʻaʻole ʻoe makemake i ka hoʻomalele ʻana i kāu mau loli, a laila mai kākau ma ʻaneʻi.<br />
<strong>Mai waiho i nā kikokikona ponokope me ka ʻae ʻole!</strong>',
'protectedpagewarning' => '<strong>E akahele: Ua hoʻomalu ‘ia kēia ‘ao‘ao, pēlā, hiki i nā "kahu" ke ho‘ololi wale nō.</strong>
Aia nā loli hanalohi i lalo no ka ʻikena:',
+'templatesused' => '{{PLURAL:$1|anakuhi|mau anakuhi}} e hana ʻia ma kēia ʻaoʻao:',
'templatesusedpreview' => 'Hoʻohana ʻia kēia {{PLURAL:$1|anakuhi|mau anakuhi}} i kēia nāmua:',
'template-protected' => '(ho‘omalu ‘ia)',
'template-semiprotected' => '(hapa-ho‘omalu ‘ia)',
+'hiddencategories' => 'ʻO kēia ʻaoʻao he lālā o {{PLURAL:$1|1 mahele hūnā|$1 mau māhele hūnā}}:',
'edittools' => '<!-- Eia ka ‘ōlelo e hō‘ike ‘ia malalo o nā palapala ho‘ololi ame nā palapala ho‘ohui. -->',
-'permissionserrorstext-withaction' => 'ʻAʻohe ou ʻae no $2, no {{PLURAL:$1|kumu| mau kumu}}:',
+'permissionserrorstext-withaction' => 'ʻAʻohe āu ʻae no $2, no {{PLURAL:$1|kumu| mau kumu}}:',
+'recreate-moveddeleted-warn' => '<strong>E akahele: Ke haku nei ʻoe i kekahi ʻaoʻao i holoi ʻia.</strong>
+
+Pono ʻoe e noʻonoʻo e pili ana ka pono o ka hoʻomau ʻana o ka hoʻololi ʻana o kēia ʻaoʻao.
+Aia ka moʻolelo holoi a hoʻoneʻe no kēia ʻaoʻao ma ʻaneʻi:',
+'moveddeleted-notice' => 'Ua holoi ʻia kēia ʻaoʻao.
+Hoʻolako ʻia ka moʻolelo holoi a hoʻoneʻe no kēia ʻaoʻao i lalo no ke kūmole.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '<strong>E akahele:</strong> Hoʻokela ʻia ka palena nui o ke anakuhi.
+Hoʻohui ʻole i kekahi mau anakuhi.',
+'post-expand-template-inclusion-category' => 'Nā ʻaoʻao me nā anakuhi e hoʻokela i ka palenanui',
+'post-expand-template-argument-warning' => '<strong>E akahele:</strong> Aia ma kēia ʻaoʻao i kekahi a ʻoi pilikia anakuhi e loaʻa i kekahi nui hoʻonui nunui loa.
+Ua waiho ʻia kēia mau pilikia.',
+'post-expand-template-argument-category' => 'Nā ʻAoʻao e loaʻa nā pilikia anakuhi i waiho ʻia',
# "Undo" feature
'undo-success' => 'Hiki iā ʻoe ke hoʻihoʻi i kēia loli.
E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā loli i lalo no ka hoʻopau ʻana o ka hoʻihoʻi o ka loli.',
-'undo-summary' => 'Hoʻihoʻi mai i ke kāmua $1 na [[Special:Contributions/$2|$2]] ([[User talk:$2|kūkākūkā]])',
+'undo-summary' => 'Hoʻihoʻi mai i ke kāmua $1 na [[Special:Contributions/$2|$2]] ([[User talk:$2|walaʻau]])',
# History pages
+'viewpagelogs' => 'Nānā i nā moʻolelo no kēia ʻaoʻao',
'currentrev' => 'Kāmua hou',
-'revisionasof' => 'Kāmua ma $1',
+'currentrev-asof' => 'Ke Kāmua houloa ma $1',
+'revisionasof' => 'Kāmua ʻia ma $1',
'revision-info' => 'Kāmua ma $1 na $2',
-'previousrevision' => '← Kāmua mua',
+'previousrevision' => '← Kāmua kahiko',
'nextrevision' => 'Kāmua hou →',
-'currentrevisionlink' => 'Kāmua hanawale',
-'cur' => 'cur',
+'currentrevisionlink' => 'Kāmua houloa',
+'cur' => 'okawā',
'next' => 'hou aʻe',
-'last' => 'hou nei',
+'last' => 'aku nei',
'page_first' => 'mua loa',
'page_last' => 'hope loa',
+'histlegend' => 'Koho ʻokoʻa: Kaha i nā pahu lekiō o nā kāmua no ka hoʻokūkū ʻana a kāomi ke kāhoʻi aiʻole ka pihi ma ka lalo.<br />
+Pahu hōʻailona: <strong>({{int:cur}})</strong> = ka ʻokoʻa me ke kāmua houloa, <strong>({{int:last}})</strong> = ka ʻokoʻa me ke kāmua i hana mua, <strong>{{int:minoreditletter}}</strong> = he hoʻololi iki ia.',
'history-fieldset-title' => 'Mōʻaukaki Pūnaewele',
'history-show-deleted' => 'Holoi wale nō',
'histfirst' => 'kahiko loa',
'revdelete-radio-set' => 'ʻAe',
'revdelete-radio-unset' => 'ʻAʻole',
'revdelete-log' => 'Kumu:',
-'revdel-restore' => 'hoʻololi ka nānā ʻana',
+'revdel-restore' => 'hoʻololi i ka nānā ʻana',
'pagehist' => 'Mōʻaukala ʻaoʻao',
'deletedhist' => 'Mōʻaukala holoi',
'revdelete-otherreason' => 'Nā kumu ʻē aʻe',
'revertmerge' => 'Hoʻokuʻipū ʻole',
# Diffs
+'history-title' => 'Mōʻaukala kāmua o "$1"',
'lineno' => 'Laina $1:',
+'compareselectedversions' => 'Hoʻohālikelike i nā kāmua i koho ʻia',
'editundo' => 'hoʻihoʻi',
'diff-empty' => '(ʻaʻohe like ʻole)',
# Search results
-'searchresults' => 'Nā hualoaʻa',
+'searchresults' => 'Nā Hualoaʻa',
'searchresults-title' => 'Nā hualoaʻa no "$1"',
-'prevn' => '{{PLURAL:$1|$1}} ma mua',
-'nextn' => '{{PLURAL:$1|$1}} ma hope',
-'viewprevnext' => 'Nānā i nā ($1 {{int:pipe-separator}} $2) ($3)',
+'prevn' => '{{PLURAL:$1|$1}} mamua',
+'nextn' => '{{PLURAL:$1|$1}} hou aʻe',
+'prevn-title' => '$1 {{PLURAL:$1|hualoaʻa|mau hualoaʻa}} aku nei',
+'nextn-title' => '$1 {{PLURAL:$1|hualoaʻa|mau hualoaʻa}} hou aʻe',
+'shown-title' => 'Hōʻike $1 {{PLURAL:$1|hualoaʻa|mau hualoaʻa}} i kekahi ʻaoʻao',
+'viewprevnext' => 'Nānā i ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => '<strong>Aia kekahi ʻaoʻao i kapa ʻia o "[[:$1]]" ma kēia wiki.</strong> {{PLURAL:$2|0=|ʻIke hoʻi i na hualoaʻa huli ʻē aʻe i loaʻa ʻia.}}',
+'searchmenu-new' => '<strong>Haku i ka ʻaoʻao "[[:$1]]" ma kēia wiki!</strong> {{PLURAL:$2|0=|"ʻIke hoʻi i ka ʻaoʻao i loaʻa ʻia ma kou huli ʻana.|ʻIke hoʻi nā hualoaʻa huli i loaʻa ʻia.}}',
+'searchprofile-articles' => 'Nā ʻAoʻao mealoko',
'searchprofile-project' => 'Nā ʻaoʻao Kōkua a me Papahana',
+'searchprofile-images' => 'Laupāpaho',
'searchprofile-everything' => 'Nā mea apau',
-'searchprofile-articles-tooltip' => 'Huli iā $1',
-'searchprofile-project-tooltip' => 'Huli iā $1',
+'searchprofile-advanced' => 'Kiʻelē',
+'searchprofile-articles-tooltip' => 'Huli i loko o $1',
+'searchprofile-project-tooltip' => 'Huli i loko o $1',
'searchprofile-images-tooltip' => 'Huli no nā waihona',
-'searchprofile-everything-tooltip' => 'Huli i nā mea apau (nā kūkākūkā nō hoʻi)',
+'searchprofile-everything-tooltip' => 'Huli i nā mea apau (nā walaʻau nō hoʻi)',
+'searchprofile-advanced-tooltip' => 'Huli iā lewainoa pilikino',
'search-result-size' => '$1 ({{PLURAL:$2|1 huaʻōlelo|$2 mau huaʻōlelo}})',
-'search-result-category-size' => '{{PLURAL:$1|1 mea hoʻohana|$1 mau mea hoʻohana}} ({{PLURAL:$2|1 mahele lokoiho|$2 mau māhele lokoiho}}, {{PLURAL:$3|1 wahihona|$3 mau waihona}})',
-'search-redirect' => '(hoʻoili hou $1)',
-'search-section' => '(māhele $1)',
+'search-result-category-size' => '{{PLURAL:$1|1 mea hoʻohana|$1 mau mea hoʻohana}} ({{PLURAL:$2|1 mahele kūloko|$2 mau māhele kūloko}}, {{PLURAL:$3|1 wahihona|$3 mau waihona}})',
+'search-redirect' => '(kia hou $1)',
+'search-section' => '(pauku $1)',
'search-suggest' => 'ʻO kēia paha kou manaʻo: $1',
'search-interwiki-caption' => 'Nā pāhana ʻē aʻe',
'search-interwiki-more' => '(hou aʻe)',
+'searchrelated' => 'na mea ʻālike',
'searchall' => 'nā mea apau',
+'showingresultsheader' => '{{PLURAL:$5|<strong>$1</strong> hualoaʻa o <strong>$3</strong> mau hualoaʻa|<strong$1-$2</strong> mau hualoaʻa o <strong>$3</strong> mau hualoaʻa}} no <strong>$4</strong>',
+'search-nonefound' => 'ʻAʻohe hualoaʻa no kēia huli.',
'powersearch-legend' => 'Hulina kūlana kiʻekiʻe',
'powersearch-ns' => 'Huli i loko o nā wahi inoa:',
'powersearch-toggleall' => 'Nā mea apau',
'prefs-datetime' => 'Ka lā a me ka hola',
'prefs-personal' => 'ʻAoʻao mea hoʻohana',
'prefs-rc' => 'Nā loli hou',
-'prefs-watchlist' => 'Papa nānāpono',
-'prefs-watchlist-days' => 'Nā lā e hōʻike ana i ka papa nānāpono:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist' => 'Papakiaʻi',
+'prefs-watchlist-days' => 'Nā lā e hōʻike i ka papakiaʻi:',
+'prefs-watchlist-days-max' => 'He palenanui o $1 {{PLURAL:$1|lā|mau lā}}',
'prefs-email' => 'Koho lekauila',
'prefs-rendering' => 'Helena',
'saveprefs' => 'Mālama',
'prefs-memberingroups' => '{{GENDER:$2|He lālā}} o {{PLURAL:$1|hui|mau hui}}:',
'prefs-registration' => 'Hola kāinoa:',
'yourrealname' => 'Inoa ʻoiaʻiʻo:',
-'yourlanguage' => 'Kou ʻōlelo:',
+'yourlanguage' => 'Kāu ʻōlelo:',
'yournick' => 'Pūlima hou:',
'yourgender' => 'Keka:',
'gender-unknown' => 'Kāpae',
'gender-male' => 'Kāne',
'gender-female' => 'Wahine',
'email' => 'Lekauila',
+'prefs-help-email' => 'Koi ʻole i ka wahinoho lekauila, akā pono ia nō ke kāinoa ʻana o ka ʻōlelo hūnā inā poina ʻoe i kāu ʻōlelo hūnā.',
+'prefs-help-email-others' => 'Hiki iā ʻoe ke koho i ka ʻae ʻana i nā mea ʻē aʻe e hoʻokaʻaʻike iā ʻoe mao ka lekauila mao kekahi loulou ma kāu ʻaoʻao mea hoʻohana aiʻole kāu ʻaoʻao walaʻau.
+ʻAʻole hōʻike ʻia kāu wahinoho lekauila i nā mea ʻē aʻe e hoʻokaʻaʻike iā ʻoe.',
'prefs-help-email-required' => 'Koi i ka lekauila.',
'prefs-signature' => 'Pūlima',
'prefs-advancedediting' => 'Koho paʻamau',
'group' => 'Hui:',
'group-user' => 'Mea hoʻohana',
'group-bot' => 'Lopako',
-'group-sysop' => 'Nā kahu',
-'group-bureaucrat' => 'Nā kuhina',
+'group-sysop' => 'Nā Kahu',
+'group-bureaucrat' => 'Nā Kuhina',
'group-all' => '(Nā mea apau)',
-'group-user-member' => '{{GENDER:$1|mea hoʻohana}}',
-'group-bot-member' => '{{GENDER:$1|lopako}}',
-'group-sysop-member' => '{{GENDER:$1|kahu}}',
-'group-bureaucrat-member' => '{{GENDER:$1|kuhina}}',
+'group-user-member' => '{{GENDER:$1|ka mea hoʻohana}}',
+'group-bot-member' => '{{GENDER:$1|ka lopako}}',
+'group-sysop-member' => '{{GENDER:$1|ke kahu}}',
+'group-bureaucrat-member' => '{{GENDER:$1|ke kuhina}}',
'grouppage-user' => '{{ns:project}}:Mea hoʻohana',
'grouppage-bot' => '{{ns:project}}:Lopako',
-'grouppage-sysop' => '{{ns:project}}:Nā kahu',
-'grouppage-bureaucrat' => '{{ns:project}}:Nā kuhina',
+'grouppage-sysop' => '{{ns:project}}:Nā Kahu',
+'grouppage-bureaucrat' => '{{ns:project}}:Nā Kuhina',
# Rights
'right-read' => 'Heluhelu i nā ʻaoʻao',
'right-hideuser' => 'Pale i ka inoa mea hoʻohana, no laila ʻaʻole hōʻike i ka lehulehu',
'right-unblockself' => 'Paleʻole i kāuiho',
+# Special:Log/newusers
+'newuserlogpage' => 'Moʻolelo haku mea hoʻohana',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'ka hoʻololi ʻana i kēia ʻaoʻao',
'nchanges' => '$1 {{PLURAL:$1|loli|mau loli}}',
'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|mai kāu kipana aku nei}}',
'enhancedrc-history' => 'mōʻaukala',
-'recentchanges' => 'Nā loli hou',
+'recentchanges' => 'Loli Hou',
+'recentchanges-legend' => 'Nā Koho loli hou',
+'recentchanges-feed-description' => 'Hāhai i nā loli houloa i ka wiki ma kēia hānaīke.',
+'recentchanges-label-newpage' => 'Ua haku kēia hoʻololi i kēia ʻaoʻao hou',
+'recentchanges-label-minor' => 'He hoʻololi iki kēia',
+'recentchanges-label-bot' => 'Ua hana ʻia kēia hoʻololi e kekahi pako',
+'recentchanges-label-unpatrolled' => 'ʻAʻole kiaʻi kaʻa ʻia kēia hoʻololi',
+'rcnotefrom' => 'Aia i lalo nā loli mai <strong>$2</strong> (hōʻike a <strong>$1</strong>)',
+'rclistfrom' => 'Hōʻike i nā loli hou mai ka hola $2, $3',
'rcshowhideminor' => '$1 i nā ho‘ololi iki',
'rcshowhideminor-show' => 'Hōʻike',
'rcshowhideminor-hide' => 'Hoʻohūnā',
'rcshowhideliu' => '$1 i nā mea hoʻohana i kāinoa ʻia',
'rcshowhideliu-show' => 'Hōʻike',
'rcshowhideliu-hide' => 'Hoʻohūnā',
-'rcshowhideanons' => '$1 i nā mea hoʻohana i nele ai ka inoa',
+'rcshowhideanons' => '$1 i nā mea hoʻohana inoa ʻole',
'rcshowhideanons-show' => 'Hōʻike',
'rcshowhideanons-hide' => 'Hoʻohūnā',
'rcshowhidepatr' => '$1 i nā hoʻololi kiaʻi kaʻahele',
'rcshowhidemine' => '$1 i ka‘u mau hoʻololi',
'rcshowhidemine-show' => 'Hōʻike',
'rcshowhidemine-hide' => 'Hoʻohūnā',
-'rclinks' => 'E hōʻike i nā loli hanawale, he $1, mai $2 (mau) lā aku nei<br/>$3',
+'rclinks' => 'E hōʻike i nā loli $1 hou, mai $2 (mau) lā aku nei<br />$3',
'diff' => 'ʻokoʻa',
'hist' => 'mōkala',
'hide' => 'Hoʻohūnā',
'minoreditletter' => 'iki',
'newpageletter' => 'ʻAHou',
'boteditletter' => 'pako',
-'rc-enhanced-expand' => 'Hō‘ike i nā ‘ikepili',
-'rc-enhanced-hide' => 'Hoʻohūnā i nā ‘ikepili',
+'rc-enhanced-expand' => 'Hō‘ike i nā kikoʻī',
+'rc-enhanced-hide' => 'Hoʻohūnā i nā kikoʻī',
# Recent changes linked
'recentchangeslinked' => 'Nā loli hou ʻālike',
'recentchangeslinked-feed' => 'Nā loli hou ʻālike',
'recentchangeslinked-toolbox' => 'Nā loli hou ʻālike',
+'recentchangeslinked-title' => 'Nā loli e ʻālike me "$1"',
+'recentchangeslinked-summary' => 'He papahelu o nā loli i hana wale i nā ʻaoʻao loulou ʻia e kekahi ʻaoʻao kikoʻī (aiʻole i nā lālā o kekahi mahele kikoʻī) kēia.
+<strong>Hoʻokāʻele</strong> nā ʻaoʻao ma [[Special:Watchlist|kāu papakiaʻi]].',
'recentchangeslinked-page' => 'Inoa ʻaoʻao:',
+'recentchangeslinked-to' => 'Hōʻike i nā loli i nā ʻaoʻao e loulou ʻia ma kahi o ka ʻaoʻao i hāʻawi ʻia',
# Upload
-'upload' => 'Hoʻouka i ka waihona',
+'upload' => 'Hoʻouka waihona',
'uploadbtn' => 'Hoʻouka i ka waihona',
'uploadnologin' => 'ʻE‘e ʻole',
'uploaderror' => 'Hewa hoʻouka',
+'uploadlogpage' => 'Moʻolelo hoʻouka',
'filename' => 'Inoa waihona',
'filedesc' => 'Hōʻuluʻulu manaʻo',
'fileuploadsummary' => 'Hōʻuluʻulu manaʻo:',
'filesource' => 'Kumu:',
-'uploadedfiles' => 'Waihona hoʻoukaia',
+'uploadedfiles' => 'Waihona hoʻouka ʻia',
'savefile' => 'Waihona mālama',
-'uploadedimage' => 'hoʻouka ʻia iā "[[$1]]"',
+'uploadedimage' => 'ua hoʻouka iā "[[$1]]"',
'upload-source' => 'Waihona kūmole',
-'sourcefilename' => 'Inoawaihona kūmole:',
+'sourcefilename' => 'Inoa waihona kūmole:',
'sourceurl' => 'URL kūmole:',
+'license' => 'Laikini:',
+'license-header' => 'Laikini',
+
# Special:ListFiles
'listfiles_name' => 'Inoa',
# File description page
'file-anchor-link' => 'Waihona',
-'filehist' => 'Mo‘olelo o ka waihona',
-'filehist-current' => 'o kēia manawa',
-'filehist-datetime' => 'Manawa',
-'filehist-thumb' => 'Kiʻiliʻiliʻi',
+'filehist' => 'Mōʻaukala waihona',
+'filehist-help' => 'Kāomi ma ka lā/hola no ka nānā ʻana i ka waihona ma kēlā manawa.',
+'filehist-revert' => 'hoʻihoʻi',
+'filehist-current' => 'okamanawa',
+'filehist-datetime' => 'Lā/Hola',
+'filehist-thumb' => 'Kiʻiliʻi',
+'filehist-thumbtext' => 'Ke kiʻiliʻi no ka mana ma $1',
'filehist-user' => 'Mea ho‘ohana',
-'filehist-dimensions' => 'Nā nui',
+'filehist-dimensions' => 'Nā Nui',
'filehist-filesize' => 'Nui o ka waihona',
-'filehist-comment' => 'Manaʻo',
-'imagelinks' => 'Nā loulou faila',
+'filehist-comment' => 'Kaumanaʻo',
+'imagelinks' => 'Nā Hana waihona',
'linkstoimage' => 'Loulou {{PLURAL:$1|kekahi ‘ao‘ao|kēia mau ‘ao‘ao $1}} i kēia waihona:',
+'nolinkstoimage' => 'ʻAʻohe ʻaoʻao e loulou i kēia waihona.',
+'sharedupload-desc-here' => 'ʻO kēia waihona mai $1 a hiki paha ke hana ʻia mai nā papahana ʻē aʻe.
+Aia i lalo ka hōʻike ʻano [mai ka ʻaoʻao hōʻike ʻano waihona $2].',
# File deletion
'filedelete-comment' => 'Kumu:',
# Random page
-'randompage' => 'He akikala kaulele',
+'randompage' => 'ʻAtikala Kaulele',
# Statistics
-'statistics' => 'Papa helu',
+'statistics' => 'ʻIkepilihelu',
-'brokenredirects-edit' => 'e ho‘ololi',
-'brokenredirects-delete' => 'e kāpae',
+'brokenredirects-edit' => 'ho‘ololi',
+'brokenredirects-delete' => 'holoi',
'withoutinterwiki-submit' => 'Hō‘ike',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|‘ai|‘ai}}',
+'nbytes' => '$1 {{PLURAL:$1|‘ai|mau ‘ai}}',
'nlinks' => '$1 {{PLURAL:$1|loulou|loulou}}',
-'nmembers' => '$1 {{PLURAL:$1|lālā|lālā}}',
+'nmembers' => '$1 {{PLURAL:$1|lālā|mau lālā}}',
'wantedcategories' => 'Nā māhele makemake',
+'prefixindex' => 'Nā ʻAoʻao apau me ka pākuʻina kau mua',
'shortpages' => 'Nā ʻaoʻao pōkole',
'longpages' => 'Nā ʻaoʻao lōʻihi',
-'newpages' => 'Nā ‘ao‘ao hou',
+'usercreated' => '{{GENDER:$3|Haku ʻia}} i ka lā $1 ma ka hola $2',
+'newpages' => 'Nā ‘Ao‘ao hou',
'newpages-username' => "Inoa mea ho'ohana:",
'ancientpages' => 'Nā ‘ao‘ao kahiko loa',
-'move' => 'E ho‘ololi i ka inoa',
+'move' => 'E hoʻoneʻe',
'movethispage' => 'E hoʻoneʻe i kēia ʻaoʻao',
'pager-newer-n' => '{{PLURAL:$1|1 hou aku|$1 hou aku}}',
-'pager-older-n' => '{{PLURAL:$1|1 kekahi iho|$1 kekahi iho}}',
+'pager-older-n' => '{{PLURAL:$1|1 aku nei|$1 aku nei}}',
# Book sources
'booksources' => 'Kumu puke',
+'booksources-search-legend' => 'Huli i nā kūmole puke',
'booksources-go' => 'E huli',
# Special:Log
-'log' => 'Nā mo‘olelo',
-'all-logs-page' => 'Nā moʻolelo āpau',
+'log' => 'Nā Mo‘olelo',
+'all-logs-page' => 'Nā Moʻolelo lehulehu apau',
# Special:AllPages
-'allpages' => 'Nā ‘ao‘ao loa apau',
+'allpages' => 'Nā ‘Ao‘ao apau',
'alphaindexline' => '$1 i $2',
'nextpage' => 'Mea aʻe ($1)',
'prevpage' => 'Mea ma mua aʻe ($1)',
-'allarticles' => 'Nā mo‘olelo apau loa',
+'allarticles' => 'Nā ʻAoʻao apau',
'allpagessubmit' => 'E huli',
# Special:Categories
-'categories' => 'Nā mahele',
+'categories' => 'Nā Māhele',
# Special:DeletedContributions
-'deletedcontributions' => 'Nā ha‘awina o ka inoa mea ho‘ohana i kāpae ‘ia ai',
-'deletedcontributions-title' => 'Nā ha‘awina o ka inoa mea ho‘ohana i kāpae ‘ia ai',
+'deletedcontributions' => 'Nā ha‘awina mea ho‘ohana i holoi ‘ia',
+'deletedcontributions-title' => 'Nā ha‘awina mea ho‘ohana i holoi ‘ia',
# Special:LinkSearch
-'linksearch' => 'Loulou waho wahi',
+'linksearch' => 'Huli loulou kūwaho',
'linksearch-ok' => 'Huli',
+'linksearch-line' => 'Loulou ʻia ʻo $1 mai $2',
# Special:ListUsers
'listusers-submit' => 'Hō‘ike',
# Special:ListGroupRights
-'listgrouprights-members' => '(papa o nā lālā)',
+'listgrouprights-members' => '(papainoa o nā lālā)',
# Email user
'emailuser' => 'E leka uila i kēia mea ho‘ohana',
-'emailmessage' => 'Memo:',
+'emailmessage' => 'Pūlono:',
# Watchlist
-'watchlist' => 'Kaʻu papa nānā pono',
-'mywatchlist' => 'Ka‘u papa nānā pono',
+'watchlist' => 'Kaʻu papakiaʻi',
+'mywatchlist' => 'Ka‘u papakiaʻi',
+'watchlistfor2' => 'No $1 $2',
'removedwatchtext' => 'Wehe ʻia ʻo "[[:$1]]" mai [[Special:Watchlist|kāu papa nānā pono]].',
'watch' => 'E kia‘i',
'watchthispage' => 'E nānā pono i kēia mea',
-'unwatch' => 'E wehe ke kia‘i',
-'watchlist-details' => '{{PLURAL:$1|$1|$1}} a kāu papa nānā pono ʻaoʻao, me ke koe ʻana o nā ʻaoʻao kūkākūkā.',
-'wlshowlast' => 'Hōʻike $1 hola hope $2 lā hope $3',
+'unwatch' => 'Kiaʻi ʻole',
+'watchlist-details' => '{{PLURAL:$1|$1 ʻaoʻao|$1 mau ʻaoʻao}} a kāu papakiaʻi, me ʻole ke koe ʻana o nā ʻaoʻao walaʻau.',
+'wlshowlast' => 'Hōʻike $1 hola aku nei $2 lā aku nei $3',
+'watchlist-options' => 'Nā Koho papakiaʻi',
# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Ke kia‘i nei...',
+'watching' => 'Kia‘i nei...',
'unwatching' => 'Ke wehe nei i ke kiaʻi...',
'changed' => 'ua loli ‘ia',
# Delete
-'deletepage' => 'Kāpae ʻaoʻao',
-'actioncomplete' => 'Ua pau',
-'deletedtext' => 'Ua kāpae ʻia ʻo "$1".
-E ʻike iā $2 no ka papa o nā kāpae ʻana hou.',
-'dellogpage' => 'Mo‘olelo kāpae',
-'dellogpagetext' => 'He helu o nā mea i kāpae ʻia hou i lalo.',
-'deletionlog' => 'mo‘olelo kāpae',
+'deletepage' => 'Holoi ʻaoʻao',
+'actioncomplete' => 'Hana kūleʻa',
+'actionfailed' => 'Hana pohō',
+'deletedtext' => 'Ua holoi ʻia ʻo "$1".
+E ʻike iā $2 no ka papa o nā holoi hou.',
+'dellogpage' => 'Mo‘olelo holoi',
+'dellogpagetext' => 'He papahelu o nā holoi hou i lalo.',
+'deletionlog' => 'mo‘olelo holoi',
'deletecomment' => 'Kumu:',
'deleteotherreason' => 'Kumu ʻē aʻe/hoʻokomo',
'deletereasonotherlist' => 'Kumu ʻē aʻe',
-'delete-edit-reasonlist' => 'Ho‘opololei i nā kumu no ke kāpae ‘ana',
+'delete-edit-reasonlist' => 'Hoʻololi i nā kumu holoi',
# Rollback
-'rollbacklink' => 'ho‘i',
+'rollbacklink' => 'ho‘ihoʻi',
# Protect
-'protectedarticle' => 'ua pale ʻia "[[$1]]"',
+'protectlogpage' => 'Moʻolelo palekana',
+'protectedarticle' => 'ua hoʻomalu iā "[[$1]]"',
'prot_1movedto2' => 'Ua hoʻoneʻe ʻo [[$1]] iā [[$2]]',
'protectcomment' => 'Kumu:',
-'protect-default' => 'ʻAe nā mea hoʻohana a pau',
-'protect-level-sysop' => 'Nā kahu wale nō',
+'protect-default' => 'ʻAe i nā mea hoʻohana a pau',
+'protect-level-sysop' => 'Nā Kahu wale nō',
'protect-cantedit' => 'ʻAʻole hiki iā ʻoe ke hoʻololi i nā kūlana māmalu o kēia ʻaoʻao, no ka mea, ʻaʻohe āu ʻae no ka hoʻololi ʻana.',
'protect-expiry-options' => '1 hola:1 hour,1 lā:1 day,1 pule:1 week,2 pule:2 weeks,1 mahina:1 month,3 mahina:3 months,6 mahina:6 months,1 makahiki:1 year,pau ʻole:infinite',
'restriction-type' => 'ʻAe ʻia:',
# Restrictions (nouns)
-'restriction-edit' => 'E ho‘ololi',
-'restriction-move' => "E ho'ololi i ka inoa",
+'restriction-edit' => 'Hoʻololi',
+'restriction-move' => 'Hoʻoneʻe',
# Undelete
'undeletebtn' => 'Ho‘āla',
'undeletelink' => 'nānā/ho‘āla',
+'undeleteviewlink' => 'hōʻike',
'undelete-search-submit' => 'Huli',
# Namespace form on various pages
-'namespace' => 'Wahi inoa',
+'namespace' => 'Lewainoa:',
+'invert' => 'Kuapo i ke koho',
'blanknamespace' => '(‘ano nui)',
# Contributions
-'contributions' => 'Nā ha‘awina o kēia mea ho‘ohana',
-'mycontris' => 'Koʻu mau haʻawina',
-'contribsub2' => 'No $1 ($2)',
-'uctop' => '(wēkiu)',
-'month' => 'Mai ka mahina (me mua):',
-'year' => 'Mai ka makahiki (me mua):',
-
-'sp-contributions-deleted' => 'Nā ha‘awina o ka inoa mea ho‘ohana i kāpae ‘ia ai',
-'sp-contributions-talk' => 'Kūkākūkā',
-'sp-contributions-userrights' => 'Ho‘oponopono ‘ana o nā kuleana',
+'contributions' => 'Nā haʻawina o ka {{GENDER:$1|mea hoʻohana}}',
+'contributions-title' => 'Nā Hāʻawina mea hoʻohana no $1',
+'mycontris' => 'Kaʻu mau haʻawina',
+'contribsub2' => 'No {{GENDER:$3|$1}} ($2)',
+'uctop' => '(okamanawa)',
+'month' => 'Mai ka mahina (mamua aku nei nō hoʻi):',
+'year' => 'Mai ka makahiki (mamua aku nei nō hoʻi):',
+
+'sp-contributions-newbies' => 'Hōʻike i nā hāʻawina o nā moʻokāki hou wale nō',
+'sp-contributions-blocklog' => 'moʻolelo hoʻopale',
+'sp-contributions-deleted' => 'nā ha‘awina o ka inoa mea ho‘ohana i holoi ‘ia',
+'sp-contributions-uploads' => 'nā hoʻouka',
+'sp-contributions-logs' => 'nā moʻolelo',
+'sp-contributions-talk' => 'walaʻau',
+'sp-contributions-userrights' => 'ka hoʻoponopono ʻana o nā kūleana mea hoʻohana',
'sp-contributions-search' => 'Huli no nā haʻawina',
+'sp-contributions-username' => 'Wahinoho IP aiʻole inoa mea hoʻohana:',
+'sp-contributions-toponly' => 'Hōʻike wale nō i nā hoʻololi kāmua hou loa',
'sp-contributions-submit' => 'Huli',
# What links here
-'whatlinkshere' => 'Nā mea e loulou iho ai',
+'whatlinkshere' => 'He aha ka mea e loulou iho ai',
+'whatlinkshere-title' => 'Nā ʻAoʻao e loulou iā "$1"',
'whatlinkshere-page' => '‘Ao‘ao:',
-'nolinkshere' => "‘A‘ole he ‘ao‘ao e loulou ai iā '''[[:$1]]'''.",
-'isredirect' => 'ʻaoʻao hoʻoili ʻana',
-'whatlinkshere-prev' => '{{PLURAL:$1|mua|mua $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|hope|hope $1}}',
+'linkshere' => 'Loulou kēia mau ʻaoʻao iā <strong>[[:$1]]</strong>:',
+'nolinkshere' => "ʻAʻohe ‘ao‘ao e loulou iā '''[[:$1]]'''.",
+'isredirect' => 'ʻaoʻao kia hou',
+'istemplate' => 'kumo',
+'isimage' => 'loulou waihona',
+'whatlinkshere-prev' => '{{PLURAL:$1|mua aku nei|$1 mua aku nei}}',
+'whatlinkshere-next' => '{{PLURAL:$1|hou aʻe|$1 hou aʻe}}',
'whatlinkshere-links' => '← nā loulou',
+'whatlinkshere-hideredirs' => '$1 i nā kiahou',
+'whatlinkshere-hidetrans' => '$1 i nā kumo',
'whatlinkshere-hidelinks' => '$1 i nā loulou',
+'whatlinkshere-hideimages' => '$1 i nā loulou waihona',
'whatlinkshere-filters' => 'Kānana',
# Block/unblock
-'blockip' => 'E ke‘a i kēia mea ho‘ohana',
+'blockip' => 'Pale i kēia mea ho‘ohana',
'ipbexpiry' => 'Pau āhea:',
'ipbreason' => 'Kumu:',
-'ipbsubmit' => 'E ke‘a i kēia mea ho‘ohana',
-'ipbother' => 'ʻĒ aʻe manawa:',
-'ipboptions' => '2 hola:2 hours,1 lā:1 day,3 lā:3 days,1 pule:1 week,2 pule:2 weeks,1 mahina:1 month,3 mahina:3 months,6 mahina:6 months,1 makahiki:1 year,pau ʻole:infinite',
-'badipaddress' => 'Mana ‘ole ka wahi noho IP',
+'ipbsubmit' => 'Pale i kēia mea ho‘ohana',
+'ipbother' => 'Manawa ʻē aʻe:',
+'ipboptions' => '2 mau hola:2 hours,1 lā:1 day,3 mau lā:3 days,1 pule:1 week,2 mau pule:2 weeks,1 mahina:1 month,3 mau mahina:3 months,6 mau mahina:6 months,1 makahiki:1 year,wā pau ʻole:infinite',
+'badipaddress' => 'Wahinoho IP hewa',
+'ipblocklist' => 'Nā Mea hoʻohana pale ʻia',
'ipblocklist-submit' => 'Huli',
'infiniteblock' => 'pau ʻole',
-'anononlyblock' => '‘A‘ohe i hō‘ike‘ia ka inoa wale nō',
-'blocklink' => 'e keʻa',
-'unblocklink' => 'mai pale',
-'change-blocklink' => 'hoʻololi ka palena',
-'contribslink' => 'nā ha‘awina',
+'anononlyblock' => 'nā inoaʻole wale nō',
+'blocklink' => 'hoʻopale',
+'unblocklink' => 'hoʻopale ʻole',
+'change-blocklink' => 'hoʻololi i ka palena',
+'contribslink' => 'ha‘awina',
+'blocklogpage' => 'Moʻolelo hoʻopale',
+'blocklogentry' => 'ua hoʻopale ʻia ʻo [[$1]] no ka manawa o $2 $3',
+'block-log-flags-nocreate' => 'ua hoʻopale ʻia ke kāinoa moʻokāki ʻana',
# Move page
'move-page-legend' => 'Hoʻoneʻe i ka ʻaoʻao',
'movearticle' => 'E hoʻoneʻe i ka ʻaoʻao:',
'newtitle' => 'I ka inoa hou:',
-'move-watch' => 'E nānā pono i kēia mea',
+'move-watch' => 'Kiaʻi i ka ʻaoʻao kumu a me ka ʻaoʻao māka',
'movepagebtn' => 'Hoʻoneʻe i ka ʻaoʻao',
'pagemovedsub' => 'Kūleʻa ka hoʻoneʻe ʻana',
'movepage-moved' => '\'\'\'Ua hoʻoneʻe ʻia ʻo "$1" iā "$2"\'\'\'',
+'movelogpage' => 'Hoʻoneʻe i ka moʻolelo',
'movereason' => 'Kumu:',
-'delete_and_move' => 'E kāpae a e ho‘ololi i ka inoa',
-'delete_and_move_confirm' => '‘Ae, e kāpae i ka ‘ao‘ao',
+'revertmove' => 'hoʻihoʻi',
+'delete_and_move' => 'Holoi a hoʻoneʻe',
+'delete_and_move_confirm' => '‘Ae, e holoi i ka ‘ao‘ao',
# Export
+'export' => 'Kāpuka ʻaoʻao',
'export-addcat' => 'Ho‘ohui',
# Namespace 8 related
-'allmessages' => 'Nā kauoha o ke kahua',
+'allmessages' => 'Pūlono ʻōnaehana',
'allmessagesname' => 'Inoa',
'allmessagesdefault' => 'Kikokikona pa‘amau',
'allmessagescurrent' => 'Kikokikona i kēia manawa',
# Thumbnails
-'thumbnail-more' => 'ho‘onui',
+'thumbnail-more' => 'Ho‘onui',
+'thumbnail_error' => 'Loaʻa i ka hewa ka haku ʻana o ke kiʻiliʻi: $1',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Kāu inoa mea ho‘ohana',
-'tooltip-pt-mytalk' => 'Kāu ‘aoʻao ʻōlelo',
-'tooltip-pt-preferences' => 'ka‘u makemake',
-'tooltip-pt-watchlist' => 'Ka papa o nā ʻaoʻao o kou nānā ʻana no nā loli',
+'tooltip-pt-userpage' => 'Kāu ʻaoʻao mea hoʻohana',
+'tooltip-pt-mytalk' => 'Kāu walaʻau',
+'tooltip-pt-preferences' => 'Kāu makemake',
+'tooltip-pt-watchlist' => 'He papahelu o nā ʻaoʻao āu e kiaʻi nei no nā loli',
'tooltip-pt-mycontris' => 'Kāu mau ha‘awina',
'tooltip-pt-login' => 'Pai ‘ia ‘oe e ‘e‘e, akā, ‘a‘ole ia he koina',
-'tooltip-pt-logout' => 'E ha‘alele',
-'tooltip-ca-talk' => 'Kūkākūkā e pili ana i kēia ‘ao‘ao',
+'tooltip-pt-logout' => 'Ha‘alele',
+'tooltip-ca-talk' => 'Kūkākūkā e pili ana i ka ʻaoʻao mealoko',
'tooltip-ca-edit' => 'Hiki iā ‘oe ke ho‘ololi i kēia ‘ao‘ao. Ma mua o ka mālama ʻia ʻana, e ho‘ohana i ke pihi nāmua, ke ‘olu‘olu.',
-'tooltip-ca-addsection' => 'Hoʻomaka i kekahi māhele hou',
-'tooltip-ca-viewsource' => 'Pale ʻia kēia ʻaoʻao.
-Hiki iā ʻoe ke ʻikena i kāna molekumu.',
-'tooltip-ca-history' => 'Ko kēia ʻaoʻao mau kāmua hope',
-'tooltip-ca-protect' => 'Ho‘omalu i keia ‘ao‘ao',
-'tooltip-ca-delete' => 'E kāpae i kēia mo‘olelo',
+'tooltip-ca-addsection' => 'Hoʻomaka i kekahi pauku hou',
+'tooltip-ca-viewsource' => 'Hoʻomalu ʻia kēia ʻaoʻao.
+Hiki iā ʻoe ke ʻike i kāna kūmole.',
+'tooltip-ca-history' => 'Nā kāmua mamua o kēia ʻaoʻao',
+'tooltip-ca-protect' => 'E ho‘omalu i keia ‘ao‘ao',
+'tooltip-ca-delete' => 'E holoi i kēia ʻaoʻao',
'tooltip-ca-move' => 'E hoʻoneʻe i kēia ʻaoʻao',
-'tooltip-ca-watch' => 'E nānā pono i kēia mea',
+'tooltip-ca-watch' => 'Hoʻohui i kāu papakiʻai',
+'tooltip-ca-unwatch' => 'Hoʻowehe i kēia ʻaoʻao mai kāu papakiaʻi',
'tooltip-search' => 'Huli iā {{SITENAME}}',
'tooltip-search-go' => 'Kele i kekahi ʻaoʻao me kēia inoa inā hiki ke loaʻa',
'tooltip-search-fulltext' => 'Huli i nā ʻaoʻao no kēia kikokikona',
'tooltip-p-logo' => 'Kele i ka papa kinohi',
'tooltip-n-mainpage' => 'Kele i ka papa kinohi',
'tooltip-n-mainpage-description' => 'Kele i ka papa kinohi',
-'tooltip-n-portal' => 'E pili ana ka pāhana, nā hana hiki, nā wahi no ka loaʻa ʻana',
-'tooltip-n-currentevents' => 'ʻIke i nā nū hou',
+'tooltip-n-portal' => 'No ka papahana, nā hana hiki, nāhi no ka loaʻa ʻana',
+'tooltip-n-currentevents' => 'Loaʻa nā ʻike kūmole e pili ana i nā nūhou',
'tooltip-n-recentchanges' => 'Nā loli hou ma ka wiki',
-'tooltip-n-randompage' => 'Hōʻike kekahi ʻaoʻao kaulele',
-'tooltip-n-help' => 'Ka wahi e kōkua ai iā ‘oe',
-'tooltip-t-whatlinkshere' => 'Nā ‘ao‘ao a pau i loulou mai ai',
+'tooltip-n-randompage' => 'Hoʻouka i kekahi ʻaoʻao kaulele',
+'tooltip-n-help' => 'Kahi e aʻo mai',
+'tooltip-t-whatlinkshere' => 'He papahelu o nā ʻaoʻao wiki apau e loulou i ʻaneʻi',
+'tooltip-t-recentchangeslinked' => 'Nā loli hou i nā ʻaoʻao i loulou ʻia mai kēia ʻaoʻao',
+'tooltip-feed-atom' => 'Hānaīke Atom no kēia ʻaoʻao',
+'tooltip-t-contributions' => 'He papahelu o nā hāʻawina o ka mea hoʻohana',
'tooltip-t-emailuser' => 'Leka uila i kēia mea hoʻohana',
'tooltip-t-upload' => 'Ho‘ouka i nā waihona',
-'tooltip-t-specialpages' => 'Papa inoa o nā ʻaoʻao nui apau',
+'tooltip-t-specialpages' => 'He papainoa o nā ʻaoʻao kūikawā apau',
'tooltip-t-print' => 'Mana paʻi pono o kēia ʻaoʻao',
'tooltip-t-permalink' => 'Loulou paʻa no kēia kāmua o ka ʻaoʻao',
-'tooltip-ca-nstab-special' => 'He papa nui kēia; ʻaʻole hiki iā ʻoe ke hoʻololi',
+'tooltip-ca-nstab-main' => 'Nānā i ka ʻaoʻao mealoko',
+'tooltip-ca-nstab-user' => 'Nānā i ka ʻaoʻao mea hoʻohana',
+'tooltip-ca-nstab-special' => 'He ʻaoʻao kūikawā kēia; ʻaʻole hiki iā ʻoe ke hoʻololi',
'tooltip-ca-nstab-project' => 'Nānā i ka ‘ao‘ao papahana',
-'tooltip-ca-nstab-image' => 'Nānā i ka ʻaoʻao faila',
+'tooltip-ca-nstab-image' => 'Nānā i ka ʻaoʻao waihona',
+'tooltip-ca-nstab-template' => 'Nānā i ke anakuhi',
'tooltip-ca-nstab-help' => 'Nānaina i ka ʻaoʻao kōkua',
-'tooltip-minoredit' => 'Wae i kēia hoʻopololei me he hoʻopololei iki',
-'tooltip-save' => 'Mālama i kāu ho‘opololei',
-'tooltip-watch' => 'E nānā pono i kēia mea',
+'tooltip-ca-nstab-category' => 'Nānā i ka ‘ao‘ao mahele',
+'tooltip-minoredit' => 'Kaha i kēia me he hoʻololi iki',
+'tooltip-save' => 'Mālama i kāu mau loli',
+'tooltip-preview' => 'E nāmua i kāu mau loli ma mua o ka mālama ʻana ke ʻoluʻolu!',
+'tooltip-diff' => 'Hōʻike i nā loli āu i hana ai i kēia kikokikona',
+'tooltip-compareselectedversions' => 'E ʻike i na ʻokoʻa ma waena o nā kāmua ʻelua i koho ʻia o kēia ʻaoʻao',
+'tooltip-watch' => 'Hoʻohui i kāu papakiʻai',
+'tooltip-rollback' => 'Hoʻihoʻi ʻo "Hoʻihoʻi" i nā hoʻololi i kēia ʻaoʻao o ka mea hāʻawi hopeloa i hoʻokahi kāomi',
+'tooltip-undo' => 'Hoʻihoʻi ʻo "Hōʻole" i kēia hoʻololi a wehe ia i ka ʻaoʻao hoʻololi i ke ʻano nāmua. ʻAe ia i ka hoʻohui ʻana i kekahi kumu i loko o ka hōʻuluʻulu manaʻo.',
+'tooltip-summary' => 'Kikokiko i kekahi hōʻuluʻulu manaʻo pōkole',
# Browsing diffs
+'previousdiff' => '← Hoʻololi aku nei',
'nextdiff' => 'Hoʻololi hou aʻe →',
# Media information
-'file-info-size' => '$1 x $2 kiʻiʻuku, nui faila: $3, ʻano MIME: $4',
-'show-big-image' => 'Miomio piha',
+'file-info-size' => '$1 x $2 kiʻiʻuku, nui waihona: $3, ʻano MIME: $4',
+'file-nohires' => 'Loaʻa ʻole ka miomio aʻe.',
+'svg-long-desc' => 'Waihona SVG, $1 x $2 mau pikela, nui waihona: $3',
+'show-big-image' => 'Waihona kumu',
# Special:NewFiles
'ilsubmit' => 'Huli',
+# Bad image list
+'bad_image_list' => 'ʻO kēia ka hulu:
+
+Noʻonoʻo pono wale no i nā ʻikamu papahelu (nā laina e hoʻomaka ʻia me *).
+Pono ka loulou mua loa ma kekahi laina e loulou i kekahi waihona ʻino.
+Noʻonoʻo ʻia nā loulou heleiho ma kēlā laina like i nā kūʻē lula, he laʻana kēia, nā ʻaoʻao e loaʻa i ka waihona i loko o ka laina.',
+
+# Metadata
+'metadata' => 'ʻIkepiliMeta',
+'metadata-help' => 'Loaʻa i kēia waihona nā ʻike ʻē aʻe i hoʻohui ʻia paha mai kekahi pahupaʻakiʻi aiʻole kekahi mīkinikopekiʻi i hana ʻia no ka haku ʻana aiʻole ka hoʻokamepiuila ʻana o ia.
+Inā ua kāloli ʻia ka waihona mai kona ʻano kumu, hōʻike piha ʻole i kekahi o nā kikoʻī o ka waihona i kāloli ʻia.',
+'metadata-fields' => 'E hoʻokomo ʻia ana nā kula ʻikepiliMeta kiʻi i loko o kēia pūlono ma ka hōʻike ʻaoʻao kiʻi oiai ka hoʻoliʻi ʻana o ke pākaukau ʻikepiliMeta.
+Hoʻohuna paʻamau i nā mea ʻē aʻe
+* kahana lōkō
+* kaʻano
+* kalāholakumu
+* holahuʻena
+* heluf
+* kūlanawikiiso
+* loaaniani
+* meahana
+* kūleanakope
+* hōʻikeʻanokiʻi
+* lakikūgps
+* lonikūgps
+* kiʻekiʻegps',
+
# 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'apau',
-'namespacesall' => 'apau',
-'monthsall' => 'āpau',
+'watchlistall2' => 'nā mea apau',
+'namespacesall' => 'nā mea apau',
+'monthsall' => 'nā mea apau',
# action=purge
'confirm_purge_button' => 'Hiki nō',
# Multipage image navigation
-'imgmultipageprev' => '← mea ma mua aʻe',
-'imgmultipagenext' => 'mea aʻe →',
+'imgmultipageprev' => '← ʻaoʻao aku nei',
+'imgmultipagenext' => 'ʻaoʻao hou aʻe →',
# Table pager
-'table_pager_next' => 'Mea aʻe',
-'table_pager_prev' => 'Mea ma mua aʻe',
+'table_pager_next' => 'ʻAoʻao hou aʻe',
+'table_pager_prev' => 'ʻAoʻao aku nei',
# Auto-summaries
-'autosumm-replace' => "Ke pani nei i ka ‘ao‘ao me '$1'",
-'autoredircomment' => 'Ke alaka‘i nei hou i [[$1]]',
+'autosumm-replace' => "Ke pani nei i ka mealoko me '$1'",
+'autoredircomment' => 'Kiahou i ka ʻaoʻao iā [[$1]]',
'autosumm-new' => "Ua hoʻokumu ʻia kekahi ʻaoʻao me '$1'",
# Live preview
'livepreview-loading' => 'Ke ho‘ouka nei…',
# Watchlist editor
-'watchlistedit-normal-title' => 'E ho‘opololei i ka‘u papa nānā pono',
+'watchlistedit-normal-title' => 'Hoʻololi i ka papakiaʻi',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Nānā i nā loli ʻālike',
+'watchlisttools-edit' => 'Nānā a hoʻololi i ka papakiaʻi',
+'watchlisttools-raw' => 'Hoʻololi i ka papakiaʻi maka',
+
+# Core parser functions
+'duplicate-defaultsort' => '<strong>E akahele:</strong> Mauʻaʻe ke kī kaʻalike paʻamau "$2" i ke kī kaʻalike paʻamau "$1" mai ka wā mua.',
# Special:Version
-'version-specialpages' => 'Nā ‘ao‘ao kūikawā',
+'version-specialpages' => 'Nā ‘Ao‘ao kūikawā',
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Huli',
# Special:SpecialPages
-'specialpages' => 'Nā ‘ao‘ao kūikawā',
+'specialpages' => 'Nā ‘Ao‘ao kūikawā',
+
+# External image whitelist
+'external_image_whitelist' => ' #Waiho i kēia laina<pre>
+#Kau i nā hapa haʻi maʻamau (nā hapa e kau ʻia ma waena o nā //) i lalo
+#Hoʻohālikelike ia mea me nā URL o nā kiʻi kūwaho (loulouhūnāloko)
+#Hōʻike ʻia ia mea e hoʻohālikelike me he mau kiʻi, inā ʻaʻole pēlā e hōʻike wale me he loulou no ke kiʻi wale nō
+#Mālama ʻia nā laina e hoʻomaka me ka # e like me nā kaumanaʻo
+#Kākau wale, mai hopohopo e pili ana nā ʻaui
+
+#Kau i nā hapa ligaka apau ma luna o kēia laina. Wahiho i kēia laina</pre>',
# Special:Tags
-'tags-edit' => 'e hoʻololi',
+'tag-filter' => 'Kānana [[Special:Tags|lepili]]:',
+'tags-edit' => 'hoʻololi',
# Special:ExpandTemplates
'expand_templates_ok' => 'Hiki nō',
'tog-ccmeonemails' => 'לשלוח אליי העתקים של הודעות דואר אלקטרוני ששלחתי למשתמשים אחרים',
'tog-diffonly' => 'ביטול הצגת תוכן הדף מתחת להשוואות הגרסאות',
'tog-showhiddencats' => 'הצגת קטגוריות מוסתרות',
-'tog-noconvertlink' => 'ביטול המרת קישורים לכותרות',
'tog-norollbackdiff' => 'השמטת ההבדלים בין הגרסאות לאחר ביצוע שחזור',
'tog-useeditwarning' => 'הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו',
'tog-prefershttps' => 'תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון',
'createacct-another-realname-tip' => 'השם האמיתי הוא אופציונאלי.
אם תבחרו לספקו, הוא ישמש לייחוס עבודת המשתמש אליו.',
'pt-login' => 'כניסה לחשבון',
+'pt-login-button' => 'כניסה',
'pt-createaccount' => 'יצירת חשבון',
'pt-userlogout' => 'יציאה מהחשבון',
'revdelete-show-file-submit' => 'כן',
'revdelete-selected' => "'''ה{{PLURAL:$2|גרסה שנבחרה|גרסאות שנבחרו}} מתוך הדף [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|פעולת היומנים שנבחרה|פעולות היומנים שנבחרו}}:'''",
-'revdelete-text' => "'''גרסאות ופעולות יומנים שנמחקו עדיין תופענה בהיסטוריית הדף ובדפי היומנים, אך חלקים מהתוכן שלהן לא יהיה זמין לציבור.'''
-מפעילי מערכת אחרים באתר עדיין יוכלו לגשת לתוכן הנסתר ויוכלו לשחזר אותו שוב דרך הממשק הזה, אלא אם כן תוגדרנה הגבלות נוספות.",
'revdelete-confirm' => 'אנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].',
'revdelete-suppress-text' => "יש להשתמש בהסתרה מלאה '''אך ורק''' במקרים הבאים:
* מידע שעלול להיות לשון הרע
'search-file-match' => '(התאמה בתוכן הקובץ)',
'search-suggest' => 'האם התכוונת ל: $1',
'search-interwiki-caption' => 'מיזמי אחות',
-'search-interwiki-default' => 'ת×\95צ×\90×\95ת ×\91{{GRAMMAR:תחילית|$1}}:',
+'search-interwiki-default' => 'ת×\95צ×\90×\95ת ×\9e{{GRAMMAR:תחילית|$1}}:',
'search-interwiki-more' => '(עוד)',
'search-relatedarticle' => 'קשור',
'searcheverything-enable' => 'חיפוש בכל מרחבי השם',
'delete-edit-reasonlist' => 'עריכת סיבות המחיקה',
'delete-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקת דפים כאלה הוגבלה כדי למנוע פגיעה בביצועי האתר.',
'delete-warning-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.',
-'deleting-backlinks-warning' => "'''אזהרה:''' דפים אחרים מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
+'deleting-backlinks-warning' => "'''אזהרה:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
# Rollback
'rollback' => 'שחזור עריכות',
'undo-failure' => 'इस बीच अन्य बदलाव होने के कारण यह संपादन पूर्ववत करना संभव नहीं है।',
'undo-norev' => 'यह बदलाव वापिस नहीं कर पाये हैं क्योंकि या तो इसे पहले से पलटा दिया गया है या फिर पृष्ठ हटा दिया गया है।',
'undo-nochange' => 'ऐसा लगता है कि इस सम्पादन को पहले ही पूर्ववत कर दिया गया है।',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|वारà¥\8dता]]) दà¥\8dवारा à¤\95िà¤\8f बदलाव $1 à¤\95à¥\8b पà¥\82रà¥\8dववत à¤\95ियà¥\87',
-'undo-summary-username-hidden' => 'à¤\9bà¥\81पाà¤\8f à¤\97à¤\8f सदसà¥\8dय दà¥\8dवारा à¤\95ियà¥\87 सà¤\82शà¥\8bधन $1 को पूर्ववत किया',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|वारà¥\8dता]]) दà¥\8dवारा à¤\95िà¤\8f बदलाव $1 à¤\95à¥\8b पà¥\82रà¥\8dववत à¤\95िया',
+'undo-summary-username-hidden' => 'à¤\9bà¥\81पाà¤\8f à¤\97à¤\8f सदसà¥\8dय दà¥\8dवारा à¤\95ियà¥\87 बदलाव $1 को पूर्ववत किया',
# Account creation failure
'cantcreateaccounttitle' => 'खाता खोल नहीं सकते',
'revdelete-show-file-submit' => 'हाँ',
'revdelete-selected' => "'''[[:$1]] {{PLURAL:$2|का चुना हुआ|के चुने हुए}} अवतरण:'''",
'logdelete-selected' => "'''{{PLURAL:$1|चुना हुआ|चुने हुए}} लॉग इवेंट:'''",
-'revdelete-text' => "'''हटाए गए अवतरण और इवेंट पृष्ठ इतिहास और लॉग में दिखेंगे, लेकिन उनकी कुछ सामग्री सार्वजनिक नहीं होगी।'''
-{{SITENAME}} के अन्य प्रबंधक छिपी हुई सामग्री को देख पाएँगे, और इसी अंतरापृष्ठ के जरिए वे इसकी पुनर्स्थापना भी कर सकते हैं, बशर्ते कि अतिरिक्त प्रतिबंध न लगाए गए हों।",
'revdelete-confirm' => 'पुष्टि करें कि आप यह कार्य करना चाहते हैं, आप इसका परिणाम समझते हैं, और आप ये [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार कर रहे हैं।',
'revdelete-suppress-text' => 'छिपाने का प्रयोग <strong>केवल</strong> इन परिस्थितियों में होना चाहिए:
* संभावित अपमानजनक जानकारी
'search-file-match' => '(फ़ाइल सामग्री से मेल खाता है)',
'search-suggest' => 'कहीं आपका मतलब $1 तो नहीं था?',
'search-interwiki-caption' => 'अन्य प्रकल्प',
-'search-interwiki-default' => '$1 à¤\95े परिणाम:',
+'search-interwiki-default' => '$1 से परिणाम:',
'search-interwiki-more' => '(और)',
'search-relatedarticle' => 'सम्बंधित',
'searcheverything-enable' => 'सभी नामस्थानों में खोजें',
'revdelete-show-file-submit' => 'Haan',
'revdelete-selected' => "'''{{PLURAL:$2|Selected badlao|Selected badlao}} of [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Chuna gais log event|Chuna gais log events}}:'''",
-'revdelete-text' => "'''Mitawa gae badlao aur ghatna panna ke itihaas me dekhai, lekin content ke kuch part janta nai access kare saki.'''
-Duusra admins {{SITENAME}} me, lukawa gais content ke khole sake aur iske mitae bhi sake hai interface use kar ke, jab tak ki aur rukawat nai lagawa jaae.",
'revdelete-confirm' => 'Meharbani kar ke aap ii confirm karo ki aap ii kare mangta hae, aap iske asar ke samajhta hae, aur iske aap [[{{MediaWiki:Policy-url}}|the policy]] ke anusar karta hae.',
'revdelete-suppress-text' => "Suppression ke '''khaali''' ii chij ke khatir kaam me lawa jaae sake hai:
* Aapan baare me jaankari thik nai hai
'revdelete-show-file-submit' => 'Huo',
'revdelete-selected' => "'''{{PLURAL:$2|Ginpili nga pagbag-o|Ginpili nga mga pagbag-o}} ni [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Ginpili nga hinatabo sa log|Ginpili nga mga hinatabo sa log}}:'''",
-'revdelete-text' => "'''Ang mga ginpanas nga pagbag-o kag hinatabo magapakita sa gihapon sa kasaysayan sang panid kag mga log, apang ang mga parte sang ila kaundan indi na mahimo nga masudlan sang publiko.'''
-Ang iban nga administrador sa {{SITENAME}} mahimo sa gihapon nga makasulod sa nakatago nga kaundan kag mapaiway nga mapanas ini liwat sa amo sa gihapon nga interface, luwas na lang kon may dugang pa nga pagpangbawal ang ibutang.",
'revdelete-confirm' => 'Palihog konpermar nga luyag mo ini himuon, nga imo naintiendihan ang mga konsekwensya, kag ginahimo mo ini suno sa [[{{MediaWiki:Policy-url}}|polisiya]].',
'revdelete-suppress-text' => "Ang pagpahugot nagakadapat '''lamang''' nga pagagamiton sa masunod nga kaso:
* Nagapang-guba sang dignindad nga impormasyon
'revdelete-show-file-submit' => 'Da',
'revdelete-selected' => "'''{{PLURAL:$2|Odabrana izmjena|Odabrane izmjene|Odabrane izmjene}} stranice [[$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:'''",
-'revdelete-text' => "'''Obrisane će se izmjene i dalje nalaziti u javnom popisu izmjena, ali njihov sadržaj neće biti dostupan javnosti.'''
-Drugi administratori ovoga projekta ({{SITENAME}}) moći će i dalje pristupiti skrivenom sadržaju i vratiti ga u javni pristup putem ovog sučelja, osim ako operateri na projektu nisu postavili dodatna ograničenja.",
'revdelete-confirm' => 'Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].',
'revdelete-suppress-text' => "Sklanjanje uređivanja treba raditi '''iznimno''' u slijedećih par slučajeva:
* Privatne informacije neprilične javnom mediju tipa
'sp-contributions-newbies' => 'Prikaži samo doprinose novih suradnika',
'sp-contributions-newbies-sub' => 'Za nove suradnike',
'sp-contributions-newbies-title' => 'Doprinosi novih suradnika',
-'sp-contributions-blocklog' => 'Evidencija blokiranja',
+'sp-contributions-blocklog' => 'evidencija blokiranja',
'sp-contributions-deleted' => 'obrisani suradnički doprinosi',
'sp-contributions-uploads' => 'postavljene datoteke',
'sp-contributions-logs' => 'evidencije',
'tog-ccmeonemails' => 'Mi kopije e-mejlkow pósłać, kotrež druhim wužiwarjam pósćelu',
'tog-diffonly' => 'Jenož rozdźěle pokazać (nic pak zbytny wobsah)',
'tog-showhiddencats' => 'Schowane kategorije pokazać',
-'tog-noconvertlink' => 'Konwertowanje wotkazoweho titula znjemóžnić',
'tog-norollbackdiff' => 'Rozdźěl po wróćostajenju zanjechać',
'tog-useeditwarning' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
'tog-prefershttps' => 'Po přizjewjenju přeco wěsty zwisk wužiwać',
'createacct-another-realname-tip' => '* Woprawdźite mjeno je opcionalne.
Jeli jo podaš, budźe so to wužiwać, zo by přinoški přirjadowało.',
'pt-login' => 'Přizjewić',
+'pt-login-button' => 'Přizjewić',
'pt-createaccount' => 'Konto załožić',
'pt-userlogout' => 'Wotzjewić',
'revdelete-show-file-submit' => 'Haj',
'revdelete-selected' => "'''{{PLURAL:$2|Wubrana wersija|Wubranej wersiji|Wubrane wersije|Wubranych wersijow}} wot [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Wubrany zapisk z protokola|Wubranej zapiskaj z protokola|Wubrane zapiski z protokola|Wubrane zapiski z protokola}} za '''$1:''''''",
-'revdelete-text' => "'''Wušmórnjene wersije a podawki so w stawiznach a protokolach dale jewja, ale dźěle jich wobsaha budu njepřistupne za zjawnosć.'''
-Druzy administratorojo na {{GRAMMAR:lokatiw|{{SITENAME}}}} móža hišće na schowany tekst přistup měć a jón z pomocu samsneho interfejsa wobnowić, chibazo tež přidatne prawa su wobmjezowane.",
'revdelete-confirm' => 'Prošu potwjerdź, zo chceš to činić, zo rozumiš konsekwency a zo činiš to po [[{{MediaWiki:Policy-url}}|prawidłach]].',
'revdelete-suppress-text' => "Potłóčenje dyrbjało so '''jenož''' za slědowace pady wužiwać:
* Potencielnje křiwdźace informacije
'search-file-match' => '(wotpowěduje datajowemu wobsahej)',
'search-suggest' => 'Měnješe ty $1?',
'search-interwiki-caption' => 'Sotrowske projekty',
-'search-interwiki-default' => '$1 wuslědki:',
+'search-interwiki-default' => 'Wuslědki z $1:',
'search-interwiki-more' => '(dalše)',
'search-relatedarticle' => 'Přiwuzne',
'searcheverything-enable' => 'We wšěch mjenowych rumach pytać',
'delete-edit-reasonlist' => 'Přičiny za wušmórnjenje wobdźěłać',
'delete-toobig' => 'Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje tajkich stronow bu wobmjezowane, zo by připadne přetorhnjenje {{SITENAME}} wobešło.',
'delete-warning-toobig' => 'Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.',
-'deleting-backlinks-warning' => "'''Warnowanje:''' Druhe strony wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
+'deleting-backlinks-warning' => "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
# Rollback
'rollback' => 'Změny cofnyć',
'revdelete-show-file-submit' => 'Igen',
'revdelete-selected' => "'''A(z) [[:$1]] lap {{PLURAL:$2|kiválasztott változata|kiválasztott változatai}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Kiválasztott naplóesemény|Kiválasztott naplóesemények}}:'''",
-'revdelete-text' => "'''A törölt változatok és események továbbra is megjelennek a laptörténetben és a naplókban,
-azonban a tartalmuk nem lesz mindenki számára hozzáférhető.'''
-A(z) {{SITENAME}} adminisztrátorai továbbra is meg tudják tekinteni az elrejtett tartalmat, és helyre tudják állítani ugyanezen a felületen keresztül, amennyiben nincs további korlátozás beállítva.",
'revdelete-confirm' => 'Kérlek erősítsd meg, hogy valóban ezt szeretnéd tenni; megértetted a következményeket, és amit teszel, az összhangban van [[{{MediaWiki:Policy-url}}|az irányelvekkel]].',
'revdelete-suppress-text' => "Az elrejtés '''csak''' a következő esetekben használható:
* Illetlen személyes információk
'right-editusercssjs' => 'más felhasználók CSS és JS fájljainak szerkesztése',
'right-editusercss' => 'más felhasználók CSS fájljainak szerkesztése',
'right-edituserjs' => 'más felhasználók JS fájljainak szerkesztése',
+'right-editmyusercss' => 'A saját szerkesztői CSS-fájlok szerkesztése',
+'right-editmyuserjs' => 'Saját szerkesztői JavaScript-fájlok szerkesztése',
'right-rollback' => 'a lap utolsó szerkesztésének gyors visszaállítása',
'right-markbotedits' => 'visszaállított szerkesztések botként való jelölése',
'right-noratelimit' => 'sebességkorlát figyelmen kívül hagyása',
'listfiles_size' => 'Méret',
'listfiles_description' => 'Leírás',
'listfiles_count' => 'Változatok',
+'listfiles-latestversion' => 'Aktuális változat',
'listfiles-latestversion-yes' => 'Igen',
'listfiles-latestversion-no' => 'Nem',
'tags' => 'Érvényes módosítási címkék',
'tag-filter' => '[[Special:Tags|Címke]]szűrő:',
'tag-filter-submit' => 'Szűrő',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Címke|Címkék}}]]: $2)',
'tags-title' => 'Címkék',
'tags-intro' => 'Ez a lap azokat a címkéket és jelentéseiket tartalmazza, amikkel a szoftver megjelölhet egy szerkesztést.',
'tags-tag' => 'Címke neve',
'tog-shownumberswatching' => 'Ցույց տալ էջ հսկող մասնակիցների թիվը',
'tog-oldsig' => 'Ներկայիս ստորագրությունն է․',
'tog-fancysig' => 'Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)',
-'tog-uselivepreview' => 'Õ\95Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬ Õ¸Ö\82Õ²Õ«Õ² Õ¶Õ¡ÕÕ¡Õ¤Õ«Õ¿Õ¸Ö\82Õ´ (JavaScript) (Õ\93որձնական)',
+'tog-uselivepreview' => 'Õ\95Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬ Õ¡Õ¶Õ´Õ«Õ»Õ¡Õ¯Õ¡Õ¶ Õ¶Õ¡ÕÕ¡Õ¤Õ«Õ¿Õ¸Ö\82Õ´, Õ¡Õ¼Õ¡Õ¶Ö\81 Õ§Õ»Õ¨ Õ¾Õ¥Ö\80Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬Õ¸Ö\82 (Ö\83որձնական)',
'tog-forceeditsummary' => 'Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում',
'tog-watchlisthideown' => 'Թաքցնել իմ խմբագրումները հսկացանկից',
'tog-watchlisthidebots' => 'Թաքցնել բոտերի խմբագրումները հսկացանկից',
'underline-always' => 'Միշտ',
'underline-never' => 'Երբեք',
-'underline-default' => 'Օգտագործել զննարկիչի նախընտրությունները',
+'underline-default' => 'Դիտարկչի կամ թեմայի լռելյայն ոճով',
# Font style option in Special:Preferences
'editfont-style' => 'Խմբագրման շրջանի տառատեսակի ձևը.',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} մասին',
'aboutpage' => 'Project:Էությունը',
-'copyright' => 'Ô¿Õ¡ÕµÖ\84Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¨ Õ£Õ¿Õ¶Õ¾Õ¸Ö\82Õ´ Õ§ «$1» Õ¡Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Ö\80Õ« Õ¿Õ¡Õ¯։',
+'copyright' => 'Ô¿Õ¡ÕµÖ\84Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¨ Õ©Õ¸Õ²Õ¡Ö\80Õ¯Õ¾Õ¡Õ® Õ§ $1 Õ©Õ¸Ö\82ÕµÕ¬Õ¡Õ¿Ö\80Õ¡Õ£Ö\80Õ¸Õ¾, Õ¥Õ©Õ¥ Õ¡ÕµÕ¬ Õ¢Õ¡Õ¶ Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§։',
'copyrightpage' => '{{ns:project}}:Հեղինակային իրավունքներ',
'currentevents' => 'Ընթացիկ իրադարձություններ',
'currentevents-url' => 'Project:Ընթացիկ իրադարձություններ',
'cannotdelete-title' => 'Հնարավոր չէ ջնջել $1 էջը',
'badtitle' => 'Անընդունելի անվանում',
'badtitletext' => 'Հարցված էջի անվանումը անընդունելի է, դատարկ է կամ սխալ միջ-լեզվական կամ ինտերվիքի անվանում է։ Հնարավոր է, որ այն պարունակում է անթույլատրելի սիմվոլներ։',
-'perfcached' => 'Õ\80Õ¥Õ¿Ö\87ÕµÕ¡Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö\80Õ¨ Õ¾Õ¥Ö\80Ö\81Õ¾Õ¡Õ® Õ¥Õ¶ Ö\84Õ¥Õ·Õ«Ö\81 և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ Առավելագույն {{PLURAL:$1|արդյունք|$1 արդյունք}} է հասանելի քեշում։',
+'perfcached' => 'Õ\8dÕ¿Õ¸Ö\80Ö\87 Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö\80Õ¨ ÕºÕ¡Õ°Õ¸Ö\82Õ½Õ¿Õ¡Õ¾Õ¸Ö\80Õ¾Õ¡Õ® Õ¥Õ¶ և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ Առավելագույն {{PLURAL:$1|արդյունք|$1 արդյունք}} է հասանելի քեշում։',
'perfcachedts' => 'Հետևյալ տվյալները վերցված են քեշից և վերջին անգամ թարմացվել են $1։ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Այս էջի փոփոխությունները ներկայումս արգելված են։ Այստեղի տվյալները այժմ չեն թարմացվի։',
'viewsource' => 'Դիտել վիքիկոդը',
'login-throttled' => 'Դուք կատարել եք չափից շատ մուտքի փորձ։
Խնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։',
'loginlanguagelabel' => 'Լեզու՝ $1',
+'pt-login' => 'Մտնել',
+'pt-createaccount' => 'Ստեղծել մասնակցի հաշիվ',
+'pt-userlogout' => 'Դուրս գալ',
# Email sending
'php-mail-error-unknown' => 'Անհայտ սխալ PHP-ի mail() ֆունկցիայում',
(նախ) = համեմատել նախորդ տարբերակի հետ,<br />'''չ''' = չնչին խմբագրում",
'history-fieldset-title' => 'Դիտել պատմությունը',
'history-show-deleted' => 'Միայն ջնջված',
-'histfirst' => 'Առաջին',
-'histlast' => 'Õ\8eÕ¥Ö\80Õ»Õ«Õ¶',
+'histfirst' => 'ամենահին',
+'histlast' => 'Õ¡Õ´Õ¥Õ¶Õ¡Õ©Õ¡Ö\80Õ´',
'historysize' => '({{PLURAL:$1|1 բայթ|$1 բայթ}})',
'historyempty' => '(դատարկ)',
Փորձեք [[Special:Search|որոնել վիքիում]] նոր համանման էջեր։',
# Revision deletion
-'rev-deleted-comment' => '(Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ը հեռացված է)',
+'rev-deleted-comment' => '(ÕÕ´Õ¢Õ¡Õ£Ö\80Õ´Õ¡Õ¶ Õ¡Õ´Ö\83Õ¸Ö\83Õ¸Ö\82Õ´ը հեռացված է)',
'rev-deleted-user' => '(մասնակցի անունը ջնջված է)',
'rev-deleted-event' => '(գրությունը հեռացված է)',
+'rev-deleted-user-contribs' => '[մասնակցի անունը կամ ԱյՊի հասցեն հեռացված է, խմբագրումը թաքցված է ներդրումներից]',
'rev-deleted-text-permission' => 'Էջի այս տարբերակը հեռացված է։
Հնարավոր է մանրամասնություններ լինեն [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} ջնջման տեղեկամատյանում]։',
'rev-deleted-text-view' => "Էջի այս տարբերակը '''ջնջված''' է։
'revdelete-show-file-submit' => 'Այո',
'revdelete-selected' => "'''[[:$1]] էջի ընտրված {{PLURAL:$2|տարբերակը|տարբերակները}}.'''",
'logdelete-selected' => "'''Տեղեկամատյանի ընտրված {{PLURAL:$1|գրառումը|գրառումները}}.'''",
-'revdelete-text' => "'''Ջնջված տարբերակները երևալու են էջերի պատմության մեջ և տեղեկամատյաններում, բայց դրանց պարունակության մի մասը հասարակ այցելուներին չի ցուցադրվելու։'''
-
-Ադմինիստրատորները հնարավորություն կունենան դիտել թաքցված պարունակությունը, ինչպես նաև վերականգնել այն այս նույն ինտերֆեյսի միջոցով, բացառությամբ ավելորդ սահմանափակումների դեպքում։",
'revdelete-legend' => 'Սահմանել տեսանելիության սահմանափակումներ',
'revdelete-hide-text' => 'Թաքցնել տարբերակի տեքստը',
'revdelete-hide-image' => 'Թաքցնել նիշքի պարունակությունը',
'revdelete-hide-user' => 'Թաքցնել հեղինակի մասնակցի անունը/IP',
'revdelete-hide-restricted' => 'Թաքցնել տվյալները և՛ ադմինիստրատորներից, և՛ այլ մասնակիցներից',
'revdelete-radio-same' => '(չի կարելի խմբագրել)',
-'revdelete-radio-set' => 'Ô±ÕµÕ¸',
-'revdelete-radio-unset' => 'Õ\88Õ¹',
+'revdelete-radio-set' => 'Ô¹Õ¡Ö\84Ö\81Õ¾Õ¡Õ®',
+'revdelete-radio-unset' => 'Õ\8fÕ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ«',
'revdelete-suppress' => 'Թաքցնել տվյալները ադմինիստրատորներից և մյուսներից նոյնպես',
'revdelete-unsuppress' => 'Հանել սահմանափակումները վերականգնված տարբերակներից',
'revdelete-log' => 'Պատճառ.',
'revdelete-submit' => 'Կիրառել ընտրված {{PLURAL:$1|տարբերակի|տարբերակների}} վրա',
'revdelete-success' => "'''Տարբերակի տեսանելիությունը բարեհաջող թարմացված է։'''",
+'revdelete-failure' => '<strong>Խմբագրման տեսանելիություն հնարավոր չէր փոփոխել՝</strong>
+$1',
'logdelete-success' => "'''Իրադարձության տեսանելիությունը փոփոխված է։'''",
'revdel-restore' => 'Փոխել տեսանելիությունը',
'pagehist' => 'Էջի պատմություն',
'compareselectedversions' => 'Համեմատել ընտրած տարբերակները',
'showhideselectedversions' => 'Ցուցադրել/թաքցնել ընտրված խմբագրումները',
'editundo' => 'հետ շրջել',
+'diff-empty' => '(Տարբերություն չկա)',
# Search results
'searchresults' => 'Որոնման արդյունքներ',
'timezoneregion-indian' => 'Հնդկական Օվկիանոս',
'timezoneregion-pacific' => 'Խաղաղ օվկիանոս',
'allowemail' => 'Թույլատրել էլ-նամակներ մյուս մասնակիցներից',
-'prefs-searchoptions' => 'Õ\88Ö\80Õ¸Õ¶Õ´Õ¡Õ¶ Õ¨Õ¶Õ¿Ö\80Õ¡Õ¶Ö\84Õ¶Õ¥Ö\80',
+'prefs-searchoptions' => 'Õ\88Ö\80Õ¸Õ¶Õ¸Ö\82Õ´',
'prefs-namespaces' => 'Անվանատարածք',
'defaultns' => 'Հակառակ դեպքում, որոնել այս անվանատարծքներում․',
'default' => 'լռությամբ',
'rcnotefrom' => "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
'rclistfrom' => 'Ցույց տալ նոր փոփոխությունները սկսած $1',
'rcshowhideminor' => '$1 չնչին խմբագրումները',
+'rcshowhideminor-show' => 'Ցուցադրել',
+'rcshowhideminor-hide' => 'Թաքցնել',
'rcshowhidebots' => '$1 բոտերին',
+'rcshowhidebots-show' => 'Ցուցադրել',
+'rcshowhidebots-hide' => 'Թաքցնել',
'rcshowhideliu' => '$1 մուտք գործած մասնակիցներին',
+'rcshowhideliu-show' => 'Ցուցադրել',
+'rcshowhideliu-hide' => 'Թաքցնել',
'rcshowhideanons' => '$1 անանուն մասնակիցներին',
+'rcshowhideanons-show' => 'Ցուցադրել',
+'rcshowhideanons-hide' => 'Թաքցնել',
'rcshowhidepatr' => '$1 ստուգված խմբագրումները',
+'rcshowhidepatr-show' => 'Ցուցադրել',
+'rcshowhidepatr-hide' => 'Թաքցնել',
'rcshowhidemine' => '$1 իմ խմբագրումները',
+'rcshowhidemine-show' => 'Ցուցադրել',
+'rcshowhidemine-hide' => 'Թաքցնել',
'rclinks' => 'Ցույց տալ վերջին $1 փոփոխությունները վերջին $2 օրվա ընթացքում<br />$3',
'diff' => 'տարբ',
'hist' => 'պատմ',
'rc_categories_any' => 'Բոլոր',
'rc-change-size-new' => '$1 {{PLURAL:$1|բայթ|բայթ}} փոփոխությունից հետո',
'newsectionsummary' => '/* $1 */ Նոր բաժին',
-'rc-enhanced-expand' => 'Ցույց տալ մանրամասներ (պահանջում է JavaScript)',
+'rc-enhanced-expand' => 'Ցուցադրել մանրամասներ (պահանջում է ՋավաՍկրիպտ)',
'rc-enhanced-hide' => 'Թաքցնել մանրամասները',
+'rc-old-title' => 'Ի սկզբանե ստեղծված էր որպես «$1»',
# Recent changes linked
'recentchangeslinked' => 'Կապված փոփոխություններ',
'tog-ccmeonemails' => 'Inviar me copias del messages de e-mail que io invia a altere usatores',
'tog-diffonly' => 'Non monstrar le contento del pagina sub le comparation de duo versiones',
'tog-showhiddencats' => 'Monstrar categorias celate',
-'tog-noconvertlink' => 'Disactivar conversion de titulos de ligamines',
'tog-norollbackdiff' => 'Omitter le diff post le execution de un revocation',
'tog-useeditwarning' => 'Advertir me quando io quita un pagina de modification sin publicar le cambiamentos',
'tog-prefershttps' => 'Sempre usar un connexion secur in session aperte',
'revdelete-show-file-submit' => 'Si',
'revdelete-selected' => "'''{{PLURAL:$2|Version seligite|Versiones seligite}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Evento|Eventos}} de registro seligite:'''",
-'revdelete-text' => "'''Le versiones e eventos delite continuara a apparer in le historia e registro del pagina, sed partes de lor contento essera inaccessibile al publico.'''
-Altere administratores in {{SITENAME}} continuara a poter acceder al contento celate e pote restaurar lo per medio de iste mesme interfacie, si non se ha definite restrictiones additional.",
'revdelete-confirm' => 'Per favor confirma que tu ha le intention de facer isto, que tu comprende le consequentias, e que tu face isto in accordo con [[{{MediaWiki:Policy-url}}|le politica]].',
'revdelete-suppress-text' => "Le suppression debe '''solmente''' esser usate pro le sequente casos:
* Information potentialmente diffamatori
'tog-ccmeonemails' => 'Kirimkan saya salinan surel yang saya kirimkan ke orang lain',
'tog-diffonly' => 'Jangan tampilkan isi halaman di bawah perbedaan suntingan',
'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
-'tog-noconvertlink' => 'Matikan konversi judul pranala',
'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
'tog-prefershttps' => 'Selalu gunakan koneksi aman ketika masuk log',
'revdelete-show-file-submit' => 'Ya',
'revdelete-selected' => "'''{{PLURAL:$2|Revisi|Revisi-revisi}} pilihan dari '''$1''''''",
'logdelete-selected' => "'''{{PLURAL:$1|Log|Log-log}} pilihan untuk:'''",
-'revdelete-text' => "'''Revisi dan tindakan yang telah dihapus akan tetap muncul di versi terdahulu dan log halaman, tapi bagian dari isinya tidak bisa diakses publik.'''
-Pengurus {{SITENAME}} lain akan tetap dapat mengakses isi yang tersembunyi ini dan dapat membatalkan penghapusannya menggunakan antarmuka yang sama, kecuali ada pembatasan lain yang dibuat oleh operator situs.",
'revdelete-confirm' => 'Tolong konfirmasi bahwa Anda memang bermaksud melakukan ini, memahami konsekuensinya, dan bahwa Anda melakukannya sesuai dengan [[{{MediaWiki:Policy-url}}|kebijakan]].',
'revdelete-suppress-text' => "Penyembunyian revisi '''hanya''' boleh digunakan untuk kasus-kasus berikut:
* Informasi yang berpotensi memfitnah
'tog-ccmeonemails' => 'Inviar me copies de e-mailes que yo invia por altri usatores',
'tog-diffonly' => 'Ne monstrar li contenete de págine in infra del changes',
'tog-showhiddencats' => 'Monstrar categories ne visibil',
-'tog-noconvertlink' => 'Desvalidar conversion de titul de catenun',
'tog-norollbackdiff' => 'Omisser change pos de efectuar un rollback',
'tog-useeditwarning' => 'Averti me, si yo abandona un págine con ínconservat changes',
'tog-prefershttps' => 'Sempre usar un secur connection, si tui session es activ.',
'edit' => 'Urnosen',
'create' => 'Agaramid',
'editthispage' => 'Urnosen daytoy a panid',
-'create-this-page' => 'Aramidem daytoy a panid',
+'create-this-page' => 'Partuaten daytoy a panid',
'delete' => 'Ikkaten',
'deletethispage' => 'Ikkaten daytoy a panid',
'undeletethispage' => 'Isubli ti pannakaikkat daytoy a panid',
'resetpass-temp-password' => 'Temporario a kontrasenias:',
'resetpass-abort-generic' => 'Ti panagsukat ti kontrasenias ket pinasardeng babaen ti maysa a pagpaatiddog.',
'resetpass-expired' => 'Nagpason ti kontraseniasmo. Pangngaasi a mangiyasentar ti baro a kontrasenias tapno makastrek.',
-'resetpass-expired-soft' => 'Nagpason ti kontraseniasmo, ken nasken a maiyasentar manen. Pangngaasi nga agpili tattan ti baro a kontrasenias, wenno pinduten ti ukasen tapno iyasentar no madamdama.',
+'resetpass-expired-soft' => 'Nagpason ti kontraseniasmo, ken nasken a maiyasentar manen. Pangngaasi nga agpili tattan ti baro a kontrasenias, wenno pinduten ti "{{int:resetpass-submit-cancel}}" tapno maiyasentarto intono madamdama.',
# Special:PasswordReset
'passwordreset' => 'Iyasentar manen ti kontrasenias',
'accmailtext' => "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden idiay $2. Mabalin a masukatan idiay
''[[Special:ChangePassword|pagsukatan ti kontrasenias]]'' a panid no sumrekka.",
'newarticle' => '(Baro)',
-'newarticletext' => "Nasurotmo ti maysa a silpo iti awan pay a panid.
-Tapno mapartuat daytoy a panid, rugiamon ti agikur-it wenno agisurat iti pagsuratan a kahon dita baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti ad-adu pay a pakaammo).
-No addaka ditoy babaen ti biddut, ipidutmo ti '''agsubli''' a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
+'newarticletext' => 'Nasurotmo ti silpo ti awan pay a panid.
+Ti mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti adu pay a pakaammo).
+No addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>agsubli</strong> ti pagbasabasam.',
'anontalkpagetext' => "----
''Daytoy ti pakitungtungan a panid para iti di am-ammo nga agar-aramat a saan pay a nakaaramid ti pakabilangan, wenno saanna nga us-usaren.
Dakami ket agusar kami ti numero nga IP a pagtaengan ti panangilasin dagiti lalaki/babai.
'sectioneditnotsupported-text' => 'Saan a nasuportaran ti panag-urnos ti paset iti daytoy a panid.',
'permissionserrors' => 'Biddut ti pammalubos',
'permissionserrorstext' => 'Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:',
-'permissionserrorstext-withaction' => 'Awan ti pammalubosmo nga $2, gapu ti sumaganad {{PLURAL:$1|a rason|rasrason}}:',
+'permissionserrorstext-withaction' => 'Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:',
'recreate-moveddeleted-warn' => "'''Ballaag: Agparpartuatka manen ti dati a naikkat a panid'''
Nasken a siguraduem no maikanatad nga ituloymo nga urnosen daytoy a panid.
'last' => 'naudi',
'page_first' => 'umuna',
'page_last' => 'naudi',
-'histlegend' => "Panagpili ti sabali: Markaan dagiti kahon ti radio dagiti panagbaliwan tapno maipada ken pesselen ti serrek wenno ti buton dita baba.<br />
-Sarita: '''({{int:cur}})''' = naggidiatan ti kinaudi a panagbaliw, '''({{int:last}})''' = naggidiatan ti sarsarunuen a panagbaliw , '''{{int:minoreditletter}}''' = bassit a panagbaliw.",
+'histlegend' => 'Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti panagbaliw tapno maipada ken pinduten ti serrek wenno ti buton dita baba.<br />
+Leyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a panagbaliw, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a panagbaliw , <strong>{{int:minoreditletter}}</strong> = bassit a panagbaliw.',
'history-fieldset-title' => 'Agbasabasa ti pakasaritaan',
'history-show-deleted' => 'Naikkat laeng',
'histfirst' => 'kadaanan',
'revdelete-show-file-submit' => 'Wen',
'revdelete-selected' => "'''{{PLURAL:$2|Napili a nabaliwan|Dagiti napili a nabaliwan}} iti [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Ti napili a listaan ti napasamak|Dagiti napili a listaan ti napasamak}}:'''",
-'revdelete-text' => "'''Dagiti naikkat a binaliwan ken dagiti napasamak ket agparang idiay panid ti pakasaritaan ken dagiti listaan, ngem addaan dagiti paset ti nagyanda a saan a maserrekan ti publiko.'''
-Dagiti sabsabali nga administrador idiay {{SITENAME}} ket mabalinda a serrekan ti nailemmeng a nagyan ken isubli ti panakaikkatda manen idiay dati nga interface, ngem saan no adda dagiti nainayon a naikabil a panagparit.",
'revdelete-confirm' => 'Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ket araramidem daytoy a segun iti [[{{MediaWiki:Policy-url}}|ti annuroten]].',
'revdelete-suppress-text' => "Ti panagdepdep ket usaren '''laeng''' kadagiti sumaganad a kaso;
* Makapataud ti libelo a pakaammo
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'basaen datoy a panid',
-'action-edit' => 'urnosen datoy a panid',
+'action-edit' => 'agurnos iti datoy a panid',
'action-createpage' => 'agpartuat kadagiti panid',
'action-createtalk' => 'agaramid kadagiti pagtungtungan a panid',
'action-createaccount' => 'agpartuat ti pakabilangan daytoy nga agar-aramat',
'recentchanges-label-bot' => 'Daytoy a panag-urnos ket inaramid babaen ti maysa a bot',
'recentchanges-label-unpatrolled' => 'Daytoy a panag-urnos ket saan pay a napatruliaan',
'recentchanges-label-plusminus' => 'Ti panagbaliw ti kadakkel ti panid babaen ti bilang dagiti byte',
-'recentchanges-legend-heading' => "'''Sarita:'''",
+'recentchanges-legend-heading' => "'''Leyenda:'''",
'recentchanges-legend-newpage' => '(kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])',
-'rcnotefrom' => "Dita baba ket dagiti sinukatan manipud idi '''$2''' (agingga iti '''$1''' a naipakita).",
+'rcnotefrom' => 'Dita baba ket dagiti sinukatan manipud idi strong>$2</strong> (agingga iti <strong>$1</strong> a naipakita).',
'rclistfrom' => 'Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $1',
'rcshowhideminor' => '$1 dagiti bassit a panag-urnos',
+'rcshowhideminor-show' => 'Ipakita',
+'rcshowhideminor-hide' => 'Ilemmeng',
'rcshowhidebots' => '$1 dagiti bot',
+'rcshowhidebots-show' => 'Ipakita',
+'rcshowhidebots-hide' => 'Ilemmeng',
'rcshowhideliu' => '$1 dagiti nakarehistro nga agar-aramat',
+'rcshowhideliu-show' => 'Ipakita',
+'rcshowhideliu-hide' => 'Ilemmeng',
'rcshowhideanons' => '$1 dagiti di am-ammo nga agar-aramat',
+'rcshowhideanons-show' => 'Ipakita',
+'rcshowhideanons-hide' => 'Ilemmeng',
'rcshowhidepatr' => '$1 dagiti napatrulian a panag-urnos',
+'rcshowhidepatr-show' => 'Ipakita',
+'rcshowhidepatr-hide' => 'Ilemmeng',
'rcshowhidemine' => '$1 dagiti inurnosko',
+'rcshowhidemine-show' => 'Ipakita',
+'rcshowhidemine-hide' => 'Ilemmeng',
'rclinks' => 'Ipakita dagiti naudi a $1 a sinukatan iti kallabes a $2 nga al-aldaw<br />$3',
'diff' => 'sabali',
'hist' => 'saritaan',
'php-uploaddisabledtext' => 'Ti pinag-ipan ti papeles ket naiddep idiay PHP.
Panngaasi a kitaem ti pannakaikabil ti pinag-ipan ti papeles.',
'uploadscripted' => 'Daytoy a papeles ket adda nagyanna a HTML wenno panagsurat a kodigo a mabalin nga agpakamali ti panagbasa ti sapot a pagbasabasa.',
+'uploadscriptednamespace' => 'Daytoy a papeles ti SVG ket aglaon ti maysa a saan a mabalin a nagan ti espasio ti "$1"',
'uploadinvalidxml' => 'Ti XML iti naikarga a papeles ket saan a maiwaswas.',
'uploadvirus' => 'Addaan ti birus daytoy a papeles! Salaysay: $1',
'uploadjava' => 'Daytoy a papeles ket ZIP a papeles nga adda nagyanna a Java .a kita ti papeles.
'delete-warning-toobig' => 'Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panag-urnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.
Ti panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};
agal-aluadka a mangrugi.',
-'deleting-backlinks-warning' => "'''Ballaag:''' Dagiti dadduma a panid ket naisilpo wenno nailak-am manipud ti panid a gangani nga ikkatem.",
+'deleting-backlinks-warning' => "'''Ballaag:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Dagiti dadduma a panid]] ket naisilpo wenno nailak-am manipud ti panid a gangani nga ikkatem.",
# Rollback
'rollback' => 'Isubli dagiti panag-urnos',
'sp-contributions-blocked-notice-anon' => 'Daytoy nga IP a pagtaengan ket naserraan.
Ti naudi a listaan ti pannakaserra ket adda dita baba tapno mausar a reperensia:',
'sp-contributions-search' => 'Agsapul para kadagiti naar-aramid',
+'sp-contributions-suppresslog' => 'pasardengen dagiti kontribusion ti agar-aramat',
'sp-contributions-username' => 'IP a pagtaengan wenno nagan ti agar-aramat:',
'sp-contributions-toponly' => 'Ipakita laeng dagiti inurnos a kinaudian a panagbaliw',
+'sp-contributions-newonly' => 'Ipakita laeng dagiti inurnos a pannakapartuat ti pampanid',
'sp-contributions-submit' => 'Biruken',
# What links here
# Special:SpecialPages
'specialpages' => 'Espesial a pampanid',
-'specialpages-note-top' => 'Sarita',
+'specialpages-note-top' => 'Leyenda',
'specialpages-note' => '* Kadawyan nga espesial a pampanid.
* <span class="mw-specialpagerestricted">Nagawidan nga espesial a pampanid.</span>',
'specialpages-group-maintenance' => 'Dagiti padamag ti panagtaripato',
'revdelete-show-file-submit' => 'Já',
'revdelete-selected' => "'''{{PLURAL:$2|Valin breyting|Valdar breytingar}} fyrir [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Valin aðgerð|Valdar aðgerðir}}:'''",
-'revdelete-text' => "'''Eyddar útgáfur og breytingar munu birtast áfram í breytingarskrá síðunnar og í aðgerðarskrám, en hluti upplýsingana verða falin almenningi.'''
-Önnur möppudýr á {{SITENAME}} hafa aðgang að földu upplýsingunum og geta endurvakið upplýsingarnar í gegnum sama viðmót, nema sérstakar takmarkanir séu virkar.",
'revdelete-confirm' => 'Vinsamlegast staðfestu að þú viljir gera þetta, að þú skiljir afleiðingarnar og að þú sért að gera þetta í samræmi við [[{{MediaWiki:Policy-url}}]].',
'revdelete-suppress-text' => "Bælingu á '''eingöngu''' að nota í eftirfarandi tilfellum:
* Mögulegar ærumleiðandi upplýsingar
'tog-ccmeonemails' => 'Inviami una copia dei messaggi spediti agli altri utenti',
'tog-diffonly' => 'Non visualizzare il contenuto della pagina dopo il confronto tra versioni',
'tog-showhiddencats' => 'Mostra le categorie nascoste',
-'tog-noconvertlink' => 'Disattiva la conversione dei titoli dei link',
'tog-norollbackdiff' => 'Non mostrare il confronto tra versioni dopo aver effettuato un rollback',
'tog-useeditwarning' => 'Avvisa quando si esce da una pagina di modifica con modifiche non salvate',
'tog-prefershttps' => "Usa sempre una connessione sicura quando si effettua l'accesso",
'passwordreset-emailerror-capture' => "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
# Special:ChangeEmail
-'changeemail' => "Modifica l'indirizzo e-mail",
-'changeemail-header' => "Modifica l'indirizzo e-mail dell'account",
-'changeemail-text' => 'Completa questo modulo per cambiare il tuo indirizzo e-mail. Sarà necessario inserire la password per confermare la modifica.',
+'changeemail' => 'Modifica indirizzo email',
+'changeemail-header' => "Modifica l'indirizzo email dell'account",
+'changeemail-text' => 'Completa questo modulo per cambiare il tuo indirizzo email. Sarà necessario inserire la password per confermare la modifica.',
'changeemail-no-info' => "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
-'changeemail-oldemail' => 'Indirizzo e-mail attuale:',
-'changeemail-newemail' => 'Nuovo indirizzo e-mail:',
+'changeemail-oldemail' => 'Indirizzo email attuale:',
+'changeemail-newemail' => 'Nuovo indirizzo email:',
'changeemail-none' => '(nessuno)',
'changeemail-password' => 'La password su {{SITENAME}}:',
-'changeemail-submit' => 'Modifica e-mail',
+'changeemail-submit' => 'Modifica email',
'changeemail-cancel' => 'Annulla',
'changeemail-throttled' => 'Sono stati effettuati troppi tentativi di accesso.
Attendi $1 e riprova in seguito.',
'revdelete-show-file-submit' => 'Sì',
'revdelete-selected' => "'''{{PLURAL:$2|Versione selezionata|Versioni selezionate}} di [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Evento del registro selezionato|Eventi del registro selezionati}}:'''",
-'revdelete-text' => "'''Le versioni cancellate restano visibili nella cronologia della pagina, mentre il testo contenuto non è accessibile al pubblico.'''
-Gli altri amministratori di {{SITENAME}} potranno accedere comunque ai contenuti nascosti e ripristinarli attraverso questa stessa interfaccia, se non sono state impostate altre limitazioni in fase di installazione del sito.",
'revdelete-confirm' => 'Per favore conferma che questo è quanto intendi fare, che sei consapevole delle conseguenze, e che stai facendo questo nel rispetto delle [[{{MediaWiki:Policy-url}}|linee guida]].',
'revdelete-suppress-text' => "La rimozione dovrebbe essere utilizzata '''unicamente''' nei seguenti casi:
* informazioni potenzialmente diffamatorie
'prefs-watchlist-token' => 'Token osservati speciali:',
'prefs-misc' => 'Varie',
'prefs-resetpass' => 'Cambia password',
-'prefs-changeemail' => 'Modifica e-mail',
-'prefs-setemail' => 'Imposta un indirizzo e-mail',
+'prefs-changeemail' => 'Modifica email',
+'prefs-setemail' => 'Imposta un indirizzo email',
'prefs-email' => 'Opzioni email',
'prefs-rendering' => 'Aspetto',
'saveprefs' => 'Salva le preferenze',
Questa informazione sarà pubblica.",
'email' => 'Indirizzo email',
'prefs-help-realname' => "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
-'prefs-help-email' => "L'inserimento del proprio indirizzo e-mail è facoltativo, ma permette di ricevere la propria password qualora venisse dimenticata.",
+'prefs-help-email' => "L'inserimento del proprio indirizzo email è facoltativo, ma permette di ricevere la propria password qualora venisse dimenticata.",
'prefs-help-email-others' => 'Puoi anche scegliere di lasciare che gli altri ti contattino via posta elettronica con un collegamento dalla tua pagina utente o di discussione.
Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
-'prefs-help-email-required' => 'Indirizzo e-mail obbligatorio.',
+'prefs-help-email-required' => "L'indirizzo email è obbligatorio.",
'prefs-info' => 'Informazioni di base',
'prefs-i18n' => 'Internazionalizzazione',
'prefs-signature' => 'Firma',
'delete-edit-reasonlist' => 'Modifica i motivi di cancellazione',
'delete-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione è stata limitata per evitare di creare accidentalmente dei problemi di funzionamento al database di {{SITENAME}}.',
'delete-warning-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione può creare dei problemi di funzionamento al database di {{SITENAME}}; procedere con cautela.',
-'deleting-backlinks-warning' => "'''Attenzione:''' altre pagine contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
+'deleting-backlinks-warning' => "'''Attenzione:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|altre pagine]] contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
# Rollback
'rollback' => 'Annulla le modifiche',
* @author Aotake
* @author Aphaia
* @author Broad-Sky
+ * @author Burthsceh
* @author Chatama
* @author Chinneeb
* @author Emk
* @author Reedy
* @author Schu
* @author Shirayuki
+ * @author Sonicarts
* @author Suisui
* @author VZP10224
* @author Vigorous action
'tog-ccmeonemails' => '他の利用者に送信したメールの控えを自分にも送信',
'tog-diffonly' => '差分の下にページ内容を表示しない',
'tog-showhiddencats' => '隠しカテゴリを表示',
-'tog-noconvertlink' => 'リンクタイトル変換を無効にする',
'tog-norollbackdiff' => '巻き戻し後の差分を表示しない',
'tog-useeditwarning' => '変更を保存せずに編集画面から離れようとしたら警告',
'tog-prefershttps' => 'ログインする際、常に SSL (https) 接続を使用する',
'createacct-another-realname-tip' => '本名は省略できます。
入力すると、その利用者の著作物の帰属表示に使われます。',
'pt-login' => 'ログイン',
+'pt-login-button' => 'ログイン',
'pt-createaccount' => 'アカウント作成',
'pt-userlogout' => 'ログアウト',
'revdelete-show-file-submit' => 'はい',
'revdelete-selected' => '<strong>[[:$1]] の{{PLURAL:$2|選択された版}}:</strong>',
'logdelete-selected' => '<strong>{{PLURAL:$1|選択された記録項目}}:</strong>',
-'revdelete-text' => '<strong>削除された版や記録項目は引き続きページの履歴や記録に表示されますが、一般利用者はその内容の一部を取得できなくなります。</strong>
-追加の制限がかけられない限り、{{SITENAME}}の他の管理者は同じインターフェイスを使って非表示の内容の取得や復元ができます。',
'revdelete-confirm' => 'この操作を行おうとしていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に従っていること、を確認してください。',
'revdelete-suppress-text' => '秘匿は、<strong>以下の場合に限って</strong>使用すべきです:
* 名誉毀損のおそれがある記述
'search-file-match' => '(ファイルの内容との一致)',
'search-suggest' => 'もしかして: $1',
'search-interwiki-caption' => '姉妹プロジェクト',
-'search-interwiki-default' => '$1の結果:',
+'search-interwiki-default' => '$1ã\81\8bã\82\89ã\81®çµ\90æ\9e\9c:',
'search-interwiki-more' => '(続き)',
'search-relatedarticle' => '関連',
'searcheverything-enable' => 'すべての名前空間を検索',
'recentchanges-legend-newpage' => '([[Special:NewPages|新しいページ一覧]]も参照)',
'recentchanges-legend-plusminus' => '(<em>±123</em>)',
'rcnotefrom' => '以下は<strong>$2</strong>以降の更新です (最大 <strong>$1</strong> 件)。',
-'rclistfrom' => '$2 $3以降の更新を表示する',
+'rclistfrom' => '$1以降の更新を表示する',
'rcshowhideminor' => '細部の編集を$1',
'rcshowhideminor-show' => '表示',
'rcshowhideminor-hide' => '非表示',
'delete-warning-toobig' => 'このページには、 $1版を超える編集履歴があります。
削除すると、{{SITENAME}}のデータベース処理に大きな負荷がかかります。
十分に注意してください。',
-'deleting-backlinks-warning' => "'''警告:''' 削除しようとしているページは、他のページからリンクまたは参照読み込みされています。",
+'deleting-backlinks-warning' => "'''警告:''' 削除しようとしているページは、[[Special:WhatLinksHere/{{FULLPAGENAME}}|他のページ]]からリンクまたは参照読み込みされています。",
# Rollback
'rollback' => '編集を巻き戻し',
'sp-contributions-blocked-notice-anon' => 'このIPアドレスは現在ブロックされています。
参考のために最近のブロック記録項目を以下に表示します:',
'sp-contributions-search' => '投稿の検索',
+'sp-contributions-suppresslog' => '利用者の秘匿された投稿',
'sp-contributions-username' => 'IPアドレスまたは利用者名:',
'sp-contributions-toponly' => '最新版の編集のみを表示',
'sp-contributions-newonly' => 'ページ作成を伴う編集のみを表示',
'dberr-cachederror' => 'これは要求されたページをキャッシュした複製であり、古くなっている可能性があります。',
# HTML forms
-'htmlform-invalid-input' => '入力に何らかの問題があります',
+'htmlform-invalid-input' => '入力に何らかの問題があります。',
'htmlform-select-badoption' => '指定した値は有効な選択肢ではありません。',
'htmlform-int-invalid' => '指定した値は整数ではありません。',
'htmlform-float-invalid' => '指定した値は数値ではありません。',
-'htmlform-int-toolow' => '指定した値は、最小値 $1 より小さい値です',
-'htmlform-int-toohigh' => '指定した値は、最大値 $1 を超えています',
-'htmlform-required' => 'この値は必須です',
+'htmlform-int-toolow' => '指定した値は、最小値 $1 より小さい値です。',
+'htmlform-int-toohigh' => '指定した値は、最大値 $1 を超えています。',
+'htmlform-required' => 'この値は必須です。',
'htmlform-submit' => '送信',
'htmlform-reset' => '変更を取り消す',
'htmlform-selectorother-other' => 'その他',
'revdelete-show-file-submit' => 'Ya',
'revdelete-selected' => "'''{{PLURAL:$2|Revisi kapilih|Revisi kapilih}} dari '''$1''''''",
'logdelete-selected' => "'''{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:'''",
-'revdelete-text' => "'''Revisi lan tindhakan sing wis kabusak bakal tetep muncul ing kaca versi sadurungé lan log, nanging bagéyan isiné ora bisa diaksès déning publik.'''
-Pangurus {{SITENAME}} liyané bakal tetep bisa ngaksès isi sing kadhelikaké iku lan bisa mbatalaké pambusakan ngliwati antarmuka sing padha, kajaba ana pawatesan liya saka operator situs.",
'revdelete-confirm' => 'Mangga pesthèkaké yèn Sampéyan pancèn kudu nglakoni iki, yèn Sampéyan ngerti akibaté, lan yèn Sampéyan ngakoni iki cocok karo [[{{MediaWiki:Policy-url}}|kawicakan]].',
'revdelete-suppress-text' => "Pandhelikan révisi '''mung''' bisa dipigunakaké kanggo kasus ing ngisor:
* Informasi sing kagolong pitnah
'tog-ccmeonemails' => 'გამომიგზავნე ელფოსტების ასლები, რომლებსაც მე სხვა მომხმარებლებს ვუგზავნი',
'tog-diffonly' => 'დამალე გვერდის შიგთავსი ცვლილების ქვევით',
'tog-showhiddencats' => 'დამალული კატეგორიების ჩვენება',
-'tog-noconvertlink' => 'სათაურის გარდაქმნის ბმულის გამორთვა',
'tog-norollbackdiff' => 'გაუქმებისას გამოტოვეთ ცვლილებათა განსხვავება',
'tog-useeditwarning' => 'გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით',
'tog-prefershttps' => 'უსაფრთხო კავშირის მუდამ გამოყენება ავტორიზაციის შემდეგ',
ზედა ტექსტური ველი შეიცავს გვერდის შიგთავსს მისი ამჟამინდელი სახით.
თქვენი ცვლილებები ნაჩვენებია ქვედა ტექსტურ ველში.
თქვენ მოგიწევთ თქვენი ცვლილებების შერწყმა არსებულ ტექსტთან.
-'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც \"{{int:savearticle}}\" დააჭერთ.",
+'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც „{{int:savearticle}}“ დააჭერთ.",
'yourtext' => 'თქვენი ტექსტი',
'storedversion' => 'შენახული ვერსია',
'nonunicodebrowser' => "'''გაფრთხილება: თქვენი ბრაუზერი უნიკოდთან თავსებადი არ არის. ჩვენ ვცდილობთ ამ პრობლემის გადაჭრას, რათა თქვენ შეძლოთ უსაფრთხოდ შეიტანოთ ცვლილებები გვერდებზე: არა-ASCII ნიშნები რედაქტირების ფანჯარაში გამოჩნდება როგორც ჰექსადეციმალური კოდები.'''",
'revdelete-show-file-submit' => 'ჰო',
'revdelete-selected' => "'''[[:$1]]-ის {{PLURAL:$2|მონიშნული ცვლილება|მონიშნული ცვლილებები}}:'''",
'logdelete-selected' => "'''ჟურნალის {{PLURAL:$1|არჩეული ჩანაწერი|არჩეული ჩანაწერები}}:'''",
-'revdelete-text' => "'''გვერდებისა და მოქმედებების წაშლილი ნაწილები დარჩება ისტორიაში და ჟურნალებში, მაგრამ მათ ნაწილს ვერ ნახავენ ჩვეულებრივი მომხმარებლები.'''
-პროექტის ადმინისტრატორებს ექნებათ შესაძლებლობა {{SITENAME}}ში დაინახონ ღია და არწაშლილი ნაწილი, და შეძლებენ აღადგინონ იგივე ინტერფეისის მეშვეობით, გარდა იმ შემთხვევებისა, როდესაც დამატებითი შეზღუდვა მოქმედებს.",
'revdelete-confirm' => 'გთხოვთ დაადასტუროთ, რომ გსურთ ქმედების განხორციელება. ასევე ვიმედოვნებთ, რომ ყველაფერს აკეთებთ [[{{MediaWiki:Policy-url}}|წესებთან შესაბამისობაში]].',
'revdelete-suppress-text' => "დამალვა შეიძლება განხორციელდეს '''მხოლოდ''' შემდეგ შემთხვევებში:
* პოტენციურად ცილისმწამებლური ინფორმაცია
'revdelete-show-file-submit' => 'Ih',
'revdelete-selected' => "'''{{PLURAL:$2|Tasiwelt tettwafren|Tisiwal ttwafernen}} n [[:$1]]'''",
'logdelete-selected' => "'''{{PLURAL:$1|Tamirt n uɣmis tettwafren|Isallen n uɣmis ttwafernen}}:'''",
-'revdelete-text' => 'Ileqman d tidyanin yettumḥan ad qqimen deg umezruy n usebter dɣa deg iɣmisen, maca agbur nsen ur i sɛu ara tuffart i uzayez."
-Inedbalen wiyaḍ deg {{SITENAME}} zemren ad ẓṛen imuren i yettwafren u zemren a ten-mḥan, ḥaca ma llan icekkilen.',
'revdelete-confirm' => 'Sergeg ma tebɣiḍ ad xedmeḍ tigawt agi, fehmeḍ inalkamen, dɣa temtawiḍ s [[{{MediaWiki:Policy-url}}|ilugan]].',
'revdelete-suppress-text' => "Ilaq tukksa att illi \"kan\" deg tijṛa agi :
* Tilɣa ahat tinergamin
'revdelete-show-file-submit' => 'НытӀэ',
'revdelete-selected' => "'''{{PLURAL:$2|Версиэ хэхар|Версиэ хэхахэр}} напэкӀуэцӀ [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Тхылъ хэхар|Тхылъ хэхахэр}} тхыгъэм:'''",
-'revdelete-text' => 'НапэкӀуэцӀхэм я версиэ ихахэмрэ хъыбар щекӀуэкӀахэмрэ напэкӀуэцӀым и тхыдэмрэ тхыгъэмрэ гъэлъэгъуауэ щытынущ, абыхэм я лъэныкъуэгъу гуэрэхэр цӀыхухэтхэм щхьэкӀэ теубыдауэ щытынущ.
-Тхьэмадэ {{SITENAME}} проэктым щыщхэм пӀалъэ яӀэнущ теубыда тхыгъэхэм екӀуэлъэн, а интерфейсымкӀи зэфӀагъувэжын, теубыдыгъэ нэхъ ину ятемылъу щымыт къуэдеймэ.',
'revdelete-confirm' => 'Арэзыгъуэ ет, быщӀэр зэр уи гугъэр, къыхэкӀынур къызэрыбгурыӀуэр, быщӀу хъуамкӀэ [[{{MediaWiki:Policy-url}}|хабзэм]] узэремыбакъуэр.',
'revdelete-suppress-text' => "ГъэпшкӀугъэр щекӀуэкӀыфыну '''къуэдер''' мыбым хуэдэм:
'revdelete-show-file-confirm' => 'Sıma eminê ke wazenê çımraviarnaena esterıtiya na dosya "<nowiki>$1</nowiki>" $2 ra $3 de bıvênê?',
'revdelete-show-file-submit' => 'Heya',
'revdelete-selected' => "'''[[:$1]]: ra {{PLURAL:$2|Çımraviarnaiso weçinıte|Çımraviarnaisê weçinıtey}}'''",
-'revdelete-text' => "Çımraviarnaişê esterıtey u kerdişi hewna tarixê pele u qeydan de asenê, hama parçê zerrekê dine areze nêbenê.'''
-Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê hona bıresê zerrekê nımıtey u şikinê ey oncia na eyni mianpele ra peyser biarê.",
'revdelete-suppress-text' => "Wedardene gunê '''teyna''' nê halunê cêrênu de bıguriyo:
* Melumatê kıfırio mıhtemel
* Melumatê şexsio bêmınasıb
كەلتىرىلگەن تۇزەتۋ جوق, نە اعىمدىق تۇزەتۋدى جاسىرۋ ٴۇشىن ارەكەتتەنىپ كوردىڭىز.',
'revdelete-selected' => "'''[[:$1]] دەگەننىڭ بولەكتەنگەن {{PLURAL:$2|تۇزەتۋى|تۇزەتۋلەرى}}:'''",
'logdelete-selected' => "'''بولەكتەنگەن {{PLURAL:$1|جۋرنال وقىيعاسى|جۋرنال وقىيعالارى}}:'''",
-'revdelete-text' => "'''جويىلعان تۇزەتۋلەر مەن وقىيعالاردى ٴالى دە بەت تارىيحىندا جانە جۋرنالداردا تابۋعا بولادى, بىراق ولاردىڭ ماعلۇمات بولشەكتەرى بارشاعا قاتىنالمايدى.'''
-
-{{SITENAME}} جوباسىنىڭ باسقا اكىمشىلەرى جاسىرىن ماعلۇماتقا قاتىناي الادى, جانە قوسىمشا تىيىمدار قويىلعانشا دەيىن, وسى تىلدەسۋ ارقىلى جويۋدى بولدىرماۋى مۇمكىن.",
'revdelete-legend' => 'كورىنىس تىيىمدارىن قويۋ:',
'revdelete-hide-text' => 'تۇزەتۋ ٴماتىنىن جاسىر',
'revdelete-hide-image' => 'فايل ماعلۇماتىن جاسىر',
'tog-fancysig' => 'Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)',
'tog-uselivepreview' => 'Тура қарап шығуды қолдану (сынақтық)',
'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
-'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыр',
-'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімінен жасыр',
+'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыру',
+'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімінен жасыру',
'tog-watchlisthideminor' => 'Шағын өңдемелерді бақылау тізімінде көрсетпеу',
'tog-watchlisthideliu' => 'Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу',
'tog-watchlisthideanons' => 'Бақылау тізіміндегі жасырын қатысушылардың өңдеулерін көрсетпеу',
'tog-watchlisthidepatrolled' => 'Бақылау тізімінде тексерілген өңдеулерді көрсетпеу',
'tog-ccmeonemails' => 'Басқа қатысушыға жіберген хатымның көшірмесін маған да жөнелт',
-'tog-diffonly' => 'Ð\90йÑ\8bÑ\80ма аÑ\81Ñ\82Ñ\8bнда беÑ\82 маÒ\93лұмаÑ\82Ñ\8bн көÑ\80Ñ\81еÑ\82пе',
+'tog-diffonly' => 'Ð\9dÒ±Ñ\81Ò\9bалаÑ\80 айÑ\8bÑ\80маÑ\88Ñ\8bлÑ\8bÒ\9bÑ\82аÑ\80Ñ\8bнÑ\8bÒ£ аÑ\81Ñ\82Ñ\8bнда беÑ\82 маÒ\93лұмаÑ\82Ñ\8bн көÑ\80Ñ\81еÑ\82пеÑ\83',
'tog-showhiddencats' => 'Жасырын санаттарды көрсету',
-'tog-noconvertlink' => 'Сілтеме атауларын ауыстырма',
'tog-norollbackdiff' => 'Шегіндіруден кейін нұсқалардың айырмашылығын көрсетпеу',
'tog-useeditwarning' => 'Өңдемесі сақталмаған парақшадан шығар кезде ескерту',
+'tog-prefershttps' => 'Кірген кезде қауіпсіз байланысуды әрқашан қолдану',
'underline-always' => 'Әрқашан',
'underline-never' => 'Ешқашан',
'vector-action-unprotect' => 'Қорғанысты өзгерту',
'vector-view-create' => 'Бастау',
'vector-view-edit' => 'Өңдеу',
-'vector-view-history' => 'Тарихын қарау',
+'vector-view-history' => 'Өңделу тарихы',
'vector-view-view' => 'Оқу',
'vector-view-viewsource' => 'Қайнарын қарау',
'actions' => 'Әрекеттер',
'createacct-reason' => 'Себебі:',
'createacct-reason-ph' => 'Неге басқа тіркегі жасамақшысыз',
'createacct-captcha' => 'Құпиялық тексеруі',
-'createacct-imgcaptcha-ph' => 'Жоғарғыдағы көріп тұрған мәтінді енгізіңіз',
+'createacct-imgcaptcha-ph' => 'Жоғарыдағы мәтінді енгізіңіз',
'createacct-submit' => 'Тіркелгіңізді жасаңыз',
'createacct-another-submit' => 'Басқа тіркелгі жасау',
'createacct-benefit-heading' => '{{SITENAME}} сіз сияқты қызығатын адамдар арқылы жасалады.',
'login-abort-generic' => 'Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.',
'loginlanguagelabel' => 'Тіл: $1',
'suspicious-userlogout' => 'Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені, бұл жарамсыз браузер немесе кэштеуші проксидің сұранымына ұқсайды.',
+'pt-login' => 'Кіру',
+'pt-login-button' => 'Кіру',
+'pt-createaccount' => 'Тіркелгі жасау',
+'pt-userlogout' => 'Шығу',
# Email sending
'php-mail-error-unknown' => 'Mail() PHP-функциясындағы белгісіз қате.',
'revdelete-show-file-submit' => 'Иә',
'revdelete-selected' => "'''[[:$1]] дегеннің бөлектенген {{PLURAL:$2|түзетуі|түзетулері}}:'''",
'logdelete-selected' => "'''Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:'''",
-'revdelete-text' => "'''Жойылған түзетулер мен оқиғаларды әлі де бет тарихында және журналдарда табуға болады, бірақ олардың мағлұмат бөлшектері баршаға қатыналмайды.'''
-
-{{SITENAME}} жобасының басқа әкімшілері жасырын мағлұматқа қатынай алады, және қосымша тиымдар қойылғанша дейін, осы тілдесу арқылы жоюды болдырмауы мүмкін.",
'revdelete-legend' => 'Көрініс тиымдарын қою:',
'revdelete-hide-text' => 'Түзету мәтінін жасыр',
'revdelete-hide-image' => 'Файл мағлұматын жасыр',
'yourrealname' => 'Нақты атыңыз:',
'yourlanguage' => 'Тіліңіз:',
'yourvariant' => 'Жазба тілінің нұсқалары:',
+'prefs-help-variant' => 'Қалаған нұсқаңыз немесе орфография бұл уикидің контент беттерінде көрсетіледі.',
'yournick' => 'Жаңа қолтаңбаңыз:',
'prefs-help-signature' => 'Талқылау беттерінде хабарыңыздан кейін "<nowiki>~~~~</nowiki>" белгісін қалдырсаңыз, бұл қолтаңбаңызбен сол кездегі датаға ауыстырылады.',
'badsig' => 'Қам қолтаңбаңыз жарамсыз; HTML белгішелерін тексеріңіз.',
'prefs-help-realname' => 'Нақты атыңыз міндетті емес.
Егер бұны жетістіруді таңдасаңыз, бұл түзетуіңіздің ауторлығын анықтау үшін қолданылады.',
'prefs-help-email' => 'Электронды поштаңыздың мекенжайын көрсету міндетті емес, бірақ құпия сөзіңізді ұмытқан жағдайда керек болады.',
+'prefs-help-email-others' => 'Кейде қатысушы немесе талқылау бетіңізге е-пошта мекенжайы сілтемесін көрсету арқылы басқалармен байланыса аласыз.
+Е-пошта мекенжайыныңыз басқа қатысушылар сізбен байланысқан кезде көрсетілмейді',
'prefs-help-email-required' => 'Е-пошта мекенжайы керек.',
'prefs-info' => 'Негізгі мәлімет',
'prefs-i18n' => 'Тіл туралы мәлімет',
'prefs-displaysearchoptions' => 'Көрсету бапталымдары',
'prefs-displaywatchlist' => 'Көрсету бапталымдары',
'prefs-diffs' => 'Айырмашылықтар',
+'prefs-help-prefershttps' => 'Бұл баптауды келесі кіргеніңізде әсерін көре аласыз.',
# User preference: email validation using jQuery
'email-address-validity-invalid' => 'Жарамсыз электронды пошта мекен-жайын енгізіңіз',
'rcnotefrom' => "Төменде '''$2''' кезінен бергі ('''$1''' жеткенше дейін) өзгерістер көрсетіледі.",
'rclistfrom' => '$1 кезінен бергі жаңа өзгерістерді көрсет.',
'rcshowhideminor' => 'Шағын өңдемелерді $1',
+'rcshowhideminor-hide' => 'жасыру',
'rcshowhidebots' => 'Боттарды $1',
+'rcshowhidebots-show' => 'көрсету',
'rcshowhideliu' => 'Тіркелгендерді $1',
+'rcshowhideliu-hide' => 'жасыру',
'rcshowhideanons' => 'Кірмегендерді $1',
+'rcshowhideanons-hide' => 'жасыру',
'rcshowhidepatr' => 'Зерттелген өңдемелерді $1',
'rcshowhidemine' => 'Өңдемелерімді $1',
+'rcshowhidemine-hide' => 'жасыру',
'rclinks' => 'Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3',
'diff' => 'айырм.',
'hist' => 'тарихы',
'nbytes' => '$1 {{PLURAL:$1|байт|байт}}',
'ncategories' => '$1 {{PLURAL:$1|Санат|Санаттар}}',
'ninterwikis' => '$1 {{PLURAL:$1|интеруики|интеруикилер}}',
-'nlinks' => '$1 {{PLURAL:$1|сілтеме|сілтемелер}}',
+'nlinks' => '$1 сілтеме',
'nmembers' => '$1 {{PLURAL:$1|мүше|мүше}}',
'nmemberschanged' => '$1 → $2 {{PLURAL:$2|мүше|мүше}}',
'nrevisions' => '$1 {{PLURAL:$1|түзету|түзету}}',
'sp-contributions-search' => 'Үлес үшін іздеу',
'sp-contributions-username' => 'IP-мекенжайы немесе қатысушы аты:',
'sp-contributions-toponly' => 'Өңдемелердің тек соңғы нұсқаларын көрсету',
+'sp-contributions-newonly' => 'Бет бастау өңдемелерін ғана көрсету',
'sp-contributions-submit' => 'Ізде',
# What links here
# Skin names
'skinname-cologneblue' => 'Көк зеңгірлігі (cologneblue)',
-'skinname-monobook' => 'Ð\94аÑ\80а кітап (monobook)',
+'skinname-monobook' => 'Ð\96еке кітап (monobook)',
'skinname-modern' => 'Заманауи (modern)',
# Patrolling
'iranian-calendar-m9' => 'азар',
'iranian-calendar-m10' => 'ди',
'iranian-calendar-m11' => 'бемін',
-'iranian-calendar-m12' => 'аспанд',
+'iranian-calendar-m12' => 'аспанд (Иран күнтізбесі)',
# Hebrew month names
'hebrew-calendar-m1' => 'тішри',
'hebrew-calendar-m5' => 'шыбат',
'hebrew-calendar-m6' => 'адар',
'hebrew-calendar-m6a' => 'адар',
-'hebrew-calendar-m6b' => 'уадар',
+'hebrew-calendar-m6b' => 'Адар II (иврит күнтізбесі)',
'hebrew-calendar-m7' => 'нисан',
'hebrew-calendar-m8' => 'аяр',
'hebrew-calendar-m9' => 'сиуан',
keltirilgen tüzetw joq, ne ağımdıq tüzetwdi jasırw üşin ärekettenip kördiñiz.',
'revdelete-selected' => "'''[[:$1]] degenniñ bölektengen {{PLURAL:$2|tüzetwi|tüzetwleri}}:'''",
'logdelete-selected' => "'''Bölektengen {{PLURAL:$1|jwrnal oqïğası|jwrnal oqïğaları}}:'''",
-'revdelete-text' => "'''Joýılğan tüzetwler men oqïğalardı äli de bet tarïxında jäne jwrnaldarda tabwğa boladı, biraq olardıñ mağlumat bölşekteri barşağa qatınalmaýdı.'''
-
-{{SITENAME}} jobasınıñ basqa äkimşileri jasırın mağlumatqa qatınaý aladı, jäne qosımşa tïımdar qoýılğanşa deýin, osı tildesw arqılı joywdı boldırmawı mümkin.",
'revdelete-legend' => 'Körinis tïımdarın qoyw:',
'revdelete-hide-text' => 'Tüzetw mätinin jasır',
'revdelete-hide-image' => 'Faýl mağlumatın jasır',
'rev-showdeleted' => 'ತೋರಿಸು',
'revdelete-show-file-submit' => 'ಹೌದು',
'revdelete-selected' => "'''[[:$1]]ರ ಆಯ್ಕೆಯಾಗಿರುವ {{PLURAL:$2|ಆವೃತ್ತಿ|ಆವೃತ್ತಿಗಳು}}:'''",
-'revdelete-text' => "'''ಅಳಿಸಲ್ಪಟ್ಟಿರುವ ಬದಲಾವಣೆಗಳು ಮತ್ತು ಘಟನೆಗಳು ಪುಟದ ಇತಿಹಾಸದಲ್ಲಿ ತೋರುತ್ತದೆ, ಆದರೆ ಅದರಲ್ಲಿನ ಮಾಹಿತಿಯು ಸಾರ್ವಜನಿಕರಿಗೆ ದೊರೆಯುವುದಿಲ್ಲ.'''
-
-{{SITENAME}} ಅಲ್ಲಿನ ಇತರ ನಿರ್ವಾಹಕರು ಹೀಗೆ ಅಡಗಿಸಲ್ಪಟ್ಟ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಬಹುದು ಮತ್ತು ಅದರ ಅಳಿಸುವಿಕೆಯನ್ನು ಇದೇ ವ್ಯವಸ್ಥೆಯ ಪ್ರಕಾರ ರದ್ದುಮಾಡಬಹುದು. ಹೆಚ್ಚುವರಿ ನಿಬಂಧನಗಳಿದ್ದರೆ ಹಾಗೆ ಮಾಡಲಾಗುವುದಿಲ್ಲ.",
'revdelete-legend' => 'ಕಾಣಿಸುವಿಕೆಯ ನಿಬಂಧನೆಗಳನ್ನು ನಿಶ್ಚಯಿಸು',
'revdelete-hide-text' => 'ಬದಲಾವಣೆಯ ಪಠ್ಯವನ್ನು ಅಡಗಿಸು',
'revdelete-hide-image' => 'ಫೈಲಿನಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು',
'tog-ccmeonemails' => '이메일을 보낼 때 내 이메일로 복사본을 보내기',
'tog-diffonly' => '편집 차이를 비교할 때 문서 내용을 보지 않기',
'tog-showhiddencats' => '숨은 분류 보이기',
-'tog-noconvertlink' => '링크 제목 변환을 비활성화',
'tog-norollbackdiff' => '되돌리기 후 차이를 보지 않기',
'tog-useeditwarning' => '바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 알림',
'tog-prefershttps' => '로그인할 때 항상 보안 연결 사용',
'createacct-another-realname-tip' => '실명은 선택 사항입니다.
실명을 입력하면 문서 기여에 사용자의 이름이 들어가게 됩니다.',
'pt-login' => '로그인',
+'pt-login-button' => '로그인',
'pt-createaccount' => '계정 만들기',
'pt-userlogout' => '로그아웃',
'revdelete-show-file-submit' => '예',
'revdelete-selected' => "'''[[:$1]]의 {{PLURAL:$2|선택한 판}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|선택한 기록}}:'''",
-'revdelete-text' => "'''삭제된 판과 기록은 문서 역사와 기록에 계속 나타나지만, 내용은 공개되지 않을 것입니다.'''
-{{SITENAME}}의 다른 관리자는 다른 제한이 설정되어 있지 않는 한, 숨겨진 내용을 볼 수 있고, 같은 도구를 이용해 되살릴 수 있습니다.",
'revdelete-confirm' => '이 작업을 수행하는 것의 결과를 알고 있으며, [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지 확인해주세요.',
'revdelete-suppress-text' => "숨기기는 '''다음 경우에만''' 사용되어야 합니다:
* 잠재적인 비방 정보
'search-file-match' => '(내용이 일치하는 파일 있음)',
'search-suggest' => '$1 문서를 찾고 있으신가요?',
'search-interwiki-caption' => '자매 프로젝트',
-'search-interwiki-default' => '$1 결과:',
+'search-interwiki-default' => '$1 로부터의 결과:',
'search-interwiki-more' => '(더 보기)',
'search-relatedarticle' => '관련',
'searcheverything-enable' => '모든 이름공간에서 검색',
'delete-warning-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
주의해 주세요.',
-'deleting-backlinks-warning' => "'''경고:''' 삭제하려는 문서가 다른 문서에 연결되거나 삽입되어 있습니다.",
+'deleting-backlinks-warning' => "'''경고:''' 삭제하려는 문서가 [[Special:WhatLinksHere/{{FULLPAGENAME}}다른 문서에 연결]]되거나 삽입되어 있습니다.",
# Rollback
'rollback' => '편집 되돌리기',
'userlogin-resetpassword-link' => 'Паролну джибериу',
'helplogin-url' => 'Help:Кириу',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Системагъа кириуде болушлукъ]]',
+'userlogin-createanother' => 'Башха аккаунт къурау',
'createacct-join' => 'Билгилеринги тюбюрекде джаз.',
'createacct-emailrequired' => 'Электрон почтаны адреси',
'createacct-emailoptional' => 'Электрон почтаны адреси (амалсыз тюлдю)',
'createacct-captcha' => 'Къоркъуусузлукъну тинтиу',
'createacct-imgcaptcha-ph' => 'Башыракъда кёрюннген текстни джаз',
'createacct-submit' => 'Тергеу джазыуну къура',
+'createacct-another-submit' => 'Энтда бир аккаунт къурау',
'createacct-benefit-heading' => '{{SITENAME}} сизнича адамла бла къуралгъанды.',
'createacct-benefit-body1' => '{{PLURAL:$1|тюрлениу}}',
'createacct-benefit-body2' => '{{PLURAL:$1|бет}}',
'login-abort-generic' => 'Системагъа кириу джетишимсиз болду',
'loginlanguagelabel' => 'Тил: $1',
'suspicious-userlogout' => 'Терс браузер неда кэш этиучу прокси берген соруугъа ушагъаны ючюн, Сизни чыгъаргъа сорууугъуз алынмагъанды.',
+'pt-login' => 'Кириу',
+'pt-createaccount' => 'Аккаунт къурау',
+'pt-userlogout' => 'Чыгъыу',
# Email sending
'php-mail-error-unknown' => "PHP's mail() функцияда белгили болмагъан халат",
'revdelete-show-file-submit' => 'Хоу',
'revdelete-selected' => "'''[[:$1]] бетни {{PLURAL:$2|1=Сайланнган версия|сайланнган версиялары}}:'''",
'logdelete-selected' => "'''Журналны {{PLURAL:$1|1=Сайланнган джазыу|сайланнган джазыулары}}:'''",
-'revdelete-text' => "'''Кетерилге версияла бла болуула алкъын бетни тарихи бла журналлада кёрюннюкдю, алай а бир кесеги тюз кириучюледен джашырыллыкъды.'''
-{{SITENAME}} сайтдагъы башха администраторла джашырылгъан ичге кирирге эмда аны ызына салыргъа боллукъдула.",
'revdelete-confirm' => 'Тилейбиз, буну этерге излегенигизни, эсеблерин ангылагъаныгъызны, эм буну [[{{MediaWiki:Policy-url}}|джорукълагъа]] кёре этгенигизни билдиригиз.',
'revdelete-suppress-text' => "Джашырыу '''джангыз''' бу турумлада этиледи:
* Келишмеген энчи информация
'tog-ccmeonemails' => 'Scheck mer en Kopie, wann ich en <i lang="en">e-mail</i> an ene andere Metmaacher scheck',
'tog-diffonly' => 'Zeich beim Versione Verjliche nur de Ungerscheide aan (ävver pack nit noch de janze Sigg dodronger)',
'tog-showhiddencats' => 'Donn de verstoche Saachjroppe aanzeije',
-'tog-noconvertlink' => 'Don de Tittele nit ömwandelle',
'tog-norollbackdiff' => 'Donn noh „{{int:Rollback}}“ de Ungerscheide nit aanzeije',
'tog-useeditwarning' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
'tog-prefershttps' => 'Jangk emmer övver en verschlößelte Verbendong bei Enlogge',
'revdelete-show-file-submit' => 'Lohß Jonn!',
'revdelete-selected' => "'''{{PLURAL:$2|Ein usjewählte Version|$2 usjewählte Versione|Kein Version usjewählt}} vun [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Dä ußjewählte Logboch-Endrach|De Ußjewählte Logboch-Endrähsch}}:'''",
-'revdelete-text' => "'''Dä fottjeschmesse Sigge ehre Enhald kanns De nit mieh aanluure. Se blieve ävver en de Liss met de Versione un en de Logböcher dren.'''
-Ene Wiki Köbes kann de fottjeschmessene Krom immer noch aanluere un kann en och widder herholle, usser wann bei
-dem Wiki singe Installation dat anders fassjelaht woode es.",
'revdelete-confirm' => 'Bes esu joot un doon dat beschtääteje, un donn domet ongerschriive, dat De dat donn wells, dat De weiß, wat dobei eruß kütt, un dat De dat och noh de [[{{MediaWiki:Policy-url}}|Rääjelle]] deihß.',
'revdelete-suppress-text' => "Dat sullt '''blooß''' jedonn wäde för:
* onjesäzlesche Aanjaabe
'tog-ccmeonemails' => 'Schéck mir eng Kopie vun de Mailen, déi ech anere Benotzer schécken.',
'tog-diffonly' => "Weis bei Versiounsvergläicher just d'Ënnerscheeder an net déi ganz Säit",
'tog-showhiddencats' => 'Verstoppt Kategorië weisen',
-'tog-noconvertlink' => 'Ëmwandlung vum Titel desaktivéieren',
'tog-norollbackdiff' => 'Ënnerscheed nom Zrécksetzen ënnerdrécken',
'tog-useeditwarning' => "Mech warne wann ech d'Ännerung vun enger Säit verloossen, ouni Ännerunge gespäichert ze hunn",
'tog-prefershttps' => 'Ëmmer eng sécher Verbindung benotze wann ageloggt',
Wann Dir en ugitt, gëtt e benotzt fir d'Benotzerattributiounen fir Är Aarbecht zouzeuerdnen.",
'pt-login' => 'Aloggen',
+'pt-login-button' => 'Aloggen',
'pt-createaccount' => 'Benotzerkont opmaachen',
'pt-userlogout' => 'Ausloggen',
'revdelete-show-file-submit' => 'Jo',
'revdelete-selected' => "'''{{PLURAL:$2|Gewielt Versioun|Gewielt Versioune}} vu(n) [[:$1]] :'''",
'logdelete-selected' => "'''Ausgewielten {{PLURAL:$1|Evenement|Evenementer}} aus dem Logbuch:'''",
-'revdelete-text' => "'''Geläscht Versiounen oder aner geläscht Bestanddeeler sinn net méi ëffentlech zougänglech, si stinn awer weiderhin an der Versiounsgeschicht vun der Säit.'''
-Aner {{SITENAME}}-Administrateure kënnen de geläschten Inhalt oder aner geläscht Bestanddeeler weiderhi gesinn a restauréieren, et sief, et gouf festgeluecht, datt déi Limitatioune vum Accès och fir Administrateure gëllen.",
'revdelete-confirm' => "Confirméiert w.e.g. datt Dir dat maache wëllt, datt Dir d'Konsequenze verstitt an datt Dir dëst an Aklang mat de [[{{MediaWiki:Policy-url}}|Richtlinne]] maacht.",
'revdelete-suppress-text' => "Ënnerdréckung sollt '''nëmmen''' an dëse Fäll benotzt ginn:
* Informatiounen déi beleidege kéinten
'difference-title-multipage' => '$1 a(n) $2: Ënnerscheed tëscht de Säiten',
'difference-multipage' => '(Ënnerscheed tëscht Säiten)',
'lineno' => 'Linn $1:',
-'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
+'compareselectedversions' => 'Ausgewielt Versioune vergläichen',
'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
'editundo' => 'zréck',
'diff-empty' => '(Keen Ënnerscheed)',
'search-file-match' => '(Inhalt vum Fichier passt)',
'search-suggest' => 'Mengt Dir: $1',
'search-interwiki-caption' => 'Schwësterprojeten',
-'search-interwiki-default' => '$1 Resultater:',
+'search-interwiki-default' => 'Resultater vu(n) $1:',
'search-interwiki-more' => '(méi)',
'search-relatedarticle' => 'A Verbindung',
'searcheverything-enable' => 'An allen Nummraim sichen',
'revdelete-show-file-submit' => 'Jao',
'revdelete-selected' => "'''Geselecteerde {{PLURAL:$2|bewerking|bewerkinge}} van '''[[:$1]]''':'''",
'logdelete-selected' => "'''{{PLURAL:$1|Geselecteerde log gebeurtenis|Geselecteerde log gebeurtenisse}}:'''",
-'revdelete-text' => "'''Gewisjde bewerkinge zeen zichbaar in de gesjiedenis, maar de inhoud is neet langer publiek toegankelik.'''
-Anger beheerders van {{SITENAME}} kinne de verborge inhoud benäöjere en de verwiedering ongedaon make mit behölp van dit sjerm, tenzij d'r additionele restricties gelje die zeen ingesteld door de systeembeheerder.",
'revdelete-confirm' => "Bevestig des se dit wils doon, des se de consequenties begrieps en des se dit deis in euvereinstömming mit 't geljendj [[{{MediaWiki:Policy-url}}|beleid]].",
'revdelete-suppress-text' => "Versies verbèrge deentj '''allein''' gebroek te waere in de volgende gevalle:
* Ongepaste perseunlike informatie
'loginlanguagelabel' => 'Kalba: $1',
'suspicious-userlogout' => 'Jūsų prašymas atsijungti buvo atmestas, nes, atrodo, jį klaidingai išsiuntė naršyklė arba spartinantysis tarpinis serveris.',
'pt-login' => 'Prisijungti',
+'pt-login-button' => 'Prisijungti',
'pt-createaccount' => 'Sukurti paskyrą',
'pt-userlogout' => 'Atsijungti',
'revdelete-show-file-submit' => 'Taip',
'revdelete-selected' => "'''{{PLURAL:$2|Pasirinkta [[:$1]] versija|Pasirinktos [[:$1]] versijos}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Pasirinktas istorijos įvykis|Pasirinkti istorijos įvykiai}}:'''",
-'revdelete-text' => "'''Ištrintos versijos bei įvykiai vis tiek dar bus rodomi puslapio istorijoje ir specialiųjų veiksmų sąraše, bet jų turinio dalys nebus viešai prieinamos.'''
-Kiti administratoriai iš {{SITENAME}} vis tiek galės pasiekti paslėptą turinį ir galės jį atkurti per tą pačią sąsają, nebent yra nustatyti papildomi apribojimai.",
'revdelete-confirm' => 'Prašome patvirtinti, kad jūs tai ketinate padaryti, kad jūs suprantate padarinius, ir kad jūs tai darote pagal [[{{MediaWiki:Policy-url}}|politiką]].',
'revdelete-suppress-text' => "Ištrynimas turėtų būti taikomas '''tik''' šiais atvejais:
* Netinkama asmeninė informacija
*: ''namų adresai, telefonų numeriai, asmens kodai ir t. t.''",
'revdelete-legend' => 'Nustatyti matomumo apribojimus:',
-'revdelete-hide-text' => 'Slėpti versijos tekstą',
+'revdelete-hide-text' => 'Versijos tekstas',
'revdelete-hide-image' => 'Slėpti failo turinį',
'revdelete-hide-name' => 'Slėpti veiksmą ir paskirtį',
-'revdelete-hide-comment' => 'Slėpti redagavimo komentarą',
-'revdelete-hide-user' => 'Slėpti redagavusiojo naudotojo vardą ar IP adresą',
+'revdelete-hide-comment' => 'Keitimo komentaras',
+'revdelete-hide-user' => 'Redagavusiojo naudotojo vardas/IP adresas',
'revdelete-hide-restricted' => 'Nuslėpti duomenis nuo adminstratorių kaip ir nuo kitų',
'revdelete-radio-same' => '(nekeisti)',
-'revdelete-radio-set' => 'Taip',
-'revdelete-radio-unset' => 'Ne',
+'revdelete-radio-set' => 'Paslėpta',
+'revdelete-radio-unset' => 'Matoma',
'revdelete-suppress' => 'Slėpti duomenis nuo administratorių kaip ir nuo kitų',
'revdelete-unsuppress' => 'Šalinti apribojimus atkurtose versijose',
'revdelete-log' => 'Priežastis:',
'compareselectedversions' => 'Palyginti pasirinktas versijas',
'showhideselectedversions' => 'Rodyti/slėpti pasirinktas versijas',
'editundo' => 'atšaukti',
+'diff-empty' => '(Jokio skirtumo)',
'diff-multi-manyusers' => '(daugiau nei $2 {{PLURAL:$2|naudotojo|naudotojų|naudotojų}} $1 {{PLURAL:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}})',
# Search results
'shown-title' => 'Rodyti $1 {{PLURAL:$1|rezultatą|rezultatus|rezultatus}} puslapyje',
'viewprevnext' => 'Žiūrėti ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Puslapis pavadinimu „[[$1]]“ šioje wiki'''",
-'searchmenu-new' => "'''Sukurti puslapį „[[:$1]]“ šioje wiki!'''",
+'searchmenu-new' => '<strong>Sukurti puslapį „[[:$1]]“ šioje wiki!</strong> {{PLURAL:$2|0=|Taip pat peržiūrėkite šį rastą puslapį.|Taip pat peržiūrėkite šiuos paieškos rezultatus.}}',
'searchprofile-articles' => 'Turinio puslapiai',
'searchprofile-project' => 'Pagalbos ir projekto puslapiai',
'searchprofile-images' => 'Daugialypės terpės failai',
'search-section' => '(skyrius $1)',
'search-suggest' => 'Galbūt norėjote $1',
'search-interwiki-caption' => 'Dukteriniai projektai',
-'search-interwiki-default' => '$1 rezultatai:',
+'search-interwiki-default' => 'Rezultatai iš $1:',
'search-interwiki-more' => '(daugiau)',
'search-relatedarticle' => 'Susiję',
'searcheverything-enable' => 'Ieškoti visose vardų srityse',
'recentchanges-label-unpatrolled' => 'Šis keitimas dar nebuvo patikrintas',
'recentchanges-label-plusminus' => 'Šiuo baitų skaičiumi pakeista puslapio apimtis',
'recentchanges-legend-newpage' => '$1 - naujas puslapis',
-'rcnotefrom' => "Žemiau yra pakeitimai pradedant '''$2''' (rodoma iki '''$1''' pakeitimų).",
+'rcnotefrom' => 'Žemiau yra pakeitimai pradedant <strong>$2</strong> (rodoma iki <strong>$1</strong> pakeitimų).',
'rclistfrom' => 'Rodyti naujus pakeitimus pradedant $1',
'rcshowhideminor' => '$1 smulkius keitimus',
'rcshowhideminor-show' => 'Rodyti',
'rcshowhidebots' => '$1 robotus',
'rcshowhidebots-show' => 'Rodyti',
'rcshowhidebots-hide' => 'Slėpti',
-'rcshowhideliu' => '$1 prisijungusius naudotojus',
+'rcshowhideliu' => '$1 registruotus naudotojus',
'rcshowhideliu-show' => 'Rodyti',
'rcshowhideliu-hide' => 'Slėpti',
'rcshowhideanons' => '$1 anoniminius naudotojus',
'revdelete-show-file-submit' => 'Jā',
'revdelete-selected' => "'''[[:$1]] {{PLURAL:$2|izvēlētā versija|izvēlētās versijas}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Izvēlētais reģistra ieraksts|Izvēlētie reģistra ieraksti}}:'''",
-'revdelete-text' => "'''Lapu hronoloģijā un reģistros izdzēstās versijas vēl joprojām būs redzamas, tomēr daļa informācijas nebūs pieejama publiski.''' Citi {{SITENAME}} administratori varēs apskatīt spēlto saturu un varēs to atslēpt, ja vien nav papildu ierobežojumi.",
'revdelete-confirm' => 'Lūdzu apstiprini, ka Tu zini, ko dari, Tu apzinies sekas, tāpat Tu to dari saskaņā ar vadlīnijām.',
'revdelete-suppress-text' => "Paslēpšanu izmantot vienīgi šādos gadījumos:
* potenciāli apmelojoša informācija
'tog-ccmeonemails' => '凡所遺書,請存副本。',
'tog-diffonly' => '異下無示頁',
'tog-showhiddencats' => '示隱類',
-'tog-noconvertlink' => '非轉鍵題',
'tog-norollbackdiff' => '轉後略異',
'tog-useeditwarning' => '離而未存,示吾',
'revdelete-show-file-submit' => '善',
'revdelete-selected' => "'''審[[:$1]]已擇$2:'''",
'logdelete-selected' => "'''已擇誌$1:'''",
-'revdelete-text' => "'''刪審雖見誌,其文摒公眾,惟有秩可得之。'''無規則有秩可復還焉。",
'revdelete-confirm' => '爾確作之,解之果焉,合之[[{{MediaWiki:Policy-url}}|策]]矣。',
'revdelete-suppress-text' => "'''限'''於此壓:
* 無適之個訊
'revdelete-show-file-submit' => 'हँ',
'revdelete-selected' => "'''{{PLURAL:$2|चुनल संशोधन|चुनल संशोधन सभ}} एकर [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|चुनल वृत्तलेख घटना|चुनल वृत्तलेख घटना सभ}}:'''",
-'revdelete-text' => "'''मेटाएल संशोधन सभ आ घटना सभ पन्नाक इतिहास आ वृत्तलेखमे आएत, मुदा ओकर सूचीक किछु भाग सामान्य लोक लेल उपलब्ध नै रहत।'''
-{{अन्तर्जाल}} पर दोसर संचालक लग अखनो नुकाएल सूची उपलब्ध छन्हि आ ओ ओकरा फेरसँ आनि सकै छथि अही मध्यस्थक द्वारा, आ से हएत जँ अतिरिक्त प्रतिबन्ध लागू रहत।",
'revdelete-confirm' => 'कृपा कऽ आश्वस्त भऽ जाउ जे अहाँ ई करऽ चाहै छी, अहाँकेँ एकर परिणामक जनतब अछि, आ अहाँ एकरा [[{{MediaWiki:Policy-url}}|निअम]] क अनुसार कऽ रहल छी।',
'revdelete-suppress-text' => "दबाबैबला काज '''मात्र''' ऐ सभ स्थितिमे प्रयोग करू:
* मानहानिक सम्भावनाबला सूचना
'revdelete-show-file-submit' => 'Ина',
'revdelete-selected' => "''''''$1:'''-нь {{PLURAL:$2|Кочкаф верзиец|Кочкаф верзиенза}}'''",
'logdelete-selected' => "'''{{PLURAL:$1|Кочкаф сёрматфтомась|кочкаф сёрматфтоматне}}:'''",
-'revdelete-text' => "'''Нардаф верзиетне илядыхть няевикс лопать историясонза ди нардамань лувомава, интай сонь потмоснон пакшенза кармайхть аф сембонди сатовихть.'''
-Иля {{SITENAME}}нь оцюнятненди кяшф потмоснон ули кода ваномс эди мърдафтомс тяка програмонь ванфть вельде мъзярс иля кардафксне исть путов.",
'revdelete-legend' => 'Арафтомс няемга оторхне',
'revdelete-hide-text' => 'Кяшемс тя лопать верзиенц',
'revdelete-hide-image' => 'Кяшемс файлхнень потмосна',
'revdelete-show-file-submit' => 'Eny',
'revdelete-selected' => "'''{{PLURAL:$2|Votoatiny nosafidiana|Votoatiny nosafidiana}}n'i '''[[:$1]]''' :'''",
'logdelete-selected' => "'''{{PLURAL:$1||}}Laogy voafidy :'''",
-'revdelete-text' => "'''Mbola ho ao amin'ny laogim-pejy ary ao amin'ny logy ny versiona ary zava-nitranga voaesotra, fa tsy ho hitan'ny mason'ny vahoaka ny votoatin'izy ireo.'''
-Mbola afaka jeren'ireo mpandrindran'i {{SITENAME}} foana ny votoatiny voafina ary azony atao ho hitan'ny vahoaka indray ilay izy amin'ny alalan'ity pejy fanaovan-tsafidy ity, raha tsy misy fepetra apetraka.",
'revdelete-confirm' => 'Amafiso eto ny hevitrao raha hanao io ianao, raha azonao sary an-tsaina ny mety ho vokany, ary raha araka ny [[{{MediaWiki:Policy-url}}|fepetra mihatra]] ny zavatra ataonao.',
'revdelete-suppress-text' => "Ny famafàna pejy dia ampiasaina rehefa :
* Fampahalalana mampiely lainga
'revdelete-show-file-submit' => 'Yo',
'revdelete-selected' => "'''{{PLURAL:$2|Revisi piliahan}} dari [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Log piliahan}}:'''",
-'revdelete-text' => "'''Revisi jo tindakan nan alah dihapuih akan tetap muncua di versi tadaulu dan laman log, tapi bagian dari isinyo indak dapek diakses publik.'''
-Panguruih {{SITENAME}} lain tetap dapek mangakses isi nan tasuruak ko dan dapek mambatalan pangapuihannyo manggunoan antarmuko nan samo, kacuali ado pambatehan lain nan dibuek.",
'revdelete-confirm' => 'Tolong konfirmasi baso Sanak samemang bamakasuik malakuan iko, mamahami konsekuensinyo, dan baso Sanak malakuannyo sasuai jo [[{{MediaWiki:Policy-url}}|kabijakan]].',
'revdelete-suppress-text' => "Panyambunyian revisi '''hanyo''' buliah digunoan untuak kasus-kasus barikuik:
* Informasi paribadi nan indak patuik
'tog-ccmeonemails' => 'Испраќај ми мои примероци од писмата што ги праќам на другите корисници',
'tog-diffonly' => 'Не ја покажувај содржината на страницата под разликите',
'tog-showhiddencats' => 'Прикажи скриени категории',
-'tog-noconvertlink' => 'Оневозможи претворање на наслов на врска',
'tog-norollbackdiff' => 'Изостави ја разликата по извршено отповикување',
'tog-useeditwarning' => 'Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените',
'tog-prefershttps' => 'Секогаш најавувај ме преку безбедна врска',
'createacct-another-realname-tip' => 'Вистинското име е незадолжително.
Доколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.',
'pt-login' => 'Најава',
+'pt-login-button' => 'Најава',
'pt-createaccount' => 'Направи сметка',
'pt-userlogout' => 'Одјава',
'revdelete-show-file-submit' => 'Да',
'revdelete-selected' => "'''{{PLURAL:$2|Избрана ревизија|Избрани ревизии}} од [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Одбран настан од дневник|Одбрани настани од дневник}}:'''",
-'revdelete-text' => "'''Избришаните измени и настани сѐ уште ќе се појавуваат во историјата на страницата и дневниците, но делови од нивната содржина ќе бидат недостапни за јавноста.'''
-Други администратори на {{SITENAME}} сѐ уште ќе имаат пристап до скриената содржина и ќе можат да ја вратат преку истиот посредник, освен ако не се поставени дополнителни ограничувања.",
'revdelete-confirm' => 'Потврдете дека сакате да го направите ова, дека ги сфаќате последиците, и дека тоа го правите во согласност со [[{{MediaWiki:Policy-url}}|правилата]].',
'revdelete-suppress-text' => "Притајувањето се користи '''само''' во следниве случаи:
* Потенцијално клеветнички информации
'delete-warning-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
Бришењето може да предизвика проблеми при работењето на базата на податоци на {{SITENAME}};
продолжете доколку сте сигруни дека треба тоа да го сторите.',
-'deleting-backlinks-warning' => "'''Предупредување:''' До страницата што сакате да ја избришете водат други страници или се превметнуваат во неа.",
+'deleting-backlinks-warning' => "'''Предупредување:''' До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
# Rollback
'rollback' => 'Отповикај промени',
'revdelete-show-file-submit' => 'അതെ',
'revdelete-selected' => "'''[[:$1]] എന്ന താളിന്റെ {{PLURAL:$2|തിരഞ്ഞെടുത്ത പതിപ്പ്|തിരഞ്ഞെടുത്ത പതിപ്പുകൾ}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|തിരഞ്ഞെടുത്ത രേഖയിലുള്ളത്|തിരഞ്ഞെടുത്ത രേഖയിലുള്ളവ}}:'''",
-'revdelete-text' => "'''മായ്ക്കപ്പെട്ട നാൾപ്പതിപ്പുകളും സംഭവങ്ങളും താളിന്റെ നാൾവഴിയിലും രേഖകളിലും ഉണ്ടായിരിക്കും, പക്ഷേ ആ ഉള്ളടക്കം പൊതുജനത്തിനു ലഭ്യമായിരിക്കില്ല.'''
-
-മറ്റു സംരക്ഷണ പരിമിതികൾ സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ {{SITENAME}} സംരംഭത്തിലെ മറ്റു കാര്യനിർവാഹകർക്ക്, ഇതേ സമ്പർക്കമുഖം ഉപയോഗിച്ചു തന്നെ, ഈ മറഞ്ഞിരിക്കുന്ന ഉള്ളടക്കം പരിശോധിക്കുവാനും താങ്കൾ മായ്ച്ചതു തിരസ്കരിക്കുവാനും സാധിക്കും.",
'revdelete-confirm' => 'ഇതിന്റെ അനന്തരഫലങ്ങളെക്കുറിച്ചറിയാമെന്നും, [[{{MediaWiki:Policy-url}}|നയങ്ങൾ]] പാലിച്ചാണ് താങ്കളിത് ചെയ്യുന്നതെന്നും ഉറപ്പാക്കുക.',
'revdelete-suppress-text' => "താഴെ പറയുന്ന സാഹചര്യങ്ങളിൽ '''മാത്രമേ''' ഒതുക്കൽ ഉപയോഗിക്കാവൂ:
* അപകീർത്തികരമായ വിവരങ്ങൾ അടങ്ങിയവ
'delete-edit-reasonlist' => 'മായ്ക്കലിന്റെ കാരണം തിരുത്തുക',
'delete-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സംരംഭത്തിന്റെ നിലനില്പ്പിനെ തന്നെ ബാധിക്കുമെന്നതിനാൽ ഈ താൾ മായ്ക്കുന്നതിനുള്ള അവകാശം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.',
'delete-warning-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. അതായത്, ഇതിനു് $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സംരംഭത്തിന്റെ ഡാറ്റാബേസ് ഓപ്പറേഷനെ ബാധിച്ചേക്കാം. അതിനാൽ വളരെ ശ്രദ്ധാപൂർവ്വം തുടർനടപടികളിലേക്കു നീങ്ങുക.',
-'deleting-backlinks-warning' => "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും താളിലേയ്ക്കുള്ള കണ്ണികൾ അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
+'deleting-backlinks-warning' => "'''മുന്നറിയിപ്പ്:''' മറ്റു താളുകളിൽ നിന്നും [[Special:WhatLinksHere/{{FULLPAGENAME}}|താളിലേയ്ക്കുള്ള കണ്ണികൾ]] അല്ലെങ്കിൽ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ താങ്കൾ മായ്ക്കാൻ പോവുകയാണ്.",
# Rollback
'rollback' => 'തിരുത്തലുകൾ റോൾബാക്ക് ചെയ്യുക',
'sp-contributions-blocked-notice-anon' => 'ഈ ഐ.പി. വിലാസം ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്.
അവലംബമായി തടയൽ രേഖയുടെ പുതിയഭാഗം താഴെ കൊടുത്തിരിക്കുന്നു:',
'sp-contributions-search' => 'ചെയ്ത സേവനങ്ങൾ',
+'sp-contributions-suppresslog' => 'ഒതുക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ',
'sp-contributions-username' => 'ഐ.പി. വിലാസം അഥവാ ഉപയോക്തൃനാമം:',
'sp-contributions-toponly' => 'ഒടുവിലത്തെ നാൾപ്പതിപ്പുകൾ മാത്രം പ്രദർശിപ്പിക്കുക',
'sp-contributions-newonly' => 'താൾ സൃഷ്ടിക്കാനുള്ള തിരുത്തുകൾ മാത്രം പ്രദർശിപ്പിക്കുക',
* @ingroup Language
* @file
*
+ * @author Boldbdd
* @author Chinneeb
* @author E.shijir
* @author Kaganer
* @author Meno25
+ * @author Mongol
* @author MongolWiki
* @author Wisdom
* @author Zorigt
'tog-diffonly' => 'Өөрчлөлтөөс доогуурх хуудсын агуулгыг үзүүлэхгүй байх',
'tog-showhiddencats' => 'Нуугдсан ангиллуудыг үзүүлэх',
'tog-norollbackdiff' => 'Буцаасны дараа өөрчлөлтийг орхигдуулах',
+'tog-useeditwarning' => 'Засварын хуудсаа хадгалалгүй гарах үед сануул',
+'tog-prefershttps' => 'Нэвтэрсэн үедээ үргэлж найдвартай сүлжээ хэрэглэнэ үү',
'underline-always' => 'Байнга',
'underline-never' => 'Хэзээ ч үгүй',
'vector-action-unprotect' => 'Хамгаалалтаа солих',
'vector-view-create' => 'Үүсгэх',
'vector-view-edit' => 'Засварлах',
-'vector-view-history' => 'Түүх',
+'vector-view-history' => 'Ð\97аÑ\81ваÑ\80Ñ\8bн Ñ\82үүх',
'vector-view-view' => 'Унших',
'vector-view-viewsource' => 'Кодыг харах',
'actions' => 'Үйлдлүүд',
'toc' => 'Агуулга',
'showtoc' => 'дэлгэх',
'hidetoc' => 'хумих',
-'collapsible-collapse' => 'Хумих',
-'collapsible-expand' => 'Ð\94элгэх',
+'collapsible-collapse' => 'хумих',
+'collapsible-expand' => 'дэлгэх',
'thisisdeleted' => '$1-г харах эсвэл сэргээх үү?',
'viewdeleted' => '$1-г харах уу?',
'restorelink' => '{{PLURAL:$1|арилгасан засвар|арилгасан $1 засварууд}}',
'sort-ascending' => 'Өсөхөөр эрэмбэлэх',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Хуудас',
+'nstab-main' => 'Өгүүлэл',
'nstab-user' => 'Хэрэглэгчийн хуудас',
'nstab-media' => 'Медиа хуудас',
'nstab-special' => 'Тусгай хуудас',
'nstab-mediawiki' => 'Мэдэгдэл',
'nstab-template' => 'Загвар',
'nstab-help' => 'Тусламж',
-'nstab-category' => 'Ангилал',
+'nstab-category' => 'Анги',
# Main script and global functions
'nosuchaction' => 'Тийм үйлдэл байхгүй байна',
# General errors
'error' => 'Aлдаа',
'databaseerror' => 'Өгөгдлийн сангийн алдаа',
+'databaseerror-function' => 'Функц: $1',
+'databaseerror-error' => 'Алдаа: $1',
'laggedslavemode' => 'Анхаар: Энэ хуудас нь хамгийн сүүлийн өөрчлөлтүүдийг хамруулаагүй байж болно.',
'readonly' => 'Мэдээллийн сан түгжигдсэн байна',
'enterlockreason' => 'Түгжих болсон шалтгаан болон хэзээ уг түгжээ нь тайлагдах тухай оруулна уу.',
'namespaceprotected' => "Таньд '''$1''' нэрний зай дахь хуудсуудыг засварлах зөвшөөрөл байхгүй байна.",
'customcssprotected' => 'Энэхүү CSS хуудас өөр хэрэглэгчийн хувийн тохиргоог агуулдаг тул та засварлах эрхгүй.',
'customjsprotected' => 'Энэхүү JavaScript хуудас өөр хэрэглэгчийн хувийн тохиргоог агуулдаг тул та засварлах эрхгүй.',
+'mycustomjsprotected' => 'Танд энэхүү ЖаваСкрипт хуудсыг засварлах эрх байхгүй байна.',
+'myprivateinfoprotected' => 'Танд хувийн мэдээллээ засварлах эрх байхгүй байна.',
'ns-specialprotected' => 'Тусгай хуудсуудыг засварлах боломжгүй.',
'titleprotected' => "[[User:$1|$1]] нь энэ хуудсыг үүсгэх явдыг хорьжээ.
Шалтгаан нь: ''$2''.",
'createacct-yourpasswordagain' => 'Нууц үгээ баталгаажуулна уу',
'createacct-yourpasswordagain-ph' => 'Нууц үгээ дахиж оруулна уу',
'remembermypassword' => 'Энэ компьютер дээрх миний нэвтрэлтийг сана (хамгийн дээд талдаа $1 {{PLURAL:$1|өдрийн|өдрийн}} туршид)',
+'userlogin-signwithsecure' => 'Хамгаалалттай сүлжээ хэрэглэнэ үү',
'yourdomainname' => 'Таны домэйн:',
'password-change-forbidden' => 'Та энэ вики дээрх нууц үгээ сольж болохгүй.',
'externaldberror' => 'Нэг бол гадны баталгаажуулах мэдээллийн сангийн алдаа гарсан, эсвэл та өөрийн гадны бүртгэлээ шинэчлэх эрхгүй байна.',
'logout' => 'Гарах',
'userlogout' => 'Гарах',
'notloggedin' => 'Нэвтрээгүй байна',
+'userlogin-noaccount' => 'Бүртгүүлж амжаагүй юу?',
'userlogin-joinproject' => '{{SITENAME}}-д бүртгүүлэх',
'nologin' => "Бүртгүүлж амжаагүй юу? '''$1'''.",
'nologinlink' => 'Бүртгүүлэх',
'userlogin-createanother' => 'Өөр бүртгэл үүсгэх',
'createacct-join' => 'Мэдээллээ оруулна уу.',
'createacct-another-join' => 'Шинэ бүртгэлийн мэдээллээ оруулна уу.',
+'createacct-emailrequired' => 'Цахим шуудангийн хаяг',
+'createacct-email-ph' => 'Цахим шуудангийн хаягаа оруулна уу',
+'createacct-another-email-ph' => 'Цахим шуудангийн хаяг оруулна уу',
'createaccountmail' => 'Мэйлээр илгээх',
'createacct-realname' => 'Жинхэнэ нэр (хоосон орхиж болно)',
'createaccountreason' => 'Шалтгаан:',
'createacct-reason' => 'Шалтгаан',
'createacct-reason-ph' => 'Өөр бүртгэл үүсгэх шалтгаан',
+'createacct-captcha' => 'Аюулгүй байдлын хяналт',
+'createacct-imgcaptcha-ph' => 'Дээр харагдаж буй бичвэрийг оруулна уу',
+'createacct-submit' => 'Бүртгүүлэх',
'createacct-benefit-heading' => '{{SITENAME}}-г тан шиг хүмүүс хийж байна.',
'createacct-benefit-body1' => '{{PLURAL:$1|засвар}}',
'createacct-benefit-body2' => '{{PLURAL:$1|хуудас}}',
'userexists' => 'Хэрэглэгчийн нэр ашиглагдаж байна.
Өөр нэрээр нэвтэрнэ үү.',
'loginerror' => 'Нэвтрэхэд алдаа гарлаа',
+'createacct-error' => 'Бүртгүүлэхэд гарсан алдаа',
'createaccounterror' => 'Бүртгэлийг үүсгэж чадсангүй: $1',
'nocookiesnew' => 'Таны хэрэглэгчийн бүртгэл үүсгэгдсэн боловч нэвтрээгүй байна.
{{SITENAME}}-д холбогдоход күүкиг хэрэглэдэг.
'passwordsent' => '"$1"-н бүртгүүлсэн мэйл хаяг руу шинэ нууц үг илгээгдлээ.
Мэйлээ авсныхаа дараа дахин нэвтрээрэй.',
'blocked-mailpassword' => 'Таны IP хаягаас засвар хийх эрхийг түгжсэн байгаа тул буруугаар ашиглахаас сэргийлэх үүднээс нууц үгийг сэргээхийг зөвшөөрөхгүй.',
-'eauthentsent' => 'Баталгаажуулах мэйл бүртгүүлсэн мэйл хаяг руу илгээгдлээ.
-Өөрийнхөө бүртгэлийг баталгаажуулахын тулд, өөр ямар нэг мэйл таны мэйл хаяг руу явуулагдахын өмнө тухай бүрийнхээ мэйл дэх зааврыг дагана уу.',
+'eauthentsent' => 'Баталгаажуулах мэйл бүртгүүлсэн цахим шуудангийн хаяг руу илгээгдлээ.
+Өөрийнхөө бүртгэлийг баталгаажуулахын тулд өөр ямар нэг цахим шуудан таны цахим шуудангийн хаяг руу илгээгдэхээс өмнө, цахим шуудан дахь зааврыг даган баталгаажуулна уу.',
'throttled-mailpassword' => 'Сүүлийн {{PLURAL:$1|1 цагт|$1 цагт}} нууц үгийг сануулах мэйлийг явуулсан байгаа.
Буруугаар ашиглахаас сэргийлэх үүднээс {{PLURAL:$1|цагт|$1 цагт}} нэг л сануулах мэйлийг явуулах боломжтой.',
'mailerror' => 'Мэйл илгээхэд алдаа гарлаа: $1',
'acct_creation_throttle_hit' => 'Сүүлийн өдөрт таны IP хаягийг ашиглан хүмүүс энэ викид тухайн хугацаа дахь шинэ бүртгэлийн дээд хязгаар болох {{PLURAL:$1|1 бүртгэл|$1 бүртгэл}} үүсгэжээ.
Ийнхүү энэ IP хаягийг ашигласан хүмүүс одоогийн байдлаар дахин бүртгэл үүсгэх боломжгүй байна.',
-'emailauthenticated' => 'Таны мэйл хаяг $2-ний $3 цагт баталгаажлаа.',
-'emailnotauthenticated' => 'Таны мэйл хаяг баталгаажаагүй байна.
+'emailauthenticated' => 'Таны цахим шуудангийн хаяг $2-ы/ий $3 цагт баталгаажлаа.',
+'emailnotauthenticated' => 'Таны цахим шуудангийн хаяг хараахан баталгаажаагүй байна.
Иймд доорх функцуудын алинд нь ч мэйл илгээгдэхгүй.',
'noemailprefs' => 'Эдгээр функцуудыг ашиглахад мэйл хаягаа өгөх хэрэгтэй.',
'emailconfirmlink' => 'Мэйл хаягаа баталгаажуулах',
Хэрэв буруугаар бүртгүүлсэн бол энэ мэдэгдлийг үл ойшоож болно.',
'usernamehasherror' => 'Хэрэглэгчийн нэрэнд хаш тэмдэгт орж болохгүй',
'login-throttled' => 'Та хэт олон удаа нэвтрэх гэж оролдсон байна.
-Хүлээж байгаад дахин оролдого уу.',
+$1 хүлээж байгаад дахин оролдоно уу.',
'login-abort-generic' => 'Та нэвтэрч чадсангүй',
'loginlanguagelabel' => 'Хэл: $1',
'suspicious-userlogout' => 'Таны гарах хүсэлт нь эвдэрхий хөтөч буюу кэшлэгч проксигоор явуулсан мэт харагдаж байгаа тул зөвшөөрсөнгүй.',
+'createacct-another-realname-tip' => 'Жинхэнэ нэрээ заавал оруулах албагүй.
+Оруулбал таны хийсэн бүтээлийг түүгээр хаяглана.',
+'pt-login' => 'Нэвтрэх',
+'pt-createaccount' => 'Бүртгүүлэх',
+'pt-userlogout' => 'Гарах',
# Email sending
'php-mail-error-unknown' => "PHP's mail() функцэд үл танигдах алдаа гарлаа.",
'user-mail-no-addy' => 'Цахин шуудангийн хаягийг оруулалгүйгээр шуудан явуулахыг оролдлоо.',
+'user-mail-no-body' => 'Хоосон аль эсвэл хэт богино цахим шуудан илгээх гэж оролдлоо.',
# Change password dialog
'changepassword' => 'Нууц үгээ солих',
'newpassword' => 'Шинэ нууц үг:',
'retypenew' => 'Шинэ нууц үгээ дахин оруулах:',
'resetpass_submit' => 'Нууц үгээ тогтоож нэвтрэх',
-'changepassword-success' => 'Таны нууц үг амжилттай солигдлоо! Та одоо нэвтэрч байна...',
+'changepassword-success' => 'Таны нууц үг амжилттай солигдлоо!',
+'changepassword-throttled' => 'Та хэт олон удаа нэвтрэх гэж оролдсон байна.
+$1 хүлээж байгаад дахин оролдоно уу.',
'resetpass_forbidden' => 'Нууц үг өөрчлөх боломжгүй',
'resetpass-no-info' => 'Энэ хуудсыг шууд үзэхийн тулд нэвтэрч орсон байх шаардлагатай.',
'resetpass-submit-loggedin' => 'Нууц үгээ солих',
'resetpass-wrong-oldpass' => 'Хүчингүй түр зуурын эсвэл одоогийн нууц үг байна.
Та аль хэдийнээ нууц үгээ сольсон эсвэл түр зуурын нууц үг хүссэн байна.',
'resetpass-temp-password' => 'Түр зуурын нууц үг:',
+'resetpass-expired' => 'Нууц үгийн хугацаа дууссан байна. Шинэ нууц үг оруулж нэвтрэнэ үү.',
# Special:PasswordReset
'passwordreset' => 'Нууц үгийг сэргээх',
'page_last' => 'сүүлийн',
'histlegend' => 'Радио товчлууруудыг сонгож дарсаны дараа enter товчлуурыг, эсвэл хуудасны доод талд байгаа товчлуур дээр дарж засваруудыг хооронд нь харьцуулна уу.<br />
-Тайлбар: strong>({{int:cur}})</strong> = хамгийн шинэ хувилбартай харьцуулалт, <strong>({{int:last}})</strong> = өмнөх хувилбартайх харьцуулалт, <strong>{{int:minoreditletter}}</strong> = бага хэмжээний засвар',
+Тайлбар: <strong>({{int:cur}})</strong> = одоогийн хувилбартай харьцуулах, <strong>({{int:last}})</strong> = өмнөх хувилбартай нь харьцуулах, <strong>{{int:minoreditletter}}</strong> = бага хэмжээний засвар',
'history-fieldset-title' => 'Түүх сөхье',
'history-show-deleted' => 'Зөвхөн устгагдсаныг',
'histfirst' => 'хамгийн эхэнд',
'historyempty' => '(хоосон байна)',
# Revision feed
-'history-feed-title' => 'Ð\97аÑ\81ваÑ\80Ñ\8bн Ñ\82үүх',
+'history-feed-title' => 'Түүх',
'history-feed-description' => 'Вики дэх энэ хуудасны засварын түүх',
'history-feed-item-nocomment' => '$2 дээрх $1',
'history-feed-empty' => 'Таны үзэх гэсэн хуудас байхгүй байна.
'revdelete-show-file-submit' => 'Тийм',
'revdelete-selected' => "'''[[:$1]]-н {{PLURAL:$2|сонгосон засвар|сонгосон засварууд}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Сонгосон логийн үйл явдал|Сонгосон логийн үйл явдлууд}}:'''",
-'revdelete-text' => "'''Устгагдсан засварууд ба үйл явдлууд нь хуудасны түүх болон логт харагдах хэвээр үлдэх ч эдгээрийн зарим агуулга нийтэд үл харагдана.'''
-Давхар хязгаарууд тавигдаагүй тохиолдолд {{SITENAME}}-н бусад администраторууд нуугдсан агуулгыг энэ талбараар харж үл арилгах боломжтой хэвээр үлдэнэ.",
'revdelete-confirm' => 'Та энэхүү үйлдлийг хийх гэж байгаа, үр дагаварыг ойлгож байгаа, [[{{MediaWiki:Policy-url}}|дүрмийн дагуу]] хийж байгаа гэдгээ батална уу.',
'revdelete-suppress-text' => "'''Зөвхөн'' дараах тохиолдлуудад л далдалгааг хэрэглэнэ:
*Гүтгэсэн, матсан байж болох мэдээлэл
'action-createtalk' => 'ярианы хуудас үүсгэх',
'action-createaccount' => 'энэ хэрэглэгчийн бүртгэлийг үүсгэх',
'action-minoredit' => 'энэ засварыг бага зэргийн гэж тэмдэглэх',
-'action-move' => 'хуудсыг зөөх',
+'action-move' => 'нэр солих',
'action-move-subpages' => 'энэ хуудас болон түүний дэд хуудсуудыг зөөх',
'action-move-rootuserpages' => 'хэрэглэгчийн үндсэн хуудсуудыг зөөх',
'action-movefile' => 'энэ файлыг зөөх',
# Recent changes
'nchanges' => '$1 өөрчлөлт',
'recentchanges' => 'Сүүлийн өөрчлөлтүүд',
-'recentchanges-legend' => 'Сүүлийн өөрчлөлтүүдийн сонголтууд',
+'recentchanges-legend' => 'Сар өдөр, шинж төрлөөр шүүх хүснэгт',
'recentchanges-summary' => 'Энэхүү хуудсанд викид хийсэн хамгийн сүүлийн өөрчлөлтүүдийг үзүүлж байна.',
'recentchanges-feed-description' => 'Вики дахь хамгийн сүүлийн өөрчлөлтүүдийг хянах.',
-'recentchanges-label-newpage' => 'ÐнÑ\8d заÑ\81ваÑ\80 Ñ\88инÑ\8d Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг Ò¯Ò¯Ñ\81гÑ\8dсэн байна',
-'recentchanges-label-minor' => 'ÐнÑ\8d нÑ\8c бага зÑ\8dÑ\80гийн заÑ\81ваÑ\80 байна',
-'recentchanges-label-bot' => 'ÐнÑ\8d заÑ\81ваÑ\80Ñ\8bг Ñ\80обоÑ\82 гүйÑ\86Ñ\8dÑ\82гÑ\8dÑ\81Ñ\8dн байна',
+'recentchanges-label-newpage' => 'ШинÑ\8d Ñ\85Ñ\83Ñ\83даÑ\81 Ò¯Ò¯Ñ\81сэн байна',
+'recentchanges-label-minor' => 'Ð\91ага зÑ\8dÑ\80гийн заÑ\81ваÑ\80',
+'recentchanges-label-bot' => 'РобоÑ\82 гүйÑ\86Ñ\8dÑ\82гÑ\8dÑ\81Ñ\8dн заÑ\81ваÑ\80',
'recentchanges-label-unpatrolled' => 'Энэ засварыг одоогийн байдлаар манаагүй байна',
-'recentchanges-legend-newpage' => '([[Special:NewPages|тэдгээрийг жагсааж үзэх]]',
+'recentchanges-label-plusminus' => 'Өөрчлөгдсөн байт хэмжээ',
+'recentchanges-legend-newpage' => '([[Special:NewPages|жагсааж харах]])',
'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
'rclistfrom' => '$1-с хойших шинэ засваруудыг үзүүлэх',
'rcshowhideminor' => 'Бага зэргийн засваруудыг $1',
'rcshowhidebots' => 'Роботуудыг $1',
'rcshowhideliu' => 'Нийт $1 бүртгэгдсэн хэрэглэгчид',
'rcshowhideanons' => 'Бүртгэлгүй хэрэглэгчдийг $1',
+'rcshowhideanons-show' => 'үзүүлэх',
+'rcshowhideanons-hide' => 'нуух',
'rcshowhidepatr' => 'Хянагдаж буй засваруудыг $1',
'rcshowhidemine' => 'Миний засваруудыг $1',
'rclinks' => 'Сүүлийн $2 өдрийн турших $1 засварыг үзүүлэх<br />$3',
'newpages' => 'Шинэ хуудсууд',
'newpages-username' => 'Хэрэглэгчийн нэр:',
'ancientpages' => 'Хамгийн хуучин хуудсууд',
-'move' => 'Ð\97Ó©Ó©х',
+'move' => 'Ð\9eндоогооÑ\80 нÑ\8dÑ\80лÑ\8dх',
'movethispage' => 'Энэ хуудсыг зөөх',
'unusedimagestext' => 'Дараах файлууд нь байгаа ч гэсэн ямар ч хуудсанд эмбэдлэгдээгүй байна.
Бусад вэб хуудаснуудаас зураг руу шууд URL-р нь холбогдож болох учраас идэвхтэй хэрэглэгдэж буй эсэхээс үл хамааран энд жагсагдсан байж болно гэдгийг анхаарна уу.</p>',
# Special:LinkSearch
'linksearch' => 'Гадаад холбоос хайлт',
'linksearch-pat' => 'Хэв маягийг хайх:',
-'linksearch-ns' => 'Ð\9dÑ\8dÑ\80ний зай:',
+'linksearch-ns' => 'Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bн Ñ\82Ó©Ñ\80өл:',
'linksearch-ok' => 'Хайх',
'linksearch-text' => '"*.wikipedia.org" зэрэг орлуулагч тэмдэгт хэрэглэх боломжтой.<br />
Дор хаяж дээд түвшиний домайн хэрэгтэй байна, жишээ нь "*.org".<br />
'sp-contributions-blocked-notice-anon' => 'Энэхүү IP хаягыг одоогоор түгжигдсэн байна.
Лавлагааны зориулалтаар түгжээний лог дээрх хамгийн сүүлийн нэмэлтийг доор оруулав:',
'sp-contributions-search' => 'Хувь нэмрийг хайх',
+'sp-contributions-suppresslog' => 'Хориглосон хэрэглэгчийн оролцоо',
'sp-contributions-username' => 'IP хаяг эсвэл хэрэглэгчийн нэр:',
'sp-contributions-toponly' => 'Хамгийн сүүлийн засваруудыг л үзүүлэх',
'sp-contributions-submit' => 'Хайх',
# Move page
'move-page' => '$1-г зөөх',
-'move-page-legend' => 'Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bг зөөх',
+'move-page-legend' => 'Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bг ондоогооÑ\80 нÑ\8dÑ\80лÑ\8dх',
'movepagetext' => "Доорх маягтыг ашигласнаар хуудасны нэр солигдож, түүний бүх түүх шинэ нэр лүү зөөгдөх болно.
Хуучин гарчиг нь шинэ гарчиг руух чиглүүлэгч болно.
Та чиглүүлэгчийг эх бичвэр лүү автоматаар заахаар шинэчлэх боломжтой.
*Доорх дөрвөлжинг хоосон болгосон
Эдгээр тохиолдлуудад уг хуудсыг гар аргаар зөөх эсвэл нэгтгэх шаардлагатай болно.",
-'movearticle' => 'Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bг зөөх:',
+'movearticle' => 'Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bн нÑ\8dÑ\80ийг Ñ\81олих:',
'moveuserpage-warning' => "'''Анхаар:''' Та хэрэглэгчийн хуудсыг зөөх гэж байна. Зөвхөн хуудас нь л зөөгдөнө, харин хэрэглэгчийн нэр ''солигдохгүй'' гэдгийг анхаарана уу.",
'movenologintext' => 'Та хуудсыг зөөхийн тулд бүртгэлтэй бөгөөд [[Special:UserLogin|холбогдсон]] байх ёстой.',
'movenotallowed' => 'Таньд хуудас зөөх зөвшөөрөл байхгүй байна.',
'tooltip-pt-mycontris' => 'Таны оруулсан хувь нэмрийн жагсаалт',
'tooltip-pt-login' => 'Заавал хийх ёстой зүйл биш боловч таныг нэвтрэхийг зөвлөж байна.',
'tooltip-pt-logout' => 'Гарах',
-'tooltip-ca-talk' => 'Хуудасны талаарх хэлэлцүүлэг',
-'tooltip-ca-edit' => 'Та энэ хуудсыг засварлах боломжтой. Хадгалахынхаа өмнө "Урьдчилан харах" товчлуурыг хэрэглэнэ үү.',
+'tooltip-ca-talk' => 'Өгүүлснийг зөвшин хэлэлцэх',
+'tooltip-ca-edit' => 'Та энэ хуудсыг засч янзалж болно. Хадгалахаасаа өмнө урьдчилан харах товчийг дардаг юм шүү.',
'tooltip-ca-addsection' => 'Шинэ хэсэг үүсгэх',
'tooltip-ca-viewsource' => 'Энэ хуудас хамгаалагдсан байна. Та зөвхөн кодыг нь харах боломжтой.',
-'tooltip-ca-history' => 'Энэ хуудасны өмнөх засварууд.',
+'tooltip-ca-history' => 'Энэ хуудсыг зассан түүхийг сөхөн нягтлах',
'tooltip-ca-protect' => 'Энэ хуудсыг хамгаалах',
'tooltip-ca-unprotect' => 'Энэ хуудасны хамгаалалтыг солих',
'tooltip-ca-delete' => 'Энэ хуудсыг устгах',
'tooltip-t-specialpages' => 'Тусгай хуудаснуудын жагсаалт',
'tooltip-t-print' => 'Энэ хуудасны хувилж болох хувилбар',
'tooltip-t-permalink' => 'Хуудасны одоогийн хувилбар луу очих тогтмол линк',
-'tooltip-ca-nstab-main' => 'Өгүүлж буй гол хуудсыг үзэх',
+'tooltip-ca-nstab-main' => 'Өгүүлснийг үзэх',
'tooltip-ca-nstab-user' => 'Хэрэглэгчийн хуудсыг үзэх',
'tooltip-ca-nstab-media' => 'Медиа хуудсыг үзэх.',
'tooltip-ca-nstab-special' => 'Энэ бол тусгай хуудас, та үүнийг шууд засварлах боломжгүй.',
'tooltip-ca-nstab-mediawiki' => 'Системийн мэдэгдлийг үзэх.',
'tooltip-ca-nstab-template' => 'Загварыг үзэх',
'tooltip-ca-nstab-help' => 'Тусламжийн хуудсыг үзэх',
-'tooltip-ca-nstab-category' => 'Ангиллын хуудсыг үзэх',
+'tooltip-ca-nstab-category' => 'Анги үзэх',
'tooltip-minoredit' => 'Бага зэргийн засвар гэж тэмдэглэх',
'tooltip-save' => 'Засваруудаа хадгалах',
'tooltip-preview' => 'Өөрийн оруулах гэж буй өөрчлөлтүүдийг урьдчилан харах. Үүнийг ашиглана уу!',
* @author कोलࣿहापࣿरी
* @author कोल्हापुरी
* @author प्रणव कुलकर्णी
+ * @author प्रतिमा
* @author शࣿरीहरि
* @author संतोष दहिवळ
*/
'suspicious-userlogout' => 'तुमच्या सनोंद-निर्गमनास नकार दिल्या गेला कारण असे दिसते की ती विनंती अन-अनुबंधित(डिसकनेक्टेड) न्याहाळकाद्वारे पाठवल्या गेली.',
'createacct-another-realname-tip' => 'आपले खरे नाव टाकणे वैकल्पिक आहे.
जर आपण ते द्यायचे ठरविले तर,ते आपल्या कामाचा मूळ स्रोत म्णून देण्यास वापरले जाईल.',
+'pt-login' => 'सनोंद-प्रवेश करा',
+'pt-userlogout' => 'सनोंद-निर्गम',
# Email sending
'php-mail-error-unknown' => 'पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक',
# Change password dialog
'changepassword' => 'परवलीचा शब्द बदला',
-'resetpass_announce' => 'तà¥\81मà¥\8dहà¥\80 à¤\88-मà¥\87ल मधà¥\82न दिलà¥\87लà¥\8dया तातà¥\8dपà¥\81रतà¥\8dया शबà¥\8dदाà¤\82à¤\95ानà¥\87 सनà¥\8bà¤\82द पà¥\8dरवà¥\87शित à¤\86हात. à¤\86पला सनà¥\8bà¤\82द-पà¥\8dरवà¥\87श पà¥\82रà¥\8dण à¤\95रणà¥\8dयासाठà¥\80, à¤\95à¥\83पया यà¥\87थà¥\87 नवà¥\80न परवलà¥\80à¤\9aा शबà¥\8dद दà¥\8dया:',
+'resetpass_announce' => 'à¤\96ातà¥\8dयामधà¥\8dयà¥\87 पà¥\8dरविषà¥\8dà¤\9f हà¥\8bणà¥\87 थाà¤\82बविणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पलà¥\8dया à¤\96ातà¥\8dयाà¤\9aा à¤\95à¥\82à¤\9fशबà¥\8dद बदला.',
'resetpass_text' => '<!-- मजकूर इथे लिहा -->',
'resetpass_header' => 'खात्याचा परवलीचा शब्द बदला',
'oldpassword' => 'जुना परवलीचा शब्दः',
'revdelete-show-file-submit' => 'होय',
'revdelete-selected' => "'''[[:$1]] {{PLURAL:$2|ची निवडलेली आवृत्ती|च्या निवडलेल्या आवृत्त्या}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|निवडलेली नोंदीकृत घटना|निवडलेल्या नोंदीकृत घटना}}:'''",
-'revdelete-text' => "'''वगळलेल्या नोंदी आणि घटना अजूनही पानाच्या इतिहासात आणि नोंदीत आढळेल,परंतु मजकुराचा भाग सार्वजनिक स्वरूपात उपलब्ध राहणार नाही.'''
-
-अजून इतर प्रतिबंध घातल्याशिवाय {{SITENAME}}चे इतर प्रबंधक लपविलेला मजकूर याच दुव्याने परतवू शकतील.",
'revdelete-confirm' => "कृपया '''याची खात्री करा''' की तुम्ही जे करीत आहात, त्याचे परिणाम आपण जाणत आहात आणि, ते काम [[{{MediaWiki:Policy-url}}|मीडियाविकीच्या नीती]]नुसार आहे.",
'revdelete-suppress-text' => "लपवण्याचा वापर '''फक्त''' पुढील बाबतीत होतो:
* उच्च दर्जाची बदनामीकारक माहिती
'rcnotefrom' => "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
'rclistfrom' => '$1 नंतर केले गेलेले बदल दाखवा.',
'rcshowhideminor' => 'छोटे बदल $1',
+'rcshowhideminor-show' => 'दाखवा',
+'rcshowhideminor-hide' => 'लपवा',
'rcshowhidebots' => 'सांगकामे(बॉट्स) $1',
+'rcshowhidebots-show' => 'दाखवा',
+'rcshowhidebots-hide' => 'लपवा',
'rcshowhideliu' => '$1नोंदणीकृत सदस्य',
+'rcshowhideliu-show' => 'दाखवा',
+'rcshowhideliu-hide' => 'लपवा',
'rcshowhideanons' => 'अनामिक सदस्य $1',
+'rcshowhideanons-show' => 'दाखवा',
+'rcshowhideanons-hide' => 'लपवा',
'rcshowhidepatr' => '$1 पहारा असलेली संपादने',
+'rcshowhidepatr-show' => 'दाखवा',
+'rcshowhidepatr-hide' => 'लपवा',
'rcshowhidemine' => 'माझे बदल $1',
+'rcshowhidemine-show' => 'दाखवा',
+'rcshowhidemine-hide' => 'लपवा',
'rclinks' => 'मागील $2 दिवसांतील $1 बदल पहा.<br />$3',
'diff' => 'फरक',
'hist' => 'इति',
'hide' => 'लपवा',
-'show' => 'पहा',
+'show' => 'दाà¤\96वा',
'minoreditletter' => 'छो',
'newpageletter' => 'न',
'boteditletter' => 'सां',
'tog-ccmeonemails' => 'Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain',
'tog-diffonly' => 'Jangan tunjukkan kandungan laman di bawah perbezaan',
'tog-showhiddencats' => 'Tunjukkan kategori tersembunyi',
-'tog-noconvertlink' => 'Lumpuhkan penukaran tajuk pautan',
'tog-norollbackdiff' => 'Abaikan perbezaan selepas melakukan pengunduran suntingan.',
'tog-useeditwarning' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
'tog-prefershttps' => 'Sentiasa gunakan sambungan terlindung apabila log masuk',
'revdelete-show-file-submit' => 'Ya',
'revdelete-selected' => "'''{{PLURAL:$2|Versi|Versi-versi}} '''$1''' yang dipilih:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Peristiwa|Peristiwa-peristiwa}} log yang dipilih:'''",
-'revdelete-text' => "'''Semakan dan peristiwa yang dihapuskan akan tetap muncul dalam sejarah laman dan log, tetapi kandungannya tidak boleh diakses awam.'''
-Pentadbir {{SITENAME}} boleh melihat kandungan tersebut dan menyahhapuskannya semula melalui laman ini melainkan mempunyai batasan.",
'revdelete-confirm' => 'Sila sahkan bahawa anda bertujuan melakukan ini, bahawa anda faham akibatnya, dan anda melakukannya menurut [[{{MediaWiki:Policy-url}}| polisi]].',
'revdelete-suppress-text' => "Sekatan seharusnya digunakan '''hanya''' untuk kes-kes berikut:
* maklumat yang mungkin berunsur fitnah
'revdelete-show-file-submit' => 'Iva',
'revdelete-selected' => "'''{{PLURAL:$2|Reviżjoni magħżula|Reviżjonijiet magħżula}} ta' [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Avveniment tar-reġistru magħżul|Avvenimenti tar-reġistri magħżula}}:'''",
-'revdelete-text' => "'''Reviżjonijiet u azzjonijiet imħassra xorta waħda jidhru fil-kronoloġija tal-paġna, filwaqt li partijiet tal-kontenut jiġu inaċċessibli għall-pubbliku.'''
-L-amminstraturi l-oħrajn fuq {{SITENAME}} xorta jkunu jistgħu jidħlu fuq il-kontenut moħbi u jistgħu jirkuprawh minn din l-istess interfaċċa, sakemm restrizzjonijiet ulterjuri jiġu definiti.",
'revdelete-confirm' => 'Jekk jogħġbok ikkonferma li dan hu dak li tixtieq tagħmel, li tifhem il-konsegwenzi, u li qed tagħmel dan skont il-[[{{MediaWiki:Policy-url}}|politika]].',
'revdelete-suppress-text' => "It-trażżin għandu jintuża '''biss''' għall-każijiet segwenti:
* Potenzjal ta' kontenut libelluż
* @ingroup Language
* @file
*
+ * @author C.R.
* @author Carmine Colacino
* @author Chelin
* @author Cryptex
'feedlinks' => 'Feed:',
'site-atom-feed' => "Feed Atom 'e $1",
'page-atom-feed' => 'Feed Atom ppe "$1"',
-'red-link-title' => '$1 (a paggena nun esiste)',
+'red-link-title' => "$1 ('a paggena nun esiste)",
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Articulo',
'sp-contributions-blocklog' => 'blocche',
'sp-contributions-logs' => 'registre',
'sp-contributions-talk' => 'Chiàcchiera',
+'sp-contributions-suppresslog' => 'contribbute utente scancellate',
'sp-contributions-username' => 'Nnerizzo IP o nomme utente',
'sp-contributions-submit' => 'Truova',
'tooltip-p-logo' => 'Visita a paggena prencepale',
'tooltip-n-mainpage' => 'Visita a paggena prencepale',
'tooltip-n-mainpage-description' => 'Visita a paggena prencepale',
-'tooltip-n-portal' => 'Descrizione ddo prugietto, che pou fa, addo truova e cose',
+'tooltip-n-portal' => "Descrizione d''o prugietto, che po' ffa, addò truvà 'e ccose",
'tooltip-n-recentchanges' => 'Ennece dde urdeme cagnamiénte ddo sito',
'tooltip-n-randompage' => 'Na paggena qualsiase',
'tooltip-n-help' => "Paggena 'e ajùto",
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Valgt revisjon|Valgte revisjoner}} av [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Valgt loggoppføring|Valgte loggoppføringer}}:'''",
-'revdelete-text' => "'''Slettede versjoner og oppføringer vil fortsatt vises i sidehistorikken og loggene, men deler av innholdet vil ikke lenger bli offentliggjort.'''
-Andre administratorer på {{SITENAME}} vil fortsatt kunne se det skjulte innholdet, og kan gjenopprette det, med mindre videre begrensninger blir gitt av sideoperatørene.",
'revdelete-confirm' => 'Bekreft at du ønsker å gjøre dette, at du forstår konsekvensene, og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].',
'revdelete-suppress-text' => "Skjuling bør '''kun''' brukes i følgende tilfeller:
* Mulig injurierende utsagn
'recentchanges-legend-heading' => "'''Tegnforklaring:'''",
'recentchanges-legend-newpage' => '(se også [[Special:NewPages|liste av nye sider]])',
'recentchanges-legend-plusminus' => '«(±123)»',
-'rcnotefrom' => "Nedenfor er endringene siden '''$2''' (opp til '''$1''' vises).",
+'rcnotefrom' => 'Nedenfor er endringene gjort siden <strong>$2</strong> (frem til <strong>$1</strong> vises).',
'rclistfrom' => 'Vis nye endringer med start fra $1',
'rcshowhideminor' => '$1 mindre endringer',
'rcshowhidebots' => '$1 roboter',
'revdelete-show-file-submit' => 'Jo',
'revdelete-selected' => "'''{{PLURAL:$2|Wählte Version|Wählte Versionen}} vun [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Wählt Logbook-Indrag|Wählte Logbook-Indrääg}}:'''",
-'revdelete-text' => "'''Wegsmetene Versionen un Akschonen staht noch jümmer in de Versionsgeschicht un Logböker, sünd aver nich mehr apen intosehn.'''
-{{SITENAME}}-Administraters köönt de Sieden noch jümmer sehn un ok wedderhalen, solang dat nich extra fastleggt is, dat ok Administraters dat nich mehr mehr dröfft.",
'revdelete-suppress-text' => "Ünnerdrücken schull '''blot''' bi disse Fäll bruukt warrn:
* Nich passliche persönliche Information
*: ''Adressen, Telefonnummern, Sozialversekerungsnummern etc.''",
'tog-ccmeonemails' => 'Stuur mien kopieën van berichten an aandere gebrukers',
'tog-diffonly' => 'Laot de inhoud van ziejen niet onder de an-egeven wiezigingen zien.',
'tog-showhiddencats' => 'Laot verbörgen kategorieën zien',
-'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
'tog-useeditwarning' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
'tog-prefershttps' => "Altied n beveiligde verbiending gebruken a'j an-emeld bin",
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Ekeuzen bewarking|Ekeuzen bewarkingen}} van '''[[:$1]]''':'''",
'logdelete-selected' => "'''{{PLURAL:$1|Ekeuzen logboekboekaksie|Ekeuzen logboekaksies}}:'''",
-'revdelete-text' => "'''Vortedaone bewarkingen staon nog altied in de geschiedenisse en in logboeken, mer niet iederene kan de inhoud zo mer bekieken.'''
-Beheerders van {{SITENAME}} kunnen de verbörgen inhoud bekieken en t weerummeplaotsen deur dit scharm te gebruken, behalven as der aandere beparkingen in-esteld bin.",
'revdelete-confirm' => "Bevestig da'j dit doon wollen, da'j de gevolgen dervan begriepen en da'j t doon in overeenstemming mit t geldende [[{{MediaWiki:Policy-url}}|beleid]].",
'revdelete-suppress-text' => "Onderdrokken ma'j '''allinnig''' gebruken in de volgende gevallen:
* Ongepassen persoonlike informasie
'tog-ccmeonemails' => 'मैले अरु प्रयोगकर्ताहरुलाई पठाउने इ-मेल को प्रतिलिपि मलाई पठाउने',
'tog-diffonly' => 'तलका पृष्टहरुको diffहरु सामग्री नदेखाउने',
'tog-showhiddencats' => 'लुकाइएको प्रकारहरु देखाउने',
-'tog-noconvertlink' => 'सम्बन्ध शीर्षक रुपान्तरण निस्क्रिय पार्ने',
'tog-norollbackdiff' => 'पूर्वस्थितिमा फर्काएपछि diff हटाउने',
'tog-useeditwarning' => 'सम्पादनहरू सङ्ग्रह गरिनसकेको अवस्थामा अर्को पृष्ठमा जान खोज्दा चेतावनी देखाउने',
'tog-prefershttps' => 'प्रवेश गर्दा जहिले पनि सुरक्षित जडान प्रयोग गर्ने',
'tog-enotifrevealaddr' => 'Mijn e-mailadres weergeven in e-mailberichten',
'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
'tog-oldsig' => 'Bestaande ondertekening:',
-'tog-fancysig' => 'Interpreteer ondertekening als wikitekst (zonder automatische koppeling)',
+'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische koppeling)',
'tog-uselivepreview' => '"Live voorvertoning" gebruiken (experimenteel)',
-'tog-forceeditsummary' => 'Een melding geven bij een ontbrekende bewerkingssamenvatting',
+'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
'tog-watchlisthidebots' => 'Botbewerkingen op mijn volglijst verbergen',
'tog-watchlisthideminor' => 'Kleine bewerkingen op mijn volglijst verbergen',
'tog-ccmeonemails' => 'Mij een kopie zenden van e-mails die ik naar andere gebruikers stuur',
'tog-diffonly' => 'Pagina-inhoud onder wijzigingen niet weergeven',
'tog-showhiddencats' => 'Verborgen categorieën weergeven',
-'tog-noconvertlink' => 'Paginanaamconversie uitschakelen',
'tog-norollbackdiff' => 'Wijzigingen weglaten na terugdraaien',
-'tog-useeditwarning' => 'Waarschuwen als u een bewerkte pagina die nog niet is opgeslagen wilt verlaten',
+'tog-useeditwarning' => 'Waarschuwen als u een bewerkte pagina wilt verlaten die nog niet is opgeslagen',
'tog-prefershttps' => 'Altijd een beveiligde verbinding gebruiken wanneer u bent aangemeld',
'underline-always' => 'Altijd',
'underline-never' => 'Nooit',
-'underline-default' => 'Zoals gebruikelijk in gebruikte vormgeving of webbrowser',
+'underline-default' => 'Standaard gedrag van vormgeving of webbrowser',
# Font style option in Special:Preferences
'editfont-style' => 'Lettertypestijl bewerkingsvenster:',
'logout' => 'Afmelden',
'userlogout' => 'Afmelden',
'notloggedin' => 'Niet aangemeld',
-'userlogin-noaccount' => 'Hebt u geen account?',
+'userlogin-noaccount' => 'Hebt u geen gebruiker?',
'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
'nologin' => 'Nog geen gebruikersnaam? $1.',
'nologinlink' => 'Registreren',
'createacct-another-realname-tip' => 'Echte naam is optioneel.
Als u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.',
'pt-login' => 'Aanmelden',
+'pt-login-button' => 'Aanmelden',
'pt-createaccount' => 'Registreren',
'pt-userlogout' => 'Afmelden',
Om het inloggen te voltooien moet u hier een nieuw wachtwoord instellen:',
'resetpass-temp-password' => 'Tijdelijk wachtwoord:',
'resetpass-abort-generic' => 'De wachtwoordwijziging is afgebroken door een uitbreiding.',
-'resetpass-expired' => 'Uw wachtwoord is verlopen. Stel een nieuw wachtwoord om in te loggen.',
-'resetpass-expired-soft' => 'Uw wachtwoord is verlopen, en moet opnieuw worden ingesteld. Kies een nieuw wachtwoord nu, of klik op Annuleren als u het later opnieuw wilt.',
+'resetpass-expired' => 'Uw wachtwoord is verlopen. Stel een nieuw wachtwoord om aan te melden.',
+'resetpass-expired-soft' => 'Uw wachtwoord is verlopen, en moet opnieuw worden ingesteld. Kies een nieuw wachtwoord nu, of klik op "{{int:resetpass-submit-cancel}}" als u het later opnieuw wilt.',
# Special:PasswordReset
'passwordreset' => 'Wachtwoord opnieuw instellen',
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''Geselecteerde {{PLURAL:$2|bewerking|bewerkingen}} van [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Geselecteerde logboekhandeling|Geselecteerde logboekhandelingen}}:'''",
-'revdelete-text' => "'''Verwijderde bewerkingen zijn zichtbaar in de geschiedenis en logboeken, maar delen van de inhoud zijn niet langer publiek toegankelijk.'''
-Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud benaderen en de verwijdering ongedaan maken met behulp van dit formulier, tenzij er aanvullende beperkingen gelden die zijn ingesteld door de systeembeheerder.",
'revdelete-confirm' => 'Bevestig dat u dit wilde doen, dat u de consequenties begrijpt en dat u dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].',
'revdelete-suppress-text' => "Gebruik versies verbergen '''alleen''' in de volgende gevallen:
* Mogelijk smadelijke informatie;
'searchrelated' => 'gerelateerd',
'searchall' => 'alle',
'showingresults' => "Hieronder {{PLURAL:$1|staat '''1''' resultaat|staan '''$1''' resultaten}} vanaf #'''$2'''.",
-'showingresultsinrange' => 'Hieronder {{PLURAL:$1|wordt|worden}} maximaal {{PLURAL:$1|<strong>1</strong> resultaat|<strong>$1 </strong>resultaten}} getoond in het bereik #<strong>$2</strong> tot #<strong>$3</strong>.',
+'showingresultsinrange' => 'Hieronder {{PLURAL:$1|wordt|worden}} maximaal {{PLURAL:$1|<strong>1</strong> resultaat|<strong>$1 </strong>resultaten}} weergegeven in het bereik #<strong>$2</strong> tot #<strong>$3</strong>.',
'showingresultsnum' => "Hieronder {{PLURAL:$3|staat '''1''' resultaat|staan '''$3''' resultaten}} vanaf #'''$2'''.",
'showingresultsheader' => "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultaten '''$1 - $2''' van '''$3'''}} voor '''$4'''",
'search-nonefound' => 'Er zijn geen resultaten voor uw zoekopdracht.',
'recentchanges-legend-heading' => "'''Legenda:'''",
'recentchanges-legend-newpage' => "Zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]].",
'recentchanges-legend-plusminus' => "(''±123'')",
-'rcnotefrom' => "Wijzigingen sinds '''$2''' (met een maximum van '''$1''' wijzigingen).",
+'rcnotefrom' => 'Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).',
'rclistfrom' => 'Wijzigingen bekijken vanaf $1',
'rcshowhideminor' => 'Kleine wijzigingen $1',
-'rcshowhideminor-show' => 'Weergeven',
-'rcshowhideminor-hide' => 'Verbergen',
+'rcshowhideminor-show' => 'weergeven',
+'rcshowhideminor-hide' => 'verbergen',
'rcshowhidebots' => 'bots $1',
-'rcshowhidebots-show' => 'Weergeven',
-'rcshowhidebots-hide' => 'Verbergen',
+'rcshowhidebots-show' => 'weergeven',
+'rcshowhidebots-hide' => 'verbergen',
'rcshowhideliu' => 'geregistreerde gebruikers $1',
'rcshowhideliu-show' => 'weergeven',
'rcshowhideliu-hide' => 'verbergen',
'php-uploaddisabledtext' => 'Het uploaden van bestanden is uitgeschakeld in PHP.
Controleer de instelling "file_uploads".',
'uploadscripted' => 'Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.',
+'uploadscriptednamespace' => 'Dit SVG-bestand bevat een ongeldige naamruimte "$1".',
'uploadinvalidxml' => 'De XML in het geüploade bestand kon niet worden geparst.',
'uploadvirus' => 'Het bestand bevat een virus! Details: $1',
'uploadjava' => 'Het bestand is een ZIP-bestand dat een Java .class-bestand bevat.
'deadendpagestext' => "De onderstaande pagina's verwijzen niet naar andere pagina's in deze wiki.",
'protectedpages' => "Beveiligde pagina's",
'protectedpages-indef' => 'Alleen blokkades zonder vervaldatum',
-'protectedpages-summary' => "Deze pagina geeft de pagina's die momenteel worden beschermd. Voor een lijst van titels die zijn beschermd tegen aanmaken zie: [[{{#special:ProtectedTitles}}]].",
+'protectedpages-summary' => "Deze pagina bevat een lijst met beveiligde pagina's. Zie [[{{#special:ProtectedTitles}}]] voor een lijst van pagina's die niet aangemaakt mogen worden.",
'protectedpages-cascade' => 'Alleen beveiligingen met de cascade-optie',
'protectedpages-noredirect' => 'Doorverwijzingen verbergen',
'protectedpagesempty' => "Er zijn momenteel geen pagina's beveiligd die aan deze voorwaarden voldoen.",
'protectedpages-timestamp' => 'Tijdstip',
'protectedpages-page' => 'Pagina',
'protectedpages-expiry' => 'Verloopt',
-'protectedpages-performer' => 'Beschermd door',
+'protectedpages-performer' => 'Beveiligd door',
'protectedpages-params' => 'Beveiligingsopties',
'protectedpages-reason' => 'Reden',
'protectedpages-unknown-timestamp' => 'Onbekend',
'protectedpages-unknown-performer' => 'Onbekende gebruiker',
'protectedtitles' => 'Beveiligde paginanamen',
-'protectedtitles-summary' => "Deze pagina bevat de titels die momenteel niet mogen worden aangemaakt. Voor de lijst met beveiligde pagina's zie: [[{{#special:ProtectedPages}}]].",
+'protectedtitles-summary' => "Deze pagina bevat een lijst met pagina's die niet mogen worden aangemaakt. Zie [[{{#special:ProtectedPages}}]] voor de lijst met beveiligde pagina's.",
'protectedtitlesempty' => 'Er zijn geen paginanamen beveiligd die aan deze voorwaarden voldoen.',
'listusers' => 'Gebruikerslijst',
'listusers-editsonly' => 'Alleen gebruikers met bewerkingen weergeven',
'delete-warning-toobig' => 'Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.
Het verwijderen van deze pagina kan de werking van de database van {{SITENAME}} verstoren.
Wees voorzichtig.',
-'deleting-backlinks-warning' => "'''Waarschuwing:''' andere pagina's gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
+'deleting-backlinks-warning' => "'''Waarschuwing:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere pagina's]] gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
# Rollback
'rollback' => 'Wijzigingen ongedaan maken',
'sp-contributions-blocked-notice-anon' => 'Dit IP-adres is geblokkeerd.
De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:',
'sp-contributions-search' => 'Zoeken naar bijdragen',
+'sp-contributions-suppresslog' => 'onderdrukte gebruikersbijdragen',
'sp-contributions-username' => 'IP-adres of gebruikersnaam:',
'sp-contributions-toponly' => 'Alleen nieuwste versies weergeven',
'sp-contributions-newonly' => "Alleen nieuwe pagina's weergeven",
'thumbnail_image-type' => 'Dit bestandstype wordt niet ondersteund',
'thumbnail_gd-library' => 'De instellingen voor de GD-bibliotheek zijn incompleet. De functie $1 ontbreekt',
'thumbnail_image-missing' => 'Het bestand lijkt niet aanwezig te zijn: $1',
-'thumbnail_image-failure-limit' => 'Er zijn te veel recente mislukte pogingen ($1 of meer) om deze miniatuurafbeelding te genereren. Probeer het later nog eens.',
+'thumbnail_image-failure-limit' => 'Het maken van een miniatuurafbeelding is te vaak mislukt ($1 keer of vaker). Probeer het later nog eens.',
# Special:Import
'import' => "Pagina's importeren",
'tog-ccmeonemails' => 'Send meg kopi av e-postane eg sender til andre brukarar',
'tog-diffonly' => 'Ikkje vis sideinnhaldet under skilnadene mellom versjonane',
'tog-showhiddencats' => 'Vis gøymde kategoriar',
-'tog-noconvertlink' => 'Slå av konvertering av sidetitlar',
'tog-norollbackdiff' => 'Ikkje vis skilnad etter attenderulling',
'tog-useeditwarning' => 'Gje ei åtvaring om eg går ut av ei redigeringsside og ikkje alle endringar er lagra',
'tog-prefershttps' => 'Alltid bruk ei trygg kopling når du er innlogga',
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Vald versjon|Valde versjonar}} av [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Vald loggoppføring|Valde loggoppføringar}}:'''",
-'revdelete-text' => "Sletta versjonar og oppføringar vert framleis synlege i sidehistorikken og loggane, men delar av innhaldet deira vert ikkje lenger offentleggjort.'''
-Andre administratorar på {{SITENAME}} kan framleis sjå det gøymde innhaldet og attopprette det, med mindre fleire avgrensingar vert lagde inn av sideoperatørane.",
'revdelete-confirm' => 'Stadfest at du ynskjer å gjera dette, at du skjønar konsekvensane, og at du gjer det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinene]].',
'revdelete-suppress-text' => "Løyning av sideversjonar bør '''berre''' nyttast i desse tilfella:
* Mogeleg ærekrenkjande informasjon
'showhideselectedversions' => 'Vis/løyn valde versjonar',
'editundo' => 'angre',
'diff-empty' => '(Ingen skilnad)',
+'diff-multi-sameuser' => '({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} av den same brukaren er ikkje {{PLURAL:$1|vist|viste}})',
'diff-multi-manyusers' => '({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
'difference-missing-revision' => '{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.
# User preference toggles
'tog-underline' => 'Soslinhar los ligams :',
'tog-hideminor' => 'Amagar los darrièrs cambiaments menors',
-'tog-hidepatrolled' => 'Amagar las modificacions susvelhadas dels darrièrs cambiaments',
+'tog-hidepatrolled' => 'Amagar las modificacions susvelhadas dins los darrièrs cambiaments',
'tog-newpageshidepatrolled' => 'Amagar las paginas susvelhadas de la lista de las paginas novèlas',
'tog-extendwatchlist' => 'Espandir la lista de seguiment per afichar totas las modificacions e non pas solament las mai recentas',
'tog-usenewrc' => 'Agropar los cambiaments per pagina dins los darrièrs cambiaments e la lista de seguiment',
'tog-ccmeonemails' => 'Me mandar una còpia dels corrièrs electronics que mandi als autres utilizaires',
'tog-diffonly' => 'Far pas veire lo contengut de las paginas jos las difs',
'tog-showhiddencats' => 'Afichar las categorias amagadas',
-'tog-noconvertlink' => 'Desactivar la conversion dels títols',
'tog-norollbackdiff' => 'Ometre lo diff aprèp l’utilizacion d’un revert',
'tog-useeditwarning' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
'tog-prefershttps' => 'Utilizar totjorn una connexion securizada en essent connectat',
'databaseerror-query' => 'Requèsta : $1',
'databaseerror-function' => 'Foncion : $1',
'databaseerror-error' => 'Error : $1',
-'laggedslavemode' => 'Atencion : Aquesta pagina pòt conténer pas totes los darrièrs cambiaments efectuats.',
+'laggedslavemode' => '<strong>Atencion :</strong> Aquesta pagina pòt conténer pas totes los darrièrs cambiaments efectuats.',
'readonly' => 'Mesas a jorn blocadas sus la banca de donadas',
'enterlockreason' => 'Indicatz la rason del blocatge, e mai una estimacion de sa durada',
'readonlytext' => "Los ajustons e mesas a jorn de la banca de donadas son actualament blocats, probablament per permetre la mantenença de la banca, aprèp aquò, tot dintrarà dins l'òrdre.
# Login and logout pages
'logouttext' => "'''Ara, sètz desconnectat.'''
-Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connectat, fins al moment qu'escafaretz l'amagatal de vòstre navigador.",
+Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connectat, fins al moment qu'escafaretz l'escondedor de vòstre navigador.",
'welcomeuser' => 'Benvenguda, $1 !',
'welcomecreation-msg' => "Vòstre compte d'utilizaire es estat creat.
Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
'createacct-another-realname-tip' => 'Lo nom vertadièr es opcional.
Se decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.',
'pt-login' => 'Se connectar',
+'pt-login-button' => 'Se connectar',
'pt-createaccount' => 'Crear un compte',
'pt-userlogout' => 'Se desconnectar',
'preview' => 'Previsualizar',
'showpreview' => 'Previsualizacion',
'showlivepreview' => 'Apercebut rapid',
-'showdiff' => 'Cambiaments en cors',
+'showdiff' => 'Veire los cambiaments',
'anoneditwarning' => "'''Atencion :''' sètz pas identificat(ada).
Vòstra adreça IP serà enregistrada dins l’istoric d'aquesta pagina.",
'anonpreviewwarning' => "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
'cantcreateaccount-text' => "La creacion de compte dempuèi aquesta adreça IP ('''$1''') es estada blocada per [[User:$3|$3]].
La rason balhada per $3 èra ''$2''.",
-'cantcreateaccount-range-text' => "La creacion de compte dempuèi las adressas IP '''$1''', que la vòstra n'es ('''$4''') es estada blocada per [[User:$3|$3]].",
+'cantcreateaccount-range-text' => "La creacion de compte dempuèi las adreças IP dins la plaja '''$1''', que compren vòstra agreça IP ('''$4''') son estadas blocadas per [[User:$3|$3]].
+
+Lo motiu provesit per $3 es ''$2''",
# History pages
'viewpagelogs' => 'Vejatz las operacions per aquesta pagina',
Ensajatz de [[Special:Search|recercar sul wiki]] per trobar de paginas en rapòrt.',
# Revision deletion
-'rev-deleted-comment' => '(comentari suprimit)',
+'rev-deleted-comment' => '(resumit de comentari suprimit)',
'rev-deleted-user' => '(nom d’utilizaire suprimit)',
'rev-deleted-event' => '(entrada suprimida)',
'rev-deleted-user-contribs' => "[nom d'utilizaire o adreça IP suprimida - modificacion amagada sus las contribucions]",
'revdelete-show-file-submit' => 'Òc',
'revdelete-selected' => "'''{{PLURAL:$2|Version seleccionada|Versions seleccionadas}} de [[:$1]] :'''",
'logdelete-selected' => "'''{{PLURAL:$1|Eveniment d'istoric seleccionat|Eveniments d'istoric seleccionats}} :'''",
-'revdelete-text' => "'''Las revisions e eveniments suprimits apareisseràn encara dins l’istoric e los jornals de la pagina, mas lor contengut textual serà inaccessible al public.'''
-D’autres administrators sus {{SITENAME}} poiràn totjorn accedir al contengut amagat e lo restablir tornamai a travèrs d'aquesta meteissa interfàcia, a mens qu’una restriccion suplementària siá mesa en plaça pels operators del site.",
'revdelete-confirm' => "Confirmatz que volètz efectuar aquesta accion, que ne comprenètz las consequéncias, e qu'o fasètz en acòrd amb [[{{MediaWiki:Policy-url}}|las règlas]].",
'revdelete-suppress-text' => "La supression deu èsser utilizada '''sonque''' dins los cases seguents :
* Informacions potencialament difamatòrias
'shown-title' => 'Afichar $1 {{PLURAL:$1|resultat|resultats}} per pagina',
'viewprevnext' => 'Veire ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "* Pagina '''[[$1]]'''",
-'searchmenu-new' => "'''Crear la pagina ''[[:$1|$1]]'' sus aqueste wiki !'''",
+'searchmenu-new' => '<strong>Crear la pagina « [[:$1|$1]] » sus aqueste wiki !</strong> {{PLURAL:$2|0=|Vejatz tanben la pagina trobada amb vòstra recèrca.|Vejatz tanben los resultats de vòstra recèrca.}}',
'searchprofile-articles' => 'Paginas de contengut',
'searchprofile-project' => "Paginas d'ajuda e del projècte",
'searchprofile-images' => 'Multimèdia',
'group-bot-member' => 'Robòt',
'group-sysop-member' => 'Administrator',
'group-bureaucrat-member' => 'Burocrata',
-'group-suppress-member' => 'Supervisor',
+'group-suppress-member' => '{{GENDER:$1|supervisor|supervisora}}',
'grouppage-user' => '{{ns:project}}:Utilizaires',
'grouppage-autoconfirmed' => '{{ns:project}}:Utilizaires enregistrats',
'right-reupload-own' => 'Espotir un fichièr telecargat pel meteis utilizaire',
'right-reupload-shared' => 'Espotir localament un fichièr present sus un depaus partejat',
'right-upload_by_url' => 'Importar un fichièr dempuèi una adreça URL',
-'right-purge' => "Purgar l'amagatal de las paginas sens l'aver de confirmar",
+'right-purge' => "Purgar l'escondedor de las paginas sens l'aver de confirmar",
'right-autoconfirmed' => 'Èsser pas afectat per las limitacions de debit ligadas a las adreças IP',
'right-bot' => 'Èsser tractat coma un procediment automatizat',
'right-nominornewtalk' => 'Desenclavar pas lo bendèl "Avètz de messatges novèls" al moment d\'un cambiament menor sus una pagina de discussion d\'un utilizaire',
'right-importupload' => 'Importar de paginas dempuèi un fichièr',
'right-patrol' => 'Marcar de cambiaments coma verificats',
'right-autopatrol' => 'Aver sos cambiaments marcats automaticament coma verificats',
-'right-patrolmarks' => 'Utilizar las foncionalitats de la patrolha dels darrièrs cambiaments',
+'right-patrolmarks' => 'Veire los marcatges de susvelhança dins los darrièrs cambiaments',
'right-unwatchedpages' => 'Veire la lista de las paginas pas seguidas',
'right-mergehistory' => 'Fusionar los istorics de las paginas',
'right-userrights' => "Modificar totes los dreches d'un utilizaire",
'recentchanges-label-minor' => 'Aqueste cambiament es menor',
'recentchanges-label-bot' => 'Aqueste cambiament es estat efectuat per un bòt.',
'recentchanges-label-unpatrolled' => 'Aqueste cambiament es pas estat verificat encara.',
+'recentchanges-label-plusminus' => "La talha de la pagina a cambiat d'aqueste nombre d’octets.",
'recentchanges-legend-heading' => "'''Legenda :'''",
'recentchanges-legend-newpage' => '(veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).',
-'rcnotefrom' => "Vaquí los cambiaments efectuats dempuèi lo '''$2''' ('''$1''' al maximum).",
+'rcnotefrom' => 'Çaijós las modificacions efectuadas dempuèi lo <strong>$2</strong> (fins a <strong>$1</strong> afichats).',
'rclistfrom' => 'Afichar las modificacions novèlas dempuèi lo $1.',
'rcshowhideminor' => '$1 los cambiaments menors',
'rcshowhideminor-show' => 'Afichar',
'uploaddisabledtext' => "L'impòrt de fichièrs cap al servidor es desactivat.",
'php-uploaddisabledtext' => "Lo telecargament de fichièrs es estat desactivat dins PHP. Verificatz l'opcion de configuracion file_uploads.",
'uploadscripted' => "Aqueste fichièr conten de còde HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
+'uploadscriptednamespace' => "Aqueste fichièr SVG conten un espaci de noms '$1' pas autorizat.",
+'uploadinvalidxml' => 'Lo XML dins lo fichièr importat a pas pogut èsser analisat.',
'uploadvirus' => 'Aqueste fichièr conten un virús ! Per mai de detalhs, consultatz : $1',
'uploadjava' => 'Es un fichièr ZIP que conten un fichièr Java .class.
Lo telecargament de fichièrs Java es pas autorizat, perque pòdon contornar de restriccions de seguretat.',
'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
'nlinks' => '$1 {{PLURAL:$1|ligam|ligams}}',
'nmembers' => '$1 {{PLURAL:$1|membre|membres}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|membre|membres}}',
'nrevisions' => '$1 {{PLURAL:$1|revision|revisions}}',
'nviews' => '$1 {{PLURAL:$1|consultacion|consultacions}}',
'nimagelinks' => 'Utilisat sus $1 {{PLURAL:$1|pagina|paginas}}',
'watchlist-details' => 'I a {{PLURAL:$1|pagina|paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.',
'wlheader-enotif' => 'La notificacion per corrièr electronic es activada.',
'wlheader-showupdated' => "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
-'watchmethod-recent' => 'verificacion dels darrièrs cambiaments de las paginas seguidas',
+'watchmethod-recent' => 'verificacion dels darrièrs cambiaments per i trobar de paginas seguidas',
'watchmethod-list' => 'verificacion de las paginas seguidas per de modificacions recentas',
'watchlistcontains' => 'Vòstra lista de seguiment conten $1 {{PLURAL:$1|pagina|paginas}}.',
'iteminvalidname' => "Problèma amb l'article « $1 » : lo nom es invalid...",
'enotif_lastvisited' => 'Consultatz $1 per totes los cambiaments dempuèi vòstra darrièra visita.',
'enotif_lastdiff' => 'Consultatz $1 per veire aquesta modificacion.',
'enotif_anon_editor' => 'utilizaire anonim $1',
-'enotif_body' => 'Car(a) $WATCHINGUSERNAME,
+'enotif_body' => 'Car $WATCHINGUSERNAME,
$PAGEINTRO $NEWPAGE
-Resumit del contributor : $PAGESUMMARY
-$PAGEMINOREDIT
+Resumit del contributor :
+$PAGESUMMARY $PAGEMINOREDIT
Contactatz aqueste contributor :
corrièl : $PAGEEDITOR_EMAIL
wiki : $PAGEEDITOR_WIKI
-I aurà pas d’autras notificacions en cas de cambiaments ulteriors, levat se visitatz aquela pagina.
-Podètz tanben reïnicializar las bandièras de notificacion per totas las paginas de vòstra lista de seguiment.
+I aurà pas d’autras notificacions en cas de cambiaments ulteriors, levat se visitatz aquela pagina un còp connectat. Podètz tanben reïnicializar las bandièras de notificacion per totas las paginas de vòstra lista de seguiment.
- Vòstre sistèma de notificacion de {{SITENAME}}
+Vòstre sistèma de notificacion de {{SITENAME}}
--
Pour modificar los paramètres de notificacion per corrièl, visitatz {{canonicalurl:{{#special:Preferences}}}}
'sp-contributions-blocked-notice-anon' => 'Aquesta adreça IP es actualament blocada.
La darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :',
'sp-contributions-search' => 'Cercar las contribucions',
+'sp-contributions-suppresslog' => 'contribucions suprimidas d’un utilizaire',
'sp-contributions-username' => 'Adreça IP o nom d’utilizaire :',
'sp-contributions-toponly' => 'Mostrar sonque las contribucions que son lo darrièr cambiament',
+'sp-contributions-newonly' => 'Afichar unicament las modificacions que son de creacions de pagina',
'sp-contributions-submit' => 'Cercar',
# What links here
'change-blocklink' => 'modificar lo blocatge',
'contribslink' => 'contribucions',
'emaillink' => 'mandar un messatge',
-'autoblocker' => 'Sètz estat autoblocat perque partejatz una adreça IP amb "[[User:$1|$1]]".
-La rason balhada per $1 es : « $2 ».',
+'autoblocker' => 'Sètz estat blocat automaticament perque vòstra adreça IP es estada utilizada recentament per « [[User:$1|$1]] ».
+Lo motiu provesit pel blocatge de $1 es « $2 »',
'blocklogpage' => 'Istoric dels blocatges',
'blocklog-showlog' => 'Aqueste utilizaire es estat blocat precedentament. Lo jornal dels blocatges es disponible çaijós :',
'blocklog-showsuppresslog' => 'Aqueste utilizaire es estat blocat e amagat precedentament. Lo jornal de las supressions es disponible çaijós :',
'range_block_disabled' => "Lo blocatge de plajas d'IP es estat desactivat.",
'ipb_expiry_invalid' => 'Temps d’expiracion invalid.',
'ipb_expiry_temp' => 'Las plajas dels utilizaires amagats deurián èsser permanentas.',
-'ipb_hide_invalid' => "Impossible de suprimir aqueste compte ; sembla qu'a tròp de modificacions.",
+'ipb_hide_invalid' => "Impossible de suprimir aqueste compte ; sembla qu'a mai {{PLURAL:$1|d’una modificacion|de $1 modificacions}}.",
'ipb_already_blocked' => '« $1 » ja es blocat',
'ipb-needreblock' => '$1 ja es blocat. Volètz modificar los paramètres ?',
'ipb-otherblocks-header' => '{{PLURAL:$1|Autre blocatge|Autres blocatges}}',
'importuploaderrortemp' => "Lo telecargament del fichièr d'importar a pas capitat. Un dorsièr temporari es mancant.",
'import-parse-failure' => "Ruptura dins l'analisi de l'impòrt XML",
'import-noarticle' => "Pas de pagina d'importar !",
-'import-nonewrevisions' => 'Totas las revisions son estadas importadas deperabans.',
+'import-nonewrevisions' => 'Cap de revision pas importada (totas èran ja presentas, o ignoradas del fach d’errors).',
'xml-error-string' => '$1 a la linha $2, col $3 (octet $4) : $5',
'import-upload' => "Impòrt d'un fichier XML",
'import-token-mismatch' => 'Pèrda de las donadas de sesilha. Tornatz ensajar.',
'tooltip-n-mainpage-description' => 'Anar a l’acuèlh',
'tooltip-n-portal' => 'A prepaus del projècte',
'tooltip-n-currentevents' => "Trobar d'entresenhas suls eveniments actuals",
-'tooltip-n-recentchanges' => 'Lista dels darrièrs cambiaments sul wiki.',
+'tooltip-n-recentchanges' => 'Lista dels darrièrs cambiaments sul wiki',
'tooltip-n-randompage' => "Afichar una pagina a l'azard",
'tooltip-n-help' => "L'endrech per s'assabentar.",
'tooltip-t-whatlinkshere' => 'Lista de las paginas ligadas a aquesta',
'tooltip-minoredit' => 'Marcar mas modificacions coma un cambiament menor',
'tooltip-save' => 'Salvar vòstras modificacions',
'tooltip-preview' => 'Mercé de previsualizar vòstras modificacions abans de salvar!',
-'tooltip-diff' => "Permet de visualizar los cambiaments qu'avètz efectuats",
+'tooltip-diff' => "Aficha los cambiaments qu'avètz aportats al tèxte",
'tooltip-compareselectedversions' => "Afichar las diferéncias entre doas versions d'aquesta pagina",
'tooltip-watch' => 'Apondre aquesta pagina a vòstra lista de seguiment',
'tooltip-watchlistedit-normal-submit' => 'Levar los títols',
'markaspatrolledtext' => 'Marcar aqueste article coma pas vandalizat',
'markedaspatrolled' => 'Marcat coma pas vandalizat',
'markedaspatrolledtext' => 'La revision seleccionada de [[:$1]] es estada coma patrolhada.',
-'rcpatroldisabled' => 'La foncion de patrolha dels darrièrs cambiaments es pas activada.',
-'rcpatroldisabledtext' => 'La foncionalitat de susvelhança dels darrièrs cambiaments es pas activada.',
+'rcpatroldisabled' => 'La foncion de relectura dels darrièrs cambiaments es pas activada.',
+'rcpatroldisabledtext' => 'La foncionalitat de relectura dels darrièrs cambiaments es actualament desactivada.',
'markedaspatrollederror' => 'Pòt pas èsser marcat coma pas vandalizat',
'markedaspatrollederrortext' => 'Vos cal seleccionar una version per poder la marcar coma pas vandalizada.',
'markedaspatrollederror-noautopatrol' => 'Avètz pas lo drech de marcar vòstras pròprias modificacions coma susvelhadas.',
# action=purge
'confirm_purge_button' => 'Confirmar',
-'confirm-purge-top' => "Volètz refrescar aquesta pagina (purgar l'amagatal) ?",
-'confirm-purge-bottom' => "Purgar una pagina vioda l'amagatal e fòrça la darrièra version a èsser afichada.",
+'confirm-purge-top' => "Volètz refrescar aquesta pagina (purgar l'escondedor) ?",
+'confirm-purge-bottom' => "Purgar una pagina vioda l'escondedor e fòrça la darrièra version a èsser afichada.",
# action=watch/unwatch
'confirm-watch-button' => 'Confirmar',
'version-version' => '(Version $1)',
'version-license' => 'Licéncia de MediaWiki',
'version-ext-license' => 'Licéncia',
+'version-ext-colheader-name' => 'Extensions',
'version-ext-colheader-license' => 'Licéncia',
'version-ext-colheader-description' => 'Descripcion',
'version-ext-colheader-credits' => 'Autors',
'revdelete-uname-unhid' => 'nom d’utilizaire afichat',
'revdelete-restricted' => 'aplicar las restriccions als administrators',
'revdelete-unrestricted' => 'restriccions levadas pels administrators',
-'logentry-move-move' => '$1 {{GENDER:$2|a deplaçat}} la pagina $3 cap a $4',
-'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a deplaçat}} la pagina $3 cap a $4 sens daissar cap de redireccion',
-'logentry-move-move_redir' => '$1 {{GENDER:$2|a deplaçat}} la pagina $3 cap a $4 per dessús una redireccion',
+'logentry-move-move' => '$1 {{GENDER:$2|a desplaçat}} la pagina $3 cap a $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a desplaçat}} la pagina $3 cap a $4 sens daissar cap de redireccion',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|a desplaçat}} la pagina $3 cap a $4 per dessús una redireccion',
'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|a desplaçat}} la pagina $3 cap a $4 per dessús una redireccion sens daissar cap de redireccion',
'logentry-patrol-patrol' => '$1 {{GENDER:$2|a marcat}} la revision $4 de la pagina $3 coma relegida',
'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|a marcat automaticament}} la revision $4 de la pagina $3 coma relegida',
'api-error-overwrite' => 'Espotir un fichièr existent es pas autorizat.',
'api-error-stashfailed' => 'Error intèrna : lo servidor a pas pogut enregistrar lo fichièr temporari.',
'api-error-publishfailed' => 'Error intèrna: Lo servidor a pas pogut publicar lo fichièr temporari.',
+'api-error-stasherror' => "Una error s'es produsida al moment del telecargament del fichièr per lo dissimular.",
'api-error-timeout' => 'Lo servidor a pas respondut dins lo relambi pervist.',
'api-error-unclassified' => "Una error desconeguda s'es producha.",
'api-error-unknown-code' => 'Error desconeguda : « $1 »',
# Special:ExpandTemplates
'expandtemplates' => 'Espandiment dels modèls',
-'expand_templates_intro' => 'Aquesta pagina permet de testar l’espandiment de modèls, que son desvolopats recursivament. Las foncions e las variablas predefinidas, coma <nowiki>{{</nowiki>#language:...}} e <nowiki>{{</nowiki>CURRENTDAY}} tanben son desvolopadas.',
+'expand_templates_intro' => "Aquesta pagina especiala accèpta un tèxte wiki source e permet de realizar recursivament l’espandiment dels modèls que conten.
+Realiza tanben l’espandiment de las foncions del parser talas coma
+<code><nowiki>{{</nowiki>#language:...}}</code> e de variablas coma
+<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.
+En fach, realiza l'espandiment de gaireben tot çò qu'es enquadrat per d'acoladas doblas.",
'expand_templates_title' => 'Títol de l’article, util per exemple se lo modèl utiliza {{FULLPAGENAME}} :',
'expand_templates_input' => 'Picatz vòstre tèxte aicí :',
'expand_templates_output' => 'Visualizatz lo resultat :',
'revdelete-show-file-submit' => 'ହଁ',
'revdelete-selected' => "'''[[:$1]]ର {{PLURAL:$2|ବଛା ସଙ୍କଳନ|ବଛା ସଙ୍କଳନ}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|ବଛା ଲଗ ଘଟଣା|ବଛା ଲଗ ଘଟଣାବଳୀ}}:'''",
-'revdelete-text' => "'''ଲିଭାଯାଇଥିବା ସଂସ୍କରଣ ଓ ଘଟଣାସମୂହ ଏବେ ବି ପୃଷ୍ଠାର ଇତିହାସରେ ରହିବ, କିନ୍ତୁ ଜନସାଧାରଣଙ୍କୁ ସେସବୁର କିଛି ଭାଗ ଲୁଚାଇ ରଖାଯିବ ।'''
-ଏହି {{SITENAME}}ର ବାକି ପରିଚାଳକଗଣ ଲୁଚିରହିଥିବା ବିଷୟବସ୍ତୁ ଦେଖିପାରିବେ ଓ ଅଧିକ ବାରଣ ଥିଲେ ହେଁ ସେହି ଏକା ଇଣ୍ଟରଫେସ ବ୍ୟବହାର କରି ତାହାକୁ ଆଉଥରେ ଲିଭାଯିବାରୁ ଅଟକାଇପାରିବେ ।",
'revdelete-confirm' => 'ଦୟାକରି ଥୟ କରନ୍ତୁ ଯେ ଆପଣ ଏହା କରିବାକୁ ଚାହୁଁଛନ୍ତି, ଆପଣ ଏହାର ପରିଣାମ ଜାଣନ୍ତି ଓ ଆପଣ [[{{MediaWiki:Policy-url}}|ନୀତି]] ଅନୁସାରେ ଏହା କରୁଛନ୍ତି ।',
'revdelete-suppress-text' => "ଦବାଇ ରଖିବା '''କେବଳ''' ଏହି ତଳଲିଖିତ କ୍ଷେତ୍ରରେ ବ୍ୟବହାର କରାଯିବ:
* ସମ୍ଭାବିତ ଅପମାନଜଣକ ତଥ୍ୟ
'revdelete-nooldid-text' => 'Mapaliaring ala kang binieng balak a pamanalili (target revision) ba meng daptan ing gamit (function) a iti, ala yu ing mebanggit a pamanaliling iti, o magtangka kang isalikut ya ing kasalungsungan a pamanalili.',
'revdelete-selected' => "'''{{PLURAL:$2|Mepiling bersion|Mepiling bersion}} ning [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Mepiling miliari king tala/listaan|Mepiling miliari king tala/listaan}}:'''",
-'revdelete-text' => "'''Lunto la pa murin king amlat ning bulung deng meburang pamanalili ampong kapaliarian (events), oneng e ra no abusni deng malda ding mapilang dake ning karelang laman.'''
-
-Abusni da pa murin deng aliwang talapanibala (admin) king {{SITENAME}} itang laman a makasalikut, at aurung da ing pangabura na niti kapamilatan na mismu niting interface, puera namu nung ating bayung pamag-limita o pamanyabat a miyutus.",
'revdelete-legend' => 'Mitakdang angganan/limitasiun kareng maliaring akit',
'revdelete-hide-text' => 'Isalikut ya ing meyaliling kulitan',
'revdelete-hide-image' => 'Isalikut ya ing laman ning simpan',
# User preference toggles
'tog-underline' => 'Gleecher unnerleine:',
'tog-hideminor' => 'Gleene Enneringe verschwinne losse',
-'tog-watchdefault' => 'Vun mir gennerte Ardickele watsche',
+'tog-watchdefault' => 'Vun mir gennerte Ardickele un Feils watsche',
+'tog-watchmoves' => 'Vun mir gezogene Ardickele un Feils watsche',
+'tog-watchdeletion' => 'Vun mir verwischte Ardickele un Feils watsche',
'tog-watchlisthideown' => 'Mei Ardickele vun mei Watsch-Lischt verschwinne losse',
'tog-watchlisthidebots' => 'Enneringe vun Bots vun mei Watsch-Lischt verschwinne losse',
'tog-watchlisthideminor' => 'Gleene Enneringe vun mei Watsch-Lischt verschwinne losse',
'oct' => 'Okt.',
'nov' => 'Nov.',
'dec' => 'Dis.',
+'january-date' => '$1. Yenner',
+'february-date' => '$1. Hanning',
+'march-date' => '$1. Matz',
+'april-date' => '$1. Abril',
+'may-date' => '$1. Moi',
+'june-date' => '$1. Tschuun',
+'july-date' => '$1. Tschulei',
+'august-date' => '$1. Aagscht',
+'october-date' => '$1. Oktower',
+'december-date' => '$1. Disember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Abdeeling|Abdeelinge}}',
'virus-unknownscanner' => 'Unbekannter Virus-Uffgucker:',
# Login and logout pages
+'welcomeuser' => 'Wilkum, $1!',
'yourname' => 'Yuuser-Naame:',
+'userlogin-yourname' => 'Yuusernaame',
'yourpassword' => 'Paesswatt:',
+'userlogin-yourpassword' => 'Paesswatt',
'yourpasswordagain' => 'Paesswatt noch eemol:',
'yourdomainname' => 'Dei Domain:',
'login' => 'Kumm nei',
'logout' => 'Geh naus',
'userlogout' => 'Geh naus',
'gotaccountlink' => 'Kumm nei',
+'createacct-emailrequired' => 'E-Poschd',
'createaccountmail' => 'iwwer E-Mail',
'createaccountreason' => 'Grund:',
-'mailmypassword' => 'Neies Paesswadd eposchde',
+'mailmypassword' => 'Paesswatt zerricksetze',
'noemail' => 'Yuuser „$1“ hot ken E-Mail aagewwe.',
'loginlanguagelabel' => 'Schprooch: $1',
+'pt-login' => 'Nei kumme',
+'pt-login-button' => 'Nei kumme',
+'pt-userlogout' => 'Naus geh',
# Change password dialog
'changepassword' => 'Paesswatt ennere',
'passwordreset' => 'Paesswatt zerricksetze',
'passwordreset-legend' => 'Paesswatt zerricksetze',
'passwordreset-username' => 'Yuuser-Naame:',
+'passwordreset-email' => 'E-Poschd:',
'passwordreset-emailelement' => 'Yuusernaame: $1
Paesswatt fer nau: $2',
# Special:ChangeEmail
'changeemail-none' => '(ken)',
+'changeemail-submit' => 'E-Poschd ennere',
# Edit page toolbar
'bold_sample' => 'Wadde fett gmarrickt',
'savearticle' => 'Blatt beilege',
'preview' => 'Aagucke',
'showdiff' => 'Enneringe zeige',
+'blockedtitle' => 'Yuuser iss aabunne',
'blockednoreason' => 'ken Grund gewwe',
'loginreqlink' => 'kumm nei',
'newarticle' => '(Nei)',
'last' => 'Letscht',
'page_first' => 'Aafang',
'page_last' => 'End',
-'histfirst' => 'Eldescht',
-'histlast' => 'Letscht',
+'histfirst' => 'eldescht',
+'histlast' => 'neieschd',
'historysize' => '({{PLURAL:$1|1 Beit|$1 Beit}})',
'historyempty' => '(leer)',
'rev-showdeleted' => 'zeig',
'revdelete-no-file' => 'Sell Feil gebt es net.',
'revdelete-show-file-submit' => 'Ya',
-'revdelete-hide-text' => 'Text vun de Version verschwinne losse',
+'revdelete-hide-text' => 'Text vun de Version',
'revdelete-radio-same' => '(net ennere)',
'revdelete-radio-set' => 'Ya',
'revdelete-radio-unset' => 'Nee',
'search-section' => '(Abschnitt $1)',
'search-suggest' => 'Iss „$1“ gemeent?',
'search-interwiki-caption' => 'Schweschder Projects',
-'search-interwiki-default' => '$1 Results:',
+'search-interwiki-default' => 'Results vun $1:',
'search-interwiki-more' => '(weidere)',
'searchall' => 'all',
'powersearch-ns' => 'Guck uff in Blatznaame:',
'prefs-custom-css' => 'CSS vum Yuuser',
'prefs-custom-js' => 'JavaScript vum Yuuser',
'youremail' => 'E-Poschde:',
-'username' => 'Yuuser-Naame:',
-'uid' => 'Yuuser-ID:',
-'prefs-memberingroups' => 'Mitglied vun de {{PLURAL:$1|Yuuser-Druppe|Yuuser-Druppe}}:',
+'username' => '{{GENDER:$1|Yuuser-Naame}}:',
+'uid' => '{{GENDER:$1|Yuuser-ID}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Mitglied}} vun de {{PLURAL:$1|Yuuser-Druppe|Yuuser-Druppe}}:',
'yourlanguage' => 'Schprooch:',
'yourgender' => 'Geschlecht:',
-'gender-female' => 'Weiblich',
+'gender-female' => 'Ich bin weiblich',
'email' => 'E-Poschde',
'prefs-signature' => 'Unnerschrift',
+'prefs-editor' => 'Schreiwer',
+'prefs-preview' => 'Aasicht',
'prefs-diffs' => 'Unnerschidd vun Versione',
# User rights
'emailsent' => 'E-Poscht naus gschickt',
# Watchlist
-'watchlist' => 'Mei Watsch-Lischt',
+'watchlist' => 'Watsch-Lischt',
'mywatchlist' => 'Watsch-Lischt',
'watchlistfor2' => 'Vun $1 $2',
'watch' => 'watsche',
'blanknamespace' => '(Bledder)',
# Contributions
-'contributions' => 'Ardickele vum Yuuser',
+'contributions' => 'Ardickele vum {{GENDER:$1|Yuuser}}',
'contributions-title' => 'Ardickele vun „$1“',
'mycontris' => 'Mei Ardickele',
-'contribsub2' => 'Fer $1 ($2)',
+'contribsub2' => 'Fer {{GENDER:$3|$1}} ($2)',
'uctop' => '(ewwerscht)',
'month' => 'unn Munet:',
'year' => 'bis Yaahr:',
'tog-ccmeonemails' => 'Przesyłaj mi kopie wiadomości, które wysyłam do innych użytkowników',
'tog-diffonly' => 'Nie pokazuj treści stron pod porównaniami zmian',
'tog-showhiddencats' => 'Pokazuj ukryte kategorie',
-'tog-noconvertlink' => 'Wyłącz konwersję tytułów w linkach',
'tog-norollbackdiff' => 'Pomiń pokazywanie zmian po użyciu funkcji „cofnij”',
'tog-useeditwarning' => 'Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian',
'tog-prefershttps' => 'Zawsze używaj bezpiecznego połączenia po zalogowaniu',
'revdelete-show-file-submit' => 'Tak',
'revdelete-selected' => "'''{{PLURAL:$2|Zaznaczona wersja|Zaznaczone wersje}} strony [[:$1]]:'''",
'logdelete-selected' => "'''Zaznaczone {{PLURAL:$1|zdarzenie|zdarzenia}} z rejestru:'''",
-'revdelete-text' => "'''Usunięte wersje i czynności będą nadal widoczne w historii strony i rejestrach, ale ich treść nie będzie publicznie dostępna.'''
-Inni administratorzy {{GRAMMAR:D.lp|{{SITENAME}}}} nadal będą mieć dostęp do ukrytych treści oraz będą mogli je odtworzyć używając standardowych mechanizmów, chyba że nałożono dodatkowe ograniczenia.",
'revdelete-confirm' => 'Potwierdź, że chcesz to zrobić zgodnie z [[{{MediaWiki:Policy-url}}|zasadami]] i że rozumiesz konsekwencje.',
'revdelete-suppress-text' => "Ukrywanie powinno być używane '''wyłącznie''' w sytuacji:
* Informacji, która może być zniesławieniem
# Special:ActiveUsers
'activeusers' => 'Lista aktywnych użytkowników',
'activeusers-intro' => 'Poniżej znajduje się lista użytkowników, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.',
-'activeusers-count' => 'w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|edycję|edycje|edycji}}',
+'activeusers-count' => 'w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|operację|operacje|operacji}}',
'activeusers-from' => 'Pokaż użytkowników zaczynając od',
'activeusers-hidebots' => 'Ukryj boty',
'activeusers-hidesysops' => 'Ukryj administratorów',
Usuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
'delete-warning-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
Bądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
-'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się inne strony.",
+'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się [[Special:WhatLinksHere/{{FULLPAGENAME}}|inne strony]].",
# Rollback
'rollback' => 'Cofnij edycję',
'tog-ccmeonemails' => "Mandeme na còpia dij mëssagi ëd pòsta eletrònica che i-j mando a j'àotri utent",
'tog-diffonly' => 'Smon-e pa ël contnù dle pàgine sota le diferense',
'tog-showhiddencats' => 'Smon-e le categorìe stërmà',
-'tog-noconvertlink' => "Disativé la conversion dij tìtoj ant j'anliure",
'tog-norollbackdiff' => "Fé nen vëdde le diferense apress d'avèj ripristinà",
'tog-useeditwarning' => 'Aviseme quand che i chito na pàgina ëd modìfiche con dle modìfiche nen salvà',
'tog-prefershttps' => "Dovré sempe na conession sigura pr'ësté andrinta al sistema",
'revdelete-show-file-submit' => 'Bò!',
'revdelete-selected' => "'''{{PLURAL:$2|Revision|Revision}} selessionà për [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Event|Event}} dël registr selessionà:'''",
-'revdelete-text' => "Le version scancelà e j'event a së s-ciaireran sempe ant la stòria dla pàgina e ant ij registr, ma sò test al pùblich a j'andrà pì nen.'''
-J'àutri aministrator dzora a {{SITENAME}} a saran ancó sempe bon a s-ciairé ël contnù stërmà e a podran disdëscancelelo andré con la midema antërfacia, sempe che a sia nen stàita butà na restrission adissional.",
'revdelete-confirm' => "Për piasì, ch'a confema ch'a veul fé sòn, ch'as rend cont dle conseguense, e ch'a lo fa an acòrd con [[{{MediaWiki:Policy-url}}|le régole]].",
'revdelete-suppress-text' => "La scancelassion a dovrìa '''mach''' esse dovrà an costi cas:
* Anformassion ch'a podrìo esse difamatòrie
'delete-warning-toobig' => "Sta pàgina-sì a l'ha na stòria motobin longa, bele pì che $1 {{PLURAL:$1|revision|revision}}.
A scancelela as peul fesse darmagi a j'operassion dla base ëd dat ëd {{SITENAME}};
ch'a daga da ment a lòn ch'a fa.",
-'deleting-backlinks-warning' => "'''Avis:''' D'àutre pàgine a l'han na liurao a transcludo a la pàgina che chiel a veul ëscancelé.",
+'deleting-backlinks-warning' => "'''Avis:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|D'àutre pàgine]] a l'han na liura o a transcludo la pàgina che chiel a veul ëscancelé.",
# Rollback
'rollback' => 'Gavé via le modìfiche',
'revdelete-show-file-submit' => 'ہاں',
'revdelete-selected' => "'''{{PLURAL:$2|چنی ریوین|چنیاں ریویناں}} دی [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|چنیا لاگ واقعہ|چنے لاگ واقعے}}:'''",
-'revdelete-text' => "'''مٹائیاں ریویناں تے واقعے صفے دے رکارڈ تے لاگ چ دسن گے، پر اودا کج حصہ عام لوکاں لی لکیا ہووے گا'''
-دوجے مکھیا {{سائیٹناں}} ہلے وی ایس قابل نیں جے لکی لکھت نوں ویکھ سکن تے اینوں واپس لے آن دوبارہ اودوں تک جے ایدے تے ہور روکاں ناں لا دتیا جان.",
'revdelete-confirm' => 'اے پکا کرلو جے تسیں ایہ کرنا چاندے او، تے توانوں ایدے نتیجے دا پتہ اے، تے تسیں [[{{MediaWiki:Policy-url}}|پالیسی]] تے چل کے ک رۓ او۔',
'revdelete-suppress-text' => "دبانا اودوں ای ٹھیک اے جدوں اے تھلے دتے کۓ مسلیاں لئی ہووے۔
* غلط جانکاری
'shown-title' => 'په هر مخ $1 {{PLURAL:$1|پايله|پايلې}} ښکاره کول',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) کتل',
'searchmenu-exists' => "'''په دې ويکي يو مخ د \"[[:\$1]]\" په نامه دی'''",
-'searchmenu-new' => "'''په دې ويکي د \"[[:\$1]]\" مخ جوړول!'''",
+'searchmenu-new' => '<strong>په دې ويکي د "[[:$1]]" مخ جوړول!</strong> {{PLURAL:$2|0=|See also the page found with your search.|د پلټنو موندل شوې پايلې هم وگورئ.}}',
'searchprofile-articles' => 'مېنځپانگيز مخونه',
'searchprofile-project' => 'د لارښود او پروژې مخونه',
'searchprofile-images' => 'گڼرسنۍ',
'recentchanges-label-bot' => 'دا سمون يو روباټ ترسره کړی',
'recentchanges-label-unpatrolled' => 'دغه سمون تر اوسه پورې نه دی څارل شوی',
'recentchanges-label-plusminus' => 'د بايټونو د شمېر له مخې د مخ د بدلون کچه',
-'recentchanges-legend-newpage' => '(دا هم وگورۍ [[Special:NewPages|د نويو مخونو لړليک]])',
-'rcnotefrom' => "په همدې ځای کې لاندې هغه بدلونونه دي چې د '''$2''' نه راپدېخوا پېښ شوي (تر '''$1''' پورې ښکاره شوي).",
+'recentchanges-legend-newpage' => '([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)',
+'rcnotefrom' => 'دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).',
'rclistfrom' => 'هغه نوي بدلونونه ښکاره کول چې له $1 نه پيلېږي',
'rcshowhideminor' => 'وړې سمونې $1',
'rcshowhidebots' => 'روباټ $1',
'protect-summary-cascade' => 'ځوړاوبيز',
'protect-expiring' => 'په $1 (UTC) پای ته رسېږي',
'protect-expiring-local' => 'پای نېټه $1',
-'protect-expiry-indefinite' => 'Ù\84امحدوده',
+'protect-expiry-indefinite' => 'Ù\86امحدوده',
'protect-cascade' => 'په همدې مخ کې د ټولو گډو مخونو څخه ژغورنه کېږي (ځوړاوبيزه ژغورنه)',
'protect-cantedit' => 'تاسې نه شی کولای چې د دې مخ د ژغورنې په کچه کې بدلون راولی، دا ځکه چې تاسې د دې مخ د سمولو اجازه نه لری.',
'protect-othertime' => 'بل وخت:',
** بې گټې سمونې او خپرونې
** ډېر لوستونکی مخ',
'protect-edit-reasonlist' => 'د ژغورنې سببونه سمول',
-'protect-expiry-options' => '1 ساعت:1 hour,1 Ù\88رÚ\81:1 day,1 اÙ\88Ù\88Ù\86Û\8d:1 week,2 اÙ\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 کاÙ\84:1 year,Ù\84امحدوده:infinite',
+'protect-expiry-options' => '1 ساعت:1 hour,1 Ù\88رÚ\81:1 day,1 اÙ\88Ù\88Ù\86Û\8d:1 week,2 اÙ\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 کاÙ\84:1 year,Ù\86امحدوده:infinite',
'restriction-type' => 'اجازه:',
'restriction-level' => 'د بنديز کچه:',
'minimum-size' => 'وړه کچه',
'ipbemailban' => 'د کارن لخوا په برېښليک رالېږلو بنديز',
'ipbsubmit' => 'په دې کارن بنديز لگول',
'ipbother' => 'بل وخت:',
-'ipboptions' => '2 ساعتÙ\88Ù\86Ù\87:2 hours,1 Ù\88رÚ\81:1 day,3 Ù\88رÚ\81Û\90:3 days,1 اÙ\88Ù\88Ù\86Û\8d:1 week,2 اÙ\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 کاÙ\84:1 year,Ù\84امحدوده:infinite',
+'ipboptions' => '2 ساعتÙ\88Ù\86Ù\87:2 hours,1 Ù\88رÚ\81:1 day,3 Ù\88رÚ\81Û\90:3 days,1 اÙ\88Ù\88Ù\86Û\8d:1 week,2 اÙ\88Ù\88Ù\86Û\8d:2 weeks,1 Ù\85Ù\8aاشت:1 month,3 Ù\85Ù\8aاشتÛ\90:3 months,6 Ù\85Ù\8aاشتÛ\90:6 months,1 کاÙ\84:1 year,Ù\86امحدوده:infinite',
'ipbhidename' => 'کارن-نوم له سمون او لړليکونو پټول',
+'ipbwatchuser' => 'د دې کارن د خبرو اترو مخ او کارن مخ کتل',
+'ipb-disableusertalk' => 'د بنديز لگېدو سره دې د کارن د خبرو اترو مخ د سمولو مخنيوی هم پلي شي',
'ipb-confirm' => 'د بنديز تاييد',
'badipaddress' => 'ناسمه IP پته',
'blockipsuccesssub' => 'بنديز په برياليتوب سره ولگېده',
$messages = array(
# User preference toggles
-'tog-underline' => 'Sublinhar ligação:',
+'tog-underline' => 'Sublinhar ligações:',
'tog-hideminor' => 'Esconder edições menores nas mudanças recentes',
'tog-hidepatrolled' => 'Esconder edições patrulhadas nas mudanças recentes',
'tog-newpageshidepatrolled' => 'Esconder páginas patrulhadas na lista de páginas novas',
'tog-numberheadings' => 'Auto-numerar cabeçalhos',
'tog-showtoolbar' => 'Mostrar barra de edição',
'tog-editondblclick' => 'Editar páginas quando houver um clique duplo',
-'tog-editsectiononrightclick' => 'Possibilitar a edição de seções por clique com o botão direito no título da seção',
-'tog-rememberpassword' => 'Recordar os meus dados neste browser (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
+'tog-editsectiononrightclick' => 'Possibilitar a edição de secções por clique com o botão direito no título da secção',
+'tog-rememberpassword' => 'Recordar os meus dados neste navegador (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
'tog-watchcreations' => 'Adicionar as páginas e ficheiros que eu criar às minhas páginas vigiadas',
'tog-watchdefault' => 'Adicionar as páginas e ficheiros que eu editar às minhas páginas vigiadas',
'tog-watchmoves' => 'Adicionar as páginas e ficheiros que eu mover às minhas páginas vigiadas',
'tog-minordefault' => 'Por omissão, marcar todas as edições como menores',
'tog-previewontop' => 'Mostrar a antevisão antes da caixa de edição',
'tog-previewonfirst' => 'Mostrar a antevisão na primeira edição',
-'tog-enotifwatchlistpages' => 'Notificar-me por correio eletrónico quando uma página ou ficheiro vigiado for alterado',
-'tog-enotifusertalkpages' => 'Notificar-me por correio eletrónico quando a minha página de discussão é editada',
-'tog-enotifminoredits' => 'Notificar-me por correio eletrónico também sobre edições menores de páginas ou ficheiros',
-'tog-enotifrevealaddr' => 'Revelar o meu endereço de correio eletrónico nas notificações',
+'tog-enotifwatchlistpages' => 'Notificar-me por correio electrónico quando uma página ou ficheiro vigiado for alterado',
+'tog-enotifusertalkpages' => 'Notificar-me por correio electrónico quando a minha página de discussão é editada',
+'tog-enotifminoredits' => 'Notificar-me por correio electrónico também sobre edições menores de páginas ou ficheiros',
+'tog-enotifrevealaddr' => 'Revelar o meu endereço de correio electrónico nas notificações',
'tog-shownumberswatching' => 'Mostrar o número de utilizadores a vigiar',
'tog-oldsig' => 'Assinatura existente:',
'tog-fancysig' => 'Tratar assinatura como texto wiki (sem link automático)',
'tog-watchlisthideliu' => 'Esconder edições de utilizadores autenticados ao listar mudanças às páginas vigiadas',
'tog-watchlisthideanons' => 'Esconder edições de utilizadores anónimos ao listar mudanças às páginas vigiadas',
'tog-watchlisthidepatrolled' => 'Esconder edições patrulhadas ao listar mudanças às páginas vigiadas',
-'tog-ccmeonemails' => 'Enviar-me cópias das mensagens por correio eletrónico que eu enviar a outros utilizadores',
+'tog-ccmeonemails' => 'Enviar-me cópias das mensagens por correio electrónico que eu enviar a outros utilizadores',
'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
'tog-showhiddencats' => 'Mostrar categorias ocultas',
-'tog-noconvertlink' => 'Impossibilitar a conversão dos títulos de links',
'tog-norollbackdiff' => 'Omitir diferenças depois de reverter edições em bloco',
'tog-useeditwarning' => 'Avisar-me ao abandonar uma página editada sem gravar as alterações.',
-'tog-prefershttps' => 'Sempre utilizar uma conexão segura ao iniciar sessão',
+'tog-prefershttps' => 'Usar sempre uma ligação segura quando estiver autenticado',
'underline-always' => 'Sempre',
'underline-never' => 'Nunca',
-'underline-default' => 'Usar opção padrão do tema ou do browser',
+'underline-default' => 'Usar opção padrão do tema ou do navegador',
# Font style option in Special:Preferences
'editfont-style' => 'Fonte de edição:',
-'editfont-default' => 'Fonte por omissão, do browser',
+'editfont-default' => 'Fonte por omissão, do navegador',
'editfont-monospace' => 'Fonte monoespaçada',
-'editfont-sansserif' => 'Fonte sans-serif',
+'editfont-sansserif' => 'Fonte sem serifa',
'editfont-serif' => 'Fonte serifada',
# Dates
'december' => 'dezembro',
'january-gen' => 'janeiro',
'february-gen' => 'fevereiro',
-'march-gen' => 'Março',
+'march-gen' => 'março',
'april-gen' => 'abril',
'may-gen' => 'maio',
'june-gen' => 'junho',
'category_header' => 'Páginas na categoria "$1"',
'subcategories' => 'Subcategorias',
'category-media-header' => 'Multimédia na categoria "$1"',
-'category-empty' => "''Esta categoria não contém atualmente nenhuma página ou ficheiro multimédia.''",
+'category-empty' => "''Esta categoria não contém actualmente nenhuma página ou ficheiro multimédia.''",
'hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}}',
'hidden-category-category' => 'Categorias ocultas',
'category-subcat-count' => '{{PLURAL:$2|Esta categoria só contém a seguinte subcategoria.|Esta categoria contém {{PLURAL:$1|a seguinte subcategoria|as seguintes $1 subcategorias}} (de um total de $2).}}',
'listingcontinuesabbrev' => 'cont.',
'index-category' => 'Páginas indexadas',
'noindex-category' => 'Páginas não indexadas',
-'broken-file-category' => 'Páginas com links quebrados para ficheiros',
+'broken-file-category' => 'Páginas com ligações quebradas para ficheiros',
'about' => 'Sobre',
'article' => 'Página de conteúdo',
'vector-action-move' => 'Mover',
'vector-action-protect' => 'Proteger',
'vector-action-undelete' => 'Restaurar',
-'vector-action-unprotect' => 'Alterar proteção',
+'vector-action-unprotect' => 'Alterar protecção',
'vector-view-create' => 'Criar',
'vector-view-edit' => 'Editar',
'vector-view-history' => 'Ver histórico',
'vector-view-view' => 'Ler',
'vector-view-viewsource' => 'Ver fonte',
-'actions' => 'Ações',
+'actions' => 'Acções',
'namespaces' => 'Espaços nominais',
'variants' => 'Variantes',
'searcharticle' => 'Ir',
'history' => 'Histórico',
'history_short' => 'Histórico',
-'updatedmarker' => 'atualizado desde a minha última visita',
+'updatedmarker' => 'actualizado desde a minha última visita',
'printableversion' => 'Versão para impressão',
-'permalink' => 'Link permanente',
+'permalink' => 'Ligação permanente',
'print' => 'Imprimir',
'view' => 'Ver',
'edit' => 'Editar',
'ok' => 'OK',
'retrievedfrom' => 'Obtida de "$1"',
-'youhavenewmessages' => 'Tem $1 ($2).',
-'youhavenewmessagesfromusers' => 'Tem $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
+'youhavenewmessages' => '{{PLURAL:$3|Tem}} $1 ($2).',
+'youhavenewmessagesfromusers' => '{{PLURAL:$4|Tem}} $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
'youhavenewmessagesmanyusers' => 'Tem $1 de muitos utilizadores ($2).',
'newmessageslinkplural' => '{{PLURAL:$1|uma mensagem nova|999=mensagens novas}}',
'newmessagesdifflinkplural' => '{{PLURAL:$1|última alteração|999=últimas alterações}}',
'createacct-another-realname-tip' => 'O fornecimento do nome verdadeiro é opcional.
Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.',
'pt-login' => 'Autenticação',
+'pt-login-button' => 'Iniciar sessão',
'pt-createaccount' => 'Criar uma conta',
'pt-userlogout' => 'Sair',
'rev-deleted-user' => '(nome de utilizador removido)',
'rev-deleted-event' => '(entrada removida)',
'rev-deleted-user-contribs' => '[nome de utilizador ou IP removido - edição ocultada das contribuições]',
-'rev-deleted-text-permission' => "Esta revisão de página foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-deleted-text-unhide' => "Esta revisão de página foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
-Pode mesmo assim [$1 ver esta edição] se deseja prosseguir.",
-'rev-suppressed-text-unhide' => "Esta revisão de página foi '''suprimida'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
-Pode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
-'rev-deleted-text-view' => "Esta revisão de página foi '''eliminada'''.
-Você pode vê-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-suppressed-text-view' => "Esta revisão de página foi '''suprimida'''.
-Você pode vê-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
-'rev-deleted-no-diff' => "Não pode ver esta diferença entre revisões porque uma das revisões foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-suppressed-no-diff' => "Não pode ver esta diferença entre versões porque uma das revisões foi '''eliminada'''.",
-'rev-deleted-unhide-diff' => "Uma das revisões desta diferença entre revisões foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
-Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
-'rev-suppressed-unhide-diff' => "Uma das revisões desta diferença entre revisões foi '''suprimida'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
-Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
-'rev-deleted-diff-view' => "Uma das revisões desta diferença entre revisões foi '''eliminada'''.
-Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
-'rev-suppressed-diff-view' => "Uma das revisões desta diferença entre revisões foi '''suprimida'''.
-Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
+'rev-deleted-text-permission' => 'Esta revisão de página foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-deleted-text-unhide' => 'Esta revisão de página foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
+Pode mesmo assim [$1 ver esta revisão] se deseja prosseguir.',
+'rev-suppressed-text-unhide' => 'Esta revisão de página foi <strong>suprimida</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
+Pode mesmo assim [$1 ver esta revisão] se deseja prosseguir.',
+'rev-deleted-text-view' => 'Esta revisão de página foi <strong>eliminada</strong>.
+Você pode vê-la; encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-suppressed-text-view' => 'Esta revisão de página foi <strong>suprimida</strong>.
+Você pode vê-la; encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].',
+'rev-deleted-no-diff' => 'Não pode ver esta diferença entre revisões porque uma das revisões foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-suppressed-no-diff' => 'Não pode ver esta diferença entre versões porque uma das revisões foi <strong>eliminada</strong>.',
+'rev-deleted-unhide-diff' => 'Uma das revisões desta diferença entre revisões foi <strong>eliminada</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
+Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.',
+'rev-suppressed-unhide-diff' => 'Uma das revisões desta diferença entre revisões foi <strong>suprimida</strong>.
+Encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
+Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.',
+'rev-deleted-diff-view' => 'Uma das revisões desta diferença entre revisões foi <strong>eliminada</strong>.
+Pode ver a diferença entre revisões; encontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].',
+'rev-suppressed-diff-view' => 'Uma das revisões desta diferença entre revisões foi <strong>suprimida</strong>.
+Pode ver a diferença entre revisões; encontrará detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].',
'rev-delundel' => 'mostrar/esconder',
'rev-showdeleted' => 'mostrar',
'revisiondelete' => 'Eliminar/restaurar edições',
'revdelete-show-file-submit' => 'Sim',
'revdelete-selected' => "'''{{PLURAL:$2|Edição selecionada|Edições selecionadas}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Evento do registo selecionado|Eventos do registo selecionados}}:'''",
-'revdelete-text' => "'''Edições e eventos eliminados continuarão a aparecer no histórico e registos da página, mas partes do seu conteúdo estarão inacessíveis ao público.'''
-Outros administradores da {{SITENAME}} continuarão a poder aceder ao conteúdo escondido e podem restaurá-lo novamente através desta mesma interface, a menos que restrições adicionais sejam definidas.",
+'revdelete-text-text' => 'Revisões eliminadas ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.',
+'revdelete-text-file' => 'Versões eliminadas do ficheiro ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.',
+'revdelete-text-others' => 'Outros administradores em {{SITENAME}} podem aceder ao conteúdo oculto e torná-lo visível novamente através desta mesma interface, a menos que sejam definidas restrições adicionais.',
'revdelete-confirm' => 'Por favor confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].',
'revdelete-suppress-text' => "A supressão '''só''' deverá ser usada nos seguintes casos:
* Informação potencialmente caluniosa, difamatória ou injuriosa
'nextn-title' => '{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}',
'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
+'searchmenu-exists' => '<strong>Há uma página com o nome "[[:$1]]" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados encontrados.}}',
'searchmenu-new' => '<strong>Crie a página "[[:$1]]" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada na pesquisa.|Veja também os resultados da pesquisa.}}',
'searchprofile-articles' => 'Páginas de conteúdo',
'searchprofile-project' => 'Páginas de ajuda e de projeto',
'recentchanges-label-plusminus' => 'Alteração no tamanho da página, em bytes',
'recentchanges-legend-heading' => "'''Legenda:'''",
'recentchanges-legend-newpage' => '([[Special:NewPages|lista de páginas novas]])',
+'recentchanges-legend-plusminus' => '(<em>±123</em>)',
'rcnotefrom' => 'Abaixo estão as mudanças desde <strong>$2</strong> (mostradas até <strong>$1</strong>).',
'rclistfrom' => 'Mostrar as novas mudanças a partir das $1',
'rcshowhideminor' => '$1 edições menores',
'delete-warning-toobig' => 'Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
Eliminá-la poderá causar problemas na base de dados da {{SITENAME}};
prossiga com precaução.',
-'deleting-backlinks-warning' => "'''Aviso:''' Outras páginas possuem ligação à ou são transcluídas da página que está prestes a eliminar.",
+'deleting-backlinks-warning' => "'''Aviso:''' Há [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm links para a página que está prestes a eliminar ou que a transcluem.",
# Rollback
'rollback' => 'Reverter edições',
'sp-contributions-blocked-notice-anon' => 'Este endereço IP está bloqueado neste momento.
Para referência é apresentado abaixo o último registo de bloqueio:',
'sp-contributions-search' => 'Pesquisar contribuições',
+'sp-contributions-suppresslog' => 'contribuições suprimidas',
'sp-contributions-username' => 'Endereço IP ou utilizador:',
'sp-contributions-toponly' => 'Mostrar somente as revisões mais recentes',
'sp-contributions-newonly' => 'Mostrar só edições que são criações de páginas',
'dberr-cachederror' => 'A seguinte página é uma cópia em cache da página pedida e pode não estar atualizada.',
# HTML forms
-'htmlform-invalid-input' => 'Existem problemas com alguns dos dados introduzidos',
+'htmlform-invalid-input' => 'Existem problemas com alguns dos dados introduzidos.',
'htmlform-select-badoption' => 'O valor que especificou não é uma opção válida.',
'htmlform-int-invalid' => 'O valor que especificou não é um inteiro.',
'htmlform-float-invalid' => 'O valor que especificou não é um número.',
-'htmlform-int-toolow' => 'O valor que especificou é inferior ao mínimo de $1',
-'htmlform-int-toohigh' => 'O valor que especificou é superior ao máximo de $1',
-'htmlform-required' => 'Este valor é necessário',
+'htmlform-int-toolow' => 'O valor que especificou é inferior ao mínimo de $1.',
+'htmlform-int-toohigh' => 'O valor que especificou é superior ao máximo de $1.',
+'htmlform-required' => 'Este valor é necessário.',
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Desfazer alterações',
'htmlform-selectorother-other' => 'Outros',
'revdelete-unrestricted' => 'restrições a administradores removidas',
'logentry-move-move' => '$1 moveu a página $3 para $4',
'logentry-move-move-noredirect' => '$1 moveu a página $3 para $4 sem deixar um redirecionamento',
-'logentry-move-move_redir' => '$1 moveu a página $3 para $4 sobre um redirecionamento',
-'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sobre um redirecionamento sem deixar um redirecionamento',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|moveu}} a página $3 para $4 sobre um redirecionamento',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|moveu}} a página $3 para $4 sobre um redirecionamento sem deixar um redirecionamento',
'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada',
'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada',
'logentry-newusers-newusers' => 'A conta de utilizador $1 foi {{GENDER:$2|criada}}',
'tog-ccmeonemails' => 'Receber cópias de e-mails que eu enviar a outros usuários',
'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
'tog-showhiddencats' => 'Exibir categorias ocultas',
-'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
'tog-norollbackdiff' => 'Omitir diferenças após desfazer edições em bloco',
'tog-useeditwarning' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
'tog-prefershttps' => 'Usar sempre uma conexão segura quando estiver conectado',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]',
'userlogin-loggedin' => 'Você já está conectado como {{GENDER:$1|$1}}.
Use o formulário abaixo para iniciar sessão como outro usuário.',
+'userlogin-createanother' => 'Criar uma outra conta',
'createacct-join' => 'Insira suas informações abaixo.',
'createacct-another-join' => 'Preeencha as informações para a nova conta',
'createacct-emailrequired' => 'Endereço de e-mail',
'revdelete-show-file-submit' => 'Sim',
'revdelete-selected' => "'''{{PLURAL:$2|Edição selecionada|Edições selecionadas}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Evento de registro selecionado|Eventos de registro selecionados}}:'''",
-'revdelete-text' => "'''Revisões eliminadas e eventos continuarão aparecendo no histórico da página e nos registros, apesar de o seu conteúdo textual estar inacessível ao público.'''
-Outros administradores no {{SITENAME}} continuarão podendo acessar ao conteúdo escondido e restaurá-lo através desta mesma ''interface'', a menos que uma restrição adicional seja definida.",
'revdelete-confirm' => 'Por favor confirme que pretende executar esta ação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].',
'revdelete-suppress-text' => "A supressão deverá ser usada '''apenas''' para os seguintes casos:
* Informação potencialmente difamatória
'nextn-title' => '{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}',
'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
+'searchmenu-exists' => '<strong>Há uma página com o nome "[[:$1]]" neste wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados da pesquisa encontrados.}}',
'searchmenu-new' => '<strong>Criar a página "[[:$1]]" nesta wiki!</strong>{{PLURAL:$2|0=| Veja também a página encontrada com sua pesquisa.|Veja também os resultados das pesquisas encontradas.}}',
'searchprofile-articles' => 'Páginas de conteúdo',
'searchprofile-project' => 'Ajuda e páginas de projeto',
* @author Od1n
* @author Onecountry
* @author Opraco
+ * @author Orlodrim
* @author OsamaK
* @author PhiLiP
* @author Piangpha
* @author Umherirrender
* @author Urhixidur
* @author Usarker
+ * @author V.narsikar
* @author Verdy p
* @author Vinhtantran
* @author Vivaelcelta
'tog-ccmeonemails' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}',
'tog-diffonly' => 'Toggle option used in [[Special:Preferences]]. {{Gender}}',
'tog-showhiddencats' => 'Toggle option used in [[Special:Preferences]]. {{Gender}}',
-'tog-noconvertlink' => "{{optional}}
-
-''(the message is considered optional because it is only used in wikis with language variants)''",
'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
{{Identical|Rollback}}",
'tog-useeditwarning' => 'Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].',
{{Identical|View}}',
'toolbox' => 'The title of the toolbox below the search menu.
{{Identical|Tool}}',
-'userpage' => '',
-'projectpage' => 'Used as link text in Talk page of project page.',
+'userpage' => 'Used in user talk pages as the text of the link to the user page, with the Cologne Blue skin.',
+'projectpage' => 'Used as link text in Talk page of project page with the Cologne Blue skin.',
'imagepage' => 'Used as link text in Talk page of file page.',
'mediawikipage' => 'Used as link text in Talk page of MediaWiki message page.',
'templatepage' => 'Used as link text in Talk page of template page.',
'createacct-another-realname-tip' => "{{doc-singularthey}}
Used on the account creation form when creating another user's account. Similar to {{msg-mw|prefs-help-realname}}.
{{Identical|Real name attribution}}",
-'pt-login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there)
+'pt-login' => "Shown to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there).
{{Identical|Log in}}",
+'pt-login-button' => 'Shown as the caption of the button at [[Special:UserLogin]].
+{{Identical|Log in}}',
'pt-createaccount' => 'Used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
{{Identical|Create account}}',
'pt-userlogout' => '{{Doc-actionlink}}
* $1 - number of log events
See also:
* {{msg-mw|Revdelete-selected}}',
-'revdelete-text' => '{{RevisionDelete}}
-This is the introduction explaining the feature.',
+'revdelete-text-text' => '{{RevisionDelete}}
+This is the introduction explaining the feature.
+See also: {{msg-mw|revdelete-text-file}}, {{msg-mw|logdelete-text}}, {{msg-mw|revdelete-text-others}}',
+'revdelete-text-file' => '{{RevisionDelete}}
+This is the introduction explaining the feature.
+See also: {{msg-mw|revdelete-text-text}}, {{msg-mw|logdelete-text}}, {{msg-mw|revdelete-text-others}}',
+'logdelete-text' => '{{RevisionDelete}}
+This is the introduction explaining the feature.
+See also: {{msg-mw|revdelete-text-text}}, {{msg-mw|revdelete-text-file}}, {{msg-mw|revdelete-text-others}}',
+'revdelete-text-others' => '{{RevisionDelete}}
+This message is shown after one of: {{msg-mw|revdelete-text-text}}, {{msg-mw|revdelete-text-image}}, {{msg-mw|revdelete-text-logging}}',
'revdelete-confirm' => 'This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.
Refers to {{msg-mw|Policy-url}}.
* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}
* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}
* {{msg-mw|Revdelete-submit|submit button}}',
-'revdelete-reasonotherlist' => '{{Identical|Other reason}}
-{{RevisionDelete}}
+'revdelete-reasonotherlist' => '{{RevisionDelete}}
Used as an item in dropdown.
[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]
-
See also:
* {{msg-mw|Revdelete-legend|legend for the form}}
* {{msg-mw|Revdelete-log|label for dropdown}}
* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}
* {{msg-mw|Revdelete-otherreason|label for input box}}
-* {{msg-mw|Revdelete-submit|submit button}}',
+* {{msg-mw|Revdelete-submit|submit button}}
+{{Identical|Other reason}}',
'revdelete-edit-reasonlist' => '{{Identical|Edit delete reasons}}
{{RevisionDelete}}
[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]',
'sp-contributions-search' => 'Used on [[Special:Contributions]]',
'sp-contributions-suppresslog' => 'Used as a display name for a link to log entries of suppressed edits made by that user.
-Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].',
+Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
+
+See also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.',
'sp-contributions-username' => 'This message appears whenever someone requests [[Special:Contributions]].
{{Identical|IP address or username}}',
-'sp-contributions-toponly' => '"top revision" means the "latest revision"',
-'sp-contributions-newonly' => 'Used as checkbox label.
+'sp-contributions-toponly' => 'A checkbox at [[Special:Mycontributions|Special:Contributions]]',
+'sp-contributions-newonly' => 'Used as checkbox label at [[Special:Mycontributions|Special:Contributions]].
"page creation" means the "first revision" of a page.
'tog-ccmeonemails' => 'Huk ruraqkunaman kachasqay e-chaskikunamanta iskaychasqakunata kachamuway',
'tog-diffonly' => "Huk kaykunap uranpi kaq p'anqap samiqninta ama rikuchiychu",
'tog-showhiddencats' => 'Pakasqa katiguriyakunata rikuchiy',
-'tog-noconvertlink' => "T'inki suti t'ikrayman ama niy",
'tog-norollbackdiff' => 'Ruraqpa hukchasqankunata kutichispa ama wakin kayta willaychu',
'tog-useeditwarning' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
'tog-prefershttps' => "Yaykurqaspaqa hayk'appas takyasqa t'inkiwan llamk'ay",
'revdelete-show-file-submit' => 'Arí',
'revdelete-selected' => "'''{{PLURAL:$2|Akllasqa llamk'apusqa|Akllasqa llamk'apusqakuna}} [[:$1]]-manta:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Akllasqa tukusqa|Akllasqa tukusqakuna}} hallch'api:'''",
-'revdelete-text' => "'''Qullusqa llamk'apusqakunaqa p'anqap wiñay kawsayninpi hallch'ankunapipas paqarinqaraqmi, samiqninpa rakinkunataq manam uyanalla qhawanapaqchu.'''
-{{SITENAME}}pi huk kamachiqkunaqa p'anqap pakasqa samiqninta qhawaspa qullusqa kaymanta kutichiyta atinkuraqmi kay kaqlla uyapuratam llamk'achispa, kay wikip kamariqninkuna mana huk saywachanakunata tiyachiptinqa.",
'revdelete-confirm' => 'Ama hina kaspa, takyachiy munayniykita, qatiqninkunata riqsiyniykita, [[{{MediaWiki:Policy-url}}|kawpaykama]] rurayniykitapas.',
'revdelete-suppress-text' => "Pakay ruranata '''kaylla kaptin''' llamk'achiy:
* K'amiqchá willakuna
'welcomecreation-msg' => "Tes conto è vegnì creà.
N'emblida betg da midar tias [[Special:Preferences|{{SITENAME}} preferenzas]].",
'yourname' => "Num d'utilisader",
+'userlogin-yourname-ph' => "Endatescha tes num d'utilisader",
+'createacct-another-username-ph' => "Endatescha in num d'utilisader",
'yourpassword' => 'pled-clav',
+'userlogin-yourpassword' => 'Pled-clav',
+'userlogin-yourpassword-ph' => 'Endatescha tes pled-clav',
+'createacct-yourpassword-ph' => 'Endatescha in pled-clav',
'yourpasswordagain' => 'repeter pled-clav',
+'createacct-yourpasswordagain' => 'Confermar il pled-clav',
+'createacct-yourpasswordagain-ph' => 'Endatescha il pled-clav anc ina giada',
'remembermypassword' => "S'annunziar permanantamain sin quest computer (per maximalmain $1 {{PLURAL:$1|di|dis}})",
+'userlogin-remembermypassword' => 'Restar annunzià',
+'userlogin-signwithsecure' => 'Duvrar ina connexiun segira',
'yourdomainname' => 'Vossa domain',
'password-change-forbidden' => 'Ti na pos betg midar pleds-clav sin quest vichi.',
'externaldberror' => "U ch'i è capità ina errur cun l'autentificaziun externa u che ti na dastgas betg actualisar tes conto extern.",
'login' => "T'annunziar",
-'nav-login-createaccount' => "T'annunziar / registrar",
+'nav-login-createaccount' => "T'annunziar / crear in conto",
'loginprompt' => "Ti stos avair '''activà ils cookies''' per pudair t'annunziar tar {{SITENAME}}.",
-'userlogin' => "T'annunziar / registrar",
+'userlogin' => "T'annunziar / crear in conto",
'userloginnocreate' => "T'annunziar",
'logout' => 'Sortir',
'userlogout' => 'sortir',
'notloggedin' => "Betg s'annunzià",
+'userlogin-noaccount' => 'Anc nagin conto?',
+'userlogin-joinproject' => 'Far part da {{SITENAME}}',
'nologin' => "Anc nagin conto? '''$1'''.",
'nologinlink' => "Crear in conto d'utilisader",
'createaccount' => "Crear in conto d'utilisader",
'gotaccount' => "Gia in conto d'utilisader? '''$1'''.",
'gotaccountlink' => "T'annunziar",
'userlogin-resetlink' => "Emblidà tias datas per s'annunziar?",
+'userlogin-resetpassword-link' => 'Has emblidà tes pled-clav?',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Agid tar l'annunzia]]",
+'userlogin-loggedin' => "Ti es gia t'annunzià sco {{GENDER:$1|$1}}.
+Dovra il suandant formular per t'annunziar cun in auter conto.",
+'userlogin-createanother' => 'Crear in auter conto',
+'createacct-join' => 'Endatescha tias infurmaziuns sutvart.',
+'createacct-another-join' => 'Endatescha sutvart las infurmaziuns dal nov conto.',
+'createacct-emailrequired' => 'Adressa dad e-mail',
+'createacct-emailoptional' => 'Adressa dad e-mail (opziunal)',
+'createacct-email-ph' => "Endatescha ti'adressa dad e-mail",
+'createacct-another-email-ph' => "Endatescha in'adressa dad e-mail",
'createaccountmail' => "Dovrar per il mument in pled-clav casual ed inviar el a l'adressa d'e-mail inditgada.",
+'createacct-realname' => 'Num real (opziunal)',
'createaccountreason' => 'Motiv:',
+'createacct-reason' => 'Motiv',
+'createacct-reason-ph' => 'Tes motiv per crear in auter conto',
+'createacct-captcha' => 'Controlla da segirezza',
+'createacct-imgcaptcha-ph' => 'Endatescha il text che vesas survart',
+'createacct-submit' => 'Crear tes conto',
+'createacct-another-submit' => 'Crear in auter conto',
+'createacct-benefit-heading' => '{{SITENAME}} exista grazia a persunas sco ti.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modificaziun|modificaziuns}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuent activ|contribuents activs}}',
'badretype' => 'Ils dus pleds-clav na corrispundan betg.',
'userexists' => "Quest num d'utilisader vegn gia duvrà.
Tscherna per plaschair in'auter.",
'loginerror' => "Sbagl cun t'annunziar",
+'createacct-error' => 'Errur cun crear il conto',
'createaccounterror' => 'Betg pussaivel da crear in conto: $1',
'nocookiesnew' => "Il conto da l'utilisader è vegnì creà, ti es dentant betg t'annunzià.
{{SITENAME}} utilisescha cookies per che utilisaders pon s'annunziar.
'login-abort-generic' => 'Annunzia senza success - Annullà',
'loginlanguagelabel' => 'Lingua: $1',
'suspicious-userlogout' => "Tia dumonda per partir è vegnida refusada perquai ch'i para ch'ella è vegnida tramessa d'in navigatur che funcziuna betg correctamain u d'in proxy da cache.",
+'createacct-another-realname-tip' => "Il num real è opziunal.
+Sche ti l'inditgeschas, vegn el duvrà per attribuir las contribuziuns.",
# Email sending
'php-mail-error-unknown' => 'Errur nunenconuschenta en la funcziun mail() da PHP',
'revdelete-show-file-submit' => 'Gea',
'revdelete-selected' => "'''{{PLURAL:$2|Versiun tschernida|Versiuns tschernidas}} da [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Element dal protocol tschernì|Elements dal protocol tschernids}}:'''",
-'revdelete-text' => "'''Versiuns ed ocurrenzas stizzadas cumparan era vinavant en la cronologia ed en ils protocols, dentant èn parts dal cuntegn betg accessibels al public.'''
-Auters administraturs sin {{SITENAME}} vegnan tuttina ad avair access al cuntegn zuppentà e pon restaurar puspè la pagina, sch'i na vegnan betg definidas restricziuns supplementaras.",
'revdelete-confirm' => 'Confermescha che ti vuls far quai, che ti chapeschas las consequenzas e che ti fas quai en accordanza cun [[{{MediaWiki:Policy-url}}|las directivas]].',
'revdelete-suppress-text' => "Ti duessas '''be''' supprimer en quests cas:
* Infurmaziuns offendentas
'shown-title' => 'Mussar $1 {{PLURAL:$1|resultat|resultats}} per pagina',
'viewprevnext' => 'Mussar ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Igl exista ina pagina cun il num \"[[:\$1]] sin questa vichi\"'''",
-'searchmenu-new' => "'''Crear la pagina \"[[:\$1]]\" sin questa vichi!'''",
+'searchmenu-new' => '<strong>Crear la pagina «[[:$1]]» sin quest vichi!</strong> {{PLURAL:$2|0=|Vesair er la pagina chattada cun tia tschertga.|Vesair er las resultats da tia tschertga.}}',
'searchprofile-articles' => 'Paginas da cuntegn',
'searchprofile-project' => 'Agid e paginas dal project',
'searchprofile-images' => 'Multimedia',
'recentchanges-label-minor' => 'Quai è ina pitschna modificaziun',
'recentchanges-label-bot' => 'Questa modificaziun è vegnida exequida dad in bot',
'recentchanges-label-unpatrolled' => "Questa midada n'è anc betg vegnida controllada",
+'recentchanges-legend-heading' => "'''Legenda:'''",
'recentchanges-legend-newpage' => '(vesair era la [[Special:NewPages|glista da novas paginas]])',
-'rcnotefrom' => "Midadas dapi '''$2''' (maximalmain '''$1''' vegnan mussads).",
-'rclistfrom' => 'Mussar las novas midadas entschavend cun $1',
+'rcnotefrom' => 'I vegnan mussadas las modificaziuns a partir da las <strong>$4</strong> dals <strong>$3</strong>(maximalmain <strong>$1</strong>).',
+'rclistfrom' => 'Mussar las novas midadas a partir da las $2 dals $3',
'rcshowhideminor' => '$1 midadas pitschnas',
+'rcshowhideminor-show' => 'Mussar',
+'rcshowhideminor-hide' => 'Zuppentar',
'rcshowhidebots' => '$1 bots',
+'rcshowhidebots-show' => 'Mussar',
+'rcshowhidebots-hide' => 'Zuppentar',
'rcshowhideliu' => '$1 utilisaders annunziads',
+'rcshowhideliu-show' => 'Mussar',
+'rcshowhideliu-hide' => 'Zuppentar',
'rcshowhideanons' => '$1 utilisaders anonims',
+'rcshowhideanons-show' => 'Mussar',
+'rcshowhideanons-hide' => 'Zuppentar',
'rcshowhidepatr' => '$1 midadas controlladas',
+'rcshowhidepatr-show' => 'Mussar',
+'rcshowhidepatr-hide' => 'Zuppentar',
'rcshowhidemine' => '$1 mias midadas',
+'rcshowhidemine-show' => 'Mussar',
+'rcshowhidemine-hide' => 'Zuppentar',
'rclinks' => 'Mussar las davosas $1 midadas dals ultims $2 dis<br />$3',
'diff' => 'diff',
'hist' => 'ist',
'actioncomplete' => "L' acziun è terminada.",
'actionfailed' => "L'acziun n'è betg reussida",
'deletedtext' => '"$1" è vegnì stizzà.
-Sin $2 chattas ti ina glista dals davos artitgels stizzads.',
+En il $2 chattas ti ina glista dals davos artitgels stizzads.',
'dellogpage' => "Protocol d'eliminaziuns",
'dellogpagetext' => "Sutvart è ina glista dals elements stizzads l'ultim.",
'deletionlog' => "protocol d'eliminaziuns",
# Special:SpecialPages
'specialpages' => 'Paginas spezialas',
+'specialpages-note-top' => 'Legenda',
'specialpages-note' => '* Paginas spezialas normalas.
* <span class="mw-specialpagerestricted">Paginas spezialas restrenschidas.</span>',
'specialpages-group-maintenance' => 'Rapports da mantegnamant',
'logentry-newusers-create2' => 'Il conto $3 è vegnì creà da $1',
'logentry-newusers-autocreate' => 'Il conto $1 è vegnì creà automaticamain',
'logentry-rights-rights' => '$1 ha midà la commembranza da gruppas per $3 da $4 a $5',
-'logentry-rights-rights-legacy' => '$1 ha midà la commembranza da gruppas per $3',
-'logentry-rights-autopromote' => '$1 è vegnì promovì automaticamain da $4 a $5',
+'logentry-rights-rights-legacy' => '$1 ha {{GENDER:$2|midà}} la commembranza da gruppas per $3',
+'logentry-rights-autopromote' => '$1 è vegnì {{GENDER:$2|promovì|promovida}} automaticamain da $4 a $5',
'rightsnone' => '(nagins)',
# Feedback
'tog-ccmeonemails' => 'Doresc să primesc o copie a mesajelor e-mail pe care le trimit',
'tog-diffonly' => 'Nu arăta conținutul paginii sub dif',
'tog-showhiddencats' => 'Arată categoriile ascunse',
-'tog-noconvertlink' => 'Dezactivează conversia titlurilor',
'tog-norollbackdiff' => 'Nu arăta diferența după efectuarea unei reveniri',
'tog-useeditwarning' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
'tog-prefershttps' => 'Utilizează întotdeauna o conexiune securizată când sunt autentificat(ă)',
'createacct-another-realname-tip' => 'Numele real este opțional.
Dacă decideți furnizarea sa, acesta va fi folosit pentru a atribui utilizatorului munca sa.',
'pt-login' => 'Autentificare',
+'pt-login-button' => 'Autentificare',
'pt-createaccount' => 'Creare cont',
'pt-userlogout' => 'Închide sesiunea',
'revdelete-show-file-submit' => 'Da',
'revdelete-selected' => "'''{{PLURAL:$2|Versiunea aleasă|Versiunile alese}} pentru [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Revizia aleasă|Reviziile alese}}:'''",
-'revdelete-text' => "'''Versiunile șterse vor apărea în istoricul paginii, dar conținutul lor nu va fi accesibil publicului.''' Administratorii {{SITENAME}} pot accesa conținutul șters și îl pot recupera prin aceeași interfață, dacă nu este impusă altă restricție de către operatorii sitului.",
'revdelete-confirm' => 'Vă rugăm să confirmați că intenționați să faceți acest lucru, că înțelegeți consecințele și că faceți asta în conformitate cu [[{{MediaWiki:Policy-url}}|politica]].',
'revdelete-suppress-text' => "Suprimarea trebuie folosită '''doar''' în următoarele cazuri:
* Informații potențial calomnioase
'search-file-match' => '(se regăsește în conținutul fișierului)',
'search-suggest' => 'V-ați referit la: $1',
'search-interwiki-caption' => 'Proiecte înrudite',
-'search-interwiki-default' => '$1 rezultate:',
+'search-interwiki-default' => 'Rezultate de la $1:',
'search-interwiki-more' => '(mai mult)',
'search-relatedarticle' => 'Relaționat',
'searcheverything-enable' => 'Caută în toate spațiile de nume',
'recentchanges-legend-newpage' => '(vedeți și [[Special:NewPages|lista cu pagini noi]])',
'recentchanges-legend-plusminus' => "(''±123'')",
'rcnotefrom' => 'Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).',
-'rclistfrom' => 'Se arată modificările începând cu $1',
+'rclistfrom' => 'Se afișează modificările începând cu $1',
'rcshowhideminor' => '$1 modificările minore',
'rcshowhideminor-show' => 'Arată',
'rcshowhideminor-hide' => 'Ascunde',
'delete-warning-toobig' => 'Această pagină are un istoric al modificărilor mult prea mare, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.
Ștergerea sa poate afecta baza de date a sitului {{SITENAME}};
acționați cu precauție.',
-'deleting-backlinks-warning' => "'''Atenție:''' Alte pagini se leagă sau sunt transcluse din pagina pe care doriți să o ștergeți.",
+'deleting-backlinks-warning' => "'''Atenție:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Alte pagini]] se leagă sau transclud pagina pe care doriți să o ștergeți.",
# Rollback
'rollback' => 'Editări de revenire',
'tog-ccmeonemails' => "Manneme 'na copie de le mail ca je manne a l'ôtre utinde",
'tog-diffonly' => 'No fà vedè le pàggene cu le condenute sotte a le differenze',
'tog-showhiddencats' => 'Fa vedè le categorije scunnute',
-'tog-noconvertlink' => "Disabbilite 'a conversione d'u titele de collegamende",
'tog-norollbackdiff' => "Non sce penzanne a le differenze apprisse l'esecuzione de 'nu rollback",
'tog-useeditwarning' => "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
'tog-prefershttps' => "Ause sembre 'na connessione secure quanne trase",
'revdelete-show-file-submit' => 'Sìne',
'revdelete-selected' => "'''{{PLURAL:$2|Revisiona selezionete|Revisiune selezionete}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Fatte de l'archivije selezionete|Fatte de l'archivije selezionete}}:'''",
-'revdelete-text' => "'''Le revisiune scangellete e le evende iessene angore jndr'à storie d'a pàgene e jndr'à l'archivije, ma stuezze d'u condenute lore pò essere inaccessibbele a 'u pubbleche.'''
-Otre amministrature sus a {{SITENAME}}ponne angore trasè jndr'à 'u condenute scunnute e 'u ponne scangellà 'n'otra vote ausanne st'inderfacce, senze 'mbostà otre restriziune.",
'revdelete-confirm' => 'Pe piacere conferme ca tu vuè ccu face sta cose, ce tu è capite le conseguenze e ce quidde ca ste face jè in accorde cu le [[{{MediaWiki:Policy-url}}|reghele]] de Uicchipèdie.',
'revdelete-suppress-text' => "'A soppressione adda essere ausate '''sulamende''' jndr'à le case seguende:
* 'Mbormaziune potenzialmende offenzive
'tog-ccmeonemails' => 'Отправлять мне копии писем, которые я посылаю другим участникам',
'tog-diffonly' => 'Не показывать содержание страницы под сравнением двух версий',
'tog-showhiddencats' => 'Показывать скрытые категории',
-'tog-noconvertlink' => 'Отключить ссылку на преобразование заголовка',
'tog-norollbackdiff' => 'Не показывать разницу версий после выполнения отката',
'tog-useeditwarning' => 'Предупреждать, когда я покидаю страницу с несохранёнными изменениями',
'tog-prefershttps' => 'Всегда использовать защищённое соединение после представления системе',
'createacct-another-realname-tip' => 'Настоящее имя (необязательное поле).
Если вы укажете его, то оно будет использовано для того, чтобы показать, кем была внесена правка страницы.',
'pt-login' => 'Войти',
+'pt-login-button' => 'Войти',
'pt-createaccount' => 'Создать учётную запись',
'pt-userlogout' => 'Выйти',
'revdelete-show-file-submit' => 'Да',
'revdelete-selected' => "'''{{PLURAL:$2|1=Выбранная версия|Выбранные версии}} страницы [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|1=Выбранная запись|Выбранные записи}} журнала:'''",
-'revdelete-text' => "'''Удалённые версии страниц и события будут показываться в истории страницы и журналах, но часть их содержания будет недоступна обычным посетителям.'''
-Администраторы проекта {{SITENAME}} будут иметь доступ к скрытому содержанию и смогут восстановить его через этот же интерфейс, за исключением случаев, когда установлено дополнительное ограничение.",
'revdelete-confirm' => 'Пожалуйста, подтвердите, что вы действительно желаете совершить это действие, осознаёте последствия, делаете это в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].',
'revdelete-suppress-text' => "Сокрытие может производиться '''только''' в следующих случаях:
* Потенциально клеветническая информация
'search-file-match' => '(совпадает с содержимым файла)',
'search-suggest' => 'Возможно, вы имели в виду «$1».',
'search-interwiki-caption' => 'Родственные проекты',
-'search-interwiki-default' => '$1 результ.:',
+'search-interwiki-default' => 'Результаты из $1:',
'search-interwiki-more' => '(ещё)',
'search-relatedarticle' => 'Связанный',
'searcheverything-enable' => 'Поиск по всем пространствам имён',
'delete-warning-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.
Её удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;
действуйте с осторожностью.',
-'deleting-backlinks-warning' => "'''Предупреждение.''' Другие страницы ссылаются или содержат страницу, которую вы собираетесь удалить.",
+'deleting-backlinks-warning' => "'''Предупреждение.''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Другие страницы]] ссылаются на страницу, которую вы собираетесь удалить или содержат её.",
# Rollback
'rollback' => 'Откатить изменения',
'invalidtitle-knownnamespace' => 'Непряавилна назва в просторї назв „$2“ і текстом „$3“',
'invalidtitle-unknownnamespace' => 'Неправилна назва з незнамым чіслом простору назв $1 і текстом „$2“',
'exception-nologin' => 'Не сьте приголошеный(а)',
-'exception-nologin-text' => 'Гевся сторінка або дїя потребує, жебы сьте были на тотїй вікі приголошены.',
+'exception-nologin-text' => 'Жебы ся дістати но тоту сторінку ся просиме [[Special:Userlogin|приголосьте]].',
+'exception-nologin-text-manual' => 'Жебы ся дістати на тоту сторінку ся мусите $1.',
# Virus scanner
'virus-badscanner' => "Зла конфіґурація: незнамый антивіровый проґрам: ''$1''",
'userlogin-resetpassword-link' => 'Забыли сьте гесло?',
'helplogin-url' => 'Help:Приголошіня',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Поміч з приголошованём]]',
+'userlogin-loggedin' => 'Уж сьте {{GENDER:$1|приголошеный|приголошена}} як $1.
+Хоснуйте формулар долов жебы сьте ся приголосили як другый хоснователь.',
'userlogin-createanother' => 'Створити інше конто',
'createacct-join' => 'Ниже уведьте вашы інформації',
'createacct-another-join' => 'Ниже уведьте інформації нового конта',
Жебы ся то не зловжывало та гесло може быти заслане лем раз за $1 {{PLURAL:$1|годину|годины|годин}}.',
'mailerror' => 'Хыба засыланя ел. пошты: $1',
'acct_creation_throttle_hit' => 'Хоснователї приходячі з вашой IP адресы уж днесь створили {{PLURAL:$1|конто|конта|конт}}, што є дозволене максімум. Зато теперь не є дозволено з той IP адресы закладати далшы конта.',
-'emailauthenticated' => 'Ð\90дÑ\80еÑ\81а ваÑ\88ой ел. поÑ\88Ñ\82Ñ\8b бÑ\8bла овÑ\96Ñ\80ена днÑ\8f $2 о $3.',
-'emailnotauthenticated' => 'Ð\90дÑ\80еÑ\81а ваÑ\88ой ел. поÑ\88Ñ\82Ñ\8b доÑ\82епеÑ\80Ñ\8c не бÑ\8bла овÑ\96Ñ\80ена, Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97 ел. поÑ\88Ñ\82Ñ\8b Ñ\81Ñ\83Ñ\82Ñ\8c недоÑ\81Ñ\82Ñ\83пны.',
+'emailauthenticated' => 'Ð\90дÑ\80еÑ\81а ваÑ\88ой ел. поÑ\88Ñ\82Ñ\8b бÑ\8bла поÑ\82веÑ\80джнена $2 о $3.',
+'emailnotauthenticated' => 'Ð\90дÑ\80еÑ\81а ваÑ\88ой ел. поÑ\88Ñ\82Ñ\8b доÑ\82епеÑ\80Ñ\8c не бÑ\8bла поÑ\82веÑ\80ждена. У наÑ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ñ\84Ñ\83нкÑ\86Ñ\96й не бÑ\83дÑ\83Ñ\82Ñ\8c поÑ\81Ñ\8bланÑ\8b жаднÑ\8b мейлы.',
'noemailprefs' => 'Шпеціфікуйте адресу ел. пошты, жебы наслїднуючі можности могли фунґовати.',
'emailconfirmlink' => 'Потвердьте свою адресу ел. пошты',
'invalidemailaddress' => 'Уведена адреса ел. пошты не може быти прията, бо она не має правилный формат.
'suspicious-userlogout' => 'Ваша пожадавка на одголошіня была одвергнута, бо вызерає то так, же была послана розбитым переглядачом або кешуючім проксі-сервером.',
'createacct-another-realname-tip' => 'Правдиве імя є волительне.
Кідь вы зволите го додати, тото буде пак хосноване на доданя участникового попису про ёго роботу.',
+'pt-login' => 'Приголошіня',
+'pt-createaccount' => 'Створити конто',
+'pt-userlogout' => 'Одголосити ся',
# Email sending
'php-mail-error-unknown' => 'Незнама хыба у PHP mail() функції',
# Change password dialog
'changepassword' => 'Змінити гесло',
-'resetpass_announce' => 'Ð\9fÑ\80иголоÑ\88Ñ\83Ñ\94Ñ\82е Ñ\81Ñ\8f доÑ\87аÑ\81нÑ\8bм геÑ\81лом, коÑ\82Ñ\80е бÑ\8bло поÑ\81лане елекÑ\82Ñ\80онÑ\96Ñ\87нов поÑ\88Ñ\82ов. Ð\9fÑ\80о законÑ\87Ñ\96нÑ\8f пÑ\80иголоÑ\88Ñ\96нÑ\8f Ñ\82Ñ\80еба задаÑ\82и нове геÑ\81ло Ñ\82Ñ\83:',
+'resetpass_announce' => 'Ð\96ебÑ\8b Ñ\81Ñ\8cÑ\82е завеÑ\80Ñ\88Ñ\8bли пÑ\80иголоÑ\88Ñ\96нÑ\8f, мÑ\83Ñ\81иÑ\82е Ñ\81обÑ\96 наÑ\81Ñ\82авиÑ\82и нове геÑ\81ло.',
'resetpass_header' => 'Зміна гесла',
'oldpassword' => 'Старе гесло:',
'newpassword' => 'Нове гесло:',
'retypenew' => 'Напиште знову нове гесло:',
'resetpass_submit' => 'Наставити гесло і приголосити ся',
'changepassword-success' => 'Ваше гесло было успішно змінено!',
+'changepassword-throttled' => 'Зробили сьте дуже много спроб о приголошіня.
+Просиме Вас, почекайте $1 перед далшов спробов.',
'resetpass_forbidden' => 'Гесла не є можне змінити',
'resetpass-no-info' => 'Ку тій сторінцї мають прямый приступ лем приголошены хоснователї.',
'resetpass-submit-loggedin' => 'Змінити гесло',
'resetpass-submit-cancel' => 'Сторно',
'resetpass-wrong-oldpass' => 'Неправилне дочасне або актуалне гесло.
Може сьте собі уж гесло успішно змінили, або сьте выжадали нове дочасне гесло.',
+'resetpass-recycled' => 'Нове гесло собі дайте дашто друге як ваше теперїшнє гесло.',
+'resetpass-temp-emailed' => 'Приголошуєте ся дочасным геслом засланым імейлом.
+Жебы сьте завершыли приголошіня, гев сові наставте нове гесло:',
'resetpass-temp-password' => 'Дочасне гесло:',
'resetpass-abort-generic' => 'Зміна гесла заблокована была росшырїнём.',
+'resetpass-expired' => 'Платность вашого гесла скінчіла. На приголошіня собі наставте нове гесло.',
# Special:PasswordReset
'passwordreset' => 'Ресет гесла',
'changeemail-password' => 'Ваше гесло на портал {{SITENAME}}:',
'changeemail-submit' => 'Змінити імейл',
'changeemail-cancel' => 'Сторно',
+'changeemail-throttled' => 'Зробили сьте дуже много спроб о приголошіня.
+Просиме Вас, почекайте $1 перед далшов спробов.',
# Special:ResetTokens
'resettokens' => 'Реініціалізація клічів',
'revdelete-show-file-submit' => 'Гей',
'revdelete-selected' => "'''{{PLURAL:$2|Выбрана ревізія|Выбраны ревізії}} з [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Выбрана протоколована подїя|Выбраны протоколованы подїї}}:'''",
-'revdelete-text' => "'''Змазаны верзії і подїї будуть надале зображены в історії сторінкы і протоколовачіх записах, але дакотры їх части не будуть публікованы.'''
-Другы адміністраторы {{GRAMMAR:2sg|{{SITENAME}}}} собі будуть мочі схованый обсяг перезерати і помочов того самого інтерфейсу го будуть мочі обновити,
-кідь не были наставлены далшы обмеджіня.",
'revdelete-confirm' => 'Просиме Вас, потвердьте, же то хочете справды зробити, же собі усвідомлюєте резултат і же є то в згодї з [[{{MediaWiki:Policy-url}}|правилами]].',
'revdelete-suppress-text' => "Затаёваня бы ся мало хосновати ''лем''' в такых припадах:
* Потенціално огваряючі інформації
'shown-title' => 'Вказати $1 {{PLURAL:$1|резултат|резултаты|резултатів}} на сторінку',
'viewprevnext' => 'Перегляднути ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''У тій вікі є сторінка з назвов «[[:$1]]»'''",
-'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у тій вікі!'''",
+'searchmenu-new' => '<strong>Створити сторінку на тій вікі „[[:$1]]“!</strong> {{PLURAL:$2|0=|Тыж собі посмотьте сторінку найдену вашым гляданём.|Тыж посмотьте сторінкы найдены вашым гляданём.}}',
'searchprofile-articles' => 'Статї',
'searchprofile-project' => 'Сторінкы помочі і проєкту',
'searchprofile-images' => 'Мултімедія',
'recentchanges-label-minor' => 'Тото є мала зміна',
'recentchanges-label-bot' => 'Тото едітованя зроблене ботом',
'recentchanges-label-unpatrolled' => 'Тота зміна дотеперь не была патролёвана.',
+'recentchanges-legend-heading' => "'''Леґенда:'''",
'recentchanges-legend-newpage' => '$1 — нова сторінка',
-'rcnotefrom' => 'Ð\9dиже {{PLURAL:$1|Ñ\94|Ñ\81Ñ\83Ñ\82Ñ\8c|Ñ\94}} найвеÑ\86е <b>$1</b> {{PLURAL:$1|змÑ\96на|змÑ\96нÑ\8b|змÑ\96н}} од <b>$2</b>.',
+'rcnotefrom' => 'Ð\94олов Ñ\81Ñ\83Ñ\82Ñ\8c вказанÑ\8b змÑ\96нÑ\8b од <strong>$2</strong> (до <strong>$1</strong>).',
'rclistfrom' => 'Вказати едітованя почінаючі з $1.',
'rcshowhideminor' => '$1 маленькы едітованя',
+'rcshowhideminor-show' => 'Вказати',
+'rcshowhideminor-hide' => 'Сховати',
'rcshowhidebots' => '$1 ботів',
-'rcshowhideliu' => '$1 приголошеных',
+'rcshowhidebots-show' => 'Вказати',
+'rcshowhidebots-hide' => 'Сховати',
+'rcshowhideliu' => '$1 реґістрованых хоснователїв',
+'rcshowhideliu-show' => 'Вказати',
+'rcshowhideliu-hide' => 'Сховати',
'rcshowhideanons' => '$1 анонімів',
+'rcshowhideanons-show' => 'Вказати',
+'rcshowhideanons-hide' => 'Сховати',
'rcshowhidepatr' => '$1 перевірене едітованя',
+'rcshowhidepatr-show' => 'Вказати',
+'rcshowhidepatr-hide' => 'Сховати',
'rcshowhidemine' => '$1 мої едітованя',
+'rcshowhidemine-show' => 'Вказати',
+'rcshowhidemine-hide' => 'Сховати',
'rclinks' => 'Вказати послїднї $1 зміны за $2 днїв<br />$3',
'diff' => 'різн.',
'hist' => 'історія',
'protectedpages-indef' => 'Лем замкы на нестановлено',
'protectedpages-cascade' => 'Лем каскадовы замкы',
'protectedpagesempty' => 'Жадна сторінка не є замкнута з тыма параметрами.',
+'protectedpages-timestamp' => 'Часова значка',
+'protectedpages-expiry' => 'Кінчіть',
+'protectedpages-reason' => 'Прічіна',
+'protectedpages-unknown-timestamp' => 'Не є знаме',
+'protectedpages-unknown-performer' => 'Незнамый хоснователь',
'protectedtitles' => 'Замкнуты назвы сторінок',
'protectedtitlesempty' => 'Жадна назва не є замкнута з тыма параметрами.',
'listusers' => 'Список хоснователїв',
'contributions' => 'Приспівкы {{GENDER:$1|хоснователя|хоснователькы}}',
'contributions-title' => 'Приспівок хоснователя $1',
'mycontris' => 'Приспівкы',
-'contribsub2' => 'Приспівок $1 ($2)',
+'contribsub2' => '{{GENDER:$3|хоснователї|хоснователькы}} $1 ($2)',
'nocontribs' => 'Ненайджены жадны зміны за тыма крітеріями.',
'uctop' => '(остатня)',
'month' => 'Од місяця (і скоре):',
'allmessages-prefix' => 'Філтер за префіксом:',
'allmessages-language' => 'Язык:',
'allmessages-filter-submit' => 'Выконати',
+'allmessages-filter-translate' => 'Переложыти',
# Thumbnails
'thumbnail-more' => 'Звекшыти',
'svg-long-desc' => 'SVG-файл, номінално $1 × $2 пікселів, розмір файлу: $3',
'svg-long-desc-animated' => 'Анімованый SVG-файл, номінално $1 × $2 пікселів, розмір файлу: $3',
'svg-long-error' => 'Неправильный файл SVG: $1',
-'show-big-image' => 'Ð\9fовне Ñ\80озлиÑ\88Ñ\96нÑ\8f',
+'show-big-image' => 'Ð\9eÑ\80Ñ\96Ò\91Ñ\96налнÑ\8bй Ñ\84айл',
'show-big-image-preview' => 'Розмір того нагляду: $1.',
'show-big-image-other' => '{{PLURAL:$2|Інше|іншы}} розлишіня: $1.',
'show-big-image-size' => '$1 × $2 пікселів',
* @author Krinkle
* @author Mahitgar
* @author Naveen Sankar
+ * @author NehalDaveND
* @author Omnipaedista
* @author Shantanoo
* @author Shijualex
'thu' => 'गुरुः',
'fri' => 'शुक्रः',
'sat' => 'शनिः',
-'january' => 'à¤\9cनà¥\81वरि',
-'february' => 'फ़à¥\87बà¥\8dरà¥\81वरि',
-'march' => 'मार्च्',
-'april' => 'à¤\8fपà¥\8dरिलà¥\8d',
-'may_long' => 'मà¥\87यà¥\8d',
-'june' => 'जून्',
-'july' => 'à¤\9cà¥\82लयà¥\8d',
-'august' => 'à¤\93à¤\97सà¥\8dà¤\9fà¥\8d',
-'september' => 'सपà¥\8dतमà¥\8dबरà¥\8d',
-'october' => 'à¤\85षà¥\8dà¤\9fà¥\8bबरà¥\8d',
-'november' => 'नवम्बर्',
-'december' => 'दशमà¥\8dबरà¥\8d',
-'january-gen' => 'à¤\9cनà¥\81वरि',
-'february-gen' => 'फà¥\87़बà¥\8dरà¥\81वरि',
-'march-gen' => 'मार्च्',
-'april-gen' => 'à¤\8fपà¥\8dरिलà¥\8d',
-'may-gen' => 'मà¥\87यà¥\8d',
-'june-gen' => 'जून्',
-'july-gen' => 'à¤\9cà¥\81लà¥\88',
-'august-gen' => 'à¤\93à¤\97सà¥\8dà¤\9fà¥\8d',
-'september-gen' => 'सपà¥\8dतमà¥\8dबरà¥\8d',
-'october-gen' => 'à¤\85षà¥\8dà¤\9fà¥\8bबरà¥\8d',
-'november-gen' => 'नवम्बर्',
-'december-gen' => 'दशमà¥\8dबरà¥\8d',
-'jan' => 'à¤\9cनà¥\81॰',
-'feb' => 'फ़à¥\87बà¥\8dरà¥\81॰',
-'mar' => 'मार्च्',
-'apr' => 'à¤\8fपà¥\8dरि॰',
-'may' => 'मेय्',
-'jun' => 'जून्',
-'jul' => 'à¤\9cà¥\82लयà¥\8d',
-'aug' => 'ओग॰',
-'sep' => 'सपà¥\8dतà¤\82॰',
-'oct' => 'à¤\85षà¥\8dà¤\9fà¥\8b॰',
-'nov' => 'नवà¤\82॰',
-'dec' => 'दशà¤\82॰',
+'january' => 'à¤\9cनवरà¥\80',
+'february' => 'फरवरà¥\80',
+'march' => 'मार्च',
+'april' => 'à¤\85पà¥\8dरà¥\88ल',
+'may_long' => 'मà¤\88',
+'june' => 'जून',
+'july' => 'à¤\9cà¥\81लाà¤\88',
+'august' => 'à¤\85à¤\97सà¥\8dत',
+'september' => 'सितमà¥\8dबर',
+'october' => 'à¤\85à¤\95à¥\8dतà¥\82बर',
+'november' => 'नवम्बर',
+'december' => 'दिसमà¥\8dबर',
+'january-gen' => 'à¤\9cनवरà¥\80',
+'february-gen' => 'फरवरà¥\80',
+'march-gen' => 'मार्च',
+'april-gen' => 'à¤\85पà¥\8dरà¥\88ल',
+'may-gen' => 'मà¤\88',
+'june-gen' => 'जून',
+'july-gen' => 'à¤\9cà¥\81लाà¤\88',
+'august-gen' => 'à¤\85à¤\97सà¥\8dत',
+'september-gen' => 'सितमà¥\8dबर',
+'october-gen' => 'à¤\85à¤\95à¥\8dतà¥\82बर',
+'november-gen' => 'नवम्बर',
+'december-gen' => 'दिसमà¥\8dबर',
+'jan' => 'à¤\9cà¥\87न.',
+'feb' => 'फà¥\87ब.',
+'mar' => 'मार्च.',
+'apr' => 'एप्र॰',
+'may' => 'मे',
+'jun' => 'जून',
+'jul' => 'à¤\9cà¥\81ल.',
+'aug' => 'ओग.',
+'sep' => 'सà¥\87पà¥\8d.',
+'oct' => 'à¤\93à¤\95à¥\8dà¤\9fà¥\8b.',
+'nov' => 'नवà¥\87.',
+'dec' => 'डिस.',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|वर्गः|वर्गाः }}',
+'pagecategories' => '{{PLURAL:$1|वर्गः|वर्गाः}}',
'category_header' => '"$1" इत्येतस्मिन् वर्गे विद्यमानानि पृष्ठानि',
'subcategories' => 'उपवर्गाः',
'category-media-header' => '"$1" इत्येतस्मिन् वर्गे माध्यमाम्',
'mypage' => 'मम पृष्ठम्',
'mytalk' => 'मम सम्भाषणम्',
'anontalk' => 'अस्य आइ.पी. संकेतस्य कृते सम्भाषणम्',
-'navigation' => 'परà¥\8dयà¤\9fनम्',
+'navigation' => 'सà¤\9eà¥\8dà¤\9aरणम्',
'and' => ' तथा च',
# Cologne Blue skin
'vector-action-unprotect' => 'सुरक्षितीकरणस्य निरसनम्',
'vector-view-create' => 'सृज्यताम्',
'vector-view-edit' => 'सम्पाद्यताम्',
-'vector-view-history' => 'à¤\87तिहासà¤\83 दà¥\83श्यताम्',
+'vector-view-history' => 'à¤\87तिहासà¤\83 दरà¥\8dश्यताम्',
'vector-view-view' => 'पठ्यताम्',
'vector-view-viewsource' => 'स्रोतः दृश्यताम्',
'actions' => 'क्रियाः',
-'namespaces' => 'नामाà¤\95ाशानि',
-'variants' => 'à¤à¤¿à¤¨à¥\8dनरà¥\82पाणि',
+'namespaces' => 'नामाà¤\95ाशà¤\83',
+'variants' => 'पाठà¤à¥\87दà¤\83',
'navigation-heading' => 'मार्गणसूचिः',
'errorpagetitle' => 'दोषः',
'returnto' => '$1 इत्येतद् प्रति निवर्तताम्।',
-'tagline' => '{{SITENAME}} à¤\87तà¥\8dयसà¥\8dमातà¥\8d',
+'tagline' => '{{SITENAME}} तà¤\83',
'help' => 'साहाय्यम्',
'search' => 'अन्विष्यताम्',
'searchbutton' => 'अन्विष्यताम्',
'history' => 'पृष्ठस्य इतिहासः',
'history_short' => 'इतिहासः',
'updatedmarker' => 'मम पौर्विक-आगमन-पश्चात् परिवर्तितानि',
-'printableversion' => 'मà¥\81दà¥\8dरणयà¥\8bà¤\97à¥\8dया à¤\86वà¥\83तà¥\8dतिà¤\83',
-'permalink' => 'सà¥\8dथिरसमà¥\8dपरà¥\8dà¤\95तनà¥\8dतà¥\81ः',
+'printableversion' => 'मà¥\81दà¥\8dरणयà¥\8bà¤\97à¥\8dयà¤\82 सà¤\82सà¥\8dà¤\95रणमà¥\8d',
+'permalink' => 'सà¥\8dथायिपरिसनà¥\8dधिः',
'print' => 'मुद्र्यताम्',
'view' => 'दृश्यताम्',
'edit' => 'सम्पाद्यताम्',
'talkpage' => 'अस्य पृष्ठस्य विषये चर्चा क्रियताम्',
'talkpagelinktext' => 'सम्भाषणम्',
'specialpage' => 'विशेषपृष्ठम्',
-'personaltools' => 'वà¥\88यà¤\95à¥\8dतिà¤\95à¥\8bपà¤\95रणानि',
+'personaltools' => 'वà¥\88यà¤\95à¥\8dतिà¤\95साधनानि',
'postcomment' => 'नवीनः विभागः',
'articlepage' => 'लेखः दृश्यताम्',
'talk' => 'सम्भाषणम्',
-'views' => 'दà¥\83शà¥\8dयानि',
-'toolbox' => 'à¤\89पà¤\95रणपà¥\87à¤\9fिका',
+'views' => 'मतानि',
+'toolbox' => 'साधनशलाका',
'userpage' => 'योजकपृष्ठं दृश्यताम्',
'projectpage' => 'प्रकल्पपृष्ठं दृश्यताम्',
'imagepage' => 'सञ्चिकापृष्ठं दृश्यताम्',
'otherlanguages' => 'अन्यासु भाषासु',
'redirectedfrom' => '($1 इत्यस्मात् पुनर्निर्दिष्टम्)',
'redirectpagesub' => 'अनुप्रेषण-पृष्ठम्',
-'lastmodifiedat' => 'एतस्य पृष्ठस्य अन्तिमपरिवर्तनं $1 दिनाङ्के $2 समये कृतम्',
+'lastmodifiedat' => '$1 (तमे) दिनाङ्के अन्तिमसम्पादनं $2 समये अभवत्',
'viewcount' => 'एतत्पृष्ठं {{PLURAL:$1|एक वारं|$1 वारं}} दृष्टम् अस्ति',
'protectedpage' => 'संरक्षितपृष्ठम्',
-'jumpto' => 'à¤\97मà¥\8dयतामà¥\8d à¤\85तà¥\8dर :',
-'jumptonavigation' => 'परà¥\8dयà¤\9fनमà¥\8d',
+'jumpto' => 'à¤\85तà¥\8dर à¤\97मà¥\8dयतामà¥\8d :',
+'jumptonavigation' => 'सà¤\9eà¥\8dà¤\9aरणà¤\82',
'jumptosearch' => 'अन्वेषणम्',
'view-pool-error' => 'भोः, अधुना वितारकः अतिभाराक्रान्तः ।
बहवः योजकाः एतत् पृष्ठं द्रष्टुं प्रयतमानाः सन्ति ।
'pool-errorunknown' => 'अज्ञाता त्रुटिः',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '{{SITENAME}} à¤\87तà¥\8dयसà¥\8dय विषयà¥\87',
-'aboutpage' => 'Project:à¤\8fतदà¥\8dविषयà¤\95मà¥\8d',
+'aboutsite' => '{{SITENAME}} विषयà¤\95à¤\82',
+'aboutpage' => 'Project:विषयकम्',
'copyright' => 'अस्य घटकानि $1 इत्यस्यान्तर्गतानि उपलब्धानि।',
'copyrightpage' => '{{ns:project}}:प्रतिलिप्यधिकाराः',
-'currentevents' => 'सदà¥\8dयà¤\83à¤\95ालà¥\80नवार्ताः',
-'currentevents-url' => 'Project:सदà¥\8dयà¤\83à¤\95ालà¥\80नवार्ताः',
-'disclaimers' => 'पà¥\8dरतà¥\8dयाà¤\96à¥\8dयानमà¥\8d',
-'disclaimerpage' => 'Project:साधारणà¤\82 पà¥\8dरतà¥\8dयाà¤\96à¥\8dयानम्',
+'currentevents' => 'वरà¥\8dतमानवार्ताः',
+'currentevents-url' => 'Project:वरà¥\8dतमानवार्ताः',
+'disclaimers' => 'à¤\85सà¥\8dवà¥\80à¤\95ारà¤\83',
+'disclaimerpage' => 'Project:सामानà¥\8dयाऽसà¥\8dवà¥\80à¤\95रणम्',
'edithelp' => 'सम्पादनार्थं सहाय्यम्',
-'helppage' => 'Help:à¤\86नà¥\8dतरà¥\8dयमà¥\8d',
+'helppage' => 'Help:à¤\85नà¥\8dतरà¥\8dवसà¥\8dतà¥\81',
'mainpage' => 'मुख्यपृष्ठम्',
'mainpage-description' => 'मुख्यपृष्ठम्',
'policy-url' => 'Project:नीतिः',
'portal' => 'समुदायद्वारम्',
'portal-url' => 'Project:समुदायद्वारम्',
-'privacy' => 'निà¤à¥\83ततानीतिः',
-'privacypage' => 'Project:निà¤à¥\83ततानीतिः',
+'privacy' => 'à¤\97à¥\8bपनà¥\80यतानीतिः',
+'privacypage' => 'Project:à¤\97à¥\8bपनà¥\80यतानीतिः',
'badaccess' => 'अनुज्ञा-प्रमादः',
'badaccess-group0' => 'भवदर्थम्, अत्र प्रार्थितक्रियायाः प्रवर्तनं न अनुमतम्।',
'ok' => 'अस्तु',
'pagetitle' => '$1 - {{SITENAME}}',
-'retrievedfrom' => '"$1" à¤\87तà¥\8dयसà¥\8dमादà¥\8d à¤\89दà¥\8dधà¥\83तमà¥\8d',
+'retrievedfrom' => '"$1" à¤\87तà¥\8dयसà¥\8dमादà¥\8d पà¥\81नà¤\83 पà¥\8dरापà¥\8dतिà¤\83',
'youhavenewmessages' => 'भवदर्थम् $1 सन्ति। ($2).',
'youhavenewmessagesfromusers' => 'भवदर्थम् {{PLURAL:$3|अन्यस्मात् सदस्यात्|$3 सदस्येभ्यः}} $1 अस्ति ($2)।',
'youhavenewmessagesmanyusers' => 'नैकेभ्यः योजकेभ्यः ते $1 सन्ति $2 ।',
'viewsourceold' => 'स्रोतः दृश्यताम्',
'editlink' => 'सम्पाद्यताम्',
'viewsourcelink' => 'स्रोतः दृश्यताम्',
-'editsectionhint' => 'à¤\85यà¤\82 विà¤à¤¾à¤\97à¤\83 समà¥\8dपादà¥\8dयतामà¥\8d: $1',
+'editsectionhint' => 'समà¥\8dपादनविà¤à¤¾à¤\97à¤\83: $1',
'toc' => 'अन्तर्विषयाः',
'showtoc' => 'दर्श्यताम्',
'hidetoc' => 'गोप्यताम्',
'site-atom-feed' => '$1 अणुपूरणम्',
'page-rss-feed' => '"$1" आरएसएस-पूरणम्',
'page-atom-feed' => '"$1" अणुपूरणम्',
-'red-link-title' => '$1 (पà¥\83षà¥\8dठमà¥\8d à¤\87दानà¥\80à¤\82 यावतà¥\8d न रà¤\9aितमà¥\8d)',
+'red-link-title' => '$1 (पà¥\83षà¥\8dठà¤\82 न विदà¥\8dयतà¥\87)',
'sort-descending' => 'अवरोहिक्रमेण सज्जयतु',
'sort-ascending' => 'आरोहिक्रमेण सज्जयतु',
'enterlockreason' => 'तन्त्रितीकरणस्य कारणं ददातु, अपि च आकलितं ददातु यत् तन्त्रणं कदा उद्घाट्यिष्यते।',
'readonlytext' => 'समंकाधारं वर्तमानकाले तन्त्रितमस्ति नूतनान् प्रविष्टीन् विरुध्य तथा च अन्यानि परिवर्तनानि विरुध्य। इदं नियमिततया समंकाधार परिचर्याऽर्थं तथा स्यात्। तत्पश्चादिदं सामान्यतां संप्राप्स्यति।
तन्त्रितीकारकेन प्रबन्धकेन इदं कारणं प्रदत्तम्: $1',
-'missing-article' => 'त्ताधारेण(डाटाबेस् इत्यनेन) "$1" $2 इतिनामकं प्राप्तव्यं यत् पृष्ठं तत् नैव प्राप्तम्।
-प्रायः कालातीतस्य अथवा अपाकृतस्य इतिहाससम्पर्कतन्तोः कारणेन एवं भवति।
-यदि नैवं तर्हि भवता तन्त्रांशकीटकं प्राप्तं स्यात्।
-कृपया कोऽपि [[Special:ListUsers/sysop|administrator]]अस्य पृष्ठस्य सङ्केतज्ञापनपूर्वकं सूच्यताम्।',
+'missing-article' => 'दत्तनिधौ (in database) $2 अन्तः कुत्रापि "$1" न प्राप्तम् ।
+
+प्रायः अपाकृतस्य पृष्ठस्य इतिहासदर्शनस्य चेष्टाकाले एवं भवति ।
+
+तादृशी स्थितिः यदि नास्ति, तर्हि तन्त्रांशे वद्यमाना त्रुटिः भवेत् । कृपया कमपि [[Special:ListUsers/sysop|प्रबन्धकम्]] अस्य पृष्ठस्य सार्वसङ्केतं (U.R.L.) सूच्यताम् ।',
'missingarticle-rev' => '(आवृत्तिः# :$1)',
'missingarticle-diff' => '(व्यतिरेक: $1, $2)',
'readonly_lag' => 'मुख्य-समंकाधार-परिवेशकं उपमुख्य-समंकाधार-परिवेशकस्य संप्रापणात् पूर्वे एव स्वतः तन्त्रितम् अस्ति।',
'password-change-forbidden' => 'अस्यां विक्यां निकुञ्चं परिवर्तयितुं न शक्नोति ।',
'externaldberror' => 'तत्र प्रमाणीकरण समंकाधारे त्रुटिर्जाता, अथवा भवान् स्वकीयां बाह्य-लेखां अद्यतनीकर्तुं अनुमतिं न धारयति।',
'login' => 'प्रविश्यताम्',
-'nav-login-createaccount' => 'प्रविश्यताम्/ सदस्यता प्राप्यताम्',
+'nav-login-createaccount' => 'प्रविश्यताम् / सदस्यता प्राप्यताम्',
'loginprompt' => '{{SITENAME}} इत्यत्र प्रवेष्टुं कुकी इत्येते (cookies) समर्थीकरणीयानि।',
'userlogin' => 'प्रविश्यताम्/ सदस्यता प्राप्यताम्',
'userloginnocreate' => 'प्रविश्यताम्',
'login-abort-generic' => 'भवतः प्रवेशप्रयासः विफलीभूतः - परित्यक्तः',
'loginlanguagelabel' => 'भाषा : $1',
'suspicious-userlogout' => 'भवतः सत्राद् बहिर्गमनस्य अनुरोधः अस्वीकृतोऽस्ति, यस्मादेतत् भग्नादेकस्मात् ब्राउज़र्तः अथवा स्वल्पसञ्चयि-प्रॉक्सितः प्रेषित आसीत्।',
+'pt-login-button' => 'प्रविश्यताम्',
# Email sending
'php-mail-error-unknown' => 'पीएच्पी इत्येतस्य mail() फलने अज्ञाता काऽपि त्रुटिर्जाता।',
'anontalkpagetext' => 'तस्य अनामकयोजकस्य, अथवा अनुपयोजकस्य च परिचर्चापुटम् येन एतावति काले स्वस्थनं न निर्मितम् ।
अतः तस्य अभिज्ञानार्थं ऐ.पि.सङ्गेतसङ्ख्या प्रयोजनीया ।
सा समाना सङ्ख्याः अन्ययोजकैः अपि विभक्ता । यदि भवान् अनामकयोजकः, भवता असम्बद्धटीकाः श्रुताः, कृपया स्वस्थनं निर्मीय नामाभिलेखं करोतु । [[Special:UserLogin/signup|create an account]], [[Special:UserLogin|log in]] अन्यानामकयोजकैः सह सम्भूयमनभ्रमैः विमुक्तः भवतु ।',
-'noarticletext' => 'अस्मिन् पृष्ठे अधुना किमपि न विद्यते। भवान् विकिपीडियावर्तिषु अन्येषु पृष्ठेषु इदं [[Special:Search/{{PAGENAME}}|शीर्षकम् अन्वेष्टुम्]]अर्हति अथवा इदं पृष्ठं
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} समà¥\8dबदà¥\8dधà¥\87षà¥\81 पà¥\83षà¥\8dठà¥\87षà¥\81 à¤\85नà¥\8dवà¥\87षà¥\8dà¤\9fà¥\81मà¥\8d à¤\85रà¥\8dहति],
-अथवा [{{fullurl:{{FULLPAGENAME}}|action=edit}} इदं पृष्ठं सम्पादयितुम् अर्हति]</span>.',
+'noarticletext' => 'अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते ।
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} समà¥\8dबदà¥\8dधà¥\87षà¥\81 पà¥\83षà¥\8dठà¥\87षà¥\81 à¤\85नà¥\8dवà¥\87षणà¤\82]
+[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनम्] वा शक्यम्</span>.',
'noarticletext-nopermission' => 'अस्मिन् पृष्ठे अधुना किमपि न विद्यते। भवान् विकिपीडियावर्तिषु अन्येषु पृष्ठेषु इदं [[Special:Search/{{PAGENAME}}|शीर्षकम् अन्वेष्टुम् अर्हति]]
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} related logs अन्वेष्टुम् अर्हति],
अथवा [{{fullurl:{{FULLPAGENAME}}|action=edit}} इदं पृष्ठं स्रष्टुम् अर्हति]</span>.',
प्रतीयते यदिदं अपाकृतमस्ति।',
'edit-conflict' => 'सम्पादनयोः/सम्पादनानां अन्तर्विरोधः।',
'edit-no-change' => 'भवतः सम्पादनम् उपेक्षितम्, यतो हि भवता पाठे न किमपि परिवर्तनं कृतम्।',
+'postedit-confirmation' => 'सम्पादनं रक्षितम् ।',
'edit-already-exists' => 'नूतनं पृष्ठं स्रष्टुं नापारयत्।
इदं पूर्वे एव विद्यते।',
'defaultmessagetext' => 'सन्देशपाठं स्थिरयतु ।',
'nohistory' => 'अस्य पृष्ठस्य कृते पृष्ठेतिहासः न वर्तते।',
'currentrev' => 'सद्यःकालीना आवृत्तिः',
'currentrev-asof' => 'वर्तमाना आवृत्तिः $1 इति समये',
-'revisionasof' => '$1 à¤\87तà¥\8dयसà¥\8dय à¤\86वà¥\83तà¥\8dतिà¤\83',
+'revisionasof' => '$1 à¤\87तà¥\8dयसà¥\8dय सà¤\82सà¥\8dà¤\95रणà¤\82',
'revision-info' => '$1इति समयस्य आवृत्तिः $2 इत्यनेन',
'previousrevision' => '← पुरातनानि संस्करणानि',
'nextrevision' => 'नूतनतरा आवृत्तिः →',
'revdelete-show-file-submit' => 'आम्',
'revdelete-selected' => "'''{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Selected log event|Selected log events}}:'''",
-'revdelete-text' => "'''परिमार्जितानि अवतरणानि पुटेतिहासे अद्यापि दृश्यन्ते । तस्य कश्चन भागः सार्वजनिकः न भवति । '''
-{{SITENAME}} इत्यस्य अन्यप्रशसासकः गुप्तसामग्रीः प्राप्नुवन्ति । अपि च अन्तरापुटेन अस्य अपरिमार्जनं कर्तुं शक्नुवन्ति । यावत् अतिरिक्तप्रतिबन्धकाः न स्थापिताः ।",
'revdelete-confirm' => 'भवान् एतत् कार्यं करोति इति दढयतु । भवान् अस्य परिणामं जानाति । [[{{MediaWiki:Policy-url}}|the policy]] भवान् एतदनुसारं करोति ।',
'revdelete-suppress-text' => 'अधोनिदेशितपरिस्थितिषु केवलं निग्रहः कार्यः ।
* अवमाननीयाः विषयाः ।
'difference-title' => '"$1" इत्यस्य अवतरणमध्ये व्यत्यासः ।',
'difference-title-multipage' => '"$1" तथा "$2" पुटयोः मध्ये व्यत्यासः ।',
'difference-multipage' => 'पुटेषु व्यत्यासः ।',
-'lineno' => 'पà¤\82क्तिः $1:',
+'lineno' => 'पà¤\99à¥\8dक्तिः $1:',
'compareselectedversions' => 'चितानाम् आवृत्तीनां तोलनं क्रियताम्',
'showhideselectedversions' => 'चितावतरणानि दर्शयतु/गोपयतु ।',
-'editundo' => 'निषà¥\8dà¤\95à¥\8dरियताम्',
+'editundo' => 'पà¥\82रà¥\8dववत्',
'diff-multi-manyusers' => '({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)',
'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 पुनरावृत्तेः }} व्यत्यासः ($1) {{PLURAL:$2|was|were}} न दृष्टः ।
कारणम् अत्र दृश्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
# Search results
-'searchresults' => 'à¤\85नà¥\8dवà¥\87षणसà¥\8dय फलितानि',
-'searchresults-title' => '"$1" à¤\87तà¥\8dयसà¥\8dय à¤\95à¥\83तà¥\87 à¤\85नà¥\8dवà¥\87षणफलानि',
+'searchresults' => 'à¤\85नà¥\8dवà¥\87षणपरिणामाà¤\83',
+'searchresults-title' => '"$1" à¤\95à¥\83तà¥\87 à¤\85नà¥\8dवà¥\87षणपरिणामाà¤\83',
'toomanymatches' => 'अत्यधिकाः मेलाः प्रत्यागताः । अन्यप्रश्नेन यतताम् ।',
'titlematches' => 'पुटशीर्षिकामेलाः ।',
'textmatches' => 'पुटपाठस्य मेलाः',
'notextmatches' => 'न कस्यापि पृष्ठस्य पाठः अस्य सममस्ति',
-'prevn' => 'पà¥\8dराà¤\95à¥\8dतनानि {{PLURAL:$1|$1}}',
-'nextn' => 'à¤\85à¤\97à¥\8dरिमाणि {{PLURAL:$1|$1}}',
-'prevn-title' => 'पà¥\8dराà¤\95à¥\8dतन-{{PLURAL:$1|फलितमà¥\8d| फलितानि}}',
-'nextn-title' => 'पà¥\8dराà¤\95à¥\8dतन-{{PLURAL:$1|फलितमà¥\8d| फलितानि}}',
+'prevn' => 'पà¥\81रसà¥\8dतातà¥\8d {{PLURAL:$1|$1}}',
+'nextn' => 'परसà¥\8dतातà¥\8d {{PLURAL:$1|$1}}',
+'prevn-title' => 'पà¥\81रसà¥\8dतातà¥\8d {{PLURAL:$1|परिणामà¤\83|परिणामाà¤\83}}',
+'nextn-title' => 'परसà¥\8dतातà¥\8d {{PLURAL:$1|परिणामà¤\83|परिणामाà¤\83}}',
'shown-title' => 'प्रत्येकस्मिन् पृष्ठे $1 {{PLURAL:$1|फलितम्|फलितानि}} दर्श्यताम्',
'viewprevnext' => 'दर्श्यताम् ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => 'अस्मिन् विकिमध्ये "[[:$1]]"नामकं पृष्ठं विद्यते।',
'searchmenu-new' => "'''अस्यां विक्यां \"[[:\$1]]\" इति पृष्ठं सृज्यताम्!'''",
-'searchprofile-articles' => 'à¤\86नà¥\8dतरà¥\8dयमà¥\8d',
-'searchprofile-project' => 'सहायता प्रकल्पपृष्ठानि च',
-'searchprofile-images' => 'बहà¥\81माधà¥\8dयमः',
+'searchprofile-articles' => 'à¤\86नà¥\8dतरà¥\8dविषà¤\95à¤\82 पà¥\83षà¥\8dठà¤\82',
+'searchprofile-project' => 'साहायà¥\8dयà¤\82, प्रकल्पपृष्ठानि च',
+'searchprofile-images' => 'माधà¥\8dयमसमà¥\81à¤\9aà¥\8dà¤\9aयः',
'searchprofile-everything' => 'सर्वम्',
'searchprofile-advanced' => 'प्रगतम्',
'searchprofile-articles-tooltip' => '$1 स्थले अन्विष्यताम्',
'searchprofile-project-tooltip' => '$1 स्थले अन्विष्यताम्',
'searchprofile-images-tooltip' => 'सञ्चिका अन्विष्यताम्',
'searchprofile-everything-tooltip' => '(चर्चापृष्ठानि अविहाय) सर्वत्र अन्विष्यताम्',
-'searchprofile-advanced-tooltip' => 'विशà¥\87षनामसà¥\8dथानेषु अन्विष्यताम्',
+'searchprofile-advanced-tooltip' => 'नामाà¤\95ाशेषु अन्विष्यताम्',
'search-result-size' => '$1 ({{PLURAL:$2|1 शब्दः|$2 शब्दाः}})',
'search-result-category-size' => '{{PLURAL:$1|1 सदस्यः|$1 सदस्याः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})',
'search-result-score' => 'सम्बन्धः $1% ।',
-'search-redirect' => '($1 à¤\87तà¥\8dयतà¥\8dर अनुप्रेषितम्)',
+'search-redirect' => '($1 तà¤\83 अनुप्रेषितम्)',
'search-section' => '(विभागः $1)',
'search-suggest' => 'किं भवतः आशयः एवमस्ति : $1',
'search-interwiki-caption' => 'बन्धु-प्रकल्पाः',
'searchall' => 'सर्वाणि',
'showingresults' => "निम्नगतक्रमाङ्कस्य '''$2''' तः आरभ्य अधिकतमं परिणामः'''$1''' {{PLURAL:$1| दर्शितः}}।",
'showingresultsnum' => "निम्नगतक्रमाङ्क'''$2'''तः आरभ्य अधिकतमः '''$3''' परिणामः {{PLURAL:$3|दर्शितः}}।",
-'showingresultsheader' => "'''$4''' à¤\87तà¥\8dयà¥\87तसà¥\8dय {{PLURAL:$5|'''$3'''सà¥\8dय '''$1''' फलितमà¥\8d|'''$3'''सà¥\8dय '''$1 - $2''' फलितानि}}",
+'showingresultsheader' => "'''$4''' à¤\87तà¥\8dयà¥\87तसà¥\8dमà¥\88 {{PLURAL:$5|'''$1''' परिणामà¤\83 '''$3''' à¤\87तà¥\8dयà¥\87षà¥\81|'''$1 - $2''' परिणामाà¤\83 '''$3''' à¤\87तà¥\8dयà¥\87षà¥\81}}",
'search-nonefound' => 'भवतः अपेक्षानुगुणं फलितं न किमपि विद्यते ।',
'powersearch-legend' => 'प्रगतम् अन्वेषणम्',
'powersearch-ns' => 'नामाकाशेषु अन्विष्यताम्:',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
-'recentchanges' => 'सदà¥\8dयà¥\8bà¤\9cातानि परिवरà¥\8dतनानि',
+'recentchanges' => 'सद्यपरिवर्तनानि',
'recentchanges-legend' => 'सद्योजातानां परिवर्तनानां विकल्पाः',
'recentchanges-summary' => 'अस्मिन् विकियोजनायां सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
'recentchanges-feed-description' => 'अस्मिन् विकियोजनायां सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
'unusedtemplateswlh' => 'अन्यानुबन्धाः ।',
# Random page
-'randompage' => 'यादृच्छिकपृष्ठम्',
+'randompage' => 'अशृङ्खलं (random) पृष्ठं',
'randompage-nopages' => 'अधोनिदेशितनामस्थाने पुटानि न सन्ति । {{PLURAL:$2| एतन्नमस्थाने}} नास्ति : $1।',
# Random redirect
'fewestrevisions' => 'न्यूनतमालोकनयुक्तपुटानि ।',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|बà¥\88à¤\9fà¥\8d|बà¥\88à¤\9fà¥\8dसà¥\8d}}',
+'nbytes' => '$1 {{PLURAL:$1|à¤\85षà¥\8dà¤\9fà¤\95मà¥\8d|à¤\85षà¥\8dà¤\9fà¤\95ानि}}',
'ncategories' => '{{PLURAL:$1|वर्गः|वर्गाः }}',
'ninterwikis' => '$1 {{PLURAL:$1|अन्तार्विकी|अन्तार्विक्यः}}',
'nlinks' => '$1 {{PLURAL:$1|अनुबन्धः|अनुबन्धाः}}',
'listusers-creationsort' => 'सर्जनदिनाङ्कैः वर्गीकरोतु ।',
'usereditcount' => '$1 {{PLURAL:$1|दिनम्|दिनानि}}',
'usercreated' => '$1 दिने $2 समये रचितम् योजकनाम $3',
-'newpages' => 'नवà¥\80नपà¥\83षà¥\8dठमà¥\8d',
+'newpages' => 'नवà¥\80नपà¥\83षà¥\8dठानि',
'newpages-username' => 'योजकनामन्:',
'ancientpages' => 'प्राचीनतमानि पृष्ठानि',
'move' => 'चाल्यताम्',
# Rollback
'rollback' => 'सम्पादनं निर्वर्तयतु ।',
'rollback_short' => 'प्रत्याहरणम् ।',
-'rollbacklink' => 'पà¥\8dरतिनिवरà¥\8dतà¥\8dयतामà¥\8d',
+'rollbacklink' => 'पà¥\8dरतà¥\8dयाहरणà¤\82',
'rollbacklinkcount' => '$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} प्रत्याहरतु ।',
'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} अधिकं प्रत्याहरतु ।',
'rollbackfailed' => 'प्रत्यहरणम् असफलम् ।',
'sp-contributions-submit' => 'अन्विष्यताम्',
# What links here
-'whatlinkshere' => 'à¤\95à¥\87à¤à¥\8dयà¤\83 पà¥\83षà¥\8dठà¥\87à¤à¥\8dयà¤\83 समà¥\8dबदà¥\8dधमà¥\8d',
+'whatlinkshere' => 'à¤\85नà¥\87न सह समà¥\8dबदà¥\8dधाà¤\83',
'whatlinkshere-title' => '"$1" इत्येतेन सम्बद्धानि पृष्ठानि',
'whatlinkshere-page' => 'पृष्ठम् :',
'linkshere' => "अधोलिखितानि पृष्ठाणि '''[[:$1]]''' इत्येतद् प्रति संबंधनं कुर्वन्ति :",
'blocklist-nousertalk' => 'स्वस्य सम्भाषणपुटं सम्पादयितुं न शक्यते ।',
'ipblocklist-empty' => 'अवरोधावली रिक्ता अस्ति ।',
'ipblocklist-no-results' => 'अभ्यर्थितः ऐपिसङ्केतः अथवा अभ्यर्थितः योजकनाम अवरुद्धं न ।',
-'blocklink' => 'à¤\85वरà¥\8bधà¤\83 à¤\95à¥\8dरियताम्',
+'blocklink' => 'à¤\85वरà¥\81दà¥\8dधà¥\8dयताम्',
'unblocklink' => 'निरोधः अपास्यताम्',
'change-blocklink' => 'विभागः परिवर्त्यताम्',
'contribslink' => 'योगदानम्',
'javascripttest-qunit-heading' => 'मिडियाविक्याः जवालिपेः Qघटकस्य परीक्षाप्रणाली ।',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'भवतः योजकपृष्ठम्',
+'tooltip-pt-userpage' => 'भवतः/भवत्याः योजकपृष्ठम्',
'tooltip-pt-anonuserpage' => 'ऐपिसङ्केतार्थं योजकपुटं भवान् सम्पादयति एवम्..',
-'tooltip-pt-mytalk' => 'भवतः सम्भाषणपृष्ठम्',
+'tooltip-pt-mytalk' => 'भवतः/भवत्याः सम्भाषणपृष्ठम्',
'tooltip-pt-anontalk' => 'एतस्मात् ऐपिसङ्केतात् सम्पादनस्य परिचर्चा ।',
-'tooltip-pt-preferences' => 'भवतः इष्टतमानि',
-'tooltip-pt-watchlist' => 'à¤à¤µà¤¦à¥\8dà¤à¤¿à¤\83 परिवरà¥\8dतनानि निरà¥\80à¤\95à¥\8dषà¥\8dयमाणानाà¤\82 पà¥\83षà¥\8dठानाà¤\82 सà¥\82à¤\9aà¥\80',
-'tooltip-pt-mycontris' => 'भवतः योगदानानाम् आवली',
-'tooltip-pt-login' => 'à¤à¤µà¤¾à¤¨à¥\8d न पà¥\8dरविषà¥\8dà¤\9fà¤\83। पà¥\8dरवà¥\87शà¤\83 à¤\85निवारà¥\8dयà¤\83 न।',
+'tooltip-pt-preferences' => 'भवतः/भवत्याः इष्टतमानि',
+'tooltip-pt-watchlist' => 'à¤à¤µà¤¤à¤\83/à¤à¤µà¤¤à¥\8dयाà¤\83 निरà¥\80à¤\95à¥\8dषासà¥\82à¤\9aà¥\8dयाà¤\82 विदà¥\8dयमानानाà¤\82 पà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83',
+'tooltip-pt-mycontris' => 'भवतः/भवत्याः योगदानस्य आवलिः',
+'tooltip-pt-login' => 'समà¥\8dपà¥\8dरवà¥\87शाय पà¥\8dरà¥\8bतà¥\8dसहामहà¥\87 । परनà¥\8dतà¥\81 समà¥\8dपà¥\8dरवà¥\87शà¤\83 à¤\90à¤\9aà¥\8dà¤\9bिà¤\95à¤\83 ।',
'tooltip-pt-logout' => 'निर्गमनम्',
-'tooltip-ca-talk' => 'पà¥\83षà¥\8dठानà¥\8dतरà¥\8dà¤\97तविषयà¥\87 चर्चा',
-'tooltip-ca-edit' => 'à¤à¤µà¤¾à¤¨à¥\8d à¤\87दà¤\82 पà¥\83षà¥\8dठà¤\82 समà¥\8dपादयितà¥\81मà¥\8d à¤\85रà¥\8dहति। रà¤\95à¥\8dषणातà¥\8dपà¥\82रà¥\8dवà¤\82 à¤\95à¥\83पया पà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयà¤\82 पशà¥\8dयतà¥\81।',
+'tooltip-ca-talk' => 'पà¥\83षà¥\8dठाऽनà¥\8dतरà¥\8dà¤\97ताय विषयाय चर्चा',
+'tooltip-ca-edit' => 'à¤\87दà¤\82 पà¥\83षà¥\8dठà¤\82 समà¥\8dपादयितà¥\81à¤\82 शà¤\95à¥\8dयतà¥\87 । रà¤\95à¥\8dषणातà¥\8dपà¥\82रà¥\8dवà¤\82 à¤\95à¥\83पया पà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयà¤\82 दà¥\83शà¥\8dयतामà¥\8d ।',
'tooltip-ca-addsection' => 'नूतनः विभागः आरभ्यताम्',
-'tooltip-ca-viewsource' => 'इदं पृष्ठं संरक्षितं विद्यते। भवान् अस्य स्रोतः द्रष्टुम् अर्हति।',
-'tooltip-ca-history' => 'à¤\85सà¥\8dय पà¥\83षà¥\8dठसà¥\8dय पà¥\81रातनà¥\8dयà¤\83 à¤\86वà¥\83तà¥\8dतयः',
+'tooltip-ca-viewsource' => 'इदं पृष्ठं संरक्षितं विद्यते । अस्य स्रोतं द्रष्टुं शक्यते ।',
+'tooltip-ca-history' => 'à¤\85सà¥\8dय पà¥\83षà¥\8dठसà¥\8dय पà¥\81रातनाऽऽवà¥\83तà¥\8dतिः',
'tooltip-ca-protect' => 'इदं पृष्ठं संरक्ष्यताम्',
'tooltip-ca-unprotect' => 'अस्य पुटास्य सुरक्षां परिवर्तयतु ।',
'tooltip-ca-delete' => 'इदं पृष्ठम् अपाक्रियताम्',
'tooltip-ca-move' => 'इदं पृष्ठं चाल्यताम्',
'tooltip-ca-watch' => 'इदं पृष्ठं भवतः अवेक्षणसूच्यां योज्यताम्',
'tooltip-ca-unwatch' => 'इदं पृष्ठं भवतः अवेक्षणसूच्याः निष्कास्यताम्',
-'tooltip-search' => '{{SITENAME}} à¤\85तà¥\8dर à¤\85नà¥\8dविषà¥\8dयतामà¥\8d',
+'tooltip-search' => '{{SITENAME}} अन्विष्यताम्',
'tooltip-search-go' => 'समानशिरोनामयुक्तं पृष्ठं विद्यते चेत् तत्र गम्यताम्',
-'tooltip-search-fulltext' => 'à¤\87दà¤\82 वà¤\9aनं पृष्ठेषु अन्विष्यताम्',
+'tooltip-search-fulltext' => 'à¤\8fनà¤\82 वाà¤\95à¥\8dयाà¤\82शं पृष्ठेषु अन्विष्यताम्',
'tooltip-p-logo' => 'मुख्यपृष्ठं गम्यताम्',
'tooltip-n-mainpage' => 'मुख्यपृष्ठं गम्यताम्',
'tooltip-n-mainpage-description' => 'मुख्यपृष्ठं गम्यताम्',
-'tooltip-n-portal' => 'पà¥\8dरà¤\95लà¥\8dपविषयà¥\87 à¤à¤µà¤¤à¤¾ à¤\95िà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 शà¤\95à¥\8dयà¤\82, à¤\95à¥\81तà¥\8dर à¤\85नà¥\8dवà¥\87षणà¤\82 शà¤\95्यम्',
-'tooltip-n-currentevents' => 'सदà¥\8dयà¤\83à¤\95ालà¥\80नà¤\98à¤\9fनानां पृष्ठभूमिका प्राप्यताम्',
-'tooltip-n-recentchanges' => 'सदà¥\8dयà¥\8bà¤\9cातानाà¤\82 परिवरà¥\8dतनानाà¤\82 सà¥\82à¤\9aà¥\80',
-'tooltip-n-randompage' => 'à¤\95िमपà¥\8dयà¥\87à¤\95à¤\82 पृष्ठं गम्यताम्',
+'tooltip-n-portal' => 'तà¥\8dवया पà¥\8dरà¤\95लà¥\8dपविषयà¥\87 à¤\95िà¤\82 à¤\95रà¥\8dतà¥\81à¤\82 शà¤\95à¥\8dयतà¥\87, à¤\95à¥\81तà¤\83 साहायà¥\8dयà¤\82 पà¥\8dरापà¥\8dतव्यम्',
+'tooltip-n-currentevents' => 'वरà¥\8dतमानपà¥\8dरसà¤\99à¥\8dà¤\97ानां पृष्ठभूमिका प्राप्यताम्',
+'tooltip-n-recentchanges' => 'सदà¥\8dयपरिवरà¥\8dतनानामà¥\8d à¤\86वलिà¤\83',
+'tooltip-n-randompage' => 'à¤\85शà¥\83à¤\99à¥\8dà¤\96लà¤\82 (random) पृष्ठं गम्यताम्',
'tooltip-n-help' => 'अन्वेषणस्थानम्',
-'tooltip-t-whatlinkshere' => 'à¤\8fततà¥\8dसमà¥\8dबदà¥\8dधानाà¤\82 सरà¥\8dवà¥\87षाà¤\82 विà¤\95ि-पà¥\83षà¥\8dठानाà¤\82 सà¥\82à¤\9aà¥\80',
-'tooltip-t-recentchangeslinked' => 'à¤\8fततà¥\8dसमà¥\8dबदà¥\8dधà¥\87षà¥\81 पà¥\83षà¥\8dठà¥\87षà¥\81 à¤\9cातानि सदà¥\8dयà¤\83à¤\95ालà¥\80नानि परिवर्तनानि',
+'tooltip-t-whatlinkshere' => 'à¤\85तà¥\8dर समà¥\8dबदà¥\8dधानाà¤\82 परिसनà¥\8dधितानाà¤\82 विà¤\95ि-पà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83',
+'tooltip-t-recentchangeslinked' => 'à¤\8fततà¥\8dपà¥\83षà¥\8dठसमà¥\8dबदà¥\8dधà¥\87षà¥\81 पà¥\83षà¥\8dठà¥\87षà¥\81 सदà¥\8dयà¤\9cातानि परिवर्तनानि',
'tooltip-feed-rss' => 'अस्मै पृष्ठाय आर-एस-एस-पूरणम्',
'tooltip-feed-atom' => 'अस्मै पृष्ठाय अणुपूरणम्',
'tooltip-t-contributions' => 'अस्य योजकस्य योगदानानाम् आवलिः',
'tooltip-t-emailuser' => 'एतस्मै योजकाय ईपत्रं प्रेष्यताम्',
-'tooltip-t-upload' => 'सà¤\82चिकाः आरोप्यन्ताम्',
-'tooltip-t-specialpages' => 'सरà¥\8dवà¥\87षाà¤\82 विशिषà¥\8dà¤\9fपà¥\83षà¥\8dठानाà¤\82 सà¥\82à¤\9aà¥\80',
+'tooltip-t-upload' => 'सà¤\9eà¥\8dचिकाः आरोप्यन्ताम्',
+'tooltip-t-specialpages' => 'सरà¥\8dवà¥\87षाà¤\82 विशिषà¥\8dà¤\9fपà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83',
'tooltip-t-print' => 'अस्य पृष्ठस्य मुद्रणयोग्या आवृत्तिः',
-'tooltip-t-permalink' => 'पृष्ठस्य अस्याः आवृत्तेः स्थिरसम्पर्कतन्तुः',
-'tooltip-ca-nstab-main' => 'à¤\86नà¥\8dतरà¥\8dयà¤\82 दà¥\83शà¥\8dयतामà¥\8d',
+'tooltip-t-permalink' => 'पृष्ठस्यास्य स्थायिपरिसन्धिः',
+'tooltip-ca-nstab-main' => 'à¤\86नà¥\8dतरà¥\8dविषयà¤\95à¤\82 पà¥\83षà¥\8dठà¤\82 पशà¥\8dयतà¥\81',
'tooltip-ca-nstab-user' => 'योजकपृष्ठं दृश्यताम्',
'tooltip-ca-nstab-media' => 'माध्यमपुटम् अवलोकयतु ।',
'tooltip-ca-nstab-special' => 'इदमेकं विशिष्टं पृष्ठम्, भवान् इदं पृष्ठं सम्पादयितुं न अर्हति।',
'tooltip-watchlistedit-raw-submit' => 'अवलोकनावलीं समुद्धरतु ।',
'tooltip-recreate' => 'एतत्पुटं पूर्वमेव अपमर्जितः अतः पुन सृजतु ।',
'tooltip-upload' => 'उत्तारणम् आरभताम्',
-'tooltip-rollback' => '"पà¥\82रà¥\8dण-पà¥\8dरतिà¤\97मनà¤\82(रà¥\8bलबà¥\88à¤\95à¥\8d à¤\87तà¥\8dयà¥\87तदà¥\8d)" à¤\85सà¥\8dय पà¥\83षà¥\8dठसà¥\8dय सà¤\82पादनानि à¤\85à¤\82तिम-यà¥\8bà¤\97दातà¥\83à¤\95à¥\83तानि विपरà¥\80तà¥\80à¤\95रà¥\8bति à¤\8fà¤\95à¥\87न à¤\95à¥\8dलिà¤\95à¥\8dà¤\95ारà¥\87ण',
-'tooltip-undo' => '"निषà¥\8dà¤\95à¥\8dरियतामà¥\8d" à¤\87तà¥\8dयà¥\87तदà¥\8d à¤\87दà¤\82 समà¥\8dपादनà¤\82 विपरà¥\80तà¥\80à¤\95रà¥\8bति, तथा à¤\9a समà¥\8dपादनपà¥\8dरारà¥\82पà¤\82 पà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयरà¥\82पà¥\87ण à¤\89दà¥\8dà¤\98ाà¤\9fयति।
+'tooltip-rollback' => '"पà¥\8dरतà¥\8dयाहरणमà¥\8d (roll back)" à¤\87तà¥\8dयà¥\87ततà¥\8d à¤\85नà¥\8dतिमसमà¥\8dपादà¤\95सà¥\8dय à¤\85नà¥\8dतिमयà¥\8bà¤\97दानà¤\82 निराà¤\95रà¥\8bति ।',
+'tooltip-undo' => '"पà¥\82रà¥\8dववतà¥\8d" à¤\87ति à¤\85नà¥\8dतिमसमà¥\8dपादनमà¥\8d à¤\85पाà¤\95रà¥\8bति, समà¥\8dपादनपà¥\8dरारà¥\82पà¤\82 पà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयरà¥\82पà¥\87ण à¤\89दà¥\8dà¤\98ाà¤\9fयति, नवà¥\80नसमà¥\8dपादनानà¥\8dतरà¤\82 समà¥\8dपादनपà¥\83षà¥\8dठà¤\82 पà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयतà¥\8dवà¥\87न पà¥\8dरदरà¥\8dशयति à¤\9a ।
-à¤\85सà¥\8dय साराà¤\82शà¥\87 à¤\95ारणमपि लà¥\87à¤\96ितà¥\81à¤\82 शà¤\95à¥\8dयतà¥\87।',
+à¤\85सà¥\8dय साराà¤\82शà¥\87 à¤\85पाà¤\95रणसà¥\8dय à¤\95ारणमपि लà¥\87à¤\96ितà¥\81à¤\82 शà¤\95à¥\8dयतà¥\87 ।',
'tooltip-preferences-save' => 'आद्यताः रक्षतु ।',
'tooltip-summary' => 'संक्षिप्तः सारांशः योज्यताम्',
'just-now' => 'अधुनैव',
# Bad image list
-'bad_image_list' => 'रà¥\82पमà¥\8d à¤\8fवमà¥\8d à¤\85सà¥\8dति -
+'bad_image_list' => 'à¤\85तà¥\8dर पà¥\8dरारà¥\82पà¤\82 à¤\8fवà¤\82 à¤à¤µà¥\87तà¥\8d -
-à¤\95à¥\87वलà¤\82 सà¥\82à¤\9aà¥\8dयनà¥\8dतरà¥\8dà¤\97ताà¤\83 विषयाà¤\83 (* à¤\87ति à¤\9aिनà¥\8dहातà¥\8d à¤\86रà¤à¤®à¤¾à¤£à¤¾à¤\83 पà¤\82à¤\95à¥\8dतयà¤\83)परामà¥\83षà¥\8dà¤\9fाà¤\83।
+à¤\95à¥\87वलमà¥\8d à¤\86वलà¥\8dयनà¥\8dतरà¥\8dà¤\97ताà¤\83 विषयाà¤\83 (* à¤\87ति à¤\9aिनà¥\8dहातà¥\8d à¤\86रà¤à¤®à¤¾à¤£à¤¾à¤\83 पà¤\99à¥\8dà¤\95à¥\8dतयà¤\83) à¤\86à¤\95लिताà¤\83 ।
-प्रथमः सम्पर्कतन्तुः दोषपूर्णां सञ्चिकां प्रत्येव गच्छेत्।
-तस्याम् एव पङ्क्तौ उत्तरोत्तरसम्पर्कतन्तवः अपवादाः ज्ञेयाः। अर्थात् येषु पृष्ठेषु एषा सञ्चिका योजिता स्यात्।',
+पङ्क्त्यां विद्यमाना प्रथमा परिसन्धिः (link) दोषपूर्णया सञ्चिकया सह परिसन्धिता (linked) स्यादेव । तस्यामेव पङ्क्तौ उत्तरोत्तरं विद्यमानाः परिसन्धयः अपवादिताः ज्ञेयाः, अर्थात् अत्र तेषां पृष्ठानाम् आवलिरेव भविष्यति, येषु एषा सञ्चिका विद्यते ।',
# Metadata
'metadata' => 'अधिदत्तानि',
'fileduplicatesearch-noresults' => '"$1" इति नाम्ना सञ्चिका न दृष्टा ।',
# Special:SpecialPages
-'specialpages' => 'विशà¥\87षपृष्ठानि',
+'specialpages' => 'विशिषà¥\8dà¤\9fपृष्ठानि',
'specialpages-note' => '* साधारणं विशेषपुटम् ।
* <span class="mw-specialpagerestricted">प्रतिद्धं विशेषपुटम् ।</span>',
'specialpages-group-maintenance' => 'निर्वहणवृत्तानि ।',
'revdelete-show-file-submit' => 'Сөп',
'revdelete-selected' => "'''[[:$1]] сирэй {{PLURAL:$2|талыллыбыт торума|талыллыбыт торумнара}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Сирэй талыллыбыт историята|Сирэй талыллыбыт историялара}}:'''",
-'revdelete-text' => "'''Сотуллубут барыллар сирэй историятыгар киириэхтэрэ, ол гынан баран сорох барыллар көннөрү киһиэхэ көстүөхтэрэ суоҕа.'''
-{{SITENAME}} дьаһабыллара кистэммит суруктары көрөр уонна сотуллубуту төттөрү төннөрөр кыахтаахтар (эбии хааччахтааһын турбатах буоллаҕына).",
'revdelete-confirm' => 'Бука диэн кырдьык бу дьайыыны онороргун, содула туох буоларын өйдүүргүн уонна [[{{MediaWiki:Policy-url}}|сиэри]] тутуһаргын бигэргэт.',
'revdelete-suppress-text' => "Кистээһин маннык түбэлтэлэргэ '''эрэ''' оҥоһуллар:
'nextn' => '{{PLURAL:$1|imbeniente|imbenientes $1}}',
'shown-title' => 'Ammustra $1 {{PLURAL:$1|resurtadu|resurtados}} pro pàgina',
'viewprevnext' => 'Càstia ($1 {{int:pipe-separator}} $2) ($3).',
+'searchprofile-articles' => 'Pàginas de càbidu',
+'searchprofile-project' => 'Pàginas de agiudu e de su progetu',
+'searchprofile-images' => 'Multimèdia',
'searchprofile-everything' => 'Totu',
'searchprofile-advanced' => 'Avantzada',
'searchprofile-articles-tooltip' => 'Chirca in $1',
# Watchlist
'watchlist' => 'Sa watchlist mea',
-'mywatchlist' => 'Sa watchlist mea',
+'mywatchlist' => 'Pàginas annotadas',
'nowatchlist' => 'No as indicadu pàginas in sa watchlist tua.',
'watchnologin' => 'No intrau (log in)',
'watchnologintext' => 'Devi prima fare il [[Special:UserLogin|login]]
'revdelete-show-file-submit' => 'Sì',
'revdelete-selected' => "'''{{PLURAL:$2|Virsioni silizziunata|Virsioni silizziunati}} di [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Eventu dû riggistru silizziunatu|Eventi dû riggistru silizziunati}}:'''",
-'revdelete-text' => "'''Li virsioni cancillati rèstanu visìbbili ntâ cronoluggìa dâ pàggina, mentri lu testu cuntinutu nun è accissìbbili a lu pùbbricu.'''
-L'àutri amministratura dû situ ponnu accèdiri comu è gghiè a li cuntinuti ammucciati e ripristinàrili attraversu sta stissa nterfaccia, siddu nun hannu statu mpustati àutri limitazzioni n fasi di nstallazzioni dû situ.",
'revdelete-suppress-text' => "La rimozzioni havi a essiri utilizzata '''sulu''' ni sti casi:
* Dati pirsonali inoppurtuni
*: ''ndirizzi, nnummara di telefunu, codici fiscali, ecc.''",
$messages = array(
# User preference toggles
'tog-underline' => 'Unnerline airtins:',
-'tog-hideminor' => 'Skauk smaa edits in recent chynges',
-'tog-hidepatrolled' => 'Skauk patrolled edits in recent chynges',
+'tog-hideminor' => 'Skauk smaa eidits in recent chynges',
+'tog-hidepatrolled' => 'Skauk patrolled eidits in recent chynges',
'tog-newpageshidepatrolled' => 'Skauk patrolled pages frae the new page leet',
-'tog-extendwatchlist' => 'Mak watchleet bigger tae shaw aw chynges, nae juist the maist recent',
-'tog-usenewrc' => 'Groop chynges bi page in recent chynges an watchleet',
+'tog-extendwatchlist' => 'Mak watchleet bigger tae shaw aw chynges, no just the maist recent',
+'tog-usenewrc' => 'Groop chynges bi page in recent chynges n watchleet',
'tog-numberheadings' => 'Auto-nummer heidins',
-'tog-showtoolbar' => 'Shaw edit tuilbaur',
-'tog-editondblclick' => 'Edit pages on dooble-dab (JavaScript)',
+'tog-showtoolbar' => 'Shaw eidit tuilbaur',
+'tog-editondblclick' => 'Eidit pages oan dooble-clap (JavaScript)',
'tog-editsectiononrightclick' => 'Enable section editin bi richt-clapin on section teitles',
'tog-rememberpassword' => 'Mynd ma password oan this browser (fer ae maximum o $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations' => 'Add pages that Ah mak an files Ah uplaid til ma watchleet',
-'tog-watchdefault' => 'Add pages an files that Ah edit til ma watchleet',
-'tog-watchmoves' => 'Eik pages an files that Ah muiv til ma watchleet',
-'tog-watchdeletion' => 'Eik pages an files that Ah get rid o til ma watchleet',
+'tog-watchcreations' => 'Add pages that Ah cræft n files that Ah uplaid til ma watchleet',
+'tog-watchdefault' => 'Add pages n files that Ah eedit til ma watchleet',
+'tog-watchmoves' => 'Add pages n files that Ah muiv til ma watchleet',
+'tog-watchdeletion' => 'Eik pages n files that Ah get rid o til ma watchleet',
'tog-minordefault' => 'Mairk aa edits "smaa" bi defaut',
-'tog-previewontop' => 'Shaw owerview afore edit kist an no efter it',
-'tog-previewonfirst' => 'Shaw scance on first edit',
+'tog-previewontop' => 'Shaw owerview afore eedit kist n naw efter it',
+'tog-previewonfirst' => 'Shaw luikower oan firstwhile eidit',
'tog-enotifwatchlistpages' => 'Wab-mail me whan ae page or file on ma watchleet is chynged',
'tog-enotifusertalkpages' => 'Send me ae wab-mail whan ma uiser tauk page is chynged',
-'tog-enotifminoredits' => 'Send me ae wab-mail fer wee edits o pages an files ava',
+'tog-enotifminoredits' => 'Send me ae wab-mail fer wee eedits o pages n files ava',
'tog-enotifrevealaddr' => 'Shaw ma email address in notification mails',
'tog-shownumberswatching' => 'Shaw the nummer o watching uisers',
'tog-oldsig' => 'Existin signatur:',
'tog-fancysig' => 'Treat signature as wikitext (wioot aen autæmatic airtin)',
-'tog-uselivepreview' => 'Uise live preview (experimental)',
-'tog-forceeditsummary' => 'Gie me a jottin when A dinnae put in aen edit owerview',
-'tog-watchlisthideown' => 'Skauk ma edits frae the watchleet',
-'tog-watchlisthidebots' => 'Skauk bot edits frae the watchleet',
-'tog-watchlisthideminor' => 'Dinna shaw smaa edits oan ma watchleet',
-'tog-watchlisthideliu' => 'Skauk edits bi loggit in uisers frae the watchleet',
-'tog-watchlisthideanons' => 'Skauk edits bi nameless uisers frae the watchleet',
-'tog-watchlisthidepatrolled' => 'Skauk patrolled edits frae the watchlist',
+'tog-uselivepreview' => 'Uise live luik ower (experimental)',
+'tog-forceeditsummary' => 'Gie me ae jottin when Ah dinnae put in aen eidit owerview',
+'tog-watchlisthideown' => 'Skauk ma eidits frae the watchleet',
+'tog-watchlisthidebots' => 'Skauk bot eidits frae the watchleet',
+'tog-watchlisthideminor' => 'Dinna shaw smaa eidits oan ma watchleet',
+'tog-watchlisthideliu' => 'Skauk eidits bi loggit in uisers fae the watchleet',
+'tog-watchlisthideanons' => 'Skauk eidits bi nameless uisers fae the watchleet',
+'tog-watchlisthidepatrolled' => 'Skauk patrolled eidits fae the watchleet',
'tog-ccmeonemails' => 'Gie me copies o emails A write tae ither uisers',
'tog-diffonly' => 'Dinna shaw page contents ablo diffs',
'tog-showhiddencats' => "Shaw Skauk't categeries",
'tog-norollbackdiff' => 'Lave oot diff efter rowin back',
-'tog-useeditwarning' => 'Wairn me whan I leave an edit page wi unhained chynges',
+'tog-useeditwarning' => 'Warnish me whan Ah lea aen eidit page wi onhained chynges',
'tog-prefershttps' => 'Aye uise ae secure connection whan loggit in',
'underline-always' => 'Aye',
'underline-default' => 'Skin or brouser defaut',
# Font style option in Special:Preferences
-'editfont-style' => 'Edit aurie font style:',
+'editfont-style' => 'Eidit area font style:',
'editfont-default' => 'Brouser defaut',
'editfont-sansserif' => 'Sans-serif font',
'editfont-serif' => 'Serif font',
'thu' => 'Thu',
'fri' => 'Fri',
'sat' => 'Sat',
-'january' => 'Januar',
-'february' => 'Februar',
+'january' => 'Januair',
+'february' => 'Febuair',
'march' => 'Mairch',
'april' => 'Aprile',
'may_long' => 'Mey',
'october' => 'October',
'november' => 'November',
'december' => 'December',
-'january-gen' => 'Januar',
+'january-gen' => 'Januair',
'february-gen' => 'Februar',
'march-gen' => 'Mairch',
'april-gen' => 'Aprile',
'oct' => 'Oct',
'nov' => 'Nov',
'dec' => 'Diz',
-'january-date' => '$1 Januar',
-'february-date' => '$1 Februar',
+'january-date' => '$1 Januair',
+'february-date' => '$1 Febuair',
'march-date' => '$1 Mairch',
'april-date' => '$1 Apryl',
'may-date' => '$1 Mey',
'september-date' => '$1 September',
'october-date' => '$1 October',
'november-date' => '$1 November',
-'december-date' => '$1 December',
+'december-date' => '$1 Dezember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Category|Categories}}',
'category-media-header' => 'Eetems in category "$1"',
'category-empty' => "''This category haes no pages or eetems at the meenit.''",
'hidden-categories' => "{{PLURAL:$1|Skauk't categerie|Skauk't categeries}}",
-'hidden-category-category' => 'Skauked categories',
+'hidden-category-category' => "Skauk't cætegories",
'category-subcat-count' => '{{PLURAL:$2|This category juist haes the follaein subcategory.|This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}, oot o $2 awthegither.}}',
'category-subcat-count-limited' => 'This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}.',
'category-article-count' => '{{PLURAL:$2|This category contains the ae follaein page.|The follaein {{PLURAL:$1|page|$1 pages}} is in this category, oot o $2 total.}}',
'listingcontinuesabbrev' => 'cont.',
'index-category' => "Index't pages",
'noindex-category' => 'Noindexed pages',
-'broken-file-category' => 'Pages wi broken file airtins',
+'broken-file-category' => 'Pages wi broken file links',
'about' => 'Aboot',
'article' => 'Content page',
'mytalk' => 'Ma tauk',
'anontalk' => 'Tauk fer this IP address',
'navigation' => 'Navigation',
-'and' => ' an',
+'and' => ' n',
# Cologne Blue skin
'qbfind' => 'Rake',
'qbbrowse' => 'Brouse',
-'qbedit' => 'Edit',
+'qbedit' => 'Eidit',
'qbpageoptions' => 'This page',
'qbmyoptions' => 'Ma pages',
'faq' => 'ASQ',
# Vector skin
'vector-action-addsection' => 'Add topic',
-'vector-action-delete' => 'Delete',
-'vector-action-move' => 'Flit',
+'vector-action-delete' => 'Delyte',
+'vector-action-move' => 'Muiv',
'vector-action-protect' => 'Fend',
-'vector-action-undelete' => 'Undelete',
+'vector-action-undelete' => 'Ondelyte',
'vector-action-unprotect' => 'Chynge protection',
'vector-view-create' => 'Mak',
-'vector-view-edit' => 'Edit',
-'vector-view-history' => 'See history',
+'vector-view-edit' => 'Eedit',
+'vector-view-history' => 'See histerie',
'vector-view-view' => 'Read',
'vector-view-viewsource' => 'View soorce',
'actions' => 'Actions',
'navigation-heading' => 'Navigâtion menu',
'errorpagetitle' => 'Mistak',
-'returnto' => 'Return tae $1.',
+'returnto' => 'Return til $1.',
'tagline' => 'Frae {{SITENAME}}',
'help' => 'Help',
'search' => 'Rake',
'searchbutton' => 'Rake',
'go' => 'Gang',
'searcharticle' => 'Gang',
-'history' => 'Page history',
-'history_short' => 'History',
+'history' => 'Page histerie',
+'history_short' => 'Histerie',
'updatedmarker' => 'chynged sin ma hindermast visit',
'printableversion' => 'Prent version',
'permalink' => 'Permanent airtin',
'print' => 'Prent',
'view' => 'View.',
-'edit' => 'Edit',
+'edit' => 'Eedit',
'create' => 'Mak',
-'editthispage' => 'Edit this page',
+'editthispage' => 'Eedit this page',
'create-this-page' => 'Mak this page',
-'delete' => 'Delete',
-'deletethispage' => 'Delete this page',
-'undeletethispage' => 'Undelete this page',
+'delete' => 'Delyte',
+'deletethispage' => 'Delyte this page',
+'undeletethispage' => 'Ondelyte this page',
'undelete_short' => 'Undelete {{PLURAL:$1|ane edit|$1 edits}}',
-'viewdeleted_short' => 'View {{PLURAL:$1|ane deletit edit|$1 deletit edits}}',
+'viewdeleted_short' => 'See {{PLURAL:$1|yin delytit eedit|$1 delytit eedits}}',
'protect' => 'Fend',
'protect_change' => 'chynge',
'protectthispage' => 'Fend this page',
'unprotectthispage' => 'Chynge fend fer this page',
'newpage' => 'New page',
'talkpage' => 'Blether ower this page',
-'talkpagelinktext' => 'Collogue',
+'talkpagelinktext' => 'Tauk',
'specialpage' => 'Byordinar Page',
'personaltools' => 'Personal tuils',
'postcomment' => 'New section',
'viewtalkpage' => 'Scance ower collogue',
'otherlanguages' => 'In ither leids',
'redirectedfrom' => '(Reguidit frae $1)',
-'redirectpagesub' => 'Redirect page',
+'redirectpagesub' => 'Reguidal page',
'lastmodifiedat' => 'This page wis hindermaist chynged $2, $1.',
'viewcount' => 'This page haes been accesst $1 {{PLURAL:$1|once|$1 times}}.',
'protectedpage' => 'Protectit page',
-'jumpto' => 'Lowp tae:',
+'jumpto' => 'Jump til:',
'jumptonavigation' => 'navigation',
'jumptosearch' => 'rake',
'view-pool-error' => 'Sorrie, the servers ar owerlaided at the moment.
'badaccess-group0' => "Ye'r no permited tae dae whit ye hae requestit!",
'badaccess-groups' => 'The action ye hae requestit is limitit tae uisers in {{PLURAL:$2|the group|ane o the groups}}: $1.',
-'versionrequired' => 'Version $1 of MediaWiki requirit',
+'versionrequired' => 'Version $1 o MediaWiki needit',
'versionrequiredtext' => 'Version $1 o MediaWiki is requirit tae uise this page. Tak a keek at the [[Special:Version|version page]].',
'ok' => 'Okay',
'newmessageslinkplural' => '{{PLURAL:$1|ae new message|999=new messages}}',
'newmessagesdifflinkplural' => 'last {{PLURAL:$1|chynge|999=chynges}}',
'youhavenewmessagesmulti' => 'Ye hae new messages oan $1',
-'editsection' => 'edit',
-'editold' => 'edit',
+'editsection' => 'eedit',
+'editold' => 'eedit',
'viewsourceold' => 'ken soorce',
-'editlink' => 'edit',
+'editlink' => 'eedit',
'viewsourcelink' => 'view soorce',
-'editsectionhint' => 'Edit section: $1',
+'editsectionhint' => 'Eedit section: $1',
'toc' => 'Table o contents',
'showtoc' => 'shaw',
'hidetoc' => 'scouk',
'collapsible-expand' => 'Mak mair muckle',
'thisisdeleted' => 'View or cower $1?',
'viewdeleted' => 'View $1?',
-'restorelink' => '{{PLURAL:$1|ane deletit edit|$1 deletit edits}}',
+'restorelink' => '{{PLURAL:$1|yin delytit eidit|$1 delytit eidits}}',
'feedlinks' => 'Feed:',
'feed-invalid' => "This feeds subscrieve's teep isnae habile.",
'feed-unavailable' => 'Syndication feeds isna available',
Ye micht hae mistyped the URL, or follaed a wrang link
This micht forby be caused by a bug in the saftware uised by {{SITENAME}}.",
'nosuchspecialpage' => 'Nae sic byordinar page',
-'nospecialpagetext' => '<strong>Ye hae requestit an invalid byordinar page.</strong>
+'nospecialpagetext' => '<strong>Ye hae requestit aen onvalid byordinar page.</strong>
-A leet o valid byordinar pages can be funnd at [[Special:SpecialPages|{{int:specialpages}}]].',
+A leet o valid byordinar pages can be foond at [[Special:SpecialPages|{{int:specialpages}}]].',
# General errors
'error' => 'Mistak',
'databaseerror-query' => 'Speirin: $1',
'databaseerror-function' => 'Function: $1',
'databaseerror-error' => 'Mistake: $1',
-'laggedslavemode' => '<strong>Wairnin:</strong> Page micht no contain recent updates',
+'laggedslavemode' => '<strong>Warnishment:</strong> Page micht naw contain recent updates',
'readonly' => 'Database lockit',
'enterlockreason' => "Enter ae raeson fer the lock, inclædin aen estimate o whan the lock'll be lowsed",
-'readonlytext' => "The databae is lockit tae new entries an ither modifeecations the nou,
-likely for routine database maintenance; efter that it'll be back tae normal.
-The adminstration that lockit it gied this explanation:
-$1",
+'readonlytext' => "The databae is lockit tae new entries n ither modifeecations the nou,
+likelie fer routine database maintenance; efter that it'll be back til normal.
+The admeenstration that lockit it gied this explanation: $1",
'missing-article' => 'The database didna fynd the tex o ae page that it shid hae foond, cawed "$1" $2.
-Maistly this is caused bi follaein aen ootdated diff or histerie link til ae page that haes been delytit.
+Maistlie this is caused bi follaein aen ootdated diff or histerie link til ae page that haes been delytit.
Gif this isna the case, ye micht hae foond ae bug in the saffware.
-Please lat aen [[Special:ListUsers/sysop|admeenistrater]] ken aboot this, makin note o the URL.',
+Please lat aen [[Special:ListUsers/sysop|admeenistrater]] ken aneat this, makin note o the URL.',
'missingarticle-rev' => '(reveesion#: $1)',
'missingarticle-diff' => '(Diff: $1, $2)',
'readonly_lag' => 'The database haes been autaematically lockit while the sclave database servers catch up tae the maister',
'internalerror_info' => 'Internal mistak: $1',
'fileappenderrorread' => 'Coudna read "$1" durin append.',
'fileappenderror' => 'Coudna append "$1" til "$2".',
-'filecopyerror' => 'Cuidna copy file "$1" tae "$2".',
-'filerenameerror' => 'Cuidna rename file "$1" tae "$2".',
-'filedeleteerror' => 'Cuidna delete file "$1".',
+'filecopyerror' => 'Cuidna copie file "$1" til "$2".',
+'filerenameerror' => 'Cuidna rename file "$1" til "$2".',
+'filedeleteerror' => 'Cuidna delyte file "$1".',
'directorycreateerror' => 'Culdnae mak directory "$1".',
'filenotfound' => 'Cuidna fin file "$1".',
'fileexistserror' => 'Culdnae write tae file "$1": file is already here',
'unexpected' => 'Vailyie isnae expectit: "$1"="$2".',
'formerror' => 'Mistak: cuidna haun in form',
'badarticleerror' => 'This action canna be duin tae this page.',
-'cannotdelete' => 'The page or file "$1" coudna be deletit.
-It micht awreadie hae been deletit bi some ither bodie.',
-'cannotdelete-title' => 'Cannae delete page "$1"',
-'delete-hook-aborted' => 'Deletion abortit bi huik.
-It gae no explanâtion.',
+'cannotdelete' => 'The page or file "$1" coudna be delytit.
+It micht awreadie hae been delytit bi some ither bodie.',
+'cannotdelete-title' => 'Canna delyte page "$1"',
+'delete-hook-aborted' => 'Delytion stappit bi huik.
+It gae nae explanâtion.',
'no-null-revision' => 'Coudna mak new null reveesion fer page "$1"',
'badtitle' => 'Bad teitle',
'badtitletext' => 'The requestit page teitle wis invalid, tuim, or a wranglie airtit inter-leid or inter-wiki teitle. It mibbe haes ane or mair chairacters that canna be uised in teitles.',
-'perfcached' => 'The follaeing data is cached an michtna be richt up til date. A maximum o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.',
-'perfcachedts' => 'The followin data is cached, an wis hindermaist updated $1. Ae maximum o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.',
+'perfcached' => 'The follaein data is cached n michtna be richt up til date. Ae maist muckle o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.',
+'perfcachedts' => 'The follaein data is cached, n wis hindermaist updated $1. Ae maist muckkle o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.',
'querypage-no-updates' => 'Updates for this page ar disablit at the meenit. Data here wilnae be refreshit at the meenit.',
'viewsource' => 'View soorce',
'viewsource-title' => 'View soorce fer $1',
'actionthrottled' => 'Action devalit',
-'actionthrottledtext' => 'As an anti-spam meisur, ye ar limitit frae daein this action ower mony times in a ower short tid, an ye hae exceedit this limit. Please try again in a wee.',
-'protectedpagetext' => 'This page haes been protected fer tae prevent eiditing or ither actions.',
-'viewsourcetext' => 'Ye can leuk at an copy the soorce o this page:',
-'viewyourtext' => 'Ye can view an copy the source o <strong>yer eidits</strong> til this page:',
-'protectedinterface' => 'This page provides interface tex fer the saffware oan this wiki, n is protected fer tae prevent abuise.
-Tae add or chynge owersets fer aw wikis, please uise [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
-'editinginterface' => "<strong>Wairnin:</strong> Ye'r editing ae page that is uised tae provide interface tex fer the saftware.
-Chynges tae this page will affect the appearance o the uiser interface fer ither uisers on this wiki.
+'actionthrottledtext' => "Aes aen anti-spam meisur, ye'r limitit fae daein this action ower monie times in aen ower short time, n ye'v exceedit this limit. Please try again in ae few minutes.",
+'protectedpagetext' => 'This page haes been protected fer tae hider eeditin or ither actions.',
+'viewsourcetext' => 'Ye can leuk at n copie the soorce o this page:',
+'viewyourtext' => 'Ye can see n copie the soorce o <strong>yer eedits</strong> til this page:',
+'protectedinterface' => 'This page provides interface tex fer the saffware oan this wiki, n is protected fer tae hinder abuise.
+Tae add or chynge owersets fer aw wikis, please uise [//translatewiki.net/ translatewiki.net], the MediaWiki localisation waurk.',
+'editinginterface' => "<strong>Warnishment:</strong> Ye'r eiditing ae page that is uised tae provide interface tex fer the saffware.
+Chynges til this page will affect the appearance o the uiser interface fer ither uisers oan this wiki.
Tae add or chynge owersets fer aw wikis, please uise [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-'cascadeprotected' => 'This page haes been protectit fae editin, cause it is includit in the follaein {{PLURAL:$1|page|pages}}, that ar protectit wi the "cascadin" option turned on:
+'cascadeprotected' => 'This page haes been protectit fae eiditin, cause it is inclædit in the follaein {{PLURAL:$1|page|pages}}, that ar protectit wi the "cascadin" optie turnit oan:
$2',
'namespaceprotected' => "Ye dinna hae permeession tae edit pages in the '''$1''' namespace.",
'customcssprotected' => "Ye dinna hae permeession tae eidit this CSS page cause it contains anither uiser's personal settings.",
'myprivateinfoprotected' => 'Ye dinna hae permeession tae eidit yer private information.',
'mypreferencesprotected' => 'Ye dinna hae permeession tae eidit yer preferences.',
'ns-specialprotected' => 'Byordinar pages canna be editit.',
-'titleprotected' => "This teetle haes been protectit frae bein makkit by [[User:$1|$1]].
-The grunds for this are: ''$2''.",
+'titleprotected' => "This teetle haes been protectit fae bein makit bi [[User:$1|$1]].
+The groonds fer this ar: ''$2''.",
'filereadonlyerror' => 'Canna modify the file "$1" cause the file repository "$2" is in read-yinly mode.
The administrater that lock\'t it affered this explanation: "$3".',
-'invalidtitle-knownnamespace' => 'Onvalid title wi namespace "$2" an tex "$3"',
-'invalidtitle-unknownnamespace' => 'Onvalid title wi onken\'t namespace nummer $1 an tex "$2"',
+'invalidtitle-knownnamespace' => 'Onvalit title wi namespace "$2" n tex "$3"',
+'invalidtitle-unknownnamespace' => 'Onvalit title wi onkent namespace nummer $1 n tex "$2"',
'exception-nologin' => 'No loggit in',
'exception-nologin-text' => 'Please [[Special:Userlogin|log in]] tae be able tae access this page or action.',
'exception-nologin-text-manual' => 'Please $1 tae be able tae access this page or action.',
# Login and logout pages
'logouttext' => "<strong>Ye'r nou loggit oot.</strong>
-Note that some pages micht continue tae be displayed as gif ye were still loggit in, til ye clear yer brouser cache.",
-'welcomeuser' => 'Walcome, $1!',
-'welcomecreation-msg' => 'Yer accoont haes been creatit.
-Ye can chynge yer {{SITENAME}} [[Special:Preferences|preferences]] if ye lik.',
+Mynd that some pages micht continue tae be displeyed aes gif ye were still loggit in, til ye clear yer brouser cache.",
+'welcomeuser' => 'Weelcome, $1!',
+'welcomecreation-msg' => 'Yer accoont haes been cræftit.
+Ye can chynge yer {{SITENAME}} [[Special:Preferences|preeferences]] gif ye like.',
'yourname' => 'Yer uiser name',
'userlogin-yourname' => 'Uisername',
'userlogin-yourname-ph' => 'Enter yer uisername',
'createacct-another-username-ph' => 'Enter the uisername',
'yourpassword' => 'Passwird:',
-'userlogin-yourpassword' => 'Passwird.',
-'userlogin-yourpassword-ph' => 'Enter yer passwird',
-'createacct-yourpassword-ph' => 'Enter ae passwird',
+'userlogin-yourpassword' => 'Passwaird.',
+'userlogin-yourpassword-ph' => 'Enter yer passwaird',
+'createacct-yourpassword-ph' => 'Enter ae passwaird',
'yourpasswordagain' => 'Retype passwird:',
-'createacct-yourpasswordagain' => 'Confirm passwird.',
-'createacct-yourpasswordagain-ph' => 'Enter passwird again.',
-'remembermypassword' => 'Mynd ma login on this brouser (fer $1 {{PLURAL:$1|day|days}} at the maist)',
+'createacct-yourpasswordagain' => 'Confirm passwaird.',
+'createacct-yourpasswordagain-ph' => 'Enter passwaird again.',
+'remembermypassword' => 'Mynd ma login oan this brouser (fer $1 {{PLURAL:$1|day|days}} at the maist)',
'userlogin-remembermypassword' => 'Keep me loggit in',
'userlogin-signwithsecure' => 'Uise secure connection',
'yourdomainname' => 'Yer domain:',
'password-change-forbidden' => 'Ye canna chynge passwords oan this wiki.',
-'externaldberror' => "Aither the wis an external authenteication database mishanter, or ye'r no alloued tae update yer external accoont.",
+'externaldberror' => "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.",
'login' => 'Log in',
-'nav-login-createaccount' => 'Log in / mak an accoont',
+'nav-login-createaccount' => 'Log in / cræft aen accoont',
'loginprompt' => 'Ye maun hae cookies enabled tae log in tae {{SITENAME}}.',
-'userlogin' => 'Mak an accoont or log in',
+'userlogin' => 'Cræft aen accoont or log in',
'userloginnocreate' => 'Log in.',
'logout' => 'Log oot',
'userlogout' => 'Log oot',
-'notloggedin' => 'No loggit in',
+'notloggedin' => 'Naw loggit in',
'userlogin-noaccount' => 'Dinna hae aen accoont?',
'userlogin-joinproject' => 'Jyn {{SITENAME}}',
-'nologin' => "Dinna hae an accoont? '''$1'''.",
-'nologinlink' => 'Mak an accoont',
+'nologin' => 'Dinna hae aen accoont? $1.',
+'nologinlink' => 'Cræft aen accoont',
'createaccount' => 'Mak new accoont',
-'gotaccount' => "Got an accoont afore? '''$1'''.",
+'gotaccount' => 'Awreadie hae aen accoont? $1.',
'gotaccountlink' => 'Log in',
'userlogin-resetlink' => 'Forgotten yer login details?',
'userlogin-resetpassword-link' => 'Fergot yer password?',
'createacct-emailoptional' => 'Wab-mail address (optional)',
'createacct-email-ph' => 'Enter yer wab-mail address',
'createacct-another-email-ph' => 'Enter wab-mail address',
-'createaccountmail' => 'Uise ae temporarie random password an send it til the speceefied wab-mail address',
+'createaccountmail' => 'Uise ae temporarie random passwaird n send it til the speceefied wab-mail address',
'createacct-realname' => 'Real name (optional).',
'createaccountreason' => 'Raison:',
'createacct-reason' => 'Raison',
'createacct-imgcaptcha-ph' => 'Enter the tex ye see abuin',
'createacct-submit' => 'Mak yer accoont',
'createacct-another-submit' => 'Mak anither accoont',
-'createacct-benefit-heading' => '{{SITENAME}} is made bi fowk like ye.',
+'createacct-benefit-heading' => '{{SITENAME}} is makit bi fowk like ye.',
'createacct-benefit-body1' => '{{PLURAL:$1|eidit|eidits}}',
'createacct-benefit-body2' => '{{PLURAL:$1|page|pages}}.',
'createacct-benefit-body3' => 'recent {{PLURAL:$1|contreebuter|contreebuters}}',
'loginerror' => 'Login mishanter',
'createacct-error' => 'Accoont cræftin mistak',
'createaccounterror' => 'Coudna mak accoont: $1',
-'nocookiesnew' => "The uiser accoont wis creatit, but ye'r no loggit in. {{SITENAME}} uises cookies tae log uisers in. Ye hae cookies disabled. Please enable them, than log in wi yer new uisername and password.",
+'nocookiesnew' => "The uiser accoont wis cræftit, but ye'r naw loggit in. {{SITENAME}} uises cookies tae log uisers in. Ye hae cookies disabled. Please enable them, than log in wi yer new uisername n passwaird.",
'nocookieslogin' => '{{SITENAME}} uises cookies tae log in uisers. Ye hae cookies disabled. Please enable thaim an gie it anither shot.',
-'nocookiesfornew' => 'The uiser accoont wisna created, as we couda confirm its source.
-Ensure that ye have cookies enabled, relaid this page an try again.',
+'nocookiesfornew' => 'The uiser accoont wisna cræftit, aes we couda confirm its soorce.
+Ensure that ye have cookies enabled, relaid this page n gie it anither shote.',
'noname' => "Ye hivna specifee'd a valid uisername.",
'loginsuccesstitle' => 'Login fine',
'loginsuccess' => 'Ye\'re nou loggit in tae {{SITENAME}} as "$1".',
-'nosuchuser' => 'The\'r nae sic uiser as "$1".
-Uiser names are case-sensitive.
-Check yer spellin, or uise [[Special:UserLogin/signup|mak a new accoont]].',
+'nosuchuser' => 'Thaur\'s nae sic uiser aes "$1".
+Uiser names ar case-sensiteeve.
+Check yer speelin, or [[Special:UserLogin/signup|mak ae new accoont]].',
'nosuchusershort' => 'The\'r nae sic uiser as "$1". Check yer spellin.',
-'nouserspecified' => 'Ye hae tae merk up a uisername.',
-'login-userblocked' => 'Uiser "$1" is blockit. Log-in no alloued.',
+'nouserspecified' => 'Ye hae tae merk up ae uisername.',
+'login-userblocked' => 'Uiser "$1" is blockit. Log-in naw permitit.',
'wrongpassword' => 'The password ye entered is wrang. Please gie it anither shot.',
'wrongpasswordempty' => 'The password ye entered is blank. Please gie it anither shot.',
'passwordtooshort' => 'Yer password is ower short.
It maun hae at laest {{PLURAL:$1|1 chairacter|$1 chairacters}}.',
-'password-name-match' => 'Yer password maun be different fae yer uisername.',
-'password-login-forbidden' => 'The uise o this uisername an password haes been ferbidden.',
+'password-name-match' => 'Yer passwaird maun be different fae yer uisername.',
+'password-login-forbidden' => 'The uise o this uisername n passwaird haes been ferbidden.',
'mailmypassword' => 'Reset password',
'passwordremindertitle' => 'Password reminder frae {{SITENAME}}',
'passwordremindertext' => 'Somebodie (liklie ye, fae IP address $1) requested ae new
-password fer {{SITENAME}} ($4). Ae temporarie password fer uiser "$2" haes been creatit an wis set til "$3". Gif this wis yer intent, ye will need tae log in an chuise ae new password now.
-Yer temporarie password will expire in {{PLURAL:$5|one day|$5 days}}.
+passwaird fer {{SITENAME}} ($4). Ae temporarie passwaird fer uiser "$2" haes been cræftit n wis set til "$3". Gif this wis yer intent, ye will need tae log in n chuise ae new passwaird nou.
+Yer temporarie passwaird will expire in {{PLURAL:$5|yin day|$5 days}}.
-Gif somebodie else made this request, or gif ye hae mindit yer password, an ye nae langer wish tae chynge it, ye can ignore this message an continue uising yer auld password.',
+Gif some ither bodie makit this request, or gif ye hae myndit yer passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.',
'noemail' => 'Thaur\'s nae wab-mail address recordit fer uiser "$1".',
'noemailcreate' => 'Ye need tae provide ae valid wab-mail address.',
'passwordsent' => 'A new password haes been sent tae the e-mail address registert for "$1". Please log in again efter ye receive it.',
-'blocked-mailpassword' => 'Yer IP address is blockit frae editin, sae it
-canna uise the password recovery function, for tae prevent abuiss.',
+'blocked-mailpassword' => 'Yer IP address is blockit fae eeditin, sae it
+canna uise the passwaird recoverie function, for tae hinder abuiss.',
'eauthentsent' => "Ae confirmation wab-mail haes been sent til the speceefied wab-mail address.
Afore oni ither wab-mail is sent til the accoont, ye'll hae tae follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.",
'throttled-mailpassword' => 'Ae password reset wab-mail haes awreadie been sent, wiin the laist {{PLURAL:$1|hoor|$1 hoors}}.
Please enter ae weel-formattit address or mak that field tuim.',
'cannotchangeemail' => 'Accoont wab-mail addresses canna be chynged oan this wiki.',
'emaildisabled' => 'This site canna send wab-mails.',
-'accountcreated' => 'Accoont creatit',
+'accountcreated' => 'Accoont cræftit',
'accountcreatedtext' => 'The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.',
'createaccount-title' => 'Accoont makin for {{SITENAME}}',
'createaccount-text' => 'Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named "$2", wi passwaird "$3".
Ye can ignore this message, gif this accoont wis cræftit bi mistak.',
'usernamehasherror' => 'Uisername canna contain hash chairacters',
-'login-throttled' => "Ye'v made ower moni recent login attempts.
-Please wait $1 afore trying again.",
+'login-throttled' => "Ye'v makit ower monie recynt login attempts.
+Please wait $1 afore giein it anither gae.",
'login-abort-generic' => 'Yer login wisna successful - Aborted',
'loginlanguagelabel' => 'Leid: $1',
'suspicious-userlogout' => 'Yer request tae log oot wis denied cause it luiks like it wis sent bi ae broken brouser or caching proxy.',
'createacct-another-realname-tip' => 'Real name is aen optie.
Gif ye chuise tae provide it, this will be uised fer giein the uiser attreebution fer their wark.',
'pt-login' => 'Log in',
+'pt-login-button' => 'Log in',
'pt-createaccount' => 'Mak accoont',
'pt-userlogout' => 'Log oot',
# Change password dialog
'changepassword' => 'Chynge password',
-'resetpass_announce' => 'Tae finish loggin in, ye maun set ae new password.',
+'resetpass_announce' => 'Tae finish loggin in, ye maun set ae new passwaird.',
'resetpass_header' => 'Chynge accoont password',
-'oldpassword' => 'Auld password',
+'oldpassword' => 'Auld passwaird',
'newpassword' => 'New passwaird:',
'retypenew' => 'Retype new passwaird:',
-'resetpass_submit' => 'Mak passwaird an log in',
+'resetpass_submit' => 'Set passwaird n log in',
'changepassword-success' => 'Yer passwaird chynge wis braw!',
-'changepassword-throttled' => "Ye'v made ower moni recent login attempts.
-Please wait $1 afore trying again.",
+'changepassword-throttled' => "Ye'v makit ower monie recynt login attempts.
+Please wait $1 afore giein it anither gae.",
'resetpass_forbidden' => 'Passwords canna be chynged',
'resetpass-no-info' => 'Ye maun be loggit in tae access this page directly.',
'resetpass-submit-loggedin' => 'Chynge passwaird',
'passwordreset-emaildisabled' => 'Wab-mail features hae been disabled oan this wiki.',
'passwordreset-username' => 'Uisername:',
'passwordreset-capture' => 'View the resultin wab-mail?',
-'passwordreset-capture-help' => 'Gif ye check this kist, the wab-mail (wi the temperie passwaird) will be shawn til ye an be sent til the uiser ava.',
+'passwordreset-capture-help' => 'Gif ye check this kist, the wab-mail (wi the temperie passwaird) will be shawn til ye n be sent til the uiser ava.',
'passwordreset-email' => 'Wab-mail address:',
'passwordreset-emailtitle' => 'Accoont details oan {{SITENAME}}',
'passwordreset-emailtext-ip' => "Somebodie (likely ye, fae IP address $1) requested ae reset o yer passwaird fer {{SITENAME}} ($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}}
$2
-{{PLURAL:$3|This temperie passwaird|These temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
-Ye shid log in an chuise ae new passwaird nou. Gif some ither bodie made this request, or gif ye'v mynded yer oreeginal passwaird, an ye nae longer
-wish tae chynge it, ye can ignore this message an continue uising yer auld passwaird.",
+{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
+Ye shid log in n chuise ae new passwaird nou. Gif some ither bodie makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae longer
+wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
'passwordreset-emailtext-user' => "Uiser $1 oan {{SITENAME}} requested ae reset o yer passwaird fer {{SITENAME}}
($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}} associated wi this wab-mail address:
$2
-{{PLURAL:$3|This temperie passwaird|These temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
-Ye shid log in an chuise ae new password nou. Gif some ither bodie made this request, or gif ye'v mynded yer oreeginal passwaird, an ye nae longer wish tae chynge it, ye can ignore this message an continue uisin yer auld
-passwaird.",
+{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.
+Ye shid log in n chuise ae new password nou. Gif some ither bodie haes makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
'passwordreset-emailelement' => 'Uisername: $1
Temperie passwaird: $2',
'passwordreset-emailsent' => 'Ae passwaird reset wab-mail haes been sent.',
'changeemail-password' => 'Yer {{SITENAME}} passwaird:',
'changeemail-submit' => 'Chynge wab-mail',
'changeemail-cancel' => 'Cancel.',
-'changeemail-throttled' => "Ye'v made ower moni recent login attempts.
-Please wait $1 afore trying again.",
+'changeemail-throttled' => "Ye'v makit ower monie recynt login attempts.
+Please wait $1 afore giein it anither gae.",
# Special:ResetTokens
'resettokens' => 'Reset tokens.',
'link_sample' => 'Airtin teitle',
'link_tip' => 'Internal airtin',
'extlink_sample' => 'http://www.example.com airtin teitle',
-'extlink_tip' => 'Airtin tae an outby steid (mynd the http:// prefix)',
+'extlink_tip' => 'External link (mynd the http:// prefix)',
'headline_sample' => 'Heidline tex',
'headline_tip' => 'Level 2 heidline',
'nowiki_sample' => 'Insert non-formattit tex here',
# Edit pages
'summary' => 'Ootline:',
'subject' => 'Subject/headline:',
-'minoredit' => 'This is ae smaa eidit',
+'minoredit' => 'This is ae smaa eedit',
'watchthis' => 'Leuk ower this page',
'savearticle' => 'Hain page',
'preview' => 'Scance',
'showpreview' => 'Scance ower',
'showlivepreview' => 'Live leuk ower',
'showdiff' => 'Shaw chynges',
-'anoneditwarning' => "<strong>Wairnin:</strong>Ye'r no loggit in. Yer IP address will be recordit in this page's edit history.",
-'anonpreviewwarning' => "<em>Ye'r no loggit in. hainin will record yer IP address in this page's eidit history.</em>",
-'missingsummary' => '<strong>Mynd:</strong> Ye\'v no gien aen eidit owerview. Gin ye dab oan "{{int:savearticle}}" again, yer eidit will be haint wioot ane.',
+'anoneditwarning' => "<strong>Warnishment:</strong>Ye'r naw loggit in. Yer IP address will be recordit in this page's eedit histerie.",
+'anonpreviewwarning' => "<em>Ye'r no loggit in. Hainin will record yer IP address in this page's eedit histerie.</em>",
+'missingsummary' => '<strong>Mynd:</strong> Ye\'v naw gien aen eedit owerview. Gif ye clap oan "{{int:savearticle}}" again, yer eedit will be haint wioot ane.',
'missingcommenttext' => 'Please enter a comment ablo.',
-'missingcommentheader' => '<strong>Mynd:</strong> Ye\'v no provided ae subject/heidline fer this comment.
-Gif ye clap "{{int:savearticle}}" again, yer eodit will be hained wioot yin.',
+'missingcommentheader' => '<strong>Mynd:</strong> Ye\'v na gien ae subject/heidline fer this comment.
+Gif ye clap "{{int:savearticle}}" again, yer eedit will be hained wioot yin.',
'summary-preview' => 'Ootline leuk ower:',
'subject-preview' => 'Subject/headline leuk ower:',
'blockedtitle' => 'Uiser is blockit',
* Expirie o block: $6
* Intended blockee: $7
-Ye can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistræter]] tae discuss the block.
-Ye canna uise the "wab-mail this uiser" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] an ye\'v no been blockit fae uising it.
-Your current IP address is $3, n the block ID is #$5.
-Please inclæde aw the abuin details in oni speirins ye mak.',
-'autoblockedtext' => 'Yer IP address haes been autæmaticly blockit cause it wis uised bi anither uiser, wha wis blockit bi $1.
-The raison gieen is:
+Ye can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistrater]] tae discuss the block.
+Ye canna uise the "wab-mail this uiser" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] n ye\'v naw been blockit fae uisin it.
+Yer current IP address is $3, n the block ID is #$5.
+Please incluide aw the abuin details in onie speirins that ye mak.',
+'autoblockedtext' => 'Yer IP address haes been autæmateeclie blockit cause it wis uised bi anither uiser that wis blockit bi $1.
+The raison gien is:
:<em>$2</em>
* Stairt o block: $8
-* Expiry o block: $6
+* Expirie o block: $6
* Intended blockee: $7
-Ye can contact $1 or yin o the ither [[{{MediaWiki:Grouppage-sysop}}|admeenistræters]] tae discuss the block.
+Ye can contact $1 or yin o the ither [[{{MediaWiki:Grouppage-sysop}}|admeenistraters]] tae discuss the block.
-Note that ye canna uise the "wab-mail this uiser" feature onless ye hae ae valid wab-mail address registered in yer [[Special:Preferences|uiser preferences]] an ye haena been blockit fae uising it.
+Mynd that ye canna uise the "wab-mail this uiser" feature onless ye hae ae valid wab-mail address registered in yer [[Special:Preferences|uiser preeferances]] n ye\'v na been blockit fae uisin it.
-Yer current IP address is $3, an the block ID is #$5.
-Please inclæde aw abuin details in oni speirins ye mak.',
+Yer current IP address is $3, n the block ID is #$5.
+Please incluid aw abuin details in onie speirins that ye mak.',
'blockednoreason' => 'nae grunds put',
-'whitelistedittext' => 'Ye hae tae $1 tae edit pages.',
-'confirmedittext' => 'Ye maun confirm yer e-mail address afore editin pages. Please set an validate yer e-mail address throu yer [[Special:Preferences|uiser settins]].',
+'whitelistedittext' => 'Pleas $1 tae eedit pages.',
+'confirmedittext' => 'Ye maun confirm yer wab-mail address afore eeditin pages. Please set n validate yer wab-mail address throogh yer [[Special:Preferences|uiser settins]].',
'nosuchsectiontitle' => 'Canna find section',
'nosuchsectiontext' => 'Ye tried tae eidit ae section that disna exist.
It micht hae been muived or delytit while ye were viewing the page.',
'loginreqtitle' => 'Login Requirit!',
'loginreqlink' => 'log in',
-'loginreqpagetext' => 'Ye maun $1 tae view ither pages.',
+'loginreqpagetext' => 'Please $1 tae see ither pages.',
'accmailtitle' => 'Passwaird sent.',
'accmailtext' => 'Ae randomly generated passwaird fer [[User talk:$1|$1]] haes been sent til $2. It can be chynged oan the <em>[[Special:ChangePassword|chynge passwaird]]</em> page upo loggin in.',
'newarticle' => '(New)',
'newarticletext' => "Ye'v follaed ae link til ae page that disna exist yet. Tae mak the page, stairt typin in the kist ablo (see the [[{{MediaWiki:Helppage}}|heelp page]] fer mair info). Gif ye'r here bi mistak, juist clap yer brouser's '''back''' button.",
'anontalkpagetext' => "----
-<em>This is the discussion page fer aen anonymous uiser wha's no makit aen accoont yet, or wha disna uise it.</em>
+<em>This is the discussion page fer aen anonymoos uiser that's naw cræftit aen accoont yet, or that disna uise it.</em>
We maun therefore uise the numerical IP address tae identifie him/her.
Sic aen IP address can be shaired bi several uisers.
-Gif ye'r aen anonymous uiser an feel that onrelevant comments hae been directed at ye, please [[Special:UserLogin/signup|mak aen accoont]] or [[Special:UserLogin|log in]] tae avoid future confusion wi ither anonymous uisers.",
+Gif ye'r aen anonymos uiser n feel that onreelavant comments hae been directed at ye, please [[Special:UserLogin/signup|cræft aen accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymoos uisers.",
'noarticletext' => 'Thaur\'s naw tex oan this page the nou.
Ye can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],
Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
'userpage-userdoesnotexist' => 'Uiser accoont "<nowiki>$1</nowiki>" hasnae been registerit. Please check gin ye wint tae mak or eidit this page.',
'userpage-userdoesnotexist-view' => 'Uiser accoont "$1" isna registered.',
-'blocked-notice-logextract' => 'This uiser is currently blockit.
-The latest block log entry is provided ablow fer reference:',
+'blocked-notice-logextract' => 'This uiser is nou blockit.
+The laitest block log entrie is gien ablo fer referance:',
'clearyourcache' => "<strong>Tak tent:</strong> Efter hainin, ye micht hae tae bipass yer brouser's cache tae see the chynges.
* <strong>Firefox / Safari:</strong> Haud <em>Shift</em> while clapin <em>Relaid</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> oan ae Mac)
* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)
Yer chynges hae no been hained yet!',
'continue-editing' => 'Gae til eiditing area',
'previewconflict' => 'This scance reflects the tex in the upper tex eiditin area like it will kythe gin ye chuise tae hain.',
-'session_fail_preview' => '<strong>Sairy! We culdnae process yer eidit acause o ae loss o term data.</strong>
-Please try again. Gin it disnae wairk still, try [[Secial:UserLogout|logging out]] an loggin in again.',
-'session_fail_preview_html' => "<strong>Sairrie! We coudna process yer eidit cause o ae loss o session data.</strong>
-
-<em>Cause {{SITENAME}} haes raw HTML enabled, the preview is skauk't aes ae precaution again JavaScript attacks.</em>
-
-<strong>Gif this is ae legeetimate eidit attempt, please try again.</strong>
-Gif it still disna wairk, try [[Special:UserLogout|loggin oot]] an loggin back in.",
-'token_suffix_mismatch' => '<strong>Yer eidit haes been rejectit acause yer client made ae richt mess o the punctuation characters in the eidit token.</strong>
-The eidit haes been rejectit tae hinder corruption o the page tex.
-This whiles happens when ye ar uisin ae bruken web-based anonymous proxie service.',
-'edit_form_incomplete' => '<strong>Some pairts o the eidit form didna reach the server; dooble-check that yer eidits ar intact an try again.</strong>',
+'session_fail_preview' => "'''Sairy! We culdnae process yer eidit acause o ae loss o term data.'''
+Please gie it anither gae. Gin it disnae wairk still, gie [[Special:UserLogout|loggin oot]] n loggin back in again ae gae.",
+'session_fail_preview_html' => '<strong>Sairrie! We coudna process yer eedit cause o ae loss o session data.</strong>
+
+<em>Cause {{SITENAME}} haes raw HTML enabled, the owerluik is skaukt aes ae precaution again JavaScript attacks.</em>
+
+<strong>Gif this is ae legeetimate eedit attempt, please gei it anither gae.</strong>
+Gif it still disna wairk, try [[Special:UserLogout|loggin oot]] n loggin back in.',
+'token_suffix_mismatch' => "<strong>Yer eedit haes been rejectit cause yer client makit ae richt mess o the punctuation chairacters in the eedit token.</strong>
+The eedit haes been rejectit tae hinder rot o the page tex.
+This whiles happens when ye'r uisin ae broken wab-based anonymoos proxie service.",
+'edit_form_incomplete' => '<strong>Some pairts o the eedit form didna reach the server; dooble-check that yer edits ar intact n gie it anither gae.</strong>',
'editing' => 'Editin $1',
'creating' => 'Makin $1',
'editingsection' => 'Editin $1 (section)',
<strong>Juist</strong> the tex in the upper tex area will be hained whan ye press "{{int:savearticle}}".',
'yourtext' => 'Yer tex',
'storedversion' => 'Storit version',
-'nonunicodebrowser' => "'''Warnishment: Yer brouser isna unicode compliant. Ae warkaroond is in place tae permit ye tae sauflie eidit airticles: no-ASCII chairacters will kythe in the eidit kist aes hexadecimal codes.'''",
+'nonunicodebrowser' => '<strong>Warnishment: Yer brouser isna unicode compliant.</strong> Ae wairkaroond is in place tae permit ye tae sauflie eedit airticles: non-ASCII chairacters will kythe in the eedit kist aes hexadecimal codes.',
'editingold' => "<strong>Warnishment:</strong> Ye'r eiditin aen oot-o-date reveesion o this page. Gin ye hain it, onie chynges makit sin this reveesion will be lost.",
'yourdiff' => 'Differs',
-'copyrightwarning' => "Please mynd that aa contreebutions til {{SITENAME}} is conseedert tae be released unner the $2 (see $1 for details). Gin ye dinna want yer writin tae be eiditit wioot mercy an redistributed at will, than dinna haun it it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it frae ae public domain or siclike free resoorce. <strong>DINNA SUBMIT COPIERICHTIT WARK WIOOT PERMEESSION!</strong>",
-'copyrightwarning2' => "Please mynd that aa contreebutions til {{SITENAME}} micht be eiditit, chynged, or remuived bi ither contreebuters.
-Gin ye dinna want yer writin tae be eiditit wioot mercie an redistreebuted at will, than dinna haun it in here.<br />
-Ye'r promisin us forbye that ye wrat this yersel, or copied it frae ae
-public domain or siclike free resoorce (see $1 for details).
-<strong>DINNA HAUN IN COPIERICHTIT WARK WIOOT PERMEESSION!</strong>",
-'longpageerror' => "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, an this is langer nor the maximum o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>
+'copyrightwarning' => "Please mynd that aw contreebutions til {{SITENAME}} is conseedert tae be released unner the $2 (see $1 for details). Gif ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it fae ae publeec domain or siclike free resoorce. <strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
+'copyrightwarning2' => "Please mynd that aa contreebutions til {{SITENAME}} micht be eeditit, chynged, or remuived bi ither contreebuters.
+Gin ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it in here.<br />
+Ye'r promisin us forbye that ye wrat this yersel, or copied it fae ae
+publeec domain or siclike free resoorce (see $1 fer details).
+<strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
+'longpageerror' => "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, n this is langer than the maist muckle o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>
It canna be hained.",
-'readonlywarning' => "<strong>Warnishment: The database haes been lockit fer maintenance, sae ye'll no be able tae hain yer eidits richt nou.</strong>
-Ye micht wish tae cope n paste yer tex intil ae tex file an hain it fer later.
+'readonlywarning' => "<strong>Warnishment: The database haes been lockit fer maintenance, sae ye'll no be able tae hain yer eedits richt nou.</strong>
+Ye micht wish tae copie n paste yer tex intil ae tex file n hain it fer later.
The admeenistræter that lockit it affered this explanation: $1",
-'protectedpagewarning' => '<strong>Warnishment: This page haes been protectit sae that yinly uisers wi admeenistræter preevileges can eidit it.</strong>
-The latest log entrie is provided ablo fer reference:',
-'semiprotectedpagewarning' => '<strong>Note:</strong> This page haes been protected sae that yinly registered uisers can eidit it.
-The latest log entry is provided ablow fer reference:',
+'protectedpagewarning' => '<strong>Warnishment: This page haes been protectit sae that yinlie uisers wi admeenistrater preevileges can eedit it.</strong>
+The latest log entrie is gien ablo fer referance:',
+'semiprotectedpagewarning' => '<strong>Mynd:</strong> This page haes been protectit sae that yinlie registered uisers can eedit it.
+The latest log entrie is gien ablo fer referance:',
'cascadeprotectedwarning' => '<strong>Warnishment:</strong> This page haes been lockit sae that yinlie uisers wi admeenisræter richts can eidit it, acause it is inclædit in the follaein cascade-protectit {{PLURAL:$1|page|pages}}:',
-'titleprotectedwarning' => '<strong>Warnishment: This page haes been protected sae that [[Special:ListGroupRights|speecific richts]] ar needed tae mak it.</strong>
-The laitest log entry is provided ablo fer reference:',
+'titleprotectedwarning' => '<strong>Warnishment: This page haes been protectit sae that [[Special:ListGroupRights|speceefic richts]] ar needed tae cræft it.</strong>
+The laitest log entrie is gien ablo fer referance:',
'templatesused' => '{{PLURAL:$1|Template|Templates}} uised oan this page:',
'templatesusedpreview' => '{{PLURAL:$1|Template|Templates}} uised in this scænce-ower:',
'templatesusedsection' => '{{PLURAL:$1|Template|Templates}} uised in this section:',
'template-semiprotected' => '(semi-protectit)',
'hiddencategories' => "This page is ae member o {{PLURAL:$1|1 skauk't categerie|$1 skauk't categeries}}:",
'nocreatetext' => '{{SITENAME}} haes restricted the abeelitie tae cræft new pages.
-Ye can gae back an eidit aen existin page, or [[Special:UserLogin|log in or mak aen accoont]].',
+Ye can gang back n eedit aen exestin page, or [[Special:UserLogin|log in or cræft aen accoont]].',
'nocreate-loggedin' => 'Ye dinnae hae the richts tae mak new pages.',
'sectioneditnotsupported-title' => 'Section eiditin isna supported',
'sectioneditnotsupported-text' => 'Section eiditing isna supported in this page.',
'permissionserrors' => 'Permission mistak',
'permissionserrorstext' => 'Ye dinnae hae the richts tae dae that, acause o the followin {{PLURAL:$1|grund|grunds}}:',
'permissionserrorstext-withaction' => 'Ye dinna hae the richts tae $2, fer the follaein {{PLURAL:$1|raison|raisons}}:',
-'recreate-moveddeleted-warn' => "'''Warnishment: Ye'r remakin ae page that haes been delytit.'''
+'recreate-moveddeleted-warn' => "<strong>Warnishment: Ye'r recræftin ae page that haes been delytit.</strong>
-Ye shid check that it is guid tae keep eiditin this page.
-The delytion an muiv log fer this page is providit here:",
-'moveddeleted-notice' => 'This page haes bin delytit.
-The delytion an muiv log fer the page ar provided ablo fer reference.',
+Ye shid check that it is guid tae keep eeditin this page.
+The delytion n muiv log fer this page is providit here fer conveeniance:",
+'moveddeleted-notice' => 'This page haes been delytit.
+The delytion n muiv log fer the page ar gien ablo fer referance.',
'log-fulllog' => 'View ful log',
-'edit-hook-aborted' => 'Edit abortit bi huik.
+'edit-hook-aborted' => 'Eedit abortit bi huik.
It gae naw explanation.',
'edit-gone-missing' => 'Coudna update the page.
-It appears tae hae been deletit.',
-'edit-conflict' => 'Edit conflict.',
-'edit-no-change' => 'Yer edit wis ignored cause nae chynge wis made til the tex.',
-'postedit-confirmation' => 'Yer edit wis hained.',
+It appears tae hae been delytit.',
+'edit-conflict' => 'Eedit confleect.',
+'edit-no-change' => 'Yer eedit wis ignored cause nae chynge wis makit til the tex.',
+'postedit-confirmation' => 'Yer eedit wis hained.',
'edit-already-exists' => 'Coudna mak ae new page.
It awreadie exists.',
'defaultmessagetext' => 'Defaut message tex',
It shid hae less than $2 {{PLURAL:$2|caw|caws}}, thaur {{PLURAL:$1|is nou $1 caw|ar noo $1 caws}}.',
'expensive-parserfunction-category' => 'Pages wi ower moni expensive parser function caws',
-'post-expand-template-inclusion-warning' => "'''Wairnin:''' Template include size is tae lairge.
-Some templates wull nae be included.",
+'post-expand-template-inclusion-warning' => '<strong>Warnishment Template incluid size is owermuckle.
+Some templates will na be incluidit.',
'post-expand-template-inclusion-category' => 'Pages whaur template include size is exceeded',
-'post-expand-template-argument-warning' => 'Tak tent: This page hauds at least the ae template argument that haes an ower muckle expansion size.
+'post-expand-template-argument-warning' => '<strong>Warnishment:</strong> This page hauds at least the ae template argument that haes aen ower muckle expansion size.
Thir arguments hae been left oot.',
'post-expand-template-argument-category' => 'Pages containing omitted template arguments',
'parser-template-loop-warning' => 'Template luip detected: [[$1]]',
# "Undo" feature
'undo-success' => 'The eidit can be ondun. Please check the chynges albo tae check that this is whit ye wint tae dae, n than hain the chynges albo tae be duin ondaein the eidit.',
'undo-failure' => 'The edit culdnae be undone acause o conflictin edits inatween.',
-'undo-norev' => 'The edit coudna be ondone cause it disna exist or wis deletit.',
+'undo-norev' => 'The eedit coudna be ondun cause it disna exeest or wis delytit.',
'undo-nochange' => 'The edit appears tae hae awready been ondone.',
'undo-summary' => 'Ondae reveesion $1 bi [[Special:Contributions/$2|$2]] ([[User talk:$2|Tauk]])',
'undo-summary-username-hidden' => "Ondae reveesion $1 bi ae skauk't uiser",
# History pages
'viewpagelogs' => 'Leuk at logs fer this page',
-'nohistory' => 'Thare is no edit history fer this page.',
+'nohistory' => "Thaur's nae eedit histerie fer this page.",
'currentrev' => 'Current reveision',
'currentrev-asof' => 'Latest reveesion aes o $1',
'revisionasof' => 'Reveision as o $1',
'page_last' => 'hindermaist',
'histlegend' => 'Diff selection: Maurk the radio kists o the reveesions tae compare n hit enter or the button at the bottom.<br />
Legend: <strong>({{int:cur}})</strong> = differance wi laitest reveesion, <strong>({{int:last}})</strong> = differance wi preceedin reveesion, <strong>{{int:minoreditletter}}</strong> = smaa eidit.',
-'history-fieldset-title' => 'Browse history',
-'history-show-deleted' => 'Deletit only',
+'history-fieldset-title' => 'Brouse histerie',
+'history-show-deleted' => 'Delytit yinlie',
'histfirst' => 'auldest',
'histlast' => 'newest',
'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
Try [[Special:Search|rakin oan the wiki]] fer new pages ye micht be interestit in.',
# Revision deletion
-'rev-deleted-comment' => '(edit summarie remuived)',
+'rev-deleted-comment' => '(eidit summarie remuived)',
'rev-deleted-user' => '(uisername removit)',
'rev-deleted-event' => '(log action remuived)',
-'rev-deleted-user-contribs' => "[uisername or IP address remuived - edit skauk't frae contreebutions]",
+'rev-deleted-user-contribs' => "[uisername or IP address remuived - eidit skauk't fae contreebutions]",
'rev-deleted-text-permission' => 'This page reveesion haes been <strong>delytit</strong>.
Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
'rev-deleted-text-unhide' => 'This page reveesion haes been <strong>delytit</strong>.
Ye can view it; details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
'rev-deleted-no-diff' => 'Ye canna view this diff cause yin o the reveesions haes been <strong>delytit</strong>.
Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].',
-'rev-suppressed-no-diff' => 'Ye cannae view this diff cause yin o the revisions haes been <strong>deletit</strong>.',
+'rev-suppressed-no-diff' => 'Ye cannae see this diff cause yin o the reveesions haes been <strong>delytit</strong>.',
'rev-deleted-unhide-diff' => 'Yin o the reveesions o this diff haes been <strong>delytit</strong>.
Details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].
Ye can still [$1 view this diff] gif ye wish tae proceed.',
'rev-suppressed-unhide-diff' => 'Yin o the reveesions o this diff haes been <strong>suppressed</strong>.
Details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
Ye can still [$1 view this diff] gif ye wish tee proceed.',
-'rev-deleted-diff-view' => "Ane o the revisions o this diff haes been '''deletit'''.
-Ye can view this diff; details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-'rev-suppressed-diff-view' => 'Yin o the revisions o this diff haes been <strong>suppressed</strong>.
+'rev-deleted-diff-view' => "Ane o the reveesions o this diff haes been '''delytit'''.
+Ye can see this diff; details can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
+'rev-suppressed-diff-view' => 'Yin o the reveesions o this diff haes been <strong>suppressed</strong>.
Ye can view this diff; details can be foond in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
'rev-delundel' => 'chynge veesibility',
'rev-showdeleted' => 'shaw',
'revisiondelete' => 'Delyte/ondelyte reveesions',
'revdelete-nooldid-title' => 'Onvalid target reveesion',
-'revdelete-nooldid-text' => "Ye'v either no speceefied ae target reveesion(s) tae perform this function, the speceefied reveesion disna exeest, or ye'r attemptin tae skauk the current reveesion.",
+'revdelete-nooldid-text' => "Aither ye'v naw speceefied ae tairget reveesion(s) tae perform this function, the speceefied reveesion disna exeest, or ye'r attemptin tae skauk the Nou reveesion.",
'revdelete-no-file' => 'The file speecified disna exist.',
-'revdelete-show-file-confirm' => 'Ar ye sair ye wish tae view ae deletit reveesion o the file "<nowiki>$1</nowiki>" fae $2 at $3?',
-'revdelete-show-file-submit' => 'Aye',
+'revdelete-show-file-confirm' => 'Ar ye sair ye wish tae see ae delytit reveesion o the file "<nowiki>$1</nowiki>" fae $2 at $3?',
+'revdelete-show-file-submit' => 'Ai',
'revdelete-selected' => '<strong>{{PLURAL:$2|Selected reveesion|Selected reveesions}} o [[:$1]]:</strong>',
'logdelete-selected' => "'''{{PLURAL:$1|Selectit log event|Selectit log events}}:'''",
-'revdelete-text' => "<strong>Delytit reveesions an events will still kyth in the page histerie an logs, but pairts o their content will be onaccessible til the public.</strong>
-Ither admeenistraters oan {{SITENAME}} will still be able tae access the skauk't content an can ondelyte it again through this same interface, onless addeetional restreections ar set.",
-'revdelete-confirm' => "Please confirm that ye'r ettlin tae dae this, that ye unnerstaunn the consequences, an that ye'r daein this in accordance wi [[{{MediaWiki:Policy-url}}|the policie]].",
+'revdelete-confirm' => "Please confirm that ye'r ettlin tae dae this, that ye unnerstaunn the consequences, n that ye'r daein this in accordance wi [[{{MediaWiki:Policy-url}}|the policie]].",
'revdelete-suppress-text' => 'Suppression shid <strong>yinly</strong> be uised fer the follaein cases:
-* poteentially libeloos information
-* onappropriate personal information
-*: <em>hame addresses an telephane nummers, national ideentification nummers, etc.</em>',
+* poteentiallie libeloos information
+* galus personal information
+*: <em>hame addresses n telephane nummers, national ideentifeecation nummers, etc.</em>',
'revdelete-legend' => 'Set visibeelitie restreections',
'revdelete-hide-text' => 'Reveesion tex',
'revdelete-hide-image' => 'Skauk file content.',
-'revdelete-hide-name' => 'Skauk aiction an target',
-'revdelete-hide-comment' => 'Edit summarie',
-'revdelete-hide-user' => "Editor's uisername/IP address",
+'revdelete-hide-name' => 'Skauk aiction n tairget',
+'revdelete-hide-comment' => 'Eidit summarie',
+'revdelete-hide-user' => "Eiditer's uisername/IP address",
'revdelete-hide-restricted' => 'Suppress data fae admeenistraters aes weel aes ithers',
'revdelete-radio-same' => '(dinna chynge)',
'revdelete-radio-set' => "Skauk't",
'logdelete-failure' => '<strong>Log veesibddlitie coudna be set:</strong>
$1',
'revdel-restore' => 'change visibility',
-'pagehist' => 'Page history',
-'deletedhist' => 'Deletit histerie',
+'pagehist' => 'Page histerie',
+'deletedhist' => 'Delytit histerie',
'revdelete-hide-current' => "Mistak skaukin the eitem dated $2, $1: This is the current reveesion.
It cannna be skauk't.",
'revdelete-show-no-access' => 'Mistak shawin the eitem dated $2, $1: This eitem haes been maurked "restreected".
'revdelete-modify-no-access' => 'Mistak modifiein the eitem dated $2, $1: This eitem haes been maurked "restreected".
Ye dinna hae access til it.',
'revdelete-modify-missing' => 'Mistak modifiein item ID $1: It is missing fae the database!',
-'revdelete-no-change' => '<strong>Wairnin:</strong> The eitem dated $2, $1 awreadie haed the requested veesibeelitie settins.',
+'revdelete-no-change' => '<strong>Warnishment:</strong> The eetem dated $2, $1 awreadie haed the requested veesibeelitie settins.',
'revdelete-concurrent-change' => "Mistak modifiein the eitem dated $2, $1: Its status appears tae'v been chynged bi some ither bodie while ye attempted tae modifie it.
Please check the logs.",
-'revdelete-only-restricted' => 'Mistak hidin the item dated $2, $1: Ye canna suppress eitems fae view bi admeenistraters wioot selectin yin o the ither veesibeelitie opties ava.',
+'revdelete-only-restricted' => 'Mistak skaukin the eetem dated $2, $1: Ye canna suppress eetems fae sicht bi admeenistraters wioot selectin yin o the ither veesibeelitie opties ava.',
'revdelete-reason-dropdown' => '*Commyn delete raisons
** Copiericht violation
** Onappropriate comment or personal information
** Potentially libelous information',
'revdelete-otherreason' => 'Ither/addeetional raison:',
'revdelete-reasonotherlist' => 'Ither raison',
-'revdelete-edit-reasonlist' => 'Edit delete raisons',
+'revdelete-edit-reasonlist' => 'Eidit delyte raisons',
'revdelete-offender' => 'Reveesion author:',
# Suppression log
'mergehistory-box' => 'Merge reveesions o twa pages:',
'mergehistory-from' => 'Soorce page:',
'mergehistory-into' => 'Destinâtion page:',
-'mergehistory-list' => 'Mergeable edit history',
-'mergehistory-merge' => 'The follaein revisions o [[:$1]] can be merged intil [[:$2]].
-Uise the radio button column tae merge in yinly the reveesions maed at an afore the speecified time.
-Note that uising the navigâtion links will reset this column.',
-'mergehistory-go' => 'Shaw mergeable edits',
+'mergehistory-list' => 'Mergeable eidit histerie',
+'mergehistory-merge' => 'The follaein reveesions o [[:$1]] can be merged intil [[:$2]].
+Uise the radio button column tae merge in yinly the reveesions makit at n afore the speecified time.
+Mynd that uisin the navigâtion links will reset this column.',
+'mergehistory-go' => 'Shaw mergeable eidits',
'mergehistory-submit' => 'Merge reveesions',
'mergehistory-empty' => 'Naw reveesions can be merged.',
'mergehistory-success' => '$3 {{PLURAL:$3|reveesion|reveesions}} o [[:$1]] successfully merged intil [[:$2]].',
-'mergehistory-fail' => 'Onable tae perform histerie merge, please recheck the page an time parameters.',
+'mergehistory-fail' => 'Onable tae perform histerie merge, please recheck the page n time parameters.',
'mergehistory-no-source' => 'Source page $1 disna exist.',
'mergehistory-no-destination' => 'Destinâtion page $1 disna exist.',
'mergehistory-invalid-source' => 'Source page maun be ae valid title.',
'mergehistory-invalid-destination' => 'Destinâtion page maun be ae valid title.',
'mergehistory-autocomment' => 'Merged [[:$1]] intil [[:$2]]',
'mergehistory-comment' => 'Merged [[:$1]] intil [[:$2]]: $3',
-'mergehistory-same-destination' => 'Soorce an destinâtion pages canna be the same',
+'mergehistory-same-destination' => 'Soorce n destination pages canna be the same',
'mergehistory-reason' => 'Raeson:',
# Merge log
# Diffs
'history-title' => 'Reveesion histerie o "$1"',
-'difference-title' => 'Difference atween reveesions of "$1"',
-'difference-title-multipage' => 'Difference atween pages "$1" an "$2"',
+'difference-title' => 'Difference atween reveesions o "$1"',
+'difference-title-multipage' => 'Difference atween pages "$1" n "$2"',
'difference-multipage' => '(Difference atween pages)',
'lineno' => 'Line $1:',
'compareselectedversions' => 'Compare selectit versions',
'showhideselectedversions' => 'Chynge veesibeelitie o selected reveesions',
'editundo' => 'undo',
'diff-empty' => '(Naw difference)',
-'diff-multi-sameuser' => '({{PLURAL:$1|yin intermeediate reveesion|$1 intermeediate reveesions}} bi the same uiser no shawn)',
+'diff-multi-sameuser' => '({{PLURAL:$1|yin intermeediate reveesion|$1 intermeediate reveesions}} bi the same uiser naw shawn)',
'diff-multi-otherusers' => '({{PLURAL:$1|yin intermeediate reveesion|$1 intermeediate reveesions}} bi {{PLURAL:$2|yin ither uiser|$2 uisers}} no shawn)',
'diff-multi-manyusers' => '({{PLURAL:$1|Yin intermeediate reveesion|$1 intermeediate reveesions}} bi mair than $2 {{PLURAL:$2|uiser|uisers}} no shawn)',
'difference-missing-revision' => '{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|was|were}} no fond.
'shown-title' => 'Shaw $1 {{PLURAL:$1|ootcome|ootcomes}} per page',
'viewprevnext' => 'View ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''There is a page named \"[[:\$1]]\" oan this wiki.'''",
-'searchmenu-new' => '<strong>Mak the page "[[:$1]]" oan this wiki!</strong> {{PLURAL:$2|0=|See the page foond wi yer rake ava.|See the rake affcome foond ava.}}',
+'searchmenu-new' => '<strong>Cræft the page "[[:$1]]" oan this wiki!</strong> {{PLURAL:$2|0=|See the page foond wi yer rake ava.|See the rake affcome foond ava.}}',
'searchprofile-articles' => 'Content pages',
'searchprofile-project' => 'Heelp n Waurk pages',
'searchprofile-images' => 'Multimedia',
'search-result-size' => '$1 ({{PLURAL:$2|1 word|$2 words}})',
'search-result-category-size' => '{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})',
'search-result-score' => 'Relevanc: $1%',
-'search-redirect' => '(redirect $1)',
+'search-redirect' => '(reguide $1)',
'search-section' => '(section $1)',
'search-file-match' => '(matches file content.)',
'search-suggest' => 'Did ye mean: $1',
'search-interwiki-caption' => "Sister projec's",
-'search-interwiki-default' => "$1 results':",
+'search-interwiki-default' => 'Affcomes fae $1:',
'search-interwiki-more' => '(mair)',
'search-relatedarticle' => 'Relatit',
'searcheverything-enable' => 'Rake in aw namespaces',
'powersearch-togglelabel' => "Chec':",
'powersearch-toggleall' => 'Aw',
'powersearch-togglenone' => 'Nane',
-'search-external' => 'Freemit rake',
+'search-external' => 'Eixternal rake',
'searchdisabled' => 'Rakin throu {{SITENAME}} is disabled for performance raesons. Ye can rake via Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.',
'search-error' => 'Ae mistak haes occurred while rakin: $1',
# Preferences page
'preferences' => 'Ma preferences',
'mypreferences' => 'Ma preferences',
-'prefs-edits' => 'Nummer o edits:',
+'prefs-edits' => 'Nummer o eidits:',
'prefsnologintext2' => 'Please $1 tae chynge yer preferences.',
'prefs-skin' => 'Huil',
'skin-preview' => 'First Leuk',
'datedefault' => 'Nae preference',
'prefs-beta' => 'Beta features.',
-'prefs-datetime' => 'Date an time',
+'prefs-datetime' => 'Date n time',
'prefs-labs' => 'Labs featurs',
'prefs-user-pages' => 'Uiser pages',
'prefs-personal' => 'Uiser data',
-'prefs-rc' => 'Recent chynges an shawin stubs',
+'prefs-rc' => 'Recent chynges n shawin stubs',
'prefs-watchlist' => 'Watchleet',
'prefs-watchlist-days' => 'Days tae shaw in watchleet:',
'prefs-watchlist-days-max' => 'Mucklest $1 {{PLURAL:$1|day|days}}',
'prefs-misc' => 'Antrin settins',
'prefs-resetpass' => 'Chynge passwaird',
'prefs-changeemail' => 'Chynge email address',
+'prefs-setemail' => 'Set ae wab-mail address',
+'prefs-email' => 'Wab-mail opties',
+'prefs-rendering' => 'Appearence',
'saveprefs' => 'Hain preferences',
-'restoreprefs' => 'Restore aw default settings (in aw sections)',
+'restoreprefs' => 'Restore aw defaut settins (in aw sections)',
'prefs-editing' => 'Editin',
+'rows' => 'Raws:',
'searchresultshead' => 'Rake result settins',
'stub-threshold' => 'Threshold for <a href="#" class="stub">stub link</a> formattin (bytes):',
'stub-threshold-disabled' => 'Tuckie',
'recentchangesdays' => 'Days tae shaw in recent chynges:',
-'recentchangescount' => 'Nummer o edits tae shaw bi defaut:',
-'prefs-help-recentchangescount' => 'This includes recent chynges, page histories, an logs.',
+'recentchangesdays-max' => 'Mucklest $1 {{PLURAL:$1|day|days}}',
+'recentchangescount' => 'Nummer o eedits tae shaw bi defaut:',
+'prefs-help-recentchangescount' => 'This includes recent chynges, page histories, n logs.',
'prefs-help-watchlist-token2' => 'This is the hidlins key til the wab feed o yer watchleet. Onibodie wha kens this can read yer watchleet, sae dinna shair it. Gif ye need to, [[Special:ResetTokens|Ye can reset it]].',
'savedprefs' => 'Yer preferences haes been hained.',
'timezoneuseserverdefault' => 'Uise wiki default ($1)',
'guesstimezone' => 'Fill in frae brouser',
'timezoneregion-africa' => 'Africae',
'timezoneregion-america' => 'Americae',
+'timezoneregion-antarctica' => 'Antairctica',
+'timezoneregion-arctic' => 'Airctic',
'timezoneregion-asia' => 'Asie',
+'timezoneregion-atlantic' => 'Atlaunteec Ocean',
'timezoneregion-australia' => 'Australie',
+'timezoneregion-europe' => 'Europ',
'timezoneregion-pacific' => 'Paceefic Ocean',
'allowemail' => 'Allou email frae ither uisers',
'prefs-searchoptions' => 'Rake',
'prefs-common-css-js' => 'Shared CSS/JavaScript for aw skins:',
'prefs-reset-intro' => 'Ye can uise this page tae reset yer preferences tae the steid defaults.
This cannae be unduin.',
+'prefs-emailconfirm-label' => 'Wab-mail confirmation:',
'youremail' => 'Yer email:',
'username' => '{{GENDER:$1|Uisername}}:',
'uid' => '{{GENDER:$1|Uiser}} ID:',
'prefs-memberingroups' => '{{GENDER:$2|Member}} o {{PLURAL:$1|group|groups}}:',
+'prefs-registration' => 'Regeestration time:',
'yourrealname' => 'Yer real name:',
'yourlanguage' => 'Interface leid:',
'yourvariant' => 'Content leid variant',
-'prefs-help-variant' => 'Yer preferred variant or orthography tae display the content pages o this wiki in.',
+'prefs-help-variant' => 'Yer preferred variant or orthographie tae displey the content pages o this wiki in.',
'yournick' => 'New seegnatur:',
'prefs-help-signature' => 'Comments on collogue pages should be signed wi "<nowiki>~~~~</nowiki>", which will be convertit intae yer signatur an a timestamp.',
'badsig' => 'Raw signature nae guid; check HTML tags.',
'badsiglength' => 'Yer nickname is ower lang; it haes tae be $1 {{PLURAL:$1|character|characters}} or less.',
'yourgender' => 'Hou dae ye prefer tae be describit?',
-'gender-unknown' => 'I prefer nae tae say',
-'prefs-help-gender' => 'Settin this preference is optional.
-The saftware uises its value tae address ye an tae mention ye tae ithers uisin the appropriate grammatical gender.
-This information will be public.',
+'gender-unknown' => 'Ah prefer tae na say',
+'gender-male' => 'He eedits wiki pages',
+'gender-female' => 'She eedits wiki pages',
+'prefs-help-gender' => 'Settin this preference is aen optie.
+The saffware uises its value tae address ye n tae mention ye til ithers uisin the appropriate grammatical gender.
+This information will be publeec.',
'email' => 'E-mail',
-'prefs-help-realname' => 'Rael name is optional an gin ye chuise tae provide it this will be uised tae gie ye attreibution for yer wark.',
+'prefs-help-realname' => 'Real name is aen optie.
+Gif ye chuise tae provide it, this will be uised fer giein ye attreebution fer yer wark.',
'prefs-help-email' => 'Wab-mail is optional, bit is needed fer passwaird resets, shid ye ferget yer passwaird.',
'prefs-help-email-others' => 'Ye can chuise tae let ithers contact ye bi wab-mail through ae link oan yer uiser or tauk page.
Yer wab-mail address isna revealed whan ither uisers contact ye.',
'prefs-help-email-required' => 'Yer e-mail address is needit.',
'prefs-i18n' => 'Internaitionalisation',
'prefs-signature' => 'Signatur',
+'prefs-timeoffset' => 'Time affset',
+'prefs-advancedediting' => 'General opties',
+'prefs-editor' => 'Eediter',
+'prefs-preview' => 'Luikower',
+'prefs-advancedrc' => 'Advanced opties',
+'prefs-advancedrendering' => 'Advanced opties',
+'prefs-advancedsearchoptions' => 'Advanced opties',
+'prefs-advancedwatchlist' => 'Advanced opties',
+'prefs-displayrc' => 'Displey opties',
+'prefs-displaysearchoptions' => 'Displey opties',
+'prefs-displaywatchlist' => 'Displey opties',
'prefs-diffs' => 'Diffs',
'prefs-help-prefershttps' => 'This preference will tak effect on yer next login.',
+'prefs-tabs-navigation-hint' => 'Tip: Ye can uise the cair n richt arrae keys tae naveegate atween the tabs in the tabs leet.',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Wab-mail address appears tae be valid',
+'email-address-validity-invalid' => 'Enter ae valid wab-mail address',
# User rights
'userrights' => 'Uiser richts management',
'saveusergroups' => 'Save uiser groups',
'userrights-groupsmember' => 'Member o:',
'userrights-groupsmember-auto' => 'Implicit member o:',
-'userrights-groups-help' => 'You mey alter the groups this uiser is in:
-* A checked box means the uiser is in that group.
-* An unchecked box means the uiser is nae in that group.
-* A * indicates that ye cannae remove the group ance you hae addit it, or vice versa.',
+'userrights-groups-help' => "Ye can alter the groops this uiser is in:
+* Ae checkit kist means that the uiser is in that groop.
+* Aen oncheckit kist means that the uiser's no in that groop.
+* Ae * indicates that ye cannae remuiv the groop yince ye'v added it, or vice versa.",
+'userrights-reason' => 'Raison:',
'userrights-no-interwiki' => 'Ye dae nae hae permission tae edit uiser richts on ither wikis.',
'userrights-nodatabase' => 'Database $1 daes nae exist or is nae local.',
-'userrights-nologin' => 'Ye must [[Special:UserLogin|log in]] wi an admeenistrator accoont tae assign uiser richts.',
+'userrights-nologin' => 'Ye maun [[Special:UserLogin|log in]] wi aen admeenistrater accoont tae assign uiser richts.',
'userrights-notallowed' => 'Ye dae nae hae permission tae add or remove uiser richts.',
'userrights-changeable-col' => 'Groups ye can chynge',
'userrights-unchangeable-col' => 'Groups ye cannae chynge',
-'userrights-conflict' => 'Conflict o uiser richts chynges! Please review an confirm yer chynges.',
-'userrights-removed-self' => 'Ye successfully removed yer ain richts. As such, ye are no langer able tae access this page.',
+'userrights-conflict' => 'Conflict o uiser richts chynges! Please luikower n confirm yer chynges.',
+'userrights-removed-self' => "Ye'v successfulie remuived yer ain richts. N sae, ye'r naw langer able tae access this page.",
# Groups
+'group' => 'Groop:',
'group-user' => 'Uisers',
'group-autoconfirmed' => 'Autoconfirmed uisers',
'group-bot' => 'Bots',
'group-all' => '(aw)',
'group-user-member' => '{{GENDER:$1|uiser}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|autæconfirmed uiser}}',
'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|admeenistrater}}',
+'group-suppress-member' => '{{GENDER:$1|owersicht}}',
+
+'grouppage-user' => '{{ns:project}}:Uisers',
+'grouppage-autoconfirmed' => '{{ns:project}}:Autæconfirmed uisers',
+'grouppage-sysop' => '{{ns:project}}:Admeenistraters',
+'grouppage-suppress' => '{{ns:project}}:Owersicht',
# Rights
-'right-createpage' => 'Create pages (which are nae discussion pages)',
+'right-edit' => 'Eedit pages',
+'right-createpage' => 'Cræft pages (that arna tauk pages)',
+'right-createtalk' => 'Cræft discussion pages',
'right-createaccount' => 'Create new uiser accoonts',
'right-minoredit' => 'Mark edits as smaa',
-'right-move' => 'Flit pages',
-'right-move-subpages' => 'Flit pages wi thair subpages',
-'right-move-rootuserpages' => 'Flit ruit uiser pages',
-'right-movefile' => 'Flit files',
+'right-move' => 'Muiv pages',
+'right-move-subpages' => 'Muiv pages wi thair subpages',
+'right-move-rootuserpages' => 'Muiv ruit uiser pages',
+'right-movefile' => 'Muiv files',
'right-suppressredirect' => 'Nae create redirects frae soorce pages when flittin pages',
'right-upload' => 'Uplaid files',
'right-reupload' => 'Owerwrite existin files',
'right-upload_by_url' => 'Uplaid files frae a URL',
'right-purge' => 'Purge the steid cache for a page wioot confirmation',
'right-autoconfirmed' => 'Nae be affectit bi IP-based rate leemits',
-'right-bot' => 'Be treatit as an automatit process',
+'right-bot' => 'Be treatit aes aen autæmatit process',
'right-nominornewtalk' => 'Nae hae smaa edits tae discussion pages trigger the new messages prompt',
'right-apihighlimits' => 'Uise heicher leemits in API queries',
'right-writeapi' => 'Uise o the write API',
-'right-delete' => 'Delete pages',
-'right-bigdelete' => 'Delete pages wi lairge histories',
-'right-deletelogentry' => 'Delete an undelete specific log entries',
-'right-deleterevision' => 'Delete an undelete specific reveesions o pages',
-'right-deletedhistory' => 'View deletit history entries, wioot thair associatit text',
-'right-deletedtext' => 'View deletit text an chynges atween deletit reveesions',
-'right-browsearchive' => 'Rake deletit pages',
+'right-delete' => 'Delyte pages',
+'right-bigdelete' => 'Delyte pages wi muckle histeries',
+'right-deletelogentry' => 'Delyte n ondelyte speceefic log entries',
+'right-deleterevision' => 'Delyte n ondylete speceefic reveesions o pages',
+'right-deletedhistory' => 'See delytit histerie entries, wioot thair associatit tex',
+'right-deletedtext' => 'See delytit tex n chynges atween delytit reveesions',
+'right-browsearchive' => 'Rake delytit pages',
+'right-undelete' => 'Ondelyte ae page',
+'right-suppressrevision' => 'Luikower n restore reveesions skaukt fae admeenistraters',
+'right-suppressionlog' => 'see preevate logs',
+'right-block' => 'Block ither uisers fae eeditin',
+'right-blockemail' => 'Block ae uiser fae sendin wab-mail',
+'right-hideuser' => 'Block ae uisername, skaukin it fae the publeec',
+'right-ipblock-exempt' => 'Bypass IP blocks, autae-blocks range blocks',
+'right-proxyunbannable' => 'Bypass autaematic blocks o proxies',
+'right-unblockself' => 'Onblock yersel',
+'right-protect' => 'Chynge protection levels n eedit cascade-protected pages',
+'right-editprotected' => 'Eedit pages protected aes "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Eedit pages protected aes "{{int:protect-level-autoconfirmed}}"',
+'right-editinterface' => 'Eedit the uiser interface',
+'right-editusercssjs' => "Eedit ither uisers' CSS n JavaScript files",
+'right-editusercss' => "Eedit ither uisers' CSS files",
+'right-edituserjs' => "Eedit ither uisers' JavaScript files",
+'right-editmyusercss' => 'Eidit yer ain uiser CSS files',
+'right-editmyuserjs' => 'Eedit yer ain uiser JavaScript files',
+'right-viewmywatchlist' => 'See yer ain watchleet',
+'right-editmywatchlist' => 'Eedit yer ain watchleet. Myd that some actions will still add pages even wioot this richt.',
+'right-viewmyprivateinfo' => 'See yer ain preevate data (e.g. wab-mail address, real name)',
+'right-editmyprivateinfo' => 'Eedit yer ain preevate data (e.g. wab-mail address, real name)',
+'right-editmyoptions' => 'Eedit yer ain preeferences',
+'right-rollback' => 'Quicklie rowback the eedits o the laist uiser that eeditit ae parteecular page',
+'right-markbotedits' => 'Maurk rowed-back eedits aes bot eedits',
+'right-noratelimit' => 'No be affected bi rate limits',
+'right-import' => 'Import pages fae ither wikis',
+'right-importupload' => 'Import pages fae ae file uplaid',
+'right-patrol' => "Maurk ithers' eedits aes patrowed",
+'right-autopatrol' => "Hae ye'r ain eedits autaematiclie maurked aes patrowed",
+'right-patrolmarks' => 'See recent chynges patrol maurks',
+'right-unwatchedpages' => 'See ae leet o onwatched pages',
+'right-mergehistory' => 'Merge the histerie o pages',
+'right-userrights' => 'Eedit aw uiser richts',
+'right-userrights-interwiki' => 'Eedit the uiser richts o uisers oan ither wikis',
+'right-siteadmin' => 'Lock n lowse the database',
+'right-override-export-depth' => 'Export pages incluidin linked pages up til ae depth o 5',
+'right-sendemail' => 'Send Wab-mail til ither uisers',
+'right-passwordreset' => 'See passwaird reset wab-mails',
# Special:Log/newusers
'newuserlogpage' => 'Uiser cræftin log',
+'newuserlogpagetext' => 'This is ae log o uiser cræftins.',
# User rights log
'rightslog' => 'Uiser richts log',
'rightslogtext' => 'This is a log o chynges tae uiser richts.',
# Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'edit this page',
+'action-edit' => 'eedit this page',
+'action-createpage' => 'cræft pages',
+'action-createtalk' => 'cræft discussion pages',
+'action-createaccount' => 'cræft this uiser accoont',
+'action-minoredit' => 'maurk this eedit aes smaa',
+'action-move' => 'muiv this page',
+'action-move-subpages' => 'mui this page, n its subpages',
+'action-move-rootuserpages' => 'muiv ruit uiser pages',
+'action-movefile' => 'muiv this file',
+'action-upload' => 'uplaid this file',
+'action-reupload' => 'owerwrite this exeestin file',
+'action-reupload-shared' => 'owerride this file oan ae shaired reposeeterie',
+'action-upload_by_url' => 'uplaid this file fae ae URL',
+'action-writeapi' => 'uise the write API',
+'action-delete' => 'delyte this page',
+'action-deleterevision' => 'delyte this reveesion',
+'action-deletedhistory' => "see this page's delytit histerie",
+'action-browsearchive' => 'rake delytit pages',
+'action-undelete' => 'ondelyte this page',
+'action-suppressrevision' => 'luikower n restore this skaukt reveesion',
+'action-suppressionlog' => 'see this preevate log',
+'action-block' => 'block this uiser fae eeditin',
+'action-protect' => 'chynge protection levels fer this page',
+'action-rollback' => 'quicklie rowback the eedits o the laist uiser that eeditit ae parteecular page',
+'action-import' => 'import pages fae anither wiki',
+'action-importupload' => 'import pages fae ae file uplaid',
+'action-patrol' => "maurk ithers' eedits aes patrowed",
+'action-autopatrol' => 'hae yer eedit maurked aes patrowed',
+'action-unwatchedpages' => 'see the leet o onwatched pages',
+'action-mergehistory' => 'merge the histerie o this page',
+'action-userrights' => 'eedit aw uiser richts',
+'action-userrights-interwiki' => 'eedit the uiser richts o uisers oan ither wikis',
+'action-siteadmin' => 'lock or lowse the database',
+'action-sendemail' => 'send wab-mails',
+'action-editmywatchlist' => 'eedit yer watchleet',
+'action-viewmywatchlist' => 'see yer watchleet',
+'action-viewmyprivateinfo' => 'see yer preevate information',
+'action-editmyprivateinfo' => 'eedit yer preevate information',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|chynge|chynges}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sin laist veesit}}',
+'enhancedrc-history' => 'histeri',
'recentchanges' => 'Recent chynges',
-'recentchanges-legend' => 'Recent changes options',
+'recentchanges-legend' => 'Recynt chynges opties',
'recentchanges-summary' => 'Follae the maist recent chynges tae the wiki on this page.',
+'recentchanges-noresult' => 'Naw chynges durin the gien period matchin thir guidins.',
'recentchanges-feed-description' => 'Follae the maist recent chynges tae the wiki in this feed.',
'recentchanges-label-newpage' => 'This edit created a freish page',
-'recentchanges-label-minor' => 'This is a smaa edit',
+'recentchanges-label-minor' => 'This is ae smaa eedit',
'recentchanges-label-bot' => 'This edit wis performed bi a bot',
'recentchanges-label-unpatrolled' => 'This edit haes nae yet bin patrolled',
+'recentchanges-label-plusminus' => 'The page size chynged bi this nummer o bytes',
+'recentchanges-legend-newpage' => '(see [[Special:NewPages|leet o new pages]] ava)',
'rcnotefrom' => 'Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).',
'rclistfrom' => 'Shaw new chynges stertin frae $1',
'rcshowhideminor' => '$1 smaa edits',
'newpageletter' => 'N',
'boteditletter' => 'b',
'number_of_watching_users_pageview' => '[$1 watchin {{PLURAL:$1|uiser|uisers}}]',
+'rc_categories' => 'Limit til categeries (separate wi "|")',
'rc_categories_any' => 'Ony',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} efter chynge',
'rc-enhanced-expand' => 'Shaw details',
'rc-enhanced-hide' => 'Skauk details',
+'rc-old-title' => 'oreeginlie cræftit aes "$1"',
# Recent changes linked
'recentchangeslinked' => 'Relatit chynges',
# Upload
'upload' => 'Uplaid file',
'uploadbtn' => 'Uplaid file',
-'reuploaddesc' => 'Gang back tae the uplaid form.',
+'reuploaddesc' => 'Gang back til the uplaid form.',
+'upload-tryagain' => 'Haunn in modified file descreeption',
'uploadnologin' => 'Nae loggit in',
'uploadnologintext' => 'Please $1 tae uplaid files.',
+'upload_directory_missing' => 'The uplaid directerie ($1) is missin n coudna be cræftit bi the wabserver.',
+'upload_directory_read_only' => 'The uplaid directerie ($1) is naw writable bi the wabserver.',
'uploaderror' => 'Uplaid mistak',
+'upload-recreate-warning' => "'''Warnishment: Ae file bi that name haes been delytit or muived.'''
+
+The delytion n muiv log fer this page ar gien here fer conveeneeance:",
'uploadtext' => 'Uise the form ablo tae uplaid files.
-Tae view or rake previooslei uplaided files gang til the [[Special:FileList|leet o uplaided files]], (re)uplaids ar loggit in the [[Special:Log/upload|uplaid log]] ava, delytions in the [[Special:Log/delete|delytion log]].
+Tae see or rake preeveeooslie uplaided files gang til the [[Special:FileList|leet o uplaided files]], (re)uplaids ar loggit in the [[Special:Log/upload|uplaid log]] ava, delytions in the [[Special:Log/delete|delytion log]].
-Tae inclæde ae file in ae page, uise ae link in yin o the follaein forms:
+Tae incluid ae file in ae page, uise ae link in yin o the follaein forms:
* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tae uise the ful version o the file
-* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> tae uise ae 200 pixel wide rendition in ae kist in the cair margin wi "alt tex" aes descreeption
-* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> fer linkin directlie til the file wioot displeyin the file',
+* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt tex]]</nowiki></code></strong> tae uise ae 200 pixel wide rendeetion in ae kist in the cair margin wi "alt tex" aes descreeption
+* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> fer linkin directlie til the file wioot displeyin the file.',
+'upload-permitted' => 'Permitit file types: $1.',
+'upload-prohibited' => 'Proheebited file types: $1.',
'uploadlog' => 'uplaid log',
'uploadlogpage' => 'Uplaid log',
'uploadlogpagetext' => 'Ablo is a leet o the maist recent file uplaids.',
'filedesc' => 'Ootline',
+'fileuploadsummary' => 'Ootline:',
+'filereuploadsummary' => 'File chynges:',
'filestatus' => 'Copyricht status:',
'filesource' => 'Soorce:',
'uploadedfiles' => 'Uplaidit files',
-'ignorewarning' => 'Ignore wairnin n hain file oniewey.',
+'ignorewarning' => 'Ignore warnishment n hain file oniewey.',
'ignorewarnings' => 'Ignore ony warnins',
-'illegalfilename' => 'The filename "$1" haes characters that isna alloud in page teitles. Please rename the file an gie uplaidin it anither shot.',
-'badfilename' => 'Eimage name haes been chynged tae "$1".',
+'minlength1' => 'Filenames maun be at least yin letter.',
+'illegalfilename' => 'The filename "$1" haes chairacters that\'s naw permitit in page teitles. Please rename the file n gie uplaidin it anither shote.',
+'filename-toolong' => 'Filenames canna be langer than 240 bytes.',
+'badfilename' => 'Filename haes been chynged til "$1".',
+'filetype-mime-mismatch' => 'File exteension ".$1" disna match the detected MIME type o the file ($2).',
+'filetype-badmime' => 'Files o the MIME type "$1" ar no permitit tae be uplaided.',
+'filetype-bad-ie-mime' => 'Canna uplaid this file cause Internet Explorer wid detect it aes "$1", n this is ae non-permitit n potentiallie dangeroos file type.',
+'filetype-unwanted-type' => "'''\".\$1\"''' is aen onwanted file type.
+Preferred {{PLURAL:\$3|file type is|file types ar}} \$2.",
+'filetype-banned-type' => '<strong>".$1"</strong> {{PLURAL:$4|is naw ae permitted file type|ar naw permitted file types}}.
+Permitted {{PLURAL:$3|file type is|file types ar}} $2.',
+'filetype-missing' => 'The file haes nae extension (like ".jpg").',
+'empty-file' => 'The file that ye haunned in wiss tuim.',
+'file-too-large' => 'The file that ye haunned in wis ower muckle.',
+'filename-tooshort' => 'The filename is ower short.',
+'filetype-banned' => 'This type o file is banned.',
+'verification-error' => 'This file didna pass file verifeecation.',
+'hookaborted' => 'The modifeecation that ye tried tae mak wis abortit bi aen exteension.',
+'illegal-filename' => 'The filename isna permitit.',
+'overwrite' => 'Owerwritin aen exeestin file isna permeetit.',
+'unknown-error' => 'Aen onkent mistake occurred.',
+'tmp-create-error' => 'Coudna cræft temperie file.',
+'tmp-write-error' => 'Mistak writin temperie file.',
+'large-file' => "It's recommended that files ar nae muckler than $1;
+this file is $2.",
'largefileserver' => 'This file is bigger nor the server is confeigurt tae allou.',
-'fileexists' => "A file wi this name exists aareadies, please check <strong>[[:$1]]</strong> gin ye'r no siccar that ye want tae chynge it.
+'emptyfile' => 'The file that ye uplaided seems tae be tuim.
+This micht be cause o ae typeower in the filename.
+Please check whether ye reallie want tae uplaid this file.',
+'windows-nonascii-filename' => 'This wiki disna support filenames wi speecial chairacters.',
+'fileexists' => "Ae file wi this name exeests aareadies, please check <strong>[[:$1]]</strong> gif ye'r no sair that ye want tae chynge it.
+[[$1|thumb]]",
+'filepageexists' => "The descreeption page fer this file haes awreadie been cræftit at <strong>[[:$1]]</strong>, but naw file wi this name exeests the nou.
+The ootline that ye enter willna kith oan the descreeption page.
+Tae mak yer ootlline kith there, ye'll need tae manuallie eedit it.
[[$1|thumb]]",
-'fileexists-forbidden' => 'Ae file wi this name awreadie exists, an canna be owerwritten.
-Gif ye still wish tae uplaid yer file, please gae back an uise ae new name.
+'fileexists-extension' => 'Ae file wi ae siclike name exeests: [[$2|thumb]]
+* Name o the uplaidin file: <strong>[[:$1]]</strong>
+* Name o the exeestin file: <strong>[[:$2]]</strong>
+Please chuise ae different name.',
+'fileexists-thumbnail-yes' => "The file seems tae be aen eemage o reduced size ''(thumbnail)''.
+[[$1|thumb]]
+Please check the file <strong>[[:$1]]</strong>.
+Gif the checked file is the same eemage o oreeginal size it's no necessairie tae uplaid aen extra thumbnail.",
+'file-thumbnail-no' => "The filename begins wi <strong>$1</strong>.
+It seems tae be aen eemage o reduced size ''(thumbnail)''.
+Gif ye hae this emage in ful resolution uplaid this yin, itherwise please chynge the filename.",
+'fileexists-forbidden' => 'Ae file wi this name awreadie exists, n canna be owerwritten.
+Gif ye still wish tae uplaid yer file, please gang back n uise ae new name.
[[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Ae file wi this name awreadie exists in the shaired file repository.
-Gif ye still wish tae uplaid yer file, please gae back an uise ae new name.
+'fileexists-shared-forbidden' => 'Ae file wi this name awreadie exeests in the shaired file repositerie.
+Gif ye still wish tae uplaid yer file, please gang back n uise ae new name.
[[File:$1|thumb|center|$1]]',
-'uploadwarning' => 'Uplaid wairnin',
+'file-exists-duplicate' => 'This file is ae dupleecate o the follaein {{PLURAL:$1|file|files}}:',
+'file-deleted-duplicate' => "Ae file ideentical til this file ([[:$1]]) haes been delytit afore.
+Ye shid check that file's delytion histerie afore proceedin tae re-uplaid it.",
+'file-deleted-duplicate-notitle' => 'Ae file identeecal til this file haes been delytit afore, n the title haes been suppressed.
+Ye shid ask somebodie wi the abeelitie tae see suppressed file data tae luik at the seetuation afore gaun oan tae re-uplaid it.',
+'uploadwarning' => 'Uplaid warnishment',
+'uploadwarning-text' => 'Please modeefie the file descreeption ablo n gie it anither gae.',
'savefile' => 'Hain file',
'uploadedimage' => 'uplaidit "$1"',
+'overwroteimage' => 'uplaided ae new version o "[[$1]]"',
'uploaddisabled' => 'Sorry, uplaidin is disabled.',
+'copyuploaddisabled' => 'Uplaid bi URL disabled.',
+'uploadfromurl-queued' => 'Yer uplaid haes been pit in line.',
+'uploaddisabledtext' => 'File uplaids ar disabled.',
+'php-uploaddisabledtext' => 'File uplaids ar disabled in PHP.
+Please check the file_uploads settin.',
'uploadscripted' => 'This file hauds HTML or script code that micht be wrang interpretit bi a wab brouser.',
'uploadscriptednamespace' => 'This SVG file contains aen illegal namespace "$1"',
+'uploadinvalidxml' => 'The XML in the uplaided file coudna be parsed.',
'uploadvirus' => 'The file hauds a virus! Details: $1',
+'uploadjava' => 'The file is ae ZIP file that contains ae Java .class file.
+Uplaidin Java files isna permitit cause thay can cause secureetie restreections tae be bypassed.',
+'upload-source' => 'Soorce file',
'sourcefilename' => 'Soorce filename:',
+'sourceurl' => 'Soorce URL:',
+'destfilename' => 'Desteenation filename:',
+'upload-maxfilesize' => 'Mucklest file size: $1',
+'upload-description' => 'File descreeption',
+'upload-options' => 'Uplaid opties',
+'watchthisupload' => 'Watch this file.',
+'filewasdeleted' => 'Ae file o this name haes been preeveeooslie uplaided n than delytit.
+Ye shid check the $1 afore preceedin tae uplaid it again.',
+'filename-bad-prefix' => "The name o the file that ye'r uplaidin begins wi '''\"\$1\"''', this is ae no-descreepteeve name typiclie assigned autæmateeclie bi deegital cameras.
+Please chuise ae mai descreepteeve name fer yer file.",
+'upload-success-subj' => 'Successfu uplaid',
+'upload-success-msg' => "Yer uplaid fae [$2] wis successfu. It's available here: [[:{{ns:file}}:$1]]",
+'upload-failure-subj' => 'Uplaid problem',
+'upload-failure-msg' => 'Thaur wis ae problem wi yer uplaid fae [$2]:
+
+$1',
+'upload-warning-subj' => 'Uplaid warnishment',
+'upload-warning-msg' => 'Thaur wis ae proablem wi yer uplaid fae [$2]. Ye can return til the [[Special:Upload/stash/$1|uplaid form]] tae correct this proablem.',
+
+'upload-proto-error' => 'Oncorrect protocol',
+'upload-proto-error-text' => 'Remote uplaid needs URLs beginnin wi <code>http://</code> or <code>ftp://</code>.',
+'upload-file-error' => 'Internal mistak',
+'upload-file-error-text' => 'Aen internal mitake occurred whan attemptin tae cræft ae temperie file oan the server.
+Please contact aen [[Special:ListUsers/sysop|admeenistrater]].',
+'upload-misc-error' => 'Onkent uplaid mistake',
+'upload-misc-error-text' => 'Aen onkent mistak occurred during the uplaid.
+Please vereefie that the URL is valit n accessible n gie it anither gae.
+Gif the proablem persists, contact aen [[Special:ListUsers/sysop|admeenistrater]].',
+'upload-too-many-redirects' => 'The URL contained oewr monie reguidals',
+'upload-unknown-size' => 'Onkent size',
+'upload-http-error' => 'Aen HTTP mistake occurred: $1',
+'upload-copy-upload-invalid-domain' => 'Copie uplaids arna available fae this domain.',
+
+# File backend
+'backend-fail-stream' => 'Coudna stream file "$1".',
+'backend-fail-backup' => 'Coudna backup file "$1".',
+'backend-fail-notexists' => 'The file $1 disna exeest.',
+'backend-fail-hashes' => 'Coudna get file hashes fer comparison.',
+'backend-fail-notsame' => 'Ae non-identeecal file awreadie exeests at "$1".',
+'backend-fail-invalidpath' => '"$1" isna ae valid storage path.',
+'backend-fail-delete' => 'Coudna delyte file "$1".',
+'backend-fail-describe' => 'Coudna chynge metadata fer file "$1".',
+'backend-fail-alreadyexists' => 'The file "$1" awreadiw exeests.',
+'backend-fail-store' => 'Coudna store file "$1" at "$2".',
+'backend-fail-copy' => 'Coudna copie file "$1" til "$2".',
+'backend-fail-move' => 'Coudna muiv file "$1" til "$2".',
+'backend-fail-opentemp' => 'Coudna apen temperie file.',
+'backend-fail-writetemp' => 'Coudna write til temperie file.',
+'backend-fail-closetemp' => 'Coudna claise temperie file.',
+'backend-fail-read' => 'Coudna read file "$1".',
+'backend-fail-create' => 'Coudna write file "$1".',
+'backend-fail-maxsize' => 'Coudna write file "$1" cause it\'s muckler than {{PLURAL:$2|yin byte|$2 bytes}}.',
+'backend-fail-readonly' => 'The storage backend "$1" is read-yinlie the nou. The raison gien is: "\'\'$2\'\'"',
+'backend-fail-synced' => 'The file "$1" is in aen onconseestent state wiin the internal storage backends',
+'backend-fail-connect' => 'Coudna connect til storage backend "$1".',
+'backend-fail-internal' => 'Aen onkent mistak occurred in storage backend "$1".',
+'backend-fail-contenttype' => 'Coudna determine the content type o the file tae store at "$1".',
+'backend-fail-batchsize' => 'The storage backend wis gien ae batch o $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
+'backend-fail-usable' => 'Coudna read or write file "$1" cause o onsuffeecient permeessions or missin directeries/containers.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Coudna connect til the journal database fer storage backend "$1".',
+'filejournal-fail-dbquery' => 'Coudna update the journal database fer storage backend "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Coudna lowse "$1"; it\'s no lockit.',
+'lockmanager-fail-closelock' => 'Coud no claise lock file fer "$1".',
+'lockmanager-fail-deletelock' => 'Coudna delyte lock file fer "$1".',
+'lockmanager-fail-acquirelock' => 'Coudna acquire lock fer "$1".',
+'lockmanager-fail-openlock' => 'Coudna apen lock file fer "$1".',
+'lockmanager-fail-releaselock' => 'Coudna release lock fer "$1".',
+'lockmanager-fail-db-bucket' => 'Coudna contact enoogh lock databases in bucket $1.',
+'lockmanager-fail-db-release' => 'Coudna release locks oan database $1.',
+'lockmanager-fail-svr-acquire' => 'Coudna acquire locks oan server $1.',
+'lockmanager-fail-svr-release' => 'Coudna release locks oan server $1.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Ae mistak wis encoontered whan apenin the file fer ZIP checks.',
+'zip-wrong-format' => 'The speceefied file wisna ae ZIP file.',
+'zip-bad' => 'The file is ae rotten or itherwise onreadable ZIP file.
+It canna be properlie checkt fer securitie.',
+'zip-unsupported' => "The file is ae ZIP file that uises ZIP featurs that'r naw supported bi MediaWiki.
+It canna be properlie checkt fer securitie.",
+
+# Special:UploadStash
+'uploadstash' => 'Uplaid stash',
+'uploadstash-summary' => 'This page provides access til files that ar uplaided or in the process o uplaidin, but ar no yet published til the wiki. Thir files ar no veesible til oniebodie but the uiser that uplaided thaim.',
+'uploadstash-clear' => 'Clear stashed files.',
+'uploadstash-nofiles' => "Ye'v naw stashed files.",
+'uploadstash-badtoken' => 'The performin o that action wis onnsuccessfu, perhaps cause yer eeditin creeedentials hae expired. Gie it anither gae.',
+'uploadstash-errclear' => 'Clearin the files wis onsuccessfu.',
+'uploadstash-refresh' => 'Refresh the leet o files',
+'invalid-chunk-offset' => 'Onvalid chunk affset',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'Access denied.',
+'img-auth-nopathinfo' => 'Missin PATH_INFO.
+Yer server isna set up tae pass this information.
+It micht be CGI-based n canna support img_auth.
+See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => 'Requested path isna in the confeegured uplaid directerie.',
+'img-auth-badtitle' => 'Onable tae cræft ae valid title fae "$1".',
+'img-auth-nologinnWL' => 'Ye\'r naw loggit in n "$1" isna in the whiteleet.',
+'img-auth-nofile' => 'File "$1" disna exeest.',
+'img-auth-isdir' => 'Ye\'r attemptin tae access ae directerie "$1".
+Yinlie file access is premitit.',
+'img-auth-streaming' => 'Streamin "$1".',
+'img-auth-public' => 'The function o img_auth.php is tae ootpit files fae ae preevate wiki.
+This wiki is confeegured aes ae publeec wiki.
+Fr optimal securitie, img_auth.php is disabled.',
+'img-auth-noread' => 'Uiser disna hae access tae read "$1".',
+'img-auth-bad-query-string' => 'The URL haaes aen onvalid speirin string.',
+
+# HTTP errors
+'http-invalid-url' => 'Onvalid URL: $1',
+'http-invalid-scheme' => 'URLs wi the "$1" preefix ar naw supported.',
+'http-request-error' => 'HTTP request failed cause o onkent mistak.',
+'http-read-error' => 'HTTP read mistak.',
+'http-timed-out' => 'HTTP request haes timed oot.',
+'http-curl-error' => 'Mistake fetchin URL: $1',
+'http-bad-status' => 'Thaur wis ae proablem wi the HTTP request: $1 $2',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Coudna reach URL',
+'upload-curl-error6-text' => 'The URL gien coudna be reached.
+Please dooble-check that the URL is correct n the site is up.',
+'upload-curl-error28' => 'Uplaid timeoot',
+'upload-curl-error28-text' => 'The site tuik ower lang tae respond.
+Please check that the site is up, wait ae short while n gei it anither gae.
+Ye micht want tae try at ae less busie time.',
'license' => 'Licensing:',
-'license-header' => 'Licensing',
+'license-header' => 'Licensin',
'nolicense' => 'Nane selected',
+'license-nopreview' => '(Luikower naw available)',
+'upload_source_url' => '(ae valid, publeeclie accessible URL)',
+'upload_source_file' => '(ae file oan yer computer)',
# Special:ListFiles
+'listfiles-summary' => 'This speecial page shaws aw uplaided files.',
+'listfiles_search_for' => 'Rake fer media name:',
'imgfile' => 'file',
'listfiles' => 'Eimage leet',
+'listfiles_thumb' => 'Thummnail',
'listfiles_name' => 'Name',
'listfiles_user' => 'Uiser',
'listfiles_size' => 'Size',
+'listfiles_description' => 'Descreeption',
+'listfiles-show-all' => 'Incluide auld versions o eemages',
+'listfiles-latestversion' => 'The Nou version',
+'listfiles-latestversion-yes' => 'Ay',
+'listfiles-latestversion-no' => 'Naw',
# File description page
'file-anchor-link' => 'Eimage',
-'filehist' => 'File history',
+'filehist' => 'File histerie',
'filehist-help' => 'Clap oan ae date/time tae view the file aes it appeared at that time.',
+'filehist-deleteall' => 'delyte aw',
'filehist-deleteone' => 'delyte',
'filehist-revert' => 'revert',
'filehist-current' => 'current',
'filehist-datetime' => 'Date/Time',
'filehist-thumb' => 'Thumbnail',
'filehist-thumbtext' => 'Thumbnail fer version aes o $1',
+'filehist-nothumb' => 'Naw thummnail',
'filehist-user' => 'Uiser',
'filehist-dimensions' => 'Dimensions',
'filehist-comment' => 'Comment',
+'filehist-missing' => 'File missin',
'imagelinks' => 'File uisage',
'linkstoimage' => 'The follaein {{PLURAL:$1|page airts|$1 pages airt}} tae this file:',
-'nolinkstoimage' => "The'r nae pages airts tae this eimage.",
-'sharedupload-desc-here' => 'This file is frae $1 an micht be uised bi ither projects.
+'linkstoimage-more' => 'Mair than $1 {{PLURAL:$1|page links|pages link}} til this file.
+The follaein leet shaws the {{PLURAL:$1|first page link|first $1 page links}} til this file yinlie.
+Ae [[Special:WhatLinksHere/$2|ful leet]] is available.',
+'nolinkstoimage' => "Thaur's nae pages that link til this eemage.",
+'morelinkstoimage' => 'See [[Special:WhatLinksHere/$1|mair links]] til this file.',
+'linkstoimage-redirect' => '$1 (file reguidal) $2',
+'duplicatesoffile' => 'The follaein {{PLURAL:$1|file is ae dupleecate|$1 files ar dupleecates}} o this file ([[Special:FileDuplicateSearch/$2|mair details]]):',
+'sharedupload' => 'This file is fae $1 n can be uised bi ither waurks.',
+'sharedupload-desc-there' => 'This file is fae $1 n can be uised bi ither waurks.
+Please see the [$2 file deescreeption page] fer further information.',
+'sharedupload-desc-here' => 'This file is fae $1 n micht be uised bi ither waurks.
The descreeption oan its [$2 file descreeption page] thaur is shawn ablo.',
+'sharedupload-desc-edit' => 'This file is fae $1 n can be uised bi ither waurks.
+Perhaps ye want tae eedit the deescreeption oan its [$2 file deescreeption page] thaur.',
+'sharedupload-desc-create' => 'This file is fae $1 n can be uised bi ither waurks.
+Perhaps ye want tae eedit the deescreeption oan its [$2 file deescreeption page] thaur.',
+'filepage-nofile' => 'Naw file b this name exeests.',
+'filepage-nofile-link' => 'Nae file bi this name exeests, but ye can [$1 uplaid it].',
+'uploadnewversion-linktext' => 'Uplaid ae new version o this file',
+'shared-repo-from' => 'fae $1',
+'shared-repo' => 'ae shared repositerie',
+'upload-disallowed-here' => 'Ye canna owerwrite this file.',
# File reversion
'filerevert' => 'Revert $1',
'filerevert-legend' => 'Revert file',
+'filerevert-intro' => "Ye'r aboot tae revert the file '''[[Media:$1|$1]]''' til the [$4 version aes o $3, $2].",
+'filerevert-comment' => 'Raison:',
+'filerevert-defaultcomment' => 'Reverted til version aes o $2, $1',
'filerevert-submit' => 'Revert',
+'filerevert-success' => "'''[[Media:$1|$1]]''' haes been reverted til the [$4 version aes o $3, $2].",
+'filerevert-badversion' => "Thaur's naw preeveeoos local version o this file wi the gien timestamp.",
# File deletion
+'filedelete' => 'Delyte $1',
+'filedelete-legend' => 'Delyte file',
+'filedelete-intro' => "Ye'r aboot tae delyte the file '''[[Media:$1|$1]]''' alang wi aw o its histerie.",
+'filedelete-intro-old' => "Ye'r delytin the version o '''[[Media:$1|$1]]''' aes o [$4 $3, $2].",
+'filedelete-comment' => 'Raison:',
'filedelete-submit' => 'Delyte',
+'filedelete-success' => "'''$1''' haes been delytit.",
+'filedelete-success-old' => "The version o '''[[Media:$1|$1]]''' aes o $3, $2 haes been delytit.",
+'filedelete-nofile' => "'''$1''' disna exeest.",
+'filedelete-nofile-old' => "Thaur's naw archived version o '''$1''' wi the speceefied attreebutes.",
+'filedelete-otherreason' => 'Ither/addeetional raison:',
+'filedelete-reason-otherlist' => 'Ither raison',
+'filedelete-reason-dropdown' => '*Commyn delyte raisons
+** Copiericht violation
+** Dupleecatit file',
+'filedelete-edit-reasonlist' => 'Eedit delyte raisons',
+'filedelete-maintenance' => 'Delytion n restoration o files tempralie disabled during maintenance.',
+'filedelete-maintenance-title' => 'Canna delyte file',
# MIME search
+'mimesearch' => 'MIME rake',
+'mimesearch-summary' => 'This page enables the filterin o files fer thair MIME type.
+Input: contenttype/subtype, e.g. <code>image/jpeg</code>.',
'mimetype' => 'MIME type:',
'download' => 'dounlaid',
+# Unwatched pages
+'unwatchedpages' => 'Onwatched pages',
+
+# List redirects
+'listredirects' => 'Leet o reguidals',
+
# Unused templates
'unusedtemplates' => 'Templates that arena uised',
-'unusedtemplatestext' => 'This page leets aw pages in the {{ns:template}} namespace that arna incæded in anither page. Mynd an check fer ither airtins til the templates afore deletin theim.',
+'unusedtemplatestext' => "This page leets aw pages in the {{ns:template}} namespace that's naw incuidit in anither page. Mynd n check fer ither links til the templates afore delytin thaim.",
'unusedtemplateswlh' => 'ither links',
# Random page
'randompage' => 'Wale page allevolie',
+'randompage-nopages' => "Thaur's naw pages in the follaein {{PLURAL:$2|namespace|namespaces}}: $1.",
+
+# Random page in category
+'randomincategory' => 'Random page in categerie',
+'randomincategory-invalidcategory' => '"$1" isna ae valid categerie name.',
+'randomincategory-nopages' => "Thaur's naw pages in the [[:Category:$1|$1]] categerie.",
+'randomincategory-selectcategory' => 'Get random page fae categerie: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Gae',
+
+# Random redirect
+'randomredirect' => 'Random reguidal',
+'randomredirect-nopages' => 'Thaur\'s naw reguidals in the namespace "$1".',
# Statistics
'statistics' => 'Stateestics',
'statistics-header-users' => 'Uiser stateestics',
'statistics-header-hooks' => 'Ither stateestics',
'statistics-pages' => 'Pages',
+'statistics-pages-desc' => 'Aw pages in the wiki, incluidin tauk pages, reguidals, etc.',
+'statistics-files' => 'Uplaided files',
+'statistics-edits' => 'Page eedits sin {{SITENAME}} wis set up',
+'statistics-edits-average' => 'Average eedits per page',
+'statistics-views-total' => 'Seeins total',
+'statistics-views-total-desc' => "Seeins til non-exeestant pages n speecial pages'r naw incluidit",
+'statistics-views-peredit' => 'Seeins per eedit',
+'statistics-users' => 'Registered [[Special:ListUsers|uisers]]',
+'statistics-users-active' => 'Acteeve uisers',
+'statistics-users-active-desc' => 'Uisers that hae performed aen action in the laist {{PLURAL:$1|day|$1 days}}',
+'statistics-mostpopular' => 'Maist seen pages',
+
+'pageswithprop' => 'Pages wi ae page propertie',
+'pageswithprop-legend' => 'Pages wi ae page propertie',
+'pageswithprop-text' => 'This page leets pages that uise ae particular page propertie.',
+'pageswithprop-prop' => 'Propertie name:',
+'pageswithprop-submit' => 'Gae',
+'pageswithprop-prophidden-long' => 'lang tex propertie value skaukt ($1)',
+'pageswithprop-prophidden-binary' => 'binarie propertie value skaukt ($1)',
'doubleredirects' => 'Dooble reguidals',
-'doubleredirectstext' => 'This page leets pages that redirect til ither redirect pages.
-Ilka rou contains airtins til the first and seicont redirect, aes weel aes the terget o the secont redirect, whilk is usually the "real" terget page whaur the first redirect shid point.
+'doubleredirectstext' => 'This page leets pages that reguide til ither reguidal pages.
+Ilka raw contains links til the first n seicont reguidals, n the tairget o the seicont reguidal ava, this is uisuallie the "real" tairget page whaur the first reguidal shid poynt.
<del>Crossed oot</del> entries hae been solved.',
+'double-redirect-fixed-move' => '[[$1]] haes been muived.
+It nou reguides til [[$2]].',
+'double-redirect-fixed-maintenance' => 'Fixin dooble reguidal fae [[$1]] til [[$2]].',
+'double-redirect-fixer' => 'Reguidal fixer',
'brokenredirects' => 'Brucken reguidals',
'brokenredirectstext' => 'The folling redirects link til non-existent pages:',
-'brokenredirects-edit' => 'edit',
-'brokenredirects-delete' => 'delete',
+'brokenredirects-edit' => 'eedit',
+'brokenredirects-delete' => 'delyte',
'withoutinterwiki' => 'Pages athoot leid links',
+'withoutinterwiki-summary' => 'The follaein pages dinan link til ither leid versions.',
'withoutinterwiki-legend' => 'Prefix',
'withoutinterwiki-submit' => 'Shaw',
+'fewestrevisions' => 'Pages wi the fewest reeveesions',
+
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
'ncategories' => '$1 {{PLURAL:$1|category|categories}}',
'nlinks' => '$1 {{PLURAL:$1|link|links}}',
'nmembers' => '$1 {{PLURAL:$1|membir|membirs}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|memmer|memmers}}',
'nrevisions' => '$1 {{PLURAL:$1|reveision|reveisions}}',
'nviews' => '$1 {{PLURAL:$1|view|views}}',
+'nimagelinks' => 'Uised oan $1 {{PLURAL:$1|page|pages}}',
+'ntransclusions' => 'uised oan $1 {{PLURAL:$1|page|pages}}',
+'specialpage-empty' => "Thaur's naw affcomes fer this report.",
+'lonelypages' => 'Orphant pages',
+'lonelypagestext' => "The follaein pages'r naw linkt fae or transcluided intil ither pages in {{SITENAME}}.",
'uncategorizedpages' => 'Uncategoreised pages',
'uncategorizedcategories' => 'Uncategoreised categories',
+'uncategorizedimages' => 'Oncategerized files',
+'uncategorizedtemplates' => 'Oncategerized templates',
'unusedcategories' => 'Unuised categories',
'unusedimages' => 'Unuised images',
'wantedcategories' => 'Wantit categories',
'wantedpages' => 'Wantit pages',
+'wantedpages-badtitle' => 'Onvalid title in affcome set: $1',
+'wantedfiles' => 'Wantit files',
+'wantedfiletext-cat' => 'The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>. Addeetionallie, pages that embed files that dinna exeest ar leetit in [[:$1]].',
+'wantedfiletext-nocat' => 'The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>.',
+'wantedtemplates' => 'Wantit templates',
'mostlinked' => 'Maist airtit-til pages',
'mostlinkedcategories' => 'Maist airtit-til categories',
-'mostcategories' => 'Airticles wi the maist categories',
+'mostlinkedtemplates' => 'Maist linkt-til templates',
+'mostcategories' => 'Airticles wi the maist categeries',
'mostimages' => 'Maist uised eimages',
+'mostinterwikis' => 'Pages wi the maist interwikis',
'mostrevisions' => 'Maist revised airticles',
'prefixindex' => 'Aw pages wi prefix',
+'prefixindex-namespace' => 'Aw pages wi preefix ($1 namespace)',
+'prefixindex-strip' => 'Strip preefix in leet',
'longpages' => 'Lang pages',
'deadendpages' => 'Deid-end pages',
+'deadendpagestext' => 'The follaein pages dinna link til ither pages in {{SITENAME}}.',
+'protectedpages' => 'Pretectit pages',
+'protectedpages-indef' => 'Indefineet pretections yinlie',
'protectedpages-summary' => 'This page leets existin pages that ar nou protectit. Fer a leet o titles that ar protectit fae cræftin, see [[{{#special:ProtectedTitles}}]].',
+'protectedpages-cascade' => 'Cascadin protections yinlie',
+'protectedpages-noredirect' => 'Skauk reguidals',
+'protectedpagesempty' => 'Naw pages ar Nou pretectit wi thir parameters.',
'protectedpages-timestamp' => 'Timestamp.',
'protectedpages-page' => 'Page.',
'protectedpages-expiry' => 'Dies',
'protectedpages-reason' => 'Raison',
'protectedpages-unknown-timestamp' => "Onken't",
'protectedpages-unknown-performer' => "Onken't user",
-'protectedtitles-summary' => 'This page leets titles that ar nou protectit fae cræftin. Fer a leet of exeesting pages that ar protectit, see [[{{#special:ProtectedPages}}]].',
+'protectedtitles' => 'Pretectit titles',
+'protectedtitles-summary' => 'This page leets titles that ar nou protectit fae cræftin. Fer ae leet o exeestin pages that ar protectit, see [[{{#special:ProtectedPages}}]].',
+'protectedtitlesempty' => 'Naw titles ar the Nou protected wi thir parameters.',
'listusers' => 'Uiser leet',
+'listusers-editsonly' => 'Shaw yinlie uisers wi eedits',
+'listusers-creationsort' => 'Sort bi cræftin date',
+'listusers-desc' => 'Sort in descendin order',
+'usereditcount' => '$1 {{PLURAL:$1|eedit|eedits}}',
'usercreated' => '{{GENDER:$3|Cræftit}} oan $1 at $2',
'newpages' => 'New pages',
'newpages-username' => 'Uisername:',
'ancientpages' => 'Auldest pages',
-'move' => 'Flit',
-'movethispage' => 'Flit this page',
-'unusedimagestext' => 'The follaeing files exist but arna embeddit in oni page.
-Please note that ither wab sites micht airt til ae file wi ae direct URL, an sae micht still be leetit here despite being in active uiss.',
+'move' => 'Muiv',
+'movethispage' => 'Muiv this page',
+'unusedimagestext' => 'The follaein files exeest but arna embeddit in onie page.
+Please mynd that ither wab sites micht link til ae file wi ae direct URL, n sae micht still be leetit here despite being in acteeve uiss.',
'unusedcategoriestext' => 'The follaein category pages exists, tho nae ither airticle or category maks uiss o thaim.',
'notargettitle' => 'Nae target',
'notargettext' => "Ye hivna specifee'd a tairget page or uiser tae perform this function on.",
+'nopagetitle' => 'Naw sic tairget page',
+'nopagetext' => "The tairget page that ye'v speeceefied disna exeest.",
'pager-newer-n' => '{{PLURAL:$1|newer 1|newer $1}}',
'pager-older-n' => '{{PLURAL:$1|older 1|older $1}}',
+'suppress' => 'Owersicht',
+'querypage-disabled' => 'This speecial page is disablit fer performance raisons.',
# Book sources
'booksources' => 'Beuk sources',
'booksources-search-legend' => 'Rake fer buik soorces',
'booksources-go' => 'Gang',
+'booksources-text' => "Ablo is ae leet o links til ither sites that sell new n uised buiks, n mmicht hae further information aneat buiks that ye'r seekin ava:",
+'booksources-invalid-isbn' => 'The gien ISBN disna seem tae be valid; check fer mistaks copiein fae the oreeginal soorce.',
# Special:Log
'specialloguserlabel' => 'Performer:',
'speciallogtitlelabel' => 'Target (title or uiser):',
'log' => 'Logs',
'all-logs-page' => 'Aw public logs',
-'alllogstext' => 'Combined display o aw available logs o {{SITENAME}}.
-Ye can narrae down the view bi selectin ae log type, the uisername (case-sensitive), or the affected page (case-sensitive ava).',
+'alllogstext' => 'Combined displey o aw available logs o {{SITENAME}}.
+Ye can narrae doon the whit ye see bi selectin ae log type, the uisername (case-sensiteeve), or the affected page (case-sensiteeve ava).',
'logempty' => 'Nae matchin items in log.',
+'log-title-wildcard' => 'Rake titles stairtin wi this tex',
+'showhideselectedlogentries' => 'Chynge veesibeelitie o selectit log entries',
# Special:AllPages
-'allpages' => 'Aa pages',
-'alphaindexline' => '$1 tae $2',
+'allpages' => 'Aw pages',
+'alphaindexline' => '$1 til $2',
'nextpage' => 'Neist page ($1)',
'prevpage' => 'Page afore ($1)',
'allpagesfrom' => 'Shaw pages stairtin at:',
+'allpagesto' => 'Displey pages endin at:',
'allarticles' => 'Aa airticles',
'allinnamespace' => 'Aa pages ($1 namespace)',
'allpagessubmit' => 'Gang',
'allpagesprefix' => 'Shaw pages wi prefix:',
'allpagesbadtitle' => 'The page teitle gien wis wrang or haed a cross-lied or cross-wiki prefix. It micht hae ane or twa characters that canna be uised in teitles',
'allpages-bad-ns' => '{{SITENAME}} disna hae a namespace "$1".',
+'allpages-hide-redirects' => 'Skauk reguidals',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Ye'r seein ae cached version o this page, this can be up til $1 auld.",
+'cachedspecial-viewing-cached-ts' => "Ye'r seein ae cached version o this page, this micht naw be compleatelie actual.",
+'cachedspecial-refresh-now' => 'See latest.',
# Special:Categories
'categories' => 'Categories',
-'categoriespagetext' => 'The follaeing {{PLURAL:$1|categorie contains|categories contain}} pages or media.
-[[Special:UnusedCategories|Onuised categories]] arna shawn here.
-See [[Special:WantedCategories|wanted categories]] ava.',
+'categoriespagetext' => 'The follaein {{PLURAL:$1|categerie contains|categeries contain}} pages or media.
+[[Special:UnusedCategories|Onuised categeries]] arna shawn here.
+See [[Special:WantedCategories|wanted categeries]] ava.',
+'categoriesfrom' => 'Displey categeries stairtin at:',
'special-categories-sort-count' => 'sairt bi coont',
'special-categories-sort-abc' => 'sairt by the alphabet',
# Special:DeletedContributions
+'deletedcontributions' => 'Delytit uiser contreebutions',
+'deletedcontributions-title' => 'Delytit uiser contreebutions',
'sp-deletedcontributions-contribs' => 'contreebutions',
# Special:LinkSearch
+'linksearch' => 'External links rake',
+'linksearch-pat' => 'Rake pattern:',
'linksearch-ns' => 'Namespace:',
'linksearch-ok' => 'Rake',
+'linksearch-text' => 'Wildcairds like "*.wikipedia.org" can be uised.
+Needs at least ae top-level domain, fer example "*.org".<br />
+Supported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// gif naw protocol is speceefied).',
'linksearch-line' => '$1 is linked from $2',
+'linksearch-error' => 'Wildcards micht appear yinlie at the stairt o the hoastname.',
# Special:ListUsers
+'listusersfrom' => 'Displey uisers stairtin at:',
'listusers-submit' => 'Shaw',
+'listusers-noresult' => 'Naw uiser foond.',
'listusers-blocked' => '(blockit)',
+# Special:ActiveUsers
+'activeusers' => 'Acteeve uisers leet',
+'activeusers-intro' => 'This is ae leet o uisers that had some kynd o acteevitie wiin the last $1 {{PLURAL:$1|day|days}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|action|actions}} in the laist {{PLURAL:$3|day|$3 days}}',
+'activeusers-from' => 'Displey uisers stairtin at:',
+'activeusers-hidebots' => 'Skauk bots',
+'activeusers-hidesysops' => 'Skauk admeenistraters',
+'activeusers-noresult' => 'Naw uisers foond.',
+
# Special:ListGroupRights
+'listgrouprights' => 'Uiser groop richts',
+'listgrouprights-summary' => 'The follaein is aae leet o uiser groops defined oan this wiki, wi thair associated access richts.
+There micht be [[{{MediaWiki:Listgrouprights-helppage}}|addeetional information]] aneat indiveedual richts.',
+'listgrouprights-key' => 'Legend:
+* <span class="listgrouprights-granted">Grantit richt</span>
+* <span class="listgrouprights-revoked">Revokt richt</span>',
+'listgrouprights-group' => 'Groop',
+'listgrouprights-rights' => 'Richts',
+'listgrouprights-helppage' => 'Help:Groop richts',
'listgrouprights-members' => '(leet o members)',
+'listgrouprights-addgroup' => 'Add {{PLURAL:$2|groop|groops}}: $1',
+'listgrouprights-removegroup' => 'Remuiv {{PLURAL:$2|grop|groops}}: $1',
+'listgrouprights-addgroup-all' => 'Add aw groops',
+'listgrouprights-removegroup-all' => 'Remui aw groops',
+'listgrouprights-addgroup-self' => 'Add {{PLURAL:$2|groop|groops}} til yer accoont: $1',
+'listgrouprights-removegroup-self' => 'Remuiv {{PLURAL:$2|groop|groops}} fae yer accoont: $1',
+'listgrouprights-addgroup-self-all' => 'Add aw groops til yer accoont',
+'listgrouprights-removegroup-self-all' => 'Remuiv aw groops fae yer accoont',
# Email user
'mailnologin' => 'Nae send address',
-'mailnologintext' => 'Ye maun be [[Special:UserLogin|loggit in]] an hae a valid e-mail address in yer [[Special:Preferences|preferences]] tae send e-mail til ither uisers.',
+'mailnologintext' => 'Ye maun be [[Special:UserLogin|loggit in]] n hae ae valid wab-mail address in yer [[Special:Preferences|preferences]] tae send Wab-mail til ither uisers.',
'emailuser' => 'E-mail this uiser',
+'emailuser-title-target' => 'Wab-mail this {{GENDER:$1|uiser}}',
+'emailuser-title-notarget' => 'Wab-mail uiser',
+'emailpage' => 'Wab-mail uiser',
+'emailpagetext' => 'Ye can uise the form ablo tae send ae wab-mail message til this {{GENDER:$1|uiser}}.
+The wab-mail address that ye entered in [[Special:Preferences|yer uiser preeferances]] will kith aes the "Fae" address o the wab-mail, sae that the receepient will be able tae replie directlie til ye.',
+'usermailererror' => 'Mail object returned mistak:',
+'defemailsubject' => '{{SITENAME}} wab-mail fae uiser "$1"',
+'usermaildisabled' => 'Uiser wab-mail disablit',
+'usermaildisabledtext' => 'Ye canna send wab-mail til ither uisers oan this wiki',
'noemailtitle' => 'Nae e-mail address',
'noemailtext' => 'This uiser haesna speceefied ae valid wab-mail address.',
+'nowikiemailtitle' => 'Naw wab-mail permitit',
+'nowikiemailtext' => 'This uiser haes choosen tae naw receeve wab-mail fae ither uisers.',
+'emailnotarget' => 'Non-exeestent or onvalit uisername fer receepeeant.',
+'emailtarget' => 'Enter uisername o reeceepeeant',
+'emailusername' => 'Uisername:',
+'emailusernamesubmit' => 'Haun-in',
+'email-legend' => 'Send ae wab-mail til anither {{SITENAME}} uiser',
+'emailfrom' => 'Fae:',
+'emailto' => 'Til:',
+'emailsubject' => 'Aneat:',
'emailmessage' => 'Message:',
+'emailccme' => 'Wab-mail me ae copie o ma message.',
+'emailccsubject' => 'Copie o yer message til $1: $2',
+'emailsent' => 'Wab-mail sent',
+'emailsenttext' => 'Yer wab-mail message haes been sent.',
+'emailuserfooter' => 'This wab-mail wis sent bi $1 til $2 bi the "Wab-mail uiser" function at {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Leain seestem message.',
+'usermessage-editor' => 'Seestem messenger',
# Watchlist
'watchlist' => 'Ma watchleet',
'mywatchlist' => 'Ma watchleet',
'watchlistfor2' => 'For $1 $2',
'nowatchlist' => "Ye'v nae eitems oan yer watchleet.",
+'watchlistanontext' => 'Please $1 tae see or eedit eetems oan yer watchlet.',
'watchnologin' => 'Nae loggit in',
'watchnologintext' => 'Ye maun be [[Special:UserLogin|loggit in]] tae modify yer watchleet.',
+'addwatch' => 'Add til watchleet',
'addedwatchtext' => 'The page "[[:$1]]" haes been added til yer [[Special:Watchlist|watchleet]].
-Future chynges til this page an its associated tauk page will be leeted there.',
+Futur chynges til this page n its associated tauk page will be leeted thaur.',
+'removewatch' => 'Remuiv fae watchleet',
'removedwatchtext' => 'The page "[[:$1]]" haes been remuied fae [[Special:Watchlist|yer watchleet]].',
'watch' => 'Watch',
'watchthispage' => 'Leuk ower this page',
'unwatch' => 'Unwatch',
-'notanarticle' => 'No a content page',
-'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, no coontin tauk pages.',
+'unwatchthispage' => 'Stap watchin',
+'notanarticle' => 'Naw ae content page',
+'notvisiblerev' => 'The last reeveesion bi ae differant uiser haes been delytit',
+'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, na coontin tauk pages.',
+'wlheader-enotif' => 'Wab-mail annooncemant is enabled.',
+'wlheader-showupdated' => "Pages that hae been chynged sin ye last veesitit thaim ar shawn in '''baud'''.",
+'watchmethod-recent' => 'checkin recent eedits fer watched pages',
+'watchmethod-list' => 'checking watched pages fer recent eedits',
'watchlistcontains' => 'Yer watchleet contains $1 {{PLURAL:$1|page|pages}}.',
-'iteminvalidname' => "Trouble wi eitem '$1', invalid name...",
-'wlnote2' => 'Ablow ar the chynges in the hainmaist {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $3, $2.',
+'iteminvalidname' => "Proablem wi eetem '$1', onvalit name...",
+'wlnote2' => 'Ablo ar the chynges in the hainmaist {{PLURAL:$1|hoor|<strong>$1</strong> hours}}, aes o $3, $2.',
'wlshowlast' => 'Shaw lest $1 hours $2 days $3',
'watchlist-options' => 'Watchleet options',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Watchin...',
'unwatching' => 'Unwatchin...',
+'watcherrortext' => 'Ae mistak occurred while chyngin yer watchleet settins fer "$1".',
+'enotif_mailer' => '{{SITENAME}} annooncemant mailer',
'enotif_reset' => 'Merk aa pages visitit',
+'enotif_impersonal_salutation' => '{{SITENAME}} uiser',
+'enotif_subject_deleted' => '{{SITENAME}} page $1 haes been {{GENDER:$2|delytit}} bi $2',
+'enotif_subject_created' => '{{SITENAME}} page $1 haes been {{GENDER:$2|cræftit}} bi $2',
+'enotif_subject_moved' => '{{SITENAME}} page $1 haes been {{GENDER:$2|muived}} bi $2',
+'enotif_subject_restored' => '{{SITENAME}} page $1 haes been {{GENDER:$2|restored}} bi $2',
+'enotif_subject_changed' => '{{SITENAME}} page $1 haes been {{GENDER:$2|chynged}} bi $2',
+'enotif_body_intro_deleted' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|delytit}} oan $PAGEEDITDATE bi $2, see $3.',
+'enotif_body_intro_created' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|cræftit}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reeveesion.',
+'enotif_body_intro_moved' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|muived}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reeveesion.',
+'enotif_body_intro_restored' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|restored}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reveesion.',
+'enotif_body_intro_changed' => 'The {{SITENAME}} page $1 haes been {{GENDER:$2|chynged}} oan $PAGEEDITDATE bi $2, see $3 fer the Nou reeveesion.',
'enotif_lastvisited' => 'Hae ae leuk at $1 fer aa chynges sin yer laist veesit.',
-'created' => 'creatit',
+'enotif_lastdiff' => 'See $1 tae see this chynge.',
+'enotif_anon_editor' => 'anonymoos uiser $1',
+'enotif_body' => 'Dear $WATCHINGUSERNAME,
+
+$PAGEINTRO $NEWPAGE
+
+Eediter\'s ootline: $PAGESUMMARY $PAGEMINOREDIT
+
+Contact the eediter:
+mail: $PAGEEDITOR_EMAIL
+wiki: $PAGEEDITOR_WIKI
+
+Thaur\'ll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.
+
+Yer freendlie {{SITENAME}} annooncemant system
+
+--
+Taae chynge yer wab-mail annooncemant settins, veesit
+{{canonicalurl:{{#special:Preferences}}}}
+
+Tae chynge yer watchleet settins, veesit
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+Tae delyte the page fae yer watchleet, veesit
+$UNWATCHURL
+
+Feedback n further asseestance:
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'cræftit',
'changed' => 'chynged',
# Delete
-'deletepage' => 'Delete page',
+'deletepage' => 'Delyte page',
'excontent' => "content wis: '$1'",
-'excontentauthor' => "content wis: '$1' (an the ae contreibutor wis '[[Special:Contributions/$2|$2]]')",
+'excontentauthor' => "content wis: '$1' (n the ae contreebuter wis '[[Special:Contributions/$2|$2]]')",
'exbeforeblank' => "content afore blankin wis: '$1'",
'exblank' => 'page wis tuim',
-'delete-confirm' => 'Delete "$1"',
-'delete-legend' => 'Delete',
-'historywarning' => "<strong>Wairnin:</strong> The page ye'r aboot tae delete haes ae history wi approximatelie $1 {{PLURAL:$1|reveesion|reveesions}}:",
-'confirmdeletetext' => "Ye'r aboot tae permanently delete a page or eimage alang wi aa its history frae the database.
+'delete-confirm' => 'Delyte "$1"',
+'delete-legend' => 'Delyte',
+'historywarning' => "<strong>Warnishment:</strong> The page that ye'r aboot tae delyte haes ae histerie wi approximatelie $1 {{PLURAL:$1|reveesion|reveesions}}:",
+'confirmdeletetext' => "Ye'r aboot tae delyte ae page or eemage alang wi aw its histerie fae the database.
Please confirm that ye intend tae dae this, that ye unnerstaun the consequences,
-an that ye'r daein this in accord wi [[{{MediaWiki:Policy-url}}]].",
+n that ye'r daein this in accord wi [[{{MediaWiki:Policy-url}}]].",
'actioncomplete' => 'Action duin',
'actionfailed' => 'Action failed',
-'deletedtext' => '"$1" haes been deletit. See $2 fer ae record o recent deletions.',
-'dellogpage' => 'Deletion log',
+'deletedtext' => '"$1" haes been delytit. See $2 fer ae record o recent delytions.',
+'dellogpage' => 'Delytion log',
'dellogpagetext' => 'Ablo is a leet o the maist recent deletions.',
-'deletionlog' => 'deletion log',
-'reverted' => 'Revertit tae aulder reveision',
+'deletionlog' => 'delytion log',
+'reverted' => 'Revertit til aulder reveesion',
'deletecomment' => 'Raeson:',
+'deleteotherreason' => 'Ither/addeetional raison:',
'deletereasonotherlist' => 'Ither raeson',
-'deleting-backlinks-warning' => "'''Warnishment:''' ither pages link til or transclude the page ye'r aboot tae delyte.",
+'deletereason-dropdown' => '* Commyn delyte raisons
+** Spam
+** Vandaleesm
+** Copiericht violation
+** Writer request
+** Broken reguidal',
+'delete-edit-reasonlist' => 'Eedit delytion raisons',
+'delete-toobig' => 'This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.
+Delytion o sic pages haes been restrictit tae stap accidental disruption o {{SITENAME}}.',
+'delete-warning-toobig' => 'This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.
+Delytin it micht disrupt database operations o {{SITENAME}};
+proceed wi caution.',
+'deleting-backlinks-warning' => "'''Warnishment:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ither pages]] link til or transcluide the page ye'r aboot tae delyte.",
# Rollback
'rollback' => 'Row back edits',
'rollback_short' => 'Rowback',
'rollbacklink' => 'rowback',
+'rollbacklinkcount' => 'rowback $1 {{PLURAL:$1|eedit|eedits}}',
+'rollbacklinkcount-morethan' => 'rowback mair than $1 {{PLURAL:$1|eedit|eedits}}',
'rollbackfailed' => 'Rowback failed',
'cantrollback' => 'Canna revert eidit; laist contreebuter is the ae auther o this page.',
'alreadyrolled' => 'Canna rollback laist eidit o [[:$1]] bi [[User:$2|$2]] ([[User talk:$2|tauk]]{{int:pipe-separater}}[[Special:Contributions/$2|{{int:contribslink}}]]);
The laist eidit til the page wis bi [[User:$3|$3]] ([[User talk:$3|tauk]]{{int:pipe-separater}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
'editcomment' => "The eidit summarie wis: \"''\$1''\".",
'revertpage' => 'Reverted eidits bi [[Special:Contributions/$2|$2]] ([[User talk:$2|tauk]]) til laist reveesion bi [[User:$1|$1]]',
+'revertpage-nouser' => 'Reverted eedits bi ae skaukt uiser til laist revesion bi {{GENDER:$1|[[User:$1|$1]]}}',
+'rollback-success' => 'Reverted eedits b $1;
+chynged back til the laist reveesion bi $2.',
+
+# Edit tokens
+'sessionfailure' => 'Thaur seems tae be ae proablem wi yer login session;
+this action haes been canceled aes ae precaution again session hijackin.
+Gang back til the preeveeoos page, relaid that page n than gie it anither gae.',
# Protect
'protectlogpage' => 'Fend log',
'protectlogtext' => 'Ablow is ae leet o chynges til page protections.
See the [[Special:ProtectedPages|protected pages leet]] fer the leet o currently operational page protections.',
'protectedarticle' => 'protectit "[[$1]]"',
+'modifiedarticleprotection' => 'chynged protection level fer "[[$1]]"',
'unprotectedarticle' => 'remuied protection fae "[[$1]]"',
+'movedarticleprotection' => 'muived protection settins fae "[[$2]]" til "[[$1]]"',
'protect-title' => 'Protectin "$1"',
+'protect-title-notallowed' => 'See protection level o "$1"',
'prot_1movedto2' => '[[$1]] flittit til [[$2]]',
+'protect-badnamespace-text' => 'Pages in this namespace canna be protected.',
+'protect-norestrictiontypes-text' => "This page canna be protected aes thaur's naw restreection types available.",
'protectcomment' => 'Raeson:',
'protectexpiry' => 'Expires:',
-'protect-text' => "Ye can see an chynge the protection level here for the page '''$1'''.",
+'protect_expiry_invalid' => 'Expirie time is onvalit.',
+'protect_expiry_old' => 'Expirie time is in the past.',
+'protect-unchain-permissions' => 'Lowse mair protect opties',
+'protect-text' => 'Ye can see n chynge the protection level here fer the page <strong>$1</strong>.',
+'protect-locked-blocked' => 'Ye canna chynge protection levels while blockt.
+Here ar the settins fer the page <strong>$1</strong> the nou:',
+'protect-locked-dblock' => 'Protection levels canna be chynged cause o aen acteeve database lock.
+Here ar the settins fer the page <strong>$1</strong> nou:',
+'protect-locked-access' => 'Yer accont disna hae permeession tae chynge page protection levels.
+Here ar the settins fer the page <strong>$1</strong> the nou:',
+'protect-cascadeon' => "This page is nou protected cause it is incluided in the follaein {{PLURAL:$1|page, this haes|pages, thir hae}} cascadin protection turned oan.
+Ye can chynge this page's protection level, but it will na affect the cascadin protection.",
'protect-default' => 'Allow aw uisers',
+'protect-fallback' => 'permit yinlie uisers wi "$1" permission',
'protect-level-autoconfirmed' => 'Allou yinly autæconfirmed uisers',
'protect-level-sysop' => 'Allou admeenistraters yinly',
+'protect-summary-cascade' => 'cascadin',
+'protect-expiring' => 'dees $1 (UTC)',
+'protect-expiring-local' => 'dees $1',
+'protect-expiry-indefinite' => 'indefineet',
+'protect-cascade' => 'Protect pages incluided in this page (cascadin protection)',
+'protect-cantedit' => 'Ye canna chynge the protection levels o this page cause ye dinna hae permeession tae eedit it.',
'protect-othertime' => 'Ither time:',
'protect-othertime-op' => 'ither time',
+'protect-existing-expiry' => 'Exeestin expirie time: $3, $2',
+'protect-otherreason' => 'Ither/addeetional raison:',
+'protect-otherreason-op' => 'Ither raison',
+'protect-dropdown' => '*Commyn protection raisons
+** Excesseeve vandaleesm
+** Excesseeve spammin
+** Coonter-producteeve eedit warrin
+** Hei traffeec page',
+'protect-edit-reasonlist' => 'Eedit protection raisons',
'protect-expiry-options' => '1 hoor:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,eenfinite:infinite',
+'restriction-type' => 'Permeession:',
+'restriction-level' => 'Restreection level:',
+'minimum-size' => 'Smaaest size',
+'maximum-size' => 'Mucklest size:',
# Restrictions (nouns)
'restriction-edit' => 'Eidit',
-'restriction-move' => 'Flit',
+'restriction-move' => 'Muiv',
'restriction-create' => 'Mak',
'restriction-upload' => 'Uplaid',
+# Restriction levels
+'restriction-level-sysop' => 'fulie protected',
+'restriction-level-autoconfirmed' => 'semie protected',
+'restriction-level-all' => 'onie level',
+
# Undelete
-'undelete' => 'Restore delyte page',
-'undeletepage' => 'View an restore delytit pages',
+'undelete' => 'See delytit page',
+'undeletepage' => 'See n restore delytit pages',
+'undeletepagetitle' => '<strong>The follaein conseests o delytit reveesions o [[:$1|$1]]</strong>.',
'viewdeletedpage' => 'View delyte pages',
-'undeletepagetext' => 'The follaeing {{PLURAL:$1|page haes been deletit but is|$1 pages hae been deletit but ar}} still in the archive an can be restored.
-The archive micht be cleaned oot nou an then.',
-'undeleteextrahelp' => "In order tae restore the page's entire histerie, lea aw checkboxes onselected an clap on <strong><em>{{int:undeletebtn}}</em></strong>.
-Tae perform ae selective restoration, check the boxes corresponding til the revisions tae be restored, an clap on <strong><em>{{int:undeletebtn}}</em></strong>.",
-'undeletehistory' => 'Gif ye restore the page, aw revisions will be restored til the histerie.
+'undeletepagetext' => 'The follaein {{PLURAL:$1|page haes been delytit but is|$1 pages hae been delytit but ar}} still in the archive n can be restored.
+The archive micht be cleaned oot nou n than.',
+'undelete-fieldset-title' => 'Restore reveesions',
+'undeleteextrahelp' => "In order tae restore the page's entire histerie, lea aw checkkists onselected n clap oan <strong><em>{{int:undeletebtn}}</em></strong>.
+Tae perform ae selecteeve restoration, check the kists correspondin til the reveesions tae be restored, n clap oan <strong><em>{{int:undeletebtn}}</em></strong>.",
+'undeleterevisions' => '$1 {{PLURAL:$1|reveesion|reveesions}} archived',
+'undeletehistory' => 'Gif ye restore the page, aw reveesions will be restored til the histerie.
Gif ae new page wi the same name haes been makit sin the delytion, the restored reveesions will kyth in the prior histerie.',
+'undeleterevdel' => 'Ondelytion will na be performed gif it will result in the tap page or file reveesion bein pairtlie delyted.
+In sic cases, ye maun oncheck or onskauk the newest delytit reveesion.',
'undeletehistorynoadmin' => 'This airticle haes been delytit. The raeson fer delytion is
shawn in the owerview ablo, alang wi parteeculars o the uisers that haed eiditit this page afore it wis delytit. The actual tex o thir delytit reveesions is available tae admeenistraters juist.',
-'undeletelink' => 'view/restore',
+'undelete-revision' => 'Deleted reveesion o $1 (aes o $4, at $5) bi $3:',
+'undeleterevision-missing' => 'Onvalid or missin reveesion.
+Ye micht hae ae bad link, or the reveesion micht hae been restored or remuived fae the archive.',
+'undelete-nodiff' => 'Naw preeveeoos reveesion foond.',
+'undeletelink' => 'see/restore',
'undeleteviewlink' => 'view',
+'undeletecomment' => 'Raison:',
'undeletedrevisions' => '{{PLURAL:$1|1 reveision|$1 reveisions}} restored',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 reveesion|$1 reveesions}} n {{PLURAL:$2|1 file|$2 files}} restored',
'cannotundelete' => 'Ondelyte failed:
$1',
'undeletedpage' => '<strong>$1 haes been restored</strong>
Consult the [[Special:Log/delete|delytion log]] fer ae record o recent delytions an restorâtions.',
+'undelete-header' => 'See [[Special:Log/delete|the delytion log]] fer recentlie delytit pages.',
+'undelete-search-title' => 'Rake delytit pages',
+'undelete-search-box' => 'Rake delytit pages',
+'undelete-search-prefix' => 'Shaw pages stairtin wi:',
+'undelete-search-submit' => 'Rake',
+'undelete-no-results' => 'Naw matchin pages foond in the delytion airchive.',
+'undelete-filename-mismatch' => 'Canna ondelyte file reveesion wi timestamp $1: Filename mismatch.',
+'undelete-bad-store-key' => 'Canna ondelyte file reveesion wi timestamp $1: File wis missin afore delytion.',
+'undelete-cleanup-error' => 'Mistak delytin onuised airchive file "$1".',
+'undelete-missing-filearchive' => "Onable tae restore file airchive ID $1 cause it's na in the database.
+It micht awreadie hae been ondelytit.",
+'undelete-error' => 'Mistak ondelytin page',
+'undelete-error-short' => 'Mistak ondelytin file: $1',
+'undelete-error-long' => 'Mistaks were encoontered while ondelytin the file:
+
+$1',
+'undelete-show-file-confirm' => 'Ar ye sair that ye want tae see the delytit reveesion o the file "<nowiki>$1</nowiki>" fae $2 at $3?',
+'undelete-show-file-submit' => 'Ay',
# Namespace form on various pages
'namespace' => 'Namespace:',
'invert' => 'Invert selection',
+'tooltip-invert' => 'Check this kist tae skauk chynges til pages wiin the selectit namespace (n the associated namespace gif checked)',
+'tooltip-namespace_association' => 'Check this kist forby tae incluid the tauk or subject namespace associated wi the selectit namespace',
'blanknamespace' => '(Main)',
# Contributions
'contribsub2' => 'Fer {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Nae chynges wis funnd matchin thir criteria.',
'uctop' => '(current)',
-'month' => 'Frae month (an afore):',
-'year' => 'Frae year (an afore):',
+'month' => 'Fae month (n afore):',
+'year' => 'Fae year (n afore):',
'sp-contributions-newbies' => 'Shaw contreebutions o freish accoonts ainlie',
+'sp-contributions-newbies-sub' => 'Fer new accoonts',
+'sp-contributions-newbies-title' => 'Uiser contreebutions fer new accoonts',
'sp-contributions-blocklog' => 'block log',
+'sp-contributions-deleted' => 'delytit uiser contreebutions',
'sp-contributions-uploads' => 'uploads',
'sp-contributions-logs' => 'logs',
'sp-contributions-talk' => 'tauk',
+'sp-contributions-userrights' => 'uiser richts management',
+'sp-contributions-blocked-notice' => 'This uiser is nou blockit.
+The latest block log entrie is gien ablo fer referance:',
+'sp-contributions-blocked-notice-anon' => 'This IP address is blockit the nou.
+The latest block log entrie is gien ablo fer referance:',
'sp-contributions-search' => 'Rake fer contreebutions',
'sp-contributions-suppresslog' => 'suppressed uiser contreebutions',
'sp-contributions-username' => 'IP address or uisername:',
-'sp-contributions-toponly' => 'Ainlie shaw edits that are latest revisions',
+'sp-contributions-toponly' => 'Ainlie shaw eedits that ar laitest reveesions',
'sp-contributions-newonly' => 'Yinlie shaw eidits that ar page cræftins',
'sp-contributions-submit' => 'Rake',
# What links here
-'whatlinkshere' => 'Whit airts tae here',
+'whatlinkshere' => 'Whit links here',
'whatlinkshere-title' => 'Pages that link til "$1"',
'whatlinkshere-page' => 'Page:',
-'linkshere' => "The follaein pages airts tae '''[[:$1]]''':",
-'nolinkshere' => "Nae pages airt tae '''[[:$1]]'''.",
+'linkshere' => 'The follaein pages link til <strong>[[:$1]]</strong>:',
+'nolinkshere' => "Nae pages link wi '''[[:$1]]'''.",
'nolinkshere-ns' => 'No pages aiet til <strong>[[:$1]]</strong> in the choosen namespace.',
'isredirect' => 'reguidal page',
'istemplate' => 'transclusion',
'whatlinkshere-filters' => 'Filters',
# Block/unblock
+'autoblockid' => 'Autæblock #$1',
+'block' => 'Block uiser',
+'unblock' => 'Onblock uiser',
'blockip' => 'Block uiser',
-'blockiptext' => 'Uise the form ablo tae block write access frae a specific IP address or uisername. This shuid be duin juist tae prevent vandalism, and in accord wi [[{{MediaWiki:Policy-url}}|policy]]. Fill in a specific raeson ablo (for exemplar, citin parteicular pages that wis damaged).',
+'blockip-legend' => 'Block uiser',
+'blockiptext' => 'Uise the form ablo tae block write access fae ae speceefic IP address or uisername. This shid be dun juist tae hinder vandaleesm, n in accord wi [[{{MediaWiki:Policy-url}}|policie]]. Fil in ae speceefic raison ablo (fer exemplar, citin parteecular pages that were vandalised).',
'ipadressorusername' => 'IP Address or uisername',
+'ipbexpiry' => 'Expirie:',
'ipbreason' => 'Raeson:',
+'ipbreason-dropdown' => '*Commyn block raisons
+** Insertin false information
+** Remuivin content fae pages
+** Spammin links til external sites
+** Insertin nonsense/gibberish intil pages
+** Inteemidatin behavier/harassment
+** Abuisin multiple accoonts
+** Onacceptable uisername',
+'ipb-hardblock' => 'Stap loggit-in uisers fae eeditin fae this IP address',
+'ipbcreateaccount' => 'Stap accoont cræftin',
+'ipbemailban' => 'Stap uiser fae sendin wab-mail',
+'ipbenableautoblock' => 'Autæmateeclie block the laist IP address uised bi this uiser, n onie subsequent IP addresses that thay attempt tae eedit fae',
'ipbsubmit' => 'Block this uiser',
'ipbother' => 'Ither time',
'ipboptions' => '2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite',
+'ipbhidename' => 'Skauk uisername fae eedits n leets',
+'ipbwatchuser' => "Watch this uiser's uiser n tauk pages",
+'ipb-disableusertalk' => 'Stap this uiser fae eeditin thair ain tauk page while blockit',
+'ipb-change-block' => 'Re-block the uiser wi thir settins',
'badipaddress' => 'That IP address is nae guid',
'blockipsuccesssub' => 'Block succeedit',
'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] haes been blockit.
<br />See [[Special:BlockList|block leet]] tae review blocks.',
+'ipb-blockingself' => "Ye'r aboot tae block yersel! Ar ye sair that ye want tae dae that?",
+'ipb-confirmhideuser' => 'Ye\'r aboot tae block ae uiser wi "skauk uiser" enabled. This will suppress the uiser\'s name in aw leets n log entries. Ar ye sair that ye want tae dae that?',
+'ipb-confirmaction' => 'Gif ye\'r sair that ye reelie want tae dae it, please check the "{{int:ipb-confirm}}" field at the bottom.',
+'ipb-edit-dropdown' => 'Eedit block raisons',
'ipb-unblock-addr' => 'Unblock $1',
+'ipb-unblock' => 'Onblock ae uisername or IP address',
+'ipb-blocklist' => 'See exeestin blocks',
+'ipb-blocklist-contribs' => 'Contreebutions fer $1',
'unblockip' => 'Unblock uiser',
-'unblockiptext' => 'Uise the form ablo tae restore screivin richts
-tae an afore-blockit IP address or uisername.',
+'unblockiptext' => 'Uise the form ablo tae restore screevin richts
+til aen afore-blockit IP address or uisername.',
+'ipusubmit' => 'Remuive this block',
+'unblocked' => '[[User:$1|$1]] haes been onblockit.',
+'unblocked-range' => '$1 haes been onblockit.',
+'unblocked-id' => 'Block $1 haes been remuived.',
+'blocklist' => 'Blockit uisers',
'ipblocklist' => 'Blockit uisers',
+'ipblocklist-legend' => 'Fynd ae blockit uiser',
+'blocklist-userblocks' => 'Skauk accoont blocks',
+'blocklist-tempblocks' => 'Skauk temparie blocks',
+'blocklist-addressblocks' => 'Skauk single IP blocks',
+'blocklist-rangeblocks' => 'Skauk range blocks',
+'blocklist-target' => 'Tairget',
+'blocklist-expiry' => 'Dies',
+'blocklist-by' => 'Blockin admeen',
+'blocklist-params' => 'Block boonds',
+'blocklist-reason' => 'Raison',
+'ipblocklist-submit' => 'Rake',
+'ipblocklist-otherblocks' => 'Ither {{PLURAL:$1|block|blocks}}',
+'infiniteblock' => 'infeenite',
+'expiringblock' => 'dies oan $1 at $2',
'anononlyblock' => 'anon. juist',
+'noautoblockblock' => 'autæblock disabled',
'createaccountblock' => 'accoont-makkin blockit',
+'emailblock' => 'wab-mail disabled',
+'blocklist-nousertalk' => 'canna eedit yer ain tauk page',
+'ipblocklist-empty' => 'The block leet is tuim.',
+'ipblocklist-no-results' => 'The requested IP address or uisername isna blockit.',
'blocklink' => 'block',
'unblocklink' => 'unblock',
'change-blocklink' => 'chynge block',
'contribslink' => 'contreibs',
+'emaillink' => 'send wab-mail',
'autoblocker' => 'Autaematicallie blockit sin yer IP address haes been uised recentlie bi "[[User:$1|$1]]". The raeson gien fer $1\'s block is "$2"',
'blocklogpage' => 'Block log',
-'blocklogentry' => 'blockit [[$1]] wi an expiry time o $2 $3',
-'blocklogtext' => 'This is ae log o uiser blockin an onblockin actions. Autaematically blockit IP addresses isna leetit. See the [[Special:BlockList|block leet]] fer the leet o bans and blocks oan nou.',
+'blocklog-showlog' => 'This uiser haes been blockit afore.
+The block log is gien ablo fer referance:',
+'blocklog-showsuppresslog' => 'This uiser haes been blockit n skaukt afore.
+The suppress log is gien ablo fer referance:',
+'blocklogentry' => 'blockit [[$1]] wi aen expirie time o $2 $3',
+'reblock-logentry' => 'chynged block settins fer [[$1]] wi ae diein time o $2 $3',
+'blocklogtext' => 'This is ae log o uiser blockin n onblockin actions. Autaematiclie blockit IP addresses isna leetit. See the [[Special:BlockList|block leet]] fer the leet o bans n blocks oan the nou.',
'unblocklogentry' => 'unblockit $1',
+'block-log-flags-anononly' => 'anonymos uisers yinlie',
'block-log-flags-nocreate' => 'accoont-makkin blockit',
+'block-log-flags-noautoblock' => 'autæblock disabled',
+'block-log-flags-noemail' => 'wab-mail disabled',
+'block-log-flags-nousertalk' => 'canna eedit yer ain tauk page',
+'block-log-flags-angry-autoblock' => 'enhanced autæblock enabled',
+'block-log-flags-hiddenname' => 'uisername skaukt',
'range_block_disabled' => 'The administrator abeility tae mak range blocks is disabled.',
-'proxyblockreason' => 'Yer IP address haes been blockit sith it is an open proxy. Please contact yer Internet service provider or tech support an inform them o this serious security problem.',
+'ipb_expiry_invalid' => 'Expirie time is onvalit.',
+'ipb_expiry_temp' => 'Skaukt uisername blocks maun be permanent.',
+'ipb_hide_invalid' => 'Onable tae suppress this accoont; it haes mair than {{PLURAL:$1|yin eedit|$1 eedits}}.',
+'ipb_already_blocked' => '"$1" is awreadie blockit.',
+'ipb-needreblock' => '$1 is awreadie blockit. Div ye want tae chynge the settins?',
+'ipb-otherblocks-header' => 'Ither {{PLURAL:$1|block|blocks}}',
+'unblock-hideuser' => 'Ye canna onblock this uiser, aes thair uisername haes been skaukt.',
+'ipb_cant_unblock' => 'Mistak: Block ID $1 na foond. It micht hae been onblockit awreadie.',
+'ipb_blocked_as_range' => 'Mistak: The IP address $1 isna blockit directlir n canna be onblockit.
+It is, houever, blockit aes pairt o the range $2, n this can be onblockit.',
+'ip_range_invalid' => 'Onvalid IP range.',
+'ip_range_toolarge' => 'Range blocks muckler than /$1 ar na permitit.',
+'proxyblocker' => 'Proxie blocker',
+'proxyblockreason' => "Yer IP address haes been blockit cause it's aen apen proxie. Please contact yer Internet service provider or tech support n inform them o this serious securitie problem.",
'sorbsreason' => 'Yer IP address is leeted aes aen apen proxy in the DNSBL uised bi {{SITENAME}}.',
'sorbs_create_account_reason' => 'Yer IP address is leeted aes aen apen proxy in the DNSBL uised bi {{SITENAME}}.
Ye canna mak aen accoont.',
+'xffblockreason' => "Aen IP address present in the X-Forwarded-For heider, either yers or that o ae proxie server that ye'r uisin, haes been block. The oreeginal block raison wis: $1",
+'cant-see-hidden-user' => "The uiser that ye'r attemptin tae block haes awreadie been blockit n skaukt.
+Aes ye dinna hae the skaukuiser richt, ye canna see or eedit the uiser's block.",
+'ipbblocked' => 'Ye canna block or onblock ither uisers cause ye yersel is blockit.',
+'ipbnounblockself' => 'Yer na permitit tae onblock yersel.',
# Developer tools
'unlockdb' => 'Lowse database',
-'lockdbtext' => "Lockin the database will suspend the abeelitie o aa uisers tae eidit pages, chynge thair preeferences, eidit thair watchleets, an ither things requirin chynges in the database. Please confirm that this is whit ye'r etlin tae dae, an that ye'll lowse the database whan yer maintenance is duin.",
+'lockdbtext' => "Lockin the database will suspend the abeelitie o aw uisers tae eedit pages, chynge thair preeferences, eedit thair watchleets, n ither things needin chynges in the database. Please confirm that this is whit ye'r etlin tae dae, n that ye'll lowse the database whan yer maintenance is dun.",
'unlockdbtext' => 'Lowsin the database will gie back the abeelitie fer aa uisers tae eidit pages, chynge their preeferences, eidit their watchleets, an ither things needin chynges in the database. Please confirm that this is whit ye ettle tae dae.',
-'lockconfirm' => 'Aye, A raellie want tae lock the database.',
-'unlockconfirm' => 'Aye, A raelly want tae lowse the database.',
+'lockconfirm' => 'Ai, Ah reellie want tae lock the database.',
+'unlockconfirm' => 'Ai, Ah reellie want tae lowse the database.',
+'unlockbtn' => 'Lowse database',
'locknoconfirm' => 'Ye didna tick the confirmâtion kist.',
'lockdbsuccesssub' => 'Database lock fine',
'unlockdbsuccesssub' => 'Database lowsed',
'lockdbsuccesstext' => 'The database haes been lockit. <br />Mynd an tak the lock aff efter yer maintenance is feinisht.',
'unlockdbsuccesstext' => 'The database haes bin lowsed.',
+'lockfilenotwritable' => 'The database lock file isna writable.
+Tae lock or lowse the database, this needs tae be writable bi the wab server.',
'databasenotlocked' => 'The database isna lockit.',
+'lockedbyandtime' => '(bi {{GENDER:$1|$1}} oan $2 at $3)',
# Move page
-'move-page-legend' => 'Flit page',
+'move-page' => 'Muiv $1',
+'move-page-legend' => 'Muiv page',
'movepagetext' => "Uisin the form ablo will rename ae page, muivin aw o its histerie til the new name.
The auld title will become ae reguidal page til the new title.
-Ye can update reguidals that point til the oreeginal title autaematiclie.
-Gif ye chuis no tae, be sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].
-Ye'r responsible fer makin sair that airtins continue tae pynt til whaur they'r supposed to gae.
+Ye can update reguidals that poynt til the oreeginal title autæmateeclie.
+Gif ye chuise na tae, be sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].
+Ye'r responsible fer makin sair that links continue tae poynt til whaur thay'r supposed to gae.
-Note that the page will <strong>no</strong> be muived gif there is awreadie ae page at the new title, onless the latter is ae reguidal n haes nae past eidit histerie.
+Mynd that the page will <strong>na</strong> be muived gif thaur is awreadie ae page at the new title, onless the latter is ae reguidal n haes nae past eedit histerie.
This means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen exeestin page.
<strong>Warnishment!</strong>
-This can be ae drastic n onexpected chynge fer ae popular page;
-please be sair ye unnerstaun the consequences o this afore proceedin.",
+This can be ae drasteec n onexpectit chynge fer ae popular page;
+please be sair ye unnerstaunn the consequences o this afore proceedin.",
'movepagetext-noredirectfixer' => "Uising the form ablo will rename ae page, muivin aw o its histerie til the new name.
The auld title will become ae reguidal page til the new title.
Be sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].
-Ye'r responsible fer makin sair that airtins continue tae pynt whaur thay'r supposed tae gae.
+Ye'r responsible fer makin sair that airtins continue tae poynt whaur thay'r supposed tae gae.
-Tak tent that the page will <strong>no</strong> be muived gif thaur's awreadie ae page at the new title, onless it is tuim an haes naw past eidit histerie.
-This means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, an ye canna owerwrite an existin page.
+Tak tent that the page will <strong>naw</strong> be muived gif thaur's awreadie ae page at the new title, onless it is tuim n haes naw past eedit histerie.
+This means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen existin page.
<strong>Warnishment!</strong>
This can be ae drastic n onexpectit chynge fer ae popular page;
-please be sair ye unnerstaun the consequences o this afore preceedin.",
+please be sair that ye unnerstaun the consequences o this afore preceedin.",
'movepagetalktext' => 'The associated tauk page will be autaematiclie muived alang wi it <strong>onless:</strong>
*A no-tuim tauk page awreadie exeests unner the new name, or
*Ye oncheck the kist ablo.
In thae cases, ye will hae tae muiv or merge the page manuallie gif ye sae desire.',
-'movearticle' => 'Flit page:',
-'moveuserpage-warning' => "<strong>Warnishment:</strong> Ye'r aboot tae muiv ae uiser page. Please tak tent that yinly the page will be muivd n the uiser will <em>no</em> be renamed.",
-'movenologintext' => 'Ye maun be a registert uiser an [[Special:UserLogin|loggit in]] tae flit a page.',
-'newtitle' => 'Tae new teitle',
-'movepagebtn' => 'Flit page',
+'movearticle' => 'Muiv page:',
+'moveuserpage-warning' => "<strong>Warnishment:</strong> Ye'r aboot tae muiv ae uiser page. Please tak tent that yinlie the page will be muivd n the uiser will <em>naw</em> be renamed.",
+'movenologintext' => 'Ye maun be a registert uiser n [[Special:UserLogin|loggit in]] tae muiv ae page.',
+'movenotallowed' => 'Ye dinna hae permeession tae muiv pages.',
+'movenotallowedfile' => 'Ye dinna hae permeession tae muiv files.',
+'cant-move-user-page' => 'Ye dinna hae permeession tae muiv uiser pages (aside fae subpages).',
+'cant-move-to-user-page' => 'Ye dinna hae permeession tae muiv ae page til ae uiser page (except til ae uiser subpage).',
+'newtitle' => 'Til new teitle',
+'move-watch' => 'Watch soorce page n tairget page',
+'movepagebtn' => 'Muiv page',
'pagemovedsub' => 'Flittin succeedit',
'movepage-moved' => '<strong>"$1" has been muived til "$2"</strong>',
+'movepage-moved-redirect' => 'Ae reguidal haes been cræftit.',
+'movepage-moved-noredirect' => 'The cræftin o ae reguidal haes been suppressed.',
'articleexists' => "A page o that name aareadies exists, or the name ye'v waled isna guid. Please wale anither name.",
+'cantmove-titleprotected' => 'Ye canna muiv ae page til this location cause the new title haes been protected fae cræftin',
'movetalk' => 'Muiv associated tauk page',
-'movelogpage' => 'Flit log',
+'move-subpages' => 'Muiv subpages (up til $1)',
+'move-talk-subpages' => 'Muiv subpages o tauk page (up til $1)',
+'movepage-page-exists' => 'The page $1 awreadie exeests n canna be autæmateeclie owerwritten.',
+'movepage-page-moved' => 'The page $1 haes been muived til $2.',
+'movepage-page-unmoved' => 'The page $1 coudna be muived til $2.',
+'movepage-max-pages' => 'The mmucklest o $1 {{PLURAL:$1|page|pages}} haes been muived n naw mair will be muived autæmateeclie.',
+'movelogpage' => 'Muiv log',
'movelogpagetext' => "A leet o pages that's flitted is ablo.",
+'movesubpagetext' => 'This page haes $1 {{PLURAL:$1|subpage|subpages}} shawn ablo.',
+'movenosubpage' => 'This page haes naw subpages.',
'movereason' => 'Raeson:',
'revertmove' => 'revert',
-'delete_and_move' => 'Delete an muiv',
+'delete_and_move' => 'Delyte n muiv',
'delete_and_move_text' => '==Delytion caad fer==
The destination airticle "[[:$1]]" aareadies exists. Div ye want tae delyte it fer tae mak wey fer the muiv?',
'delete_and_move_confirm' => 'Ai, delyte the page',
-'delete_and_move_reason' => 'Deletit fer tae mak way fer muiv fae "[[$1]]"',
-'selfmove' => 'Ootgaun an incomin teitles is the same; canna flit a page ower itsel.',
-'protectedpagemovewarning' => '<strong>Warnishment:</strong> This page haes been protected sae that yinly uisers wi admeenistrater preevileges can muiv it.
-The latest log entry is provided ablo fer reference:',
-'semiprotectedpagemovewarning' => '<strong>Note:</strong> This page has been protected sae that yinly registered uisers can muiv it.
-The hainmaist log entry is provided ablow fer reference:',
+'delete_and_move_reason' => 'Delytit fer tae mak wa fer muiv fae "[[$1]]"',
+'selfmove' => 'Ootgaun n incomin teitles ar the same; canna muiv ae page ower itsel.',
+'immobile-source-namespace' => 'Canna muiv pages in namespace "$1"',
+'immobile-target-namespace' => 'Canna muiv pages intil namespace "$1"',
+'immobile-target-namespace-iw' => 'Interwiki link isna ae valeed tairget fer page muiv.',
+'immobile-source-page' => 'This page is na muivable.',
+'immobile-target-page' => 'Canna muiv til that desteenation title.',
+'bad-target-model' => 'The desired desteenation uises ae differant content model. Canna convert fae $1 til $2.',
+'imagenocrossnamespace' => 'Canna muiv file til non-file namespace',
+'nonfile-cannot-move-to-file' => 'Canna muiv non-file til file namespace',
+'imagetypemismatch' => 'The new file extension disna match its type',
+'imageinvalidfilename' => 'The tairget filename is onvalit',
+'fix-double-redirects' => 'Update onie reguidals that poynt til the oreeginal title',
+'move-leave-redirect' => 'Lea ae reguidal ahint',
+'protectedpagemovewarning' => '<strong>Warnishment:</strong> This page haes been protected sae that yinlie uisers wi admeenistrater preevleges can muiv it.
+The latest log entrie is gien ablo fer referance:',
+'semiprotectedpagemovewarning' => '<strong>Mynd:</strong> This page haes been protected sae that yinlie registered uisers can muiv it.
+The hainmaist log entrie is gien ablo fer referance:',
+'move-over-sharedrepo' => '== File exeests ==
+[[:$1]] exeests oan ae shaired reposeeterie. Muiving ae file til this title will owerride the shaired file.',
+'file-exists-sharedrepo' => 'The filename chosen is awreadie in uise oan ae shaired reposeeterie.
+Please chuise anither name.',
# Export
'export' => 'Export pages',
-'exporttext' => 'Ye can export the tex an eiditin histerie o ae parteecular page or set o pages wrapped in some XML.
+'exporttext' => 'Ye can export the tex n eeditin histerie o ae parteecular page or set o pages wrapped in some XML.
This can be imported intil anither wiki uisin MediaWiki bi waa o the [[Special:Import|import page]].
-Tae export pages, enter the titles in the tex kist ablo, yin title per line, an select whether ye want the current reveesion aes weel aes aw auld reveesions, wi the page histerie lines, or the current reveesion wi the info aneat the laist eidit.
+Tae export pages, enter the titles in the tex kist ablo, yin title per line, n select whether ye want the Nou reveesion aw auld reveesions ava, wi the page histerie lines, or the Nou reveesion wi the info aneat the laist eedit.
-In the latter case ye can ava uise ae link, fer example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fer the page "[[{{MediaWiki:Mainpage}}]]".',
-'exportcuronly' => 'Inclæde juist the current reveesion, no the ful histerie',
+In the latter case ye can uise ae link ava, fer example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fer the page "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Export aw pages',
+'exportcuronly' => 'Inclæde juist the nou reveesion, naw the ful histerie',
'exportnohistory' => '----
-<strong>Note:</strong> Exporting the ful histerie o pages through this form has been disabled caus o performance raisons.',
+<strong>Mynd:</strong> Exportin the ful histerie o pages throogh this form haes been disabled cause o performance raisons.',
+'exportlistauthors' => 'Incluid ae ful leet o contreebuters fer ilka page',
+'export-addcattext' => 'Add pages fae categerie:',
+'export-addnstext' => 'Add pages fae namespace:',
+'export-download' => 'Hain aes file',
+'export-templates' => 'Incluid templates',
+'export-pagelinks' => 'Incluid linkt pages til ae depth o:',
# Namespace 8 related
'allmessages' => 'Aa seestem messages',
'allmessagesdefault' => 'Defaut message tex',
'allmessagescurrent' => 'Message tex the nou',
'allmessagestext' => 'This is ae leet o system messages available in the MediaWiki namespace.
-Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] an [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.',
+Please veesit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.',
'allmessagesnotsupportedDB' => "'''{{ns:special}}:AllMessages''' nae supportit acause '''\$wgUseDatabaseMessages''' is aff.",
+'allmessages-filter' => 'Filter b custymization state:',
+'allmessages-filter-unmodified' => 'Onmodified',
+'allmessages-filter-all' => 'Aw',
+'allmessages-filter-modified' => 'Modeefied',
+'allmessages-prefix' => 'Filter bi prefix:',
+'allmessages-language' => 'Leid:',
+'allmessages-filter-submit' => 'Gang',
'allmessages-filter-translate' => 'Owerset',
# Thumbnails
'thumbnail-more' => 'Eik',
'filemissing' => 'File missin',
'thumbnail_error' => 'Mistak makin thummnail: $1',
+'thumbnail_error_remote' => 'Mistak message fae $1:
+$2',
+'djvu_page_error' => 'DjVu page oot o range',
+'djvu_no_xml' => 'Onable tae fetch XML fer DjVu file',
+'thumbnail-temp-create' => 'Onable tae cræft temprie thummnail file',
+'thumbnail-dest-create' => 'Onable tae hain thummnail til desteenation',
+'thumbnail_invalid_params' => 'Onvalit thummnail parameters',
+'thumbnail_dest_directory' => 'Onable tae cræft desteenation directerie',
+'thumbnail_image-type' => 'Eemage type na supported',
+'thumbnail_gd-library' => 'Oncompleate GD librie confeeguration: Missin function $1',
+'thumbnail_image-missing' => 'File seems tae be missin: $1',
'thumbnail_image-failure-limit' => 'There hae been ower moni recent failed attempts ($1 or mair) tae render this thumbnail. Please try again later.',
# Special:Import
-'importtext' => 'Please export the file fae the soorce wiki uising the [[Special:Export|export utility]].
-Hain it til yer computer an uplaid it here.',
+'import-interwiki-text' => "Select ae wiki n page title tae import.
+Reveesion dates n eediters' names will be preserved.
+Aw transwiki import actions ar loggit at the [[Special:Log/import|import log]].",
+'import-interwiki-source' => 'Soorce wiki/page:',
+'import-interwiki-history' => 'Copie aw histerie reveesions fer this page',
+'import-interwiki-templates' => 'Incluid aw templates',
+'import-interwiki-namespace' => 'Desteenation namespace:',
+'import-interwiki-rootpage' => 'Desteenation ruit page (aen optie):',
+'importtext' => 'Please export the file fae the soorce wiki uising the [[Special:Export|export utilitie]].
+Hain it til yer computer n uplaid it here.',
+'importstart' => 'Importin pages...',
+'import-revision-count' => '$1 {{PLURAL:$1|reveesion|reveesions}}',
+'importnopages' => 'Naw pages tae import.',
+'imported-log-entries' => 'Imported $1 {{PLURAL:$1|log entrie|log entries}}.',
+'importunknownsource' => 'Onkent import soorce type',
+'importcantopen' => 'Coudna apen import file',
'importnotext' => 'Tuim or nae tex',
'importsuccess' => 'Importit fine!',
'importhistoryconflict' => 'Conflictin histerie reveesion exeests (micht hae importit this page afore)',
-'importnosources' => 'Nae transwiki import soorces haes been defined an direct history uplaids is disabled.',
-'import-nonewrevisions' => 'Nae revisions imported (aw were either awready present, or skipped cause o errors).',
+'importnosources' => 'Nae transwiki import soorces haes been defined n direct histerie uplaids is disabled.',
+'importnofile' => 'Naw import file wis uplaided.',
+'importuploaderrorsize' => 'Uplaid o import file failed.
+The file is muckler than the permitit uplaid size.',
+'importuploaderrorpartial' => 'Uplaid o import file failed.
+The file wis yinlie pairtlie uplaided.',
+'importuploaderrortemp' => 'Uplaid o import file failed.
+Ae temparie fauder is missin.',
+'import-noarticle' => 'Naw page tae import!',
+'import-nonewrevisions' => 'Nae reveesions imported (aw were either awreadie present, or skipt cause o mistaks).',
+'import-upload' => 'Uplaid XML data',
+'import-token-mismatch' => 'Loss o session data.
+Please gie it anither gae.',
+'import-invalid-interwiki' => 'Canna import fae the speceefied wiki.',
+'import-error-edit' => 'Page "$1" isna importit cause ye\'r na permitit tae eedit it.',
+'import-error-create' => 'Page "$1" is na importit cause ye\'r na permitit tae cræft it.',
+'import-error-interwiki' => 'Page "$1" is na importit cause its name is reserved fer external linkin (interwiki).',
+'import-error-special' => 'Page "$1" is na importit cause it belangs til ae speecial namespace that disna permit pages.',
+'import-error-invalid' => 'Page "$1" is na importit cause its name is onvalit.',
+'import-error-unserialize' => 'Reveesion $2 o page "$1" coudna be onsereealized. The reveesion wis reported til uiss content model $3 sereealized aes $4.',
'import-error-bad-location' => 'Reveesion $2 uisin content model $3 canna be stored oan "$1" oan this wiki, syn that model isna supported oan that page.',
+'import-options-wrong' => 'Wrang {{PLURAL:$2|optie|opties}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Gien ruit page is aen onvalit title.',
+'import-rootpage-nosubpage' => 'Namespace "$1" o the ruit page disna permit subpages.',
+
+# Import log
+'importlogpagetext' => 'Admeenistrateeve imports o pages wi eedit histerie fae ither wikis.',
+'import-logentry-upload' => 'imported [[$1]] bi file uplaid',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|reveesion|reveesions}}',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|reveesion|reveesions}} fae $2',
+
+# JavaScriptTest
+'javascripttest' => 'JavaScript testin',
+'javascripttest-title' => 'Rinnin $1 tests',
+'javascripttest-pagetext-noframework' => 'This page is reserved fer rinnin JavaScript tests.',
+'javascripttest-pagetext-unknownframework' => 'Onkent testin framewairk "$1".',
+'javascripttest-pagetext-frameworks' => 'Please chuise yin o the follaein testin framewairks: $1',
+'javascripttest-pagetext-skins' => 'Chuise ae skin tae rin the tests wi:',
+'javascripttest-qunit-intro' => 'See [$1 testin documentation] oan mediawiki.org.',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Yer uiser page',
+'tooltip-pt-anonuserpage' => "The uiser page fer the IP address that ye'r eeditin aes",
'tooltip-pt-mytalk' => 'Yer tauk page',
+'tooltip-pt-anontalk' => 'Discussion aneat eedits fae this IP address',
'tooltip-pt-preferences' => 'Ma preferences',
'tooltip-pt-watchlist' => "Ae leet o pages ye'r moniterin fer chynges",
'tooltip-pt-mycontris' => 'Leet o yer contreebutions',
'tooltip-pt-login' => "It's a guid idea tae log i, but ye dinna hae tae.",
'tooltip-pt-logout' => 'Log oot',
'tooltip-ca-talk' => 'Discussion aneat the content page',
-'tooltip-ca-edit' => 'Ye can edit this page. Please uise the preview button afore hainin',
+'tooltip-ca-edit' => 'Ye can eedit this page. Please uise the luikower button afore hainin',
'tooltip-ca-addsection' => 'Stairt a new section',
'tooltip-ca-viewsource' => 'This page is protectit.
Ye can view its soorce',
-'tooltip-ca-history' => "Bygane revisions o' this page",
+'tooltip-ca-history' => 'Bygane reveesions o this page',
'tooltip-ca-protect' => 'Fend this page',
+'tooltip-ca-unprotect' => 'Chynge protection o this page',
'tooltip-ca-delete' => 'Delyte this page',
-'tooltip-ca-move' => 'Flit this page',
-'tooltip-ca-watch' => 'Add this page tae yer watchleet',
+'tooltip-ca-undelete' => 'Restore the eedits dun oan this page afore it wis delytit',
+'tooltip-ca-move' => 'Muiv this page',
+'tooltip-ca-watch' => 'Add this page til yer watchleet',
'tooltip-ca-unwatch' => 'Remove this page frum yer watchleet',
'tooltip-search' => 'Rake {{SITENAME}}',
-'tooltip-search-go' => 'Gang til ae page wi this exact name gif exists',
+'tooltip-search-go' => 'Gang til ae page wi this exact name gif exeests',
'tooltip-search-fulltext' => 'Rake the pages fer this tex',
-'tooltip-p-logo' => 'Gang tae the Main Page',
-'tooltip-n-mainpage' => 'Gang tae the Main Page',
-'tooltip-n-mainpage-description' => 'Gang tae the Main Page',
+'tooltip-p-logo' => 'Gang til the Main Page',
+'tooltip-n-mainpage' => 'Gang til the Main Page',
+'tooltip-n-mainpage-description' => 'Gang til the Main Page',
'tooltip-n-portal' => 'Aneat the project, whit ye can dae, whaur tae fynd things',
'tooltip-n-currentevents' => "Fin' background speirins oan current events",
'tooltip-n-recentchanges' => 'The leet o recent chynges in the wiki',
'tooltip-n-randompage' => 'Laid ae random page',
'tooltip-n-help' => 'The steid tae fynd oot',
'tooltip-t-whatlinkshere' => "List o' a' wiki pages that link 'ere",
-'tooltip-t-recentchangeslinked' => 'Recent changes in pages linked frae this page',
+'tooltip-t-recentchangeslinked' => 'Recynt chynges in pages linkt fae this page',
+'tooltip-feed-rss' => 'RSS feed fer this page',
'tooltip-feed-atom' => 'Atom feed fer this page',
'tooltip-t-contributions' => "View this uiser's contreebutions",
'tooltip-t-emailuser' => 'Send ae wab-mail til this uiser',
'tooltip-t-permalink' => 'Permanent link til this reveesion o the page',
'tooltip-ca-nstab-main' => 'Leuk at content page',
'tooltip-ca-nstab-user' => 'View the uiser page',
-'tooltip-ca-nstab-special' => "This is ae byordinair page, ye cannae eidit th' page itsel",
+'tooltip-ca-nstab-media' => 'See the media page',
+'tooltip-ca-nstab-special' => 'This is ae byordinair page, ye canna eedit the page itsel',
'tooltip-ca-nstab-project' => 'See the waurk page',
'tooltip-ca-nstab-image' => 'View the file page',
+'tooltip-ca-nstab-mediawiki' => 'See the system message',
'tooltip-ca-nstab-template' => 'View the template',
+'tooltip-ca-nstab-help' => 'See the heelp page',
'tooltip-ca-nstab-category' => 'View the categerie page',
'tooltip-minoredit' => 'Mairk this as a smaa edit',
'tooltip-save' => 'Hain yer chynges',
'tooltip-diff' => 'Shaw the chynges that ye makit til the tex.',
'tooltip-compareselectedversions' => 'See the differs atween the twa selectit versions o this page.',
'tooltip-watch' => 'Add this page tae yer watchleet',
-'tooltip-rollback' => '"Rowback" reverts edit(s) tae this page o the lai=st contreibutor in ane dab',
-'tooltip-undo' => '"Ondae" reverts this edit n apens the eidit form in luikower mode. It permits addin ae raison in the owerview.',
+'tooltip-watchlistedit-normal-submit' => 'Remuiv titles',
+'tooltip-watchlistedit-raw-submit' => 'Update watchleet',
+'tooltip-recreate' => "Recræft the page even thoogh it's been delytit",
+'tooltip-upload' => 'Stairt uplaid',
+'tooltip-rollback' => '"Rowback" reverts eedit(s) til this page o the laist contreebuter in yin clap',
+'tooltip-undo' => '"Ondae" reverts this eedit n apens the eedit form in luikower mode. It permits addin ae raison in the owerview.',
+'tooltip-preferences-save' => 'Hain preeferances',
'tooltip-summary' => 'Enter ae short owerview',
# Metadata
# Attribution
'anonymous' => 'Nameless {{PLURAL:$1|uiser|uisers}} o {{SITENAME}}',
'siteuser' => '{{SITENAME}} uiser $1',
+'anonuser' => '{{SITENAME}} anonymoos uiser $1',
+'lastmodifiedatby' => 'This page wis laist modified $2, $1 bi $3.',
'othercontribs' => 'Based oan wark bi $1.',
'others' => 'ithers',
'siteusers' => '{{SITENAME}} {{PLURAL:$2|uiser|uisers}} $1',
+'anonusers' => '{{SITENAME}} anonymoos {{PLURAL:$2|uiser|uisers}} $1',
+'creditspage' => 'Page creeedits',
'nocredits' => "Thaur's nae creedit info available fer this page.",
# Spam protection
'spamprotectiontext' => 'The tex ye wished tae save wis blockit bi the spam filter.
This is maistlikly caused bi aen airtin til ae blaickleeted external site.',
'spamprotectionmatch' => 'The follaein tex is whit triggered wir spam filter: $1',
+'spam_reverting' => 'Revertin til the laist reveesion na containin links til $1',
+'spam_blanking' => 'Aw reveesions contained links til $1, blankin',
+'spam_deleting' => 'Aw reveesions contained links til $1, delytin',
'simpleantispam-label' => 'Anti-spam check.
-Dae <strong>NO</strong> ful this in!',
+Div <strong>NAW</strong> ful this in!',
+
+# Info page
+'pageinfo-title' => 'Information fer "$1"',
+'pageinfo-not-current' => "Sairrie, it's na possible tae provide this information fer auld reveesions.",
+'pageinfo-header-edits' => 'Eedit histerie',
+'pageinfo-display-title' => 'Displey title',
+'pageinfo-default-sort' => 'Defaut sort key',
+'pageinfo-language' => 'Page content leid',
+'pageinfo-robot-policy' => 'Indexin bi robots',
+'pageinfo-robot-index' => 'Permitit',
+'pageinfo-robot-noindex' => 'Na permitit',
+'pageinfo-views' => 'Nummer o luiks',
+'pageinfo-watchers' => 'Nummer o page watchers',
+'pageinfo-few-watchers' => 'Less than $1 {{PLURAL:$1|watcher|watchers}}',
+'pageinfo-redirects-name' => 'Nummer o reguidals til this page',
+'pageinfo-subpages-name' => 'Nummer o subpages o this page',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|reguidal|reguidals}}; $3 {{PLURAL:$3|non-reguidal|non-reguidals}})',
+'pageinfo-firstuser' => 'Page cræfter',
+'pageinfo-firsttime' => 'Date o page cræftin',
+'pageinfo-lastuser' => 'Latest eediter',
+'pageinfo-lasttime' => 'Date o latest eedit',
+'pageinfo-edits' => 'Total nummer o eedits',
+'pageinfo-authors' => 'Total nummer o disteenct writers',
+'pageinfo-recent-edits' => 'Recent nummer o eedits (wiin past $1)',
+'pageinfo-recent-authors' => 'Recynt nummer o disteenct writers',
+'pageinfo-magic-words' => 'Magic {{PLURAL:$1|waird|wairds}} ($1)',
+'pageinfo-hidden-categories' => 'Skaukt {{PLURAL:$1|categerie|categeries}} ($1)',
+'pageinfo-templates' => 'Transcluided {{PLURAL:$1|template|templates}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Page|Pages}} transcluided oan ($1)',
+'pageinfo-redirectsto' => 'Reguidals til',
+'pageinfo-contentpage' => 'Coonted aes ae content page',
+'pageinfo-contentpage-yes' => 'Ay',
+'pageinfo-protect-cascading' => 'Protections ar cascadin fae here',
+'pageinfo-protect-cascading-yes' => 'Ay',
+'pageinfo-protect-cascading-from' => 'Protections ar cascadin fae here',
+'pageinfo-category-info' => 'Categerie information',
+'pageinfo-category-pages' => 'Nummer o pages',
+'pageinfo-category-subcats' => 'Nummer o subcategeries',
+'pageinfo-category-files' => 'Nummer o files',
# Patrolling
'markaspatrolleddiff' => 'Merk as patrolled',
'markaspatrolledtext' => 'Merk this airticle as patrolled',
'markedaspatrolled' => 'Merkit as patrolled',
'markedaspatrolledtext' => 'The selected reveesion o [[:$1]] haes been maurked aes patrolled.',
-'rcpatroldisabledtext' => 'The Recent Changes Patrol feature is disabled the nou.',
+'rcpatroldisabled' => 'Recynt chynges patrol disabled',
+'rcpatroldisabledtext' => 'The Recynt Chynges Patrol featur is disabled the nou.',
+'markedaspatrollederror' => 'Canna maurk aes patrowed',
+'markedaspatrollederrortext' => 'Ye need tae speceefie ae reveesion tae maurk aes patrowed.',
+'markedaspatrollederror-noautopatrol' => "Ye'r na permitit tae maurk yer ain chynges aes patrowed.",
+'markedaspatrollednotify' => 'This chynge til $1 haes been maurked aes patrowed.',
+'markedaspatrollederrornotify' => 'Maurking aes patrowed failed.',
+
+# Patrol log
+'patrol-log-page' => 'Patrow log',
+'patrol-log-header' => 'This is ae log o patrowed reveesions.',
+'log-show-hide-patrol' => '$1 patrow log',
# Image deletion
'deletedrevision' => 'Delytit auld reveesion $1.',
+'filedeleteerror-short' => 'Mistak delytin file: $1',
+'filedeleteerror-long' => 'mistaks were encoontered while delytin the file:
+
+$1',
+'filedelete-missing' => 'The file "$1" canna be delytit cause it disna exeest.',
+'filedelete-old-unregistered' => 'The speceefied file reveesion "$1" isna in the database.',
+'filedelete-current-unregistered' => 'The speceefied file "$1" isna in the database.',
+'filedelete-archive-read-only' => 'The archyve directerie "$1" isna writable bi the wabserver.',
# Browsing diffs
-'previousdiff' => '← Aulder eidit',
-'nextdiff' => 'Newer eidit →',
+'previousdiff' => '← Aulder eedit',
+'nextdiff' => 'Newer eedit →',
# Media information
-'mediawarning' => '<strong>Wairnin:</strong> This file type micht contain maleecious code.
-Bi executing it, yer system micht be compromised.',
+'mediawarning' => '<strong>Warnishment:</strong> This file type micht contain maleecious code.
+Bi executin it, yer system micht be compromised.',
'imagemaxsize' => 'Eimage size limit:<br /><em>(fer file description pages)</em>',
+'thumbsize' => 'Thummnail size:',
'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
'file-nohires' => 'Na higher resolution available.',
'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
+'svg-long-desc-animated' => 'Animated SVG file, nominallie $1 × $2 pixels, file size: $3',
+'svg-long-error' => 'Onvalit SVG file: $1',
'show-big-image' => 'Oreeginal file',
-'file-no-thumb-animation' => '<strong>Note: Due til technical limitations, thumbnails o this file will no be animated.</strong>',
-'file-no-thumb-animation-gif' => '<strong>Note: Due til technical limitations, thumbnails o hich resolution GIF eimages sic as this will no be animated.</strong>',
+'show-big-image-preview' => 'Size o this luikower: $1.',
+'show-big-image-other' => 'Ither {{PLURAL:$2|resolution|resolutions}}: $1.',
+'file-info-gif-looped' => "luip't",
+'file-info-png-looped' => "luip't",
+'file-info-png-repeat' => 'pleyed $1 {{PLURAL:$1|time|times}}',
+'file-no-thumb-animation' => '<strong>Mynd: Due til techneecal limitations, thummnails o this file will na be animated.</strong>',
+'file-no-thumb-animation-gif' => '<strong>Mynd: Due til techneecal limitations, thummnails o hei resolution GIF eemages sic aes this will na be animated.</strong>',
# Special:NewFiles
'newimages' => 'Gallery o new files',
'imagelisttext' => 'Ablo is a leet o $1 {{PLURAL:$1|eimage|eimages}} sortit $2.',
-'noimages' => 'Naething tae see.',
+'newimages-summary' => 'This byordinair page shaws the last uplaidit files.',
+'newimages-label' => 'Filename (or ae pairt o it):',
+'noimages' => 'Nawthing tae see.',
'ilsubmit' => 'Rake',
'bydate' => 'bi date',
+'sp-newimages-showfrom' => 'Shaw new files stairtin fae $2, $1',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 seicont|$1 seiconts}}',
+'hours' => '{{PLURAL:$1|$1 hoor|$1 hoors}}',
+'ago' => '$1 sin',
+'just-now' => 'richt nou',
+
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hoor|hoors}} sin',
+'minutes-ago' => '$1 {{PLURAL:$1|minute|minutes}} sin',
+'seconds-ago' => '$1 {{PLURAL:$1|seicont|seiconts}} sin',
+'monday-at' => 'Monenday at $1',
+'wednesday-at' => 'Wedensday at $1',
+'friday-at' => 'Frisday at $1',
# Bad image list
'bad_image_list' => 'The format is aes follaes:
# Metadata
'metadata' => 'Metadata',
-'metadata-help' => 'This file contains addeetional speirins, likelie added frae the deegital camera or scanner uised tae mak or deegitize it.
-Gif the file haes bin modified frae its oreeginal state, some details micht no fullie reflect the modified file.',
-'metadata-fields' => "Image metadata fields leeted in this message wull be inclæded oan eimage page displey whan the metadata buird is collaps't. Ithers wull be skauk't bi defaut.
+'metadata-help' => 'This file contains addeetional speirins, likelie added fae the deegital camera or scanner uised tae cræft or deegitize it.
+Gif the file haes bin modified fae its oreeginal state, some details micht naw fullie reflect the modified file.',
+'metadata-expand' => 'Shaw extendit details',
+'metadata-collapse' => 'Skauk extendit details',
+'metadata-fields' => "Eemage metadata fields leetit in this message will be incluidit oan eemage page displey whan the metadata buird is collaps't. Ithers will be skaukt bi defaut.
* mak
* model
* datetimeoreeginal
* focallength
* airtist
* copiericht
-* eimagedescreeption
-* gpslatitude
-* gpslangitude
-* gpsaltitude",
+* eemagedescreeption
+* gpslateetuid
+* gpslangeetuid
+* gpsalteetuid",
# Exif tags
+'exif-imagelength' => 'Heicht',
+'exif-photometricinterpretation' => 'Pixel composeetion',
+'exif-samplesperpixel' => 'Nummer o components',
+'exif-ycbcrsubsampling' => 'Subsamplin ratio o Y til C',
+'exif-ycbcrpositioning' => 'Y n C poseetionin',
+'exif-yresolution' => 'Verteecal resolution',
+'exif-stripoffsets' => 'Eemage data location',
+'exif-rowsperstrip' => 'Nummer o raws per streep',
+'exif-stripbytecounts' => 'Bytes per compressed streep',
+'exif-jpeginterchangeformat' => 'Affset til JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'Bytes o JPEG data',
+'exif-whitepoint' => 'White poynt chromateeceetie',
+'exif-primarychromaticities' => 'Chromateeceeties o primarities',
+'exif-ycbcrcoefficients' => 'Colour space transformation matrix coeffeecients',
+'exif-referenceblackwhite' => 'Pair o blaick n white referance values',
+'exif-datetime' => 'File chynge date n time',
+'exif-imagedescription' => 'Eemage title',
+'exif-software' => 'Saffware uised',
+'exif-artist' => 'Writer',
'exif-copyright' => 'Copyricht hauder',
+'exif-flashpixversion' => 'Supportit Flashpix version',
'exif-colorspace' => 'Colour space',
'exif-componentsconfiguration' => 'Meanin o ilka component',
'exif-compressedbitsperpixel' => 'Eimage compression mode',
+'exif-pixelydimension' => 'Eemage width',
+'exif-pixelxdimension' => 'Eemage heicht',
+'exif-usercomment' => 'Uiser comments',
+'exif-relatedsoundfile' => 'Relatit audío file',
+'exif-datetimeoriginal' => 'Date n time o data generation',
+'exif-datetimedigitized' => 'Date n time o deegeetizin',
+'exif-subsectime' => 'DateTime subseiconts',
+'exif-subsectimeoriginal' => 'DateTimeOreeginal subseiconts',
+'exif-subsectimedigitized' => 'DateTimeDeegeetized subseiconts',
+'exif-fnumber' => 'F Nummer',
+'exif-spectralsensitivity' => 'Spectral sensiteevitie',
+'exif-isospeedratings' => 'ISO speed ratin',
'exif-brightnessvalue' => 'APEX brichtness',
+'exif-maxaperturevalue' => 'Mucklest launn aperture',
+'exif-meteringmode' => 'Meterin mode',
+'exif-lightsource' => 'Licht soorce',
+'exif-subjectarea' => 'Subject airt',
+'exif-flashenergy' => 'Flash energie',
+'exif-sensingmethod' => 'Sensin methyd',
+'exif-filesource' => 'File soorce',
+'exif-customrendered' => 'Custym eemage processin',
+'exif-digitalzoomratio' => 'Deegeetal zuim ratio',
+'exif-sharpness' => 'Shairpness',
+'exif-devicesettingdescription' => 'Device settins descreeption',
+'exif-subjectdistancerange' => 'Subject deestance range',
+'exif-imageuniqueid' => 'Uníque eemage ID',
+'exif-gpslatituderef' => 'Nort or sooth lateetude',
+'exif-gpslatitude' => 'Lateetude',
+'exif-gpslongituderef' => 'Aest or west langeetude',
+'exif-gpslongitude' => 'Langeetude',
+'exif-gpsaltituderef' => 'Altítude reference',
+'exif-gpsaltitude' => 'Altítude',
+'exif-gpstimestamp' => 'GPS time (atomeec clock)',
+'exif-gpssatellites' => 'Satellites uised fer measurement',
+'exif-gpsstatus' => 'Receever status',
+'exif-gpsdop' => 'Measurement preeceesion',
+'exif-gpsspeed' => 'Speed o GPS receever',
+'exif-gpstrackref' => 'Referance fer direction o muivement',
+'exif-gpstrack' => 'Direction o muivement',
+'exif-gpsimgdirectionref' => 'Referance fer direction o eemage',
+'exif-gpsimgdirection' => 'Direction o eemage',
+'exif-gpsmapdatum' => 'Geodeteec survey data uised',
+'exif-gpsdestlatituderef' => 'Referance fer lateetude o destination',
+'exif-gpsdestlatitude' => 'Lateetude destination',
+'exif-gpsdestlongituderef' => 'Reference fer langeetude o destination',
+'exif-gpsdestlongitude' => 'Langeetude o destination',
+'exif-gpsdestbearingref' => 'Referance fer bearin o destination',
+'exif-gpsdestbearing' => 'Bearin o destination',
+'exif-gpsdestdistanceref' => 'Reference fer distance til destination',
+'exif-gpsdestdistance' => 'Distance til destination',
+'exif-gpsprocessingmethod' => 'Name o GPS processin methyd',
+'exif-gpsareainformation' => 'Name o GPS airt',
+'exif-gpsdifferential' => 'GPS differantial correction',
+'exif-keywords' => 'Keywairds',
+'exif-worldregioncreated' => 'Region o the Yird that the picture wis taen in',
+'exif-countrycreated' => 'Kintra that the picture wis taen in',
+'exif-countrycodecreated' => 'Code fer the kintra that the picture wis taen in',
+'exif-provinceorstatecreated' => 'Provínce or state that the picture wis taen in',
+'exif-citycreated' => 'Ceetie that the picture wis taen in',
+'exif-sublocationcreated' => 'Sublocation o the ceetie that the picture wis taen in',
+'exif-worldregiondest' => 'Yird region shawn',
+'exif-countrydest' => 'Kintra shawn',
+'exif-countrycodedest' => 'Code fer kintra shawn',
+'exif-provinceorstatedest' => 'Provínce or state shawn',
+'exif-citydest' => 'Ceetie shawn',
+'exif-sublocationdest' => 'Sublocation o ceetie shawn',
+'exif-specialinstructions' => 'Byordiair insructions',
+'exif-headline' => 'Heidline',
+'exif-credit' => 'Creedit/Provider',
+'exif-source' => 'Soorce',
+'exif-editstatus' => 'Eediterial status o eemage',
+'exif-urgency' => 'Urgencie',
+'exif-fixtureidentifier' => 'Fixtur name',
+'exif-locationdest' => 'Location depeected',
+'exif-locationdestcode' => 'Code o location depeected',
+'exif-objectcycle' => 'Time o day that media is intended fer',
+'exif-languagecode' => 'Leid',
+'exif-iimcategory' => 'Categerie',
+'exif-iimsupplementalcategory' => 'Supplemental categeries',
+'exif-datetimeexpires' => 'Dinna uise efter',
+'exif-datetimereleased' => 'Released oan',
+'exif-originaltransmissionref' => 'Oreeginal transmeession location code',
+'exif-identifier' => 'Identefier',
+'exif-lens' => 'Lens uised',
+'exif-serialnumber' => 'Serial nummer o camera',
+'exif-cameraownername' => 'Ainer o camera',
+'exif-datetimemetadata' => 'Date metadata wis laist modeefied',
+'exif-nickname' => 'Informal name o eemage',
+'exif-rating' => 'Ratin (oot o 5)',
+'exif-rightscertificate' => 'Richts management certeeficate',
+'exif-copyrighted' => 'Copiericht status',
+'exif-copyrightowner' => 'Copiericht ainer',
+'exif-usageterms' => 'Uisage terms',
+'exif-webstatement' => 'Online copiericht statement',
+'exif-originaldocumentid' => 'Uníque ID o oreeginal document',
+'exif-licenseurl' => 'URL fer copiericht license',
+'exif-morepermissionsurl' => 'Alternative licensin information',
+'exif-attributionurl' => 'Whan re-uisin this wairk, please link til',
+'exif-preferredattributionname' => 'Whan re-uisin this wairk, please creedit',
+'exif-contentwarning' => 'Content warnishment',
+'exif-intellectualgenre' => 'Type o eetem',
+'exif-event' => 'Event depected',
+'exif-organisationinimage' => 'Organization depected',
+'exif-personinimage' => 'Person depected',
+'exif-originalimageheight' => 'Heicht o eemage afore it wis crappit',
+'exif-originalimagewidth' => 'Width o eemage afore it wis crappit',
+
+# Exif attributes
+'exif-compression-1' => "Oncompress't",
+'exif-compression-2' => 'CCITT Groop 3 1-Dimensional Modified Huffman rin length encodin',
+'exif-compression-3' => 'CCITT Groop 3 fax encodin',
+'exif-compression-4' => 'CCITT Groop 4 fax encodin',
+
+'exif-copyrighted-true' => 'Copierichted',
+'exif-copyrighted-false' => 'Copiericht status na set',
+
+'exif-unknowndate' => 'Onkent date',
+
+'exif-orientation-2' => 'Flipt horizontallie',
+'exif-orientation-3' => 'Rotatit 180°',
+'exif-orientation-4' => 'Flipt verticlie',
+'exif-orientation-5' => 'Rotatit 90° CCW n flip verticlie',
+'exif-orientation-6' => 'Rotatit 90° CCW',
+'exif-orientation-7' => 'Rotatit 90° CW n flipt verticlie',
+'exif-orientation-8' => 'Rotatit 90° CW',
+
+'exif-planarconfiguration-1' => 'chunkie format',
+
+'exif-colorspace-65535' => 'Oncalibratit',
'exif-componentsconfiguration-0' => 'disna exist',
+'exif-exposureprogram-0' => 'Na defined',
+'exif-exposureprogram-3' => 'Apertur prioritie',
+'exif-exposureprogram-4' => 'Shutter prioritie',
+'exif-exposureprogram-5' => 'Cræftie program (biased thewaird the depth o field)',
+'exif-exposureprogram-6' => 'Action program (biased thewaird fast shutter speed)',
+'exif-exposureprogram-7' => 'Portrait mode (fer closeup photæs wi the backgroond oot o focus)',
+'exif-exposureprogram-8' => 'Launnscape mode (fer launnscape photæs wi the backgroonn in focus)',
+
+'exif-meteringmode-0' => 'Onkent',
+'exif-meteringmode-2' => 'Center weichtit average',
+'exif-meteringmode-4' => 'Multí-Spot',
+'exif-meteringmode-6' => 'Pairtial',
+'exif-meteringmode-255' => 'Ither',
+
+'exif-lightsource-0' => 'Onkent',
+'exif-lightsource-1' => 'Daylicht',
+'exif-lightsource-2' => 'Fluorescant',
+'exif-lightsource-3' => 'Tungsten (incandescant licht)',
+'exif-lightsource-10' => 'Cloodie weather',
+'exif-lightsource-12' => 'Daylicht fluorescant (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Day white fluorescant (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Cuil white fluorescant (W 3900 – 4500K)',
+'exif-lightsource-15' => 'White fluorescant (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'Staunart licht A',
+'exif-lightsource-18' => 'Staunart licht B',
+'exif-lightsource-19' => 'Staunart licht C',
+'exif-lightsource-255' => 'Ither licht soorce',
+
+# Flash modes
+'exif-flash-fired-0' => 'Flash didna fire',
+'exif-flash-return-0' => 'naw flash return detection function',
+'exif-flash-return-2' => 'flash return licht na detectit',
+'exif-flash-return-3' => 'flash return licht detectit',
+'exif-flash-mode-1' => 'compulserie flash firin',
+'exif-flash-mode-2' => 'compulserie flash suppression',
+'exif-flash-mode-3' => 'autæ mode',
+'exif-flash-function-1' => 'Naw flash function',
+'exif-flash-redeye-1' => 'reid-ee reduction mode',
+
+'exif-sensingmethod-1' => 'Ondefined',
+'exif-sensingmethod-2' => 'Yin-chip colour airt senser',
+'exif-sensingmethod-3' => 'Twa-chip colour airt senser',
+'exif-sensingmethod-4' => 'Three-chip colour airt senser',
+'exif-sensingmethod-5' => 'Colour sequential airt senser',
+'exif-sensingmethod-7' => 'Trilinear senser',
+'exif-sensingmethod-8' => 'Colour sequential linear senser',
+
+'exif-filesource-3' => 'Deegeetal still camera',
+
+'exif-scenetype-1' => 'Ae directlie photægraphed eemage',
+
+'exif-customrendered-1' => 'Custym process',
+
+'exif-exposuremode-0' => 'Autæ exposure',
+'exif-exposuremode-2' => 'Autæ bracket',
+
+'exif-whitebalance-0' => 'Autæ white balance',
+
+'exif-scenecapturetype-0' => 'Staunart',
+'exif-scenecapturetype-1' => 'Launscape',
+'exif-scenecapturetype-3' => 'Nicht scene',
+
'exif-gaincontrol-0' => 'Nane',
+'exif-gaincontrol-1' => 'Law gain up',
+'exif-gaincontrol-2' => 'Hei gain up',
+'exif-gaincontrol-3' => 'Law gain doon',
+'exif-gaincontrol-4' => 'Hei gain doon',
'exif-contrast-1' => 'Saft',
+'exif-contrast-2' => 'Haurd',
+
+'exif-saturation-1' => 'Law saturation',
+'exif-saturation-2' => 'Hei saturation',
+
+'exif-sharpness-1' => 'Saff',
+'exif-sharpness-2' => 'Haurd',
+
+'exif-subjectdistancerange-0' => 'Onkent',
+'exif-subjectdistancerange-2' => 'Claise luik at',
+'exif-subjectdistancerange-3' => 'Distance sechtline',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Nort lateetude',
+'exif-gpslatitude-s' => 'Sooth lateetude',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Aest langeetude',
+'exif-gpslongitude-w' => 'West langeetude',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|meter|meters}} abuin sea level',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|meter|meters}} ablo sea level',
+
+'exif-gpsstatus-v' => 'Measurement interoperabeelitie',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'Kilometers aen hoor',
+'exif-gpsspeed-m' => 'Miles aen hoor',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-n' => 'Nauteecal miles',
+
+'exif-gpsdop-excellent' => 'Excellant ($1)',
+'exif-gpsdop-good' => 'Guid ($1)',
+'exif-gpsdop-poor' => 'Puir ($1)',
+
+'exif-objectcycle-a' => 'Mornin yinlie',
+'exif-objectcycle-p' => 'Evenin yinlie',
+'exif-objectcycle-b' => 'Baith mornin n evenin',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-m' => 'Magneteec direction',
+
+'exif-dc-contributor' => 'Contreebuters:',
+'exif-dc-coverage' => 'Spatial or tempral scope o media',
+'exif-dc-relation' => 'Relatit media',
+'exif-dc-rights' => 'Richts',
+'exif-dc-source' => 'Soorce media',
+'exif-dc-type' => 'Type o media',
+
+'exif-rating-rejected' => 'Rejectit',
+
+'exif-isospeedratings-overflow' => 'Muckler than 65535',
+
+'exif-iimcategory-ace' => 'Arts, cultur n entertainmant',
+'exif-iimcategory-clj' => 'Crime n law',
+'exif-iimcategory-dis' => 'Disasters n accidants',
+'exif-iimcategory-fin' => 'Economie n business',
+'exif-iimcategory-hth' => 'The Heal',
+'exif-iimcategory-hum' => 'Fawk interest',
+'exif-iimcategory-lab' => 'Laber',
+'exif-iimcategory-lif' => 'Lifestyle n leisure',
+'exif-iimcategory-pol' => 'Poleeteecs',
+'exif-iimcategory-rel' => 'Releegion n truent',
+'exif-iimcategory-sci' => 'Sciance n technologie',
+'exif-iimcategory-soi' => 'Social eessues',
+'exif-iimcategory-war' => 'War, conflict n onrest',
+
+'exif-urgency-low' => 'Law ($1)',
+'exif-urgency-high' => 'Hei ($1)',
+'exif-urgency-other' => 'Uiser-defined prioritie ($1)',
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'aw',
'monthsall' => 'aw',
# Email address confirmation
+'confirmemail' => 'Confirm wab-mail address',
'confirmemail_noemail' => 'Ye dinna hae a valid email address set in yer [[Special:Preferences|uiser preferences]].',
-'confirmemail_text' => 'This wiki requires ye tae validate yer e-mail address
-afore uisin e-mail featurs. Activate the button ablo tae send a confirmation
-mail tae yer address. The mail will include an airtin containing a code; laid the
-airtin in yer brouser tae confirm that yer e-mail address is guid.',
+'confirmemail_text' => 'This wiki needs ye tae validate yer wab-mail address
+afore uisin wab-mail featurs. Acteevate the button ablo tae send a confirmation
+mail til yer address. The mail will incluide ae link containin ae code; laid the
+ link in yer brouser tae confirm that yer wab-mail address is guid.',
+'confirmemail_pending' => 'Ae confirmation code haes awreadie been wab-mailed til ye;
+gif ye recantlie cræftit yer accoont, ye micht wish tae wait ae few minutes fer it tae arrive afore speirin fer ae new code.',
+'confirmemail_send' => 'Mail ae confirmation code',
+'confirmemail_sent' => 'Confirmation wab-mail sent.',
+'confirmemail_oncreate' => "Ae confirmation code wis sent til yer wab-mail address.
+This code isna required tae log in, but ye'll need tae gie it afore enablin onie wab-mail-based featurs in the wiki.",
'confirmemail_sendfailed' => '{{SITENAME}} coudna send yer confirmation mail.
Please check yer wab-mail address fer onvalid chairacters.
Mailer returned: $1',
'confirmemail_invalid' => 'Confirmation code nae guid. The code haes mibbe expired.',
'confirmemail_needlogin' => 'Please $1 fer tae confirm yer wab-mail address.',
-'confirmemail_success' => 'Yer e-mail address haes been confirmed. Ye can nou log in an enjoy the wiki.',
+'confirmemail_success' => 'Yer wab-mail address haes been confirmed. Ye can nou [[Special:UserLogin|login]] n enjoy the wiki.',
'confirmemail_loggedin' => 'Yer e-mail address haes noo been confirmed.',
+'confirmemail_subject' => '{{SITENAME}} wab-mail address confirmation',
'confirmemail_body' => 'Somebodie, maist likely ye, fae IP address $1,
haes registered aen accoont "$2" wi this wab-mail address oan {{SITENAME}}.
-Tae confirm that this accont really is yers an activate
-wab-mail features oan {{SITENAME}}, apen this airtin in yer brouser:
+Tae confirm that this accoont reallie is yers n acteevate wab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:
$3
-Gif ye did *no* register the accoont, follae this airtin
+Gif ye div *naw* register the accoont, follae this link
tae cancel the wab-mail address confirmation:
$5
This confirmation code will expire oan $4.',
+'confirmemail_body_changed' => 'Somebodie, proabablie ye, from IP address $1,
+haes chynged the wab-mail address o the accoont "$2" til this address oan {{SITENAME}}.
+
+Tae confirm that this accoont reallie dis belang til ye n reacteevate
+wab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:
+
+$3
+
+Gif the account dis *na* belang til ye, follae this link
+tae cancel the wab-mail address confirmation:
+
+$5
+
+This confirmation code will die oan $4.',
+'confirmemail_body_set' => 'Somebodie, proablie ye, fae IP address $1,
+haes set the wab-mail address o the accoont "$2" til this address oan {{SITENAME}}.
+
+Tae confirm that this accoont reallie dis belang til ye n acteevate
+wab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:
+
+$3
+
+Gif the accoont dis *na* belang til ye, follae this link
+tae cancel the wab-mail address confirmation:
+
+$5
+
+This confirmation code will dee at $4.',
+'confirmemail_invalidated' => 'Wab-mail address confirmation canceled',
+'invalidateemail' => 'Cancel wab-mail confirmation',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[Interwiki transcluidin is disabled]',
+'scarytranscludefailed' => '[Template fetch failed fer $1]',
+'scarytranscludefailed-httpstatus' => '[Template fetch failed fer $1: HTTP $2]',
+'scarytranscludetoolong' => '[URL is ower lang]',
# Delete conflict
-'deletedwhileediting' => '<strong>Wairnin:</strong> This page wis deletit efter ye stairted editin!',
+'deletedwhileediting' => '<strong>Warnishment:</strong> This page wis delytit efter ye stairted eeditin!',
'confirmrecreate' => 'Uiser [[User:$1|$1]] ([[User talk:$1|tauk]]) delytit this page efter ye stairted eiditin wi raison:
: <em>$2</em>
Please confirm that ye reallie want tae recræft this page.',
+'confirmrecreate-noreason' => 'Uiser [[User:$1|$1]] ([[User talk:$1|tauk]]) delytit this page efter ye stairted eeditin. Please confirm that ye reallie want tae recræft this page.',
+'recreate' => 'Recræft',
# action=purge
-'confirm_purge_button' => 'Aye',
+'confirm_purge_button' => 'OK',
'confirm-purge-top' => 'Clair the cache o this page?',
+'confirm-purge-bottom' => 'Purgin ae page clears the cache n forces the maist recynt reveesion tae appear.',
+
+# action=watch/unwatch
+'confirm-watch-top' => 'Add this page til yer watchleet?',
+'confirm-unwatch-top' => 'Remuiv this page fae yer watchleet?',
# Multipage image navigation
+'imgmultipageprev' => '← preeveeoos page',
+'imgmultipagenext' => 'nex page →',
'imgmultigo' => 'Gang!',
+'imgmultigoto' => 'Gang til page $1',
+
+# Language selector for translatable SVGs
+'img-lang-default' => '(defaut leid)',
+'img-lang-info' => 'Render this eemage in $1. $2',
+'img-lang-go' => 'Gang',
# Table pager
'table_pager_next' => 'Page aifter',
'table_pager_prev' => 'Page afore',
+'table_pager_last' => 'Laist page',
+'table_pager_limit' => 'Shaw $1 eetems per page',
+'table_pager_limit_label' => 'Eetems per page:',
'table_pager_limit_submit' => 'Gang',
'table_pager_empty' => 'Nae results',
# Auto-summaries
'autosumm-blank' => 'Blanked the page',
'autosumm-replace' => "Replacin page wi '$1'",
-'autoredircomment' => 'Reguidin tae [[$1]]',
+'autoredircomment' => 'Reguidin til [[$1]]',
+'autosumm-new' => 'Cræftit page wi "$1"',
+
+# Live preview
+'livepreview-loading' => 'Laidin...',
+'livepreview-ready' => 'Laidin... Readie!',
+'livepreview-failed' => 'Live luikower failed!
+Gie normal luikower ae gae.',
+'livepreview-error' => 'Failed tae connect: $1 "$2".
+Gie normal luikower ae gae.',
+
+# Friendlier slave lag warnings
+'lag-warn-normal' => 'Chynges newer than $1 {{PLURAL:$1|seicont|seiconts}} micht na be shawn in this leet.',
+'lag-warn-high' => 'Cause o hei database server lag, chynges newer than $1 {{PLURAL:$1|seicont|seiconts}} micht na be shawn in this leet.',
+
+# Watchlist editor
+'watchlistedit-numitems' => 'Yer watchleet contains {{PLURAL:$1|1 title|$1 titles}}, na coontin tauk pages.',
+'watchlistedit-noitems' => 'Yer watchleet contains naw titles.',
+'watchlistedit-normal-title' => 'Eedit watchleet',
+'watchlistedit-normal-legend' => 'Remuiv titles fae watchleet',
+'watchlistedit-normal-explain' => 'Titles oan yer watchleet ar shawn ablo.
+Tae remuiv ae title, check the kist nex til it, n clap "{{int:Watchlistedit-normal-submit}}".
+Ye can [[Special:EditWatchlist/raw|eedit the raw leet]] ava.',
+'watchlistedit-normal-submit' => 'Remuiv titles',
+'watchlistedit-normal-done' => '{{PLURAL:$1|1 title wis|$1 titles were}} remuived fae yer watchleet:',
+'watchlistedit-raw-title' => 'Eedit raw watchleet',
+'watchlistedit-raw-legend' => 'Eedit raw watchleet',
+'watchlistedit-raw-explain' => 'Titles oan yer watchleet ar shawn ablo, n can be eeditit bi addin til n remuivin fae the leet;
+yin title per line.
+Whan dun, clap "{{int:Watchlistedit-raw-submit}}".
+Ye can [[Special:EditWatchlist|uise the staundairt eediter]] ava.',
+'watchlistedit-raw-submit' => 'Update watchleet',
+'watchlistedit-raw-done' => 'Yer watchleet haes been updated.',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1 title wis|$1 titles were}} added:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 title wis|$1 titles were}} remuived:',
# Watchlist editing tools
-'watchlisttools-view' => 'View relevant changes',
-'watchlisttools-edit' => 'View aen eidit watchleet',
-'watchlisttools-raw' => 'Eidit raw watchleet',
+'watchlisttools-view' => 'See reelavant chynges',
+'watchlisttools-edit' => 'See n eedit watchleet',
+'watchlisttools-raw' => 'Eedit raw watchleet',
+
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tauk]])',
# Core parser functions
+'unknown_extension_tag' => 'Onkent extension tag "$1"',
'duplicate-defaultsort' => '\'\'\'Wairnin:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
# Special:Version
+'version-extensions' => 'Instawed extensions',
+'version-specialpages' => 'Byordinar pages',
+'version-parserhooks' => 'Parser huiks',
+'version-variables' => 'Vareeables',
+'version-other' => 'Ither',
+'version-mediahandlers' => 'Media haunnlers',
+'version-hooks' => 'Huiks',
+'version-parser-function-hooks' => 'Parser function huiks',
+'version-hook-name' => 'Huik name',
+'version-hook-subscribedby' => 'Subscribed bi',
+'version-ext-colheader-description' => 'Descreeption',
+'version-ext-colheader-credits' => 'Writers',
+'version-license-title' => 'License fer $1',
+'version-license-not-found' => 'Naw detailed license information wis foond fer this extension.',
+'version-credits-title' => 'Creedits fer $1',
+'version-credits-not-found' => 'Naw detailed creedits information wis foond fer this extension.',
'version-poweredby-credits' => 'This wiki is pwred bi <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copiericht © 2001-$1 $2.',
+'version-poweredby-others' => 'ithers',
+'version-poweredby-translators' => 'translatewiki.net owerseters',
+'version-credits-summary' => "We'd like tae recognize the follaein fawk fer thair contreebution til [[Special:Version|MediaWiki]].",
+'version-license-info' => 'MediaWiki is free saffware; ye can reedistreebute it n/or modifie it unner the terms o the GNU General Public License aes publeesht bi the Free Software Foundation; either version 2 of the License, or (bi yer optie) onie later version.
+
+MediaWiki is distreebuted in the hope that it will be uissfu, but WIOOT ONIE WARRANTIE; wioot even the implied warrantie o MERCHANTABILITIE or FITNESS FER AE PARTEECULAR PURPYSS. See the GNU General Public License fer mair details.
+
+Ye shid hae receeved [{{SERVER}}{{SCRIPTPATH}}/COPIEIN ae copie o the GNU General Public License] alang wi this program; gif na, write til the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
+'version-software' => 'Instawed saffware',
+'version-entrypoints' => 'Entrie point URLs',
+'version-entrypoints-header-entrypoint' => 'Entrie point',
+
+# Special:Redirect
+'redirect' => 'Reguidal bi file, uiser, page or reveesion ID',
+'redirect-legend' => 'Reguidal til ae file or page',
+'redirect-summary' => 'This byordiair page reguides til ae file (gien the file name), ae page (gien ae reveesion ID or page ID), or ae uiser page (gien ae numereec uiser ID). Uissage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/reveesion/328429]], or [[{{#Special:Redirect}}/uiser/101]].',
+'redirect-submit' => 'Gang',
+'redirect-lookup' => 'Luikup:',
+'redirect-user' => 'Uiser ID',
+'redirect-revision' => 'Page reveesion',
+'redirect-not-exists' => 'Value na foond',
# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Rake fer dupleecate files',
+'fileduplicatesearch-summary' => 'Rake fer dupleecate files based oan hash values.',
+'fileduplicatesearch-legend' => 'Rake fer ae dupleecate',
'fileduplicatesearch-filename' => 'Filename:',
'fileduplicatesearch-submit' => 'Rake',
+'fileduplicatesearch-result-1' => 'The file "$1" haes naw identeecal dupleecation.',
+'fileduplicatesearch-result-n' => 'The file "$1" haes {{PLURAL:$2|1 identeecal dupleecation|$2 identeecal dupleecations}}.',
+'fileduplicatesearch-noresults' => 'Naw file named "$1" foond.',
# Special:SpecialPages
'specialpages' => 'Byordinar pages',
-'specialpages-group-users' => 'Uisers an richts',
+'specialpages-note' => '* Normal byordinair pages.
+* <span class="mw-specialpagerestricted">Restreected byordinair pages.</span>',
+'specialpages-group-other' => 'Ither byordinair pages',
+'specialpages-group-login' => 'Login / cræft accoont',
+'specialpages-group-changes' => 'Recynt chynges n logs',
+'specialpages-group-media' => 'Media reports n uplaids',
+'specialpages-group-users' => 'Uisers n richts',
+'specialpages-group-highuse' => 'Hei uiss pages',
'specialpages-group-pages' => 'leet o pages',
+'specialpages-group-pagetools' => 'Page tuils',
+'specialpages-group-wiki' => 'Data n tuils',
+'specialpages-group-redirects' => 'Reguidin byordinair pages',
+'specialpages-group-spam' => 'Spam tuils',
+
+# Special:BlankPage
+'intentionallyblankpage' => 'This page is intentionlie left blank.',
# External image whitelist
'external_image_whitelist' => ' #Lea this line exactlie aes it is<pre>
#Put aw regex fragments abuin this line. Lea this line exactlie aes it is</pre>',
# Special:Tags
+'tags' => 'Valit chynge tags',
'tag-filter' => '[[Special:Tags|Tag]] filter:',
'tag-filter-submit' => 'Filter',
-'tags-edit' => 'edit',
+'tags-intro' => 'This page leets the tags that the saffware can maurk aen eedit wi, n thair meanin.',
+'tags-display-header' => 'Appearance oan chynge leets',
+'tags-description-header' => 'Ful descreeption o meanin',
+'tags-active-header' => 'Acteeve?',
+'tags-hitcount-header' => 'Tagged chynges',
+'tags-active-yes' => 'Ay',
+'tags-active-no' => 'Naw',
+'tags-edit' => 'eedit',
+'tags-hitcount' => '$1 {{PLURAL:$1|chynge|chynges}}',
+
+# Special:ComparePages
+'compare-rev1' => 'Reveesion 1',
+'compare-rev2' => 'Reveesion 2',
+'compare-invalid-title' => 'The title that ye speceefied is onvalit.',
+'compare-title-not-exists' => 'The title that ye speceefied disna exeest.',
+'compare-revision-not-exists' => 'The reveesion that ye speceefied disna exeest.',
+
+# Database error messages
+'dberr-header' => 'This wiki haes ae proablem',
+'dberr-problems' => 'Sairrie! This site is expereeancin techneecal diffeculties.',
+'dberr-again' => 'Gie it ae few minutes n than relaid.',
+'dberr-info' => '(Canna contact the database server: $1)',
+'dberr-info-hidden' => '(Canna contact the database server)',
+'dberr-usegoogle' => 'Ye can dae ae rake bi wa o Google in the meanwhile.',
+'dberr-outofdate' => 'Mynd that thair indexes o oor content micht be oot o date.',
+'dberr-cachederror' => 'This is ae cached copie o the requested page, n micht na be up til date.',
# HTML forms
+'htmlform-invalid-input' => 'Thau ar proablems wi some o yer input.',
+'htmlform-select-badoption' => 'The value that ye speceefied isna ae valit optie.',
+'htmlform-int-invalid' => 'The value that ye speceefied isna aen integer.',
+'htmlform-float-invalid' => 'The value that ye speceefied isna ae nummer.',
+'htmlform-int-toolow' => 'The value that ye speceefied is ablo the smaaest o $1.',
+'htmlform-int-toohigh' => 'The value that ye speceefied is abuin the mucklest o $1.',
+'htmlform-required' => 'This value is needit.',
+'htmlform-submit' => 'Haun-in',
+'htmlform-reset' => 'Ondae chynges',
'htmlform-selectorother-other' => 'Ither',
+'htmlform-no' => 'Naw',
+'htmlform-yes' => 'Ay',
+'htmlform-chosen-placeholder' => 'Select aen optie',
+
+# SQLite database support
+'sqlite-has-fts' => '$1 wi ful-tex rake support',
+'sqlite-no-fts' => '$1 wioot ful-tex rake support',
+
+# New logging system
+'logentry-delete-delete' => '$1 {{GENDER:$2|delytit}} page $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|chynged}} veesibeelitie o {{PLURAL:$5|ae log event|$5 log events}} oan $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|chynged}} veesibeelitie o {{PLURAL:$5|ae reveesion|$5 reveesions}} oan page $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|chynged}} veesibeelitie o log events oan $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|chynged}} veesibeelitie o reveesions oan page $3',
+'logentry-suppress-event' => '$1 hidlinswise {{GENDER:$2|chynged}} veesibeelitie o {{PLURAL:$5|ae log event|$5 log events}} oan $3: $4',
+'logentry-suppress-revision' => '$1 hidlinswise {{GENDER:$2|chynged}} veesibeelity o {{PLURAL:$5|ae reveesion|$5 reveesions}} oan page $3: $4',
+'logentry-suppress-event-legacy' => '$1 hidlinswise {{GENDER:$2|chynged}} veesibeelitie o log events oan $3',
+'logentry-suppress-revision-legacy' => '$1 hidlinswise {{GENDER:$2|chynged}} veesibeelitie o reveesions oan page $3',
+'revdelete-content-hid' => 'content skaukt',
+'revdelete-summary-hid' => 'eedit ootline skaukt',
+'revdelete-uname-hid' => 'uisername skaukt',
+'revdelete-content-unhid' => 'content onskaukt',
+'revdelete-summary-unhid' => 'eedit ootline onskaukt',
+'revdelete-uname-unhid' => 'uisername onskaukt',
+'revdelete-restricted' => 'applied restreections til admeenistraters',
+'revdelete-unrestricted' => 'remuived restreections fer admeenistraters',
+'logentry-move-move' => '$1 {{GENDER:$2|muived}} page $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|muived}} page $3 til $4 wioot leain ae reguidal',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|muived}} page $3 til $4 ower reguidal',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|muived}} page $3 til $4 ower ae reguidal wioot leain ae reguidal',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|maurkt}} reveesion $4 o page $3 patrowed',
+'logentry-patrol-patrol-auto' => '$1 autæmateeclie {{GENDER:$2|maurkt}} reveesion $4 o page $3 patrowed',
+'logentry-newusers-newusers' => 'Uiser accoont $1 wis {{GENDER:$2|cræftit}}',
+'logentry-newusers-create' => 'Uiser accoont $1 wis {{GENDER:$2|cræftit}}',
+'logentry-newusers-create2' => 'Uiser accoont $3 wis {{GENDER:$2|cræftit}} bi $1',
+'logentry-newusers-byemail' => 'Uiser accoont $3 wis {{GENDER:$2|cræftit}} bi $1 n passwaird wis sent bi wab-mail',
+'logentry-newusers-autocreate' => 'Uiser accoont $1 wis {{GENDER:$2|cræftit}} autæmateeclie',
+'logentry-rights-rights' => '$1 {{GENDER:$2|chynged}} groop memmership fer $3 fae $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|chynged}} groop memmership fer $3',
+'logentry-rights-autopromote' => '$1 wis autæmateeclie {{GENDER:$2|promoted}} fae $4 til $5',
+'rightsnone' => '(nane)',
+
+# Feedback
+'feedback-bugornote' => 'Gif yer readie tae describe ae techneecal problem in detail please [$1 report ae bug].
+Itherwise, ye can uiss the easie form ablo. Yer comment will be added til the page "[$3 $2]", alang wi yer uisername.',
+'feedback-adding' => 'Addin feedback til page...',
+'feedback-error1' => 'Mistak: Onrecognised affcome fae API',
+'feedback-error2' => 'Mistak: Eedit failed',
+'feedback-error3' => 'Mistak: Naw response fae API',
+'feedback-thanks' => 'Thanks! Yer feedback haes been posted til the page "[$2 $1]".',
+'feedback-close' => 'Dun',
+'feedback-bugcheck' => "Wunnerfu! Just check that it's na awreadie yin o the [$1 knawn bugs].",
+'feedback-bugnew' => 'Ah checkt. Report ae new bug',
+
+# Search suggestions
+'searchsuggest-search' => 'Rake',
+'searchsuggest-containing' => 'containin...',
+
+# API errors
+'api-error-badaccess-groups' => "Ye'r na permittit tae uplaid files til this wiki.",
+'api-error-copyuploaddisabled' => 'Uplaidin bi URL is disabled oan this server.',
+'api-error-duplicate' => 'Thaur {{PLURAL:$1|is [$2 anither file]|ar [$2 some ither files]}} awreadie oan the site wi the same content.',
+'api-error-duplicate-archive' => 'Thaur {{PLURAL:$1|wis [$2 anither file]|were [$2 some ither files]}} awreadie oan the site wi the same content, but {{PLURAL:$1|it wis|thay were}} delytit.',
+'api-error-duplicate-archive-popup-title' => 'Dupleecate {{PLURAL:$1|file that haes|files that hae}} awreadie been delytit.',
+'api-error-duplicate-popup-title' => 'Dupleecate {{PLURAL:$1|file|files}}.',
+'api-error-empty-file' => 'The file that ye haunnit in wis tuim.',
+'api-error-emptypage' => 'Cræftin new, tuim pages isna permittit.',
+'api-error-fetchfileerror' => 'Internal mistak: Sommit went wrang while fetchin the file.',
+'api-error-fileexists-forbidden' => 'Ae file wi the name "$1" awreadie exeests, n canna be owerwritten.',
+'api-error-fileexists-shared-forbidden' => 'Ae file wi the name "$1" awreadie exeests in the shaired file reposeetair, n canna be owerwritten.',
+'api-error-file-too-large' => 'The file that ye haunnit in wis ower muckle.',
+'api-error-filename-tooshort' => 'The filename is ower short.',
+'api-error-filetype-banned' => 'This type o file is banned.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|isna ae permittit file type|arna permittit file types}}. Permittit {{PLURAL:$3|file type is|file types ar}} $2.',
+'api-error-filetype-missing' => 'The filename is missin aen extension.',
+'api-error-hookaborted' => 'The modeefication that ye gave makin ae gae wis abortit bi aen extension.',
+'api-error-http' => 'Internal mistak: Onable tae connect til server.',
+'api-error-illegal-filename' => 'The filename isna permitit.',
+'api-error-internal-error' => 'Internal mistak: Sommit went wrang wi processin yer uplaid oan the wiki.',
+'api-error-invalid-file-key' => 'Internal mistak: File wisna foond in temparie storage.',
+'api-error-missingparam' => 'Internal mistak: Missin boonds oan request.',
+'api-error-missingresult' => 'Internal mistak: Coudna determine gif the copie succeeded.',
+'api-error-mustbeloggedin' => 'Ye maun be loggit in tae uplaid files.',
+'api-error-mustbeposted' => 'Internal mistak: Request needs HTTP POST.',
+'api-error-noimageinfo' => 'The uplaid succeeded, bit the server didna gie us onie information aneat the file.',
+'api-error-nomodule' => 'Internal mistak: Naw uplaid module set.',
+'api-error-ok-but-empty' => 'Internal mistak: Naw response fae server.',
+'api-error-overwrite' => 'Owerwritin aen exeestin file isna permitit.',
+'api-error-stashfailed' => 'Internal mistak: Server failed tae store temparie file.',
+'api-error-publishfailed' => 'Internal mistak: Server failed tae publeesh temparie file.',
+'api-error-stasherror' => 'Thaur wis ae mistak while uplaidin the file tae stash.',
+'api-error-timeout' => 'The server didna respond wiin the expectit time.',
+'api-error-unclassified' => 'Aen onkent mistake occurred.',
+'api-error-unknown-error' => 'Internal mistak: Sommit went wrang whan uplaidin yer file.',
+'api-error-uploaddisabled' => 'Uplaidin is disabled oan this wiki.',
+'api-error-verification-error' => 'This file micht be rotten, or hae the wrang extension.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|seicont|seiconts}}',
+'duration-hours' => '$1 {{PLURAL:$1|hoor|hoors}}',
+'duration-centuries' => '$1 {{PLURAL:$1|centuair|centuairs}}',
+
+# Image rotation
+'rotate-comment' => 'Eemage rotated bi $1 {{PLURAL:$1|degree|degrees}} clockwise',
+
+# Limit report
+'limitreport-title' => 'Parser profilin data:',
+'limitreport-cputime' => 'CPU time uissage',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|seicont|seiconts}}',
+'limitreport-walltime' => 'Real time uissage',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|seicont|seiconts}}',
+'limitreport-ppvisitednodes' => 'Preprocessor veesitit node coont',
+'limitreport-ppgeneratednodes' => 'Preprocessor generated node coont',
+'limitreport-postexpandincludesize' => 'Post-expand incluid size',
+'limitreport-expansiondepth' => 'Heiest expansion depth',
+'limitreport-expensivefunctioncount' => 'Expensive parser function coont',
+
+# Special:ExpandTemplates
+'expand_templates_intro' => 'This byordiair page taks tex n expauns aw templates in it recurseevelie.
+It foreby expaunds supported parser functions like
+<code><nowiki>{{</nowiki>#language:…}}</code> n vareeables like
+<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.
+In fact, it expauns just aboot awthings in dooble-braces.',
+'expand_templates_title' => 'Contex title, fer {{FULLPAGENAME}}, etc.:',
+'expand_templates_output' => 'Affcome',
+'expand_templates_xml_output' => 'XML ootpit',
+'expand_templates_html_output' => 'Raw HTML ootpit',
+'expand_templates_remove_nowiki' => 'Suppress <nowiki> tags in affcome',
+'expand_templates_generate_xml' => 'Shaw XML parse tree',
+'expand_templates_generate_rawhtml' => 'Shaw raw HTML',
+'expand_templates_preview' => 'Luikower',
);
'rev-delundel' => 'ruodītė/kavuotė',
'revisiondelete' => 'Trintė/atkortė versėjės',
'logdelete-selected' => "{{PLURAL:$2|Pasėrinkts|Pasėrinktė|Pasėrinktė}} '''$1''' istuorėjės {{PLURAL:$2|atėtėkims|atsėtėkimā|atsėtėkimā}}:",
-'revdelete-text' => "'''Ėštrintuos versėjės ėr ivīkē vistėik da bus ruodomė poslapė istuorėjuo ėr specēliūju veiksmū istuorėjuo, no anū torėnė dalīs nabus vėišā pasėikiamos.'''
-Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta torėni ėr galės ana atkortė viel par šėta pate sasaja, nabent īr nostatītė papėlduomė aprėbuojėmā.",
'revdelete-unsuppress' => 'Šalėntė apribuojėmos atkortuos versėjės',
'revdel-restore' => 'Keistė veizėmuma',
'revdelete-edit-reasonlist' => 'Keistė trīnėma prīžastis',
'revdelete-show-file-submit' => 'Da',
'revdelete-selected' => "'''{{PLURAL:$2|Odabrana revizija|Odabrane revizije}} od [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Označena stavka registra|Označene stavke registra}}:'''",
-'revdelete-text' => "'''Obrisane revizije i događaji će i dalje biti vidljivi u historiji stranice i registrima, ali dijelovi njenog sadržaja neće biti dostupni javnosti.'''
-Drugi administratori projekta {{SITENAME}} će i dalje moći pristupiti sakrivenom sadržaju i mogu ga ponovo vratiti kroz ovaj interfejs, osim ako nisu postavljena dodatna ograničenja.",
'revdelete-confirm' => 'Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].',
'revdelete-suppress-text' => "Ograničenja bi trebala biti korištena '''samo''' u sljedećim slučajevima:
* Osjetljive korisničke informacije
'tog-ccmeonemails' => 'මා විසින් අනෙකුත් පරිශීලකයන් හට යවන විද්යුත්-තැපෑලයන්හි පිටපත් මාහට එවන්න',
'tog-diffonly' => '“වෙනස් ”පදයන්ට පහළින්, පිටුවල අන්තර්ගතය නොපෙන්වන්න',
'tog-showhiddencats' => 'සැඟවුනු ප්රවර්ග පෙන්වන්න',
-'tog-noconvertlink' => 'සබැඳියන්ගේ ශීර්ෂ පෙරැළීම අක්රීය කරන්න',
'tog-norollbackdiff' => 'පුනරාවර්තනයක් කිරීමෙන් පසු වෙනස්වීම් අත්හරින්න',
'tog-useeditwarning' => 'මා සංස්කරණ පිටුවක් සුරකිනු නොලැබූ වෙනස්කිරීම් සමඟ අතහැර යන විට අවවාද කරන්න',
'tog-prefershttps' => 'සැම විටම ඇතුළු වීමේදී ආරක්ෂාකාරී ජාලයක් භාවිතා කරන්න',
'revdelete-show-file-submit' => 'ඔව්',
'revdelete-selected' => "'''[[:$1]] හි {{PLURAL:$2|තෝරාගත් සංශෝධනය|තෝරාගත් සංශෝධනයන්}} :'''",
'logdelete-selected' => "'''{{PLURAL:$1|තෝරාගත් ලඝු-සිදුවීම|තෝරාගත් ලඝු-සිදුවීම්}}:'''",
-'revdelete-text' => "'''මකාදැමුණු සංශෝධනයන් හා සිද්ධීන් තවදුරටත් පිටු විත්ති හා ලඝු-සටහන් හි දර්ශනය වුවද, ප්රජාව ට ප්රවිෂ්ඨ විය හැක්කේ ඒවායේ අන්තර්ගතයෙන් කොටසකටය.'''
-අමතර සීමා පණවා නොමැති නම්, සැඟවුනු අන්තර්ගතයට එළඹී, යම් අතුරුමුහුණතක් ඔස්සේ, එය මකාදැමුම යළි අවලංගු කිරීමට, {{SITENAME}} හි අනෙකුත් පරිපාලකයන්හට තවමත් අවතාශ ඇත්තේය.",
'revdelete-confirm' => 'කරුණාකර ඔබ මෙය කිරීමට අදහස් කරන බවත්,එහි ප්රතිඵලය අවබෝධ කර ගන්නා බවත්,මෙය සිදු කරනුයේ [[{{MediaWiki:Policy-url}}| ප්රතිපත්තියට]] අනුකූලව බවත් තහවුරු කරන්න.',
'revdelete-suppress-text' => "යටපත්කිරීම පහත අවස්ථාවන්හිදී '''පමණක්''' භාවිතා කල යුතුය:
* නුසුදුසු පෞද්ගලික තොරතුරු
'tog-ccmeonemails' => 'Posielať mi kópie mojich emailov, ktoré pošlem ostatným používateľom',
'tog-diffonly' => 'Nezobrazovať obsah stránky pod rozdielmi',
'tog-showhiddencats' => 'Zobraziť skryté kategórie',
-'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
'tog-useeditwarning' => 'Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami',
'tog-prefershttps' => 'Po prihlásení používať vždy zabezpečené pripojenie',
'revdelete-show-file-submit' => 'Áno',
'revdelete-selected' => "'''{{PLURAL:$2|Vybraná jedna revízia|Vybrané $2 revízie|Vybraných $2 revízií}} z [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Vybraná udalosť záznamu|Vybrané udalosti záznamu}}:'''",
-'revdelete-text' => "'''Zmazané revízie a udalosti sú stále viditeľné v histórii úprav stránky, ale časti ich obsahu nebudú prístupné verejnosti.'''
-Iní správcovia {{GRAMMAR:genitív|{{SITENAME}}}} budú stále môcť pristupovať k skrytému obsahu a môžu ho znova obnoviť použitím tohto rozhrania v prípade, že nie sú stanovené ďalšie obmedzenia.",
'revdelete-confirm' => 'Prosím, potvrďte, že to naozaj chcete vykonať, rozumiete následkom a že to robíte v súlade s [[{{MediaWiki:Policy-url}}|politikou]].',
'revdelete-suppress-text' => "Zatajenie by sa malo používať '''výlučne''' v nasledovných prípadoch:
* Potenciálne hanlivé informácie
'createacct-another-realname-tip' => 'Pravo ime ni obvezno.
Če se ga odločite navesti, bo uporabljeno za priznavanje uporabnikovega dela.',
'pt-login' => 'Prijava',
+'pt-login-button' => 'Prijava',
'pt-createaccount' => 'Ustvari račun',
'pt-userlogout' => 'Odjava',
'revdelete-show-file-submit' => 'Da',
'revdelete-selected' => "'''{{PLURAL:$2|Izbrana redakcija|Izbrani redakciji|Izbrane redakcije}} strani [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Izbran dnevniški dogodek|Izbrana dnevniška dogodka|Izbrani dnevniški dogodki}}:'''",
-'revdelete-text' => "'''Izbrisane redakcije in dogodki bodo v zgodovini strani in dnevniki še vedno navedene, vendar bo njihova vsebina za javnost nedostopna.'''
-Do skrite vsebine bodo še vedno lahko dostopali drugi administratorji {{GRAMMAR:rodilnik|{{SITENAME}}}} in jo z uporabo istega vmesnika tudi obnovili, razen kjer bodo uveljavljene dodatne omejitve.",
'revdelete-confirm' => 'Prosim potrdite da nameravate to storiti, da se zavedate posledic in da to počnete v skladu s [[{{MediaWiki:Policy-url}}|politiko]].',
'revdelete-suppress-text' => "Zadrževanje naj bi bilo uporabljeno '''le''' v sledečih primerih:
* Morebitni klevetniški podatki
'search-file-match' => '(ujema se z vsebino datoteke)',
'search-suggest' => 'Iščete morda: $1',
'search-interwiki-caption' => 'Sorodni projekti',
-'search-interwiki-default' => '$1 zadetkov:',
+'search-interwiki-default' => 'Rezultati s strani $1:',
'search-interwiki-more' => '(več)',
'search-relatedarticle' => 'Podobno',
'searcheverything-enable' => 'Iskanje po vseh imenskih prostorih',
'delete-warning-toobig' => 'Ta stran ima obsežno zgodovino urejanja, tj. čez $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}.
Njeno brisanje lahko zmoti obratovanje zbirke podatkov {{GRAMMAR:dative|{{SITENAME}}}};
nadaljujte s previdnostjo.',
-'deleting-backlinks-warning' => "'''Opozorilo:''' Druge strani se povezujejo na ali vključujejo stran, ki jo nameravate izbrisati.",
+'deleting-backlinks-warning' => "'''Opozorilo:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge strani]] se povezujejo na ali vključujejo stran, ki jo nameravate izbrisati.",
# Rollback
'rollback' => 'Vrni spremembe',
'sp-contributions-blocked-notice-anon' => 'Ta IP-naslov je trenutno blokiran.
Najnovejši vnos v dnevniku blokad je naveden spodaj:',
'sp-contributions-search' => 'Išči prispevke',
+'sp-contributions-suppresslog' => 'zatrti uporabnikovi prispevki',
'sp-contributions-username' => 'IP-naslov ali uporabniško ime:',
'sp-contributions-toponly' => 'Prikaži samo vrhnje redakcije',
'sp-contributions-newonly' => 'Prikaži samo urejanja, ki so ustvarila nove strani',
Fadlan waxyar sug intii aadan soo gelin.',
'login-abort-generic' => 'Ma u soo gali karin gudaha - waa la noqay',
'loginlanguagelabel' => 'Luqada: $1',
+'pt-userlogout' => 'Ka bax',
# Email sending
'user-mail-no-addy' => "Isku dayday in aa dirto e-mail ayada oo ciwaan e-mail la'aan ah.",
'skin-preview' => 'Horfiirin',
'datedefault' => "Ma'jiro dooq",
'prefs-datetime' => 'Taariikhda iyo waqtiga',
+'prefs-personal' => 'Galka isticmaalaha',
'prefs-rc' => 'Isbedelada dhow',
'prefs-watchlist' => 'liiska-waardiyaha',
'prefs-watchlist-days' => 'Tirada maalamaha ay ku jirayaan liiska-waardiyaha:',
'prefs-email' => 'E-mail aad dooran kartaa',
+'prefs-rendering' => 'Muuqaalka',
'saveprefs' => 'Kaydi',
+'restoreprefs' => 'Dib u soo celin qaabeynta (dhammaan qaybaha)',
'prefs-editing' => 'Wax ka bedelka',
'searchresultshead' => 'Raadi',
'recentchangesdays' => 'Tirada maalmaha lagu tusaayo isbedelada dhow:',
'emailsenttext' => 'Fariintaadii E-mailka aheeyd waa la diray.',
# Watchlist
-'watchlist' => 'Liiskeyga waardiyeynta',
-'mywatchlist' => 'Liiskeyga waardiyeynta',
+'watchlist' => 'Liiska-waardiyaha',
+'mywatchlist' => 'Liiska-waardiyaha',
'watchlistfor2' => 'Ku socoto $1 $2',
'nowatchlist' => 'Waxba kuma jiraan liiskaaga waardiyeynta.',
'watchlistanontext' => 'Fadlan $1 si aad u fiirisid ama wax uga bedeshid qoraalada ku jira liiska waardiyeyska.',
# Info page
'pageinfo-title' => 'Macluumaad ku saabsan "$1"',
+'pageinfo-header-basic' => 'Macaaluumaadka asaasiga ah',
'pageinfo-toolboxlink' => 'Macluumad ku saabsan',
# Browsing diffs
# Special:Tags
'tag-filter' => '[[Special:Tags|Filtaraha]] tag:',
+'tags-display-header' => 'Muuqaalka liiska bedelka',
# Database error messages
'dberr-usegoogle' => 'Waxaa baroobeen kartaa in aad ka raadiso google',
'revdelete-show-file-submit' => 'Po',
'revdelete-selected' => "'''{{PLURAL:$2|Versioni i zgjedhur i|Versionet e zgjedhura të}} [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Veprimi i zgjedhur në regjistër|Veprimet e zgjedhura në regjistër}}:'''",
-'revdelete-text' => "'''Përmbajtja dhe pjesët e tjera nuk janë të dukshme për të gjithë, por figurojnë në historikun e versioneve.''' Administratorët munden përmbajtjen e larguar ta shikojnë dhe restaurojnë, përveç në rastet kur një gjë e tillë është ndaluar ekstra.",
'revdelete-confirm' => 'Ju lutem konfirmoni që keni ndër mënd ta bëni këtë, që i kuptoni pasojat, dhe që ju po veproni në përputhje me [[{{MediaWiki:Policy-url}}|politiken]].',
'revdelete-suppress-text' => "Shuarje duhet'''vetëm'''të përdoret për rastet e mëposhtme:
* Potencialisht e informacionit shpifës
'tog-ccmeonemails' => 'Пошаљи ми копије е-порука које пошаљем другим корисницима',
'tog-diffonly' => 'Не приказуј садржај странице испод разлика',
'tog-showhiddencats' => 'Прикажи скривене категорије',
-'tog-noconvertlink' => 'Онемогући претварање наслова веза',
'tog-norollbackdiff' => 'Изостави разлику након извршеног враћања',
'tog-useeditwarning' => 'Упозори ме када напуштам страницу са несачуваним променама',
'tog-prefershttps' => 'Увек користи сигурну конекцију када сам пријављен.',
# Special:PasswordReset
'passwordreset' => 'Обнављање лозинке',
'passwordreset-text-one' => 'Попуните овај образац да бисте ресетовали лозинку.',
+'passwordreset-text-many' => '{{PLURAL:$1|Испуните једно од поља како би сте добили привремену лозинку на е-пошту.}}',
'passwordreset-legend' => 'Поништи лозинку',
'passwordreset-disabled' => 'Обнављање лозинке је онемогућено на овом викију.',
'passwordreset-emaildisabled' => 'Е-пошта је онемогућена на овом викију.',
'revdelete-show-file-submit' => 'Да',
'revdelete-selected' => "'''{{PLURAL:$2|Изабрана измена|Изабране измене}} странице [[:$1]]'''",
'logdelete-selected' => "'''{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:'''",
-'revdelete-text' => "'''Обрисане измене ће и даље бити приказане у историји страница и записима, али делови њиховог садржаја неће бити доступни јавности.'''
-Други администратори на овом викију ће и даље имати приступ сакривеном садржају, а они ће тај садржај моћи да врате путем овог сучеља, осим ако нису постављена додатна ограничења.",
'revdelete-confirm' => 'Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].',
'revdelete-suppress-text' => "Сакривање измена би требало користити '''само''' у следећим случајевима:
* Злонамерни или погрдни подаци
'deadendpagestext' => 'Следеће странице немају везе до других страница на овом викију.',
'protectedpages' => 'Заштићене странице',
'protectedpages-indef' => 'само неограничене заштите',
+'protectedpages-summary' => 'На овој страници се налази списак тренутно заштићених страница. За списак заштићених наслова види [[{{#special:ProtectedTitles}}]].',
'protectedpages-cascade' => 'само преносиве заштите',
'protectedpages-noredirect' => 'сакриј преусмерења',
'protectedpagesempty' => 'Нема заштићених страница с овим параметрима.',
+'protectedpages-timestamp' => 'Време и датум',
+'protectedpages-page' => 'Страница',
+'protectedpages-expiry' => 'Истиче',
+'protectedpages-performer' => 'Заштитио',
+'protectedpages-params' => 'Ниво заштите',
+'protectedpages-reason' => 'Разлог',
+'protectedpages-unknown-timestamp' => 'нема',
+'protectedpages-unknown-performer' => 'нема',
'protectedtitles' => 'Заштићени наслови',
+'protectedtitles-summary' => 'На овој страници се налази списак тренутно заштићених наслова. За списак тренутно заштићених страница види [[{{#special:ProtectedPages}}]].',
'protectedtitlesempty' => 'Нема заштићених наслова с овим параметрима.',
'listusers' => 'Списак корисника',
'listusers-editsonly' => 'прикажи само кориснике који су уређивали',
'listusers-creationsort' => 'поређај по датуму стварања',
+'listusers-desc' => 'сортирај у опадајућем редоследу',
'usereditcount' => '$1 {{PLURAL:$1|измена|измене|измена}}',
'usercreated' => '{{GENDER:$3|је направио|је направила|је направио}} дана $1 у $2',
'newpages' => 'Нове странице',
'exif-compression-34712' => 'JPEG2000',
'exif-copyrighted-true' => 'Заштићено ауторским правом',
-'exif-copyrighted-false' => 'СÑ\82аÑ\82Ñ\83Ñ\81 аÑ\83Ñ\82оÑ\80Ñ\81киÑ\85 пÑ\80ава ниÑ\98е подеÑ\88ен',
+'exif-copyrighted-false' => 'СÑ\82аÑ\82Ñ\83Ñ\81 аÑ\83Ñ\82оÑ\80Ñ\81киÑ\85 пÑ\80ава ниÑ\98е деÑ\84иниÑ\81ан',
'exif-photometricinterpretation-2' => 'RGB',
'exif-photometricinterpretation-6' => 'YCbCr',
'version-version' => '(издање $1)',
'version-svn-revision' => '(изм. $2)',
'version-license' => 'Лиценца',
+'version-ext-license' => 'Лиценца',
+'version-ext-colheader-name' => 'Екстензија',
+'version-ext-colheader-version' => 'Верзија',
+'version-ext-colheader-description' => 'Опис',
+'version-ext-colheader-credits' => 'Аутори',
'version-poweredby-credits' => "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
'version-poweredby-others' => 'остали',
'version-poweredby-translators' => 'translatewiki.net преводиоци',
'tog-ccmeonemails' => 'Pošalji mi primerke e-poruka koje pošaljem drugim korisnicima',
'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod razlika',
'tog-showhiddencats' => 'Prikaži skrivene kategorije',
-'tog-noconvertlink' => 'Onemogući pretvaranje naslova veza',
'tog-norollbackdiff' => 'Izostavi razliku nakon izvršenog vraćanja',
'tog-useeditwarning' => 'Upozori me kada napuštam stranicu sa nesačuvanim promenama',
'tog-prefershttps' => 'Uvek koristi sigurnu konekciju kada sam prijavljen.',
# Special:PasswordReset
'passwordreset' => 'Obnavljanje lozinke',
'passwordreset-text-one' => 'Popunite ovaj obrazac da biste resetovali lozinku.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ispunite jedno od polja kako bi ste dobili privremenu lozinku na e-poštu.}}',
'passwordreset-legend' => 'Poništi lozinku',
'passwordreset-disabled' => 'Obnavljanje lozinke je onemogućeno na ovom vikiju.',
'passwordreset-username' => 'Korisničko ime:',
'revdelete-show-file-submit' => 'Da',
'revdelete-selected' => "'''{{PLURAL:$2|Izabrana izmena|Izabrane izmene}} stranice [[:$1]]'''",
'logdelete-selected' => "'''{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:'''",
-'revdelete-text' => "'''Obrisane izmene će i dalje biti prikazane u istoriji stranica i zapisima, ali delovi njihovog sadržaja neće biti dostupni javnosti.'''
-Drugi administratori na ovom vikiju će i dalje imati pristup sakrivenom sadržaju, a oni će taj sadržaj moći da vrate putem ovog sučelja, osim ako nisu postavljena dodatna ograničenja.",
'revdelete-confirm' => 'Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].',
'revdelete-suppress-text' => "Sakrivanje izmena bi trebalo koristiti '''samo''' u sledećim slučajevima:
* Zlonamerni ili pogrdni podaci
'protectedpages-cascade' => 'samo prenosive zaštite',
'protectedpages-noredirect' => 'sakrij preusmerenja',
'protectedpagesempty' => 'Nema zaštićenih stranica s ovim parametrima.',
+'protectedpages-timestamp' => 'Vreme i datum',
+'protectedpages-page' => 'Stranica',
+'protectedpages-expiry' => 'Ističe',
+'protectedpages-performer' => 'Zaštitio',
+'protectedpages-params' => 'Nivo zaštite',
+'protectedpages-reason' => 'Razlog',
+'protectedpages-unknown-timestamp' => 'nema',
+'protectedpages-unknown-performer' => 'nema',
'protectedtitles' => 'Zaštićeni naslovi',
'protectedtitlesempty' => 'Nema zaštićenih naslova s ovim parametrima.',
'listusers' => 'Spisak korisnika',
'listusers-editsonly' => 'prikaži samo korisnike koji su uređivali',
'listusers-creationsort' => 'poređaj po datumu stvaranja',
+'listusers-desc' => 'sortiraj u opadajućem redosledu',
'usereditcount' => '$1 {{PLURAL:$1|izmena|izmene|izmena}}',
'usercreated' => '{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2',
'newpages' => 'Nove stranice',
'exif-compression-34712' => 'JPEG2000',
'exif-copyrighted-true' => 'Zaštićeno autorskim pravom',
-'exif-copyrighted-false' => 'Status autorskih prava nije podešen',
+'exif-copyrighted-false' => 'Status autorskih prava nije definisan',
'exif-photometricinterpretation-2' => 'RGB',
'exif-photometricinterpretation-6' => 'YCbCr',
'revdelete-show-file-submit' => 'Jee',
'revdelete-selected' => "'''{{PLURAL:$2|Uutwäälde Version|Uutwäälde Versione}} fon [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Uutwäälden Logboukiendraach|Uutwäälde Logboukiendraage}}:'''",
-'revdelete-text' => "'''Läskede Versione un Aktione ferblieuwe in ju Versionsgeskichte un do Logbouke, man Deele deerfon sunt nit eepentelk ientoukiekjen.'''
-Uur Administratore ap {{SITENAME}} hääbe Tougriep ap dän ferstatte Inhoold un konnen him mäd ju glieke Siede wier moakje, insowied uurhoop neen Ientuunengen bestounde.",
'revdelete-confirm' => 'Bestäätigje, dät du dit wuddelk dwo wolt, dät du do Konsequenze ferstoanst un dät in Uureenstimmenge mäd do [[{{MediaWiki:Policy-url}}|Gjuchtlienjen]] dääst.',
'revdelete-suppress-text' => "Unnerdrukkengen skuulen '''bloot''' in do foulgjende Fälle foarnuumen waide:
* Uunpaasende persöönelke Informatione
'tog-ccmeonemails' => 'Kirimkeun ogé salinan surélékna ka alamat kuring',
'tog-diffonly' => 'Ulah némbongkeun eusi kaca di handapeun béda éditan',
'tog-showhiddencats' => 'Témbongkeun kategori nyumput',
-'tog-noconvertlink' => 'Non-aktifkeun konvérsi judul tumbu',
'tog-norollbackdiff' => 'Liwat béda sanggeus malikkeun révisi',
'tog-useeditwarning' => 'Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen',
'revdelete-show-file-submit' => 'Enya',
'revdelete-selected' => "'''{{PLURAL:$2|Révisi pilihan|Révisi pilihan}} pikeun '''$1''''''",
'logdelete-selected' => "'''{{PLURAL:$1|pilihan keur log|pilihan keur log}}:'''",
-'revdelete-text' => "'''Revisi sarta tindakan anu geus dihapus baris tetep mecenghul di kaca vérsi tiheula, tapi teks eusi henteu bisa diakses ku publik.'''
-Kuncén séjén bakalan bisa ngakses eusi nu nyumput sarta bisa ngabolaykeun hapusan ngaliwatan antarmuka anu sarua, kajaba lamun aya pangbates séjén anu dijieun ku operator loka",
'revdelete-confirm' => 'Mangga geura konfirmasi yen Anjeun gaduh maksad pikeun ngalakukeun hal ieu, paham kana konsekwensina, tur nu dilakukeun ieu teh luyu sareng [[{{MediaWiki:Policy-url}}|kawijakanana]]',
'revdelete-suppress-text' => "Nyumputkeun revisi '''ukur''' bisa digunakeun keur kasus-kasus di handap ieu:
* Informasi nu boga potensi mitenah
'tog-ccmeonemails' => 'Skicka kopior till mig av e-post jag skickar till andra användare',
'tog-diffonly' => 'Visa inte sidinnehåll under diffar',
'tog-showhiddencats' => 'Visa dolda kategorier',
-'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
'tog-useeditwarning' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
'tog-prefershttps' => 'Använd alltid en säker anslutning när jag är inloggad',
'createacct-another-realname-tip' => 'Riktiga namnet är valfritt.
Om du väljer att ange det, kommer det användas för att tillskriva användaren för sitt arbete.',
'pt-login' => 'Logga in',
+'pt-login-button' => 'Logga in',
'pt-createaccount' => 'Skapa konto',
'pt-userlogout' => 'Logga ut',
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Vald version|Valda versioner}} av [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Vald loggåtgärd|Valda loggåtgärder}}:'''",
-'revdelete-text' => "'''Borttagna versioner och åtgärder kommer fortfarande att synas i historiken och i loggar, men deras innehåll kommer ej att vara tillgängligt för allmänheten.'''
-Andra administratörer på {{SITENAME}} kommer fortfarande att kunna läsa det dolda innehållet och kan återställa sidan genom samma gränssnitt, om inte ytterligare begränsningar finns.",
'revdelete-confirm' => 'Var god bekräfta att du vill göra detta, och att du förstår konsekvenserna, och att du gör så i enlighet med [[{{MediaWiki:Policy-url}}|policyn]].',
'revdelete-suppress-text' => "Undanhållande ska '''bara''' användas i följande fall:
* Eventuell förolämpande information
'search-file-match' => '(överensstämmer filens innehåll)',
'search-suggest' => 'Menade du: $1',
'search-interwiki-caption' => 'Systerprojekt',
-'search-interwiki-default' => 'Resultat i $1:',
+'search-interwiki-default' => 'Resultat från $1:',
'search-interwiki-more' => '(mer)',
'search-relatedarticle' => 'Relaterad',
'searcheverything-enable' => 'Sök i alla namnrymder',
'delete-edit-reasonlist' => 'Redigera anledningar för radering',
'delete-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Borttagning av sådana sidor har begränsats för att förhindra oavsiktliga driftstörningar på {{SITENAME}}.',
'delete-warning-toobig' => 'Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Att radera sidan kan skapa problem med hanteringen av databasen på {{SITENAME}}; var försiktig.',
-'deleting-backlinks-warning' => "'''Varning:''' Andra sidor länkar till eller inkluderar sidan som du är på väg att radera.",
+'deleting-backlinks-warning' => "'''Varning:'''
+[[Special:WhatLinksHere/{{FULLPAGENAME}}|Andra sidor]] länkar till eller inkluderar sidan som du är på väg att radera.",
# Rollback
'rollback' => 'Rulla tillbaka ändringar',
'sp-contributions-blocked-notice-anon' => 'Denna IP-adress är för närvarande blockerad.
Den senaste posten i blockeringsloggen visas nedan som referens:',
'sp-contributions-search' => 'Sök efter användarbidrag',
+'sp-contributions-suppresslog' => 'undanhållna användarbidrag',
'sp-contributions-username' => 'IP-adress eller användarnamn:',
'sp-contributions-toponly' => 'Visa endast aktuella sidversioner',
'sp-contributions-newonly' => 'Visa endast redigeringar där sidor skapas',
'tooltip-n-currentevents' => 'Hitta bakgrundsinformation om aktuella händelser',
'tooltip-n-recentchanges' => 'Lista över senaste ändringar i wikin',
'tooltip-n-randompage' => 'Gå till en slumpmässigt vald sida',
-'tooltip-n-help' => 'Platsen för att hitta',
+'tooltip-n-help' => 'Platsen där du hittar hjälp',
'tooltip-t-whatlinkshere' => 'Lista över alla wikisidor som länkar hit',
'tooltip-t-recentchangeslinked' => 'Visa senaste ändringarna av sidor som den här sidan länkar till',
'tooltip-feed-rss' => 'RSS-flöde för den här sidan',
'tog-ccmeonemails' => 'Nitumie nakala ya barua pepe nitakazo tuma kwa watumiaji wengine',
'tog-diffonly' => 'Usionyeshe yaliyomo kwenye ukurasa chini ya faili za diff',
'tog-showhiddencats' => 'Onyesha jamii zilizofichwa',
-'tog-noconvertlink' => 'Lemaza kiungo cha jina la badiliko',
'tog-norollbackdiff' => 'Ondoa faili za diff baada ya kufanyakazi ya kurejesha',
'tog-useeditwarning' => 'Unionyeshe ilani ninapotaka kutoka kwenye ukurasa ninouhariri, bila kuhifadhi mabadiliko',
'revdelete-show-file-submit' => 'Ndiyo',
'revdelete-selected' => "'''{{PLURAL:$2|Pitio lililoteuliwa|Mapitio yaliyoteuliwa}} ya [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Tukio la kumbukumbu lililoteuliwa|Matukio ya kumbukumbu yaliyoteuliwa}}:'''",
-'revdelete-text' => "'''Mapitio bado yataonekana kwenye ukurasa wa historia na matukio bado yataonekana kwenye kumbukumbu, lakini baadhi ya yaliyomo haitaonekana mbele ya watu wote.'''
-Wakabidhi wengine wa {{SITENAME}} bado wataweza kuliona lile lililofichwa pamoja na kulirudisha kwa kuutumia ukurasa maalum huu huu, isipowekewa vizuio vingine.",
'revdelete-confirm' => 'Tafadhali uthibitishe kwamba unataka kufanya hivyo, pamoja na kwamba unaelewa matokeo yake, na unafanya hivyo kutokana na [[{{MediaWiki:Policy-url}}|sera yetu]].',
'revdelete-suppress-text' => "Kuficha kunaruhisiwa '''tu''' wakati hizo:
* Taarifa zinazowezekana kwamba ni za kukashifu
'revdelete-show-file-submit' => 'Ja',
'revdelete-selected' => "'''{{PLURAL:$2|Wybrano wersyjo|Wybrane wersyje}} zajty [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Wybrane zdarzyńy ze rejeru|Wybrane zdarzyńa ze rejeru}}:'''",
-'revdelete-text' => "'''Wyćepane wersyje bydům dali widoczne w historyji zajty, nale jejich treść ńy bydźe publiczńy dostympna.'''
-
-Inkśi admińistratorzi {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp do schrůńůnych wersyji a bydům můgli je wćepać nazod, chyba aże uoperator serwisu nouożůł dodatkowe uograńiczyńo.",
'revdelete-legend' => 'Naštaluj uograńičyńo lo wersyji:',
'revdelete-hide-text' => 'Schrůń tekst wersyji',
'revdelete-hide-image' => 'Schrůń zawartość plika',
'suspicious-userlogout' => 'உங்கள் விடுபதிகை கோரிக்கை மறுக்கப்பட்டது ஏனென்றால் அது அறுபட்ட உலாவி அல்லது மாற்று இடைக்கிடங்கியால் அனுப்பப்பட்டுள்ளது.',
'createacct-another-realname-tip' => 'உண்மையான பெயர் கட்டாயமற்றது.
நீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.',
+'pt-login' => 'புகுபதிகை',
+'pt-createaccount' => 'புதிய கணக்கை உருவாக்கவும்',
+'pt-userlogout' => 'விடுபதிகை',
# Email sending
'php-mail-error-unknown' => "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
# Change password dialog
'changepassword' => 'கடவுச்சொல்லை மாற்று',
-'resetpass_announce' => 'நà¯\80à®\99à¯\8dà®\95ளà¯\8d தறà¯\8dà®\95ாலிà®\95 மினà¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\95à¯\81றியà¯\80à®\9fà¯\8dà®\9fà¯\81à®\9fனà¯\8d பà¯\81à®\95à¯\81பதிà®\95à¯\88 à®\9aà¯\86யà¯\8dதà¯\81ளà¯\8dளà¯\80à®°à¯\8dà®\95ளà¯\8d. பà¯\81à®\95à¯\81பதிà®\95à¯\88யà¯\88 நிறà¯\88வà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dய பà¯\81தியà®\95à¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8d à®\9aà¯\8aலà¯\8dலà¯\8aனà¯\8dà®±à¯\88 à®\87à®\99à¯\8dà®\95à¯\87 தà®\9fà¯\8dà®\9fà®\9aிà®\9fà¯\81à®\95:',
+'resetpass_announce' => 'பà¯\81à®\95à¯\81பதிà®\95à¯\88யà¯\88 நிறà¯\88வà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dய பà¯\81தியà®\95à¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8d à®\9aà¯\8aலà¯\8dலà¯\8aனà¯\8dà®±à¯\88 தà¯\87à®°à¯\8dவà¯\81 à®\9aà¯\86யà¯\8dயவà¯\87ணà¯\8dà®\9fà¯\81à®®à¯\8d.',
'resetpass_header' => 'கணக்கிற்கான கடவுச்சொல்லை மாற்றியமை',
'oldpassword' => 'பழைய கடவுச்சொல்:',
'newpassword' => 'புதிய கடவுச்சொல்:',
'resetpass-wrong-oldpass' => 'செல்லுபடியற்ற தற்காலிகமான அல்லது நடப்புக் கடவுச்சொல்.
உங்கள் கடவுச் சொல்லை நீங்கள் வெற்றிகரமாக மாற்றிவிட்டீர்கள் அல்லது புதிய தற்காலிகக் கடவுச்சொல்லைக் கோரியுள்ளீர்கள்.',
'resetpass-temp-password' => 'தற்காலிக கடவுச்சொல்:',
+'resetpass-expired' => 'உங்கள் கடவுச்சொல் காலாவதியாகிவிட்டது. உள்நுழைய ஒரு புதிய கடவுச்சொல்லை தெரிவுசெய்யவும்.',
# Special:PasswordReset
'passwordreset' => 'கடவுச்சொல்லை மீட்டமை',
'revdelete-show-file-submit' => 'ஆம்',
'revdelete-selected' => "'''[[:$1]] பக்கத்தின் தெரிவுச் செய்யப்பட்ட {{PLURAL:$2|திருத்தம்|திருத்தங்கள்}}:'''",
'logdelete-selected' => "'''தெரிவு செய்யப்பட்ட பதிகை {{PLURAL:$1|நிகழ்வு|நிகழ்வுகள்}}:'''",
-'revdelete-text' => "'''நீக்கப்பட்ட நிகழ்வுகள் மற்றும் திருத்தங்கள், வரலாற்றுப் பக்கத்திலும் குறிப்புகளிலும் தெரியும். ஆனால் அவற்றின் உள்ளடக்கத்தை எல்லோரும் பார்க்கமுடியாது.'''
-
-மேலதிக கட்டுப்பாடுகளை விதிக்காமல் இருந்தால், {{SITENAME}} இத்தளத்தில் உள்ள மற்ற நிர்வாகிகள், இந்த இணைப்பின் மூலம், மறைந்துள்ள பகுதிகளை அணுகவும் மீட்டெடுக்கவும் முடியும்.",
'revdelete-confirm' => 'நீங்கள் கண்டிப்பாக இதைச் செய்ய விரும்புகிறீர்கள் என்பதையும், இதன் விளைவுகளை புரிந்துகொண்டிருக்கின்றீர்கள் என்பதையும், மேலும் நீங்கள் [[{{MediaWiki:Policy-url}}|செயல் திட்டம்]] படி செய்கிறீர்கள் என்பதையும் உறுதிசெயுங்கள்.',
'revdelete-suppress-text' => "ஒடுக்கப்படுவது கீழ்காணும் '''காரணங்களுக்காக''' மட்டுமே செய்யப்படும்.
*அவதூறான தீங்கு விளைவிக்கக்கூடிய தகவல்
'sp-contributions-blocked-notice-anon' => 'இந்த IP முகவரி தற்போது தடுக்கப்பட்டுள்ளது.
சமீபத்திய தடுப்பு குறிப்பேடு கீழே குறிப்பிற்காக வழங்கப்பட்டுள்ளது :',
'sp-contributions-search' => 'பங்களிப்புகளைத் தேடு',
+'sp-contributions-suppresslog' => 'பயனரின் நீக்கப்பட்ட பங்களிப்புகள்',
'sp-contributions-username' => 'ஐ.பி. அல்லது பயனர் பெயர்:',
'sp-contributions-toponly' => 'சமீபத்திய பரிசீலனைகளுக்குட்பட்ட திருத்தங்களை மட்டும் காண்பி',
'sp-contributions-submit' => 'தேடுக',
'myprivateinfoprotected' => 'మీ అంతరంగిక సమాచారాన్ని సవరించేందుకు మీకు అనుమతి లేదు.',
'mypreferencesprotected' => 'మీ అభీష్టాలను సవరించేందుకు మీకు అనుమతి లేదు.',
'ns-specialprotected' => 'ప్రత్యేక పేజీలపై దిద్దుబాట్లు చేయలేరు.',
-'titleprotected' => '[[వాడుకరి:$1|$1]] ఈ పేజీని సృష్టించకుండా ఇది సంరక్షించబడింది.
+'titleprotected' => '[[User:$1|$1]] ఈ శీర్షికని సృష్టించకుండా ఇది సంరక్షించబడింది.
అందుకు ఇచ్చిన కారణం: "<em>$2</em>".',
'filereadonlyerror' => 'ఫైలు ఖజానా "$2" రీడ్-ఓన్లీ స్థితిలో ఉండటం చేత "$1" ఫైలులో మార్పులు చెయ్యలేకపోయాం.
మీరు దాన్ని ఇస్తే, వాడుకరి పనుల శ్రేయస్సు ఆ పేరుకు ఆపాదించబడుతుంది.',
'pt-login' => 'లాగినవండి',
'pt-createaccount' => 'ఖాతా సృష్టించు',
-'pt-userlogout' => 'నిషà±\8dà°\95à±\8dరమిà°\82à°\9aà±\81',
+'pt-userlogout' => 'లాà°\97à±\8cà°\9fà°µà°\82à°¡à°¿',
# Email sending
'php-mail-error-unknown' => 'PHP యొక్క mail() ఫంక్షన్లో ఏదో తెలియని లోపం దొర్లింది',
-'user-mail-no-addy' => 'ఈ-మెయిలు చిరునామాని ఇవ్వకుండానే ఈ-మెయిలు పంపడానికి ప్రయత్నించారు.',
+'user-mail-no-addy' => 'ఈమెయిలు చిరునామా ఇవ్వకుండానే ఈమెయిలు పంపడానికి ప్రయత్నించారు.',
'user-mail-no-body' => 'ఈమెయిలును ఖాళీగానో, మరీ తక్కువ విషయంతోనో పంపేందుకు ప్రయత్నించారు.',
# Change password dialog
మీ సంప్రదింపులన్నిటిలోను అన్ని పై వివరాలను ఉదహరించండి.',
'blockednoreason' => 'కారణమేమీ ఇవ్వలేదు',
'whitelistedittext' => 'పుటలలో మార్పులు చెయ్యడానికి $1.',
-'confirmedittext' => 'పేజీల్లో మార్పులు చేసేముందు మీ ఈ-మెయిలు చిరునామా ధృవీకరించాలి. [[Special:Preferences|మీ అభిరుచుల]]లో మీ ఈ-మెయిలు చిరునామా రాసి, ధృవీకరించండి.',
+'confirmedittext' => 'పేజీల్లో మార్పులు చేసేముందు మీ ఈమెయిలు చిరునామాను ధృవీకరించాలి. [[Special:Preferences|మీ అభిరుచుల]]లో మీ ఈమెయిలు చిరునామా రాసి, ధృవీకరించండి.',
'nosuchsectiontitle' => 'విభాగాన్ని కనగొనలేకపోయాం',
'nosuchsectiontext' => 'అసలు లేనే లేని విభాగాన్ని మార్చడానికి మీరు ప్రయత్నించారు.
మీరు పేజీని చూస్తూన్నప్పుడు దాన్ని ఎవరైనా తరలించి లేదా తొలగించి ఉండవచ్చు.',
'newarticle' => '(కొత్తది)',
'newarticletext' => 'ఈ లింకుకు సంబంధించిన పేజీ లేనే లేదు.
కింది పెట్టెలో మీ రచనను టైపు చేసి ఆ పేజీని సృష్టించండి (దీనిపై సమాచారం కొరకు [[{{MediaWiki:Helppage}}|సహాయం పేజీ]] చూడండి). మీరిక్కడికి పొరపాటున వచ్చి ఉంటే, మీ బ్రౌజరు <strong>back</strong> మీట నొక్కండి.',
-'anontalkpagetext' => "----''ఇది ఒక అజ్ఞాత వాడుకరి చర్చా పేజీ. ఆ వాడుకరి ఇంకా తనకై ఖాతాను సృష్టించుకోలేదు, లేదా ఖాతా ఉన్నా దానిని ఉపయోగించడం లేదు. అజ్ఞాత వాడుకరులను గుర్తించడానికి అంకెలతో ఉండే ఐ.పీ. చిరునామాను వాడుతాం. కానీ, ఒకే ఐ.పీ. చిరునామాని చాలా మంది వాడుకరులు ఉపయోగించే అవకాశం ఉంది. మీరు అజ్ఞాత వాడుకరి అయితే మరియు సంబంధంలేని వ్యాఖ్యలు మిమ్మల్ని ఉద్దేశించినట్టుగా అనిపిస్తే, భవిష్యత్తులో ఇతర అజ్ఞాత వాడుకరులతో అయోమయం లేకుండా ఉండటానికి, దయచేసి [[Special:UserLogin/signup|ఖాతాను సృష్టించుకోండి]] లేదా [[Special:UserLogin|లోనికి ప్రవేశించండి]].''",
+'anontalkpagetext' => "----
+<em>ఇది ఒక అజ్ఞాత వాడుకరి చర్చా పేజీ. ఆ వాడుకరి ఇంకా తనకై ఖాతాను సృష్టించుకోలేదు, లేదా ఖాతా ఉన్నా దానిని ఉపయోగించడం లేదు.</em>
+అంచేత, అతణ్ణి/ఆమెను గుర్తించడానికి ఐ.పీ. చిరునామాను వాడాల్సి వచ్చింది.
+ఒకే ఐ.పీ. చిరునామాని చాలా మంది వాడుకరులు ఉపయోగించే అవకాశం ఉంది.
+మీరూ అజ్ఞాత వాడుకరి అయితే, మీకు సంబంధంలేని వ్యాఖ్యలు మిమ్మల్ని ఉద్దేశించినట్టుగా అనిపిస్తే, భవిష్యత్తులో ఇతర అజ్ఞాత వాడుకరులతో అయోమయం లేకుండా ఉండటానికి, [[Special:UserLogin/signup|ఖాతాను సృష్టించుకోండి]] లేదా [[Special:UserLogin|లాగినవండి]].''",
'noarticletext' => 'ప్రస్తుతం ఈ పేజీలో పాఠ్యమేమీ లేదు.
వేరే పేజీలలో [[Special:Search/{{PAGENAME}}|ఈ పేజీ శీర్షిక కోసం వెతకవచ్చు]],
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} సంబంధిత చిట్టాలు చూడవచ్చు],
'''దీన్నింకా భద్రపరచలేదు!'''",
'sitejspreview' => "'''మీరు చూస్తున్నది ఈ JavaScript మునుజూపును మాత్రమేనని గుర్తుంచుకోండి.'''
'''దీన్నింకా భద్రపరచలేదు!'''",
-'userinvalidcssjstitle' => "'''హెచ్చరిక:''' \"\$1\" అనే అలంకారం లేదు.
-అభిమత .css మరియు .js పుటల శీర్షికలు ఇంగ్లీషు చిన్నబడి అక్షరాల లోనే ఉండాలని గుర్తుంచుకోండి, ఉదాహరణకు ఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదు.",
+'userinvalidcssjstitle' => '<strong>హెచ్చరిక:</strong> "$1" అనే రూపు లేదు.
+అభిమత .css మరియు .js పుటల శీర్షికలు ఇంగ్లీషు చిన్నబడి అక్షరాల లోనే ఉండాలని గుర్తుంచుకోండి, ఉదాహరణకు ఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదు.',
'updated' => '(నవీకరించబడింది)',
'note' => '<strong>గమనిక:</strong>',
'previewnote' => '<strong>ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.</strong>
మీ మార్పులు ఇంకా భద్రమవ్వలేదు!',
'continue-editing' => 'సరిదిద్దే చోటుకి వెళ్ళండి',
'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
-'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
-దయà°\9aà±\87సి మళà±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿.
-à°\85యినా పని à°\9cà°°à°\95à±\8dà°\95à°ªà±\8bà°¤à±\87, à°\93సారి [[Special:UserLogout|నిషà±\8dà°\95à±\8dరమిà°\82à°\9aà°¿]] మళà±\8dà°³à±\80 à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿ à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿.",
-'session_fail_preview_html' => "'''సారీ! సెషను డేటా పోవడం వలన మీ దిద్దుబాటును ప్రాసెస్ చెయ్యలేలేక పోతున్నాం.'''
+'session_fail_preview' => '<strong>క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.</strong>
+మళ్ళీ ప్రయత్నించండి.
+à°\85యినా పని à°\9cà°°à°\95à±\8dà°\95à°ªà±\8bà°¤à±\87, à°\93సారి [[Special:UserLogout|లాà°\97à±\8cà°\9fà±\88]] మళà±\8dà°³à±\80 లాà°\97ినయి à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿.',
+'session_fail_preview_html' => "<strong>సారీ! సెషను డేటా పోవడం వలన మీ దిద్దుబాటును ప్రాసెస్ చెయ్యలేలేక పోతున్నాం.</strong>
''{{SITENAME}}లో ముడి HTML సశక్తమై ఉంది కాబట్టి, జావాస్క్రిప్టు దాడుల నుండి రక్షణగా మునుజూపును దాచేశాం.''
-'''మీరు చేసినది సరైన దిద్దుబాటే అయితే, మళ్ళీ ప్రయత్నించండి. అయినా పనిచెయ్యకపోతే, ఓ సారి లాగౌటయ్యి, మళ్ళీ లాగినయి చూడండి.'''",
+<strong>మీరు చేసినది సరైన దిద్దుబాటే అయితే, మళ్ళీ ప్రయత్నించండి. అయినా పనిచెయ్యకపోతే, ఓ సారి [[Special:UserLogout|లాగౌటై]], మళ్ళీ లాగినయి చూడండి.</strong>",
'token_suffix_mismatch' => "'''మీ క్లయంటు, దిద్దుబాటు టోకెన్లోని వ్యాకరణ గుర్తులను గజిబిజి చేసింది కాబట్టి మీ దిద్దుబాటును తిరస్కరించాం. పేజీలోని పాఠ్యాన్ని చెడగొట్టకుండా ఉండేందుకు గాను, ఆ దిద్దుబాటును రద్దు చేశాం. వెబ్లో ఉండే లోపభూయిష్టమైన అజ్ఞాత ప్రాక్సీ సర్వీసులను వాడినపుడు ఒక్కోసారి ఇలా జరుగుతుంది.'''",
'edit_form_incomplete' => '’’’ఈ ఎడిట్ ఫారంలోని కొన్ని భాగాలు సర్వరును చేరలేదు; మీ మార్పుచేర్పులు భద్రంగా ఉన్నాయని ధృవపరచుకుని, మళ్ళీ ప్రయత్నించండి.’’’',
'editing' => '$1 ని సవరిస్తున్నారు',
'semiprotectedpagewarning' => '<strong>గమనిక:</strong> నమోదయిన వాడుకరులు మాత్రమే మార్పులు చెయ్యగలిగేలా ఈ పేజీకి సంరక్షించారు.
మీ సమాచారం కోసం చివరి లాగ్ పద్దుని ఇక్కడ ఇస్తున్నాం:',
'cascadeprotectedwarning' => "'''హెచ్చరిక:''' ఈ పేజీ, కాస్కేడింగు రక్షణలో ఉన్న కింది {{PLURAL:$1|పేజీ|పేజీల్లో}} ఇంక్లూడు అయి ఉంది కాబట్టి, నిర్వాహకులు తప్ప ఇతరులు దిద్దుబాటు చేసే వీలు లేకుండా {{PLURAL:$1|పేజీని|పేజీలను}} లాకు చేసాం:",
-'titleprotectedwarning' => "హెచ్చరిక: ఈ పేజీని సంరక్షించారు కాబట్టి దీన్ని సృష్టించడానికి [[Special:ListGroupRights|ప్రత్యేక హక్కులు]] ఉండాలి.'''
-మీ సమాచారం కోసం చివరి చిట్టా పద్దుని ఇక్కడ ఇస్తున్నాం:",
+'titleprotectedwarning' => '<strong>హెచ్చరిక: ఈ పేజీని సంరక్షించారు కాబట్టి దీన్ని సృష్టించడానికి [[Special:ListGroupRights|ప్రత్యేక హక్కులు]] ఉండాలి.</strong>
+మీ సమాచారం కోసం చివరి చిట్టా పద్దుని ఇక్కడ ఇస్తున్నాం:',
'templatesused' => 'ఈ పేజీలో వాడిన {{PLURAL:$1|మూస|మూసలు}}:',
'templatesusedpreview' => 'ఈ మునుజూపులో వాడిన {{PLURAL:$1|మూస|మూసలు}}:',
'templatesusedsection' => 'ఈ విభాగంలో వాడిన {{PLURAL:$1|మూస|మూసలు}}:',
'permissionserrors' => 'అనుమతి లోపం',
'permissionserrorstext' => 'కింద పేర్కొన్న {{PLURAL:$1|కారణం|కారణాల}} మూలంగా, ఆ పని చెయ్యడానికి మీకు అనుమతిలేదు:',
'permissionserrorstext-withaction' => 'ఈ క్రింది {{PLURAL:$1|కారణం|కారణాల}} వల్ల, $2 అనుమతి మీకు లేదు:',
-'recreate-moveddeleted-warn' => "'''హెచ్చరిక: ఇంతకు మునుపు ఒకసారి తొలగించిన పేజీని మళ్లీ సృష్టిద్దామని మీరు ప్రయత్నిస్తున్నారు.'''
+'recreate-moveddeleted-warn' => '<strong>హెచ్చరిక: ఇంతకు మునుపు ఒకసారి తొలగించిన పేజీని మళ్లీ సృష్టిద్దామని మీరు ప్రయత్నిస్తున్నారు.</strong>
ఈ పేజీపై మార్పులు చేసేముందు, అవి ఇక్కడ ఉండతగినవేనా కాదా అని ఒకసారి ఆలోచించండి.
-మీ సౌలభ్యం కొరకు ఈ పేజీ యొక్క తొలగింపు మరియు తరలింపు చిట్టా ఇక్కడ ఇచ్చాము:",
+మీ సౌలభ్యం కొరకు ఈ పేజీ యొక్క తొలగింపు మరియు తరలింపు చిట్టా ఇక్కడ ఇచ్చాము:',
'moveddeleted-notice' => 'ఈ పేజీని తొలగించారు.
సమాచారం కొరకు ఈ పేజీ యొక్క తొలగింపు మరియు తరలింపు చిట్టాని క్రింద ఇచ్చాం.',
'log-fulllog' => 'పూర్తి చిట్టాని చూడండి',
-'edit-hook-aborted' => 'కొక్కెం మార్పుని విచ్ఛిన్నం చేసింది.
+'edit-hook-aborted' => 'à°\95à±\8aà°\95à±\8dà°\95à±\86à°\82 à°\88 మారà±\8dà°ªà±\81ని విà°\9aà±\8dà°\9bà°¿à°¨à±\8dà°¨à°\82 à°\9aà±\87సిà°\82ది.
అది ఎటువంటి వివరణా ఇవ్వలేదు.',
-'edit-gone-missing' => 'à°ªà±\87à°\9cà±\80ని మారà±\8dà°\9aà°²à±\87à°®à±\81.
-à°¦à±\80న్ని తొలగించినట్టున్నారు.',
+'edit-gone-missing' => 'à°ªà±\87à°\9cà±\80ని తాà°\9cà°¾à°\95à°°à°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82.
+దాన్ని తొలగించినట్టున్నారు.',
'edit-conflict' => 'దిద్దుబాటు ఘర్షణ.',
-'edit-no-change' => 'పాఠà±\8dà°¯à°\82à°²à±\8b à°\8fà°®à±\80 మారà±\8dà°ªà±\81à°²à±\81 à°²à±\87à°µà±\81 à°\97à°¨à°\95, à°®à±\80 మారà±\8dà°ªà±\81ని పట్టించుకోవట్లేదు.',
+'edit-no-change' => 'పాఠà±\8dà°¯à°\82à°²à±\8b మారà±\8dà°ªà±\81à°²à±\87à°®à±\80 à°\9aà±\86à°¯à±\8dయలà±\87à°¦à±\81 à°\95ాబà°\9fà±\8dà°\9fà°¿, à°®à±\80 మారà±\8dà°ªà±\81à°¨à±\81 పట్టించుకోవట్లేదు.',
'postedit-confirmation' => 'మీ మార్పు భద్రమయ్యింది.',
-'edit-already-exists' => 'à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°\9cà±\80ని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°®à±\81.
+'edit-already-exists' => 'à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°\9cà±\80ని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82.
అది ఇప్పటికే ఉంది.',
'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
'content-failed-to-parse' => '$1 మోడల్ కొరకు $2 పాఠ్యాన్ని పార్స్ చెయ్యలేకపోయాం: $3',
'content-model-css' => 'CSS',
# Parser/template warnings
-'expensive-parserfunction-warning' => 'హెచ్చరిక: ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.
+'expensive-parserfunction-warning' => '<strong>హెచ్చరిక:</strong> ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.
పార్సరు {{PLURAL:$2|పిలుపు|పిలుపులు}} $2 కంటే తక్కువ ఉండాలి, ప్రస్తుతం {{PLURAL:$1|$1 పిలుపు ఉంది|$1 పిలుపులు ఉన్నాయి}}.',
'expensive-parserfunction-category' => 'పార్సరు సందేశాలు అధికంగా ఉన్న పేజీలు',
'post-expand-template-inclusion-warning' => '<strong>హెచ్చరిక:</strong> మూస ఇముడ్పు సైజు చాలా పెద్దదిగా ఉంది.
కొన్ని మూసలు ఇమడ్చబడవు.',
'post-expand-template-inclusion-category' => 'మూస చేర్పు సైజును అధిగమించిన పేజీలు',
-'post-expand-template-argument-warning' => 'హెచ్చరిక: చాల పెద్ద సైజున్న మూస ఆర్గ్యుమెంటు, కనీసం ఒకటి, ఈ పేజీలో ఉంది.
+'post-expand-template-argument-warning' => '<strong>హెచ్చరిక:</strong> చాల పెద్ద సైజున్న మూస ఆర్గ్యుమెంటు, కనీసం ఒకటి, ఈ పేజీలో ఉంది.
ఈ ఆర్గ్యుమెంట్లను వదలివేసాం.',
'post-expand-template-argument-category' => 'తొలగించిన మూస ఆర్గ్యుమెంట్లు ఉన్న పేజీలు',
'parser-template-loop-warning' => 'మూస లూపు కనబడింది: [[$1]]',
'parser-template-recursion-depth-warning' => 'మూస రికర్షను లోతు అధిగమించబడింది ($1)',
'language-converter-depth-warning' => 'భాషా మార్పిడి లోతు పరిమితిని అధిగమించారు ($1)',
+'node-count-exceeded-category' => 'నోడ్-కౌంటును మించిన పేజీలు',
+'node-count-exceeded-warning' => 'పేజీ నోడ్-కౌంటును మించింది',
+'expansion-depth-exceeded-category' => 'విస్తరణ లోతును మించిన పేజీలు',
+'expansion-depth-exceeded-warning' => 'పేజీ విస్తరణ లోతును మించింది',
+'parser-unstrip-loop-warning' => 'Unstrip లూపును కనుక్కున్నాం',
+'parser-unstrip-recursion-limit' => 'Unstrip రికర్షన్ పరిమితిని దాటింది ($1)',
+'converter-manual-rule-error' => 'మానవిక భాషాంతరీకరణ పరికరంలో లోపాన్ని కనుక్కున్నాం',
# "Undo" feature
'undo-success' => 'దిద్దుబాటును రద్దు చెయ్యవచ్చు. కింది పోలికను చూసి, మీరు చెయ్యదలచినది ఇదేనని నిర్ధారించుకోండి. ఆ తరువాత మార్పులను భద్రపరచి దిద్దుబాటు రద్దును పూర్తి చెయ్యండి.',
'undo-failure' => 'మధ్యలో జరిగిన దిద్దుబాట్లతో తలెత్తిన ఘర్షణ కారణంగా ఈ దిద్దుబాటును రద్దు చెయ్యలేక పోయాం.',
'undo-norev' => 'ఈ దిద్దుబాటు అసలు లేకపోవటం వలన గానీ, లేదా తొలగించేయడం వలన గానీ దాన్ని రద్దుచేయలేకపోతున్నాం.',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[వాడుకరి చర్చ:$2|చర్చ]]) యొక్క కూర్పు $1 ను రద్దుచెయ్యి',
+'undo-nochange' => 'ఆ మార్పును ఈసరికే రద్దు చేసినట్లుగా కనిపిస్తోంది.',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) యొక్క కూర్పు $1 ను రద్దుచెయ్యి',
'undo-summary-username-hidden' => 'దాచబడిన వాడుకరి చేసిన కూర్పు $1 ని వెనక్కి తిప్పండి',
# Account creation failure
'page_first' => 'మొదటి',
'page_last' => 'చివరి',
'histlegend' => 'తేడా ఎంపిక: సంచికల యొక్క రేడియో బాక్సులను ఎంచుకొని ఎంటర్ నొక్కండి, లేదా పైన/ కింద ఉన్న మీటను నొక్కండి.<br />
-సూచిక: (ప్రస్తుత) = ప్రస్తుత సంచికతో కల తేడాలు, (గత) = ఇంతకు ముందరి సంచికతో గల తేడాలు, చి = చిన్న మార్పు',
+సూచిక: <strong>({{int:cur}})</strong> = ప్రస్తుత సంచికతో కల తేడాలు, <strong>({{int:last}})</strong> = ఇంతకు ముందరి సంచికతో గల తేడాలు, <strong>{{int:minoreditletter}}</strong> = చిన్న మార్పు',
'history-fieldset-title' => 'చరిత్ర చూడండి',
'history-show-deleted' => 'తొలగించినవి మాత్రమే',
'histfirst' => 'అతి పాతవి',
'rev-deleted-user' => '(వాడుకరి పేరుని తొలగించారు)',
'rev-deleted-event' => '(దినచర్యని తొలగించాం)',
'rev-deleted-user-contribs' => '[వాడుకరిపేరు లేదా ఐపీ చిరునామాని తొలగించారు - మార్పుచేర్పుల నుండి మార్పుని దాచారు]',
-'rev-deleted-text-permission' => "ఈ పేజీ కూర్పుని '''తొలగించారు'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°ªà±\82à°°à±\8dతి వివరాలà±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.",
+'rev-deleted-text-permission' => 'ఈ పేజీ కూర్పుని <strong>తొలగించారు</strong>.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b à°ªà±\82à°°à±\8dతి వివరాలà±\81 à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81.',
'rev-deleted-text-unhide' => "పేజీ యొక్క ఈ కూర్పును '''తొలగించాం'''.
[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు చూడవచ్చు.
మీరు కావాలనుకుంటే, [$1 ఈ కూర్పుని చూడవచ్చు].",
మీరు దాన్ని చూడవచ్చు; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు దొరుకుతాయి.',
'rev-suppressed-text-view' => 'ఈ పేజీకూర్పును <strong>అణచి పెట్టాం</strong>.
మీరు దాన్ని చూడవచ్చు; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} అణచివేత చిట్టా]లోవివరాలు ఉంటాయి.',
-'rev-deleted-no-diff' => "మీరు తేడాలను చూడలేదు ఎందుకంటే ఒక కూర్పుని '''తొలగించారు'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b వివరాలà±\81 à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81.",
+'rev-deleted-no-diff' => 'మీరు ఈ తేడాను చూడలేరు. ఎందుకంటే ఒక కూర్పు <strong>తొలగించబడింది</strong>.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fà°¾]à°²à±\8b వివరాలà±\81 à°\9aà±\82à°¡à°µà°\9aà±\8dà°\9aà±\81.',
'rev-suppressed-no-diff' => "ఈ తేడాని మీరు చూడలేరు ఎందుకంటే ఒక కూర్పుని '''తొలగించారు'''.",
'rev-deleted-unhide-diff' => 'ఈ తేడాల యొక్క కూర్పులలో ఒకదాన్ని <strong>తొలగించారు</strong>.
[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు చిట్టా]లో వివరాలు ఉంటాయి.
'revdelete-no-file' => 'పేర్కొన్న ఫైలు ఉనికిలో లేదు.',
'revdelete-show-file-confirm' => 'మీరు నిజంగానే "<nowiki>$1</nowiki>" ఫైలు యొక్క $2 $3 నాటి తొలగించిన కూర్పుని చూడాలనుకుంటున్నారా?',
'revdelete-show-file-submit' => 'అవును',
-'revdelete-selected' => "'''[[:$1]] యొక్క {{PLURAL:$2|ఎంచుకున్న కూర్పు|ఎంచుకున్న కూర్పులు}}:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|ఎంచుకున్న చిట్టా ఘటన|ఎంచుకున్న చిట్టా ఘటనలు}}:'''",
-'revdelete-text' => "'''తొలగించిన కూర్పులు, ఘటనలూ పేజీ చరితం లోనూ, చిట్టాలలోనూ కనిపిస్తాయి, కానీ వాటిలో కొన్ని భాగాలు సార్వజనికంగా అందుబాటులో ఉండవు.'''
-{{SITENAME}} లోని ఇతర నిర్వాహకులు ఆ దాచిన భాగాలను చూడగలరు మరియు (ఏవిధమైన నియంత్రణలూ లేకుంటే) ఇదే అంతరవర్తి ద్వారా వాటిని పునస్థాపించగలరు.",
-'revdelete-confirm' => 'మీరు దీన్ని చేయగోరుతున్నారనీ, దీని పర్యవసానాలు మీకు తెలుసుననీ, మరియు మీరు దీన్ని [[{{MediaWiki:Policy-url}}|విధానం]] ప్రకారమే చేస్తున్నారనీ దయచేసి నిర్ధారించండి.',
+'revdelete-selected' => '<strong>[[:$1]] యొక్క {{PLURAL:$2|ఎంచుకున్న కూర్పు|ఎంచుకున్న కూర్పులు}}:</strong>',
+'logdelete-selected' => '<strong>{{PLURAL:$1|ఎంచుకున్న చిట్టా ఘటన|ఎంచుకున్న చిట్టా ఘటనలు}}:</strong>',
+'revdelete-confirm' => 'మీరు దీన్ని చేయగోరుతున్నారనీ, దీని పర్యవసానాలు మీకు తెలుసుననీ, దీన్ని సంబంధిత [[{{MediaWiki:Policy-url}}|విధానం]] ప్రకారమే చేస్తున్నారనీ నిర్ధారించండి.',
'revdelete-suppress-text' => 'అణచివేతను కింది సందర్భాలలో <strong>మాత్రమే</strong> వాడాలి:
* బురదజల్లే ధోరణిలో ఉన్న సమాచారం
* అనుచితమైన వ్యక్తిగత సమాచారం
*<em>ఇంటి చిరునామాలు, టెలిఫోను నంబర్లు, జాతీయ ఐడీ నంబర్లు, వగైరాలు</em>',
'revdelete-legend' => 'సందర్శక నిబంధనలు అమర్చు',
-'revdelete-hide-text' => 'à°ªà±\81à°¨à°\83పరిశà±\80లన పాఠ్యం',
+'revdelete-hide-text' => 'à°\95à±\82à°°à±\8dà°ªà±\81 పాఠ్యం',
'revdelete-hide-image' => 'ఫైలులోని విషయాన్ని దాచు',
'revdelete-hide-name' => 'చర్యను, లక్ష్యాన్నీ దాచు',
'revdelete-hide-comment' => 'దిద్దుబాటు సారాంశం',
-'revdelete-hide-user' => 'దిద్దుబాటు చేసినవారి వాడుకరి పేరు/ఐపీ చిరునామా',
+'revdelete-hide-user' => 'దిద్దుబాటు చేసిన వాడుకరి పేరు/ఐపీ చిరునామా',
'revdelete-hide-restricted' => 'డేటాను అందరిలాగే నిర్వాహకులకు కూడా కనబడనివ్వకు',
'revdelete-radio-same' => '(మార్చకు)',
'revdelete-radio-set' => 'దాచు',
'revdelete-success' => '<strong>కూర్పు కనబడే విధానాన్ని జయప్రదంగా తాజాకరించాం.</strong>',
'revdelete-failure' => '<strong>కూర్పు కనబడే పద్ధతిని తాజాపరచలేకపోయాం:</strong>
$1',
-'logdelete-success' => "'''ఘటన కనబడే విధానాన్ని జయప్రదంగా సెట్ చేసాం.'''",
+'logdelete-success' => '<strong>ఘటన కనబడే విధానాన్ని జయప్రదంగా సెట్ చేసాం.</strong>',
'logdelete-failure' => "'''చిట్టా కనబడే పద్ధతిని అమర్చలేకపోయాం:'''
$1",
'revdel-restore' => 'దృశ్యతని మార్చు',
'diff-empty' => '(తేడా లేదు)',
'diff-multi-sameuser' => '(ఇదే వాడుకరి యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)',
'diff-multi-otherusers' => '({{PLURAL:$2|మరో వాడుకరి|$2 వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)',
-'diff-multi-manyusers' => '$2 à°®à°\82ది à°ªà±\88à°¨ ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
+'diff-multi-manyusers' => '$2 à°\95à°\82à°\9fà±\87 à°\8eà°\95à±\8dà°\95à±\81à°µ ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
'difference-missing-revision' => 'ఈ తేడా ($1) యొక్క {{PLURAL:$2|ఒక కూర్పు|$2 కూర్పులు}} {{PLURAL:$2|కనబడలేదు}}.
సాధారణంగా, తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన ’తేడా’ లింకును నొక్కినపుడు ఇది జరుగుతుంది.
# Search results
'searchresults' => 'వెతుకులాట ఫలితాలు',
'searchresults-title' => '"$1" కి వెతుకులాట ఫలితాలు',
-'toomanymatches' => 'à°\9aాలా పోలికలు వచ్చాయి, దయచేసి మరో ప్రశ్నని ప్రయత్నించండి',
+'toomanymatches' => 'మరà±\80 à°\8eà°\95à±\8dà°\95à±\81à°µ పోలికలు వచ్చాయి, దయచేసి మరో ప్రశ్నని ప్రయత్నించండి',
'titlematches' => 'వ్యాస శీర్షిక సరిపోయింది',
'textmatches' => 'పేజిలోని పాఠం సరిపోలింది',
'notextmatches' => 'పేజీ పాఠ్యమేదీ సరిపోలడం లేదు',
'nextn-title' => 'తరువాతి $1 {{PLURAL:$1|ఫలితం|ఫలితాలు}}',
'shown-title' => 'పేజీకి $1 {{PLURAL:$1|ఫలితాన్ని|ఫలితాలను}} చూపించు',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) చూపించు.',
-'searchmenu-exists' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేజీ ఉంది'''",
+'searchmenu-exists' => '<strong>ఈ వికీలో "[[:$1]]" అనే పేజీ ఉంది.</strong> {{PLURAL:$2|0=|ఇతర ఫలితాలను కూడా చూడండి.}}',
'searchmenu-new' => '<strong>ఈ వికీలో "[[:$1]]" అనే పేరుతో పేజీని సృష్టించండి!</strong> {{PLURAL:$2|0=|మీ వెతుకులాటలో దొరికిన పేజీని కూడా చూడండి.|వెతుకులాట ఫలితాలను కూడా చూడండి.}}',
'searchprofile-articles' => 'విషయపు పేజీలు',
'searchprofile-project' => 'సహాయం మరియు ప్రాజెక్టు పేజీలు',
'searcheverything-enable' => 'అన్ని పేరుబరుల్లో వెతుకు',
'searchrelated' => 'సంబంధించినవి',
'searchall' => 'అన్నీ',
-'showingresults' => "కింద ఉన్న {{PLURAL:$1|'''ఒక్క''' ఫలితం|'''$1''' ఫలితాలు}}, #'''$2''' నుండి మొదలుకొని చూపిస్తున్నాం.",
-'showingresultsnum' => "కింద ఉన్న {{PLURAL:$3|'''ఒక్క''' ఫలితం|'''$3''' ఫలితాలు}}, #'''$2''' నుండి మొదలుకొని చూపిస్తున్నాం.",
-'showingresultsheader' => "'''$4''' కొరకై {{PLURAL:$5|'''$3'''లో '''$1''' ఫలితం|'''$3''' ఫలితాల్లో '''$1 - $2''' వరకు}}",
+'showingresults' => '#<strong>$2</strong> నుండి మొదలుకొని {{PLURAL:$1|</strong>ఒక్క</strong> ఫలితాన్ని|<strong>$1</strong> ఫలితాలను}} కింద చూపించాం.',
+'showingresultsinrange' => '#<strong>$2</strong> నుండి #<strong>$3</strong> వరకు ఉన్న ఫలితాల శ్రేణి నుండి {{PLURAL:$1|<strong>ఒక్క</strong> ఫలితం|<strong>$1</strong> ఫలితాల}} వరకు కింద చూపించాం.',
+'showingresultsnum' => '#<strong>$2</strong> నుండి మొదలుకొని {{PLURAL:$3|<strong>ఒక్క</strong> ఫలితాన్ని|<strong>$3</strong> ఫలితాలను}} కింద చూపించాం.',
+'showingresultsheader' => '<strong>$4</strong> కోసం వచ్చిన ఫలితాలు {{PLURAL:$5|<strong>$3</strong> లో <strong>$1</strong>|</strong>$3</strong> లో <strong>$1 - $2</strong>}}',
'search-nonefound' => 'మీ ప్రశ్నకి సరిపోలిన ఫలితాలేమీ లేవు.',
'powersearch-legend' => 'నిశితమైన అన్వేషణ',
'powersearch-ns' => 'ఈ పేరుబరుల్లో వెతుకు:',
'powersearch-toggleall' => 'అన్నీ',
'powersearch-togglenone' => 'ఏదీకాదు',
'search-external' => 'బయటి అన్వేషణ',
-'searchdisabled' => '{{SITENAME}} à°\85à°¨à±\8dà°µà±\87à°·à°£ తాతà±\8dà°\95ాలిà°\95à°\82à°\97à°¾ పని à°\9aà±\86à°¯à±\8dయడà°\82 à°²à±\87à°¦à±\81. à°\88à°²à±\8bà°\97à°¾ à°®à±\80à°°à±\81 à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿ à°\85à°¨à±\8dà°µà±\87à°·à°¿à°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81. à°\92à°\95 à°\97మనిà°\95: à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c à°¦à±\8dవారా à°\95ాలదà±\8bà°·à°\82 à°ªà°\9fà±\8dà°\9fà°¿à°¨ ఫలితాలà±\81 రావడానిà°\95à°¿ అవకాశం ఉంది.',
+'searchdisabled' => '{{SITENAME}} à°\85à°¨à±\8dà°µà±\87à°·à°£ తాతà±\8dà°\95ాలిà°\95à°\82à°\97à°¾ పని à°\9aà±\86à°¯à±\8dయడà°\82 à°²à±\87à°¦à±\81. à°\88à°²à±\8bà°\97à°¾ à°®à±\80à°°à±\81 à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿ à°\85à°¨à±\8dà°µà±\87à°·à°¿à°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81. à°\97మనిà°\95: à°\97à±\82à°\97à±\81à°²à±\8dâ\80\8c వారి {{SITENAME}} ఫలితాలà±\81 à°\95ాలదà±\8bà°·à°\82 à°ªà°\9fà±\8dà°\9fà°¿ à°\89à°\82à°¡à±\87 అవకాశం ఉంది.',
'search-error' => '$1 కోసం వెతికేటపుడు లోపమేదో దొర్లింది.',
# Preferences page
'prefs-help-variant' => 'ఈ వికీ లోని విషయపు పేజీలను చూపించడానికి మీ అభిమత వైవిధ్యం లేదా ఆర్ధోగ్రఫీ.',
'yournick' => 'కొత్త సంతకం:',
'prefs-help-signature' => 'చర్చా పేజీల లోని వ్యాఖ్యలకు "<nowiki>~~~~</nowiki>"తో సంతకం చేస్తే అది మీ సంతకం మరియు కాలముద్రగా మారుతుంది.',
-'badsig' => 'సంతకాన్ని సరిగ్గా ఇవ్వలేదు; HTML ట్యాగులను ఒకసారి పరిశీలించండి.',
+'badsig' => 'సంతకం చెల్లనిది.
+HTML ట్యాగులను ఒకసారి సరిచూసుకోండి.',
'badsiglength' => 'మీ సంతకం చాలా పెద్దగా ఉంది.
ఇది తప్పనిసరిగా $1 {{PLURAL:$1|అక్షరం|అక్షరాల}} లోపులోనే ఉండాలి.',
'yourgender' => 'మిమ్మల్ని మీరు ఎలా వర్ణించుకుంటారు?',
'email' => 'ఈ-మెయిలు',
'prefs-help-realname' => 'అసలు పేరు తప్పనిసరి కాదు.
అసలు పేరు ఇస్తే, మీ రచనల శ్రేయస్సు మీ అసలు పేరుకే ఆపాదించబడుతుంది.',
-'prefs-help-email' => 'ఈ-మెయిలు చిరునామా ఐచ్చికం, కానీ మీరు సంకేతపదాన్ని మర్చిపోతే కొత్త సంకేతపదాన్ని మీకు పంపించడానికి అవసరమవుతుంది.',
+'prefs-help-email' => 'ఈమెయిలు చిరునామా ఐచ్చికం. కానీ మీరు సంకేతపదాన్ని మర్చిపోతే కొత్త సంకేతపదాన్ని మీకు పంపించడానికి ఇది అవసరం.',
'prefs-help-email-others' => 'మీ వాడుకరి లేదా చర్చా పేజీలలో ఉండే లంకె ద్వారా ఇతరులు మిమ్మల్ని ఈ-మెయిలు ద్వారా సంప్రదించే వీలుకల్పించవచ్చు.
ఇతరులు మిమ్మల్ని సంప్రదించినప్పుడు మీ ఈ-మెయిలు చిరునామా బహిర్గతమవదు.',
'prefs-help-email-required' => 'ఈ-మెయిలు చిరునామా తప్పనిసరి.',
'saveusergroups' => 'వాడుకరి గుంపులను భద్రపరచు',
'userrights-groupsmember' => 'సభ్యులు:',
'userrights-groupsmember-auto' => 'సంభావిత సభ్యులు:',
-'userrights-groups-help' => 'à°\88 వాడà±\81à°\95à°°à°¿ à°\8fà°¯à±\87 à°\97à±\81à°\82à°ªà±\81లలà±\8b à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aో మీరు మార్చవచ్చు.
+'userrights-groups-help' => 'à°\88 వాడà±\81à°\95à°°à°¿ à°\8fà°¯à±\87 à°\97à±\81à°\82à°ªà±\81లలà±\8b à°\89à°\82డాలో మీరు మార్చవచ్చు.
* టిక్కు పెట్టివుంటే ఆ గుంపులో ఈ వాడుకరి ఉన్నట్టు.
* టిక్కు లేకుంటే ఆ గుంపులో ఈ వాడుకరి లేనట్టు.
-* <nowiki>*</nowiki> ఉంటే ఒకసారి ఆ గుంపుని చేర్చాకా మీరు తీసివేయలేరు, లేదా తీసివేసాకా తిరిగి చేర్చలేరు.',
+* * ఉంటే ఒకసారి ఆ గుంపుని చేర్చాక మీరు తీసివేయలేరు, లేదా తీసివేసాక తిరిగి చేర్చలేరు.',
'userrights-reason' => 'కారణం:',
'userrights-no-interwiki' => 'ఇతర వికీలలో వాడుకరి హక్కులను మార్చడానికి మీకు అనుమతి లేదు.',
'userrights-nodatabase' => '$1 అనే డేటాబేసు లేదు లేదా అది స్థానికం కాదు.',
-'userrights-nologin' => 'వాడà±\81à°\95à°°à°¿ à°¹à°\95à±\8dà°\95à±\81లనà±\81 à°\87à°µà±\8dవడానిà°\95à°¿ à°®à±\80à°°à±\81 తపà±\8dపనిసరిà°\97à°¾ à°\93 నిరà±\8dవాహà°\95 à°\96ాతాతà±\8b [[Special:UserLogin|à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aాలి]].',
+'userrights-nologin' => 'వాడà±\81à°\95à°°à°¿ à°¹à°\95à±\8dà°\95à±\81లనà±\81 à°\87à°µà±\8dవడానిà°\95à°¿ à°®à±\80à°°à±\81 తపà±\8dపనిసరిà°\97à°¾ à°\93 నిరà±\8dవాహà°\95 à°\96ాతాతà±\8b [[Special:UserLogin|లాà°\97ినవà±\8dà°µాలి]].',
'userrights-notallowed' => 'వాడుకరి హక్కులను చేర్చే మరియు తొలగించే అనుమతి మీకు లేదు.',
'userrights-changeable-col' => 'మీరు మార్చదగిన గుంపులు',
'userrights-unchangeable-col' => 'మీరు మార్చలేని గుంపులు',
'grouppage-autoconfirmed' => '{{ns:project}}:ఆటోమాటిగ్గా నిర్ధారించబడిన వాడుకరులు',
'grouppage-bot' => '{{ns:project}}:బాట్లు',
'grouppage-sysop' => '{{ns:project}}:నిర్వాహకులు',
-'grouppage-bureaucrat' => '{{ns:project}}:à°\85ధిà°\95ారà±\8dలు',
+'grouppage-bureaucrat' => '{{ns:project}}:à°\85ధిà°\95ారà±\81లు',
'grouppage-suppress' => '{{ns:project}}:పూర్తి తొలగింపు',
# Rights
'right-reupload' => 'ఇప్పటికే ఉన్న ఫైలును తిరగరాయి',
'right-reupload-own' => 'తానే ఇదివరలో అప్లోడు చేసిన ఫైలును తిరగరాయి',
'right-reupload-shared' => 'స్థానికంగా ఉమ్మడి మీడియా సొరుగులోని ఫైళ్ళను అధిక్రమించు',
-'right-upload_by_url' => 'URL à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81à°\82à°¡à°¿ à°«à±\88à°²à±\81à°¨à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\86à°¯à±\8dయి',
+'right-upload_by_url' => 'URL à°\85à°¡à±\8dà°°à°¸à±\81à°¨à±\81à°\82à°¡à°¿ à°«à±\88à°²à±\81à°¨à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\86à°¯à±\8dయడà°\82',
'right-purge' => 'పేజీకి సంబంధించిన సైటు కాషెను, నిర్ధారణ కోరకుండానే తొలగించు',
'right-autoconfirmed' => 'ఐపీ ఆధారిత రేటు పరిమితులు ప్రభావం చూపవు',
'right-bot' => 'ఆటోమాటిక్ ప్రాసెస్ లాగా భావించబడు',
-'right-nominornewtalk' => 'à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\9cà°°à°¿à°\97à°¿à°¨ à°\85తి à°\9aà°¿à°¨à±\8dà°¨ మారà±\8dà°ªà±\81à°²à°\95à±\81 à°\95à±\8aà°¤à±\8dతసà°\82à°¦à±\87శమà±\81 à°µà°\9aà±\8dà°\9aà°¿à°\82దనà±\8dà°¨ à°¸à±\82à°\9aà°¨ à°\9aà±\86à°¯à±\8dయవదà±\8dదు',
-'right-apihighlimits' => 'API à°ªà±\8dà°°à°¶à±\8dనలà±\8dà°²à±\8b à°\89à°¨à±\8dనత పరిమితà±\81లనà±\81 వాడà±\81',
+'right-nominornewtalk' => 'à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\9aà±\87à°¸à±\87 à°\9aà°¿à°¨à±\8dà°¨ మారà±\8dà°ªà±\81à°²à°\95à±\81 à°\95à±\8aà°¤à±\8dతసà°\82à°¦à±\87శపà±\81 à°¸à±\82à°\9aà°¨ à°ªà°\82à°ªà°\95à±\82à°¡దు',
+'right-apihighlimits' => 'API à°ªà±\8dà°°à°¶à±\8dనలà±\8dà°²à±\8b à°\89à°¨à±\8dనత పరిమితà±\81లనà±\81 వాడడà°\82',
'right-writeapi' => 'రైట్ API వినియోగం',
'right-delete' => 'పేజీలను తొలగించడం',
'right-bigdelete' => 'చాలా పెద్ద చరితం ఉన్న పేజీలను తొలగించు',
+'right-deletelogentry' => 'లాగ్ ఎంట్రీలను తొలగించడం, తొలగింపులను రద్దు చెయ్యడం',
'right-deleterevision' => 'పేజీల ప్రత్యేకించిన కూర్పులను తొలగించు, తొలగింపును నివారించు',
'right-deletedhistory' => 'తొలగింపులను, వాటి పాఠ్యం లేకుండా, చరితంలో చూడు',
'right-deletedtext' => 'తొలగించిన పాఠ్యాన్ని మరియు తొలగించిన కూర్పుల మధ్య మార్పలని చూడగలగడం',
-'right-browsearchive' => 'à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°µà±\86à°¤à±\81à°\95à±\81',
+'right-browsearchive' => 'à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°µà±\86à°¤à°\95à°¡à°\82',
'right-undelete' => 'పేజీ తొలగింపును రద్దు చెయ్యి',
'right-suppressrevision' => 'నిర్వాహకులకు కనబడకుండా ఉన్న కూర్పులను సమీక్షించి పునస్థాపించడం',
'right-suppressionlog' => 'గోప్యంగా ఉన్న లాగ్లను చూడడం',
'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" గా సంరక్షించబడ్డ పేజీలను మార్చు',
'right-editinterface' => 'యూజరు ఇంటరుఫేసులో దిద్దుబాటు చెయ్యి',
'right-editusercssjs' => 'ఇతర వాడుకరుల CSS, JS ఫైళ్ళలో దిద్దుబాటు చెయ్యి',
-'right-editusercss' => 'à°\87తర వాడà±\81à°\95à°°à±\81à°² CSS à°«à±\88à°³à±\8dళలà±\8b దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయి',
-'right-edituserjs' => 'à°\87తర వాడà±\81à°\95à°°à±\81à°² JS à°«à±\88à°³à±\8dళలà±\8b దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయి',
+'right-editusercss' => 'à°\87తర వాడà±\81à°\95à°°à±\81à°² CSS à°«à±\88à°³à±\8dళలà±\8b దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయడà°\82',
+'right-edituserjs' => 'à°\87తర వాడà±\81à°\95à°°à±\81à°² JS à°«à±\88à°³à±\8dళలà±\8b దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\86à°¯à±\8dయడà°\82',
'right-editmyusercss' => 'మీ స్వంత వాడుకరి CSS ఫైళ్ళను సరిదిద్దండి',
'right-editmyuserjs' => 'మీ స్వంత JavaScript దస్త్రాలను మార్చండి',
'right-viewmywatchlist' => 'మీ స్వంత వీక్షణజాబితాను చూడండి',
'right-viewmyprivateinfo' => 'మీ స్వంత గోపనీయ డేటాను చూడండి (ఉదా: ఈమెయిలు చిరునామా, అసలు పేరు)',
'right-editmyprivateinfo' => 'మీ స్వంత గోపనీయ డేటాను మార్చుకోండి (ఉదా: ఈమెయిలు చిరునామా, అసలు పేరు)',
'right-editmyoptions' => 'మీ స్వంత అభిరుచులను మార్చుకోండి',
-'right-rollback' => 'à°\92à°\95ానà±\8aà°\95 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aివరి దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\87సిన వాడà±\81à°\95à°°à°¿ à°\9aà±\87సిన దిదà±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి',
+'right-rollback' => 'à°\92à°\95ానà±\8aà°\95 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aివరి దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°\9aà±\87సిన వాడà±\81à°\95à°°à°¿ à°\9aà±\87సిన దిదà±\8dà°¦à±\81బాà°\9fà±\8dలనà±\81 à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యడà°\82',
'right-markbotedits' => 'వెనక్కి తెచ్చిన దిద్దుబాట్లను బాట్ దిద్దుబాట్లుగా గుర్తించు',
'right-noratelimit' => 'రేటు పరిమితులు ప్రభావం చూపవు',
-'right-import' => 'ఇతర వికీల నుండి పేజీలను దిగుమతి చేసుకో',
-'right-importupload' => 'à°«à±\88à°²à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°¨à±\81à°\82à°¡à°¿ à°ªà±\87à°\9cà±\80లనà±\81 దిà°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8b',
+'right-import' => 'ఇతర వికీల నుండి పేజీలను దిగుమతి చేసుకోవడం',
+'right-importupload' => 'à°«à±\88à°²à±\81 à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81 à°¨à±\81à°\82à°¡à°¿ à°ªà±\87à°\9cà±\80లనà±\81 దిà°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8bవడà°\82',
'right-patrol' => 'ఇతరుల దిద్దుబాట్లను నిఘాలో ఉన్నట్లుగా గుర్తించు',
'right-autopatrol' => 'తానే చేసిన మార్పులను నిఘాలో ఉన్నట్లుగా ఆటోమాటిగా గుర్తించు',
'right-patrolmarks' => 'ఇటీవలి మార్పుల నిఘా గుర్తింపులను చూడు',
'right-unwatchedpages' => 'వీక్షణలో లేని పేజీల జాబితాను చూడు',
-'right-mergehistory' => 'à°ªà±\87à°\9cà±\80à°² à°¯à±\8aà°\95à±\8dà°\95 à°\9aà°°à°¿à°¤à±\8dరలని విలà±\80à°¨à°\82 à°\9aà±\87à°¯à°\97à°²à°\97à°¡à°\82',
+'right-mergehistory' => 'పేజీల యొక్క చరిత్రలని విలీనం చేయడం',
'right-userrights' => 'వాడుకరులందరి హక్కులను మార్చు',
'right-userrights-interwiki' => 'ఇతర వికీల్లోని వాడుకరుల హక్కులను మార్చు',
'right-siteadmin' => 'డేటాబేసును లాక్, అన్లాక్ చెయ్యి',
'right-override-export-depth' => '5 లింకుల లోతు వరకు ఉన్న పేజీలతో సహా, పేజీలను ఎగుమతి చెయ్యి',
-'right-sendemail' => 'à°\87తర వాడà±\81à°\95à°°à±\81à°²à°\95à±\81 à°\88-à°®à±\86యిలà±\81 à°ªà°\82పిà°\82à°\9aà°\97à°²à°\97à°¡à°\82',
-'right-passwordreset' => 'à°¸à°\82à°\95à±\87తపదానà±\8dని à°ªà±\81నరà±\81à°¦à±\8dధరిà°\82à°\9aà°¿à°¨ à°\88-à°®à±\86యిళà±\8dà°³à±\81',
+'right-sendemail' => 'ఇతర వాడుకరులకు ఈ-మెయిలు పంపించడం',
+'right-passwordreset' => 'à°¸à°\82à°\95à±\87తపదà°\82 మారà±\8dà°ªà±\81 à°\88à°®à±\86యిళà±\8dళనà±\81 à°\9aà±\82à°¡à°¡à°\82',
# Special:Log/newusers
'newuserlogpage' => 'కొత్త వాడుకరుల చిట్టా',
'rightslogtext' => 'ఇది వాడుకరుల హక్కులకు జరిగిన మార్పుల చిట్టా.',
# Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°\9aదవà°\82à°¡à°¿',
+'action-read' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°\9aదివà±\87',
'action-edit' => 'ఈ పేజీని సవరించే',
'action-createpage' => 'పేజీలను సృష్టించే',
'action-createtalk' => 'చర్చాపేజీలను సృష్టించే',
'action-createaccount' => 'ఈ వాడుకరి ఖాతాని సృష్టించే',
-'action-minoredit' => 'à°\88 మారà±\8dà°ªà±\81ని à°\9aà°¿à°¨à±\8dనదానిà°\97à°¾ à°\97à±\81à°°à±\8dతిà°\82à°\9aà±\87',
+'action-minoredit' => 'ఈ మార్పుని చిన్నదిగా గుర్తించే',
'action-move' => 'ఈ పేజీని తరలించే',
-'action-move-subpages' => 'ఈ పేజీని మరియు దీని ఉపపేజీలను తరలించే',
-'action-move-rootuserpages' => 'à°ªà±\8dరధాన వాడà±\81à°\95à°°à°¿ à°ªà±\87à°\9cà±\80లని తరలిà°\82à°\9aà°\97à°¡à°\97à°¡à°\82',
+'action-move-subpages' => 'ఈ పేజీని, దీని ఉపపేజీలనూ తరలించే',
+'action-move-rootuserpages' => 'à°ªà±\8dరధాన వాడà±\81à°\95à°°à°¿ à°ªà±\87à°\9cà±\80లని తరలిà°\82à°\9aà±\87',
'action-movefile' => 'ఈ ఫైలుని తరలించే',
'action-upload' => 'ఈ దస్త్రాన్ని ఎక్కించే',
'action-reupload' => 'ఈ ఫైలుని తిరగవ్రాసే',
'action-userrights' => 'అందరు వాడుకరుల హక్కులను మార్చే',
'action-userrights-interwiki' => 'ఇతర వికీలలో వాడుకరుల యొక్క హక్కులను మార్చే',
'action-siteadmin' => 'డాటాబేసుకి తాళం వేసే లేదా తీసే',
-'action-sendemail' => 'ఈ-మెయిల్స్ పంపించు',
+'action-sendemail' => 'ఈమెయిళ్ళు పంపించే',
'action-editmywatchlist' => 'మీ వీక్షణ జాబితాను సరిదిద్దండి',
'action-viewmywatchlist' => 'మీ వీక్షణ జాబితాను చూడండి',
'action-viewmyprivateinfo' => 'మీ గోపనీయ సమాచారాన్ని చూడండి',
# Recent changes
'nchanges' => '{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}',
-'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|చివరి దర్శనం నుండి}}',
+'enhancedrc-since-last-visit' => '{{PLURAL:$1|చివరి సందర్శన తరువాత}}, $1',
'enhancedrc-history' => 'చరితం',
'recentchanges' => 'ఇటీవలి మార్పులు',
'recentchanges-legend' => 'ఇటీవలి మార్పుల ఎంపికలు',
'recentchanges-label-plusminus' => 'ఈ పేజి పరిమాణంలో జరిగిన మార్పుల బైట్ల సంఖ్య',
'recentchanges-legend-heading' => "'''సూచిక :'''",
'recentchanges-legend-newpage' => '([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)',
-'rcnotefrom' => '<b>$2</b> నుండి జరిగిన మార్పులు (<b>$1</b> వరకు చూపబడ్డాయి).',
-'rclistfrom' => '$1 నుండి జరిగిన మార్పులను చూపించు',
+'rcnotefrom' => '<strong>$2</strong> నుండి జరిగిన మార్పులు (<strong>$1</strong> వరకు) కింద చూపబడ్డాయి.',
+'rclistfrom' => '$3, $2 నుండి జరిగిన మార్పులను చూపించు',
'rcshowhideminor' => 'చిన్న మార్పులను $1',
'rcshowhideminor-show' => 'చూపించు',
'rcshowhideminor-hide' => 'దాచు',
'recentchangeslinked' => 'సంబంధిత మార్పులు',
'recentchangeslinked-feed' => 'సంబంధిత మార్పులు',
'recentchangeslinked-toolbox' => 'సంబంధిత మార్పులు',
-'recentchangeslinked-title' => '$1 కు సంబంధించిన మార్పులు',
+'recentchangeslinked-title' => '"$1" కు సంబంధించిన మార్పులు',
'recentchangeslinked-summary' => 'ఏదైనా పేజీకి లింకై ఉన్న పేజీల్లో (లేదా ఏదైనా వర్గంలోని పేజీల్లో) జరిగిన ఇటీవలి మార్పుల జాబితా ఇది. [[Special:Watchlist|మీ వీక్షణ జాబితా]]లో ఉన్న పేజీలు <strong>బొద్దు</strong>గా ఉంటాయి.',
'recentchangeslinked-page' => 'పేజీ పేరు:',
-'recentchangeslinked-to' => 'ఇచ్చిన పేజీకి లింకయివున్న పేజీలలో జరిగిన మార్పులను చూపించు',
+'recentchangeslinked-to' => 'à°²à±\87à°¦à°\82à°\9fà±\87, à°\87à°\9aà±\8dà°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80à°\95à°¿ లిà°\82à°\95యివà±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80లలà±\8b à°\9cà°°à°¿à°\97à°¿à°¨ మారà±\8dà°ªà±\81లనà±\81 à°\9aà±\82పిà°\82à°\9aà±\81',
# Upload
'upload' => 'దస్త్రపు ఎక్కింపు',
'upload-tryagain' => 'మార్చిన ఫైలు వివరణని దాఖలుచేయండి',
'uploadnologin' => 'లాగిన్ అయిలేరు',
'uploadnologintext' => 'దస్త్రాలను ఎక్కించడానికి మీరు $1 ఉండాలి.',
-'upload_directory_missing' => 'à°\8eà°\97à±\81మతి à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80 ($1) తపà±\8dపిà°\82ది మరియà±\81 à°µà±\86à°¬à±\8d సరà±\8dవరà±\8d దానà±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95à±\81à°¨à±\8dà°¨ది.',
-'upload_directory_read_only' => 'à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡ు డైరెక్టరీ ($1), వెబ్సర్వరు రాసేందుకు అనుకూలంగా లేదు.',
+'upload_directory_missing' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81 à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80 ($1) à°\95నబడలà±\87à°¦à±\81. à°ªà±\88à°\97à°¾ à°µà±\86à°¬à±\8d సరà±\8dవరà±\8d దానà±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయిà°\82ది.',
+'upload_directory_read_only' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªు డైరెక్టరీ ($1), వెబ్సర్వరు రాసేందుకు అనుకూలంగా లేదు.',
'uploaderror' => 'ఎక్కింపు లోపం',
-'upload-recreate-warning' => "'''హెచ్చరిక: ఆ పేరుతో ఉన్న దస్త్రాన్ని తరలించి లేదా తొలగించి ఉన్నారు.'''
+'upload-recreate-warning' => '<strong>హెచ్చరిక: ఆ పేరుతో ఉన్న దస్త్రాన్ని తరలించడం లేదా తొలగించడం జరిగింది.</strong>
-à°®à±\80 à°¸à±\8cà°\95à°°à±\8dà°¯à°\82 à°\95à±\8bà°¸à°\82 à°\88 à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 మరియà±\81 తరలిà°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fాని à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:",
+à°®à±\80 à°¸à±\8cà°\95à°°à±\8dà°¯à°\82 à°\95à±\8bà°¸à°\82 à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 మరియà±\81 తరలిà°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fాని à°\87à°\95à±\8dà°\95à°¡ à°\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82:',
'uploadtext' => "దస్త్రాలను ఎక్కించడానికి ఈ కింది ఫారాన్ని ఉపయోగించండి.
గతంలో ఎక్కించిన దస్త్రాలను చూడడానికి లేదా వెతకడానికి [[Special:FileList|ఎక్కించిన దస్త్రాల యొక్క జాబితా]]కు వెళ్ళండి, (పునః)ఎక్కింపులు [[Special:Log/upload|ఎక్కింపుల చిట్టా]] లోనూ తొలగింపులు [[Special:Log/delete|తొలగింపుల చిట్టా]] లోనూ కూడా నమోదవుతాయి.
'upload-prohibited' => 'నిషేధించిన ఫైలు రకాలు: $1.',
'uploadlog' => 'ఎక్కింపుల చిట్టా',
'uploadlogpage' => 'ఎక్కింపుల చిట్టా',
-'uploadlogpagetext' => 'ఇటీవల జరిగిన ఫైలు అప్లోడుల జాబితా ఇది.',
+'uploadlogpagetext' => 'ఇటీవల జరిగిన ఫైలు అప్లోడుల జాబితా ఇది.
+మరింత దృశ్యాత్మకంగా చూడటం కోసం [[Special:NewFiles|కొత్త ఫైళ్ళ కొలువు]]కు వెళ్ళండి.',
'filename' => 'ఫైలు పేరు',
'filedesc' => 'సారాంశం',
'fileuploadsummary' => 'సారాంశం:',
'filereuploadsummary' => 'ఫైలు మార్పులు:',
'filestatus' => 'కాపీహక్కు స్థితి:',
'filesource' => 'మూలం:',
-'uploadedfiles' => 'à°\8eà°\97à±\81మతయిన ఫైళ్ళు',
+'uploadedfiles' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aిన ఫైళ్ళు',
'ignorewarning' => 'హెచ్చరికను పట్టించుకోకుండా ఫైలును భద్రపరచు',
'ignorewarnings' => 'హెచ్చరికలను పట్టించుకోవద్దు',
-'minlength1' => 'పైలు పేర్లు కనీసం ఒక్క అక్షరమైనా ఉండాలి.',
+'minlength1' => 'పైలు పేర్ల నిడివి కనీసం ఒక్క అక్షరమైనా ఉండాలి.',
'illegalfilename' => '"$1" అనే దస్త్రపుపేరు పేజీ శీర్షికలలో వాడకూడని అక్షరాలను కలిగివుంది.
దస్త్రపు పేరుని మార్చి మళ్ళీ ఎక్కించడానికి ప్రయత్నించండి.',
'filename-toolong' => 'దస్త్రపు పేరు 240 బైట్ల కంటే పొడవు ఉండకూడదు.',
'badfilename' => 'ఫైలు పేరు "$1"కి మార్చబడినది.',
-'filetype-mime-mismatch' => 'దసà±\8dà°¤à±\8dà°°à°ªà±\81 à°ªà±\8aà°¡à°\97à°¿à°\82à°ªà±\81 ".$1" ఆ దస్త్రం యొక్క MIME రకం ($2) తో సరిపోలలేదు.',
+'filetype-mime-mismatch' => 'దసà±\8dà°¤à±\8dà°°à°ªà±\81 à°\8eà°\95à±\8dà°¸à±\8dà°\9fà±\86à°¨à±\8dà°·à°¨à±\81 ".$1", ఆ దస్త్రం యొక్క MIME రకం ($2) తో సరిపోలలేదు.',
'filetype-badmime' => '"$1" MIME రకం ఉన్న ఫైళ్ళను ఎగుమతికి అనుమతించం.',
-'filetype-bad-ie-mime' => 'ఈ ఫైలుని ఎగుమతి చేయలేరు ఎందుకంటే ఇంటర్నెట్ ఎక్స్ప్లోరర్ దీన్ని "$1" గా చూపిస్తుంది, ఇది అనుమతి లేని మరియు ప్రమాదకారమైన ఫైలు రకం.',
-'filetype-unwanted-type' => "'''\".\$1\"''' అనేది అవాంఛిత ఫైలు రకం.
-\$2 {{PLURAL:\$3|అనేది వాడదగ్గ ఫైలు రకం|అనేవి వాడదగ్గ ఫైలు రకాలు}}.",
+'filetype-bad-ie-mime' => 'ఈ ఫైలుని ఎగుమతి చేయలేరు. ఎందుకంటే ఇంటర్నెట్ ఎక్స్ప్లోరర్ దీన్ని "$1" గా చూపిస్తుంది. ఇది అనుమతి లేని మరియు ప్రమాదకరమైన ఫైలు రకం.',
+'filetype-unwanted-type' => '<strong>".$1"</strong> అనేది అవాంఛిత ఫైలు రకం.
+$2 {{PLURAL:$3|అనేది వాడదగ్గ ఫైలు రకం|అనేవి వాడదగ్గ ఫైలు రకాలు}}.',
'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|అనేది అనుమతించబడిన ఫైలు రకం కాదు|అనేవి అనుమతించబడిన ఫైలు రకాలు కాదు}}.
అనుమతించబడిన {{PLURAL:$3|ఫైలు రకం|ఫైలు రకాలు}} $2.',
-'filetype-missing' => 'à°«à±\88à°²à±\81à°\95à°¿ à°ªà±\8aà°¡à°\97à°¿à°\82à°ªు (".jpg" లాంటిది) లేదు.',
+'filetype-missing' => 'à°«à±\88à°²à±\81à°\95à°¿ à°\8eà°\95à±\8dà°¸à±\8dà°\9fà±\86à°¨à±\8dà°·à°¨ు (".jpg" లాంటిది) లేదు.',
'empty-file' => 'మీరు సమర్పించిన దస్త్రం ఖాళీగా ఉంది.',
'file-too-large' => 'మీరు సమర్పించిన దస్త్రం చాలా పెద్దగా ఉంది.',
'filename-tooshort' => 'దస్త్రపు పేరు మరీ చిన్నగా ఉంది.',
'verification-error' => 'దస్త్రపు తనిఖీలో ఈ దస్త్రం ఉత్తీర్ణమవలేదు.',
'hookaborted' => 'మీరు చేయప్రత్నించిన మార్పుని ఒక పొడగింత కొక్కెం విచ్ఛిన్నం చేసింది.',
'illegal-filename' => 'ఆ దస్త్రపుపేరు అనుమతించబడదు.',
-'overwrite' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\89à°¨à±\8dà°¨ దసà±\8dà°¤à±\8dరానà±\8dని తిరిà°\97రాయడà°\82 à°\85à°¨à±\81మతిà°\82à°\9aబడదు.',
-'unknown-error' => 'à°\8fà°¦à±\8b à°¤à±\86లియని à°ªà±\8aరపాà°\9fà±\81 à°\9cà°°à°¿à°\97ింది.',
+'overwrite' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\89à°¨à±\8dà°¨ దసà±\8dà°¤à±\8dరానà±\8dని తిరà°\97రాయడానిà°\95à°¿ à°\85à°¨à±\81మతి à°²à±\87దు.',
+'unknown-error' => 'à°\8fà°¦à±\8b à°¤à±\86లియని à°²à±\8bà°ªà°\82 à°¦à±\8aà°°à±\8dà°²ింది.',
'tmp-create-error' => 'తాత్కాలిక దస్త్రాన్ని సృష్టించలేకపోయాం.',
'tmp-write-error' => 'తాత్కాలిక దస్త్రాన్ని రాయడంలో పొరపాటు.',
'large-file' => 'ఫైళ్ళు $1 కంటే పెద్దవిగా ఉండకుండా ఉంటే మంచిది; ఈ ఫైలు $2 ఉంది.',
'largefileserver' => 'ఈ ఫైలు సైజు సర్వరులో విధించిన పరిమితి కంటే ఎక్కువగా ఉంది.',
'emptyfile' => 'మీరు అప్లోడు చేసిన ఫైలు ఖాళీగా ఉన్నట్లుంది. ఫైలు పేరును ఇవ్వడంలో స్పెల్లింగు తప్పు దొర్లి ఉండొచ్చు. మీరు అప్లోడు చెయ్యదలచింది ఇదో కాదో నిర్ధారించుకోండి.',
-'windows-nonascii-filename' => 'దస్త్రాల పేర్లలో ప్రత్యేక అక్షరాలకు ఈ వికీలో తోడ్పాటు లేదు.',
-'fileexists' => 'ఈ పేరుతో ఒక ఫైలు ఇప్పటికే ఉంది.
-దీనిని మీరు మార్చాలో లేదో తెలియకపోతె ఫైలు <strong>[[:$1]]</strong>ని చూడండి.
+'windows-nonascii-filename' => 'దస్త్రాల పేర్లలో ప్రత్యేక అక్షరాలకు ఈ వికీలో అనుకూలత లేదు.',
+'fileexists' => 'ఈ పేరుతో ఒక ఫైలు ఇప్పటికే ఉంది. దీనిని మార్చాలో లేదో తెలియకపోతే ఫైలు <strong>[[:$1]]</strong>ను చూడండి.
[[$1|thumb]]',
-'filepageexists' => 'ఈ ఫైలు కొరకు వివరణ పేజీని <strong>[[:$1]]</strong> వద్ద ఈసరికే సృష్టించారు, కానీ ఆ పేరుతో ప్రస్తుతం ఏ ఫైలూ లేదు. మీరు ఇస్తున్న సంగ్రహం ఆ వివరణ పేజీలో కనబడదు. మీ సంగ్రహం అక్కడ కనబడాలంటే, నేరుగా అక్కడే చేర్చాలి.
+'filepageexists' => 'ఈ ఫైలు కొరకు వివరణ పేజీని <strong>[[:$1]]</strong> వద్ద ఈసరికే సృష్టించారు, కానీ ఆ పేరుతో ప్రస్తుతం ఫైలేదీ లేదు.
+మీరు ఇస్తున్న సంగ్రహం ఆ వివరణ పేజీలో కనబడదు.
+మీ సంగ్రహం అక్కడ కనబడాలంటే, నేరుగా అక్కడే చేర్చాలి.
[[$1|thumb]]',
-'fileexists-extension' => 'ఇటువంటి పేరుతో మరో ఫైలు ఉంది: [[$2|thumb]]
-* à°\8eà°\97à±\81మతి à°\9aà±\87స్తున్న ఫైలు పేరు: <strong>[[:$1]]</strong>
+'fileexists-extension' => 'ఇటువంటి పేరుతోటే మరో ఫైలు ఉంది: [[$2|thumb]]
+* à°\8eà°\95à±\8dà°\95à°¿స్తున్న ఫైలు పేరు: <strong>[[:$1]]</strong>
* ప్రస్తుతం ఉన్న ఫైలు పేరు: <strong>[[:$2]]</strong>
-దయà°\9aà±\87సి మరà±\8b à°ªà±\87à°°à±\81 à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿.',
+మరో పేరు ఎంచుకోండి.',
'fileexists-thumbnail-yes' => "ఈ ఫైలు కుదించిన బొమ్మ లాగా ఉంది ''(థంబ్నెయిలు)''. [[$1|thumb]]
<strong>[[:$1]]</strong> ఫైలు చూడండి.
గుర్తు పెట్టబడిన ఫైలు అసలు సైజే అది అయితే, మరో థంబ్నెయిలును అప్లోడు చెయ్యాల్సిన అవసరం లేదు.",
మీరు ఇప్పటికీ ఈ ఫైలుని ఎగుమతి చేయాలనుకుంటే, వెనక్కి వెళ్ళి మరో పేరుతో ఎగుమతి చేయండి. [[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'ఈ పేరుతో ఇప్పటికే ఒక ఫైలు అందరి ఫైళ్ళ ఖజానాలో ఉంది.
ఇప్పటికీ మీ ఫైలుని ఎగుమతి చేయాలనుకుంటే, వెనక్కివెళ్ళి మరో పేరు వాడండి. [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'à°\88 à°«à±\88à°²à±\81 à°\95à±\8dà°°à°¿à°\82à°¦ à°ªà±\87à°°à±\8dà°\95à±\8aà°¨à±\8dà°¨ {{PLURAL:$1|à°«à±\88à°²à±\81à°\95à°¿|à°«à±\88à°³à±\8dà°³à°\95à°¿}} నకలు:',
-'file-deleted-duplicate' => 'à°\97à°¤à°\82à°²à±\8b à°\88 à°«à±\88à°²à±\81 లాà°\82à°\9fà°¿à°¦à±\87 à°\92à°\95 à°«à±\88à°²à±\81ని ([[:$1]]) à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°µà±\81à°¨à±\8dనారà±\81. à°®à±\80à°°à±\81 à°¦à±\80à°¨à±\8dని à°\8eà°\97à±\81మతి à°\9aà±\87à°¸à±\87à°®à±\81à°\82à°¦à±\81 à°\86 à°«à±\88à°²à±\81 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°°à°¿à°¤à±\8dరని à°\92à°\95à±\8dà°\95సారి చూడండి.',
+'file-exists-duplicate' => 'à°\88 à°«à±\88à°²à±\81 à°\95à±\8dà°°à°¿à°\82à°¦ à°ªà±\87à°°à±\8dà°\95à±\8aà°¨à±\8dà°¨ {{PLURAL:$1|à°«à±\88à°²à±\81à°\95à±\81|à°«à±\88à°³à±\8dà°³à°\95à±\81}} నకలు:',
+'file-deleted-duplicate' => 'à°\97à°¤à°\82à°²à±\8b à°\88 à°«à±\88à°²à±\81 లాà°\82à°\9fà°¿à°¦à±\87 à°\92à°\95 à°«à±\88à°²à±\81ని ([[:$1]]) à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°µà±\81à°¨à±\8dనారà±\81. à°®à±\80à°°à±\81 à°¦à±\80à°¨à±\8dని తిరిà°\97à°¿ à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà±\87 à°®à±\81à°\82à°¦à±\81 à°\86 à°«à±\88à°²à±\81 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 à°\9aà°°à°¿à°¤à±\8dà°°à°¨à±\81 చూడండి.',
'file-deleted-duplicate-notitle' => 'సరిగ్గా ఈ ఫైలునే పోలిన మరో ఫైలును గతంలో తొలగించాం. దాని పేరును అణచిపెట్టాం.
దాన్ని తిరిగి ఎక్కించే ముందు, పరిస్థితిని సమీక్షించేందుకు గాను, అణచబడిన ఫైళ్ళ డేటాను చూడగలిగే వారిని అడగండి.',
'uploadwarning' => 'ఎక్కింపు హెచ్చరిక',
-'uploadwarning-text' => 'à°«à±\88à°²à±\81 వివరణని à°\95à±\8dà°°à°¿à°\82à°¦ మారà±\8dà°\9aà°¿ మళ్ళీ ప్రయత్నించండి.',
+'uploadwarning-text' => 'à°\95à°¿à°\82à°¦ à°\88 à°«à±\88à°²à±\81 వివరణనà±\81 మారà±\8dà°\9aà°¿, మళ్ళీ ప్రయత్నించండి.',
'savefile' => 'దస్త్రాన్ని భద్రపరచు',
'uploadedimage' => '"[[$1]]"ని ఎక్కించారు',
'overwroteimage' => '"[[$1]]" యొక్క కొత్త కూర్పును ఎక్కించారు',
-'uploaddisabled' => 'à°\95à±\8dషమిà°\82à°\9aà°\82à°¡à°¿, à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\86à°¯à±\8dయడà°\82 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81తానిà°\95à°¿ à°\86పబడిà°\82ది',
+'uploaddisabled' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81à°²à±\81 à°\85à°\9aà±\87తనà°\82 à°\9aà±\86à°¯à±\8dయబడà±\8dడాయి.',
'copyuploaddisabled' => 'URL ద్వారా ఎక్కింపుని అశక్తం చేసారు.',
'uploadfromurl-queued' => 'మీ ఎక్కింపు వరుసలో ఉంది.',
-'uploaddisabledtext' => 'à°«à±\88à°³à±\8dà°³ à°\8eà°\97à±\81మతులను అచేతనం చేసారు.',
+'uploaddisabledtext' => 'à°«à±\88à°³à±\8dà°³ à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªులను అచేతనం చేసారు.',
'php-uploaddisabledtext' => 'PHPలో ఫైలు ఎక్కింపులు అచేతనమై ఉన్నాయి.
దయచేసి file_uploads అమరికని చూడండి.',
'uploadscripted' => 'ఈ ఫైల్లో HTML కోడు గానీ స్క్రిప్టు కోడు గానీ ఉంది. వెబ్ బ్రౌజరు దాన్ని పొరపాటుగా అనువదించే అవకాశం ఉంది.',
+'uploadscriptednamespace' => 'ఈ SVG ఫైలులోని పేరుబరి "$1" చెల్లనిది',
'uploadinvalidxml' => 'ఎక్కించిన ఫైలులోని XML ను పార్సు చెయ్యలేకపోయాం.',
'uploadvirus' => 'ఈ ఫైలులో వైరస్ ఉంది! వివరాలు: $1',
'uploadjava' => 'ఇదొక ZIP ఫైలు, ఇందులో ఒక Java .class ఫైలు ఉంది.
'upload-description' => 'దస్త్రపు వివరణ',
'upload-options' => 'ఎక్కింపు వికల్పాలు',
'watchthisupload' => 'ఈ ఫైలుని గమనించు',
-'filewasdeleted' => 'à°\87à°¦à±\87 à°ªà±\87à°°à±\81à°¤à±\8b à°\89à°¨à±\8dà°¨ à°\92à°\95 à°«à±\88à°²à±\81à°¨à±\81 à°\97à°¤à°\82à°²à±\8b à°\85à°ªà±\8dà°²à±\8bà°¡à±\81 à°\9aà±\87సారà±\81, తరà±\81వాతి à°\95ాలà°\82à°²à±\8b దానà±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81. దానà±\8dà°¨à±\80 మళà±\8dà°³à±\80 à°\85à°ªà±\8dà°²à±\8bà°¡à±\81 à°\9aà±\87à°¸à±\87 à°®à±\81à°\82à°¦à±\81, à°®à±\80à°°à±\81 $1 à°¨à±\81 à°\9aà±\82డాలి',
-'filename-bad-prefix' => "మీరు అప్లోడు చేస్తున్న ఫైలు పేరు '''\"\$1\"''' తో మొదలవుతుంది. ఇది డిజిటల్ కెమెరాలు ఆటోమాటిగ్గా ఇచ్చే పేరు. మరింత వివరంగా ఉండే పేరును ఎంచుకోండి.",
-'upload-success-subj' => 'à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9cయపà±\8dà°°à°¦à°\82',
+'filewasdeleted' => 'à°\87à°¦à±\87 à°ªà±\87à°°à±\81à°¤à±\8b à°\89à°¨à±\8dà°¨ à°\92à°\95 à°«à±\88à°²à±\81à°¨à±\81 à°\97à°¤à°\82à°²à±\8b à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aారà±\81. తరà±\81వాతి à°\95ాలà°\82à°²à±\8b దానà±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81. దానà±\8dà°¨à±\80 మళà±\8dà°³à±\80 à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà±\87 à°®à±\81à°\82à°¦à±\81, à°®à±\80à°°à±\81 $1 à°¨à±\81 à°\9aà±\82డాలి.',
+'filename-bad-prefix' => 'మీరు అప్లోడు చేస్తున్న ఫైలు పేరు <strong>"$1"</strong> తో మొదలవుతుంది. ఇది డిజిటల్ కెమెరాలు ఆటోమాటిగ్గా ఇచ్చే పేరు. మరింత వివరంగా ఉండే పేరును ఎంచుకోండి.',
+'upload-success-subj' => 'విà°\9cయవà°\82తమà±\88à°¨ à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªà±\81',
'upload-success-msg' => '[$2] నుండి మీ ఎక్కింపు సఫలమైంది. అది ఇక్కడ అందుబాటులో ఉంది: [[:{{ns:file}}:$1]]',
'upload-failure-subj' => 'ఎక్కింపు సమస్య',
'upload-failure-msg' => '[$2] నుండి మీ ఎక్కింపుతో ఏదో సమస్య ఉంది:
'upload-proto-error-text' => 'రిమోట్ అప్లోడులు చెయ్యాలంటే URLలు <code>http://</code> లేదా <code>ftp://</code> తో మొదలు కావాలి.',
'upload-file-error' => 'అంతర్గత లోపం',
'upload-file-error-text' => 'సర్వరులో తాత్కాలిక ఫైలును సృష్టించబోగా ఏదో అంతర్గత లోపం తలెత్తింది. ఎవరైనా [[Special:ListUsers/sysop|నిర్వాహకుడిని]] సంప్రదించండి.',
-'upload-misc-error' => 'à°¤à±\86లియని à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡ు లోపం',
-'upload-misc-error-text' => 'à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\81 à°\9aà±\87à°¸à±\8dà°¤à±\82à°\82à°¡à°\97à°¾ à°\8fà°¦à±\8b à°¤à±\86లియని à°²à±\8bà°ªà°\82 తలà±\86à°¤à±\8dతిà°\82ది. URL సరà±\88నదà±\87నని, à°\85ది à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8bà°¨à±\87 à°\89à°\82దని నిరà±\8dధారిà°\82à°\9aà±\81à°\95à±\81ని మళà±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°¦ండి. సమస్య అలాగే ఉంటే, సిస్టము నిర్వాహకుని సంప్రదించండి.',
+'upload-misc-error' => 'à°¤à±\86లియని à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªు లోపం',
+'upload-misc-error-text' => 'à°\8eà°\95à±\8dà°\95à°¿à°¸à±\8dà°¤à±\82à°\82à°¡à°\97à°¾ à°\8fà°¦à±\8b à°¤à±\86లియని à°²à±\8bà°ªà°\82 తలà±\86à°¤à±\8dతిà°\82ది. URL సరà±\88నదà±\87నని, à°\85ది à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8bà°¨à±\87 à°\89à°\82దని నిరà±\8dధారిà°\82à°\9aà±\81à°\95à±\81ని మళà±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aండి. సమస్య అలాగే ఉంటే, సిస్టము నిర్వాహకుని సంప్రదించండి.',
'upload-too-many-redirects' => 'ఆ URLలో చాలా దారిమార్పులు ఉన్నాయి',
'upload-unknown-size' => 'సైజు తెలియదు',
'upload-http-error' => 'ఒక HTTP పొరపాటు జరిగింది: $1',
'backend-fail-store' => '"$1" ఫైలును "$2" వద్ద భద్రపరచలేకపోయాం.',
'backend-fail-copy' => '"$1" నుండి "$2" కి ఫైలును కాపీ చెయ్యలేకపోయాం.',
'backend-fail-move' => '"$1" నుండి "$2" కి ఫైలును తరలించలేకపోయాం.',
-'backend-fail-opentemp' => 'తాతà±\8dà°\95ాలిà°\95 దసà±\8dà°¤à±\8dరానà±\8dని à°¤à±\86రవలà±\87à°\95à°ªà±\8bà°¤à±\81à°¨à±\8dà°¨ాం.',
+'backend-fail-opentemp' => 'తాతà±\8dà°\95ాలిà°\95 దసà±\8dà°¤à±\8dరానà±\8dని à°¤à±\86రవలà±\87à°\95à°ªà±\8bà°¯ాం.',
'backend-fail-writetemp' => 'తాత్కాలిక ఫైలులో రాయలేకపోయాం.',
'backend-fail-closetemp' => 'తాత్కాలిక దస్త్రాన్ని మూసివేయలేకపోయాం.',
-'backend-fail-read' => '$1 దస్త్రము చదువలేకపోతిమి.',
-'backend-fail-create' => '$1 ఫైలులో రాయలేకున్నాం.',
+'backend-fail-read' => 'దస్త్రము "$1" ని చదువలేకపోయాం.',
+'backend-fail-create' => 'ఫైలు "$1" లో రాయలేకపోయాం.',
'backend-fail-maxsize' => '"$1" ఫైలు {{PLURAL:$2|ఒక బైట్|$2 బైట్ల}} కంటే పెద్దది కావడం చేత దాన్ని రాయలేకపోయాం.',
'backend-fail-readonly' => 'స్టోరేజి బ్యాక్ఎండ్ "$1" ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది. దానికి కారణం: "<em>$2</em>"',
+'backend-fail-synced' => 'ఫైలు "$1" అంతర్గత స్టోరేజి బ్యాక్ఎండ్లలో అసమ స్థితిలో ఉంది',
'backend-fail-connect' => 'స్టోరేజీ బ్యాక్ఎండ్ "$1" కి కనెక్టు కాలేక పోయాం.',
'backend-fail-internal' => 'స్టోరేజీ బ్యాక్ఎండ్ "$1" లో ఏదో తెలియని లోపం దొర్లింది.',
'backend-fail-contenttype' => '"$1" లో దాచాల్సిన ఫైలు యొక్క కంటెంటు రకమేంటో నిర్ధారించలేకపోయాం.',
'backend-fail-batchsize' => 'స్టోరేజీ బ్యాక్ఎండ్ కు $1 ఫైలు {{PLURAL:$1|ఆపరేషన్|ఆపరేషన్ల}} తో కూడిన బ్యాచ్ ఒకటి ఇవ్వబడింది; పరిమితి: $2 {{PLURAL:$2|ఆపరేషన్|ఆపరేషన్లు}}.',
'backend-fail-usable' => 'సరిపడా అనుమతులు లేకపోవడం వలన గానీ, అవసరమైన డైరెక్టరీలు/కంటెయినర్లు లేకపోవడం వలనగానీ "$1" ఫైలును చదవడం, రాయడం చెయ్యలేకపోయాం.',
+# File journal errors
+'filejournal-fail-dbconnect' => 'స్టోరేజి బ్యాక్ఎండ్ "$1" కోసం జర్నల్ డేటాబేసుకు కనెక్టు కాలేకపోయాం..',
+'filejournal-fail-dbquery' => 'స్టోరేజి బ్యాక్ఎండ్ "$1" కోసం జర్నల్ డేటాబేసును తాజాకరించలేకపోయాం.',
+
# Lock manager
'lockmanager-notlocked' => '"$1" తాళం తియ్యలేకపోయాం; అదసలు లాక్ అయ్యేలేదు..',
'lockmanager-fail-closelock' => '"$1" యొక్క లాక్ ఫైలును మూయలేకపోయాం.',
'lockmanager-fail-acquirelock' => '"$1" కోసం లాక్ ను పొందలేకపోయాం.',
'lockmanager-fail-openlock' => '"$1" కోసం లాక్ ఫైలును తెరవలేకపోయాం.',
'lockmanager-fail-releaselock' => '"$1" యొక్క లాక్ ను విడుదల చెయ్యలేకపోయాం.',
+'lockmanager-fail-db-bucket' => 'బకెట్ $1 లోని లాక్ డేటాబేసులు సరిపోయినన్నిటిని కాంటాక్టు చెయ్యలేకపోయాం.',
'lockmanager-fail-db-release' => 'డేటాబేసు $1 పై లాకులను విడుదల చెయ్యలేకపోయాం.',
'lockmanager-fail-svr-acquire' => 'సర్వరు $1 పై లాకులను పొందలేకపోయాం.',
'lockmanager-fail-svr-release' => 'సర్వరు $1 పై లాకులను విడుదల చెయ్యలేకపోయాం.',
'uploadstash-badtoken' => 'ఆ చర్య విఫలమైంది. బహుశా మీ ఎడిటింగు అనుమతులకు కాలం చెల్లిందేమో. మళ్ళీ ప్రయత్నించండి.',
'uploadstash-errclear' => 'ఫైళ్ళ తీసివేత విఫలమైంది.',
'uploadstash-refresh' => 'దస్త్రాల జాబిజాను తాజాకరించు',
+'invalid-chunk-offset' => 'చెల్లని చంక్ ఆఫ్సెట్',
# img_auth script messages
'img-auth-accessdenied' => 'అనుమతిని నిరాకరించారు',
https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'img-auth-notindir' => 'అభ్యర్థించిన తోవ ఎక్కింపు సంచయంలో లేదు.',
'img-auth-badtitle' => '"$1" నుండి సరైన శీర్షికని నిర్మించలేకపోయాం.',
-'img-auth-nologinnWL' => 'à°®à±\80à°°à±\81 à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°¿ à°²à±\87à°°à±\81 మరియà±\81 "$1" అనేది తెల్లజాబితాలో లేదు.',
+'img-auth-nologinnWL' => 'à°®à±\80à°°à±\81 లాà°\97ినయి à°²à±\87à°°à±\81. à°ªà±\88à°\97à°¾ "$1" అనేది తెల్లజాబితాలో లేదు.',
'img-auth-nofile' => '"$1" అనే ఫైలు ఉనికిలో లేదు.',
'img-auth-isdir' => 'మీరు "$1" అనే సంచయాన్ని చూడడానికి ప్రయత్నిస్తున్నారు.
ఫైళ్ళను చూడడానికి మాత్రమే అనుమతివుంది.',
'img-auth-bad-query-string' => 'ఈ URL లో తప్పుడు క్వెరీ స్ట్రింగు ఉంది.',
# HTTP errors
-'http-invalid-url' => 'తపà±\8dà°ªà±\81à°¡à±\81 URL: $1',
+'http-invalid-url' => 'à°\9aà±\86à°²à±\8dలని URL: $1',
'http-invalid-scheme' => '"$1" ప్రణాళికలో ఉన్న URLలకు తోడ్పాటులేదు',
'http-request-error' => 'తెలియని లోపం వల్ల HTTP అభ్యర్థన విఫలమైంది.',
'http-read-error' => 'HTTP చదువుటలో పొరపాటు.',
'http-timed-out' => 'HTTP అభ్యర్థనకి కాలం చెల్లింది.',
-'http-curl-error' => 'URLని à°¤à±\87వడà°\82à°²à±\8b à°ªà±\8aరపాà°\9fà±\81: $1',
+'http-curl-error' => 'URLని à°¤à±\87వడà°\82à°²à±\8b à°²à±\8bà°ªà°\82: $1',
'http-bad-status' => 'HTTP అభ్యర్ధన చేస్తున్నప్పుడు సమస్య ఉంది: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URL కు వెళ్ళలేకపోయాం',
'upload-curl-error6-text' => 'ఇచ్చిన URL కు వెళ్ళలేకపోయాం. URL సరైనదేనని, సైటు పనిచేస్తూనే ఉన్నదనీ నిర్ధారించుకోండి.',
-'upload-curl-error28' => 'à°\85à°ªà±\8dà°²à±\8bà°¡ు కాలాతీతం',
+'upload-curl-error28' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªు కాలాతీతం',
'upload-curl-error28-text' => 'చాలా సమయం తరువాత కూడా సైటు స్పందించలేదు. సైటు పనిచేస్తూనే ఉందని నిర్ధారించుకుని, కాస్త ఆగి మళ్ళీ ప్రయత్నించండి. రద్దీ కాస్త తక్కువగా ఉన్నపుడు ప్రయత్నిస్తే నయం.',
'license' => 'లైసెన్సు వివరాలు:',
'filehist-missing' => 'ఫైలు కనిపించుటలేదు',
'imagelinks' => 'దస్త్రపు వాడుక',
'linkstoimage' => 'కింది {{PLURAL:$1|పేజీ|$1 పేజీల}} నుండి ఈ ఫైలుకి లింకులు ఉన్నాయి:',
-'linkstoimage-more' => '$1 కంటే ఎక్కువ {{PLURAL:$1|పేజీలు|పేజీలు}} ఈ ఫైలుకి లింకుని కలిగివున్నాయి.
-à°\88 à°«à±\88à°²à±\81à°\95à°¿ లిà°\82à°\95à±\81à°¨à±\8dà°¨ {{PLURAL:$1|à°®à±\8aà°¦à°\9fà°¿ à°\92à°\95 పేజీని|మొదటి $1 పేజీలను}} ఈ క్రింది జాబితా చూపిస్తుంది.
+'linkstoimage-more' => 'ఈ ఫైలుకు $1 కంటే ఎక్కువ {{PLURAL:$1|పేజీ లింకై ఉంది|పేజీలు లింకై ఉన్నాయి}}.
+à°\88 à°«à±\88à°²à±\81à°\95à°¿ మాతà±\8dà°°à°®à±\87 లిà°\82à°\95à±\88 à°\89à°¨à±\8dà°¨ {{PLURAL:$1|à°®à±\8aà°¦à°\9fà°¿ పేజీని|మొదటి $1 పేజీలను}} ఈ క్రింది జాబితా చూపిస్తుంది.
[[Special:WhatLinksHere/$2|పూర్తి జాబితా]] కూడా ఉంది.',
'nolinkstoimage' => 'ఈ ఫైలుకు లింకున్న పేజీలు లేవు.',
-'morelinkstoimage' => 'à°\88 à°«à±\88à°²à±\81à°\95à±\81 à°\87à°\82à°\95à°¾ [[Special:WhatLinksHere/$1| లిà°\82à°\95à±\81లనà±\81]] à°\9aà±\82à°¡ు',
+'morelinkstoimage' => 'à°\88 à°«à±\88à°²à±\81à°\95à±\81 à°\89à°¨à±\8dà°¨ మరినà±\8dని [[Special:WhatLinksHere/$1| లిà°\82à°\95à±\81లనà±\81]] à°\9aà±\82పిà°\82à°\9aు',
'linkstoimage-redirect' => '$1 (దస్త్రపు దారిమార్పు) $2',
'duplicatesoffile' => 'క్రింద పేర్కొన్న {{PLURAL:$1|ఫైలు ఈ ఫైలుకి నకలు|$1 ఫైళ్ళు ఈ ఫైలుకి నకళ్ళు}} ([[Special:FileDuplicateSearch/$2|మరిన్ని వివరాలు]]):',
-'sharedupload' => 'à°\88 à°«à±\88à°²à±\81 $1 à°¨à±\81à°\82à°¡à°¿ మరియà±\81 à°¦à±\80నిని à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82à°µà±\81ండవచ్చు.',
-'sharedupload-desc-there' => 'à°\88 à°«à±\88à°²à±\81 $1 à°¨à±\81à°\82à°¡à°¿ à°µà°\9aà±\8dà°\9aà°¿à°\82ది à°\85లానà±\87 à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82 ఉండవచ్చు.
+'sharedupload' => 'à°\88 à°«à±\88à°²à±\81 $1 à°²à±\8bనిది. à°¦à±\80నిని à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82 à°\89à°\82à°¡à°¿ à°\89ండవచ్చు.',
+'sharedupload-desc-there' => 'à°\88 à°«à±\88à°²à±\81 $1 à°²à±\8bనిది. à°\85లానà±\87 à°\87తర à°ªà±\8dà°°à°¾à°\9cà±\86à°\95à±\8dà°\9fà±\81లలà±\8b à°\95à±\82à°¡à°¾ à°\89పయà±\8bà°\97à°¿à°¸à±\8dà°¤à±\82 à°\89à°\82à°¡à°¿ ఉండవచ్చు.
మరింత సమాచారం కోసం, దయచేసి [$2 ఫైలు వివరణ పేజీ]ని చూడండి.',
'sharedupload-desc-here' => 'ఈ ఫైలు $1 లోనిది. దీనిని ఇతర ప్రాజెక్టులు కూడా ఉపయోగిస్తూ ఉండవచ్చు.
అక్కడ దీని [$2 ఫైలు వివరణ పేజీ] లో ఉన్న వివరణని కింద చూపించాం.',
దాని [$2 ఫైలు వివరణ పేజీ] లోని వివరణను మారుస్తారేమో చూడండి.',
'sharedupload-desc-create' => 'ఈ ఫైలు $1 లోనిది. దాన్ని ఇతర ప్రాజెక్టులు కూడా వాడుతూ ఉండి ఉండవచ్చు.
దాని [$2 ఫైలు వివరణ పేజీ] లోని వివరణను మారుస్తారేమో చూడండి.',
-'filepage-nofile' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°\8f à°«à±\88à°²à±\81 లేదు.',
-'filepage-nofile-link' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°\8f à°«à±\88à°²à±\82 à°²à±\87à°¦à±\81, à°\95ానà±\80 à°®à±\80à°°à±\81 $1 à°¨à±\81 à°\85à°ªà±\8dâ\80\8cà°²à±\8bà°¡à±\8d à°\9aà±\86à°¯à±\8dయవà°\9aà±\8dà°\9aà±\81.',
+'filepage-nofile' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°«à±\88à°²à±\87à°¦à±\80 లేదు.',
+'filepage-nofile-link' => 'à°\88 à°ªà±\87à°°à±\81à°¤à±\8b à°«à±\88à°²à±\87à°¦à±\80 à°²à±\87à°¦à±\81, à°®à±\80à°°à±\81 [$1 దానà±\8dని à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81].',
'uploadnewversion-linktext' => 'ఈ దస్త్రపు కొత్త కూర్పును ఎక్కించండి',
'shared-repo-from' => '$1 నుండి',
'shared-repo' => 'సామూహిక నిక్షేపం',
'filerevert-comment' => 'కారణం:',
'filerevert-defaultcomment' => '$2, $1 నాటి కూర్పుకు తీసుకువెళ్ళాం',
'filerevert-submit' => 'వెనక్కు తీసుకువెళ్ళు',
-'filerevert-success' => "'''[[Media:$1|$1]]''' ను [$3, $2 నాటి $4 కూర్పు]కు తీసుకువెళ్ళాం.",
+'filerevert-success' => '<strong>[[Media:$1|$1]]</strong> ను [$4 $2 $3 నాటి కూర్పు]కు తీసుకువెళ్ళాం.',
'filerevert-badversion' => 'మీరిచ్చిన టైముస్టాంపుతో ఈ ఫైలుకు స్థానిక కూర్పేమీ లేదు.',
# File deletion
'filedelete' => '$1ని తొలగించు',
'filedelete-legend' => 'ఫైలుని తొలగించు',
-'filedelete-intro' => "మీరు '''[[Media:$1|$1]]''' ఫైలుని దాని చరిత్రతో సహా తొలగించబోతున్నారు.",
-'filedelete-intro-old' => "మీరు '''[[Media:$1|$1]]''' యొక్క [$4 $3, $2] నాటి కూర్పును తొలగిస్తున్నారు.",
+'filedelete-intro' => 'మీరు <strong>[[Media:$1|$1]]</strong> ఫైలును దాని చరిత్రతో సహా తొలగించబోతున్నారు.',
+'filedelete-intro-old' => 'మీరు <strong>[[Media:$1|$1]]</strong> యొక్క [$4 $2, $3 నాటి కూర్పును] తొలగిస్తున్నారు.',
'filedelete-comment' => 'కారణం:',
'filedelete-submit' => 'తొలగించు',
'filedelete-success' => "'''$1'''ని తొలగించాం.",
** కాపీహక్కుల ఉల్లంఘన
** వేరొక దస్త్రానికి నకలు',
'filedelete-edit-reasonlist' => 'తొలగింపు కారణాలని మార్చండి',
-'filedelete-maintenance' => 'à°¸à°\82à°°à°\95à±\8dà°·à°£ నిమితà±\8dà°¤à°\82 à°«à±\88à°³à±\8dà°³ à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81 మరియà±\81 à°ªà±\81నసà±\8dథాపనలనà±\81 తాతà±\8dà°\95ాలిà°\95à°\82à°\97à°¾ à°\85à°\9aà±\87యతనà°\82 à°\9aà±\87సారà±\81.',
+'filedelete-maintenance' => 'నిరà±\8dవహణ à°¸à°\82దరà±\8dà°à°\82à°\97à°¾ à°«à±\88à°³à±\8dà°³ à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81, à°ªà±\81నసà±\8dథాపనలనà±\81 తాతà±\8dà°\95ాలిà°\95à°\82à°\97à°¾ à°\85à°\9aà±\87తనà°\82 à°\9aà±\87సాà°\82.',
'filedelete-maintenance-title' => 'దస్త్రాన్ని తొలగించలేకపోయాం',
# MIME search
'statistics-views-total' => 'మొత్తం వీక్షణలు',
'statistics-views-total-desc' => 'ఉనికిలో లేని పుటలకు మరియు ప్రత్యేక పుటలకు వచ్చిన సందర్శనలని కలుపలేదు',
'statistics-views-peredit' => 'ఒక మార్పుకి వీక్షణలు',
-'statistics-users' => 'నమà±\8bà°¦à±\88à°¨ [[Special:ListUsers|వాడà±\81à°\95à°°à±\8dలు]]',
-'statistics-users-active' => 'à°\95à±\8dరియాశà±\80à°² వాడà±\81à°\95à°°à±\8dలు',
-'statistics-users-active-desc' => 'à°\97à°¤ {{PLURAL:$1|à°°à±\8bà°\9cà±\81|$1 à°°à±\8bà°\9cà±\81à°²}}à°²à±\8b à°\92à°\95à±\8dà°\95 à°\9aà°°à±\8dà°¯à±\88నా చేసిన వాడుకరులు',
+'statistics-users' => 'నమà±\8bà°¦à±\88à°¨ [[Special:ListUsers|వాడà±\81à°\95à°°à±\81లు]]',
+'statistics-users-active' => 'à°\95à±\8dరియాశà±\80à°² వాడà±\81à°\95à°°à±\81లు',
+'statistics-users-active-desc' => 'à°\97à°¤ {{PLURAL:$1|à°°à±\8bà°\9cà±\81|$1 à°°à±\8bà°\9cà±\81à°²}}à°²à±\8b పని చేసిన వాడుకరులు',
'statistics-mostpopular' => 'ఎక్కువగా చూసిన పేజీలు',
'pageswithprop' => 'ఒక పేజీ లక్షణం కలిగిన పేజీలు',
'double-redirect-fixer' => 'దారిమార్పు సరిద్దువారు',
'brokenredirects' => 'తెగిపోయిన దారిమార్పులు',
-'brokenredirectstext' => 'à°\95à°¿à°\82ది దారిమారà±\8dà°ªà±\81à°²à±\81 à°²à±\87ని-à°ªà±\87à°\9cà±\80à°²à°\95à±\81 మళà±\8dళిà°\82à°\9aà±\81తున్నాయి:',
+'brokenredirectstext' => 'à°\95à°¿à°\82ది దారిమారà±\8dà°ªà±\81à°²à±\81 à°\89నిà°\95à°¿à°²à±\8bà°¨à±\87 à°²à±\87ని à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°µà±\86à°³à±\8dతున్నాయి:',
'brokenredirects-edit' => 'సవరించు',
'brokenredirects-delete' => 'తొలగించు',
'ncategories' => '$1 {{PLURAL:$1|వర్గం|వర్గాలు}}',
'ninterwikis' => '$1 {{PLURAL:$1|అంతర్వికీ|అంతర్వికీలు}}',
'nlinks' => '$1 {{PLURAL:$1|లింకు|లింకులు}}',
-'nmembers' => '{{PLURAL:$1|ఒక ఉపవర్గం/పేజీ/ఫైలు|$1 ఉపవర్గాలు/పేజీలు/ఫైళ్లు}}',
+'nmembers' => '$1 {{PLURAL:$1|సభ్యుడు|సభ్యులు}}',
'nmemberschanged' => '$1 → $2 {{PLURAL:$2|సభ్యుడు|సభ్యులు}}',
-'nrevisions' => '{{PLURAL:$1|à°\92à°\95 à°¸à°\82à°\9aà°¿à°\95|$1 à°¸à°\82à°\9aà°¿à°\95లు}}',
-'nviews' => '$1 {{PLURAL:$1|దరà±\8dశనమà±\81|దర్శనలు}}',
+'nrevisions' => '{{PLURAL:$1|à°\95à±\82à°°à±\8dà°ªà±\81|$1 à°\95à±\82à°°à±\8dà°ªà±\81లు}}',
+'nviews' => '$1 {{PLURAL:$1|à°¸à°\82దరà±\8dశన|à°¸à°\82దర్శనలు}}',
'nimagelinks' => '$1 {{PLURAL:$1|పుట|పుటల}}లో ఉపయోగించారు',
'ntransclusions' => '$1 {{PLURAL:$1|పుట|పుటల}}లో ఉపయోగించారు',
'specialpage-empty' => 'ఈ పేజీ ఖాళీగా ఉంది.',
'uncategorizedimages' => 'వర్గీకరించని బొమ్మలు',
'uncategorizedtemplates' => 'వర్గీకరించని మూసలు',
'unusedcategories' => 'ఉపయోగించని వర్గాలు',
-'unusedimages' => 'à°\89పయà±\8bà°\97à°¿à°\82à°\9aబడని à°«à±\88à°³à±\8dà°³à±\81',
+'unusedimages' => 'ఉపయోగించని ఫైళ్ళు',
'popularpages' => 'ప్రజాదరణ పొందిన పేజీలు',
'wantedcategories' => 'కోరిన వర్గాలు',
'wantedpages' => 'కోరిన పేజీలు',
'deadendpagestext' => 'కింది పేజీల నుండి ఈ వికీ లోని ఏ ఇతర పేజీకీ లింకులు లేవు.',
'protectedpages' => 'సంరక్షిత పేజీలు',
'protectedpages-indef' => 'అనంత సంరక్షణ మాత్రమే',
+'protectedpages-summary' => 'ప్రస్తుతం సంరక్షణలో ఉన్న పేజీల జాబితాను ఈ పేజీ చూపిస్తుంది. అసలు సృష్టించకుండా సంరక్షించబడిన పేజీశీర్షికల కోసం [[{{#special:ProtectedTitles}}]] చూడండి.',
'protectedpages-cascade' => 'కాస్కేడింగు రక్షణలు మాత్రమే',
'protectedpages-noredirect' => 'దారిమార్పులను దాచు',
'protectedpagesempty' => 'ఈ పరామితులతో ప్రస్తుతం ఏ పేజీలు కూడా సంరక్షించబడి లేవు.',
'allpagesfrom' => 'ఇక్కడ మొదలు పెట్టి పేజీలు చూపించు:',
'allpagesto' => 'ఇక్కడవరకు ఉన్న పేజీలు చూపించు:',
'allarticles' => 'అన్ని పేజీలు',
-'allinnamespace' => 'అన్ని పేజీలు ($1 namespace)',
+'allinnamespace' => 'అన్ని పేజీలు ($1 పేరుబరి)',
'allpagessubmit' => 'వెళ్లు',
'allpagesprefix' => 'ఈ ఆదిపదం కలిగిన పేజీలను చూపించు:',
'allpagesbadtitle' => 'మీరిచ్చిన పేజీ పేరు సరైనది కాకపోయి ఉండాలి లేదా దానికి భాషాంతర లేదా అంతర్వికీ ఆదిపదమైనా ఉండి ఉండాలి. పేర్లలో వాడకూడని కారెక్టర్లు ఆ పేరులో ఉండి ఉండవచ్చు.',
-'allpages-bad-ns' => '{{SITENAME}} à°²à±\8b "$1" à°\85à°¨à±\87 à°¨à±\87à°®à±\8d‌à°¸à±\8dà°ªà±\87à°¸à±\8d లేదు.',
+'allpages-bad-ns' => '{{SITENAME}} à°²à±\8b "$1" à°\85à°¨à±\87 à°ªà±\87à°°à±\81బరి లేదు.',
'allpages-hide-redirects' => 'దారిమార్పులను దాచు',
# SpecialCachedPage
# Special:DeletedContributions
'deletedcontributions' => 'తొలగించబడిన వాడుకరి రచనలు',
'deletedcontributions-title' => 'తొలగించబడిన వాడుకరి రచనలు',
-'sp-deletedcontributions-contribs' => 'మారà±\8dà°ªà±\81à°²à±\81 à°\9aà±\87à°°à±\8dà°ªà±\81à°²à±\81',
+'sp-deletedcontributions-contribs' => 'మార్పుచేర్పులు',
# Special:LinkSearch
'linksearch' => 'బయటి లింకుల అన్వేషణ',
'listgrouprights-removegroup' => '{{PLURAL:$2|గుంపుని|గుంపులను}} తొలగించగలరు: $1',
'listgrouprights-addgroup-all' => 'అన్ని గుంపులను చేర్చగలరు',
'listgrouprights-removegroup-all' => 'అన్ని గుంపులను తొలగించగలరు',
-'listgrouprights-addgroup-self' => '{{PLURAL:$2|సమà±\82హానà±\8dని|సమà±\82హాలని}} తన à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à°¿ చేర్చుకోగలగడం: $1',
+'listgrouprights-addgroup-self' => '{{PLURAL:$2|à°\97à±\81à°\82à°ªà±\81à°¨à±\81|à°\97à±\81à°\82à°ªà±\81లనà±\81}} తన à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à±\81 చేర్చుకోగలగడం: $1',
'listgrouprights-removegroup-self' => '{{PLURAL:$2|సమూహాన్ని|సమూహాలని}} తన స్వంత ఖాతా నుండి తొలగించుకోవడం: $1',
-'listgrouprights-addgroup-self-all' => 'à°\85à°¨à±\8dని సమà±\82హాలని à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à°¿ చేర్చుకోలగడటం',
+'listgrouprights-addgroup-self-all' => 'à°\85à°¨à±\8dని సమà±\82హాలని à°¸à±\8dà°µà°\82à°¤ à°\96ాతాà°\95à±\81 చేర్చుకోలగడటం',
'listgrouprights-removegroup-self-all' => 'స్వంత ఖాతా నుండి అన్ని సమూహాలనూ తొలగించుకోగలగడం',
# Email user
'mailnologintext' => 'ఇతరులకు ఈ-మెయిలు పంపించాలంటే, మీరు [[Special:UserLogin|లాగిన్]] అయి ఉండాలి, మరియు మీ [[Special:Preferences|అభిరుచుల]]లో సరైన ఈ-మెయిలు చిరునామా ఇచ్చి ఉండాలి.',
'emailuser' => 'ఈ వాడుకరికి ఈ-మెయిలుని పంపించండి',
'emailuser-title-target' => 'ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు పంపించండి',
-'emailuser-title-notarget' => 'à°\88-à°®à±\86యిలà±\81 వాడà±\81à°\95à°°ి',
+'emailuser-title-notarget' => 'వాడà±\81à°\95à°°à°¿à°\95à°¿ à°\88à°®à±\86యిలà±\81 à°ªà°\82పిà°\82à°\9aà°\82à°¡ి',
'emailpage' => 'వాడుకరికి ఈ-మెయిలుని పంపించు',
'emailpagetext' => 'ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు సందేశము పంపించుటకు క్రింది ఫారంను ఉపయోగించవచ్చు. [[Special:Preferences|మీ వాడుకరి అభిరుచుల]]లో మీరిచ్చిన ఈ-మెయిలు చిరునామా "నుండి" ఆ సందేశం వచ్చినట్లుగా ఉంటుంది, కనుక వేగుని అందుకునేవారు నేరుగా మీకు జవాబివ్వగలుగుతారు.',
'usermailererror' => 'మెయిలు ఆబ్జెక్టు ఈ లోపాన్ని చూపింది:',
'defemailsubject' => 'వాడుకరి "$1" నుండి {{SITENAME}} ఈ-మెయిలు',
-'usermaildisabled' => 'వాడుకరి ఈ-మెయిళ్ళు అచేతనం చేసారు',
+'usermaildisabled' => 'వాడుకరి ఈమెయిలు అచేతనం చెయ్యబడింది',
'usermaildisabledtext' => 'ఈ వికీలో మీరు ఇతర వాడుకరులకి ఈ-మెయిళ్ళని పంపించలేరు',
'noemailtitle' => 'ఈ-మెయిలు చిరునామా లేదు',
'noemailtext' => 'ఈ వాడుకరి సరైన ఈ-మెయిలు చిరునామాని ఇవ్వలేదు.',
-'nowikiemailtitle' => 'ఈ-మెయిళ్ళను అనుమతించరు',
+'nowikiemailtitle' => 'ఈమెయిలుకు అనుమతి లేదు',
'nowikiemailtext' => 'ఇతర వాడుకరుల నుండి ఈ-మెయిళ్ళను అందుకోడానికి ఈ వాడుకరి సుముఖంగా లేరు.',
'emailnotarget' => 'గ్రహీతగా ఇచ్చిన వాడుకరిపేరు తప్పైనా కావచ్చు, లేదా అసలే ఉండి ఉండకపోవచ్చు',
'emailtarget' => 'అందుకొనేవారి వాడుకరిపేరు ఇవ్వండి',
'emailusername' => 'వాడుకరి పేరు:',
-'emailusernamesubmit' => 'దాà°\96à°²à±\81à°\9aà±\86à°¯à±\8dయి',
+'emailusernamesubmit' => 'à°ªà°\82పిà°\82à°\9aà±\81',
'email-legend' => 'మరో {{SITENAME}} వాడుకరికి వేగు పంపించండి',
-'emailfrom' => 'à°\8eవరà±\81:',
+'emailfrom' => 'à°\8eవరి à°¨à±\81à°\82à°¡à°¿:',
'emailto' => 'ఎవరికి:',
'emailsubject' => 'విషయం:',
'emailmessage' => 'సందేశం:',
'prot_1movedto2' => '$1, $2కు తరలించబడింది',
'protect-badnamespace-title' => 'సంరక్షించజాలని పేరుబరి',
'protect-badnamespace-text' => 'ఈ పేరుబరిలో ఉన్న పేజీలను సంరక్షించలేరు.',
+'protect-norestrictiontypes-text' => 'నిరోధ రకాలేవీ అందుబాటులో లేనందువలన ఈ పేజీని సంరక్షించలేం.',
'protect-norestrictiontypes-title' => 'సంరక్షించజాలని పేజీ',
'protect-legend' => 'సంరక్షణను నిర్ధారించు',
'protectcomment' => 'కారణం:',
'invert' => 'ఎంపికను తిరగవెయ్యి',
'tooltip-invert' => 'ఎంచుకున్న పేరుబరి (చెక్ చేసి ఉంటే అనుబంధ పేరుబరి కూడా) లోని పేజీల్లో జరిగిన మార్పులను దాచేందుకు ఈ పెట్టెను చెక్ చెయ్యండి',
'namespace_association' => 'సంబంధిత పేరుబరి',
+'tooltip-namespace_association' => 'ఎంచుకున్న పేరుబరికి చెందిన చర్చ లేదా విషయం పేరుబరిని కూడా ఎంచుకునేందుకు ఈ పెట్టెను చెక్ చెయ్యండి.',
'blanknamespace' => '(మొదటి)',
# Contributions
'sp-contributions-blocked-notice-anon' => 'ఈ ఐపీ చిరునామాపై ప్రస్తుతం నిరోధం ఉంది.
నిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారంకోసం ఇస్తున్నాం:',
'sp-contributions-search' => 'రచనల కోసం అన్వేషణ',
+'sp-contributions-suppresslog' => 'అణచిపెట్టబడిన వాడుకరి రచనలు',
'sp-contributions-username' => 'ఐపీ చిరునామా లేదా వాడుకరిపేరు:',
'sp-contributions-toponly' => 'చిట్టచివరి కూర్పులను మాత్రమే చూపించు',
+'sp-contributions-newonly' => 'పేజీని సృష్టించిన మార్పులను మాత్రమే చూపించు',
'sp-contributions-submit' => 'వెతుకు',
# What links here
'whatlinkshere' => 'ఇక్కడికి లింకైనవి',
'whatlinkshere-title' => '"$1"కి లింకున్న పుటలు',
'whatlinkshere-page' => 'పేజీ:',
-'linkshere' => "కిందనున్న పేజీల నుండి '''[[:$1]]'''కు లింకులు ఉన్నాయి:",
+'linkshere' => 'కింది పేజీల నుండి <strong>[[:$1]]</strong>కు లింకులు ఉన్నాయి:',
'nolinkshere' => "'''[[:$1]]'''కు ఏ పేజీ నుండీ లింకు లేదు.",
'nolinkshere-ns' => "'''[[:$1]]''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
'isredirect' => 'దారిమార్పు పుట',
'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] నిరోధించబడింది.<br />
నిరోధాల సమీక్ష కొరకు [[Special:BlockList|నిరోధాల జాబితా]] చూడండి.',
'ipb-blockingself' => 'మిమ్మల్ని మీరే నిరోధించుకోబోతున్నారు! అదే మీ నిశ్చయమా?',
+'ipb-confirmhideuser' => '"వాడుకరిని దాచు" చేతనంగా ఉన్న వాడుకరిని మీరు నిరోధించబోతున్నారు. దీంతో ఈ వాడుకరి పేరు అన్ని జాబితాల్లోనూ, లాగ్ ఎంట్రీలలోనూ అణచి ఉంచబడుతుంది. ఈ పని చెయ్యాలనే మీరు నిశ్చయించుకున్నారా?',
'ipb-confirmaction' => 'మీరు నిజంగానే ఆ పని చెయ్యాలనుకుంటే, కింద ఉన్న "{{int:ipb-confirm}}" ఫీల్డును చెక్ చెయ్యండి.',
'ipb-edit-dropdown' => 'నిరోధపు కారణాలను మార్చండి',
'ipb-unblock-addr' => '$1 పై ఉన్న నిరోధాన్ని తొలగించండి',
'import-error-interwiki' => 'పేజీ "$1" యొక్క పేరు బయటి లింకుల (అంతరవికీ) కోసం అట్టేపెట్టబడింది కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
'import-error-special' => 'పేజీ "$1" ప్రత్యేక పేరుబరికి చెందినది. ఈ పేరుబరిలో పేజీలు సృష్టించే అనుమతి లేదు. అందుచేత దాన్ని దిగుమతి చెయ్యలేదు.',
'import-error-invalid' => 'పేజీ "$1" పేరు సరైనది కాదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.',
+'import-error-unserialize' => 'పేజీ "$1" యొక్క కూర్పు $2ను సీరియలించలేకపోయాం. ఈ కూర్పు వాడుతున్న కంటెంటు మోడల్ $3 అని తెలియవచ్చింది. ఈ మోడల్ $4 లాగా సీరియలించబడుతుంది.',
'import-options-wrong' => 'తప్పు {{PLURAL:$2|ఐచ్ఛికం|ఐచ్ఛికాలు}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'ఇచ్చిన మూలపు పేజీ సరైన శీర్షిక కాదు.',
'import-rootpage-nosubpage' => 'మూలపేజీ యొక్క పేరుబరి "$1" ఉపపేజీలను అనుమతించదు.',
'javascripttest-pagetext-noframework' => 'ఈ పేజీ JavaScript పరీక్షల కోసం ఉద్దేశించబడింది.',
'javascripttest-pagetext-unknownframework' => 'తెలియని పరీక్షా ఫ్రేమ్వర్కు "$1".',
'javascripttest-pagetext-frameworks' => 'కింది పరీక్షా ఫ్రేమ్వర్కులలో ఒకదాన్ని ఎంచుకోండి: $1',
+'javascripttest-pagetext-skins' => 'పరీక్షలు నడిపేందుకు ఓ రూపును ఎంచుకోండి:',
'javascripttest-qunit-intro' => 'mediawiki.org లోని [$1 పరీక్షా డాక్యుమెంటేషన్] చూడండి.',
# Tooltip help for the actions
'tooltip-ca-undelete' => 'ఈ పేజీని తొలగించడానికి ముందు చేసిన మార్పులను పునఃస్థాపించు',
'tooltip-ca-move' => 'ఈ పేజీని తరలించండి',
'tooltip-ca-watch' => 'ఈ పేజీని మీ వీక్షణ జాబితాకు చేర్చుకోండి',
-'tooltip-ca-unwatch' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80 విà°\95à±\8dషణా జాబితా నుండి తొలగించండి',
+'tooltip-ca-unwatch' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ జాబితా నుండి తొలగించండి',
'tooltip-search' => '{{SITENAME}} లో వెతకండి',
-'tooltip-search-go' => 'ఇదే పేరుతో పేజీ ఉంటే అక్కడికి తీసుకెళ్ళు',
+'tooltip-search-go' => 'à°\95à°\9aà±\8dà°\9aà°¿à°¤à°\82à°\97à°¾ à°\87à°¦à±\87 à°ªà±\87à°°à±\81à°¤à±\8b à°ªà±\87à°\9cà±\80 à°\89à°\82à°\9fà±\87 à°\85à°\95à±\8dà°\95à°¡à°¿à°\95à°¿ à°¤à±\80à°¸à±\81à°\95à±\86à°³à±\8dà°³à±\81',
'tooltip-search-fulltext' => 'పేజీలలో ఈ పాఠ్యం కొరకు వెతుకు',
'tooltip-p-logo' => 'మొదటి పేజీ చూడండి',
'tooltip-n-mainpage' => 'మొదటి పేజీ చూడండి',
'tooltip-t-contributions' => 'ఈ వాడుకరి యొక్క రచనల జాబితా చూడండి',
'tooltip-t-emailuser' => 'ఈ వాడుకరికి ఓ ఈమెయిలు పంపండి',
'tooltip-t-upload' => 'దస్త్రాలను ఎక్కించండి',
-'tooltip-t-specialpages' => 'à°\85à°¨à±\8dని à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°ªà±\81à°\9fà°² à°¯à±\8aà°\95à±\8dà°\95 à°\9cాబితా',
+'tooltip-t-specialpages' => 'అన్ని ప్రత్యేక పుటల జాబితా',
'tooltip-t-print' => 'ఈ పేజీ యొక్క ముద్రణా రూపు',
'tooltip-t-permalink' => 'పేజీ యొక్క ఈ కూర్పుకి శాశ్వత లంకె',
'tooltip-ca-nstab-main' => 'విషయపు పేజీని చూడండి',
'tooltip-minoredit' => 'దీన్ని చిన్న మార్పుగా గుర్తించు',
'tooltip-save' => 'మీ మార్పులను భద్రపరచండి',
'tooltip-preview' => 'మీ మార్పులను మునుజూడండి, భద్రపరిచేముందు ఇది వాడండి!',
-'tooltip-diff' => 'పాఠానిà°\95à°¿ à°®à±\80à°°à±\81 à°\9aà±\87సిన మారà±\8dà°ªà±\81లనà±\81 à°\9aà±\82à°ªà±\81à°\82à°\9aà±\81. [alt-v]',
-'tooltip-compareselectedversions' => 'ఈ పేజీలో ఎంచుకున్న రెండు కూర్పులకు మధ్య తేడాలను చూడండి. [alt-v]',
+'tooltip-diff' => 'పాఠానిà°\95à°¿ à°®à±\80à°°à±\81 à°\8f మారà±\8dà°ªà±\81à°²à±\81 à°\9aà±\87సారà±\8b à°\9aà±\82పిసà±\8dà°¤à±\81à°\82ది',
+'tooltip-compareselectedversions' => 'ఈ పేజీలో ఎంచుకున్న రెండు కూర్పులకు మధ్య తేడాలను చూడండి',
'tooltip-watch' => 'ఈ పేజీని మీ విక్షణా జాబితాకు చేర్చండి',
'tooltip-watchlistedit-normal-submit' => 'శీర్షికలను తీసివెయ్యి',
'tooltip-watchlistedit-raw-submit' => 'వీక్షణ జాబితాను తాజాకరించు',
'tooltip-recreate' => 'పేజీ తుడిచివేయబడ్డాకానీ మళ్ళీ సృష్టించు',
'tooltip-upload' => 'ఎగుమతి మొదలుపెట్టు',
'tooltip-rollback' => '"రద్దుచేయి" అనేది ఈ పేజీని చివరిగా మార్చినవారి మార్పులను ఒక్కనొక్కుతో రద్దుచేస్తుంది',
-'tooltip-undo' => '"దిదà±\8dà°¦à±\81బాà°\9fà±\81ని à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి" à°\88 మారà±\8dà°ªà±\81ని à°°à°¦à±\8dà°¦à±\81à°\9aà±\87à°¸à±\8dà°¤à±\81à°\82ది మరియà±\81 దిద్దుబాటు ఫారాన్ని మునుజూపులో తెరుస్తుంది.
-సారాంశానికి కారణాన్ని చేర్చే వీలుకల్పిస్తుంది',
+'tooltip-undo' => '"à°°à°¦à±\8dà°¦à±\81à°\9aà±\87యి" à°\88 మారà±\8dà°ªà±\81ని à°°à°¦à±\8dà°¦à±\81à°\9aà±\87సి, దిద్దుబాటు ఫారాన్ని మునుజూపులో తెరుస్తుంది.
+సారాంశానికి కారణాన్ని చేర్చే వీలుకల్పిస్తుంది.',
'tooltip-preferences-save' => 'అభిరుచులను భద్రపరచు',
'tooltip-summary' => 'చిన్న సారాంశాన్ని ఇవ్వండి',
# Metadata
'metadata' => 'మెటాడేటా',
-'metadata-help' => 'à°\88 à°«à±\88à°²à±\81à°²à±\8b à°\85దనపà±\81 సమాà°\9aారà°\82 à°\89à°\82ది, బహà±\81శా à°¦à±\80à°¨à±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aడానిà°\95à°¿ à°²à±\87దా సాà°\82à°\96à±\8dà°¯à±\80à°\95à°°à°¿à°\82à°\9aడానిà°\95à°¿ వాడిన à°¡à°¿à°\9cà°¿à°\9fà°²à±\8d à°\95à±\87à°®à±\86à°°à°¾ à°²à±\87దా à°¸à±\8dà°\95ానరà±\8d à°\86 సమాà°\9aారానà±\8dని à°\9aà±\87à°°à±\8dà°\9aà°¿à°µà±\81à°\82à°µà°\9aà±\8dà°\9aà±\81. à°\88 à°«à±\88à°²à±\81ని à°\85సలà±\81 à°¸à±\8dథితి à°¨à±\81à°\82à°¡à°¿ మారిసà±\8dà°¤à±\87, à°\95à±\8aà°¨à±\8dని వివరాలà±\81 à°\86 మారిన à°«à±\88à°²à±\81à°²à±\8b పూర్తిగా ప్రతిఫలించకపోవచ్చు.',
+'metadata-help' => 'à°\88 à°«à±\88à°²à±\81à°²à±\8b à°\85దనపà±\81 సమాà°\9aారà°\82 à°\89à°\82ది, బహà±\81శా à°¦à±\80à°¨à±\8dని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aడానిà°\95à°¿ à°²à±\87దా సాà°\82à°\96à±\8dà°¯à±\80à°\95à°°à°¿à°\82à°\9aడానిà°\95à°¿ వాడిన à°¡à°¿à°\9cà°¿à°\9fà°²à±\8d à°\95à±\87à°®à±\86à°°à°¾ à°²à±\87దా à°¸à±\8dà°\95ానరà±\8d à°\86 సమాà°\9aారానà±\8dని à°\9aà±\87à°°à±\8dà°\9aà°¿à°µà±\81à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81. à°\88 à°«à±\88à°²à±\81à°¨à±\81 à°\85సలà±\81 à°¸à±\8dథితి à°¨à±\81à°\82à°¡à°¿ మారిసà±\8dà°¤à±\87, à°\86 మారిన à°«à±\88à°²à±\81à°²à±\8b à°\95à±\8aà°¨à±\8dని వివరాలà±\81 పూర్తిగా ప్రతిఫలించకపోవచ్చు.',
'metadata-expand' => 'విస్తరిత వివరాలను చూపించు',
'metadata-collapse' => 'విస్తరిత వివరాలను దాచు',
'metadata-fields' => 'కింది జాబితాలో ఉన్న మెటాడేటా ఫీల్డులు, బొమ్మ పేజీలో మేటాడేటా టేబులు మూసుకొన్నపుడు కనబడతాయి. మిగతావి దాచేసి ఉంటాయి.
'exif-serialnumber' => 'కెమేరా యొక్క సీరియల్ నంబర్',
'exif-cameraownername' => 'కేమెరా యజమాని',
'exif-label' => 'సూచిక (లేబెల్)',
+'exif-nickname' => 'బొమ్మ పేరు',
'exif-rating' => 'రేటింగు (5 కి గాను)',
'exif-rightscertificate' => 'హక్కుల నిర్వాహణ ధృవీకరణ పత్రం',
'exif-copyrighted' => 'కాపీహక్కుల స్థితి',
'exif-copyrightowner' => 'కాపీ హక్కుదారు',
'exif-usageterms' => 'వాడుక నియమాలు',
+'exif-webstatement' => 'ఆన్లైన్ కాపీరైటు పాఠ్యం',
+'exif-originaldocumentid' => 'మూల దస్త్రం యొక్క విశిష్ఠ ఐడీ',
+'exif-licenseurl' => 'కాపీరైటు లైసెన్సు URL',
'exif-morepermissionsurl' => 'ప్రత్యామ్నాయ లైసెన్సు సమాచారం',
+'exif-attributionurl' => 'దీనిని తిరిగి వాడుకోవాలంటే, ఇక్కడికి లంకె వేయండి',
+'exif-preferredattributionname' => 'దీనిని తిరిగి వాడుకోవాలంటే, వీరిని పేర్కొనండి',
'exif-pngfilecomment' => 'PNG ఫైలు వ్యాఖ్య',
'exif-disclaimer' => 'నిష్పూచీ',
'exif-contentwarning' => 'విషయపు హెచ్చరిక',
'revdelete-nooldid-text' => 'Шумо ин ё он нусхаи(ҳои) мақсадро барои иҷрои ин амал мушаххас накардаед, нусхаи мушаххасшуда вуҷуд надорад, ё шумо дар ҳоли кӯшиши пинҳон кардани нусхаи кунуниаш ҳастед.',
'revdelete-selected' => "'''{{PLURAL:$2|Нусхаи интихобшуда|Нусхаҳои интихобшуда}} аз [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Гузориши маврид интихобшуда|Гузориши мавориди интихобшуда}}:'''",
-'revdelete-text' => "'''Нусхаҳои ва мавориди ҳазфшуда камокам дар таърих ва гузоришҳои саҳифа қобили мушоҳида ҳастанд, аммо бахшҳои аз мӯҳтавои он ба умум қобили мушоҳида нахоҳанд буд.'''
-
-Дигар мудирон дар {{SITENAME}} ҳанӯз метавонанд ба ин мӯҳтавои пинҳонро дастрасӣ кунанд ва ҳатто мавориди ҳазфшударо эҳё кунанд, магар он ки маҳдудиятҳои дигаре амалӣ гардад.",
'revdelete-legend' => 'Танзими маҳдудиятҳои падидорӣ',
'revdelete-hide-text' => 'Пинҳон кардани нусхаи матн',
'revdelete-hide-image' => 'Пинҳон кардани мӯҳтавиёти парванда',
'tog-ccmeonemails' => 'ส่งสำเนาอีเมลที่ฉันส่งหาผู้อื่นให้ฉัน',
'tog-diffonly' => 'ไม่แสดงเนื้อหาใต้ส่วนต่างการแก้ไข',
'tog-showhiddencats' => 'แสดงหมวดหมู่ที่ซ่อนอยู่',
-'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
'tog-norollbackdiff' => 'ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน',
'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
'tog-prefershttps' => 'ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อล็อกอิน',
'suspicious-userlogout' => 'คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย',
'createacct-another-realname-tip' => 'ไม่จำเป็นต้องใส่ชื่อจริง
หากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน',
+'pt-login' => 'ล็อกอิน',
+'pt-createaccount' => 'สร้างบัญชี',
'pt-userlogout' => 'ล็อกเอาต์',
# Email sending
# Change password dialog
'changepassword' => 'เปลี่ยนรหัสผ่าน',
-'resetpass_announce' => 'à¸\84ุà¸\93à¹\83à¸\8aà¹\89รหัสà¸à¸µà¹\80มลà¸\8aัà¹\88วà¸\84ราวลà¹\87à¸à¸\81à¸à¸´à¸\99 à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87à¸\81ำหà¸\99à¸\94รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\95รà¸\87à¸\99ีà¹\89 à¸\88ึà¸\87à¸\88ะà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\82ัà¹\89à¸\99à¸\95à¸à¸\99à¸\81ารลà¹\87à¸à¸\81à¸à¸´à¸\99:',
+'resetpass_announce' => 'à¸\84ุà¸\93à¸\95à¹\89à¸à¸\87à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\88ึà¸\87à¸\88ะà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\81ารลà¹\87à¸à¸\81à¸à¸´à¸\99',
'resetpass_text' => '<!-- เพิ่มข้อความที่นี่ -->',
'resetpass_header' => 'เปลี่ยนรหัสผ่าน',
'oldpassword' => 'รหัสผ่านเดิม:',
'resetpass-submit-cancel' => 'ยกเลิก',
'resetpass-wrong-oldpass' => 'รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง
คุณอาจเปลี่ยนรหัสผ่านของคุณไปแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว',
+'resetpass-recycled' => 'โปรดตั้งรหัสผ่านใหม่ให้ต่างจากรหัสผ่านปัจจุบัน',
+'resetpass-temp-emailed' => 'คุณล็อกอินด้วยรหัสผ่านชั่วคราวที่ส่งทางอีเมล
+คุณต้องตั้งรหัสผ่านใหม่ที่นี่จึงจะเสร็จสิ้นการล็อกอิน:',
'resetpass-temp-password' => 'รหัสผ่านชั่วคราว:',
'resetpass-abort-generic' => 'การเปลี่ยนรหัสผ่านถูกส่วนขยายยกเลิก',
+'resetpass-expired' => 'รหัสผ่านของคุณหมดอายุแล้ว โปรดตั้งรหัสผ่านใหม่เพื่อล็อกอิน',
+'resetpass-expired-soft' => 'รหัสผ่านของคุณหมดอายุแล้วและจำเป็นต้องตั้งใหม่ โปรดเลือกรหัสผ่านใหม่ขณะนี้ หรือคลิก "{{int:resetpass-submit-cancel}}" เพื่อตั้งใหม่ทีหลัง',
# Special:PasswordReset
'passwordreset' => 'ตั้งรหัสผ่านใหม่',
'revdelete-show-file-submit' => 'ใช่',
'revdelete-selected' => "'''{{PLURAL:$2|รุ่นการปรับปรุงที่ถูกเลือก|รุ่นการปรับปรุงที่ถูกเลือก}}ของ [[:$1]] :'''",
'logdelete-selected' => "'''{{PLURAL:$1|เหตุการณ์ปูมที่เลือก|เหตุการณ์ปูมที่เลือก}} :'''",
-'revdelete-text' => "'''รุ่นการปรับปรุงและเหตุการณ์ที่ถูกลบยังปรากฏในประวัติและปูมของหน้า แต่สาธารณะไม่สามารถเข้าถึงเนื้อหาบางส่วนได้'''
-ผู้ดูแลระบบคนอื่นบน {{SITENAME}} ยังสามารถเข้าถึงเนื้อหาที่ถูกซ่อน และสามารถกู้คืนอีกครั้งในลักษณะเดิมเช่นนี้ เว้นแต่จะมีการกำหนดการจำกัดเพิ่มเติม",
'revdelete-confirm' => 'กรุณายืนยันว่าคุณมีเจตนาลบจริง และเข้าใจผลลัพธ์ และกระทำภายใต้[[{{MediaWiki:Policy-url}}|นโยบาย]]',
'revdelete-suppress-text' => "การระงับควรใช้'''เฉพาะ'''กรณีต่อไปนี้:
* ข้อมูลที่อาจหมิ่นประมาท
'search-result-score' => 'ความเกี่ยวข้อง : $1%',
'search-redirect' => '(เปลี่ยนทาง $1)',
'search-section' => '(ส่วน $1)',
+'search-file-match' => '(จับคู่เนื้อหาไฟล์)',
'search-suggest' => 'คุณอาจหมายถึง: $1',
'search-interwiki-caption' => 'โครงการพี่น้อง',
'search-interwiki-default' => '$1 ผลลัพธ์:',
'recentchanges-label-plusminus' => 'ขนาดของหน้าเปลี่ยนไปด้วยจำนวนไบต์เท่านี้',
'recentchanges-legend-heading' => "'''คำอธิบายสัญลักษณ์:'''",
'recentchanges-legend-newpage' => '(ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])',
-'rcnotefrom' => "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ '''$2''' (มากสุด '''$1''' รายการ)",
+'rcnotefrom' => 'ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$2</strong> (มากสุด <strong>$1</strong> รายการ)',
'rclistfrom' => 'แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $1',
'rcshowhideminor' => '$1การแก้ไขเล็กน้อย',
'rcshowhideminor-show' => 'แสดง',
'rcshowhidebots-show' => 'แสดง',
'rcshowhidebots-hide' => 'ซ่อน',
'rcshowhideliu' => '$1ผู้ใช้ลงทะเบียน',
+'rcshowhideliu-show' => 'แสดง',
+'rcshowhideliu-hide' => 'ซ่อน',
'rcshowhideanons' => '$1ผู้ใช้นิรนาม',
'rcshowhideanons-show' => 'แสดง',
'rcshowhideanons-hide' => 'ซ่อน',
'file-exists-duplicate' => 'ไฟล์นี้ซ้ำกับ{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้:',
'file-deleted-duplicate' => 'ไฟล์ที่เหมือนไฟล์นี้ ([[:$1]]) เคยถูกลบไปก่อนหน้านี้แล้ว
คุณควรตรวจสอบว่าประวัติการลบของไฟล์ก่อนดำเนินการอัปโหลดใหม่',
+'file-deleted-duplicate-notitle' => 'ไฟล์ที่เหมือนกับไฟล์นี้เคยถูกลบมาก่อน และชื่อดังกล่าวถูกห้ามใช้ คุณควรสอบถามผู้ที่สามารถดูข้อมูลไฟล์ที่ถูกระงับเพื่อทบทวนสถานการณ์ก่อนดำเนินการอัปโหลดไฟล์อีกครั้ง',
'uploadwarning' => 'คำเตือนการอัปโหลด',
'uploadwarning-text' => 'กรุณาแก้ไขคำอธิบายไฟล์ด้านล่างนี้ แล้วลองใหม่อีกครั้ง',
'savefile' => 'บันทึกไฟล์',
'ninterwikis' => '$1 ลิงก์ข้ามโครงการ',
'nlinks' => '$1 ลิงก์',
'nmembers' => '$1 หน้า',
+'nmemberschanged' => '$1 → $2 สมาชิก',
'nrevisions' => '$1 รุ่น',
'nviews' => '$1 ครั้ง',
'nimagelinks' => 'ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}',
'deadendpagestext' => 'หน้าต่อไปนี้ไม่เชื่อมโยงไปหน้าอื่นใน {{SITENAME}}',
'protectedpages' => 'หน้าที่ถูกล็อก',
'protectedpages-indef' => 'การล็อกแบบไม่มีกำหนดเท่านั้น',
+'protectedpages-summary' => 'หน้านี้แสดงรายการหน้าที่มีอยู่ซึ่งปัจจุบันถูกล็อก สำหรับรายการชื่อเรื่องที่ถูกป้องกันมิให้สร้าง ดู [[{{#special:ProtectedTitles}}]]',
'protectedpages-cascade' => 'การล็อกแบบสืบทอดเท่านั้น',
'protectedpages-noredirect' => 'ซ่อนการเปลี่ยนทาง',
'protectedpagesempty' => 'ขณะนี้ไม่มีหน้าใดถูกล็อกตามพารามิเตอร์เหล่านี้',
+'protectedpages-timestamp' => 'ตราเวลา',
+'protectedpages-page' => 'หน้า',
+'protectedpages-expiry' => 'หมดอายุ',
+'protectedpages-performer' => 'ผู้ใช้ที่ล็อก',
+'protectedpages-params' => 'พารามิเตอร์การล็อก',
+'protectedpages-reason' => 'เหตุผล',
+'protectedpages-unknown-timestamp' => 'ไม่ทราบ',
+'protectedpages-unknown-performer' => 'ไม่ทราบผู้ใช้',
'protectedtitles' => 'ชื่อเรื่องที่ถูกป้องกัน',
+'protectedtitles-summary' => 'หน้านี้แสดงรายการชื่อที่ปัจจุบันถูกป้องกันมิให้สร้าง สำหรับรายการหน้าที่มีอยู่ที่ถูกล็อก ดู [[{{#special:ProtectedPages}}]]',
'protectedtitlesempty' => 'ปัจจุบันไม่มีหัวเรื่องที่ได้รับการป้องกันด้วยพารามิเตอร์เหล่านี้',
'listusers' => 'รายนามผู้ใช้',
'listusers-editsonly' => 'แสดงเฉพาะผู้ใช้ที่มีการแก้ไข',
'listusers-creationsort' => 'เรียงลำดับตามวันสร้าง',
+'listusers-desc' => 'เรียงตามลำดับลด',
'usereditcount' => 'การแก้ไข $1 ครั้ง',
'usercreated' => '{{GENDER:$3|ถูกสร้าง}}เมื่อ $1 เวลา $2',
'newpages' => 'หน้าใหม่',
'delete-edit-reasonlist' => 'แก้ไขเหตุผลการลบ',
'delete-toobig' => 'หน้านี้มีประวัติการแก้ไขนาดใหญ่ คือ กว่า $1 รุ่น การลบหน้าเช่นนี้ถูกจำกัดเพื่อป้องกันการรบกวน{{SITENAME}}โดยบังเอิญ',
'delete-warning-toobig' => 'หน้านี้มีประวัติการแก้ไขขนาดใหญ่ กว่า $1 รุ่น การลบหน้านี้อาจรบกวนการทำงานของฐานข้อมูลของ {{SITENAME}} โปรดดำเนินการด้วยความระมัดระวัง',
-'deleting-backlinks-warning' => "'''คำเตือน:''' หน้าอื่นเชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังลบ",
+'deleting-backlinks-warning' => "'''คำเตือน:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|หน้าอื่น]]เชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังจะลบ",
# Rollback
'rollback' => 'ย้อนการแก้ไขกลับฉุกเฉิน',
'sp-contributions-search' => 'ค้นหาการแก้ไข',
'sp-contributions-username' => 'เลขที่อยู่ไอพีหรือชื่อผู้ใช้:',
'sp-contributions-toponly' => 'แสดงเฉพาะการแก้ไขรุ่นล่าสุด',
+'sp-contributions-newonly' => 'แสดงเฉพาะการแก้ไขที่เป็นการสร้างหน้า',
'sp-contributions-submit' => 'สืบค้น',
# What links here
ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก',
'ipb-blockingself' => 'คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น',
'ipb-confirmhideuser' => 'คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ "ซ่อนผู้ใช้" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น',
+'ipb-confirmaction' => 'หากคุณแน่ใจว่าคุณต้องการดำเนินการ โปรดเลือกเขตข้อมูล "{{int:ipb-confirm}}" ที่อยู่ล่างสุด',
'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
'ipb-unblock-addr' => 'ปลดบล็อก $1',
'ipb-unblock' => 'ปลดบล็อกผู้ใช้หรือเลขที่อยู่ไอพี',
# Special:Redirect
'redirect' => 'การเปลี่ยนทางตามชื่อไฟล์ รหัสประจำผู้ใช้ หน้าหรือรุ่น',
'redirect-legend' => 'การเปลี่ยนทางไปยังไฟล์หรือหน้า',
-'redirect-summary' => 'หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่น) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้)',
+'redirect-summary' => 'หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่นหรือรหัสหน้า) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้ตัวเลข) การใช้งาน: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] หรือ [[{{#Special:Redirect}}/user/101]]',
'redirect-submit' => 'ไป',
'redirect-lookup' => 'ค้นดู:',
'redirect-value' => 'ค่า:',
'logentry-delete-delete' => '$1 ลบหน้า $3',
'logentry-delete-restore' => '$1 กู้คืนหน้า $3',
'logentry-delete-event' => '$1 เปลี่ยนทัศนวิสัยของ $5 รายการปูมใน $3: $4',
-'logentry-delete-revision' => '$1 เปลี่ยนทัศนวิสัยของ $5 รุ่น ในหน้า $3: $4',
+'logentry-delete-revision' => '$1 เปลี่ยนทัศนวิสัยของ $5 รุ่นในหน้า $3: $4',
'logentry-delete-event-legacy' => '$1 เปลี่ยนทัศนวิสัยของเหตุการณ์ปูมในหน้า $3',
'logentry-delete-revision-legacy' => '$1 เปลี่ยนทัศนวิสัยของรุ่นในหน้า $3',
'logentry-suppress-delete' => '$1 ระงับหน้า $3',
'unprotectthispage' => 'Sahypanyň goragyny aýyr',
'newpage' => 'Täze sahypa',
'talkpage' => 'Sahypany ara alyp maslahatlaş',
-'talkpagelinktext' => 'Çekişme',
+'talkpagelinktext' => 'Pikir alyşma',
'specialpage' => 'Ýörite Sahypa',
'personaltools' => 'Şahsy gurallar',
'postcomment' => 'Täze bölüm',
'retrievedfrom' => 'Çeşmesi: "$1"',
'youhavenewmessages' => 'Size $1 bar. ($2)',
'youhavenewmessagesmulti' => 'Size $1-de täze habar bar.',
-'editsection' => 'redaktirle',
-'editold' => 'redaktirle',
+'editsection' => 'üýtget',
+'editold' => 'üýtget',
'viewsourceold' => 'çeşmäni gör',
-'editlink' => 'redaktirle',
-'viewsourcelink' => 'çeşmesini gör',
+'editlink' => 'üýtget',
+'viewsourcelink' => 'çeşmäni gör',
'editsectionhint' => 'Bölümi üýtget: $1',
'toc' => 'Mazmuny',
'showtoc' => 'görkez',
'site-atom-feed' => '$1 — Atom-lenta',
'page-rss-feed' => '"$1" RSS lentasy',
'page-atom-feed' => '"$1" Atom lentasy',
-'red-link-title' => '$1 (bu sahypa heniz ýazylmandyr)',
+'red-link-title' => '$1 (heniz ýazylmandyr)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Sahypa',
'nstab-project' => 'Taslama sahypasy',
'nstab-image' => 'Faýl',
'nstab-mediawiki' => 'Habarlaşyk',
-'nstab-template' => 'Å\9fablon',
+'nstab-template' => 'Å\9eablon',
'nstab-help' => 'Ýardam sahypasy',
'nstab-category' => 'Kategoriýa',
Şonuň üçinem biz ony görkezmek üçin sanlaýyn IP adresini ulanmaly bolýarys.
Şunuň ýaly IP adresinden ençeme ulanyjy peýdalanýan bolmagy ahmal.
Eger-de sizem anonim ulanyjy bolsaňyz we size siziň bilen dahyly ýok habarlaşyklar gelýän bolsa, onda mundan beýläk başga anonim ulanyjylar bilen garjaşmazlygyňyz üçin [[Special:UserLogin/signup|özüňize hasap ediniň]] ýa-da [[Special:UserLogin|sessiýa açyň]].''",
-'noarticletext' => 'Bu sahypa häzirki wagtda boş dur.
+'noarticletext' => 'Bu sahypa şu wagt boş dur.
Bu ady başga sahypalarda [[Special:Search/{{PAGENAME}}|gözläp bilersiňiz]],
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} degişli gündeliklerde gözleg geçirip bilersiňiz],
-ýa-da bu sahypany [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktirläp bilersiňiz]</span>.',
+ýa-da bu sahypany [{{fullurl:{{FULLPAGENAME}}|action=edit}} üýtgedip bilersiňiz]</span>.',
'noarticletext-nopermission' => 'Häzirki wagtda bu sahypada tekst ýok.
Bu sahypa adyny [[Special:Search/{{PAGENAME}}|başga sahypalarda gözläp]]
ýa-da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} degişli gündeliklerde gözleg geçirip bilersiňiz]</span>, ýöne bu sahypany döretmäge rugsadyňyz ýok.',
Ol $2 {{PLURAL:$2|çagyryşdan|çagyryşdan}} az bolmalydyr, häzir bu ýerde {{PLURAL:$1|1 sany çagyryş|$1 sany çagyryş}} bar.",
'expensive-parserfunction-category' => 'Resurs talap ediji funksiýalara çakdanaşa köp çagyryşy bar bolan sahypalar',
'post-expand-template-inclusion-warning' => "'''Duýduryş''': Girizilen şablonlaryň göwrümi çakdanaşa uly.
-Käbir şablonlar sahypa giriziljek däldir.",
+Käbir şablonlar sahypa girizilmez.",
'post-expand-template-inclusion-category' => 'Girizilýän şablonlarynyň göwrümi çakdanaşa uly bolan sahypalar',
'post-expand-template-argument-warning' => "'''Duýduryş:''' Bu sahypa çakdanaşa uly giňeme ölçegi bar bolan iň bolmanda bir sany şablon argumentini öz içine alýar.
Ol argumentler hasap edilmedi.",
'viewpagelogs' => 'Bu sahypanyň gündeliklerini görkez',
'nohistory' => 'Bu sahypanyň özgerdişler geçmişi ýok.',
'currentrev' => 'Häzirki wersiýa',
-'currentrev-asof' => '$1 senesinden başlap sahypanyň şu wagtky wersiýasy',
-'revisionasof' => 'Sahypanyň $1 senesindäki wersiýasy',
+'currentrev-asof' => '$1 senesinde sahypanyň iň soňky wersiýasy',
+'revisionasof' => '$1 senesindäki wersiýa',
'revision-info' => '$2 tarapyndan döredilen $1 seneli wersiýa',
'previousrevision' => '← Ozalkysy',
'nextrevision' => 'Indikisi →',
'revdelete-show-file-submit' => 'Hawa',
'revdelete-selected' => "'''[[:$1]] sahypasynyň {{PLURAL:$2|saýlanylan wersiýasy|saýlanylan wersiýalary}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Saýlanylan gündelik wakasy|Saýlanylan gündelik wakalary}}:'''",
-'revdelete-text' => "'''Öçürilen wersiýalar we wakalar sahypa geçmişlerinde we gündeliklerde ýene-de görkeziljekdir, emma olaryň mazmunynyň käbir bölekleri jemgyýetçilige açyk boljak däldir.'''
-{{SITENAME}} saýtyndaky başga administratorlar gizlin mazmuny ýene-de görüp hem-de goşmaça çäklendirme goýulmadyk ýagdaýynda şol bir interfeýsiň üsti bilen ony yzyna dikeldip bilýärler.",
'revdelete-confirm' => 'Şu işi anyk isleýändigiňizi, ýagny onuň netijelerine düşünýändiňizi we [[{{MediaWiki:Policy-url}}|kadalar boýunça]] amala aşyrýandygyňyzy tassyklamagyňyzy haýyş edýäris.',
'revdelete-suppress-text' => "Gizlemeklik '''diňe''' aşakdaky ýagdaýlarda ulanylmalydyr:
* Potensial taýdan töhmetçilikli maglumat
'logdelete-success' => "'''Gündelik görünme derejesi şowlulyk bilen sazlandy.'''",
'logdelete-failure' => "'''Gündelik görünme derejesini sazlap bolmaýar:'''
$1",
-'revdel-restore' => 'Görnüşi üýtget',
+'revdel-restore' => 'Görnüş ukybyny üýtget',
'pagehist' => 'Sahypanyň geçmişi',
'deletedhist' => 'Öçürilen geçmiş',
'revdelete-hide-current' => '$2, $1 seneli ýazgyda gizleme säwligi: bu häzirki wersiýa.
# Merge log
'mergelog' => 'Birleşdirme gündeligi',
'pagemerge-logentry' => '[[$1]] bilen [[$2]] birleşdirildi (şuňa çenliki wersiýalar: $3)',
-'revertmerge' => 'Böl',
+'revertmerge' => 'Dargat',
'mergelogpagetext' => 'Aşakdaky sanaw sahypalaryň geçmişleriniň iň soňky birleşdirmelerini görkezýär.',
# Diffs
'prevn-title' => 'Öňki $1 {{PLURAL:$1|netije|netije}}',
'nextn-title' => 'Indiki $1 {{PLURAL:$1|netije|netije}}',
'shown-title' => 'Sahypa başyna $1 {{PLURAL:$1|netije|netije}} görkez',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) gör',
'searchmenu-exists' => "'''Bu wikide \"[[:\$1]]\" atly sahypa bar'''",
'searchmenu-new' => '<strong>Bu wikide "[[:$1]]" sahypasyny dörediň!</strong>
{{PLURAL:$2|0=|Gözlegde tapylan sahypa-da serediň.|Tapylan gözleg netijelerine-de serediň.}}',
-'searchprofile-articles' => 'Mazmunly sahypalar',
-'searchprofile-project' => 'Ýardam we Taslama sahypalary',
+'searchprofile-articles' => 'Esasy sahypalar',
+'searchprofile-project' => 'Kömek we taslama sahypalary',
'searchprofile-images' => 'Multimedia',
'searchprofile-everything' => 'Ähli zatlar',
-'searchprofile-advanced' => 'Giňeldilen',
-'searchprofile-articles-tooltip' => '$1 boýunça gözle',
-'searchprofile-project-tooltip' => '$1 boýunça gözle',
+'searchprofile-advanced' => 'Giňişleýin',
+'searchprofile-articles-tooltip' => '$1 içinden gözle',
+'searchprofile-project-tooltip' => '$1 içinden gözle',
'searchprofile-images-tooltip' => 'Faýllary gözle',
-'searchprofile-everything-tooltip' => 'Ähli sahypalardan gözle (şol sanda çekişme sahypalaryndan)',
-'searchprofile-advanced-tooltip' => 'Hususy at giňişliklerinde gözle',
+'searchprofile-everything-tooltip' => 'Ähli sahypalardan gözle (şol sanda pikir alyşma sahypalaryndan)',
+'searchprofile-advanced-tooltip' => 'Laýyk at giňişliklerinde gözle',
'search-result-size' => '$1 ({{PLURAL:$2|1 söz|$2 söz}})',
'search-result-category-size' => '{{PLURAL:$1|1 agza|$1 agza}} ({{PLURAL:$2|1 kiçi kategoriýa|$2 kiçi kategoriýa}}, {{PLURAL:$3|1 faýl|$3 faýl}})',
'search-result-score' => 'Kybapdaşlyk: $1%',
'searchall' => 'ählisi',
'showingresults' => "Aşakda №'''$2''' netijeden başlap, {{PLURAL:$1|'''1''' netije|'''$1''' netije}} görkezilýär.",
'showingresultsnum' => "Aşakda №'''$2''' netijeden başlap, {{PLURAL:$3|'''1''' netije|'''$3''' netije}} görkezilýär.",
-'showingresultsheader' => "'''$4''' üçin {{PLURAL:$5|'''$3''' netijeden '''$1''' sanysy|'''$3''' netijeden '''$1 - $2''' aralygy}}",
+'showingresultsheader' => "'''$4''' hakda {{PLURAL:$5|'''$3''' netijeden '''$1''' sanysy|'''$3''' netijeden '''$1 - $2''' aralygy}}",
'search-nonefound' => 'Talaba gabat gelýän hiç hili netije ýok.',
'powersearch-legend' => 'Giňişleýin gözleg',
'powersearch-ns' => 'At giňişliklerinde gözleg:',
'rcshowhidemine' => 'özgerdişlerimi $1',
'rclinks' => 'Soňky $2 günde edilen iň soňky $1 üýtgeşmäni görkez;<br /> $3',
'diff' => 'tapawut',
-'hist' => 'geçmiş',
-'hide' => 'gizle',
-'show' => 'görkez',
+'hist' => 'taryh',
+'hide' => 'Gizle',
+'show' => 'Görkez',
'minoreditletter' => 'uj',
'newpageletter' => 'T',
'boteditletter' => 'b',
'recentchangeslinked-feed' => 'Degişli üýtgeşmeler',
'recentchangeslinked-toolbox' => 'Dahylly üýtgetmeler',
'recentchangeslinked-title' => '"$1" bilen baglanyşykly üýtgeşmeler',
-'recentchangeslinked-summary' => "Aşakdaky sanaw, görkezilen sahypa (ýa-da görkezilen kategoriýanyň agzalaryna) çykgyt berýän sahypalarda edilen üýtgeşmeleriň sanawydyr.
-[[Special:Watchlist|Gözegçilik sanawyňyzdaky]] sahypalar '''goýy''' ýazgy bilen görkezilýär.",
+'recentchangeslinked-summary' => 'Görkezilen sahypa (ýa-da görkezilen kategoriýanyň agzalaryna) çykgyt berýän sahypalarda edilen soňky üýtgetmeleriň sanawy.
+[[Special:Watchlist|Gözegçilik sanawyňyzdaky]] sahypalar <strong>goýy</strong> bilen görkezilýär.',
'recentchangeslinked-page' => 'Sahypanyň ady:',
'recentchangeslinked-to' => 'Tersine, berlen sahypa çykgyt berýän sahypalary görkez',
# File description page
'file-anchor-link' => 'Faýl',
-'filehist' => 'Faýlyň geçmişi',
+'filehist' => 'Faýlyň taryhy',
'filehist-help' => 'Faýlyň geçmişini görmek üçin Sene/Wagt bölümündäki senelere tyklaň.',
'filehist-deleteall' => 'ählisini öçür',
'filehist-deleteone' => 'öçür',
'filehist-user' => 'Ulanyjy',
'filehist-dimensions' => 'Ölçegler',
'filehist-filesize' => 'Faýl ölçegi',
-'filehist-comment' => 'Teswirleme',
+'filehist-comment' => 'Teswir',
'filehist-missing' => 'Faýl ýok',
'imagelinks' => 'Faýlyň ulanylyşy',
'linkstoimage' => 'Bu faýla çykgydy bar bolan {{PLURAL:$1|sahypa|$1 sahypa}}:',
'sharedupload' => 'Bu faýl $1 ammaryndan, özem beýleki taslamalarda ulanylýan bolmagy ahmal.',
'sharedupload-desc-there' => 'Bu faýl $1 ammaryndan, özem beýleki taslamalarda ulanylýan bolmagy ahmal.
Goşmaça maglumat üçin [$2 faýl düşündiriş sahypasyna] serediň.',
-'sharedupload-desc-here' => 'Bu faýl $1 ammaryndan, özem beýleki taslamalarda ulanylýan bolmagy ahmal.
-[$2 Onuň faýl düşündiriş sahypasyndaky] düşündirişi aşakda görkezilýär.',
+'sharedupload-desc-here' => 'Bu faýl $1 toplaýjysyndan, özem başga taslamalarda ulanylýan bolmagy mümkin.
+Onuň [$2 faýl düşündiriş sahypasyndaky] maglumatlar aşakda görkezilýär.',
'filepage-nofile' => 'Şeýle atly faýl ýok.',
'filepage-nofile-link' => 'Şeýle atly faýl ýok, ama siz [$1 ony ýükläp bilersiňiz].',
'uploadnewversion-linktext' => 'Bu faýlyň täze wersiýasyny ýükläň',
Ulanan çykgydyňyz nädogry bolmagy ýa-da onuň arhiwden dikeldilen ýa-da aýyrylan bolmagy mümkin.',
'undelete-nodiff' => 'Hiç hili öňki wersiýa tapylmady.',
'undeletebtn' => 'Dikelt',
-'undeletelink' => 'görkez/dikelt',
-'undeleteviewlink' => 'görkez',
+'undeletelink' => 'gör/dikelt',
+'undeleteviewlink' => 'gör',
'undeleteinvert' => 'Saýlanmadyklar',
'undeletecomment' => 'Sebäp:',
'undeletedrevisions' => '{{PLURAL:$1|1 wersiýa|$1 wersiýa}} dikeldildi',
'ipblocklist-empty' => 'Blokirleme sanawy boş.',
'ipblocklist-no-results' => 'Talap edilen IP adresi ýa-da ulanyjy ady blokirlengi däl.',
'blocklink' => 'blokirle',
-'unblocklink' => 'blokirowkany aýyr',
-'change-blocklink' => 'blokirowkany üýtget',
+'unblocklink' => 'blokirlemäni aýyr',
+'change-blocklink' => 'blokirlemäni üýtget',
'contribslink' => 'goşantlar',
'autoblocker' => 'Awtomatik usulda blokirlendiňiz, çünki ýaňy-ýakynda IP adresiňiz "[[User:$1|$1]]" ulanyjysy tarapyndan ulanyldy. $1 atly ulanyjynyň blokirlenmegi üçin görkezilen sebäp: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'Blokirleme gündeligi',
Başga bir at saýlaň.',
# Export
-'export' => 'Sahypa eksportirle',
+'export' => 'Sahypalary çykar',
'exporttext' => 'Belli bir sahypanyň ýa-da sahypalar toplumynyň tekstini we redaktirleme geçmişini XML arkaly eksportirläp bilersiňiz.
Soňra ony [[Special:Import|importirleme sahypasynyň]] üsti bilen MediaWiki ulanýan başga bir wikä importirläp bolýar.
'tooltip-pt-mytalk' => 'Pikir alyşma sahypaňyz',
'tooltip-pt-anontalk' => 'Bu IP adresinden edilen özgerdişler barada pikir alyş',
'tooltip-pt-preferences' => 'Ileri tutmalaryňyz',
-'tooltip-pt-watchlist' => 'Gözegçilikde saklaýan sahypalarym',
+'tooltip-pt-watchlist' => 'Üýtgetmelerini gözegçilikde saklaýan sahypalaryňyz',
'tooltip-pt-mycontris' => 'Eden goşantlaryňyzyň sanawy',
-'tooltip-pt-login' => 'Hasaba girmegiňiz maslahat berilýär, ýöne hökmany däl.',
+'tooltip-pt-login' => 'Hasaba girmegiňiz maslahat berilýär, ýöne hökman däl.',
'tooltip-pt-logout' => 'Hasapdan çyk',
'tooltip-ca-talk' => 'Esasy sahypa barada çekişme',
'tooltip-ca-edit' => 'Bu sahypany üýtgedip bilersiňiz. Ýazdyrmankaňyz "synlaw" düwmesine basyp, synlap görüň.',
'tooltip-ca-addsection' => 'Täze bölüm başlat',
-'tooltip-ca-viewsource' => 'Bu sahypa gorag astynda.
-Onuň çeşmesini görüp bilersiňiz',
+'tooltip-ca-viewsource' => 'Bu sahypa goragly, ýöne onuň çeşmesini görüp bilersiňiz',
'tooltip-ca-history' => 'Sahypanyň öňki wersiýalary',
'tooltip-ca-protect' => 'Sahypany goraga al',
'tooltip-ca-unprotect' => 'Bu sahypanyň goragyny üýtget',
'tooltip-ca-delete' => 'Sahypany öçür',
'tooltip-ca-undelete' => 'Bu sahypadaky özgerdişleri öçürilmänkäki ýagdaýyna yzyna dikelt',
'tooltip-ca-move' => 'Sahypanyň adyny üýtget',
-'tooltip-ca-watch' => 'Bu sahypany gözegçilige al',
+'tooltip-ca-watch' => 'Sahypany gözegçilik sanawyňa goş',
'tooltip-ca-unwatch' => 'Bu sahypany gözegçilik sanawyňdan aýyr',
'tooltip-search' => '{{SITENAME}} saýtynda gözle',
'tooltip-search-go' => 'Eger bar bolsa, anyk şu atdaky sahypa git',
-'tooltip-search-fulltext' => 'Şu tekst bar bolan sahypalary gözle',
+'tooltip-search-fulltext' => 'Sahypalardan şu teksti gözle',
'tooltip-p-logo' => 'Baş sahypa baryp gör',
'tooltip-n-mainpage' => 'Baş sahypa baryp gör',
'tooltip-n-mainpage-description' => 'Baş sahypa baryp gör',
'tooltip-t-whatlinkshere' => 'Şu ýere çykgyt berýän ähli wiki-sahypalaryň sanawy',
'tooltip-t-recentchangeslinked' => 'Bu sahypadan çykgyt alýan sahypalardaky soňky üýtgetmeler',
'tooltip-feed-rss' => 'Bu sahypa üçin RSS lentasy',
-'tooltip-feed-atom' => 'Bu sahypa üçin atom lentasy',
+'tooltip-feed-atom' => 'Bu sahypanyň atom lentasy',
'tooltip-t-contributions' => 'Şu ulanyjynyň goşantlarynyň sanawyny gör',
'tooltip-t-emailuser' => 'Bu ulanyja e-poçta iber',
'tooltip-t-upload' => 'Faýllary ýükle',
'tooltip-ca-nstab-media' => 'Media sahypasyny görkez',
'tooltip-ca-nstab-special' => 'Bu ýörite sahypa, ony redaktirläp bolmaýar',
'tooltip-ca-nstab-project' => 'Taslama sahypasyny görkez',
-'tooltip-ca-nstab-image' => 'Suratyň sahypasyny görkez',
+'tooltip-ca-nstab-image' => 'Faýlyň sahypasyny gör',
'tooltip-ca-nstab-mediawiki' => 'Ulgam habarlaşygyny görkez',
'tooltip-ca-nstab-template' => 'Şablony görkez',
'tooltip-ca-nstab-help' => 'Ýardam sahypasyny görkez',
-'tooltip-ca-nstab-category' => 'Kategoriýanyň sahypasyny görkez',
+'tooltip-ca-nstab-category' => 'Kategoriýanyň sahypasyny gör',
'tooltip-minoredit' => 'Ujypsyzja özgerdiş hökmünde belle',
'tooltip-save' => 'Özgerdişleriňi ýazdyr',
'tooltip-preview' => 'Deslapky syn; ýazdyrmankaňyz şuny ulanyp özgerdişleriňizi gözden geçiriň!',
'tooltip-recreate' => 'Öçürilendigine garamazdan sahypany gaýtadan döret',
'tooltip-upload' => 'Ýüklemäni başlat',
'tooltip-rollback' => '"Öňki katdyna getir" ýeke gezek tyklananda bu sahypa iň soňky goşant goşanyň özgerdişlerini yzyna getirýär',
-'tooltip-undo' => '"Yzyna al" bu özgerdişi yzyna getirýär we özgerdiş formuny deslapky syn modunda açýar.
-Mazmun üçin bir sebäp goşmaga rugsat berýär',
+'tooltip-undo' => '"Yzyna al" bu özgerdişi yzyna getirýär we özgerdiş formuny synlaw modunda açýar. Yzyna almagyň sebäbini ýazmaga mümkinçilik berýär.',
'tooltip-preferences-save' => 'Ileri tutmalary ýazdyr',
'tooltip-summary' => 'Gysgaça düşündiriş giriziň',
'tog-ccmeonemails' => 'Padalahan ako ng mga kopya ng mga ipinadala kong e-liham sa ibang mga tagagamit',
'tog-diffonly' => 'Huwag ipakita ang nilalaman ng pahinang nasa ilalim ng mga pagkakaiba',
'tog-showhiddencats' => 'Ipakita ang mga nakatagong kategorya',
-'tog-noconvertlink' => 'Huwag paganahin ang pagpapalit ng pamagat na pangkawing',
'tog-norollbackdiff' => 'Alisin ang mga pagkakaiba pagkatapos isagawa ang pagpapagulong na pabalik sa dati',
'tog-useeditwarning' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
'revdelete-show-file-submit' => 'Oo',
'revdelete-selected' => "{{PLURAL:$2|Piniling|Mga piniling}} pagbabago ng '''$1:'''",
'logdelete-selected' => '{{PLURAL:$1|Piniling tala ng pangyayari|Piniling tala ng mga pangyayari}}:',
-'revdelete-text' => "'''Makikita pa rin ang mga binurang pagbabago at mga kaganapan sa pahina ng kasaysayan at mga talaan, ngunit hindi mapupuntahan ng madla ang mga bahagi ng kanilang nilalaman.
-Makikita pa rin ng iba pang mga tagapangasiwang nasa {{SITENAME}} ang mga tinagong nilalaman at maaaring ibalik ito mula sa pagkakabura sa pamamagitan ng kaparehong ugnayang-hangganan, maliban na lamang kung may itinakdang karagdagang mga restriksyon.",
'revdelete-confirm' => 'Pakitiyak po na nais mo itong gawin, na nauunawaan mo ang mga kahihinatnan, at na ginagawa mo ito alinsunod sa [[{{MediaWiki:Policy-url}}|patakaran]].',
'revdelete-suppress-text' => "Ang paglilingid ay dapat na gamitin '''lamang''' para sa sumusunod na mga pagkakataon:
* Hindi naaangkop na kabatirang pansarili
'tog-ccmeonemails' => 'Diğer kullanıcılara gönderdiğim e-postaların kopyalarını bana da gönder',
'tog-diffonly' => 'Sayfa içeriğini sürüm farklarının altında gösterme',
'tog-showhiddencats' => 'Gizli kategorileri göster',
-'tog-noconvertlink' => 'Bağlantı başlığı dönüştürmesini devre dışı bırakma',
'tog-norollbackdiff' => 'Geridönüş uygulandıktan sonra değişikliği atla',
'tog-useeditwarning' => 'Kaydedilmemiş değişikliğe sahip bir değişiklik sayfasından çıkarken beni uyar',
'tog-prefershttps' => 'Oturumu açarken her zaman güvenli bağlantı kullan',
'revdelete-show-file-submit' => 'Evet',
'revdelete-selected' => "'''[[:$1]] sayfasının {{PLURAL:$2|seçili değişikliği|seçili değişiklikleri}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Seçili kayıt olayı|Seçili kayıt olayları}}:'''",
-'revdelete-text' => "'''Silinen revizyonlar ve olaylar hala sayfa geçmişinde ve günlüklerde görünecektir, fakat içeriğin parçaları umumi olarak erişilemeyecektir.'''
-{{SITENAME}} sitesindeki diğer hizmetliler gizli içeriğe erişebilir ve ilave kısıtlamalar ayarlanmadıysa bu arayüz ile geri getirebilir.",
'revdelete-confirm' => 'Lütfen, bunu yapmak istediğinizi , sonuçlarını anladığınızı, ve bunu [[{{MediaWiki:Policy-url}}|ilkelere]] göre yapıyor olduğunuzu onaylayın.',
'revdelete-suppress-text' => "Saklama '''sadece''' aşağıdaki durumlarda kullanılmalıdır:
* Muhtemel iftira niteliğindeki bilgi
'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|değişiklikten|değişiklikten}} fazla geri döndür',
'rollbackfailed' => 'geri alma işlemi başarısız',
'cantrollback' => 'Sayfaya son katkıda bulunan kullanıcı, sayfaya katkıda bulunmuş tek kişi olduğu için, değişiklikler geri alınamıyor.',
-'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geriye alınamıyor;
-başka biri sayfada değişiklik yaptı ya da sayfayı geriye aldı.
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geriye alınamıyor;
+başka birisi sayfada değişiklik yaptı ya da sayfayı geriye aldı.
-Son değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+Son değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
'editcomment' => "Değişiklik özeti: \"''\$1''\" idi.",
'revertpage' => '[[Special:Contributions/$2|$2]] [[User talk:$2|mesaj]] tarafından yapılan değişiklikler geri alınarak, [[User:$1|$1]] tarafından değiştirilmiş önceki sürüm geri getirildi.',
'revertpage-nouser' => 'Gizli bir kullanıcı tarafından yapılan değişiklikler geri alınarak {{GENDER:$1|[[User:$1|$1]]}} tarafından yapılan son revizyon geri getirildi',
* @author Don Alessandro
* @author Haqmar
* @author Himiq Dzyu
+ * @author Ilnur efende
* @author KhayR
* @author MF-Warburg
* @author Marat Vildanov
'moredotdotdot' => 'Дәвамы…',
'morenotlisted' => 'Башка берни дә юк...',
'mypage' => 'Бит',
-'mytalk' => 'Бәхәс',
+'mytalk' => 'Бәхәс бите',
'anontalk' => 'Бу IP адресы өчен бәхәс бите',
'navigation' => 'Күчү',
'and' => ' һәм',
'userlogin-noaccount' => 'Аккаунт юкмы?',
'userlogin-joinproject' => 'Проектка керү',
'nologin' => "Кулланучы исемең юкмы? '''$1'''",
-'nologinlink' => 'Хисап язмасы төзегез',
-'createaccount' => 'Яңа кулланучы теркәү',
+'nologinlink' => 'Хисап язмасы төзү',
+'createaccount' => 'Яңа кулланучыны теркәү',
'gotaccount' => "Сез инде теркәлдегезме? '''$1'''.",
'gotaccountlink' => 'Керү',
'userlogin-resetlink' => 'Серсүзегезне оныттыгызмы?',
'login-abort-generic' => 'Системага уңышсыз керү очрагы',
'loginlanguagelabel' => 'Тел: $1',
'suspicious-userlogout' => 'Сезнең эшчәнлекне бетерү соравыгыз кире кагылды, чөнки ул ялгыш браузер яисә кэшлаучы прокси аша җибәрелергэ мөмкин.',
+'pt-login' => 'Керү',
+'pt-createaccount' => 'Яңа кулланучыны теркәү',
+'pt-userlogout' => 'Чыгу',
# Email sending
'php-mail-error-unknown' => 'PHP mail() функциясендә билгесез хата',
'recentchanges-legend' => 'Соңгы үзгәртүләр көйләүләре',
'recentchanges-summary' => 'Бу биттә {{grammar:genitive|{{SITENAME}}}} проектының соңгы үзгәртүләре күрсәтелә.',
'recentchanges-feed-description' => 'Бу агымда соңгы үзгәртүләрне күзәтү.',
-'recentchanges-label-newpage' => 'Ð\91Ñ\83 үзгÓ\99Ñ\80Ñ\82Ò¯ белÓ\99н Ñ\8fңа биÑ\82 Ñ\82өзелде',
+'recentchanges-label-newpage' => 'Ð\91Ñ\83 үзгÓ\99Ñ\80Ñ\82Ò¯ белÓ\99н Ñ\8fңа биÑ\82 Ñ\82өзелгÓ\99н',
'recentchanges-label-minor' => 'Бу кече үзгәртү',
-'recentchanges-label-bot' => 'Бу үзгәртү бот белән эшләнгән иде',
+'recentchanges-label-bot' => 'Бу үзгәртү бот белән эшләнгән',
'recentchanges-label-unpatrolled' => 'Үзгәртүне әлегә тикшермәгәннәр',
+'recentchanges-label-plusminus' => 'Битнең зурлыгы шуның кадәрле байтка үзгәрде',
'recentchanges-legend-newpage' => '([[Special:NewPages|яңа бит]])',
'rcnotefrom' => "Астарак '''$2''' башлап ('''$1''' кадәр) үзгәртүләр күрсәтелгән.",
'rclistfrom' => '$1 башлап яңа үзгәртүләрне күрсәт',
'rcshowhideminor' => 'кече үзгәртүләрне $1',
+'rcshowhideminor-show' => 'күрсәт',
+'rcshowhideminor-hide' => 'яшер',
'rcshowhidebots' => 'ботларны $1',
-'rcshowhideliu' => '$1 кергән кулланучылар',
+'rcshowhidebots-show' => 'күрсәт',
+'rcshowhidebots-hide' => 'яшер',
+'rcshowhideliu' => 'Теркәлгән кулланучыларны $1',
+'rcshowhideliu-show' => 'күрсәт',
+'rcshowhideliu-hide' => 'яшер',
'rcshowhideanons' => 'кермәгән кулланучыларны $1',
+'rcshowhideanons-show' => 'күрсәт',
+'rcshowhideanons-hide' => 'яшер',
'rcshowhidepatr' => 'тикшерелгән үзгәртүләрне $1',
+'rcshowhidepatr-hide' => 'яшер',
'rcshowhidemine' => 'минем үзгәртүләремне $1',
+'rcshowhidemine-show' => 'күрсәт',
+'rcshowhidemine-hide' => 'яшер',
'rclinks' => 'Соңгы $2 көн эчендә соңгы $1 үзгәртүне күрсәт<br />$3',
'diff' => 'аерма',
'hist' => 'тарих',
'tog-ccmeonemails' => 'مەن باشقىلارغا يوللىغان ئېلخەتنى ئۆزەمگىمۇ بىر نۇسخا يوللا',
'tog-diffonly' => 'تۈزىتىلگەن ئىككى نەشرىنىڭ پەرقىنى سېلىشتۇرغاندا بەت مەزمۇنىنى كۆرسەتمە',
'tog-showhiddencats' => 'يوشۇرۇن تۈرلەرنى كۆرسەت',
-'tog-noconvertlink' => 'ئۇلانما ماۋزۇ ئالماشتۇرۇشنى چەكلە',
'tog-norollbackdiff' => 'قايتۇرۇشنى ئىجرا قىلغاندىن كېيىن پەرقنى كۆرسەتمە',
'tog-useeditwarning' => 'بىر تەھرىرلىگەن بەتنى ساقلىماي چېكىنگەندە مېنى ئەسكەرت',
'tog-prefershttps' => 'تىزىمغا كىرگەندە دائىم بىخەتەر ئۇلىنىشنى ئىشلەت',
'revdelete-show-file-submit' => 'ھەئە',
'revdelete-selected' => "'''[[:$1]] نىڭ {{PLURAL:$2|تاللانغان تۈزىتىش نەشرى|تاللانغان تۈزىتىش نەشرى}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|تاللانغان خاتىرە تۈرى|تاللانغان خاتىرە تۈرى}}:'''",
-'revdelete-text' => "'''ئۆچۈرۈلگەن تۈزىتىلگەن نەشرى ۋە ھادىسە بەت تارىخىدا كۆرۈنىدۇ ئەمما ئۇنىڭ مەزمۇنىنى كۆپچىلىك زىيارەت قىلالمايدۇ.'''
-{{SITENAME}} دىكى باشقا باشقۇرغۇچىلار يوشۇرۇلغان مەزمۇننى يەنىلا كۆرەلەيدۇ ھەمدە بېكەت خىزمەتچىلىرى قوشۇمچە چەكلىمە ئېلىپ بارمىغانلا بولسا ئوخشاش ئارايۈزدە ئۆچۈرۈلگەننى ئەسلىگە كەلتۈرەلەيدۇ،",
'revdelete-confirm' => 'بۇ مەشغۇلاتنى ئىجرا قىلسىڭىز ئاقىۋىتىنى چۈشىنىدىغانلىقىڭىزنى ھەمدە بۇ پروگراممىنىڭ [[{{MediaWiki:Policy-url}}|سىياسەت]]كە ئۇيغۇن كېلىدىغانلىقىنى جەزملەڭ.',
'revdelete-suppress-text' => "'''پەقەت''' تۆۋەندىكى ئەھۋاللار يۈز بەرگەندىلا زىيارەت چەكلىنىدۇ:
* نامۇۋاپىق شەخسىي ئۇچۇر
* @author Yuriy Apostol
* @author Ата
* @author Дар'я Козлова
+ * @author Максим Підліснюк
* @author Тест
*/
'tog-ccmeonemails' => 'Надсилати мені копії листів, які я надсилаю іншим користувачам',
'tog-diffonly' => 'Не показувати вміст сторінки під різницею версій',
'tog-showhiddencats' => 'Показувати приховані категорії',
-'tog-noconvertlink' => 'Вимкнути конвертацію назви посилання',
'tog-norollbackdiff' => 'Не показувати різницю версій після виконання відкоту',
'tog-useeditwarning' => 'Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами',
'tog-prefershttps' => "Завжди використовувати безпечне з'єднання при вході у систему",
'createacct-another-realname-tip' => "Справжнє ім'я є необов'язковим.
Якщо ви вирішите надати його, то воно буде використовуватися для присвоєння користувачу авторства до його роботи.",
'pt-login' => 'Увійти',
+'pt-login-button' => 'Вхід',
'pt-createaccount' => 'Створити обліковий запис',
'pt-userlogout' => 'Вийти',
'revdelete-show-file-submit' => 'Так',
'revdelete-selected' => "'''{{PLURAL:$2|1=Обрана версія|Обрані версії}} сторінки [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|1=Обраний запис|Обрані записи}} журналу:'''",
-'revdelete-text' => "'''Вилучені версії сторінок і подій будуть відображатися в історії сторінки та журналах, але частина їх вмісту не буде доступною звичайним користувачам.'''
-Доступ до прихованого змісту матимуть адміністратори проекту {{SITENAME}}, які зможуть відновити його за допомогою цього ж інтерфейсу,
-крім випадків, коли були встановлені додаткові обмеження власниками сайту.",
'revdelete-confirm' => 'Будь ласка, підтвердить, що ви справді бажаєте це здійснити, усвідомлюєте наслідки та робите це згідно з [[{{MediaWiki:Policy-url}}|правилами]].',
'revdelete-suppress-text' => "Приховування може відбуватися '''лише''' в таких випадках:
* Потенційно наклепницькі відомості
'search-file-match' => '(збігається із вмістом файлу)',
'search-suggest' => 'Можливо, ви мали на увазі: $1',
'search-interwiki-caption' => 'Братні проекти',
-'search-interwiki-default' => '$1 результати:',
+'search-interwiki-default' => 'Результати із $1:',
'search-interwiki-more' => '(більше)',
'search-relatedarticle' => "Пов'язаний",
'searcheverything-enable' => 'Пошук у всіх просторах назв',
'rcnotefrom' => 'Нижче відображені редагування з <strong>$2</strong> (до <strong>$1</strong>).',
'rclistfrom' => 'Показати редагування починаючи з $1.',
'rcshowhideminor' => '$1 незначні редагування',
-'rcshowhideminor-show' => 'Ð\9fоказати',
-'rcshowhideminor-hide' => 'Ð\9fриховати',
+'rcshowhideminor-show' => 'показати',
+'rcshowhideminor-hide' => 'приховати',
'rcshowhidebots' => '$1 ботів',
-'rcshowhidebots-show' => 'Ð\9fоказати',
-'rcshowhidebots-hide' => 'Ð\9fриховати',
+'rcshowhidebots-show' => 'показати',
+'rcshowhidebots-hide' => 'приховати',
'rcshowhideliu' => '$1 зареєстрованих користувачів',
-'rcshowhideliu-show' => 'Ð\9fоказати',
-'rcshowhideliu-hide' => 'Ð\9fриховати',
+'rcshowhideliu-show' => 'показати',
+'rcshowhideliu-hide' => 'приховати',
'rcshowhideanons' => '$1 анонімів',
-'rcshowhideanons-show' => 'Ð\9fоказати',
-'rcshowhideanons-hide' => 'Ð\9fриховати',
+'rcshowhideanons-show' => 'показати',
+'rcshowhideanons-hide' => 'приховати',
'rcshowhidepatr' => '$1 перевірені',
-'rcshowhidepatr-show' => 'Ð\9fоказати',
-'rcshowhidepatr-hide' => 'Ð\9fриховати',
+'rcshowhidepatr-show' => 'показати',
+'rcshowhidepatr-hide' => 'приховати',
'rcshowhidemine' => '$1 мої редагування',
-'rcshowhidemine-show' => 'Ð\9fоказати',
-'rcshowhidemine-hide' => 'Ð\9fриховати',
+'rcshowhidemine-show' => 'показати',
+'rcshowhidemine-hide' => 'приховати',
'rclinks' => 'Показати останні $1 редагувань за $2 днів<br />$3',
'diff' => 'різн.',
'hist' => 'історія',
'deadendpagestext' => 'Наступні сторінки не містять посилань на інші сторінки цієї вікі.',
'protectedpages' => 'Захищені сторінки',
'protectedpages-indef' => 'Тільки безстроково захищені',
+'protectedpages-summary' => 'На цій сторінці перераховані сторінки, які на цей момент захищені. Список назв, які захищені від створення див. [[{{#special:ProtectedTitles}}]].',
'protectedpages-cascade' => 'Тільки каскадний захист',
'protectedpages-noredirect' => 'Сховати перенаправлення',
'protectedpagesempty' => 'Зараз нема захищених сторінок із зазначеними параметрами',
'protectedpages-unknown-timestamp' => 'Невідомо',
'protectedpages-unknown-performer' => 'Невідомий користувач',
'protectedtitles' => 'Заборонені назви',
+'protectedtitles-summary' => 'На цій сторінці перераховані назви, які захищені від створення. Для перегляду списку сторінок, які на цей момент захищені, див. [[{{#special:ProtectedPages}}]].',
'protectedtitlesempty' => 'Зараз нема захищених назв із зазначеними параметрами.',
'listusers' => 'Список користувачів',
'listusers-editsonly' => 'Показати лише користувачів, які зробили принаймні одне редагування',
'delete-warning-toobig' => 'У цієї сторінки дуже довга історія редагувань, більше $1 {{PLURAL:$1|версії|версій|версій}}.
Її вилучення може призвести до порушень у роботі бази даних сайту {{SITENAME}};
дійте обережно.',
-'deleting-backlinks-warning' => "'''Попередження:''' інші сторінки посилаються або містять сторінку, яку ви маєте намір видалити.",
+'deleting-backlinks-warning' => "'''Попередження:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|інші сторінки]] посилаються або містять сторінку, яку ви маєте намір видалити.",
# Rollback
'rollback' => 'Відкинути редагування',
'tog-extendwatchlist' => 'Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi',
'tog-usenewrc' => 'Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)',
'tog-numberheadings' => 'Sarlavhalarni avtomatik raqamlash',
-'tog-showtoolbar' => 'Tahrirlash asboblari joylashgan yoʻlakchani koʻrsatish (JavaScript orqali)',
-'tog-editondblclick' => 'Sichqoncha tugmasini ikki marta bosish orqali tahrirlashni boshlash',
-'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
+'tog-showtoolbar' => 'Yuqoridagi tahrirlash asboblarini koʻrsatish',
+'tog-editondblclick' => 'Sichqonchaning chap tugmasini ikki marta bosib tahrirlashni boshlash',
+'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasini bosib tahrirlashni boshlash',
'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 kunga)',
'tog-watchcreations' => 'Men yaratgan sahifalar va yuklagan fayllar kuzatuv roʻyxatimga qoʻshilsin',
'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllar kuzatuv roʻyxatimga qoʻshilsin',
'tog-oldsig' => 'Joriy imzo:',
'tog-fancysig' => 'Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)',
'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
-'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
+'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatish',
'tog-watchlisthideown' => 'Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin',
'tog-watchlisthidebots' => 'Botlar qilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
'tog-watchlisthideminor' => 'Kichik tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimga yuborilsin',
'tog-diffonly' => 'Versiyalar taqqoslanayotganda, pastda sahifa matni koʻrsatilmasin',
'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
-'tog-noconvertlink' => 'Sarlavhani oʻzgartirish havolasini oʻchirib qoʻyish',
'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosi koʻrsatilmasin',
-'tog-useeditwarning' => 'Kiritgan oʻzgarishlarimni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirilsin',
+'tog-useeditwarning' => 'Oʻzgarishlarni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirish',
'tog-prefershttps' => 'Doim himoyalangan holda kirish',
'underline-always' => 'Har doim',
'userlogin-createanother' => 'Boshqa hisob yaratish',
'createacct-join' => 'Maʼlumotlaringizni quyiga yozing',
'createacct-another-join' => 'Yangi hisob yozuvi maʼlumotlarini quyida koʻrsating.',
+'createacct-emailrequired' => 'Elektron pochta manzilingiz',
'createacct-emailoptional' => 'Elektron pochta manzili (majburiy emas)',
-'createacct-email-ph' => 'Elektron pochtangiz manzilini kiriting',
+'createacct-email-ph' => 'Elektron pochta manzilingizni kiriting',
'createacct-another-email-ph' => 'Elektron pochta manzilini kiriting',
'createaccountmail' => 'Tasodifan tanlab beriladigan vaqtinchalik maxfiy soʻzdan foydalanish (elektron pochta manzilingizga joʻnatiladi)',
'createaccountreason' => 'Sabab:',
+'createacct-reason' => 'Sabab',
+'createacct-reason-ph' => 'Nimaga yana boshqa hisob yaratyapsiz',
'createacct-captcha' => 'Xavfsizlik tekshiruvi',
'createacct-imgcaptcha-ph' => 'Yuqoridagi yozuvni bu yerga kiriting',
'createacct-submit' => 'Hisob yaratish',
'wrongpasswordempty' => 'Maxfiy soʻz koʻrsatilmagan. Qaytadan urinib koʻring.',
'mailmypassword' => 'Maxfiy soʻzni yangilash',
'passwordremindertitle' => "{{SITENAME}} uchun vaqtinchalik yangi maxfiy so'z",
-'emailauthenticated' => 'Sizning elektron pochta manzilingiz $2, $3 da tasdiqlangan.',
-'emailconfirmlink' => 'Sizning elektron pochta manzilingizni tasdiqlash',
+'emailauthenticated' => 'Elektron pochta manzilingiz $2, $3 da tasdiqlangan.',
+'emailconfirmlink' => 'Elektron pochta manzilingizni tasdiqlash',
'emaildisabled' => 'Bu sayt elektron pochta xatlarini yubora olmaydi.',
'accountcreated' => 'Hisob yozuvi yaratildi',
'login-abort-generic' => 'Tizimga kirishga mufavvaqiyatsiz urinish',
'loginlanguagelabel' => 'Til: $1',
+'pt-login' => 'Kirish',
+'pt-createaccount' => 'Hisob yaratish',
'pt-userlogout' => 'Chiqish',
# Change password dialog
'passwordreset-legend' => 'Maxfiy soʻzni yangilash',
'passwordreset-username' => 'Foydalanuvchi nomi:',
'passwordreset-domain' => 'Domen:',
-'passwordreset-email' => 'Elektron pochta manzili:',
+'passwordreset-email' => 'Elektron pochta manzilingiz:',
'passwordreset-emailelement' => "Foydalanuvchi ismi: $1
Vaqtinchalik maxfiy so'z: $2",
'recentchanges-label-minor' => 'Bu tahrir kichik deb belgilangan',
'recentchanges-label-bot' => 'Bu tahrirni bot bajargan',
'recentchanges-label-unpatrolled' => 'Bu tahrir hali tekshirilmagan',
-'recentchanges-label-plusminus' => 'vazni qanchaga oʻzgargani (bayt)',
+'recentchanges-label-plusminus' => 'Sahifa vazni qanchaga oʻzgargani (bayt)',
'recentchanges-legend-heading' => "'''Izoh:'''",
'recentchanges-legend-newpage' => '([[Special:NewPages|alohida roʻyxat]])',
'rcnotefrom' => 'Quyida <strong>$2</strong>dan boshlab boʻlgan oʻzgarishlar keltirilgan (<strong>$1</strong>dan koʻp boʻlmaganlari koʻrsatildi).',
# Special:Log
'specialloguserlabel' => 'Ijrochi:',
-'speciallogtitlelabel' => 'Moʻljal (foydalanuvchi yoki sahifa nomi):',
+'speciallogtitlelabel' => 'Moʻljal:',
'log' => 'Qaydlar',
'all-logs-page' => 'Barcha ochiq qaydlar',
-'alllogstext' => "{{SITENAME}}dagi barcha jurnallar roʻyxati.
+'alllogstext' => '{{SITENAME}}dagi barcha jurnallar roʻyxati.
Natijalarni jurnal nomi, foydalanuvchi nomi (harflar katta-kichikligi inobatga olinadi) yoki sahifa nomi boʻyicha saralashingiz mumkin.
-* Biror foydalanuvchi ''amalga oshirgan qaydni'', uning foydalanuvchi nomini \"Ijrochi\" oynasiga kiritib qidirish mumkin.
-* Biror foydalanuvchi yoki sahifaga ''nisbatan'' amalga oshirilgan qaydni, ularning nomini \"Moʻljal\" oynasiga kiritib qidirish mumkin.",
+* Biror foydalanuvchi amalga oshirgan qaydni topish uchun uning foydalanuvchi nomini „Ijrochi“ oynasiga kiriting.
+* Biror foydalanuvchi yoki sahifaga nisbatan amalga oshirilgan qaydni topish uchun ulardan birining nomini „Moʻljal“ oynasiga kiriting.',
'logempty' => 'Talabga mos yozuvlar mavjud emas.',
'log-title-wildcard' => 'Shu matndan boshlanuvchi sarlavhalarni izlash',
'revdelete-show-file-submit' => 'Sì',
'revdelete-selected' => "'''{{PLURAL:$2|Version selezionà|Versioni selezionà}} de [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Evento del registro selezionà|Eventi del registro selezionè}}:'''",
-'revdelete-text' => "'''Le revision e le azion scancelàe le restarà visibili ne la cronologia de la pagina, ma parte del testo contegnùo no'l sarà visìbile al publico.'''
-I altri aministradori de {{SITENAME}} i podarà vardar istesso i contenuti sconti e ripristinarli atraverso questa stessa interfacia, se no xe stà inpostà altre limitazion.",
'revdelete-confirm' => 'Par piaser, conferma che vol far sta azion, che te capissi le so conseguense, e che te sì drio operar secondo le [[{{MediaWiki:Policy-url}}|linee guida]].',
'revdelete-suppress-text' => "La sopression la se dovarìa doparar '''solo''' in sti casi qua:
'revdelete-show-file-submit' => 'Ka',
'revdelete-selected' => "'''{{PLURAL:$2|Valitud versii|Valitud versijad}} lehtpolišpäi [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Valitud kirjutez aigkirjas|Valitud kirjutesed aigkirjas}}:'''",
-'revdelete-text' => "'''Čutud versijad ozutadas lehtpolen istorijas da aigkirjoiš, no järgeližed lugijad ei voiškakoi nähta niiden südäimišton erasid paloid.'''
-Administratorad voiškatas lugeda peittud südäimištod da endištada sidä necen interfeisan kal't siloi, konz ei ole ližakaidendusid.",
'revdelete-legend' => 'Säta kaidendused',
'revdelete-hide-text' => 'Redakcijan tekst',
'revdelete-hide-image' => 'Peitta failan südäiolend',
'tog-ccmeonemails' => 'Gửi bản sao cho tôi khi gửi thư điện tử cho người khác',
'tog-diffonly' => 'Không hiển thị nội dung trang dưới phần so sánh phiên bản',
'tog-showhiddencats' => 'Hiển thị thể loại ẩn',
-'tog-noconvertlink' => 'Tắt liên kết chuyển đổi tựa đề',
'tog-norollbackdiff' => 'Không so sánh sau khi lùi sửa',
'tog-useeditwarning' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
'tog-prefershttps' => 'Luôn kết nối an toàn khi đăng nhập',
'revdelete-show-file-submit' => 'Có',
'revdelete-selected' => "'''{{PLURAL:$2|Phiên bản|Các phiên bản}} được chọn của [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Nhật trình đã chọn|Các nhật trình đã chọn}}:'''",
-'revdelete-text' => "'''Các phiên bản và sự kiện bị xóa sẽ vẫn xuất hiện trong lịch sử trang và nhật trình, nhưng mọi người sẽ không xem được một số phần của các nội dung đó.'''
-Các quản lý khác ở {{SITENAME}} vẫn có thể truy nhập vào nội dung ẩn và phục hồi lại bằng cách dùng giao diện này, trừ trường hợp thiết lập thêm một số hạn chế.",
'revdelete-confirm' => 'Xin hãy xác nhận rằng bạn có ý định xóa, nhận biết tầm quan trọng của việc này, và việc xóa tuân theo [[{{MediaWiki:Policy-url}}|quy định]].',
'revdelete-suppress-text' => "Việc ẩn giấu '''chỉ''' nên dùng trong các trường hợp sau:
* Thông tin có thể phỉ báng
'delete-warning-toobig' => 'Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.
Việc xóa các trang có thể làm tổn hại đến hoạt động của cơ sở dữ liệu {{SITENAME}};
hãy cẩn trọng khi thực hiện.',
-'deleting-backlinks-warning' => "'''Cảnh báo:''' Có trang khác liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
+'deleting-backlinks-warning' => "'''Cảnh báo:''' Có [[Special:WhatLinksHere/{{FULLPAGENAME}}|trang khác]] liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
# Rollback
'rollback' => 'Lùi tất cả sửa đổi',
'sp-contributions-blocked-notice' => 'Thành viên này hiện đang bị cấm sửa đổi. Nhật trình cấm gần nhất được ghi ở dưới để tiện theo dõi:',
'sp-contributions-blocked-notice-anon' => 'Địa chỉ IP này đang bị cấm. Hãy tham khảo mục mới nhất trong nhật trình cấm IP này:',
'sp-contributions-search' => 'Tìm kiếm đóng góp',
+'sp-contributions-suppresslog' => 'đóng góp đã bị đàn áp của thành viên',
'sp-contributions-username' => 'Địa chỉ IP hay tên thành viên:',
'sp-contributions-toponly' => 'Chỉ hiện các phiên bản mới nhất',
'sp-contributions-newonly' => 'Chỉ hiện các sửa đổi tạo trang',
'revdelete-show-file-submit' => 'Si',
'revdelete-selected' => "'''{{PLURAL:$2|Fomam|Fomams}} pevalöl pada: [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Lisedajenot|Lisedajenots}} pevälöl:'''",
-'revdelete-text' => "'''Revids pemoüköl nog opubons in padajenotem, ab ninäd (vödem) onsik no gebidons publüge.'''
-Ninäd peklänedöl at binon ye nog lügolovik guvanes votik vüka: {{SITENAME}}, kels kanons nog votükön ninädi peklänedöl u geükön padi medü fometem at (üf miedöfükams u neletians votik no lonöfons).",
'revdelete-legend' => 'Levälön miedükamis logova:',
'revdelete-hide-text' => 'Klänedön vödemi revida',
'revdelete-hide-image' => 'Klänedön ragivaninädi',
'disclaimerpage' => 'Project:Ceeltümin vassamizõõ',
'edithelp' => 'Muutuzavid',
'helppage' => 'Help:Sisälto',
-'mainpage' => 'Esicülci',
-'mainpage-description' => 'Esicülci',
+'mainpage' => 'Päälehto',
+'mainpage-description' => 'Päälehto',
'portal' => 'Foorum',
'portal-url' => 'Project:Foorum',
'privacy' => 'Salaštrahuituz',
'tooltip-search-go' => 'Mee cüľľelee, kummall on vakurat sesama nimi (kui eloz on)',
'tooltip-search-fulltext' => 'Etsi cülciltä sitä tekstiä',
'tooltip-p-logo' => 'Mee esicüľľelee',
-'tooltip-n-mainpage' => 'Mee esicüľľelee',
+'tooltip-n-mainpage' => 'Mee päälehole',
'tooltip-n-mainpage-description' => 'Mee esicüľľelee',
'tooltip-n-portal' => 'Juttua projektissa: Mitä tüü võittõ tehä, kuza levvette mitä',
'tooltip-n-currentevents' => 'Lugõ soobšeńńad nücüizess kõhtoiss',
'revdelete-nooldid-text' => 'Sa olõ-i valinuq kujjo vai kujjõ.',
'revdelete-selected' => "'''{{PLURAL:$2|Valit kujo|Validuq kujoq}} lehele [[:$1]]'''",
'logdelete-selected' => "'''{{PLURAL:$1|Valit muutminõ|Validuq muutmisõq}}:'''",
-'revdelete-text' => "'''Kistudõduq kujoq ommaq olõman lehe aoluun, a näide sissu saa-i avaligult nätäq.''' Seo viki tõõsõq kõrraldajaq saavaq taad käkitüt teksti lukõq ja taa tagasi avaligult nättäväs tetäq, ku olõ-i säet muid piirdmiisi.",
'revdelete-legend' => 'Nättävüse piirdmiseq',
'revdelete-hide-text' => 'Käkiq kujo sisu',
'revdelete-hide-image' => 'Käkiq teedüstü sissu',
'revdelete-show-file-submit' => 'Oyi',
'revdelete-selected' => "'''{{PLURAL:$2|Tchoezeye modêye|Tchoezeyès modêyes}} di [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Evenmint tchoezi|Evenmints tchoezis}} ezès djournås:'''",
-'revdelete-text' => "'''Les disfacés avenmints et modêyes vont continouwer d' aparexhe dins l' pådje di l' istwere, mins leu contnou n' serè nén veyåve do publik.'''
-
-Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l' rapexhî åd triviè di cisse minme eterface ci, a moens k' ene restriccion di pus ni soeye metowe en alaedje pås mwaisses-manaedjeus del waibe.",
'revdelete-legend' => 'Defini des restriccions sol voeyaedje',
'revdelete-hide-text' => "Catchî l' tecse del modêye",
'revdelete-hide-comment' => "Catchî l' comintaire di candjmint",
'revdelete-show-file-submit' => 'Waaw',
'revdelete-selected' => "'''{{PLURAL:$2|Sumbum '''$1''' mi falu|Sumbi '''$1''' yi falu}} :'''",
'logdelete-selected' => "'''{{PLURAL:$1|Xew-xewu yéenekaay bi falu|Xew-xewi yéenekaay yi falu}}:'''",
-'revdelete-text' => "'''Sumb yi nga far dañuy wéy di feeñ ci jaar-jaaru xët wi, waaye mbind yi ñu ëmb ñépp duñ leen man a gis.'''
-Yeneen yorkat yu {{SITENAME}} di nañ man a gis ëmbit yu laqu yi te loppanti leen ci benn jokkalekaay bi, su fekkee defuñu fi ay digal yu leen koy tere man a def.",
'revdelete-legend' => 'Taxawal ay digal ci sumb yi ñu far:',
'revdelete-hide-text' => 'Nëbb mbindum sumb bi',
'revdelete-hide-image' => 'Nëbb ëmbiitu dencukaay bi',
'revdelete-show-file-submit' => '是',
'revdelete-selected' => "'''选取'''[[:$1]]'''个$2趟修订:'''",
'logdelete-selected' => "'''选取'''$1'''个日志事件:'''",
-'revdelete-text' => "'''删脱个修订仍然将显示拉页面历史里向,不过渠拉个文本内容公众已经弗好访问。'''
-垃拉{{SITENAME}}个其他管理员将仍旧好访问隐藏个内容并通过与此相同个界面恢复删除,除非站点工作者添加了附加限制。",
'revdelete-confirm' => '假使侬想箇能介做个闲话,请确认侬已经清爽箇能介做个后果,外加箇个程序符合[[{{MediaWiki:Policy-url}}|政策]]。',
'revdelete-suppress-text' => "'''只有'''出现下头眼情况再应阻止访问:
* 弗适合个个人信息
'resetpass-recycled' => 'זײַט אזוי גוט שטעטל אירע פאסווארט צו עפעס אנדערש פונעם לויפיקן פאסווארט.',
'resetpass-temp-password' => 'צײַטווייליק פאַסווארט:',
'resetpass-abort-generic' => 'פאסווארט ענדערונג איז מבוטל געווארן דורך א פארברייטערונג.',
+'resetpass-expired' => 'אירע פאסווארט איז אויסגעגאנגען. זײַט אזוי גוט שטעלט א נײַ פאסווארט כדי ארײַנלאגירן.',
# Special:PasswordReset
'passwordreset' => 'צוריקשטעלן פאַסווארט',
'revdelete-show-file-submit' => 'יא',
'revdelete-selected' => "'''{{PLURAL:$2|אויסדערוויילטע ווערסיע| אויסדערוויילטע ווערסיעס}} פון [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:'''",
-'revdelete-text' => "'''אויסגעמעקטע רעוויזיעס און געשעענישן וועלן בלייבן אין דער בלאט היסטאריע און די לאגביכער, אבער טיילן פון זייער אינהאלט וועט ווערן אומגרייכלעך צום קהל. '''
-אנדערע סיסאפן אויף {{SITENAME}} וועלן נאך האבן צוטריט צום באהאלטענעם אינהאלט און קענען אים צוריקשטעלן דורך דעם זעלבן אייבערפלאך, אחוץ ווען מען שטעלט נאך באגרענעצונגען.",
'revdelete-confirm' => 'זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט [[{{MediaWiki:Policy-url}}|דער פאליסי]].',
'revdelete-suppress-text' => "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:
* אינפארמאציע וואס קען זיין מוציא שם רע
'search-file-match' => '(פאסט צו טעקע אינהאלט)',
'search-suggest' => 'צי האט איר געמיינט: $1',
'search-interwiki-caption' => 'שוועסטער פראיעקטן',
-'search-interwiki-default' => '$1 רעזולטאטן:',
+'search-interwiki-default' => 'רעזולטאטן פון $1:',
'search-interwiki-more' => '(נאך)',
'search-relatedarticle' => 'פארבינדן',
'searcheverything-enable' => 'זוכן אין אלע נאמענטיילן',
'rcnotefrom' => 'פֿאלגנד זענען די ענדערונגען זײַט <strong>$2</strong> (ביז <strong>$1</strong>).',
'rclistfrom' => 'װײַזן נײַע ענדערונגען פֿון $1',
'rcshowhideminor' => '$1 מינערדיגע ענדערונגען',
+'rcshowhideminor-show' => 'ווײַזן',
'rcshowhideminor-hide' => 'באהאלטן',
'rcshowhidebots' => '$1 ראבאטן',
'rcshowhidebots-show' => 'ווײַזן',
'protectedpages-cascade' => 'בלויז קאַסקאַדירנדיקע באַשיצונגען',
'protectedpages-noredirect' => 'פֿארהיילן ווייטערפֿירונגען',
'protectedpagesempty' => 'אצינד זענען קיין בלעטער נישט געשיצט מיט די דאזיגע פאַראַמעטערס.',
+'protectedpages-timestamp' => 'צײַטשטעמפל',
+'protectedpages-page' => 'בלאַט',
+'protectedpages-expiry' => 'גייט אויס',
+'protectedpages-reason' => 'אורזאַך',
+'protectedpages-unknown-timestamp' => 'אומבאַוואוסט',
'protectedtitles' => 'געשיצטע קעפלעך',
'protectedtitlesempty' => 'אצינד זענען קיין קעפלעך נישט באַשיצט מיט די דאזיגע פאַראַמעטערס.',
'listusers' => 'באַניצער ליסטע',
'delete-edit-reasonlist' => 'רעדאַקטירן די אויסמעקן סיבות',
'delete-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון {{SITENAME}}.',
'delete-warning-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.',
-'deleting-backlinks-warning' => "'''ווארענוג:''' אנדערע בלעטער פארבינדן צום בלאט אדער אריבערשליסן פונעם בלאט איר האלט ביי אויסמעקן.",
+'deleting-backlinks-warning' => "'''ווארענוג:'''
+[[Special:WhatLinksHere/{{FULLPAGENAME}}|אנדערע בלעטער]] פארבינדן צום בלאט אדער אריבערשליסן דעם בלאט איר האלט ביי אויסמעקן.",
# Rollback
'rollback' => 'צוריקדרייען רעדאַקטירונגען',
'revdelete-show-file-submit' => 'Bẹ́ẹ̀ni',
'revdelete-selected' => "'''{{PLURAL:$2|Àtúnyẹ̀wò síṣàyàn|Àwọn àtúnyẹ̀wò síṣàyàn}} fún [[:$1]]:'''",
'logdelete-selected' => "'''{{PLURAL:$1|Àkọọ́lẹ̀ ìṣẹ̀lẹ̀ síṣàyàn|Àwọn àkọọ́lẹ̀ ìṣẹ̀lẹ̀ síṣàyàn}}:'''",
-'revdelete-text' => "'''Àwọn àtúnyẹ̀wò onípíparẹ́ àti ìṣẹ̀lẹ̀ yíò sì tún hàn nínú ojúewé ìtàn àti àkọọ́lẹ̀, sùgbọ́n àwọn apá àkóónú wọn kò ní hàn jáde sí ìgboro'''
-Àwọn olùmójútó míràn lórí {{SITENAME}} yíò sí tún le wo àkóónú àbòmọ́lẹ̀ náà bẹ́ẹ̀sìni wọ́n le mú ìparẹ́ kúrò lórí ìfojúkojú yìí, àyàfi tí àwọn ìdíwọ́ míràn bá jẹ́ títòsílẹ̀.",
'revdelete-confirm' => 'Ẹ jọ̀wọ́ ẹ rídájú pé ohun tí ẹ fẹ́ ṣe nìyí, pé ohun tí yíò ṣẹlẹ̀ yé yín, bẹ́ẹ̀sìni pé ẹ̀ únṣe é lọ́nà tó bá [[{{MediaWiki:Policy-url}}|àdéhùn]] mu.',
'revdelete-suppress-text' => "Ìrẹ̀mọ́lẹ̀ gbọ́dọ̀ jẹ́ lílò fún àwọn ìṣẹ̀lẹ̀ ìsàlẹ̀ wọ̀nyí '''nìkan''':
*Ọ̀rọ̀ tó le fa ẹjọ́ wá
'tog-ccmeonemails' => '當我寄電郵畀其他人嗰陣寄返封副本畀我',
'tog-diffonly' => '響差異下面唔顯示頁面內容',
'tog-showhiddencats' => '顯示隱藏類',
-'tog-noconvertlink' => '唔轉連結標題',
'tog-norollbackdiff' => '進行反轉之後略過差異',
'tog-useeditwarning' => '當我離開未保存好嘅修改嗰陣警告我',
'tog-prefershttps' => '簽到後繼續用加密連線',
'login-throttled' => '你已經試咗太多次登入動作。請等多一陣再試過。',
'loginlanguagelabel' => '語言:$1',
'suspicious-userlogout' => '你去登出嘅要求已經拒絕咗,因為佢可能由壞咗嘅瀏覽器或者快取代理傳送。',
+'pt-createaccount' => '開戶口',
# Email sending
'php-mail-error-unknown' => '響 PHP 嘅 mail() 參數度出現咗未知嘅錯誤',
'revdelete-show-file-submit' => '係',
'revdelete-selected' => "'''揀[[:$1]]嘅$2次修訂:'''",
'logdelete-selected' => "'''揀[[:$1]]嘅日誌事件:'''",
-'revdelete-text' => "'''刪除咗嘅修訂係會仍然出現喺個頁面歷史以及日誌度,但係佢哋嘅文字內容係唔可以供公眾瀏覽。'''
-其他喺{{SITENAME}}嘅管理員仍然可以睇已經隱藏咗嘅內容,同埋可以透過同一個介面去反刪除佢,除非已經設定咗附加嘅限制。",
'revdelete-confirm' => '請確認你肯定去做嘅話,你就要明白到後果,同埋呢個程序符合[[{{MediaWiki:Policy-url}}|政策]]。',
'revdelete-suppress-text' => "壓制'''只'''應該響下面嘅情況之下進行:
* 唔合適嘅個人資料
* @ingroup Language
* @file
*
- * @author Cwek
- * @author Gakmo
* @author Kuailong
- * @author Li3939108
* @author PhiLiP
- * @author Qiyue2001
* @author Shizhao
- * @author StephDC
* @author Wong128hk
- * @author Xiaomingyan
*/
# Stub message file for converter code "zh"
);
$messages = array(
-# User preference toggles
-'tog-underline' => '鏈接下劃線:',
-'tog-hideminor' => '于最近更改列表中隱藏小編輯',
-'tog-showtoolbar' => '顯示編輯工具欄(需要 JavaScript)',
-'tog-editondblclick' => '双击以编辑页面',
-'tog-editsectiononrightclick' => '允许通过右击章节标题来编辑章节',
-'tog-rememberpassword' => '让浏览器记住我的登录(最大记录为$1天)',
-'tog-watchcreations' => '将我创建的页面和上传的文件添加到监视列表',
-'tog-watchdefault' => '将我编辑过的页面和上传的文件添加到监视列表',
-'tog-watchmoves' => '将我移动过的页面和上传的文件添加到监视列表',
-'tog-watchdeletion' => '将我删除的页面和文件添加到监视列表',
-'tog-minordefault' => '默认所有编辑为小编辑',
-'tog-previewontop' => '在编辑框前显示预览',
-'tog-previewonfirst' => '在第一次编辑时显示预览',
-'tog-enotifwatchlistpages' => '当在我监视列表的页面或文件发生更改时以电子邮件通知我',
-'tog-enotifusertalkpages' => '当我的用户讨论页发生更改时以电子邮件通知我',
-'tog-watchlisthideown' => '从监视列表隐藏我的编辑',
-'tog-watchlisthidebots' => '在监视列表中隐藏機器人用戶的修改',
-'tog-watchlisthideminor' => '在监视列表中隐藏小修改',
-'tog-norollbackdiff' => '進行回退後略過差異比較',
-
-# Font style option in Special:Preferences
-'editfont-monospace' => '等寬字體',
-
-# Categories related messages
-'category_header' => '分类“$1”中的页面',
-'subcategories' => '子分类',
-'hidden-category-category' => '隐藏的分类',
-
-'about' => '关于',
-'cancel' => '取消',
-'moredotdotdot' => '更多……',
-'mypage' => '页面',
-'mytalk' => '讨论',
-'anontalk' => '这个IP地址的讨论页',
-'navigation' => '导航',
-
-# Cologne Blue skin
-'qbbrowse' => '浏览',
-'qbedit' => '编辑',
-'qbpageoptions' => '该页',
-'faq' => '常见问题',
-'faqpage' => 'Project:常见问题',
-
-# Vector skin
-'vector-action-delete' => '删除',
-'vector-action-move' => '移动',
-'vector-view-create' => '创建',
-'vector-view-edit' => '编辑',
-'vector-view-history' => '查看历史',
-
-'newpage' => '最新页面',
-
-# Login and logout pages
-'userlogin-noaccount' => '没有账户?',
-'createacct-join' => '请在下面输入您的资料',
-
-# Edit pages
-'editing' => '编辑“$1”',
-
-# Miscellaneous special pages
-'newpages' => '最新页面',
-
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
-
/*
Short names for language variants used for language conversion links.
Variants for Chinese language
*/
'variantname-zh-hans' => '简体',
'variantname-zh-hant' => '繁體',
-'variantname-zh-cn' => '大陆简体',
-'variantname-zh-tw' => '台灣正體',
-'variantname-zh-hk' => '香港繁體',
-'variantname-zh-mo' => '澳門繁體',
-'variantname-zh-sg' => '新加坡简体',
-'variantname-zh-my' => '大马简体',
-'variantname-zh' => '不转换',
+'variantname-zh-cn' => '大陆简体',
+'variantname-zh-tw' => '台灣正體',
+'variantname-zh-hk' => '香港繁體',
+'variantname-zh-mo' => '澳門繁體',
+'variantname-zh-sg' => '新加坡简体',
+'variantname-zh-my' => '大马简体',
+'variantname-zh' => '不转换',
);
<?php
-/** Chinese (China) (中文(中国大陆))
+/** Chinese (China) (中文(中国大陆))
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
* @author Shizhao
* @author Wong128hk
* @author Xiaomingyan
- * @author 范
*/
# Inherit everything for now
# User preference toggles
'tog-norollbackdiff' => '进行回退后略过差异比较',
-'mytalk' => '讨论',
+'mytalk' => '我的讨论页',
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'portal' => '社区专页',
-# Login and logout pages
-'createacct-benefit-body1' => '{{PLURAL:$1|次编辑}}',
-'createacct-benefit-body2' => '
-{{PLURAL:$1|个页面}}',
-'createacct-benefit-body3' => '位最近{{PLURAL:$1|贡献者}}',
-
# Edit pages
-'editing' => '编辑“$1”',
-
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
+'editing' => '正在编辑 $1',
);
'tog-ccmeonemails' => '把我给其他用户发送的电子邮件的副本发送给我',
'tog-diffonly' => '不在差异下面显示页面内容',
'tog-showhiddencats' => '显示隐藏分类',
-'tog-noconvertlink' => '停用链接文字转换',
'tog-norollbackdiff' => '执行回退后不显示差异',
'tog-useeditwarning' => '当我离开有未保存更改的编辑页面时提醒我',
'tog-prefershttps' => '登录时始终使用安全连接',
'createacct-another-realname-tip' => '真实姓名是选填项目。
如果你选择提供它,它将会用于贡献署名。',
'pt-login' => '登录',
+'pt-login-button' => '登录',
'pt-createaccount' => '创建账户',
'pt-userlogout' => '退出',
'revdelete-show-file-submit' => '是',
'revdelete-selected' => "'''选取'''[[:$1]]'''的$2次修订:'''",
'logdelete-selected' => "'''{{PLURAL:$1|选取的日志项目}}:'''",
-'revdelete-text' => "'''删除的版本仍将显示在页面历史及日志中,但公众已不能访问其文本内容。'''
-在{{SITENAME}}的其他管理员将仍能访问隐藏的内容并通过该界面恢复删除的版本,除非进行了额外限制。",
'revdelete-confirm' => '请确认该操作,明白其后果,并确保该操作符合[[{{MediaWiki:Policy-url}}|方针]]。',
'revdelete-suppress-text' => "阻止应'''仅'''用于以下情况:
* 潜在的诽谤信息
'search-file-match' => '(匹配文件内容)',
'search-suggest' => '您是不是要找:$1',
'search-interwiki-caption' => '姊妹项目',
-'search-interwiki-default' => '$1项结果:',
+'search-interwiki-default' => '来自$1的结果:',
'search-interwiki-more' => '(更多)',
'search-relatedarticle' => '相关',
'searcheverything-enable' => '在所有名字空间中搜索',
'delete-edit-reasonlist' => '编辑删除原因',
'delete-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。',
'delete-warning-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。',
-'deleting-backlinks-warning' => "'''警告:'''有其他页面链接至或包含您要删除的页面。",
+'deleting-backlinks-warning' => "'''警告:'''有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。",
# Rollback
'rollback' => '回退编辑',
'tooltip-pt-watchlist' => '你正在监视更改的页面的列表',
'tooltip-pt-mycontris' => '你的贡献的列表',
'tooltip-pt-login' => '我们鼓励您登录,不过这不是强制的',
-'tooltip-pt-logout' => '退出登录',
+'tooltip-pt-logout' => '退出',
'tooltip-ca-talk' => '关于内容页面的讨论',
'tooltip-ca-edit' => '你可以编辑本页面。请在保存前使用预览按钮',
'tooltip-ca-addsection' => '开始新段落',
'tog-ccmeonemails' => '當我寄電子郵件給其他使用者時,也寄一份副本到我的信箱',
'tog-diffonly' => '比對版本差異時下面不顯示頁面內容',
'tog-showhiddencats' => '顯示隱藏分類',
-'tog-noconvertlink' => '不轉換連結標題',
'tog-norollbackdiff' => '回退後不做差異比對',
'tog-useeditwarning' => '當離開頁面時編輯仍未儲存,請提醒我',
'tog-prefershttps' => '登入時始終使用安全連線',
'createacct-another-realname-tip' => '真實姓名為選填。
如果您選擇提供,它將用於貢獻署名。',
'pt-login' => '登入',
+'pt-login-button' => '登入',
'pt-createaccount' => '建立帳戶',
'pt-userlogout' => '登出',
'revdelete-show-file-submit' => '是',
'revdelete-selected' => "'''選取[[:$1]]的$2次修訂:'''",
'logdelete-selected' => "'''{{PLURAL:$1|選取的日誌項目}}:'''",
-'revdelete-text' => "'''刪除的修訂仍將顯示在頁面歷史中, 但它們的文字內容已不能被公眾訪問。'''
-在{{SITENAME}}的其他管理員將仍能訪問隱藏的內容並透過與此相同的介面恢復刪除,除非網站工作者進行了一些附加的限制。",
'revdelete-confirm' => '請確認您肯定去做的話,您就要明白到後果,以及這個程序符合[[{{MediaWiki:Policy-url}}|政策]]。',
'revdelete-suppress-text' => "禁制應'''僅'''於下述情形之一時使用:
* 潛在誹謗性資訊
'search-file-match' => '(匹配檔案內容)',
'search-suggest' => '{{GENDER:|你|妳|你}}是不是要找:$1',
'search-interwiki-caption' => '姊妹計劃',
-'search-interwiki-default' => '$1 項結果:',
+'search-interwiki-default' => '來自$1之結果:',
'search-interwiki-more' => '(更多)',
'search-relatedarticle' => '相關',
'searcheverything-enable' => '在所有名字空間中搜尋',
'delete-edit-reasonlist' => '編輯刪除理由',
'delete-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。',
'delete-warning-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。',
-'deleting-backlinks-warning' => "'''警告:'''您要刪除的頁面有其他頁面連接至此或包含此頁面。",
+'deleting-backlinks-warning' => "'''警告:'''您要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連接至此或包含此頁面。",
# Rollback
'rollback' => '回退編輯',
<?php
-/** Chinese (Hong Kong) (中文(香港))
+/** Chinese (Hong Kong) (中文(香港))
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
* @ingroup Language
* @file
*
- * @author Gakmo
* @author Horacewai2
- * @author Justincheng12345
* @author Kayau
- * @author Liflon
* @author Mark85296341
- * @author Openerror
* @author PhiLiP
* @author Shizhao
- * @author Simon Shek
* @author Waihorace
* @author Wong128hk
* @author Yukiseaside
$messages = array(
# User preference toggles
-'tog-underline' => '連結加底線:',
-'tog-hideminor' => '近期變動中隱藏細微修改',
-'tog-hidepatrolled' => '於近期變動中隱藏巡查過的編輯',
-'tog-newpageshidepatrolled' => '於新頁面清單中隱藏巡查過的頁面',
-'tog-extendwatchlist' => '展開監視清單以顯示所有更改',
-'tog-usenewrc' => '在最近更改和監視列表中整合同一頁的修改',
-'tog-numberheadings' => '標題自動編號',
-'tog-showtoolbar' => '顯示編輯工具欄',
-'tog-editondblclick' => '雙擊編輯頁面',
-'tog-editsectiononrightclick' => '允許右擊標題編輯段落',
-'tog-rememberpassword' => '在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天|天}})',
-'tog-watchcreations' => '將我建立的頁面及檔案添加到我的監視列表中',
-'tog-watchdefault' => '將我更改的頁面及檔案添加到我的監視列表中',
-'tog-watchmoves' => '將我移動的頁面及檔案添加到我的監視列表',
-'tog-watchdeletion' => '將我刪除的頁面及檔案添加到我的監視列表',
-'tog-minordefault' => '預設將編輯設定為小編輯',
-'tog-previewontop' => '在編輯框上方顯示預覽',
-'tog-previewonfirst' => '首次編輯時顯示原文內容預覽',
-'tog-enotifwatchlistpages' => '當監視列表中的頁面或檔案改變時發電子郵件給我',
-'tog-enotifusertalkpages' => '當我的對話頁有更改時發電子郵件通知我',
-'tog-enotifminoredits' => '即使是頁面或檔案的小修改也向我發電子郵件',
-'tog-enotifrevealaddr' => '在通知電子郵件中顯示我的電子郵件位址',
-'tog-shownumberswatching' => '顯示監視用戶的數目',
-'tog-oldsig' => '原有簽名:',
-'tog-fancysig' => '將簽名以維基文字對待 (不產生自動連結)',
-'tog-uselivepreview' => '使用實時預覽(試驗中)',
-'tog-forceeditsummary' => '當沒有輸入摘要時提醒我',
-'tog-watchlisthideown' => '監視列表中隱藏我的編輯',
'tog-watchlisthidebots' => '監視列表中隱藏機械人的編輯',
-'tog-watchlisthideminor' => '監視列表中隱藏小修改',
-'tog-watchlisthideliu' => '監視列表中隱藏登入用戶',
-'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶',
-'tog-watchlisthidepatrolled' => '監視清單中隱藏已巡查的編輯',
-'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,寄一份複本到我的信箱。',
-'tog-diffonly' => '在比較兩個修訂版本差異時不顯示頁面內容',
-'tog-showhiddencats' => '顯示隱藏分類',
-'tog-norollbackdiff' => '回退後略過差異比較',
-'tog-useeditwarning' => '當離開頁面時編輯仍未儲存,請提醒我',
-'tog-prefershttps' => '登入時永遠使用安全連線',
-
-'underline-always' => '總是使用',
-'underline-never' => '從不使用',
-'underline-default' => '面板或瀏覽器預設',
-
-# Font style option in Special:Preferences
-'editfont-style' => '編輯區字型樣式:',
-'editfont-default' => '瀏覽器預設',
-'editfont-monospace' => '固定間距字型',
-'editfont-sansserif' => '無襯線字型',
-'editfont-serif' => '襯線字型',
# Dates
-'sunday' => '星期日',
-'monday' => '星期一',
-'tuesday' => '星期二',
-'wednesday' => '星期三',
-'thursday' => '星期四',
-'friday' => '星期五',
-'saturday' => '星期六',
-'sun' => '日',
-'mon' => '一',
-'tue' => '二',
-'wed' => '三',
-'thu' => '四',
-'fri' => '五',
-'sat' => '六',
-'january' => '一月',
-'february' => '二月',
-'march' => '三月',
-'april' => '四月',
-'may_long' => '五月',
-'june' => '六月',
-'july' => '七月',
-'august' => '八月',
+'january' => '一月',
+'february' => '二月',
+'march' => '三月',
+'april' => '四月',
+'may_long' => '五月',
+'june' => '六月',
+'july' => '七月',
+'august' => '八月',
'september' => '九月',
-'october' => '十月',
-'november' => '十一月',
-'december' => '十二月',
-'january-gen' => '一月',
-'february-gen' => '二月',
-'march-gen' => '三月',
-'april-gen' => '四月',
-'may-gen' => '五月',
-'june-gen' => '六月',
-'july-gen' => '七月',
-'august-gen' => '八月',
-'september-gen' => '九月',
-'october-gen' => '十月',
-'november-gen' => '十一月',
-'december-gen' => '十二月',
-'jan' => '1月',
-'feb' => '2月',
-'mar' => '3月',
-'apr' => '4月',
-'may' => '5月',
-'jun' => '6月',
-'jul' => '7月',
-'aug' => '8月',
-'sep' => '9月',
-'oct' => '10月',
-'nov' => '11月',
-'dec' => '12月',
-'january-date' => '1月$1日',
-'february-date' => '2月$1日',
-'march-date' => '三月$1日',
-'april-date' => '四月$1日',
-'may-date' => '五月$1日',
-'june-date' => '六月$1日',
-'july-date' => '七月$1日',
-'august-date' => '八月$1日',
-'september-date' => '九月$1日',
-'october-date' => '十月$1日',
-'november-date' => '十一月$1日',
-'december-date' => '十二月$1日',
-
-# Categories related messages
-'pagecategories' => '$1個分類',
-'category_header' => '分類中的頁面「$1」',
-'subcategories' => '子分類',
-'category-media-header' => '「$1」分類中的媒體',
-'category-empty' => "''這個分類中尚未包含任何頁面或媒體。''",
-'hidden-categories' => '$1個隱藏分類',
-'hidden-category-category' => '隱藏分類',
-'category-subcat-count' => '{{PLURAL:$2|這個分類中只有以下的子分類。|這個分類中有以下的$1個子分類,共有$2個子分類。}}',
-'category-subcat-count-limited' => '這個分類下有$1個子分類。',
-'category-article-count' => '{{PLURAL:$2|這個分類中只有以下的頁面。|這個分類中有以下的$1個頁面,共有$2個頁面。}}',
-'category-article-count-limited' => '這個分類下有$1個頁面。',
-'category-file-count' => '{{PLURAL:$2|這個分類中只有以下的檔案。|這個分類中有以下的$1個檔案,共有$2個檔案。}}',
-'category-file-count-limited' => '這個分類下有$1個檔案。',
-'listingcontinuesabbrev' => '續',
-'index-category' => '已索引的頁面',
-'noindex-category' => '未索引的頁面',
-'broken-file-category' => '包含損壞檔案連結的頁面',
+'october' => '十月',
+'november' => '十一月',
+'december' => '十二月',
-'about' => '關於',
-'article' => '內容頁面',
-'newwindow' => '(於新視窗開啟)',
-'cancel' => '取消',
-'moredotdotdot' => '更多...',
-'morenotlisted' => '這不是完整的列表。',
-'mytalk' => '討論頁',
-'anontalk' => '此IP位址的討論頁',
-'navigation' => '導航',
-'and' => '和',
+'mytalk' => '我的討論頁',
-# Cologne Blue skin
-'qbfind' => '搜尋',
-'qbbrowse' => '瀏覽',
-'qbedit' => '編輯',
-'qbpageoptions' => '本頁',
-'qbmyoptions' => '我的用戶頁面',
-'faq' => '常見問題',
-'faqpage' => 'Project:常見問題',
-
-# Vector skin
-'vector-action-addsection' => '新增主題',
-'vector-action-delete' => '刪除',
-'vector-action-undelete' => '恢復',
-'vector-action-unprotect' => '修改保護狀態',
-'vector-view-history' => '歷史',
-'vector-view-view' => '閱覽',
-'vector-view-viewsource' => '查看原始碼',
-'variants' => '變體',
-
-'navigation-heading' => '導航菜單',
-'returnto' => '回到$1。',
-'tagline' => '從 {{SITENAME}}',
-'help' => '幫助',
-'search' => '搜尋',
-'searcharticle' => '提交',
-'updatedmarker' => '自從我上次查看後已更新',
+'tagline' => '從 {{SITENAME}}',
+'search' => '搜尋',
'printableversion' => '可打印版',
-'permalink' => '永久連接',
-'print' => '打印',
-'undeletethispage' => '恢復本頁',
-'undelete_short' => '恢復{{PLURAL:$1|1次編輯|$1次編輯}}',
-'viewdeleted_short' => '查看{{PLURAL:$1|1次已刪的編輯|$1次已刪的編輯}}',
-'protect_change' => '修改',
-'unprotect' => '修改保護狀態',
-'unprotectthispage' => '修改本頁的保護狀態',
-'talkpage' => '對本頁進行討論',
-'talkpagelinktext' => '討論頁',
-'specialpage' => '特殊頁面',
-'postcomment' => '新章節',
-'articlepage' => '查看內容頁面',
-'views' => '外觀',
-'userpage' => '查看用戶頁',
-'projectpage' => '查看計劃頁面',
-'imagepage' => '查看檔案頁面',
-'mediawikipage' => '查看訊息頁面',
-'templatepage' => '查看模板頁',
-'viewhelppage' => '查看幫助頁面',
-'categorypage' => '查看分類頁面',
-'viewtalkpage' => '查看討論頁',
-'redirectpagesub' => '重定向頁',
-'lastmodifiedat' => '本頁最後更改於$1$2。',
-'viewcount' => '本頁的瀏覽次數為{{PLURAL:$1|1次|$1次}}。',
-'protectedpage' => '受保護的頁面',
-'jumpto' => '跳到:',
-'jumptonavigation' => '導航',
-'jumptosearch' => '搜尋',
-'view-pool-error' => '抱歉,伺服器現時超出負荷。
-有太多用戶想要查看本頁。
-請先稍候片刻才再嘗試查看本頁。
-
-$1',
-'pool-timeout' => '等待鎖時超出了時限',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '關於{{SITENAME}}',
-'aboutpage' => 'Project:關於我們',
-'copyright' => '除非另外註明,否則內容以$1提供。',
-'copyrightpage' => '{{ns:project}}:版權',
-'edithelp' => '編輯方面的幫助',
-'mainpage' => '主頁',
-'mainpage-description' => '主頁',
-'portal' => '社群區入口',
-'portal-url' => 'Project:社群入口',
-'privacy' => '私隱政策',
+'permalink' => '永久連接',
+'print' => '打印',
+'specialpage' => '特殊頁面',
+'jumpto' => '跳到:',
+'jumptosearch' => '搜尋',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutpage' => 'Project:關於我們',
+'privacy' => '私隱政策',
'privacypage' => 'Project:私隱政策',
-'badaccess-group0' => '您無權執行您所提出的行動。',
-'badaccess-groups' => '您所提出的行動只有{{PLURAL:$2|此群組|以下群組之一}}才可執行:$1。',
-
-'versionrequired' => '需要$1版本的MediaWiki',
-'versionrequiredtext' => '要使用本頁的話需要$1版本的MediaWiki。
-請見[[Special:版本|版本頁面]]。',
-
-'retrievedfrom' => '擷取自$1',
'red-link-title' => '$1 (頁面不存在)',
# Short words for each namespace, by default used in the namespace tab in monobook
# Login and logout pages
'nav-login-createaccount' => '登入/創造帳戶',
-'userlogin' => '登入/創造帳戶',
+'userlogin' => '登入/創造帳戶',
# Edit pages
-'editing' => '正在編輯「$1」',
+'editing' => '正在編輯 $1',
# Revision deletion
-'rev-deleted-comment' => '(註釋已除)',
-'rev-deleted-event' => '(日誌已除)',
+'rev-deleted-comment' => '(註釋已除)',
+'rev-deleted-event' => '(日誌已除)',
'revdelete-suppress-text' => "壓制'''只'''應用於以下的情況:
* 不合適的個人資料
*: ''地址、電話號碼、身份證號碼等。''",
# Diffs
'editundo' => '撤銷',
+# Search results
+'search-mwsuggest-disabled' => '沒有意見',
+
# Preferences page
'prefs-help-gender' => '可選:用於軟件中的性別指定。此項資料將會被公開。',
# Recent changes
'recentchanges-label-bot' => '這次編輯是由機械人進行',
-'rcshowhidebots' => '$1機械人的編輯',
+'rcshowhidebots' => '$1機械人的編輯',
# Special:ActiveUsers
'activeusers-hidebots' => '隱藏機械人',
'contribslink' => '貢獻',
# Tooltip help for the actions
-'tooltip-search' => '搜尋 {{SITENAME}}',
-'tooltip-search-go' => '若是真有其頁,則進入相同名字的頁面',
-'tooltip-search-fulltext' => '在此頁面內搜尋此文字',
-'tooltip-n-mainpage' => '回到首頁',
+'tooltip-search' => '搜尋 {{SITENAME}}',
+'tooltip-search-go' => '若是真有其頁,則進入相同名字的頁面',
+'tooltip-search-fulltext' => '在此頁面內搜尋此文字',
+'tooltip-n-mainpage' => '回到首頁',
'tooltip-n-mainpage-description' => '回到首頁',
-'tooltip-n-randompage' => '跳到一個隨機抽取的頁面',
-'tooltip-t-print' => '這個頁面的可打印版本',
-'interlanguage-link-title' => '$1 – $2',
+'tooltip-n-randompage' => '跳到一個隨機抽取的頁面',
+'tooltip-t-print' => '這個頁面的可打印版本',
# Special:NewFiles
'showhidebots' => '($1機械人)',
-/*
-Short names for language variants used for language conversion links.
-Variants for Chinese language
-*/
-'variantname-zh-hant' => '繁體中文',
-
# Special:SpecialPages
'specialpages' => '特殊頁面',
<?php
-/** 中文(澳門) (中文(澳門))
+/** Chinese (Macau) (中文(澳門))
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
# Inherit everything for now
$fallback = 'zh-hk, zh-hant, zh-hans';
-
-$messages = array(
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
-
-);
<?php
-/** Chinese (Singapore) (中文(新加坡))
+/** Chinese (Singapore) (中文(新加坡))
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
* @ingroup Language
* @file
*
- * @author Liuxinyu970226
* @author PhiLiP
* @author Shizhao
* @author Wong128hk
- * @author Xiaomingyan
*/
# Inherit everything for now
# User preference toggles
'tog-norollbackdiff' => '进行回退后略过差异比较',
-'talkpagelinktext' => '讨论页',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'portal' => '社区入口',
# Edit pages
-'editing' => '编辑“$1”',
-
-# Tooltip help for the actions
-'interlanguage-link-title' => '$1 – $2',
+'editing' => '正在编辑 $1',
);
<?php
-/** Chinese (Taiwan) (中文(台灣))
+/** Chinese (Taiwan) (中文(台灣))
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
* @author Alexsh
* @author Andrew971218
* @author BobChao
- * @author Danny0838
* @author Ianbu
* @author Jidanni
* @author Mark85296341
* @author PhiLiP
* @author Roc michael
* @author Shizhao
- * @author Simon Shek
* @author Urhixidur
- * @author Waihorace
* @author Wong128hk
- * @author Xiaomingyan
* @author Zerng07
* @author לערי ריינהארט
*/
$messages = array(
# User preference toggles
-'tog-underline' => '連結標注底線',
-'tog-hideminor' => '近期變動中隱藏小修改',
-'tog-usenewrc' => '使用強化的近期變動 (需要JavaScript)',
-'tog-numberheadings' => '自動編號標題',
-'tog-showtoolbar' => '顯示編輯工具欄 (需要JavaScript)',
-'tog-watchcreations' => '將我建立的頁面加進我的監視列表',
-'tog-watchdefault' => '將我更改的頁面添加到我的監視列表中',
-'tog-minordefault' => '預設將編輯設定為細微修改',
+'tog-underline' => '連結標注底線',
+'tog-justify' => '段落對齊',
+'tog-hideminor' => '近期變動中隱藏細微修改',
+'tog-usenewrc' => '使用強化的近期變動 (需要JavaScript)',
+'tog-numberheadings' => '自動編號標題',
+'tog-showtoolbar' => '顯示編輯工具欄 (需要JavaScript)',
+'tog-watchcreations' => '將我建立的頁面加進我的監視列表',
+'tog-watchdefault' => '將我更改的頁面添加到我的監視列表中',
+'tog-minordefault' => '預設將編輯設定為細微修改',
'tog-enotifwatchlistpages' => '當我監視的頁面改變時發電子郵件給我',
-'tog-enotifusertalkpages' => '當我的對話頁有更動時發電子郵件通知我',
-'tog-shownumberswatching' => '顯示監視數目',
-'tog-uselivepreview' => '使用即時預覽 (JavaScript) (試驗中)',
-'tog-watchlisthideminor' => '監視列表中隱藏細微修改',
-'tog-ccmeonemails' => '當我寄電子郵件給其他使用者時,也寄一份複本到我的信箱。',
+'tog-enotifusertalkpages' => '當我的對話頁有更動時發電子郵件通知我',
+'tog-shownumberswatching' => '顯示監視數目',
+'tog-uselivepreview' => '使用即時預覽 (JavaScript) (試驗中)',
+'tog-watchlisthideminor' => '監視列表中隱藏細微修改',
+'tog-ccmeonemails' => '當我寄電子郵件給其他使用者時,也寄一份複本到我的信箱。',
# Dates
-'saturday' => '星期六',
-'sun' => '日',
-'mon' => '一',
-'tue' => '二',
-'wed' => '三',
-'thu' => '四',
-'fri' => '五',
-'january' => '一月',
-'february' => '二月',
-'march' => '三月',
-'april' => '四月',
-'may_long' => '五月',
-'june' => '六月',
-'july' => '七月',
-'august' => '八月',
-'september' => '九月',
-'october' => '十月',
-'november' => '十一月',
-'december' => '十二月',
-'january-gen' => '一月',
-'february-gen' => '二月',
-'march-gen' => '三月',
-'april-gen' => '四月',
-'may-gen' => '五月',
-'june-gen' => '六月',
-'july-gen' => '七月',
-'august-gen' => '八月',
+'saturday' => '星期六',
+'sun' => '日',
+'mon' => '一',
+'tue' => '二',
+'wed' => '三',
+'thu' => '四',
+'fri' => '五',
+'january' => '一月',
+'february' => '二月',
+'march' => '三月',
+'april' => '四月',
+'may_long' => '五月',
+'june' => '六月',
+'july' => '七月',
+'august' => '八月',
+'september' => '九月',
+'october' => '十月',
+'november' => '十一月',
+'december' => '十二月',
+'january-gen' => '一月',
+'february-gen' => '二月',
+'march-gen' => '三月',
+'april-gen' => '四月',
+'may-gen' => '五月',
+'june-gen' => '六月',
+'july-gen' => '七月',
+'august-gen' => '八月',
'september-gen' => '九月',
-'october-gen' => '十月',
-'november-gen' => '十一月',
-'december-gen' => '十二月',
-'jan' => '1月',
-'feb' => '2月',
-'mar' => '3月',
-'apr' => '4月',
-'may' => '5月',
-'jun' => '6月',
-'jul' => '7月',
-'aug' => '8月',
-'sep' => '9月',
-'oct' => '10月',
-'nov' => '11月',
-'dec' => '12月',
+'october-gen' => '十月',
+'november-gen' => '十一月',
+'december-gen' => '十二月',
+'jan' => '1月',
+'feb' => '2月',
+'mar' => '3月',
+'apr' => '4月',
+'may' => '5月',
+'jun' => '6月',
+'jul' => '7月',
+'aug' => '8月',
+'sep' => '9月',
+'oct' => '10月',
+'nov' => '11月',
+'dec' => '12月',
# Categories related messages
'subcategories' => '子分類',
# Vector skin
'vector-action-protect' => '保護',
-'vector-view-create' => '建立',
-'vector-view-view' => '閱讀',
-
-'help' => '使用說明',
-'search' => '搜尋',
-'searchbutton' => '搜尋',
-'history' => '修訂記錄',
-'history_short' => '歷史',
-'edit' => '編輯',
-'create' => '建立',
-'delete' => '刪除',
+'vector-view-create' => '建立',
+'vector-view-view' => '閱讀',
+
+'help' => '使用說明',
+'search' => '搜尋',
+'searchbutton' => '搜尋',
+'history' => '修訂記錄',
+'history_short' => '歷史',
+'edit' => '編輯',
+'create' => '建立',
+'delete' => '刪除',
'protect_change' => '更改',
-'postcomment' => '新段落',
-'toolbox' => '工具箱',
-'userpage' => '檢視使用者頁面',
-'projectpage' => '檢視計畫頁面',
+'postcomment' => '新段落',
+'toolbox' => '工具箱',
+'userpage' => '檢視使用者頁面',
+'projectpage' => '檢視計畫頁面',
'lastmodifiedat' => '本頁最後更動時間在 $1 $2。',
-'jumptosearch' => '搜尋',
+'jumptosearch' => '搜尋',
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => '關於 {{SITENAME}}',
-'copyright' => '本站的文字內容除另有聲明外,全部以 $1 條款授權使用。',
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite' => '關於 {{SITENAME}}',
+'copyright' => '本站的文字內容除另有聲明外,全部以 $1 條款授權使用。',
'disclaimers' => '免責聲明',
-'edithelp' => '編輯說明',
-'mainpage' => '首頁',
-'portal' => '社群入口',
-'portal-url' => 'Project:社群入口',
+'edithelp' => '編輯說明',
+'mainpage' => '首頁',
+'portal' => '社群入口',
+'portal-url' => 'Project:社群入口',
'badaccess-groups' => '您剛才的請求只有{{PLURAL:$2|這個|這些}}使用者組的使用者才能使用: $1',
-'editold' => '編輯',
-'editsectionhint' => 'ç·¨è¼¯ç« ç¯\80:$1',
-'showtoc' => '顯示',
-'hidetoc' => '隱藏',
-'thisisdeleted' => '檢視或復原$1?',
-'site-rss-feed' => '訂閱 $1 的 RSS 資料來源',
-'site-atom-feed' => '訂閱 $1 的 Atom 資料來源',
-'page-rss-feed' => '訂閱「$1」的 RSS 資料來源',
-'page-atom-feed' => '訂閱「$1」的 Atom 資料來源',
-'red-link-title' => '$1 (頁面不存在)',
+'editold' => '編輯',
+'editsectionhint' => 'ç¼\96è¾\91段è\90½:$1',
+'showtoc' => '顯示',
+'hidetoc' => '隱藏',
+'thisisdeleted' => '檢視或復原$1?',
+'site-rss-feed' => '訂閱 $1 的 RSS 資料來源',
+'site-atom-feed' => '訂閱 $1 的 Atom 資料來源',
+'page-rss-feed' => '訂閱「$1」的 RSS 資料來源',
+'page-atom-feed' => '訂閱「$1」的 Atom 資料來源',
+'red-link-title' => '$1 (頁面不存在)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => '頁面',
-'nstab-user' => '使用者頁面',
-'nstab-special' => '特殊頁面',
-'nstab-project' => '計畫頁面',
+'nstab-main' => '頁面',
+'nstab-user' => '使用者頁面',
+'nstab-special' => '特殊頁面',
+'nstab-project' => '計畫頁面',
'nstab-mediawiki' => '介面',
-'nstab-help' => '說明頁面',
+'nstab-help' => '說明頁面',
# Main script and global functions
'nosuchactiontext' => '該URL所指定的動作無效。
這也可能是{{SITENAME}}所使用的軟件出現了錯誤。',
# General errors
-'readonlytext' => '資料庫目前禁止輸入新內容及更改,
+'readonlytext' => '資料庫目前禁止輸入新內容及更改,
這很可能是由於資料庫正在維修,之後即可復原。
管理員有如下解釋:
<p>$1</p>',
-'cannotdelete' => '無法刪除選定的頁面或圖片(它可能已經被其他人刪除了)。',
+'cannotdelete' => '無法刪除選定的頁面或圖片(它可能已經被其他人刪除了)。',
'actionthrottledtext' => '系統因為反垃圾編輯的考量,禁止如此頻繁地修改資料,請數分鐘後再嘗試。',
-'viewsourcetext' => '你可以檢視並複製本頁面的原始碼。',
-'editinginterface' => "'''警告:''' 您正在編輯的頁面是正用在軟體上的介面文字。改變此頁將影響其他用戶的介面外觀。如要翻譯,請考慮使用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net],一個用來為MediaWiki軟體本地化的計畫。",
+'viewsourcetext' => '你可以檢視並複製本頁面的原始碼。',
+'editinginterface' => "'''警告:''' 您正在編輯的頁面是正用在軟體上的介面文字。改變此頁將影響其他用戶的介面外觀。如要翻譯,請考慮使用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net],一個用來為MediaWiki軟體本地化的計畫。",
'ns-specialprotected' => '在{{ns:special}}名字空間中的頁面是不可以編輯的。',
# Login and logout pages
-'logouttext' => "您現在已經登出。
-
-您可以以匿名方式繼續使用{{SITENAME}},或者以相同或不同用戶身份<span class='plainlinks'>[$1 登入]</span>。
-請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器快取。",
-'yourname' => '您的使用者名稱:',
-'yourpassword' => '密碼:',
-'login' => '登入',
-'nav-login-createaccount' => '登入/建立新帳號',
-'userlogin' => '登入/建立新帳號',
-'logout' => '登出',
-'userlogout' => '登出',
-'nologin' => '您還沒有帳號嗎?$1。',
-'nologinlink' => '建立新帳號',
-'createaccount' => '建立新帳號',
-'gotaccount' => '已經擁有帳號?$1。',
-'badretype' => '你所輸入的密碼並不相同。',
-'userexists' => '您所輸入的使用者名稱已經存在,請另選一個名稱。',
-'nocookiesnew' => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
-'nocookieslogin' => '本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
-'noname' => '你沒有輸入一個有效的使用者帳號。',
-'loginsuccess' => '你現在以 "$1"的身份登入{{SITENAME}}。',
-'nosuchuser' => '找不到使用者 "$1"。
+'logouttext' => '您現在已經登出。
+
+您可以以匿名方式繼續使用{{SITENAME}},或者以相同或不同用戶身份[[Special:UserLogin|登入]]。
+請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器快取。',
+'welcomecreation' => '== 歡迎,$1! ==
+您的帳號已經建立。
+請不要忘記設定[[Special:Preferences|{{SITENAME}}的個人參數]]。',
+'yourname' => '您的使用者名:',
+'yourpassword' => '密碼:',
+'login' => '登入',
+'nav-login-createaccount' => '登入/建立新帳號',
+'userlogin' => '登入/建立新帳號',
+'logout' => '登出',
+'userlogout' => '登出',
+'nologin' => '您還沒有帳號嗎?$1。',
+'nologinlink' => '建立新帳號',
+'createaccount' => '建立新帳號',
+'gotaccount' => '已經擁有帳號?$1。',
+'badretype' => '你所輸入的密碼並不相同。',
+'userexists' => '您所輸入的使用者名稱已經存在,請另選一個名稱。',
+'nocookiesnew' => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
+'nocookieslogin' => '本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
+'noname' => '你沒有輸入一個有效的使用者帳號。',
+'loginsuccess' => '你現在以 "$1"的身份登入{{SITENAME}}。',
+'nosuchuser' => '找不到使用者 "$1"。
檢查您的拼寫,或者用下面的表格[[Special:UserLogin/signup|建立一個新帳號]]。',
-'nosuchusershort' => '沒有一個名為「$1」的使用者。請檢查您輸入的文字是否有錯誤。',
-'nouserspecified' => '你需要指定一個使用者帳號。',
-'passwordtooshort' => '您的密碼不正確或太短,不能少於$1個字元,而且必須跟使用者名不同。',
-'passwordremindertitle' => '{{SITENAME}}密碼提醒',
-'passwordremindertext' => '有人(來自IP位址$1,可能是您)已請求{{SITENAME}}的新密碼 ($4)。
+'nosuchusershort' => '沒有一個名為「$1」的使用者。請檢查您輸入的文字是否有錯誤。',
+'nouserspecified' => '你需要指定一個使用者帳號。',
+'passwordtooshort' => '您的密碼不正確或太短,不能少於$1個字元,而且必須跟使用者名不同。',
+'passwordremindertitle' => '{{SITENAME}}密碼提醒',
+'passwordremindertext' => '有人(來自IP位址$1,可能是您)已請求{{SITENAME}}的新密碼 ($4)。
用戶"$2"現在已設定新臨時密碼"$3"。
如果這個動作是您所指示的,您需要立即登入並選擇一個新的密碼。
您的臨時密碼會在{{PLURAL:$5|一|$5}}天內過期。
如果是其他人發出了該請求,或者您已經想起了您的密碼而且並不打算換掉,
您可以忽略此消息並繼續使用您的舊密碼。',
-'noemail' => '使用者"$1"沒有登記電子郵件地址。',
-'passwordsent' => '使用者"$1"的新密碼已經寄往所登記的電子郵件地址。
+'noemail' => '使用者"$1"沒有登記電子郵件地址。',
+'passwordsent' => '使用者"$1"的新密碼已經寄往所登記的電子郵件地址。
請在收到後再登入。',
-'blocked-mailpassword' => '由於這個使用者被封鎖,我們暫時禁止您請求申請新密碼。造成不便敬請見諒',
-'eauthentsent' => '一封確認信已經發送到所示的地址。在發送其它郵件到此帳號前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。',
+'blocked-mailpassword' => '由於這個使用者被封鎖,我們暫時禁止您請求申請新密碼。造成不便敬請見諒',
+'eauthentsent' => '一封確認信已經發送到所示的地址。在發送其它郵件到此帳號前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。',
'acct_creation_throttle_hit' => '抱歉,使用您的IP位址拜訪此wiki網站的訪客已經在昨天創建了$1個帳號,達到了該時段的上限,所以目前使用這個IP位址的訪客不能再繼續創建帳號。',
-'emailauthenticated' => '您的電子郵件地址已經於$2 $3確認有效。',
-'emailnotauthenticated' => '您的電子郵件地址<strong>還沒被認證</strong>。以下功能將不會發送任何郵件。',
-'noemailprefs' => '指定一個電子郵件地址以使用此功能',
-'emailconfirmlink' => '確認您的電子郵件地址',
-'invalidemailaddress' => '電子郵件地址格式不正確,請輸入正確的電子郵件位址或清空該輸入框。',
-'accountcreated' => '已建立帳號',
-'accountcreatedtext' => '$1的帳號已經被建立。',
-'createaccount-title' => '在{{SITENAME}}中建立新帳號',
-'createaccount-text' => '有人在{{SITENAME}}中為 $2 建立了一個新帳號($4)。 "$2" 的密碼是 "$3" 。您應該立即登入並更改密碼。
+'emailauthenticated' => '您的電子郵件地址已經於$2 $3確認有效。',
+'emailnotauthenticated' => '您的電子郵件地址<strong>還沒被認證</strong>。以下功能將不會發送任何郵件。',
+'noemailprefs' => '指定一個電子郵件地址以使用此功能',
+'emailconfirmlink' => '確認您的電子郵件地址',
+'invalidemailaddress' => '電子郵件地址格式不正確,請輸入正確的電子郵件位址或清空該輸入框。',
+'accountcreated' => '已建立帳號',
+'accountcreatedtext' => '$1的帳號已經被建立。',
+'createaccount-title' => '在{{SITENAME}}中建立新帳號',
+'createaccount-text' => '有人在{{SITENAME}}中為 $2 建立了一個新帳號($4)。 "$2" 的密碼是 "$3" 。您應該立即登入並更改密碼。
如果該帳號建立錯誤的話,您可以忽略此訊息。',
# Change password dialog
-'resetpass_announce' => '您是透過臨時發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:',
-'resetpass_header' => '更換帳號密碼',
-'oldpassword' => '舊密碼',
-'newpassword' => '新密碼',
-'changepassword-success' => '您的密碼已經被成功更改﹗現下正為您登入...',
+'resetpass' => '更換密碼',
+'resetpass_announce' => '您是透過臨時發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:',
+'resetpass_header' => '更換帳號密碼',
+'oldpassword' => '舊密碼',
+'newpassword' => '新密碼',
+'resetpass_success' => '您的密碼已經被成功更改﹗現下正為您登入...',
'resetpass_forbidden' => '無法更改密碼',
# Edit page toolbar
'media_tip' => '媒體檔案連結',
# Edit pages
-'summary' => '摘要',
-'minoredit' => '這是一個細微修改',
-'savearticle' => '儲存頁面',
-'blockedtitle' => '使用者被封鎖',
-'confirmedittext' => '在編輯此頁之前您必須確認您的電子郵件地址。請透過[[Special:Preferences|偏好設定]]設定並驗證您的電子郵件地址。',
-'accmailtext' => "'[[User talk:$1|$1]]'的隨機產生密碼已經寄到$2。
+'summary' => '摘要',
+'minoredit' => '這是一個細微修改',
+'savearticle' => '儲存頁面',
+'blockedtitle' => '使用者被封鎖',
+'confirmedittext' => '在編輯此頁之前您必須確認您的電子郵件地址。請透過[[Special:Preferences|偏好設定]]設定並驗證您的電子郵件地址。',
+'accmailtext' => "'[[User talk:$1|$1]]'的隨機產生密碼已經寄到$2。
這個新帳號的密碼可以在登入後的''[[Special:ChangePassword|更改密碼]]''頁面中更改。",
-'newarticletext' => '您進入了一個尚未建立的頁面。
+'newarticletext' => '您進入了一個尚未建立的頁面。
要建立該頁面,請在下面的編輯框中輸入內容(詳情參見[[{{MediaWiki:Helppage}}|說明]])。
如果您是不小心來到此頁面,直接點擊您瀏覽器中的「返回」按鈕返回。',
-'anontalkpagetext' => "---- ''這是一個還未建立帳號的匿名使用者的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名使用者共享。如果您是一名匿名使用者並認為本頁上的評語與您無關,請[[Special:UserLogin|建立新帳號或登入]]以避免在未來於其他匿名使用者混淆。''",
-'noarticletext' => '此頁目前沒有內容,您可以在其它頁[[Special:Search/{{PAGENAME}}|搜索此頁標題]],
+'anontalkpagetext' => "---- ''這是一個還未建立帳號的匿名使用者的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名使用者共享。如果您是一名匿名使用者並認為本頁上的評語與您無關,請[[Special:UserLogin|建立新帳號或登入]]以避免在未來於其他匿名使用者混淆。''",
+'noarticletext' => '此頁目前沒有內容,您可以在其它頁[[Special:Search/{{PAGENAME}}|搜索此頁標題]],
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有關日誌],
或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。',
-'userpage-userdoesnotexist' => '使用者帳號「<nowiki>$1</nowiki>」未曾建立。請在建立/編輯這個頁面前先檢查一下。',
-'clearyourcache' => "'''注意:''' 在儲存以後, 您必須清除瀏覽器的快取才能看到所作出的改變。 '''Mozilla / Firefox / Safari:''' 按著 ''Shift'' 再點擊''重新整理''(或按下''Ctrl-Shift-R'',在蘋果Mac上按下''Cmd-Shift-R'');'''IE:''' 按著 ''Ctrl'' 再點擊 ''重新整理'',或按下 ''Ctrl-F5'';'''Konqueror:''' 只需點擊 ''重新整理'';'''Opera:''' 使用者需要在 ''工具-設定'' 中完整地清除它們的快取。",
-'usercsspreview' => "'''注意您只是在預覽您的個人 CSS, 還沒有儲存﹗'''",
-'userjspreview' => "'''注意您只是在測試/預覽您的個人 JavaScript,還沒有儲存﹗'''",
-'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''",
-'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
+'userpage-userdoesnotexist' => '使用者帳號「<nowiki>$1</nowiki>」未曾建立。請在建立/編輯這個頁面前先檢查一下。',
+'usercsspreview' => "'''注意您只是在預覽您的個人 CSS, 還沒有儲存﹗'''",
+'userjspreview' => "'''注意您只是在測試/預覽您的個人 JavaScript,還沒有儲存﹗'''",
+'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''",
+'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
請再試一次。
如果仍然失敗,請[[Special:UserLogout|登出]]後重新登入。",
-'session_fail_preview_html' => "'''很抱歉!部份資料已遺失,我們無法處理您的編輯。''''''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請登出後再重新登入一次。'''",
-'token_suffix_mismatch' => "'''由於您使用者端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。
+'session_fail_preview_html' => "'''很抱歉!部份資料已遺失,我們無法處理您的編輯。''''''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請登出後再重新登入一次。'''",
+'token_suffix_mismatch' => "'''由於您使用者端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。
這種情況通常出現於使用含有很多臭蟲、以網路為主的匿名代理服務的時候。'''",
-'editing' => '編輯「$1」',
-'editingcomment' => '正在編輯$1(新段落)',
-'storedversion' => '已保存版本',
-'nonunicodebrowser' => "'''警告: 您的瀏覽器不相容Unicode編碼。這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。'''",
-'editingold' => "'''警告:你正在編輯的是本頁的舊版本。
+'editing' => '正在编辑 $1',
+'editingcomment' => '正在編輯$1(新段落)',
+'storedversion' => '已保存版本',
+'nonunicodebrowser' => "'''警告: 您的瀏覽器不相容Unicode編碼。這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。'''",
+'editingold' => "'''警告:你正在編輯的是本頁的舊版本。
如果你保存它的話,在本版本之後的任何修改都會遺失。'''",
-'longpageerror' => "'''錯誤: 您所提交的文字長度有$1KB,這大於$2KB的最大值。該文字不能被儲存。'''",
-'protectedpagewarning' => "'''警告: 本頁已經被保護,只有擁有管理員許可權的使用者才可修改。'''",
-'semiprotectedpagewarning' => "'''注意:''' 本頁面被鎖定,僅限註冊使用者編輯。",
-'cascadeprotectedwarning' => '警告: 本頁已經被保護,只有擁有管理員權限的使用者才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:',
-'nocreatetext' => '此網站限制了建立新頁面的功能。你可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或建立新帳號]]。',
-'nocreate-loggedin' => '您在這個wiki中並無許可權去建立新頁面。',
+'longpageerror' => "'''錯誤: 您所提交的文字長度有$1KB,這大於$2KB的最大值。該文字不能被儲存。'''",
+'protectedpagewarning' => "'''警告: 本頁已經被保護,只有擁有管理員許可權的使用者才可修改。'''",
+'semiprotectedpagewarning' => "'''注意:''' 本頁面被鎖定,僅限註冊使用者編輯。",
+'cascadeprotectedwarning' => '警告: 本頁已經被保護,只有擁有管理員權限的使用者才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:',
+'nocreatetitle' => '建立頁面受限',
+'nocreatetext' => '此網站限制了建立新頁面的功能。你可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或建立新帳號]]。',
+'nocreate-loggedin' => '您在這個wiki中並無許可權去建立新頁面。',
'recreate-moveddeleted-warn' => "'''警告: 你現在重新建立一個先前曾經刪除過的頁面。'''
你應該要考慮一下繼續編輯這一個頁面是否合適。
為方便起見,這一個頁面的刪除記錄已經在下面提供:",
-'edit-hook-aborted' => '編輯被鉤取消。
+'edit-hook-aborted' => '編輯被鉤取消。
它並無給出解釋。',
# Parser/template warnings
說明:(目前) 指與目前版本比較,(先前) 指與前一個修訂版本比較,小 = 細微修改。',
# Revision feed
-'history-feed-title' => '修訂沿革',
+'history-feed-title' => '修訂沿革',
'history-feed-description' => '本站上此頁的修訂沿革',
-'history-feed-empty' => '所請求的頁面不存在。它可能已被刪除或重新命名。
+'history-feed-empty' => '所請求的頁面不存在。它可能已被刪除或重新命名。
嘗試[[Special:Search|搜尋本站]]獲得相關的新建頁面。',
# Revision deletion
-'rev-deleted-comment' => '(註釋已除)',
-'rev-deleted-user' => '(使用者名已移除)',
-'rev-deleted-event' => '(日誌已除)',
+'rev-deleted-comment' => '(註釋已除)',
+'rev-deleted-user' => '(使用者名已移除)',
+'rev-deleted-event' => '(日誌已除)',
'rev-deleted-text-permission' => '該頁面修訂已經被從公共文件中移除。
+在[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。',
+'rev-deleted-text-view' => '該頁面修訂已經被從公共文件中移除。作為此網站的管理員,您可以檢視它;
在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。',
-'rev-deleted-text-view' => '該頁面修訂已經被從公共文件中移除。作為此網站的管理員,您可以檢視它;
-在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。',
-'revisiondelete' => '刪除/復原刪除修訂',
-'revdelete-nooldid-title' => '沒有目標修訂',
-'revdelete-nooldid-text' => '您沒有指定此操作的目標修訂。',
-'logdelete-selected' => "'''選取的$1個日誌項目:'''",
-'revdelete-text' => "'''刪除的修訂仍將顯示在修訂記錄中, 但它們的文字內容已不能被公眾訪問。'''
+'revisiondelete' => '刪除/復原刪除修訂',
+'revdelete-nooldid-title' => '沒有目標修訂',
+'revdelete-nooldid-text' => '您沒有指定此操作的目標修訂。',
+'logdelete-selected' => "'''選取的$1個日誌項目:'''",
+'revdelete-text' => "'''刪除的修訂仍將顯示在修訂記錄中, 但它們的文字內容已不能被公眾訪問。'''
在此網站的其他管理員將仍能訪問隱藏的內容並透過與此相同的介面復原刪除,除非網站工作者進行了一些附加的限制。",
-'revdelete-legend' => '設定修訂限制:',
-'revdelete-hide-user' => '隱藏編輯者的使用者名/IP',
-'revdelete-hide-restricted' => '將此限制同樣應用於管理員',
-'revdelete-suppress' => '同時壓制由操作員以及其他使用者的資料',
-'revdelete-unsuppress' => '在已復原的修訂中移除限制',
-'revdelete-success' => '修訂的可見性已經成功設定。',
-'logdelete-success' => '事件的可見性已經成功設定。',
+'revdelete-legend' => '設定修訂限制:',
+'revdelete-hide-user' => '隱藏編輯者的使用者名/IP',
+'revdelete-hide-restricted' => '將此限制同樣應用於管理員',
+'revdelete-suppress' => '同時壓制由操作員以及其他使用者的資料',
+'revdelete-unsuppress' => '在已復原的修訂中移除限制',
+'revdelete-success' => '修訂的可見性已經成功設定。',
+'logdelete-success' => '事件的可見性已經成功設定。',
# History merging
-'mergehistory' => '合併修訂記錄',
+'mergehistory' => '合併修訂記錄',
'mergehistory-header' => "這一頁可以講您合併一個來源頁面的歷史到另一個新頁面中。
請確認這次更改會繼續保留該頁面先前的歷史版本。
'''最少該來源頁面的現時修訂必定會保持。'''",
-'mergehistory-merge' => '以下[[:$1]]的修訂可以合併到[[:$2]]。用該選項按鈕欄去合併只有在指定時間以前所建立的修訂。要留意的是使用導航連結便會重設這一欄。',
+'mergehistory-merge' => '以下[[:$1]]的修訂可以合併到[[:$2]]。用該選項按鈕欄去合併只有在指定時間以前所建立的修訂。要留意的是使用導航連結便會重設這一欄。',
# Merge log
'mergelogpagetext' => '以下是一個最近由一個頁面的修訂沿革合併到另一個頁面的列表。',
# Diffs
-'history-title' => '「$1」的修訂沿革',
+'history-title' => '「$1」的修訂沿革',
'compareselectedversions' => '比較選定的版本',
# Search results
-'searchresults' => '搜尋結果',
-'searchdisabled' => '{{SITENAME}}由於性能方面的原因,全文搜尋已被暫時停用。您可以暫時透過Google搜尋。請留意他們的索引可能會過時。',
+'searchresults' => '搜尋結果',
+'searchresulttext' => '有關搜尋{{SITENAME}}的更多詳情,參見[[{{MediaWiki:Helppage}}|{{int:help}}]]。',
+'searchsubtitle' => '查詢\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|所有以 "$1" 開頭的頁面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有鏈接到 "$1" 的頁面]])',
+'nonefound' => "'''注意''': 只有一些名稱空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名稱空間作為前綴。",
+'powersearch' => '搜尋',
+'searchdisabled' => '{{SITENAME}}由於性能方面的原因,全文搜尋已被暫時停用。您可以暫時透過Google搜尋。請留意他們的索引可能會過時。',
# Preferences page
-'preferences' => '偏好設定',
-'mypreferences' => '偏好設定',
-'prefs-personal' => '使用者資料',
-'prefs-rc' => '近期變動',
+'preferences' => '偏好設定',
+'mypreferences' => '我的偏好設定',
+'prefsnologintext' => '您必須先[[Special:UserLogin|登入]]才能設定個人參數。',
+'prefs-personal' => '使用者資料',
+'prefs-rc' => '近期變動',
'prefs-watchlist-days' => '監視列表中顯示記錄的最長天數:',
-'saveprefs' => '保存偏好設定',
-'searchresultshead' => '搜尋結果設定',
-'recentchangesdays' => '近期變動中的顯示日數:',
-'recentchangescount' => '近期變動中的編輯數:',
-'savedprefs' => '您的個人偏好設定已經儲存。',
-'timezonelegend' => '時區',
-'localtime' => '當地時間',
-'servertime' => '伺服器時間:',
-'allowemail' => '接受來自其他使用者的郵件',
-'defaultns' => '否則在這些名字空間搜尋:',
-'username' => '使用者名:',
-'uid' => '使用者ID:',
-'yournick' => '暱稱:',
-'badsig' => '錯誤的原始簽名;請檢查HTML標籤。',
-'badsiglength' => '你的簽名過長;簽名長度必須在$1個字元以下。',
-'prefs-help-gender' => '可選:用於軟體中的性別指定。此項資料將會被公開。',
-'prefs-help-realname' => '真實姓名是選填的,如果您選擇提供它,那它便用以對您的貢獻署名。',
-'prefs-help-email' => '電子郵件是選填的,但當啟用它後可以在您忘記您的個密碼時需要將新密碼重設寄回給您。而在您未公開自己的使用者身分時也能透過您的用戶頁或用戶討論頁與您聯繫。',
+'saveprefs' => '保存偏好設定',
+'resetprefs' => '重設參數',
+'searchresultshead' => '搜尋結果設定',
+'recentchangesdays' => '近期變動中的顯示日數:',
+'recentchangescount' => '近期變動中的編輯數:',
+'savedprefs' => '您的個人偏好設定已經儲存。',
+'timezonelegend' => '時區',
+'localtime' => '當地時間',
+'timezoneoffset' => '時差¹',
+'servertime' => '伺服器時間',
+'allowemail' => '接受來自其他使用者的郵件',
+'defaultns' => '否則在這些名字空間搜尋:',
+'username' => '使用者名:',
+'uid' => '使用者ID:',
+'yournick' => '暱稱:',
+'badsig' => '錯誤的原始簽名;請檢查HTML標籤。',
+'badsiglength' => '你的簽名過長;簽名長度必須在$1個字元以下。',
+'prefs-help-gender' => '可選:用於軟體中的性別指定。此項資料將會被公開。',
+'prefs-help-realname' => '真實姓名是選填的,如果您選擇提供它,那它便用以對您的貢獻署名。',
+'prefs-help-email' => '電子郵件是選填的,但當啟用它後可以在您忘記您的個密碼時需要將新密碼重設寄回給您。而在您未公開自己的使用者身分時也能透過您的用戶頁或用戶討論頁與您聯繫。',
# User rights
-'userrights' => '使用者權限管理',
-'userrights-lookup-user' => '管理使用者群組',
+'userrights' => '使用者權限管理',
+'userrights-lookup-user' => '管理使用者群組',
'userrights-user-editname' => '輸入使用者帳號:',
-'editusergroup' => '編輯使用者群組',
-'editinguser' => "正在編輯使用者'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editusergroup' => '編輯使用者群組',
+'editinguser' => "正在編輯使用者'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
'userrights-editusergroup' => '編輯使用者群組',
-'saveusergroups' => '保存使用者群組',
+'saveusergroups' => '保存使用者群組',
# Groups
'group-autoconfirmed' => '自動確認使用者',
'grouppage-autoconfirmed' => '{{ns:project}}:自動確認使用者',
# User rights log
-'rightslog' => '使用者權限日誌',
+'rightslog' => '使用者權限日誌',
'rightslogtext' => '以下記錄了使用者權限的更改記錄。',
# Recent changes
-'recentchanges' => '近期變動',
-'recentchanges-feed-description' => '追蹤此訂閱在 wiki 上的近期變動。',
-'rcnotefrom' => '下面是自<b>$2</b>(最多顯示<b>$1</b>):',
-'rcshowhideminor' => '$1細微修改',
-'rcshowhidebots' => '$1機器人的編輯',
-'rcshowhideliu' => '$1具名使用者的編輯',
-'rcshowhideanons' => '$1匿名使用者的編輯',
-'rcshowhidepatr' => ' $1檢查過的編輯',
+'recentchanges' => '近期變動',
+'recentchanges-feed-description' => '追蹤此訂閱在 wiki 上的近期變動。',
+'rcnotefrom' => '下面是自<b>$2</b>(最多顯示<b>$1</b>):',
+'rcshowhideminor' => '$1細微修改',
+'rcshowhidebots' => '$1機器人的編輯',
+'rcshowhideliu' => '$1具名使用者的編輯',
+'rcshowhideanons' => '$1匿名使用者的編輯',
+'rcshowhidepatr' => ' $1檢查過的編輯',
'number_of_watching_users_pageview' => '[$1個關注使用者]',
# Recent changes linked
-'recentchangeslinked' => '相關頁面修訂記錄',
-'recentchangeslinked-feed' => '相關頁面修訂記錄',
+'recentchangeslinked' => '相關頁面修訂記錄',
+'recentchangeslinked-feed' => '相關頁面修訂記錄',
'recentchangeslinked-toolbox' => '相關頁面修訂記錄',
-'recentchangeslinked-title' => '$1 內連結頁面的修訂記錄',
+'recentchangeslinked-title' => '$1 內連結頁面的修訂記錄',
'recentchangeslinked-summary' => "這一個特殊頁面列示這一頁連出頁面的近期變動。在您監視列表中的頁面會以'''粗體'''表示。",
# Upload
-'upload' => '上傳檔案',
-'reuploaddesc' => '返回上載表單。',
-'uploadtext' => "使用下面的表單來上傳用在頁面內新的圖片檔案。
+'upload' => '上傳檔案',
+'reuploaddesc' => '返回上載表單。',
+'uploadtext' => "使用下面的表單來上傳用在頁面內新的圖片檔案。
要檢視或搜尋以前上傳的圖片
可以進入[[Special:FileList|圖片清單]],
上傳和刪除將在[[Special:Log/upload|上傳日誌]]中記錄。
'''<nowiki>[[</nowiki>{{ns:file}}:file.jpg<nowiki>]]</nowiki>''',
'''<nowiki>[[</nowiki>{{ns:file}}:file.png|替換文字<nowiki>]]</nowiki>''' 或
'''<nowiki>[[</nowiki>{{ns:media}}:file.ogg<nowiki>]]</nowiki>'''。",
-'uploadlogpagetext' => '以下是最近上傳的檔案的一覽表。',
-'ignorewarning' => '忽略警告並儲存檔案。',
-'illegalfilename' => '檔案名"$1"包含有頁面標題所禁止的字符。請改名後重新上傳。',
-'badfilename' => '檔案名已被改為"$1"。',
-'hookaborted' => '您所嘗試的修改被擴展鉤捨棄。',
-'fileexists-thumbnail-yes' => "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]
-請檢查清楚該檔案<strong>[[:$1]]</strong>。
+'uploadlogpagetext' => '以下是最近上傳的檔案的一覽表。',
+'ignorewarning' => '忽略警告並儲存檔案。',
+'illegalfilename' => '檔案名"$1"包含有頁面標題所禁止的字符。請改名後重新上傳。',
+'badfilename' => '檔案名已被改為"$1"。',
+'hookaborted' => '您所嘗試的修改被擴展鉤捨棄。',
+'fileexists-thumbnail-yes' => "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]
+請檢查清楚該檔案'''<tt>[[:$1]]</tt>'''。
如果檢查後的檔案是同原本圖片的大小是一樣的話,就不用再上載多一幅縮圖。",
-'file-thumbnail-no' => "該檔名是以<strong>$1</strong>開始。它好像一幅圖片的縮圖版本''(縮圖)''。
+'file-thumbnail-no' => "該檔名是以'''<tt>$1</tt>'''開始。它好像一幅圖片的縮圖版本''(縮圖)''。
如果你有該圖片的完整大小,如不是請再修改檔名。",
-'fileexists-forbidden' => '已存在相同名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
+'fileexists-forbidden' => '已存在相同名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => '在共享檔案庫中已存在此名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
-'uploaddisabledtext' => '檔案上傳在此網站不可用。',
-'watchthisupload' => '監視此頁',
+'uploaddisabledtext' => '檔案上傳在此網站不可用。',
+'watchthisupload' => '監視此頁',
-'upload-proto-error' => '協訂錯誤',
+'upload-proto-error' => '協訂錯誤',
'upload-file-error-text' => '當試圖在伺服器上建立臨時檔案時發生內部錯誤。請與系統管理員聯繫。',
'upload-misc-error-text' => '在上傳時發生未知的錯誤. 請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與系統管理員聯繫。',
# Special:ListFiles
'listfiles_search_for' => '按圖片名稱搜尋:',
-'listfiles_user' => '使用者',
+'listfiles_user' => '使用者',
# File description page
-'filehist' => '檔案歷史',
+'filehist' => '檔案歷史',
'filehist-deleteone' => '刪除這個',
-'filehist-revert' => '復原',
-'filehist-datetime' => '日期/時間',
-'filehist-user' => '使用者',
-'imagelinks' => '連結',
+'filehist-revert' => '復原',
+'filehist-datetime' => '日期/時間',
+'filehist-user' => '使用者',
+'imagelinks' => '連結',
# File reversion
-'filerevert' => '復原$1',
-'filerevert-legend' => '復原檔案',
-'filerevert-intro' => '<span class="plainlinks">您現正在復原\'\'\'[[Media:$1|$1]]\'\'\'到[$4 於$2 $3的版本]。</span>',
+'filerevert' => '復原$1',
+'filerevert-legend' => '復原檔案',
+'filerevert-intro' => '<span class="plainlinks">您現正在復原\'\'\'[[Media:$1|$1]]\'\'\'到[$4 於$2 $3的版本]。</span>',
'filerevert-defaultcomment' => '已經復原到於$1 $2的版本',
-'filerevert-submit' => '復原',
-'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'已經復原到[$4 於$2 $3的版本]。</span>',
+'filerevert-submit' => '復原',
+'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'已經復原到[$4 於$2 $3的版本]。</span>',
# File deletion
-'filedelete-intro' => "您現正刪除'''[[Media:$1|$1]]'''。",
-'filedelete-intro-old' => '<span class="plainlinks">你現正刪除\'\'\'[[Media:$1|$1]]\'\'\'於[$4 $2 $3]的版本。</span>',
-'filedelete-comment' => '註解:',
-'filedelete-nofile' => "'''$1'''在這個網站中不存在。",
+'filedelete-intro' => "您現正刪除'''[[Media:$1|$1]]'''。",
+'filedelete-intro-old' => '<span class="plainlinks">你現正刪除\'\'\'[[Media:$1|$1]]\'\'\'於[$4 $2 $3]的版本。</span>',
+'filedelete-comment' => '註解:',
+'filedelete-nofile' => "'''$1'''在這個網站中不存在。",
'filedelete-nofile-old' => "在已指定屬性的情況下,這裡沒有'''$1'''於 $2 $3 的版本。",
# MIME search
# Statistics
'statistics-header-users' => '使用者統計',
+'disambiguations' => '消歧義',
+'disambiguations-text' => '以下的頁面都有到<b>消歧義頁</b>的鏈接,
+但它們應該是連到適當的標題。<br />
+個頁面會被視為消含糊頁如果它是連自[[MediaWiki:Disambiguationspage]]。',
+
'withoutinterwiki-summary' => '以下的頁面是未有語言鏈接到其它語言版本:',
# Miscellaneous special pages
-'lonelypagestext' => '以下頁面尚未被這個wiki中的其它頁面連結。',
+'lonelypagestext' => '以下頁面尚未被這個wiki中的其它頁面連結。',
'uncategorizedimages' => '待分類圖片',
-'unusedimages' => '未使用圖片',
-'popularpages' => '熱門頁面',
-'mostimages' => '最多連結圖片',
-'prefixindex' => '所有頁面之前綴',
-'deadendpagestext' => '以下頁面沒有連結到這個wiki中的其它頁面。',
-'listusers' => '使用者列表',
-'newpages-username' => '使用者帳號:',
-'move' => '移動',
-'unusedimagestext' => '請注意其它網站可能直接透過 URL 連結此圖片,所以這裡列出的圖片有可能依然被使用。',
-'notargettext' => '您還沒有指定一個目標頁面或使用者以進行此項操作。',
+'unusedimages' => '未使用圖片',
+'popularpages' => '熱門頁面',
+'mostimages' => '最多連結圖片',
+'prefixindex' => '所有頁面之前綴',
+'deadendpagestext' => '以下頁面沒有連結到這個wiki中的其它頁面。',
+'listusers' => '使用者列表',
+'newpages-username' => '使用者帳號:',
+'move' => '移動',
+'unusedimagestext' => '請注意其它網站可能直接透過 URL 連結此圖片,所以這裡列出的圖片有可能依然被使用。',
+'notargettext' => '您還沒有指定一個目標頁面或使用者以進行此項操作。',
# Special:Log
'specialloguserlabel' => '使用者:',
-'alllogstext' => '綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。',
+'alllogstext' => '綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。',
# Special:ListUsers
-'listusersfrom' => '給定顯示使用者條件:',
+'listusersfrom' => '給定顯示使用者條件:',
'listusers-noresult' => '找不到使用者。',
# Special:ActiveUsers
'activeusers-hidebots' => '隱藏機器人',
-# Email user
-'mailnologin' => '無E-mail地址',
+# E-mail user
+'mailnologin' => '無E-mail地址',
'mailnologintext' => '您必須先[[Special:UserLogin|登入]]
並在[[Special:Preferences|偏好設定]]
中有一個有效的e-mail地址才可以E-mail其他使用者。',
-'emailuser' => 'E-mail該使用者',
-'emailpage' => 'E-mail使用者',
-'emailpagetext' => '如果該使用者已經在他或她的偏好設定頁中輸入了有效的e-mail地址,以下的表格將寄一個訊息給該使用者。您在您偏好設定中所輸入的e-mail地址將出現在郵件「發件人」一欄中,這樣該使用者就可以回覆您。',
-'noemailtext' => '該使用者還沒有指定一個有效的e-mail地址,
+'emailuser' => 'E-mail該使用者',
+'emailpage' => 'E-mail使用者',
+'emailpagetext' => '如果該使用者已經在他或她的偏好設定頁中輸入了有效的e-mail地址,以下的表格將寄一個訊息給該使用者。您在您偏好設定中所輸入的e-mail地址將出現在郵件「發件人」一欄中,這樣該使用者就可以回覆您。',
+'noemailtext' => '該使用者還沒有指定一個有效的e-mail地址,
或者選擇不接受來自其他使用者的e-mail。',
-'emailfrom' => '發件人',
-'emailto' => '收件人',
-'emailsubject' => '主題',
-'emailmessage' => '訊息',
-'emailccme' => '將我的消息的副本發送一份到我的E-mail信箱。',
+'emailfrom' => '發件人',
+'emailto' => '收件人',
+'emailsubject' => '主題',
+'emailmessage' => '訊息',
+'emailccme' => '將我的消息的副本發送一份到我的E-mail信箱。',
# Watchlist
-'addedwatchtext' => '已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]],未來此頁面或其討論頁如有更動,都會在監視列表中列出。',
-'removedwatchtext' => '頁面「[[:$1]]」已經從您的監視頁面中移除。',
+'addedwatchtext' => "頁面「[[:$1]]」已經被加入到您的[[Special:Watchlist|監視清單]]中。將來有關此頁面及其討論頁的任何修改將會在那裡列出,而且還會在[[Special:RecentChanges|近期變動]]中以'''粗體'''形式列出以使起更容易識別。",
+'removedwatchtext' => '頁面「[[:$1]]」已經從您的監視頁面中移除。',
'watchlist-details' => '不包含討論頁,您的監視列表共有 $1 頁。',
'enotif_impersonal_salutation' => '{{SITENAME}}使用者',
-'enotif_anon_editor' => '匿名使用者$1',
-'enotif_body' => '親愛的 $WATCHINGUSERNAME,
+'enotif_anon_editor' => '匿名使用者$1',
+'enotif_body' => '親愛的 $WATCHINGUSERNAME,
$PAGEEDITOR 已經在 $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}}的 $PAGETITLE 頁面,請到 $PAGETITLE_URL 檢視目前版本。
# Delete
'confirmdeletetext' => '您即將從資料庫中永遠刪除一個頁面或圖片以及其歷史。
請確定您要進行此項操作,並且了解其後果,同時您的行為符合[[{{MediaWiki:Policy-url}}]]。',
-'deletedtext' => '「$1」已經被刪除。
+'deletedtext' => '「$1」已經被刪除。
最近刪除的紀錄請參見$2。',
-'dellogpagetext' => '以下是最近刪除的紀錄列表。
+'dellogpagetext' => '以下是最近刪除的紀錄列表。
所有的時間都是使用伺服器時間。',
-'reverted' => '復原到早期版本',
-'deletecomment' => '原因:',
+'reverted' => '復原到早期版本',
+'deletecomment' => '原因:',
# Rollback
-'rollback' => '復原',
-'rollback_short' => '復原',
-'rollbacklink' => '復原',
-'rollbackfailed' => '無法復原',
-'cantrollback' => '無法復原編輯;最後的貢獻者是本文的唯一作者。',
-'alreadyrolled' => '無法復原由[[User:$2|$2]] ([[User talk:$2|討論]])進行的[[$1]]的最後編輯;
+'rollback' => '復原',
+'rollback_short' => '復原',
+'rollbacklink' => '復原',
+'rollbackfailed' => '無法復原',
+'cantrollback' => '無法復原編輯;最後的貢獻者是本文的唯一作者。',
+'alreadyrolled' => '無法復原由[[User:$2|$2]] ([[User talk:$2|討論]])進行的[[$1]]的最後編輯;
其他人已經編輯或是復原了該頁。
最後編輯者: [[User:$3|$3]] ([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。',
-'editcomment' => "編輯說明: \"''\$1''\"。",
-'revertpage' => '復原由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])的編輯;更改回[[User:$1|$1]]的最後一個版本',
+'editcomment' => "編輯說明: \"''\$1''\"。",
+'revertpage' => '復原由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])的編輯;更改回[[User:$1|$1]]的最後一個版本',
'rollback-success' => '復原由$1的編輯;更改回$2的最後一個版本。',
# Protect
-'protect-title' => '更改「$1」的保護等級',
-'protect-locked-blocked' => "您不能在被封鎖時更改保護級別。
+'protect-title' => '更改「$1」的保護等級',
+'protect-locked-blocked' => "您不能在被封鎖時更改保護級別。
以下是'''$1'''現時的保護級別:",
-'protect-locked-access' => "您的帳號權限不能修改保護級別。
+'protect-locked-access' => "您的帳號權限不能修改保護級別。
以下是'''$1'''現時的保護級別:",
-'protect-cascadeon' => '以下的{{PLURAL:$1|一個|多個}}頁面包含著本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護,未能編輯。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。',
-'protect-default' => '(預設)',
+'protect-cascadeon' => '以下的{{PLURAL:$1|一個|多個}}頁面包含著本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護,未能編輯。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。',
+'protect-default' => '(預設)',
'protect-level-autoconfirmed' => '禁止未註冊使用者',
-'protect-expiry-options' => '2小時:2 hours,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,永久:infinite',
-'maximum-size' => '最大大小',
+'protect-expiry-options' => '2小時:2 hours,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,永久:infinite',
+'maximum-size' => '最大大小',
# Undelete
-'undelete' => '復原被刪頁面',
-'undeletepage' => '瀏覽及復原被刪頁面',
-'undeletepagetext' => '以下頁面已經被刪除,但依然在檔案中並可以被復原。
+'undelete' => '復原被刪頁面',
+'undeletepage' => '瀏覽及復原被刪頁面',
+'undeletepagetext' => '以下頁面已經被刪除,但依然在檔案中並可以被復原。
檔案庫可能被定時清理。',
-'undeleteextrahelp' => "復原整個頁面時,請清除所有複選框後按 '''''復原''''' 。 復原特定版本時,請選擇相應版本前的複選框後按'''''復原''''' 。按 '''''重設''''' 將清除評論內容及所有複選框。",
-'undeletehistory' => '如果您復原了該頁面,所有版本都會被復原到修訂沿革中。
+'undeleteextrahelp' => "復原整個頁面時,請清除所有複選框後按 '''''復原''''' 。 復原特定版本時,請選擇相應版本前的複選框後按'''''復原''''' 。按 '''''重設''''' 將清除評論內容及所有複選框。",
+'undeletehistory' => '如果您復原了該頁面,所有版本都會被復原到修訂沿革中。
如果本頁刪除後有一個同名的新頁面建立,被復原的版本將會稱為較新的歷史。',
-'undeleterevdel' => '如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。對於您沒有權限去檢視的修訂是無法復原的。',
-'undeletehistorynoadmin' => '這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻使用者等等細節只有管理員可以看見。',
-'undelete-revision' => '刪除$1時由$3(在$2)所編寫的修訂版本:',
-'undeleterevision-missing' => '此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被復原。',
-'undeletebtn' => '復原',
-'undeletedrevisions' => '$1個修訂版本已經復原',
-'undeletedrevisions-files' => '$1 個版本和 $2 個檔案被復原',
-'undeletedfiles' => '$1 個檔案被復原',
-'cannotundelete' => '復原失敗;可能之前已經被其他人復原。',
-'undeletedpage' => "'''$1已經被復原''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及復原記錄。",
+'undeleterevdel' => '如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。對於您沒有權限去檢視的修訂是無法復原的。',
+'undeletehistorynoadmin' => '這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻使用者等等細節只有管理員可以看見。',
+'undelete-revision' => '刪除$1時由$3(在$2)所編寫的修訂版本:',
+'undeleterevision-missing' => '此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被復原。',
+'undeletebtn' => '復原',
+'undeletedrevisions' => '$1個修訂版本已經復原',
+'undeletedrevisions-files' => '$1 個版本和 $2 個檔案被復原',
+'undeletedfiles' => '$1 個檔案被復原',
+'cannotundelete' => '復原失敗;可能之前已經被其他人復原。',
+'undeletedpage' => "'''$1已經被復原''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及復原記錄。",
'undelete-missing-filearchive' => '由於檔案存檔 ID $1 不在資料庫中,不能在檔案存檔中復原。它可能已經反刪除了。',
# Contributions
'contributions' => '使用者編修記錄',
-'mycontris' => '編修記錄',
-'contribsub2' => '$1的編修記錄 ($2)',
-'uctop' => '(最新修改)',
+'mycontris' => '我的編修記錄',
+'contribsub2' => '$1的編修記錄 ($2)',
+'uctop' => '(最新修改)',
-'sp-contributions-newbies' => '只顯示新建立之使用者的編修記錄',
-'sp-contributions-blocklog' => '封鎖記錄',
+'sp-contributions-newbies' => '只顯示新建立之使用者的編修記錄',
+'sp-contributions-blocklog' => '封鎖記錄',
'sp-contributions-userrights' => '使用者權限管理',
-'sp-contributions-username' => 'IP位址或使用者名稱:',
+'sp-contributions-username' => 'IP位址或使用者名稱:',
# What links here
'whatlinkshere-title' => '鏈接到$1的頁面',
# Block/unblock
-'blockip' => '封鎖使用者',
-'ipadressorusername' => 'IP地址或使用者名稱:',
-'ipbreason-dropdown' => '*一般的封鎖理由
+'blockip' => '封鎖使用者',
+'ipadressorusername' => 'IP地址或使用者名:',
+'ipbreason-dropdown' => '*一般的封鎖理由
** 屢次增加不實資料
** 刪除頁面內容
** 外部連結廣告
** 無禮的行為、攻擊/騷擾別人
** 濫用多個帳號
** 不能接受的使用者名',
-'ipbcreateaccount' => '阻止建立新帳號',
-'ipbemailban' => '阻止使用者傳送E-mail',
-'ipbenableautoblock' => '自動封鎖此使用者最後所用的IP位址,以及後來試圖編輯所用的所有位址',
-'ipbsubmit' => '封鎖該地址',
-'ipbhidename' => '在封鎖日誌、活躍封鎖列表以及使用者列表中隱藏使用者名/IP',
-'blockipsuccesssub' => '封鎖成功',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被封鎖。
+'ipbcreateaccount' => '阻止建立新帳號',
+'ipbemailban' => '阻止使用者傳送E-mail',
+'ipbenableautoblock' => '自動封鎖此使用者最後所用的IP位址,以及後來試圖編輯所用的所有位址',
+'ipbsubmit' => '封鎖該地址',
+'ipbhidename' => '在封鎖日誌、活躍封鎖列表以及使用者列表中隱藏使用者名/IP',
+'blockipsuccesssub' => '封鎖成功',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被封鎖。
<br />參看[[Special:BlockList|被封IP地址列表]]以覆審封鎖。',
-'ipb-edit-dropdown' => '編輯封鎖原因',
-'ipb-unblock-addr' => '解除封鎖$1',
-'ipb-unblock' => '解除禁封使用者名或IP地址',
-'ipb-blocklist' => '檢視現有的封鎖',
-'unblockip' => '解除禁封IP地址',
-'unblockiptext' => '用下面的表單來復原先前被禁封的IP地址的書寫權。',
-'ipusubmit' => '解除禁封',
-'unblocked' => '[[User:$1|$1]] 的封鎖已經解除。',
-'unblocked-id' => '封鎖 $1 已經被移除',
-'ipblocklist-legend' => '搜尋一位已經被封鎖的使用者',
-'anononlyblock' => '僅限匿名使用者',
-'noautoblockblock' => '禁用自動封鎖',
-'createaccountblock' => '禁止建立帳號',
-'ipblocklist-empty' => '封鎖列表為空。',
-'ipblocklist-no-results' => '所要求的IP地址/使用者名沒有被封鎖。',
-'blocklink' => '禁封',
-'blocklogentry' => '[[$1]]已被封鎖 $3 ,終止時間為$2',
-'blocklogtext' => '這是關於使用者封鎖和解除封鎖操作的記錄。被自動封鎖的IP地址沒有被列出。請參閱[[Special:BlockList|被封鎖的IP地址和使用者列表]]。',
-'block-log-flags-anononly' => '僅限匿名使用者',
-'block-log-flags-nocreate' => '禁止建立新帳號',
+'ipb-edit-dropdown' => '編輯封鎖原因',
+'ipb-unblock-addr' => '解除封鎖$1',
+'ipb-unblock' => '解除禁封使用者名或IP地址',
+'ipb-blocklist' => '檢視現有的封鎖',
+'unblockip' => '解除禁封IP地址',
+'unblockiptext' => '用下面的表單來復原先前被禁封的IP地址的書寫權。',
+'ipusubmit' => '解除禁封',
+'unblocked' => '[[User:$1|$1]] 的封鎖已經解除。',
+'unblocked-id' => '封鎖 $1 已經被移除',
+'ipblocklist-legend' => '搜尋一位已經被封鎖的使用者',
+'anononlyblock' => '僅限匿名使用者',
+'noautoblockblock' => '禁用自動封鎖',
+'createaccountblock' => '禁止建立帳號',
+'ipblocklist-empty' => '封鎖列表為空。',
+'ipblocklist-no-results' => '所要求的IP地址/使用者名沒有被封鎖。',
+'blocklink' => '禁封',
+'blocklogentry' => '[[$1]]已被封鎖 $3 ,終止時間為$2',
+'blocklogtext' => '這是關於使用者封鎖和解除封鎖操作的記錄。被自動封鎖的IP地址沒有被列出。請參閱[[Special:BlockList|被封鎖的IP地址和使用者列表]]。',
+'block-log-flags-anononly' => '僅限匿名使用者',
+'block-log-flags-nocreate' => '禁止此IP/使用者建立新帳號',
'block-log-flags-noautoblock' => '停用自動封鎖',
-'range_block_disabled' => '只有管理員才能建立禁止封鎖的範圍。',
-'ipb_cant_unblock' => '錯誤: 找不到封鎖ID$1。可能已經解除封鎖。',
-'ipb_blocked_as_range' => '錯誤: 該IP $1 無直接封鎖,不可以解除封鎖。但是它是在 $2 的封鎖範圍之內,該段範圍是可以解除封鎖的。',
-'sorbsreason' => '您的IP位址被 DNSBL列為屬於開放代理服務器.',
+'range_block_disabled' => '只有管理員才能建立禁止封鎖的範圍。',
+'ipb_cant_unblock' => '錯誤: 找不到封鎖ID$1。可能已經解除封鎖。',
+'ipb_blocked_as_range' => '錯誤: 該IP $1 無直接封鎖,不可以解除封鎖。但是它是在 $2 的封鎖範圍之內,該段範圍是可以解除封鎖的。',
+'blockme' => '封鎖我',
+'sorbsreason' => '您的IP位址被 DNSBL列為屬於開放代理服務器.',
'sorbs_create_account_reason' => '由於您的IP位址被 DNSBL列為屬於開放代理服務器,所以您無法建立帳號。',
# Developer tools
-'lockdbtext' => '鎖住資料庫將禁止所有使用者進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。
+'lockdbtext' => '鎖住資料庫將禁止所有使用者進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。
請確認您的決定,並且保證您在維護工作結束後會重新開放資料庫。',
'unlockdbtext' => '開放資料庫將會復原所有使用者進行編輯頁面、修改參數、編輯監視列表以及其他需要更改資料庫的操作。
請確認您的決定。',
# Move page
-'movepagetext' => "用下面的表單來重新命名一個頁面,並將其修訂沿革同時移動到新頁面。
+'movepagetext' => "用下面的表單來重新命名一個頁面,並將其修訂沿革同時移動到新頁面。
老的頁面將成為新頁面的重定向頁。
連結到老頁面的連結並不會自動更改;
請檢查雙重或損壞重定向連結。
請在行動前先了結其所可能帶來的後果。",
'movenologintext' => '您必須是一名登記使用者並且[[Special:UserLogin|登入]]
後才可移動一個頁面。',
-'movenotallowed' => '您在這個wiki中度並沒有許可權去移動頁面。',
-'movetalk' => '如果可能的話,請同時移動對話頁。',
+'movenotallowed' => '您在這個wiki中度並沒有許可權去移動頁面。',
+'movetalk' => '如果可能的話,請同時移動對話頁。',
'movelogpagetext' => '以下是已經移動的頁面清單:',
-'revertmove' => '復原該移動',
+'revertmove' => '復原該移動',
# Export
-'exporttext' => '您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。
+'exporttext' => '您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。
要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,
並選擇你是否需要匯出帶有修訂紀錄的以前的版本,
'export-download' => '提供一個檔案以供另存',
# Namespace 8 related
-'allmessages' => '系統介面',
-'allmessagestext' => '這裡列出所有可定製的系統介面。',
+'allmessages' => '系統介面',
+'allmessagestext' => '這裡列出所有可定製的系統介面。',
'allmessagesnotsupportedDB' => '系統介面功能處於關閉狀態 (wgUseDatabaseMessages)。',
# Thumbnails
'thumbnail_error' => '建立縮圖錯誤: $1',
# Special:Import
-'import-interwiki-history' => '複製此頁的所有歷史版本',
+'import-interwiki-history' => '複製此頁的所有歷史版本',
'import-interwiki-namespace' => '將頁面轉移到名字空間:',
-'importtext' => '請使用 Special:Export 功能從源 wiki 匯出檔案,儲存到您的磁片並上傳到這裡。',
-'importfailed' => '匯入失敗: $1',
-'importsuccess' => '匯入成功﹗',
-'importhistoryconflict' => '存在衝突的修訂沿革(可能在之前已經匯入過此頁面)',
+'importtext' => '請使用 Special:Export 功能從源 wiki 匯出檔案,儲存到您的磁片並上傳到這裡。',
+'importfailed' => '匯入失敗: $1',
+'importsuccess' => '匯入成功﹗',
+'importhistoryconflict' => '存在衝突的修訂沿革(可能在之前已經匯入過此頁面)',
# Tooltip help for the actions
-'tooltip-pt-userpage' => '用戶頁',
-'tooltip-pt-anonuserpage' => '您編輯本站所用IP的對應使用者頁',
-'tooltip-pt-mytalk' => '討論頁',
-'tooltip-pt-preferences' => '我的偏好設定',
-'tooltip-pt-watchlist' => '我的監視列表',
-'tooltip-pt-mycontris' => '編修記錄',
-'tooltip-ca-addsection' => '於本討論頁增加新的討論主題',
-'tooltip-ca-history' => '本頁面的早前版本。',
-'tooltip-ca-undelete' => '將這個頁面復原到被刪除以前的狀態',
-'tooltip-p-logo' => '首頁',
-'tooltip-n-help' => '尋求說明',
-'tooltip-feed-rss' => '訂閱本修訂記錄的RSS資訊',
-'tooltip-feed-atom' => '訂閱本修訂記錄的Atom訊息',
-'tooltip-t-contributions' => '檢視該使用者的編修記錄',
-'tooltip-t-emailuser' => '向該使用者發送電子郵件',
-'tooltip-t-upload' => '上傳圖片或多媒體檔',
-'tooltip-t-permalink' => '這個頁面版本的永久連結',
-'tooltip-ca-nstab-user' => '檢視使用者頁',
-'tooltip-ca-nstab-image' => '查詢圖片頁面',
-'tooltip-ca-nstab-template' => '檢視模板',
-'tooltip-ca-nstab-help' => '檢視說明頁面',
-'tooltip-ca-nstab-category' => '檢視分類頁面',
-'tooltip-minoredit' => '標記為細微修改',
+'tooltip-pt-userpage' => '用戶頁',
+'tooltip-pt-anonuserpage' => '您編輯本站所用IP的對應使用者頁',
+'tooltip-pt-mytalk' => '討論頁',
+'tooltip-pt-preferences' => '我的偏好設定',
+'tooltip-pt-watchlist' => '我的監視列表',
+'tooltip-pt-mycontris' => '編修記錄',
+'tooltip-ca-addsection' => '於本討論頁增加新的討論主題',
+'tooltip-ca-history' => '本頁面的早前版本。',
+'tooltip-ca-undelete' => '將這個頁面復原到被刪除以前的狀態',
+'tooltip-p-logo' => '首頁',
+'tooltip-n-help' => '尋求說明',
+'tooltip-feed-rss' => '訂閱本修訂記錄的RSS資訊',
+'tooltip-feed-atom' => '訂閱本修訂記錄的Atom訊息',
+'tooltip-t-contributions' => '檢視該使用者的編修記錄',
+'tooltip-t-emailuser' => '向該使用者發送電子郵件',
+'tooltip-t-upload' => '上傳圖片或多媒體檔',
+'tooltip-t-permalink' => '這個頁面版本的永久連結',
+'tooltip-ca-nstab-user' => '檢視使用者頁',
+'tooltip-ca-nstab-image' => '查詢圖片頁面',
+'tooltip-ca-nstab-template' => '檢視模板',
+'tooltip-ca-nstab-help' => '檢視說明頁面',
+'tooltip-ca-nstab-category' => '檢視分類頁面',
+'tooltip-minoredit' => '標記為細微修改',
'tooltip-compareselectedversions' => '檢視本頁被點選的兩個版本間的差異',
-'tooltip-rollback' => '『{{int:rollbacklink}}』可以一按恢復上一位貢獻者對這個頁面的編輯',
-'tooltip-undo' => '『{{int:editundo}}』可以在編輯模式上開啟編輯表格以便復原。它容許在摘要中加入原因。',
-'interlanguage-link-title' => '$1–$2',
+'tooltip-rollback' => '『{{int:rollbacklink}}』可以一按恢復上一位貢獻者對這個頁面的編輯',
+'tooltip-undo' => '『{{int:editundo}}』可以在編輯模式上開啟編輯表格以便復原。它容許在摘要中加入原因。',
# Attribution
'anonymous' => '{{SITENAME}}的匿名{{PLURAL:$1|使用者|使用者}}',
-'siteuser' => '{{SITENAME}}使用者$1',
-'anonuser' => '{{SITENAME}}匿名使用者$1',
+'siteuser' => '{{SITENAME}}使用者$1',
+'anonuser' => '{{SITENAME}}匿名使用者$1',
'siteusers' => '{{SITENAME}}{{PLURAL:$2|使用者|使用者}}$1',
'anonusers' => '{{SITENAME}}匿名{{PLURAL:$2|使用者|使用者}}$1',
# Spam protection
'spamprotectiontext' => '垃圾過濾器禁止保存您剛才提交的頁面,這可能是由於您所加入的外部網站連結所產生的問題。',
-'spam_reverting' => '復原到不包含連結至$1的最近版本',
+'spam_reverting' => '復原到不包含連結至$1的最近版本',
# Patrolling
'markedaspatrolledtext' => '選定的版本已被標記為已檢查.',
# Browsing diffs
'previousdiff' => '←上一個',
-'nextdiff' => '下一個→',
+'nextdiff' => '下一個→',
# Media information
-'imagemaxsize' => '在圖片描述頁對圖片大小限制為:',
-'file-nohires' => '無更高解析度可提供。',
+'imagemaxsize' => '在圖片描述頁對圖片大小限制為:',
+'file-nohires' => '無更高解析度可提供。',
'show-big-image' => '完整解析度',
# Special:NewFiles
-'newimages' => '新建圖片畫廊',
+'newimages' => '新建圖片畫廊',
'imagelisttext' => '以下是按$2排列的$1個檔案列表。',
-'showhidebots' => '(機器人$1)',
-'noimages' => '無可檢視圖片。',
+'showhidebots' => '(機器人$1)',
+'noimages' => '無可檢視圖片。',
# Bad image list
'bad_image_list' => '請根據以下的格式去編寫:
只有列示項目(以 * 開頭的項目)會被考慮。第一個連結一定要連接去壞圖片中。
然後在同一行的連結會考慮作例外,即是幅圖片可以在哪一個頁面中同時顯示。',
-/*
-Short names for language variants used for language conversion links.
-Variants for Chinese language
-*/
+# Variants for Chinese language
'variantname-zh-tw' => '台灣繁體',
# Metadata
如果此檔案的源檔案已經被修改,一些訊息在修改後的檔案中將不能完全反映出來。',
-# Exif tags
-'exif-bitspersample' => '每像素位元數',
+# EXIF tags
+'exif-bitspersample' => '每像素位元數',
'exif-photometricinterpretation' => '像素合成',
-'exif-samplesperpixel' => '像素數',
-'exif-xresolution' => '水準解析度',
-'exif-yresolution' => '垂直解析度',
-'exif-stripoffsets' => '圖片數據區',
-'exif-imagedescription' => '圖片標題',
-'exif-compressedbitsperpixel' => '圖片壓縮模式',
-'exif-pixelydimension' => '有效圖片寬度',
-'exif-pixelxdimension' => '有效圖片高度',
-'exif-usercomment' => '使用者註釋',
-'exif-focalplanexresolution' => 'X軸焦平面解析度',
-'exif-focalplaneyresolution' => 'Y軸焦平面解析度',
-'exif-focalplaneresolutionunit' => '焦平面解析度單位',
-'exif-customrendered' => '自定義圖片處理',
-'exif-imageuniqueid' => '唯一圖片ID',
-'exif-gpsimgdirectionref' => '圖片方位參照',
-'exif-gpsimgdirection' => '圖片方位',
-
-'exif-lightsource-2' => '螢光燈',
+'exif-samplesperpixel' => '像素數',
+'exif-xresolution' => '水準解析度',
+'exif-yresolution' => '垂直解析度',
+'exif-stripoffsets' => '圖片數據區',
+'exif-imagedescription' => '圖片標題',
+'exif-compressedbitsperpixel' => '圖片壓縮模式',
+'exif-pixelydimension' => '有效圖片寬度',
+'exif-pixelxdimension' => '有效圖片高度',
+'exif-usercomment' => '使用者註釋',
+'exif-focalplanexresolution' => 'X軸焦平面解析度',
+'exif-focalplaneyresolution' => 'Y軸焦平面解析度',
+'exif-focalplaneresolutionunit' => '焦平面解析度單位',
+'exif-customrendered' => '自定義圖片處理',
+'exif-imageuniqueid' => '唯一圖片ID',
+'exif-gpsimgdirectionref' => '圖片方位參照',
+'exif-gpsimgdirection' => '圖片方位',
+
+'exif-lightsource-2' => '螢光燈',
'exif-lightsource-12' => '日光螢光燈(色溫 D 5700 7100K)',
'exif-lightsource-13' => '日溫白色螢光燈(N 4600 5400K)',
'exif-lightsource-14' => '冷白色螢光燈(W 3900 4500K)',
'exif-lightsource-15' => '白色螢光 (WW 3200 3700K)',
-# Email address confirmation
-'confirmemail' => '確認電子郵件地址',
-'confirmemail_noemail' => '您沒有在您的[[Special:Preferences|使用者設定]]裡面輸入一個有效的 email 位址。',
-'confirmemail_text' => '此網站要求您在使用郵件功能之前驗證您的電子郵件地址。
+# External editor support
+'edit-externally-help' => '請參見[//www.mediawiki.org/wiki/Manual:External_editors 設定步驟]了解詳細資訊。',
+
+# E-mail address confirmation
+'confirmemail' => '確認電子郵件地址',
+'confirmemail_noemail' => '您沒有在您的[[Special:Preferences|使用者設定]]裡面輸入一個有效的 email 位址。',
+'confirmemail_text' => '此網站要求您在使用郵件功能之前驗證您的電子郵件地址。
點擊以下按鈕可向您的郵箱發送一封確認郵件。該郵件包含有一行代碼連結;
請在您的瀏覽器中加載此連結以確認您的電子郵件地址是有效的。',
'confirmemail_sendfailed' => '不能發送確認郵件,請檢查電子郵件地址是否包含非法字元。
郵件傳送員回應: $1',
-'confirmemail_needlogin' => '您需要$1以確認您的電子郵件地址。',
-'confirmemail_success' => '您的郵箱已經被確認。您現下可以登錄並使用此網站了。',
-'confirmemail_loggedin' => '您的電子郵件地址現下已被確認。',
-'confirmemail_subject' => '{{SITENAME}}電子郵件地址確認',
+'confirmemail_needlogin' => '您需要$1以確認您的電子郵件地址。',
+'confirmemail_success' => '您的郵箱已經被確認。您現下可以登錄並使用此網站了。',
+'confirmemail_loggedin' => '您的電子郵件地址現下已被確認。',
+'confirmemail_subject' => '{{SITENAME}}電子郵件地址確認',
# Scary transclusion
-'scarytranscludefailed' => '[抱歉,模板$1讀取失敗]',
+'scarytranscludefailed' => '[抱歉,模板$1讀取失敗]',
'scarytranscludetoolong' => '[抱歉,URL 地址太長]',
# Delete conflict
'confirmrecreate' => '在您編輯這個頁面後,使用者[[User:$1|$1]]([[User talk:$1|對話]])以下列原因刪除了這個頁面: $2。請在重新建立頁面前三思。',
# Auto-summaries
-'autosumm-blank' => '移除所有頁面內容',
+'autosumm-blank' => '移除所有頁面內容',
'autosumm-replace' => "正在將頁面替換為 '$1'",
'autoredircomment' => '正在重定向到 [[$1]]',
-'autosumm-new' => '新頁面: $1',
+'autosumm-new' => '新頁面: $1',
# Live preview
'livepreview-failed' => '即時預覽失敗! 嘗試標準預覽。',
# Special:Version
-'version-parserhooks' => '語法鉤',
-'version-hooks' => '鉤',
+'version-parserhooks' => '語法鉤',
+'version-hooks' => '鉤',
'version-parser-function-hooks' => '語法函數鉤',
-'version-hook-name' => '鉤名',
+'version-hook-name' => '鉤名',
# Special:SpecialPages
'specialpages' => '特殊頁面',
-# Special:ExpandTemplates
-'expandtemplates' => '展開模板',
-'expand_templates_intro' => '本特殊頁面用於將一些文字中的模版展開,包括模版中引用的模版。同時也展開解譯器函數如<nowiki> {{</nowiki>#language:...}},以及變數如<nowiki>{{< /nowiki>CURRENTDAY}}—實際上,幾乎所有在雙括弧中的內容都被展開。本特殊頁面是通過使用 MediaWiki的相關解釋階段的功能完成的。',
-'expand_templates_title' => '上下文標題,用於 {{FULLPAGENAME}} 等:',
-'expand_templates_input' => '輸入文字:',
-'expand_templates_output' => '結果:',
-'expand_templates_xml_output' => 'XML輸出',
-'expand_templates_ok' => '確定',
-'expand_templates_remove_comments' => '移除註釋',
-'expand_templates_remove_nowiki' => '在結果中隱藏<nowiki>標記',
-'expand_templates_generate_xml' => '顯示XML解析樹',
-'expand_templates_preview' => '預覽',
-
);
public function __construct() {
parent::__construct();
$this->addOption( "fix", "Actually fix the entries, will dry run otherwise" );
+ $this->addOption( "regenerate-all",
+ "Regenerate the page_latest field for all records in table page" );
$this->mDescription = "Fix page_latest entries in the page table";
}
public function execute() {
$this->output( "Looking for pages with page_latest set to 0...\n" );
$dbw = wfGetDB( DB_MASTER );
+ $conds = array( 'page_latest' => 0 );
+ if ( $this->hasOption( 'regenerate-all' ) ) {
+ $conds = '';
+ }
$result = $dbw->select( 'page',
array( 'page_id', 'page_namespace', 'page_title' ),
- array( 'page_latest' => 0 ),
+ $conds,
__METHOD__ );
$n = 0;
str_replace( "_", " ", "[[MediaWiki:Some_random_test_page]]");
}
-
function benchstrtr_indirect() {
bfNormalizeTitleStrTr( "[[MediaWiki:Some_random_test_page]]" );
}
// Some last includes
require_once "$IP/includes/Setup.php";
-// Much much faster startup than creating a title object
-$wgTitle = null;
-
// Do the work
try {
$maintenance->execute();
$extensionStyle = false;
$langcode = $this->getOption( 'langcode' );
$messages = array( $langcode => $messages );
- } else if ( $this->hasOption( 'langcode' ) ) {
+ } elseif ( $this->hasOption( 'langcode' ) ) {
$this->output( "Warning: --langcode option set but will not be used.\n" );
}
echo "\nUsing title '" . $title->getPrefixedText() . "'...";
if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
+ RequestContext::getMain()->setTitle( $title );
$text = file_get_contents( $filename );
$user = isset( $options['user'] ) ? $options['user'] : 'Maintenance script';
}
function execute() {
- global $IP, $wgTitle;
+ global $IP;
$siteName = isset( $this->mArgs[0] ) ? $this->mArgs[0] : "Don't care"; // Will not be set if used with --env-checks
$adminName = isset( $this->mArgs[1] ) ? $this->mArgs[1] : null;
- $wgTitle = Title::newFromText( 'Installer script' );
$dbpassfile = $this->getOption( 'dbpassfile', false );
if ( $dbpassfile !== false ) {
"mw.Message",
"mw.loader",
"mw.loader.store",
- "mw.log",
"mw.html",
"mw.html.Cdata",
"mw.html.Raw",
"classes": [
"mw.Title",
"mw.Uri",
- "mw.inspect",
- "mw.inspect.reports",
"mw.notification",
"mw.Notification_",
"mw.user",
"classes": [
"mw.Feedback"
]
+ },
+ {
+ "name": "Development",
+ "classes": [
+ "mw.log",
+ "mw.inspect",
+ "mw.inspect.reports",
+ "mw.Debug"
+ ]
}
]
},
"--external": "HTMLElement,HTMLDocument,Window",
"--": [
"./external.js",
- "../../resources/mediawiki/mediawiki.js",
- "../../resources/mediawiki/mediawiki.htmlform.js",
- "../../resources/mediawiki/mediawiki.feedback.js",
- "../../resources/mediawiki/mediawiki.log.js",
- "../../resources/mediawiki/mediawiki.util.js",
- "../../resources/mediawiki/mediawiki.Title.js",
- "../../resources/mediawiki/mediawiki.Uri.js",
- "../../resources/mediawiki/mediawiki.inspect.js",
- "../../resources/mediawiki/mediawiki.jqueryMsg.js",
- "../../resources/mediawiki/mediawiki.notify.js",
- "../../resources/mediawiki/mediawiki.notification.js",
- "../../resources/mediawiki/mediawiki.user.js",
+ "../../resources/mediawiki",
"../../resources/mediawiki.action/mediawiki.action.edit.js",
"../../resources/mediawiki.action/mediawiki.action.view.postEdit.js",
"../../resources/mediawiki.page/mediawiki.page.startup.js",
'feed-rss',
'unit-pixel',
'userrights-irreversible-marker',
- 'tog-noconvertlink',
'variantname-zh-hans',
'variantname-zh-hant',
'variantname-zh-cn',
'tog-ccmeonemails',
'tog-diffonly',
'tog-showhiddencats',
- 'tog-noconvertlink',
'tog-norollbackdiff',
'tog-useeditwarning',
'tog-prefershttps'
'suspicious-userlogout',
'createacct-another-realname-tip',
'pt-login',
+ 'pt-login-button',
'pt-createaccount',
'pt-userlogout',
),
'revdelete-show-file-submit',
'revdelete-selected',
'logdelete-selected',
- 'revdelete-text',
+ 'revdelete-text-text',
+ 'revdelete-text-file',
+ 'logdelete-text',
+ 'revdelete-text-others',
'revdelete-confirm',
'revdelete-suppress-text',
'revdelete-legend',
}
public function execute() {
- global $wgTitle;
-
$this->db = wfGetDB( DB_MASTER );
- $wgTitle = Title::newFromText( 'Namespace title conflict cleanup script' );
$fix = $this->hasOption( 'fix' );
$suffix = $this->getOption( 'suffix', '' );
}
public function execute() {
- global $wgTitle;
- $wgTitle = Title::newFromText( 'Orphan revision cleanup script' );
$this->checkOrphans( $this->hasOption( 'fix' ) );
$this->checkSeparation( $this->hasOption( 'fix' ) );
# Does not work yet, do not use
DROP SEQUENCE IF EXISTS user_user_id_seq CASCADE;
DROP SEQUENCE IF EXISTS page_page_id_seq CASCADE;
DROP SEQUENCE IF EXISTS revision_rev_id_seq CASCADE;
-DROP SEQUENCE IF EXISTS page_restrictions_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS text_old_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS page_restrictions_pr_id_seq CASCADE;
DROP SEQUENCE IF EXISTS ipblocks_ipb_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS filearchive_fa_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS uploadstash_us_id_seq CASCADE;
DROP SEQUENCE IF EXISTS recentchanges_rc_id_seq CASCADE;
DROP SEQUENCE IF EXISTS logging_log_id_seq CASCADE;
DROP SEQUENCE IF EXISTS job_job_id_seq CASCADE;
DROP SEQUENCE IF EXISTS category_cat_id_seq CASCADE;
DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE;
DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS sites_site_id_seq CASCADE;
DROP FUNCTION IF EXISTS page_deleted() CASCADE;
DROP FUNCTION IF EXISTS ts2_page_title() CASCADE;
DROP FUNCTION IF EXISTS ts2_page_text() CASCADE;
DROP FUNCTION IF EXISTS add_interwiki(TEXT,INT,SMALLINT) CASCADE;
+DROP TYPE IF EXISTS media_type CASCADE;
CREATE SEQUENCE user_user_id_seq MINVALUE 0 START WITH 0;
CREATE TABLE mwuser ( -- replace reserved word 'user'
$this->output( "Done!\n" );
}
- /** Purge URL coming from stdin */
+ /**
+ * Purge URL coming from stdin
+ */
private function doPurge() {
$stdin = $this->getStdin();
$urls = array();
$this->sendPurgeRequest( $urls );
}
- /** Purge a namespace or all pages */
+ /**
+ * Purge a namespace or all pages
+ */
private function purgeNamespace( $namespace = false ) {
$dbr = wfGetDB( DB_SLAVE );
$startId = 0;
public function execute() {
global $wgUseFileCache, $wgReadOnly, $wgContentNamespaces, $wgRequestTime;
- global $wgTitle, $wgOut;
+ global $wgOut;
if ( !$wgUseFileCache ) {
$this->error( "Nothing to do -- \$wgUseFileCache is disabled.", true );
}
$rebuilt = false;
$wgRequestTime = microtime( true ); # bug 22852
- $wgTitle = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- if ( null == $wgTitle ) {
+ $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+ if ( null == $title ) {
$this->output( "Page {$row->page_id} has bad title\n" );
continue; // broken title?
}
$context = new RequestContext;
- $context->setTitle( $wgTitle );
- $article = Article::newFromTitle( $wgTitle, $context );
+ $context->setTitle( $title );
+ $article = Article::newFromTitle( $title, $context );
$context->setWikiPage( $article->getPage() );
$wgOut = $context->getOutput(); // set display title
// If the article is cacheable, then load it
if ( $article->isFileCacheable() ) {
- $cache = HTMLFileCache::newFromTitle( $wgTitle, 'view' );
+ $cache = HTMLFileCache::newFromTitle( $title, 'view' );
if ( $cache->isCacheGood() ) {
if ( $overwrite ) {
$rebuilt = true;
$blockEnd += $this->mBatchSize;
}
$this->output( "Done!\n" );
-
- // Remove these to be safe
- if ( isset( $wgTitle ) ) {
- unset( $wgTitle );
- }
}
}
}
public function execute() {
- global $wgTitle;
-
// Shouldn't be needed for Postgres
$this->db = wfGetDB( DB_MASTER );
if ( $this->db->getType() == 'postgres' ) {
}
}
- $wgTitle = Title::newFromText( "Rebuild text index script" );
-
if ( $this->db->getType() == 'mysql' ) {
$this->dropMysqlTextIndex();
$this->populateSearchIndex();
}
public function execute() {
- global $wgTitle;
-
if ( wfReadOnly() ) {
$this->error( "Unable to run jobs; the wiki is in read-only mode.", 1 ); // die
}
$maxJobs = $this->getOption( 'maxjobs', false );
$maxTime = $this->getOption( 'maxtime', false );
$startTime = time();
- $wgTitle = Title::newFromText( 'RunJobs.php' );
$group = JobQueueGroup::singleton();
// Handle any required periodic queue maintenance
if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
$this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
}
- $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
- $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
- $total = $session + $noSession;
- if ( $total == 0 ) {
- $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
- }
- $this->output( "Requests\n" );
- $this->output( sprintf( "with session: %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
- $this->output( sprintf( "without session: %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
- $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
$this->output( "\nParser cache\n" );
$hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
return $status;
}
+ $src->preloadFileStat( array( 'srcs' => $sPaths, 'latest' => 1 ) );
+ $dst->preloadFileStat( array( 'srcs' => $dPaths, 'latest' => 1 ) );
+
$ops = array();
$fsFiles = array();
foreach ( $sPaths as $i => $sPath ) {
}
function execute() {
- global $wgVersion, $wgTitle, $wgLang, $wgAllowSchemaUpdates;
+ global $wgVersion, $wgLang, $wgAllowSchemaUpdates;
if ( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
$this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
}
$wgLang = Language::factory( 'en' );
- $wgTitle = Title::newFromText( "MediaWiki database updater" );
define( 'MW_UPDATER', true );
'mediawiki.special.userlogin.signup.js' => array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.userlogin.signup.js',
'messages' => array(
+ 'createacct-error',
'createacct-emailrequired',
+ 'noname',
+ 'userexists',
+ ),
+ 'dependencies' => array(
+ 'mediawiki.api',
+ 'mediawiki.jqueryMsg',
+ 'jquery.throttle-debounce',
),
- 'dependencies' => 'mediawiki.jqueryMsg',
),
'mediawiki.special.javaScriptTest' => array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
),
'skinStyles' => array(
'default' => 'resources/oojs-ui/oojs-ui-apex.css',
+ 'minerva' => array(),
),
'messages' => array(
'ooui-dialog-action-close',
* @return {boolean} return.done.isCategory Whether the category exists.
*/
isCategory: function ( title, ok, err ) {
- var d = $.Deferred(),
- apiPromise;
+ var apiPromise = this.get( {
+ prop: 'categoryinfo',
+ titles: String( title )
+ } );
// Backwards compatibility (< MW 1.20)
if ( ok || err ) {
mw.track( 'mw.deprecate', 'api.cbParam' );
mw.log.warn( msg );
- d.done( ok ).fail( err );
}
- apiPromise = this.get( {
- prop: 'categoryinfo',
- titles: title.toString()
- } )
- .done( function ( data ) {
+ return apiPromise
+ .then( function ( data ) {
var exists = false;
if ( data.query && data.query.pages ) {
$.each( data.query.pages, function ( id, page ) {
}
} );
}
- d.resolve( exists );
+ return exists;
} )
- .fail( d.reject );
-
- return d.promise( { abort: apiPromise.abort } );
+ .done( ok )
+ .fail( err )
+ .promise( { abort: apiPromise.abort } );
},
/**
* Get a list of categories that match a certain prefix.
- * e.g. given "Foo", return "Food", "Foolish people", "Foosball tables" ...
+ *
+ * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables" ...
+ *
* @param {string} prefix Prefix to match.
* @param {Function} [ok] Success callback (deprecated)
* @param {Function} [err] Error callback (deprecated)
* @return {jQuery.Promise}
* @return {Function} return.done
- * @return {String[]} return.done.categories Matched categories
+ * @return {string[]} return.done.categories Matched categories
*/
getCategoriesByPrefix: function ( prefix, ok, err ) {
- var d = $.Deferred(),
- apiPromise;
+ // Fetch with allpages to only get categories that have a corresponding description page.
+ var apiPromise = this.get( {
+ list: 'allpages',
+ apprefix: prefix,
+ apnamespace: mw.config.get( 'wgNamespaceIds' ).category
+ } );
// Backwards compatibility (< MW 1.20)
if ( ok || err ) {
mw.track( 'mw.deprecate', 'api.cbParam' );
mw.log.warn( msg );
- d.done( ok ).fail( err );
}
- // Fetch with allpages to only get categories that have a corresponding description page.
- apiPromise = this.get( {
- list: 'allpages',
- apprefix: prefix,
- apnamespace: mw.config.get( 'wgNamespaceIds' ).category
- } )
- .done( function ( data ) {
+ return apiPromise
+ .then( function ( data ) {
var texts = [];
if ( data.query && data.query.allpages ) {
$.each( data.query.allpages, function ( i, category ) {
texts.push( new mw.Title( category.title ).getNameText() );
} );
}
- d.resolve( texts );
+ return texts;
} )
- .fail( d.reject );
-
- return d.promise( { abort: apiPromise.abort } );
+ .done( ok )
+ .fail( err )
+ .promise( { abort: apiPromise.abort } );
},
* if title was not found.
*/
getCategories: function ( title, ok, err, async ) {
- var d = $.Deferred(),
- apiPromise;
+ var apiPromise = this.get( {
+ prop: 'categories',
+ titles: String( title )
+ }, {
+ async: async === undefined ? true : async
+ } );
// Backwards compatibility (< MW 1.20)
if ( ok || err ) {
mw.track( 'mw.deprecate', 'api.cbParam' );
mw.log.warn( msg );
- d.done( ok ).fail( err );
}
- apiPromise = this.get( {
- prop: 'categories',
- titles: title.toString()
- }, {
- async: async === undefined ? true : async
- } )
- .done( function ( data ) {
- var ret = false;
+ return apiPromise
+ .then( function ( data ) {
+ var titles = false;
if ( data.query && data.query.pages ) {
$.each( data.query.pages, function ( id, page ) {
if ( page.categories ) {
- if ( typeof ret !== 'object' ) {
- ret = [];
+ if ( titles === false ) {
+ titles = [];
}
$.each( page.categories, function ( i, cat ) {
- ret.push( new mw.Title( cat.title ) );
+ titles.push( new mw.Title( cat.title ) );
} );
}
} );
}
- d.resolve( ret );
+ return titles;
} )
- .fail( d.reject );
-
- return d.promise( { abort: apiPromise.abort } );
+ .done( ok )
+ .fail( err )
+ .promise( { abort: apiPromise.abort } );
}
} );
action: 'edit',
section: 'new',
format: 'json',
- title: title.toString(),
+ title: String( title ),
summary: header,
text: message
} ).done( ok ).fail( err );
options = {};
}
- // Force toString if we got a mw.Uri object
+ // Force a string if we got a mw.Uri object
if ( options.ajax && options.ajax.url !== undefined ) {
options.ajax.url = String( options.ajax.url );
}
* @return {string} return.done.data Parsed HTML of `wikitext`.
*/
parse: function ( wikitext, ok, err ) {
- var d = $.Deferred(),
- apiPromise;
+ var apiPromise = this.get( {
+ action: 'parse',
+ contentmodel: 'wikitext',
+ text: wikitext
+ } );
// Backwards compatibility (< MW 1.20)
if ( ok || err ) {
mw.track( 'mw.deprecate', 'api.cbParam' );
mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
- d.done( ok ).fail( err );
}
- apiPromise = this.get( {
- action: 'parse',
- contentmodel: 'wikitext',
- text: wikitext
+ return apiPromise
+ .then( function ( data ) {
+ return data.parse.text['*'];
} )
- .done( function ( data ) {
- if ( data.parse && data.parse.text && data.parse.text['*'] ) {
- d.resolve( data.parse.text['*'] );
- }
- } )
- .fail( d.reject );
-
- return d.promise( { abort: apiPromise.abort } );
+ .done( ok )
+ .fail( err )
+ .promise( { abort: apiPromise.abort } );
}
} );
/**
* @private
+ * @static
* @context mw.Api
*
- * @param {string|mw.Title|string[]|mw.Title[]} page Full page name or instance of mw.Title or array of pages
+ * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
+ * array thereof. If an array is passed, the return value passed to the promise will also be an
+ * array of appropriate objects.
* @param {Function} [ok] Success callback (deprecated)
* @param {Function} [err] Error callback (deprecated)
* @return {jQuery.Promise}
* @return {Function} return.done
- * @return {Object} return.done.watch
+ * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
+ * parameter)
* @return {string} return.done.watch.title Full pagename
- * @return {boolean} return.done.watch.watched
+ * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
* @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
*/
- function doWatchInternal( page, ok, err, addParams ) {
+ function doWatchInternal( pages, ok, err, addParams ) {
// XXX: Parameter addParams is undocumented because we inherit this
// documentation in the public method..
- var params, apiPromise,
- d = $.Deferred();
+ var apiPromise = this.post(
+ $.extend(
+ {
+ action: 'watch',
+ titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
+ token: mw.user.tokens.get( 'watchToken' ),
+ uselang: mw.config.get( 'wgUserLanguage' )
+ },
+ addParams
+ )
+ );
// Backwards compatibility (< MW 1.20)
if ( ok || err ) {
mw.track( 'mw.deprecate', 'api.cbParam' );
mw.log.warn( 'Use of mediawiki.api callback params is deprecated. Use the Promise instead.' );
- d.done( ok ).fail( err );
}
- params = {
- action: 'watch',
- titles: $.isArray( page ) ? page.join( '|' ) : String( page ),
- token: mw.user.tokens.get( 'watchToken' ),
- uselang: mw.config.get( 'wgUserLanguage' )
- };
-
- if ( addParams ) {
- $.extend( params, addParams );
- }
-
- apiPromise = this.post( params )
- .done( function ( data ) {
- d.resolve( data.watch );
+ return apiPromise
+ .then( function ( data ) {
+ // If a single page was given (not an array) respond with a single item as well.
+ return $.isArray( pages ) ? data.watch : data.watch[0];
} )
- .fail( d.reject );
-
- return d.promise( { abort: apiPromise.abort } );
+ .done( ok )
+ .fail( err )
+ .promise( { abort: apiPromise.abort } );
}
$.extend( mw.Api.prototype, {
*
* @inheritdoc #doWatchInternal
*/
- watch: function ( page, ok, err ) {
- return doWatchInternal.call( this, page, ok, err );
+ watch: function ( pages, ok, err ) {
+ return doWatchInternal.call( this, pages, ok, err );
},
/**
* Convenience method for `action=watch&unwatch=1`.
*
* @inheritdoc #doWatchInternal
*/
- unwatch: function ( page, ok, err ) {
- return doWatchInternal.call( this, page, ok, err, { unwatch: 1 } );
+ unwatch: function ( pages, ok, err ) {
+ return doWatchInternal.call( this, pages, ok, err, { unwatch: 1 } );
}
} );
*/
( function ( mw, $ ) {
// When sending password by email, hide the password input fields.
- function hidePasswordOnEmail() {
+ $( function () {
// Always required if checked, otherwise it depends, so we use the original
var $emailLabel = $( 'label[for="wpEmail"]' ),
originalText = $emailLabel.text(),
$createByMailCheckbox.on( 'change', updateForCheckbox );
updateForCheckbox();
- }
+ } );
- $( hidePasswordOnEmail );
+ // Check if the username is invalid or already taken
+ $( function () {
+ var
+ // We need to hook to all of these events to be sure we are notified of all changes to the
+ // value of an <input type=text> field.
+ events = 'keyup keydown change mouseup cut paste focus blur',
+ $input = $( '#wpName2' ),
+ $statusContainer = $( '#mw-createacct-status-area' ),
+ api = new mw.Api(),
+ currentRequest;
+
+ // Hide any present status messages.
+ function clearStatus() {
+ $statusContainer.slideUp( function () {
+ $statusContainer
+ .removeAttr( 'class' )
+ .empty();
+ } );
+ }
+
+ // Returns a promise receiving a { state:, username: } object, where:
+ // * 'state' is one of 'invalid', 'taken', 'ok'
+ // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not
+ // possible to register such an account)
+ function checkUsername( username ) {
+ // We could just use .then() if we didn't have to pass on .abort()…
+ var d, apiPromise;
+
+ d = $.Deferred();
+ apiPromise = api.get( {
+ action: 'query',
+ list: 'users',
+ ususers: username // '|' in usernames is handled below
+ } )
+ .done( function ( resp ) {
+ var userinfo = resp.query.users[0];
+
+ if ( resp.query.users.length !== 1 ) {
+ // Happens if the user types '|' into the field
+ d.resolve( { state: 'invalid', username: null } );
+ } else if ( userinfo.invalid !== undefined ) {
+ d.resolve( { state: 'invalid', username: null } );
+ } else if ( userinfo.userid !== undefined ) {
+ d.resolve( { state: 'taken', username: null } );
+ } else {
+ d.resolve( { state: 'ok', username: username } );
+ }
+ } )
+ .fail( d.reject );
+
+ return d.promise( { abort: apiPromise.abort } );
+ }
+
+ function updateUsernameStatus() {
+ var
+ username = $.trim( $input.val() ),
+ currentRequestInternal;
+
+ // Abort any pending requests.
+ if ( currentRequest ) {
+ currentRequest.abort();
+ }
+
+ if ( username === '' ) {
+ clearStatus();
+ return;
+ }
+
+ currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) {
+ var message;
+
+ // Another request was fired in the meantime, the result we got here is no longer current.
+ // This shouldn't happen as we abort pending requests, but you never know.
+ if ( currentRequest !== currentRequestInternal ) {
+ return;
+ }
+ // If we're here, then the current request has finished, avoid calling .abort() needlessly.
+ currentRequest = undefined;
+
+ if ( info.state === 'ok' ) {
+ clearStatus();
+ } else {
+ if ( info.state === 'invalid' ) {
+ message = mw.message( 'noname' ).text();
+ } else if ( info.state === 'taken' ) {
+ message = mw.message( 'userexists' ).text();
+ }
+
+ $statusContainer
+ .attr( 'class', 'errorbox' )
+ .empty()
+ .append(
+ // Ugh…
+ // @todo Change the HTML structure in includes/templates/Usercreate.php
+ $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
+ $( '<br>' ),
+ document.createTextNode( message )
+ )
+ .slideDown();
+ }
+ } ).fail( function () {
+ clearStatus();
+ } );
+ }
+
+ $input.on( events, $.debounce( 250, updateUsernameStatus ) );
+ } );
}( mediaWiki, jQuery ) );
-/**
- * JavaScript for the new debug toolbar, enabled through $wgDebugToolbar.
- *
- * @author John Du Hart
- * @since 1.19
- */
-
( function ( mw, $ ) {
'use strict';
var debug,
hovzer = $.getFootHovzer();
+ /**
+ * Debug toolbar.
+ *
+ * Enabled server-side through `$wgDebugToolbar`.
+ *
+ * @class mw.Debug
+ * @singleton
+ * @author John Du Hart
+ * @since 1.19
+ */
debug = mw.Debug = {
/**
* Toolbar container element
*
- * @var {jQuery}
+ * @property {jQuery}
*/
$container: null,
/**
* Object containing data for the debug toolbar
*
- * @var {Object}
+ * @property {Object}
*/
data: {},
/**
- * Initializes the debugging pane.
+ * Initialize the debugging pane
+ *
* Shouldn't be called before the document is ready
* (since it binds to elements on the page).
*
- * @param {Object} data, defaults to 'debugInfo' from mw.config
+ * @param {Object} [data] Defaults to 'debugInfo' from mw.config
*/
init: function ( data ) {
},
/**
- * Switches between panes
+ * Switch between panes
+ *
+ * Should be called with an HTMLElement as its thisArg,
+ * because it's meant to be an event handler.
+ *
+ * TODO: Store cookie for last pane open.
*
- * @todo Store cookie for last pane open
- * @context {Element}
* @param {jQuery.Event} e
*/
switchPane: function ( e ) {
},
/**
- * Constructs the HTML for the debugging toolbar
+ * Construct the HTML for the debugging toolbar
*/
buildHtml: function () {
var $container, $bits, panes, id, gitInfo;
/**
* Returns a jQuery element for a debug-bit div
*
- * @param id
+ * @ignore
+ * @param {string} id
* @return {jQuery}
*/
function bitDiv( id ) {
/**
* Returns a jQuery element for a pane link
*
- * @param id
- * @param text
+ * @ignore
+ * @param {string} id
+ * @param {string} text
* @return {jQuery}
*/
function paneLabel( id, text ) {
/**
* Returns a jQuery element for a debug-bit div with a for a pane link
*
- * @param id CSS id snippet. Will be prefixed with 'mw-debug-'
- * @param text Text to show
- * @param count Optional count to show
+ * @ignore
+ * @param {string} id CSS id snippet. Will be prefixed with 'mw-debug-'
+ * @param {string} text Text to show
+ * @param {string} count Optional count to show
* @return {jQuery}
*/
function paneTriggerBitDiv( id, text, count ) {
},
/**
- * Builds the console panel
+ * Build the console panel
*/
buildConsoleTable: function () {
var $table, entryTypeText, i, length, entry;
},
/**
- * Query list pane
+ * Build query list pane
+ *
+ * @return {jQuery}
*/
buildQueryTable: function () {
var $table, i, length, query;
},
/**
- * Legacy debug log pane
+ * Build legacy debug log pane
+ *
+ * @return {jQuery}
*/
buildDebugLogTable: function () {
var $list, i, length, line;
},
/**
- * Request information pane
+ * Build request information pane
+ *
+ * @return {jQuery}
*/
buildRequestPane: function () {
},
/**
- * Included files pane
+ * Build included files pane
+ *
+ * @return {jQuery}
*/
buildIncludesPane: function () {
var $table, i, length, file;
* You can also launch the feedback form with a prefilled subject and body.
* See the docs for the #launch() method.
*
+ * @class
+ * @constructor
* @param {Object} [options]
* @param {mw.Api} [options.api] if omitted, will just create a standard API
* @param {mw.Title} [options.title="Feedback"] The title of the page where you collect
-/**
- Stylesheet for mediawiki.hlist module
- @author [[User:Edokter]]
+/*!
+ * Stylesheet for mediawiki.hlist module
+ * @author [[User:Edokter]]
*/
.hlist dl,
.hlist ol,
-/**
- .hlist fallbacks for IE 6, 7 and 8.
- @author [[User:Edokter]]
-*/
+/*!
+ * .hlist fallbacks for IE 6, 7 and 8.
+ * @author [[User:Edokter]]
+ */
( function ( mw, $ ) {
var profile = $.client.profile();
nestedAddScript( script, markModuleReady, registry[module].async, 0 );
} else if ( $.isFunction( script ) ) {
registry[module].state = 'ready';
- script( $ );
+ // Pass jQuery twice so that the signature of the closure which wraps
+ // the script can bind both '$' and 'jQuery'.
+ script( $, $ );
handlePending( module );
}
} catch ( e ) {
-/**
- * Stylesheet for mediawiki.notification module
- */
-
.mw-notification-area {
position: absolute;
top: 0;
-/**
+/*!
* Add search suggestions to the search form.
*/
( function ( mw, $ ) {
+/**
+ * @private
+ * @singleton
+ * @class mw.toc
+ */
( function ( mw, $ ) {
'use strict';
"ooui-dialog-action-close": "ДӀачӀагӀа",
"ooui-outline-control-move-down": "Лаха яккха элемент",
"ooui-outline-control-move-up": "Лаккха яккха элемент",
+ "ooui-outline-control-remove": "ДӀадаха меттиг",
"ooui-toolbar-more": "Кхин тӀе"
}
\ No newline at end of file
"ooui-dialog-action-close": "Zavřít",
"ooui-outline-control-move-down": "Přesunout položku dolů",
"ooui-outline-control-move-up": "Přesunout položku nahoru",
+ "ooui-outline-control-remove": "Odstranit položku",
"ooui-toolbar-more": "Další"
}
\ No newline at end of file
"ooui-dialog-action-close": "Pechar",
"ooui-outline-control-move-down": "Mover o elemento abaixo",
"ooui-outline-control-move-up": "Mover o elemento arriba",
+ "ooui-outline-control-remove": "Eliminar o elemento",
"ooui-toolbar-more": "Máis"
}
\ No newline at end of file
"Dj",
"Einstein2",
"Misibacsi",
- "ViDam"
+ "ViDam",
+ "Tacsipacsi"
]
},
"ooui-dialog-action-close": "Bezár",
"ooui-outline-control-move-down": "Elem mozgatása lefelé",
"ooui-outline-control-move-up": "Elem mozgatása felfelé",
+ "ooui-outline-control-remove": "Elem eltávolítása",
"ooui-toolbar-more": "Tovább..."
}
\ No newline at end of file
"ooui-dialog-action-close": "Irekep",
"ooui-outline-control-move-down": "Ipababa ti banag",
"ooui-outline-control-move-up": "Ipangato ti banag",
+ "ooui-outline-control-remove": "Ikkaten ti banag",
"ooui-toolbar-more": "Adu pay"
}
\ No newline at end of file
"Jaideraf",
"Jdforrester",
"Luckas",
- "Vitorvicentevalente"
+ "Vitorvicentevalente",
+ "SandroHc"
]
},
"ooui-dialog-action-close": "Fechar",
"ooui-outline-control-move-down": "Mover item para baixo",
"ooui-outline-control-move-up": "Mover item para cima",
+ "ooui-outline-control-remove": "Remover elemento",
"ooui-toolbar-more": "Mais"
}
\ No newline at end of file
/*!
- * OOjs UI v0.1.0-pre (efc7297353)
+ * OOjs UI v0.1.0-pre (ac0cc69508)
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2014 OOjs Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: Fri Mar 07 2014 17:36:48 GMT-0800 (PST)
+ * Date: Thu Mar 13 2014 17:11:12 GMT-0700 (PDT)
*/
( function () {
* @param {jQuery} $label Label node, assigned to #$label
* @param {Object} [config] Configuration options
* @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
+ * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
*/
OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
// Config intialization
// Initialization
this.$label.addClass( 'oo-ui-labeledElement-label' );
this.setLabel( config.label || this.constructor.static.label );
+ this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
};
/* Static Properties */
* @chainable
*/
OO.ui.LabeledElement.prototype.fitLabel = function () {
- if ( this.$label.autoEllipsis ) {
+ if ( this.$label.autoEllipsis && this.autoFitLabel ) {
this.$label.autoEllipsis( { 'hasSpan': false, 'tooltip': true } );
}
return this;
/*!
- * OOjs UI v0.1.0-pre (efc7297353)
+ * OOjs UI v0.1.0-pre (ac0cc69508)
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2014 OOjs Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: Fri Mar 07 2014 17:36:48 GMT-0800 (PST)
+ * Date: Thu Mar 13 2014 17:11:12 GMT-0700 (PDT)
*/
/* Textures */
.oo-ui-dialog-small .oo-ui-window-frame {
width: 400px;
- max-height: 200px;
+ max-height: 230px;
}
.oo-ui-dialog-medium .oo-ui-window-frame {
width: 600px;
- max-height: 400px;
+ max-height: 460px;
}
.oo-ui-dialog-large .oo-ui-window-frame {
width: 800px;
- max-height: 600px;
+ max-height: 690px;
}
.oo-ui-dialog .oo-ui-frame {
/*!
- * OOjs v1.0.7-pre (22e610a5e9)
+ * OOjs v1.0.8
* https://www.mediawiki.org/wiki/OOjs
*
* Copyright 2011-2014 OOjs Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: Fri Mar 07 2014 17:36:23 GMT-0800 (PST)
+ * Date: Tue Mar 11 2014 19:27:31 GMT+0100 (CET)
*/
( function ( global ) {
return "";
}
+ $html = '';
+
// We override SkinTemplate->formatLanguageName() in SkinCologneBlue
// not to capitalize the language names.
$language_urls = $this->data['language_urls'];
- if ( empty( $language_urls ) ) {
- return "";
- }
+ if ( !empty( $language_urls ) ) {
+ $s = array();
+ foreach ( $language_urls as $key => $data ) {
+ $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+ }
- $s = array();
- foreach ( $language_urls as $key => $data ) {
- $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+ $html = wfMessage( 'otherlanguages' )->text()
+ . wfMessage( 'colon-separator' )->text()
+ . $this->getSkin()->getLanguage()->pipeList( $s );
}
- return wfMessage( 'otherlanguages' )->text()
- . wfMessage( 'colon-separator' )->text()
- . $this->getSkin()->getLanguage()->pipeList( $s );
+ $html .= $this->renderAfterPortlet( 'lang' );
+
+ return $html;
+ }
+
+ /**
+ * @param string $name
+ */
+ protected function renderAfterPortlet( $name ) {
+ $content = '';
+ wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
+
+ $html = $content !== '' ? "<div class='after-portlet after-portlet-$name'>$content</div>" : '';
+
+ return $html;
}
function pageTitleLinks() {
$role = ( $heading == 'search' ) ? 'search' : 'navigation';
$s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
}
+
+ $s .= $this->renderAfterPortlet( $heading );
}
$s .= "</div>\n";
} ?>
</form>
+
+ <?php $this->renderAfterPortlet( 'search' ); ?>
</div>
</div>
<?php
} ?>
</ul>
+<?php $this->renderAfterPortlet( 'cactions' ); ?>
</div>
</div>
<?php
wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
?>
</ul>
+<?php $this->renderAfterPortlet( 'tb' ); ?>
</div>
</div>
<?php
/*************************************************************************************************/
function languageBox() {
- if ( $this->data['language_urls'] ) {
+ if ( $this->data['language_urls'] !== false ) {
?>
<div id="p-lang" class="portlet" role="navigation">
<h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
<?php } ?>
</ul>
+
+<?php $this->renderAfterPortlet( 'lang' ); ?>
</div>
</div>
<?php
# allow raw HTML block to be defined by extensions
print $cont;
}
+
+ $this->renderAfterPortlet( $bar );
?>
</div>
</div>
<?php
}
+
} // end of class
$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
$this->text( 'pageLanguage' );
?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+ <?php $this->html( 'prebodyhtml' ) ?>
<div id="bodyContent">
<?php if ( $this->data['isarticle'] ) { ?>
<div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
$this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
break;
case 'LANGUAGES':
- if ( $this->data['language_urls'] ) {
+ if ( $this->data['language_urls'] !== false ) {
$this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
}
break;
</ul>
<?php
} else { ?>
- <?php echo $content; /* Allow raw HTML block to be defined by extensions */ ?>
-<?php
- } ?>
+ <?php
+ echo $content; /* Allow raw HTML block to be defined by extensions */
+ }
+
+ $this->renderAfterPortlet( $name );
+ ?>
</div>
</div>
<?php
line-height: inherit;
}
+div.after-portlet {
+ display: inline;
+ padding-left: .5em;
+}
+
h1 {
color: #666666;
font-family: Verdana, Arial, sans-serif;
border: 1px solid #aaa;
padding: 0 .8em .3em .5em;
}
+/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
+.pBody:after {
+ content: '';
+ clear: both;
+ display: block;
+}
.portlet ul {
line-height: 1.5em;
font-size: 95%;
--- /dev/null
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+ div#content,
+ div#footer,
+ #left-navigation {
+ .transition(margin-left 250ms, padding 250ms;);
+ }
+
+ #p-logo {
+ .transition(left 250ms);
+ }
+
+ #mw-panel {
+ .transition(padding-right 250ms);
+ }
+
+ #p-search {
+ .transition(margin-right 250ms);
+ }
+
+ #p-personal {
+ .transition(right 250ms);
+ }
+
+ #mw-head-base {
+ .transition(margin-left 250ms);
+ }
+}
.tipsy {
font-size: 0.8em;
}
-
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
- div#content,
- div#footer,
- #left-navigation {
- .transition(margin-left 250ms, padding 250ms;);
- }
-
- #p-logo {
- .transition(left 250ms);
- }
-
- #mw-panel {
- .transition(padding-right 250ms);
- }
-
- #p-search {
- .transition(margin-right 250ms);
- }
-
- #p-personal {
- .transition(right 250ms);
- }
-
- #mw-head-base {
- .transition(margin-left 250ms);
- }
-}
@media screen {
@import "components/common.less";
+ @import "components/animations.less";
@import "components/navigation.less";
@import "components/footer.less";
@import 'components/notifications.less';
$this->description = $description;
}
- /** Whether the test passed */
+ /**
+ * Whether the test passed
+ * @return bool
+ */
public function isSuccess() {
return $this->expected === $this->actual;
}
foreach ( $filenames as $filename ) {
$contents = file_get_contents( $filename );
- preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
+ preg_match_all( '/!!\s*(input|wikitext)\n(.*?)\n!!\s*(result|html|html\/\*|html\/php)/s', $contents, $matches );
foreach ( $matches[1] as $match ) {
$dict .= $match . "\n";
###
!! test
Blank input
-!! input
-!! result
+!! wikitext
+!! html
!! end
!! test
Simple paragraph
-!! input
+!! wikitext
This is a simple paragraph.
-!! result
+!! html
<p>This is a simple paragraph.
</p>
!! end
!! test
Paragraphs with extra newline spacing
-!! input
+!! wikitext
foo
bar
booz
-!! result
+!! html
<p>foo
</p><p>bar
</p><p><br />
!! test
Paragraphs with newline spacing with comment lines in between
-!! input
+!! wikitext
----
a
<!--foo-->
<!--foo-->
b
----
-!! result
+!! html
<hr />
<p>a
b
!! test
Paragraphs with newline spacing with non-empty white-space lines in between
-!! input
+!! wikitext
----
a
b
----
-!! result
+!! html
<hr />
<p>a
</p><p>b
!! test
Paragraphs with newline spacing with non-empty mixed comment and white-space lines in between
-!! input
+!! wikitext
----
a
<!--foo-->
b
----
-!! result
+!! html
<hr />
<p>a
b
!! test
Extra newlines: More paragraphs with indented comment
-!! input
+!! wikitext
a
<!--boo-->
b
-!!result
+!! html
<p>a
</p><p><br />
b
!! test
Extra newlines followed by heading
-!! input
+!! wikitext
a
=b=
-!! result
+!! html
<p>a
</p><p><br />
</p>
!! test
Extra newlines between heading and content are swallowed
-!! input
+!! wikitext
=b=
[[a]]
-!! result
+!! html
<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
<p><a href="/index.php?title=A&action=edit&redlink=1" class="new" title="A (page does not exist)">a</a>
</p>
!! test
Parsing an URL
-!! input
+!! wikitext
http://fr.wikipedia.org/wiki/🍺
<!-- EasterEgg we love beer, better be able be able to link to it -->
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://fr.wikipedia.org/wiki/🍺">http://fr.wikipedia.org/wiki/🍺</a>
</p>
!! end
!! test
Simple list
-!! input
+!! wikitext
* Item 1
* Item 2
-!! result
+!! html
<ul>
<li> Item 1
</li>
!! test
Italics and bold
-!! input
+!! wikitext
* plain
* plain''italic''plain
* plain''italic''plain''italic''plain
* plain'''bold''bold-italic'''''plain
* plain l'''italic''plain
* plain l''''bold''' plain
-!! result
+!! html
<ul>
<li> plain
</li>
# this example taken from the [[simple:Moon]] article (bug 47326)
!! test
Italics and possessives (1)
-!! input
+!! wikitext
obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
-!! result
+!! html
<p>obtained by <i><a href="/index.php?title=Lunar_Prospector&action=edit&redlink=1" class="new" title="Lunar Prospector (page does not exist)">Lunar Prospector</a>'</i>s gamma-ray spectrometer
</p>
!! end
# this example taken from [[en:Flaming Pie]] (bug 49926)
!! test
Italics and possessives (2)
-!! input
+!! wikitext
'''''Flaming Pie''''' is ... released in 1997. In ''Flaming Pie'''s liner notes
-!! result
+!! html
<p><i><b>Flaming Pie</b></i> is ... released in 1997. In <i>Flaming Pie'</i>s liner notes
</p>
!! end
# this example taken from [[en:Dictionary]] (bug 49926)
!! test
Italics and possessives (3)
-!! input
+!! wikitext
The first monolingual dictionary written in a Romance language was ''Sebastián Covarrubias''' ''Tesoro de la lengua castellana o española'', published in 1611 in Madrid. In 1612 the first edition of the ''Vocabolario dell'[[Accademia della Crusca]]'', for Italian, was published. In 1690 in Rotterdam was published, posthumously, the ''Dictionnaire Universel''.
-!! result
+!! html
<p>The first monolingual dictionary written in a Romance language was <i>Sebastián Covarrubias'</i> <i>Tesoro de la lengua castellana o española</i>, published in 1611 in Madrid. In 1612 the first edition of the <i>Vocabolario dell'<a href="/index.php?title=Accademia_della_Crusca&action=edit&redlink=1" class="new" title="Accademia della Crusca (page does not exist)">Accademia della Crusca</a></i>, for Italian, was published. In 1690 in Rotterdam was published, posthumously, the <i>Dictionnaire Universel</i>.
</p>
!! end
###
!! test
Italics and bold: 2-quote opening sequence: (2,2)
-!! input
+!! wikitext
''foo''
-!! result
+!! html
<p><i>foo</i>
</p>
!!end
!! test
Italics and bold: 2-quote opening sequence: (2,3)
-!! input
+!! wikitext
''foo'''
-!! result
+!! html
<p><i>foo'</i>
</p>
!!end
!! test
Italics and bold: 2-quote opening sequence: (2,4)
-!! input
+!! wikitext
''foo''''
-!! result
+!! html
<p><i>foo''</i>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
!! test
-Italics and bold: 2-quote opening sequence: (2,5) (php)
-!! options
-php
-!! input
+Italics and bold: 2-quote opening sequence: (2,5)
+!! wikitext
''foo'''''
-!! result
+!! html/php
<p><i>foo</i>
</p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: 2-quote opening sequence: (2,5) (parsoid)
-!! options
-parsoid
-!! input
-''foo'''''
-!! result
+!! html/parsoid
<p><i>foo</i><b></b>
</p>
!!end
!! test
Italics and bold: 3-quote opening sequence: (3,2)
-!! input
+!! wikitext
'''foo''
-!! result
+!! html
<p>'<i>foo</i>
</p>
!!end
!! test
Italics and bold: 3-quote opening sequence: (3,3)
-!! input
+!! wikitext
'''foo'''
-!! result
+!! html
<p><b>foo</b>
</p>
!!end
!! test
Italics and bold: 3-quote opening sequence: (3,4)
-!! input
+!! wikitext
'''foo''''
-!! result
+!! html
<p><b>foo'</b>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
!! test
-Italics and bold: 3-quote opening sequence: (3,5) (php)
-!! options
-php
-!! input
+Italics and bold: 3-quote opening sequence: (3,5)
+!! wikitext
'''foo'''''
-!! result
+!! html/php
<p><b>foo</b>
</p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: 3-quote opening sequence: (3,5) (parsoid)
-!! options
-parsoid
-!! input
-'''foo'''''
-!! result
+!! html/parsoid
<p><b>foo</b><i></i>
</p>
!!end
!! test
Italics and bold: 4-quote opening sequence: (4,2)
-!! input
+!! wikitext
''''foo''
-!! result
+!! html
<p>''<i>foo</i>
</p>
!!end
!! test
Italics and bold: 4-quote opening sequence: (4,3)
-!! input
+!! wikitext
''''foo'''
-!! result
+!! html
<p>'<b>foo</b>
</p>
!!end
!! test
Italics and bold: 4-quote opening sequence: (4,4)
-!! input
+!! wikitext
''''foo''''
-!! result
+!! html
<p>'<b>foo'</b>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
!! test
-Italics and bold: 4-quote opening sequence: (4,5) (php)
-!! options
-php
-!! input
+Italics and bold: 4-quote opening sequence: (4,5)
+!! wikitext
''''foo'''''
-!! result
+!! html/php
<p>'<b>foo</b>
</p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: 4-quote opening sequence: (4,5) (parsoid)
-!! options
-parsoid
-!! input
-''''foo'''''
-!! result
+!! html/parsoid
<p>'<b>foo</b><i></i>
</p>
!!end
!! test
Italics and bold: 5-quote opening sequence: (5,2)
!! options
-!! input
+!! wikitext
'''''foo''
-!! result
+!! html
<p><b><i>foo</i></b>
</p>
!!end
!! test
Italics and bold: 5-quote opening sequence: (5,3)
-!! input
+!! wikitext
'''''foo'''
-!! result
+!! html
<p><i><b>foo</b></i>
</p>
!!end
!! test
Italics and bold: 5-quote opening sequence: (5,4)
-!! input
+!! wikitext
'''''foo''''
-!! result
+!! html
<p><i><b>foo'</b></i>
</p>
!!end
!! test
Italics and bold: 5-quote opening sequence: (5,5)
-!! input
+!! wikitext
'''''foo'''''
-!! result
+!! html
<p><i><b>foo</b></i>
</p>
!!end
###
!! test
Italics and bold: multiple quote sequences: (2,4,2)
-!! input
+!! wikitext
''foo''''bar''
-!! result
+!! html
<p><i>foo'<b>bar</b></i>
</p>
!!end
!! test
Italics and bold: multiple quote sequences: (2,4,3)
-!! input
+!! wikitext
''foo''''bar'''
-!! result
+!! html
<p><i>foo'<b>bar</b></i>
</p>
!!end
!! test
Italics and bold: multiple quote sequences: (2,4,4)
-!! input
+!! wikitext
''foo''''bar''''
-!! result
+!! html
<p><i>foo'<b>bar'</b></i>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
!! test
-Italics and bold: multiple quote sequences: (3,4,2) (php)
-!! options
-php
-!! input
+Italics and bold: multiple quote sequences: (3,4,2)
+!! wikitext
'''foo''''bar''
-!! result
+!! html/php
<p><b>foo'</b>bar
</p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: multiple quote sequences: (3,4,2) (parsoid)
-!! options
-parsoid
-!! input
-'''foo''''bar''
-!! result
+!! html/parsoid
<p><b>foo'</b>bar<i></i>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
!! test
-Italics and bold: multiple quote sequences: (3,4,3) (php)
-!! options
-php
-!! input
+Italics and bold: multiple quote sequences: (3,4,3)
+!! wikitext
'''foo''''bar'''
-!! result
+!! html/php
<p><b>foo'</b>bar
</p>
-!!end
-# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
-!! test
-Italics and bold: multiple quote sequences: (3,4,3) (parsoid)
-!! options
-parsoid
-!! input
-'''foo''''bar'''
-!! result
+!! html/parsoid
<p><b>foo'</b>bar<b></b>
</p>
!!end
###
!! test
Italics and bold: other quote tests: (2,3,5)
-!! input
+!! wikitext
''this is about '''foo's family'''''
-!! result
+!! html
<p><i>this is about <b>foo's family</b></i>
</p>
!!end
!! test
Italics and bold: other quote tests: (2,(3,3),2)
-!! input
+!! wikitext
''this is about '''foo's''' family''
-!! result
+!! html
<p><i>this is about <b>foo's</b> family</i>
</p>
!!end
!! test
Italics and bold: other quote tests: (3,2,3,2)
-!! input
+!! wikitext
'''this is about ''foo'''s family''
-!! result
+!! html
<p><b>this is about <i>foo</i></b><i>s family</i>
</p>
!!end
!! test
Italics and bold: other quote tests: (3,2,3,3)
!! options
-!! input
+!! wikitext
'''this is about ''foo'''s family'''
-!! result
+!! html
<p>'<i>this is about </i>foo<b>s family</b>
</p>
!!end
!! test
Italics and bold: other quote tests: (3,(2,2),3)
-!! input
+!! wikitext
'''this is about ''foo's'' family'''
-!! result
+!! html
<p><b>this is about <i>foo's</i> family</b>
</p>
!!end
!! test
Italicized possessive
-!! input
+!! wikitext
The ''[[Main Page]]'''s talk page.
-!! result
+!! html
<p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
</p>
!! end
(Requires tidy for PHP parser output to be fixed up)
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
{|
!''a!!''b
|''a||''b
|}
-!! result
+!! html
<table>
<tbody><tr><th><i>a</i></th><th><i>b</i></th>
<td><i>a</i></td><td><i>b</i></td></tr>
!! test
Non-html5 tags should be accepted
-!! input
+!! wikitext
<center>''foo''</center>
<big>''foo''</big>
<font>''foo''</font>
<strike>''foo''</strike>
<tt>''foo''</tt>
-!! result
+!! html
<center><i>foo</i></center>
<p><big><i>foo</i></big>
<font><i>foo</i></font>
!! test
<wbr> is valid wikitext (bug 52468)
-!! input
+!! wikitext
<wbr>
-!! result
+!! html
<p><wbr />
</p>
!! end
# <strike> is HTML4, <s> is HTML4/5.
!! test
<s> or <strike> for strikethrough
-!! input
+!! wikitext
<strike>strike</strike>
<s>s</s>
-!! result
+!! html
<p><strike>strike</strike>
</p><p><s>s</s>
</p>
!! test
Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
-!! input
+!! wikitext
<b→> doesn't work! </b→>
<bä> doesn't work! </bä>
<s.foo>s.foo</s.foo>
<sub-ID#1>
-!! result
+!! html
<p><b→> doesn't work! </b→>
</p><p><bä> doesn't work! </bä>
</p><p><boo> works fine </boo>
!! test
Isolated close tags should be treated as literal text (bug 52760)
-!! input
+!! wikitext
</b>
<s.foo>s</s>
-!! result
+!! html
<p></b>
</p><p><s.foo>s</s>
</p>
!! test
Bare pipe character (bug 52363)
-!! input
+!! wikitext
|
-!! result
+!! html
<p>|
</p>
!! end
!! test
Bare pipe character from a template (bug 52363)
-!! input
+!! wikitext
{{pipe}}
-!! result
+!! html
<p>|
</p>
!! end
!! test
<nowiki> unordered list
-!! input
+!! wikitext
<nowiki>* This is not an unordered list item.</nowiki>
-!! result
+!! html
<p>* This is not an unordered list item.
</p>
!! end
!! test
<nowiki> spacing
-!! input
+!! wikitext
<nowiki>Lorem ipsum dolor
sed abit.
:and a colon
</nowiki>
-!! result
+!! html
<p>Lorem ipsum dolor
sed abit.
!! test
nowiki 3
-!! input
+!! wikitext
:There is not nowiki.
:There is <nowiki>nowiki</nowiki>.
*There is not nowiki.
*There is <nowiki>nowiki</nowiki>.
-!! result
+!! html
<dl>
<dd>There is not nowiki.
</dd>
!! test
Entities inside <nowiki>
-!! input
+!! wikitext
<nowiki><</nowiki>
-!! result
+!! html
<p><
</p>
!! end
Entities inside template parameters
!! options
parsoid
-!! input
+!! wikitext
{{echo|–}}
-!! result
+!! html
<p><span typeof="mw:Transclusion mw:Entity" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&ndash;"}},"i":0}}]}'>–</span>
</p>
!! end
###
!! test
Comments and Indent-Pre
-!! input
+!! wikitext
<!-- comment 1 --> asdf
<!-- comment 1 --> asdf
<!-- comment 1 --> asdf
<!-- comment 2 --> xyz
-!! result
+!! html
<pre>asdf
</pre>
<pre>asdf
!! test
Comment test 2a
-!! input
+!! wikitext
asdf
<!-- comment 1 -->
jkl
-!! result
+!! html
<p>asdf
jkl
</p>
!! test
Comment test 2b
-!! input
+!! wikitext
asdf
<!-- comment 1 -->
jkl
-!! result
+!! html
<p>asdf
</p><p>jkl
</p>
!! test
Comment test 3
-!! input
+!! wikitext
asdf
<!-- comment 1 -->
<!-- comment 2 -->
jkl
-!! result
+!! html
<p>asdf
jkl
</p>
!! test
Comment test 4
-!! input
+!! wikitext
asdf<!-- comment 1 -->jkl
-!! result
+!! html
<p>asdfjkl
</p>
!! end
!! test
Comment spacing
-!! input
+!! wikitext
a
<!-- foo --> b <!-- bar -->
c
-!! result
+!! html
<p>a
</p>
<pre> b
!! test
Comment whitespace
-!! input
+!! wikitext
<!-- returns a single newline, not nothing, since the newline after > is not stripped -->
-!! result
+!! html
!! end
!! test
Comment semantics and delimiters
-!! input
+!! wikitext
<!-- --><!----><!-----><!------>
-!! result
+!! html
!! end
!! test
Comment semantics and delimiters, redux
-!! input
+!! wikitext
<!-- In SGML every "foo" here would actually show up in the text -- foo -- bar
-- foo -- funky huh? ... -->
-!! result
+!! html
!! end
!! test
Comment semantics and delimiters: directors cut
-!! input
+!! wikitext
<!-- ... However we like to keep things simple and somewhat XML-ish so we eat
everything starting with < followed by !-- until the first -- and > we see,
that wouldn't be valid XML however, since in XML -- has to terminate a comment
-->-->
-!! result
+!! html
<p>-->
</p>
!! end
!! test
Comment semantics: nesting
-!! input
+!! wikitext
<!--<!-- no, we're not going to do anything fancy here -->-->
-!! result
+!! html
<p>-->
</p>
!! end
!! test
Comment semantics: unclosed comment at end
-!! input
+!! wikitext
<!--This comment will run out to the end of the document
-!! result
+!! html
!! end
!! test
Comment in template title
-!! input
+!! wikitext
{{f<!---->oo}}
-!! result
+!! html
<p>FOO
</p>
!! end
!! test
Comment on its own line post-expand
-!! input
+!! wikitext
a
{{blank}}<!---->
b
-!! result
+!! html
<p>a
</p><p>b
</p>
!! test
Comment on its own line post-expand with non-significant whitespace
-!! input
+!! wikitext
a
{{blank}} <!---->
b
-!! result
+!! html
<p>a
</p><p>b
</p>
###
!! test
No block tags
-!! input
+!! wikitext
a
b
-!! result
+!! html
<p>a
</p><p>b
</p>
!! test
Block tag on one line (<div>)
-!! input
+!! wikitext
a <div>foo</div>
b
-!! result
+!! html
a <div>foo</div>
<p>b
</p>
!! test
Block tag on one line (<blockquote>)
-!! input
+!! wikitext
a <blockquote>foo</blockquote>
b
-!! result
+!! html
a <blockquote>foo</blockquote>
<p>b
</p>
!! test
Block tag on both lines (<div>)
-!! input
+!! wikitext
a <div>foo</div>
b <div>foo</div>
-!! result
+!! html
a <div>foo</div>
b <div>foo</div>
!! test
Block tag on both lines (<blockquote>)
-!! input
+!! wikitext
a <blockquote>foo</blockquote>
b <blockquote>foo</blockquote>
-!! result
+!! html
a <blockquote>foo</blockquote>
b <blockquote>foo</blockquote>
!! test
Multiple lines without block tags
-!! input
+!! wikitext
<div>foo</div> a
b
c
d<!--foo--> e
x <div>foo</div> z
-!! result
+!! html
<div>foo</div> a
<p>b
c
!! test
Empty lines between lines with block tags
-!! input
+!! wikitext
<div></div>
<div>e</div>
-!! result
+!! html
<div></div>
<p><br />
</p>
## PHP parser emits output which is broken
!! test
Unclosed HTML p-tags should be handled properly
-!! options
-parsoid
-!! input
+!! wikitext
<div><p>foo</div>
a
b
-!! result
+!! html/parsoid
<div data-parsoid='{"stx":"html"}'><p data-parsoid='{"stx":"html", "autoInsertedEnd":true}'>foo</p></div>
<p>a</p>
<p>b</p>
###
!! test
Preformatted text
-!! input
+!! wikitext
This is some
Preformatted text
With ''italic''
And '''bold'''
And a [[Main Page|link]]
-!! result
+!! html
<pre>This is some
Preformatted text
With <i>italic</i>
!! test
Tabs don't trigger preformatted text
-!! input
+!! wikitext
This is not
preformatted text.
This is preformatted text.
So is this.
-!! result
+!! html
<p> This is not
preformatted text.
</p>
!! test
Ident preformatting with inline content
-!! input
+!! wikitext
a
''b''
-!! result
+!! html
<pre>a
<i>b</i>
</pre>
!! test
<pre> with <nowiki> inside (compatibility with 1.6 and earlier)
-!! input
+!! wikitext
<pre><nowiki>
<b>
<cite>
<em>
</nowiki></pre>
-!! result
+!! html
<pre>
<b>
<cite>
!! test
Regression with preformatted in <center>
-!! input
+!! wikitext
<center>
Blah
</center>
-!! result
+!! html
<center>
<pre>Blah
</pre>
!! test
Bug 52763: Preformatted in <blockquote>
-!! input
+!! wikitext
<blockquote>
Blah
{|
indented cell (no pre-wrapping!)
|}
</blockquote>
-!! result
+!! html
<blockquote>
<p> Blah
</p>
!! test
Bug 51086: Double newlines in blockquotes should be turned into paragraphs
-!! input
+!! wikitext
<blockquote>
Foo
Bar
</blockquote>
-!! result
+!! html
<blockquote>
<p>Foo
</p><p>Bar
!! test
Bug 15491: <ins>/<del> in blockquote
-!! input
+!! wikitext
<blockquote>
Foo <del>bar</del> <ins>baz</ins> quux
</blockquote>
-!! result
+!! html
<blockquote>
<p>Foo <del>bar</del> <ins>baz</ins> quux
</p>
# below in a <p> tag. (see comment 23-25 of bug #6200)
!! test
Bug 15491: <ins>/<del> in blockquote (2)
-!! input
+!! wikitext
<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
</blockquote>
-!! result
+!! html
<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
</blockquote>
!! test
<pre> with attributes (bug 3202)
-!! input
+!! wikitext
<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
-!! result
+!! html
<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
!! end
!! test
<pre> with width attribute (bug 3202)
-!! input
+!! wikitext
<pre width="8">Narrow screen goodies</pre>
-!! result
+!! html
<pre width="8">Narrow screen goodies</pre>
!! end
!! test
<pre> with forbidden attribute (bug 3202)
-!! input
+!! wikitext
<pre width="8" onmouseover="alert(document.cookie)">Narrow screen goodies</pre>
-!! result
+!! html
<pre width="8">Narrow screen goodies</pre>
!! end
!! test
Entities inside <pre>
-!! input
+!! wikitext
<pre><</pre>
-!! result
+!! html
<pre><</pre>
!! end
!! test
<pre> with forbidden attribute values (bug 3202)
-!! input
+!! wikitext
<pre width="8" style="border-width: expression(alert(document.cookie))">Narrow screen goodies</pre>
-!! result
+!! html
<pre width="8" style="/* insecure input */">Narrow screen goodies</pre>
!! end
!! test
<nowiki> inside <pre> (bug 13238)
-!! input
+!! wikitext
<pre>
<nowiki>
</pre>
<nowiki></nowiki>
</pre>
<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>
-!! result
+!! html
<pre>
<nowiki>
</pre>
!! test
<nowiki> and <pre> preference (first one wins)
-!! input
+!! wikitext
<pre>
<nowiki>
</pre>
</nowiki>
</pre>
-!! result
+!! html
<pre>
<nowiki>
</pre>
!! test
</pre> inside nowiki
-!! input
+!! wikitext
<nowiki></pre></nowiki>
-!! result
+!! html
<p></pre>
</p>
!! end
!! test
Empty pre; pre inside other HTML tags (bug 54946)
-!! input
+!! wikitext
a
<div><pre>
foo
</pre></div>
<pre></pre>
-!! result
+!! html
<p>a
</p>
<div><pre>
!! test
HTML pre followed by indent-pre
-!! input
+!! wikitext
<pre>foo</pre>
bar
-!! result
+!! html
<pre>foo</pre>
<pre>bar
</pre>
Block tag pre
!!options
parsoid
-!!input
+!! wikitext
<p><pre>foo</pre></p>
-!!result
+!! html
<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre data-parsoid='{"stx":"html"}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
!!end
!!test
Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
-!!input
+!! wikitext
{{echo|}}
-!!result
+!! html
!!end
!!test
Templates: Indent-Pre: 1b. Templates that break a line should suppress <pre>
-!!input
+!! wikitext
{{echo|
foo}}
-!!result
+!! html
<p>foo
</p>
!!end
!! test
Templates: Indent-Pre: 1c: Wrapping should be based on expanded content
-!! input
+!! wikitext
{{echo|a
b}}
-!!result
+!! html
<pre>a
</pre>
<p>b
!! test
Templates: Indent-Pre: 1d: Wrapping should be based on expanded content
-!! input
+!! wikitext
{{echo|a
b
c
d
e
}}
-!!result
+!! html
<pre>a
</pre>
<p>b
!!test
Templates: Indent-Pre: 1e. Wrapping should be based on expanded content
-!!input
+!! wikitext
{{echo| foo}}
{{echo| foo}}{{echo| bar}}
<!--cmt-->{{echo| foo}}
{{echo|{{echo| }}bar}}
-!!result
+!! html
<pre>foo
</pre>
<pre>foo bar
!! test
Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
-!! input
+!! wikitext
{{echo| }}a
{{echo|
{{echo|a
}} b
-!!result
+!! html
<pre>a
</pre>
<p><br />
!! test
Things that look like <pre> tags aren't treated as such
-!! input
+!! wikitext
Barack Obama <President> of the United States
-!! result
+!! html
<p>Barack Obama <President> of the United States
</p>
!! end
Parsoid: handle pre with space after attribute
!! options
parsoid=wt2html
-!! input
+!! wikitext
<pre style="width:50%;" >{{echo|foo}}</pre>
-!! result
+!! html
<pre style="width:50%;">{{echo|foo}}</pre>
!! end
Parsoid: Don't paragraph-wrap fosterable content
!! options
parsoid=wt2html
-!! input
+!! wikitext
{|
<td></td>
<td></td>
|}
-!! result
+!! html
<table>
<tbody>
Parsoid: Don't paragraph-wrap fosterable content even if table syntax is unbalanced
!! options
parsoid=wt2html
-!! input
+!! wikitext
{|
<td>
<td>
|}
-!! result
+!! html
<table>
<tbody>
#--------------------------------------------------------------------
!! test
Templates: Strip leading and trailing whitespace from named-param values
-!! input
+!! wikitext
{{echo|1= a }}
{{echo|1= {{echo|b}} }}
{{echo| 1 =
* d
}}
-!! result
+!! html
<p>a
</p><p>b
</p><p>c
!! test
Templates: Don't strip whitespace from positional-param values
-!! input
+!! wikitext
{{echo|a }}
{{echo|{{echo|b}} }}
{{echo|
}}g
-!! result
+!! html
<p>a
</p><p>b
</p>
!! test
Templates: Handle empty comment-and-ws-only lines correctly
-!! input
+!! wikitext
{{echo|foo
<!--should be ignored-->
<!--should be ignored as well-->
bar}}
-!! result
+!! html
<p>foo
bar
</p>
Templates: Parsoid parameter escaping test 1
!! options
parsoid
-!! input
+!! wikitext
{{echo|[foo]|{{echo|[bar]}}}}
-!! result
+!! html
<p about="#mwt1" typeof="mw:Transclusion"
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[foo]"},"2":{"wt":"{{echo|[bar]}}"}},"i":0}}]}'>[foo]</p>
!! end
Parsoid: Pipes in external links in template parameter
!! options
parsoid
-!! input
+!! wikitext
{{echo|[{{echo|http://example.com}} link]}}
-!! result
+!! html
<p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{echo|http://example.com}} link]"}},"i":0}}]}'>link</a></p>
!! end
Parsoid: pipe in transclusion parameter
!! options
parsoid
-!! input
+!! wikitext
{{echo|http://foo.com/a|b}}
-!! result
+!! html
<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
typeof="mw:Transclusion"
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p>
Parsoid: Pipe in external link target and content in template parameter
!! options
parsoid=html2wt,wt2wt
-!! input
+!! wikitext
{{echo|[http://foo.com/a|b a|b]}}
-!! result
+!! html
<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
typeof="mw:Transclusion"
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
Templates: Don't escape already nowiki-escaped text in template parameters
!! options
parsoid=html2wt,wt2wt
-!! input
+!! wikitext
{{echo|foo<nowiki>|</nowiki>bar}}
{{echo|<nowiki><div></nowiki>}}
{{echo|<nowiki></nowiki>}}
-!! result
+!! html
<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}}]}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span>
<span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&lt;div&gt;</nowiki>"}},"i":0}}]}'><span typeof="mw:Entity"><</span>div<span typeof="mw:Entity">></span></span>
<span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}}]}'></span>
Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param
!! options
parsoid=html2wt,wt2wt
-!! input
+!! wikitext
{{echo|{{echo|1=bar}}}}
-!! result
+!! html
<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
!! end
Templates parameters with special tokenizing behavior dont get modified because of arg escaping
!! options
parsoid
-!! input
+!! wikitext
{{echo|a : b}}
-!! result
+!! html
<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
!! end
!!test
1a. Indent-Pre and Comments
-!!input
+!! wikitext
a
<!--a-->
c
-!!result
+!! html
<pre>a
</pre>
<p>c
!!test
1b. Indent-Pre and Comments
-!!input
+!! wikitext
a
<!--a-->
c
-!!result
+!! html
<pre>a
</pre>
<p>c
!!test
1c. Indent-Pre and Comments
-!!input
+!! wikitext
<!--a--> a
<!--a--> a
-!!result
+!! html
<pre> a
</pre>
<pre> a
!!test
1d. Indent-Pre and Comments
(Pre-handler currently cannot distinguish between comment/ws order and normalizes them to [comment,ws] order)
-!!input
+!! wikitext
<!--a--> a
<!--b-->b
-!!result
+!! html
<pre>a
</pre>
<pre>b
!!test
2a. Indent-Pre and tables
-!!input
+!! wikitext
{|
|-
!h1!!h2
|foo||bar
|}
-!!result
+!! html
<table>
<tr>
!!test
2b. Indent-Pre and tables
-!!input
+!! wikitext
{|
|-
|foo
|}
-!!result
+!! html
<table>
<tr>
!!test
2c. Indent-Pre and tables (bug 42252)
-!!input
+!! wikitext
{|
|+ foo
! | bar
|}
-!!result
+!! html
<table>
<caption> foo
</caption>
!!test
3a. Indent-Pre and block tags (single-line html)
-!!input
+!! wikitext
a <p> foo </p>
b <div> foo </div>
c <blockquote> foo </blockquote>
<span> foo </span>
-!!result
+!! html
a <p> foo </p>
b <div> foo </div>
c <blockquote> foo </blockquote>
!!test
3b. Indent-Pre and block tags (multi-line html)
-!!input
+!! wikitext
a <span>foo</span>
b <div> foo </div>
-!!result
+!! html
<pre>a <span>foo</span>
</pre>
b <div> foo </div>
!!test
3c. Indent-Pre and block tags (pre-content on separate line)
-!!input
+!! wikitext
<p>
foo
</p>
foo
</li></ul>
-!!result
+!! html
<p>
foo
</p>
!!test
4. Indent-Pre and extension tags
-!!input
+!! wikitext
a <gallery>
File:foobar.jpg
</gallery>
-!!result
+!! html
a <ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
Leading pipes outside of tables
!! options
parsoid
-!! input
+!! wikitext
| foo
-!! result
+!! html
<p>| foo</p>
!! end
Leading pipes outside of tables 2
!! options
parsoid
-!! input
+!! wikitext
a
| foo
b
-!! result
+!! html
<p>a
| foo
b</p>
Leading pipes outside of tables 3
!! options
parsoid
-!! input
+!! wikitext
a
| class="foo bar" | baz
b
-!! result
+!! html
<p>a
| class="foo bar" | baz
b</p>
!!test
Render paragraphs when indent-pre is suppressed in blocklevels
-!!input
+!! wikitext
<blockquote>
foo
bar
</blockquote>
-!! result
+!! html
<blockquote>
<p> foo
</p><p> bar
!!test
4. Multiple spaces at start-of-line
-!!input
+!! wikitext
<p> foo </p>
foo
{|
|foo
|}
-!!result
+!! html
<p> foo </p>
<pre> foo
</pre>
## NOTE: the leading white-space chars on empty line are significant
!! test
5a. White-space in indent-pre
-!! input
+!! wikitext
a<br />
b
-!! result
+!! html
<pre>a<br />
b
## NOTE: the leading white-space chars on empty line are significant
!! test
5b. White-space in indent-pre
-!! input
+!! wikitext
a
b
c
-!! result
+!! html
<pre>a
b
!! test
5c. White-space in indent-pre
-!! input
+!! wikitext
''a''
''b''
''c''
-!! result
+!! html
<pre><i>a</i>
<i>b</i>
<i>c</i>
!! test
6. Pre-blocks should extend across lines with leading WS even when there is no wrappable content
-!! input
+!! wikitext
a
<!-- continue -->
c
d
-!! result
+!! html
<pre>a
b
7a. Indent-pre and category links
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
[[Category:foo]] <!-- No pre-wrapping -->
{{echo| [[Category:foo]]}} <!-- No pre-wrapping -->
-!! result
+!! html
<link rel="mw:PageProp/Category" href="./Category:Foo"> <!-- No pre-wrapping -->
<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span>
<link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre-wrapping -->
7b. Indent-pre and category links
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
[[Category:foo]] a
[[Category:foo]] {{echo|b}}
-!! result
+!! html
<pre>
<link rel="mw:PageProp/Category" href="./Category:Foo"> a
!!test
HTML-pre: 1. embedded newlines
-!!input
+!! wikitext
<pre>foo</pre>
<pre>
foo
</pre>
-!!result
+!! html
<pre>foo</pre>
<pre>
foo
!!test
HTML-pre: 2: indented text
-!!input
+!! wikitext
<pre>
foo
</pre>
-!!result
+!! html
<pre>
foo
</pre>
!!test
HTML-pre: 3: other wikitext
-!!input
+!! wikitext
<pre>
* foo
# bar
'' no-italic ''
[[ NoLink ]]
</pre>
-!!result
+!! html
<pre>
* foo
# bar
###
!! test
Simple definition
-!! input
+!! wikitext
; name : Definition
-!! result
+!! html
<dl>
<dt> name </dt>
<dd> Definition
!! test
Definition list for indentation only
-!! input
+!! wikitext
: Indented text
-!! result
+!! html
<dl>
<dd> Indented text
</dd>
!! test
Definition list with no space
-!! input
+!! wikitext
;name:Definition
-!! result
+!! html
<dl>
<dt>name</dt>
<dd>Definition
!! test
Definition list with URL link
-!! input
+!! wikitext
; http://example.com/ : definition
-!! result
+!! html
<dl>
<dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> </dt>
<dd> definition
!! test
Definition list with bracketed URL link
-!! input
+!! wikitext
;[http://www.example.com/ Example]:Something about it
-!! result
+!! html
<dl>
<dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt>
<dd>Something about it
!! test
Definition list with wikilink containing colon
-!! input
+!! wikitext
; [[Help:FAQ]]: The least-read page on Wikipedia
-!! result
+!! html
<dl>
<dt> <a href="/index.php?title=Help:FAQ&action=edit&redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
<dd> The least-read page on Wikipedia
# At Brion's and JeLuF's insistence... :)
!! test
Definition list with news link containing colon
-!! input
+!! wikitext
; news:alt.wikipedia.rox: This isn't even a real newsgroup!
-!! result
+!! html
<dl>
<dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
<dd> This isn't even a real newsgroup!
!! test
Malformed definition list with colon
-!! input
+!! wikitext
; news:alt.wikipedia.rox -- don't crash or enter an infinite loop
-!! result
+!! html
<dl>
<dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
</dt>
!! test
Definition lists: colon in external link text
-!! input
+!! wikitext
; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
-!! result
+!! html
<dl>
<dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia : The Next Generation</a></dt>
<dd> OK, I made that up
!! test
Definition lists: colon in HTML attribute
-!! input
+!! wikitext
;<b style="display: inline">bold</b>
-!! result
+!! html
<dl>
<dt><b style="display: inline">bold</b>
</dt>
!! test
Definition lists: self-closed tag
-!! input
+!! wikitext
;one<br/>two : two-line fun
-!! result
+!! html
<dl>
<dt>one<br />two </dt>
<dd> two-line fun
!! test
Bug 11748: Literal closing tags
-!! input
+!! wikitext
<dl>
<dt>test 1</dt>
<dd>test test test test test</dd>
<dt>test 2</dt>
<dd>test test test test test</dd>
</dl>
-!! result
+!! html
<dl>
<dt>test 1</dt>
<dd>test test test test test</dd>
!! test
Definition and unordered list using wiki syntax nested in unordered list using html tags.
-!! input
+!! wikitext
<ul><li>
; term : description
* unordered
</li></ul>
-!! result
+!! html
<ul><li>
<dl>
<dt> term </dt>
!! test
Definition list with empty definition and following paragraph
-!! input
+!! wikitext
; term:
Paragraph text
-!! result
+!! html
<dl>
<dt> term</dt>
<dd>
!! test
Nested definition lists using html syntax
-!! input
+!! wikitext
<dl><dd>
<dl>
<dd>Foo</dd>
</dl>
</dd></dl>
-!! result
+!! html
<dl><dd>
<dl>
<dd>Foo</dd>
!! test
Definition Lists: No nesting: Multiple dd's
-!! input
+!! wikitext
;x
:a
:b
-!! result
+!! html
<dl>
<dt>x
</dt>
!! test
Definition Lists: Indentation: Regular
-!! input
+!! wikitext
:i1
::i2
:::i3
-!! result
+!! html
<dl>
<dd>i1
<dl>
!! test
Definition Lists: Indentation: Missing 1st level
-!! input
+!! wikitext
::i2
:::i3
-!! result
+!! html
<dl>
<dd><dl>
<dd>i2
!! test
Definition Lists: Indentation: Multi-level indent
-!! input
+!! wikitext
:::i3
-!! result
+!! html
<dl>
<dd><dl>
<dd><dl>
!! test
Definition Lists: Hacky use to indent tables
-!! input
+!! wikitext
::{|
|foo
|bar
|}
this text
should be left alone
-!! result
+!! html
<dl><dd><dl><dd><table>
<tr>
<td>foo
Definition Lists: Hacky use to indent tables (WS-insensitive)
!! options
parsoid
-!! input
+!! wikitext
: {|
|a
|}
-!! result
+!! html
<dl>
<dd> <table><tr><td>a</td></tr></table> </dd>
</dl>
!! test
Table / list interaction: indented table with lists in table contents
-!! input
+!! wikitext
:{|
|-
| a
| c
* d
|}
-!! result
+!! html
<dl><dd><table>
<tr>
!!test
Table / list interaction: lists nested in tables nested in indented lists
-!!input
+!! wikitext
:{|
|
:a
*e
*f
-!!result
+!! html
<dl><dd><table>
<tr>
<td>
Definition Lists: Nesting: Multi-level (Parsoid only)
!! options
parsoid
-!! input
+!! wikitext
;t1 :d1
;;t2 ::d2
;;;t3 :::d3
-!! result
+!! html
<dl>
<dt>t1 </dt>
<dd>d1</dd>
Definition Lists: Nesting: Test 2 (Parsoid only)
!! options
parsoid
-!! input
+!! wikitext
;t1
::d2
-!! result
+!! html
<dl>
<dt>t1</dt>
<dd>
Definition Lists: Nesting: Test 3 (Parsoid only)
!! options
parsoid
-!! input
+!! wikitext
:;t1
::::d2
-!! result
+!! html
<dl>
<dd>
<dl>
!! test
Definition Lists: Nesting: Test 4
-!! input
+!! wikitext
::;t3
:::d3
-!! result
+!! html
<dl>
<dd><dl>
<dd><dl>
## bug in the PHP parser. (Parsoid team thinks the PHP parser is
## wrong to close the <dl> after the <dt> containing the <ul>.)
!! test
-Definition Lists: Mixed Lists: Test 1 (php)
-!! options
-php
-!! input
+Definition Lists: Mixed Lists: Test 1
+!! wikitext
:;* foo
::* bar
:; baz
-!! result
+!! html/php
<dl>
<dd><dl>
<dt><ul>
</dd>
</dl>
-!! end
-!! test
-Definition Lists: Mixed Lists: Test 1 (parsoid)
-!! options
-parsoid
-!! input
-:;* foo
-::* bar
-:; baz
-!! result
+!! html/parsoid
<dl>
<dd><dl>
<dt><ul>
!! test
Definition Lists: Mixed Lists: Test 2
-!! input
+!! wikitext
*: d1
*: d2
-!! result
+!! html
<ul>
<li><dl>
<dd> d1
!! test
Definition Lists: Mixed Lists: Test 3
-!! input
+!! wikitext
*::: d1
*::: d2
-!! result
+!! html
<ul>
<li><dl>
<dd><dl>
!! test
Definition Lists: Mixed Lists: Test 4
-!! input
+!! wikitext
*;d1 :d2
*;d3 :d4
-!! result
+!! html
<ul>
<li><dl>
<dt>d1 </dt>
!! test
Definition Lists: Mixed Lists: Test 5
-!! input
+!! wikitext
*:d1
*:: d2
-!! result
+!! html
<ul>
<li><dl>
<dd>d1
!! test
Definition Lists: Mixed Lists: Test 6
-!! input
+!! wikitext
#*:d1
#*::: d3
-!! result
+!! html
<ol>
<li><ul>
<li><dl>
!! test
Definition Lists: Mixed Lists: Test 7
-!! input
+!! wikitext
:* d1
:* d2
-!! result
+!! html
<dl>
<dd><ul>
<li> d1
!! test
Definition Lists: Mixed Lists: Test 8
-!! input
+!! wikitext
:* d1
::* d2
-!! result
+!! html
<dl>
<dd><ul>
<li> d1
!! test
Definition Lists: Mixed Lists: Test 9
-!! input
+!! wikitext
*;foo :bar
-!! result
+!! html
<ul>
<li><dl>
<dt>foo </dt>
!! test
Definition Lists: Mixed Lists: Test 10
-!! input
+!! wikitext
*#;foo :bar
-!! result
+!! html
<ul>
<li><ol>
<li><dl>
# still-open tags around until the nesting is complete.
!! test
-Definition Lists: Mixed Lists: Test 11 (php)
-!! options
-php
-!! input
+Definition Lists: Mixed Lists: Test 11
+!! wikitext
*#*#;*;;foo :bar
*#*#;boo :baz
-!! result
+!! html/php
<ul>
<li><ol>
<li><ul>
</li>
</ul>
-!! end
-!! test
-Definition Lists: Mixed Lists: Test 11 (parsoid)
-!! options
-parsoid
-!! input
-*#*#;*;;foo :bar
-*#*#;boo :baz
-!! result
+!! html/parsoid
<ul>
<li>
<ol>
!! test
-Definition Lists: Weird Ones: Test 1 (php)
-!! options
-php
-!! input
+Definition Lists: Weird Ones: Test 1
+!! wikitext
*#;*::;; foo : bar (who uses this?)
-!! result
+!! html/php
<ul>
<li><ol>
<li><dl>
</li>
</ul>
-!! end
-!! test
-Definition Lists: Weird Ones: Test 1 (parsoid)
-!! options
-parsoid
-!! input
-*#;*::;; foo : bar (who uses this?)
-!! result
+!! html/parsoid
<ul>
<li>
<ol>
###
!! test
External links: non-bracketed
-!! input
+!! wikitext
Non-bracketed: http://example.com
-!! result
+!! html
<p>Non-bracketed: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
</p>
!! end
!! test
External links: numbered
-!! input
+!! wikitext
Numbered: [http://example.com]
Numbered: [http://example.net]
Numbered: [http://example.com]
-!! result
+!! html
<p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>
Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a>
Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a>
!! test
External links: specified text
-!! input
+!! wikitext
Specified text: [http://example.com link]
-!! result
+!! html
<p>Specified text: <a rel="nofollow" class="external text" href="http://example.com">link</a>
</p>
!!end
!! test
External links: trail
-!! input
+!! wikitext
Linktrails should not work for external links: [http://example.com link]s
-!! result
+!! html
<p>Linktrails should not work for external links: <a rel="nofollow" class="external text" href="http://example.com">link</a>s
</p>
!! end
!! test
External links: dollar sign in URL
-!! input
+!! wikitext
http://example.com/1$2345
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com/1$2345">http://example.com/1$2345</a>
</p>
!! end
!! test
External links: dollar sign in URL (named)
-!! input
+!! wikitext
[http://example.com/1$2345]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
</p>
!!end
!! test
External links: open square bracket forbidden in URL (bug 4377)
-!! input
+!! wikitext
http://example.com/1[2345
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345
</p>
!! end
!! test
External links: open square bracket forbidden in URL (named) (bug 4377)
-!! input
+!! wikitext
[http://example.com/1[2345]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
</p>
!!end
!! test
External links: nowiki in URL link text (bug 6230)
-!!input
+!! wikitext
[http://example.com/ <nowiki>''example site''</nowiki>]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://example.com/">''example site''</a>
</p>
!! end
!! test
External links: newline forbidden in text (bug 6230 regression check)
-!! input
+!! wikitext
[http://example.com/ first
second]
-!! result
+!! html
<p>[<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> first
second]
</p>
!! test
External links: Pipe char between url and text
-!! input
+!! wikitext
[http://example.com | link]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://example.com">| link</a>
</p>
!!end
!! test
External links: protocol-relative URL in brackets
-!! input
+!! wikitext
[//example.com/ Test]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="//example.com/">Test</a>
</p>
!! end
!! test
External links: protocol-relative URL in brackets without text
-!! input
+!! wikitext
[//example.com]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
</p>
!! end
!! test
External links: protocol-relative URL in free text is left alone
-!! input
+!! wikitext
//example.com/Foo
-!! result
+!! html
<p>//example.com/Foo
</p>
!!end
!! test
External links: protocol-relative URL in the middle of a word is left alone (bug 30269)
-!! input
+!! wikitext
foo//example.com/Foo
-!! result
+!! html
<p>foo//example.com/Foo
</p>
!! end
!! test
External image
-!! input
+!! wikitext
External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
+!! html
<p>External image: <img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
</p>
!! end
!! test
External image from https
-!! input
+!! wikitext
External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
+!! html
<p>External image from https: <img src="https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
</p>
!! end
External image (when not allowed)
!! options
wgAllowExternalImages=0
-!! input
+!! wikitext
External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
+!! html
<p>External image: <a rel="nofollow" class="external free" href="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png">http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png</a>
</p>
!! end
!! test
Link to non-http image, no img tag
-!! input
+!! wikitext
Link to non-http image, no img tag: ftp://example.com/test.jpg
-!! result
+!! html
<p>Link to non-http image, no img tag: <a rel="nofollow" class="external free" href="ftp://example.com/test.jpg">ftp://example.com/test.jpg</a>
</p>
!! end
!! test
External links: terminating separator
-!! input
+!! wikitext
Terminating separator: http://example.com/thing,
-!! result
+!! html
<p>Terminating separator: <a rel="nofollow" class="external free" href="http://example.com/thing">http://example.com/thing</a>,
</p>
!! end
!! test
External links: intervening separator
-!! input
+!! wikitext
Intervening separator: http://example.com/1,2,3
-!! result
+!! html
<p>Intervening separator: <a rel="nofollow" class="external free" href="http://example.com/1,2,3">http://example.com/1,2,3</a>
</p>
!! end
!! test
External links: old bug with URL in query
-!! input
+!! wikitext
Old bug with URL in query: [http://example.com/thing?url=http://example.com link]
-!! result
+!! html
<p>Old bug with URL in query: <a rel="nofollow" class="external text" href="http://example.com/thing?url=http://example.com">link</a>
</p>
!! end
!! test
External links: old URL-in-URL bug, mixed protocols
-!! input
+!! wikitext
And again with mixed protocols: [ftp://example.com?url=http://example.com link]
-!! result
+!! html
<p>And again with mixed protocols: <a rel="nofollow" class="external text" href="ftp://example.com?url=http://example.com">link</a>
</p>
!!end
!! test
External links: URL in text
-!! input
+!! wikitext
URL in text: [http://example.com http://example.com]
-!! result
+!! html
<p>URL in text: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
</p>
!! end
!! test
External links: Clickable images
-!! input
+!! wikitext
ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png]
-!! result
+!! html
<p>ja-style clickable images: <a rel="nofollow" class="external text" href="http://example.com"><img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /></a>
</p>
!!end
!! test
External links: raw ampersand
-!! input
+!! wikitext
Old & use: http://x&y
-!! result
+!! html
<p>Old & use: <a rel="nofollow" class="external free" href="http://x&y">http://x&y</a>
</p>
!! end
!! test
External links: encoded ampersand
-!! input
+!! wikitext
Old & use: http://x&y
-!! result
+!! html
<p>Old & use: <a rel="nofollow" class="external free" href="http://x&y">http://x&y</a>
</p>
!! end
!! test
External links: encoded equals (bug 6102)
-!! input
+!! wikitext
http://example.com/?foo=bar
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a>
</p>
!! end
!! test
External links: [raw ampersand]
-!! input
+!! wikitext
Old & use: [http://x&y]
-!! result
+!! html
<p>Old & use: <a rel="nofollow" class="external autonumber" href="http://x&y">[1]</a>
</p>
!! end
!! test
External links: [encoded ampersand]
-!! input
+!! wikitext
Old & use: [http://x&y]
-!! result
+!! html
<p>Old & use: <a rel="nofollow" class="external autonumber" href="http://x&y">[1]</a>
</p>
!! end
!! test
External links: [encoded equals] (bug 6102)
-!! input
+!! wikitext
[http://example.com/?foo=bar]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
</p>
!! end
!! test
External links: [IDN ignored character reference in hostname; strip it right off]
-!! input
+!! wikitext
[http://e‌xample.com/]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://example.com/">[1]</a>
</p>
!! end
# The Parsoid team.
!! test
External links: IDN ignored character reference in hostname; strip it right off
-!! input
+!! wikitext
http://e‌xample.com/
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>
</p>
!! end
!! test
External links: www.jpeg.org (bug 554)
-!! input
+!! wikitext
http://www.jpeg.org
-!!result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.jpeg.org">http://www.jpeg.org</a>
</p>
!! end
!! test
External links: URL within URL (original bug 2)
-!! input
+!! wikitext
[http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp">[1]</a>
</p>
!! end
!! test
BUG 361: URL inside bracketed URL
-!! input
+!! wikitext
[http://www.example.com/foo http://www.example.com/bar]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com/foo">http://www.example.com/bar</a>
</p>
!! end
!! test
BUG 361: URL within URL, not bracketed
-!! input
+!! wikitext
http://www.example.com/foo?=http://www.example.com/bar
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.com/foo?=http://www.example.com/bar">http://www.example.com/foo?=http://www.example.com/bar</a>
</p>
!! end
!! test
BUG 289: ">"-token in URL-tail
-!! input
+!! wikitext
http://www.example.com/<hello>
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><hello>
</p>
!!end
!! test
BUG 289: literal ">"-token in URL-tail
-!! input
+!! wikitext
http://www.example.com/<b>html</b>
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><b>html</b>
</p>
!!end
!! test
BUG 289: ">"-token in bracketed URL
-!! input
+!! wikitext
[http://www.example.com/<hello> stuff]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com/"><hello> stuff</a>
</p>
!!end
!! test
BUG 289: literal ">"-token in bracketed URL
-!! input
+!! wikitext
[http://www.example.com/<b>html</b> stuff]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com/"><b>html</b> stuff</a>
</p>
!!end
!! test
BUG 289: literal double quote at end of URL
-!! input
+!! wikitext
http://www.example.com/"hello"
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>"hello"
</p>
!!end
!! test
BUG 289: literal double quote in bracketed URL
-!! input
+!! wikitext
[http://www.example.com/"hello" stuff]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com/">"hello" stuff</a>
</p>
!!end
!! test
External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
-!! input
+!! wikitext
[http://www.example.com test]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com">test</a>
</p>
!! end
!! test
External links: link text with spaces
-!! input
+!! wikitext
[http://www.example.com a b c]
[http://www.example.com ''a'' ''b'']
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com">a b c</a>
<a rel="nofollow" class="external text" href="http://www.example.com"><i>a</i> <i>b</i></a>
</p>
!! test
External links: wiki links within external link (Bug 3695)
-!! options
-php
-!! input
+!! wikitext
[http://example.com [[wikilink]] embedded in ext link]
-!! result
+!! html/php
<p><a rel="nofollow" class="external text" href="http://example.com"></a><a href="/index.php?title=Wikilink&action=edit&redlink=1" class="new" title="Wikilink (page does not exist)">wikilink</a><a rel="nofollow" class="external text" href="http://example.com"> embedded in ext link</a>
</p>
-!! end
-
-!! test
-Parsoid: External links: wiki links within external link (Bug 3695)
-!! options
-parsoid
-!! input
-[http://example.com [[wikilink]] embedded in ext link]
-!! result
+!! html/parsoid
<p><a rel="mw:ExtLink" href="http://example.com"></a><a rel="mw:WikiLink" href="./Wikilink">wikilink</a><span> embedded in ext link</span></p>
!! end
!! test
BUG 787: Links with one slash after the url protocol are invalid
-!! input
+!! wikitext
http:/example.com
[http:/example.com title]
-!! result
+!! html
<p>http:/example.com
</p><p>[http:/example.com title]
</p>
!! test
Bracketed external links with template-generated invalid target
-!! input
+!! wikitext
[{{echo|http:/example.com}} title]
-!! result
+!! html
<p>[http:/example.com title]
</p>
!! end
!! test
Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
-!! input
+!! wikitext
''[http://example.com text'']
[http://example.com '''text]'''
''Something [http://example.com in italic'']
''Something [http://example.com mixed''''', even bold]'''
'''''Now [http://example.com both''''']
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://example.com"><i>text</i></a>
<a rel="nofollow" class="external text" href="http://example.com"><b>text</b></a>
<i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>in italic</i></a>
!! test
Bug 4781: %26 in URL
-!! input
+!! wikitext
http://www.example.com/?title=AT%26T
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a>
</p>
!! end
# % is actually legal in HTML5. Any change in output would need testing though.
!! test
Bug 4781, 5267: %25 in URL
-!! input
+!! wikitext
http://www.example.com/?title=100%25_Bran
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a>
</p>
!! end
!! test
Bug 4781, 5267: %28, %29 in URL
-!! input
+!! wikitext
http://www.example.com/?title=Ben-Hur_%281959_film%29
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a>
</p>
!! end
!! test
Bug 4781: %26 in autonumber URL
-!! input
+!! wikitext
[http://www.example.com/?title=AT%26T]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=AT%26T">[1]</a>
</p>
!! end
!! test
Bug 4781, 5267: %26 in autonumber URL
-!! input
+!! wikitext
[http://www.example.com/?title=100%25_Bran]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=100%25_Bran">[1]</a>
</p>
!! end
!! test
Bug 4781, 5267: %28, %29 in autonumber URL
-!! input
+!! wikitext
[http://www.example.com/?title=Ben-Hur_%281959_film%29]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">[1]</a>
</p>
!! end
!! test
Bug 4781: %26 in bracketed URL
-!! input
+!! wikitext
[http://www.example.com/?title=AT%26T link]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=AT%26T">link</a>
</p>
!! end
!! test
Bug 4781, 5267: %26 in bracketed URL
-!! input
+!! wikitext
[http://www.example.com/?title=100%25_Bran link]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=100%25_Bran">link</a>
</p>
!! end
!! test
Bug 4781, 5267: %28, %29 in bracketed URL
-!! input
+!! wikitext
[http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a>
</p>
!! end
!! test
External link containing double-single-quotes in text '' (bug 4598 sanity check)
-!! input
+!! wikitext
Some [http://example.com/ pretty ''italics'' and stuff]!
-!! result
+!! html
<p>Some <a rel="nofollow" class="external text" href="http://example.com/">pretty <i>italics</i> and stuff</a>!
</p>
!! end
!! test
External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check)
-!! input
+!! wikitext
''Some [http://example.com/ pretty ''italics'' and stuff]!''
-!! result
+!! html
<p><i>Some </i><a rel="nofollow" class="external text" href="http://example.com/"><i>pretty </i>italics<i> and stuff</i></a><i>!</i>
</p>
!! end
!! test
External link containing double-single-quotes with no space separating the url from text in italics
-!! options
-php
-!! input
+!! wikitext
[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].]
-!! result
+!! html/php
<p><a rel="nofollow" class="external text" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de <a href="/index.php?title=Museo_Picasso_(Par%C3%ADs)&action=edit&redlink=1" class="new" title="Museo Picasso (París) (page does not exist)">Museo Picasso</a>.</a>
</p>
-!! end
-
-!! test
-Parsoid:External link containing double-single-quotes with no space separating the url from text in italics
-!! options
-parsoid
-!! input
-[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].]
-!! result
+!! html/parsoid
<p><a rel="mw:ExtLink" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de </a><a rel="mw:WikiLink" href="./Museo_Picasso_(París)">Museo Picasso</a><span>.</span></p>
!! end
!! test
External link with comments in link text
-!! input
+!! wikitext
[http://www.google.com Google <!-- comment -->]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.google.com">Google </a>
</p>
!! end
!! test
URL-encoding in URL functions (single parameter)
-!! input
+!! wikitext
{{localurl:Some page|amp=&}}
-!! result
+!! html
<p>/index.php?title=Some_page&amp=&
</p>
!! end
!! test
URL-encoding in URL functions (multiple parameters)
-!! input
+!! wikitext
{{localurl:Some page|q=?&=&}}
-!! result
+!! html
<p>/index.php?title=Some_page&q=?&amp=&
</p>
!! end
!! test
Brackets in urls
-!! input
+!! wikitext
http://example.com/index.php?foozoid%5B%5D=bar
http://example.com/index.php?foozoid[]=bar
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
</p><p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
</p>
IPv6 urls (bug 21261)
!! options
disabled
-!! input
+!! wikitext
http://[2404:130:0:1000::187:2]/index.php
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
</p>
!! end
!! test
Non-extlinks in brackets
-!! input
+!! wikitext
[foo]
[foo bar]
[foo ''bar'']
[{{echo|foo}}l's errand]
[url={{echo|foo}}]
[url=http://example.com]
-!! result
+!! html
<p>[foo]
[foo bar]
[foo <i>bar</i>]
!! end
!! test
-Parsoid: Percent encoding in external links
-!! options
-parsoid
-!! input
+Percent encoding in external links
+!! wikitext
[https://github.com/search?l=&q=ResourceLoader+%40wikimedia Search]
-!! result
+!! html/php
+<p><a rel="nofollow" class="external text" href="https://github.com/search?l=&q=ResourceLoader+%40wikimedia">Search</a>
+</p>
+!! html/parsoid
<p><a rel="mw:ExtLink"
href="https://github.com/search?l=&q=ResourceLoader+%40wikimedia">Search</a></p>
!! end
!! test
-Parsoid: use url link syntax for links where the content is equal the link
-target
-!! options
-parsoid
-!! input
+Use url link syntax for links where the content is equal the link target
+!! wikitext
http://example.com
-!! result
+!! html/php
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
+</p>
+!! html/parsoid
<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></p>
!! end
!! test
Parenthesis in external links, especially URL links
-!! options
-php
-!! input
+!! wikitext
http://example.com)
http://example.com/test)
http://example.com/a)b
[http://example.com) foo]
-!! result
+!! html/php
<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
</p><p><a rel="nofollow" class="external free" href="http://example.com/test">http://example.com/test</a>)
</p><p><a rel="nofollow" class="external free" href="http://example.com/(test)">http://example.com/(test)</a>
</p><p><a rel="nofollow" class="external free" href="http://example.com/a)b">http://example.com/a)b</a>
</p><p><a rel="nofollow" class="external text" href="http://example.com)">foo</a>
</p>
-!! end
-
-!! test
-Parenthesis in external links, especially URL links (Parsoid)
-!! options
-parsoid
-!! input
-http://example.com)
-
-http://example.com/test)
-
-http://example.com/(test)
-
-http://example.com/((test)
-
-(http://example.com/(test))
-
-(http://example.com/(test)))))
-
-http://example.com/a)b
-
-[http://example.com) foo]
-!! result
+!! html/parsoid
<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a>)</p>
<p><a rel="mw:ExtLink" href="http://example.com/test">http://example.com/test</a>)</p>
<p><a rel="mw:ExtLink" href="http://example.com/(test)">http://example.com/(test)</a></p>
!! test
Parenthesis in external links, w/ transclusion or comment
-!! options
-parsoid
-!! input
+!! wikitext
(http://example.com/{{echo|hi}})
(http://example.com<!-- hi -->)
-!! result
+!! html/php
+<p>(<a rel="nofollow" class="external free" href="http://example.com/hi">http://example.com/hi</a>)
+</p><p>(<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
+</p>
+!! html/parsoid
<p>(<a data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;hi&quot;}},&quot;i&quot;:0}}]}\" data-parsoid=\"{&quot;dsr&quot;:[20,31,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\">hi</span>"}]]}' typeof="mw:ExpandedAttrs" about="#mwt2" rel="mw:ExtLink" href="http://example.com/hi" data-parsoid='{"stx":"url","a":{"href":"http://example.com/hi"},"sa":{"href":"http://example.com/{{echo|hi}}"}}'>http://example.com/hi</a>)</p>
<p>(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url","a":{"href":"http://example.com"},"sa":{"href":"http://example.com<!-- hi -->"}}'>http://example.com</a>)</p>
!! test
Quotes
-!! input
+!! wikitext
Normal text. '''Bold text.''' Normal text. ''Italic text.''
Normal text. '''''Bold italic text.''''' Normal text.
-!!result
+!! html
<p>Normal text. <b>Bold text.</b> Normal text. <i>Italic text.</i>
</p><p>Normal text. <i><b>Bold italic text.</b></i> Normal text.
</p>
!! end
+# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
+# parser strips. The wikitext contains just the first half of the bold
+# quote pair.
!! test
-Unclosed and unmatched quotes (php)
-!! options
-php
-!! input
+Unclosed and unmatched quotes
+!! wikitext
'''''Bold italic text '''with bold deactivated''' in between.'''''
'''''Bold italic text ''with italic deactivated'' in between.'''''
''Tom'''s car is bigger than ''Susan'''s.
Plain ''italic'''s plain
-!! result
+!! html/php
<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
</p><p><b>Bold text..</b>
</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
</p><p>Plain <i>italic'</i>s plain
</p>
-!! end
-# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
-# parser strips. The wikitext contains just the first half of the bold
-# quote pair.
-!! test
-Unclosed and unmatched quotes (parsoid)
-!! options
-parsoid
-!! input
-'''''Bold italic text '''with bold deactivated''' in between.'''''
-
-'''''Bold italic text ''with italic deactivated'' in between.'''''
-
-'''Bold text..
-
-..spanning two paragraphs (should not work).'''
-
-'''Bold tag left open
-
-''Italic tag left open
-
-Normal text.
-
-<!-- Unmatching number of opening, closing tags: -->
-'''This year''''s election ''should'' beat '''last year''''s.
-
-''Tom'''s car is bigger than ''Susan'''s.
-
-Plain ''italic'''s plain
-!! result
+!! html/parsoid
<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
</p><p><b>Bold text..</b>
# This should not produce <table></table> as <table><tr><td></td></tr></table>
# is the bare minimum required by the spec, see:
# http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
-!! test
-A table with no data. (php)
-!! options
-php
-!! input
-{||}
-!! result
-
-!! end
-
# Parsoid team replies: empty table tags are legal in HTML5
!! test
-A table with no data. (parsoid)
+A table with no data.
!! options
parsoid=wt2html
-!! input
+!! wikitext
{||}
-!! result
+!! html/php
+
+!! html/parsoid
<table></table>
!! end
A table with stray table end tags on start tag line (wt2html)
!! options
parsoid=wt2html
-!! input
+!! wikitext
{|style="color: red;"|}
{|style="color: red;" |}
{|style="color: red;" |} id="foo"
|foo
|}
-!! result
+!! html
<table style="color: red;"></table>
<table style="color: red;">
!! end
!! test
-A table with no data (take 2) (parsoid)
-!! options
-parsoid
-!! input
+A table with no data (take 2)
+!! wikitext
{|
|}
-!! result
+!! html/parsoid
<table></table>
!! end
# A table with nothing but a caption is invalid XHTML, we might want to render
# this as <p>caption</p>
+# Parsoid team replies: table with only a caption is legal in HTML5
!! test
-A table with nothing but a caption (php)
-!! options
-php
-!! input
+A table with nothing but a caption
+!! wikitext
{|
|+ caption
|}
-!! result
+!! html/php
<table>
<caption> caption
</caption><tr><td></td></tr></table>
-!! end
-# Parsoid team replies: table with only a caption is legal in HTML5
-!! test
-A table with nothing but a caption (parsoid)
-!! options
-parsoid
-!! input
-{|
-|+ caption
-|}
-!! result
+!! html/parsoid
<table><caption> caption</caption></table>
!! end
!! test
A table with caption with default-spaced attributes and a table row
-!! input
+!! wikitext
{|
|+ style="color: red;" | caption1
|-
| foo
|}
-!! result
+!! html
<table>
<caption style="color: red;"> caption1
</caption>
!! test
A table with captions with non-default spaced attributes and a table row
-!! input
+!! wikitext
{|
|+style="color: red;"|caption2
|+ style="color: red;"| caption3
|-
| foo
|}
-!! result
+!! html
<table>
<caption style="color: red;">caption2
</caption>
!! test
Table td-cell syntax variations
-!! input
+!! wikitext
{|
| foo bar foo | baz
| foo bar foo || baz
| style='color:red;' | baz
| style='color:red;' || baz
|}
-!! result
+!! html
<table>
<tr>
<td> baz
!! test
Simple table
-!! input
+!! wikitext
{|
| 1 || 2
|-
| 3 || 4
|}
-!! result
+!! html
<table>
<tr>
<td> 1 </td>
!! test
Simple table but with multiple dashes for row wikitext
-!! input
+!! wikitext
{|
| foo
|-----
| bar
|}
-!! result
+!! html
<table>
<tr>
<td> foo
!! end
!! test
Multiplication table
-!! input
+!! wikitext
{| border="1" cellpadding="2"
|+Multiplication table
|-
! 5
| 5 || 10 || 15
|}
-!! result
+!! html
<table border="1" cellpadding="2">
<caption>Multiplication table
</caption>
!! test
Accept "||" in table headings
-!! input
+!! wikitext
{|
!h1 || h2
|}
-!! result
+!! html
<table>
<tr>
<th>h1 </th>
!! test
Accept "||" in indented table headings
-!! input
+!! wikitext
:{|
!h1 || h2
|}
-!! result
+!! html
<dl><dd><table>
<tr>
<th>h1 </th>
!! test
Accept empty attributes in td/th cells (td/th cells starting with leading ||)
-!! input
+!! wikitext
{|
!| h1
|| a
|}
-!! result
+!! html
<table>
<tr>
<th> h1
!!test
Accept "| !" at start of line in tables (ignore !-attribute)
-!!input
+!! wikitext
{|
|-
| !style="color:red" | bar
|}
-!!result
+!! html
<table>
<tr>
!!test
Allow +/- in 2nd and later cells in a row, in 1st cell when td-attrs are present, or in 1st cell when there is a space between "|" and +/-
-!!input
+!! wikitext
{|
|-
|style='color:red;'|+1
| +1
| -1
|}
-!!result
+!! html
<table>
<tr>
!! test
Table rowspan
-!! input
+!! wikitext
{| border=1
| Cell 1, row 1
|rowspan=2| Cell 2, row 1 (and 2)
| Cell 1, row 2
| Cell 3, row 2
|}
-!! result
+!! html
<table border="1">
<tr>
<td> Cell 1, row 1
!! test
Nested table
-!! input
+!! wikitext
{| border=1
| α
|
|}
|the original table again
|}
-!! result
+!! html
<table border="1">
<tr>
<td> α
!! test
Invalid attributes in table cell (bug 1830)
-!! input
+!! wikitext
{|
|Cell:|broken
|}
-!! result
+!! html
<table>
<tr>
<td>broken
!! test
Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
-!! input
+!! wikitext
{|
| |[ftp://|x||]" onmouseover="alert(document.cookie)">test
-!! result
+!! html
<table>
<tr>
<td>[<a rel="nofollow" class="external free" href="ftp://%7Cx">ftp://%7Cx</a></td>
!! test
Indented table markup mixed with indented pre content (proposed in bug 6200)
-!! input
+!! wikitext
<table>
<tr>
<td>
</td>
</tr>
</table>
-!! result
+!! html
<table>
<tr>
<td>
!! test
Template-generated table cell attributes and cell content
-!! input
+!! wikitext
{|
|{{table_attribs}}
| {{table_attribs}}
|}
-!! result
+!! html
<table>
<tr>
<td style="color: red"> Foo
!! test
Template-generated table cell attributes and cell content (2)
-!! input
+!! wikitext
{|
|align=center {{table_attribs}}
|}
-!! result
+!! html
<table>
<tr>
<td align="center" style="color: red"> Foo
!! test
Template-generated table cell attributes and cell content (3)
-!! input
+!! wikitext
{|
|align=center {{table_cells}}
|}
-!! result
+!! html
<table>
<tr>
<td align="center" style="color: red"> Foo </td>
!! test
Table with row followed by newlines and table heading
-!! input
+!! wikitext
{|
|-
! foo
|}
-!! result
+!! html
<table>
!! test
Table with empty line following the start tag
-!! input
+!! wikitext
{|
|-
| foo
|}
-!! result
+!! html
<table>
# the PHP parser. Parsoid implements the behavior below.
!! test
Table attributes with empty value
-!! options
-parsoid
-!! input
+!! wikitext
{|
| style=| hello
|}
-!! result
+!! html/parsoid
<table>
<tbody>
<tr>
!! test
Wikitext table with a lot of comments
-!! input
+!! wikitext
{|
<!-- c0 -->
| foo
|<!-- c4 -->
<!-- c5 -->
|}
-!! result
+!! html
<table>
<tr>
<td> foo
!! test
Wikitext table with double-line table cell
-!! input
+!! wikitext
{|
|a
b
|}
-!! result
+!! html
<table>
<tr>
<td>a
!! test
Table cell with a single comment
-!! input
+!! wikitext
{|
| <!-- c1 -->
| a
|}
-!! result
+!! html
<table>
<tr>
<td>
# not parse this kind of table at all. The main focus for Parsoid is on
# round-tripping, so this output is ok for now. TODO: revisit!
!! test
-Wikitext table with html-syntax row (Parsoid)
-!! options
-parsoid
-!! input
+Wikitext table with html-syntax row
+!! wikitext
{|
|-
<td>foo</td>
|}
-!! result
+!! html/parsoid
<table>
<tbody>
<tr>
(PHP parser relies on Tidy to add the missing <td> tags)
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
{|
|-
a
|}
-!! result
+!! html
<table>
<tr><td>a</td></tr>
</table>
(PHP parser relies on Tidy to add the missing <td> tags)
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
{|
|-
|
|-
b
|}
-!! result
+!! html
<table>
<tbody>
<tr><td><pre>a</pre></td></tr>
(PHP parser relies on Tidy to add the missing <td> tags)
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
{|
|-
*a
|}
-!! result
+!! html
<table>
<tr>
<td><ul>
Parsoid: Round-trip tables directly followed by content (bug 51219)
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
{|
|foo
|} bar
{|
|baz
|}<b>quux</b>
-!! result
+!! html
<table><tbody>
<tr>
<td>foo</td></tr></tbody></table> bar
Parsoid: Default to a newline after tables in new content (bug 51219)
!! options
parsoid=html2wt
-!! input
+!! wikitext
{|
|foo
|}
|baz
|}
'''quux'''
-!! result
+!! html
<table><tbody>
<tr><td>foo</td></tr></tbody></table> bar
<table><tbody>
Parsoid: newline inducing block nodes don't suppress <nowiki>
!! options
parsoid=html2wt
-!! input
+!! wikitext
<nowiki> </nowiki>a
= foo =
-!! result
+!! html
a<h1>foo</h1>
!! end
###
!! test
Plain link, capitalized
-!! input
+!! wikitext
[[Main Page]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
</p>
!! end
!! test
Plain link, uncapitalized
-!! input
+!! wikitext
[[main Page]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">main Page</a>
</p>
!! end
!! test
Piped link
-!! input
+!! wikitext
[[Main Page|The Main Page]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
</p>
!! end
!! test
Piped link with comment in link text
-!! input
+!! wikitext
[[Main Page|The Main<!--front--> Page]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
</p>
!! end
!! test
Broken link
-!! input
+!! wikitext
[[Zigzagzogzagzig]]
-!! result
+!! html
<p><a href="/index.php?title=Zigzagzogzagzig&action=edit&redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig</a>
</p>
!! end
!! test
Broken link with fragment
-!! input
+!! wikitext
[[Zigzagzogzagzig#zug]]
-!! result
+!! html
<p><a href="/index.php?title=Zigzagzogzagzig&action=edit&redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig#zug</a>
</p>
!! end
!! test
Special page link with fragment
-!! input
+!! wikitext
[[Special:Version#anchor]]
-!! result
+!! html
<p><a href="/wiki/Special:Version#anchor" title="Special:Version">Special:Version#anchor</a>
</p>
!! end
!! test
Nonexistent special page link with fragment
-!! input
+!! wikitext
[[Special:ThisNameWillHopefullyNeverBeUsed#anchor]]
-!! result
+!! html
<p><a href="/wiki/Special:ThisNameWillHopefullyNeverBeUsed" class="new" title="Special:ThisNameWillHopefullyNeverBeUsed (page does not exist)">Special:ThisNameWillHopefullyNeverBeUsed#anchor</a>
</p>
!! end
!! test
Link with prefix
-!! input
+!! wikitext
xxx[[main Page]], xxx[[Main Page]], Xxx[[main Page]] XXX[[main Page]], XXX[[Main Page]]
-!! result
+!! html
<p>xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a>, xxx<a href="/wiki/Main_Page" title="Main Page">Main Page</a>, Xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a> XXX<a href="/wiki/Main_Page" title="Main Page">main Page</a>, XXX<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
</p>
!! end
!! test
Link with suffix
-!! input
+!! wikitext
[[Main Page]]xxx, [[Main Page]]XXX, [[Main Page]]!!!
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">Main Pagexxx</a>, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>XXX, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>!!!
</p>
!! end
!! test
Bug 43661: Piped links with identical prefixes
-!! input
+!! wikitext
[[prefixed article|prefixed articles with spaces]]
[[prefixed article|prefixed articlesaoeu]]
[[Main Page|Main Page test]]
-!! result
+!! html
<p><a href="/wiki/Prefixed_article" title="Prefixed article">prefixed articles with spaces</a>
</p><p><a href="/wiki/Prefixed_article" title="Prefixed article">prefixed articlesaoeu</a>
</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page test</a>
!! test
Link with HTML entity in suffix / tail
-!! input
+!! wikitext
[[Main Page]]", [[Main Page]]a
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>", <a href="/wiki/Main_Page" title="Main Page">Main Page</a>a
</p>
!! end
!! test
Link with 3 brackets
-!! input
+!! wikitext
[[[Main Page]]]
-!! result
+!! html
<p>[[[Main Page]]]
</p>
!! end
!! test
Link with 4 brackets
-!! input
+!! wikitext
[[[[Main Page]]]]
-!! result
+!! html
<p>[[<a href="/wiki/Main_Page" title="Main Page">Main Page</a>]]
</p>
!! end
!! test
Piped link with 3 brackets
-!! input
+!! wikitext
[[[main page|the main page]]]
-!! result
+!! html
<p>[[[main page|the main page]]]
</p>
!! end
!! test
Piped link with extlink-like text
-!! input
+!! wikitext
[[Main Page|[bar]]]
[[Main Page|This is a [bar]]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">[bar]</a>
<a href="/wiki/Main_Page" title="Main Page">This is a [bar]</a>
</p>
!! test
Link with multiple pipes
-!! input
+!! wikitext
[[Main Page|The|Main|Page]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">The|Main|Page</a>
</p>
!! end
!! test
Link to namespaces
-!! input
+!! wikitext
[[Talk:Parser testing]], [[Meta:Disclaimers]]
-!! result
+!! html
<p><a href="/index.php?title=Talk:Parser_testing&action=edit&redlink=1" class="new" title="Talk:Parser testing (page does not exist)">Talk:Parser testing</a>, <a href="/index.php?title=Meta:Disclaimers&action=edit&redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">Meta:Disclaimers</a>
</p>
!! end
!! test
Namespace takes precedence over interwiki link (bug 51680)
-!! input
+!! wikitext
[[MemoryAlpha:AlphaTest]]
-!! result
+!! html
<p><a href="/wiki/MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
</p>
!! end
Link to namespace preferred over interwiki with correct rel attribute
!! options
parsoid=html2wt,html2html
-!! input
+!! wikitext
[[MemoryAlpha:AlphaTest]]
-!! result
+!! html
<p><a rel="mw:WikiLink" href="./MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
</p>
!! end
!! test
Piped link to namespace
-!! input
+!! wikitext
[[Meta:Disclaimers|The disclaimers]]
-!! result
+!! html
<p><a href="/index.php?title=Meta:Disclaimers&action=edit&redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">The disclaimers</a>
</p>
!! end
!! test
Link containing }
-!! input
+!! wikitext
[[Usually caused by a typo (oops}]]
-!! result
+!! html
<p>[[Usually caused by a typo (oops}]]
</p>
!! end
!! test
Link containing % (not as a hex sequence)
-!! input
+!! wikitext
[[7% Solution]]
-!! result
+!! html
<p><a href="/index.php?title=7%25_Solution&action=edit&redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
</p>
!! end
!! test
Link containing % as a single hex sequence interpreted to char
-!! input
+!! wikitext
[[7%25 Solution]]
-!! result
+!! html
<p><a href="/index.php?title=7%25_Solution&action=edit&redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
</p>
!!end
!! test
Link containing % as a double hex sequence interpreted to hex sequence
-!! input
+!! wikitext
[[7%2525 Solution]]
-!! result
+!! html
<p>[[7%2525 Solution]]
</p>
!!end
!! test
Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
Example for such a section: == < ==
-!! input
+!! wikitext
[[%23%3c]][[%23%3e]]
-!! result
+!! html
<p><a href="#.3C">#<</a><a href="#.3E">#></a>
</p>
!! end
!! test
Link containing "<#" and ">#" as a hex sequences
-!! input
+!! wikitext
[[%3c%23]][[%3e%23]]
-!! result
+!! html
<p>[[%3c%23]][[%3e%23]]
</p>
!! end
!! test
Link containing an equals sign
-!! input
+!! wikitext
[[Special:BookSources/isbn=4-00-026157-6]]
-!! result
+!! html
<p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
</p>
!! end
# seen by the parser.
!! test
Link containing a tilde
-!! input
+!! wikitext
[[Foo~bar]]
-!! result
+!! html
<p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
</p>
!! end
!! test
Link containing double-single-quotes '' (bug 4598)
-!! input
+!! wikitext
[[Lista d''e paise d''o munno]]
-!! result
+!! html
<p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&action=edit&redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
</p>
!! end
!! test
Link containing double-single-quotes '' in text (bug 4598 sanity check)
-!! input
+!! wikitext
Some [[Link|pretty ''italics'' and stuff]]!
-!! result
+!! html
<p>Some <a href="/index.php?title=Link&action=edit&redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!
</p>
!! end
!! test
Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
-!! input
+!! wikitext
''Some [[Link|pretty ''italics'' and stuff]]!
-!! result
+!! html
<p><i>Some <a href="/index.php?title=Link&action=edit&redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!</i>
</p>
!! end
!! test
Link with double quotes in title part (literal) and alternate part (interpreted)
-!! input
+!! wikitext
[[File:Denys Savchenko ''Pentecoste''.jpg]]
[[''Pentecoste'']]
[[''Pentecoste''|Pentecoste]]
[[''Pentecoste''|''Pentecoste'']]
-!! result
+!! html
<p><a href="/index.php?title=Special:Upload&wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko ''Pentecoste''.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&action=edit&redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&action=edit&redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
!! test
Broken image links with HTML captions (bug 39700)
-!! input
+!! wikitext
[[File:Nonexistent|<script></script>]]
[[File:Nonexistent|100px|<script></script>]]
[[File:Nonexistent|<]]
[[File:Nonexistent|a<i>b</i>c]]
-!! result
+!! html
<p><a href="/index.php?title=Special:Upload&wpDestFile=Nonexistent" class="new" title="File:Nonexistent"><script></script></a>
<a href="/index.php?title=Special:Upload&wpDestFile=Nonexistent" class="new" title="File:Nonexistent"><script></script></a>
<a href="/index.php?title=Special:Upload&wpDestFile=Nonexistent" class="new" title="File:Nonexistent"><</a>
!! test
Plain link to URL
-!! input
+!! wikitext
[[http://www.example.com]]
-!! result
+!! html
<p>[<a rel="nofollow" class="external autonumber" href="http://www.example.com">[1]</a>]
</p>
!! end
!! test
Plain link to URL with link text
-!! input
+!! wikitext
[[http://www.example.com Link text]]
-!! result
+!! html
<p>[<a rel="nofollow" class="external text" href="http://www.example.com">Link text</a>]
</p>
!! end
!! test
Plain link to protocol-relative URL
-!! input
+!! wikitext
[[//www.example.com]]
-!! result
+!! html
<p>[<a rel="nofollow" class="external autonumber" href="//www.example.com">[1]</a>]
</p>
!! end
!! test
Plain link to protocol-relative URL with link text
-!! input
+!! wikitext
[[//www.example.com Link text]]
-!! result
+!! html
<p>[<a rel="nofollow" class="external text" href="//www.example.com">Link text</a>]
</p>
!! end
!! test
Plain link to page with question mark in title
-!! input
+!! wikitext
[[A?b]]
[[A?b|Baz]]
-!! result
+!! html
<p><a href="/wiki/A%3Fb" title="A?b">A?b</a>
</p><p><a href="/wiki/A%3Fb" title="A?b">Baz</a>
</p>
# -- wtm
!! test
Piped link to URL
-!! input
+!! wikitext
Piped link to URL: [[http://www.example.com|an example URL]]
-!! result
+!! html
<p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
</p>
!! end
!! test
BUG 2: [[page|http://url/]] should link to page, not http://url/
-!! input
+!! wikitext
[[Main Page|http://url/]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">http://url/</a>
</p>
!! end
BUG 337: Escaped self-links should be bold
!! options
title=[[Bug462]]
-!! input
+!! wikitext
[[Bug462]] [[Bug462]]
-!! result
+!! html
<p><strong class="selflink">Bug462</strong> <strong class="selflink">Bug462</strong>
</p>
!! end
Self-link to section should not be bold
!! options
title=[[Main Page]]
-!! input
+!! wikitext
[[Main Page#section]]
-!! result
+!! html
<p><a href="/wiki/Main_Page#section" title="Main Page">Main Page#section</a>
</p>
!! end
Self-link to numeric title
!!options
title=[[0]]
-!!input
+!! wikitext
[[0]]
-!!result
+!! html
<p><strong class="selflink">0</strong>
</p>
!!end
Link to numeric-equivalent title
!!options
title=[[0]]
-!!input
+!! wikitext
[[00]]
-!!result
+!! html
<p><a href="/wiki/00" title="00">00</a>
</p>
!!end
!! test
<nowiki> inside a link
-!! input
+!! wikitext
[[Main<nowiki> Page</nowiki>]] [[Main Page|the main page <nowiki>[it's not very good]</nowiki>]]
-!! result
+!! html
<p>[[Main Page]] <a href="/wiki/Main_Page" title="Main Page">the main page [it's not very good]</a>
</p>
!! end
!! test
Non-breaking spaces in title
-!! input
+!! wikitext
[[ Main Page ]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">  Main   Page  </a>
</p>
!!end
Internal link with ca linktrail, surrounded by bold apostrophes (bug 27473 primary issue)
!! options
language=ca
-!! input
+!! wikitext
'''[[Main Page]]'''
-!! result
+!! html
<p><b><a href="/wiki/Main_Page" title="Main Page">Main Page</a></b>
</p>
!! end
Internal link with ca linktrail, surrounded by italic apostrophes (bug 27473 primary issue)
!! options
language=ca
-!! input
+!! wikitext
''[[Main Page]]''
-!! result
+!! html
<p><i><a href="/wiki/Main_Page" title="Main Page">Main Page</a></i>
</p>
!! end
Internal link with en linktrail: no apostrophes (bug 27473)
!! options
language=en
-!! input
+!! wikitext
[[Something]]'nice
-!! result
+!! html
<p><a href="/index.php?title=Something&action=edit&redlink=1" class="new" title="Something (page does not exist)">Something</a>'nice
</p>
!! end
Internal link with ca linktrail with apostrophes (bug 27473)
!! options
language=ca
-!! input
+!! wikitext
[[Something]]'nice
-!! result
+!! html
<p><a href="/index.php?title=Something&action=edit&redlink=1" class="new" title="Something (encara no existeix)">Something'nice</a>
</p>
!! end
Internal link with kaa linktrail with apostrophes (bug 27473)
!! options
language=kaa
-!! input
+!! wikitext
[[Something]]'nice
-!! result
+!! html
<p><a href="/index.php?title=Something&action=edit&redlink=1" class="new" title="Something (bet ele jaratılmag'an)">Something'nice</a>
</p>
!! end
1. Interaction of linktrail and template encapsulation
!! options
parsoid
-!! input
+!! wikitext
{{echo|[[Foo]]}}l
-!! result
+!! html
<p><a rel="mw:WikiLink" href="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
!! end
2. Interaction of linktrail and template encapsulation
!! options
parsoid
-!! input
+!! wikitext
{{echo|Some [[Fool]]}}s
-!! result
+!! html
<p data-parsoid='{}'><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]"}},"i":0}},"s"]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some </span><a rel="mw:WikiLink" href="./Fool" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a></p>
!! end
3. Interaction of linktrail and template encapsulation
!! options
parsoid
-!! input
+!! wikitext
{{echo|Some [[Fool]]s are '''bold and foolish'''}}
-!! result
+!! html
<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]s are '''bold and foolish'''"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some <a rel="mw:WikiLink" href="./Fool" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a> are <b data-parsoid="{}">bold and foolish</b></p>
!! end
Internal link with is link prefix
!! options
language=is
-!! input
+!! wikitext
Aðrir mótmælenda[[söfnuður|söfnuðir]] og
-!! result
+!! html
<p>Aðrir <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> og
</p>
!! end
Internal link with is link trail and link prefix
!! options
language=is
-!! input
+!! wikitext
[[mótmælendatrú|xxx]]ar
[[mótmælendatrú]]ar
mótmælenda[[söfnuður]]
mótmælenda[[söfnuður|söfnuðir]]
mótmælenda[[söfnuður|söfnuðir]]xxx
-!! result
+!! html
<p><a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">xxxar</a>
<a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">mótmælendatrúar</a>
<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuður</a>
Parsoid link trail escaping
!! options
parsoid=html2wt,html2html
-!! input
+!! wikitext
[[apple]]<nowiki/>s
-!! result
+!! html
<p><a rel="mw:WikiLink" href="Apple">apple</a>s</p>
!! end
!! options
language=is
parsoid=html2wt,html2html
-!! input
+!! wikitext
Aðrir mótmælenda<nowiki/>[[söfnuður]]
-!! result
+!! html
<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p>
!! end
!! test
Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
-!! input
+!! wikitext
[[Foo| bar]]
[[Foo| ''bar'']]
[http://wp.org foo]
[http://wp.org ''foo'']
-!! result
+!! html
<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)"> bar</a>
</p><p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)"> <i>bar</i></a>
</p><p><a rel="nofollow" class="external text" href="http://wp.org">foo</a>
Parsoid: Scoped parsing should handle mixed transclusions and plain text
!! options
parsoid
-!! input
+!! wikitext
[[Foo|{{echo|a}} b {{echo|c}}]]
-!! result
+!! html
<p><a rel="mw:WikiLink" href="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
!! end
!! test
Inline interwiki link
-!! input
+!! wikitext
[[MeatBall:SoftSecurity]]
-!! result
+!! html
<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity</a>
</p>
!! end
!! test
Inline interwiki link with empty title (bug 2372)
-!! input
+!! wikitext
[[MeatBall:]]
-!! result
+!! html
<p><a href="http://www.usemod.com/cgi-bin/mb.pl" class="extiw" title="meatball:">MeatBall:</a>
</p>
!! end
!! test
Interwiki link encoding conversion (bug 1636)
-!! input
+!! wikitext
*[[Wikipedia:ro:Olteniţa]]
*[[Wikipedia:ro:Olteniţa]]
-!! result
+!! html
<ul>
<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteniţa</a>
</li>
!! test
Interwiki link with fragment (bug 2130)
-!! input
+!! wikitext
[[MeatBall:SoftSecurity#foo]]
-!! result
+!! html
<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity#foo" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity#foo</a>
</p>
!! end
Different interwiki prefixes mapping to the same URL
!! options
parsoid
-!! input
+!! wikitext
[[wikipedia:Foo]]
[[:en:Foo]]
-!! result
+!! html
<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true}'>wikipedia:Foo</a></p>
<p><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true}'>en:Foo</a></p>
Interwiki links that cannot be represented in wiki syntax
!! options
parsoid
-!! input
+!! wikitext
[[meatball:ok]]
[[meatball:ok#foo|ok with fragment]]
[[meatball:ok_as_well?|ok ending with ? mark]]
[http://de.wikipedia.org/wiki/Foo?action=history has query]
[http://de.wikipedia.org/wiki/#foo is just fragment]
-!! result
+!! html
<p><a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok">meatball:ok</a>
<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok#foo">ok with fragment</a>
<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well%3F">ok ending with ? mark</a>
Interwiki links: trail
!! options
parsoid
-!! input
+!! wikitext
[[wikipedia:Foo|Ba]]r
-!! result
+!! html
<p data-parsoid='{}'><a rel="mw:ExtLink" href="http://en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"piped","a":{"href":"http://en.wikipedia.org/wiki/Foo"},"sa":{"href":"wikipedia:Foo"},"isIW":true,"tail":"r"}'>Bar</a></p>
!! end
!! test
Interlanguage link
-!! input
+!! wikitext
Blah blah blah
[[zh:Chinese]]
-!!result
+!! html
<p>Blah blah blah
</p>
!! end
!! test
Double interlanguage link
-!! input
+!! wikitext
Blah blah blah
[[es:Spanish]]
[[zh:Chinese]]
-!!result
+!! html
<p>Blah blah blah
</p>
!! end
Interlanguage link, with prefix links
!! options
language=ln
-!! input
+!! wikitext
Blah blah blah
[[zh:Chinese]]
-!!result
+!! html
<p>Blah blah blah
</p>
!! end
Double interlanguage link, with prefix links (bug 8897)
!! options
language=ln
-!! input
+!! wikitext
Blah blah blah
[[es:Spanish]]
[[zh:Chinese]]
-!!result
+!! html
<p>Blah blah blah
</p>
!! end
Parsoid-specific test: Wikilinks with should RT properly
!! options
language=ln
-!! input
+!! wikitext
[[WW II]]
-!!result
+!! html
<p><a href="/index.php?title=WW_II&action=edit&redlink=1" class="new" title="WW II (lonkásá ezalí tɛ̂)">WW II</a>
</p>
!! end
Parsoid bug 53221: Wikilinks should be properly entity-escaped
!! options
parsoid=html2wt
-!! input
+!! wikitext
He&nbsp;llo [[Foo|He&nbsp;llo]]
He&nbsp;llo [[He&nbsp;llo]]
-!!result
+!! html
<p>He&nbsp;llo <a href="Foo" rel="mw:WikiLink">He&nbsp;llo</a></p>
<p>He&nbsp;llo <a href="He&nbsp;llo" rel="mw:WikiLink">He&nbsp;llo</a></p>
!! end
Parsoid: handle constructor well
!! options
parsoid
-!! input
+!! wikitext
[[constructor]]
[[constructor:foo]]
-!! result
+!! html
<p><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{"stx":"simple","a":{"href":"./Constructor"},"sa":{"href":"constructor"}}">constructor</a></p>
<p><a rel="mw:WikiLink" href="./Foo" data-parsoid="{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"constructor:foo"}}">constructor:foo</a></p>
Parsoid: recognize interlanguage links without a target page
!! options
parsoid
-!! input
+!! wikitext
[[ko:]]
-!! result
+!! html
<p>
<link rel="mw:PageProp/Language" href="http://ko.wikipedia.org/wiki/"></p>
!! end
Parsoid: recognize interwiki links without a target page
!! options
parsoid
-!! input
+!! wikitext
[[:ko:]]
-!! result
+!! html
<p><a rel="mw:ExtLink" href="//ko.wikipedia.org/wiki/">ko:</a></p>
!! end
Parsoid: Bug #45209, handle interwiki links pointing to the current wiki as plain wiki links
!! options
parsoid
-!! input
+!! wikitext
[[en:Foo]]
-!! result
+!! html
<p><a rel="mw:WikiLink" href="./Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"en:Foo"}}'>Foo</a></p>
!! end
1. Simple redirect to page
!! options
parsoid
-!! input
+!! wikitext
#REDIRECT [[Main Page]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Main_Page">
!! end
2. Other redirect variants
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
#REDIRECT [[Main_Page]]
#REDIRECT [[<nowiki>[[Bar]]</nowiki>]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Main_Page">
<link rel="mw:PageProp/redirect" href="./%5B%5BBar%5D%5D">
!! end
# the colon is archaic syntax. we support it for wt2html, but we
# don't care that it roundtrips back to the modern syntax.
parsoid=wt2html,html2html
-!! input
+!! wikitext
#REDIRECT:[[Main Page]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Main_Page">
!! end
# it for wt2html, but we don't care that it roundtrips back to the
# modern syntax (without extra whitespace)
parsoid=wt2html,html2html
-!! input
+!! wikitext
#REDIRECT
:
[[Main Page]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Main_Page">
!! end
# content after piped link is ignored. we support this syntax,
# but don't care that the piped link is lost when we roundtrip this.
parsoid=wt2html
-!! input
+!! wikitext
#REDIRECT [[Main Page|bar]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Main_Page">
!! end
Redirect to category
!! options
parsoid=wt2html
-!! input
+!! wikitext
#REDIRECT [[Category:Foo]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:PageProp/Category" href="./Category:Foo">
!! end
Redirect to category with URL encoding
!! options
parsoid=wt2html
-!! input
+!! wikitext
#REDIRECT [[Category%3AFoo]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:PageProp/Category" href="./Category:Foo">
!! end
Redirect to category page
!! options
parsoid=wt2html,html2html
-!! input
+!! wikitext
#REDIRECT [[:Category:Foo]]
-!! result
+!! html
<p><a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a></p>
!! end
Redirect to image page (1)
!! options
parsoid
-!! input
+!! wikitext
#REDIRECT [[File:Wiki.png]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
!! end
Redirect to image page (2)
!! options
parsoid
-!! input
+!! wikitext
#REDIRECT [[Image:Wiki.png]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
!! end
Redirect to language
!! options
parsoid
-!! input
+!! wikitext
#REDIRECT [[en:File:Wiki.png]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="File:Wiki.png">
!! end
Redirect to interwiki
!! options
parsoid
-!! input
+!! wikitext
#REDIRECT [[meatball:File:Wiki.png]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="File:Wiki.png">
!! end
!! options
parsoid
language=is
-!! input
+!! wikitext
#TILVÍSUN [[Main Page]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="./Main_Page">
!! end
New redirect
!! options
parsoid=html2wt
-!! input
+!! wikitext
Foo
#REDIRECT [[Foo]]
-!! result
+!! html
<p>Foo<link rel="mw:PageProp/redirect" href="./Foo"></p>
!! end
!! test
<br> to <br />
-!! input
+!! wikitext
1<br>2<br />3
-!! result
+!! html
<p>1<br />2<br />3
</p>
!! end
!! test
Broken br tag sanitization
-!! options
-php
-!! input
+!! wikitext
</br>
-!! result
+!! html/php
<p></br>
</p>
!! end
Parsoid: Broken br tag recognition
!! options
parsoid=wt2html
-!! input
+!! wikitext
</br>
-!! result
+!! html/parsoid
<p><br></p>
!! end
!! test
Incorrecly removing closing slashes from correctly formed XHTML
-!! input
+!! wikitext
<br style="clear:both;" />
-!! result
+!! html
<p><br style="clear:both;" />
</p>
!! end
!! test
Failing to transform badly formed HTML into correct XHTML
-!! input
+!! wikitext
<br style="clear: left;">
<br style="clear: right;">
<br style="clear: both;">
-!! result
+!! html
<p><br style="clear: left;" />
<br style="clear: right;" />
<br style="clear: both;" />
!! test
Handling html with a div self-closing tag
-!! input
+!! wikitext
<div title />
<div title/>
<div title/ >
<div title=bar />
<div title=bar/>
<div title=bar/ >
-!! result
+!! html
<p><div title />
<div title/>
</p>
!! test
Handling html with a br self-closing tag
-!! input
+!! wikitext
<br title />
<br title/>
<br title/ >
<br title=bar />
<br title=bar/>
<br title=bar/ >
-!! result
+!! html
<p><br title="title" />
<br title="title" />
<br />
!! test
Horizontal ruler (should it add that extra space?)
-!! input
+!! wikitext
<hr>
<hr >
foo <hr
> bar
-!! result
+!! html
<hr />
<hr />
foo <hr /> bar
!! test
Horizontal ruler -- 4+ dashes render hr
-!! input
+!! wikitext
----
-!! result
+!! html
<hr />
!! end
!! test
Horizontal ruler -- eats additional dashes on the same line
-!! input
+!! wikitext
---------
-!! result
+!! html
<hr />
!! end
!! test
Horizontal ruler -- does not collapse dashes on consecutive lines
-!! input
+!! wikitext
----
----
-!! result
+!! html
<hr />
<hr />
!! test
Horizontal ruler -- <4 dashes render as plain text
-!! input
+!! wikitext
---
-!! result
+!! html
<p>---
</p>
!! end
!! test
Horizontal ruler -- Supports content following dashes on same line
-!! input
+!! wikitext
---- Foo
-!! result
+!! html
<hr /> Foo
!! end
###
!! test
Common list
-!! input
+!! wikitext
*Common list
* item 2
*item 3
-!! result
+!! html
<ul>
<li>Common list
</li>
!! test
Numbered list
-!! input
+!! wikitext
#Numbered list
#item 2
# item 3
-!! result
+!! html
<ol>
<li>Numbered list
</li>
!! test
Mixed list
-!! input
+!! wikitext
*Mixed list
*# with numbers
** and bullets
*Level 1
*** Level 3
#** Level 3, but ordered
-!! result
+!! html
<ul>
<li>Mixed list
<ol>
!! test
Nested lists 1
-!! input
+!! wikitext
*foo
**bar
-!! result
+!! html
<ul>
<li>foo
<ul>
!! test
Nested lists 2
-!! input
+!! wikitext
**foo
*bar
-!! result
+!! html
<ul>
<li><ul>
<li>foo
!! test
Nested lists 3 (first element empty)
-!! input
+!! wikitext
*
**bar
-!! result
+!! html
<ul>
<li>
<ul>
!! test
Nested lists 4 (first element empty)
-!! input
+!! wikitext
**
*bar
-!! result
+!! html
<ul>
<li><ul>
<li>
!! test
Nested lists 5 (both elements empty)
-!! input
+!! wikitext
**
*
-!! result
+!! html
<ul>
<li><ul>
<li>
!! test
Nested lists 6 (both elements empty)
-!! input
+!! wikitext
*
**
-!! result
+!! html
<ul>
<li>
<ul>
!! test
Nested lists 7 (skip initial nesting levels)
-!! input
+!! wikitext
*** foo
-!! result
+!! html
<ul>
<li><ul>
<li><ul>
!! test
Nested lists 8 (multiple nesting transitions)
-!! input
+!! wikitext
* foo
*** bar
** baz
* boo
-!! result
+!! html
<ul>
<li> foo
<ul>
!! test
1. Lists with start-of-line-transparent tokens before bullets: Comments
-!! input
+!! wikitext
*foo
*<!--cmt-->bar
<!--cmt-->*baz
-!! result
+!! html
<ul>
<li>foo
</li>
!! test
2. Lists with start-of-line-transparent tokens before bullets: Template close
-!! input
+!! wikitext
*foo {{echo|bar
}}*baz
-!! result
+!! html
<ul>
<li>foo bar
</li>
!! test
List items are not parsed correctly following a <pre> block (bug 785)
-!! input
+!! wikitext
* <pre>foo</pre>
* <pre>bar</pre>
* zar
-!! result
+!! html
<ul>
<li> <pre>foo</pre>
</li>
!! test
List items from template
-!! input
+!! wikitext
{{inner list}}
* item 2
* item 0
* notSOL{{inner list}}
* item 2
-!! result
+!! html
<ul>
<li> item 1
</li>
!! test
List interrupted by empty line or heading
-!! input
+!! wikitext
* foo
** bar
== A heading ==
* Another list item
-!! result
+!! html
<ul>
<li> foo
</li>
!!test
Multiple list tags generated by templates
-!!input
+!! wikitext
{{echo|<li>}}a
{{echo|<li>}}b
{{echo|<li>}}c
-!!result
+!! html
<li>a
<li>b
<li>c</li>
!!test
Single-comment whitespace lines dont break lists, and neither do multi-comment whitespace lines
-!!input
+!! wikitext
*a
<!--This line will NOT split the list-->
*b
*c
<!--foo--> <!----> <!--This line NOT split the list either-->
*d
-!!result
+!! html
<ul>
<li>a
</li>
!!test
Replacing whitespace with tabs still doesn't break the list (gerrit 78327)
-!!input
+!! wikitext
*a
<!--This line will NOT split the list-->
*b
<!--foo--> <!----> <!--This line NOT split the list
either-->
*d
-!!result
+!! html
<ul>
<li>a
</li>
(Cannot test this with PHP parser since it relies on Tidy for the hack)
!!options
parsoid=wt2html,wt2wt
-!!input
+!! wikitext
* foo
* <li>li-hack
* {{echo|<li>templated li-hack}}
<li><li>not a li-hack
</li>
</ul>
-!!result
+!! html
<ul>
<li> foo</li>
<li>li-hack</li>
Parsoid: Make sure nested lists are serialized on their own line even if HTML contains no newlines
!! options
parsoid
-!! input
+!! wikitext
# foo
## bar
* foo
** bar
: foo
:: bar
-!! result
+!! html
<ol>
<li> foo<ol>
<li> bar</li>
Parsoid: Test of whitespace serialization with Templated bullets
!! options
parsoid
-!! input
+!! wikitext
* {{bullet}}
-!! result
+!! html
<ul>
<li> </li><li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bullet","href":"./Template:Bullet"},"params":{},"i":0}}]}'> Bar</li>
</ul>
!! test
Unbalanced closing block tags break a list
(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-parsoid
-!! input
+!! wikitext
<div>
*a</div><div>
*b</div>
-!! result
+!! html/parsoid
<div>
<ul>
<li>a
!! test
Unbalanced closing non-block tags don't break a list
(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-parsoid
-!! input
+!! wikitext
<span>
*a</span><span>
*b</span>
-!! result
+!! html/parsoid
<p><span></span>
</p>
<ul>
!! test
Unclosed formatting tags that straddle lists are closed and reopened
(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-parsoid
-!! input
+!! wikitext
# <s> a
# b </s>
-!! result
+!! html/parsoid
<ol>
<li> <s> a </s>
</li>
!!test
List embedded in a non-block tag
(Ugly Parsoid output -- worth fixing; Disabled for PHP parser since it relies on Tidy)
-!! options
-parsoid
-!!input
+!! wikitext
<small>
* foo
</small>
-!!result
+!! html/parsoid
<p><small></small></p>
<small>
<ul>
Table with missing opening <tr> tag
!! options
parsoid=wt2html,wt2wt
-!! input
+!! wikitext
<table>
<td>foo</td>
</tr>
</table>
-!! result
+!! html/parsoid
<table>
<tr>
<td>foo</td>
!! test
Magic Word: {{CURRENTDAY}}
-!! input
+!! wikitext
{{CURRENTDAY}}
-!! result
+!! html
<p>1
</p>
!! end
!! test
Magic Word: {{CURRENTDAY2}}
-!! input
+!! wikitext
{{CURRENTDAY2}}
-!! result
+!! html
<p>01
</p>
!! end
!! test
Magic Word: {{CURRENTDAYNAME}}
-!! input
+!! wikitext
{{CURRENTDAYNAME}}
-!! result
+!! html
<p>Thursday
</p>
!! end
!! test
Magic Word: {{CURRENTDOW}}
-!! input
+!! wikitext
{{CURRENTDOW}}
-!! result
+!! html
<p>4
</p>
!! end
!! test
Magic Word: {{CURRENTMONTH}}
-!! input
+!! wikitext
{{CURRENTMONTH}}
-!! result
+!! html
<p>01
</p>
!! end
!! test
Magic Word: {{CURRENTMONTH1}}
-!! input
+!! wikitext
{{CURRENTMONTH1}}
-!! result
+!! html
<p>1
</p>
!! end
!! test
Magic Word: {{CURRENTMONTHABBREV}}
-!! input
+!! wikitext
{{CURRENTMONTHABBREV}}
-!! result
+!! html
<p>Jan
</p>
!! end
!! test
Magic Word: {{CURRENTMONTHNAME}}
-!! input
+!! wikitext
{{CURRENTMONTHNAME}}
-!! result
+!! html
<p>January
</p>
!! end
!! test
Magic Word: {{CURRENTMONTHNAMEGEN}}
-!! input
+!! wikitext
{{CURRENTMONTHNAMEGEN}}
-!! result
+!! html
<p>January
</p>
!! end
!! test
Magic Word: {{CURRENTTIME}}
-!! input
+!! wikitext
{{CURRENTTIME}}
-!! result
+!! html
<p>00:02
</p>
!! end
!! test
Magic Word: {{CURRENTHOUR}}
-!! input
+!! wikitext
{{CURRENTHOUR}}
-!! result
+!! html
<p>00
</p>
!! end
!! test
Magic Word: {{CURRENTWEEK}} (@bug 4594)
-!! input
+!! wikitext
{{CURRENTWEEK}}
-!! result
+!! html
<p>1
</p>
!! end
!! test
Magic Word: {{CURRENTYEAR}}
-!! input
+!! wikitext
{{CURRENTYEAR}}
-!! result
+!! html
<p>1970
</p>
!! end
!! test
Magic Word: {{CURRENTTIMESTAMP}}
-!! input
+!! wikitext
{{CURRENTTIMESTAMP}}
-!! result
+!! html
<p>19700101000203
</p>
!! end
!! test
Magic Words LOCAL (UTC)
-!! input
+!! wikitext
* {{LOCALMONTH}}
* {{LOCALMONTH1}}
* {{LOCALMONTHNAME}}
* {{LOCALWEEK}}
* {{LOCALDOW}}
* {{LOCALTIMESTAMP}}
-!! result
+!! html
<ul>
<li> 01
</li>
Magic Word: {{FULLPAGENAME}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{FULLPAGENAME}}
-!! result
+!! html
<p>User:Ævar Arnfjörð Bjarmason
</p>
!! end
Magic Word: {{FULLPAGENAMEE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{FULLPAGENAMEE}}
-!! result
+!! html
<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
</p>
!! end
Magic Word: {{TALKSPACE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{TALKSPACE}}
-!! result
+!! html
<p>User talk
</p>
!! end
Magic Word: {{TALKSPACE}}, same namespace
!! options
title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{TALKSPACE}}
-!! result
+!! html
<p>User talk
</p>
!! end
Magic Word: {{TALKSPACE}}, main namespace
!! options
title=[[Parser Test]]
-!! input
+!! wikitext
{{TALKSPACE}}
-!! result
+!! html
<p>Talk
</p>
!! end
Magic Word: {{TALKSPACEE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{TALKSPACEE}}
-!! result
+!! html
<p>User_talk
</p>
!! end
Magic Word: {{SUBJECTSPACE}}
!! options
title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{SUBJECTSPACE}}
-!! result
+!! html
<p>User
</p>
!! end
Magic Word: {{SUBJECTSPACE}}, same namespace
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{SUBJECTSPACE}}
-!! result
+!! html
<p>User
</p>
!! end
Magic Word: {{SUBJECTSPACE}}, main namespace
!! options
title=[[Parser Test]]
-!! input
+!! wikitext
{{SUBJECTSPACE}}
-!! result
+!! html
!! end
Magic Word: {{SUBJECTSPACEE}}
!! options
title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{SUBJECTSPACEE}}
-!! result
+!! html
<p>User
</p>
!! end
Magic Word: {{NAMESPACE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{NAMESPACE}}
-!! result
+!! html
<p>User
</p>
!! end
Magic Word: {{NAMESPACEE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{NAMESPACEE}}
-!! result
+!! html
<p>User
</p>
!! end
Magic Word: {{NAMESPACENUMBER}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{NAMESPACENUMBER}}
-!! result
+!! html
<p>2
</p>
!! end
Magic Word: {{SUBPAGENAME}}
!! options
title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
-!! input
+!! wikitext
{{SUBPAGENAME}}
-!! result
+!! html
<p>sub ö
</p>
!! end
Magic Word: {{SUBPAGENAMEE}}
!! options
title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
-!! input
+!! wikitext
{{SUBPAGENAMEE}}
-!! result
+!! html
<p>sub_%C3%B6
</p>
!! end
Magic Word: {{ROOTPAGENAME}}
!! options
title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
-!! input
+!! wikitext
{{ROOTPAGENAME}}
-!! result
+!! html
<p>Ævar Arnfjörð Bjarmason
</p>
!! end
Magic Word: {{ROOTPAGENAMEE}}
!! options
title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
-!! input
+!! wikitext
{{ROOTPAGENAMEE}}
-!! result
+!! html
<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
</p>
!! end
Magic Word: {{BASEPAGENAME}}
!! options
title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
-!! input
+!! wikitext
{{BASEPAGENAME}}
-!! result
+!! html
<p>Ævar Arnfjörð Bjarmason
</p>
!! end
Magic Word: {{BASEPAGENAMEE}}
!! options
title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
-!! input
+!! wikitext
{{BASEPAGENAMEE}}
-!! result
+!! html
<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
</p>
!! end
Magic Word: {{TALKPAGENAME}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{TALKPAGENAME}}
-!! result
+!! html
<p>User talk:Ævar Arnfjörð Bjarmason
</p>
!! end
Magic Word: {{TALKPAGENAMEE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{TALKPAGENAMEE}}
-!! result
+!! html
<p>User_talk:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
</p>
!! end
Magic Word: {{SUBJECTPAGENAME}}
!! options
title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{SUBJECTPAGENAME}}
-!! result
+!! html
<p>User:Ævar Arnfjörð Bjarmason
</p>
!! end
Magic Word: {{SUBJECTPAGENAMEE}}
!! options
title=[[User talk:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{SUBJECTPAGENAMEE}}
-!! result
+!! html
<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
</p>
!! end
!! test
Magic Word: {{NUMBEROFFILES}}
-!! input
+!! wikitext
{{NUMBEROFFILES}}
-!! result
+!! html
<p>4
</p>
!! end
Magic Word: {{PAGENAME}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{PAGENAME}}
-!! result
+!! html
<p>Ævar Arnfjörð Bjarmason
</p>
!! end
Magic Word: {{PAGENAME}} with metacharacters
!! options
title=[['foo & bar = baz']]
-!! input
+!! wikitext
''{{PAGENAME}}''
-!! result
+!! html
<p><i>'foo & bar = baz'</i>
</p>
!! end
Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
!! options
title=[[*RFC 1234 http://example.com/]]
-!! input
+!! wikitext
{{PAGENAME}}
-!! result
+!! html
<p>*RFC 1234 http://example.com/
</p>
!! end
Magic Word: {{PAGENAMEE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
+!! wikitext
{{PAGENAMEE}}
-!! result
+!! html
<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
</p>
!! end
Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
!! options
title=[[*RFC 1234 http://example.com/]]
-!! input
+!! wikitext
{{PAGENAMEE}}
-!! result
+!! html
<p>*RFC_1234_http://example.com/
</p>
!! end
!! test
Magic Word: {{REVISIONID}}
-!! input
+!! wikitext
{{REVISIONID}}
-!! result
+!! html
<p>1337
</p>
!! end
!! test
Magic Word: {{SCRIPTPATH}}
-!! input
+!! wikitext
{{SCRIPTPATH}}
-!! result
+!! html
<p>/
</p>
!! end
!! test
Magic Word: {{STYLEPATH}}
-!! input
+!! wikitext
{{STYLEPATH}}
-!! result
+!! html
<p>/skins
</p>
!! end
!! test
Magic Word: {{SERVER}}
-!! input
+!! wikitext
{{SERVER}}
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
</p>
!! end
!! test
Magic Word: {{SERVERNAME}}
-!! input
+!! wikitext
{{SERVERNAME}}
-!! result
+!! html
<p>example.org
</p>
!! end
!! test
Magic Word: {{SITENAME}}
-!! input
+!! wikitext
{{SITENAME}}
-!! result
+!! html
<p>MediaWiki
</p>
!! end
!! test
Case-sensitive magic words, when cased differently, should just be template transclusions
-!! input
+!! wikitext
{{CurrentMonth}}
{{currentday}}
{{cURreNTweEK}}
{{currentHour}}
-!! result
+!! html
<p><a href="/index.php?title=Template:CurrentMonth&action=edit&redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a>
<a href="/index.php?title=Template:Currentday&action=edit&redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a>
<a href="/index.php?title=Template:CURreNTweEK&action=edit&redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a>
!! test
Case-insensitive magic words should still work with weird casing.
-!! input
+!! wikitext
{{sErVeRNaMe}}
{{LCFirst:AOEU}}
{{ucFIRST:aoeu}}
{{SERver}}
-!! result
+!! html
<p>example.org
aOEU
Aoeu
!! test
Namespace 1 {{ns:1}}
-!! input
+!! wikitext
{{ns:1}}
-!! result
+!! html
<p>Talk
</p>
!! end
!! test
Namespace 1 {{ns:01}}
-!! input
+!! wikitext
{{ns:01}}
-!! result
+!! html
<p>Talk
</p>
!! end
!! test
Namespace 0 {{ns:0}} (bug 4783)
-!! input
+!! wikitext
{{ns:0}}
-!! result
+!! html
!! end
!! test
Namespace 0 {{ns:00}} (bug 4783)
-!! input
+!! wikitext
{{ns:00}}
-!! result
+!! html
!! end
!! test
Namespace -1 {{ns:-1}}
-!! input
+!! wikitext
{{ns:-1}}
-!! result
+!! html
<p>Special
</p>
!! end
!! test
Namespace User {{ns:User}}
-!! input
+!! wikitext
{{ns:User}}
-!! result
+!! html
<p>User
</p>
!! end
!! test
Namespace User talk {{ns:User_talk}}
-!! input
+!! wikitext
{{ns:User_talk}}
-!! result
+!! html
<p>User talk
</p>
!! end
!! test
Namespace User talk {{ns:uSeR tAlK}}
-!! input
+!! wikitext
{{ns:uSeR tAlK}}
-!! result
+!! html
<p>User talk
</p>
!! end
!! test
Namespace File {{ns:File}}
-!! input
+!! wikitext
{{ns:File}}
-!! result
+!! html
<p>File
</p>
!! end
!! test
Namespace File {{ns:Image}}
-!! input
+!! wikitext
{{ns:Image}}
-!! result
+!! html
<p>File
</p>
!! end
Namespace (lang=de) Benutzer {{ns:User}}
!! options
language=de
-!! input
+!! wikitext
{{ns:User}}
-!! result
+!! html
<p>Benutzer
</p>
!! end
Namespace (lang=de) Benutzer Diskussion {{ns:3}}
!! options
language=de
-!! input
+!! wikitext
{{ns:3}}
-!! result
+!! html
<p>Benutzer Diskussion
</p>
!! end
!! test
Urlencode
-!! input
+!! wikitext
{{urlencode:hi world?!}}
{{urlencode:hi world?!|WIKI}}
{{urlencode:hi world?!|PATH}}
{{urlencode:hi world?!|QUERY}}
-!! result
+!! html
<p>hi+world%3F%21
hi_world%3F!
hi%20world%3F%21
Magic Word: prioritize type info over data-parsoid
!! options
parsoid=html2wt
-!! input
+!! wikitext
__FORCETOC__
-!! result
+!! html
<meta property="mw:PageProp/forcetoc" data-parsoid='{"src":"__NOTOC__","magicSrc":"__NOTOC__"}'/>
!! end
Magic Word: serialize on separate line (parsoid)
!! options
parsoid=wt2wt,html2wt
-!! input
+!! wikitext
foo
__NOTOC__
bar
-!! result
+!! html
foo<meta property="mw:PageProp/notoc"/>bar
!! end
!! options
parsoid=wt2wt
language=de
-!! input
+!! wikitext
__NOEDITSECTION__
-!! result
+!! html
<meta property="mw:PageProp/noeditsection" data-parsoid='{"src":"__NOEDITSECTION__","magicSrc":"__NOEDITSECTION__"}'/>
!! end
###
!! test
Magic links: internal link to RFC (bug 479)
-!! input
+!! wikitext
[[RFC 123]]
-!! result
+!! html
<p><a href="/index.php?title=RFC_123&action=edit&redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
</p>
!! end
!! test
Magic links: RFC (bug 479)
-!! input
+!! wikitext
RFC 822
-!! result
+!! html
<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
</p>
!! end
!! test
Magic links: ISBN (bug 1937)
-!! input
+!! wikitext
ISBN 0-306-40615-2
-!! result
+!! html
<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
</p>
!! end
!! test
Magic links: PMID incorrectly converts space to underscore
-!! input
+!! wikitext
PMID 1234
-!! result
+!! html
<p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
</p>
!! end
!! test
Nonexistent template
-!! input
+!! wikitext
{{thistemplatedoesnotexist}}
-!! result
+!! html
<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&action=edit&redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
</p>
!! end
!! test
Template with invalid target containing tags
-!! input
+!! wikitext
{{a<b>b</b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
-!! result
+!! html
<p>{{a<b>b</b>|foo|a=b|a = b}}
</p>
!! end
!! test
Template with invalid target containing unclosed tag
-!! input
+!! wikitext
{{a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
-!! result
+!! html
<p>{{a<b>|foo|a=b|a = b}}</b>
</p>
!! end
!! test
-Template with invalid target containing wikilink (php)
-!! options
-php
-!! input
+Template with invalid target containing wikilink
+!! wikitext
{{[[Main Page]]}}
-!! result
+!! html/php
<p>{{<a href="/wiki/Main_Page" title="Main Page">Main Page</a>}}
</p>
-!! end
-
-!! test
-Template with invalid target containing wikilink (parsoid)
-!! options
-parsoid
-!! input
-{{[[Main Page]]}}
-!! result
+!! html/parsoid
<p><span typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":[{"template":{"target":{"wt":"[[Main Page]]"},"params":{},"i":0}}]}'>{{</span><a rel="mw:WikiLink" href="./Main_Page" about="#mwt1">Main Page</a><span about="#mwt1">}}</span></p>
!! end
!! test
Simple template
-!! input
+!! wikitext
{{test}}
-!! result
+!! html
<p>This is a test template
</p>
!! end
!! test
Template with explicit namespace
-!! input
+!! wikitext
{{Template:test}}
-!! result
+!! html
<p>This is a test template
</p>
!! end
!! test
Template parameter
-!! input
+!! wikitext
{{paramtest|param=foo}}
-!! result
+!! html
<p>This is a test template with parameter foo
</p>
!! end
!! test
Template unnamed parameter
-!! input
+!! wikitext
{{paramtestnum|Main Page|the main page}}
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
</p>
!! end
!! test
Template with template name as unnamed argument
-!! input
+!! wikitext
{{templateasargtestnum|templatesimple}}
-!! result
+!! html
<p>(test)
</p>
!! end
!! test
Template with template name as argument
-!! input
+!! wikitext
{{templateasargtest|templ=simple}}
-!! result
+!! html
<p>(test)
</p>
!! end
!! test
Template with template name as argument (2)
-!! input
+!! wikitext
{{templateasargtest2|templ=templatesimple}}
-!! result
+!! html
<p>(test)
</p>
!! end
!! test
Template with default value
-!! input
+!! wikitext
{{templateasargtestdefault}}
-!! result
+!! html
<p>(test)
</p>
!! end
!! test
Template with default value (value set)
-!! input
+!! wikitext
{{templateasargtestdefault|templ=templa}}
-!! result
+!! html
<p><b>templ</b>
</p>
!! end
!! test
Template redirect
-!! input
+!! wikitext
{{templateredirect}}
-!! result
+!! html
<p>(test)
</p>
!! end
!! test
Template with argument in separate line
-!! input
+!! wikitext
{{ templateasargtest |
templ = simple }}
-!! result
+!! html
<p>(test)
</p>
!! end
!! test
Template with complex template as argument
-!! input
+!! wikitext
{{paramtest|
param ={{ templateasargtest |
templ = simple }}}}
-!! result
+!! html
<p>This is a test template with parameter (test)
</p>
!! end
!! test
Template with thumb image (with link in description)
-!! input
+!! wikitext
{{paramtest|
param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
-!! result
+!! html
This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a> <div class="thumbcaption"><a href="/index.php?title=No_link&action=edit&redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&action=edit&redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
!! end
!! test
Template with complex arguments
-!! input
+!! wikitext
{{complextemplate|
param ={{ templateasargtest |
templ = simple }}|[[Template:complextemplate|link]]}}
-!! result
+!! html
<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
</p>
!! end
!! test
BUG 553: link with two variables in a piped link
-!! input
+!! wikitext
{|
|[[{{{1}}}|{{{2}}}]]
|}
-!! result
+!! html
<table>
<tr>
<td>[[{{{1}}}|{{{2}}}]]
!! test
Magic variable as template parameter
-!! input
+!! wikitext
{{paramtest|param={{SITENAME}}}}
-!! result
+!! html
<p>This is a test template with parameter MediaWiki
</p>
!! end
!! test
Template parameter as link source
-!! input
+!! wikitext
{{linktest|param=Main Page}}
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">link</a>
</p>
!! end
!!test
Template-generated attribute string (k='v')
-!!input
+!! wikitext
<span {{attr_str|id|v1}}>bar</span>
-!!result
+!! html
<p><span id="v1">bar</span>
</p>
!!end
!! test
Template passing argument to another template
-!! input
+!! wikitext
{{paramtest2|arg='hmm'}}
-!! result
+!! html
<p>including another template, This is a test template with parameter 'hmm'
</p>
!! end
!! test
Template as link source
-!! input
+!! wikitext
[[{{linktest2}}]]
[[{{linktest2}}|Main Page]]
[[{{linktest2}}]]Page
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>Page
!! test
Template infinite loop
-!! input
+!! wikitext
{{loop1}}
-!! result
+!! html
<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
</p>
!! end
!! test
Template from main namespace
-!! input
+!! wikitext
{{:Main Page}}
-!! result
+!! html
<p>blah blah
</p>
!! end
!! test
BUG 529: Template with table, not included at beginning of line
-!! input
+!! wikitext
foo {{table}}
-!! result
+!! html
<p>foo
</p>
<table>
!! test
BUG 523: Template shouldn't eat newline (or add an extra one before table)
-!! input
+!! wikitext
foo
{{table}}
-!! result
+!! html
<p>foo
</p>
<table>
!! test
BUG 41: Template parameters shown as broken links
-!! input
+!! wikitext
{{{parameter}}}
-!! result
+!! html
<p>{{{parameter}}}
</p>
!! end
!! test
Template with targets containing wikilinks
-!! input
+!! wikitext
{{[[foo]]}}
{{[[{{echo|foo}}]]}}
{{{{echo|[[foo}}]]}}
-!! result
+!! html
<p>{{<a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
</p><p>{{<a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
</p><p>{{[[foo}}]]
msgnw keyword
!! options
disabled
-!! input
+!! wikitext
{{msgnw:MSGNW test}}
-!! result
+!! html
<p>''None'' of '''this''' should be
* interpreted
but rather passed unmodified
!! test
int keyword
-!! input
+!! wikitext
{{int:youhavenewmessages|lots of money|not!}}
-!! result
+!! html
<p>You have lots of money (not!).
</p>
!! end
!! test
<includeonly> and <noinclude> being included
-!! input
+!! wikitext
{{Includes}}
-!! result
+!! html
<p>Foobar
</p>
!! end
!! test
<onlyinclude> being included
-!! input
+!! wikitext
{{Includes2}}
-!! result
+!! html
<p>Foo
</p>
!! end
!! test
<onlyinclude> and <includeonly> being included
-!! input
+!! wikitext
{{Includes3}}
-!! result
+!! html
<p>Foo
</p>
!! end
!! test
<includeonly> and <noinclude> on a page
-!! input
+!! wikitext
Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
-!! result
+!! html
<p>Foozar
</p>
!! end
!! test
Un-closed <noinclude>
-!! input
+!! wikitext
<noinclude>
-!! result
+!! html
!! end
!! test
<onlyinclude> on a page
-!! input
+!! wikitext
<onlyinclude>Foo</onlyinclude>bar
-!! result
+!! html
<p>Foobar
</p>
!! end
!! test
Un-closed <onlyinclude>
-!! input
+!! wikitext
<onlyinclude>
-!! result
+!! html
!! end
!!test
Self-closed noinclude, includeonly, onlyinclude tags
-!!input
+!! wikitext
<noinclude />
<includeonly />
<onlyinclude />
-!!result
+!! html
<p><br />
</p>
!!end
!!test
Unbalanced includeonly and noinclude tags
-!!input
+!! wikitext
{|
|a</noinclude>
|b</noinclude></noinclude>
|c</noinclude></includeonly>
|d</includeonly></includeonly>
|}
-!!result
+!! html
<table>
<tr>
<td>a
!! test
Bug 6563: Edit link generation for section shown by <includeonly>
-!! input
+!! wikitext
{{includeonly section}}
-!! result
+!! html
<h2><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&action=edit&section=T-1" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&action=edit&section=T-2" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
Bug 6563: Section extraction for section shown by <includeonly>
!! options
section=T-2
-!! input
+!! wikitext
<includeonly>
==Includeonly section==
</includeonly>
==Section T-2==
-!! result
+!! html
==Section T-2==
!! end
!! test
Bug 6563: Edit link generation for section suppressed by <includeonly>
-!! input
+!! wikitext
<includeonly>
==Includeonly section==
</includeonly>
==Section 1==
-!! result
+!! html
<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
Bug 6563: Section extraction for section suppressed by <includeonly>
!! options
section=1
-!! input
+!! wikitext
<includeonly>
==Includeonly section==
</includeonly>
==Section 1==
-!! result
+!! html
==Section 1==
!! end
!! test
Un-closed <includeonly>
-!! input
+!! wikitext
<includeonly>
-!! result
+!! html
!! end
# TODO: test with DOM fragment reuse!
Parsoid: DOM fragment reuse
!! options
parsoid=wt2wt,wt2html
-!! input
+!! wikitext
a{{echo|b<table></table>c}}d
a{{echo|b
<table></table>
b}}
-!! result
+!! html
a<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b
<table></table>c"}},"i":0}}]}'>b</span>
<table about="#mwt1"></table><span about="#mwt1">c</span>d
Parsoid: Merge double tds (bug 50603)
!! options
parsoid
-!! input
+!! wikitext
{|
|{{echo|{{!}} foo}}
|}
-!! result
+!! html
<table><tbody>
<tr><td about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":0}}]}'> foo</td></tr>
</tbody></table>
Parsoid: Merge double tds in nested transclusion content (bug 50603)
!! options
parsoid
-!! input
+!! wikitext
{{echo|<div>}}
{|
|{{echo|{{!}} foo}}
|}
{{echo|</div>}}
-!! result
+!! html
<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":0}},"\n{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":1}},"\n|}\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}'>
<table><tbody>
<tr><td data-mw='{"parts":["|"]}'> foo</td></tr>
###
!!test
0. includeonly around the entire attribute
-!!input
+!! wikitext
<span <includeonly>id="v1"</includeonly><noinclude>id="v2"</noinclude>>bar</span>
-!!result
+!! html
<p><span id="v2">bar</span>
</p>
!!end
!!test
1. includeonly in html attr key
-!!input
+!! wikitext
<span <noinclude>id</noinclude><includeonly>about</includeonly>="foo">bar</span>
-!!result
+!! html
<p><span id="foo">bar</span>
</p>
!!end
!!test
2. includeonly in html attr value
-!!input
+!! wikitext
<span id="<noinclude>v1</noinclude><includeonly>v2</includeonly>">bar</span>
<span id=<noinclude>"v1"</noinclude><includeonly>"v2"</includeonly>>bar</span>
-!!result
+!! html
<p><span id="v1">bar</span>
<span id="v1">bar</span>
</p>
!!test
3. includeonly in part of an attr value
-!!input
+!! wikitext
<span style="color:<noinclude>red</noinclude><includeonly>blue</includeonly>;">bar</span>
-!!result
+!! html
<p><span style="color:red;">bar</span>
</p>
!!end
!!test
4. includeonly in table attributes
-!!input
+!! wikitext
{|
|- <noinclude>
|-
|b
</includeonly>
|}
-!!result
+!! html
<table>
!!test
Templates: Template Name/Arg clash: 1. Use of positional param
-!!input
+!! wikitext
{{quote|foo}}
-!!result
+!! html
<p>foo
</p>
!!end
!!test
Templates: Template Name/Arg clash: 2. Use of named param
-!!input
+!! wikitext
{{quote|quote=foo}}
-!!result
+!! html
<p>foo
</p>
!!end
!!test
Templates: Template Name/Arg clash: 3. Use of named param with empty input
-!!input
+!! wikitext
{{quote|quote}}
-!!result
+!! html
<p>quote
</p>
!!end
!!test
Templates: 1. Simple use
-!!input
+!! wikitext
{{echo|Foo}}
-!!result
+!! html
<p>Foo
</p>
!!end
!!test
Templates: 2. Inside a block tag
-!!input
+!! wikitext
<div>{{echo|Foo}}</div>
<blockquote>{{echo|Foo}}</blockquote>
-!!result
+!! html
<div>Foo</div>
<blockquote>Foo</blockquote>
!!test
Templates: P-wrapping: 1a. Templates on consecutive lines
-!!input
+!! wikitext
{{echo|Foo}}
{{echo|bar}}
-!!result
+!! html
<p>Foo
bar
</p>
!!test
Templates: P-wrapping: 1b. Templates on consecutive lines
-!!input
+!! wikitext
Foo
{{echo|bar}}
{{echo|baz}}
-!!result
+!! html
<p>Foo
</p><p>bar
baz
!!test
Templates: P-wrapping: 1c. Templates on consecutive lines
-!!input
+!! wikitext
{{echo|Foo}}
{{echo|bar}} <div>baz</div>
-!!result
+!! html
<p>Foo
</p>
bar <div>baz</div>
Templates: P-wrapping: 1d. Template preceded by comment-only line
!!options
parsoid
-!!input
+!! wikitext
<!-- foo -->
{{echo|Bar}}
-!!result
+!! html
<!-- foo -->
<p about="#mwt223" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Bar"}},"i":0}}]}'>Bar</p>
!!test
Templates: Inline Text: 1. Multiple tmeplate uses
-!!input
+!! wikitext
{{echo|Foo}}bar{{echo|baz}}
-!!result
+!! html
<p>Foobarbaz
</p>
!!end
!!test
Templates: Inline Text: 2. Back-to-back template uses
-!!input
+!! wikitext
{{echo|Foo}}{{echo|bar}}
-!!result
+!! html
<p>Foobar
</p>
!!end
!!test
Templates: Block Tags: 1. Multiple template uses
-!!input
+!! wikitext
{{echo|<div>Foo</div>}}<div>bar</div>{{echo|<div>baz</div>}}
-!!result
+!! html
<div>Foo</div><div>bar</div><div>baz</div>
!!end
!!test
Templates: Block Tags: 2. Back-to-back template uses
-!!input
+!! wikitext
{{echo|<div>Foo</div>}}{{echo|<div>bar</div>}}
-!!result
+!! html
<div>Foo</div><div>bar</div>
!!end
!!test
Templates: Links: 1. Simple example
-!!input
+!! wikitext
{{echo|[[Foo|bar]]}}
-!!result
+!! html
<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a>
</p>
!!end
!!test
Templates: Links: 2. Generation of link href
-!!input
+!! wikitext
[[{{echo|Foo}}|bar]]
-!!result
+!! html
<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a>
</p>
!!end
!!test
Templates: Links: 3. Generation of part of a link href
-!!input
+!! wikitext
[[Fo{{echo|o}}|bar]]
[[Foo{{echo|bar}}]]
[[:Foo{{echo|bar}}]]
[[:Foo{{echo|bar}}|bar]]
-!!result
+!! html
<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a>
</p><p><a href="/index.php?title=Foobar&action=edit&redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
</p><p><a href="/index.php?title=Foobarbaz&action=edit&redlink=1" class="new" title="Foobarbaz (page does not exist)">Foobarbaz</a>
!!test
Templates: Links: 4. Multiple templates generating link href
-!!input
+!! wikitext
[[{{echo|F}}{{echo|o}}ob{{echo|ar}}]]
-!!result
+!! html
<p><a href="/index.php?title=Foobar&action=edit&redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
</p>
!!end
!!test
Templates: Links: 5. Generation of link text
-!!input
+!! wikitext
[[Foo|{{echo|bar}}]]
-!!result
+!! html
<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a>
</p>
!!end
!!test
Templates: Links: 5. Nested templates (only outermost template should be marked)
-!!input
+!! wikitext
{{echo|[[{{echo|Foo}}|bar]]}}
-!!result
+!! html
<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a>
</p>
!!end
!!test
Templates: HTML Tag: 1. Generation of HTML attr. key
-!!input
+!! wikitext
<div {{echo|style}}="color:red;">foo</div>
-!!result
+!! html
<div style="color:red;">foo</div>
!!end
!!test
Templates: HTML Tag: 2. Generation of HTML attr. value
-!!input
+!! wikitext
<div style={{echo|'color:red;'}}>foo</div>
-!!result
+!! html
<div style="color:red;">foo</div>
!!end
!!test
Templates: HTML Tag: 3. Generation of HTML attr key and value
-!!input
+!! wikitext
<div {{echo|style}}={{echo|'color:red;'}}>foo</div>
-!!result
+!! html
<div style="color:red;">foo</div>
!!end
!!test
Templates: HTML Tag: 4. Generation of starting piece of HTML attr value
-!!input
+!! wikitext
<div title="{{echo|This is a long title}} with just one piece templated">foo</div>
-!!result
+!! html
<div title="This is a long title with just one piece templated">foo</div>
!!end
!!test
Templates: HTML Tag: 5. Generation of middle piece of HTML attr value
-!!input
+!! wikitext
<div title="This is a long title with just {{echo|one piece}} templated">foo</div>
-!!result
+!! html
<div title="This is a long title with just one piece templated">foo</div>
!!end
!!test
Templates: HTML Tag: 6. Generation of end piece of HTML attr value
-!!input
+!! wikitext
<div title="This is a long title with just one piece {{echo|templated}}">foo</div>
-!!result
+!! html
<div title="This is a long title with just one piece templated">foo</div>
!!end
!!test
Templates: HTML Tag: 7. Generation of partial attribute key string
-!!input
+!! wikitext
<div st{{echo|yle}}="color:red;">foo</div>
-!!result
+!! html
<div style="color:red;">foo</div>
!!end
!!test
Templates: HTML Tables: 1. Generating start of a HTML table
-!!input
+!! wikitext
{{echo|<table><tr><td>foo</td>}}</tr></table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 2a. Generating middle of a HTML table
-!!input
+!! wikitext
<table><tr>{{echo|<td>foo</td>}}</tr></table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 2b. Generating middle of a HTML table
-!!input
+!! wikitext
<table>{{echo|<tr><td>foo</td></tr>}}</table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 3. Generating end of a HTML table
-!!input
+!! wikitext
<table><tr>{{echo|<td>foo</td></tr></table>}}
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 4a. Generating a single tag of a HTML table
-!!input
+!! wikitext
{{echo|<table>}}<tr><td>foo</td></tr></table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 4b. Generating a single tag of a HTML table
-!!input
+!! wikitext
<table>{{echo|<tr>}}<td>foo</td></tr></table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 4c. Generating a single tag of a HTML table
-!!input
+!! wikitext
<table><tr>{{echo|<td>}}foo</td></tr></table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 4d. Generating a single tag of a HTML table
-!!input
+!! wikitext
<table><tr><td>foo{{echo|</td>}}</tr></table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 4e. Generating a single tag of a HTML table
-!!input
+!! wikitext
<table><tr><td>foo</td>{{echo|</tr>}}</table>
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
!!test
Templates: HTML Tables: 4f. Generating a single tag of a HTML table
-!!input
+!! wikitext
<table><tr><td>foo</td></tr>{{echo|</table>}}
-!!result
+!! html
<table><tr><td>foo</td></tr></table>
!!end
Templates: HTML Tables: 5. Proper fostering of categories from inside
!!options
parsoid=wt2html,wt2wt
-!!input
+!! wikitext
<table>[[Category:foo1]]<tr><td>foo</td></tr></table>
<!--Two categories (Bug 50330)-->
<table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>
-!!result
+!! html
<link rel="mw:PageProp/Category" href="./Category:Foo1"><table><tbody><tr><td>foo</td></tr></tbody></table>
<!--Two categories (Bug 50330)-->
<link rel="mw:PageProp/Category" href="./Category:Bar1"><link rel="mw:PageProp/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table>
!!test
Templates: Wiki Tables: 1a. Fostering of entire template content
-!!input
+!! wikitext
{|
{{echo|a}}
|}
-!!result
+!! html
<table>
a
<tr><td></td></tr></table>
!!test
Templates: Wiki Tables: 1b. Fostering of entire template content
-!!input
+!! wikitext
{|
{{echo|<div>}}
foo
{{echo|</div>}}
|}
-!!result
+!! html
<table>
<div>
<p>foo
!!test
Templates: Wiki Tables: 2. Fostering of partial template content
-!!input
+!! wikitext
{|
{{echo|a
<div>b</div>}}
|}
-!!result
+!! html
<table>
a
<div>b</div>
!!test
Templates: Wiki Tables: 3. td-content via multiple templates
-!!input
+!! wikitext
{|
{{echo|{{pipe}}a}}{{echo|b}}
|}
-!!result
+!! html
<table>
<tr>
<td>ab
!!test
Templates: Wiki Tables: 4. Templated tags, no content
-!!input
+!! wikitext
{{tbl-start}}
{{tbl-end}}
-!!result
+!! html
<table>
<tr><td></td></tr></table>
!!test
Templates: Wiki Tables: 5. Templated tags, regular td-tags
-!!input
+!! wikitext
{{tbl-start}}
|foo
{{tbl-end}}
-!!result
+!! html
<table>
<tr>
<td>foo
!!test
Templates: Wiki Tables: 6. Templated tags, templated td-tags
-!!input
+!! wikitext
{{tbl-start}}
{{!}}foo
{{tbl-end}}
-!!result
+!! html
<table>
<tr>
<td>foo
!!test
Templates: Lists: Multi-line list-items via templates
-!!input
+!! wikitext
*{{echo|a {{nonexistent|
unused}}}}
*{{echo|b {{nonexistent|
unused}}}}
-!!result
+!! html
<ul>
<li>a <a href="/index.php?title=Template:Nonexistent&action=edit&redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
</li>
!!test
Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
-!!input
+!! wikitext
{{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
-!!result
+!! html
<p><i>ab</i>c<i>d</i>e
</p>
!!end
!!test
Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
(PHP parser generates misnested html)
-!! options
-parsoid
-!!input
+!! wikitext
{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
-!!result
+!! html/parsoid
<p><span about="#mwt1" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_span","href":"./Template:Echo_with_span"},"params":{"1":{"wt":"''a"}},"i":0}}]}"><i>a</i></span><i about="#mwt2" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_span","href":"./Template:Echo_with_span"},"params":{"1":{"wt":"b''c''d"}},"i":0}},{"template":{"target":{"wt":"echo_with_span","href":"./Template:Echo_with_span"},"params":{"1":{"wt":"''e"}},"i":1}}]}"><span>b</span></i><span about="#mwt2">c</span><i about="#mwt2">d<span></span></i><span about="#mwt2">e</span></p>
!!end
(PHP parser generates misnested html; Parsoid html2wt mode adds newlines between {{echo}}s)
!! options
parsoid=wt2html,wt2wt
-!!input
+!! wikitext
{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
-!!result
+!! html
<div about="#mwt1" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_div","href":"./Template:Echo_with_div"},"params":{"1":{"wt":"''a"}},"i":0}}]}"><i>a</i></div>
<div about="#mwt2" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_div","href":"./Template:Echo_with_div"},"params":{"1":{"wt":"b''c''d"}},"i":0}}]}"><i>b</i>c<i>d</i></div>
<div about="#mwt3" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_div","href":"./Template:Echo_with_div"},"params":{"1":{"wt":"''e"}},"i":0}}]}">e</div>
!!test
Templates: Ugly nesting: 4. Divs opened/closed across templates
-!!input
+!! wikitext
a<div>b{{echo|c</div>d}}e
-!!result
+!! html
a<div>bc</div>de
!!end
(Parsoid-centric)
!! options
parsoid
-!!input
+!! wikitext
{|
|{{echo|foo</table>}}
|bar
|}
-!!result
+!! html
<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo</table>"}},"i":0}},"\n|bar\n|}"]}'>
<tbody>
(Parsoid-centric)
!! options
parsoid
-!!input
+!! wikitext
<table>
<tr>
<td>
<td>xyz</td>
</tr>
</table>
-!!result
+!! html
<table about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n <tr>\n <td>\n <table>\n <tr>\n <td>1. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo </table>"}},"i":0}},"</td>\n <td> bar </td>\n <td>2. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"baz </table>"}},"i":1}},"</td>\n </tr>\n <tr>\n <td>abc</td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td>xyz</td>\n </tr>\n</table>"]}'>
<tbody><tr>
<td>
!! test
Templates: Ugly templates: 3. newline-only template parameter
-!! input
+!! wikitext
foo {{echo|
}}
-!! result
+!! html
<p>foo
</p>
!! end
# This looks like a bug: a single newline triggers p/br for some reason.
!! test
Templates: Ugly templates: 4. newline-only template parameter inconsistency
-!! input
+!! wikitext
{{echo|
}}
-!! result
+!! html
<p><br />
</p>
!! end
!!test
Parser Functions: 1. Simple example
-!!input
+!! wikitext
{{uc:foo}}
-!!result
+!! html
<p>FOO
</p>
!!end
!!test
Parser Functions: 2. Nested use (only outermost should be marked up)
-!!input
+!! wikitext
{{uc:{{lc:FOO}}}}
-!!result
+!! html
<p>FOO
</p>
!!end
pre-save transform: subst:
!! options
PST
-!! input
+!! wikitext
{{subst:test}}
-!! result
+!! html
This is a test template
!! end
pre-save transform: normal template
!! options
PST
-!! input
+!! wikitext
{{test}}
-!! result
+!! html
{{test}}
!! end
pre-save transform: nonexistent template
!! options
PST
-!! input
+!! wikitext
{{thistemplatedoesnotexist}}
-!! result
+!! html
{{thistemplatedoesnotexist}}
!! end
pre-save transform: subst magic variables
!! options
PST
-!! input
+!! wikitext
{{subst:SITENAME}}
-!! result
+!! html
MediaWiki
!! end
pre-save transform: subst: templates with parameters
!! options
pst
-!! input
+!! wikitext
{{subst:paramtest|param="something else"}}
-!! result
+!! html
This is a test template with parameter "something else"
!! end
pre-save transform: nowiki in subst (bug 1188)
!! options
pst
-!! input
+!! wikitext
{{subst:nowikitest}}
-!! result
+!! html
<nowiki>'''not wiki'''</nowiki>
!! end
pre-save transform: comment in subst (bug 1936)
!! options
pst
-!! input
+!! wikitext
{{subst:commenttest}}
-!! result
+!! html
This template has <!-- a comment --> in it.
!! end
pre-save transform: unclosed tag
!! options
pst noxml
-!! input
+!! wikitext
<nowiki>'''not wiki'''
-!! result
+!! html
<nowiki>'''not wiki'''
!! end
pre-save transform: mixed tag case
!! options
pst noxml
-!! input
+!! wikitext
<NOwiki>'''not wiki'''</noWIKI>
-!! result
+!! html
<NOwiki>'''not wiki'''</noWIKI>
!! end
pre-save transform: unclosed comment in <nowiki>
!! options
pst noxml
-!! input
+!! wikitext
wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!! result
+!! html
wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
!!end
!!test
(confirming safety of fix for subst bug 1936)
-!! input
+!! wikitext
{{Template:dangerous}}
-!! result
+!! html
<p>@<span>Oh no</span>
</p>
!! end
pre-save transform: comment containing gallery (bug 5024)
!! options
pst
-!! input
+!! wikitext
<!-- <gallery>data</gallery> -->
-!!result
+!! html
<!-- <gallery>data</gallery> -->
!!end
pre-save transform: comment containing extension
!! options
pst
-!! input
+!! wikitext
<!-- <tag>data</tag> -->
-!!result
+!! html
<!-- <tag>data</tag> -->
!!end
pre-save transform: comment containing nowiki
!! options
pst
-!! input
+!! wikitext
<!-- <nowiki>data</nowiki> -->
-!!result
+!! html
<!-- <nowiki>data</nowiki> -->
!!end
pre-save transform: <noinclude> in subst (bug 3298)
!! options
pst
-!! input
+!! wikitext
{{subst:Includes}}
-!! result
+!! html
Foobar
!! end
pre-save transform: <onlyinclude> in subst (bug 3298)
!! options
pst
-!! input
+!! wikitext
{{subst:Includes2}}
-!! result
+!! html
Foo
!! end
bug 22297: safesubst: works during PST
!! options
pst
-!! input
+!! wikitext
{{subst:SafeSubstTest}}{{safesubst:SubstTest}}
-!! result
+!! html
FoobarFoobar
!! end
!! test
bug 22297: safesubst: works during normal parse
-!! input
+!! wikitext
{{SafeSubstTest}}
-!! result
+!! html
<p>Foobar
</p>
!! end
-!! test:
+!! test
subst: does not work during normal parse
-!! input
+!! wikitext
{{SubstTest}}
-!! result
+!! html
<p>{{subst:Includes}}
</p>
!! end
pre-save transform: context links ("pipe trick")
!! options
pst
-!! input
+!! wikitext
[[Article (context)|]]
[[Bar:Article|]]
[[:Bar:Article|]]
[[|Article (context)]]
[[Bar:X (Y) Z|]]
[[:Bar:X (Y) Z|]]
-!! result
+!! html
[[Article (context)|Article]]
[[Bar:Article|Article]]
[[:Bar:Article|Article]]
pre-save transform: context links ("pipe trick") with interwiki prefix
!! options
pst
-!! input
+!! wikitext
[[interwiki:Article|]]
[[:interwiki:Article|]]
[[interwiki:Bar:Article|]]
[[:interwiki:Bar:Article|]]
-!! result
+!! html
[[interwiki:Article|Article]]
[[:interwiki:Article|Article]]
[[interwiki:Bar:Article|Bar:Article]]
pre-save transform: context links ("pipe trick") with parens in title
!! options
pst title=[[Somearticle (context)]]
-!! input
+!! wikitext
[[|Article]]
-!! result
+!! html
[[Article (context)|Article]]
!! end
pre-save transform: context links ("pipe trick") with comma in title
!! options
pst title=[[Someplace, Somewhere]]
-!! input
+!! wikitext
[[|Otherplace]]
[[Otherplace, Elsewhere|]]
[[Otherplace, Elsewhere, Anywhere|]]
-!! result
+!! html
[[Otherplace, Somewhere|Otherplace]]
[[Otherplace, Elsewhere|Otherplace]]
[[Otherplace, Elsewhere, Anywhere|Otherplace]]
pre-save transform: context links ("pipe trick") with parens and comma
!! options
pst title=[[Someplace (IGNORED), Somewhere]]
-!! input
+!! wikitext
[[|Otherplace]]
[[Otherplace (place), Elsewhere|]]
-!! result
+!! html
[[Otherplace, Somewhere|Otherplace]]
[[Otherplace (place), Elsewhere|Otherplace]]
!! end
pre-save transform: context links ("pipe trick") with comma and parens
!! options
pst title=[[Who, me? (context)]]
-!! input
+!! wikitext
[[|Yes, you.]]
[[Me, Myself, and I (1937 song)|]]
-!! result
+!! html
[[Yes, you. (context)|Yes, you.]]
[[Me, Myself, and I (1937 song)|Me, Myself, and I]]
!! end
pre-save transform: context links ("pipe trick") with namespace
!! options
pst title=[[Ns:Somearticle]]
-!! input
+!! wikitext
[[|Article]]
-!! result
+!! html
[[Ns:Article|Article]]
!! end
pre-save transform: context links ("pipe trick") with namespace and parens
!! options
pst title=[[Ns:Somearticle (context)]]
-!! input
+!! wikitext
[[|Article]]
-!! result
+!! html
[[Ns:Article (context)|Article]]
!! end
pre-save transform: context links ("pipe trick") with namespace and comma
!! options
pst title=[[Ns:Somearticle, Context, Whatever]]
-!! input
+!! wikitext
[[|Article]]
-!! result
+!! html
[[Ns:Article, Context, Whatever|Article]]
!! end
pre-save transform: context links ("pipe trick") with namespace, comma and parens
!! options
pst title=[[Ns:Somearticle, Context (context)]]
-!! input
+!! wikitext
[[|Article]]
-!! result
+!! html
[[Ns:Article (context)|Article]]
!! end
pre-save transform: context links ("pipe trick") with namespace, parens and comma
!! options
pst title=[[Ns:Somearticle (IGNORED), Context]]
-!! input
+!! wikitext
[[|Article]]
-!! result
+!! html
[[Ns:Article, Context|Article]]
!! end
pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
!! options
pst
-!! input
+!! wikitext
[[Article(context)|]]
[[Bar:Article(context)|]]
[[:Bar:Article(context)|]]
[[|Article(context)]]
[[Bar:X(Y)Z|]]
[[:Bar:X(Y)Z|]]
-!! result
+!! html
[[Article(context)|Article]]
[[Bar:Article(context)|Article]]
[[:Bar:Article(context)|Article]]
pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
!! options
pst
-!! input
+!! wikitext
[[Article (context)|]]
[[Bar:Article (context)|]]
[[:Bar:Article (context)|]]
[[|Article (context)]]
[[Bar:X (Y) Z|]]
[[:Bar:X (Y) Z|]]
-!! result
+!! html
[[Article (context)|Article]]
[[Bar:Article (context)|Article]]
[[:Bar:Article (context)|Article]]
pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
!! options
pst
-!! input
+!! wikitext
[[Article(context)|]]
[[Bar:Article(context)|]]
[[:Bar:Article(context)|]]
[[|Article(context)]]
[[Bar:X(Y)Z|]]
[[:Bar:X(Y)Z|]]
-!! result
+!! html
[[Article(context)|Article]]
[[Bar:Article(context)|Article]]
[[:Bar:Article(context)|Article]]
pre-save transform: context links ("pipe trick") with commas (bug 21660)
!! options
pst
-!! input
+!! wikitext
[[Article (context), context|]]
[[Article (context),context|]]
[[Bar:Article (context), context|]]
[[Bar:Article (context),context|]]
[[:Bar:Article (context), context|]]
[[:Bar:Article (context),context|]]
-!! result
+!! html
[[Article (context), context|Article]]
[[Article (context),context|Article]]
[[Bar:Article (context), context|Article]]
pre-save transform: trim trailing empty lines
!! options
pst
-!! input
+!! wikitext
Empty lines are trimmed
-!! result
+!! html
Empty lines are trimmed
!! end
pre-save transform: Signature expansion
!! options
pst
-!! input
+!! wikitext
* ~~~
* <noinclude>~~~</noinclude>
* <includeonly>~~~</includeonly>
* <onlyinclude>~~~</onlyinclude>
-!! result
+!! html
* [[Special:Contributions/127.0.0.1|127.0.0.1]]
* <noinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</noinclude>
* <includeonly>[[Special:Contributions/127.0.0.1|127.0.0.1]]</includeonly>
pre-save transform: Signature expansion in nowiki tags (bug 93)
!! options
pst disabled
-!! input
+!! wikitext
Shall not expand:
<nowiki>~~~~</nowiki>
But not inside includeonly
<includeonly>{{subst:Foo}}</includeonly>
-!! result
+!! html
Shall not expand:
<nowiki>~~~~</nowiki>
Parsoid: Recognize nowiki with trailing space in tags
!! options
parsoid=wt2html
-!! input
+!! wikitext
<nowiki ><div>[[foo]]</nowiki >
a<nowiki / >b
c<nowiki />d
e<nowiki/ >f
-!! result
+!! html
<p><span typeof="mw:Nowiki"><div>[[foo]]</span></p>
<p>ab</p>
<p>cd</p>
Parsoid: Recognize nowiki with odd capitalization
!! options
parsoid=wt2html
-!! input
+!! wikitext
<noWikI ><div>[[foo]]</Nowiki >
-!! result
+!! html
<p><span typeof="mw:Nowiki"><div>[[foo]]</span></p>
!! end
Parsoid: Escape nowiki with trailing space in tags
!! options
parsoid=html2wt
-!! input
+!! wikitext
<nowiki > foo </nowiki >
a<nowiki />b
c<nowiki/ >d
-!! result
+!! html
<p><nowiki > foo </nowiki ></p>
<p>a<nowiki />b</p>
<p>c<nowiki/ >d</p>
Parsoid: Escape weird noWikI capitalizations
!! options
parsoid=html2wt
-!! input
+!! wikitext
<noWikI > foo </NoWikI >
-!! result
+!! html
<p><noWikI > foo </NoWikI ></p>
!! end
message transform: magic variables
!! options
msg
-!! input
+!! wikitext
{{SITENAME}}
-!! result
+!! html
MediaWiki
!! end
message transform: should not transform wiki markup
!! options
msg
-!! input
+!! wikitext
''test''
-!! result
+!! html
''test''
!! end
message transform: <noinclude> in transcluded template (bug 4926)
!! options
msg
-!! input
+!! wikitext
{{Includes}}
-!! result
+!! html
Foobar
!! end
message transform: <onlyinclude> in transcluded template (bug 4926)
!! options
msg
-!! input
+!! wikitext
{{Includes2}}
-!! result
+!! html
Foo
!! end
{{#special:}} page name, known
!! options
msg
-!! input
+!! wikitext
{{#special:Recentchanges}}
-!! result
+!! html
Special:RecentChanges
!! end
{{#special:}} page name with subpage, known
!! options
msg
-!! input
+!! wikitext
{{#special:Recentchanges/param}}
-!! result
+!! html
Special:RecentChanges/param
!! end
{{#special:}} page name, unknown
!! options
msg
-!! input
+!! wikitext
{{#special:foobar nonexistent}}
-!! result
+!! html
Special:Foobar nonexistent
!! end
{{#speciale:}} page name, known
!! options
msg
-!! input
+!! wikitext
{{#speciale:Recentchanges}}
-!! result
+!! html
Special:RecentChanges
!! end
{{#speciale:}} page name with subpage, known
!! options
msg
-!! input
+!! wikitext
{{#speciale:Recentchanges/param}}
-!! result
+!! html
Special:RecentChanges/param
!! end
{{#speciale:}} page name, unknown
!! options
msg
-!! input
+!! wikitext
{{#speciale:foobar nonexistent}}
-!! result
+!! html
Special:Foobar_nonexistent
!! end
#### http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
!! test
-Simple image (php)
+Simple image
!! options
-php
-!! input
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
[[Image:foobar.jpg]]
-!! result
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
-!! end
-
-!! test
-Simple image (parsoid)
-!! options
-parsoid=wt2html
-!! input
-[[Image:foobar.jpg]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>
</p>
!! end
!! test
-Simple image (using File: namespace, now canonical) (php)
-!! options
-php
-!! input
-[[File:foobar.jpg]]
-!! result
+Simple image (using File: namespace, now canonical)
+!! wikitext
+[[File:Foobar.jpg]]
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
-!! end
-
-!! test
-Simple image (using File: namespace, now canonical) (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>
</p>
!! end
!! test
-Right-aligned image (php)
-!! options
-php
-!! input
-[[Image:foobar.jpg|right]]
-!! result
+Right-aligned image
+!! wikitext
+[[File:Foobar.jpg|right]]
+!! html/php
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-!! end
-
-!! test
-Right-aligned image (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|right]]
-!! result
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure>
!! end
!! test
-Image with caption (php)
-!! options
-php
-!! input
+Image with caption
+!! wikitext
[[File:Foobar.jpg|right|Caption text]]
-!! result
+!! html/php
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-!! end
-
-!! test
-Image with caption (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|right|Caption text]]
-!! result
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
!! end
!! test
-Image with caption, bug 53312 #1 (parsoid)
-!! options
-parsoid
-!! input
+Image with caption, bug 53312 #1
+!! wikitext
[[File:Foobar.jpg|right|Caption page stuff]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page stuff"><img alt="Caption page stuff" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page stuff</figcaption></figure>
!! end
!! test
-Image with caption, bug 53312 #2 (parsoid)
-!! options
-parsoid
-!! input
+Image with caption, bug 53312 #2
+!! wikitext
[[File:Foobar.jpg|right|Caption page=]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page="><img alt="Caption page=" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page=</figcaption></figure>
!! end
!! test
-Image with caption, bug 53312 #3 (parsoid)
-!! options
-parsoid
-!! input
+Image with caption, bug 53312 #3
+!! wikitext
[[File:Foobar.jpg|right|Caption page=stuff]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption page=stuff"><img alt="Caption page=stuff" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page=stuff</figcaption></figure>
!! end
!! test
-Allow empty links in image captions (Bug 60753) (parsoid)
-!! options
-parsoid
-!!input
+Allow empty links in image captions (Bug 60753)
+!! wikitext
[[File:Foobar.jpg|thumb|Caption [[Link1]]
[[]]
[[Link2]]
]]
-!! result
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Caption <a href="/index.php?title=Link1&action=edit&redlink=1" class="new" title="Link1 (page does not exist)">Link1</a> [[]] <a href="/index.php?title=Link2&action=edit&redlink=1" class="new" title="Link2 (page does not exist)">Link2</a></div></div></div>
+
+!! html/parsoid
<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption [[Link1]]\n[[]]\n[[Link2]]\n"}],"dsr":[0,59,2,2]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"dsr":[2,null,null,null]}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption data-parsoid='{"dsr":[null,57,null,null]}'>Caption <a rel="mw:WikiLink" href="./Link1" data-parsoid='{"stx":"simple","a":{"href":"./Link1"},"sa":{"href":"Link1"},"dsr":[32,41,2,2]}'>Link1</a>
[[]]
<a rel="mw:WikiLink" href="./Link2" data-parsoid='{"stx":"simple","a":{"href":"./Link2"},"sa":{"href":"Link2"},"dsr":[47,56,2,2]}'>Link2</a>
!! test
Link with empty target
-!! input
+!! wikitext
[[]]
-!! result
+!! html
<p>[[]]
</p>
!! end
!! test
-Image with empty attribute (php)
+Image with empty attribute
!! options
-php
-!! input
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
[[File:Foobar.jpg|right||Caption text]]
-!! result
+!! html/php
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-!! end
-
-!! test
-Image with empty attribute (parsoid)
-!! options
-parsoid=wt2html
-!! input
-[[File:Foobar.jpg|right||Caption text]]
-!! result
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
!! end
!! test
1. Block image with individual attributes from templates
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|{{echo|137px}}|This is a caption]]
-!! result
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption</div></div></div>
+
+!! html/parsoid
<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;137px&quot;}},&quot;i&quot;:0}}]}\" data-parsoid=\"{&quot;dsr&quot;:[24,38,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\">137px</span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
!! end
!! test
2. Block Image with individual attributes from templates
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|{{echo|thumb}}|{{echo|137px}}|This is a caption]]
-!! result
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption</div></div></div>
+
+!! html/parsoid
<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" data-mw='{"attribs":[["thumbnail",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;thumb&quot;}},&quot;i&quot;:0}}]}\" data-parsoid=\"{&quot;dsr&quot;:[18,32,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\">thumb</span>"}],["width",{"html":"<span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;137px&quot;}},&quot;i&quot;:0}}]}\" data-parsoid=\"{&quot;dsr&quot;:[33,47,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\">137px</span>"}]]}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
!! end
!! test
3. Inline image with individual attributes from templates
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|{{echo|50px}}]]
-!! result
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
+</p>
+!! html/parsoid
<p><span typeof="mw:Image mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["width",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;50px&quot;}},&quot;i&quot;:0}}]}\" data-parsoid=\"{&quot;dsr&quot;:[18,31,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\">50px</span>"}]]}' data-parsoid='{"optList":[{"ck":"width","ak":"{{echo|50px}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
!! end
-!! test
-Image with multiple attributes from the same template (php)
-!! options
-php
-!! input
-[[File:Foobar.jpg|{{image_attribs}}]]
-!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
-!! end
-
## Parsoid does not provide editing support for images where templates produce multiple image attributes.
## To signal this, we add a 'mw:Placeholder' type to such images. This could change in the future.
!! test
-Image with multiple attributes from the same template (parsoid)
-!! options
-parsoid
-!! input
+Image with multiple attributes from the same template
+!! wikitext
[[File:Foobar.jpg|{{image_attribs}}]]
-!! result
+!! html/php
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image mw:Placeholder"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
!! end
!! test
-Image with link tails (php)
-!! options
-php
-!! input
+Image with link tails
+!! wikitext
123[[File:Foobar.jpg]]456
123[[File:Foobar.jpg|right]]456
123[[File:Foobar.jpg|thumb]]456
-!! result
+!! html/php
<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
</p>
123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>456
123<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>456
-!! end
-
-!! test
-Image with link tails (parsoid)
-!! options
-parsoid
-!! input
-123[[File:Foobar.jpg]]456
-123[[File:Foobar.jpg|right]]456
-123[[File:Foobar.jpg|thumb]]456
-!! result
+!! html/parsoid
<p>123<span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>456</p>
123<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure>456
123<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="25" width="220"></a></figure>456
!! end
!! test
-Image with multiple captions -- only last one is accepted (php)
-!! options
-php
-!! input
+Image with multiple captions -- only last one is accepted
+!! wikitext
[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
-!! result
+!! html/php
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-!! end
-
-!! test
-Image with multiple captions -- only last one is accepted (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
-!! result
+!! html/parsoid
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption3 - accepted</figcaption></figure>
!! end
!! test
-Image with multiple widths -- use last (php)
-!! options
-php
-!! input
+Image with multiple widths -- use last
+!! wikitext
[[File:Foobar.jpg|200px|300px|caption]]
-!! result
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a>
</p>
-!! end
-
-!! test
-Image with multiple widths -- use last (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|200px|300px|caption]]
-!! result
+!! html/parsoid
<p><span typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="34" width="300"/></a></span></p>
!! end
!! test
-Image with multiple alignments -- use first (bug 48664) (php)
-!! options
-php
-!! input
+Image with multiple alignments -- use first (bug 48664)
+!! wikitext
[[File:Foobar.jpg|thumb|left|right|center|caption]]
[[File:Foobar.jpg|middle|text-top|caption]]
-!! result
+!! html/php
<div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" style="vertical-align: middle" /></a>
</p>
-!! end
-
-!! test
-Image with multiple alignments -- use first (bug 48664) (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|thumb|left|right|center|caption]]
-
-[[File:Foobar.jpg|middle|text-top|caption]]
-!! result
+!! html/parsoid
<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
<p><span class="mw-default-size mw-valign-middle" typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
!! end
!! test
-Image with width attribute at different positions (php)
-!! options
-php
-!! input
+Image with width attribute at different positions
+!! wikitext
[[File:Foobar.jpg|200px|right|Caption]]
[[File:Foobar.jpg|right|200px|Caption]]
[[File:Foobar.jpg|right|Caption|200px]]
-!! result
+!! html/php
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
-!! end
-
-!! test
-Image with width attribute at different positions (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|200x200px|right|Caption]]
-[[File:Foobar.jpg|right|200x200px|Caption]]
-[[File:Foobar.jpg|right|Caption|200x200px]]
-!! result
+!! html/parsoid
<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
# a sad bit of backward-compatibility
!! test
-Image with size specified with pxpx (bug 13500, 51628) (php)
+Image with size specified with pxpx (bug 13500, 51628)
!! options
-php
-!! input
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
[[File:Foobar.jpg|20pxpx]]
[[File:Foobar.jpg|200x20pxpx]]
-!! result
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg" width="177" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/265px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/353px-Foobar.jpg 2x" /></a>
</p>
-!! end
-
-!! test
-Image with size specified with pxpx (bug 13500, 51628) (parsoid)
-!! options
-parsoid=wt2html,wt2wt
-!! input
-[[File:Foobar.jpg|20pxpx]]
-[[File:Foobar.jpg|200x20pxpx]]
-!! result
+!! html/parsoid
<p><span typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="2" width="20"/></a></span><span typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="20" width="177"/></a></span></p>
!! end
!! test
-Image with link parameter, wiki target (php)
-!! options
-php
-!! input
+Image with link parameter, wiki target
+!! wikitext
[[File:Foobar.jpg|link=Main Page]]
-!! result
+!! html/php
<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
-!! end
-
-!! test
-Image with link parameter, wiki target (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=Main Page]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image"><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
!! end
+# parsoid bug 49293 (part 1)
!! test
-Image with link parameter, URL target (php)
-!! options
-php
-!! input
+Image with link parameter, URL target
+!! wikitext
[[File:Foobar.jpg|link=http://example.com/]]
-!! result
+!! html/php
<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
-!! end
-
-# parsoid bug 49293 (part 1)
-!! test
-Image with link parameter, URL target (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=http://example.com/]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
!! end
+# parsoid bug 49293 (part 2)
!! test
-Image with link parameter, protocol-less URL target (php)
-!! options
-php
-!! input
+Image with link parameter, protocol-less URL target
+!! wikitext
[[File:Foobar.jpg|link=//example.com/]]
-!! result
+!! html/php
<p><a href="//example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
-!! end
-
-# parsoid bug 49293 (part 2)
-!! test
-Image with link parameter, protocol-less URL target (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=//example.com/]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image"><a href="//example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
!! end
!! test
Image with link parameter, wgExternalLinkTarget
-!! input
+!! wikitext
[[Image:foobar.jpg|link=http://example.com/]]
!! config
wgExternalLinkTarget='foobar'
-!! result
+!! html
<p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
Image with link parameter, wgNoFollowLinks set to false
-!! input
+!! wikitext
[[Image:foobar.jpg|link=http://example.com/]]
!! config
wgNoFollowLinks=false
-!! result
+!! html
<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
Image with link parameter, wgNoFollowDomainExceptions
-!! input
+!! wikitext
[[Image:foobar.jpg|link=http://example.com/]]
!! config
wgNoFollowDomainExceptions='example.com'
-!! result
+!! html
<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
Image with link parameter, wgExternalLinkTarget, unnamed parameter
-!! input
+!! wikitext
[[Image:foobar.jpg|link=http://example.com/|Title]]
!! config
wgExternalLinkTarget='foobar'
-!! result
+!! html
<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
-Image with empty link parameter (php)
-!! options
-php
-!! input
+Image with empty link parameter
+!! wikitext
[[File:Foobar.jpg|link=]]
-!! result
+!! html/php
<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
</p>
-!! end
-
-!! test
-Image with empty link parameter (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image"><span><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></span></span></p>
!! end
!! test
-Image with link parameter (wiki target) and unnamed parameter (php)
-!! options
-php
-!! input
-[[File:Foobar.jpg|link=Main Page|Title]]
-!! result
+Image with link parameter (wiki target) and unnamed parameter
+!! wikitext
+[[File:Foobar.jpg|link=Main_Page|Title]]
+!! html/php
<p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
-!! end
-
-!! test
-Image with link parameter (wiki target) and unnamed parameter (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=Main Page|Title]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
!! end
!! test
-Image with link parameter (URL target) and unnamed parameter (php)
-!! options
-php
-!! input
+Image with link parameter (URL target) and unnamed parameter
+!! wikitext
[[File:Foobar.jpg|link=http://example.com/|Title]]
-!! result
+!! html/php
<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
-!! end
-
-!! test
-Image with link parameter (URL target) and unnamed parameter (parsoid)
-!! options
-parsoid
-!! input
-[[File:Foobar.jpg|link=http://example.com/|Title]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
!! end
!! test
Thumbnail image with link parameter
!! options
-php
-!! input
-[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
-!! result
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|link=http://example.com/|Title]]
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>Title</figcaption></figure>
!! end
!! test
Manually-specified thumbnail image
-!! options
-php
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb=Thumb.png|Title]]
-!! result
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
!! end
!! test
Manually-specified thumbnail image with explicit link to wiki page
-!! options
-php
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|Title]]
-!! result
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
!! end
!! test
Manually-specified thumbnail image with explicit link to url
-!! options
-php
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
-!! result
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
!! end
!! test
Manually-specified thumbnail image with explicit no link
-!! options
-php
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb=Thumb.png|link=|Title]]
-!! result
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
!! end
!! test
Manually-specified thumbnail image with explicit link and alt text
-!! options
-php
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]]
-!! result
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+!! html/parsoid
+XXX NOT IMPLEMENTED XXX
!! end
!! test
Image with frame and link
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
-!! result
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
+!! html/php
<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page">Main Page</a></figcaption></figure>
!! end
!! test
Image with frame and link and explicit alt
-!! input
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
-!! result
+!! html/php
<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page">Main Page</a></figcaption></figure>
!! end
!! test
Image with wiki markup in implicit alt
-!! input
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
[[Image:Foobar.jpg|testing '''bold''' in alt]]
-!! result
+
+[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw="{"caption":"testing '''bold''' in alt"}"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img alt="testing bold in alt" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
!! end
+###################
+# Image sizing.
+# See https://www.mediawiki.org/wiki/Help:Images#Size_and_frame
+# and https://bugzilla.wikimedia.org/show_bug.cgi?id=62258
+# Foobar has actual size of 1941x220
+# 1. Thumbs & frameless always reduce, can't be enlarged
+# 2. Framed images ignore width; always render at default size.
+# If given a height, they respect height but continue to ignore width.
+# 3. "Unspecified format" and border are the only types which can be
+# enlarged.
+
!! test
-Image with wiki markup in explicit alt
-!! input
-[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+Image: "unspecified format" and border enlarge
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|2000px]]
+
+[[File:Foobar.jpg|border|2000px]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="2000" height="227" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="2000" height="227" class="thumbborder" /></a>
</p>
+!! html/parsoid
+<p><span typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="227" width="2000"/></a></span></p>
+<p><span class="mw-image-border" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="227" width="2000"/></a></span></p>
!! end
+!! test
+Image: "unspecified format" and border reduce
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|1000px]]
+
+[[File:Foobar.jpg|border|1000px]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" width="1000" height="113" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg 1.5x, http://example.com/images/3/3a/Foobar.jpg 2x" /></a>
+</p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg" width="1000" height="113" class="thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg 1.5x, http://example.com/images/3/3a/Foobar.jpg 2x" /></a>
+</p>
+!! html/parsoid
+<p><span typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="113" width="1000"/></a></span></p>
+<p><span class="mw-image-border" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="113" width="1000"/></a></span></p>
+!! end
+
+!! test
+Image: thumbs reduce
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|50px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:52px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
+
+!! html/parsoid
+<figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="6" width="50"/></a></figure>
+!! end
+
+!! test
+Image: thumbs can't be enlarged past original size
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|2000px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
+
+!! html/parsoid
+<figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
+!! end
+
+!! test
+Image: frameless can reduce in size
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frameless|50px]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
+</p>
+!! html/parsoid
+<p><span typeof="mw:Image/Frameless"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="6" width="50"/></a></span></p>
+!! end
+
+!! test
+Image: frameless can't be enlarged past original size
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frameless|2000px]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! html/parsoid
+<p><span typeof="mw:Image/Frameless"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
+!! end
+
+!! test
+Image: framed images ignore size if only width is given
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|frame]]
+
+[[File:Foobar.jpg|frame|50px]]
+
+[[File:Foobar.jpg|frame|2000px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption"></div></div></div>
+
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure><figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></figure>
+!! end
+
+!! test
+Image: framed images respect size if given a height, but ignore width.
+!! wikitext
+[[File:Foobar.jpg|frame|50x50px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:444px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" width="442" height="50" class="thumbimage" /></a> <div class="thumbcaption"></div></div></div>
+
+!! html/parsoid
+<figure typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="50" width="442"/></a></figure>
+!! end
+
+###################
+
!! test
Link to image page- image page normally doesn't exists, hence edit link
Add test with existing image page
#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
-!! input
+!! wikitext
[[:Image:test]]
-!! result
+!! html
<p><a href="/index.php?title=File:Test&action=edit&redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
</p>
!! end
!! test
bug 18784 Link to non-existent image page with caption should use caption as link text
-!! input
+!! wikitext
[[:Image:test|caption]]
-!! result
+!! html
<p><a href="/index.php?title=File:Test&action=edit&redlink=1" class="new" title="File:Test (page does not exist)">caption</a>
</p>
!! end
!! test
Frameless image caption with a free URL
-!! input
-[[Image:foobar.jpg|http://example.com]]
-!! result
+!! wikitext
+[[File:Foobar.jpg|http://example.com]]
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"http://example.com"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
!! end
!! test
Thumbnail image caption with a free URL
-!! input
-[[Image:foobar.jpg|thumb|http://example.com]]
-!! result
+!! wikitext
+[[File:Foobar.jpg|thumb|http://example.com]]
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
!! end
!! test
Thumbnail image caption with a free URL and explicit alt
-!! input
-[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]]
-!! result
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|http://example.com|alt=Alteration]]
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img alt="Alteration" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></figcaption></figure>
!! end
!! test
SVG thumbnails with no language set
!! options
-!! input
+!! wikitext
[[File:Foobar.svg|thumb|caption]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
!! end
!! test
SVG thumbnails with language de
!! options
-!! input
+!! wikitext
[[File:Foobar.svg|thumb|caption|lang=de]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
!! end
!! test
SVG thumbnails with invalid language code
!! options
-!! input
+!! wikitext
[[File:Foobar.svg|thumb|caption|lang=invalid.language.code]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
!! end
!! test
BUG 1887: A ISBN with a thumbnail
-!! input
+!! wikitext
[[Image:foobar.jpg|thumb|ISBN 1235467890]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
!! end
!! test
BUG 1887: A RFC with a thumbnail
-!! input
+!! wikitext
[[Image:foobar.jpg|thumb|This is RFC 12354]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
!! end
!! test
BUG 1887: A mailto link with a thumbnail
-!! input
+!! wikitext
[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
!! end
# Pending resolution to bug 368
!! test
BUG 648: Frameless image caption with a link
-!! input
+!! wikitext
[[Image:foobar.jpg|text with a [[link]] in it]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
BUG 648: Frameless image caption with a link (suffix)
-!! input
+!! wikitext
[[Image:foobar.jpg|text with a [[link]]foo in it]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
BUG 648: Frameless image caption with an interwiki link
-!! input
+!! wikitext
[[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
BUG 648: Frameless image caption with a piped interwiki link
-!! input
+!! wikitext
[[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
Escape HTML special chars in image alt text
-!! input
+!! wikitext
[[Image:foobar.jpg|& < > "]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="& < > ""><img alt="& < > "" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
BUG 499: Alt text should have Ӓ, not &1234;
-!! input
+!! wikitext
[[Image:foobar.jpg|♀]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
Broken image caption with link
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link.
-!! result
+!! html
<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
</p>
!! end
!! test
Image caption containing another image
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div>
!! end
!! test
Image caption containing a newline
-!! input
+!! wikitext
[[Image:Foobar.jpg|This
*is some text]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!!end
!!test
Parsoid: Image caption containing leading space
(The leading space should not trigger nowiki escaping in wt2wt mode)
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb| bar]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>bar</div></div></div>
!!end
!! test
-Image caption containing a table (php)
-!! options
-php
-!! input
+Images: caption containing a table
+!! wikitext
[[Image:Foobar.jpg|thumb|200px|This is an example image thumbnail caption with a table
{|
! Foo !! Bar
| Foo1 || Bar1
|}
and some more text.]]
-!! result
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is an example image thumbnail caption with a table <table> <tr> <th> Foo </th> <th> Bar </th></tr> <tr> <td> Foo1 </td> <td> Bar1 </td></tr></table> and some more text.</div></div></div>
-!!end
-
-!! test
-Image caption containing a table (parsoid)
-!! options
-parsoid
-!! input
-[[Image:Foobar.jpg|thumb|200px|This is an example image thumbnail caption with a table
-{|
-! Foo !! Bar
-|-
-| Foo1 || Bar1
-|}
-and some more text.]]
-!! result
+!! html/parsoid
<figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="23" width="200"/></a><figcaption>This is an example image thumbnail caption with a table
<table>
<tbody>
!! test
Bug 3090: External links other than http: in image captions
-!! input
-[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
-!! result
+!! wikitext
+[[File:Foobar.jpg|thumb|200x200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
+!! html/php
<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
+!! html/parsoid
+<figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="23" width="200"/></a><figcaption>This caption has <a rel="mw:ExtLink" href="irc://example.net">irc</a> and <a rel="mw:ExtLink" href="https://example.com">Secure</a> ext links in it.</figcaption></figure>
!! end
!! test
Custom class
-!! input
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
[[Image:foobar.jpg|a|class=b]]
-!! result
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a>
</p>
+!! html/parsoid
+<p><span class="mw-default-size b" typeof="mw:Image" data-mw='{"caption":"a"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
!! end
!! test
Localized image handling (1).
!! options
+parsoid=wt2html,wt2wt,html2html
language=es
-!! input
+!! wikitext
[[Archivo:Foobar.jpg|izquierda|enlace=foo|caption]]
-!! result
+!! html/php
<div class="floatleft"><a href="/wiki/Foo" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>caption</figcaption></figure>
!! end
!! test
Localized image handling (2).
!! options
+parsoid=wt2html,wt2wt,html2html
language=es
-!! input
+!! wikitext
[[Archivo:Foobar.jpg|miniatura|izquierda|enlace=foo|caption]]
-!! result
+!! html/php
<div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
!! end
!! test
"border", "frameless" and "class" attributes on an image.
-!! input
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
[[File:Foobar.jpg|frameless|border|class=extra|caption]]
-!! result
+!! html/php
<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="extra thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
</p>
+!! html/parsoid
+<p><span class="mw-default-size mw-image-border extra" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a></span></p>
+!! end
+
+# Note that 'right' is the default alignment, despite the misspelled 'righ' below
+!! test
+Invalid image attributes (bug 62500)
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+[[File:Foobar.jpg|thumb|float|left|caption]]
+
+[[File:Foobar.jpg|thumb|righ|caption]]
+
+[[File:Foobar.jpg|bogus1|thumb|bogus2|left|bogus3|caption]]
+!! html/php
+<div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
+
+!! html/parsoid
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
!! end
!! article
!! test
Redirected image
-!! input
+!! wikitext
[[Image:Barfoo.jpg]]
-!! result
+!! html
<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
</p>
!! end
Missing image with uploads disabled
!! options
wgEnableUploads=0
-!! input
+!! wikitext
[[Image:Foobaz.jpg]]
-!! result
+!! html
<p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a>
</p>
!! end
!! test
Parsoid-specific image handling - simple image with size and middle alignment
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|middle|50px]]
-!! result
+!! html/parsoid
<p><span class="mw-valign-middle" typeof="mw:Image">
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
non-standard namespace alias
!! options
parsoid=wt2wt,wt2html,html2html
-!! input
+!! wikitext
[[Image:Foobar.jpg|middle|50px]]
-!! result
+!! html/parsoid
<p><span class="mw-valign-middle" typeof="mw:Image">
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
!! test
Parsoid-specific image handling - simple image with size and middle alignment
(existing content)
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|50px|middle]]
-!! result
+!! html/parsoid
<p><span class="mw-valign-middle" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"50px"},{"ck":"middle","ak":"middle"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
!! end
and non-standard namespace name
!! options
parsoid=wt2html,wt2wt,html2html
-!! input
+!! wikitext
[[Image:Foobar.jpg|50px|middle]]
-!! result
+!! html/parsoid
<p><span class="mw-valign-middle" typeof="mw:Image">
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
!! test
Parsoid-specific image handling - simple image with both sizes, a baseline alignment, and a caption
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|500x10px|baseline|caption]]
-!! result
+!! html/parsoid
<p><span class="mw-valign-baseline" typeof="mw:Image" data-mw='{"caption":"caption"}' data-parsoid='{"optList":[{"ck":"width","ak":"500x10px"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption"}],"size":"500x10"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/89px-Foobar.jpg" height="10" width="89" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"10","width":"89"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
!! end
!! test
Parsoid-specific image handling - simple image with border and size spec
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|50px|border|caption]]
-!! result
+!! html/parsoid
<p><span class="mw-image-border" typeof="mw:Image" data-mw='{"caption":"caption"}' data-parsoid='{"optList":[{"ck":"width","ak":"50px"},{"ck":"border","ak":"border"},{"ck":"caption","ak":"caption"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
!! end
!! test
Parsoid-specific image handling - thumbnail with halign, valign, and caption
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|left|baseline|thumb|caption content]]
-!! result
+!! html/parsoid
<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb">
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="25" width="220" />
!! test
Parsoid-specific image handling - thumbnail with halign, valign, and caption
(existing content)
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|left|baseline|caption content]]
-!! result
+!! html/parsoid
<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"left","ak":"left"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption content"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption content</figcaption></figure>
!! end
!! test
Parsoid-specific image handling - thumbnail with specific size, halign, valign, and caption
-!! options
-parsoid
-!! input
+!! wikitext
[[Image:Foobar.jpg|right|middle|thumb|50x50px|caption]]
-!! result
+!! html/parsoid
<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb">
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" />
!! test
Parsoid-specific image handling - thumbnail with specific size, halign,
valign, and caption (existing content)
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|50x50px|right|middle|caption]]
-!! result
+!! html/parsoid
<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"width","ak":"50x50px"},{"ck":"right","ak":"right"},{"ck":"middle","ak":"middle"},{"ck":"caption","ak":"caption"}],"size":"50x50"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"6","width":"50"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
!! end
!! test
Parsoid-specific image handling - framed image with specific size and caption
-!! options
-parsoid
-!! input
+!! wikitext
[[Image:Foobar.jpg|frame|500x50px|caption]]
-!! result
+!! html/parsoid
<figure typeof="mw:Image/Frame">
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
!! test
Parsoid-specific image handling - framed image with specific size and caption
(existing content)
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|442x50px|frame|caption]]
-!! result
+!! html/parsoid
<figure typeof="mw:Image/Frame" data-parsoid='{"optList":[{"ck":"width","ak":"442x50px"},{"ck":"framed","ak":"frame"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
!! end
!! test
Parsoid-specific image handling - framed image with specific size, halign, valign, and caption
-!! options
-parsoid
-!! input
+!! wikitext
[[Image:Foobar.jpg|left|baseline|frame|500x50px|caption]]
-!! result
+!! html/parsoid
<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame">
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
!! test
Parsoid-specific image handling - framed image with specific size, halign,
valign, and caption (existing content)
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|442x50px|frame|left|baseline|caption]]
-!! result
+!! html/parsoid
<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame" data-parsoid='{"optList":[{"ck":"width","ak":"442x50px"},{"ck":"framed","ak":"frame"},{"ck":"left","ak":"left"},{"ck":"baseline","ak":"baseline"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
!! end
!! test
Parsoid-specific image handling - frameless image with specific size, border, and caption
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|frameless|442x50px|border|caption]]
-!! result
+!! html/parsoid
<p><span class="mw-image-border" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}' data-parsoid='{"optList":[{"ck":"frameless","ak":"frameless"},{"ck":"width","ak":"442x50px"},{"ck":"border","ak":"border"},{"ck":"caption","ak":"caption"}],"size":"442x50"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"50","width":"442"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
!! end
!! test
Parsoid-specific image handling - simple image with a formatted caption
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]]
-!! result
+!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>"}'>
<a href="File:Foobar.jpg">
<img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941">
!! test
Parsoid-specific image handling - caption with a template in it
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|200x23px|This caption has a {{echo|transclusion}} in it.]]
-!! result
+!! html/parsoid
<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>This caption has a <span about="#mwt1" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}">transclusion</span> in it.</figcaption></figure>
!! end
Parsoid-specific image handling - caption with unbalanced tags in it
!! options
parsoid=wt2html,wt2wt,html2html
-!! input
+!! wikitext
foo
[[File:Foobar.jpg|thumb|200x200px|This caption has a <center>unbalanced tag in it.]]
bar
-!! result
+!! html/parsoid
<p>foo</p>
<figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="23" width="200"></a><figcaption>This caption has a <center>unbalanced tag in it.</center></figcaption></figure>
<p>bar</p>
!! test
Parsoid-specific image handling - empty caption
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|]]
-!! result
+!! html/parsoid
<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption></figcaption></figure>
!! end
!! test
Parsoid-specific image handling - whitespace caption
-!! options
-parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb| ]]
-!! result
+!! html/parsoid
<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption> </figcaption></figure>
!! end
!! test
Parsoid-specific image handling - lang option
-!! options
-parsoid
-!! input
+!! wikitext
foo
[[File:Foobar.svg|lang=de|caption]]
bar
-!! result
+!! html/parsoid
<p>foo
<span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="./File:Foobar.svg"><img resource="./File:Foobar.svg" src="//example.com/images/f/ff/Foobar.svg" lang="de" height="180" width="240"/></a></span>
bar</p>
Subpage link
!! options
subpage title=[[Subpage test]]
-!! input
+!! wikitext
[[/subpage]]
-!! result
+!! html
<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
</p>
!! end
Subpage noslash link
!! options
subpage title=[[Subpage test]]
-!!input
+!! wikitext
[[/subpage/]]
-!! result
+!! html
<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a>
</p>
!! end
!! options
parsoid=wt2wt,wt2html,html2html
subpage title=[[Subpage test/1/2/3/4]]
-!!input
+!! wikitext
[[../../subpage/]]
[[../../subpage]]
-!! result
+!! html
<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage/">subpage</a></p>
<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
!! end
Parsoid: dot-slash prefixed wikilinks
!! options
parsoid=wt2wt,wt2html,html2html
-!!input
+!! wikitext
[[./foo]]
[[././bar]]
[[././baz/]]
-!! result
+!! html
<p><a rel="mw:WikiLink" href="./Foo">foo</a></p>
<p><a rel="mw:WikiLink" href="./Bar">bar</a></p>
<p><a rel="mw:WikiLink" href="./Baz/">baz/</a></p>
!! test
Disabled subpages
-!! input
+!! wikitext
[[/subpage]]
-!! result
+!! html
<p><a href="/index.php?title=/subpage&action=edit&redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a>
</p>
!! end
BUG 561: {{/Subpage}}
!! options
subpage title=[[Page]]
-!! input
+!! wikitext
{{/Subpage}}
-!! result
+!! html
<p><a href="/index.php?title=Page/Subpage&action=edit&redlink=1" class="new" title="Page/Subpage (page does not exist)">Page/Subpage</a>
</p>
!! end
!! test
Link to category
-!! input
+!! wikitext
[[:Category:MediaWiki User's Guide]]
-!! result
+!! html
<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
</p>
!! end
Simple category
!! options
cat
-!! input
+!! wikitext
[[Category:MediaWiki User's Guide]]
-!! result
+!! html
<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
!! end
!! test
PAGESINCATEGORY invalid title fatal (r33546 fix)
-!! input
+!! wikitext
{{PAGESINCATEGORY:<bogus>}}
-!! result
+!! html
<p>0
</p>
!! end
Category with different sort key
!! options
cat
-!! input
+!! wikitext
[[Category:MediaWiki User's Guide|Foo]]
-!! result
+!! html
<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
!! end
Category with identical sort key
!! options
cat
-!! input
+!! wikitext
[[Category:MediaWiki User's Guide|MediaWiki User's Guide]]
-!! result
+!! html
<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
!! end
!! options
cat
pst
-!! input
+!! wikitext
[[Category:MediaWiki User's Guide|]]
-!! result
+!! html
[[Category:MediaWiki User's Guide|MediaWiki User's Guide]]
!! end
!! options
cat
pst
-!! input
+!! wikitext
[[Category:Foo (bar)|]]
-!! result
+!! html
[[Category:Foo (bar)|Foo]]
!! end
!! options
cat
pst
-!! input
+!! wikitext
123[[Category:Foo]]456
-!! result
+!! html
123[[Category:Foo]]456
!! end
!! options
cat
pst
-!! input
+!! wikitext
[[Category:{{echo|Foo}}]]
-!! result
+!! html
[[Category:{{echo|Foo}}]]
!! end
!! options
cat
pst
-!! input
+!! wikitext
[[Category:Foo|{{echo|Bar}}]]
-!! result
+!! html
[[Category:Foo|{{echo|Bar}}]]
!! end
!! options
cat
pst
-!! input
+!! wikitext
[[Category:{{echo|Foo}}|{{echo|Bar}}]]
-!! result
+!! html
[[Category:{{echo|Foo}}|{{echo|Bar}}]]
!! end
!! test
Category / paragraph interactions
-!! input
+!! wikitext
Foo [[Category:Baz]] Bar
Foo [[Category:Baz]]
[[Category:Baz]]
{{echo|[[Category:Baz]]}}
[[Category:Baz]]
-!! result
+!! html
<p>Foo Bar
</p><p>Foo
Bar
Parsoid: Serialize link to category page with colon escape
!! options
parsoid
-!! input
+!! wikitext
[[:Category:Foo]]
[[:Category:Foo|Bar]]
-!! result
+!! html
<p>
<a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a>
<a rel="mw:WikiLink" href="Category:Foo">Bar</a>
!! options
parsoid=wt2html,wt2wt,html2html
language=is
-!! input
+!! wikitext
x[[Category:Foo]]y
-!! result
+!! html
<p>x<link rel="mw:PageProp/Category" href="Category:Foo">y</p>
!! end
Parsoid: Serialize link to file page with colon escape
!! options
parsoid
-!! input
+!! wikitext
[[:File:Foo.png]]
[[:File:Foo.png|Bar]]
-!! result
+!! html
<p>
<a rel="mw:WikiLink" href="File:Foo.png">File:Foo.png</a>
<a rel="mw:WikiLink" href="File:Foo.png">Bar</a>
Parsoid: Serialize a genuine category link without colon escape
!! options
parsoid
-!! input
+!! wikitext
[[Category:Foo]]
[[Category:Foo|Bar]]
-!! result
+!! html
<link rel="mw:PageProp/Category" href="Category:Foo">
<link rel="mw:PageProp/Category" href="Category:Foo#Bar">
!! end
Parsoid: Defaultsort
!! options
parsoid
-!! input
+!! wikitext
{{DEFAULTSORT:Foo}}
-!! result
+!! html
<meta property="mw:PageProp/categorydefaultsort" content="Foo"/>
!! end
Inter-language links
!! options
ill
-!! input
+!! wikitext
[[es:Alimento]]
[[fr:Nourriture]]
[[zh:食品]]
-!! result
+!! html
es:Alimento fr:Nourriture zh:食品
!! end
Duplicate interlanguage links (bug 24502)
!! options
ill
-!! input
+!! wikitext
[[es:1]]
[[es:2]]
[[fr:1]]
[[fr:2]]
-!! result
+!! html
es:1 fr:1
!! end
###
!! test
Basic section headings
-!! input
+!! wikitext
== Headline 1 ==
Some text
More
===Smaller headline===
Blah blah
-!! result
+!! html
<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>Some text
</p>
!! test
Section headings with TOC
-!! input
+!! wikitext
== Headline 1 ==
=== Subheadline 1 ===
===== Skipping a level =====
== Headline 2 ==
Some text
===Another headline===
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
# perl -e 'print "="x$_," Level $_ heading","="x$_,"\n" for 1..10'
!! test
Handling of sections up to level 6 and beyond
-!! input
+!! wikitext
= Level 1 Heading=
== Level 2 Heading==
=== Level 3 Heading===
======== Level 8 Heading========
========= Level 9 Heading=========
========== Level 10 Heading==========
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
!! test
TOC regression (bug 9764)
-!! input
+!! wikitext
== title 1 ==
=== title 1.1 ===
==== title 1.1.1 ====
=== title 1.2 ===
== title 2 ==
=== title 2.1 ===
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
TOC with wgMaxTocLevel=3 (bug 6204)
!! options
wgMaxTocLevel=3
-!! input
+!! wikitext
== title 1 ==
=== title 1.1 ===
==== title 1.1.1 ====
=== title 1.2 ===
== title 2 ==
=== title 2.1 ===
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
!! options
wgMaxTocLevel=3
-!! input
+!! wikitext
==Section 1==
===Section 1.1===
====Section 1.1.1====
====Section 1.1.1.1====
==Section 2==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
!! test
Resolving duplicate section names
-!! input
+!! wikitext
== Foo bar ==
== Foo bar ==
-!! result
+!! html
<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! test
Resolving duplicate section names with differing case (bug 10721)
-!! input
+!! wikitext
== Foo bar ==
== Foo Bar ==
-!! result
+!! html
<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! test
Template with sections, __NOTOC__
-!! input
+!! wikitext
__NOTOC__
==Section 0==
{{sections}}
==Section 4==
-!! result
+!! html
<h2><span class="mw-headline" id="Section_0">Section 0</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Section 0">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<h3><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&action=edit&section=T-1" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&action=edit&section=T-2" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! test
__NOEDITSECTION__ keyword
-!! input
+!! wikitext
__NOEDITSECTION__
==Section 1==
==Section 2==
-!! result
+!! html
<h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
<h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
!! test
Link inside a section heading
-!! input
+!! wikitext
==Section with a [[Main Page|link]] in it==
-!! result
+!! html
<h2><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Section with a link in it">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
!! test
TOC regression (bug 12077)
-!! input
+!! wikitext
__TOC__
== title 1 ==
=== title 1.1 ===
== title 2 ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
!! test
BUG 1219 URL next to image (good)
-!! input
+!! wikitext
http://example.com [[Image:foobar.jpg]]
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!!end
!! test
Short headings with trailing space should match behavior of Parser::doHeadings (bug 19910)
-!! input
+!! wikitext
===
The line above must have a trailing space!
=== <!--
--> <!-- -->
But just in case it doesn't...
-!! result
+!! html
<h1><span class="mw-headline" id=".3D">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
<p>The line above must have a trailing space!
</p>
!! test
Header with special characters (bug 25462)
-!! input
+!! wikitext
The tooltips shall not show entities to the user (ie. be double escaped)
== text > text ==
== text " text ==
section 5
-!! result
+!! html
<p>The tooltips shall not show entities to the user (ie. be double escaped)
</p>
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
!! test
Headers with excess '=' characters
(Are similar tests necessary beyond the 1st level?)
-!! input
+!! wikitext
=foo==
==foo=
=''italic'' heading==
==''italic'' heading=
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
!! test
HTML headers vs TOC (bug 23393)
(__NOEDITSECTION__ for clearer output, doesn't matter here)
-!! input
+!! wikitext
<h1>Header 1</h1>
== Header 1.1 ==
== Header 1.2 ==
== Header 2.1 ==
== Header 2.2 ==
__NOEDITSECTION__
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
!! test
BUG 1219 URL next to image (broken)
-!! input
+!! wikitext
http://example.com[[Image:foobar.jpg]]
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!!end
!! test
Bug 1186 news: in the middle of text
-!! input
+!! wikitext
http://en.wikinews.org/wiki/Wikinews:Workplace
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://en.wikinews.org/wiki/Wikinews:Workplace">http://en.wikinews.org/wiki/Wikinews:Workplace</a>
</p>
!!end
!! test
Namespaced link must have a title
-!! input
+!! wikitext
[[Project:]]
-!! result
+!! html
<p>[[Project:]]
</p>
!!end
!! test
Namespaced link must have a title (bad fragment version)
-!! input
+!! wikitext
[[Project:#fragment]]
-!! result
+!! html
<p>[[Project:#fragment]]
</p>
!!end
!! test
div with no attributes
-!! input
+!! wikitext
<div>HTML rocks</div>
-!! result
+!! html
<div>HTML rocks</div>
!! end
!! test
div with double-quoted attribute
-!! input
+!! wikitext
<div id="rock">HTML rocks</div>
-!! result
+!! html
<div id="rock">HTML rocks</div>
!! end
!! test
div with single-quoted attribute
-!! input
+!! wikitext
<div id='rock'>HTML rocks</div>
-!! result
+!! html
<div id="rock">HTML rocks</div>
!! end
!! test
div with unquoted attribute
-!! input
+!! wikitext
<div id=rock>HTML rocks</div>
-!! result
+!! html
<div id="rock">HTML rocks</div>
!! end
!! test
div with illegal double attributes
-!! input
+!! wikitext
<div id="a" id="b">HTML rocks</div>
-!! result
+!! html
<div id="b">HTML rocks</div>
!!end
div with empty attribute value, space before equals
!! options
parsoid
-!! input
+!! wikitext
<div class =>HTML rocks</div>
-!! result
+!! html
<div class="">HTML rocks</div>
!! end
div with braces in attribute value
!! options
parsoid
-!! input
+!! wikitext
<div title="{}">Foo</div>
-!! result
+!! html
<div title="{}">Foo</div>
!! end
div with empty attribute value, no space before equals
!! options
parsoid
-!! input
+!! wikitext
<div class=>HTML rocks</div>
-!! result
+!! html
<div class="">HTML rocks</div>
!! end
!! test
HTML multiple attributes correction
-!! input
+!! wikitext
<p class="error" class="awesome">Awesome!</p>
-!! result
+!! html
<p class="awesome">Awesome!</p>
!!end
!! test
Table multiple attributes correction
-!! input
+!! wikitext
{|
!+ class="error" class="awesome"| status
|}
-!! result
+!! html
<table>
<tr>
<th class="awesome"> status
!! test
DIV IN UPPERCASE
-!! input
+!! wikitext
<DIV ID="x">HTML ROCKS</DIV>
-!! result
+!! html
<div id="x">HTML ROCKS</div>
!!end
!! test
Non-ASCII pseudo-tags are rendered as text
-!! input
+!! wikitext
<khyô>
-!! result
+!! html
<p><khyô>
</p>
!! end
!! test
Pseudo-tag with URL 'name' renders as url link
-!! input
+!! wikitext
<http://example.com/>
-!! result
+!! html
<p><<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>>
</p>
!! end
!! test
text with amp in the middle of nowhere
-!! input
+!! wikitext
Remember AT&T?
-!!result
+!! html
<p>Remember AT&T?
</p>
!! end
!! test
text with character entity: eacute
-!! input
+!! wikitext
I always thought é was a cute letter.
-!! result
+!! html
<p>I always thought é was a cute letter.
</p>
!! end
!! test
text with entity-escaped character entity-like string: eacute
-!! input
+!! wikitext
I always thought &eacute; was a cute letter.
-!! result
+!! html
<p>I always thought &eacute; was a cute letter.
</p>
!! end
!! test
text with undefined character entity: xacute
-!! input
+!! wikitext
I always thought &xacute; was a cute letter.
-!! result
+!! html
<p>I always thought &xacute; was a cute letter.
</p>
!! end
HTML5 tags
!! options
parsoid
-!! input
+!! wikitext
<data value="5">five</data>
<time datetime="2000-01-01T00:00Z">The new millenium started</time>
<mark>This highlighted text</mark>
-!! result
+!! html
<p><data value="5">five</data>
<time datetime="2000-01-01T00:00Z">The new millenium started</time>
<mark>This highlighted text</mark></p>
!! test
HTML tag with leading space is parsed as text
-!! input
+!! wikitext
< div>foo< /div>
-!! result
+!! html
<p>< div>foo< /div>
</p>
!! end
# the test case, instead of <big>
!! test
Ensure that HTML adoption agency algorithm is properly implemented.
-!! input
+!! wikitext
<big>X<big>Y</big>Z</big>
-!! result
+!! html
<p><big>X<big>Y</big>Z</big>
</p>
!! end
# This was bug 41545 in the PHP parser.
!! test
Nesting of <kbd>
-!! input
+!! wikitext
<kbd>X<kbd>Y</kbd>Z</kbd>
-!! result
+!! html
<p><kbd>X<kbd>Y</kbd>Z</kbd>
</p>
!! end
# not covered; see bug 51081 for discussion.
!! test
Nesting of <em>
-!! input
+!! wikitext
<em>X<em>Y</em>Z</em>
-!! result
+!! html
<p><em>X<em>Y</em>Z</em>
</p>
!! end
!! test
Nesting of <strong>
-!! input
+!! wikitext
<strong>X<strong>Y</strong>Z</strong>
-!! result
+!! html
<p><strong>X<strong>Y</strong>Z</strong>
</p>
!! end
!! test
Nesting of <q>
-!! input
+!! wikitext
<q>X<q>Y</q>Z</q>
-!! result
+!! html
<p><q>X<q>Y</q>Z</q>
</p>
!! end
!! test
Nesting of <ruby>
-!! input
+!! wikitext
<ruby>X<ruby>Y</ruby>Z</ruby>
-!! result
+!! html
<p><ruby>X<ruby>Y</ruby>Z</ruby>
</p>
!! end
!! test
Nesting of <bdo>
-!! input
+!! wikitext
<bdo>X<bdo>Y</bdo>Z</bdo>
-!! result
+!! html
<p><bdo>X<bdo>Y</bdo>Z</bdo>
</p>
!! end
!! test
Media link
-!! input
+!! wikitext
[[Media:Foobar.jpg]]
-!! result
+!! html
<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Media:Foobar.jpg</a>
</p>
!! end
!! test
Media link with text
-!! input
+!! wikitext
[[Media:Foobar.jpg|A neat file to look at]]
-!! result
+!! html
<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">A neat file to look at</a>
</p>
!! end
!! test
Media link with nasty text
fixme: doBlockLevels won't wrap this in a paragraph because it contains a div
-!! input
+!! wikitext
[[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
-!! result
+!! html
<a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link<div style="display:none">" onmouseover="alert(document.cookie)" onfoo="</div></a>
!! end
!! test
Media link to nonexistent file (bug 1702)
-!! input
+!! wikitext
[[Media:No such.jpg]]
-!! result
+!! html
<p><a href="/index.php?title=Special:Upload&wpDestFile=No_such.jpg" class="new" title="No such.jpg">Media:No such.jpg</a>
</p>
!! end
!! test
Image link to nonexistent file (bug 1850 - good)
-!! input
+!! wikitext
[[Image:No such.jpg]]
-!! result
+!! html
<p><a href="/index.php?title=Special:Upload&wpDestFile=No_such.jpg" class="new" title="File:No such.jpg">File:No such.jpg</a>
</p>
!! end
!! test
:Image link to nonexistent file (bug 1850 - bad)
-!! input
+!! wikitext
[[:Image:No such.jpg]]
-!! result
+!! html
<p><a href="/index.php?title=File:No_such.jpg&action=edit&redlink=1" class="new" title="File:No such.jpg (page does not exist)">Image:No such.jpg</a>
</p>
!! end
!! test
Character reference normalization in link text (bug 1938)
-!! input
+!! wikitext
[[Main Page|this&that]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">this&that</a>
</p>
!!end
!! test
(bug 19451) Links should refer to the normalized form.
-!! input
+!! wikitext
[[אַ]]
[[אַ]]
[[אַ]]
[[אַ]]
[[אַ]]
-!! result
+!! html
<p><a href="/wiki/%D7%90%D6%B7" title="אַ">אַ</a>
<a href="/wiki/%D7%90%D6%B7" title="אַ">אַ</a>
<a href="/wiki/%D7%90%D6%B7" title="אַ">אַ</a>
!! test
Empty attribute crash test (bug 2067)
-!! input
+!! wikitext
<font color="">foo</font>
-!! result
+!! html
<p><font color="">foo</font>
</p>
!! end
!! test
Empty attribute crash test single-quotes (bug 2067)
-!! input
+!! wikitext
<font color=''>foo</font>
-!! result
+!! html
<p><font color="">foo</font>
</p>
!! end
!! test
Attribute test: equals, then nothing
-!! input
+!! wikitext
<font color=>foo</font>
-!! result
+!! html
<p><font>foo</font>
</p>
!! end
!! test
Attribute test: unquoted value
-!! input
+!! wikitext
<font color=x>foo</font>
-!! result
+!! html
<p><font color="x">foo</font>
</p>
!! end
!! test
Attribute test: unquoted but illegal value (hash)
-!! input
+!! wikitext
<font color=#x>foo</font>
-!! result
+!! html
<p><font color="#x">foo</font>
</p>
!! end
!! test
Attribute test: no value
-!! input
+!! wikitext
<font color>foo</font>
-!! result
+!! html
<p><font color="color">foo</font>
</p>
!! end
!! test
Bug 2095: link with three closing brackets
-!! input
+!! wikitext
[[Main Page]]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
</p>
!! end
!! test
Bug 2095: link with pipe and three closing brackets
-!! input
+!! wikitext
[[Main Page|link]]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">link</a>]
</p>
!! end
!! test
Bug 2095: link with pipe and three closing brackets, version 2
-!! input
+!! wikitext
[[Main Page|[http://example.com/]]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
</p>
!! end
!! test
Bug 2304: HTML attribute safety (safe template; regression bug 2309)
-!! input
+!! wikitext
<div title="{{test}}"></div>
-!! result
+!! html
<div title="This is a test template"></div>
!! end
!! test
Bug 2304: HTML attribute safety (dangerous template; 2309)
-!! input
+!! wikitext
<div title="{{dangerous attribute}}"></div>
-!! result
+!! html
<div title=""></div>
!! end
!! test
Bug 2304: HTML attribute safety (dangerous style template; 2309)
-!! input
+!! wikitext
<div style="{{dangerous style attribute}}"></div>
-!! result
+!! html
<div style="/* insecure input */"></div>
!! end
!! test
Bug 2304: HTML attribute safety (safe parameter; 2309)
-!! input
+!! wikitext
{{div style|width: 200px}}
-!! result
+!! html
<div style="float: right; width: 200px">Magic div</div>
!! end
!! test
Bug 2304: HTML attribute safety (unsafe parameter; 2309)
-!! input
+!! wikitext
{{div style|width: expression(alert(document.cookie))}}
-!! result
+!! html
<div style="/* insecure input */">Magic div</div>
!! end
!! test
Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
-!! input
+!! wikitext
{{div style|"><script>alert(document.cookie)</script>}}
-!! result
+!! html
<div style="float: right;"><script>alert(document.cookie)</script>">Magic div</div>
!! end
!! test
Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
-!! input
+!! wikitext
{{div style|" ><script>alert(document.cookie)</script>}}
-!! result
+!! html
<div style="float: right;"><script>alert(document.cookie)</script>">Magic div</div>
!! end
!! test
Bug 2304: HTML attribute safety (link)
-!! input
+!! wikitext
<div title="[[Main Page]]"></div>
-!! result
+!! html
<div title="[[Main Page]]"></div>
!! end
!! test
Bug 2304: HTML attribute safety (italics)
-!! input
+!! wikitext
<div title="''foobar''"></div>
-!! result
+!! html
<div title="''foobar''"></div>
!! end
!! test
Bug 2304: HTML attribute safety (bold)
-!! input
+!! wikitext
<div title="'''foobar'''"></div>
-!! result
+!! html
<div title="'''foobar'''"></div>
!! end
!! test
Bug 2304: HTML attribute safety (ISBN)
-!! input
+!! wikitext
<div title="ISBN 1234567890"></div>
-!! result
+!! html
<div title="ISBN 1234567890"></div>
!! end
!! test
Bug 2304: HTML attribute safety (RFC)
-!! input
+!! wikitext
<div title="RFC 1234"></div>
-!! result
+!! html
<div title="RFC 1234"></div>
!! end
!! test
Bug 2304: HTML attribute safety (PMID)
-!! input
+!! wikitext
<div title="PMID 1234567890"></div>
-!! result
+!! html
<div title="PMID 1234567890"></div>
!! end
!! test
Bug 2304: HTML attribute safety (web link)
-!! input
+!! wikitext
<div title="http://example.com/"></div>
-!! result
+!! html
<div title="http://example.com/"></div>
!! end
!! test
Bug 2304: HTML attribute safety (named web link)
-!! input
+!! wikitext
<div title="[http://example.com/ link]"></div>
-!! result
+!! html
<div title="[http://example.com/ link]"></div>
!! end
!! test
Bug 3244: HTML attribute safety (extension; safe)
-!! input
+!! wikitext
<div style="<nowiki>background:blue</nowiki>"></div>
-!! result
+!! html
<div style="background:blue"></div>
!! end
!! test
Bug 3244: HTML attribute safety (extension; unsafe)
-!! input
+!! wikitext
<div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
-!! result
+!! html
<div style="/* insecure input */"></div>
!! end
!! test
MSIE CSS safety test: spurious slash
-!! input
+!! wikitext
<div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
-!! result
+!! html
<div style="/* insecure input */">evil</div>
!! end
!! test
MSIE CSS safety test: hex code
-!! input
+!! wikitext
<div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
-!! result
+!! html
<div style="/* insecure input */">evil</div>
!! end
!! test
MSIE CSS safety test: comment in url
-!! input
+!! wikitext
<div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
-!! result
+!! html
<div style="background-image:u rl(javascript:alert('boo'))">evil</div>
!! end
!! test
MSIE CSS safety test: comment in expression
-!! input
+!! wikitext
<div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
-!! result
+!! html
<div style="background-image:expres sion(alert('boo4'))">evil4</div>
!! end
!! test
CSS safety test (all browsers): vertical tab (bug 55332 / CVE-2013-4567)
-!! input
+!! wikitext
<p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
-!! result
+!! html
<p style="/* invalid control char */">A</p>
!! end
!! test
MSIE 6 CSS safety test: Fullwidth (bug 55332)
-!! input
+!! wikitext
<p style="font-size: 100px; color: expression((title='XSSed'),'red')">A</p>
<div style="top:EXPRESSION(alert())">B</div>
-!! result
+!! html
<p style="/* insecure input */">A</p>
<div style="/* insecure input */">B</div>
!! test
MSIE 6 CSS safety test: IPA extensions (bug 55332)
-!! input
+!! wikitext
<div style="background-image:uʀʟ(javascript:alert())">A</div>
<p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
-!! result
+!! html
<div style="/* insecure input */">A</div>
<p style="/* insecure input */">B</p>
!! test
MSIE 6 CSS safety test: sup/sub script (bug 55332)
-!! input
+!! wikitext
<div style="background-image:url⁽javascript:alert())">A</div>
<div style="background-image:url₍javascript:alert())">B</div>
<p style="font-size: 100px; color: expressioⁿ((title='XSSed'),'red')">C</p>
-!! result
+!! html
<div style="/* insecure input */">A</div>
<div style="/* insecure input */">B</div>
<p style="/* insecure input */">C</p>
!! test
Opera -o-link CSS
-!! input
+!! wikitext
<div
title="data:text/html,<img src=1 onerror=alert(1)>"
style="-o-link:attr(title);-o-link-source:current">X</div>
-!! result
+!! html
<div title="data:text/html,<img src=1 onerror=alert(1)>" style="/* insecure input */">X</div>
!! end
!! test
MSIE 6 CSS safety test: Repetition markers (bug 55332)
-!! input
+!! wikitext
<p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
<p style="font-size: 100px; color: expresゝion((title='XSSed'),'red')">B</p>
<p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">C</p>
<p style="font-size: 100px; color: expresﹽion((title='XSSed'),'red')">E</p>
<p style="font-size: 100px; color: expresﹼion((title='XSSed'),'red')">F</p>
<p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">G</p>
-!! result
+!! html
<p style="/* insecure input */">A</p>
<p style="/* insecure input */">B</p>
<p style="/* insecure input */">C</p>
!! test
Table attribute legitimate extension
-!! input
+!! wikitext
{|
!+ style="<nowiki>color:blue</nowiki>"| status
|}
-!! result
+!! html
<table>
<tr>
<th style="color:blue"> status
!! test
Table attribute safety
-!! input
+!! wikitext
{|
!+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"| status
|}
-!! result
+!! html
<table>
<tr>
<th style="/* insecure input */"> status
!! test
CSS line continuation 1
-!! input
+!! wikitext
<div style="background-image: u\ rl(test.jpg);"></div>
-!! result
+!! html
<div style="/* insecure input */"></div>
!! end
!! test
CSS line continuation 2
-!! input
+!! wikitext
<div style="background-image: u\ rl(test.jpg); "></div>
-!! result
+!! html
<div style="/* insecure input */"></div>
!! end
!! test
Expansion of multi-line templates in attribute values (bug 6255)
-!! input
+!! wikitext
<div style="background: {{identity|#00FF00}}">-</div>
-!! result
+!! html
<div style="background: #00FF00">-</div>
!! end
!! test
Expansion of multi-line templates in attribute values (bug 6255 sanity check)
-!! input
+!! wikitext
<div style="background:
#00FF00">-</div>
-!! result
+!! html
<div style="background: #00FF00">-</div>
!! end
!! test
Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
-!! input
+!! wikitext
<div style="background: #00FF00">-</div>
-!! result
+!! html
<div style="background: #00FF00">-</div>
!! end
###
!! test
Parser hook: empty input
-!! input
+!! wikitext
<tag></tag>
-!! result
+!! html
<pre>
''
array (
!! test
Parser hook: empty input using terminated empty elements
-!! input
+!! wikitext
<tag/>
-!! result
+!! html
<pre>
NULL
array (
!! test
Parser hook: empty input using terminated empty elements (space before)
-!! input
+!! wikitext
<tag />
-!! result
+!! html
<pre>
NULL
array (
!! test
Parser hook: basic input
-!! input
+!! wikitext
<tag>input</tag>
-!! result
+!! html
<pre>
'input'
array (
!! test
Parser hook: case insensitive
-!! input
+!! wikitext
<TAG>input</TAG>
-!! result
+!! html
<pre>
'input'
array (
!! test
Parser hook: case insensitive, redux
-!! input
+!! wikitext
<TaG>input</TAg>
-!! result
+!! html
<pre>
'input'
array (
Parser hook: nested tags
!! options
noxml
-!! input
+!! wikitext
<tag><tag></tag></tag>
-!! result
+!! html
<pre>
'<tag>'
array (
!! test
Parser hook: basic arguments
-!! input
+!! wikitext
<tag width=200 height = "100" depth = '50' square></tag>
-!! result
+!! html
<pre>
''
array (
!! test
Parser hook: argument containing a forward slash (bug 5344)
-!! input
+!! wikitext
<tag filename='/tmp/bla'></tag>
-!! result
+!! html
<pre>
''
array (
!! test
Parser hook: empty input using terminated empty elements (bug 2374)
-!! input
+!! wikitext
<tag foo=bar/>text
-!! result
+!! html
<pre>
NULL
array (
# </tag> should be output literally since there is no matching tag that begins it
!! test
Parser hook: basic arguments using terminated empty elements (bug 2374)
-!! input
+!! wikitext
<tag width=200 height = "100" depth = '50' square/>
other stuff
</tag>
-!! result
+!! html
<pre>
NULL
array (
!! test
Parser hook: static parser hook not inside a comment
-!! input
+!! wikitext
<statictag>hello, world</statictag>
<statictag action=flush/>
-!! result
+!! html
<p>hello, world
</p>
!! end
!! test
Parser hook: static parser hook inside a comment
-!! input
+!! wikitext
<!-- <statictag>hello, world</statictag> -->
<statictag action=flush/>
-!! result
+!! html
<p><br />
</p>
!! end
!! test
Nested template calls
-!! input
+!! wikitext
{{Map-one-parameter|One-parameter|param}}
-!! result
+!! html
<p>(My parameter is: param)
</p>
!! end
###
!! test
Sanitizer: Closing of open tags
-!! input
+!! wikitext
<s></s><table></table>
-!! result
+!! html
<s></s><table></table>
!! end
!! test
Sanitizer: Closing of open but not closed tags
-!! input
+!! wikitext
<s>foo
-!! result
+!! html
<p><s>foo</s>
</p>
!! end
!! test
Sanitizer: Closing of closed but not open tags
-!! input
+!! wikitext
</s>
-!! result
+!! html
<p></s>
</p>
!! end
!! test
Sanitizer: Closing of closed but not open table tags
-!! input
+!! wikitext
Table not started</td></tr></table>
-!! result
+!! html
<p>Table not started</td></tr></table>
</p>
!! end
!! test
Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
-!! input
+!! wikitext
<span id="æ: v">byte</span>[[#æ: v|backlink]]
-!! result
+!! html
<p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
</p>
!! end
Sanitizer: Validating the contents of the id attribute (bug 4515)
!! options
disabled
-!! input
+!! wikitext
<br id=9 />
-!! result
+!! html
Something, but definitely not <br id="9" />...
!! end
Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
!! options
disabled
-!! input
+!! wikitext
<br id="foo" /><br id="foo" />
-!! result
+!! html
Something need to be done. foo-2 ?
!! end
!! test
Sanitizer: Validating that <meta> and <link> work, but only for Microdata
-!! input
+!! wikitext
<div itemscope>
<meta itemprop="hello" content="world">
<meta http-equiv="refresh" content="5">
<link rel="stylesheet" href="{{SERVER}}">
<link rel="stylesheet" itemprop="hello" href="{{SERVER}}">
</div>
-!! result
+!! html
<div itemscope="itemscope">
<p> <meta itemprop="hello" content="world" />
<meta http-equiv="refresh" content="5">
Language converter: output gets cut off unexpectedly (bug 5757)
!! options
language=zh
-!! input
+!! wikitext
this bit is safe: }-
but if we add a conversion instance: -{zh-cn:xxx;zh-tw:yyy}-
then we get cut off here: }-
all additional text is vanished
-!! result
+!! html
<p>this bit is safe: }-
</p><p>but if we add a conversion instance: xxx
</p><p>then we get cut off here: }-
!! test
Self closed html pairs (bug 5487)
!! options
-!! input
+!! wikitext
<center><font id="bug" />Centered text</center>
<div><font id="bug2" />In div text</div>
-!! result
+!! html
<center><font id="bug" />Centered text</center>
<div><font id="bug2" />In div text</div>
!! test
Punctuation: nbsp before exclamation
-!! input
+!! wikitext
C'est grave !
-!! result
+!! html
<p>C'est grave !
</p>
!! end
!! test
Punctuation: CSS !important (bug 11874)
-!! input
+!! wikitext
<div style="width:50% !important">important</div>
-!! result
+!! html
<div style="width:50% !important">important</div>
!!end
!! test
Punctuation: CSS ! important (bug 11874; with space after)
-!! input
+!! wikitext
<div style="width:50% ! important">important</div>
-!! result
+!! html
<div style="width:50% ! important">important</div>
!!end
!! test
HTML bullet list, closed tags (bug 5497)
-!! input
+!! wikitext
<ul>
<li>One</li>
<li>Two</li>
</ul>
-!! result
+!! html
<ul>
<li>One</li>
<li>Two</li>
HTML bullet list, unclosed tags (bug 5497)
!! options
disabled
-!! input
+!! wikitext
<ul>
<li>One
<li>Two
</ul>
-!! result
+!! html
<ul>
<li>One
</li>
!! test
HTML ordered list, closed tags (bug 5497)
-!! input
+!! wikitext
<ol>
<li>One</li>
<li>Two</li>
</ol>
-!! result
+!! html
<ol>
<li>One</li>
<li>Two</li>
HTML ordered list, unclosed tags (bug 5497)
!! options
disabled
-!! input
+!! wikitext
<ol>
<li>One
<li>Two
</ol>
-!! result
+!! html
<ol>
<li>One
</li>
!! test
HTML nested bullet list, closed tags (bug 5497)
-!! input
+!! wikitext
<ul>
<li>One</li>
<li>Two:
</ul>
</li>
</ul>
-!! result
+!! html
<ul>
<li>One</li>
<li>Two:
HTML nested bullet list, open tags (bug 5497)
!! options
disabled
-!! input
+!! wikitext
<ul>
<li>One
<li>Two:
<li>Sub-two
</ul>
</ul>
-!! result
+!! html
<ul>
<li>One
</li>
!! test
HTML nested ordered list, closed tags (bug 5497)
-!! input
+!! wikitext
<ol>
<li>One</li>
<li>Two:
</ol>
</li>
</ol>
-!! result
+!! html
<ol>
<li>One</li>
<li>Two:
HTML nested ordered list, open tags (bug 5497)
!! options
disabled
-!! input
+!! wikitext
<ol>
<li>One
<li>Two:
<li>Sub-two
</ol>
</ol>
-!! result
+!! html
<ol>
<li>One
</li>
!! test
HTML ordered list item with parameters oddity
-!! input
+!! wikitext
<ol><li id="fragment">One</li>
</ol>
-!! result
+!! html
<ol><li id="fragment">One</li>
</ol>
!!test
bug 5918: autonumbering
-!! input
+!! wikitext
[http://first/] [http://second] [ftp://ftp]
ftp://inlineftp
[mailto:enclosed@mail.tld]
mailto:inline@mail.tld
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://first/">[1]</a> <a rel="nofollow" class="external autonumber" href="http://second">[2]</a> <a rel="nofollow" class="external autonumber" href="ftp://ftp">[3]</a>
</p><p><a rel="nofollow" class="external free" href="ftp://inlineftp">ftp://inlineftp</a>
</p><p><a rel="nofollow" class="external text" href="mailto:enclosed@mail.tld">With target</a>
!! test
Fuzz testing: Parser13
-!! input
+!! wikitext
{|
| http://a|
-!! result
+!! html
<table>
<tr>
<td>
!! test
Fuzz testing: Parser14
-!! input
+!! wikitext
== onmouseover= ==
http://__TOC__
-!! result
+!! html
<h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
!! test
Fuzz testing: Parser14-table
-!! input
+!! wikitext
==a==
{| STYLE=__TOC__
-!! result
+!! html
<h2><span class="mw-headline" id="a">a</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<table style="__TOC__">
<tr><td></td></tr>
Fuzz testing: Parser16
!! options
noxml
-!! input
+!! wikitext
{|
!https://||||||
-!! result
+!! html
<table>
<tr>
<th>https://</th>
!! test
Fuzz testing: Parser21
-!! input
+!! wikitext
{|
! irc://{{ftp://a" onmouseover="alert('hello world');"
|
-!! result
+!! html
<table>
<tr>
<th> <a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
!! test
Fuzz testing: Parser22
-!! input
+!! wikitext
http://===r:::https://b
{|
-!!result
+!! html
<p><a rel="nofollow" class="external free" href="http://===r:::https://b">http://===r:::https://b</a>
</p>
<table>
Fuzz testing: Parser24
!! options
noxml
-!! input
+!! wikitext
{|
{{{|
<u CLASS=
MOVE YOUR MOUSE CURSOR OVER THIS TEXT
|
-!! result
+!! html
<table>
{{{|
<u class="|">}}}} >
# }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
!!test
Fuzz testing: Parser25 (bug 6055)
-!! input
+!! wikitext
{{{
|
<LI CLASS=||
>
}}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
-!! result
+!! html
<p><LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
</p>
!! end
!!test
Fuzz testing: URL adjacent extension (with space, clean)
!! options
-!! input
+!! wikitext
http://example.com <nowiki>junk</nowiki>
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> junk
</p>
!!end
!!test
Fuzz testing: URL adjacent extension (no space, dirty; nowiki)
!! options
-!! input
+!! wikitext
http://example.com<nowiki>junk</nowiki>
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>junk
</p>
!!end
!!test
Fuzz testing: URL adjacent extension (no space, dirty; pre)
!! options
-!! input
+!! wikitext
http://example.com<pre>junk</pre>
-!! result
+!! html
<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><pre>junk</pre>
!!end
!!test
Fuzz testing: image with bogus manual thumbnail
-!!input
+!! wikitext
[[Image:foobar.jpg|thumbnail= ]]
-!!result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;">Error creating thumbnail: <div class="thumbcaption"></div></div></div>
!!end
!! test
Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
-!! input
+!! wikitext
<pre dir=" "></pre>
-!! result
+!! html
<pre dir=" "></pre>
!! end
!! test
Parsing optional HTML elements (Bug 6171)
!! options
-!! input
+!! wikitext
<table>
<tr>
<td> Some tabular data</td>
<td> And yet som tabular data</td>
</tr>
</table>
-!! result
+!! html
<table>
<tr>
<td> Some tabular data</td>
!! test
Correct handling of <td>, <tr> (Bug 6171)
!! options
-!! input
+!! wikitext
<table>
<tr>
<td> Some tabular data</td>
<td> And yet som tabular data</td>
</tr>
</table>
-!! result
+!! html
<table>
<tr>
<td> Some tabular data</td>
!! test
Parsing crashing regression (fr:JavaScript)
-!! input
+!! wikitext
</body></x>
-!! result
+!! html
<p></body></x>
</p>
!! end
!! test
Inline wiki vs wiki block nesting
-!! input
+!! wikitext
'''Bold paragraph
New wiki paragraph
-!! result
+!! html
<p><b>Bold paragraph</b>
</p><p>New wiki paragraph
</p>
Inline HTML vs wiki block nesting
!! options
disabled
-!! input
+!! wikitext
<b>Bold paragraph
New wiki paragraph
-!! result
+!! html
<p><b>Bold paragraph</b>
</p><p>New wiki paragraph
</p>
!!test
Mixing markup for italics and bold
!! options
-!! input
+!! wikitext
'''bold''''''bold''bolditalics'''''
-!! result
+!! html
<p>'<i>bold'</i><b>bold<i>bolditalics</i></b>
</p>
!! end
!! test
Special page transclusion
!! options
-!! input
+!! wikitext
{{Special:Prefixindex/Xyzzyx}}
-!! result
+!! html
<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
!! end
!! test
Special page transclusion twice (bug 5021)
!! options
-!! input
+!! wikitext
{{Special:Prefixindex/Xyzzyx}}
{{Special:Prefixindex/Xyzzyx}}
-!! result
+!! html
<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
!! test
Transclusion of default MediaWiki message
-!! input
+!! wikitext
{{MediaWiki:Mainpage}}
-!!result
+!! html
<p>Main Page
</p>
!! end
!! test
Transclusion of nonexistent MediaWiki message
-!! input
+!! wikitext
{{MediaWiki:Mainpagexxx}}
-!!result
+!! html
<p><a href="/index.php?title=MediaWiki:Mainpagexxx&action=edit&redlink=1" class="new" title="MediaWiki:Mainpagexxx (page does not exist)">MediaWiki:Mainpagexxx</a>
</p>
!! end
!! test
Transclusion of MediaWiki message with underscore
-!! input
+!! wikitext
{{MediaWiki:history_short}}
-!! result
+!! html
<p>History
</p>
!! end
!! test
Transclusion of MediaWiki message with space
-!! input
+!! wikitext
{{MediaWiki:history short}}
-!! result
+!! html
<p>History
</p>
!! end
!! test
Invalid header with following text
-!! input
+!! wikitext
= x = y
-!! result
+!! html
<p>= x = y
</p>
!! end
Section extraction test (section 0)
!! options
section=0
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
!! end
Section extraction test (section 1)
!! options
section=1
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
==a==
===aa===
====aaa====
Section extraction test (section 2)
!! options
section=2
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
===aa===
====aaa====
!! end
Section extraction test (section 3)
!! options
section=3
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
====aaa====
!! end
Section extraction test (section 4)
!! options
section=4
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
==b==
===ba===
===bb===
Section extraction test (section 5)
!! options
section=5
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
===ba===
!! end
Section extraction test (section 6)
!! options
section=6
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
===bb===
====bba====
!! end
Section extraction test (section 7)
!! options
section=7
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
====bba====
!! end
Section extraction test (section 8)
!! options
section=8
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
===bc===
!! end
Section extraction test (section 9)
!! options
section=9
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
==c==
===ca===
!! end
Section extraction test (section 10)
!! options
section=10
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
===ca===
!! end
Section extraction test (nonexistent section 11)
!! options
section=11
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
!! end
!! test
Section extraction test with bogus heading (section 1)
!! options
section=1
-!! input
+!! wikitext
==a==
==bogus== not a legal section
==b==
-!! result
+!! html
==a==
==bogus== not a legal section
!! end
Section extraction test with bogus heading (section 2)
!! options
section=2
-!! input
+!! wikitext
==a==
==bogus== not a legal section
==b==
-!! result
+!! html
==b==
!! end
Section extraction test with comment after heading (section 1)
!! options
section=1
-!! input
+!! wikitext
==a==
==b== <!-- -->
==c==
-!! result
+!! html
==a==
!! end
Section extraction test with comment after heading (section 2)
!! options
section=2
-!! input
+!! wikitext
==a==
==b== <!-- -->
==c==
-!! result
+!! html
==b== <!-- -->
!! end
Section extraction test with bogus <nowiki> heading (section 1)
!! options
section=1
-!! input
+!! wikitext
==a==
==bogus== <nowiki>not a legal section</nowiki>
==b==
-!! result
+!! html
==a==
==bogus== <nowiki>not a legal section</nowiki>
!! end
Section extraction test with bogus <nowiki> heading (section 2)
!! options
section=2
-!! input
+!! wikitext
==a==
==bogus== <nowiki>not a legal section</nowiki>
==b==
-!! result
+!! html
==b==
!! end
Section extraction prefixed by comment (section 1)
!! options
section=1
-!! input
+!! wikitext
<!-- -->==sec1==
==sec2==
-!!result
+!! html
==sec2==
!!end
Section extraction prefixed by comment (section 2)
!! options
section=2
-!! input
+!! wikitext
<!-- -->==sec1==
==sec2==
-!!result
+!! html
!!end
Section extraction, mixed wiki and html (section 1)
!! options
section=1
-!! input
+!! wikitext
<h2>unmarked</h2>
unmarked
==1==
one
==2==
two
-!! result
+!! html
==1==
one
!! end
Section extraction, mixed wiki and html (section 2)
!! options
section=2
-!! input
+!! wikitext
<h2>unmarked</h2>
unmarked
==1==
one
==2==
two
-!! result
+!! html
==2==
two
!! end
Section extraction, heading surrounded by <noinclude>
!! options
section=1
-!! input
+!! wikitext
<noinclude>==unmarked==</noinclude>
==marked==
-!! result
+!! html
==marked==
!!end
Sectiion with all-equals
!! options
section=2
-!! input
+!! wikitext
===
The line above must have a trailing space
=== <!--
--> <!-- -->
But just in case it doesn't...
-!! result
+!! html
=== <!--
--> <!-- -->
But just in case it doesn't...
Section replacement test (section 0)
!! options
replace=0,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
xxx
==a==
Section replacement test (section 1)
!! options
replace=1,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
xxx
Section replacement test (section 2)
!! options
replace=2,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
xxx
Section replacement test (section 3)
!! options
replace=3,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test (section 4)
!! options
replace=4,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test (section 5)
!! options
replace=5,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test (section 6)
!! options
replace=6,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test (section 7)
!! options
replace=7,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test (section 8)
!! options
replace=8,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test (section 9)
!! options
replace=9,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test (section 10)
!! options
replace=10,"xxx"
-!! input
+!! wikitext
start
==a==
===aa===
===bc===
==c==
===ca===
-!! result
+!! html
start
==a==
===aa===
Section replacement test with initial whitespace (bug 13728)
!! options
replace=2,"xxx"
-!! input
+!! wikitext
Preformatted initial line
==a==
===a===
-!! result
+!! html
Preformatted initial line
==a==
xxx
Section extraction, heading followed by pre with 20 spaces (bug 6398)
!! options
section=1
-!! input
+!! wikitext
==a==
a
-!! result
+!! html
==a==
a
!! end
Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
!! options
section=1
-!! input
+!! wikitext
==a==
a
-!! result
+!! html
==a==
a
!! end
Section extraction, <pre> around bogus header (bug 10309)
!! options
noxml section=2
-!! input
+!! wikitext
== Section One ==
<pre>
=======
== Section Two ==
stuff
-!! result
+!! html
== Section Two ==
stuff
!! end
Section replacement, <pre> around bogus header (bug 10309)
!! options
noxml replace=2,"xxx"
-!! input
+!! wikitext
== Section One ==
<pre>
=======
== Section Two ==
stuff
-!! result
+!! html
== Section One ==
<pre>
=======
!! test
Handling of 
 in URLs
-!! input
+!! wikitext
**irc://
a
-!! result
+!! html
<ul>
<li><ul>
<li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
!!end
-!! test
-5 quotes, code coverage +1 line (php)
-!! options
-php
-!! input
-'''''
-!! result
-!! end
# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
!! test
-5 quotes, code coverage +1 line (parsoid)
-!! options
-parsoid
-!! input
+5 quotes, code coverage +1 line
+!! wikitext
'''''
-!! result
+!! html/php
+!! html/parsoid
<p><b><i></i></b></p>
!! end
!! test
Special:Search page linking.
-!! input
+!! wikitext
{{Special:search}}
-!! result
+!! html
<p><a href="/wiki/Special:Search" title="Special:Search">Special:Search</a>
</p>
!! end
Say the magic word
!! options
title=[[Parser test]]
-!! input
+!! wikitext
* {{PAGENAME}}
* {{PAGENAMEE}}
* {{FULLPAGENAME}}
* {{SUBJECTSPACE}}
* {{SUBJECTSPACEE}}
* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
-!! result
+!! html
<ul>
<li> Parser test
</li>
!! test
Gallery
-!! input
+!! wikitext
<gallery>
image1.png |
image2.gif|||||
[[x|xx]]]]
* image6
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="height: 150px;">Image1.png</div>
!! test
Gallery (with options)
-!! input
+!! wikitext
<gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
File:Nonexistant.jpg|caption
File:Nonexistant.jpg
image:foobar.jpg
image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
<li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
<li class="gallerybox" style="width: 105px"><div style="width: 105px">
!! test
Gallery with wikitext inside caption
-!! input
+!! wikitext
<gallery>
File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
!! test
gallery (with showfilename option)
-!! input
+!! wikitext
<gallery showfilename>
File:Nonexistant.jpg|caption
File:Nonexistant.jpg
image:foobar.jpg|some '''caption''' [[Main Page]]
File:Foobar.jpg
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
!! test
Gallery (with namespace-less filenames)
-!! input
+!! wikitext
<gallery>
File:Nonexistant.jpg
Nonexistant.jpg
image:foobar.jpg
foobar.jpg
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
!! test
HTML Hex character encoding (spells the word "JavaScript")
-!! input
+!! wikitext
JavaScript
-!! result
+!! html
<p>JavaScript
</p>
!! end
!! test
HTML Hex character encoding bogus encoding (bug 26437 regression check)
-!! input
+!! wikitext
&#xsee;&#XSEE;
-!! result
+!! html
<p>&#xsee;&#XSEE;
</p>
!! end
!! test
HTML Hex character encoding mixed case
-!! input
+!! wikitext
îî
-!! result
+!! html
<p>îî
</p>
!! end
!! test
__FORCETOC__ override
-!! input
+!! wikitext
__NEWSECTIONLINK__
__FORCETOC__
-!! result
+!! html
<p><br />
</p>
!! end
!! test
ISBN code coverage
-!! input
+!! wikitext
ISBN 978-0-1234-56 789
-!! result
+!! html
<p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a> 789
</p>
!! end
!! test
ISBN followed by 5 spaces
-!! input
+!! wikitext
ISBN
-!! result
+!! html
<p>ISBN
</p>
!! end
!! test
Double ISBN
-!! input
+!! wikitext
ISBN ISBN 1234567890
-!! result
+!! html
<p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
</p>
!! end
!! test
ISBN with an X
-!! input
+!! wikitext
ISBN 3-462-04561-X
-!! result
+!! html
<p><a href="/wiki/Special:BookSources/346204561X" class="internal mw-magiclink-isbn">ISBN 3-462-04561-X</a>
</p>
!! end
!! test
Bug 22905: <abbr> followed by ISBN followed by </a>
-!! input
+!! wikitext
<abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
-!! result
+!! html
<p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
</p>
!! end
!! test
Double RFC
-!! input
+!! wikitext
RFC RFC 1234
-!! result
+!! html
<p>RFC <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
</p>
!! end
!! test
Double RFC with a wiki link
-!! input
+!! wikitext
RFC [[RFC 1234]]
-!! result
+!! html
<p>RFC <a href="/index.php?title=RFC_1234&action=edit&redlink=1" class="new" title="RFC 1234 (page does not exist)">RFC 1234</a>
</p>
!! end
!! test
RFC code coverage
-!! input
+!! wikitext
RFC 983 987
-!! result
+!! html
<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc983">RFC 983</a> 987
</p>
!! end
!! test
Centre-aligned image
-!! input
+!! wikitext
[[Image:foobar.jpg|centre]]
-!! result
+!! html
<div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div></div>
!!end
!! test
None-aligned image
-!! input
+!! wikitext
[[Image:foobar.jpg|none]]
-!! result
+!! html
<div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
!!end
!! test
Width + Height sized image (using px) (height is ignored)
-!! input
+!! wikitext
[[Image:foobar.jpg|640x480px]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
</p>
!!end
!! test
Width-sized image (using px, no following whitespace)
-!! input
+!! wikitext
[[Image:foobar.jpg|640px]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
</p>
!!end
!! test
Width-sized image (using px, with following whitespace - test regression from r39467)
-!! input
+!! wikitext
[[Image:foobar.jpg|640px ]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
</p>
!!end
!! test
Width-sized image (using px, with preceding whitespace - test regression from r39467)
-!! input
+!! wikitext
[[Image:foobar.jpg| 640px]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
</p>
!!end
!! test
Another italics / bold test
-!! input
+!! wikitext
''' ''x'
-!! result
+!! html
<pre>'<i> </i>x'
</pre>
!!end
dt/dd/dl test
!! options
disabled
-!! input
+!! wikitext
:;;;::
-!! result
+!! html
<dl>
<dd><dl>
<dt><dl>
# Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
!! test
Images with the "|" character in the comment
-!! input
+!! wikitext
[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|¶m2=|x external] URL]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&param2=%7Cx">external</a> URL</div></div></div>
!!end
!! test
[Before] HTML without raw HTML enabled ($wgRawHtml==false)
-!! input
+!! wikitext
<html><script>alert(1);</script></html>
-!! result
+!! html
<p><html><script>alert(1);</script></html>
</p>
!! end
HTML with raw HTML ($wgRawHtml==true)
!! options
wgRawHtml=1
-!! input
+!! wikitext
<html><script>alert(1);</script></html>
-!! result
+!! html
<p><script>alert(1);</script>
</p>
!! end
Parents of subpages, one level up
!! options
subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
[[../|L2]]
-!! result
+!! html
<p><a href="/index.php?title=Subpage_test/L1/L2&action=edit&redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">L2</a>
</p>
!! end
Parents of subpages, one level up, not named
!! options
subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
[[../]]
-!! result
+!! html
<p><a href="/index.php?title=Subpage_test/L1/L2&action=edit&redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">Subpage test/L1/L2</a>
</p>
!! end
Parents of subpages, two levels up
!! options
subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
[[../../|L1]]2
[[../../|L1]]l
-!! result
+!! html
<p><a href="/index.php?title=Subpage_test/L1&action=edit&redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>2
</p><p><a href="/index.php?title=Subpage_test/L1&action=edit&redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1l</a>
</p>
Parents of subpages, two levels up, without trailing slash or name.
!! options
subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
[[../..]]
-!! result
+!! html
<p>[[../..]]
</p>
!! end
Parents of subpages, two levels up, with lots of extra trailing slashes.
!! options
subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
[[../../////]]
-!! result
+!! html
<p><a href="/index.php?title=Subpage_test/L1////&action=edit&redlink=1" class="new" title="Subpage test/L1//// (page does not exist)">///</a>
</p>
!! end
Transclusion of a sibling page (one level up)
!! options
subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
{{../L3Sibling}}
-!! result
+!! html
<p>Sibling article
</p>
!! end
Transclusion of a child page
!! options
subpage title=[[Subpage test/L1/L2]]
-!! input
+!! wikitext
{{/L3Sibling}}
-!! result
+!! html
<p>Sibling article
</p>
!! end
Non-transclusion because of too many up levels
!! options
subpage title=[[Subpage test/L1/L2/L3]]
-!! input
+!! wikitext
{{../../../../More than parent}}
-!! result
+!! html
<p>{{../../../../More than parent}}
</p>
!! end
!! test
Definition list code coverage
-!! input
+!! wikitext
; title : def
; title : def
;title: def
-!! result
+!! html
<dl>
<dt> title  </dt>
<dd> def
!! test
Don't fall for the self-closing div
-!! input
+!! wikitext
<div>hello world</div/>
-!! result
+!! html
<div>hello world</div>
!! end
!! test
MSGNW magic word
-!! input
+!! wikitext
{{MSGNW:msg}}
-!! result
+!! html
<p>[[:Template:Msg]]
</p>
!! end
!! test
RAW magic word
-!! input
+!! wikitext
{{RAW:QUERTY}}
-!! result
+!! html
<p><a href="/index.php?title=Template:QUERTY&action=edit&redlink=1" class="new" title="Template:QUERTY (page does not exist)">Template:QUERTY</a>
</p>
!! end
# This isn't needed for XHTML conformance, but would be handy as a fallback security measure
!! test
Always escape literal '>' in output, not just after '<'
-!! input
+!! wikitext
><>
-!! result
+!! html
<p>><>
</p>
!! end
!! test
Template caching
-!! input
+!! wikitext
{{Test}}
{{Test}}
-!! result
+!! html
<p>This is a test template
This is a test template
</p>
!! test
Inclusion of !userCanEdit() content
-!! input
+!! wikitext
{{MediaWiki:Fake}}
-!! result
+!! html
<h2><span class="mw-headline" id="header">header</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=MediaWiki:Fake&action=edit&section=T-1" title="MediaWiki:Fake">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
!! test
Out-of-order TOC heading levels
-!! input
+!! wikitext
==2==
======6======
===3===
=1=
=====5=====
==2==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
!! test
ISBN with a dummy number
-!! input
+!! wikitext
ISBN ---
-!! result
+!! html
<p>ISBN ---
</p>
!! end
!! test
ISBN with space-delimited number
-!! input
+!! wikitext
ISBN 92 9017 032 8
-!! result
+!! html
<p><a href="/wiki/Special:BookSources/9290170328" class="internal mw-magiclink-isbn">ISBN 92 9017 032 8</a>
</p>
!! end
!! test
ISBN with multiple spaces, no number
-!! input
+!! wikitext
ISBN foo
-!! result
+!! html
<p>ISBN foo
</p>
!! end
!! test
ISBN length
-!! input
+!! wikitext
ISBN 123456789
ISBN 1234567890
ISBN 12345678901
-!! result
+!! html
<p>ISBN 123456789
</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
</p><p>ISBN 12345678901
!! test
ISBN with trailing year (bug 8110)
-!! input
+!! wikitext
ISBN 1-234-56789-0 - 2006
ISBN 1 234 56789 0 - 2006
-!! result
+!! html
<p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1-234-56789-0</a> - 2006
</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1 234 56789 0</a> - 2006
</p>
!! test
anchorencode
-!! input
+!! wikitext
{{anchorencode:foo bar©#%n}}
-!! result
+!! html
<p>foo_bar.C2.A9.23.25n
</p>
!! end
!! test
anchorencode trims spaces
-!! input
+!! wikitext
{{anchorencode: __pretty__please__}}
-!! result
+!! html
<p>pretty_please
</p>
!! end
!! test
anchorencode deals with links
-!! input
+!! wikitext
{{anchorencode: [[hello|world]] [[hi]]}}
-!! result
+!! html
<p>world_hi
</p>
!! end
!! test
anchorencode deals with templates
-!! input
+!! wikitext
{{anchorencode: {{Foo}} }}
-!! result
+!! html
<p>FOO
</p>
!! end
!! test
anchorencode encodes like the TOC generator: (bug 18431)
-!! input
+!! wikitext
=== _ +:.3A%3A&&]] ===
{{anchorencode: _ +:.3A%3A&&]] }}
__NOEDITSECTION__
-!! result
+!! html
<h3><span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&&]]</span></h3>
<p>.2B:.3A.253A.26.26.5D.5D
</p>
!! test
Bug 6200: blockquotes and paragraph formatting
-!! input
+!! wikitext
<blockquote>
foo
</blockquote>
bar
baz
-!! result
+!! html
<blockquote>
<p>foo
</p>
!! test
Bug 8293: Use of center tag ruins paragraph formatting
-!! input
+!! wikitext
<center>
foo
</center>
bar
baz
-!! result
+!! html
<center>
<p>foo
</p>
!! end
!!test
-Parsing of overlapping (improperly nested) inline html tags (PHP parser)
-!!options
-php
-!!input
+Parsing of overlapping (improperly nested) inline html tags
+!! wikitext
<span><s>x</span></s>
-!!result
+!! html/php
<p><span><s>x</span></s></span>
</p>
-!!end
-
-!!test
-Parsing of overlapping (improperly nested) inline html tags (Parsoid)
-!!options
-parsoid
-!!input
-<span><s>x</span></s>
-!!result
-<p><span><s>x</s></span><s></s>
+!! html/parsoid
+<p><span><s>x</s></span>
</p>
!!end
Self-link in language variants
!! options
title=[[Dunav]] language=sr
-!! input
+!! wikitext
Both [[Dunav]] and [[Дунав]] are names for this river.
-!! result
+!! html
<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
</p>
!!end
Link to another existing title shouldn't be parsed as self-link even if it's a variant of this title
!! options
title=[[Duna]] language=sr
-!! input
+!! wikitext
[[Дуна]] is not a self-link while [[Duna]] and [[Dуна]] are still self-links.
-!! result
+!! html
<p><a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Дуна</a> is not a self-link while <strong class="selflink">Duna</strong> and <strong class="selflink">Dуна</strong> are still self-links.
</p>
!! end
Link to a section of a variant of this title shouldn't be parsed as self-link
!! options
title=[[Duna]] language=sr
-!! input
+!! wikitext
[[Dуна]] is a self-link while [[Dunа#Foo]] and [[Dуна#Foo]] are not self-links.
-!! result
+!! html
<p><strong class="selflink">Dуна</strong> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
</p>
!! end
Link to pages in language variants
!! options
language=sr
-!! input
+!! wikitext
Main Page can be written as [[Маин Паге]]
-!! result
+!! html
<p>Main Page can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>
</p>
!!end
Multiple links to pages in language variants
!! options
language=sr
-!! input
+!! wikitext
[[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
</p>
!!end
Simple template in language variants
!! options
language=sr
-!! input
+!! wikitext
{{тест}}
-!! result
+!! html
<p>This is a test template
</p>
!! end
Template with explicit namespace in language variants
!! options
language=sr
-!! input
+!! wikitext
{{Template:тест}}
-!! result
+!! html
<p>This is a test template
</p>
!! end
Basic test for template parameter in language variants
!! options
language=sr
-!! input
+!! wikitext
{{парамтест|param=foo}}
-!! result
+!! html
<p>This is a test template with parameter foo
</p>
!! end
Simple category in language variants
!! options
language=sr cat
-!! input
+!! wikitext
[[Category:МедиаWики Усер'с Гуиде]]
-!! result
+!! html
<a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User%27s_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
!! end
Don't convert blue categorylinks to another variant (bug 33210)
!! options
language=zh cat
-!! input
+!! wikitext
[[A]][[Category:分类]]
-!! result
+!! html
<a href="/wiki/Category:%E5%88%86%E7%B1%BB" title="Category:分类">分类</a>
!! end
Stripping -{}- tags (language variants)
!! options
language=sr
-!! input
+!! wikitext
Latin proverb: -{Ne nuntium necare}-
-!! result
+!! html
<p>Latin proverb: Ne nuntium necare
</p>
!! end
Prevent conversion with -{}- tags (language variants)
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
Latinski: -{Ne nuntium necare}-
-!! result
+!! html
<p>Латински: Ne nuntium necare
</p>
!! end
Prevent conversion of text with -{}- tags (language variants)
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
Latinski: -{Ne nuntium necare}-
-!! result
+!! html
<p>Латински: Ne nuntium necare
</p>
!! end
Prevent conversion of links with -{}- tags (language variants)
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
-{[[Main Page]]}-
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
</p>
!! end
-{}- tags within headlines (within html for parserConvert())
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
== -{Naslov}- ==
-!! result
+!! html
<h2><span class="mw-headline" id="-.7BNaslov.7D-">Naslov</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Уредите одељак „Naslov“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
Explicit definition of language variant alternatives
!! options
language=zh variant=zh-tw
-!! input
+!! wikitext
-{zh:China;zh-tw:Taiwan}-, not China
-!! result
+!! html
<p>Taiwan, not China
</p>
!! end
Conversion around HTML tags
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
-{H|span=>sr-ec:script;title=>sr-ec:src;}-
<span title="La-{sr-el:L;sr-ec:C;}-tin">ski</span>
-!! result
+!! html
<p>
<span title="ЛаCтин">ски</span>
</p>
Explicit session-wise language variant mapping (A flag and - flag)
!! options
language=zh variant=zh-tw
-!! input
+!! wikitext
Taiwan is not China.
But -{A|zh:China;zh-tw:Taiwan}- is China,
(This-{-|zh:China;zh-tw:Taiwan}- should be stripped!)
and -{China}- is China.
-!! result
+!! html
<p>Taiwan is not China.
But Taiwan is Taiwan,
(This should be stripped!)
Explicit session-wise language variant mapping (H flag for hide)
!! options
language=zh variant=zh-tw
-!! input
+!! wikitext
(This-{H|zh:China;zh-tw:Taiwan}- should be stripped!)
Taiwan is China.
-!! result
+!! html
<p>(This should be stripped!)
Taiwan is Taiwan.
</p>
Adding explicit conversion rule for title (T flag)
!! options
language=zh variant=zh-tw showtitle
-!! input
+!! wikitext
Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
+!! html
Taiwan
<p>Should be stripped!
</p>
Testing that changing the language variant here in the tests actually works
!! options
language=zh variant=zh showtitle
-!! input
+!! wikitext
Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
+!! html
China
<p>Should be stripped!
</p>
Recursive conversion of alt and title attrs shouldn't clear converter state
!! options
language=zh variant=zh-cn showtitle
-!! input
+!! wikitext
-{H|zh-cn:Exclamation;zh-tw:exclamation;}-
Should be stripped-{T|zh-cn:China;zh-tw:Taiwan}-<span title="exclamation">!</span>
-!! result
+!! html
China
<p>
Should be stripped<span title="Exclamation">!</span>
Bug 24072: more test on conversion rule for title
!! options
language=zh variant=zh-tw showtitle
-!! input
+!! wikitext
This should be stripped-{T|zh:China;zh-tw:Taiwan}-!
This won't take interferes with the title rule-{H|zh:Beijing;zh-tw:Taipei}-.
-!! result
+!! html
Taiwan
<p>This should be stripped!
This won't take interferes with the title rule.
Partly disable title conversion if variant == main language code
!! options
language=zh variant=zh title=[[ZH]] showtitle
-!! input
+!! wikitext
-{T|zh-cn:CN;zh-tw:TW}-
-!! result
+!! html
ZH
<p>
</p>
Partly disable title conversion if variant == main language code, more
!! options
language=zh variant=zh title=[[ZH]] showtitle
-!! input
+!! wikitext
-{T|TW}-
-!! result
+!! html
ZH
<p>
</p>
Raw output of variant escape tags (R flag)
!! options
language=zh variant=zh-tw
-!! input
+!! wikitext
Raw: -{R|zh:China;zh-tw:Taiwan}-
-!! result
+!! html
<p>Raw: zh:China;zh-tw:Taiwan
</p>
!! end
Nested using of manual convert syntax
!! options
language=zh variant=zh-hk
-!! input
+!! wikitext
Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiwan;zh-hk:H-{ong}- K-{}-ong;}-;}-!
-!! result
+!! html
<p>Nested: Hello Hong Kong!
</p>
!! end
Proper conversion of text in external links
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
http://www.google.com
gopher://www.google.com
[http://www.google.com http://www.google.com]
[https://www.google.com irc://www.google.com]
[ftp://www.google.com www.google.com/ftp://dir]
[//www.google.com www.google.com]
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.google.com">http://www.google.com</a>
<a rel="nofollow" class="external free" href="gopher://www.google.com">gopher://www.google.com</a>
<a rel="nofollow" class="external free" href="http://www.google.com">http://www.google.com</a>
Do not convert roman numbers to language variants
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
Fridrih IV je car.
-!! result
+!! html
<p>Фридрих IV је цар.
</p>
!! end
Unclosed language converter markup "-{"
!! options
language=sr
-!! input
+!! wikitext
-{T|hello
-!! result
+!! html
<p>-{T|hello
</p>
!! end
Don't convert raw rule "-{R|=>}-" to "=>"
!! options
language=sr
-!! input
+!! wikitext
-{R|=>}-
-!! result
+!! html
<p>=>
</p>
!!end
Don't break link parsing if language converter markup is in the caption.
!! options
language=sr variant=sr-ec
-!! input
+!! wikitext
[[Main Page|-{R|main page}-]]
-!! result
+!! html
<p><a href="/wiki/Main_Page" title="Маин Паге">main page</a>
</p>
!! end
!! options
language=sr
disabled
-!! input
+!! wikitext
[[File:Foobar.jpg|-{R|caption}-]]
-!! result
+!! html
<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! options
language=zh variant=zh-cn
disabled
-!! input
+!! wikitext
;-{zh-cn:AAA;zh-tw:BBB}-
-!! result
+!! html
<dl><dt>AAA
</dt></dl>
!! options
language=sr variant=sr-ec
disabled
-!! input
+!! wikitext
{|
|-
| -{R|B}-
|}
-!! result
+!! html
<table>
<tr>
!! test
Bug 529: Uncovered bullet
-!! input
+!! wikitext
* Foo {{bullet}}
-!! result
+!! html
<ul>
<li> Foo
</li>
# the expected output and your parser's output.
!! test
Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
-!! input
+!! wikitext
******* Foo {{bullet}}
-!! result
+!! html
<ul>
<li><ul>
<li><ul>
!! test
Bug 529: Uncovered table already at line-start
-!! input
+!! wikitext
x
{{table}}
y
-!! result
+!! html
<p>x
</p>
<table>
!! test
Bug 529: Uncovered bullet in parser function result
-!! input
+!! wikitext
* Foo {{lc:{{bullet}} }}
-!! result
+!! html
<ul>
<li> Foo
</li>
!! test
Bug 5678: Double-parsed template argument
-!! input
+!! wikitext
{{lc:{{{1}}}|hello}}
-!! result
+!! html
<p>{{{1}}}
</p>
!! end
!! test
Bug 5678: Double-parsed template invocation
-!! input
+!! wikitext
{{lc:{{paramtest {{!}} param = hello }} }}
-!! result
+!! html
<p>{{paramtest | param = hello }}
</p>
!! end
!! options
language=cs
title=[[Main Page]]
-!! input
+!! wikitext
{{PRVNÍVELKÉ:ěščř}}
{{prvnívelké:ěščř}}
{{PRVNÍMALÉ:ěščř}}
{{malá:ěščř}}
{{VELKÁ:ěščř}}
{{velká:ěščř}}
-!! result
+!! html
<p>Ěščř
Ěščř
ěščř
!! test
Morwen/13: Unclosed link followed by heading
-!! input
+!! wikitext
[[link
==heading==
-!! result
+!! html
<p>[[link
</p>
<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! test
HHP2.1: Heuristics for headings in preprocessor parenthetical structures
-!! input
+!! wikitext
{{foo|
=heading=
-!! result
+!! html
<p>{{foo|
</p>
<h1><span class="mw-headline" id="heading">heading</span></h1>
!! test
HHP2.2: Heuristics for headings in preprocessor parenthetical structures
-!! input
+!! wikitext
{{foo|
==heading==
-!! result
+!! html
<p>{{foo|
</p>
<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
Tildes in comments
!! options
pst
-!! input
+!! wikitext
<!-- ~~~~ -->
-!! result
+!! html
<!-- ~~~~ -->
!! end
!! test
Paragraphs inside divs (no extra line breaks)
-!! input
+!! wikitext
<div>Line one
Line two</div>
-!! result
+!! html
<div>Line one
Line two</div>
!! test
Paragraphs inside divs (extra line break on open)
-!! input
+!! wikitext
<div>
Line one
Line two</div>
-!! result
+!! html
<div>
<p>Line one
</p>
!! test
Paragraphs inside divs (extra line break on close)
-!! input
+!! wikitext
<div>Line one
Line two
</div>
-!! result
+!! html
<div>Line one
<p>Line two
</p>
!! test
Paragraphs inside divs (extra line break on open and close)
-!! input
+!! wikitext
<div>
Line one
Line two
</div>
-!! result
+!! html
<div>
<p>Line one
</p><p>Line two
Nesting tags, paragraphs on lines which begin with <div>
!! options
disabled
-!! input
+!! wikitext
<div></div><strong>A
B</strong>
-!! result
+!! html
<div></div>
<p><strong>A
B</strong>
# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
!! test
Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! input
+!! wikitext
<blockquote>Line one
Line two</blockquote>
-!! result
+!! html
<blockquote>Line one
Line two</blockquote>
!! test
Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! input
+!! wikitext
<blockquote>
Line one
Line two</blockquote>
-!! result
+!! html
<blockquote>
<p>Line one
</p>
!! test
Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! input
+!! wikitext
<blockquote>Line one
Line two
</blockquote>
-!! result
+!! html
<blockquote>Line one
<p>Line two
</p>
!! test
Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! input
+!! wikitext
<blockquote>
Line one
Line two
</blockquote>
-!! result
+!! html
<blockquote>
<p>Line one
</p><p>Line two
!! test
Paragraphs inside blockquotes/divs (no extra line breaks)
-!! input
+!! wikitext
<blockquote><div>Line one
Line two</div></blockquote>
-!! result
+!! html
<blockquote><div>Line one
Line two</div></blockquote>
!! test
Paragraphs inside blockquotes/divs (extra line break on open)
-!! input
+!! wikitext
<blockquote><div>
Line one
Line two</div></blockquote>
-!! result
+!! html
<blockquote><div>
<p>Line one
</p>
!! test
Paragraphs inside blockquotes/divs (extra line break on close)
-!! input
+!! wikitext
<blockquote><div>Line one
Line two
</div></blockquote>
-!! result
+!! html
<blockquote><div>Line one
<p>Line two
</p>
!! test
Paragraphs inside blockquotes/divs (extra line break on open and close)
-!! input
+!! wikitext
<blockquote><div>
Line one
Line two
</div></blockquote>
-!! result
+!! html
<blockquote><div>
<p>Line one
</p><p>Line two
Interwiki links trounced by replaceExternalLinks after early LinkHolderArray expansion
!! options
wgLinkHolderBatchSize=0
-!! input
+!! wikitext
[[meatball:1]]
[[meatball:2]]
[[meatball:3]]
-!! result
+!! html
<p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw" title="meatball:1">meatball:1</a>
<a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw" title="meatball:2">meatball:2</a>
<a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw" title="meatball:3">meatball:3</a>
!! test
Free external link invading image caption
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb|http://x|hello]]
-!! result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>hello</div></div></div>
!! end
Bug 15196: localised external link numbers
!! options
language=fa
-!! input
+!! wikitext
[http://en.wikipedia.org/]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[۱]</a>
</p>
!! end
!! test
Multibyte character in padleft
-!! input
+!! wikitext
{{padleft:-Hello|7|Æ}}
-!! result
+!! html
<p>Æ-Hello
</p>
!! end
!! test
Multibyte character in padright
-!! input
+!! wikitext
{{padright:Hello-|7|Æ}}
-!! result
+!! html
<p>Hello-Æ
</p>
!! end
!!test
formatdate parser function
-!!input
+!! wikitext
{{#formatdate:2009-03-24}}
-!! result
+!! html
<p><span class="mw-formatted-date" title="2009-03-24">2009-03-24</span>
</p>
!! end
!!test
formatdate parser function, with default format
-!!input
+!! wikitext
{{#formatdate:2009-03-24|mdy}}
-!! result
+!! html
<p><span class="mw-formatted-date" title="2009-03-24">March 24, 2009</span>
</p>
!! end
!! test
Spacing of numbers in formatted dates
-!! input
+!! wikitext
{{#formatdate:January 15}}
-!! result
+!! html
<p><span class="mw-formatted-date" title="01-15">January 15</span>
</p>
!! end
formatdate parser function, with default format and on a page of which the content language is always English and different from the wiki content language
!! options
language=nl title=[[MediaWiki:Common.css]]
-!! input
+!! wikitext
{{#formatdate:2009-03-24|dmy}}
-!! result
+!! html
<p><span class="mw-formatted-date" title="2009-03-24">24 March 2009</span>
</p>
!! end
Edit comment with link
!! options
comment
-!! input
+!! wikitext
I like the [[Main Page]] a lot
-!! result
+!! html
I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
!!end
Edit comment with link and link text
!! options
comment
-!! input
+!! wikitext
I like the [[Main Page|best pages]] a lot
-!! result
+!! html
I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
!!end
Edit comment with link and link text with suffix
!! options
comment
-!! input
+!! wikitext
I like the [[Main Page|best page]]s a lot
-!! result
+!! html
I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
!!end
Edit comment with section link (non-local, eg in history list)
!! options
comment title=[[Main Page]]
-!! input
+!! wikitext
/* External links */ removed bogus entries
-!! result
+!! html
<a href="/wiki/Main_Page#External_links" title="Main Page">→</a><span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
!!end
Edit comment with section link and text before it (non-local, eg in history list)
!! options
comment title=[[Main Page]]
-!! input
+!! wikitext
pre-comment text /* External links */ removed bogus entries
-!! result
+!! html
pre-comment text <a href="/wiki/Main_Page#External_links" title="Main Page">→</a><span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
!!end
Edit comment with section link (local, eg in diff view)
!! options
comment local title=[[Main Page]]
-!! input
+!! wikitext
/* External links */ removed bogus entries
-!! result
+!! html
<a href="#External_links">→</a><span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
!!end
comment
subpage
title=[[Subpage test]]
-!! input
+!! wikitext
Poked at a [[/subpage]] here...
-!! result
+!! html
Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a> here...
!!end
comment
subpage
title=[[Subpage test]]
-!! input
+!! wikitext
Poked at a [[/subpage|neat little page]] here...
-!! result
+!! html
Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">neat little page</a> here...
!!end
!! options
comment
title=[[Subpage test]]
-!! input
+!! wikitext
Poked at a [[/subpage]] here...
-!! result
+!! html
Poked at a <a href="/index.php?title=/subpage&action=edit&redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> here...
!!end
comment
local
title=[[Main Page]]
-!!input
+!! wikitext
[[#section]]
-!! result
+!! html
<a href="#section">#section</a>
!! end
!! options
comment
title=[[Main Page]]
-!!input
+!! wikitext
[[#section]]
-!! result
+!! html
<a href="/wiki/Main_Page#section" title="Main Page">#section</a>
!! end
!! test
Anchor starting with underscore
-!!input
+!! wikitext
[[#_ref|One]]
-!! result
+!! html
<p><a href="#_ref">One</a>
</p>
!! end
!! test
Id starting with underscore
-!!input
+!! wikitext
<div id="_ref"></div>
-!! result
+!! html
<div id="_ref"></div>
!! end
!! options
comment
title=[[Main Page]]
-!!input
+!! wikitext
/* __hello__world__ */
-!! result
+!! html
<a href="/wiki/Main_Page#hello_world" title="Main Page">→</a><span dir="auto"><span class="autocomment">__hello__world__</span></span>
!! end
percent-encoding and + signs in comments (Bug 26410)
!! options
comment
-!!input
+!! wikitext
[[ABC%33D% ++]] [[ABC%33D% ++|+%20]]
-!! result
+!! html
<a href="/index.php?title=ABC3D%25_%2B%2B&action=edit&redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&action=edit&redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
!! end
Bad images - basic functionality
!! options
disabled
-!! input
+!! wikitext
[[File:Bad.jpg]]
-!! result
+!! html
!! end
!! test
Bad images - bug 16039: text after bad image disappears
!! options
disabled
-!! input
+!! wikitext
Foo bar
[[File:Bad.jpg]]
Bar foo
-!! result
+!! html
<p>Foo bar
</p><p>Bar foo
</p>
!! config
wgAllowDisplayTitle=true
wgRestrictDisplayTitle=false
-!! input
+!! wikitext
this is not the the title
-!! result
+!! html
Parser test
<p>this is not the the title
</p>
!! config
wgAllowDisplayTitle=true
wgRestrictDisplayTitle=false
-!! input
+!! wikitext
this is not the the title
{{DISPLAYTITLE:whatever}}
-!! result
+!! html
whatever
<p>this is not the the title
</p>
!! config
wgAllowDisplayTitle=true
wgRestrictDisplayTitle=true
-!! input
+!! wikitext
this is not the the title
{{DISPLAYTITLE:whatever}}
-!! result
+!! html
Screen
<p>this is not the the title
</p>
!! config
wgAllowDisplayTitle=true
wgRestrictDisplayTitle=true
-!! input
+!! wikitext
this is not the the title
{{DISPLAYTITLE:screen}}
-!! result
+!! html
screen
<p>this is not the the title
</p>
title=[[Screen]]
!! config
wgAllowDisplayTitle=false
-!! input
+!! wikitext
this is not the the title
{{DISPLAYTITLE:screen}}
-!! result
+!! html
Screen
<p>this is not the the title
<a href="/index.php?title=Template:DISPLAYTITLE:screen&action=edit&redlink=1" class="new" title="Template:DISPLAYTITLE:screen (page does not exist)">Template:DISPLAYTITLE:screen</a>
title=[[Screen]]
!! config
wgAllowDisplayTitle=false
-!! input
+!! wikitext
this is not the the title
-!! result
+!! html
Screen
<p>this is not the the title
</p>
!! config
wgAllowDisplayTitle=true
wgRestrictDisplayTitle=true
-!! input
+!! wikitext
this is not the the title
{{DISPLAYTITLE:<span style="display: none;">s</span>creen}}
-!! result
+!! html
<span style="/* attempt to bypass $wgRestrictDisplayTitle */">s</span>creen
<p>this is not the the title
</p>
!! config
wgAllowDisplayTitle=true
wgRestrictDisplayTitle=true
-!! input
+!! wikitext
this is not the the title
{{DISPLAYTITLE:<span style="color: red;">s</span>creen}}
-!! result
+!! html
<span style="color: red;">s</span>creen
<p>this is not the the title
</p>
preload: check <noinclude> and <includeonly>
!! options
preload
-!! input
+!! wikitext
Hello <noinclude>cruel</noinclude><includeonly>kind</includeonly> world.
-!! result
+!! html
Hello kind world.
!! end
preload: check <onlyinclude>
!! options
preload
-!! input
+!! wikitext
Goodbye <onlyinclude>Hello world</onlyinclude>
-!! result
+!! html
Hello world
!! end
preload: can pass tags through if we want to
!! options
preload
-!! input
+!! wikitext
<includeonly><</includeonly>includeonly>Hello world<includeonly><</includeonly>/includeonly>
-!! result
+!! html
<includeonly>Hello world</includeonly>
!! end
preload: check that it doesn't try to do tricks
!! options
preload
-!! input
+!! wikitext
* <!-- Hello --> ''{{world}}'' {{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! result
+!! html
* <!-- Hello --> ''{{world}}'' {{subst:How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
!! end
Play a bit with r67090 and bug 3158
!! options
disabled
-!! input
+!! wikitext
<div style="width:50% !important"> </div>
<div style="width:50% !important"> </div>
<div style="width:50% !important"> </div>
<div style="border : solid;"> </div>
-!! result
+!! html
<div style="width:50% !important"> </div>
<div style="width:50% !important"> </div>
<div style="width:50% !important"> </div>
!! test
HTML5 data attributes
-!! input
+!! wikitext
<span data-foo="bar">Baz</span>
<p data-abc-def_hij="">Quuz</p>
-!! result
+!! html
<p><span data-foo="bar">Baz</span>
</p>
<p data-abc-def_hij="">Quuz</p>
!! test
percent-encoding and + signs in internal links (Bug 26410)
-!! input
+!! wikitext
[[User:+%]] [[Page+title%]]
[[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
[[%]] [[+]] [[image:%+abc%39|foo|[[bar]]]]
[[%33%45]] [[%33%45+]]
-!! result
+!! html
<p><a href="/index.php?title=User:%2B%25&action=edit&redlink=1" class="new" title="User:+% (page does not exist)">User:+%</a> <a href="/index.php?title=Page%2Btitle%25&action=edit&redlink=1" class="new" title="Page+title% (page does not exist)">Page+title%</a>
<a href="/index.php?title=%25%2B&action=edit&redlink=1" class="new" title="%+ (page does not exist)">%+</a> <a href="/index.php?title=%25%2B&action=edit&redlink=1" class="new" title="%+ (page does not exist)">%20</a> <a href="/index.php?title=%25%2B&action=edit&redlink=1" class="new" title="%+ (page does not exist)">%+ </a> <a href="/index.php?title=%25%2Br&action=edit&redlink=1" class="new" title="%+r (page does not exist)">%+r</a>
<a href="/index.php?title=%25&action=edit&redlink=1" class="new" title="% (page does not exist)">%</a> <a href="/index.php?title=%2B&action=edit&redlink=1" class="new" title="+ (page does not exist)">+</a> <a href="/index.php?title=Special:Upload&wpDestFile=%25%2Babc9" class="new" title="File:%+abc9">bar</a>
!! test
Special characters in embedded file links (bug 27679)
-!! input
+!! wikitext
[[File:Contains & ampersand.jpg]]
[[File:Does not exist.jpg|Title with & ampersand]]
-!! result
+!! html
<p><a href="/index.php?title=Special:Upload&wpDestFile=Contains_%26_ampersand.jpg" class="new" title="File:Contains & ampersand.jpg">File:Contains & ampersand.jpg</a>
<a href="/index.php?title=Special:Upload&wpDestFile=Does_not_exist.jpg" class="new" title="File:Does not exist.jpg">Title with & ampersand</a>
</p>
!! test
Confirm that 'apos' named character reference doesn't make it to output (not legal in HTML 4)
-!! input
+!! wikitext
Text's been normalized?
-!! result
+!! html
<p>Text's been normalized?
</p>
!! end
!! test
Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
-!! input
+!! wikitext
http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="http://www.example.org/">http://www.example.org/</a> <-- U+3000 (vim: ^Vu3000)
</p>
!! end
!! test
Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
-!! input
+!! wikitext
[http://www.example.org/ ideograms]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="http://www.example.org/">ideograms</a>
</p>
!! end
!! test
Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
-!! input
+!! wikitext
http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
-!! result
+!! html
<p><img src="http://www.example.org/pic.png" alt="pic.png" /> <-- U+3000 (vim: ^Vu3000)
</p>
!! end
!! test
Bug 31098 Template which includes system messages which includes the template
-!! input
+!! wikitext
{{Identical}}
-!! result
+!! html
<p><span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
<span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
</p>
Bug31490 Turkish: ucfirst 'blah'
!! options
language=tr
-!! input
+!! wikitext
{{ucfirst:blah}}
-!! result
+!! html
<p>Blah
</p>
!! end
Bug31490 Turkish: ucfirst 'ix'
!! options
language=tr
-!! input
+!! wikitext
{{ucfirst:ix}}
-!! result
+!! html
<p>İx
</p>
!! end
Bug31490 Turkish: lcfirst 'BLAH'
!! options
language=tr
-!! input
+!! wikitext
{{lcfirst:BLAH}}
-!! result
+!! html
<p>bLAH
</p>
!! end
Bug31490 Turkish: ucfırst (with a dotless i)
!! options
language=tr
-!! input
+!! wikitext
{{ucfırst:blah}}
-!! result
+!! html
<p><a href="/index.php?title=%C5%9Eablon:Ucf%C4%B1rst:blah&action=edit&redlink=1" class="new" title="Şablon:Ucfırst:blah (sayfa mevcut değil)">Şablon:Ucfırst:blah</a>
</p>
!! end
Bug31490 ucfırst (with a dotless i) with English language
!! options
language=en
-!! input
+!! wikitext
{{ucfırst:blah}}
-!! result
+!! html
<p><a href="/index.php?title=Template:Ucf%C4%B1rst:blah&action=edit&redlink=1" class="new" title="Template:Ucfırst:blah (page does not exist)">Template:Ucfırst:blah</a>
</p>
!! end
Bug 26375: TOC with italics
!! options
title=[[Main Page]]
-!! input
+!! wikitext
__TOC__
== ''Lost'' episodes ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
Bug 26375: TOC with bold
!! options
title=[[Main Page]]
-!! input
+!! wikitext
__TOC__
== '''should be bold''' then normal text ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
Bug 33845: Headings become cursive in TOC when they contain an image
!! options
title=[[Main Page]]
-!! input
+!! wikitext
__TOC__
== Image [[Image:foobar.jpg]] ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
!! options
title=[[Main Page]]
-!! input
+!! wikitext
__TOC__
== <blockquote>Quote</blockquote> ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
Unclosed tags in TOC
!! options
title=[[Main Page]]
-!! input
+!! wikitext
__TOC__
== Proof: 2 < 3 ==
<small>Hanc marginis exiguitas non caperet.</small>
QED
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 < 3</span></a></li>
!! test
Multiple tags in TOC
-!! input
+!! wikitext
__TOC__
== <i>Foo</i> <b>Bar</b> ==
== <i>Foo</i> <blockquote>Bar</blockquote> ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
!! test
Tags with parameters in TOC
-!! input
+!! wikitext
__TOC__
== <sup class="in-h2">Hello</sup> ==
== <sup class="a > b">Evilbye</sup> ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
!! test
span tags with directionality in TOC
-!! input
+!! wikitext
__TOC__
== <span dir="ltr">C++</span> ==
== <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> ==
== <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
-!! result
+!! html
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
Bug 32057: Title needed when expanding <h> nodes.
!! options
title=[[Main Page]]
-!! input
+!! wikitext
{{int:Bug32057}}
-!! result
+!! html
<h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
!! test
Strip marker in urlencode
-!! input
+!! wikitext
{{urlencode:x<nowiki/>y}}
{{urlencode:x<nowiki/>y|wiki}}
{{urlencode:x<nowiki/>y|path}}
-!! result
+!! html
<p>xy
xy
xy
!! test
Strip marker in lc
-!! input
+!! wikitext
{{lc:x<nowiki/>y}}
-!! result
+!! html
<p>xy
</p>
!! end
!! test
Strip marker in uc
-!! input
+!! wikitext
{{uc:x<nowiki/>y}}
-!! result
+!! html
<p>XY
</p>
!! end
!! test
Strip marker in formatNum
-!! input
+!! wikitext
{{formatnum:1<nowiki/>2}}
{{formatnum:1<nowiki/>2|R}}
-!! result
+!! html
<p>12
12
</p>
Check noCommafy in formatNum
!! options
language=be-tarask
-!! input
+!! wikitext
{{formatnum:123456.78}}
{{formatnum:123456.78|NOSEP}}
-!! result
+!! html
<p>123 456,78
123456.78
</p>
!! test
Wrong option for formatNum (bug 56199)
-!! input
+!! wikitext
{{formatnum:1,234.56|Random}}
{{formatnum:1,234.56|EVERYTHING}}
{{formatnum:1234.56|any argument that has the string 'NOSEP'}}
-!! result
+!! html
<p>1,234.56
1,234.56
1,234.56
Strip marker in grammar
!! options
language=fi
-!! input
+!! wikitext
{{grammar:elative|foo<nowiki/>bar}}
-!! result
+!! html
<p>foobarista
</p>
!! end
!! test
Strip marker in padleft
-!! input
+!! wikitext
{{padleft:|2|x<nowiki/>y}}
-!! result
+!! html
<p>xy
</p>
!! end
!! test
Strip marker in padright
-!! input
+!! wikitext
{{padright:|2|x<nowiki/>y}}
-!! result
+!! html
<p>xy
</p>
!! end
!! test
Strip marker in anchorencode
-!! input
+!! wikitext
{{anchorencode:x<nowiki/>y}}
-!! result
+!! html
<p>xy
</p>
!! end
!! test
nowiki inside link inside heading (bug 18295)
-!! input
+!! wikitext
==[[foo|x<nowiki>y</nowiki>z]]==
-!! result
+!! html
<h2><span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: xyz">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
!! test
new support for bdi element (bug 31817)
-!! input
+!! wikitext
<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
-!! result
+!! html
<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
!!end
!! test
Ignore pipe between table row attributes
-!! input
+!! wikitext
{|
| quux
|- id=foo | style='color: red'
| bar
|}
-!! result
+!! html
<table>
<tr>
<td> quux
!!test
Gallery override link with WikiLink (bug 34852)
-!! input
+!! wikitext
<gallery>
File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
!!test
Gallery override link with absolute external link (bug 34852)
-!! input
+!! wikitext
<gallery>
File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
!!test
Gallery override link with malicious javascript (bug 34852)
-!! input
+!! wikitext
<gallery>
File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
!!test
Gallery with invalid title as link (bug 43964)
-!! input
+!! wikitext
<gallery>
File:foobar.jpg|link=<
</gallery>
-!! result
+!! html
<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
!!test
Language parser function
-!! input
+!! wikitext
{{#language:ar}}
-!! result
+!! html
<p>العربية
</p>
!! end
!!test
Padleft and padright as substr
-!! input
+!! wikitext
{{padleft:|3|abcde}}
{{padright:|3|abcde}}
-!! result
+!! html
<p>abc
abc
</p>
!!test
Special parser function
-!! input
+!! wikitext
{{#special:RandomPage}}
{{#special:BaDtItLe}}
{{#special:Foobar}}
-!! result
+!! html
<p>Special:Random
Special:Badtitle
Special:Foobar
!!test
Bug 34939 - Case insensitive link parsing ([HttP://])
-!! input
+!! wikitext
[HttP://MediaWiki.Org/]
-!! result
+!! html
<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
</p>
!! end
!!test
Bug 34939 - Case insensitive link parsing ([HttP:// title])
-!! input
+!! wikitext
[HttP://MediaWiki.Org/ MediaWiki]
-!! result
+!! html
<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
</p>
!! end
!!test
Bug 34939 - Case insensitive link parsing (HttP://)
-!! input
+!! wikitext
HttP://MediaWiki.Org/
-!! result
+!! html
<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
</p>
!! end
Disable TOC
!! options
notoc
-!! input
+!! wikitext
Lead
== Section 1 ==
== Section 2 ==
== Section 3 ==
== Section 4 ==
== Section 5 ==
-!! result
+!! html
<p>Lead
</p>
1. SOL-sensitive wikitext tokens as template-args
!!options
parsoid=wt2html,wt2wt
-!!input
+!! wikitext
{{echo|*a}}
{{echo|#a}}
{{echo|:a}}
-!!result
+!! html
<span about="#mwt1" typeof="mw:Transclusion">
</span><ul about="#mwt1"><li>a</li>
</ul>
Ref: 1. ref-location should be replaced with an index span
!!options
parsoid
-!!input
+!! wikitext
A <ref>foo</ref>
B <ref name="x">foo</ref>
C <ref name="y" />
-!!result
+!! html
<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
B <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-2">[2]</a></span>
C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"y"}}' id="cite_ref-y-3-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-y-3">[3]</a></span></p>
Ref: 2. ref-tags with identical names should all get the same index
!!options
parsoid
-!!input
+!! wikitext
A <ref name="x">foo</ref>
B <ref name="x" />
-!!result
+!! html
<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
!!end
Ref: 3. spaces in ref-names should be ignored
!!options
parsoid
-!!input
+!! wikitext
A <ref name="x">foo</ref>
B <ref name=" x " />
C <ref name= x />
-!!result
+!! html
<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-2" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
(NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
!!options
parsoid
-!!input
+!! wikitext
A <ref name="constructor">foo</ref>
-!!result
+!! html
<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}' id="cite_ref-constructor-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-constructor-1">[1]</a></span></p>
!!end
Ref: 5. body should accept generic wikitext
!!options
parsoid
-!!input
+!! wikitext
A <ref>
This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
</ref>
<references />
-!!result
+!! html
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"This is a <b data-parsoid='{\"dsr\":[19,40,3,3]}'><a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}'>bolded link</a></b> and this is a <span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}' data-parsoid='{\"dsr\":[55,76,null,null],\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]]}'>transclusion</span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
Ref: 6. indent-pres should not be output in ref-body
!!options
parsoid
-!!input
+!! wikitext
A <ref>
foo
bar
</ref>
<references />
-!!result
+!! html
<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'>
Ref: 7. No p-wrapping in ref-body
!!options
parsoid
-!!input
+!! wikitext
A <ref>
foo
</ref>
<references />
-!!result
+!! html
<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
Ref: 8. transclusion wikitext has lower precedence
!!options
parsoid
-!!input
+!! wikitext
A <ref> foo {{echo|</ref> B C}}
<references />
-!!result
+!! html
<p>A <span class="reference" data-mw="{"name":"ref","body":{"html":"foo <span typeof=\"mw:Nowiki\" data-parsoid='{\"src\":\"{{\",\"dsr\":[12,14,0,0]}'>{{</span>echo|"},"attrs":{}}" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
<ol class="references" typeof="mw:Extension/references" data-mw="{"name":"references","attrs":{}}">
<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
Ref: 9. unclosed comments should not leak out of ref-body
!!options
parsoid
-!!input
+!! wikitext
A <ref> foo <!--</ref> B C
<references />
-!!result
+!! html
<p>A <span class="reference" data-mw='{"name":"ref","body":{"html":"foo <!---->"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo </li>
Ref: 10. Unclosed HTML tags should not leak out of ref-body
!!options
parsoid
-!!input
+!! wikitext
A <ref> <b> foo </ref> B C
<references />
-!!result
+!! html
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"<b data-parsoid='{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[8,16,3,0]}'> foo </b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref> <b> foo </ref>"}'><a href="#cite_note-1">[1]</a></span> B C</p>
Ref: 11. ref-tags acts like an inline element wrt P-wrapping
!!options
parsoid
-!!input
+!! wikitext
A <ref>foo</ref> B
C <ref>bar</ref> D
-!!result
+!! html
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>foo</ref>"}'><a href="#cite_note-1">[1]</a></span> B
C <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bar</ref>"}'><a href="#cite_note-2">[2]</a></span> D</p>
!!end
Ref: 12. ref-tags act as trailing newline migration barrier
!!options
parsoid
-!!input
+!! wikitext
<!--the newline at the end of this line moves out of the p-tag-->a
b<!--the newline at the end of this line stays inside the p-tag--> <ref />
<ref />
c
-!!result
+!! html
<p><!--the newline at the end of this line moves out of the p-tag-->a</p>
Ref: 13. ref-tags are not SOL-transparent and block indent-pres
!!options
parsoid
-!!input
+!! wikitext
<ref>foo</ref> A
<ref>bar
</ref> B
-!!result
+!! html
<p><span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> A
<span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> B</p>
!!end
Ref: 14. A nested ref-tag should be emitted as plain text
!!options
parsoid
-!!input
+!! wikitext
<ref>foo <ref>bar</ref> baz</ref>
<references />
-!!result
+!! html
<p><span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo &lt;ref>bar&lt;/ref> baz"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>foo <ref>bar</ref> baz</ref>"}'><a href="#cite_note-1">[1]</a></span></p>
<ol class="references" typeof="mw:Extension/references" about="#mwt5" data-parsoid='{"src":"<references />"}' data-mw='{"name":"references","attrs":{}}'>
Ref: 15. ref-tags with identical names should get identical indexes
!!options
parsoid
-!!input
+!! wikitext
A1 <ref name="a">foo</ref> A2 <ref name="a" />
B1 <ref name="b" /> B2 <ref name="b">bar</ref>
<references />
-!!result
+!! html
<p>A1 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
Ref: 16. Tokenizer should accept non-standard whitespace in <ref> and </ref> tags
!!options
parsoid=wt2html
-!!input
+!! wikitext
A <ref >foo</ref >
<references />
-!!result
+!! html
<p>A <span class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
References: 1. references tag without any refs should be handled properly
!!options
parsoid
-!!input
+!! wikitext
<references />
-!!result
+!! html
<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'></ol>
!!end
References: 2. references tag with group only outputs references from that group
!!options
parsoid
-!!input
+!! wikitext
A <ref group="a">foo</ref>
B <ref group="b">bar</ref>
<references group="a" />
-!!result
+!! html
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[b 1]</a></span></p>
References: 3. ref list should be cleared after processing references
!!options
parsoid
-!!input
+!! wikitext
A <ref>foo</ref>
<references />
B <ref>bar</ref>
<references />
-!!result
+!! html
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
<ol about="#mwt4" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
References: 4. only referenced group should be cleared after processing references
!!options
parsoid
-!!input
+!! wikitext
A <ref group="a">afoo</ref>
B <ref>bfoo</ref>
C <ref>cfoo</ref>
<references />
-!!result
+!! html
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>"}'><a href="#cite_note-2">[1]</a></span></p>
References: 5. ref tags in references should be processed while ignoring all other content
!!options
parsoid
-!!input
+!! wikitext
A <ref name="a" />
B <ref name="b">bar</ref>
<ref name="a">foo</ref>
This should just get lost.
</references>
-!!result
+!! html
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref name=\"a\" />"}'><a href="#cite_note-a-1">[1]</a></span>
B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref name=\"b\">bar</ref>"}'><a href="#cite_note-b-2">[2]</a></span></p>
References: 6. <references /> from a transclusion
!!options
parsoid
-!!input
+!! wikitext
<ref>Foo</ref> {{echo|<references />}}
-!!result
+!! html
<span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> <ol class="references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> Foo</li></ol>
!!end
References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
!! options
parsoid
-!! input
+!! wikitext
A <ref>foo bar for a</ref>
-B <ref name="b" />
+B <ref group="X" name="b" />
<references />
-<references>
+<references group="X">
<ref name="b">foo</ref>
</references>
-!! result
-<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>foo bar for a</ref>"}'><a href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref name=\"b\" />"}'><a href="#cite_note-b-2">[2]</a></span></p>
-
-
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-parsoid='{"src":"<references />"}' data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li>
-<li about="#cite_note-b-2" id="cite_note-b-2" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li></ol>
+!! html
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>foo bar for a</ref>"}'><a href="#cite_note-2" data-parsoid="{}">[2]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}' id="cite_ref-b-3-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref name=\"b\" group=\"X\" />"}'><a href="#cite_note-b-3" data-parsoid="{}">[X 1]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-parsoid='{"src":"<references />"}' data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-b-1" id="cite_note-b-1" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}">↑</span> foo</li><li about="#cite_note-2" id="cite_note-2" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-2-0" data-parsoid="{}">↑</a></span> foo bar for a</li></ol>
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-parsoid='{"src":"<references>\n<ref name=\"b\">foo</ref>\n</references>"}' data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"reference\" data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}' rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-b-3\">[1]</a></span>\n"},"attrs":{}}'>
-<li about="#cite_note-b-3" id="cite_note-b-3" data-parsoid="{}"><span rel="mw:referencedBy">↑</span> foo</li>
-</ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-parsoid='{"src":"<references group=\"X\">\n<ref name=\"b\">foo</ref>\n</references>","group":"X"}' data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"reference\" data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}' rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-b-1\">[1]</a></span>\n"},"attrs":{"group":"X"}}'><li about="#cite_note-b-3" id="cite_note-b-3" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-b-3-0" data-parsoid="{}">↑</a></span> </li></ol>
!! end
# This test is wt2html only because we're permitting the serializer to produce
Generate references for unclosed references tag
!! options
parsoid=wt2html
-!! input
+!! wikitext
a<ref>foo</ref>
<references>
-!! result
+!! html
<p data-parsoid='{}'>a<span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>foo</ref>"}'><a href="#cite_note-1" data-parsoid="{}">[1]</a></span></p>
New reference serializes on its own line
!! options
parsoid=wt2wt,html2wt
-!! input
+!! wikitext
foo
<references />
-!! result
+!! html
foo<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
!! end
Headings: 0. Unnested
!! options
parsoid
-!! input
+!! wikitext
<nowiki>=foo=</nowiki>
<nowiki> =foo= </nowiki>
<nowiki>=foo=</nowiki>
=foo''a''<nowiki>=</nowiki>
-!! result
+!! html
<p><span typeof="mw:Nowiki">=foo=</span></p>
<p><span typeof="mw:Nowiki"> =foo= </span>
(New headings and existing headings are handled differently)
!! options
parsoid=html2wt
-!! input
+!! wikitext
= =foo= =
== =foo= ==
=====<nowiki>=foo=</nowiki>=====
======<nowiki>=foo=</nowiki>======
-!! result
+!! html
<h1>=foo=</h1>
<h2>=foo=</h2>
<h3>=foo=</h3>
Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
!! options
parsoid=html2wt
-!! input
+!! wikitext
= foo =
<nowiki>*</nowiki>bar
= foo =
<nowiki>=bar=</nowiki>
-!! result
+!! html
<h1>foo</h1>*bar
<h1>foo</h1>=bar
<h1>foo</h1>=bar=
Headings: 3. Nested inside html with wikitext split by html tags
!! options
parsoid=html2wt
-!! input
+!! wikitext
= ='''bold'''<nowiki>foo=</nowiki> =
-!! result
+!! html
<h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
!!end
Headings: 4a. No escaping needed (testing just h1 and h2)
!! options
parsoid=html2wt
-!! input
+!! wikitext
= =foo =
= foo= =
= ''=''foo= =
= <nowiki>=</nowiki> =
-!! result
+!! html
<h1>=foo</h1>
<h1>foo=</h1>
<h1> =foo= </h1>
Headings: 4b. No escaping needed (inside p-tags)
!! options
parsoid=html2wt
-!! input
+!! wikitext
===
=foo= x
=foo= <s></s>
-!! result
+!! html
<p>===
=foo= x
=foo= <s></s>
Headings: 5. Empty headings
!! options
parsoid
-!! input
+!! wikitext
=<nowiki/>=
==<nowiki/>==
=====<nowiki/>=====
======<nowiki/>======
-!! result
+!! html
<h1></h1>
<h2></h2>
<h3></h3>
Headings: 6a. Heading chars in SOL context (with trailing spaces)
!! options
parsoid
-!! input
+!! wikitext
<nowiki>=a=</nowiki>
<nowiki>=a=</nowiki>
<nowiki>=a=</nowiki>
<nowiki>=a=</nowiki>
-!! result
+!! html
<p>=a=</p>
<p>=a= </p>
<p>=a= </p>
Headings: 6b. Heading chars in SOL context (with trailing newlines)
!! options
parsoid
-!! input
+!! wikitext
<nowiki>=a=
b</nowiki>
<nowiki>=a=
b</nowiki>
-!! result
+!! html
<p>=a=
b</p>
<p>=a=
Headings: 6c. Heading chars in SOL context (leading newline break)
!! options
parsoid
-!! input
+!! wikitext
a
<nowiki>=b=</nowiki>
-!! result
+!! html
<p>a
=b=</p>
!!end
Headings: 6d. Heading chars in SOL context (with interspersed comments)
!! options
parsoid
-!! input
+!! wikitext
<!--c0--><nowiki>=a=</nowiki>
<!--c1--><nowiki>=a=</nowiki> <!--c2--> <!--c3-->
-!! result
+!! html
<p><!--c0-->=a=</p>
<p><!--c1-->=a= <!--c2--> <!--c3--></p>
!!end
Headings: 6d. Heading chars in SOL context (No escaping needed)
!! options
parsoid=html2wt
-!! input
+!! wikitext
=a=<div>b</div>
-!! result
+!! html
=a=<div>b</div>
!!end
!! test
Lists: 0. Outside nests
-!! input
+!! wikitext
<nowiki>*</nowiki>foo
<nowiki>#</nowiki>foo
-!! result
+!! html
<p>*foo
</p><p>#foo
</p>
!! test
Lists: 1. Nested inside html
-!! input
+!! wikitext
*<nowiki>*foo</nowiki>
*<nowiki>#foo</nowiki>
#<nowiki>:foo</nowiki>
#<nowiki>;foo</nowiki>
-!! result
+!! html
<ul>
<li>*foo
</li>
!! test
Lists: 2. Inside definition lists
-!! input
+!! wikitext
;<nowiki>;foo</nowiki>
;<nowiki>:foo</nowiki>
:bar
:<nowiki>:foo</nowiki>
-!! result
+!! html
<dl>
<dt>;foo
</dt>
!! test
Lists: 3. Only bullets at start of text should be escaped
-!! input
+!! wikitext
*<nowiki>*foo*bar</nowiki>
*<nowiki>*foo</nowiki>''it''*bar
-!! result
+!! html
<ul>
<li>*foo*bar
</li>
Lists: 4. No escapes needed
!! options
parsoid
-!! input
+!! wikitext
*foo*bar
*''foo''*bar
*[[Foo]]: bar
*[[Foo]]*bar
-!! result
+!! html
<ul>
<li>foo*bar
</li>
!! test
Lists: 5. No unnecessary escapes
-!! input
+!! wikitext
* bar <span><nowiki>[[foo]]</nowiki></span>
*=bar <span><nowiki>[[foo]]</nowiki></span>
*=bar <span>foo]]</span>=
* <s></s>: a
-!! result
+!! html
<ul>
<li> bar <span>[[foo]]</span>
</li>
Lists: 6. Escape bullets in SOL position
!! options
parsoid
-!! input
+!! wikitext
<!--cmt--><nowiki>*foo</nowiki>
-!! result
+!! html
<p><!--cmt--><span typeof="mw:Nowiki">*foo</span></p>
!!end
!! test
Lists: 7. Escape bullets in a multi-line context
-!! input
+!! wikitext
a
<nowiki>*</nowiki>b
-!! result
+!! html
<p>a
*b
</p>
HRs: 1. Single line
!! options
parsoid
-!! input
+!! wikitext
----<nowiki>----</nowiki>
----=foo=
----*foo
-!! result
+!! html
<hr><span typeof="mw:Nowiki">----</span>
<hr>=foo=
<hr>*foo
!! test
Tables: 1a. Simple example
-!! input
+!! wikitext
<nowiki>{|
|}</nowiki>
-!! result
+!! html
<p>{|
|}
</p>
!! test
Tables: 1b. No escaping needed
-!! input
+!! wikitext
!foo
-!! result
+!! html
<p>!foo
</p>
!! end
!! test
Tables: 1c. No escaping needed
-!! input
+!! wikitext
|foo
-!! result
+!! html
<p>|foo
</p>
!! end
!! test
Tables: 1d. No escaping needed
-!! input
+!! wikitext
|}foo
-!! result
+!! html
<p>|}foo
</p>
!! end
Tables: 2a. Nested in td
!! options
parsoid=html2wt
-!! input
+!! wikitext
{|
|<nowiki>foo|bar</nowiki>
|-
|x<div><nowiki>a|b</nowiki></div>
|}
-!! result
+!! html
<table><tbody><tr>
<td>foo|bar</td></tr>
<tr><td>x<div>a|b</div></td>
Tables: 2b. Nested in td
!! options
parsoid
-!! input
+!! wikitext
{|
|<nowiki>foo||bar</nowiki>
|''it''<nowiki>foo||bar</nowiki>
|}
-!! result
+!! html
<table><tbody><tr>
<td><span typeof="mw:Nowiki">foo||bar</span></td>
<td><i>it</i><span typeof="mw:Nowiki">foo||bar</span></td></tr></tbody></table>
Tables: 2c. Nested in td -- no escaping needed
!! options
parsoid
-!! input
+!! wikitext
{|
|foo!!bar
|}
-!! result
+!! html
<table><tbody><tr><td>foo!!bar
</td></tr></tbody></table>
Tables: 3a. Nested in th
!! options
parsoid
-!! input
+!! wikitext
{|
!foo!bar
|}
-!! result
+!! html
<table><tbody><tr><th>foo!bar
</th></tr></tbody></table>
Tables: 3b. Nested in th
!! options
parsoid
-!! input
+!! wikitext
{|
!<nowiki>foo!!bar</nowiki>
|}
-!! result
+!! html
<table>
<tbody><tr><th><span typeof="mw:Nowiki">foo!!bar</span></th></tr>
</tbody></table>
Tables: 3c. Nested in th -- no escaping needed
!! options
parsoid
-!! input
+!! wikitext
{|
!<nowiki>foo||bar</nowiki>
|}
-!! result
+!! html
<table><tbody><tr>
<th><span typeof="mw:Nowiki">foo||bar</span></th></tr></tbody></table>
!! end
Tables: 4a. Escape -
!! options
parsoid
-!! input
+!! wikitext
{|
!-bar
|-
|<nowiki>-bar</nowiki>
|}
-!! result
+!! html
<table><tbody>
<tr><th>-bar</th></tr>
<tr>
Tables: 4b. Escape +
!! options
parsoid
-!! input
+!! wikitext
{|
!+bar
|-
|<nowiki>+bar</nowiki>
|}
-!! result
+!! html
<table><tbody>
<tr><th>+bar</th></tr>
<tr>
Tables: 4c. No escaping needed
!! options
parsoid
-!! input
+!! wikitext
{|
|foo-bar
|foo+bar
|x
<div>a|b</div>
|}
-!! result
+!! html
<table><tbody>
<tr><td>foo-bar</td><td>foo+bar</td></tr>
<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
Tables: 4d. No escaping needed
!! options
parsoid
-!! input
+!! wikitext
{|
|[[Foo]]-bar
||+1
||-2
|}
-!! result
+!! html
<table>
<tbody><tr><td><a rel="mw:WikiLink" href="./Foo">Foo</a>-bar</td>
<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
Tables: Digest broken attributes on table and tr tag
!! options
parsoid=wt2html
-!! input
+!! wikitext
{| || |} ++
|- || || ++ --
+|- > [
|}
-!! result
+!! html
<table>
<tbody>
<tr></tr>
+<tr></tr>
</tbody></table>
!! end
Links 1. Quote marks in link text
!! options
parsoid
-!! input
+!! wikitext
[[Foo|Foo<nowiki>''boo''</nowiki>]]
-!! result
+!! html
<a rel="mw:WikiLink" href="Foo">Foo''boo''</a>
!! end
Links 2. WikiLinks: Escapes needed
!! options
parsoid
-!! input
+!! wikitext
[[Foo|[Foobar]]]
[[Foo|<nowiki>Foobar]</nowiki>]]
[[Foo|x [Foobar] x]]
[[Foo|<nowiki>x [[ y</nowiki>]]
[[Foo|<nowiki>x ]] y</nowiki>]]
[[Foo|<nowiki>x ]] y [[ z</nowiki>]]
-!! result
+!! html
<a href="Foo" rel="mw:WikiLink">[Foobar]</a>
<a href="Foo" rel="mw:WikiLink">Foobar]</a>
<a href="Foo" rel="mw:WikiLink">x [Foobar] x</a>
Links 3. WikiLinks: No escapes needed
!! options
parsoid
-!! input
+!! wikitext
[[Foo|[Foobar]]
[[Foo|foo|bar]]
-!! result
+!! html
<a href="Foo" rel="mw:WikiLink">[Foobar</a>
<a href="Foo" rel="mw:WikiLink">foo|bar</a>
!! end
Links 4. ExtLinks: Escapes needed
!! options
parsoid
-!! input
+!! wikitext
[http://google.com <nowiki>[google]</nowiki>]
[http://google.com <nowiki>google]</nowiki>]
<nowiki>[http://google.com google]</nowiki>
-!! result
+!! html
<p><a href="http://google.com" rel="mw:ExtLink">[google]</a>
<a href="http://google.com" rel="mw:ExtLink">google]</a></p>
<p>[http://google.com]</p>
Links 5. ExtLinks: No escapes needed
!! options
parsoid
-!! input
+!! wikitext
[http://google.com [google]
-!! result
+!! html
<a href="http://google.com" rel="mw:ExtLink">[google</a>
!! end
1. Quotes inside <b> and <i>
!! options
parsoid=html2wt,wt2wt
-!! input
+!! wikitext
''<nowiki>'foo'</nowiki>''
''<nowiki>''foo''</nowiki>''
''<nowiki>'''foo'''</nowiki>''
'<nowiki/>'''foo'''<nowiki/>'
''fools'<span> errand</span>''
''<span>fool</span>'s errand''
-!! result
+!! html
<p><i>'foo'</i>
<i>''foo''</i>
<i>'''foo'''</i>
!! test
2. Link fragments separated by <i> and <b> tags
-!! input
+!! wikitext
[[''foo''<nowiki>hello]]</nowiki>
[['''foo'''<nowiki>hello]]</nowiki>
-!! result
+!! html
<p>[[<i>foo</i>hello]]
</p><p>[[<b>foo</b>hello]]
</p>
3. Link fragments inside <i> and <b>
(FIXME: Escaping one or both of [[ and ]] is also acceptable --
this is one of the shortcomings of this format)
-!! input
+!! wikitext
''[[foo''<nowiki>]]</nowiki>
'''[[foo'''<nowiki>]]</nowiki>
-!! result
+!! html
<p><i>[[foo</i>]]
</p><p><b>[[foo</b>]]
</p>
!! test
4. No escaping needed
-!! input
+!! wikitext
'<span>''bar''</span>'
'<span>'''bar'''</span>'
-!! result
+!! html
<p>'<span><i>bar</i></span>'
'<span><b>bar</b></span>'
</p>
!! test
1. No unnecessary escapes
-!! input
+!! wikitext
bar <span><nowiki>[[foo]]</nowiki></span>
=bar <span><nowiki>[[foo]]</nowiki></span>
]]bar <span><nowiki>[[foo]]</nowiki></span>
=bar <span>foo]]</span><nowiki>=</nowiki>
-!! result
+!! html
<p>bar <span>[[foo]]</span>
</p><p>=bar <span>[[foo]]</span>
</p><p>[[bar <span>[[foo]]</span>
1. Leading whitespace in SOL context should be escaped
!! options
parsoid
-!! input
+!! wikitext
<nowiki> </nowiki>a
<nowiki> </nowiki> a
a
<nowiki> </nowiki> b
-!! result
+!! html
<p> a</p>
<p> a</p>
<p> a(tab)</p>
1. Valid behavior switches should be escaped
!! options
parsoid=html2wt
-!! input
+!! wikitext
<nowiki>__TOC__</nowiki>
-!! result
+!! html
__TOC__
!! end
2. Invalid behavior switches should not be escaped
!! options
parsoid=html2wt
-!! input
+!! wikitext
__TOO__
__|__
-!! result
+!! html
__TOO__
__|__
!! end
1. a tags
!! options
parsoid
-!! input
+!! wikitext
<a href="http://google.com">google</a>
-!! result
+!! html
<a href="http://google.com">google</a>
!! end
!! test
2. other tags
-!! input
+!! wikitext
<nowiki><div>foo</div>
<div style="color:red">foo</div></nowiki>
-!! result
+!! html
<p><div>foo</div>
<div style="color:red">foo</div>
</p>
!! test
3. multi-line html tag
-!! input
+!! wikitext
<nowiki><div
>foo</div
></nowiki>
-!! result
+!! html
<p><div
>foo</div
>
!! test
4. extension tags
-!! input
+!! wikitext
<nowiki><ref>foo</ref></nowiki>
<nowiki><ref>bar</nowiki>
baz<nowiki></ref></nowiki>
-!! result
+!! html
<p><ref>foo</ref>
</p><p><ref>bar
</p><p>baz</ref>
#### --------------- Others ---------------
!! test
Escaping nowikis
-!! input
+!! wikitext
<nowiki>foo</nowiki>
-!! result
+!! html
<p><nowiki>foo</nowiki>
</p>
!! end
(Bug 52035) Nowiki-escaping should not get tripped by " :" in text
!! options
parsoid=wt2wt,html2wt
-!! input
+!! wikitext
foo's bar :
-!! result
+!! html
<p>foo's bar :</p>
!! end
!! test
Tag-like HTML structures are passed through as text
-!! input
+!! wikitext
<x y>
<x.y>
a>b
1<d e>f
-!! result
+!! html
<p><x y>
</p><p><x.y>
</p><p><x-y>
# https://bugzilla.wikimedia.org/show_bug.cgi?id=17663)
!! test
Tag names followed by punctuation should not be recognized as tags
-!! input
+!! wikitext
<s.ome> text
-!! result
+!! html
<p><s.ome> text
</p>
!! end
!! test
HTML tag with necessary entities in attributes
-!! input
+!! wikitext
<span title="&amp;">foo</span>
-!! result
+!! html
<p><span title="&amp;">foo</span>
</p>
!! end
!! test
HTML tag with 'unnecessary' entity encoding in attributes
-!! input
+!! wikitext
<span title="&">foo</span>
-!! result
+!! html
<p><span title="&">foo</span>
</p>
!! end
!! test
HTML tag with broken attribute value quoting
-!! input
+!! wikitext
<span title="Hello world>Foo</span>
-!! result
+!! html
<p><span>Foo</span>
</p>
!! end
Parsoid-only: HTML tag with broken attribute value quoting
!! options
parsoid
-!! input
+!! wikitext
<span title="Hello world>Foo</span>
-!! result
+!! html
<p><span title="Hello world">Foo</span>
</p>
!! end
!! test
Table with broken attribute value quoting
-!! input
+!! wikitext
{|
| title="Hello world|Foo
|}
-!! result
+!! html
<table>
<tr>
<td>Foo
!! test
Table with broken attribute value quoting on consecutive lines
-!! input
+!! wikitext
{|
| title="Hello world|Foo
| style="color:red|Bar
|}
-!! result
+!! html
<table>
<tr>
<td>Foo
Parsoid-only: Table with broken attribute value quoting on consecutive lines
!! options
parsoid
-!! input
+!! wikitext
{|
| title="Hello world|Foo
| style="color:red|Bar
|}
-!! result
+!! html
<table><tbody>
<tr>
<td title="Hello world">Foo
Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
!! options
parsoid
-!! input
+!! wikitext
{{}}
-!! result
+!! html
{{}}
!! end
Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
!! options
parsoid
-!! input
+!! wikitext
}}{{
-!! result
+!! html
}}{{
!! end
!!test
Accept empty td cell attribute
-!!input
+!! wikitext
{|
| align="center" | foo || |
|}
-!!result
+!! html
<table>
<tr>
<td align="center"> foo </td>
!!test
Non-empty attributes in th-cells
-!!input
+!! wikitext
{|
! Foo !! style="color: red" | Bar
|}
-!!result
+!! html
<table>
<tr>
<th> Foo </th>
!!test
Accept empty attributes in th-cells
-!!input
+!! wikitext
{|
!| foo !!| bar
|}
-!!result
+!! html
<table>
<tr>
<th> foo </th>
!!test
Empty table rows go away
-!!input
+!! wikitext
{|
| Hello
| there
|- class="foo"
|-
|}
-!! result
+!! html
<table>
<tr>
<td> Hello
!!test
RT-ed inter-element separators should be valid separators
-!!input
+!! wikitext
{|
|- [[foo]]
|}
-!!result
+!! html
<table>
</table>
(Parsoid-only since PHP parser relies on Tidy for correct output)
!!options
parsoid
-!!input
+!! wikitext
{|
|<small>foo
bar
{|
|<small>foo<small>
|}
-!!result
+!! html
!!end
!!test
Empty TD followed by TD with tpl-generated attribute
-!!input
+!! wikitext
{|
|-
|
|{{echo|style='color:red'}}|foo
|}
-!!result
+!! html
<table>
<tr>
!!test
Indented table with an empty td
-!!input
+!! wikitext
{|
|-
|
|foo
|}
-!!result
+!! html
<table>
<tr>
(Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
!!options
parsoid
-!!input
+!! wikitext
{|
|-
{{echo|<tr><td>foo</td></tr>}}
|}
-!!result
+!! html
<table>
<tbody>
<tr></tr>
Empty TR followed by mixed-ws-comment line should RT correctly
!!options
parsoid
-!!input
+!! wikitext
{|
|-
<!--c-->
|-
<!--c--> <!--d-->
|}
-!!result
+!! html
<table>
<tbody>
<tr></tr>
Multi-line image caption generated by templates with/without trailing newlines
!!options
parsoid
-!!input
+!! wikitext
[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}]]
[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}\n\n]]
-!!result
+!! html
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a> <div class="thumbcaption">foo\nA\nB\nC</div></div></div>
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a> <div class="thumbcaption">foo\nA\nB\nC\n\n</div></div></div>
Improperly nested inline or quotes tags with whitespace in between
!!options
parsoid
-!!input
+!! wikitext
<span> <s>x</span> </s>
''' ''x''' ''
-!!result
+!! html
<p><span> <s>x</s></span><s> </s>
<b> <i>x</i></b><i> </i>
</p>
Encapsulate protected attributes from wt
!!options
parsoid
-!!input
+!! wikitext
<div typeof="mw:placeholder stuff" data-parsoid="weird" data-parsoid-other="no" about="time" rel="mw:true">foo</div>
-!!result
+!! html
<body><div data-x-typeof="mw:placeholder stuff" data-x-data-parsoid="weird" data-x-data-parsoid-other="no" data-x-about="time" data-x-rel="mw:true">foo</div>
</body>
!!end
Ensure ParagraphWrapper can deal with stray closing pre tags
!!options
parsoid=wt2html
-!!input
+!! wikitext
plain text</pre>
-!!result
+!! html
plain text
!!end
1. Ensure fostered text content is wrapped in spans
!!options
parsoid=wt2html
-!!input
+!! wikitext
<table>hi</table><table>ho</table>
-!!result
+!! html
<span>hi</span>
<table></table>
<span>ho</span>
2. Ensure fostered text content is wrapped in spans (traps regressions around fostered marker on the span getting lost)
!!options
parsoid=wt2html,wt2wt
-!!input
+!! wikitext
<table>
<tr> || ||
<td> a
</table>
-!!result
+!! html
<span> || ||</span>
<table>
<tbody>
Encapsulation properly handles null DSR information from foster box
!!options
parsoid=wt2html,wt2wt
-!!input
+!! wikitext
{{echo|<table>foo<tr><td>bar</td></tr></table>}}
-!!result
+!! html
<span typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"
<table>foo
<tr>
1. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
<table>{{echo|foo<tr><td>bar</td></tr>}}</table>
-!!result
+!! html
<span typeof="mw:Transclusion" data-mw="{"parts":["
<table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo
<tr>
2. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
<table><div>{{echo|foo}}</div><tr><td>bar</td></tr></table>
-!!result
+!! html
<div typeof="mw:Transclusion" data-mw="{"parts":["
<table>
<div>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}},"</div>
3. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
<table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
-!!result
+!! html
<div typeof="mw:Transclusion" data-mw="{"parts":["
<table>
<div>
4. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
<table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
-!!result
+!! html
<div typeof="mw:Transclusion" data-mw="{"parts":["
<table>
<div>
5. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
<table><tr><td><div><p>{{echo|foo</p></div></td>foo}}</tr></table>
-!!result
+!! html
<span typeof="mw:Transclusion" data-mw="{"parts":["
<table>
<tr>
6. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
<table><tr><td><div><p>{{echo|foo</p></div></td>foo</tr></table>}}<p>ok</p>
-!!result
+!! html
<span typeof="mw:Transclusion" data-mw="{"parts":["
<table>
<tr>
7. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
<table>{{echo|<p>foo</p>}}<td>bar</td></table>
-!!result
+!! html
<p typeof="mw:Transclusion" data-mw="{"parts":["
<table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"
<p>foo</p>"}},"i":0}},"
8. Encapsulate foster-parented transclusion content
!!options
parsoid=wt2wt,wt2html
-!!input
+!! wikitext
{{echo|a
}}{|{{echo|style='color:red'}}
|-
|b
|}
-!!result
+!! html
<p typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n"}},"i":0}}]}">a</p><span typeof="mw:Transclusion" data-mw="{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"style":{"wt":"'color:red'"}},"i":0}},"\n|-\n|b\n|}"]}">{{{1}}}</span>
<table>
<tbody>
Table in fosterable position
!!options
parsoid=wt2html,wt2wt
-!!input
+!! wikitext
{{OpenTable}}
<div>
{|
|}
</div>
|}
-!!result
+!! html
<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"OpenTable","href":"./Template:OpenTable"},"params":{},"i":0}},"\n<div>"]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[]]}'></div><span about="#mwt1" data-parsoid="{}">
</span>
<table about="#mwt1" data-parsoid='{"autoInsertedEnd":true}'></table>
Support <object> element with .data attribute
!!options
parsoid=html2wt
-!!input
+!! wikitext
<object data="test.swf"></object>
-!!result
+!! html
<object data="test.swf"></object>
!!end
Image: Modifying size of an image (1)
!! options
parsoid=html2wt
-!! input
+!! wikitext
[[Image:Foobar.jpg|200x200px]]
-!! result
+!! html
<p><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"230x230px"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/230px-Foobar.jpg" height="22" width="200" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"26","width":"230"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></span></p>
!!end
Image: Modifying size of an image (2)
!! options
parsoid=html2wt
-!! input
+!! wikitext
[[Image:Foobar.jpg|500x500px]]
-!! result
+!! html
<p><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"230x230px"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/230px-Foobar.jpg" height="100" width="500" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"26","width":"230"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></span></p>
!!end
Image: Modifying alignment of an image (bug 48665)
!! options
parsoid=html2wt
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb|caption|left]]
-!! result
+!! html
<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"caption"},{"ck":"right","ak":"right"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a><figcaption>caption</figcaption></figure>
!! end
Image: Modifying valign of an image (bug 49221)
!! options
parsoid=html2wt
-!! input
+!! wikitext
[[File:Foobar.jpg|20px|text-top]]
-!! result
+!! html
<p><span class="mw-valign-text-top" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"20px"},{"ck":"text_top","ak":"text-top"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" height="2" width="20" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"2","width":"20"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
!! end
Image: Modifying alt attribute of an image (bug 56400)
!! options
parsoid=html2wt
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|some caption|alt=some alternate edited text]]
-!! result
+!! html
<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"some caption"},{"ck":"alt","ak":"alt=some alternate text"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img alt="some alternate edited text" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180" data-parsoid='{"a":{"alt":"some alternate edited text","resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"alt":"alt=some alternate edited text","resource":"File:Foobar.jpg"}}'/></a><figcaption>some caption</figcaption></figure>
!!end
Image: Modifying caption of an image
!! options
parsoid=html2wt
-!! input
+!! wikitext
[[Image:Foobar.jpg|thumb|new caption]]
-!! result
+!! html
<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"original caption"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"20","width":"180"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a><figcaption>new caption</figcaption></figure>
!!end
Image: empty alt attribute (bug 48924)
!! options
parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|alt=|bar]]
-!! result
+!! html
<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"alt","ak":"alt="},{"ck":"caption","ak":"bar"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img alt="" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" height="25" width="220" data-parsoid='{"a":{"alt":"","resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"alt":"alt=","resource":"File:Foobar.jpg"}}'/></a><figcaption>bar</figcaption></figure>
!! end
Image: Block level image should have \n before and after
!! options
parsoid
-!! input
+!! wikitext
123
[[File:Foobar.jpg|right|thumb|150x150px]]
456
-!! result
+!! html
<p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a href="./File:Foobar.png"><img src="http://192.168.142.128/mw/images/thumb/b/bc/Foobar.png/131px-Foobar.png" width="131" height="150" resource="./File:Foobar.png" data-parsoid='{"a":{"resource":"./File:Foobar.png","width":"131"},"sa":{"resource":"File:Foobar.png","width":"150"}}'></a></figure><p>456</p>
!!end
content)
!! options
parsoid
-!! input
+!! wikitext
123
[[File:Foobar.jpg|right|thumb|150x150px]]
456
-!! result
+!! html
<p data-parsoid='{"dsr":[0,3,0,0]}'>123</p>
<figure class="mw-halign-right" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"right","ak":"right"},{"ck":"thumbnail","ak":"thumb"},{"ck":"width","ak":"150x150px"}],"dsr":[4,45,2,2]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"dsr":[6,43,null,null]}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/150px-Foobar.jpg" height="17" width="150" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"17","width":"150"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></figure>
<p data-parsoid='{"dsr":[46,49,0,0]}'>456</p>
Images: upright option (parsoid)
!! options
parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|thumb|upright|caption]]
[[File:Foobar.jpg|thumb|upright=0.5|caption]]
[[File:Foobar.jpg|thumb|500x500px|upright=0.5|caption]]
-!! result
+!! html
<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="19" width="170"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="19" width="170"/></a><figcaption>caption</figcaption></figure><figure typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="57" width="500"/></a><figcaption>caption</figcaption></figure>
!!end
Images: upright option is ignored on inline and frame images (parsoid)
!! options
parsoid
-!! input
+!! wikitext
[[File:Foobar.jpg|500x500px|upright=0.5|caption]]
-!! result
+!! html
<p><span typeof="mw:Image" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="57" width="500"/></a></span></p>
!!end
Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
!! options
parsoid=html2wt
-!! input
+!! wikitext
* foo
-!! result
+!! html
<ul>
<li><p>foo</p></li>
</ul>
Lists: Serialize correctly even when list tags has unneeded whitespace between tags
!! options
parsoid=html2wt
-!! input
+!! wikitext
* foo
-!! result
+!! html
<ul> <li>foo</li></ul>
!! end
Don't strip leading whitespace when handling indent-pre suppressing tags
!! options
parsoid=html2wt
-!! input
+!! wikitext
{|
| indented row
|}
</blockquote>
foo
<div>bar</div>
-!! result
+!! html
<table>
<tr><td> indented row</td></tr>
</table>
Strip leading whitespace when handling indent-pre inducing tags
!! options
parsoid=html2wt
-!! input
+!! wikitext
foo
<span>bar</span>
<div>
<span>foo</span>
</div>
-!! result
+!! html
<p>foo</p>
<span>bar</span>
Lists: Add space after bullets
!! options
parsoid=html2wt
-!! input
+!! wikitext
* foo
* bar
* <span> baz</span>
-!! result
+!! html
<ul>
<li>foo</li>
<li> bar</li>
</ul>
!! end
+!! test
+Lists: Dont insert newlines in a serialized list item.
+!! options
+parsoid=html2wt
+!! wikitext
+* a<br>b
+* c
+!! html
+<ul><li>a<br>b</li><li>c</li></ul>
+!! end
+
!! test
Headings: Add space before/after == (Bug 51744)
!! options
parsoid=html2wt
-!! input
+!! wikitext
== foo ==
== bar ==
== baz ==
== <span> baz</span> ==
-!! result
+!! html
<h2>foo</h2>
<h2> bar</h2>
<h2>baz </h2>
Parsoid: Serialize positional parameters with = in them as named parameter
!! options
parsoid=html2wt
-!! input
+!! wikitext
{{echo|1 = f=oo}}
{{echo|1 = f=oo|2 = bar}}
<!--Orig params with data-parsoid has heuristics for handling = chars-->
<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
{{echo|<nowiki>f=oo</nowiki>|bar}}
-!! result
+!! html
<p about="#mwt1" typeof="mw:Transclusion"
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}}]}'>foo</p>
Parsoid: Correctly serialize block-node children when they are a combination of text and p-nodes
!! options
parsoid=html2wt
-!! input
+!! wikitext
<div>a
b
</div>
b
</div>
-!! result
+!! html
<div>a<p>b</p></div>
<div>a
<p>b</p></div>
1. I/B quote minimization: wikitext-only tags should be combined
!! options
parsoid=html2wt
-!! input
+!! wikitext
''AB''
'''AB'''
'''''AB'''''
'''''AB'''''
-!! result
+!! html
<p><i>A</i><i>B</i></p>
<p><b>A</b><b>B</b></p>
<p><i>A</i><b><i>B</i></b></p>
2. I/B quote minimization: wikitext and html tags should not be combined
!! options
parsoid=html2wt
-!! input
+!! wikitext
''A''<i>B</i>
''A'''''<i>B</i>'''
-!! result
+!! html
<p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
<p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
!! end
3. I/B quote minimization: templated content stops minimization
!! options
parsoid=html2wt
-!! input
+!! wikitext
''A''{{echo|''B''}}
''A''{{echo|'''''B'''''}}
-!! result
+!! html
<p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"''B''"}},"i":0}}]}'>B</i>
<p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"'''''B'''''"}},"i":0}}]}'><i>B</i></b>
!! end
4. I/B quote minimization: new content should be mimimized with adjacent old content
!! options
parsoid=html2wt
-!! input
+!! wikitext
''AB''
'''AB'''
''A'''B'''''
-!! result
+!! html
<p><i>A</i><i data-parsoid='{}'>B</i></p>
<p><b data-parsoid='{}'>A</b><b>B</b></p>
<p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
Bug 54262: New entities
!! options
parsoid=html2wt
-!! input
+!! wikitext
foo
-!! result
+!! html
<span typeof="mw:Entity">foo</span>
!! end
Magic words
!! options
parsoid=html2wt
-!! input
+!! wikitext
__TOC__
__NOTOC__
__FORCETOC__
__NOEDITSECTION__
__NOTITLECONVERT__
__NOCONTENTCONVERT__
-!! result
+!! html
<meta property='mw:PageProp/toc' />
<meta property='mw:PageProp/notoc' />
<meta property='mw:PageProp/forcetoc' />
Consecutive <pre>s should not get merged
!! options
parsoid=html2wt,html2html
-!! input
+!! wikitext
a
b
f
-!! result
+!! html
<pre>a</pre><pre>b</pre>
<pre>c
Edited ISBN links not serializable as ISBN links should serialize as wikilinks
!! options
parsoid=html2wt
-!! input
+!! wikitext
[[Special:BookSources/1234567890|ISBN 1234567895]]
-!! result
+!! html
<a rel="mw:ExtLink" href="./Special:BookSources/1234567890">ISBN 1234567895</a>
!! end
Edited RFC links not serializable as RFC links should serialize as extlinks
!! options
parsoid=html2wt
-!! input
+!! wikitext
[//tools.ietf.org/html/rfc123 New RFC]
-!! result
+!! html
<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink">New RFC</a>
!! end
Edited PMID links not serializable as PMID links should serialize as extlinks
!! options
parsoid=html2wt
-!! input
+!! wikitext
[//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract New PMID]
-!! result
+!! html
<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink">New PMID</a>
!! end
Edited Redirect link should emit a non-piped wikitext link
!! options
parsoid=html2wt
-!! input
+!! wikitext
#REDIRECT [[Bar]]
-!! result
+!! html
<link rel="mw:PageProp/redirect" href="Bar" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./Foo"},"sa":{"href":"Foo"}}'>
!! end
*/
public function __call( $func, $args ) {
static $compatibility = array(
- 'assertInternalType' => 'assertType', // assertInternalType was added in phpunit 3.5.0
- 'assertNotInternalType' => 'assertNotType', // assertNotInternalType was added in phpunit 3.5.0
- 'assertInstanceOf' => 'assertType', // assertInstanceOf was added in phpunit 3.5.0
'assertEmpty' => 'assertEmpty2', // assertEmpty was added in phpunit 3.7.32
);
/* Stubs */
-class ResourceLoaderTestModule extends ResourceLoaderModule {}
+class ResourceLoaderTestModule extends ResourceLoaderModule {
+
+ protected $dependencies = array();
+ protected $group = null;
+ protected $source = 'local';
+ protected $targets = array( 'test' );
+
+ public function __construct( $options = array() ) {
+ foreach ( $options as $key => $value ) {
+ $this->$key = $value;
+ }
+ }
+
+ public function getDependencies() {
+ return $this->dependencies;
+ }
+
+ public function getGroup() {
+ return $this->group;
+ }
+
+ public function getSource() {
+ return $this->source;
+ }
+}
class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {}
*/
public function testSecureAndSplit() {
$this->setMwGlobals( array(
- 'wgLocalInterwiki' => 'localtestiw',
+ 'wgLocalInterwikis' => array( 'localtestiw' ),
'wgHooks' => array(
'InterwikiLoadPrefix' => array(
function ( $prefix, &$data ) {
--- /dev/null
+<?php
+
+/**
+ * @covers RCCacheEntryFactory
+ *
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
+ protected function setUp() {
+ parent::setUp();
+
+ $this->setMwGlobals( array(
+ 'wgArticlePath' => '/wiki/$1'
+ ) );
+ }
+
+ /**
+ * @dataProvider editChangeProvider
+ */
+ public function testNewFromRecentChange( $expected, $context, $messages,
+ $recentChange, $watched
+ ) {
+ $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
+ $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+
+ $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+
+ $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
+ $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
+ $this->assertEquals(
+ $expected['numberofWatchingusers'], $cacheEntry->numberofWatchingusers,
+ 'watching users'
+ );
+ $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+
+ $this->assertUserLinks( 'Mary', $cacheEntry );
+ $this->assertTitleLink( 'Xyz', $cacheEntry );
+
+ $this->assertQueryLink( 'cur', $expected['cur'], $cacheEntry->curlink, 'cur link' );
+ $this->assertQueryLink( 'prev', $expected['diff'], $cacheEntry->lastlink, 'prev link' );
+ $this->assertQueryLink( 'diff', $expected['diff'], $cacheEntry->difflink, 'diff link' );
+ }
+
+ public function editChangeProvider() {
+ return array(
+ array(
+ array(
+ 'title' => 'Xyz',
+ 'user' => 'Mary',
+ 'diff' => array( 'curid' => 5, 'diff' => 191, 'oldid' => 190 ),
+ 'cur' => array( 'curid' => 5, 'diff' => 0, 'oldid' => 191 ),
+ 'timestamp' => '21:21',
+ 'numberofWatchingusers' => 0,
+ 'unpatrolled' => false
+ ),
+ $this->getContext(),
+ $this->getMessages(),
+ $this->makeEditRecentChange(
+ 'Xyz',
+ $this->getTestUser(),
+ 5, // curid
+ 191, // thisid
+ 190, // lastid
+ '20131103212153',
+ 0, // counter
+ 0 // number of watching users
+ ),
+ false,
+ 'edit'
+ )
+ );
+ }
+
+ private function makeEditRecentChange( $title, $user, $curid, $thisid, $lastid,
+ $timestamp, $counter, $watchingUsers
+ ) {
+
+ $attribs = array_merge(
+ $this->getDefaultAttributes( $title, $timestamp ),
+ array(
+ 'rc_user' => $user->getId(),
+ 'rc_user_text' => $user->getName(),
+ 'rc_this_oldid' => $thisid,
+ 'rc_last_oldid' => $lastid,
+ 'rc_cur_id' => $curid
+ )
+ );
+
+ return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+ }
+
+ /**
+ * @dataProvider deleteChangeProvider
+ */
+ public function testNewForDeleteChange( $expected, $context, $messages, $recentChange, $watched ) {
+ $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
+ $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+
+ $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+
+ $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
+ $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
+ $this->assertEquals(
+ $expected['numberofWatchingusers'],
+ $cacheEntry->numberofWatchingusers, 'watching users'
+ );
+ $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+
+ $this->assertDeleteLogLink( $cacheEntry );
+ $this->assertUserLinks( 'Mary', $cacheEntry );
+
+ $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
+ $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
+ $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
+ }
+
+ public function deleteChangeProvider() {
+ return array(
+ array(
+ array(
+ 'title' => 'Abc',
+ 'user' => 'Mary',
+ 'timestamp' => '21:21',
+ 'numberofWatchingusers' => 0,
+ 'unpatrolled' => false
+ ),
+ $this->getContext(),
+ $this->getMessages(),
+ $this->makeLogRecentChange(
+ 'Abc',
+ $this->getTestUser(),
+ '20131103212153',
+ 0, // counter
+ 0 // number of watching users
+ ),
+ false,
+ 'delete'
+ )
+ );
+ }
+
+ private function makeLogRecentChange( $title, $user, $timestamp, $counter, $watchingUsers ) {
+ $attribs = array_merge(
+ $this->getDefaultAttributes( $title, $timestamp ),
+ array(
+ 'rc_cur_id' => 0,
+ 'rc_user' => $user->getId(),
+ 'rc_user_text' => $user->getName(),
+ 'rc_this_oldid' => 0,
+ 'rc_last_oldid' => 0,
+ 'rc_old_len' => null,
+ 'rc_new_len' => null,
+ 'rc_type' => 3,
+ 'rc_logid' => 25,
+ 'rc_log_type' => 'delete',
+ 'rc_log_action' => 'delete'
+ )
+ );
+
+ return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+ }
+
+ /**
+ * @dataProvider revUserDeleteProvider
+ */
+ public function testNewForRevUserDeleteChange( $expected, $context, $messages,
+ $recentChange, $watched
+ ) {
+ $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
+ $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+
+ $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+
+ $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
+ $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
+ $this->assertEquals(
+ $expected['numberofWatchingusers'],
+ $cacheEntry->numberofWatchingusers, 'watching users'
+ );
+ $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+
+ $this->assertRevDel( $cacheEntry );
+ $this->assertTitleLink( 'Zzz', $cacheEntry );
+
+ $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
+ $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
+ $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
+ }
+
+ public function revUserDeleteProvider() {
+ return array(
+ array(
+ array(
+ 'title' => 'Zzz',
+ 'user' => 'Mary',
+ 'diff' => '',
+ 'cur' => '',
+ 'timestamp' => '21:21',
+ 'numberofWatchingusers' => 0,
+ 'unpatrolled' => false
+ ),
+ $this->getContext(),
+ $this->getMessages(),
+ $this->makeDeletedEditRecentChange(
+ 'Zzz',
+ $this->getTestUser(),
+ '20131103212153',
+ 191, // thisid
+ 190, // lastid
+ '20131103212153',
+ 0, // counter
+ 0 // number of watching users
+ ),
+ false,
+ 'deletedrevuser'
+ )
+ );
+ }
+
+ private function makeDeletedEditRecentChange( $title, $user, $timestamp, $curid, $thisid,
+ $lastid, $counter, $watchingUsers
+ ) {
+ $attribs = array_merge(
+ $this->getDefaultAttributes( $title, $timestamp ),
+ array(
+ 'rc_user' => $user->getId(),
+ 'rc_user_text' => $user->getName(),
+ 'rc_deleted' => 5,
+ 'rc_cur_id' => $curid,
+ 'rc_this_oldid' => $thisid,
+ 'rc_last_oldid' => $lastid
+ )
+ );
+
+ return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
+ }
+
+ private function assertUserLinks( $user, $cacheEntry ) {
+ $this->assertTag(
+ array(
+ 'tag' => 'a',
+ 'attributes' => array(
+ 'class' => 'new mw-userlink'
+ ),
+ 'content' => $user
+ ),
+ $cacheEntry->userlink,
+ 'verify user link'
+ );
+
+ $this->assertTag(
+ array(
+ 'tag' => 'span',
+ 'attributes' => array(
+ 'class' => 'mw-usertoollinks'
+ ),
+ 'child' => array(
+ 'tag' => 'a',
+ 'content' => 'Talk',
+ )
+ ),
+ $cacheEntry->usertalklink,
+ 'verify user talk link'
+ );
+
+ $this->assertTag(
+ array(
+ 'tag' => 'span',
+ 'attributes' => array(
+ 'class' => 'mw-usertoollinks'
+ ),
+ 'child' => array(
+ 'tag' => 'a',
+ 'content' => 'contribs',
+ )
+ ),
+ $cacheEntry->usertalklink,
+ 'verify user tool links'
+ );
+ }
+
+ private function assertDeleteLogLink( $cacheEntry ) {
+ $this->assertTag(
+ array(
+ 'tag' => 'a',
+ 'attributes' => array(
+ 'href' => '/wiki/Special:Log/delete',
+ 'title' => 'Special:Log/delete'
+ ),
+ 'content' => 'Deletion log'
+ ),
+ $cacheEntry->link,
+ 'verify deletion log link'
+ );
+ }
+
+ private function assertRevDel( $cacheEntry ) {
+ $this->assertTag(
+ array(
+ 'tag' => 'span',
+ 'attributes' => array(
+ 'class' => 'history-deleted'
+ ),
+ 'content' => '(username removed)'
+ ),
+ $cacheEntry->userlink,
+ 'verify user link for change with deleted revision and user'
+ );
+ }
+
+ private function assertTitleLink( $title, $cacheEntry ) {
+ $this->assertTag(
+ array(
+ 'tag' => 'a',
+ 'attributes' => array(
+ 'href' => '/wiki/' . $title,
+ 'title' => $title
+ ),
+ 'content' => $title
+ ),
+ $cacheEntry->link,
+ 'verify title link'
+ );
+ }
+
+ private function assertQueryLink( $content, $params, $link ) {
+ $this->assertTag(
+ array(
+ 'tag' => 'a',
+ 'content' => $content
+ ),
+ $link,
+ 'assert query link element'
+ );
+
+ foreach ( $params as $key => $value ) {
+ $this->assertRegExp( '/' . $key . '=' . $value . '/', $link, "verify $key link params" );
+ }
+ }
+
+ private function makeRecentChange( $attribs, $counter, $watchingUsers ) {
+ $change = new RecentChange();
+ $change->setAttribs( $attribs );
+ $change->counter = $counter;
+ $change->numberofWatchingusers = $watchingUsers;
+
+ return $change;
+ }
+
+ private function getDefaultAttributes( $title, $timestamp ) {
+ return array(
+ 'rc_id' => 545,
+ 'rc_user' => 0,
+ 'rc_user_text' => '127.0.0.1',
+ 'rc_ip' => '127.0.0.1',
+ 'rc_title' => $title,
+ 'rc_namespace' => 0,
+ 'rc_timestamp' => $timestamp,
+ 'rc_cur_time' => $timestamp,
+ 'rc_old_len' => 212,
+ 'rc_new_len' => 188,
+ 'rc_comment' => '',
+ 'rc_minor' => 0,
+ 'rc_bot' => 0,
+ 'rc_type' => 0,
+ 'rc_patrolled' => 1,
+ 'rc_deleted' => 0,
+ 'rc_logid' => 0,
+ 'rc_log_type' => null,
+ 'rc_log_action' => '',
+ 'rc_params' => '',
+ 'rc_source' => 'mw.edit'
+ );
+ }
+
+ private function getTestUser() {
+ $user = User::newFromName( 'Mary' );
+
+ if ( !$user->getId() ) {
+ $user->addToDatabase();
+ }
+
+ return $user;
+ }
+
+ private function getMessages() {
+ return array(
+ 'cur' => 'cur',
+ 'diff' => 'diff',
+ 'hist' => 'hist',
+ 'enhancedrc-history' => 'history',
+ 'last' => 'prev',
+ 'blocklink' => 'block',
+ 'history' => 'Page history',
+ 'semicolon-separator' => '; ',
+ 'pipe-separator' => ' | '
+ );
+ }
+
+ private function getContext() {
+ $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
+
+ $context = new RequestContext();
+ $context->setTitle( $title );
+ $context->setLanguage( Language::factory( 'en' ) );
+
+ $user = $this->getTestUser();
+ $context->setUser( $user );
+
+ return $context;
+ }
+}
<?php
+
/**
* @group Database
*/
# move/move
$this->assertIRCComment(
- $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )->plain() . $sep . $this->user_comment,
+ $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )
+ ->plain() . $sep . $this->user_comment,
'move', 'move',
$move_params,
$this->user_comment
# move/move_redir
$this->assertIRCComment(
- $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )->plain() . $sep . $this->user_comment,
+ $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )
+ ->plain() . $sep . $this->user_comment,
'move', 'move_redir',
$move_params,
$this->user_comment
# protect/protect
$this->assertIRCComment(
- $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )->plain() . $sep . $this->user_comment,
+ $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )
+ ->plain() . $sep . $this->user_comment,
'protect', 'protect',
$protectParams,
$this->user_comment
# protect/modify
$this->assertIRCComment(
- $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )->plain() . $sep . $this->user_comment,
+ $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )
+ ->plain() . $sep . $this->user_comment,
'protect', 'modify',
$protectParams,
$this->user_comment
* @param $comment String (optional) A comment for the log action
* @param $msg String (optional) A message for PHPUnit :-)
*/
- protected function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
-
+ protected function assertIRCComment( $expected, $type, $action, $params,
+ $comment = null, $msg = ''
+ ) {
$logEntry = new ManualLogEntry( $type, $action );
$logEntry->setPerformer( $this->user );
$logEntry->setTarget( $this->title );
# Transform '$wgFooBar' links
array(
- '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
+ '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
'$wgFooBar', 'Testing basic $wgFooBar' ),
array(
- '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
+ '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
'$wgFooBar45', 'Testing $wgFooBar45 (with numbers)' ),
array(
- '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
+ '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
'$wgFoo_Bar', 'Testing $wgFoo_Bar (with underscore)' ),
# Icky variables that shouldn't link
--- /dev/null
+<?php
+
+class ResourceLoaderStartupModuleTest extends ResourceLoaderTestCase {
+
+ public static function provideGetModuleRegistrations() {
+ return array(
+ array( array(
+ 'msg' => 'Empty registry',
+ 'modules' => array(),
+ 'out' => '
+mw.loader.addSource( {
+ "local": {
+ "loadScript": "/w/load.php",
+ "apiScript": "/w/api.php"
+ }
+} );mw.loader.register( [] );'
+ ) ),
+ array( array(
+ 'msg' => 'Basic registry',
+ 'modules' => array(
+ 'test.blank' => new ResourceLoaderTestModule(),
+ ),
+ 'out' => '
+mw.loader.addSource( {
+ "local": {
+ "loadScript": "/w/load.php",
+ "apiScript": "/w/api.php"
+ }
+} );mw.loader.register( [
+ [
+ "test.blank",
+ "1388534400"
+ ]
+] );',
+ ) ),
+ array( array(
+ 'msg' => 'Group signature',
+ 'modules' => array(
+ 'test.blank' => new ResourceLoaderTestModule(),
+ 'test.group.foo' => new ResourceLoaderTestModule( array( 'group' => 'x-foo' ) ),
+ 'test.group.bar' => new ResourceLoaderTestModule( array( 'group' => 'x-bar' ) ),
+ ),
+ 'out' => '
+mw.loader.addSource( {
+ "local": {
+ "loadScript": "/w/load.php",
+ "apiScript": "/w/api.php"
+ }
+} );mw.loader.register( [
+ [
+ "test.blank",
+ "1388534400"
+ ],
+ [
+ "test.group.foo",
+ "1388534400",
+ [],
+ "x-foo"
+ ],
+ [
+ "test.group.bar",
+ "1388534400",
+ [],
+ "x-bar"
+ ]
+] );'
+ ) ),
+ array( array(
+ 'msg' => 'Different target (non-test should not be registered)',
+ 'modules' => array(
+ 'test.blank' => new ResourceLoaderTestModule(),
+ 'test.target.foo' => new ResourceLoaderTestModule( array( 'targets' => array( 'x-foo' ) ) ),
+ ),
+ 'out' => '
+mw.loader.addSource( {
+ "local": {
+ "loadScript": "/w/load.php",
+ "apiScript": "/w/api.php"
+ }
+} );mw.loader.register( [
+ [
+ "test.blank",
+ "1388534400"
+ ]
+] );'
+ ) ),
+ array( array(
+ 'msg' => 'Foreign source',
+ 'sources' => array(
+ 'example' => array(
+ 'loadScript' => 'http://example.org/w/load.php',
+ 'apiScript' => 'http://example.org/w/api.php',
+ ),
+ ),
+ 'modules' => array(
+ 'test.blank' => new ResourceLoaderTestModule( array( 'source' => 'example' ) ),
+ ),
+ 'out' => '
+mw.loader.addSource( {
+ "local": {
+ "loadScript": "/w/load.php",
+ "apiScript": "/w/api.php"
+ },
+ "example": {
+ "loadScript": "http://example.org/w/load.php",
+ "apiScript": "http://example.org/w/api.php"
+ }
+} );mw.loader.register( [
+ [
+ "test.blank",
+ "1388534400",
+ [],
+ null,
+ "example"
+ ]
+] );'
+ ) ),
+ array( array(
+ // This may seem like an edge case, but a plain MediaWiki core install
+ // with a few extensions installed is likely far more complex than this
+ // even, not to mention an install like Wikipedia.
+ // TODO: Make this even more realistic.
+ 'msg' => 'Advanced (everything combined)',
+ 'sources' => array(
+ 'example' => array(
+ 'loadScript' => 'http://example.org/w/load.php',
+ 'apiScript' => 'http://example.org/w/api.php',
+ ),
+ ),
+ 'modules' => array(
+ 'test.blank' => new ResourceLoaderTestModule(),
+ 'test.x.core' => new ResourceLoaderTestModule(),
+ 'test.x.util' => new ResourceLoaderTestModule( array(
+ 'dependencies' => array(
+ 'test.x.core',
+ ),
+ ) ),
+ 'test.x.foo' => new ResourceLoaderTestModule( array(
+ 'dependencies' => array(
+ 'test.x.core',
+ ),
+ ) ),
+ 'test.x.bar' => new ResourceLoaderTestModule( array(
+ 'dependencies' => array(
+ 'test.x.core',
+ 'test.x.util',
+ ),
+ ) ),
+ 'test.x.quux' => new ResourceLoaderTestModule( array(
+ 'dependencies' => array(
+ 'test.x.foo',
+ 'test.x.bar',
+ 'test.x.util',
+ ),
+ ) ),
+ 'test.group.foo.1' => new ResourceLoaderTestModule( array(
+ 'group' => 'x-foo',
+ ) ),
+ 'test.group.foo.2' => new ResourceLoaderTestModule( array(
+ 'group' => 'x-foo',
+ ) ),
+ 'test.group.bar.1' => new ResourceLoaderTestModule( array(
+ 'group' => 'x-bar',
+ ) ),
+ 'test.group.bar.2' => new ResourceLoaderTestModule( array(
+ 'group' => 'x-bar',
+ 'source' => 'example',
+ ) ),
+ 'test.target.foo' => new ResourceLoaderTestModule( array(
+ 'targets' => array( 'x-foo' ),
+ ) ),
+ 'test.target.bar' => new ResourceLoaderTestModule( array(
+ 'source' => 'example',
+ 'targets' => array( 'x-foo' ),
+ ) ),
+ ),
+ 'out' => '
+mw.loader.addSource( {
+ "local": {
+ "loadScript": "/w/load.php",
+ "apiScript": "/w/api.php"
+ },
+ "example": {
+ "loadScript": "http://example.org/w/load.php",
+ "apiScript": "http://example.org/w/api.php"
+ }
+} );mw.loader.register( [
+ [
+ "test.blank",
+ "1388534400"
+ ],
+ [
+ "test.x.core",
+ "1388534400"
+ ],
+ [
+ "test.x.util",
+ "1388534400",
+ [
+ "test.x.core"
+ ]
+ ],
+ [
+ "test.x.foo",
+ "1388534400",
+ [
+ "test.x.core"
+ ]
+ ],
+ [
+ "test.x.bar",
+ "1388534400",
+ [
+ "test.x.core",
+ "test.x.util"
+ ]
+ ],
+ [
+ "test.x.quux",
+ "1388534400",
+ [
+ "test.x.foo",
+ "test.x.bar",
+ "test.x.util"
+ ]
+ ],
+ [
+ "test.group.foo.1",
+ "1388534400",
+ [],
+ "x-foo"
+ ],
+ [
+ "test.group.foo.2",
+ "1388534400",
+ [],
+ "x-foo"
+ ],
+ [
+ "test.group.bar.1",
+ "1388534400",
+ [],
+ "x-bar"
+ ],
+ [
+ "test.group.bar.2",
+ "1388534400",
+ [],
+ "x-bar",
+ "example"
+ ]
+] );'
+ ) ),
+ );
+ }
+
+ /**
+ * @dataProvider provideGetModuleRegistrations
+ * @covers ResourceLoaderStartUpModule::getModuleRegistrations
+ */
+ public function testGetModuleRegistrations( $case ) {
+ if ( isset( $case['sources'] ) ) {
+ $this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
+ }
+
+ $context = self::getResourceLoaderContext();
+ $rl = $context->getResourceLoader();
+
+ $rl->register( $case['modules'] );
+
+ $this->assertEquals(
+ ltrim( $case['out'], "\n" ),
+ ResourceLoaderStartUpModule::getModuleRegistrations( $context ),
+ $case['msg']
+ );
+ }
+
+}
* @file
*/
-/* Configuration */
-
// Set a flag which can be used to detect when other scripts have been entered through this entry point or not
define( 'MW_PHPUNIT_TEST', true );
class PHPUnitMaintClass extends Maintenance {
- function __construct() {
+ public function __construct() {
parent::__construct();
$this->addOption( 'with-phpunitdir',
'Directory to include PHPUnit from, for example when using a git fetchout from upstream. Path will be prepended to PHP `include_path`.',
}
# --with-phpunitdir let us override the default PHPUnit version
- if ( $phpunitDir = $this->getOption( 'with-phpunitdir' ) ) {
+ if ( $this->hasOption( 'with-phpunitdir' ) ) {
+ $phpunitDir = $this->getOption( 'with-phpunitdir' );
# Sanity checks
if ( !is_dir( $phpunitDir ) ) {
$this->error( "--with-phpunitdir should be set to an existing directory", 1 );
# Now prepends provided PHPUnit directory
$this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
- set_include_path( $phpunitDir
- . PATH_SEPARATOR . get_include_path() );
+ set_include_path( $phpunitDir . PATH_SEPARATOR . get_include_path() );
# Cleanup $args array so the option and its value do not
# pollute PHPUnit
'test.sinonjs' => array(
'scripts' => array(
'resources/sinonjs/sinon-1.9.0.js',
- 'resources/sinonjs/sinon-ie-1.9.0.js',
+ // We want tests to work in IE, but can't include this as it
+ // will break the placeholders in Sinon because the hack it uses
+ // to hijack IE globals relies on running in the global scope
+ // and in ResourceLoader this won't be running in the global scope.
+ // Including it results (among other things) in sandboxed timers
+ // being broken due to Date inheritance being undefined.
+ // 'resources/sinonjs/sinon-ie-1.9.0.js',
),
'targets' => array( 'desktop', 'mobile' ),
),
'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
+ 'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
'mediawiki',
'mediawiki.api',
'mediawiki.api.parse',
+ 'mediawiki.api.watch',
'mediawiki.jqueryMsg',
'mediawiki.Title',
'mediawiki.Uri',
sinon.config = {
injectIntoThis: true,
injectInto: null,
- properties: ['spy', 'stub', 'mock', 'clock', 'sandbox'],
+ properties: ['spy', 'stub', 'mock', 'sandbox'],
// Don't fake timers by default
useFakeTimers: false,
useFakeServer: false
--- /dev/null
+( function ( mw ) {
+ QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
+ setup: function () {
+ this.clock = this.sandbox.useFakeTimers();
+ this.server = this.sandbox.useFakeServer();
+ },
+ teardown: function () {
+ this.clock.tick( 1 );
+ }
+ } ) );
+
+ QUnit.test( '.watch()', function ( assert ) {
+ QUnit.expect( 4 );
+
+ var api = new mw.Api();
+
+ // Ensure we don't mistake a single item array for a single item and vice versa.
+ // The query parameter in request is the same either way (separated by pipe).
+ api.watch( 'Foo' ).done( function ( item ) {
+ assert.equal( item.title, 'Foo' );
+ } );
+
+ api.watch( [ 'Foo' ] ).done( function ( items ) {
+ assert.equal( items[0].title, 'Foo' );
+ } );
+
+ api.watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
+ assert.equal( items[0].title, 'Foo' );
+ assert.equal( items[1].title, 'Bar' );
+ } );
+
+ // Requests are POST, match requestBody instead of url
+ this.server.respond( function ( req ) {
+ if ( /action=watch.*&titles=Foo(&|$)/.test( req.requestBody ) ) {
+ req.respond( 200, { 'Content-Type': 'application/json' },
+ '{ "watch": [ { "title": "Foo", "watched": true, "message": "<b>Added</b>" } ] }'
+ );
+ }
+
+ if ( /action=watch.*&titles=Foo%7CBar/.test( req.requestBody ) ) {
+ req.respond( 200, { 'Content-Type': 'application/json' },
+ '{ "watch": [ ' +
+ '{ "title": "Foo", "watched": true, "message": "<b>Added</b>" },' +
+ '{ "title": "Bar", "watched": true, "message": "<b>Added</b>" }' +
+ '] }'
+ );
+ }
+ } );
+ } );
+}( mediaWiki ) );
$this->lineNum++;
$matches = array();
- if ( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
+ if ( preg_match( '/^!!\s*(\S+)/', $line, $matches ) ) {
$this->section = strtolower( $matches[1] );
if ( $this->section == 'endarticle' ) {
if ( $this->section == 'end' ) {
$this->checkSection( 'test' );
- $this->checkSection( 'input' );
- $this->checkSection( 'result' );
+ // "input" and "result" are old section names allowed
+ // for backwards-compatibility.
+ $input = $this->checkSection( array( 'wikitext', 'input' ), false );
+ $result = $this->checkSection( array( 'html/php', 'html/*', 'html', 'result' ), false );
if ( !isset( $this->sectionData['options'] ) ) {
$this->sectionData['options'] = '';
$this->sectionData['config'] = '';
}
- if ( ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
- || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runParsoid )
+ if ( $input == false || $result == false ||
+ ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
+ || ( preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && $result != 'html/php' && !$this->parserTest->runParsoid )
|| !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) )
) {
# disabled test
$this->test = array(
'test' => ParserTest::chomp( $this->sectionData['test'] ),
- 'input' => ParserTest::chomp( $this->sectionData['input'] ),
- 'result' => ParserTest::chomp( $this->sectionData['result'] ),
+ 'input' => ParserTest::chomp( $this->sectionData[ $input ] ),
+ 'result' => ParserTest::chomp( $this->sectionData[ $result ] ),
'options' => ParserTest::chomp( $this->sectionData['options'] ),
'config' => ParserTest::chomp( $this->sectionData['config'] ),
);
/**
* Verify the current section data has some value for the given token
- * name (first parameter).
+ * name(s) (first parameter).
* Throw an exception if it is not set, referencing current section
* and adding the current file name and line number
*
- * @param $token String: expected token that should have been mentionned before closing this section
+ * @param $token String|Array: expected token(s) that should have been
+ * mentioned before closing this section
+ * @param $fatal Boolean: true iff an exception should be thrown if
+ * the section is not found.
*/
- private function checkSection( $token ) {
+ private function checkSection( $tokens, $fatal = true ) {
if ( is_null( $this->section ) ) {
throw new MWException( __METHOD__ . " can not verify a null section!\n" );
}
+ if ( !is_array( $tokens ) ) {
+ $tokens = array( $tokens );
+ }
+ if ( count( $tokens ) == 0 ) {
+ throw new MWException( __METHOD__ . " can not verify zero sections!\n" );
+ }
- if ( !isset( $this->sectionData[$token] ) ) {
+ $data = $this->sectionData;
+ $tokens = array_filter( $tokens, function ( $token ) use ( $data ) {
+ return isset( $data[ $token ] );
+ } );
+
+ if ( count( $tokens ) == 0 ) {
+ if ( !$fatal ) {
+ return false;
+ }
throw new MWException( sprintf(
"'%s' without '%s' at line %s of %s\n",
$this->section,
- $token,
+ implode( ',', $tokens ),
$this->lineNum,
$this->file
) );
}
- return true;
+ if ( count( $tokens ) > 1 ) {
+ throw new MWException( sprintf(
+ "'%s' with unexpected tokens '%s' at line %s of %s\n",
+ $this->section,
+ implode( ',', $tokens ),
+ $this->lineNum,
+ $this->file
+ ) );
+ }
+
+ $tokens = array_values( $tokens );
+ return $tokens[ 0 ];
}
}