-Security reminder: If you have PHP's register_globals option set, you should
-turn it off. Although MediaWiki will work with it enabled, it exposes your
-server to potential security vulnerabilities.
+Security reminder: If you have PHP's register_globals option set, you must
+turn it off. MediaWiki will no longer work with it enabled.
== MediaWiki 1.24 ==
production.
=== Configuration changes in 1.24 ===
+* MediaWiki will no longer run if register_globals is enabled. It has been
+ deprecated for 5 years now, and was removed in PHP 5.4. For more information
+ about why, see <https://www.mediawiki.org/wiki/register_globals>.
* The server's canonical hostname is available as $wgServerName, which is
exposed in both mw.config and ApiQuerySiteInfo.
* Introduced $wgPagePropsHaveSortkey as a backwards-compatibility switch,
prefixes (i.e. turned into interlanguage links when $wgInterwikiMagic is set
to true).
* $wgParserTestRemote has been removed.
+* $wgCountTotalSearchHits has been removed. If you're concerned about efficiency
+ of search, you should use something like CirrusSearch instead of built in
+ search.
+* Users in the 'sysop' group have access to Special:MergeHistory by default.
=== New features in 1.24 ===
* Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
The feature needs to be enabled with $wgPageLanguageUseDB=true and
permission needs to be set for 'pagelang'.
* Upgrade Moment.js to v2.7.0.
+* (bug 67042) Added support for the HTML5 <rtc> tag for East Asian typography.
=== Bug fixes in 1.24 ===
* (bug 49116) Footer copyright notice is now always displayed in user language
set of hooks has been removed and replaced by a single new hook
SpecialPageBeforeFormDisplay.
* (bug 65781) Removed block warning on included {{Special:Contributions}}
+* Removed Skin::makeGlobalVariablesScript. (deprecated since 1.19)
+* Removed MWNamespace::isMain(). (deprecated since 1.19)
+* Removed Preferences::loadOldSearchNs(). (deprecated since 1.19)
+* Removed OutputPage::getStatusMessage(). (deprecated since 1.18)
+* Removed OutputPage::isUserJsAllowed(). (deprecated since 1.18)
+* Removed Title::updateTitleProtection(). (deprecated since 1.19)
+* Removed ParserOptions::setSkin(). (deprecated since 1.19)
+* Removed Title::escapeCanonicalURL(). (deprecated since 1.19)
+* Removed Title::escapeLocalURL(). (deprecated since 1.19)
+* Removed Title::escapeFullURL(). (deprecated since 1.19)
+* Removed User::isValidEmailAddr(). (deprecated since 1.18)
+* Removed Title::getEscapedText(). (deprecated since 1.19)
+* Removed Language::getFallbackLanguageCode(). (deprecated since 1.19)
+* Removed WikiPage::isBigDeletion(). (deprecated since 1.19)
==== Renamed classes ====
* CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
define( 'MW_API', true );
// Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
wfPHPVersionError( 'api.php' );
'MagicWordwgVariableIDs': When defining new magic words IDs.
$variableIDs: array of strings
-'MakeGlobalVariablesScript': Called right before Skin::makeVariablesScript is
-executed. Ideally, this hook should only be used to add variables that depend on
+'MakeGlobalVariablesScript': Called at end of OutputPage::getJSVars.
+Ideally, this hook should only be used to add variables that depend on
the current page/request; static configuration should be added through
ResourceLoaderGetConfigVars instead.
&$vars: variable (or multiple variables) to be added into the output of
$title: name of the page changed.
$text: new contents of the page.
+'MimeMagicInit': Before processing the list mapping MIME types to media types
+and the list mapping MIME types to file extensions.
+As an extension author, you are encouraged to submit patches to MediaWiki's
+core to add new MIME types to mime.types.
+$mimeMagic: Instance of MimeMagic.
+ Use $mimeMagic->addExtraInfo( $stringOfInfo );
+ for adding new MIME info to the list.
+ Use $mimeMagic->addExtraTypes( $stringOfTypes );
+ for adding new MIME types to the list.
+
+'MimeMagicImproveFromExtension': Allows MW extensions to further improve the
+MIME type detected by considering the file extension.
+$mimeMagic: Instance of MimeMagic.
+$ext: File extension.
+&$mime: MIME type (in/out).
+
+'MimeMagicGuessFromContent': Allows MW extensions guess the MIME by content.
+$mimeMagic: Instance of MimeMagic.
+&$head: First 1024 bytes of the file in a string (in - Do not alter!).
+&$tail: More or equal than last 65558 bytes of the file in a string
+ (in - Do not alter!).
+$file: File path.
+&$mime: MIME type (out).
+
'ModifyExportQuery': Modify the query used by the exporter.
$db: The database object to be queried.
&$tables: Tables in the query.
$this->getId(),
$lang->formatExpiry( $this->mExpiry ),
(string)$intended,
- $lang->timeanddate( wfTimestamp( TS_MW, $this->mTimestamp ), true ),
+ $lang->userTimeAndDate( $this->mTimestamp, $context->getUser() ),
);
}
}
300
);
+/**
+ * When defined, is an array of image widths used as buckets for thumbnail generation.
+ * The goal is to save resources by generating thumbnails based on reference buckets instead of
+ * always using the original. This will incur a speed gain but cause a quality loss.
+ *
+ * The buckets generation is chained, with each bucket generated based on the above bucket
+ * when possible. File handlers have to opt into using that feature. For now only BitmapHandler
+ * supports it.
+ */
+$wgThumbnailBuckets = null;
+
+/**
+ * When using thumbnail buckets as defined above, this sets the minimum distance with the bucket
+ * above the requested size. The distance represents how pany extra pixels of width the bucket needs
+ * in order to be used as the reference for a given thumbnail. For example, with the following buckets:
+ *
+ * $wgThumbnailBuckets = array ( 128, 256, 512 );
+ *
+ * and a distance of 50:
+ *
+ * $wgThumbnailMinimumBucketDistance = 50;
+ *
+ * If we want to render a thumbnail of width 220px, the 512px bucket will be used,
+ * because 220 + 50 = 270 and the closest bucket bigger than 270px is 512.
+ */
+$wgThumbnailMinimumBucketDistance = 0;
+
/**
* Default parameters for the "<gallery>" tag
*/
*/
$wgCacheEpoch = '20030516000000';
+/**
+ * Directory where GitInfo will look for pre-computed cache files. If false,
+ * $wgCacheDirectory/gitinfo will be used.
+ */
+$wgGitInfoCacheDirectory = false;
+
/**
* Bump this number when changing the global style sheets and JavaScript.
*
$wgGroupPermissions['sysop']['suppressredirect'] = true;
#$wgGroupPermissions['sysop']['pagelang'] = true;
#$wgGroupPermissions['sysop']['upload_by_url'] = true;
-#$wgGroupPermissions['sysop']['mergehistory'] = true;
+$wgGroupPermissions['sysop']['mergehistory'] = true;
// Permission to change users' group assignments
$wgGroupPermissions['bureaucrat']['userrights'] = true;
*/
$wgSearchHighlightBoundaries = '[\p{Z}\p{P}\p{C}]';
-/**
- * Set to true to have the search engine count total
- * search matches to present in the Special:Search UI.
- * Not supported by every search engine shipped with MW.
- *
- * This could however be slow on larger wikis, and is pretty flaky
- * with the current title vs content split. Recommend avoiding until
- * that's been worked out cleanly; but this may aid in testing the
- * search UI and API to confirm that the result count works.
- */
-$wgCountTotalSearchHits = false;
-
/**
* Template for OpenSearch suggestions, defaults to API action=opensearch
*
*/
public function __construct( $repoDir, $usePrecomputed = true ) {
$this->cacheFile = self::getCacheFilePath( $repoDir );
+ wfDebugLog( 'gitinfo',
+ "Computed cacheFile={$this->cacheFile} for {$repoDir}"
+ );
if ( $usePrecomputed &&
$this->cacheFile !== null &&
is_readable( $this->cacheFile )
file_get_contents( $this->cacheFile ),
true
);
+ wfDebugLog( 'gitinfo', "Loaded git data from cache for {$repoDir}" );
}
if ( !$this->cacheIsComplete() ) {
+ wfDebugLog( 'gitinfo', "Cache incomplete for {$repoDir}" );
$this->basedir = $repoDir . DIRECTORY_SEPARATOR . '.git';
if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) {
$GITfile = file_get_contents( $this->basedir );
* Compute the path to the cache file for a given directory.
*
* @param string $repoDir The root directory of the repo where .git can be found
- * @return string Path to GitInfo cache file in $wgCacheDirectory or null if
- * $wgCacheDirectory is false (cache disabled).
+ * @return string Path to GitInfo cache file in $wgGitInfoCacheDirectory or
+ * null if $wgGitInfoCacheDirectory is false (cache disabled).
+ * @since 1.24
*/
protected static function getCacheFilePath( $repoDir ) {
- global $IP, $wgCacheDirectory;
- if ( $wgCacheDirectory ) {
- // Transform path to git repo to something we can safely embed in a filename
- $repoName = $repoDir;
- if ( strpos( $repoName, $IP ) === 0 ) {
+ global $IP, $wgGitInfoCacheDirectory;
+
+ if ( $wgGitInfoCacheDirectory ) {
+ // Convert both $IP and $repoDir to canonical paths to protect against
+ // $IP having changed between the settings files and runtime.
+ $realIP = realpath( $IP );
+ $repoName = realpath( $repoDir );
+ if ( $repoName === false ) {
+ // Unit tests use fake path names
+ $repoName = $repoDir;
+ }
+ if ( strpos( $repoName, $realIP ) === 0 ) {
// Strip $IP from path
- $repoName = substr( $repoName, strlen( $IP ) );
+ $repoName = substr( $repoName, strlen( $realIP ) );
}
+ // Transform path to git repo to something we can safely embed in
+ // a filename
$repoName = strtr( $repoName, DIRECTORY_SEPARATOR, '-' );
$fileName = 'info' . $repoName . '.json';
- return implode(
- DIRECTORY_SEPARATOR,
- array( $wgCacheDirectory, 'gitinfo', $fileName )
- );
+ return "{$wgGitInfoCacheDirectory}/{$fileName}";
}
return null;
}
$this->getRemoteUrl();
if ( !$this->cacheIsComplete() ) {
- wfDebugLog( "Failed to compute GitInfo for \"{$this->basedir}\"" );
+ wfDebugLog( 'gitinfo',
+ "Failed to compute GitInfo for \"{$this->basedir}\""
+ );
return;
}
/**
* Swap two variables
*
+ * @deprecated since 1.24
* @param mixed $x
* @param mixed $y
*/
function swap( &$x, &$y ) {
+ wfDeprecated( __FUNCTION__, '1.24' );
$z = $x;
$x = $y;
$y = $z;
* For instance, it will omit quotation marks if $wgWellFormedXml is false,
* and will treat boolean attributes specially.
*
- * Attributes that should contain space-separated lists (such as 'class') array
+ * Attributes that can contain space-separated lists ('class', 'accesskey' and 'rel') array
* values are allowed as well, which will automagically be normalized
* and converted to a space-separated string. In addition to a numerical
* array, the attribute value may also be an associative array. See the
* A value of false means to omit the attribute. For boolean attributes,
* you can omit the key, e.g., array( 'checked' ) instead of
* array( 'checked' => 'checked' ) or such.
+ *
+ * @throws MWException if an attribute that doesn't allow lists is set to an array
* @return string HTML fragment that goes between element name and '>'
* (starting with a space if at least one attribute is output)
*/
// Remove duplicates and create the string
$value = implode( ' ', array_unique( $value ) );
+ } else if ( is_array( $value ) ) {
+ throw new MWException( "HTML attribute $key can not contain a list of values" );
}
// See the "Attributes" section in the HTML syntax part of HTML5,
*/
protected $mIEAnalyzer;
+ /** @var string Extra MIME types, set for example by media handling extensions
+ */
+ private $mExtraTypes = '';
+
+ /** @var string Extra MIME info, set for example by media handling extensions
+ */
+ private $mExtraInfo = '';
+
/** @var MimeMagic The singleton instance
*/
private static $instance = null;
global $wgMimeTypeFile, $IP;
+ # Allow media handling extensions adding MIME-types and MIME-info
+ wfRunHooks( 'MimeMagicInit', array( $this ) );
+
$types = MM_WELL_KNOWN_MIME_TYPES;
if ( $wgMimeTypeFile == 'includes/mime.types' ) {
wfDebug( __METHOD__ . ": no mime types file defined, using build-ins only.\n" );
}
+ $types .= "\n" . $this->mExtraTypes;
+
$types = str_replace( array( "\r\n", "\n\r", "\n\n", "\r\r", "\r" ), "\n", $types );
$types = str_replace( "\t", " ", $types );
$this->mMimeToExt = array();
- $this->mToMime = array();
+ $this->mExtToMime = array();
$lines = explode( "\n", $types );
foreach ( $lines as $s ) {
wfDebug( __METHOD__ . ": no mime info file defined, using build-ins only.\n" );
}
+ $info .= "\n" . $this->mExtraInfo;
+
$info = str_replace( array( "\r\n", "\n\r", "\n\n", "\r\r", "\r" ), "\n", $info );
$info = str_replace( "\t", " ", $info );
return self::$instance;
}
+ /**
+ * Adds to the list mapping MIME to file extensions.
+ * As an extension author, you are encouraged to submit patches to
+ * MediaWiki's core to add new MIME types to mime.types.
+ * @param string $types
+ */
+ public function addExtraTypes( $types ) {
+ $this->mExtraTypes .= "\n" . $types;
+ }
+
+ /**
+ * Adds to the list mapping MIME to media type.
+ * As an extension author, you are encouraged to submit patches to
+ * MediaWiki's core to add new MIME info to mime.info.
+ * @param string $info
+ */
+ public function addExtraInfo( $info ) {
+ $this->mExtraInfo .= "\n" . $info;
+ }
+
/**
* Returns a list of file extensions for a given mime type as a space
* separated string or null if the mime type was unrecognized. Resolves
$mime = $this->guessTypesForExtension( $ext );
}
+ # Media handling extensions can improve the MIME detected
+ wfRunHooks( 'MimeMagicImproveFromExtension', array( $this, $ext, &$mime ) );
+
if ( isset( $this->mMimeTypeAliases[$mime] ) ) {
$mime = $this->mMimeTypeAliases[$mime];
}
return 'image/vnd.djvu';
}
- return false;
+ # Media handling extensions can guess the MIME by content
+ # It's intentionally here so that if core is wrong about a type (false positive),
+ # people will hopefully nag and submit patches :)
+ $mime = false;
+ # Some strings by reference for performance - assuming well-behaved hooks
+ wfRunHooks(
+ 'MimeMagicGuessFromContent',
+ array( $this, &$head, &$tail, $file, &$mime )
+ );
+
+ return $mime;
}
/**
return !self::isTalk( $index );
}
- /**
- * @see self::isSubject
- * @deprecated since 1.19 Please use the more consistently named isSubject
- * @return bool
- */
- public static function isMain( $index ) {
- wfDeprecated( __METHOD__, '1.19' );
- return self::isSubject( $index );
- }
-
/**
* Is the given namespace a talk namespace?
*
);
}
- /**
- * Return whether user JavaScript is allowed for this page
- * @deprecated since 1.18 Load modules with ResourceLoader, and origin and
- * trustworthiness is identified and enforced automagically.
- * @return bool
- */
- public function isUserJsAllowed() {
- wfDeprecated( __METHOD__, '1.18' );
- return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >=
- ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
- }
-
/**
* Show what level of JavaScript / CSS untrustworthiness is allowed on this page
* @see ResourceLoaderModule::$origin
}
}
- /**
- * Get the message associated with the HTTP response code $code
- *
- * @param int $code Status code
- * @return string|null Message or null if $code is not in the list of messages
- *
- * @deprecated since 1.18 Use HttpStatus::getMessage() instead.
- */
- public static function getStatusMessage( $code ) {
- wfDeprecated( __METHOD__, '1.18' );
- return HttpStatus::getMessage( $code );
- }
-
/**
* Finally, all the text has been munged and accumulated into
* the object, let's actually output it:
/**
* Get an array containing the variables to be set in mw.config in JavaScript.
*
- * DO NOT CALL THIS FROM OUTSIDE OF THIS CLASS OR Skin::makeGlobalVariablesScript().
- * This is only public until that function is removed. You have been warned.
- *
* Do not add things here which can be evaluated in ResourceLoaderStartUpModule
* - in other words, page-independent/site-wide variables (without state).
* You will only be adding bloat to the html page and causing page caches to
* have to be purged on configuration changes.
* @return array
*/
- public function getJSVars() {
+ private function getJSVars() {
global $wgContLang;
$curRevisionId = 0;
* - index.php
* - load.php
* - api.php
+ * - mw-config/index.php
* - cli
*
* @note Since we can't rely on anything, the minimum PHP versions and MW current
$mwVersion = '1.24';
$minimumVersionPHP = '5.3.2';
- $phpVersion = phpversion();
+ $phpVersion = PHP_VERSION;
$protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
$message = "MediaWiki $mwVersion requires at least "
. "PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
$finalOutput = "You are using PHP version $phpVersion "
. "but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n"
. "Check if you have a newer php executable with a different name, such as php5.\n";
- } elseif ( $type == 'index.php' ) {
+ } elseif ( $type == 'index.php' || $type == 'mw-config/index.php' ) {
$pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
+ if ( $type == 'mw-config/index.php' ) {
+ $dirname = dirname( $pathinfo['dirname'] );
+ } else {
+ $dirname = $pathinfo['dirname'];
+ }
$encLogo = htmlspecialchars(
- str_replace( '//', '/', $pathinfo['dirname'] . '/' ) .
+ str_replace( '//', '/', $dirname . '/' ) .
'skins/common/images/mediawiki.png'
);
wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
+ self::loadPreferenceValues( $user, $context, $defaultPreferences );
+ self::$defaultPreferences = $defaultPreferences;
+ return $defaultPreferences;
+ }
+
+ /**
+ * Loads existing values for a given array of preferences
+ * @throws MWException
+ * @param User $user
+ * @param IContextSource $context
+ * @param array defaultPreferences to load values for
+ * @return array|null
+ */
+ static function loadPreferenceValues( $user, $context, &$defaultPreferences ) {
## Remove preferences that wikis don't want to use
global $wgHiddenPrefs;
foreach ( $wgHiddenPrefs as $pref ) {
}
}
- self::$defaultPreferences = $defaultPreferences;
-
return $defaultPreferences;
}
return array( $result, 'mailerror' );
}
}
-
- /**
- * @deprecated since 1.19
- * @param User $user
- * @return array
- */
- public static function loadOldSearchNs( $user ) {
- wfDeprecated( __METHOD__, '1.19' );
-
- $searchableNamespaces = SearchEngine::searchableNamespaces();
- // Back compat with old format
- $arr = array();
-
- foreach ( $searchableNamespaces as $ns => $name ) {
- if ( $user->getOption( 'searchNs' . $ns ) ) {
- $arr[] = $ns;
- }
- }
-
- return $arr;
- }
}
/** Some tweaks to allow js prefs to work */
'h2', 'h3', 'h4', 'h5', 'h6', 'cite', 'code', 'em', 's',
'strike', 'strong', 'tt', 'var', 'div', 'center',
'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
- 'ruby', 'rt', 'rb', 'rp', 'p', 'span', 'abbr', 'dfn',
+ 'ruby', 'rb', 'rp', 'rt', 'rtc', 'p', 'span', 'abbr', 'dfn',
'kbd', 'samp', 'data', 'time', 'mark'
);
$htmlsingle = array(
# http://www.whatwg.org/html/text-level-semantics.html#the-ruby-element
'ruby' => $common,
# rbc
- # rtc
'rb' => $common,
- 'rt' => $common, #array_merge( $common, array( 'rbspan' ) ),
'rp' => $common,
+ 'rt' => $common, #array_merge( $common, array( 'rbspan' ) ),
+ 'rtc' => $common,
# MathML root element, where used for extensions
# 'title' may not be 100% valid here; it's XHTML
$wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
}
+if ( $wgGitInfoCacheDirectory === false && $wgCacheDirectory !== false ) {
+ $wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo";
+}
+
if ( isset( $wgFileStore['deleted']['directory'] ) ) {
$wgDeletedDirectory = $wgFileStore['deleted']['directory'];
}
$wgDeferredUpdateList = array();
+// Disable all other email settings automatically if $wgEnableEmail
+// is set to false. - bug 63678
+if ( !$wgEnableEmail ) {
+ $wgAllowHTMLEmail = false;
+ $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
+ $wgEnableUserEmail = false;
+ $wgEnotifFromEditor = false;
+ $wgEnotifImpersonal = false;
+ $wgEnotifMaxRecips = 0;
+ $wgEnotifMinorEdits = false;
+ $wgEnotifRevealEditorAddress = false;
+ $wgEnotifUseJobQ = false;
+ $wgEnotifUseRealName = false;
+ $wgEnotifUserTalk = false;
+ $wgEnotifWatchlist = false;
+ unset( $wgGroupPermissions['user']['sendemail'] );
+ $wgUserEmailUseReplyTo = false;
+ $wgUsersNotifiedOnAllChanges = array();
+}
+
wfProfileOut( $fname . '-globals' );
wfProfileIn( $fname . '-extensions' );
}
}
- /**
- * Make a "<script>" tag containing global variables
- *
- * @deprecated since 1.19
- * @param mixed $unused
- * @return string HTML fragment
- */
- public static function makeGlobalVariablesScript( $unused ) {
- global $wgOut;
-
- wfDeprecated( __METHOD__, '1.19' );
-
- return self::makeVariablesScript( $wgOut->getJSVars() );
- }
-
/**
* Get the query to generate a dynamic stylesheet
*
/**
* The following actions use messages which, if made particular to
* the any specific skins, would break the Ajax code which makes this
- * action happen entirely inline. Skin::makeGlobalVariablesScript
+ * action happen entirely inline. OutputPage::getJSVars
* defines a set of messages in a javascript object - and these
* messages are assumed to be global for all skins. Without making
* a change to that procedure these messages will have to remain as
return Title::makeTitleSafe( $this->getNamespace(), $this->getText() . '/' . $text );
}
- /**
- * Get the HTML-escaped displayable text form.
- * Used for the title field in <a> tags.
- *
- * @return string The text, including any prefixes
- * @deprecated since 1.19
- */
- public function getEscapedText() {
- wfDeprecated( __METHOD__, '1.19' );
- return htmlspecialchars( $this->getPrefixedText() );
- }
-
/**
* Get a URL-encoded form of the subpage text
*
return $ret;
}
- /**
- * Get an HTML-escaped version of the URL form, suitable for
- * using in a link, without a server name or fragment
- *
- * @see self::getLocalURL for the arguments.
- * @param string $query
- * @param bool|string $query2
- * @return string The URL
- * @deprecated since 1.19
- */
- public function escapeLocalURL( $query = '', $query2 = false ) {
- wfDeprecated( __METHOD__, '1.19' );
- return htmlspecialchars( $this->getLocalURL( $query, $query2 ) );
- }
-
- /**
- * Get an HTML-escaped version of the URL form, suitable for
- * using in a link, including the server name and fragment
- *
- * @see self::getLocalURL for the arguments.
- * @return string The URL
- * @deprecated since 1.19
- */
- public function escapeFullURL( $query = '', $query2 = false ) {
- wfDeprecated( __METHOD__, '1.19' );
- return htmlspecialchars( $this->getFullURL( $query, $query2 ) );
- }
-
/**
* Get the URL form for an internal link.
* - Used in various Squid-related code, in case we have a different
return $url;
}
- /**
- * HTML-escaped version of getCanonicalURL()
- *
- * @see self::getLocalURL for the arguments.
- * @since 1.18
- * @return string
- * @deprecated since 1.19
- */
- public function escapeCanonicalURL( $query = '', $query2 = false ) {
- wfDeprecated( __METHOD__, '1.19' );
- return htmlspecialchars( $this->getCanonicalURL( $query, $query2 ) );
- }
-
/**
* Get the edit URL for this Title
*
return $this->mTitleProtection;
}
- /**
- * Update the title protection status
- *
- * @deprecated since 1.19; use WikiPage::doUpdateRestrictions() instead.
- * @param string $create_perm Permission required for creation
- * @param string $reason Reason for protection
- * @param string $expiry Expiry timestamp
- * @return bool
- */
- public function updateTitleProtection( $create_perm, $reason, $expiry ) {
- wfDeprecated( __METHOD__, '1.19' );
-
- global $wgUser;
-
- $limit = array( 'create' => $create_perm );
- $expiry = array( 'create' => $expiry );
-
- $page = WikiPage::factory( $this );
- $cascade = false;
- $status = $page->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $wgUser );
-
- return $status->isOK();
- }
-
/**
* Remove any title protection due to page existing
*/
return $this->mPasswordExpires;
}
- /**
- * Does a string look like an e-mail address?
- *
- * This validates an email address using an HTML5 specification found at:
- * http://www.whatwg.org/html/states-of-the-type-attribute.html#valid-e-mail-address
- * Which as of 2011-01-24 says:
- *
- * A valid e-mail address is a string that matches the ABNF production
- * 1*( atext / "." ) "@" ldh-str *( "." ldh-str ) where atext is defined
- * in RFC 5322 section 3.2.3, and ldh-str is defined in RFC 1034 section
- * 3.5.
- *
- * This function is an implementation of the specification as requested in
- * bug 22449.
- *
- * Client-side forms will use the same standard validation rules via JS or
- * HTML 5 validation; additional restrictions can be enforced server-side
- * by extensions via the 'isValidEmailAddr' hook.
- *
- * Note that this validation doesn't 100% match RFC 2822, but is believed
- * to be liberal enough for wide use. Some invalid addresses will still
- * pass validation here.
- *
- * @param string $addr E-mail address
- * @return bool
- * @deprecated since 1.18 call Sanitizer::isValidEmail() directly
- */
- public static function isValidEmailAddr( $addr ) {
- wfDeprecated( __METHOD__, '1.18' );
- return Sanitizer::validateEmail( $addr );
- }
-
/**
* Given unvalidated user input, return a canonical username, or false if
* the username is invalid.
* @file
*/
-# Protect against register_globals
+# Die if register_globals is enabled (PHP <=5.3)
# This must be done before any globals are set by the code
if ( ini_get( 'register_globals' ) ) {
- if ( isset( $_REQUEST['GLOBALS'] ) || isset( $_FILES['GLOBALS'] ) ) {
- die( '<a href="http://www.hardened-php.net/globals-problem">'
- . '$GLOBALS overwrite vulnerability</a>' );
- }
-
- $verboten = array(
- 'GLOBALS',
- '_SERVER',
- 'HTTP_SERVER_VARS',
- '_GET',
- 'HTTP_GET_VARS',
- '_POST',
- 'HTTP_POST_VARS',
- '_COOKIE',
- 'HTTP_COOKIE_VARS',
- '_FILES',
- 'HTTP_POST_FILES',
- '_ENV',
- 'HTTP_ENV_VARS',
- '_REQUEST',
- '_SESSION',
- 'HTTP_SESSION_VARS'
- );
-
- foreach ( $_REQUEST as $name => $value ) {
- if ( in_array( $name, $verboten ) ) {
- header( "HTTP/1.1 500 Internal Server Error" );
- echo "register_globals security paranoia: trying to overwrite superglobals, aborting.";
- die( -1 );
- }
- unset( $GLOBALS[$name] );
- }
+ die( 'MediaWiki does not support installations where register_globals is enabled. '
+ . 'Please see <a href="https://www.mediawiki.org/wiki/register_globals">mediawiki.org</a> '
+ . 'for help on how to disable it.' );
}
# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
$form->setWrapperLegendMsg( 'filerevert-legend' );
$form->setSubmitTextMsg( 'filerevert-submit' );
$form->addHiddenField( 'oldimage', $this->getRequest()->getText( 'oldimage' ) );
+ $form->setTokenSalt( array( 'revert', $this->getTitle()->getPrefixedDBkey() ) );
}
protected function getFormFields() {
* @param mixed $value The value being parsed
* @param bool $allowMultiple Can $value contain more than one value
* separated by '|'?
- * @param mixed $allowedValues An array of values to check against. If
+ * @param string[]|null $allowedValues An array of values to check against. If
* null, all values are accepted.
- * @return mixed (allowMultiple ? an_array_of_values : a_single_value)
+ * @return string|string[] (allowMultiple ? an_array_of_values : a_single_value)
*/
protected function parseMultiValue( $valueName, $value, $allowMultiple, $allowedValues ) {
if ( trim( $value ) === '' && $allowMultiple ) {
/**
* Add a set of tables to the internal array
- * @param mixed $tables Table name or array of table names
- * @param mixed $alias Table alias, or null for no alias. Cannot be
+ * @param string|string[] $tables Table name or array of table names
+ * @param string|null $alias Table alias, or null for no alias. Cannot be
* used with multiple tables
*/
protected function addTables( $tables, $alias = null ) {
}
if ( $fld_content ) {
+ // Modern MediaWiki has the content for deleted revs in the 'text'
+ // table using fields old_text and old_flags. But revisions deleted
+ // pre-1.5 store the content in the 'archive' table directly using
+ // fields ar_text and ar_flags, and no corresponding 'text' row. So
+ // we have to LEFT JOIN and fetch all four fields, plus ar_text_id
+ // to be able to tell the difference.
$this->addTables( 'text' );
$this->addJoinConds(
- array( 'text' => array( 'INNER JOIN', array( 'ar_text_id=old_id' ) ) )
+ array( 'text' => array( 'LEFT JOIN', array( 'ar_text_id=old_id' ) ) )
);
- $this->addFields( array( 'ar_text', 'ar_text_id', 'old_text', 'old_flags' ) );
+ $this->addFields( array( 'ar_text', 'ar_flags', 'ar_text_id', 'old_text', 'old_flags' ) );
// This also means stricter restrictions
if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
$anyHidden = true;
}
if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
- ApiResult::setContent( $rev, Revision::getRevisionText( $row ) );
+ if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
+ // Pre-1.5 ar_text row (if condition from Revision::newFromArchiveRow)
+ ApiResult::setContent( $rev, Revision::getRevisionText( $row, 'ar_' ) );
+ } else {
+ ApiResult::setContent( $rev, Revision::getRevisionText( $row ) );
+ }
}
}
/**
* Extracts from a single sql row the data needed to describe one recent change.
*
- * @param mixed $row The row from which to extract the data.
+ * @param stdClass $row The row from which to extract the data.
* @return array An array mapping strings (descriptors) to their respective string values.
* @access public
*/
$data['generator'] = "MediaWiki {$config->get( 'Version' )}";
- $data['phpversion'] = phpversion();
+ $data['phpversion'] = PHP_VERSION;
$data['phpsapi'] = PHP_SAPI;
$data['dbtype'] = $config->get( 'DBtype' );
$data['dbversion'] = $this->getDB()->getServerVersion();
/**
* Extract fields from the database row and append them to a result array
*
- * @param mixed $row
+ * @param stdClass $row
* @return array
*/
private function extractRowInfo( $row ) {
$options['connectTimeout'] = 1;
}
if ( !isset( $options['readTimeout'] ) ) {
- $options['readTimeout'] = 31; // handles up to 30 second blocking commands
+ $options['readTimeout'] = 1;
}
if ( !isset( $options['persistent'] ) ) {
$options['persistent'] = false;
* Optional, default is 1 second.
* - readTimeout : The timeout for operation reads, in seconds.
* Commands like BLPOP can fail if told to wait longer than this.
- * Optional, default is 60 seconds.
+ * Optional, default is 1 second.
* - persistent : Set this to true to allow connections to persist across
* multiple web requests. False by default.
* - password : The authentication password, will be sent to Redis in clear text.
return true;
}
+ /**
+ * Adjust or reset the connection handle read timeout value
+ *
+ * @param Redis $conn
+ * @param integer $timeout Optional
+ */
+ public function resetTimeout( Redis $conn, $timeout = null ) {
+ $conn->setOption( Redis::OPT_READ_TIMEOUT, $timeout ?: $this->readTimeout );
+ }
+
/**
* Make sure connections are closed for sanity
*/
public function __call( $name, $arguments ) {
$conn = $this->conn; // convenience
+ // Work around https://github.com/nicolasff/phpredis/issues/70
+ $lname = strtolower( $name );
+ if ( ( $lname === 'blpop' || $lname == 'brpop' )
+ && is_array( $arguments[0] ) && isset( $arguments[1] )
+ ) {
+ $this->pool->resetTimeout( $conn, $arguments[1] + 1 );
+ } elseif ( $lname === 'brpoplpush' && isset( $arguments[2] ) ) {
+ $this->pool->resetTimeout( $conn, $arguments[2] + 1 );
+ }
+
$conn->clearLastError();
- $res = call_user_func_array( array( $conn, $name ), $arguments );
- if ( preg_match( '/^ERR operation not permitted\b/', $conn->getLastError() ) ) {
- $this->pool->reauthenticateConnection( $this->server, $conn );
- $conn->clearLastError();
+ try {
$res = call_user_func_array( array( $conn, $name ), $arguments );
- wfDebugLog( 'redis', "Used automatic re-authentication for method '$name'." );
+ if ( preg_match( '/^ERR operation not permitted\b/', $conn->getLastError() ) ) {
+ $this->pool->reauthenticateConnection( $this->server, $conn );
+ $conn->clearLastError();
+ $res = call_user_func_array( array( $conn, $name ), $arguments );
+ wfDebugLog( 'redis', "Used automatic re-authentication for method '$name'." );
+ }
+ } catch ( RedisException $e ) {
+ $this->pool->resetTimeout( $conn ); // restore
+ throw $e;
}
$this->lastError = $conn->getLastError() ?: $this->lastError;
+ $this->pool->resetTimeout( $conn ); // restore
+
return $res;
}
return false;
}
+ if ( $schema === false ) {
+ global $wgDBmwschema;
+ $schema = $wgDBmwschema;
+ }
+
$res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
// Used internally, we want the schema split off from the table name and returned
// as a list with 3 elements (database, schema, table)
$table = explode( '.', $table );
- if ( count( $table ) == 2 ) {
+ while ( count( $table ) < 3 ) {
array_unshift( $table, false );
}
}
* In Postgres when using FOR UPDATE, only the main table and tables that are inner joined
* can be locked. That means tables in an outer join cannot be FOR UPDATE locked. Trying to do
* so causes a DB error. This wrapper checks which tables can be locked and adjusts it accordingly.
+ *
+ * MySQL uses "ORDER BY NULL" as an optimization hint, but that syntax is illegal in PostgreSQL.
*/
function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
$options = array(), $join_conds = array()
}
}
}
+
+ if ( isset( $options['ORDER BY'] ) && $options['ORDER BY'] == 'NULL' ) {
+ unset( $options['ORDER BY'] );
+ }
}
return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
/** @var string Required Repository class type */
protected $repoClass = 'FileRepo';
+ /** @var array Cache of tmp filepaths pointing to generated bucket thumbnails, keyed by width */
+ protected $tmpBucketedThumbCache = array();
+
/**
* Call this constructor from child classes.
*
return false;
}
+ /**
+ * Return the smallest bucket from $wgThumbnailBuckets which is at least
+ * $wgThumbnailMinimumBucketDistance larger than $desiredWidth. The returned bucket, if any,
+ * will always be bigger than $desiredWidth.
+ *
+ * @param int $desiredWidth
+ * @param int $page
+ * @return bool|int
+ */
+ public function getThumbnailBucket( $desiredWidth, $page = 1 ) {
+ global $wgThumbnailBuckets, $wgThumbnailMinimumBucketDistance;
+
+ $imageWidth = $this->getWidth( $page );
+
+ if ( $imageWidth === false ) {
+ return false;
+ }
+
+ if ( $desiredWidth > $imageWidth ) {
+ return false;
+ }
+
+ if ( !$wgThumbnailBuckets ) {
+ return false;
+ }
+
+ $sortedBuckets = $wgThumbnailBuckets;
+
+ sort( $sortedBuckets );
+
+ foreach ( $sortedBuckets as $bucket ) {
+ if ( $bucket > $imageWidth ) {
+ return false;
+ }
+
+ if ( $bucket - $wgThumbnailMinimumBucketDistance > $desiredWidth ) {
+ return $bucket;
+ }
+ }
+
+ // Image is bigger than any available bucket
+ return false;
+ }
+
/**
* Returns ID or name of user who uploaded the file
* STUB
return null;
}
$extension = $this->getExtension();
- list( $thumbExt, ) = $this->handler->getThumbType(
+ list( $thumbExt, ) = $this->getHandler()->getThumbType(
$extension, $this->getMimeType(), $params );
- $thumbName = $this->handler->makeParamString( $params ) . '-' . $name;
+ $thumbName = $this->getHandler()->makeParamString( $params ) . '-' . $name;
if ( $thumbExt != $extension ) {
$thumbName .= ".$thumbExt";
}
* @return MediaTransformOutput|bool False on failure
*/
function transform( $params, $flags = 0 ) {
- global $wgUseSquid, $wgIgnoreImageErrors, $wgThumbnailEpoch;
+ global $wgThumbnailEpoch;
wfProfileIn( __METHOD__ );
do {
} elseif ( $flags & self::RENDER_FORCE ) {
wfDebug( __METHOD__ . " forcing rendering per flag File::RENDER_FORCE\n" );
}
- }
- // If the backend is ready-only, don't keep generating thumbnails
- // only to return transformation errors, just return the error now.
- if ( $this->repo->getReadOnlyReason() !== false ) {
- $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
- break;
+ // If the backend is ready-only, don't keep generating thumbnails
+ // only to return transformation errors, just return the error now.
+ if ( $this->repo->getReadOnlyReason() !== false ) {
+ $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
+ break;
+ }
}
- // Create a temp FS file with the same extension and the thumbnail
- $thumbExt = FileBackend::extensionFromPath( $thumbPath );
- $tmpFile = TempFSFile::factory( 'transform_', $thumbExt );
+ $tmpFile = $this->makeTransformTmpFile( $thumbPath );
+
if ( !$tmpFile ) {
$thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
- break;
+ } else {
+ $thumb = $this->generateAndSaveThumb( $tmpFile, $params, $flags );
}
- $tmpThumbPath = $tmpFile->getPath(); // path of 0-byte temp file
-
- // Actually render the thumbnail...
- wfProfileIn( __METHOD__ . '-doTransform' );
- $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $params );
- wfProfileOut( __METHOD__ . '-doTransform' );
- $tmpFile->bind( $thumb ); // keep alive with $thumb
-
- if ( !$thumb ) { // bad params?
- $thumb = false;
- } elseif ( $thumb->isError() ) { // transform error
- $this->lastError = $thumb->toText();
- // Ignore errors if requested
- if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
- $thumb = $handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $params );
- }
- } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
- // Copy the thumbnail from the file system into storage...
- $disposition = $this->getThumbDisposition( $thumbName );
- $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath, $disposition );
- if ( $status->isOK() ) {
- $thumb->setStoragePath( $thumbPath );
- } else {
- $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
+ } while ( false );
+
+ wfProfileOut( __METHOD__ );
+
+ return is_object( $thumb ) ? $thumb : false;
+ }
+
+ /**
+ * Generates a thumbnail according to the given parameters and saves it to storage
+ * @param TempFSFile $tmpFile Temporary file where the rendered thumbnail will be saved
+ * @param array $transformParams
+ * @param int $flags
+ * @return bool|MediaTransformOutput
+ */
+ public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) {
+ global $wgUseSquid, $wgIgnoreImageErrors;
+
+ $handler = $this->getHandler();
+
+ $normalisedParams = $transformParams;
+ $handler->normaliseParams( $this, $normalisedParams );
+
+ $thumbName = $this->thumbName( $normalisedParams );
+ $thumbUrl = $this->getThumbUrl( $thumbName );
+ $thumbPath = $this->getThumbPath( $thumbName ); // final thumb path
+
+ $tmpThumbPath = $tmpFile->getPath();
+
+ if ( $handler->supportsBucketing() ) {
+ $this->generateBucketsIfNeeded( $normalisedParams, $flags );
+ }
+
+ // Actually render the thumbnail...
+ wfProfileIn( __METHOD__ . '-doTransform' );
+ $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
+ wfProfileOut( __METHOD__ . '-doTransform' );
+ $tmpFile->bind( $thumb ); // keep alive with $thumb
+
+ if ( !$thumb ) { // bad params?
+ $thumb = false;
+ } elseif ( $thumb->isError() ) { // transform error
+ $this->lastError = $thumb->toText();
+ // Ignore errors if requested
+ if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
+ $thumb = $handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
+ }
+ } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
+ // Copy the thumbnail from the file system into storage...
+ $disposition = $this->getThumbDisposition( $thumbName );
+ $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath, $disposition );
+ if ( $status->isOK() ) {
+ $thumb->setStoragePath( $thumbPath );
+ } else {
+ $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $transformParams, $flags );
+ }
+ // Give extensions a chance to do something with this thumbnail...
+ wfRunHooks( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
+ }
+
+ // Purge. Useful in the event of Core -> Squid connection failure or squid
+ // purge collisions from elsewhere during failure. Don't keep triggering for
+ // "thumbs" which have the main image URL though (bug 13776)
+ if ( $wgUseSquid ) {
+ if ( !$thumb || $thumb->isError() || $thumb->getUrl() != $this->getURL() ) {
+ SquidUpdate::purge( array( $thumbUrl ) );
+ }
+ }
+
+ return $thumb;
+ }
+
+ /**
+ * Generates chained bucketed thumbnails if needed
+ * @param array $params
+ * @param int $flags
+ * @return bool Whether at least one bucket was generated
+ */
+ protected function generateBucketsIfNeeded( $params, $flags = 0 ) {
+ if ( !$this->repo
+ || !isset( $params['physicalWidth'] )
+ || !isset( $params['physicalHeight'] )
+ || !( $bucket = $this->getThumbnailBucket( $params['physicalWidth'] ) )
+ || $bucket == $params['physicalWidth'] ) {
+ return false;
+ }
+
+ $bucketPath = $this->getBucketThumbPath( $bucket );
+
+ if ( $this->repo->fileExists( $bucketPath ) ) {
+ return false;
+ }
+
+ $params['physicalWidth'] = $bucket;
+ $params['width'] = $bucket;
+
+ $params = $this->getHandler()->sanitizeParamsForBucketing( $params );
+
+ $bucketName = $this->getBucketThumbName( $bucket );
+
+ $tmpFile = $this->makeTransformTmpFile( $bucketPath );
+
+ if ( !$tmpFile ) {
+ return false;
+ }
+
+ $thumb = $this->generateAndSaveThumb( $tmpFile, $params, $flags );
+
+ if ( !$thumb || $thumb->isError() ) {
+ return false;
+ }
+
+ $this->tmpBucketedThumbCache[ $bucket ] = $tmpFile->getPath();
+ // For the caching to work, we need to make the tmp file survive as long as
+ // this object exists
+ $tmpFile->bind( $this );
+
+ return true;
+ }
+
+ /**
+ * Returns the most appropriate source image for the thumbnail, given a target thumbnail size
+ * @param array $params
+ * @return array source path and width/height of the source
+ */
+ public function getThumbnailSource( $params ) {
+ if ( $this->repo
+ && $this->getHandler()->supportsBucketing()
+ && isset( $params['physicalWidth'] )
+ && $bucket = $this->getThumbnailBucket( $params['physicalWidth'] )
+ ) {
+ if ( $this->getWidth() != 0 ) {
+ $bucketHeight = round( $this->getHeight() * ( $bucket / $this->getWidth() ) );
+ } else {
+ $bucketHeight = 0;
+ }
+
+ // Try to avoid reading from storage if the file was generated by this script
+ if ( isset( $this->tmpBucketedThumbCache[ $bucket ] ) ) {
+ $tmpPath = $this->tmpBucketedThumbCache[ $bucket ];
+
+ if ( file_exists( $tmpPath ) ) {
+ return array(
+ 'path' => $tmpPath,
+ 'width' => $bucket,
+ 'height' => $bucketHeight
+ );
}
- // Give extensions a chance to do something with this thumbnail...
- wfRunHooks( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
}
- // Purge. Useful in the event of Core -> Squid connection failure or squid
- // purge collisions from elsewhere during failure. Don't keep triggering for
- // "thumbs" which have the main image URL though (bug 13776)
- if ( $wgUseSquid ) {
- if ( !$thumb || $thumb->isError() || $thumb->getUrl() != $this->getURL() ) {
- SquidUpdate::purge( array( $thumbUrl ) );
+ $bucketPath = $this->getBucketThumbPath( $bucket );
+
+ if ( $this->repo->fileExists( $bucketPath ) ) {
+ $fsFile = $this->repo->getLocalReference( $bucketPath );
+
+ if ( $fsFile ) {
+ return array(
+ 'path' => $fsFile->getPath(),
+ 'width' => $bucket,
+ 'height' => $bucketHeight
+ );
}
}
- } while ( false );
+ }
- wfProfileOut( __METHOD__ );
+ // Original file
+ return array(
+ 'path' => $this->getLocalRefPath(),
+ 'width' => $this->getWidth(),
+ 'height' => $this->getHeight()
+ );
+ }
- return is_object( $thumb ) ? $thumb : false;
+ /**
+ * Returns the repo path of the thumb for a given bucket
+ * @param int $bucket
+ * @return string
+ */
+ protected function getBucketThumbPath( $bucket ) {
+ $thumbName = $this->getBucketThumbName( $bucket );
+ return $this->getThumbPath( $thumbName );
+ }
+
+ /**
+ * Returns the name of the thumb for a given bucket
+ * @param int $bucket
+ * @return string
+ */
+ protected function getBucketThumbName( $bucket ) {
+ return $this->thumbName( array( 'physicalWidth' => $bucket ) );
+ }
+
+ /**
+ * Creates a temp FS file with the same extension and the thumbnail
+ * @param string $thumbPath Thumbnail path
+ * @returns TempFSFile
+ */
+ protected function makeTransformTmpFile( $thumbPath ) {
+ $thumbExt = FileBackend::extensionFromPath( $thumbPath );
+ return TempFSFile::factory( 'transform_', $thumbExt );
}
/**
return false;
}
- return $this->handler->getImageSize( $this, $filePath );
+ return $this->getHandler()->getImageSize( $this, $filePath );
}
/**
protected $mWrapperLegend = false;
+ /**
+ * Salt for the edit token.
+ * @var string|array
+ */
+ protected $mTokenSalt = '';
+
/**
* If true, sections that contain both fields and subsections will
* render their subsections before their fields.
// Session tokens for logged-out users have no security value.
// However, if the user gave one, check it in order to give a nice
// "session expired" error instead of "permission denied" or such.
- $submit = $this->getUser()->matchEditToken( $editToken );
+ $submit = $this->getUser()->matchEditToken( $editToken, $this->mTokenSalt );
} else {
$submit = true;
}
return $this;
}
+ /**
+ * Set the salt for the edit token.
+ *
+ * Only useful when the method is "post".
+ *
+ * @since 1.24
+ * @param string|array Salt to use
+ * @return HTMLForm $this for chaining calls
+ */
+ public function setTokenSalt( $salt ) {
+ $this->mTokenSalt = $salt;
+
+ return $this;
+ }
+
/**
* Display the form (sending to the context's OutputPage object), with an
* appropriate error message or stack of messages, and any validation errors, etc.
if ( $this->getMethod() == 'post' ) {
$html .= Html::hidden(
'wpEditToken',
- $this->getUser()->getEditToken(),
+ $this->getUser()->getEditToken( $this->mTokenSalt ),
array( 'id' => 'wpEditToken' )
) . "\n";
$html .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
*/
abstract class Installer {
- // This is the absolute minimum PHP version we can support
- const MINIMUM_PHP_VERSION = '5.3.2';
-
/**
* The oldest version of PCRE we can support.
*
$this->settings[$var] = $GLOBALS[$var];
}
- $compiledDBs = array();
+ $this->compiledDBs = array();
foreach ( self::getDBTypes() as $type ) {
$installer = $this->getDBInstaller( $type );
if ( !$installer->isCompiled() ) {
continue;
}
- $compiledDBs[] = $type;
-
- $defaults = $installer->getGlobalDefaults();
-
- foreach ( $installer->getGlobalNames() as $var ) {
- if ( isset( $defaults[$var] ) ) {
- $this->settings[$var] = $defaults[$var];
- } else {
- $this->settings[$var] = $GLOBALS[$var];
- }
- }
+ $this->compiledDBs[] = $type;
}
- $this->compiledDBs = $compiledDBs;
$this->parserTitle = Title::newFromText( 'Installer' );
$this->parserOptions = new ParserOptions; // language will be wrong :(
* @return Status
*/
public function doEnvironmentChecks() {
- $phpVersion = phpversion();
- if ( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
- $this->showMessage( 'config-env-php', $phpVersion );
- $good = true;
- } else {
- $this->showMessage( 'config-env-php-toolow', $phpVersion, self::MINIMUM_PHP_VERSION );
- $good = false;
- }
+ // Php version has already been checked by entry scripts
+ // Show message here for information purposes
+ $this->showMessage( 'config-env-php', PHP_VERSION );
+ $good = true;
// Must go here because an old version of PCRE can prevent other checks from completing
- if ( $good ) {
- list( $pcreVersion ) = explode( ' ', PCRE_VERSION, 2 );
- if ( version_compare( $pcreVersion, self::MINIMUM_PCRE_VERSION, '<' ) ) {
- $this->showError( 'config-pcre-old', self::MINIMUM_PCRE_VERSION, $pcreVersion );
- $good = false;
- }
- }
-
- if ( $good ) {
+ list( $pcreVersion ) = explode( ' ', PCRE_VERSION, 2 );
+ if ( version_compare( $pcreVersion, self::MINIMUM_PCRE_VERSION, '<' ) ) {
+ $this->showError( 'config-pcre-old', self::MINIMUM_PCRE_VERSION, $pcreVersion );
+ $good = false;
+ } else {
foreach ( $this->envChecks as $check ) {
$status = $this->$check();
if ( $status === false ) {
/**
* Environment check for register_globals.
+ * Prevent installation if enabled
*/
protected function envCheckRegisterGlobals() {
if ( wfIniGetBool( 'register_globals' ) ) {
- $this->showMessage( 'config-register-globals' );
+ $this->showMessage( 'config-register-globals-error' );
+ return false;
}
+
+ return true;
}
/**
'password' => $password,
'dbname' => false,
'flags' => 0,
+ 'schema' => $this->getVar( 'wgDBmwschema' ),
'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
$db->prepareStatements( false );
$db->scrollableCursor( false );
return $status;
}
+ public function getGlobalDefaults() {
+ // The default $wgDBmwschema is null, which breaks Postgres and other DBMSes that require
+ // the use of a schema, so we need to set it here
+ return array(
+ 'wgDBmwschema' => 'mediawiki',
+ );
+ }
+
/**
* Try to see if the login exists
* @param string $user Username to check
* @param string $user User name
* @param string $password Password
* @param string $dbName Database name
+ * @param string $schema Database schema
* @return Status
*/
- protected function openConnectionWithParams( $user, $password, $dbName ) {
+ protected function openConnectionWithParams( $user, $password, $dbName, $schema ) {
$status = Status::newGood();
try {
- $db = new DatabasePostgres(
- $this->getVar( 'wgDBserver' ),
- $user,
- $password,
- $dbName
- );
+ $db = Database::factory( 'postgres', array(
+ 'host' => $this->getVar( 'wgDBserver' ),
+ 'user' => $user,
+ 'password' => $password,
+ 'dbname' => $dbName,
+ 'schema' => $schema ) );
$status->value = $db;
} catch ( DBConnectionError $e ) {
$status->fatal( 'config-connection-error', $e->getMessage() );
return $this->openConnectionWithParams(
$this->getVar( '_InstallUser' ),
$this->getVar( '_InstallPassword' ),
- $this->getVar( 'wgDBname' ) );
+ $this->getVar( 'wgDBname' ),
+ $this->getVar( 'wgDBmwschema' ) );
case 'create-tables':
$status = $this->openPgConnection( 'create-schema' );
if ( $status->isOK() ) {
$status = Status::newGood();
foreach ( $dbs as $db ) {
try {
- $conn = new DatabasePostgres(
- $this->getVar( 'wgDBserver' ),
+ $conn = $this->openConnectionWithParams(
$user,
$password,
- $db );
+ $db,
+ $this->getVar( 'wgDBmwschema' ) );
} catch ( DBConnectionError $error ) {
$conn = false;
$status->fatal( 'config-pg-test-error', $db,
return $status;
}
+ public function getGlobalDefaults() {
+ // The default $wgDBmwschema is null, which breaks Postgres and other DBMSes that require
+ // the use of a schema, so we need to set it here
+ return array(
+ 'wgDBmwschema' => 'mediawiki',
+ );
+ }
+
public function setupPLpgSQL() {
// Connect as the install user, since it owns the database and so is
// the user that needs to run "CREATE LANGAUGE"
"config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte do PHP nainstalovat databázový ovladač.\nJsou podporovány následující typy databází: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul php5-mysql.",
"config-outdated-sqlite": "'''Upozornění''': Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
"config-no-fts3": "'''Upozornění''': SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
- "config-register-globals": "'''Upozornění: Je zapnuta PHP volba <code>[http://php.net/register_globals register_globals]</code>.'''\n'''Pokud můžete, vypněte ji.'''\nMediaWiki bude fungovat, ale váš server je vystaven potenciálním bezpečnostním hrozbám.",
+ "config-register-globals-error": "<strong>Chyba: PHP nastavení <code>[http://php.net/register_globals register_globals]</code> je zapnuto. Pro pokračování v instalaci musí být vypnuto.</strong>\nRady, jak toho dosáhnout, najdete na [https://www.mediawiki.org/wiki/Register_globals https://www.mediawiki.org/wiki/register_globals].",
"config-magic-quotes-runtime": "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nToto nastavení nepředvídatelně poškozuje vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
"config-magic-quotes-sybase": "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nToto nastavení nepředvídatelně poškozuje vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
"config-mbstring": "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nToto nastavení způsobuje chyby a může nepředvídatelně poškozovat vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
"config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\nDie folgenden Datenbanksysteme werden unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von <code>./configure --with-mysqli</code>.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das <code>php5-mysql</code>-Paket installieren.",
"config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
"config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, sodass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
- "config-register-globals": "'''Warnung: Der Parameter <code>[http://php.net/register_globals register_globals]</code> von PHP ist aktiviert.'''\n'''Sie sollte deaktiviert werden, sofern dies möglich ist.'''\nDie MediaWiki-Installation wird zwar laufen, wobei aber der Server für potentielle Sicherheitsprobleme anfällig ist.",
+ "config-register-globals-error": "<strong>Fehler: Die PHP-Option <code>[http://php.net/register_globals register_globals]</code> ist aktiviert.\nSie muss deaktiviert sein, um mit der Installation fortzufahren.</strong>\nSiehe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] für Hilfe.",
"config-magic-quotes-runtime": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/function.set-magic-quotes-runtime.php set_magic_quotes_runtime]</code> von PHP ist aktiviert!'''\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
"config-magic-quotes-sybase": "<strong>Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/sybase.configuration.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!</strong>\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
"config-mbstring": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> von PHP ist aktiviert!'''\nDiese Einstellung verursacht Fehler und führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
"config-env-good": "The environment has been checked.\nYou can install MediaWiki.",
"config-env-bad": "The environment has been checked.\nYou cannot install MediaWiki.",
"config-env-php": "PHP $1 is installed.",
- "config-env-php-toolow": "PHP $1 is installed.\nHowever, MediaWiki requires PHP $2 or higher.",
"config-unicode-using-utf8": "Using Brion Vibber's utf8_normalize.so for Unicode normalization.",
"config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.",
"config-unicode-pure-php-warning": "<strong>Warning:</strong> The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
"config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database types are supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
"config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
"config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
- "config-register-globals": "<strong>Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nDisable it if you can.</strong>\nMediaWiki will work, but your server is exposed to potential security vulnerabilities.",
+ "config-register-globals-error": "<strong>Error: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nIt must be disabled to continue with installation.</strong>\nSee [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for help on how to do so.",
"config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
"config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
"config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
"config-no-db": "¡No fue posible encontrar un controlador adecuado para la base de datos! Necesitas instalar un controlador de base de datos para PHP.\nLos siguientes sistemas gestores de bases de datos están soportados: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete <code>php5-mysql</code>.",
"config-outdated-sqlite": "''' Advertencia ''': tiene la versión SQLite $1, que es inferior a la mínima versión requerida: $2 . SQLite no estará disponible.",
"config-no-fts3": "'''Advertencia''': SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
- "config-register-globals": "'''Advertencia: La opción de <code>[http://php.net/register_globals register_globals]</code> de PHP está habilitada.'''\n'''Desactívela si puede.'''\nMediaWiki funcionará, pero tu servidor quedará expuesto a vulnerabilidades de seguridad potenciales.",
"config-magic-quotes-runtime": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
"config-magic-quotes-sybase": "'''Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNo puedes instalar o utilizar MediaWiki a menos que esta opción esté inhabilitada.",
"config-mbstring": "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''\nEsta opción causa errores y puede corromper los datos de una forma imprevisible.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.",
"config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. Les types de bases de données suivants sont reconnus : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données activé, par exemple en utilisant <code>./configure --with-mysqli</code>. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php5-mysql</code>.",
"config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
"config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
- "config-register-globals": "'''Attention : l'option <code>[http://php.net/register_globals register_globals]</code> de PHP est activée.'''\n'''Désactivez-la si vous le pouvez.'''\nMediaWiki fonctionnera, mais votre serveur sera exposé à de potentielles failles de sécurité.",
+ "config-register-globals-error": "<strong>Erreur : L’option <code>[http://php.net/register_globals register_globals]</code> de PHP est activée.\nElle doit être désactivée pour poursuivre l’installation.</strong>\nVoyez [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pour avoir de l’aide sur la manière de faire cela.",
"config-magic-quotes-runtime": "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] est activé !'''\nCette option corrompt les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
"config-magic-quotes-sybase": "'''Erreur fatale : [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybasee] est activé !'''\nCette option corrompt les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
"config-mbstring": "'''Erreur fatale : [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] est activé !'''\nCette option provoque des erreurs et peut corrompre les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.",
"config-no-db": "לא נמצא דרייבר מסד נתונים מתאים. יש להתקין דרייבר מסד נתונים ל־PHP.\nנתמכים הסוגים הבאים של מסדי נתונים: $1.\n\nאם קִמפלת את PHP בעצמך, יש להגדיר אותו מחדש ולהפעיל את לקוח מסד נתונים, למשל באמצעות <code dir=\"ltr\">./configure --with-mysqli</code>.\nאם התקנת את PHP מחבילה של דביאן או של אובונטו, יש להתקין, למשל, גם את המודול <code dir=\"ltr\">php5-mysql</code>.",
"config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.",
"config-no-fts3": "'''אזהרה''': SQLite מקומפל ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
- "config-register-globals": "'''אזהרה: האפשרות <code>[http://php.net/register_globals register_globals]</code> של PHP מופעלת.'''\n'''כבו אותה אם זה אפשרי.'''\nמדיה־ויקי תעבוד, אבל השרת שלך חשוף לפגיעות אבטחה.",
+ "config-register-globals-error": "<strong>שגיאה: האפשרות <code>[http://php.net/register_globals register_globals]</code> של PHP מופעלת.\nצריך לכבות אותה כדי להמשיך בהתקנה.</strong>\nר' [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] להסבר איך לעשות את זה.",
"config-magic-quotes-runtime": "<strong>שגיאה סופנית: האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] פעילה!</strong>\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי אלא אם האפשרות הזאת תכובה.",
"config-magic-quotes-sybase": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] פעילה!'''\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
"config-mbstring": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''\nהאפשרות הזאת גורמת לשגיאות ומעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
"config-no-db": "Не можев да најдам соодветен двигател за базата на податоци! Ќе треба да воспоставите двигател за PHP-база.\nПоддржани се следниве видови бази: $1.\n\nДоколку самите го срочивте овој PHP, овозможете го базниот клиент во поставките — на пр. со <code>./configure --with-mysqli</code>.\nАко овој PHP го воспоставите од пакет на Debian или Ubuntu, тогаш ќе треба исто така да го воспоставите, на пр., пакетот <code>php5-mysql</code>.",
"config-outdated-sqlite": "'''Предупредување''': имате SQLite $1. Најстарата допуштена верзија е $2. Затоа, SQLite ќе биде недостапен.",
"config-no-fts3": "'''Предупредување''': SQLite iе составен без модулот [//sqlite.org/fts3.html FTS3] - за оваа база нема да има можност за пребарување.",
- "config-register-globals": "'''Предупредување: Можноста <code>[http://php.net/register_globals register_globals]</code> за PHP е овозможена.'''\n'''Оневозможете ја ако е можно.'''\nМедијаВики ќе работи, но опслужувачот ви е изложен на безбедносни ризици.",
+ "config-register-globals-error": "<strong>Грешка: Вклучена е можноста <code>[http://php.net/register_globals register_globals]</code> за PHP.\nМора да се исклучи за да продолжите со воспоставката.</strong>\nКако да го направите тоа можете да прочитате на [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals].",
"config-magic-quotes-runtime": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
"config-magic-quotes-sybase": "'''Кобно: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активно!'''\nОваа можност непредвидливо го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
"config-mbstring": "'''Кобно: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активно!'''\nОваа можност предизвикува грешки и може непредвидиво да го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.",
"config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende databasetyper støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
"config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
"config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
- "config-register-globals": "'''Advarsel: PHPs <code>[http://php.net/register_globals register_globals]</code>-alternativ er aktivert.'''\n'''Deaktiver det om du kan.'''\nMediaWiki vil fungere, men tjeneren din er utsatt for potensielle sikkerhetssårbarheter.",
+ "config-register-globals-error": "<strong>Feil: PHPs <code>[http://php.net/register_globals register_globals]</code>-valg er aktivt.\nDet må deaktiveres for å kunne fortsette med installeringen.</strong>\nSe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for å få hjelp til å gjøre dette.",
"config-magic-quotes-runtime": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
"config-magic-quotes-sybase": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
"config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
"config-no-db": "Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.\nSão suportados os seguintes tipos de bancos de dados: $1.\n\nSe você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo <code>./configure --with-mysqli</code>.\nSe você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, então será também necessário instalar, por exemplo, o pacote <code>php5-mysql</code>.",
"config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
"config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
- "config-register-globals": "<strong>Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.\nDesative-a se puder.</strong>\nO MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
"config-magic-quotes-runtime": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!</strong>\nEsta opção causa corrupção dos dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
"config-magic-quotes-sybase": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
"config-mbstring": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
"config-no-db": "{{doc-important|Do not translate \"<code>./configure --with-mysqli</code>\" and \"<code>php5-mysql</code>\".}}\nParameters:\n* $1 is comma separated list of database types supported by MediaWiki.",
"config-outdated-sqlite": "Used as warning. Parameters:\n* $1 - the version of SQLite that has been installed\n* $2 - minimum version",
"config-no-fts3": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
- "config-register-globals": "Status message in the MediaWiki installer environment checks.",
+ "config-register-globals-error": "Error message in the MediaWiki installer environment checks.",
"config-magic-quotes-runtime": "{{Related|Config-fatal}}",
"config-magic-quotes-sybase": "{{Related|Config-fatal}}",
"config-mbstring": "{{Related|Config-fatal}}",
"config-no-db": "Не удалось найти подходящие драйвера баз данных! Вам необходимо установить драйвера базы данных для PHP.\nПоддерживаются следующие типы баз данных: $1.\nЕсли вы скомпилировали PHP сами, перенастройте его с включением клиента баз данных, например, с помощью <code>./configure --with-mysqli</code>.\nЕсли вы скомпилировали PHP сами, сконфигурируйте его снова с включенным клиентом базы данных, например, с помощью <code>./configure --with-mysql</code>.\nЕсли вы установили PHP из пакетов Debian или Ubuntu, то вам также необходимо установить, например, пакет <code>php5-mysql</code>.",
"config-outdated-sqlite": "'''Предупреждение''': у Вас установлен SQLite $1, версия которого ниже требуемой $2 . SQLite будет недоступен.",
"config-no-fts3": "'''Внимание''': SQLite собран без модуля [//sqlite.org/fts3.html FTS3] — поиск не будет работать для этой базы данных.",
- "config-register-globals": "'''Внимание: PHP-опция <code>[http://php.net/register_globals register_globals]</code> включена.'''\n'''Отключите её, если это возможно.'''\nMediaWiki будет работать, но это снизит безопасность сервера и увеличит риск проникновения извне.",
+ "config-register-globals-error": "<strong>Ошибка: Параметр PHP <code>[http://php.net/register_globals register_globals]</code> включен.\nОн должен быть отключен для того, чтобы можно было продолжить установку.</strong>\nПолучить справку о том, как это сделать, можно по адресу [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals].",
"config-magic-quotes-runtime": "'''Проблема: включена опция PHP [http://www.php.net/manual/ru/function.magic-quotes-runtime.php magic_quotes_runtime]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
"config-magic-quotes-sybase": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
"config-mbstring": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nЭто приводит к ошибкам и непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
"config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databastyper stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php5-mysql</code>-paketet.",
"config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
"config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga på denna backend.",
- "config-register-globals": "'''Varning: PHP:s <code>[http://php.net/register_globals register_globals]</code>-tillval är aktiverat.'''\n'''Inaktivera den om du kan.'''\nMediaWiki kommer att fungera, men din server exponeras för potentiella säkerhetshål.",
"config-magic-quotes-runtime": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
"config-magic-quotes-sybase": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
"config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
"config-no-db": "找不到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库:$1。如果您是自己编译的PHP,请重新配置他与数据库客户端将其启用,诸如,使用<code>./configure --with-mysqli</code>。如果您从Debian或Ubuntu包安装了PHP,之后您仍需要安装诸如<code>php5-mysql</code>包。",
"config-outdated-sqlite": "'''警告''':您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。",
"config-no-fts3": "'''警告''':已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。",
- "config-register-globals": "'''警告:PHP的<code>[http://php.net/register_globals register_globals]</code>选项被启用。请尽量禁用该功能,'''虽然不会影响MediaWiki的运行,但您的服务器会被暴露给潜在的安全漏洞。",
"config-magic-quotes-runtime": "'''毁灭性错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]已启用!'''\n此选项会无法预测地破坏输入的数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
"config-magic-quotes-sybase": "'''毁灭性错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]已启用!'''\n此选项会无法预测地破坏输入的数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
"config-mbstring": "'''毁灭性错误:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]已启用!'''\n此选项会导致错误并不可预测地破坏数据,请将其禁用,否则您将不能安装或使用MediaWiki。",
/**
* Get the message associated with HTTP response code $code
*
- * Replace OutputPage::getStatusMessage( $code )
- *
* @param $code Integer: status code
* @return String or null: message or null if $code is not in the list of
* messages
if ( !$this->normaliseParams( $image, $params ) ) {
return new TransformParameterError( $params );
}
+
# Create a parameter array to pass to the scaler
$scalerParams = array(
# The size to which the image will be resized
}
# Transform functions and binaries need a FS source file
- $scalerParams['srcPath'] = $image->getLocalRefPath();
+ $thumbnailSource = $image->getThumbnailSource( $params );
+
+ $scalerParams['srcPath'] = $thumbnailSource['path'];
+ $scalerParams['srcWidth'] = $thumbnailSource['width'];
+ $scalerParams['srcHeight'] = $thumbnailSource['height'];
+
if ( $scalerParams['srcPath'] === false ) { // Failed to get local copy
wfDebugLog( 'thumbnail',
sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
}
}
} elseif ( $params['mimeType'] == 'image/x-xcf' ) {
- $animation_post = array( '-layers', 'merge' );
+ // Before merging layers, we need to set the background
+ // to be transparent to preserve alpha, as -layers merge
+ // merges all layers on to a canvas filled with the
+ // background colour. After merging we reset the background
+ // to be white for the default background colour setting
+ // in the PNG image (which is used in old IE)
+ $animation_post = array(
+ '-background', 'transparent',
+ '-layers', 'merge',
+ '-background', 'white',
+ );
wfSuppressWarnings();
$xcfMeta = unserialize( $image->getMetadata() );
wfRestoreWarnings();
}
/**
- * Rerurns whether the file needs to be rendered. Returns true if the
+ * Returns whether the file needs to be rendered. Returns true if the
* file requires rotation and we are able to rotate it.
*
* @param File $file
->numParams( $file->getWidth(), $file->getHeight() )->text();
}
}
+
+ public function sanitizeParamsForBucketing( $params ) {
+ $params = parent::sanitizeParamsForBucketing( $params );
+
+ // We unset the height parameters in order to let normaliseParams recalculate them
+ // Otherwise there might be a height discrepancy
+ if ( isset( $params['height'] ) ) {
+ unset( $params['height'] );
+ }
+
+ if ( isset( $params['physicalHeight'] ) ) {
+ unset( $params['physicalHeight'] );
+ }
+
+ return $params;
+ }
}
return parent::rotate( $file, $params );
}
}
+
+ public function supportsBucketing() {
+ return true;
+ }
+
+ public function sanitizeParamsForBucketing( $params ) {
+ $params = parent::sanitizeParamsForBucketing( $params );
+
+ // Quality needs to be cleared for bucketing. Buckets need to be default quality
+ if ( isset( $params['quality'] ) ) {
+ unset( $params['quality'] );
+ }
+
+ return $params;
+ }
}
public function isExpensiveToThumbnail( $file ) {
return false;
}
+
+ /**
+ * Returns whether or not this handler supports the chained generation of thumbnails according
+ * to buckets
+ * @return boolean
+ * @since 1.24
+ */
+ public function supportsBucketing() {
+ return false;
+ }
+
+ /**
+ * Returns a normalised params array for which parameters have been cleaned up for bucketing
+ * purposes
+ * @param array $params
+ * @return array
+ */
+ public function sanitizeParamsForBucketing( $params ) {
+ return $params;
+ }
}
return $wgLang->commaList( $info );
}
+
+ public function supportsBucketing() {
+ return true;
+ }
}
return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
}
- /**
- * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
- *
- * @deprecated since 1.19; use Title::isBigDeletion() instead.
- * @return bool
- */
- public function isBigDeletion() {
- wfDeprecated( __METHOD__, '1.19' );
- return $this->mTitle->isBigDeletion();
- }
-
/**
* Get the approximate revision count of this page.
*
// list of disallowed tags for DISPLAYTITLE
// these will be escaped even though they are allowed in normal wiki text
$bad = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
- 'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rp', 'br' );
+ 'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rtc', 'rp', 'br' );
// disallow some styles that could be used to bypass $wgRestrictDisplayTitle
if ( $wgRestrictDisplayTitle ) {
return wfSetVar( $this->mTidy, $x );
}
- /** @deprecated since 1.19 */
- function setSkin( $x ) {
- wfDeprecated( __METHOD__, '1.19' );
- }
-
function setInterfaceMessage( $x ) {
return wfSetVar( $this->mInterfaceMessage, $x );
}
}
protected function searchInternal( $term, $fulltext ) {
- global $wgCountTotalSearchHits;
-
// This seems out of place, why is this called with empty term?
if ( trim( $term ) === '' ) {
return null;
);
$total = null;
- if ( $wgCountTotalSearchHits ) {
- $query = $this->getCountQuery( $filteredTerm, $fulltext );
- $totalResult = $this->db->select(
- $query['tables'], $query['fields'], $query['conds'],
- __METHOD__, $query['options'], $query['joins']
- );
-
- $row = $totalResult->fetchObject();
- if ( $row ) {
- $total = intval( $row->c );
- }
- $totalResult->free();
+ $query = $this->getCountQuery( $filteredTerm, $fulltext );
+ $totalResult = $this->db->select(
+ $query['tables'], $query['fields'], $query['conds'],
+ __METHOD__, $query['options'], $query['joins']
+ );
+
+ $row = $totalResult->fetchObject();
+ if ( $row ) {
+ $total = intval( $row->c );
}
+ $totalResult->free();
return new SqlSearchResultSet( $resultSet, $this->searchTerms, $total );
}
}
function getTotalHits() {
- return $this->totalHits;
+ if ( !is_null( $this->totalHits ) ) {
+ return $this->totalHits;
+ } else {
+ // Special:Search expects a number here.
+ return $this->numRows();
+ }
}
}
}
protected function searchInternal( $term, $fulltext ) {
- global $wgCountTotalSearchHits, $wgContLang;
+ global $wgContLang;
if ( !$this->fulltextSearchSupported() ) {
return null;
$resultSet = $this->db->query( $this->getQuery( $filteredTerm, $fulltext ) );
$total = null;
- if ( $wgCountTotalSearchHits ) {
- $totalResult = $this->db->query( $this->getCountQuery( $filteredTerm, $fulltext ) );
- $row = $totalResult->fetchObject();
- if ( $row ) {
- $total = intval( $row->c );
- }
- $totalResult->free();
+ $totalResult = $this->db->query( $this->getCountQuery( $filteredTerm, $fulltext ) );
+ $row = $totalResult->fetchObject();
+ if ( $row ) {
+ $total = intval( $row->c );
}
+ $totalResult->free();
return new SqlSearchResultSet( $resultSet, $this->searchTerms, $total );
}
);
$download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
+ // Add delete links if allowed
+ // From https://github.com/Wikia/app/pull/3859
+ if ( $filePage->userCan( 'delete', $this->getUser() ) ) {
+ $deleteMsg = $this->msg( 'listfiles-delete' )->escaped();
+
+ $delete = Linker::linkKnown(
+ $filePage, $deleteMsg, array(), array( 'action' => 'delete' )
+ );
+ $delete = $this->msg( 'parentheses' )->rawParams( $delete )->escaped();
+
+ return "$link $download $delete";
+ }
+
return "$link $download";
} else {
return htmlspecialchars( $value );
}
$rows[$subject] .=
- Xml::openElement(
- 'td', array( 'style' => 'white-space: nowrap' )
- ) .
+ Xml::openElement( 'td' ) .
Xml::checkLabel(
$name,
"ns{$namespace}",
}
// Return final output
- return Xml::openElement(
- 'fieldset',
- array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
- ) .
+ return Xml::openElement( 'fieldset', array( 'id' => 'mw-searchoptions' ) ) .
Xml::element( 'legend', null, $this->msg( 'powersearch-legend' )->text() ) .
Xml::tags( 'h4', null, $this->msg( 'powersearch-ns' )->parse() ) .
Html::element( 'div', array( 'id' => 'mw-search-togglebox' ) ) .
->numParams( $resultsShown )
->parse();
$out .= Xml::tags( 'div', array( 'class' => 'results-info' ), $top ) .
- Xml::element( 'div', array( 'style' => 'clear:both' ) );
+ Xml::element( 'div', array( 'style' => 'clear:both' ), '', false );
}
return $out . $this->didYouMeanHtml;
$category = false;
}
+ $noForeign = '';
+ if ( !$this->likelyToHaveFalsePositives() ) {
+ // Additional messages for grep:
+ // wantedfiletext-cat-noforeign, wantedfiletext-nocat
+ $noForeign = '-noforeign';
+ }
+
if ( $category ) {
return $this
- ->msg( 'wantedfiletext-cat' )
+ ->msg( 'wantedfiletext-cat' . $noForeign )
->params( $category->getFullText() )
->parseAsBlock();
} else {
return $this
- ->msg( 'wantedfiletext-nocat' )
+ ->msg( 'wantedfiletext-nocat' . $noForeign )
->parseAsBlock();
}
}
+ /**
+ * Whether foreign repos are likely to cause false positives
+ *
+ * In its own function to allow subclasses to override.
+ * @see SpecialWantedFilesGUOverride in GlobalUsage extension.
+ * @since 1.24
+ */
+ protected function likelyToHaveFalsePositives() {
+ return RepoGroup::singleton()->hasForeignRepos();
+ }
+
/**
* KLUGE: The results may contain false positives for files
* that exist e.g. in a shared repo. Setting this at least
* keeps them from showing up as redlinks in the output, even
* if it doesn't fix the real problem (bug 6220).
+ *
+ * @note could also have existing links here from broken file
+ * redirects.
* @return bool
*/
function forceExistenceCheck() {
# has structures (try/catch, foo()->bar(), etc etc) which throw parse errors in
# PHP 4. Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and
# 5.1, respectively.
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
wfPHPVersionError( 'index.php' );
function initContLang() {
}
- /**
- * Same as getFallbacksFor for current language.
- * @return array|bool
- * @deprecated since 1.19
- */
- function getFallbackLanguageCode() {
- wfDeprecated( __METHOD__, '1.19' );
-
- return self::getFallbackFor( $this->mCode );
- }
-
/**
* @return array
* @since 1.19
include "$IP/languages/Names.php";
}
+ // If passed an invalid language code to use, fallback to en
+ if ( $inLanguage !== null && !Language::isValidCode( $inLanguage ) ) {
+ $inLanguage = 'en';
+ }
+
$names = array();
if ( $inLanguage ) {
"viewsourcetext": "تمكنك مطالعة و نسخ مصدر هذه الصفحة:",
"viewyourtext": "يمكنك استعراض و نسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
"protectedinterface": "توفر هذه الصفحة نص الواجهة للبرنامج على هذا الويكي، وهي محمية لمنع سوء أستخدامها.\nلإضافة أو تغيير الترجمات لجميع مشاريع الويكي، رجاءً أستخدم [//translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.",
- "editinginterface": "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.\nسوف تؤثر التغييرات في هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين على هذا الويكي.\nلإضافة أو تغيير الترجمات في جميع مشاريع الويكي، رجاءً استخدم [//translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.",
+ "editinginterface": "<strong>تنبيه:</strong> تعديل هذه الصفحة سيحفظ في هذا الويكي فقط. لتعميم التعديل على جميع مشاريع ميدياويكي، عدلها في [//translatewiki.net/ مشروع ترجمة الويكي].",
"cascadeprotected": "تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية \"حماية الصفحات المدمجة\" {{PLURAL:$1||بها|بهما|بها}}:\n$2",
"namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
"customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
"virus-badscanner": "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
"virus-scanfailed": "فشل المسح (كود $1)",
"virus-unknownscanner": "مضاد فيروسات غير معروف:",
- "logouttext": "'''أنت الآن غير مسجل الدخول.'''\n\nقد ترى بعض الصفحات كما لو أنك ما زلت مسجل الدخول، وذلك حتى تفرغ التخزين المؤقت في متصفحك.",
+ "logouttext": "<strong>أنت الآن غير مسجل الدخول.</strong> قد ترى بعض الصفحات كما لو أنك ما زلت مسجل الدخول، وذلك حتى تفرغ التخزين المؤقت في متصفحك.",
"welcomeuser": "أهلاً بك يا $1!",
"welcomecreation-msg": "تم إنشاء حسابك.\nلا تنس تعديل [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].",
"yourname": "اسم المستخدم:",
"exbeforeblank": "المحتوى قبل الإفراغ كان: '$1'",
"delete-confirm": "حذف \"$1\"",
"delete-legend": "حذف",
- "historywarning": "'''تحذير:''' الصفحة التي توشك على حذفها لها تاريخ فيه {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} تقريبا:",
+ "historywarning": "'''تنبيه:''' الصفحة التي تريد حذفها بها {{PLURAL:$1|نسخة|نسخة واحدة|نسختان|$1 نسخ|$1 نسخة}}. انظر",
"confirmdeletetext": "أنت على وشك أن تقوم بحذف صفحة بالإضافة إلى كل تاريخها.\nمن فضلك التأكد من عزمك على الحذف، وبأنك مدرك للعواقب، وبأنك تقوم بهذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
"actioncomplete": "انتهاء العملية",
"actionfailed": "الفعل فشل",
"delete-edit-reasonlist": "عدل أسباب الحذف",
"delete-toobig": "لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.\nقُيّد محذف مثل هذه الصفحات لمنع الاضطراب المفاجئة في {{SITENAME}}.",
"delete-warning-toobig": "لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.\nقد يؤدي حذفها إلى اضطراب عمليات قاعدة البيانات في {{SITENAME}}؛\nاستمر مع الحذر.",
- "deleting-backlinks-warning": "'''تحذير:''' ترتبط [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحات أخرى]] بالصفحة التي أنت على وشك حذفها.",
+ "deleting-backlinks-warning": "[[Special:WhatLinksHere/{{FULLPAGENAME}}|تتصل صفحات أخرى]] بالصفحة التي تريد حذفها.",
"rollback": "استرجاع التعديلات",
"rollback_short": "استرجع",
"rollbacklink": "استرجع",
"tog-extendwatchlist": "Daweiterde Beówochtungslisten",
"tog-usenewrc": "Endarunga vo \"Lezde Endarunga\" und vo \"Mei Beobochtd\" noch Seitn gruppian",
"tog-numberheadings": "Ywerschriften autómaatisch nummerrirn",
- "tog-showtoolbar": "Beorweiten-Werkzeigleisten åzoang (JavaScript werd braucht)",
+ "tog-showtoolbar": "Zoag de Edit Toolbar (JavaScript nedig)",
"tog-editondblclick": "Seiten mid am Dóppedrucker beorweiden (JavaScript werd braucht)",
"tog-editsectiononrightclick": "Oahzelne Obschnitt mid am Rechtsdrucker beorweiten (JavaScript werd braucht)",
"tog-watchcreations": "Voh mir söwer eihgstöde Seiten autómaatisch beówochten",
"listgrouprights-addgroup-self-all": "Kauh olle Gruppm zum oagern Kóntó dazuadoah",
"mailnologin": "Du bist néd auhgmödt",
"emailuser": "Mail an den Nutza",
- "emailpage": "E-Mail aun Benutzer",
- "noemailtitle": "Koah E-Mail-Adress",
+ "emailpage": "E-Mail an Nutza",
+ "noemailtitle": "Koa Mail-Adress",
"emailfrom": "Voh:",
"emailto": "Aun:",
"emailsubject": "Bedreff:",
"ipbreason-dropdown": "* Oigmoahne Sperrgrynd\n** Eihfyng voh voische Informaziónen\n** Laarn voh Seiten\n** Massenweiss Eihfyng voh externe Links\n** Eihstön voh unsinnige Inhoite auf Seiten\n** néd åbrochts Vahoiden\n** Missbrauch mid mererne Benutzerkontós\n** néd geigneter Benutzernåm",
"ipb-hardblock": "Auhgmödte Benutzer dodrauh hindern, daas Beorweitungen unter derer IP-Adress vurgnummer wern",
"ipbcreateaccount": "D' Erstöung voh Benutzerkóntós vahindern",
- "ipbemailban": "E-Mail-Vasånd sperrn",
+ "ipbemailban": "E-Mail-Vasand spean",
"ipbenableautoblock": "Sperr dé aktuö voh dém Benutzer gnutzde IP-Adress sówia autómaatisch olle fóiganden, voh dénen aus er Beorweitungen óder 's Auhléng voh Benutzerkóntós vasuacht.",
"ipbsubmit": "IP-Adress/Benutzer sperrn",
"ipbother": "Åndre Dauer (auf englisch):",
"unblocklink": "Freigebm",
"change-blocklink": "Sperr endan",
"contribslink": "Beidreg",
- "emaillink": "E-Póst schicker",
+ "emaillink": "E-Mail vaschicka",
"autoblocker": "Autómaatische Sperr, wei du a gmoahsaume IP-Adress mim [[User:$1|$1]] bnutzd. Grund voh da Benutzersperrn: „$2“.",
"blocklogpage": "Sperrlogbuach",
"blocklog-showlog": "{{GENDER:$1|Der Benutzer|Dé Benutzerrin|Der Benutzer}} do is schoh friarer gsperrd worn. Es fóigt a Eihtrog aus'm Benutzersperrlogbiaché:",
"block-log-flags-anononly": "netter Anónyme",
"block-log-flags-nocreate": "Es Olegn vo Nutzakontn is gsperrt",
"block-log-flags-noautoblock": "Autóblóck deaktivierd",
- "block-log-flags-noemail": "E-Post vaschicka gspead",
+ "block-log-flags-noemail": "Mail vaschicka gspead",
"unlockdb": "Daatenbaunk freigeem",
"unlockconfirm": "Ja, i mecht de Datenbank freigem.",
"unlockbtn": "Datenbank freigem",
"rclistfrom": "Ipahiling an baguhon na mga kaliwatan magpoon kan $3 $2",
"rcshowhideminor": "$1 saradit na mga pagliwat",
"rcshowhideminor-show": "Ipatanaw",
- "rcshowhideminor-hide": "Tagoa",
+ "rcshowhideminor-hide": "Itago",
"rcshowhidebots": "$1 mga gantaw",
"rcshowhidebots-show": "Ipatanaw",
- "rcshowhidebots-hide": "Tagoa",
+ "rcshowhidebots-hide": "Itago",
"rcshowhideliu": "$1 rehistradong mga paragamit",
"rcshowhideliu-show": "Ipatanaw",
- "rcshowhideliu-hide": "Tagoa",
+ "rcshowhideliu-hide": "Itago",
"rcshowhideanons": "$1 mga dae bistong paragamit",
"rcshowhideanons-show": "Ipatanaw",
- "rcshowhideanons-hide": "Tagoa",
+ "rcshowhideanons-hide": "Itago",
"rcshowhidepatr": "$1 patrolyadong mga pagliwat",
"rcshowhidepatr-show": "Ipatanaw",
"rcshowhidepatr-hide": "Tagoa",
"rcshowhidemine": "$1 sakong mga pagliliwat",
"rcshowhidemine-show": "Ipatanaw",
- "rcshowhidemine-hide": "Tagoa",
+ "rcshowhidemine-hide": "Itago",
"rclinks": "Ipahilíng an $1 huring mga kaliwatan sa laog nin huring $2 na mga aldaw<br />$3",
"diff": "kalaenan",
"hist": "sagaysay",
"duplicate-defaultsort": "'''Patanid tabi:''' An susing panugmad kan salansan na \"$2\" minasalimbaw sa dating susing panugmad kan salansan na \"$1\".",
"version": "Bersyon",
"version-extensions": "Instaladong mga ekstensyon",
+ "version-skins": "Mga kublit",
"version-specialpages": "Espesyal na mga pahina",
"version-parserhooks": "Mga pangawil kan parser",
"version-variables": "Mga kabalanggayahan",
"version-antispam": "Pan-spam na pangataman",
- "version-skins": "Mga kublit",
"version-other": "An iba pa",
"version-mediahandlers": "Mga Midyang Tagakapot",
"version-hooks": "Mga pangawil",
"pagelang-language": "Мова",
"pagelang-use-default": "Ужываць мову па змоўчаньні",
"pagelang-select-lang": "Абярыце мову",
- "right-pagelang": "Зьмяніць мову старонкі"
+ "right-pagelang": "Зьмяніць мову старонкі",
+ "action-pagelang": "зьмену мовы старонкі"
}
"nospecialpagetext": "<strong>Вы звярнуліся па няправільную адмысловую старонку.</strong>\n\nПералік правільных адмысловых старонак ёсць на [[Special:SpecialPages|{{int:specialpages}}]].",
"error": "Памылка",
"databaseerror": "Памылка базы дадзеных",
+ "databaseerror-text": "Здарылася памылка запыту да базы звестак.\nГэта можа ўказваць на няспраўнасць у праграме.",
+ "databaseerror-textcl": "Здарылася памылка запыту да базы звестак.",
"databaseerror-query": "Запыт: $1",
"databaseerror-function": "Функцыя: $1",
"databaseerror-error": "Памылка: $1",
"license-nopreview": "(без перадпаказу)",
"upload_source_url": " (сапраўдны, публічна дасягальны URL)",
"upload_source_file": " (файл на вашай машыне)",
+ "listfiles-delete": "сцерці",
"listfiles-summary": "Гэтая службовая старонка паказвае ўсе загружаныя файлы.",
"listfiles_search_for": "Знайсці назву выявы:",
"imgfile": "файл",
"protect-badnamespace-title": "Прастора імёнаў без аховы",
"protect-badnamespace-text": "Старонкі ў гэтай прасторы імёнаў не могуць знаходзіцца пад аховай.",
"protect-norestrictiontypes-text": "Старонка не можа ахоўвацца, таму што недаступны тыпы абмежавання.",
+ "protect-norestrictiontypes-title": "Неахоўвальная старонка",
"protect-legend": "Пацверджанне пачатку аховы",
"protectcomment": "Прычына:",
"protectexpiry": "Канчаецца:",
"import-error-interwiki": "Старонка «$1» не была імпартаваная, таму што гэтая назва зарэзерваваная для інтэрвікі.",
"import-error-special": "Старонка «$1» не была імпартаваная, таму што яна належыць да спецыяльнай прасторы назваў, старонкі ў якой не дазволеныя.",
"import-error-invalid": "Старонка «$1» не была імпартаваная з-за няслушнасці назвы.",
+ "import-error-unserialize": "Немагчыма дэсерыялізаваць версію $2 старонкі \"$1\". Меркавалася, што версія выкарыстоўвае мадэль змесціва $3, серыялізавана як $4.",
"import-error-bad-location": "Версія $2, якая выкарыстоўвае мадэль змесціва $3, не можа быць запісана на старонцы \"$1\" гэтай вікі, паколькі такая мадэль не падтрымліваецца на гэтай старонцы.",
"import-rootpage-invalid": "Пазначаная назва каранёвай старонкі недапушчальная.",
"import-rootpage-nosubpage": "У прастора назваў \"$1\" каранёвай старонкі падстаронкі не дазволены.",
"version-license-title": "Ліцэнзія $1",
"version-license-not-found": "Не знойдзена падрабязнай інфармацыі аб ліцэнзіі для гэтай прыстаўкі.",
"version-credits-title": "Спіс аўтараў $1",
+ "version-credits-not-found": "Для гэтай прыстаўкі не знойдзена падрабязных звестак пра аўтараў.",
"version-poweredby-credits": "Пляцоўка працуе на '''[https://www.mediawiki.org/ MediaWiki]''', капірайт © 2001-$1 $2.",
"version-poweredby-others": "іншыя",
"version-poweredby-translators": "перакладчыкі translatewiki.net",
+ "version-credits-summary": "Мы хацелі б адзначыць наступных асоб, якія зрабілі ўнёсак у [[Special:Version|MediaWiki]].",
"version-license-info": "MediaWiki з'яўляецца свабодным праграмным забеспячэннем. Такім чынам, вы можаце паўторна распаўсюджваць прадукт і(або) змяняць яго на ўмовах пагаднення GNU General Public License у тым выглядзе, у якім яно публікуецца фондам Free Software Foundation; сілу мае версія (выпуск) 2 гэтага пагаднення або, на ваш выбар, навейшая версія (выпуск) пагаднення.\n\nMediaWiki распаўсюджваецца, спадзеючыся на прыдатнасць прадукта, але БЕЗ ЯКІХ-НЕБУДЗЬ ГАРАНТЫЙ, у тым ліку, без імплікаваных гарантый СПАЖЫВЕЦКАЙ ВАРТАСЦІ або ПРЫДАТНАСЦІ ДЛЯ ЯКОЙ-НЕБУДЗЬ МЭТЫ. Больш падрабязна гл. пагадненне GNU General Public License.\n\nРазам з гэтым праграмным забеспячэннем вы павінны былі атрымаць [{{SERVER}}{{SCRIPTPATH}}/COPYING копію пагаднення GNU General Public License]. Калі гэта не так, паведамце аб гэтым у фонд Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA або [//www.gnu.org/licenses/old-licenses/gpl-2.0.html атрымайце яе з Інтэрнэту].",
"version-software": "Устаноўленыя праграмныя прадукты",
"version-software-product": "Прадукт",
"version-software-version": "Версія",
+ "version-entrypoints": "Уваходныя адрасы",
"version-entrypoints-header-entrypoint": "Кропка ўваходу",
"version-entrypoints-header-url": "URL",
"redirect": "Перасылка да файла, ID удзельніка, старонкі ці версіі",
"duration-millennia": "$1 {{PLURAL:$1|тысячагоддзе|тысячагоддзі|тысячагоддзяў}}",
"rotate-comment": "Выява павернута на $1 {{PLURAL:$1|градус|градусы|градусаў}} па гадзіннікавай стрэлцы",
"limitreport-title": "Звесткі прафілявання парсера:",
+ "limitreport-cputime": "Выкарыстанне часу ЦП",
"limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
"limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+ "limitreport-ppvisitednodes": "Колькасць вузлоў, наведаных прэпрацэсарам",
"limitreport-ppgeneratednodes": "Колькасць вузлоў, створаных прэпрацэсарам",
"limitreport-postexpandincludesize": "Памер уключэнняў па разгортванні",
"limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт|байты|байтаў}}",
"limitreport-expensivefunctioncount": "Колькасць працаёмкіх зваротаў да функцый парсера",
"expandtemplates": "Разгортванне шаблонаў",
"expand_templates_intro": "Гэта адмысловая старонка бярэ тэкст і разгортвае ў ім усе шаблоны рэкурсіўна.\nТаксама разгортвае падтрыманыя функцыі парсера кшталту\n<code><nowiki>{{</nowiki>#language:…}}</code> і зменныя віду\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nФактычна, яна разгортвае ў пэўнай ступені ўсё ў двайных фігурных дужках.",
+ "expand_templates_title": "Загаловак старонкі, для {{FULLPAGENAME}} і г.д.:",
"expand_templates_input": "Уваходны тэкст:",
"expand_templates_output": "Вынік",
"expand_templates_xml_output": "Выніковы XML",
"tog-hidepatrolled": "हाल के परिवर्तन में मामूली संपादन छुपाईं",
"tog-newpageshidepatrolled": "नयका पृष्ठ के सूची में से जाँचल पृष्क के छुपाँई",
"tog-extendwatchlist": "मात्र हाल के परिवर्तन ही नाही,बल्कि सब परिवर्तन के देखावे खातिर ध्यान सूची के विस्तारित करीं",
- "tog-usenewrc": "तà¥\81रà¤\82त à¤à¤\88ल परिवरà¥\8dतन à¤\86 धà¥\8dयानसà¥\82à¤\9aà¥\80 परिवरà¥\8dतनà¥\8bà¤\82 à¤\95à¥\87 पनà¥\8dना à¤\95à¥\87 à¤\85नà¥\81सार समà¥\82ह मà¥\87à¤\82 बाà¤\81à¤\9fà¥\80 (à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\86वशà¥\8dयà¤\95)",
+ "tog-usenewrc": "तà¥\81रà¤\82त à¤à¤\88ल परिवरà¥\8dतन मà¥\87à¤\82 à¤\86 धà¥\8dयानसà¥\82à¤\9aà¥\80 मà¥\87à¤\82 à¤à¤\88ल परिवरà¥\8dतनन à¤\95à¥\87 पनà¥\8dना à¤\85नà¥\81सार समà¥\82ह मà¥\87à¤\82 बाà¤\82à¤\9fà¥\80",
"tog-numberheadings": "स्वयं-सांख्यिकी शिर्षक",
- "tog-showtoolbar": "समà¥\8dपादन à¤\94à¤\9cारà¥\8d बà¤\95à¥\8dसा à¤\95à¥\87 दिà¤\96ाà¤\87लà¥\8d à¤\9cाà¤\8f",
- "tog-editondblclick": "दà¥\81à¤\88 à¤\95à¥\8dलिà¤\95 पर पà¥\83षà¥\8dठसà¤\82पादित à¤\95रà¥\80à¤\82 (à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\86वशà¥\8dयà¤\95 बा)",
- "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक कर अनुभाग सम्पादित करीं (जावास्क्रिप्ट आवश्यक बा)",
+ "tog-showtoolbar": "समà¥\8dपादन à¤\94à¤\9cारपà¤\9fà¥\8dà¤\9fà¥\80 à¤\95à¥\87 दिà¤\96ावल à¤\9cाव",
+ "tog-editondblclick": "दà¥\81à¤\88 à¤\95à¥\8dलिà¤\95 पर पनà¥\8dना सà¤\82पादन à¤\95रà¥\80à¤\82",
+ "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक कर अनुभाग सम्पादित करीं",
"tog-watchcreations": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
"tog-watchdefault": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
"tog-watchmoves": "हमरा द्वारा स्थानांतरित पृष्ठ आ लादल फाईल के हमरा ध्यानसूची में जोड़ी",
"tog-shownumberswatching": "ध्यान रखे वालन सदस्यन के देखावल जाव",
"tog-oldsig": "वर्तमान हस्ताक्षर:",
"tog-fancysig": "हस्ताक्षर के विकी पाठ के रुप में उपयोग करीं (बिना स्वचालित कड़ी के)",
- "tog-uselivepreview": "लाà¤\88व पà¥\81रà¥\8dवालà¥\8bà¤\95न à¤\95à¥\87 पà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 (à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f हà¥\8bà¤\96à¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82) (पà¥\8dरयà¥\8bà¤\97à¤\95à¥\8dषम)",
+ "tog-uselivepreview": "लाà¤\87व पà¥\81रà¥\8dवालà¥\8bà¤\95न à¤\95à¥\87 पà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 (पà¥\8dरयà¥\8bà¤\97ातà¥\8dमà¤\95)",
"tog-forceeditsummary": "यदि सम्पादन सारांश ना दिहल होखे त हमके सूचित करब",
"tog-watchlisthideown": "हमार ध्यान दिहल पन्ना के सूची से हमरा खातिर परिवर्तन छिपाईं",
"tog-watchlisthidebots": "हमार ध्यान सूची से बोट द्वारा करल गईल परिवर्तन के छिपाईं",
"category-empty": "''इ श्रेणी में इ समय कउनो पन्ना या मीडिया नइखे।''",
"hidden-categories": "{{PLURAL:$1|छुपावल गईल श्रेणी|छुपावल गईल श्रेणीं}}",
"hidden-category-category": "छुपावल गइल श्रेणीं",
- "category-subcat-count": "{{PLURAL:$2|à¤\87 शà¥\8dरà¥\87णà¥\80 मà¥\87à¤\82 मातà¥\8dर निमà¥\8dनलिà¤\96ित à¤\89पशà¥\8dरà¥\87णà¥\80 बा|à¤\87 शà¥\8dरà¥\87णà¥\80 मà¥\87à¤\82 निमà¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80याà¤\82}} बाड़à¥\87, à¤\95à¥\81ल à¤\89पशà¥\8dरà¥\87णà¥\80याà¤\82 $2 बाड़à¥\87।}}",
+ "category-subcat-count": "{{PLURAL:$2|à¤\87 शà¥\8dरà¥\87णà¥\80 मà¥\87à¤\82 मातà¥\8dर निमà¥\8dनलिà¤\96ित à¤\89पशà¥\8dरà¥\87णà¥\80 बा|à¤\87 शà¥\8dरà¥\87णà¥\80 मà¥\87à¤\82 निमà¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णियाà¤\82}} बाड़à¥\87, à¤\95à¥\81ल à¤\89पशà¥\8dरà¥\87णियाà¤\81$2}}",
"category-subcat-count-limited": "इ श्रेणी में निम्नलिखित {{PLURAL:$1|उपश्रेणी बा|$1 उपश्रेणीं बाड़े}}।",
- "category-article-count": "{{PLURAL:$2|इ श्रेणी में मात्र निम्नलिखित पन्ना बा।|इ श्रेणी में निम्नलिखित {{PLURAL:$1|पन्ना बा|$1 पन्नें}}, कुल पन्नें $2 बाड़े।}}",
+ "category-article-count": "{{PLURAL:$2|इ श्रेणी में मात्र निम्नलिखित पन्न बा।|इ श्रेणी में निम्नलिखित {{PLURAL:$1|पन्ना बा|$1 पन्ना बाड़े}, कुल पन्ना $2}}",
"category-article-count-limited": "निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्ना}} इ श्रेणीं में बा।",
"category-file-count": "{{PLURAL:$2|इ श्रेणी में मात्र निम्नलिखित फ़ाइल बा।|इ श्रेणी में निम्नलिखित {{PLURAL:$1|फ़ाइल|$1 फ़ाइलं}} बाड़े, कुल फ़ाइलं $2}}",
"category-file-count-limited": "वर्तमान में निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्नां}} इ श्रेणीं में बाड़े।",
"newwindow": "(नया विंडो में खोलीं)",
"cancel": "निरस्त",
"moredotdotdot": "अउर...",
- "morenotlisted": "à¤\85धिà¤\95 सà¥\82à¤\9aà¥\80बदà¥\8dध नà¤\87à¤\96à¥\87...",
+ "morenotlisted": "à¤\87 सà¥\82à¤\9aà¥\80 पà¥\82रà¥\8dण नà¤\87à¤\96à¥\87।",
"mypage": "पन्ना",
"mytalk": "राउर बात",
"anontalk": "इ आइ॰पी खातिर वार्ता",
"permalink": "स्थायी लिंक",
"print": "छापीं",
"view": "देखीं",
+ "view-foreign": "$1 पर देखीं",
"edit": "सम्पादन",
+ "edit-local": "क्षेत्रीय विवरण देखीं",
"create": "बनाईं",
+ "create-local": "क्षेत्रीय विवरण जोड़ीं",
"editthispage": "ई पन्ना के सम्पादन करीं",
"create-this-page": "ई पन्ना के निर्माण करीं",
"delete": "मिटाईं",
"articlepage": "सामग्री पन्ना देखीं",
"talk": "बात-चीत",
"views": "विचारसूची",
- "toolbox": "à¤\94à¤\9cार-पà¥\87à¤\9fà¥\80",
+ "toolbox": "à¤\89पà¤\95रण",
"userpage": "प्रयोगकर्ता पन्ना देखीं",
"projectpage": "परियोजना पन्ना देखीं",
"imagepage": "फाईल पन्ना देखीँ",
"jumptonavigation": "परिभ्रमण",
"jumptosearch": "खोजीं",
"view-pool-error": "क्षमा करीं, ई समय सर्वर पर बहुत ज्यादा लोड बढ़ गईल बा।\nई पन्ना के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बानी।\nई पन्ना के फिर से देखे से पहिले कृपया कुछ देर तक इन्तजार करीं।\n\n$1",
+ "generic-pool-error": "क्षमा करीं, ई समय सर्वर पर बहुत ज्यादा लोड बढ़ गईल बा।\nई संसाधन के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बानी।\nई संसाधन तक पहुँच बनावे के कोशिश से पहिले कृपया कुछ देर तक इन्तजार करीं।",
"pool-timeout": "तालाबन्दी खातिर प्रतीक्षा समय समाप्त",
"pool-queuefull": "पूल पंक्ति भर गइल",
"pool-errorunknown": "अज्ञात त्रुटि",
+ "pool-servererror": "पूल काउंटर सेवा उपलब्ध नाही बा ($1)।",
"aboutsite": "{{SITENAME}} के बारे में",
"aboutpage": "Project:बारे में",
- "copyright": "सामà¤\97à¥\8dरà¥\80 $1 à¤\95à¥\87 तहत à¤\89पलबà¥\8dध बा।",
+ "copyright": "à¤\89पलबà¥\8dध सामà¤\97à¥\8dरà¥\80 $1 à¤\95à¥\87 à¤\85धà¥\80न à¤\89पलबà¥\8dध बा à¤\9cब तà¤\95 à¤\95à¥\80 à¤\85लà¤\97 सà¥\87 à¤\89लà¥\8dलà¥\87à¤\96 ना à¤\95रल à¤\97à¤\88ल हà¥\8bà¤\96à¥\87 ।",
"copyrightpage": "{{ns:project}}:लेखाधिकार",
"currentevents": "हाल के घटना",
"currentevents-url": "Project:हाल के घटना",
"youhavenewmessages": "रउआ लगे बा $1 ($2).",
"youhavenewmessagesfromusers": "रउआ खातिर {{PLURAL:$3|एगो अन्य सदस्य|$3 अन्य सदस्यन}} के $1 बा। ($2)",
"youhavenewmessagesmanyusers": "रउआ खातिर कई सदस्यन द्वारा $1 बा। ($2)",
- "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\97à¥\8b नया सनà¥\8dदà¥\87श बा|नया सनà¥\8dदà¥\87श बाड़न}}",
- "newmessagesdifflinkplural": "{{PLURAL:$1|पिछला|पिछलका}} बदलाव",
+ "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\95 नया सनà¥\8dदà¥\87श|999=नयà¤\95ा सनà¥\8dदà¥\87श}}",
+ "newmessagesdifflinkplural": "पिछला {{PLURAL:$1|बदलाव|999=बदलावं}}",
"youhavenewmessagesmulti": "रउआ लगे $1 पर नया सन्देश बा",
"editsection": "सम्पादन",
"editold": "सम्पादन",
"nospecialpagetext": "<strong>रउआ एगो अवैद्य विशेष पन्ना के अनुरोध कईले बानी।</strong>\n\nवैद्य विशेष पन्ना के सूची मिल सकत बा [[Special:SpecialPages|{{int:specialpages}}]] पर।",
"error": "त्रुटी",
"databaseerror": "डेटाबेस त्रुटी",
+ "databaseerror-text": "डाटाबेस अनुरोध त्रुटि भइल बा।\nसंभवतः सॉफ़्टवेयर में गड़बड़ी बा।",
+ "databaseerror-textcl": "डाटाबेस अनुरोध त्रुटि उत्त्पन्न हो गईल बा।",
+ "databaseerror-query": "अनुरोध: $1",
+ "databaseerror-function": "फ़ंक्शन: $1",
+ "databaseerror-error": "त्रुटि: $1",
"laggedslavemode": "'''चेतावनी:''' इ पन्ना पर हाल के बदलाव ना होखे के आशंका बा।",
"readonly": "डेटाबेस लॉक बा",
"enterlockreason": "लॉक करे के कारण दिहीं, साथे लॉक खुले के समय के लगभग आकलन दिहीं।",
"invalidtitle-knownnamespace": "\"$2\" नामस्थान आ \"$3\" पाठ्य वाला गलत शीर्षक",
"invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आ नाम \"$2\" वाला गलत शीर्षक",
"exception-nologin": "खाता में प्रवेश नईखीं भईल",
- "exception-nologin-text": "इ पन्ना अथवा कार्य खातिर रउआ विकि प्रवेश (लॉग इन) होना आवश्यक है।",
+ "exception-nologin-text": "इ पन्ना अथवा कार्य के सक्षम करे खातिर कृपया [[Special:Userlogin|लॉग इन]] करीं।",
+ "exception-nologin-text-manual": "इ पन्ना अथवा कार्य के सक्षम करे खातिर कृपया $1 करीं।",
"virus-badscanner": "गलत जमाव: अज्ञात वायरस जाँचक: ''$1''",
"virus-scanfailed": "जाँच विफल (कोड $1)",
"virus-unknownscanner": "अज्ञात ऐंटीवायरस:",
"gotaccount": "का पहिले से एगो खाता बा? $1.",
"gotaccountlink": "खाता में प्रवेश",
"userlogin-resetlink": "का रउआ आपन प्रवेश जानकारी भूला गइल बानी?",
- "userlogin-resetpassword-link": "आपन गुप्तशब्द के फिर से बहाल करीं",
+ "userlogin-resetpassword-link": "आपन गुप्तशब्द भूला गईनी का?",
+ "userlogin-helplink2": "खाता प्रवेश साथ मदद",
+ "userlogin-loggedin": "रउआ {{GENDER:$1|$1}} के रूप में पहिले से लॉग्ड इन बानीं।\nकौनो अन्य सदस्य के रूप में लॉग इन करे खातिर निम्नलिखित फ़ॉर्म के प्रयोग करीं।",
+ "userlogin-createanother": "एगो दोसर खाता बनाईं",
"createacct-emailrequired": "ई-मेल पता",
"createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
"createacct-email-ph": "आपन ई-मेल पता लिखीं",
"passwordtooshort": "गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
"password-name-match": "राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।",
"password-login-forbidden": "इस सदस्यनाम आ गुप्तशब्द के प्रयोग वर्जित बा।",
- "mailmypassword": "नया à¤\97à¥\81पà¥\8dत-शबà¥\8dद à¤\88-मà¥\87ल पर à¤à¥\87à¤\9cीं",
+ "mailmypassword": "à¤\97à¥\81पà¥\8dतशबà¥\8dद रिसà¥\87à¤\9f à¤\95रीं",
"passwordremindertitle": "{{SITENAME}} खातिर नया अस्थायी गुप्त-शब्द",
"passwordremindertext": "केहु (शायद रउए, $1 आइ॰पी पता से) {{SITENAME}} ($4) पर प्रयोग खातिर नया गुप्तशब्द के निवेदन कईले बानी। सदस्य \"$2\" खातिर एगो अस्थायी गुप्तशब्द बना दिहल गईल बा, आ ई अभी \"$3\" बा। यदि ई राउरे आशय रहल, त अब रउआ खाता प्रवेश खातिर एगो नया गुप्तशब्द चुने के पड़ी।\nराउर अस्थायी गुप्तशब्द के अवधि {{PLURAL:$5|एक दिन|$5 दिनं}} में समाप्त हो जाई।\n\nयदि इ निवेदन केहु अउर कइले रहल, या रउआ आपन पुरान गुप्तशब्द अब नइखी बदले के चाहत काहे कि रउआ राउर पुरनका गुप्तशब्द के स्मरण हो आइल बा, त रउआ इ संदेश के अनदेखा कर सकत बानी, आ आपन पुरान गुप्तशब्द के प्रयोग पहिले हि जइसन कर सकत बानी।",
"noemail": "\"$1\" सदस्य खातिर कउनो भी ई-मेल पता दर्ज नइखे करल गइल।",
"noemailcreate": "रउआ एगो जायज ई-मेल पता उपलब्ध करावे के पड़ी।",
"passwordsent": "\"$1\" के ई-मेल पता पर एगो नया गुप्तशब्द भेज दिहल गइल बा।\nई-मेल पावे के बाद कृपया दुबारा खाता में प्रवेश करब।",
"blocked-mailpassword": "राउर आइ॰पी पता के सम्पादन करे से वंचित कर दिहल गइल बा, आ गलत प्रयोग रोके खातिर गुप्तशब्द पुनः प्राप्ति के सुविधा इ आइ॰पी पर बंद कर दिहल गइल बा।",
- "eauthentsent": "दरà¥\8dà¤\9c à¤\95रावल à¤\97à¤\87ल à¤\88-मà¥\87ल पता पर à¤\8fà¤\97à¥\8b पà¥\81षà¥\8dà¤\9fिà¤\95रण à¤\88-मà¥\87ल à¤à¥\87à¤\9c दिहल à¤\97à¤\87ल बा।\nरà¤\89à¤\86 à¤\89 à¤\88-मà¥\87ल पर दिहल à¤\97à¤\87ल निरà¥\8dदà¥\87श à¤\95à¥\87 à¤\85नà¥\81सरण à¤\95र à¤\95à¥\87 à¤\88-मà¥\87ल पता à¤\95à¥\87 पà¥\81षà¥\8dà¤\9fिà¤\95रण à¤\95रावà¥\87 à¤\95à¥\87 पड़à¥\80, à¤\93à¤\95रा बादà¥\87 à¤\85हिà¤\9cा सà¥\87 à¤\95à¤\89नà¥\8b दà¥\82सर à¤\88-मà¥\87ल à¤à¥\87à¤\9cल à¤\9cाà¤\88।",
+ "eauthentsent": "दरà¥\8dà¤\9c à¤\95रावल à¤\97à¤\87ल à¤\88-मà¥\87ल पता पर à¤\8fà¤\97à¥\8b पà¥\81षà¥\8dà¤\9fिà¤\95रण à¤\88-मà¥\87ल à¤à¥\87à¤\9c दिहल à¤\97à¤\87ल बा।\nà¤\89 à¤\96ाता पर à¤\95à¥\8cनà¥\8b दà¥\81सर à¤\88मà¥\87ल à¤à¥\87à¤\9cल à¤\9cाà¤\93 à¤\89 सà¥\87 पहिलà¥\87, रà¤\89à¤\86 à¤à¥\87à¤\9cल à¤\97à¤\88ल à¤\88-मà¥\87ल पर दिहल à¤\97à¤\87ल निरà¥\8dदà¥\87श à¤\95à¥\87 à¤\85नà¥\81सरण à¤\95र à¤\95à¥\87 à¤\88-मà¥\87ल पता à¤\95à¥\87 पà¥\81षà¥\8dà¤\9fिà¤\95रण à¤\95रावà¥\87 à¤\95à¥\87 पड़à¥\80 ताà¤\95ि पता à¤\9aलà¥\87 à¤\95à¥\80 सहà¥\80 मà¥\87à¤\82 à¤\89 राà¤\89रà¥\87 à¤\96ाता ह।",
"throttled-mailpassword": "पिछला {{PLURAL:$1|एक घंटा|$1 घंटा}} के अंदर एगो गुप्तशब्द पुनर्स्थापन ई-मेल भेजल जा चुकल बा।\nदुरुपयोग से बचावे खातिर {{PLURAL:$1|एक घंटा|$1 घंटा}} में सिर्फ एगो गुप्तशब्द पुनर्स्थापन ई-मेल भेजल जाई।",
"mailerror": "ई-मेल भेजे में त्रुटि: $1",
"acct_creation_throttle_hit": "राउर आइ॰पी पता से आईल आगंतुक पिछला चौबीस घंटा में इ विकि पर {{PLURAL:$1|एक खाता|$1 खाता}} बना चुकल बानी, इ समयावधि में इहे अधिकतम सीमा बा।\nअतः इ समय इ आइ॰पी पता के प्रयोग करे वाला आगंतुक अउर अधिक खाता नइखन बना सकत।",
- "emailauthenticated": "राउर ई-मेल पता के पुष्ट दिनांक $2 के $3 बजे हो चुकल रहे।",
- "emailnotauthenticated": "राउर ई-मेल पता के अभी तक प्रमाणिकरण नइखे भईल।\nनिम्नलिखित कउनो भी सुविधा खातिर रउआ ई-मेल ना भेजल जाई।",
+ "emailauthenticated": "$2 के $3 पर राउर ई-मेल पता के पुष्टीकरण हो चुकल बा।",
+ "emailnotauthenticated": "राà¤\89र à¤\88-मà¥\87ल पता à¤\95à¥\87 à¤\85à¤à¥\80 तà¤\95 पà¥\8dरमाणिà¤\95रण नà¤\87à¤\96à¥\87 à¤à¤\88ल।\nनिमà¥\8dनलिà¤\96ित à¤\95à¤\89नà¥\8b à¤à¥\80 सà¥\81विधा à¤\96ातिर रà¤\89à¤\86 à¤\95à¥\87 à¤\95à¥\8cनà¥\8b à¤à¥\80 à¤\88-मà¥\87ल ना à¤à¥\87à¤\9cल à¤\9cाà¤\88।",
"noemailprefs": "इ सुविधा के प्रयोग करे खातिर आपन वरियता में एगो ई-मेल पता दिहीं।",
"emailconfirmlink": "अपना ई-मेल पता कन्फर्म करीं",
"invalidemailaddress": "राउर ई-मेल पता स्वीकार करल नइखे जा सकत काहे कि ई-मेल के जउन रुप दिखाई दे रहल बा उ गलत लागत बा।\nकृपया एगो सहि ई-मेल पता उपलब्ध कराईं या उ जगह के खाली छोड़ दिहीं।",
"loginlanguagelabel": "भाषा: $1",
"suspicious-userlogout": "राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि अइसन लग रहल बा कि इ कउनो खराब ब्राउज़र या कैश करे वाली प्रॉक्सी द्वारा भेजल गईल रहल।",
"createacct-another-realname-tip": "असली नाम वैकल्पिक बा।\nयदि रउआ इ के उपलब्ध करावे के चुनत बानी त, एकर प्रयोग सदस्य के ओकरा काम के अधिकार देवे खातिर होखी।",
+ "pt-login": "खाता में प्रवेश",
+ "pt-login-button": "खाता में प्रवेश",
+ "pt-createaccount": "खाता बनाईं",
+ "pt-userlogout": "खाता से बाहर",
"php-mail-error-unknown": "PHP के mail() फ़ंक्शन में अज्ञात त्रुटि बा।",
"user-mail-no-addy": "बिना कउनो ई-मेल पता के ई-मेल भेजे के प्रयत्न भईल बा।",
"user-mail-no-body": "एगो खाली अथवा बहुत छोट ई-मेल भेजे के प्रयत्न भईल बा।",
"changepassword": "गुप्त शब्द बदलीं",
- "resetpass_announce": "रà¤\89à¤\86 à¤\88-मà¥\87ल सà¥\87 पà¥\8dरापà¥\8dत à¤\85सà¥\8dथायà¥\80 à¤\95à¥\8bड सà¥\87 à¤\96ाता मà¥\87à¤\82 पà¥\8dरवà¥\87श à¤à¤\88ल बानà¥\80।\nà¤\96ाता पà¥\8dरवà¥\87श à¤\95à¥\87 पà¥\82रा à¤\95रà¥\87 à¤\96ातिर रà¤\89à¤\86 à¤\87हाà¤\81 à¤\8fà¤\97à¥\8b नया à¤\97à¥\81पà¥\8dतशबà¥\8dद दà¥\87वà¥\87 à¤\95à¥\87 पड़à¥\80:",
+ "resetpass_announce": "लà¥\89à¤\97 à¤\87न समà¥\8dपà¥\82रà¥\8dण à¤\95रà¥\87 à¤\96ातिर रà¤\89à¤\86 à¤\8fà¤\97à¥\8b नया पासवरà¥\8dड दà¥\87वà¥\87 à¤\95à¥\87 हà¥\8bà¤\88।",
"resetpass_header": "खाता के गुप्तशब्द बदलीं",
"oldpassword": "पुराना गुप्त-शब्द:",
"newpassword": "नया गुप्त-शब्द:",
"retypenew": "नया गुप्त-शब्द पुन: डालीं:",
"resetpass_submit": "गुप्तशब्द बनाईं आ खाता में प्रवेश करीं",
"changepassword-success": "राउर गुप्तशब्द सफलतापुर्वक बदल दिहल गईल बा!",
+ "changepassword-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
"resetpass_forbidden": "गुप्तशब्द बदलल नइखे जा सकत",
"resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
"resetpass-submit-loggedin": "गुप्त शब्द बदलीं",
"resetpass-submit-cancel": "रद्द करीं",
"resetpass-wrong-oldpass": "अवैद्य अस्थायी या वर्तमान गुप्तशब्द।\nरउआ पहिले हिं सफलतापूर्वक आपन गुप्तशब्द बदल चुकल बानी, या रउआ एगो अस्थायी गुप्तशब्द के अनुरोध कइले होखब।",
+ "resetpass-recycled": "रीसेट करे खातिर नया पासवर्ड में कृपया आपन वर्तमान पासवर्ड के अलावा कौनो अन्य पासवर्ड के प्रयोग करीं।",
+ "resetpass-temp-emailed": "अस्थाई ईमेल कोड के द्वारा रउआ लॉग इन भइल बानी।\nलॉग इन पूरा करे खातिर, रउआ एगो नया पासवर्ड सेट करे के पड़ी:",
"resetpass-temp-password": "अस्थायी गुप्तशब्द:",
"resetpass-abort-generic": "कउनो एक्सटेंशन द्वारा गुप्तशब्द में बदलाव रोक दिहल गईल बा।",
+ "resetpass-expired": "राउर पासवर्ड की वैधता अवधि समाप्त हो चुकल बा। कृपया लॉग इन करे खातिर एगो नया पासवर्ड सेट करीं।",
"passwordreset": "गुप्तशब्द रिसेट करीं",
"passwordreset-text-one": "आपन गुप्तशब्द के पुनर्स्थापित करे खातिर इ फॉर्म भरीं।",
"passwordreset-text-many": "{{PLURAL:$1|आपन गुप्तशब्द पुनर्स्थापित करे खातिर निम्न में से कउनो एगो स्थान भरीं।}}",
"permissionserrors": "अनुमति त्रुटी",
"log-fulllog": "पूरा लॉग देखीं",
"edit-conflict": "संपादन अंतर्विरोध",
+ "postedit-confirmation-created": "पन्ना बना दिहल गईल।",
"postedit-confirmation-saved": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
"invalid-content-data": "अवैध डाटा सामग्री",
"content-model-wikitext": "विकीपाठ्य",
"prefs-editing": "संपादन",
"searchresultshead": "खोज",
"savedprefs": "राउर वरीयताएँ सुरक्षित कर दिहल गईल।",
+ "timezoneregion-africa": "अफ़्रीका",
+ "timezoneregion-america": "अमेरिका",
+ "timezoneregion-antarctica": "अंटार्कटिका",
+ "timezoneregion-arctic": "आर्कटिक",
"timezoneregion-asia": "एशिया",
+ "timezoneregion-atlantic": "एटलांटिक महासागर",
"timezoneregion-australia": "अस्ट्रेलिया",
"timezoneregion-europe": "यूरोप",
"timezoneregion-indian": "हिंद महासागर",
"yourrealname": "असली नाम",
"yourlanguage": "भाषा:",
"prefs-preview": "पूर्वावलोकन",
+ "action-move": "ई पन्ना के स्थांतरण करीं",
+ "action-delete": "ई पन्ना के मिटाईं",
"recentchanges": "तुरंत भईल परिवर्तन",
"recentchanges-legend": "हाल के परिवर्तन संबंधी विकल्प",
"recentchanges-label-newpage": "ई सम्पादन से एगो नवका पृष्ठ तैयार हो गइल बा",
"recentchanges-label-minor": "ई एगो छोटा सम्पाद बा",
+ "recentchanges-legend-heading": "'''कुंजी:'''",
"rcshowhideminor": "$1 छोट सम्पादन",
+ "rcshowhideminor-show": "दिखाईं",
+ "rcshowhideminor-hide": "छुपाँई",
"diff": "अन्तर",
"hist": "इति",
"hide": "छुपाँई",
"recentchangeslinked": "सम्बन्धित बदलाव",
"recentchangeslinked-feed": "सम्बन्धित बदलाव",
"recentchangeslinked-toolbox": "सम्बन्धित बदलाव",
+ "recentchangeslinked-page": "पन्ना नाम:",
"upload": "फाईल लादीं",
+ "filedesc": "सारांश",
+ "fileuploadsummary": "सारांश:",
+ "filesource": "स्रोत:",
+ "unknown-error": "अज्ञात त्रुटि उत्पन्न हो गईल बा।",
"file-anchor-link": "फ़ाइल",
"filehist": "पन्ना के इतिहास",
"filehist-deleteall": "सब मिटाईं",
"Mega programmer",
"Sasan700",
"Умар",
- "아라"
+ "아라",
+ "Kaganer"
]
},
"tog-underline": "КӀел сиз хьакха хьажорган:",
"unusedtemplateswlh": "кхин хьажоргаш",
"randompage": "Цахууш нисъелла агӀо",
"randomincategory": "Категори чу цахууш нисъелла агӀо",
+ "randomincategory-nopages": "[[:Category:$1]] категори чохь агӀонаш яц.",
"randomincategory-selectcategory": "Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.",
"randomincategory-selectcategory-submit": "Дехьа гӀо",
"randomredirect": "Цахууш нисделла дIасахьажор",
+ "randomredirect-nopages": "«$1» цӀерийн меттиган чохь дӀасахьажораш яц.",
"statistics": "Статистика",
"statistics-header-pages": "АгӀонийн жамӀ",
"statistics-header-edits": "Нисдаран жамӀ",
"pageswithprop-text": "Кхузахь гойтуш ю агӀонаш цхьадолу къастамаш куьйга юху билгал даьхнарш.",
"pageswithprop-prop": "Къастаман цӀе:",
"pageswithprop-submit": "Лаха",
+ "pageswithprop-prophidden-long": "деха йозан хӀуман маьӀна хьулйина ($1)",
+ "pageswithprop-prophidden-binary": "шалха маьӀна долу хӀума хьулйина ($1)",
"doubleredirects": "Шалха дIасахьажийнарш",
"doubleredirectstext": "ХӀокху агӀонехь ю дӀасахьажорашан тӀе хьажийна йолу дӀасахьажораш.\n<del>ТӀехула сиз хаькхна </del>нисйина чарна.",
"double-redirect-fixed-move": "АгӀон [[$1]] цӀе хийцина, хӀинца иза дӀахьажийна оцу [[$2]]",
"ipaddressorusername": "IP-адрес я декъашхочун цӀе:",
"ipbexpiry": "Хан чекхйолу:",
"ipbreason": "Бахьна:",
- "ipbreason-dropdown": "* Белхан некъ дӀакъовлар бахьанаш:\n** Харца хаам бар\n** АгӀонан чураниг дӀаяккхар\n** Спам-хьажоргаш арахьара сайташна\n** МаьӀна доцу текст тӀетохар\n** Декъашхой хьийзабар, кхерамаш тийсар\n** Масийтта лараман яздар зуламан лелаяр\n** Магийтина йоцу декъашхочун цӀе",
+ "ipbreason-dropdown": "* Белхан некъ дӀакъовлар бахьанаш:\n** Харца хаам бар\n** АгӀонан чураниг дӀаяккхар\n** Спам-хьажоргаш арахьара сайташна\n** МаьӀна доцу йоза тӀетохар\n** Декъашхой хьийзабар, кхерамаш тийсар\n** Масийтта лараман яздар зуламан лелаяр\n** Магийтина йоцу декъашхочун цӀе",
"ipb-hardblock": "Шаш довзийтина болу декъашхошна бехкам бе хӀокху IP-адресца тадарш дан",
"ipbcreateaccount": "Цамаго керла декъашхочун дӀаяздарш кхолла",
"ipbemailban": "Цамагдо декъашхошка хааман кехаташ кхехьийта",
"blocklogentry": "блоктоьхна [[$1]] цхьана ханна $2 $3",
"reblock-logentry": "Хийцина блоктоьхна хан [[$1]] $2 $3",
"blocklogtext": "Блоктохаршна а блокдӀаякхаршна а тептар. Ша блоккхеташ долу IP-адресаш кхузахь гойтуш дац. Кхин. [[Special:BlockList|хӀийнца блоктоьха берш]].",
- "unblocklogentry": "дӀаякхинаблок $1",
+ "unblocklogentry": "дӀаяькхинаблок $1",
"block-log-flags-anononly": "Къайлаха берш",
"block-log-flags-nocreate": "цамагдо керла дӏаяздарш кхоллар",
"block-log-flags-noautoblock": "ша блоктухарг дӏаяйина",
"years": "$1 {{PLURAL:$1|шо}}",
"ago": "$1 хьалха",
"just-now": "хӀинца",
- "hours-ago": "$1 сахьт хьалха",
- "minutes-ago": "$1 минут хьалха",
+ "hours-ago": "$1 {{PLURAL:$1|сахьт}}",
+ "minutes-ago": "$1 {{PLURAL:$1|минут}} хьалха",
"seconds-ago": "$1 {{PLURAL:$1|секунд}} хьалха",
"monday-at": "оршотан дийнахь $1",
"tuesday-at": "шинара дийнахь $1",
"exif-iimcategory-fin": "Экономика а бизнес а",
"exif-iimcategory-edu": "Дешна хилар",
"exif-iimcategory-lab": "Къинхьегам",
+ "exif-iimcategory-rel": "Дин а тешар а",
+ "exif-iimcategory-sci": "Ӏилма а техника а",
+ "exif-iimcategory-soi": "Социалан хаттарш",
+ "exif-iimcategory-wea": "Хенан хӀоттам",
"exif-urgency-normal": "Диканиг ($1)",
"exif-urgency-low": "Лахара ($1)",
"exif-urgency-high": "Лакхара ($1)",
+ "exif-urgency-other": "Декъашхочо билгалйина приоритет ($1)",
"watchlistall2": "массо",
"namespacesall": "массо",
"monthsall": "массо",
+ "confirmemail": "Электронан почтан адрес бакъдар",
+ "confirmemail_noemail": "Ахьа нийса электронан почтан адрес яздина дац [[Special:Preferences|гӀирсан чохь]].",
"confirmrecreate": "Декъашхочо [[User:$1|$1]] ([[User talk:$1|дийцаре]]) хӀара агӀо дӀаяьккхина, ахьа иза тая йолийча, дӀаяккхарна бахьна:\n: ''$2''\nДехар до, тешал де, хьо иза агӀо меттахӀотто лууш ву/ю але.",
"confirmrecreate-noreason": "Декъашхочо [[User:$1|$1]] ([[User talk:$1|дийцаре]]) хӀара агӀо дӀаяьккхина, ахьа иза тая йолийча. Дехар до, тешал де, хьо иза агӀо меттахӀотто лууш ву/ю але.",
"recreate": "Юха кхолла",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
"version": "Верси MediaWiki",
"version-extensions": "ДӀахӀоттийна шордарш",
- "version-skins": "Ð\9aечяран темаш",
+ "version-skins": "Ð\94Ó\80аÑ\85Ó\80оÑ\82Ñ\82ийна кечяран темаш",
"version-specialpages": "Белхан агӀонаш",
"version-parserhooks": "Cинтаксисан къастор схьалоцурш",
"version-variables": "Хийцаме",
"version-other": "Кхин",
"version-mediahandlers": "Медиа кеч ерраш",
+ "version-hooks": "Схьалуьцарш",
"version-parser-extensiontags": "Cинтаксисан къасторан шораллин тегаш",
"version-parser-function-hooks": "Cинтаксисан къасторан функци схьалоцурш",
+ "version-hook-name": "Схьалуьцачун цӀе",
+ "version-hook-subscribedby": "ДӀабазбелла тӀе",
"version-version": "(Верси $1)",
- "version-license": "Бакъо",
+ "version-no-ext-name": "[цӀе йоцуш]",
+ "version-license": "MediaWiki Лицензи",
"version-ext-license": "Лицензи",
"version-ext-colheader-name": "Шордарш",
+ "version-skin-colheader-name": "Кечяран тема",
"version-ext-colheader-version": "Верси",
"version-ext-colheader-license": "Лицензи",
"version-ext-colheader-description": "Цуьнах лаьцна",
"version-ext-colheader-credits": "Автораш",
+ "version-license-title": "Лицензи цу $1",
+ "version-credits-title": "Авторийн могӀам цу $1",
"version-poweredby-credits": "ХӀара вики болх беш ю '''[https://www.mediawiki.org/ MediaWiki]''' движок тӀехь, copyright © 2001-$1 $2.",
"version-poweredby-others": "кхин",
"version-poweredby-translators": "гочдархой translatewiki.net",
"version-license-info": "MediaWiki ю маьрша программин латораг, шу йиш ю фондас арахецна йолу GNU General Public License лицензица и яржо я хийца а.\n\nMediaWiki яржош ю и шуна пайдане хир яц те аьлла, амма ЦХЬА ЮКЪАРАХИЛАР ДОЦУШ. Хь. кхин. лицензи мадарра GNU General Public License .\n\nШоьга кхача езаш яра [{{SERVER}}{{SCRIPTPATH}}/COPYING копи GNU General Public License] хӀокху программица, кхаьчна яцахь язъе Free Software Foundation, Inc., адрес тӀе: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA я [//www.gnu.org/licenses/old-licenses/gpl-2.0.html еша и онлайнехь].",
"version-software": "ДӀахӀоттийна программин латтор",
+ "version-software-product": "Сурсат",
"version-software-version": "Верси",
"version-entrypoints": "ЧугӀо адресин тӀадамаш",
"version-entrypoints-header-entrypoint": "Яздаран тӀадам",
"api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|1=[$2 кхин файл]|[$2 кхин файлаш]}} йолуш ю",
"api-error-duplicate-popup-title": "{{PLURAL:$1|1=Файлан|Файлийн}} дубликат.",
"api-error-empty-file": "Ахьа яхьийтина файл еса ю.",
+ "api-error-mustbeposted": "Чоьхьара гӀалат: дехаро хьехам схьабоьху HTTP POST.",
"api-error-noimageinfo": "Кхиамца чуяьккхина, амма серверо файлахь лаьцна цхьаа хаам битина бац.",
"api-error-nomodule": "Чоьхьара гӀалат: чуйокху модуль нисйина яц.",
"api-error-ok-but-empty": "Чоьхьара гӀалат: серверара жоп дац.",
"expand_templates_generate_xml": "Гойту дитта цу XML",
"expand_templates_generate_rawhtml": "Гайта HTML",
"expand_templates_preview": "Хьалха муха ю хьажа",
+ "pagelanguage": "АгӀона мотт харжар",
"pagelang-name": "АгӀо",
"pagelang-language": "Мотт",
"pagelang-use-default": "Ӏад битарца мотт",
"right-pagelang": "АгӀона мотт хийца",
"action-pagelang": "агӀона мотт хийца",
"log-name-pagelang": "Мотт хийцаран тептар",
- "log-description-pagelang": "ХӀара агӀонашкахь мотт хийцаран тептар ду."
+ "log-description-pagelang": "ХӀара агӀонашкахь мотт хийцаран тептар ду.",
+ "logentry-pagelang-pagelang": "$1 {{GENDER:$2|хийцина}} агӀона мотт $3 $4 → $5."
}
"license-nopreview": "(Náhled není dostupný)",
"upload_source_url": " (platné, veřejně přístupné URL)",
"upload_source_file": " (soubor ve vašem počítači)",
+ "listfiles-delete": "smazat",
"listfiles-summary": "Tato speciální stránka zobrazuje všechny načtené soubory.",
"listfiles_search_for": "Hledat soubor podle názvu:",
"imgfile": "soubor",
"license-nopreview": "(es ist keine Vorschau verfügbar)",
"upload_source_url": " (gültige, öffentlich zugängliche URL)",
"upload_source_file": " (eine Datei auf deinem Computer)",
+ "listfiles-delete": "löschen",
"listfiles-summary": "Diese Spezialseite listet alle hochgeladenen Dateien auf.",
"listfiles_search_for": "Suche nach Datei:",
"imgfile": "Datei",
"talkpagelinktext": "Talk",
"specialpage": "Special page",
"personaltools": "Personal tools",
- "postcomment": "New section",
"addsection": "+",
"articlepage": "View content page",
"talk": "Discussion",
"license-nopreview": "(Preview not available)",
"upload_source_url": "(a valid, publicly accessible URL)",
"upload_source_file": "(a file on your computer)",
+ "listfiles-delete": "delete",
"listfiles-summary": "This special page shows all uploaded files.",
"listfiles_search_for": "Search for media name:",
"imgfile": "file",
"wantedfiles": "Wanted files",
"wantedfiles-summary": "",
"wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
+ "wantedfiletext-cat-noforeign": "The following files are used but do not exist. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
"wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.",
+ "wantedfiletext-nocat-noforeign": "The following files are used but do not exist.",
"wantedtemplates": "Wanted templates",
"wantedtemplates-summary": "",
"mostlinked": "Most linked-to pages",
"Mcervera",
"Wifidel",
"Macofe",
- "Koavf"
+ "Koavf",
+ "Themasterriot"
]
},
"tog-underline": "Subrayar los enlaces:",
"recentchanges-summary": "Sigue los cambios más recientes de la wiki en esta página.",
"recentchanges-noresult": "No hubo cambios durante el período seleccionado que respondan a esos criterios.",
"recentchanges-feed-description": "Realiza un seguimiento de los cambios más recientes en el wiki en este canal.",
- "recentchanges-label-newpage": "Esta edición inició una página",
+ "recentchanges-label-newpage": "Esta edición creó una página",
"recentchanges-label-minor": "Esta es una edición menor",
"recentchanges-label-bot": "Esta edición fue realizada por un robot",
"recentchanges-label-unpatrolled": "Esta edición todavía no se ha patrullado",
"아라",
"Scoopfinder",
"Akeron",
- "Linedwell"
+ "Linedwell",
+ "Yona b"
]
},
"tog-underline": "Souligner les liens :",
"license-nopreview": "(Prévisualisation non disponible)",
"upload_source_url": " (une URL valide et accessible publiquement)",
"upload_source_file": " (un fichier sur votre ordinateur)",
+ "listfiles-delete": "supprimer",
"listfiles-summary": "Cette page spéciale permet de lister tous les fichiers importés.",
"listfiles_search_for": "Rechercher un nom de média :",
"imgfile": "fichier",
"help": "Cobhair",
"search": "Lorg",
"searchbutton": "Lorg",
- "go": "Rach",
- "searcharticle": "Rach",
+ "go": "Siuthad",
+ "searcharticle": "Siuthad",
"history": "Eachdraidh na duilleige",
"history_short": "Eachdraidh",
"updatedmarker": "air ùrachadh on turas mu dheireadh a thadhail mi air",
"recentchangeslinked-feed": "Mùthaidhean buntainneach",
"recentchangeslinked-toolbox": "Mùthaidhean buntainneach",
"recentchangeslinked-title": "Mùthaidhean co-cheangailte ri \"$1\"",
- "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill ann an roinn-seòrsa sònraichte).\nTha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean <strong>troma</strong>.",
+ "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill ann an roinn-seòrsa sònraichte).\nTha duilleagan air a' [[Special:Watchlist|chlàr-fhaire]] agad ann an litrichean <strong>troma</strong>.",
"recentchangeslinked-page": "Ainm na duilleige:",
"recentchangeslinked-to": "Seall mùthaidhean nan duilleagan a tha a' ceangal ris an duilleag sin 'na àite",
"upload": "Luchdaich suas faidhle",
"allpagesto": "Seall duilleagan a tha a' crìochnachadh aig:",
"allarticles": "A h-uile duilleag",
"allinnamespace": "A h-uile duilleag (ainm-spàs $1)",
- "allpagessubmit": "Rach",
+ "allpagessubmit": "Siuthad",
"allpagesprefix": "Seall na duilleagan leis an ro-leasachan:",
"allpagesbadtitle": "Chaidh tiotal duilleige mì-dhligheach a thoirt seachad no bha ro-leasachan eadar-cànain no eadar-uicidh aige.\nFaodaidh gu bheil aon no barrachd charactaran ann nach urrainn dhut a chleachdadh ann an tiotal.",
"allpages-bad-ns": "Chan eil an t-ainm-spàs \"$1\" aig {{SITENAME}}.",
"watchlistanontext": "$1 gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
"watchnologin": "Chan eil thu air logadh a-steach",
"addwatch": "Cuir air a' chlàr-fhaire",
- "addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
+ "addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ris a' [[Special:Watchlist|chlàr-fhaire]] agad.\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
"addedwatchtext-short": "Chaidh an duilleag \"$1\" a chur ris a' chlàr-fhaire agad.",
"removewatch": "Thoir air falbh on chlàr-fhaire",
- "removedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].",
+ "removedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a thoirt air falbh on [[Special:Watchlist|chlàr-fhaire]] agad.",
"removedwatchtext-short": "Chaidh an duilleag \"$1\" a thoirt ait falbh on chlàr-fhaire agad.",
"watch": "Cum sùil air",
"watchthispage": "Cum sùil air an duilleag seo",
"tooltip-preview": "Ro-sheall na mùthaidhean agad; saoil an cleachd thu seo mus sàbhail thu iad?",
"tooltip-diff": "Seall na mùthaidhean a chuir mi air an teacs",
"tooltip-compareselectedversions": "Seall an diofar eadar an dà mhùthadh dhen duilleag seo a thagh thu",
- "tooltip-watch": "Cuir an duilleag seo air do chlàr-faire",
+ "tooltip-watch": "Cuir an duilleag seo ris a' chlàr-fhaire agad",
"tooltip-watchlistedit-normal-submit": "Thoir tiotalan air falbh",
"tooltip-watchlistedit-raw-submit": "Ùraich an clàr-faire",
"tooltip-recreate": "Ath-chruthaich an duilleag seo ged a chaidh a sguabadh às",
"license-nopreview": "(תצוגה מקדימה לא זמינה)",
"upload_source_url": "(כתובת URL תקפה ונגישה)",
"upload_source_file": "(קובץ במחשב שלך)",
+ "listfiles-delete": "מחיקה",
"listfiles-summary": "דף מיוחד זה מציג את כל הקבצים שהועלו.",
"listfiles_search_for": "חיפוש קובץ מדיה בשם:",
"imgfile": "קובץ",
"tog-watchdeletion": "Az általam törölt lapok és fájlok felvétele a figyelőlistámra",
"tog-minordefault": "Alapértelmezetten minden szerkesztésemet jelölje aprónak",
"tog-previewontop": "Előnézet megjelenítése a szerkesztőablak előtt",
- "tog-previewonfirst": "Előnézet első szerkesztésnél",
+ "tog-previewonfirst": "Előnézet mutatása az első szerkesztésnél",
"tog-enotifwatchlistpages": "Kapjak értesítést e-mailben, ha egy általam figyelt lap vagy fájl megváltozik",
"tog-enotifusertalkpages": "Kapjak értesítést e-mailben, ha megváltozik a vitalapom",
"tog-enotifminoredits": "Kapjak értesítést e-mailben a lapok és fájlok apró változtatásairól",
"license-nopreview": "(Anteprima non disponibile)",
"upload_source_url": " (una URL corretta e accessibile)",
"upload_source_file": " (un file sul proprio computer)",
+ "listfiles-delete": "cancella",
"listfiles-summary": "Questa pagina speciale mostra tutti i file caricati.",
"listfiles_search_for": "Ricerca immagini per nome:",
"imgfile": "file",
"license-nopreview": "(Kucken ouni ofzespäichere geet net)",
"upload_source_url": " (gëlteg, ëffentlech zougänglech URL)",
"upload_source_file": " (e Fichier op Ärem Computer)",
+ "listfiles-delete": "läschen",
"listfiles-summary": "Op dëser Spezialsäit stinn all déi eropgeluede Fichieren.",
"listfiles_search_for": "Sicht nom Fichier:",
"imgfile": "Fichier",
"license-nopreview": "(Прегледот не е достапен)",
"upload_source_url": " (важечка, јавно достапна URL-адреса)",
"upload_source_file": "(податотека на вашиот компјутер)",
+ "listfiles-delete": "избриши",
"listfiles-summary": "Оваа специјална страница ги прикажува сите подигнати податотеки.",
"listfiles_search_for": "Побарај име на податотека:",
"imgfile": "податотека",
"mergehistory-empty": "Ingen revisjoner kan flettes.",
"mergehistory-success": "{{PLURAL:$3|Én revisjon|$3 revisjoner}} av [[:$1]] ble flettet til [[:$2]].",
"mergehistory-fail": "Klarte ikke å utføre historikkfletting; sjekk siden og tidsparameterne igjen.",
+ "mergehistory-fail-toobig": "Det er ikke mulig å utføre historikk-fletting fordi flere enn tillatte $1 {{PLURAL:$1|revisjon|revisjoner}} ville blitt flyttet.",
"mergehistory-no-source": "Kildesiden $1 finnes ikke.",
"mergehistory-no-destination": "Målsiden $1 finnes ikke.",
"mergehistory-invalid-source": "Kildesiden må ha en gyldig tittel.",
"license-nopreview": "(Forhåndsvisning ikke tilgjengelig)",
"upload_source_url": " (en gyldig, offentlig tilgjengelig adresse)",
"upload_source_file": " (en fil på din datamaskin)",
+ "listfiles-delete": "slett",
"listfiles-summary": "Denne spesialsiden viser alle opplastede filer.",
"listfiles_search_for": "Søk etter filnavn:",
"imgfile": "fil",
"duplicate-defaultsort": "Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».",
"version": "Versjon",
"version-extensions": "Installerte utvidelser",
- "version-skins": "Drakter",
+ "version-skins": "Installerte drakter",
"version-specialpages": "Spesialsider",
"version-parserhooks": "Parsertillegg",
"version-variables": "Variabler",
"version-hook-name": "Navn",
"version-hook-subscribedby": "Brukes av",
"version-version": "(versjon $1)",
+ "version-no-ext-name": "[uten navn]",
"version-license": "Lisens",
"version-ext-license": "Lisens",
"version-ext-colheader-name": "Utvidelse",
+ "version-skin-colheader-name": "Drakt",
"version-ext-colheader-version": "Versjon",
"version-ext-colheader-license": "Lisens",
"version-ext-colheader-description": "Beskrivelse",
"expand_templates_remove_nowiki": "Ikke vis <nowiki>-merkelapper i resultatet",
"expand_templates_generate_xml": "Vis parsetre som XML",
"expand_templates_generate_rawhtml": "Vis ubehandlet HTML",
- "expand_templates_preview": "Forhåndsvisning"
+ "expand_templates_preview": "Forhåndsvisning",
+ "pagelanguage": "Valg av sidespråk",
+ "pagelang-name": "Side",
+ "pagelang-language": "Språk",
+ "pagelang-use-default": "Bruk standardspråk",
+ "pagelang-select-lang": "Velg språk",
+ "right-pagelang": "Endre sidespråk",
+ "action-pagelang": "endre sidespråket",
+ "log-name-pagelang": "Endre språklogg",
+ "log-description-pagelang": "Dette er en logg som viser endringer i sidespråk",
+ "logentry-pagelang-pagelang": "$1 {{GENDER:$2|endret}} sidespråk for $3 fra $4 til $5."
}
"download": "binnenhaolen",
"unwatchedpages": "Ziejen die niet evolgd wörden",
"listredirects": "Lieste van deurverwiezingen",
+ "listduplicatedfiles": "Lieste mit bestaanden mit duplikaoten",
"unusedtemplates": "Ongebruukten mallen",
"unusedtemplatestext": "Hieronder staon alle ziejen in de naamruumte \"{{ns:template}}\" die nargens gebruukt wörden.\nVergeet niet de verwiezingen nao te kieken veurda'j de mal vortdoon.",
"unusedtemplateswlh": "aandere verwiezingen",
"listgrouprights-removegroup-self": "Kan {{PLURAL:$2|groep|groepen}} vortdoon van eigen gebruker: $1",
"listgrouprights-addgroup-self-all": "Kan alle groepen bie de eigen gebruker doon",
"listgrouprights-removegroup-self-all": "Kan alle groepen vortdoon van eigen gebruker",
+ "trackingcategories": "Volgkategorieën",
"mailnologin": "Niet an-emeld.",
"mailnologintext": "Je mutten [[Special:UserLogin|an-emeld]] ween en n geldig e-mailadres in \"[[Special:Preferences|mien veurkeuren]]\" invoeren um disse funksie te kunnen gebruken.",
"emailuser": "n Bericht sturen",
"לערי ריינהארט",
"아라",
"Mar(c)",
- "Calak"
+ "Calak",
+ "Arg"
]
},
"tog-underline": "Koppelingen onderstrepen:",
"license-nopreview": "(Voorvertoning niet beschikbaar)",
"upload_source_url": " (een geldige, publiek toegankelijke URL)",
"upload_source_file": " (een bestand op uw computer)",
+ "listfiles-delete": "verwijderen",
"listfiles-summary": "Op deze speciale pagina zijn alle toegevoegde bestanden te bekijken.",
"listfiles_search_for": "Zoeken naar bestand:",
"imgfile": "bestand",
"tog-hidepatrolled": "ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿੱਚੋਂ ਜਾਂਚੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ",
"tog-newpageshidepatrolled": "ਨਵੀਂ ਸਫ਼ਾ ਸੂਚੀ ਵਿੱਚੋਂ ਜਾਂਚੇ ਸਫ਼ੇ ਲੁਕਾਓ",
"tog-extendwatchlist": "ਸਿਰਫ਼ ਤਾਜ਼ਾ ਹੀ ਨਹੀਂ, ਸਗੋਂ ਸਾਰੀਆਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਵਖਾਉਣ ਲਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਨੂੰ ਵਧਾਓ",
- "tog-usenewrc": "ਤਾà¨\9c਼ਾ ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨\85ਤà©\87 ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f ਵਿੱà¨\9a ਸਫ਼à©\87 ਮà©\81ਤਾਬà¨\95 ਤਬਦà©\80ਲà©\80à¨\86à¨\82 ਦà©\87 à¨\97ਰà©\81ੱà¨\95 ਬਣਾਓ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)",
+ "tog-usenewrc": "ਹਾਲà©\80à¨\86 ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨\85ਤà©\87 ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f ਵਿੱà¨\9a ਸਫ਼à©\87 ਮà©\81ਤਾਬà¨\95 ਤਬਦà©\80ਲà©\80à¨\86à¨\82 ਦà©\87 à¨\97ਰà©\81ੱਪ ਬਣਾਓ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)",
"tog-numberheadings": "ਆਟੋ-ਨੰਬਰ ਸਿਰਨਾਵੇਂ",
"tog-showtoolbar": "ਸੋਧ ਸੰਦਬਕਸਾ ਵੇਖੋ",
"tog-editondblclick": "ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰਨ 'ਤੇ ਸਫ਼ੇ ਸੋਧੋ",
"mypreferencesprotected": "ਤੁਹਾਨੂੰ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
"ns-specialprotected": "ਖ਼ਾਸ ਸਫ਼ਿਆਂ ’ਚ ਫੇਰ-ਬਦਲ ਨਹੀਂ ਹੋ ਸਕਦੇ।",
"titleprotected": "ਇਹ ਸਿਰਲੇਖ [[User:$1|$1]] ਵੱਲੋਂ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦਿੱਤਾ ਹੋਇਆ ਕਾਰਨ ਹੈ, \"''$2''\"।",
- "filereadonlyerror": "\"$1\" ਫ਼ਾà¨\88ਲ ਵਿੱà¨\9a ਤਬਦà©\80ਲà©\80 ਨਹà©\80à¨\82 ਹà©\8b ਰਹà©\80 à¨\95ਿà¨\89à¨\82à¨\95ਿ ਫ਼ਾà¨\88ਲ à¨à©°à¨¡à¨¾à¨° \"$2\" ਸਿਰਫ਼ ਪà©\9cà©\8dਹਨਯà©\8bà¨\97 ਰà©\82ਪ ਵਿà¨\9a ਹà©\88।\n\nà¨\89ਹ ਪà©\8dਰਸ਼ਾਸà¨\95, à¨\9cਿਹਨà©\87 à¨\87ਹ ਰà©\8bà¨\95 ਲਾà¨\88 ਹà©\88, ਦਾ à¨\95ਹਿਣਾ ਹà©\88:",
+ "filereadonlyerror": "\"$1\" ਫ਼ਾà¨\88ਲ ਵਿੱà¨\9a ਤਬਦà©\80ਲà©\80 ਨਹà©\80à¨\82 ਹà©\8b ਸà¨\95ਦà©\80 à¨\95ਿà¨\89à¨\82à¨\95ਿ ਫ਼ਾà¨\88ਲ à¨à©°à¨¡à¨¾à¨° \"$2\" ਸਿਰਫ਼ ਵà©\87à¨\96ਣਯà©\8bà¨\97 ਰà©\82ਪ ਵਿà¨\9a ਹà©\88।\n\nà¨\89ਹ ਪà©\8dਰਬੰਧà¨\95, à¨\9cਿਹਨà©\87 à¨\87ਹ ਰà©\8bà¨\95 ਲਾà¨\88 ਹà©\88, ਦਾ à¨\95ਹਿਣਾ ਹà©\88: ''$3''",
"invalidtitle-knownnamespace": "ਥਾਂ-ਨਾਮ \"$2\" ਅਤੇ ਲਿਖਤ \"$3\" ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
"invalidtitle-unknownnamespace": "ਅਣਜਾਣ ਨਾਂ-ਸਥਾਨ ਗਿਣਤੀ $1 ਅਤੇ ਲਿਖਤ $2 ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ",
"exception-nologin": "ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ",
"virus-badscanner": "ਮੰਦਾ ਪ੍ਰਬੰਧ: ਅਣਜਾਣ ਵਾਇਰਸ ਸਕੈਨਰ: ''$1''",
"virus-scanfailed": "ਸਕੈਨ ਫੇਲ੍ਹ ਹੈ (ਕੋਡ $1)",
"virus-unknownscanner": "ਅਣਪਛਾਤਾ ਐਂਟੀਵਾਇਰਸ:",
- "logouttext": "'''ਹੁਣ ਤੁਸੀਂ ਵਿਦਾਈ ਲੈ ਚੁੱਕੇ ਹੋ।'''\n\nਤੁਸੀਂ {{SITENAME}} ਦੀ ਵਰਤੋਂ ਗੁਮਨਾਮ ਰਹਿ ਕੇ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਦੁਬਾਰਾ ਇਹੋ ਜਾਂ ਵੱਖਰੇ ਵਰਤੋਂਕਾਰ ਵਜੋਂ ਦਾਖ਼ਲਾ ਲੈ ਸਕਦੇ ਹੋ।\nਧਿਆਨ ਦਿਉ ਕਿ ਜਿੰਨੀ ਦੇਰ ਤੱਕ ਤੁਸੀਂ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਦਾ ਕੈਸ਼ ਸਾਫ਼ ਨਹੀਂ ਕਰਦੇ, ਕੁਝ ਸਫ਼ੇ ਇੱਦਾਂ ਵਿਖਣਗੇ ਜਿਵੇਂ ਤੁਸੀਂ ਅਜੇ ਵੀ ਦਾਖ਼ਲ ਹੀ ਹੋ।",
+ "logouttext": "<strong>ਹੁਣ ਤੁਸੀਂ ਵਿਦਾਈ ਲੈ ਚੁੱਕੇ ਹੋ।</strong> ਧਿਆਨ ਦਿਉ ਕਿ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਦਾ ਕੈਸ਼ ਸਾਫ਼ ਨਹੀਂ ਕਰਦੇ, ਕੁਝ ਸਫ਼ੇ ਏਦਾਂ ਵਿਖਾਈ ਦੇ ਸਕਦੇ ਹਨ ਕਿ ਜਿਵੇਂ ਤੁਸੀਂ ਅਜੇ ਵੀ ਲਾਗਇਨ ਹੀ ਹੋ।",
"welcomeuser": "$1 ਜੀ ਆਇਆਂ ਨੂੰ!",
"welcomecreation-msg": "ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।",
"yourname": "ਵਰਤੋਂਕਾਰ-ਨਾਂ:",
"createacct-benefit-body3": "ਹਾਲੀਆ {{PLURAL:$1|ਯੋਗਦਾਨੀ}}",
"badretype": "ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।",
"userexists": "ਯੂਜ਼ਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
- "loginerror": "ਲਾਗਇਨ ਗਲਤੀ",
+ "loginerror": "ਲਾà¨\97à¨\87ਨ à¨\97਼ਲਤà©\80",
"createacct-error": "ਖਾਤਾ ਬਣਾਉਣ ਵਿਚ ਗਲਤੀ",
"createaccounterror": "ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: $1",
"nocookiesnew": "ਯੂਜ਼ਰ ਅਕਾਊਂਟ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਪਰ ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ।{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.",
"user-mail-no-addy": "ਬਿਨਾਂ ਈ-ਮੇਲ ਪਤਾ ਦਿੱਤੇ ਈ-ਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।",
"user-mail-no-body": "ਖ਼ਾਲੀ ਜਾਂ ਬਹੁਤੀ ਛੋਟੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਈਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ",
"changepassword": "ਪਾਸਵਰਡ ਬਦਲੋ",
- "resetpass_announce": "ਤà©\81ਸà©\80à¨\82 à¨\87ੱà¨\95 à¨\86ਰà¨\9c਼à©\80 à¨\88-ਮà©\87ਲ à¨\95à©\80ਤà©\87 à¨\95à©\8bਡ ਨਾਲ ਲਾà¨\97à¨\87ਨ à¨\95à©\80ਤਾ ਹà©\88। ਲਾà¨\97à¨\87ਨ ਪà©\82ਰਾ à¨\95ਰਨ ਲà¨\88, ਤà©\81ਹਾਨà©\82à©° à¨\87ੱਥà©\87 ਨਵਾà¨\82 ਪਾਸਵਰਡ ਦà©\87ਣਾ ਪਵà©\87à¨\97ਾ:",
+ "resetpass_announce": "ਲਾà¨\97à¨\87ਨ ਪà©\82ਰਾ à¨\95ਰਨ ਲà¨\88 ਤà©\81ਹਾਨà©\82à©° ਨਵਾà¨\82 ਪਾਸਵਰਡ ਬਣਾà¨\89ਣਾ ਪਵà©\87à¨\97ਾ।",
"resetpass_header": "ਅਕਾਊਂਟ ਪਾਸਵਰਡ ਬਦਲੋ",
"oldpassword": "ਪੁਰਾਣਾ ਪਾਸਵਰਡ:",
"newpassword": "ਨਵਾਂ ਪਾਸਵਰਡ:",
"resetpass-abort-generic": "ਇੱਕ ਐਕਸਟੈਂਸ਼ਨ ਵੱਲੋਂ ਪਾਸਵਰਡ ਦੀ ਤਬਦੀਲੀ ਰੱਦ ਕੀਤੀ ਗਈ",
"passwordreset": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
"passwordreset-text-one": "ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਬਣਾਉਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਭਰੋ।",
- "passwordreset-text-many": "{{PLURAL:$1|à¨\86ਪਣਾ ਪਾਸਵਰਡ ਮà©\81à©\9c ਬਣਾà¨\89ਣ ਲਈ ਕੋਈ ਇੱਕ ਥਾਂ ਭਰੋ।}}",
+ "passwordreset-text-many": "{{PLURAL:$1|à¨\88-ਮà©\87ਲ à¨\9c਼ਰà©\80à¨\8f à¨\86ਪਣਾ à¨\86ਰà¨\9c਼à©\80 ਪਾਸਵਰਡ ਹਾਸਲ à¨\95ਰਨ ਲਈ ਕੋਈ ਇੱਕ ਥਾਂ ਭਰੋ।}}",
"passwordreset-legend": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
"passwordreset-disabled": "ਇਸ ਵਿਕੀ ਤੇ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਬੰਦ ਕੀਤੇ ਗਏ ਹਨ।",
"passwordreset-emaildisabled": "ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।",
"currentrev": "ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ",
"currentrev-asof": "$1 ਮੁਤਾਬਕ ਸਭ ਤੋਂ ਨਵਾਂ ਰੀਵਿਜਨ",
"revisionasof": "$1 ਦਾ ਰੀਵਿਜਨ",
- "revision-info": "$2 ਦਾ ਬਣਾਇਆ $1 ਦਾ ਰੀਵਿਜਨ",
+ "revision-info": "{{GENDER:$6|$2}}$7 ਦਾ ਬਣਾਇਆ $1 ਦਾ ਰੀਵਿਜ੍ਹਨ",
"previousrevision": "←ਪੁਰਾਣਾ ਰੀਵਿਜਨ",
"nextrevision": "ਨਵਾਂ ਰੀਵਿਜਨ →",
"currentrevisionlink": "ਸਭ ਤੋ ਨਵਾਂ ਰੀਵਿਜਨ",
"searchprofile-images": "ਮਲਟੀਮੀਡੀਆ",
"searchprofile-everything": "ਸਭ ਕੁਝ",
"searchprofile-advanced": "ਉੱਨਤ",
- "searchprofile-articles-tooltip": "$1 ਵਿੱਚ ਖੋਜ",
+ "searchprofile-articles-tooltip": "$1 ਵਿੱਚ ਖੋਜੋ",
"searchprofile-images-tooltip": "ਫ਼ਾਈਲਾਂ ਖੋਜੋ",
"searchprofile-everything-tooltip": "ਸਾਰੀ ਸਮੱਗਰੀ ਵਿੱਚੋਂ ਖੋਜੋ (ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਸਮੇਤ)",
"searchprofile-advanced-tooltip": "ਆਪਣੀਆਂ ਬਣਾਈਆਂ ਨਾਂ-ਥਾਂਵਾਂ ਵਿੱਚ ਖੋਜੋ",
"watchlisttools-raw": "ਕੱਚੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਸੋਧੋ",
"duplicate-defaultsort": "ਪੁਰਾਣੀ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $1 ਦੇ ਬਜਾਏ ਹੁਣ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $2 ਹੋਵੇਗੀ।",
"version": "ਵਰਜਨ",
- "version-specialpages": "ਖ਼ਾਸ ਸਫ਼ੇ",
"version-skins": "ਸਕਿਨਾਂ",
+ "version-specialpages": "ਖ਼ਾਸ ਸਫ਼ੇ",
"version-other": "ਹੋਰ",
"version-hooks": "ਹੁੱਕਾਂ",
"version-hook-name": "ਹੁੱਕ ਦਾ ਨਾਂ",
"right-passwordreset": "Sprawdzanie treści e‐maila o resetowaniu hasła",
"newuserlogpage": "Nowi użytkownicy",
"newuserlogpagetext": "To jest rejestr ostatnio utworzonych kont użytkowników",
- "rightslog": "Rejestr uprawnień",
+ "rightslog": "Uprawnienia",
"rightslogtext": "Rejestr zmian uprawnień użytkowników.",
"action-read": "przeglądania tej strony",
"action-edit": "edytowania tej strony",
"duplicate-defaultsort": "Aviso: A chave de ordenação padrão \"$2\" sobrepõe-se à anterior chave de ordenação padrão \"$1\".",
"version": "Versão",
"version-extensions": "Extensões instaladas",
- "version-skins": "Temas",
+ "version-skins": "Temas instalados",
"version-specialpages": "Páginas especiais",
"version-parserhooks": "Hooks do analisador (parser)",
"version-variables": "Variáveis",
"expand_templates_remove_nowiki": "Suprima marcações <nowiki> no resultado",
"expand_templates_generate_xml": "Mostrar árvore de análise (parse) do XML",
"expand_templates_generate_rawhtml": "Mostrar HTML puro",
- "expand_templates_preview": "Pré-visualização"
+ "expand_templates_preview": "Pré-visualização",
+ "pagelang-select-lang": "Selecionar idioma",
+ "right-pagelang": "Mudar idioma da página",
+ "action-pagelang": "mudar idioma da página",
+ "log-name-pagelang": "Mudar idioma do log"
}
"license-nopreview": "(Antevisão indisponível)",
"upload_source_url": " (uma URL válida, publicamente acessível)",
"upload_source_file": " (um ficheiro no seu computador)",
+ "listfiles-delete": "eliminar",
"listfiles-summary": "Esta página especial mostra todos os ficheiros carregados.",
"listfiles_search_for": "Pesquisar por nome de imagem:",
"imgfile": "ficheiro",
"license-nopreview": "Error message when a certain license does not exist",
"upload_source_url": "Used in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Sourcefilename|label}}\n* {{msg-mw|Sourceurl|label}}\n* {{msg-mw|Upload source file}}\n* {{msg-mw|Upload-maxfilesize}}",
"upload_source_file": "Used in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Sourcefilename|label}}\n* {{msg-mw|Sourceurl|label}}\n* {{msg-mw|Upload source url}}\n* {{msg-mw|Upload-maxfilesize}}",
+ "listfiles-delete": "Text of the delete links next to the entries on [[Special:ListFiles]], surrounded by parentheses.\n{{Identical|Delete}}",
"listfiles-summary": "This message is displayed at the top of [[Special:ImageList]] to explain how to use that special page.",
"listfiles_search_for": "Input label for the form displayed on [[Special:ListFiles]].",
"imgfile": "{{Identical|File}}",
"popularpages-summary": "{{doc-specialpagesummary|popularpages}}",
"wantedcategories": "{{doc-special|WantedCategories}}",
"wantedcategories-summary": "{{doc-specialpagesummary|wantedcategories}}",
- "wantedpages": "{{doc-special|WantedPages}}",
+ "wantedpages": "{{doc-special|WantedPages}}\n{{Identical|Wanted page}}",
"wantedpages-summary": "{{doc-specialpagesummary|wantedpages}}",
"wantedpages-badtitle": "Error message shown when [[Special:WantedPages]] is listing a page with a title that shouldn't exist.\n\nParameters:\n* $1 - a page title",
"wantedfiles": "{{doc-special|WantedFiles}}",
"wantedfiles-summary": "{{doc-specialpagesummary|wantedfiles}}",
- "wantedfiletext-cat": "Message displayed at top of [[special:WantedFiles]]. $1 contains the name of the tracking category for broken files (Including Category prefix). {{msg-mw|wantedfiletext-nocat}} is used if the tracking category is disabled.",
- "wantedfiletext-nocat": "Message displayed at top of [[special:WantedFiles]] when broken file tracking category is disabled. See {{msg-mw|wantedfiletext-cat}}.",
+ "wantedfiletext-cat": "Message displayed at top of [[special:WantedFiles]] when false positives from foreign file repositories (like commons) are likely. $1 contains the name of the tracking category for broken files (Including Category prefix). {{msg-mw|wantedfiletext-nocat}} is used if the tracking category is disabled.\n\nSee also: {{msg-mw|wantedfiletext-cat-noforeign}}, {{msg-mw|wantedfiletext-nocat}}",
+ "wantedfiletext-cat-noforeign": "Message displayed at top of [[special:WantedFiles]] when the wiki has no foreign repositories. See also {{mwg-mw|wantedfilestext-cat}}. $1 contains the name of the tracking category for broken files (Including Category prefix). {{msg-mw|wantedfiletext-nocat}} is used if the tracking category is disabled.",
+ "wantedfiletext-nocat": "Message displayed at top of [[special:WantedFiles]] when broken file tracking category is disabled and false positives from foreign file repositories (like commons) are likely. See {{msg-mw|wantedfiletext-cat}}.",
+ "wantedfiletext-nocat-noforeign": "Message displayed at top of [[special:WantedFiles]] when broken file tracking category is disabled and their are no foreign file repositories enabled on the wiki. See {{msg-mw|wantedfiletext-cat}}, {{msg-mw|wantedfiletext-nocat}}.",
"wantedtemplates": "{{doc-special|WantedTemplates}}",
"wantedtemplates-summary": "{{doc-specialpagesummary|wantedtemplates}}",
"mostlinked": "{{doc-special|MostLinked}}",
"license-nopreview": "(Previzualizare indisponibilă)",
"upload_source_url": " (un URL valid, accesibil public)",
"upload_source_file": " (un fișier de pe computerul dv.)",
+ "listfiles-delete": "șterge",
"listfiles-summary": "Această pagină specială listează toate fișierele încărcate.",
"listfiles_search_for": "Căutare fișiere după nume:",
"imgfile": "fișier",
"license-nopreview": "(Предпросмотр недоступен)",
"upload_source_url": " (правильный, публично доступный интернет-адрес)",
"upload_source_file": " (файл на вашем компьютере)",
+ "listfiles-delete": "удалить",
"listfiles-summary": "Эта служебная страница показывает все загруженные файлы.",
"listfiles_search_for": "Поиск по имени файла:",
"imgfile": "файл",
"license-nopreview": "(Predogled ni na voljo)",
"upload_source_url": " (veljaven, javnosti dostopen URL)",
"upload_source_file": " (datoteka na vašem računalniku)",
+ "listfiles-delete": "izbriši",
"listfiles-summary": "Ta posebna stran prikazuje vse naložene datoteke.",
"listfiles_search_for": "Išči po imenu datoteke:",
"imgfile": "dat.",
"Urhixidur",
"Vinie007",
"לערי ריינהארט",
- "아라"
+ "아라",
+ "Gertakapllani",
+ "OrvenBregu"
]
},
"tog-underline": "Nënvizo lidhjet:",
"edit-gone-missing": "Faqja nuk mund t freskohet.\nDuket se është grisur.",
"edit-conflict": "Konflikt në redaktim.",
"edit-no-change": "Redaktimi juaj është anashkaluar pasi që asnjë ndryshim nuk u bë në tekst.",
+ "postedit-confirmation-created": "Faqja eshte krijuar",
+ "postedit-confirmation-restored": "Faqja eshte kthyer",
+ "postedit-confirmation-saved": "Redaktimi juaj eshte ruajtur.",
"edit-already-exists": "Faqja nuk mundej të hapet.\nAjo tanimë ekziston.",
"defaultmessagetext": "Teksti i porosisë së parazgjedhur",
- "editwarning-warning": "Lënia e kësaj faqeje mund t'ju shkaktojë humbjen e çdo ndryshimi që keni bërë.\nNëse keni hyrë brenda, ju mund ta hiqni këtë paralajmërim në seksionin \"Redaktimi\" tek preferencat tuaja.",
+ "invalid-content-data": "Të pavlefshme të dhënave e përmbajtjes",
+ "editwarning-warning": "Duke e lënë këtë faqe mund të shkaktojë ju për të humbur të gjitha ndryshimet që keni bërë ju.\nNëse ju jeni regjistruar, ju mund të çaktivizoni këtë paralajmërim në \"{{int:prefs-editing}}\" seksionin e preferencave tuaja.",
"content-model-text": "tekst i thejshtë",
"expensive-parserfunction-warning": "Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.\n\nDuhet të ketë më pakë se $2, {{PLURAL:$2|kërkesë|kërkesa}}, kurse tani {{PLURAL:$1|është $1 kërkesë|janë $1 kërkesa}}.",
"expensive-parserfunction-category": "Faqe me shumë shprehje të kushtueshmë për analizë gramatikore",
"license-nopreview": "(Nuk ka parapamje)",
"upload_source_url": " (URL e vlefshme, publikisht e përdorshme)",
"upload_source_file": " (skeda në kompjuterin tuaj)",
+ "listfiles-delete": "fshije",
"listfiles-summary": "Kjo faqe speciale tregon tërë skedat e ngarkuara.\nFillimisht skedat e ngarkuara së fundmi jepen më sipër.\nShtypni kolonat e tjera për të ndryshuar radhitjen.",
"listfiles_search_for": "Kërko për emrin e figurës:",
"imgfile": "skeda",
"license-nopreview": "(преглед није доступан)",
"upload_source_url": " (исправна и јавно доступна адреса)",
"upload_source_file": "(датотека на вашем рачунару)",
+ "listfiles-delete": "обриши",
"listfiles-summary": "Ова посебна страница приказује све послате датотеке.",
"listfiles_search_for": "Назив датотеке:",
"imgfile": "датотека",
"expand_templates_remove_nowiki": "Sonuçlarda <nowiki> etiketlerini bastır",
"expand_templates_generate_xml": "XML derleyici ağacını göster",
"expand_templates_generate_rawhtml": "Ham HTML göster",
- "expand_templates_preview": "Önizleme"
+ "expand_templates_preview": "Önizleme",
+ "pagelang-language": "Dil",
+ "pagelang-use-default": "Varsayılan dili kullan",
+ "pagelang-select-lang": "Dil seçin",
+ "right-pagelang": "Sayfa dilini değiştir"
}
"license-nopreview": "(无预览可用)",
"upload_source_url": "(有效、可以公开访问的URL)",
"upload_source_file": "(您计算机上的一个文件)",
+ "listfiles-delete": "删除",
"listfiles-summary": "本特殊页面展示所有上传的文件。",
"listfiles_search_for": "按媒体名称搜索:",
"imgfile": "文件",
*/
// Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
wfPHPVersionError( 'load.php' );
* @ingroup Maintenance
*/
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+if ( !function_exists( 'version_compare' ) || ( version_compare( PHP_VERSION, '5.3.2' ) < 0 ) ) {
require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
wfPHPVersionError( 'cli' );
}
true
);
$this->addOption( 'confpath', "Path to write LocalSettings.php to ($IP)", false, true );
+ $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in PostgreSQL/Microsoft SQL Server (mediawiki)', false, true );
/*
- $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in pg (mediawiki)', false, true );
$this->addOption( 'namespace', 'The project namespace (same as the "name" argument)', false, true );
*/
$this->addOption( 'env-checks', "Run environment checks only, don't change anything" );
* @ingroup Maintenance
*/
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+if ( !function_exists( 'version_compare' ) || ( version_compare( PHP_VERSION, '5.3.2' ) < 0 ) ) {
require dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
wfPHPVersionError( 'cli' );
}
* @file
*/
+// Bail if PHP is too low
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
+ // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
+ require dirname( dirname( __FILE__ ) ) . '/includes/PHPVersionError.php';
+ wfPHPVersionError( 'mw-config/index.php' );
+}
+
define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
define( 'MEDIAWIKI_INSTALL', true );
// ES5 15.4.4.14
// http://es5.github.com/#x15.4.4.14
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
-var hasFirefox2IndexOfBug = [0, 1].indexOf(1, 2) !== -1;
+var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
defineProperties(ArrayPrototype, {
indexOf: function indexOf(sought /*, fromIndex */ ) {
var self = splitString && isString(this) ? this.split('') : toObject(this),
// ES5 15.4.4.15
// http://es5.github.com/#x15.4.4.15
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
-var hasFirefox2LastIndexOfBug = [0, 1].lastIndexOf(0, -3) !== -1;
+var hasFirefox2LastIndexOfBug = Array.prototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
defineProperties(ArrayPrototype, {
lastIndexOf: function lastIndexOf(sought /*, fromIndex */) {
var self = splitString && isString(this) ? this.split('') : toObject(this),
// http://es5.github.com/#x15.7.4.5
var hasToFixedBugs = NumberPrototype.toFixed && (
(0.00008).toFixed(3) !== '0.000'
- || (0.9).toFixed(0) === '0'
+ || (0.9).toFixed(0) !== '1'
|| (1.255).toFixed(2) !== '1.25'
|| (1000000000000000128).toFixed(0) !== "1000000000000000128"
);
respond: function respond() {
if (arguments.length > 0) this.respondWith.apply(this, arguments);
var queue = this.queue || [];
- var requests = queue.splice(0);
+ var requests = queue.splice(0, queue.length);
var request;
while(request = requests.shift()) {
* Skip function for es5-shim module.
*
* Test for strict mode as a proxy for full ES5 function support (but not syntax)
- * Per http://kangax.github.io/compat-table/es5/ this is a reasonable short-cut
- * that still allows this to be as short as possible (there are no function "No"s
- * for non-"obsolete" real browsers where strict support is available).
+ * Per http://kangax.github.io/compat-table/es5/ this is a reasonable shortcut
+ * that still allows this to be as short as possible (there are no browsers we
+ * support that have strict mode, but lack other features).
*
- * Note that this will cause IE9 users to get the shim (which should be close to
- * a no-op but will increase page payload).
+ * Do explicitly test for Function#bind because of PhantomJS (which implements
+ * strict mode, but lacks Function#bind).
+ *
+ * IE9 supports all features except strict mode, so loading es5-shim should be close to
+ * a no-op but does increase page payload).
*/
return ( function () {
'use strict';
- return !this;
+ return !this && !!Function.prototype.bind;
}() );
} else {
collapsibleId = $collapsible.attr( 'id' ) || '';
if ( collapsibleId.indexOf( 'mw-customcollapsible-' ) === 0 ) {
- $customTogglers = $( '.' + collapsibleId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
- $customTogglers.addClass( 'mw-customtoggle' );
+ $customTogglers = $( '.' + collapsibleId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) )
+ .addClass( 'mw-customtoggle' );
}
}
togglingHandler( $( this ), $collapsible, e, opts );
};
- $toggleLink = $customTogglers;
- $toggleLink.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+ $toggleLink = $customTogglers
+ .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+ .prop( 'tabIndex', 0 );
} else {
// If this is not a custom case, do the default: wrap the
$toggleLink = buildDefaultToggleLink().appendTo( $caption );
} else {
actionHandler = premadeToggleHandler;
- $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+ $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+ .prop( 'tabIndex', 0 );
}
} else {
// The toggle-link will be in one the the cells (td or th) of the first row
$toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
} else {
actionHandler = premadeToggleHandler;
- $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+ $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+ .prop( 'tabIndex', 0 );
}
}
$toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
} else {
actionHandler = premadeToggleHandler;
- $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+ $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+ .prop( 'tabIndex', 0 );
}
} else { // <div>, <p> etc.
$toggleLink = buildDefaultToggleLink().prependTo( $collapsible );
} else {
actionHandler = premadeToggleHandler;
- $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+ $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+ .prop( 'tabIndex', 0 );
}
}
}
- // Attributes for accessibility. This isn't necessary when the toggler is already
- // an <a> or a <button> etc., but it doesn't hurt either, and it's consistent.
- $toggleLink.prop( 'tabIndex', 0 );
-
// Initial state
if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
// One toggler can hook to multiple elements, and one element can have
* Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
* Also Dynamically resize images to justify them.
*/
-( function ( $, mw ) {
+( function ( $ ) {
$( function () {
var isTouchScreen,
gettingFocus,
$imageElm,
imageElm,
$caption,
- hookInfo,
i,
j,
avgZoom,
}
if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
- mw.log( 'Skipping item ' + j + ' due to aspect: ' + curRow[j].aspect );
// One of the dimensions are 0. Probably should
// not try to resize.
combinedPadding += curRow[j].width;
// Also on the off chance there is a bug in this
// code, would prevent accidentally expanding to
// be 10 billion pixels wide.
- mw.log( 'mw.page.gallery: Cannot fit row, aspect is ' + preferredHeight / curRowHeight );
if ( i === rows.length - 1 ) {
// If its the last row, and we can't fit it,
// don't make the entire row huge.
}
if ( !isFinite( preferredHeight ) ) {
// This *definitely* should not happen.
- mw.log( 'mw.page.gallery: Trying to resize row ' + i + ' to ' + preferredHeight + '?!' );
// Skip this row.
continue;
}
if ( preferredHeight < 5 ) {
// Well something clearly went wrong...
- mw.log( {
- maxWidth: maxWidth,
- combinedPadding: combinedPadding,
- combinedAspect: combinedAspect,
- wantedWidth: wantedWidth
- } );
- mw.log( 'mw.page.gallery: [BUG!] Fitting row ' + i + ' to too small a size: ' + preferredHeight );
// Skip this row.
continue;
}
if ( newWidth < 60 || !isFinite( newWidth ) ) {
// Making something skinnier than this will mess up captions,
- mw.log( 'mw.page.gallery: Tried to make image ' + newWidth + 'px wide but too narrow.' );
if ( newWidth < 1 || !isFinite( newWidth ) ) {
$innerDiv.height( preferredHeight );
// Don't even try and touch the image size if it could mean
$caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
}
- hookInfo = {
- fullWidth: newWidth + padding,
- imgWidth: newWidth,
- imgHeight: preferredHeight,
- $innerDiv: $innerDiv,
- $imageDiv: $imageDiv,
- $outerDiv: $outerDiv,
- // Whether the hook took action
- resolved: false
- };
-
- /**
- * Gallery resize.
- *
- * If your handler resizes an image, it should also set the resolved
- * property to true. Additionally, because this module only exposes this
- * logic temporarily, you should load your module in position top to
- * ensure it is registered before this runs (FIXME: Don't use mw.hook)
- *
- * See TimedMediaHandler for an example.
- *
- * @event mediawiki_page_gallery_resize
- * @member mw.hook
- * @param {Object} hookInfo
- */
- mw.hook( 'mediawiki.page.gallery.resize' ).fire( hookInfo );
-
- if ( !hookInfo.resolved ) {
- if ( imageElm ) {
- // We don't always have an img, e.g. in the case of an invalid file.
- imageElm.width = newWidth;
- imageElm.height = preferredHeight;
- } else {
- // Not a file box.
- $imageDiv.height( preferredHeight );
- }
+ if ( imageElm ) {
+ // We don't always have an img, e.g. in the case of an invalid file.
+ imageElm.width = newWidth;
+ imageElm.height = preferredHeight;
+ } else {
+ // Not a file box.
+ $imageDiv.height( preferredHeight );
}
}
}
}() );
} );
} );
-}( jQuery, mediaWiki ) );
+}( jQuery ) );
float: left;
}
+ &.mw-halign-none {
+ margin: 0;
+ clear: none;
+ float: none;
+ }
+
&.mw-halign-center {
margin: 0 auto .5em auto;
display: table;
}
fieldset#mw-searchoptions table td {
padding-right: 1em;
+ white-space: nowrap;
}
fieldset#mw-searchoptions div.divider {
clear: both;
vertical-align: text-bottom;
}
-/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
-#bodyContent,
.mw-body-content {
position: relative;
line-height: @content-line-height;
"Nghtwlkr"
]
},
+ "vector-skin-desc": "Moderne versjon av MonoBook med et friskt utseende og mange bruksforbedringer",
"vector-action-addsection": "Nytt emne",
"vector-action-delete": "Slett",
"vector-action-move": "Flytt",
margin-left: 20px;
}
-.tipsy {
- padding: 5px 5px 10px;
- font-size: 12px;
- position: absolute;
- z-index: 100000;
- overflow: visible;
-}
-
-.tipsy-inner {
- padding: 5px 8px 4px 8px;
- background-color: #d6f3ff;
- color: black;
- border: 1px solid #5dc9f4;
- max-width: 300px;
- text-align: left;
-}
-
-.tipsy-arrow {
- position: absolute;
- /* @embed */
- background: url(images/tipsy-arrow.gif) no-repeat top left;
- width: 13px;
- height: 13px;
-}
-
-.tipsy-se .tipsy-arrow {
- bottom: -2px;
- right: 10px;
- background-position: 0% 100%;
-}
-
#mw-clearyourcache,
#mw-sitecsspreview,
#mw-sitejspreview,
</p>
!! end
-## a,rtc not permitted
+## a not permitted
## i,b,br omitted
!! test
Text-level semantic html elements in wikitext
<sub>text</sub>
<u>text</u>
<mark>text</mark>
-<ruby><rb>明日<rp>(</rp><rt>Ashita</rt><rp>)</rp></rb></ruby>
+<ruby><rb>明日</rb><rp>(</rp><rt>Ashita</rt><rp> </rp><rtc>あした</rtc><rp>)</rp></ruby>
<bdi>text</bdi>
<bdo>text</bdo>
<span>text</span>
<sub>text</sub>
<u>text</u>
<mark>text</mark>
-<ruby><rb>明日<rp>(</rp><rt>Ashita</rt><rp>)</rp></rb></ruby>
+<ruby><rb>明日</rb><rp>(</rp><rt>Ashita</rt><rp> </rp><rtc>あした</rtc><rp>)</rp></ruby>
<bdi>text</bdi>
<bdo>text</bdo>
<span>text</span>
</p>
!! end
+# test cases taken from
+# http://www.w3.org/TR/html5/text-level-semantics.html#the-ruby-element
+!! test
+Ruby markup (W3C-style)
+!! wikitext
+; Mono-ruby for individual base characters
+: <ruby>日<rt>に</rt>本<rt>ほん</rt>語<rt>ご</rt></ruby>
+; Group ruby
+: <ruby>今日<rt>きょう</rt></ruby>
+; Jukugo ruby
+: <ruby>法<rb>華</rb><rb>経</rb><rt>ほ</rt><rt>け</rt><rt>きょう</rt></ruby>
+; Inline ruby
+: <ruby>東<rb>京</rb><rp>(</rp><rt>とう</rt><rt>きょう</rt><rp>)</rp></ruby>
+; Double-sided ruby
+: <ruby><rb>旧</rb><rb>金</rb><rb>山</rb><rt>jiù</rt><rt>jīn</rt><rt>shān</rt><rtc>San Francisco</rtc></ruby>
+<ruby>
+<rb>♥</rb><rtc><rt>Heart</rt></rtc><rtc lang="fr"><rt>Cœur</rt></rtc>
+<rb>☘</rb><rtc><rt>Shamrock</rt></rtc><rtc lang="fr"><rt>Trèfle</rt></rtc>
+<rb>✶</rb><rtc><rt>Star</rt></rtc><rtc lang="fr"><rt>Étoile</rt></rtc>
+</ruby>
+!! html
+<dl><dt> Mono-ruby for individual base characters</dt>
+<dd> <ruby>日<rt>に</rt>本<rt>ほん</rt>語<rt>ご</rt></ruby></dd>
+<dt> Group ruby</dt>
+<dd> <ruby>今日<rt>きょう</rt></ruby></dd>
+<dt> Jukugo ruby</dt>
+<dd> <ruby>法<rb>華</rb><rb>経</rb><rt>ほ</rt><rt>け</rt><rt>きょう</rt></ruby></dd>
+<dt> Inline ruby</dt>
+<dd> <ruby>東<rb>京</rb><rp>(</rp><rt>とう</rt><rt>きょう</rt><rp>)</rp></ruby></dd>
+<dt> Double-sided ruby</dt>
+<dd> <ruby><rb>旧</rb><rb>金</rb><rb>山</rb><rt>jiù</rt><rt>jīn</rt><rt>shān</rt><rtc>San Francisco</rtc></ruby></dd></dl>
+<p><ruby>
+<rb>♥</rb><rtc><rt>Heart</rt></rtc><rtc lang="fr"><rt>Cœur</rt></rtc>
+<rb>☘</rb><rtc><rt>Shamrock</rt></rtc><rtc lang="fr"><rt>Trèfle</rt></rtc>
+<rb>✶</rb><rtc><rt>Star</rt></rtc><rtc lang="fr"><rt>Étoile</rt></rtc>
+</ruby>
+</p>
+!! end
+
!! test
Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
!! wikitext
!!end
!! test
-Leading pipes outside of tables
-!! options
-parsoid
-!! wikitext
-| foo
-!! html
-<p>| foo</p>
-!! end
-
-!! test
-Leading pipes outside of tables 2
-!! options
-parsoid
-!! wikitext
-a
-| foo
-b
-!! html
-<p>a
-| foo
-b</p>
-!! end
-
-!! test
-Leading pipes outside of tables 3
-!! options
-parsoid
+Table wikitext syntax outside wiki-tables
!! wikitext
a
+! not a table heading
+|- not a table row
+| not a table cell
| class="foo bar" | baz
b
+|}
+|-
+c
!! html
<p>a
+! not a table heading
+|- not a table row
+| not a table cell
| class="foo bar" | baz
-b</p>
+b
+|}
+|-
+c
+</p>
!! end
!!test
<p><a rel="mw:WikiLink" href="./User:Foo/Test/63636:Bar">Test</a></p>
!! end
+!! test
+Purely hash wikilink
+!! options
+title=[[User:test/123]]
+!! wikitext
+[[#a|b]]
+!! html/parsoid
+<p data-parsoid='{}'><a rel="mw:WikiLink" href="../User:Test/123#a" data-parsoid='{"stx":"piped","a":{"href":"../User:Test/123#a"},"sa":{"href":"#a"}}'>b</a></p>
+!! end
+
!! test
1. Interaction of linktrail and template encapsulation
!! options
!! wikitext
Blah blah blah
[[zh:Chinese]]
-!! html
+!! html/php
<p>Blah blah blah
</p>
+!! html/parsoid
+<p>Blah blah blah
+<link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese"/></p>
!! end
!! test
Blah blah blah
[[es:Spanish]]
[[zh:Chinese]]
-!! html
+!! html/php
<p>Blah blah blah
</p>
+!! html/parsoid
+<p>Blah blah blah
+<link rel="mw:PageProp/Language" href="//es.wikipedia.org/wiki/Spanish"/>
+<link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese"/></p>
!! end
!! test
!! wikitext
Blah blah blah
[[zh:Chinese]]
-!! html
+!! html/php
<p>Blah blah blah
</p>
+!! html/parsoid
+<p>Blah blah blah
+<link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese"/></p>
!! end
!! test
Blah blah blah
[[es:Spanish]]
[[zh:Chinese]]
-!! html
+!! html/php
<p>Blah blah blah
</p>
+!! html/parsoid
+<p>Blah blah blah
+<link rel="mw:PageProp/Language" href="//es.wikipedia.org/wiki/Spanish"/>
+<link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/Chinese"/></p>
!! end
!! test
"Extra" interlanguage links (bug 32189 / gerrit 111390)
!! wikitext
Blah blah blah
-[[mul:Multilingual]]
-!! html
+[[mul:Article]]
+!! html/php
<p>Blah blah blah
</p>
+!! html/parsoid
+<p>Blah blah blah
+<link rel="mw:PageProp/Language" title="Multilingual" href="//wikisource.org/wiki/Article"/></p>
!! end
!! test
!! html
!! end
+!! test
+Includes and comments at SOL
+!! wikitext
+<!-- comment --><noinclude><!-- comment --></noinclude><!-- comment -->== hu ==
+
+<noinclude>
+some
+</noinclude>* stuff
+* here
+
+<includeonly>can have stuff</includeonly>=== here ===
+
+!! html/php
+<h2><span class="mw-headline" id="hu">hu</span></h2>
+<p>some
+</p>
+<ul><li> stuff</li>
+<li> here</li></ul>
+<h3><span class="mw-headline" id="here">here</span></h3>
+
+!! html/parsoid
+<!-- comment --><meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"<noinclude>"}'/><!-- comment --><meta typeof="mw:Includes/NoInclude/End" data-parsoid='{"src":"</noinclude>"}'/><!-- comment -->
+<h2 data-parsoid='{}'> hu </h2>
+
+<meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"<noinclude>"}'/>
+
+<p data-parsoid='{}'>some</p>
+<meta typeof="mw:Includes/NoInclude/End" data-parsoid='{"src":"</noinclude>"}'/>
+<ul data-parsoid='{}'>
+<li data-parsoid='{}'> stuff</li>
+
+<li data-parsoid='{}'> here</li></ul>
+
+<h3 data-parsoid='{}'> here </h3>
+!! end
+
# TODO: test with DOM fragment reuse!
!! test
Parsoid: DOM fragment reuse
|c
|}
!!html/parsoid
-<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"<includeonly>a</includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":"</includeonly>"}'/><span data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>{{{b}}}</span><table about="#mwt1" typeof="mw:Param" data-parsoid='{"a":{" ":null},"sa":{" ":""},"src":"{| {{{b}}}\n|c\n|}"}'>
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"<includeonly>a</includeonly>"'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><table about="#mwt2" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"{{{b}}}","html":"<span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=\"{&quot;dsr&quot;:[31,38,null,null],&quot;src&quot;:&quot;{{{b}}}&quot;}\">{{{b}}}</span>"},{"html":""}]]}' data-parsoid='{"a":{"{{{b}}}":null},"sa":{"{{{b}}}":""}}'>
<tbody><tr><td>c</td></tr>
</tbody></table>
+
!!end
###
### Inter-language links
###
!! test
-Inter-language links
+Interlanguage links
!! options
ill
!! wikitext
[[es:Alimento]]
[[fr:Nourriture]]
-[[zh:食品]]
-!! html
+[[zh:食品]]
+!! html/php
es:Alimento fr:Nourriture zh:食品
+!! html/parsoid
+<p><link rel="mw:PageProp/Language" href="//es.wikipedia.org/wiki/Alimento"/>
+<link rel="mw:PageProp/Language" href="//fr.wikipedia.org/wiki/Nourriture"/>
+<link rel="mw:PageProp/Language" href="//zh.wikipedia.org/wiki/食品"/></p>
!! end
!! test
[[es:2]]
[[fr:1]]
[[fr:2]]
-!! html
+!! html/php
es:1 fr:1
+!! html/parsoid
+<p><link rel="mw:PageProp/Language" href="//es.wikipedia.org/wiki/1"/>
+<link rel="mw:PageProp/Language" href="//es.wikipedia.org/wiki/2"/>
+<link rel="mw:PageProp/Language" href="//fr.wikipedia.org/wiki/1"/>
+<link rel="mw:PageProp/Language" href="//fr.wikipedia.org/wiki/2"/></p>
!! end
###
<ref name="b">foo</ref>
</references>
!! 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>
+<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" data-parsoid="{}">[1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref group=\"X\" name=\"b\" />"}'><a href="#cite_note-b-2" 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="#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" data-parsoid="{}"><a href="#cite_ref-1-0" data-parsoid="{}">↑</a></span> foo bar for a</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>
+<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-2\">[X 1]</a></span>\n"},"attrs":{"group":"X"}}'><li about="#cite_note-b-2" id="cite_note-b-2" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-b-2-0" data-parsoid="{}">↑</a></span> foo</li></ol>
!! end
!! test
<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>
!! end
+!! test
+5. Nowiki escaping should account for indent-pres
+!! options
+parsoid=html2wt
+!! html
+<pre>==foo==</pre>
+!! wikitext
+ ==foo==
+!! end
+
#### --------------- Behavior Switches --------------------
!! test
1. Valid behavior switches should be escaped
# All these tests are marked Parsoid html2wt and html2html only
# ----------------------------------------------------------------
+!! test
+Serialize interwiki links pointing to the current wiki as plain wiki links (bug 65869)
+!! options
+parsoid=html2wt
+language=es
+!! wikitext
+[[Foo]]
+!! html
+<p><a rel="mw:ExtLink" href="http://es.wikipedia.org/wiki/Foo">Foo</a></p>
+!! end
+
!! test
Image: Modifying size of an image (1)
!! options
protected function setUp() {
parent::setUp();
- $this->setMwGlobals( 'wgCacheDirectory', __DIR__ . '/../data' );
+ $this->setMwGlobals( 'wgGitInfoCacheDirectory', __DIR__ . '/../data/gitinfo' );
}
public function testValidJsonData() {
* @covers ::swap
*/
public function testSwapVarsTest() {
+ $this->hideDeprecated( 'swap' );
+
$var1 = 1;
$var2 = 2;
Html::expandAttributes( array( 'foo' => false ) ),
'skip keys with false value'
);
- $this->assertNotEmpty(
+ $this->assertEquals(
+ ' foo=""',
Html::expandAttributes( array( 'foo' => '' ) ),
'keep keys with an empty string'
);
);
}
+ /**
+ * @covers HTML::expandAttributes
+ */
+ public function testExpandAttributesForNumbers() {
+ $this->assertEquals(
+ ' value=1',
+ Html::expandAttributes( array( 'value' => 1 ) ),
+ 'Integer value is cast to a string'
+ );
+ $this->assertEquals(
+ ' value=1.1',
+ Html::expandAttributes( array( 'value' => 1.1 ) ),
+ 'Float value is cast to a string'
+ );
+ }
+
+ /**
+ * @covers HTML::expandAttributes
+ */
+ public function testExpandAttributesForObjects() {
+ $this->assertEquals(
+ ' value=stringValue',
+ Html::expandAttributes( array( 'value' => new HtmlTestValue() ) ),
+ 'Object value is converted to a string'
+ );
+ }
+
/**
* Test for Html::expandAttributes()
* Please note it output a string prefixed with a space!
);
}
+ /**
+ * @covers Html::expandAttributes
+ * @expectedException MWException
+ */
+ public function testExpandAttributes_ArrayOnNonListValueAttribute_ThrowsException() {
+ // Real-life test case found in the Popups extension (see Gerrit cf0fd64),
+ // when used with an outdated BetaFeatures extension (see Gerrit deda1e7)
+ Html::expandAttributes( array(
+ 'src' => array(
+ 'ltr' => 'ltr.svg',
+ 'rtl' => 'rtl.svg'
+ )
+ ) );
+ }
+
/**
* @covers Html::namespaceSelector
*/
);
}
}
+
+class HtmlTestValue {
+ function __toString() {
+ return 'stringValue';
+ }
+}
NS_MEDIAWIKI => 'editinterface',
),
) );
+ // Without this testUserBlock will use a non-English context on non-English MediaWiki
+ // installations (because of how Title::checkUserBlock is implemented) and fail.
+ RequestContext::resetMain();
$this->userName = 'Useruser';
$this->altUserName = 'Altuseruser';
--- /dev/null
+<?php
+
+class FileRepoFileTest extends MediaWikiMediaTestCase {
+ /**
+ * @dataProvider getThumbnailBucketProvider
+ * @covers File::getThumbnailBucket
+ */
+ public function testGetThumbnailBucket( $data ) {
+ $this->setMwGlobals( 'wgThumbnailBuckets', $data['buckets'] );
+ $this->setMwGlobals( 'wgThumbnailMinimumBucketDistance', $data['minimumBucketDistance'] );
+
+ $fileMock = $this->getMockBuilder( 'File' )
+ ->setConstructorArgs( array( 'fileMock', false ) )
+ ->setMethods( array( 'getWidth' ) )
+ ->getMockForAbstractClass();
+
+ $fileMock->expects( $this->any() )->method( 'getWidth' )->will(
+ $this->returnValue( $data['width'] ) );
+
+ $this->assertEquals(
+ $data['expectedBucket'],
+ $fileMock->getThumbnailBucket( $data['requestedWidth'] ),
+ $data['message'] );
+ }
+
+ public function getThumbnailBucketProvider() {
+ $defaultBuckets = array( 256, 512, 1024, 2048, 4096 );
+
+ return array(
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'minimumBucketDistance' => 0,
+ 'width' => 3000,
+ 'requestedWidth' => 120,
+ 'expectedBucket' => 256,
+ 'message' => 'Picking bucket bigger than requested size'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'minimumBucketDistance' => 0,
+ 'width' => 3000,
+ 'requestedWidth' => 300,
+ 'expectedBucket' => 512,
+ 'message' => 'Picking bucket bigger than requested size'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'minimumBucketDistance' => 0,
+ 'width' => 3000,
+ 'requestedWidth' => 1024,
+ 'expectedBucket' => 2048,
+ 'message' => 'Picking bucket bigger than requested size'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'minimumBucketDistance' => 0,
+ 'width' => 3000,
+ 'requestedWidth' => 2048,
+ 'expectedBucket' => false,
+ 'message' => 'Picking no bucket because none is bigger than the requested size'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'minimumBucketDistance' => 0,
+ 'width' => 3000,
+ 'requestedWidth' => 3500,
+ 'expectedBucket' => false,
+ 'message' => 'Picking no bucket because requested size is bigger than original'
+ ) ),
+ array( array(
+ 'buckets' => array( 1024 ),
+ 'minimumBucketDistance' => 0,
+ 'width' => 3000,
+ 'requestedWidth' => 1024,
+ 'expectedBucket' => false,
+ 'message' => 'Picking no bucket because requested size equals biggest bucket'
+ ) ),
+ array( array(
+ 'buckets' => null,
+ 'minimumBucketDistance' => 0,
+ 'width' => 3000,
+ 'requestedWidth' => 1024,
+ 'expectedBucket' => false,
+ 'message' => 'Picking no bucket because no buckets have been specified'
+ ) ),
+ array( array(
+ 'buckets' => array( 256, 512 ),
+ 'minimumBucketDistance' => 10,
+ 'width' => 3000,
+ 'requestedWidth' => 245,
+ 'expectedBucket' => 256,
+ 'message' => 'Requested width is distant enough from next bucket for it to be picked'
+ ) ),
+ array( array(
+ 'buckets' => array( 256, 512 ),
+ 'minimumBucketDistance' => 10,
+ 'width' => 3000,
+ 'requestedWidth' => 246,
+ 'expectedBucket' => 512,
+ 'message' => 'Requested width is too close to next bucket, picking next one'
+ ) ),
+ );
+ }
+
+ /**
+ * @dataProvider getThumbnailSourceProvider
+ * @covers File::getThumbnailSource
+ */
+ public function testGetThumbnailSource( $data ) {
+ $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+ ->setConstructorArgs( array( array( 'name' => 'backendMock', 'wikiId' => wfWikiId() ) ) )
+ ->getMock();
+
+ $repoMock = $this->getMockBuilder( 'FileRepo' )
+ ->setConstructorArgs( array( array( 'name' => 'repoMock', 'backend' => $backendMock ) ) )
+ ->setMethods( array( 'fileExists', 'getLocalReference' ) )
+ ->getMock();
+
+ $fsFile = new FSFile( 'fsFilePath' );
+
+ $repoMock->expects( $this->any() )->method( 'fileExists' )->will(
+ $this->returnValue( true ) );
+
+ $repoMock->expects( $this->any() )->method( 'getLocalReference' )->will(
+ $this->returnValue( $fsFile ) );
+
+ $handlerMock = $this->getMock( 'BitmapHandler', array( 'supportsBucketing' ) );
+ $handlerMock->expects( $this->any() )->method( 'supportsBucketing' )->will(
+ $this->returnValue( $data['supportsBucketing'] ) );
+
+ $fileMock = $this->getMockBuilder( 'File' )
+ ->setConstructorArgs( array( 'fileMock', $repoMock ) )
+ ->setMethods( array( 'getThumbnailBucket', 'getLocalRefPath', 'getHandler' ) )
+ ->getMockForAbstractClass();
+
+ $fileMock->expects( $this->any() )->method( 'getThumbnailBucket' )->will(
+ $this->returnValue( $data['thumbnailBucket'] ) );
+
+ $fileMock->expects( $this->any() )->method( 'getLocalRefPath' )->will(
+ $this->returnValue( 'localRefPath' ) );
+
+ $fileMock->expects( $this->any() )->method( 'getHandler' )->will(
+ $this->returnValue( $handlerMock ) );
+
+ $reflection = new ReflectionClass( $fileMock );
+ $reflection_property = $reflection->getProperty( 'handler' );
+ $reflection_property->setAccessible( true );
+ $reflection_property->setValue( $fileMock, $handlerMock );
+
+ if ( !is_null( $data['tmpBucketedThumbCache'] ) ) {
+ $reflection_property = $reflection->getProperty( 'tmpBucketedThumbCache' );
+ $reflection_property->setAccessible( true );
+ $reflection_property->setValue( $fileMock, $data['tmpBucketedThumbCache'] );
+ }
+
+ $result = $fileMock->getThumbnailSource(
+ array( 'physicalWidth' => $data['physicalWidth'] ) );
+
+ $this->assertEquals( $data['expectedPath'], $result['path'], $data['message'] );
+ }
+
+ public function getThumbnailSourceProvider() {
+ return array(
+ array( array(
+ 'supportsBucketing' => true,
+ 'tmpBucketedThumbCache' => null,
+ 'thumbnailBucket' => 1024,
+ 'physicalWidth' => 2048,
+ 'expectedPath' => 'fsFilePath',
+ 'message' => 'Path downloaded from storage'
+ ) ),
+ array( array(
+ 'supportsBucketing' => true,
+ 'tmpBucketedThumbCache' => array( 1024 => '/tmp/shouldnotexist' + rand() ),
+ 'thumbnailBucket' => 1024,
+ 'physicalWidth' => 2048,
+ 'expectedPath' => 'fsFilePath',
+ 'message' => 'Path downloaded from storage because temp file is missing'
+ ) ),
+ array( array(
+ 'supportsBucketing' => true,
+ 'tmpBucketedThumbCache' => array( 1024 => '/tmp' ),
+ 'thumbnailBucket' => 1024,
+ 'physicalWidth' => 2048,
+ 'expectedPath' => '/tmp',
+ 'message' => 'Temporary path because temp file was found'
+ ) ),
+ array( array(
+ 'supportsBucketing' => false,
+ 'tmpBucketedThumbCache' => null,
+ 'thumbnailBucket' => 1024,
+ 'physicalWidth' => 2048,
+ 'expectedPath' => 'localRefPath',
+ 'message' => 'Original file path because bucketing is unsupported by handler'
+ ) ),
+ array( array(
+ 'supportsBucketing' => true,
+ 'tmpBucketedThumbCache' => null,
+ 'thumbnailBucket' => false,
+ 'physicalWidth' => 2048,
+ 'expectedPath' => 'localRefPath',
+ 'message' => 'Original file path because no width provided'
+ ) ),
+ );
+ }
+
+ /**
+ * @dataProvider generateBucketsIfNeededProvider
+ * @covers File::generateBucketsIfNeeded
+ */
+ public function testGenerateBucketsIfNeeded( $data ) {
+ $this->setMwGlobals( 'wgThumbnailBuckets', $data['buckets'] );
+
+ $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+ ->setConstructorArgs( array( array( 'name' => 'backendMock', 'wikiId' => wfWikiId() ) ) )
+ ->getMock();
+
+ $repoMock = $this->getMockBuilder( 'FileRepo' )
+ ->setConstructorArgs( array( array( 'name' => 'repoMock', 'backend' => $backendMock ) ) )
+ ->setMethods( array( 'fileExists', 'getLocalReference' ) )
+ ->getMock();
+
+ $fileMock = $this->getMockBuilder( 'File' )
+ ->setConstructorArgs( array( 'fileMock', $repoMock ) )
+ ->setMethods( array( 'getWidth', 'getBucketThumbPath', 'makeTransformTmpFile', 'generateAndSaveThumb', 'getHandler' ) )
+ ->getMockForAbstractClass();
+
+ $handlerMock = $this->getMock( 'JpegHandler', array( 'supportsBucketing' ) );
+ $handlerMock->expects( $this->any() )->method( 'supportsBucketing' )->will(
+ $this->returnValue( true ) );
+
+ $fileMock->expects( $this->any() )->method( 'getHandler' )->will(
+ $this->returnValue( $handlerMock ) );
+
+ $reflectionMethod = new ReflectionMethod( 'File', 'generateBucketsIfNeeded' );
+ $reflectionMethod->setAccessible( true );
+
+ $fileMock->expects( $this->any() )
+ ->method( 'getWidth' )
+ ->will( $this->returnValue( $data['width'] ) );
+
+ $fileMock->expects( $data['expectedGetBucketThumbPathCalls'] )
+ ->method( 'getBucketThumbPath' );
+
+ $repoMock->expects( $data['expectedFileExistsCalls'] )
+ ->method( 'fileExists' )
+ ->will( $this->returnValue( $data['fileExistsReturn'] ) );
+
+ $fileMock->expects( $data['expectedMakeTransformTmpFile'] )
+ ->method( 'makeTransformTmpFile' )
+ ->will( $this->returnValue( $data['makeTransformTmpFileReturn'] ) );
+
+ $fileMock->expects( $data['expectedGenerateAndSaveThumb'] )
+ ->method( 'generateAndSaveThumb' )
+ ->will( $this->returnValue( $data['generateAndSaveThumbReturn'] ) );
+
+ $this->assertEquals( $data['expectedResult'],
+ $reflectionMethod->invoke(
+ $fileMock,
+ array(
+ 'physicalWidth' => $data['physicalWidth'],
+ 'physicalHeight' => $data['physicalHeight'] )
+ ),
+ $data['message'] );
+ }
+
+ public function generateBucketsIfNeededProvider() {
+ $defaultBuckets = array( 256, 512, 1024, 2048, 4096 );
+
+ return array(
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'width' => 256,
+ 'physicalWidth' => 256,
+ 'physicalHeight' => 100,
+ 'expectedGetBucketThumbPathCalls' => $this->never(),
+ 'expectedFileExistsCalls' => $this->never(),
+ 'fileExistsReturn' => null,
+ 'expectedMakeTransformTmpFile' => $this->never(),
+ 'makeTransformTmpFileReturn' => false,
+ 'expectedGenerateAndSaveThumb' => $this->never(),
+ 'generateAndSaveThumbReturn' => false,
+ 'expectedResult' => false,
+ 'message' => 'No bucket found, nothing to generate'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'width' => 5000,
+ 'physicalWidth' => 300,
+ 'physicalHeight' => 200,
+ 'expectedGetBucketThumbPathCalls' => $this->once(),
+ 'expectedFileExistsCalls' => $this->once(),
+ 'fileExistsReturn' => true,
+ 'expectedMakeTransformTmpFile' => $this->never(),
+ 'makeTransformTmpFileReturn' => false,
+ 'expectedGenerateAndSaveThumb' => $this->never(),
+ 'generateAndSaveThumbReturn' => false,
+ 'expectedResult' => false,
+ 'message' => 'File already exists, no reason to generate buckets'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'width' => 5000,
+ 'physicalWidth' => 300,
+ 'physicalHeight' => 200,
+ 'expectedGetBucketThumbPathCalls' => $this->once(),
+ 'expectedFileExistsCalls' => $this->once(),
+ 'fileExistsReturn' => false,
+ 'expectedMakeTransformTmpFile' => $this->once(),
+ 'makeTransformTmpFileReturn' => false,
+ 'expectedGenerateAndSaveThumb' => $this->never(),
+ 'generateAndSaveThumbReturn' => false,
+ 'expectedResult' => false,
+ 'message' => 'Cannot generate temp file for bucket'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'width' => 5000,
+ 'physicalWidth' => 300,
+ 'physicalHeight' => 200,
+ 'expectedGetBucketThumbPathCalls' => $this->once(),
+ 'expectedFileExistsCalls' => $this->once(),
+ 'fileExistsReturn' => false,
+ 'expectedMakeTransformTmpFile' => $this->once(),
+ 'makeTransformTmpFileReturn' => new TempFSFile( '/tmp/foo' ),
+ 'expectedGenerateAndSaveThumb' => $this->once(),
+ 'generateAndSaveThumbReturn' => false,
+ 'expectedResult' => false,
+ 'message' => 'Bucket image could not be generated'
+ ) ),
+ array( array(
+ 'buckets' => $defaultBuckets,
+ 'width' => 5000,
+ 'physicalWidth' => 300,
+ 'physicalHeight' => 200,
+ 'expectedGetBucketThumbPathCalls' => $this->once(),
+ 'expectedFileExistsCalls' => $this->once(),
+ 'fileExistsReturn' => false,
+ 'expectedMakeTransformTmpFile' => $this->once(),
+ 'makeTransformTmpFileReturn' => new TempFSFile( '/tmp/foo' ),
+ 'expectedGenerateAndSaveThumb' => $this->once(),
+ 'generateAndSaveThumbReturn' => new ThumbnailImage( false, 'bar', false, false ),
+ 'expectedResult' => true,
+ 'message' => 'Bucket image could not be generated'
+ ) ),
+ );
+ }
+}
* serialization function.
*/
public function provider() {
- return array(
+ $tests = array(
array( 'nil', null, 'c0' ),
array( 'bool', true, 'c3' ),
array( 'bool', false, 'c2' ),
array( 'uint 8', 128, 'cc80' ),
array( 'uint 16', 1000, 'cd03e8' ),
array( 'uint 32', 100000, 'ce000186a0' ),
- array( 'uint 64', 10000000000, 'cf00000002540be400' ),
array( 'negative fixnum', -1, 'ff' ),
array( 'negative fixnum', -2, 'fe' ),
array( 'int 8', -128, 'd080' ),
array( 'int 8', -35, 'd0dd' ),
array( 'int 16', -1000, 'd1fc18' ),
array( 'int 32', -100000, 'd2fffe7960' ),
- array( 'int 64', -10000000000, 'd3fffffffdabf41c00' ),
- array( 'int 64', -223372036854775807, 'd3fce66c50e2840001' ),
- array( 'int 64', -9223372036854775807, 'd38000000000000001' ),
array( 'double', 0.1, 'cb3fb999999999999a' ),
array( 'double', 1.1, 'cb3ff199999999999a' ),
array( 'double', 123.456, 'cb405edd2f1a9fbe77' ),
'82a36f6e6501a374776f02'
),
);
+
+ if ( PHP_INT_SIZE > 4 ) {
+ $tests[] = array( 'uint 64', 10000000000, 'cf00000002540be400' );
+ $tests[] = array( 'int 64', -10000000000, 'd3fffffffdabf41c00' );
+ $tests[] = array( 'int 64', -223372036854775807, 'd3fce66c50e2840001' );
+ $tests[] = array( 'int 64', -9223372036854775807, 'd38000000000000001' );
+ }
+
+ return $tests;
}
/**
*/
public function testPack( $type, $value, $expected ) {
$actual = bin2hex( MWMessagePack::pack( $value ) );
- $this->assertEquals( $actual, $expected, $type );
+ $this->assertEquals( $expected, $actual, $type );
}
}
*/
class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
+ protected function setUp() {
+ parent::setUp();
+
+ $this->setMwGlobals( array(
+ 'wgContLang' => Language::factory( 'en' ),
+ ) );
+ }
+
/**
* Returns a mock GenderCache that will return "female" always.
*
array(
'tr_date' => $this->db->timestamp(),
'tr_mw_version' => $this->version,
- 'tr_php_version' => phpversion(),
+ 'tr_php_version' => PHP_VERSION,
'tr_db_version' => $this->db->getServerVersion(),
'tr_uname' => php_uname()
),
}
if ( isset( $params['width'] ) && substr( $params['width'], -2 ) == 'px' ) {
// strip the px (pixel) suffix, if found
- $params['width'] = substr( $width, 0, strlen( $width ) - 2 );
+ $params['width'] = substr( $params['width'], 0, -2 );
}
if ( isset( $params['p'] ) ) {
$params['page'] = $params['p'];