* A page_links_updated field has been added to the page table.
* SpecialPage::getTitle has been deprecated in favor of
SpecialPage::getPageTitle.
-* BREAKING CHANGE: A potentially backwards-incompatible change has been made
+* BREAKING CHANGE: Two potentially backwards-incompatible changes have been made
to the 'SpecialWatchlistQuery' hook's last parameter (array $values) to make
the hook more consistent with the 'SpecialRecentChangesQuery' one:
** Several array keys have been renamed: hideMinor → hideminor,
hideBots → hidebots, hideAnons → hideanons, hideLiu → hideliu,
hidePatrolled → hidepatrolled, hideOwn → hidemyself.
+** The parameter value is now a FormOptions object, not a plain array (array
+ access operators should continue to work, as it implements the ArrayAccess
+ interface).
+* Option to mark hooks as deprecated has been added.
==== Removed classes ====
* TitleDependency (unused)
"php": ">=5.3.2"
},
"suggest": {
- "ext-fileinfo": "*",
- "ext-mbstring": "*",
- "ext-wikidiff2": "*",
- "ext-apc": "*"
+ "ext-fileinfo": "More accurate file type detection for uploaded files",
+ "ext-mbstring": "Faster unicode handling",
+ "ext-wikidiff2": "Faster diff generation",
+ "ext-apc": "Speed up MediaWiki with opcode caching (before PHP 5.5)"
}
}
&$tables: array of tables to be queried
&$join_conds: join conditions for the tables
&$fields: array of query fields
-$values: array of variables with watchlist options
+$opts: A FormOptions object with watchlist options for the current request
'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
SpecialWatchlist. Allows extensions to register custom values they have
'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
'JSONRCFeedFormatter' => 'includes/rcfeed/JSONRCFeedFormatter.php',
+ 'XMLRCFeedFormatter' => 'includes/rcfeed/XMLRCFeedFormatter.php',
+ 'MachineReadableRCFeedFormatter' => 'includes/rcfeed/MachineReadableRCFeedFormatter.php',
# includes/resourceloader
'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
*
* @param string $event event name
* @param array $args parameters passed to hook functions
+ * @param string|null $deprecatedVersion optionally mark hook as deprecated with version number
+ *
* @return Boolean True if no handler aborted the hook
*/
-function wfRunHooks( $event, array $args = array() ) {
- return Hooks::run( $event, $args );
+function wfRunHooks( $event, array $args = array(), $deprecatedVersion = null ) {
+ return Hooks::run( $event, $args, $deprecatedVersion );
}
/**
*
* @param string $event Event name
* @param array $args Array of parameters passed to hook functions
+ * @param string|null $deprecatedVersion Optionally, mark hook as deprecated with version number
* @return bool True if no handler aborted the hook
*
* @since 1.22 A hook function is not required to return a value for
* @throws MWException
* @throws FatalError
*/
- public static function run( $event, array $args = array() ) {
+ public static function run( $event, array $args = array(), $deprecatedVersion = null ) {
wfProfileIn( 'hook: ' . $event );
foreach ( self::getHandlers( $event ) as $hook ) {
// Turn non-array values into an array. (Can't use casting because of objects.)
// Profile first in case the Profiler causes errors.
wfProfileIn( $func );
set_error_handler( 'Hooks::hookErrorHandler' );
+
+ // mark hook as deprecated, if deprecation version is specified
+ if ( $deprecatedVersion !== null ) {
+ wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
+ }
+
try {
$retval = call_user_func_array( $callback, $hook_args );
} catch ( MWHookException $e ) {
* link() replaces the old functions in the makeLink() family.
*
* @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
- * You can call it using this if you want to keep compat with these:
- * $linker = class_exists( 'DummyLinker' ) ? new DummyLinker() : new Linker();
- * $linker->link( ... );
*
* @param $target Title Can currently only be a Title, but this may
* change to support Images, literal URLs, etc.
* Cleans up HTML, removes dangerous tags and attributes, and
* removes HTML comments
* @private
- * @param $text String
- * @param $processCallback Callback to do any variable or parameter
- * replacements in HTML attribute values
- * @param array $args for the processing callback
- * @param array $extratags for any extra tags to include
- * @param array $removetags for any tags (default or extra) to exclude
+ * @param string $text
+ * @param callable $processCallback Callback to do any variable or parameter
+ * replacements in HTML attribute values
+ * @param array $args Arguments for the processing callback
+ * @param array $extratags For any extra tags to include
+ * @param array $removetags For any tags (default or extra) to exclude
* @return string
*/
static function removeHTMLtags( $text, $processCallback = null,
* trailing spaces and one of the newlines.
*
* @private
- * @param $text String
+ * @param string $text
* @return string
*/
static function removeHTMLcomments( $text ) {
* where we may want to allow a tag within content but ONLY when it has
* specific attributes set.
*
- * @param $params
- * @param $element
+ * @param string $params
+ * @param string $element
* @return bool
*/
static function validateTag( $params, $element ) {
* - Unsafe style attributes are discarded
* - Invalid id attributes are re-encoded
*
- * @param $attribs Array
- * @param $element String
- * @return Array
+ * @param array $attribs
+ * @param string $element
+ * @return array
*
* @todo Check for legal values where the DTD limits things.
* @todo Check for unique id attribute :P
* - Unsafe style attributes are discarded
* - Invalid id attributes are re-encoded
*
- * @param $attribs Array
+ * @param array $attribs
* @param array $whitelist list of allowed attribute names
- * @return Array
+ * @return array
*
* @todo Check for legal values where the DTD limits things.
* @todo Check for unique id attribute :P
* will be combined (if they're both strings).
*
* @todo implement merging for other attributes such as style
- * @param $a Array
- * @param $b Array
+ * @param array $a
+ * @param array $b
* @return array
*/
static function mergeAttributes( $a, $b ) {
* clever input strings. These character references must
* be escaped before the return value is embedded in HTML.
*
- * @param $value String
- * @return String
+ * @param string $value
+ * @return string
*/
static function checkCss( $value ) {
// Decode character references like {
// Reject problematic keywords and control characters
if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
return '/* invalid control char */';
- } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
+ } elseif ( preg_match(
+ '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix',
+ $value
+ ) ) {
return '/* insecure input */';
}
return $value;
}
/**
- * @param $matches array
- * @return String
+ * @param array $matches
+ * @return string
*/
static function cssDecodeCallback( $matches ) {
if ( $matches[1] !== '' ) {
* - Unsafe style attributes are discarded
* - Prepends space if there are attributes.
*
- * @param $text String
- * @param $element String
- * @return String
+ * @param string $text
+ * @param string $element
+ * @return string
*/
static function fixTagAttributes( $text, $element ) {
if ( trim( $text ) == '' ) {
/**
* Encode an attribute value for HTML output.
- * @param $text String
- * @return HTML-encoded text fragment
+ * @param string $text
+ * @return string HTML-encoded text fragment
*/
static function encodeAttribute( $text ) {
$encValue = htmlspecialchars( $text, ENT_QUOTES );
/**
* Encode an attribute value for HTML tags, with extra armoring
* against further wiki processing.
- * @param $text String
- * @return HTML-encoded text fragment
+ * @param string $text
+ * @return string HTML-encoded text fragment
*/
static function safeEncodeAttribute( $text ) {
$encValue = Sanitizer::encodeAttribute( $text );
* (which don't work reliably in fragments cross-browser).
*
* @see http://www.w3.org/TR/html401/types.html#type-name Valid characters
- * in the id and
- * name attributes
- * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with the id attribute
+ * in the id and name attributes
+ * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with
+ * the id attribute
* @see http://www.whatwg.org/html/elements.html#the-id-attribute
* HTML5 definition of id attribute
*
* 'legacy': Behave the way the old HTML 4-based ID escaping worked even
* if $wgExperimentalHtmlIds is used, so we can generate extra
* anchors and links won't break.
- * @return String
+ * @return string
*/
static function escapeId( $id, $options = array() ) {
global $wgExperimentalHtmlIds;
*
* @see http://www.w3.org/TR/CSS21/syndata.html Valid characters/format
*
- * @param $class String
- * @return String
+ * @param string $class
+ * @return string
*/
static function escapeClass( $class ) {
// Convert ugly stuff to underscores and kill underscores in ugly places
* Given HTML input, escape with htmlspecialchars but un-escape entities.
* This allows (generally harmless) entities like   to survive.
*
- * @param string $html to escape
- * @return String: escaped input
+ * @param string $html HTML to escape
+ * @return string: escaped input
*/
static function escapeHtmlAllowEntities( $html ) {
$html = Sanitizer::decodeCharReferences( $html );
/**
* Regex replace callback for armoring links against further processing.
- * @param $matches Array
+ * @param array $matches
* @return string
*/
private static function armorLinksCallback( $matches ) {
* a partial tag string. Attribute names are forces to lowercase,
* character references are decoded to UTF-8 text.
*
- * @param $text String
- * @return Array
+ * @param string $text
+ * @return array
*/
public static function decodeTagAttributes( $text ) {
if ( trim( $text ) == '' ) {
* Build a partial tag string from an associative array of attribute
* names and values as returned by decodeTagAttributes.
*
- * @param $assoc_array Array
- * @return String
+ * @param array $assoc_array
+ * @return string
*/
public static function safeEncodeTagAttributes( $assoc_array ) {
$attribs = array();
* Pick the appropriate attribute value from a match set from the
* attribs regex matches.
*
- * @param $set Array
- * @throws MWException
- * @return String
+ * @param array $set
+ * @throws MWException when tag conditions are not met.
+ * @return string
*/
private static function getTagAttributeCallback( $set ) {
if ( isset( $set[6] ) ) {
* but note that we're not returning the value, but are returning
* XML source fragments that will be slapped into output.
*
- * @param $text String
- * @return String
+ * @param string $text
+ * @return string
+ * @todo Remove, unused?
*/
private static function normalizeAttributeValue( $text ) {
return str_replace( '"', '"',
}
/**
- * @param $text string
- * @return mixed
+ * @param string $text
+ * @return string
*/
private static function normalizeWhitespace( $text ) {
return preg_replace(
* by Parser::stripSectionName(), for use in the id's that are used for
* section links.
*
- * @param $section String
- * @return String
+ * @param string $section
+ * @return string
*/
static function normalizeSectionNameWhitespace( $section ) {
return trim( preg_replace( '/[ _]+/', ' ', $section ) );
* c. use lower cased "&#x", not "&#X"
* d. fix or reject non-valid attributes
*
- * @param $text String
- * @return String
+ * @param string $text
+ * @return string
* @private
*/
static function normalizeCharReferences( $text ) {
$text );
}
/**
- * @param $matches String
- * @return String
+ * @param string $matches
+ * @return string
*/
static function normalizeCharReferencesCallback( $matches ) {
$ret = null;
* the HTML equivalent. Otherwise, returns HTML-escaped text of
* pseudo-entity source (eg &foo;)
*
- * @param $name String
- * @return String
+ * @param string $name
+ * @return string
*/
static function normalizeEntity( $name ) {
if ( isset( self::$htmlEntityAliases[$name] ) ) {
}
/**
- * @param $codepoint
+ * @param int $codepoint
* @return null|string
*/
static function decCharReference( $codepoint ) {
}
/**
- * @param $codepoint
+ * @param int $codepoint
* @return null|string
*/
static function hexCharReference( $codepoint ) {
/**
* Returns true if a given Unicode codepoint is a valid character in XML.
- * @param $codepoint Integer
- * @return Boolean
+ * @param int $codepoint
+ * @return bool
*/
private static function validateCodepoint( $codepoint ) {
return $codepoint == 0x09
* Decode any character references, numeric or named entities,
* in the text and return a UTF-8 string.
*
- * @param $text String
- * @return String
+ * @param string $text
+ * @return string
*/
public static function decodeCharReferences( $text ) {
return preg_replace_callback(
* This is useful for page titles, not for text to be displayed,
* MediaWiki allows HTML entities to escape normalization as a feature.
*
- * @param string $text (already normalized, containing entities)
- * @return String (still normalized, without entities)
+ * @param string $text Already normalized, containing entities
+ * @return string Still normalized, without entities
*/
public static function decodeCharReferencesAndNormalize( $text ) {
global $wgContLang;
}
/**
- * @param $matches String
- * @return String
+ * @param string $matches
+ * @return string
*/
static function decodeCharReferencesCallback( $matches ) {
if ( $matches[1] != '' ) {
/**
* Return UTF-8 string for a codepoint if that is a valid
* character reference, otherwise U+FFFD REPLACEMENT CHARACTER.
- * @param $codepoint Integer
- * @return String
+ * @param int $codepoint
+ * @return string
* @private
*/
static function decodeChar( $codepoint ) {
* return the UTF-8 encoding of that character. Otherwise, returns
* pseudo-entity source (eg "&foo;")
*
- * @param $name String
- * @return String
+ * @param string $name
+ * @return string
*/
static function decodeEntity( $name ) {
if ( isset( self::$htmlEntityAliases[$name] ) ) {
/**
* Fetch the whitelist of acceptable attributes for a given element name.
*
- * @param $element String
- * @return Array
+ * @param string $element
+ * @return array
*/
static function attributeWhitelist( $element ) {
$list = Sanitizer::setupAttributeWhitelist();
/**
* Foreach array key (an allowed HTML element), return an array
* of allowed attributes
- * @return Array
+ * @return array
*/
static function setupAttributeWhitelist() {
global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
* inclusion in HTML output as of 1.10!
*
* @param string $text HTML fragment
- * @return String
+ * @return string
*/
static function stripAllTags( $text ) {
# Actual <tags>
*
* Use for passing XHTML fragments to PHP's XML parsing functions
*
- * @return String
+ * @return string
*/
static function hackDocType() {
$out = "<!DOCTYPE html [\n";
}
/**
- * @param $url string
+ * @param string $url
* @return mixed|string
*/
static function cleanUrl( $url ) {
}
/**
- * @param $matches array
+ * @param array $matches
* @return string
*/
static function cleanUrlCallback( $matches ) {
* @since 1.18
*
* @param string $addr E-mail address
- * @return Bool
+ * @return bool
*/
public static function validateEmail( $addr ) {
$result = null;
return $retval;
}
+
switch ( $type ) {
case 'edit':
return RC_EDIT;
return RC_LOG;
case 'external':
return RC_EXTERNAL;
+ default:
+ ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
}
}
return $retval;
}
+
switch ( $type ) {
case 'edit':
return RC_EDIT;
return RC_LOG;
case 'external':
return RC_EXTERNAL;
+ default:
+ ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
}
}
* Kind of like Hawking's [[Chronology Protection Agency]].
*/
class ChronologyProtector {
- /** @var Array (DB master name => position) */
+ /** @var array (DB master name => position) */
protected $startupPositions = array();
- /** @var Array (DB master name => position) */
+
+ /** @var array (DB master name => position) */
protected $shutdownPositions = array();
- protected $initialized = false; // bool; whether the session data was loaded
+ /** @var bool Whether the session data was loaded */
+ protected $initialized = false;
/**
* Initialise a LoadBalancer to give it appropriate chronology protection.
* to that position by delaying execution. The delay may timeout and allow stale
* data if no non-lagged slaves are available.
*
- * @param $lb LoadBalancer
+ * @param LoadBalancer $lb
* @return void
*/
public function initLB( LoadBalancer $lb ) {
* Notify the ChronologyProtector that the LoadBalancer is about to shut
* down. Saves replication positions.
*
- * @param $lb LoadBalancer
+ * @param LoadBalancer $lb
* @return void
*/
public function shutdownLB( LoadBalancer $lb ) {
*/
class CloneDatabase {
- /**
- * Table prefix for cloning
- * @var String
- */
+ /** @var string Table prefix for cloning */
private $newTablePrefix = '';
- /**
- * Current table prefix
- * @var String
- */
+ /** @var string Current table prefix */
private $oldTablePrefix = '';
- /**
- * List of tables to be cloned
- * @var Array
- */
+ /** @var array List of tables to be cloned */
private $tablesToClone = array();
- /**
- * Should we DROP tables containing the new names?
- * @var Bool
- */
+ /** @var bool Should we DROP tables containing the new names? */
private $dropCurrentTables = true;
- /**
- * Whether to use temporary tables or not
- * @var Bool
- */
+ /** @var bool Whether to use temporary tables or not */
private $useTemporaryTables = true;
/**
* Constructor
*
- * @param $db DatabaseBase A database subclass
+ * @param DatabaseBase $db A database subclass
* @param array $tablesToClone An array of tables to clone, unprefixed
* @param string $newTablePrefix Prefix to assign to the tables
* @param string $oldTablePrefix Prefix on current tables, if not $wgDBprefix
- * @param $dropCurrentTables bool
+ * @param bool $dropCurrentTables
*/
public function __construct( DatabaseBase $db, array $tablesToClone,
$newTablePrefix, $oldTablePrefix = '', $dropCurrentTables = true
/**
* Change the table prefix on all open DB connections/
*
- * @param $prefix
+ * @param string $prefix
* @return void
*/
public static function changePrefix( $prefix ) {
}
/**
- * @param $lb LoadBalancer
- * @param $prefix
+ * @param LoadBalancer $lb
+ * @param string $prefix
* @return void
*/
public static function changeLBPrefix( $lb, $prefix ) {
}
/**
- * @param $db DatabaseBase
- * @param $prefix
+ * @param DatabaseBase $db
+ * @param string $prefix
* @return void
*/
public static function changeDBPrefix( $db, $prefix ) {
* member variables.
* If no more rows are available, false is returned.
*
- * @param $res ResultWrapper|object as returned from DatabaseBase::query(), etc.
- * @return object|bool
+ * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
+ * @return stdClass|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
function fetchObject( $res );
/**
* Fetch the next row from the given result object, in associative array
- * form. Fields are retrieved with $row['fieldname'].
+ * form. Fields are retrieved with $row['fieldname'].
* If no more rows are available, false is returned.
*
- * @param $res ResultWrapper result object as returned from DatabaseBase::query(), etc.
+ * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
* @return array|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
/**
* Get the number of rows in a result object
*
- * @param $res Mixed: A SQL result
+ * @param mixed $res A SQL result
* @return int
*/
function numRows( $res );
* Get the number of fields in a result object
* @see http://www.php.net/mysql_num_fields
*
- * @param $res Mixed: A SQL result
+ * @param mixed $res A SQL result
* @return int
*/
function numFields( $res );
* Get a field name in a result object
* @see http://www.php.net/mysql_field_name
*
- * @param $res Mixed: A SQL result
- * @param $n Integer
+ * @param mixed $res A SQL result
+ * @param int $n
* @return string
*/
function fieldName( $res, $n );
* Change the position of the cursor in a result object
* @see http://www.php.net/mysql_data_seek
*
- * @param $res Mixed: A SQL result
- * @param $row Mixed: Either MySQL row or ResultWrapper
+ * @param mixed $res A SQL result
+ * @param int $row
*/
function dataSeek( $res, $row );
* mysql_fetch_field() wrapper
* Returns false if the field doesn't exist
*
- * @param string $table table name
- * @param string $field field name
+ * @param string $table Table name
+ * @param string $field Field name
*
* @return Field
*/
* @param string $table Table name
* @param string $index Index name
* @param string $fname Calling function name
- * @return Mixed: Database-specific index description class or false if the index does not exist
+ * @return mixed Database-specific index description class or false if the index does not exist
*/
function indexInfo( $table, $index, $fname = __METHOD__ );
/**
* Wrapper for addslashes()
*
- * @param string $s to be slashed.
- * @return string: slashed string.
+ * @param string $s String to be slashed.
+ * @return string Slashed string.
*/
function strencode( $s );
/**
* Returns a wikitext link to the DB's website, e.g.,
- * return "[http://www.mysql.com/ MySQL]";
+ * return "[http://www.mysql.com/ MySQL]";
* Should at least contain plain text, if for some reason
* your database has no website.
*
- * @return string: wikitext of a link to the server software's web site
+ * @return string Wikitext of a link to the server software's web site
*/
function getSoftwareLink();
* A string describing the current software version, like from
* mysql_get_server_info().
*
- * @return string: Version information from the database server.
+ * @return string Version information from the database server.
*/
function getServerVersion();
/**
* A string describing the current software version, and possibly
- * other details in a user-friendly way. Will be listed on Special:Version, etc.
+ * other details in a user-friendly way. Will be listed on Special:Version, etc.
* Use getServerVersion() to get machine-friendly information.
*
- * @return string: Version information from the database server
+ * @return string Version information from the database server
*/
function getServerInfo();
}
abstract class DatabaseBase implements IDatabase, DatabaseType {
/** Number of times to re-try an operation in case of deadlock */
const DEADLOCK_TRIES = 4;
+
/** Minimum time to wait before retry, in microseconds */
const DEADLOCK_DELAY_MIN = 500000;
+
/** Maximum time to wait before retry */
const DEADLOCK_DELAY_MAX = 1500000;
protected $mServer, $mUser, $mPassword, $mDBname;
+ /** @var resource Database connection */
protected $mConn = null;
protected $mOpened = false;
* Remembers the function name given for starting the most recent transaction via begin().
* Used to provide additional context for error reporting.
*
- * @var String
+ * @var string
* @see DatabaseBase::mTrxLevel
*/
private $mTrxFname = null;
/**
* Record if possible write queries were done in the last transaction started
*
- * @var Bool
+ * @var bool
* @see DatabaseBase::mTrxLevel
*/
private $mTrxDoneWrites = false;
/**
* Record if the current transaction was started implicitly due to DBO_TRX being set.
*
- * @var Bool
+ * @var bool
* @see DatabaseBase::mTrxLevel
*/
private $mTrxAutomatic = false;
/**
* Record if the current transaction was started implicitly by DatabaseBase::startAtomic
*
- * @var Bool
+ * @var bool
*/
private $mTrxAutomaticAtomic = false;
/**
* @since 1.21
- * @var file handle for upgrade
+ * @var resource File handle for upgrade
*/
protected $fileHandle = null;
/**
* @since 1.22
- * @var Process cache of VIEWs names in the database
+ * @var string[] Process cache of VIEWs names in the database
*/
protected $allViews = null;
/**
* A string describing the current software version, and possibly
- * other details in a user-friendly way. Will be listed on Special:Version, etc.
+ * other details in a user-friendly way. Will be listed on Special:Version, etc.
* Use getServerVersion() to get machine-friendly information.
*
- * @return string: Version information from the database server
+ * @return string Version information from the database server
*/
public function getServerInfo() {
return $this->getServerVersion();
}
/**
- * @return string: command delimiter used by this database engine
+ * @return string command delimiter used by this database engine
*/
public function getDelimiter() {
return $this->delimiter;
/**
* Boolean, controls output of large amounts of debug information.
- * @param $debug bool|null
+ * @param bool|null $debug
* - true to enable debugging
* - false to disable debugging
* - omitted or null to do nothing
* split up queries into batches using a LIMIT clause than to switch off
* buffering.
*
- * @param $buffer null|bool
- *
+ * @param null|bool $buffer
* @return null|bool The previous value of the flag
*/
public function bufferResults( $buffer = null ) {
*
* Do not use this function outside of the Database classes.
*
- * @param $ignoreErrors bool|null
- *
+ * @param null|bool $ignoreErrors
* @return bool The previous value of the flag.
*/
public function ignoreErrors( $ignoreErrors = null ) {
/**
* Set the filehandle to copy write statements to.
*
- * @param $fh filehandle
+ * @param resource $fh File handle
*/
public function setFileHandle( $fh ) {
$this->fileHandle = $fh;
* @param string $name The entry of the info array to get, or null to get the
* whole array
*
- * @return LoadBalancer|null
+ * @return array|mixed|null
*/
public function getLBInfo( $name = null ) {
if ( is_null( $name ) ) {
* the LB info array is set to that parameter. If it is called with two
* parameters, the member with the given name is set to the given value.
*
- * @param $name
+ * @param string $name
* @param $value
*/
public function setLBInfo( $name, $value = null ) {
/**
* Set lag time in seconds for a fake slave
*
- * @param $lag int
+ * @param int $lag
*/
public function setFakeSlaveLag( $lag ) {
$this->mFakeSlaveLag = $lag;
/**
* Make this connection a fake master
*
- * @param $enabled bool
+ * @param bool $enabled
*/
public function setFakeMaster( $enabled = true ) {
$this->mFakeMaster = $enabled;
/**
* Return the last query that went through DatabaseBase::query()
- * @return String
+ * @return string
*/
public function lastQuery() {
return $this->mLastQuery;
/**
* Is a connection to the database open?
- * @return Boolean
+ * @return bool
*/
public function isOpen() {
return $this->mOpened;
/**
* Set a flag for this connection
*
- * @param $flag Integer: DBO_* constants from Defines.php:
+ * @param int $flag DBO_* constants from Defines.php:
* - DBO_DEBUG: output some debug info (same as debug())
* - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
* - DBO_TRX: automatically start transactions
global $wgDebugDBTransactions;
$this->mFlags |= $flag;
if ( ( $flag & DBO_TRX ) & $wgDebugDBTransactions ) {
- wfDebug( "Implicit transactions are now disabled.\n" );
+ wfDebug( "Implicit transactions are now disabled.\n" );
}
}
/**
* Clear a flag for this connection
*
- * @param $flag : same as setFlag()'s $flag param
+ * @param int $flag DBO_* constants from Defines.php:
+ * - DBO_DEBUG: output some debug info (same as debug())
+ * - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+ * - DBO_TRX: automatically start transactions
+ * - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+ * and removes it in command line mode
+ * - DBO_PERSISTENT: use persistant database connection
*/
public function clearFlag( $flag ) {
global $wgDebugDBTransactions;
/**
* Returns a boolean whether the flag $flag is set for this connection
*
- * @param $flag : same as setFlag()'s $flag param
- * @return Boolean
+ * @param int $flag DBO_* constants from Defines.php:
+ * - DBO_DEBUG: output some debug info (same as debug())
+ * - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+ * - DBO_TRX: automatically start transactions
+ * - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+ * and removes it in command line mode
+ * - DBO_PERSISTENT: use persistant database connection
+ * @return bool
*/
public function getFlag( $flag ) {
return !!( $this->mFlags & $flag );
/**
* General read-only accessor
*
- * @param $name string
- *
+ * @param string $name
* @return string
*/
public function getProperty( $name ) {
* DatabaseBase subclasses should not be constructed directly in external
* code. DatabaseBase::factory() should be used instead.
*
- * @param array Parameters passed from DatabaseBase::factory()
+ * @param array $params Parameters passed from DatabaseBase::factory()
*/
function __construct( $params = null ) {
global $wgDBprefix, $wgCommandLineMode, $wgDebugDBTransactions;
* @param string $dbType A possible DB type
* @param array $p An array of options to pass to the constructor.
* Valid options are: host, user, password, dbname, flags, tablePrefix, driver
- * @return DatabaseBase subclass or null
+ * @throws MWException If the database driver or extension cannot be found
+ * @return DatabaseBase|null DatabaseBase subclass or null
*/
final public static function factory( $dbType, $p = array() ) {
$canonicalDBTypes = array(
/**
* @param $errno
- * @param $errstr
- * @access private
+ * @param string $errstr
*/
public function connectionErrorHandler( $errno, $errstr ) {
$this->mPHPError = $errstr;
* if it is open : commits any open transactions
*
* @throws MWException
- * @return Bool operation success. true if already closed.
+ * @return bool Operation success. true if already closed.
*/
public function close() {
if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
/**
* Closes underlying database connection
* @since 1.20
- * @return bool: Whether connection was closed successfully
+ * @return bool Whether connection was closed successfully
*/
abstract protected function closeConnection();
/**
- * @param string $error fallback error message, used if none is given by DB
+ * @param string $error Fallback error message, used if none is given by DB
* @throws DBConnectionError
*/
function reportConnectionError( $error = 'Unknown error' ) {
/**
* The DBMS-dependent part of query()
*
- * @param $sql String: SQL query.
- * @return ResultWrapper Result object to feed to fetchObject, fetchRow, ...; or false on failure
+ * @param string $sql SQL query.
+ * @return ResultWrapper|bool Result object to feed to fetchObject,
+ * fetchRow, ...; or false on failure
*/
abstract protected function doQuery( $sql );
* Determine whether a query writes to the DB.
* Should return true if unsure.
*
- * @param $sql string
- *
+ * @param string $sql
* @return bool
*/
public function isWriteQuery( $sql ) {
*
* However, the query wrappers themselves should call this function.
*
- * @param $sql String: SQL query
- * @param $fname String: Name of the calling function, for profiling/SHOW PROCESSLIST
+ * @param string $sql SQL query
+ * @param string $fname Name of the calling function, for profiling/SHOW PROCESSLIST
* comment (you can use __METHOD__ or add some extra info)
- * @param $tempIgnore Boolean: Whether to avoid throwing an exception on errors...
+ * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
* maybe best to catch the exception instead?
* @throws MWException
- * @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
+ * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
* for a successful read query, or false on failure if $tempIgnore set
*/
public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname );
}
+ $queryProf = '';
+ $totalProf = '';
$isMaster = !is_null( $this->getLBInfo( 'master' ) );
+
if ( !Profiler::instance()->isStub() ) {
# generalizeSQL will probably cut down the query to reasonable
# logging size most of the time. The substr is really just a sanity check.
* Report a query error. Log the error, and if neither the object ignore
* flag nor the $tempIgnore flag is set, throw a DBQueryError.
*
- * @param $error String
- * @param $errno Integer
- * @param $sql String
- * @param $fname String
- * @param $tempIgnore Boolean
+ * @param string $error
+ * @param int $errno
+ * @param string $sql
+ * @param string $fname
+ * @param bool $tempIgnore
* @throws DBQueryError
*/
public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
* & = filename; reads the file and inserts as a blob
* (we don't use this though...)
*
- * @param $sql string
- * @param $func string
+ * @param string $sql
+ * @param string $func
*
* @return array
*/
protected function prepare( $sql, $func = 'DatabaseBase::prepare' ) {
/* MySQL doesn't support prepared statements (yet), so just
- pack up the query for reference. We'll manually replace
- the bits later. */
+ * pack up the query for reference. We'll manually replace
+ * the bits later.
+ */
return array( 'query' => $sql, 'func' => $func );
}
/**
* Free a prepared query, generated by prepare().
- * @param $prepared
+ * @param string $prepared
*/
protected function freePrepared( $prepared ) {
/* No-op by default */
/**
* Execute a prepared query with the various arguments
* @param string $prepared the prepared sql
- * @param $args Mixed: Either an array here, or put scalars as varargs
+ * @param mixed $args Either an array here, or put scalars as varargs
*
* @return ResultWrapper
*/
/**
* For faking prepared SQL statements on DBs that don't support it directly.
*
- * @param string $preparedQuery a 'preparable' SQL statement
- * @param array $args of arguments to fill it with
- * @return string executable SQL
+ * @param string $preparedQuery A 'preparable' SQL statement
+ * @param array $args of Arguments to fill it with
+ * @return string Executable SQL
*/
public function fillPrepared( $preparedQuery, $args ) {
reset( $args );
* The arguments should be in $this->preparedArgs and must not be touched
* while we're doing this.
*
- * @param $matches Array
+ * @param array $matches
* @throws DBUnexpectedError
- * @return String
+ * @return string
*/
protected function fillPreparedArg( $matches ) {
switch ( $matches[1] ) {
* necessary to call this, just use unset() or let the variable holding
* the result object go out of scope.
*
- * @param $res Mixed: A SQL result
+ * @param mixed $res A SQL result
*/
public function freeResult( $res ) {
}
* Returns an optional USE INDEX clause to go after the table, and a
* string to go at the end of the query.
*
- * @param array $options associative array of options to be turned into
- * an SQL query, valid keys are listed in the function.
- * @return Array
+ * @param array $options Associative array of options to be turned into
+ * an SQL query, valid keys are listed in the function.
+ * @return array
* @see DatabaseBase::select()
*/
public function makeSelectOptions( $options ) {
/**
* Returns an optional GROUP BY with an optional HAVING
*
- * @param array $options associative array of options
+ * @param array $options Associative array of options
* @return string
* @see DatabaseBase::select()
* @since 1.21
/**
* Returns an optional ORDER BY
*
- * @param array $options associative array of options
+ * @param array $options Associative array of options
* @return string
* @see DatabaseBase::select()
* @since 1.21
* @param string|array $conds Conditions
* @param string $fname Caller function name
* @param array $options Query options
- * @param $join_conds Array Join conditions
+ * @param array $join_conds Join conditions
*
- * @param $table string|array
+ * @param string|array $table
*
* May be either an array of table names, or a single string holding a table
* name. If an array is given, table aliases can be specified, for example:
* added, and various other table name mappings to be performed.
*
*
- * @param $vars string|array
+ * @param string|array $vars
*
* May be either a field name or an array of field names. The field names
* can be complete fragments of SQL, for direct inclusion into the SELECT
* DBMS-independent.
*
*
- * @param $conds string|array
+ * @param string|array $conds
*
* May be either a string containing a single condition, or an array of
* conditions. If an array is given, the conditions constructed from each
* - DatabaseBase::conditional()
*
*
- * @param $options string|array
+ * @param string|array $options
*
* Optional: Array of query options. Boolean options are specified by
* including them in the array as a string value with a numeric key, for
* - SQL_NO_CACHE
*
*
- * @param $join_conds string|array
+ * @param string|array $join_conds
*
* Optional associative array of table-specific join conditions. In the
* most common case, this is unnecessary, since the join condition can be
*
* array( 'page' => array( 'LEFT JOIN', 'page_latest=rev_id' ) )
*
- * @return ResultWrapper. If the query returned no rows, a ResultWrapper
+ * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
* with no rows in it will be returned. If there was a query error, a
* DBQueryError exception will be thrown, except if the "ignore errors"
* option was set, in which case false will be returned.
* @param string|array $conds Conditions
* @param string $fname Caller function name
* @param string|array $options Query options
- * @param $join_conds string|array Join conditions
+ * @param string|array $join_conds Join conditions
*
* @return string SQL query string.
* @see DatabaseBase::select()
* @param array $conds Conditions
* @param string $fname Caller function name
* @param string|array $options Query options
- * @param $join_conds array|string Join conditions
+ * @param array|string $join_conds Join conditions
*
* @return stdClass|bool
*/
*
* Takes the same arguments as DatabaseBase::select().
*
- * @param string $table table name
- * @param array|string $vars : unused
- * @param array|string $conds : filters on the table
- * @param string $fname function name for profiling
- * @param array $options options for select
- * @return Integer: row count
+ * @param string $table Table name
+ * @param string $vars Unused
+ * @param array|string $conds Filters on the table
+ * @param string $fname Function name for profiling
+ * @param array $options Options for select
+ * @return int Row count
*/
public function estimateRowCount( $table, $vars = '*', $conds = '',
$fname = __METHOD__, $options = array()
/**
* Determines whether a field exists in a table
*
- * @param string $table table name
- * @param string $field filed to check on that table
- * @param string $fname calling function name (optional)
- * @return Boolean: whether $table has filed $field
+ * @param string $table Table name
+ * @param string $field Filed to check on that table
+ * @param string $fname Calling function name (optional)
+ * @return bool Whether $table has filed $field
*/
public function fieldExists( $table, $field, $fname = __METHOD__ ) {
$info = $this->fieldInfo( $table, $field );
* Usually throws a DBQueryError on failure
* If errors are explicitly ignored, returns NULL on failure
*
- * @param $table
- * @param $index
- * @param $fname string
- *
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return bool|null
*/
public function indexExists( $table, $index, $fname = __METHOD__ ) {
/**
* Query whether a given table exists
*
- * @param $table string
- * @param $fname string
- *
+ * @param string $table
+ * @param string $fname
* @return bool
*/
public function tableExists( $table, $fname = __METHOD__ ) {
/**
* Determines if a given index is unique
*
- * @param $table string
- * @param $index string
+ * @param string $table
+ * @param string $index
*
* @return bool
*/
/**
* Helper for DatabaseBase::insert().
*
- * @param $options array
+ * @param array $options
* @return string
*/
protected function makeInsertOptions( $options ) {
* possible to determine how many rows were successfully inserted using
* DatabaseBase::affectedRows().
*
- * @param $table String Table name. This will be passed through
- * DatabaseBase::tableName().
- * @param $a Array of rows to insert
- * @param $fname String Calling function name (use __METHOD__) for logs/profiling
+ * @param string $table Table name. This will be passed through
+ * DatabaseBase::tableName().
+ * @param array $a Array of rows to insert
+ * @param string $fname Calling function name (use __METHOD__) for logs/profiling
* @param array $options of options
*
* @return bool
/**
* UPDATE wrapper. Takes a condition array and a SET array.
*
- * @param $table String name of the table to UPDATE. This will be passed through
- * DatabaseBase::tableName().
- *
+ * @param string $table Name of the table to UPDATE. This will be passed through
+ * DatabaseBase::tableName().
* @param array $values An array of values to SET. For each array element,
- * the key gives the field name, and the value gives the data
- * to set that field to. The data will be quoted by
- * DatabaseBase::addQuotes().
- *
- * @param $conds Array: An array of conditions (WHERE). See
- * DatabaseBase::select() for the details of the format of
- * condition arrays. Use '*' to update all rows.
- *
- * @param $fname String: The function name of the caller (from __METHOD__),
- * for logging and profiling.
- *
+ * the key gives the field name, and the value gives the data to set
+ * that field to. The data will be quoted by DatabaseBase::addQuotes().
+ * @param array $conds An array of conditions (WHERE). See
+ * DatabaseBase::select() for the details of the format of condition
+ * arrays. Use '*' to update all rows.
+ * @param string $fname The function name of the caller (from __METHOD__),
+ * for logging and profiling.
* @param array $options An array of UPDATE options, can be:
- * - IGNORE: Ignore unique key conflicts
- * - LOW_PRIORITY: MySQL-specific, see MySQL manual.
- * @return Boolean
+ * - IGNORE: Ignore unique key conflicts
+ * - LOW_PRIORITY: MySQL-specific, see MySQL manual.
+ * @return bool
*/
function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
$table = $this->tableName( $table );
/**
* Makes an encoded list of strings from an array
- * @param array $a containing the data
- * @param int $mode Constant
- * - LIST_COMMA: comma separated, no field names
- * - LIST_AND: ANDed WHERE clause (without the WHERE). See
- * the documentation for $conds in DatabaseBase::select().
- * - LIST_OR: ORed WHERE clause (without the WHERE)
- * - LIST_SET: comma separated with field names, like a SET clause
- * - LIST_NAMES: comma separated field names
*
+ * @param array $a Containing the data
+ * @param int $mode Constant
+ * - LIST_COMMA: Comma separated, no field names
+ * - LIST_AND: ANDed WHERE clause (without the WHERE). See the
+ * documentation for $conds in DatabaseBase::select().
+ * - LIST_OR: ORed WHERE clause (without the WHERE)
+ * - LIST_SET: Comma separated with field names, like a SET clause
+ * - LIST_NAMES: Comma separated field names
* @throws MWException|DBUnexpectedError
* @return string
*/
* The keys on each level may be either integers or strings.
*
* @param array $data organized as 2-d
- * array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
- * @param string $baseKey field name to match the base-level keys to (eg 'pl_namespace')
- * @param string $subKey field name to match the sub-level keys to (eg 'pl_title')
+ * array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
+ * @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
+ * @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
* @return Mixed: string SQL fragment, or false if no items in array.
*/
public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
* Return aggregated value alias
*
* @param $valuedata
- * @param $valuename string
+ * @param string $valuename
*
* @return string
*/
}
/**
- * @param $field
+ * @param string $field
* @return string
*/
public function bitNot( $field ) {
}
/**
- * @param $fieldLeft
- * @param $fieldRight
+ * @param string $fieldLeft
+ * @param string $fieldRight
* @return string
*/
public function bitAnd( $fieldLeft, $fieldRight ) {
}
/**
- * @param $fieldLeft
- * @param $fieldRight
+ * @param string $fieldLeft
+ * @param string $fieldRight
* @return string
*/
public function bitOr( $fieldLeft, $fieldRight ) {
/**
* Build a concatenation list to feed into a SQL query
- * @param array $stringList list of raw SQL expressions; caller is responsible for any quoting
- * @return String
+ * @param array $stringList List of raw SQL expressions; caller is
+ * responsible for any quoting
+ * @return string
*/
public function buildConcat( $stringList ) {
return 'CONCAT(' . implode( ',', $stringList ) . ')';
* @param string $field Field name
* @param string|array $conds Conditions
* @param string|array $join_conds Join conditions
- * @return String SQL text
+ * @return string SQL text
* @since 1.23
*/
public function buildGroupConcatField(
* @return bool Success or failure
*/
public function selectDB( $db ) {
- # Stub. Shouldn't cause serious problems if it's not overridden, but
+ # Stub. Shouldn't cause serious problems if it's not overridden, but
# if your database engine supports a concept similar to MySQL's
# databases you may as well.
$this->mDBname = $db;
* themselves. Pass the canonical name to such functions. This is only needed
* when calling query() directly.
*
- * @param string $name database table name
+ * @param string $name Database table name
* @param string $format One of:
* quoted - Automatically pass the table name through addIdentifierQuotes()
* so that it can be used in a query.
* raw - Do not add identifier quotes to the table name
- * @return String: full database name
+ * @return string Full database name
*/
public function tableName( $name, $format = 'quoted' ) {
global $wgSharedDB, $wgSharedPrefix, $wgSharedTables;
/**
* Gets an array of aliased table names
*
- * @param $tables array( [alias] => table )
- * @return array of strings, see tableNameWithAlias()
+ * @param array $tables array( [alias] => table )
+ * @return string[] See tableNameWithAlias()
*/
public function tableNamesWithAlias( $tables ) {
$retval = array();
/**
* Gets an array of aliased field names
*
- * @param $fields array( [alias] => field )
- * @return array of strings, see fieldNameWithAlias()
+ * @param array $fields array( [alias] => field )
+ * @return string[] See fieldNameWithAlias()
*/
public function fieldNamesWithAlias( $fields ) {
$retval = array();
* which might have a JOIN and/or USE INDEX clause
*
* @param array $tables ( [alias] => table )
- * @param $use_index array Same as for select()
- * @param $join_conds array Same as for select()
+ * @param array $use_index Same as for select()
+ * @param array $join_conds Same as for select()
* @return string
*/
protected function tableNamesWithUseIndexOrJOIN(
/**
* Get the name of an index in a given table
*
- * @param $index
- *
+ * @param string $index
* @return string
*/
protected function indexName( $index ) {
/**
* Adds quotes and backslashes.
*
- * @param $s string
- *
+ * @param string $s
* @return string
*/
public function addQuotes( $s ) {
* Since MySQL is the odd one out here the double quotes are our generic
* and we implement backticks in DatabaseMysql.
*
- * @param $s string
- *
+ * @param string $s
* @return string
*/
public function addIdentifierQuotes( $s ) {
* Returns if the given identifier looks quoted or not according to
* the database convention for quoting identifiers .
*
- * @param $name string
- *
- * @return boolean
+ * @param string $name
+ * @return bool
*/
public function isQuotedIdentifier( $name ) {
return $name[0] == '"' && substr( $name, -1, 1 ) == '"';
}
/**
- * @param $s string
+ * @param string $s
* @return string
*/
protected function escapeLikeInternal( $s ) {
* $query .= $dbr->buildLike( $pattern );
*
* @since 1.16
- * @return String: fully built LIKE statement
+ * @return string Fully built LIKE statement
*/
public function buildLike() {
$params = func_get_args();
* Any implementation of this function should *not* involve reusing
* sequence numbers created for rolled-back transactions.
* See http://bugs.mysql.com/bug.php?id=30767 for details.
- * @param $seqName string
- * @return null
+ * @param string $seqName
+ * @return null|int
*/
public function nextSequenceValue( $seqName ) {
return null;
}
/**
- * USE INDEX clause. Unlikely to be useful for anything but MySQL. This
+ * USE INDEX clause. Unlikely to be useful for anything but MySQL. This
* is only needed because a) MySQL must be as efficient as possible due to
* its use on Wikipedia, and b) MySQL 4.0 is kind of dumb sometimes about
- * which index to pick. Anyway, other databases might have different
- * indexes on a given table. So don't bother overriding this unless you're
+ * which index to pick. Anyway, other databases might have different
+ * indexes on a given table. So don't bother overriding this unless you're
* MySQL.
- * @param $index
+ * @param string $index
* @return string
*/
public function useIndexClause( $index ) {
* errors which wouldn't have occurred in MySQL.
*
* @param string $table The table to replace the row(s) in.
+ * @param array $uniqueIndexes Is an array of indexes. Each element may be either
+ * a field name or an array of field names
* @param array $rows Can be either a single row to insert, or multiple rows,
* in the same format as for DatabaseBase::insert()
- * @param array $uniqueIndexes is an array of indexes. Each element may be either
- * a field name or an array of field names
* @param string $fname Calling function name (use __METHOD__) for logs/profiling
*/
public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
* statement.
*
* @param string $table Table name
- * @param array $rows Rows to insert
+ * @param array|string $rows Row(s) to insert
* @param string $fname Caller function name
*
* @return ResultWrapper
* Usually throws a DBQueryError on failure. If errors are explicitly ignored,
* returns success.
*
+ * @since 1.22
+ *
* @param string $table Table name. This will be passed through DatabaseBase::tableName().
* @param array $rows A single row or list of rows to insert
* @param array $uniqueIndexes List of single field names or field name tuples
- * @param array $set An array of values to SET. For each array element,
- * the key gives the field name, and the value gives the data
- * to set that field to. The data will be quoted by
- * DatabaseBase::addQuotes().
+ * @param array $set An array of values to SET. For each array element, the
+ * key gives the field name, and the value gives the data to set that
+ * field to. The data will be quoted by DatabaseBase::addQuotes().
* @param string $fname Calling function name (use __METHOD__) for logs/profiling
- *
+ * @throws Exception
* @return bool
- * @since 1.22
*/
- public function upsert(
- $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+ public function upsert( $table, array $rows, array $uniqueIndexes, array $set,
+ $fname = __METHOD__
) {
if ( !count( $rows ) ) {
return true; // nothing to do
*
* DO NOT put the join condition in $conds.
*
- * @param $delTable String: The table to delete from.
- * @param $joinTable String: The other table.
- * @param $delVar String: The variable to join on, in the first table.
- * @param $joinVar String: The variable to join on, in the second table.
- * @param $conds Array: Condition array of field names mapped to variables,
- * ANDed together in the WHERE clause
- * @param $fname String: Calling function name (use __METHOD__) for
- * logs/profiling
+ * @param string $delTable The table to delete from.
+ * @param string $joinTable The other table.
+ * @param string $delVar The variable to join on, in the first table.
+ * @param string$joinVar The variable to join on, in the second table.
+ * @param array $conds Condition array of field names mapped to variables,
+ * ANDed together in the WHERE clause
+ * @param string $fname Calling function name (use __METHOD__) for logs/profiling
* @throws DBUnexpectedError
*/
public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
/**
* Returns the size of a text field, or -1 for "unlimited"
*
- * @param $table string
- * @param $field string
- *
+ * @param string $table
+ * @param string $field
* @return int
*/
public function textFieldSize( $table, $field ) {
/**
* A string to insert into queries to show that they're low-priority, like
- * MySQL's LOW_PRIORITY. If no such feature exists, return an empty
+ * MySQL's LOW_PRIORITY. If no such feature exists, return an empty
* string and nothing bad should happen.
*
* @return string Returns the text of the low priority option if it is
* DELETE query wrapper.
*
* @param array $table Table name
- * @param string|array $conds of conditions. See $conds in DatabaseBase::select() for
- * the format. Use $conds == "*" to delete all rows
+ * @param string|array $conds of conditions. See $conds in DatabaseBase::select()
+ * for the format. Use $conds == "*" to delete all rows
* @param string $fname name of the calling function
- *
* @throws DBUnexpectedError
* @return bool|ResultWrapper
*/
* @param string|array $srcTable May be either a table name, or an array of table names
* to include in a join.
*
- * @param array $varMap must be an associative array of the form
+ * @param array $varMap Must be an associative array of the form
* array( 'dest1' => 'source1', ...). Source items may be literals
* rather than field names, but strings should be quoted with
* DatabaseBase::addQuotes()
}
/**
- * Construct a LIMIT query with optional offset. This is used for query
- * pages. The SQL should be adjusted so that only the first $limit rows
- * are returned. If $offset is provided as well, then the first $offset
+ * Construct a LIMIT query with optional offset. This is used for query
+ * pages. The SQL should be adjusted so that only the first $limit rows
+ * are returned. If $offset is provided as well, then the first $offset
* rows should be discarded, and the next $limit rows should be returned.
* If the result of the query is not ordered, then the rows to be returned
* are theoretically arbitrary.
*
* $sql is expected to be a SELECT, if that makes a difference.
*
- * The version provided by default works in MySQL and SQLite. It will very
+ * The version provided by default works in MySQL and SQLite. It will very
* likely need to be overridden for most other DBMSes.
*
* @param string $sql SQL query we will append the limit too
- * @param $limit Integer the SQL limit
- * @param $offset Integer|bool the SQL offset (default false)
- *
+ * @param int $limit The SQL limit
+ * @param int|bool $offset The SQL offset (default false)
* @throws DBUnexpectedError
* @return string
*/
* This is used for providing overload point for other DB abstractions
* not compatible with the MySQL syntax.
* @param array $sqls SQL statements to combine
- * @param $all Boolean: use UNION ALL
- * @return String: SQL fragment
+ * @param bool $all Use UNION ALL
+ * @return string SQL fragment
*/
public function unionQueries( $sqls, $all ) {
$glue = $all ? ') UNION ALL (' : ') UNION (';
}
/**
- * Returns an SQL expression for a simple conditional. This doesn't need
+ * Returns an SQL expression for a simple conditional. This doesn't need
* to be overridden unless CASE isn't supported in your DBMS.
*
* @param string|array $cond SQL expression which will result in a boolean value
* @param string $trueVal SQL expression to return if true
* @param string $falseVal SQL expression to return if false
- * @return String: SQL fragment
+ * @return string SQL fragment
*/
public function conditional( $cond, $trueVal, $falseVal ) {
if ( is_array( $cond ) ) {
* Returns a comand for str_replace function in SQL query.
* Uses REPLACE() in MySQL
*
- * @param string $orig column to modify
- * @param string $old column to seek
- * @param string $new column to replace with
+ * @param string $orig Column to modify
+ * @param string $old Column to seek
+ * @param string $new Column to replace with
*
* @return string
*/
/**
* Wait for the slave to catch up to a given master position.
*
- * @param $pos DBMasterPos object
- * @param $timeout Integer: the maximum number of seconds to wait for
+ * @param DBMasterPos $pos
+ * @param int $timeout The maximum number of seconds to wait for
* synchronisation
- *
- * @return integer: zero if the slave was past that position already,
+ * @return int Zzero if the slave was past that position already,
* greater than zero if we waited for some period of time, less than
* zero if we timed out.
*/
/**
* Get the replication position of this slave
*
- * @return DBMasterPos, or false if this is not a slave.
+ * @return DBMasterPos|bool False if this is not a slave.
*/
public function getSlavePos() {
if ( !is_null( $this->mFakeSlaveLag ) ) {
/**
* Get the position of this master
*
- * @return DBMasterPos, or false if this is not a master
+ * @return DBMasterPos|bool False if this is not a master
*/
public function getMasterPos() {
if ( $this->mFakeMaster ) {
* will cause a warning, unless the current transaction was started
* automatically because of the DBO_TRX flag.
*
- * @param $fname string
+ * @param string $fname
* @throws DBError
*/
final public function begin( $fname = __METHOD__ ) {
* Issues the BEGIN command to the database server.
*
* @see DatabaseBase::begin()
- * @param type $fname
+ * @param string $fname
*/
protected function doBegin( $fname ) {
$this->query( 'BEGIN', $fname );
*
* Nesting of transactions is not supported.
*
- * @param $fname string
+ * @param string $fname
* @param string $flush Flush flag, set to 'flush' to disable warnings about
* explicitly committing implicit transactions, or calling commit when no
* transaction is in progress. This will silently break any ongoing
* explicit transaction. Only set the flush flag if you are sure that it
* is safe to ignore these warnings in your context.
+ * @throws DBUnexpectedError
*/
final public function commit( $fname = __METHOD__, $flush = '' ) {
if ( !$this->mTrxAtomicLevels->isEmpty() ) {
* Issues the COMMIT command to the database server.
*
* @see DatabaseBase::commit()
- * @param type $fname
+ * @param string $fname
*/
protected function doCommit( $fname ) {
if ( $this->mTrxLevel ) {
*
* No-op on non-transactional databases.
*
- * @param $fname string
+ * @param string $fname
*/
final public function rollback( $fname = __METHOD__ ) {
if ( !$this->mTrxLevel ) {
* Issues the ROLLBACK command to the database server.
*
* @see DatabaseBase::rollback()
- * @param type $fname
+ * @param string $fname
*/
protected function doRollback( $fname ) {
if ( $this->mTrxLevel ) {
* The table names passed to this function shall not be quoted (this
* function calls addIdentifierQuotes when needed).
*
- * @param string $oldName name of table whose structure should be copied
- * @param string $newName name of table to be created
- * @param $temporary Boolean: whether the new table should be temporary
- * @param string $fname calling function name
+ * @param string $oldName Name of table whose structure should be copied
+ * @param string $newName Name of table to be created
+ * @param bool $temporary Whether the new table should be temporary
+ * @param string $fname Calling function name
* @throws MWException
- * @return Boolean: true if operation was successful
+ * @return bool True if operation was successful
*/
public function duplicateTableStructure( $oldName, $newName, $temporary = false,
$fname = __METHOD__
* List all tables on the database
*
* @param string $prefix Only show tables with this prefix, e.g. mw_
- * @param string $fname calling function name
+ * @param string $fname Calling function name
* @throws MWException
*/
function listTables( $prefix = null, $fname = __METHOD__ ) {
/**
* Differentiates between a TABLE and a VIEW
*
- * @param $name string: Name of the database-structure to test.
+ * @param string $name Name of the database-structure to test.
* @throws MWException
* @since 1.22
*/
* The result is unquoted, and needs to be passed through addQuotes()
* before it can be included in raw SQL.
*
- * @param $ts string|int
+ * @param string|int $ts
*
* @return string
*/
* The result is unquoted, and needs to be passed through addQuotes()
* before it can be included in raw SQL.
*
- * @param $ts string|int
+ * @param string|int $ts
*
* @return string
*/
* callers, so this is unnecessary in external code. For compatibility with
* old code, ResultWrapper objects are passed through unaltered.
*
- * @param $result bool|ResultWrapper
- *
+ * @param bool|ResultWrapper|resource $result
* @return bool|ResultWrapper
*/
public function resultObject( $result ) {
* @return bool Success or failure
*/
public function ping() {
- # Stub. Not essential to override.
+ # Stub. Not essential to override.
return true;
}
* don't allow simple quoted strings to be inserted. To insert into such
* a field, pass the data through this function before passing it to
* DatabaseBase::insert().
- * @param $b string
+ *
+ * @param string $b
* @return string
*/
public function encodeBlob( $b ) {
* Some DBMSs return a special placeholder object representing blob fields
* in result objects. Pass the object through this function to return the
* original string.
- * @param $b string
+ *
+ * @param string $b
* @return string
*/
public function decodeBlob( $b ) {
* full-wiki dumps, where a single query reads out over
* hours or days.
*
- * @param $options Array
+ * @param array $options
* @return void
*/
public function setSessionOptions( array $options ) {
* @param bool|callable $resultCallback Optional function called for each MySQL result
* @param bool|string $fname Calling function name or false if name should be
* generated dynamically using $filename
- * @param bool|callable $inputCallback Callback: Optional function called
- * for each complete line sent
- * @throws MWException
+ * @param bool|callable $inputCallback Optional function called for each
+ * complete line sent
* @throws Exception|MWException
* @return bool|string
*/
* it fails back to MySQL if no DB-specific patch can be found
*
* @param string $patch The name of the patch, like patch-something.sql
- * @return String Full path to patch file
+ * @return string Full path to patch file
*/
public function patchPath( $patch ) {
global $IP;
* ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
* all. If it's set to false, $GLOBALS will be used.
*
- * @param bool|array $vars mapping variable name to value.
+ * @param bool|array $vars Mapping variable name to value.
*/
public function setSchemaVars( $vars ) {
$this->mSchemaVars = $vars;
* Returns true on success, error string or exception on failure (depending
* on object's error ignore settings).
*
- * @param $fp Resource: File handle
- * @param $lineCallback Callback: Optional function called before reading each query
- * @param $resultCallback Callback: Optional function called for each MySQL result
+ * @param resource $fp File handle
+ * @param bool|callable $lineCallback Optional function called before reading each query
+ * @param bool|callable $resultCallback Optional function called for each MySQL result
* @param string $fname Calling function name
- * @param $inputCallback Callback: Optional function called for each complete query sent
+ * @param bool|callable $inputCallback Optional function called for each complete query sent
* @return bool|string
*/
public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
*
* @param string $sql SQL assembled so far
* @param string $newLine New line about to be added to $sql
- * @return Bool Whether $newLine contains end of the statement
+ * @return bool Whether $newLine contains end of the statement
*/
public function streamStatementEnd( &$sql, &$newLine ) {
if ( $this->delimiter ) {
* table options its use should be avoided.
*
* @param string $ins SQL statement to replace variables in
- * @return String The new SQL statement with variables replaced
+ * @return string The new SQL statement with variables replaced
*/
protected function replaceSchemaVars( $ins ) {
$vars = $this->getSchemaVars();
/**
* Replace variables in sourced SQL
*
- * @param $ins string
- *
+ * @param string $ins
* @return string
*/
protected function replaceVars( $ins ) {
/**
* Table name callback
*
- * @param $matches array
- *
+ * @param array $matches
* @return string
*/
protected function tableNameCallback( $matches ) {
/**
* Index name callback
*
- * @param $matches array
- *
+ * @param array $matches
* @return string
*/
protected function indexNameCallback( $matches ) {
/**
* Check to see if a named lock is available. This is non-blocking.
*
- * @param string $lockName name of lock to poll
- * @param string $method name of method calling us
- * @return Boolean
+ * @param string $lockName Name of lock to poll
+ * @param string $method Name of method calling us
+ * @return bool
* @since 1.20
*/
public function lockIsFree( $lockName, $method ) {
* Abstracted from Filestore::lock() so child classes can implement for
* their own needs.
*
- * @param string $lockName name of lock to aquire
- * @param string $method name of method calling us
- * @param $timeout Integer: timeout
- * @return Boolean
+ * @param string $lockName Name of lock to aquire
+ * @param string $method Name of method calling us
+ * @param int $timeout
+ * @return bool
*/
public function lock( $lockName, $method, $timeout = 5 ) {
return true;
/**
* Lock specific tables
*
- * @param array $read of tables to lock for read access
- * @param array $write of tables to lock for write access
- * @param string $method name of caller
+ * @param array $read Array of tables to lock for read access
+ * @param array $write Array of tables to lock for write access
+ * @param string $method Name of caller
* @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY
- *
* @return bool
*/
public function lockTables( $read, $write, $method, $lowPriority = true ) {
/**
* Unlock specific tables
*
- * @param string $method the caller
- *
+ * @param string $method The caller
* @return bool
*/
public function unlockTables( $method ) {
/**
* Delete a table
- * @param $tableName string
- * @param $fName string
+ * @param string $tableName
+ * @param string $fName
* @return bool|ResultWrapper
* @since 1.18
*/
* Get search engine class. All subclasses of this need to implement this
* if they wish to use searching.
*
- * @return String
+ * @return string
*/
public function getSearchEngine() {
return 'SearchEngineDummy';
* keyword for timestamps in PostgreSQL, and works with CHAR(14) as well
* because "i" sorts after all numbers.
*
- * @return String
+ * @return string
*/
public function getInfinity() {
return 'infinity';
* Encode an expiry time into the DBMS dependent format
*
* @param string $expiry timestamp for expiry, or the 'infinity' string
- * @return String
+ * @return string
*/
public function encodeExpiry( $expiry ) {
return ( $expiry == '' || $expiry == 'infinity' || $expiry == $this->getInfinity() )
* Decode an expiry time into a DBMS independent format
*
* @param string $expiry DB timestamp field value for expiry
- * @param $format integer: TS_* constant, defaults to TS_MW
- * @return String
+ * @param int $format TS_* constant, defaults to TS_MW
+ * @return string
*/
public function decodeExpiry( $expiry, $format = TS_MW ) {
return ( $expiry == '' || $expiry == $this->getInfinity() )
*
* This is a MySQL-specific feature.
*
- * @param $value Mixed: true for allow, false for deny, or "default" to
+ * @param bool|string $value True for allow, false for deny, or "default" to
* restore the initial value
*/
public function setBigSelects( $value = true ) {
* @ingroup Database
*/
class DBError extends MWException {
- /**
- * @var DatabaseBase
- */
+ /** @var DatabaseBase */
public $db;
/**
* Construct a database error
- * @param $db DatabaseBase object which threw the error
+ * @param DatabaseBase $db Object which threw the error
* @param string $error A simple error message to be used for debugging
*/
function __construct( DatabaseBase $db = null, $error ) {
* @ingroup Database
*/
class DBConnectionError extends DBError {
+ /** @var string Error text */
public $error;
+ /**
+ * @param DatabaseBase $db Object throwing the error
+ * @param string $error Error text
+ */
function __construct( DatabaseBase $db = null, $error = 'unknown error' ) {
$msg = 'DB connection error';
}
/**
- * @param $key
- * @param $fallback
- * @return string
+ * @param string $key
+ * @param string $fallback Unescaped alternative error text in case the
+ * message cache cannot be used. Can contain parameters as in regular
+ * messages, that should be passed as additional parameters.
+ * @return string Unprocessed plain error text with parameters replaced
*/
function msg( $key, $fallback /*[, params...] */ ) {
global $wgLang;
}
/**
- * @return string
+ * @return string Safe HTML
*/
function getHTML() {
global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors;
}
}
+ /**
+ * Output the exception report using HTML.
+ *
+ * @return void
+ */
public function reportHTML() {
global $wgUseFileCache;
public $error, $errno, $sql, $fname;
/**
- * @param $db DatabaseBase
- * @param $error string
- * @param $errno int|string
- * @param $sql string
- * @param $fname string
+ * @param DatabaseBase $db
+ * @param string $error
+ * @param int|string $errno
+ * @param string $sql
+ * @param string $fname
*/
function __construct( DatabaseBase $db, $error, $errno, $sql, $fname ) {
$message = "A database error has occurred. Did you forget to run " .
}
/**
- * @return boolean
+ * @return bool
*/
function isLoggable() {
// Don't send to the exception log, already in dberror log
* sites using this option probably don't care much about "security by obscurity". Of course,
* if $wgShowSQLErrors is true, the SQL query *is* shown.
*
- * @return array: Keys are message keys; values are arrays of arguments for Html::element().
+ * @return array Keys are message keys; values are arrays of arguments for Html::element().
* Array will be empty if users are not allowed to see any of these details at all.
*/
protected function getTechnicalDetails() {
/**
* @param string $key Message key
- * @return string: English message text
+ * @return string English message text
*/
private function getFallbackMessage( $key ) {
$messages = array(
return sqlsrv_close( $this->mConn );
}
+ /**
+ * @param string $sql
+ * @return bool|MssqlResult
+ * @throws DBUnexpectedError
+ */
protected function doQuery( $sql ) {
wfDebug( "SQL: [$sql]\n" );
- $this->offset = 0;
// several extensions seem to think that all databases support limits
// via LIMIT N after the WHERE clause well, MSSQL uses SELECT TOP N,
return $res;
}
+ /**
+ * @param mixed|ResultWrapper $res
+ */
function freeResult( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
$res->free();
}
+ /**
+ * @param ResultWrapper|stdClass $res
+ * @return stdClass
+ */
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
return $row;
}
+ /**
+ * @return string
+ */
function getErrors() {
$strRet = '';
$retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
return $strRet;
}
+ /**
+ * @param resource $res
+ * @return Blob
+ */
function fetchRow( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
return $row;
}
+ /**
+ * @param mixed $res
+ * @return int
+ */
function numRows( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
return $this->mInsertId;
}
+ /**
+ * @param mixed $res
+ * @param int $row
+ * @return bool
+ */
function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
/**
* SELECT wrapper
*
- * @param $table Mixed: array or string, table name(s) (prefix auto-added)
- * @param $vars Mixed: array or string, field name(s) to be retrieved
- * @param $conds Mixed: array or string, condition(s) for WHERE
- * @param $fname String: calling function name (use __METHOD__) for logs/profiling
- * @param array $options associative array of options (e.g.
+ * @param mixed $table Array or string, table name(s) (prefix auto-added)
+ * @param mixed $vars Array or string, field name(s) to be retrieved
+ * @param mixed $conds Array or string, condition(s) for WHERE
+ * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+ * @param array $options Associative array of options (e.g.
* array('GROUP BY' => 'page_title')), see Database::makeSelectOptions
* code for list of supported stuff
- * @param $join_conds Array: Associative array of table join conditions
+ * @param array $join_conds Associative array of table join conditions
* (optional) (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
- * @return Mixed: database result resource (feed to Database::fetchObject
+ * @return mixed Database result resource (feed to Database::fetchObject
* or whatever), or false on failure
*/
function select( $table, $vars, $conds = '', $fname = __METHOD__,
/**
* SELECT wrapper
*
- * @param $table Mixed: Array or string, table name(s) (prefix auto-added)
- * @param $vars Mixed: Array or string, field name(s) to be retrieved
- * @param $conds Mixed: Array or string, condition(s) for WHERE
- * @param $fname String: Calling function name (use __METHOD__) for logs/profiling
+ * @param mixed $table Array or string, table name(s) (prefix auto-added)
+ * @param mixed $vars Array or string, field name(s) to be retrieved
+ * @param mixed $conds Array or string, condition(s) for WHERE
+ * @param string $fname Calling function name (use __METHOD__) for logs/profiling
* @param array $options Associative array of options (e.g. array('GROUP BY' => 'page_title')),
- * see Database::makeSelectOptions code for list of supported stuff
- * @param $join_conds Array: Associative array of table join conditions (optional)
- * (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
- * @return string, the SQL text
+ * see Database::makeSelectOptions code for list of supported stuff
+ * @param array $join_conds Associative array of table join conditions (optional)
+ * (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+ * @return string The SQL text
*/
function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
$options = array(), $join_conds = array()
* This is not necessarily an accurate estimate, so use sparingly
* Returns -1 if count cannot be found
* Takes same arguments as Database::select()
+ * @param string $table
+ * @param string $vars
+ * @param string $conds
+ * @param string $fname
+ * @param array $options
* @return int
*/
function estimateRowCount( $table, $vars = '*', $conds = '',
/**
* Returns information about an index
* If errors are explicitly ignored, returns NULL on failure
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return array|bool|null
*/
function indexInfo( $table, $index, $fname = __METHOD__ ) {
throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), /*$sql*/ '', $fname );
} elseif ( $ret != null ) {
// remember number of rows affected
+ // @todo FIXME: $ret type does not appear to be a resource
$this->mAffectedRows = sqlsrv_rows_affected( $ret );
return $ret;
/**
* Return the next in a sequence, save the value for retrieval via insertId()
- * @return
+ * @param string $seqName
+ * @return int|null
*/
function nextSequenceValue( $seqName ) {
if ( !$this->tableExists( 'sequence_' . $seqName ) ) {
/**
* Return the current value of a sequence. Assumes it has ben nextval'ed in this session.
- * @return
+ * @param string $seqName
+ * @return int|null
*/
function currentSequenceValue( $seqName ) {
$ret = sqlsrv_query( $this->mConn, "SELECT TOP 1 id FROM [sequence_$seqName] ORDER BY id DESC" );
}
}
- # Returns the size of a text field, or -1 for "unlimited"
+ /**
+ * @param string $table
+ * @param string $field
+ * @return int Returns the size of a text field, or -1 for "unlimited"
+ */
function textFieldSize( $table, $field ) {
$table = $this->tableName( $table );
$sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
/**
* Construct a LIMIT query with optional offset
* This is used for query pages
- * $sql string SQL query we will append the limit too
- * $limit integer the SQL limit
- * $offset integer the SQL offset (default false)
- * @return mixed|string
+ *
+ * @param string $sql SQL query we will append the limit too
+ * @param int $limit The SQL limit
+ * @param bool|int $offset The SQL offset (default false)
+ * @return array|string
*/
function limitResult( $sql, $limit, $offset = false ) {
if ( $offset === false || $offset == 0 ) {
}
}
- // If there is a limit clause, parse it, strip it, and pass the remaining
- // SQL through limitResult() with the appropriate parameters. Not the
- // prettiest solution, but better than building a whole new parser. This
- // exists becase there are still too many extensions that don't use dynamic
- // sql generation.
+ /**
+ * If there is a limit clause, parse it, strip it, and pass the remaining
+ * SQL through limitResult() with the appropriate parameters. Not the
+ * prettiest solution, but better than building a whole new parser. This
+ * exists becase there are still too many extensions that don't use dynamic
+ * sql generation.
+ *
+ * @param string $sql
+ * @return array|mixed|string
+ */
function LimitToTopN( $sql ) {
// Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
$pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
return $sql;
}
+ /**
+ * Timestamp in ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
+ *
+ * @param int $ts Timestamp
+ * @return bool|string The same date in ISO 8601 format with no timezone or false
+ */
function timestamp( $ts = 0 ) {
return wfTimestamp( TS_ISO_8601, $ts );
}
/**
- * @return string wikitext of a link to the server software's web site
+ * @return string Wikitext of a link to the server software's web site
*/
public function getSoftwareLink() {
return "[{{int:version-db-mssql-url}} MS SQL Server]";
return $version;
}
+ /**
+ * @param string $table
+ * @param string $fname
+ * @param bool $schema
+ * @return bool
+ */
function tableExists( $table, $fname = __METHOD__, $schema = false ) {
$res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
WHERE table_type='BASE TABLE' AND table_name = '$table'" );
/**
* Query whether a given column exists in the mediawiki schema
+ * @param string $table
+ * @param string $field
+ * @param string $fname
* @return bool
*/
function fieldExists( $table, $field, $fname = __METHOD__ ) {
* Escapes a identifier for use inm SQL.
* Throws an exception if it is invalid.
* Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
- * @param $identifier
+ * @param string $identifier
* @throws MWException
* @return string
*/
}
/**
- * @private
+ * @param array $tables
+ * @param array $use_index
+ * @param array $join_conds
* @return string
*/
- function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
+ protected function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
$ret = array();
$retJOIN = array();
$use_index_safe = is_array( $use_index ) ? $use_index : array();
}
/**
- * @private
- *
* @param array $options an associative array of options to be turned into
- * an SQL query, valid keys are listed in the function.
- * @return Array
+ * an SQL query, valid keys are listed in the function.
+ * @return array
*/
function makeSelectOptions( $options ) {
$tailOpts = '';
* @ingroup Database
*/
class MssqlField implements Field {
- private $name, $tablename, $default, $max_length, $nullable, $type;
+ private $name, $tableName, $default, $max_length, $nullable, $type;
function __construct( $info ) {
$this->name = $info['COLUMN_NAME'];
- $this->tablename = $info['TABLE_NAME'];
+ $this->tableName = $info['TABLE_NAME'];
$this->default = $info['COLUMN_DEFAULT'];
$this->max_length = $info['CHARACTER_MAXIMUM_LENGTH'];
$this->nullable = !( strtolower( $info['IS_NULLABLE'] ) == 'no' );
* @ingroup Database
*/
class MssqlResult {
+ /** @var int */
+ private $mCursor;
+
+ /** @var array */
+ private $mRows;
+ /** @var bool|int */
+ private $mNumFields;
+
+ /** @var array|bool */
+ private $mFieldMeta;
+
+ /**
+ * @param bool|resource $queryresult
+ */
public function __construct( $queryresult = false ) {
$this->mCursor = 0;
$this->mRows = array();
sqlsrv_free_stmt( $queryresult );
}
+ /**
+ * @param array $array
+ * @param stdClass $obj
+ * @return stdClass
+ */
private function array_to_obj( $array, &$obj ) {
foreach ( $array as $key => $value ) {
if ( is_array( $value ) ) {
*/
class DatabaseMysql extends DatabaseMysqlBase {
/**
- * @param $sql string
- * @return resource
+ * @param string $sql
+ * @return resource False on error
*/
protected function doQuery( $sql ) {
if ( $this->bufferResults() ) {
return $ret;
}
+ /**
+ * @param string $realServer
+ * @return bool|resource MySQL Database connection or false on failure to connect
+ * @throws DBConnectionError
+ */
protected function mysqlConnect( $realServer ) {
# Fail now
# Otherwise we get a suppressed fatal error, which is very hard to track down
}
/**
+ * @param string $charset
* @return bool
*/
protected function mysqlSetCharset( $charset ) {
}
/**
- * @param $db
+ * @param string $db
* @return bool
*/
function selectDB( $db ) {
}
/**
- * @param $server string
- * @param $user string
- * @param $password string
- * @param $dbName string
+ * @param string $server
+ * @param string $user
+ * @param string $password
+ * @param string $dbName
+ * @throws Exception|DBConnectionError
* @return bool
- * @throws DBConnectionError
*/
function open( $server, $user, $password, $dbName ) {
global $wgAllDBsAreLocalhost, $wgSQLMode;
/**
* Open a connection to a MySQL server
*
- * @param $realServer string
+ * @param string $realServer
* @return mixed Raw connection
* @throws DBConnectionError
*/
abstract protected function mysqlSetCharset( $charset );
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper|resource $res
* @throws DBUnexpectedError
*/
function freeResult( $res ) {
/**
* Free result memory
*
- * @param $res Raw result
+ * @param resource $res Raw result
* @return bool
*/
abstract protected function mysqlFreeResult( $res );
/**
- * @param $res ResultWrapper
- * @return object|bool
+ * @param ResultWrapper|resource $res
+ * @return stdClass|bool
* @throws DBUnexpectedError
*/
function fetchObject( $res ) {
/**
* Fetch a result row as an object
*
- * @param $res Raw result
+ * @param resource $res Raw result
* @return stdClass
*/
abstract protected function mysqlFetchObject( $res );
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper|resource $res
* @return array|bool
* @throws DBUnexpectedError
*/
/**
* Fetch a result row as an associative and numeric array
*
- * @param $res Raw result
+ * @param resource $res Raw result
* @return array
*/
abstract protected function mysqlFetchArray( $res );
/**
* @throws DBUnexpectedError
- * @param $res ResultWrapper
+ * @param ResultWrapper|resource $res
* @return int
*/
function numRows( $res ) {
/**
* Get number of rows in result
*
- * @param $res Raw result
+ * @param resource $res Raw result
* @return int
*/
abstract protected function mysqlNumRows( $res );
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper|resource $res
* @return int
*/
function numFields( $res ) {
/**
* Get number of fields in result
*
- * @param $res Raw result
+ * @param resource $res Raw result
* @return int
*/
abstract protected function mysqlNumFields( $res );
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper|resource $res
* @param $n int
* @return string
*/
/**
* Get the name of the specified field in a result
*
- * @param $res Raw result
+ * @param ResultWrapper|resource $res
* @param $n int
* @return string
*/
/**
* mysql_field_type() wrapper
- * @param $res
+ * @param ResultWrapper|resource $res
* @param $n int
* @return string
*/
/**
* Get the type of the specified field in a result
*
- * @param $res Raw result
- * @param $n int
+ * @param ResultWrapper|resource $res
+ * @param int $n
* @return string
*/
abstract protected function mysqlFieldType( $res, $n );
/**
- * @param $res ResultWrapper
- * @param $row
+ * @param ResultWrapper|resource $res
+ * @param int $row
* @return bool
*/
function dataSeek( $res, $row ) {
/**
* Move internal result pointer
*
- * @param $res Raw result
- * @param $row int
+ * @param ResultWrapper|resource $res
+ * @param int $row
* @return bool
*/
abstract protected function mysqlDataSeek( $res, $row );
/**
* Returns the text of the error message from previous MySQL operation
*
- * @param $conn Raw connection
+ * @param resource $conn Raw connection
* @return string
*/
abstract protected function mysqlError( $conn = null );
/**
- * @param $table string
- * @param $uniqueIndexes
- * @param $rows array
- * @param $fname string
+ * @param string $table
+ * @param array $uniqueIndexes
+ * @param array $rows
+ * @param string $fname
* @return ResultWrapper
*/
function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
* Returns estimated count, based on EXPLAIN output
* Takes same arguments as Database::select()
*
- * @param $table string|array
- * @param $vars string|array
- * @param $conds string|array
- * @param $fname string
- * @param $options string|array
- * @return int
+ * @param string|array $table
+ * @param string|array $vars
+ * @param string|array $conds
+ * @param string $fname
+ * @param string|array $options
+ * @return bool|int
*/
public function estimateRowCount( $table, $vars = '*', $conds = '',
$fname = __METHOD__, $options = array()
}
/**
- * @param $table string
- * @param $field string
+ * @param string $table
+ * @param string $field
* @return bool|MySQLField
*/
function fieldInfo( $table, $field ) {
/**
* Get column information from a result
*
- * @param $res Raw result
- * @param $n int
+ * @param resource $res Raw result
+ * @param int $n
* @return stdClass
*/
abstract protected function mysqlFetchField( $res, $n );
* Get information about an index into an object
* Returns false if the index does not exist
*
- * @param $table string
- * @param $index string
- * @param $fname string
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return bool|array|null False or null on failure
*/
function indexInfo( $table, $index, $fname = __METHOD__ ) {
}
/**
- * @param $s string
- *
+ * @param string $s
* @return string
*/
function strencode( $s ) {
/**
* MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
*
- * @param $s string
- *
+ * @param string $s
* @return string
*/
public function addIdentifierQuotes( $s ) {
}
/**
- * @param $name string
+ * @param string $name
* @return bool
*/
public function isQuotedIdentifier( $name ) {
/**
* Wait for the slave to catch up to a given master position.
- * @TODO: return values for this and base class are rubbish
+ * @todo Return values for this and base class are rubbish
*
- * @param $pos DBMasterPos object
- * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
+ * @param DBMasterPos|MySQLMasterPos $pos
+ * @param int $timeout The maximum number of seconds to wait for synchronisation
* @return bool|string
*/
function masterPosWait( DBMasterPos $pos, $timeout ) {
# Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
$encFile = $this->addQuotes( $pos->file );
- $encPos = intval( $pos->pos );
+ $encPos = intval( $pos->getMasterPos() );
$sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
$res = $this->doQuery( $sql );
}
/**
- * @param $index
+ * @param string $index
* @return string
*/
function useIndexClause( $index ) {
}
/**
- * @param $options array
+ * @param array $options
*/
public function setSessionOptions( array $options ) {
if ( isset( $options['connTimeout'] ) ) {
}
}
+ /**
+ * @param string $sql
+ * @param string $newLine
+ * @return bool
+ */
public function streamStatementEnd( &$sql, &$newLine ) {
if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
*
* @param string $lockName name of lock to poll
* @param string $method name of method calling us
- * @return Boolean
+ * @return bool
* @since 1.20
*/
public function lockIsFree( $lockName, $method ) {
}
/**
- * @param $lockName string
- * @param $method string
- * @param $timeout int
+ * @param string $lockName
+ * @param string $method
+ * @param int $timeout
* @return bool
*/
public function lock( $lockName, $method, $timeout = 5 ) {
/**
* FROM MYSQL DOCS:
* http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
- * @param $lockName string
- * @param $method string
+ * @param string $lockName
+ * @param string $method
* @return bool
*/
public function unlock( $lockName, $method ) {
}
/**
- * @param $read array
- * @param $write array
- * @param $method string
- * @param $lowPriority bool
+ * @param array $read
+ * @param array $write
+ * @param string $method
+ * @param bool $lowPriority
* @return bool
*/
public function lockTables( $read, $write, $method, $lowPriority = true ) {
}
/**
- * @param $method string
+ * @param string $method
* @return bool
*/
public function unlockTables( $method ) {
* Get search engine class. All subclasses of this
* need to implement this if they wish to use searching.
*
- * @return String
+ * @return string
*/
public function getSearchEngine() {
return 'SearchMySQL';
/**
* @param bool $value
- * @return mixed
+ * @return mixed null|bool|ResultWrapper
*/
public function setBigSelects( $value = true ) {
if ( $value === 'default' ) {
* @param string $fname
* @return bool
*/
- public function upsert(
- $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+ public function upsert( $table, array $rows, array $uniqueIndexes,
+ array $set, $fname = __METHOD__
) {
if ( !count( $rows ) ) {
return true; // nothing to do
}
/**
- * @param $oldName
- * @param $newName
- * @param $temporary bool
- * @param $fname string
+ * @param string $oldName
+ * @param string $newName
+ * @param bool $temporary
+ * @param string $fname
+ * @return bool
*/
function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
$tmp = $temporary ? 'TEMPORARY ' : '';
$newName = $this->addIdentifierQuotes( $newName );
$oldName = $this->addIdentifierQuotes( $oldName );
$query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
- $this->query( $query, $fname );
+
+ return $this->query( $query, $fname );
}
/**
* List all tables on the database
*
* @param string $prefix Only show tables with this prefix, e.g. mw_
- * @param string $fname calling function name
+ * @param string $fname Calling function name
* @return array
*/
function listTables( $prefix = null, $fname = __METHOD__ ) {
/**
* Get status information from SHOW STATUS in an associative array
*
- * @param $which string
+ * @param string $which
* @return array
*/
function getMysqlStatus( $which = "%" ) {
/**
* Differentiates between a TABLE and a VIEW.
*
- * @param $name string: Name of the TABLE/VIEW to test
+ * @param string $name Name of the TABLE/VIEW to test
+ * @param string $prefix
* @return bool
* @since 1.22
*/
}
class MySQLMasterPos implements DBMasterPos {
- var $file, $pos;
+ /** @var string */
+ public $file;
+
+ /** @var int */
+ private $pos;
function __construct( $file, $pos ) {
$this->file = $file;
return ( $thisPos && $thatPos && $thisPos >= $thatPos );
}
+
+ /**
+ * @return int
+ */
+ public function getMasterPos() {
+ return $this->pos;
+ }
}
*/
class DatabaseMysqli extends DatabaseMysqlBase {
/**
- * @param $sql string
+ * @param string $sql
* @return resource
*/
protected function doQuery( $sql ) {
return $ret;
}
+ /**
+ * @param string $realServer
+ * @return bool|mysqli
+ * @throws DBConnectionError
+ */
protected function mysqlConnect( $realServer ) {
global $wgDBmysql5;
# Fail now
}
/**
+ * @param string $charset
* @return bool
*/
protected function mysqlSetCharset( $charset ) {
}
/**
- * @param $db
+ * @param string $db
* @return bool
*/
function selectDB( $db ) {
return $this->mConn->server_info;
}
+ /**
+ * @param mysqli $res
+ * @return bool
+ */
protected function mysqlFreeResult( $res ) {
$res->free_result();
return true;
}
+ /**
+ * @param mysqli $res
+ * @return bool
+ */
protected function mysqlFetchObject( $res ) {
$object = $res->fetch_object();
if ( $object === null ) {
return $object;
}
+ /**
+ * @param mysqli $res
+ * @return bool
+ */
protected function mysqlFetchArray( $res ) {
$array = $res->fetch_array();
if ( $array === null ) {
return $array;
}
+ /**
+ * @param mysqli $res
+ * @return mixed
+ */
protected function mysqlNumRows( $res ) {
return $res->num_rows;
}
+ /**
+ * @param mysqli $res
+ * @return mixed
+ */
protected function mysqlNumFields( $res ) {
return $res->field_count;
}
+ /**
+ * @param mysqli $res
+ * @param int $n
+ * @return mixed
+ */
protected function mysqlFetchField( $res, $n ) {
$field = $res->fetch_field_direct( $n );
$field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG;
return $field;
}
+ /**
+ * @param resource|ResultWrapper $res
+ * @param int $n
+ * @return mixed
+ */
protected function mysqlFieldName( $res, $n ) {
$field = $res->fetch_field_direct( $n );
return $field->name;
}
+ /**
+ * @param resource|ResultWrapper $res
+ * @param int $n
+ * @return mixed
+ */
protected function mysqlFieldType( $res, $n ) {
$field = $res->fetch_field_direct( $n );
return $field->type;
}
+ /**
+ * @param resource|ResultWrapper $res
+ * @param int $row
+ * @return mixed
+ */
protected function mysqlDataSeek( $res, $row ) {
return $res->data_seek( $row );
}
+ /**
+ * @param mysqli $conn Optional connection object
+ * @return string
+ */
protected function mysqlError( $conn = null ) {
if ( $conn === null ) {
return mysqli_connect_error();
}
}
+ /**
+ * Escapes special characters in a string for use in an SQL statement
+ * @param string $s
+ * @return string
+ */
protected function mysqlRealEscapeString( $s ) {
return $this->mConn->real_escape_string( $s );
}
}
/**
- * @param $db DatabaseBase
- * @param $stmt
+ * @param DatabaseBase $db
+ * @param resource $stmt A valid OCI statement identifier
* @param bool $unique
*/
function __construct( &$db, $stmt, $unique = false ) {
return $this->query( $sql, $fname, true );
}
+ /**
+ * Frees resources associated with the LOB descriptor
+ * @param ResultWrapper|resource $res
+ */
function freeResult( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
$res->free();
}
+ /**
+ * @param ResultWrapper|stdClass $res
+ * @return mixed
+ */
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
return $this->mInsertId;
}
+ /**
+ * @param mixed $res
+ * @param int $row
+ */
function dataSeek( $res, $row ) {
if ( $res instanceof ORAResult ) {
$res->seek( $row );
/**
* Returns information about an index
* If errors are explicitly ignored, returns NULL on failure
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return bool
*/
function indexInfo( $table, $index, $fname = __METHOD__ ) {
return $bind;
}
+ /**
+ * @param string $table
+ * @param $row
+ * @param string $fname
+ * @return bool
+ * @throws DBUnexpectedError
+ */
private function insertOneRow( $table, $row, $fname ) {
global $wgContLang;
return false;
}
} else {
+ /** @var OCI_Lob[] $lob */
if ( ( $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ) ) === false ) {
$e = oci_error( $stmt );
throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
oci_commit( $this->mConn );
}
- oci_free_statement( $stmt );
+ return oci_free_statement( $stmt );
}
function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
return ( isset( $this->sequenceData[$table] ) ) ? $this->sequenceData[$table] : false;
}
- # Returns the size of a text field, or -1 for "unlimited"
+ /**
+ * Returns the size of a text field, or -1 for "unlimited"
+ *
+ * @param string $table
+ * @param string $field
+ * @return mixed
+ */
function textFieldSize( $table, $field ) {
$fieldInfoData = $this->fieldInfo( $table, $field );
/**
* Return aggregated value function call
+ *
+ * @param $valuedata
+ * @param string $valuename
+ * @return mixed
*/
public function aggregateValue( $valuedata, $valuename = 'value' ) {
return $valuedata;
/**
* Query whether a given index exists
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return bool
*/
function indexExists( $table, $index, $fname = __METHOD__ ) {
/**
* Query whether a given table exists (in the given schema, or the default mw one if not given)
+ * @param string $table
+ * @param string $fname
* @return bool
*/
function tableExists( $table, $fname = __METHOD__ ) {
* For internal calls. Use fieldInfo for normal usage.
* Returns false if the field doesn't exist
*
- * @param $table Array
- * @param $field String
+ * @param array|string $table
+ * @param string $field
* @return ORAField|ORAResult
*/
private function fieldInfoMulti( $table, $field ) {
/**
* @throws DBUnexpectedError
- * @param $table
- * @param $field
+ * @param string $table
+ * @param string $field
* @return ORAField
*/
function fieldInfo( $table, $field ) {
}
}
- /* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
+ /**
+ * defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
+ *
+ * @param resource $fp
+ * @param bool|string $lineCallback
+ * @param bool|callable $resultCallback
+ * @param string $fname
+ * @param bool|callable $inputCallback
+ * @return bool|string
+ */
function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
$fname = __METHOD__, $inputCallback = false ) {
$cmd = '';
* Returns an optional USE INDEX clause to go after the table, and a
* string to go at the end of the query
*
- * @private
- *
- * @param array $options an associative array of options to be turned into
- * an SQL query, valid keys are listed in the function.
+ * @param array $options An associative array of options to be turned into
+ * an SQL query, valid keys are listed in the function.
* @return array
*/
function makeSelectOptions( $options ) {
return parent::delete( $table, $conds, $fname );
}
+ /**
+ * @param string $table
+ * @param array $values
+ * @param array $conds
+ * @param string $fname
+ * @param array $options
+ * @return bool
+ * @throws DBUnexpectedError
+ */
function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
global $wgContLang;
oci_commit( $this->mConn );
}
- oci_free_statement( $stmt );
+ return oci_free_statement( $stmt );
}
function bitNot( $field ) {
public function getInfinity() {
return '31-12-2030 12:00:00.000000';
}
-} // end DatabaseOracle class
+}
$has_default, $default;
/**
- * @param $db DatabaseBase
- * @param $table
- * @param $field
+ * @param DatabaseBase $db
+ * @param string $table
+ * @param string $field
* @return null|PostgresField
*/
static function fromText( $db, $table, $field ) {
* @since 1.19
*/
class SavepointPostgres {
- /**
- * Establish a savepoint within a transaction
- */
+ /** @var DatabaseBase Establish a savepoint within a transaction */
protected $dbw;
protected $id;
protected $didbegin;
+ /**
+ * @param DatabaseBase $dbw
+ * @param $id
+ */
public function __construct( $dbw, $id ) {
$this->dbw = $dbw;
$this->id = $id;
* @param string $user
* @param string $password
* @param string $dbName
- * @throws DBConnectionError
+ * @throws DBConnectionError|Exception
* @return DatabaseBase|null
*/
function open( $server, $user, $password, $dbName ) {
global $wgDBport;
if ( !strlen( $user ) ) { # e.g. the class is being loaded
- return;
+ return null;
}
$this->mServer = $server;
/**
* Postgres doesn't support selectDB in the same way MySQL does. So if the
* DB name doesn't match the open connection, open a new one
- * @return
+ * @param string $db
+ * @return bool
*/
function selectDB( $db ) {
if ( $this->mDBname !== $db ) {
return $this->query( $sql, $fname, true );
}
+ /**
+ * @param stdClass|ResultWrapper $res
+ * @throws DBUnexpectedError
+ */
function freeResult( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
}
+ /**
+ * @param ResultWrapper|stdClass $res
+ * @return stdClass
+ * @throws DBUnexpectedError
+ */
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
return $this->mInsertId;
}
+ /**
+ * @param mixed $res
+ * @param int $row
+ * @return bool
+ */
function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
* This is not necessarily an accurate estimate, so use sparingly
* Returns -1 if count cannot be found
* Takes same arguments as Database::select()
+ *
+ * @param string $table
+ * @param string $vars
+ * @param string $conds
+ * @param string $fname
+ * @param array $options
* @return int
*/
function estimateRowCount( $table, $vars = '*', $conds = '',
/**
* Returns information about an index
* If errors are explicitly ignored, returns NULL on failure
+ *
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return bool|null
*/
function indexInfo( $table, $index, $fname = __METHOD__ ) {
* Returns is of attributes used in index
*
* @since 1.19
- * @return Array
+ * @param string $index
+ * @param bool|string $schema
+ * @return array
*/
function indexAttributes( $index, $schema = false ) {
if ( $schema === false ) {
* $args may be a single associative array, or an array of these with numeric keys,
* for multi-row insert (Postgres version 8.2 and above only).
*
- * @param $table String: Name of the table to insert to.
- * @param $args Array: Items to insert into the table.
- * @param $fname String: Name of the function, for profiling
- * @param string $options or Array. Valid options: IGNORE
- *
+ * @param string $table Name of the table to insert to.
+ * @param array $args Items to insert into the table.
+ * @param string $fname Name of the function, for profiling
+ * @param array|string $options String or array. Valid options: IGNORE
* @return bool Success of insert operation. IGNORE always returns true.
*/
function insert( $table, $args, $fname = __METHOD__, $options = array() ) {
* $conds may be "*" to copy the whole table
* srcTable may be an array of tables.
* @todo FIXME: Implement this a little better (seperate select/insert)?
+ *
+ * @param string $destTable
+ * @param array|string $srcTable
+ * @param array $varMap
+ * @param array $conds
+ * @param string $fname
+ * @param array $insertOptions
+ * @param array $selectOptions
* @return bool
*/
function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
* Return the current value of a sequence. Assumes it has been nextval'ed in this session.
*
* @param string $seqName
- * @return
+ * @return int
*/
function currentSequenceValue( $seqName ) {
$safeseq = str_replace( "'", "''", $seqName );
* This should really be handled by PHP PostgreSQL module
*
* @since 1.19
- * @param $text string: postgreql array returned in a text form like {a,b}
- * @param $output string
- * @param $limit int
- * @param $offset int
+ * @param string $text Postgreql array returned in a text form like {a,b}
+ * @param string $output
+ * @param int $limit
+ * @param int $offset
* @return string
*/
function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
}
/**
- * @return string wikitext of a link to the server software's web site
+ * @return string Wikitext of a link to the server software's web site
*/
public function getSoftwareLink() {
return '[{{int:version-db-postgres-url}} PostgreSQL]';
* Needs transaction
*
* @since 1.19
- * @return array how to search for table names schemas for the current user
+ * @return array How to search for table names schemas for the current user
*/
function getSearchPath() {
$res = $this->query( "SHOW search_path", __METHOD__ );
* This will be also called by the installer after the schema is created
*
* @since 1.19
- * @param $desired_schema string
+ *
+ * @param string $desiredSchema
*/
- function determineCoreSchema( $desired_schema ) {
+ function determineCoreSchema( $desiredSchema ) {
$this->begin( __METHOD__ );
- if ( $this->schemaExists( $desired_schema ) ) {
- if ( in_array( $desired_schema, $this->getSchemas() ) ) {
- $this->mCoreSchema = $desired_schema;
- wfDebug( "Schema \"" . $desired_schema . "\" already in the search path\n" );
+ if ( $this->schemaExists( $desiredSchema ) ) {
+ if ( in_array( $desiredSchema, $this->getSchemas() ) ) {
+ $this->mCoreSchema = $desiredSchema;
+ wfDebug( "Schema \"" . $desiredSchema . "\" already in the search path\n" );
} else {
/**
* Prepend our schema (e.g. 'mediawiki') in front
*/
$search_path = $this->getSearchPath();
array_unshift( $search_path,
- $this->addIdentifierQuotes( $desired_schema ) );
+ $this->addIdentifierQuotes( $desiredSchema ) );
$this->setSearchPath( $search_path );
- $this->mCoreSchema = $desired_schema;
- wfDebug( "Schema \"" . $desired_schema . "\" added to the search path\n" );
+ $this->mCoreSchema = $desiredSchema;
+ wfDebug( "Schema \"" . $desiredSchema . "\" added to the search path\n" );
}
} else {
$this->mCoreSchema = $this->getCurrentSchema();
- wfDebug( "Schema \"" . $desired_schema . "\" not found, using current \"" .
+ wfDebug( "Schema \"" . $desiredSchema . "\" not found, using current \"" .
$this->mCoreSchema . "\"\n" );
}
/* Commit SET otherwise it will be rollbacked on error or IGNORE SELECT */
/**
* Query whether a given relation exists (in the given schema, or the
* default mw one if not given)
+ * @param string $table
+ * @param array|string $types
+ * @param bool|string $schema
* @return bool
*/
function relationExists( $table, $types, $schema = false ) {
/**
* For backward compatibility, this function checks both tables and
* views.
+ * @param string $table
+ * @param string $fname
+ * @param bool|string $schema
* @return bool
*/
function tableExists( $table, $fname = __METHOD__, $schema = false ) {
/**
* Query whether a given schema exists. Returns true if it does, false if it doesn't.
+ * @param string $schema
* @return bool
*/
function schemaExists( $schema ) {
/**
* Returns true if a given role (i.e. user) exists, false otherwise.
+ * @param string $roleName
* @return bool
*/
function roleExists( $roleName ) {
/**
* pg_field_type() wrapper
+ * @param ResultWrapper|resource $res ResultWrapper or PostgreSQL query result resource
+ * @param int $index Field number, starting from 0
* @return string
*/
function fieldType( $res, $index ) {
}
/**
- * @param $b
+ * @param string $b
* @return Blob
*/
function encodeBlob( $b ) {
}
/**
- * @param $s null|bool|Blob
+ * @param null|bool|Blob $s
* @return int|string
*/
function addQuotes( $s ) {
* Postgres specific version of replaceVars.
* Calls the parent version in Database.php
*
- * @private
- *
* @param string $ins SQL string, read from a stream (usually tables.sql)
- *
* @return string SQL string
*/
protected function replaceVars( $ins ) {
/**
* Various select options
*
- * @private
- *
* @param array $options an associative array of options to be turned into
- * an SQL query, valid keys are listed in the function.
+ * an SQL query, valid keys are listed in the function.
* @return array
*/
function makeSelectOptions( $options ) {
* Check to see if a named lock is available. This is non-blocking.
* See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
*
- * @param string $lockName name of lock to poll
- * @param string $method name of method calling us
- * @return Boolean
+ * @param string $lockName Name of lock to poll
+ * @param string $method Name of method calling us
+ * @return bool
* @since 1.20
*/
public function lockIsFree( $lockName, $method ) {
/**
* See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
- * @param $lockName string
- * @param $method string
- * @param $timeout int
+ * @param string $lockName
+ * @param string $method
+ * @param int $timeout
* @return bool
*/
public function lock( $lockName, $method, $timeout = 5 ) {
/**
* See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKSFROM
* PG DOCS: http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
- * @param $lockName string
- * @param $method string
+ * @param string $lockName
+ * @param string $method
* @return bool
*/
public function unlock( $lockName, $method ) {
/**
* Opens a database file
*
- * @param $fileName string
- *
+ * @param string $fileName
* @throws DBConnectionError
* @return PDO|bool SQL connection or false if failed
*/
function openFile( $fileName ) {
+ $err = false;
+
$this->mDatabaseFile = $fileName;
try {
if ( $this->mFlags & DBO_PERSISTENT ) {
} catch ( PDOException $e ) {
$err = $e->getMessage();
}
+
if ( !$this->mConn ) {
wfDebug( "DB connection error: $err\n" );
throw new DBConnectionError( $this, $err );
}
+
$this->mOpened = !!$this->mConn;
# set error codes only, don't raise exceptions
if ( $this->mOpened ) {
# Enforce LIKE to be case sensitive, just like MySQL
$this->query( 'PRAGMA case_sensitive_like = 1' );
- return true;
+ return $this->mConn;
}
+
+ return false;
}
/**
* Generates a database file name. Explicitly public for installer.
* @param string $dir Directory where database resides
* @param string $dbName Database name
- * @return String
+ * @return string
*/
public static function generateFileName( $dir, $dbName ) {
return "$dir/$dbName.sqlite";
/**
* Returns version of currently supported SQLite fulltext search module or false if none present.
- * @return String
+ * @return string
*/
static function getFulltextSearchModule() {
static $cachedResult = null;
* Attaches external database to our connection, see http://sqlite.org/lang_attach.html
* for details.
*
- * @param string $name database name to be used in queries like
+ * @param string $name Database name to be used in queries like
* SELECT foo FROM dbname.table
- * @param string $file database file name. If omitted, will be generated
+ * @param bool|string $file Database file name. If omitted, will be generated
* using $name and $wgSQLiteDataDir
- * @param string $fname calling function name
- *
+ * @param string $fname Calling function name
* @return ResultWrapper
*/
function attachDatabase( $name, $file = false, $fname = __METHOD__ ) {
* @see DatabaseBase::isWriteQuery()
*
* @param $sql string
- *
* @return bool
*/
function isWriteQuery( $sql ) {
/**
* SQLite doesn't allow buffered results or data seeking etc, so we'll use fetchAll as the result
*
- * @param $sql string
- *
- * @return ResultWrapper
+ * @param string $sql
+ * @return bool|ResultWrapper
*/
protected function doQuery( $sql ) {
$res = $this->mConn->query( $sql );
}
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper|mixed $res
*/
function freeResult( $res ) {
if ( $res instanceof ResultWrapper ) {
}
/**
- * @param $res ResultWrapper
- * @return object|bool
+ * @param ResultWrapper|array $res
+ * @return stdClass|bool
*/
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
}
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper|mixed $res
* @return array|bool
*/
function fetchRow( $res ) {
/**
* The PDO::Statement class implements the array interface so count() will work
*
- * @param $res ResultWrapper
- *
+ * @param ResultWrapper|array $res
* @return int
*/
function numRows( $res ) {
}
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper $res
* @return int
*/
function numFields( $res ) {
}
/**
- * @param $res ResultWrapper
+ * @param ResultWrapper $res
* @param $n
* @return bool
*/
/**
* Use MySQL's naming (accounts for prefix etc) but remove surrounding backticks
*
- * @param $name
- * @param $format String
+ * @param string $name
+ * @param string $format
* @return string
*/
function tableName( $name, $format = 'quoted' ) {
/**
* Index names have DB scope
*
- * @param $index string
- *
+ * @param string $index
* @return string
*/
function indexName( $index ) {
}
/**
- * @param $res ResultWrapper
- * @param $row
+ * @param ResultWrapper|array $res
+ * @param int $row
*/
function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
* Returns false if the index does not exist
* - if errors are explicitly ignored, returns NULL on failure
*
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return array
*/
function indexInfo( $table, $index, $fname = __METHOD__ ) {
}
/**
- * @param $table
- * @param $index
- * @param $fname string
+ * @param string $table
+ * @param string $index
+ * @param string $fname
* @return bool|null
*/
function indexUnique( $table, $index, $fname = __METHOD__ ) {
/**
* Filter the options used in SELECT statements
*
- * @param $options array
- *
+ * @param array $options
* @return array
*/
function makeSelectOptions( $options ) {
}
/**
- * @param $options array
+ * @param array $options
* @return string
*/
- function makeUpdateOptions( $options ) {
+ protected function makeUpdateOptions( $options ) {
$options = self::fixIgnore( $options );
return parent::makeUpdateOptions( $options );
}
/**
- * @param $options array
+ * @param array $options
* @return array
*/
static function fixIgnore( $options ) {
}
/**
- * @param $options array
+ * @param array $options
* @return string
*/
function makeInsertOptions( $options ) {
/**
* Based on generic method (parent) with some prior SQLite-sepcific adjustments
+ * @param string $table
+ * @param array $a
+ * @param string $fname
+ * @param array $options
* @return bool
*/
function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
}
/**
- * @param $table
- * @param $uniqueIndexes
- * @param $rows
- * @param $fname string
+ * @param string $table
+ * @param array $uniqueIndexes Unused
+ * @param string|array $rows
+ * @param string $fname
* @return bool|ResultWrapper
*/
function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
* Returns the size of a text field, or -1 for "unlimited"
* In SQLite this is SQLITE_MAX_LENGTH, by default 1GB. No way to query it though.
*
+ * @param string $table
+ * @param string $field
* @return int
*/
function textFieldSize( $table, $field ) {
}
/**
- * @param $sqls
- * @param $all
+ * @param string $sqls
+ * @param bool $all Whether to "UNION ALL" or not
* @return string
*/
function unionQueries( $sqls, $all ) {
* Get information about a given field
* Returns false if the field does not exist.
*
- * @param $table string
- * @param $field string
+ * @param string $table
+ * @param string $field
* @return SQLiteField|bool False on failure
*/
function fieldInfo( $table, $field ) {
}
/**
- * @param $s string
+ * @param string $s
* @return string
*/
function strencode( $s ) {
}
/**
- * @param $s Blob|string
+ * @param Blob|string $s
* @return string
*/
function addQuotes( $s ) {
/**
* No-op version of deadlockLoop
+ *
* @return mixed
*/
public function deadlockLoop( /*...*/ ) {
}
/**
- * @param $s string
+ * @param string $s
* @return string
*/
protected function replaceVars( $s ) {
/**
* Build a concatenation list to feed into a SQL query
*
- * @param $stringList array
- *
+ * @param string[] $stringList
* @return string
*/
function buildConcat( $stringList ) {
/**
* @throws MWException
- * @param $oldName
- * @param $newName
- * @param $temporary bool
- * @param $fname string
+ * @param string $oldName
+ * @param string $newName
+ * @param bool $temporary
+ * @param string $fname
* @return bool|ResultWrapper
*/
function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
* List all tables on the database
*
* @param string $prefix Only show tables with this prefix, e.g. mw_
- * @param string $fname calling function name
+ * @param string $fname Calling function name
*
* @return array
*/
/**
* Get the number of rows in a result object
*
- * @return integer
+ * @return int
*/
function numRows() {
return $this->db->numRows( $this );
* Fetch the next row from the given result object, in associative array
* form. Fields are retrieved with $row['fieldname'].
*
- * @return Array
+ * @return array
* @throws DBUnexpectedError Thrown if the database returns an error
*/
function fetchRow() {
* Change the position of the cursor in a result object.
* See mysql_data_seek()
*
- * @param $row integer
+ * @param int $row
*/
function seek( $row ) {
$this->db->dataSeek( $this, $row );
* manually, use DatabaseBase::anyChar() and anyString() instead.
*/
class LikeMatch {
+ /** @var string */
private $str;
/**
/**
* Return the original stored string.
*
- * @return String
+ * @return string
*/
public function toString() {
return $this->str;
* An object representing a master or slave position in a replicated setup.
*/
interface DBMasterPos {
+ /**
+ * Return the master position.
+ *
+ * @return mixed Master position
+ */
+ public function getMasterPos();
}
* Returns the LBFactory class to use and the load balancer configuration.
*
* @param array $config (e.g. $wgLBFactoryConf)
- *
* @return string class name
*/
public static function getLBFactoryClass( array $config ) {
/**
* Set the instance to be the given object
*
- * @param $instance LBFactory
+ * @param LBFactory $instance
*/
static function setInstance( $instance ) {
self::destroyInstance();
/**
* Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
- * @param $conf
+ * @param array $conf
*/
abstract function __construct( $conf );
* Create a new load balancer object. The resulting object will be untracked,
* not chronology-protected, and the caller is responsible for cleaning it up.
*
- * @param string $wiki wiki ID, or false for the current wiki
+ * @param bool|string $wiki Wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function newMainLB( $wiki = false );
/**
* Get a cached (tracked) load balancer object.
*
- * @param string $wiki wiki ID, or false for the current wiki
+ * @param bool|string $wiki Wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function getMainLB( $wiki = false );
* untracked, not chronology-protected, and the caller is responsible for
* cleaning it up.
*
- * @param string $cluster external storage cluster, or false for core
- * @param string $wiki wiki ID, or false for the current wiki
- *
+ * @param string $cluster External storage cluster, or false for core
+ * @param bool|string $wiki Wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function newExternalLB( $cluster, $wiki = false );
* Get a cached (tracked) load balancer for external storage
*
* @param string $cluster external storage cluster, or false for core
- * @param string $wiki wiki ID, or false for the current wiki
- *
+ * @param bool|string $wiki Wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function &getExternalLB( $cluster, $wiki = false );
* Execute a function for each tracked load balancer
* The callback is called with the load balancer as the first parameter,
* and $params passed as the subsequent parameters.
- * @param $callback string|array
+ *
+ * @param callable $callback
* @param array $params
*/
abstract function forEachLB( $callback, $params = array() );
/**
* Call a method of each tracked load balancer
- * @param $methodName string
- * @param $args array
+ *
+ * @param string $methodName
+ * @param array $args
*/
function forEachLBCallMethod( $methodName, $args = array() ) {
$this->forEachLB( array( $this, 'callMethod' ), array( $methodName, $args ) );
/**
* Private helper for forEachLBCallMethod
- * @param $loadBalancer
- * @param $methodName string
+ * @param LoadBalancer $loadBalancer
+ * @param string $methodName
* @param $args
*/
function callMethod( $loadBalancer, $methodName, $args ) {
}
/**
- * @param $wiki
+ * @param bool|string $wiki
* @return LoadBalancer
*/
function newMainLB( $wiki = false ) {
}
/**
- * @param $wiki
+ * @param bool|string $wiki
* @return LoadBalancer
*/
function getMainLB( $wiki = false ) {
/**
* @throws MWException
- * @param $cluster
- * @param $wiki
+ * @param string $cluster
+ * @param bool|string $wiki
* @return LoadBalancer
*/
function newExternalLB( $cluster, $wiki = false ) {
}
/**
- * @param $cluster
- * @param $wiki
+ * @param string $cluster
+ * @param bool|string $wiki
* @return array
*/
function &getExternalLB( $cluster, $wiki = false ) {
* Execute a function for each tracked load balancer
* The callback is called with the load balancer as the first parameter,
* and $params passed as the subsequent parameters.
- * @param $callback
- * @param $params array
+ *
+ * @param callable $callback
+ * @param array $params
*/
function forEachLB( $callback, $params = array() ) {
if ( isset( $this->mainLB ) ) {
protected $lastSection;
/**
- * @param $conf array
+ * @param array $conf
* @throws MWException
*/
function __construct( $conf ) {
}
/**
- * @param $wiki bool|string
+ * @param bool|string $wiki
* @return string
*/
function getSectionForWiki( $wiki = false ) {
}
/**
- * @param $wiki bool|string
+ * @param bool|string $wiki
* @return LoadBalancer
*/
function newMainLB( $wiki = false ) {
}
/**
- * @param $wiki bool|string
+ * @param bool|string $wiki
* @return LoadBalancer
*/
function getMainLB( $wiki = false ) {
/**
* @param string $cluster
- * @param bool $wiki
+ * @param bool|string $wiki
* @throws MWException
* @return LoadBalancer
*/
}
/**
- * @param $cluster
- * @param $wiki
+ * @param string $cluster external storage cluster, or false for core
+ * @param bool|string $wiki Wiki ID, or false for the current wiki
* @return LoadBalancer
*/
function &getExternalLB( $cluster, $wiki = false ) {
/**
* Make a new load balancer object based on template and load array
*
- * @param $template
- * @param $loads array
- * @param $groupLoads
+ * @param array $template
+ * @param array $loads
+ * @param array $groupLoads
* @return LoadBalancer
*/
function newLoadBalancer( $template, $loads, $groupLoads ) {
/**
* Make a server array as expected by LoadBalancer::__construct, using a template and load array
*
- * @param $template
- * @param $loads array
- * @param $groupLoads
+ * @param array $template
+ * @param array $loads
+ * @param array $groupLoads
* @return array
*/
function makeServerArray( $template, $loads, $groupLoads ) {
/**
* Take a group load array indexed by group then server, and reindex it by server then group
- * @param $groupLoads
+ * @param array $groupLoads
* @return array
*/
function reindexGroupLoads( $groupLoads ) {
/**
* Get the database name and prefix based on the wiki ID
- * @param $wiki bool
+ * @param bool|string $wiki
* @return array
*/
function getDBNameAndPrefix( $wiki = false ) {
* Execute a function for each tracked load balancer
* The callback is called with the load balancer as the first parameter,
* and $params passed as the subsequent parameters.
- * @param $callback
- * @param $params array
+ * @param callable $callback
+ * @param array $params
*/
function forEachLB( $callback, $params = array() ) {
foreach ( $this->mainLBs as $lb ) {
* An LBFactory class that always returns a single database object.
*/
class LBFactorySingle extends LBFactory {
+ /** @var LoadBalancerSingle */
protected $lb;
/**
}
/**
- * @param $wiki bool|string
- *
+ * @param bool|string $wiki
* @return LoadBalancerSingle
*/
function newMainLB( $wiki = false ) {
}
/**
- * @param $wiki bool|string
- *
+ * @param bool|string $wiki
* @return LoadBalancerSingle
*/
function getMainLB( $wiki = false ) {
}
/**
- * @param $cluster
- * @param $wiki bool|string
- *
+ * @param string $cluster External storage cluster, or false for core
+ * @param bool|string $wiki Wiki ID, or false for the current wiki
* @return LoadBalancerSingle
*/
function newExternalLB( $cluster, $wiki = false ) {
}
/**
- * @param $cluster
- * @param $wiki bool|string
- *
+ * @param string $cluster external storage cluster, or false for core
+ * @param bool|string $wiki Wiki ID, or false for the current wiki
* @return LoadBalancerSingle
*/
function &getExternalLB( $cluster, $wiki = false ) {
}
/**
- * @param $callback string|array
- * @param $params array
+ * @param string|array $callback
+ * @param array $params
*/
function forEachLB( $callback, $params = array() ) {
call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
/**
*
- * @param $server string
- * @param $dbNameOverride bool
+ * @param string $server
+ * @param bool $dbNameOverride
*
* @return DatabaseBase
*/
private $mServers, $mConns, $mLoads, $mGroupLoads;
private $mErrorConnection;
private $mReadIndex, $mAllowLagged;
- private $mWaitForPos, $mWaitTimeout;
+
+ /** @var bool|DBMasterPos False if not set */
+ private $mWaitForPos;
+
+ private $mWaitTimeout;
private $mLaggedSlaveMode, $mLastError = 'Unknown error';
private $mParentInfo, $mLagTimes;
private $mLoadMonitorClass, $mLoadMonitor;
/**
* @param array $params with keys:
- * servers Required. Array of server info structures.
- * masterWaitTimeout Replication lag wait timeout
- * loadMonitor Name of a class used to fetch server lag and load.
+ * servers Required. Array of server info structures.
+ * masterWaitTimeout Replication lag wait timeout
+ * loadMonitor Name of a class used to fetch server lag and load.
* @throws MWException
*/
function __construct( $params ) {
/**
* Get or set arbitrary data used by the parent object, usually an LBFactory
* @param $x
- * @return Mixed
+ * @return mixed
*/
function parentInfo( $x = null ) {
return wfSetVar( $this->mParentInfo, $x );
*
* @deprecated since 1.21, use ArrayUtils::pickRandom()
*
- * @param $weights array
- *
+ * @param array $weights
* @return bool|int|string
*/
function pickRandom( $weights ) {
}
/**
- * @param $loads array
- * @param $wiki bool
+ * @param array $loads
+ * @param bool|string $wiki Wiki to get non-lagged for
* @return bool|int|string
*/
function getRandomNonLagged( $loads, $wiki = false ) {
* always return a consistent index during a given invocation
*
* Side effect: opens connections to databases
- * @param $group bool
- * @param $wiki bool
+ * @param bool|string $group
+ * @param bool|string $wiki
* @throws MWException
* @return bool|int|string
*/
/**
* Wait for a specified number of microseconds, and return the period waited
- * @param $t int
+ * @param int $t
* @return int
*/
function sleep( $t ) {
* Set the master wait position
* If a DB_SLAVE connection has been opened already, waits
* Otherwise sets a variable telling it to wait if such a connection is opened
- * @param $pos DBMasterPos
+ * @param DBMasterPos $pos
*/
public function waitFor( $pos ) {
wfProfileIn( __METHOD__ );
/**
* Set the master wait position and wait for ALL slaves to catch up to it
- * @param $pos DBMasterPos
+ * @param DBMasterPos $pos
*/
public function waitForAll( $pos ) {
wfProfileIn( __METHOD__ );
* Get any open connection to a given server index, local or foreign
* Returns false if there is no connection open
*
- * @param $i int
+ * @param int $i
* @return DatabaseBase|bool False on failure
*/
function getAnyOpenConnection( $i ) {
*
* @param integer $db
* @param mixed $groups
- * @param string $wiki
+ * @param bool|string $wiki
* @return DBConnRef
*/
public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
*
* @param integer $db
* @param mixed $groups
- * @param string $wiki
+ * @param bool|string $wiki
* @return DBConnRef
*/
public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
* error will be available via $this->mErrorConnection.
*
* @param $i Integer server index
- * @param string $wiki wiki ID to open
+ * @param bool|string $wiki wiki ID to open
* @return DatabaseBase
*
* @access private
/**
* Disables/enables lag checks
- * @param $mode null
+ * @param null|bool $mode
* @return bool
*/
function allowLagged( $mode = null ) {
/**
* Call a function with each open connection object
- * @param $callback
+ * @param callable $callback
* @param array $params
*/
function forEachOpenConnection( $callback, $params = array() ) {
* May attempt to open connections to slaves on the default DB. If there is
* no lag, the maximum lag will be reported as -1.
*
- * @param string $wiki Wiki ID, or false for the default database
- *
+ * @param bool|string $wiki Wiki ID, or false for the default database
* @return array ( host, max lag, index of max lagged host )
*/
function getMaxLag( $wiki = false ) {
* Get lag time for each server
* Results are cached for a short time in memcached, and indefinitely in the process cache
*
- * @param $wiki
- *
+ * @param string|bool $wiki
* @return array
*/
function getLagTimes( $wiki = false ) {
* function instead of Database::getLag() avoids a fatal error in this
* case on many installations.
*
- * @param $conn DatabaseBase
- *
+ * @param DatabaseBase $conn
* @return int
*/
function safeGetLag( $conn ) {
class DBConnRef implements IDatabase {
/** @var LoadBalancer */
protected $lb;
+
/** @var DatabaseBase|null */
protected $conn;
- /** @var Array|null */
+
+ /** @var array|null */
protected $params;
/**
- * @param $lb LoadBalancer
- * @param $conn DatabaseBase|array Connection or (server index, group, wiki ID) array
+ * @param LoadBalancer $lb
+ * @param DatabaseBase|array $conn Connection or (server index, group, wiki ID) array
*/
public function __construct( LoadBalancer $lb, $conn ) {
$this->lb = $lb;
/**
* Perform pre-connection load ratio adjustment.
* @param array $loads
- * @param string|bool $group the selected query group. Default: false
+ * @param string|bool $group The selected query group. Default: false
* @param string|bool $wiki Default: false
*/
function scaleLoads( &$loads, $group = false, $wiki = false );
* to the running thread count. The threshold may be false, which indicates
* that the sysadmin has not configured this feature.
*
- * @param $conn DatabaseBase
- * @param $threshold Float
+ * @param DatabaseBase $conn
+ * @param float $threshold
*/
function postConnectionBackoff( $conn, $threshold );
/**
* Return an estimate of replication lag for each server
*
- * @param $serverIndexes
- * @param $wiki
+ * @param array $serverIndexes
+ * @param string $wiki
*
* @return array
*/
}
/**
- * @param $serverIndexes
- * @param $wiki
+ * @param array $serverIndexes
+ * @param string $wiki
* @return array
*/
function getLagTimes( $serverIndexes, $wiki ) {
* @ingroup Database
*/
class LoadMonitorMySQL implements LoadMonitor {
- /**
- * @var LoadBalancer
- */
+ /** @var LoadBalancer */
public $parent;
/**
}
/**
- * @param $loads
- * @param $group bool
- * @param $wiki bool
+ * @param array $loads
+ * @param bool $group
+ * @param bool $wiki
*/
function scaleLoads( &$loads, $group = false, $wiki = false ) {
}
/**
- * @param $serverIndexes
- * @param $wiki
+ * @param array $serverIndexes
+ * @param string $wiki
* @return array
*/
function getLagTimes( $serverIndexes, $wiki ) {
}
/**
- * @param $conn DatabaseBase
- * @param $threshold
+ * @param DatabaseBase|DatabaseMySQLBase $conn
+ * @param int $threshold
* @return int
*/
function postConnectionBackoff( $conn, $threshold ) {
* @param array $conditions
* @param array $options
* @param null|string $functionName
- *
* @return ResultWrapper
- * @throws DBQueryError if the quey failed (even if the database was in ignoreErrors mode).
+ * @throws DBQueryError if the query failed (even if the database was in
+ * ignoreErrors mode).
*/
public function rawSelect( $fields = null, array $conditions = array(),
array $options = array(), $functionName = null
* @param array $options
* @param string|null $functionName
*
- * @return ResultWrapper
+ * @return stdClass
*/
public function rawSelectRow( array $fields, array $conditions = array(),
array $options = array(), $functionName = null
* @since 1.20
*
* @param stdClass $result
- *
+ * @throws MWException
* @return array
*/
public function getFieldsFromDBResult( stdClass $result ) {
* - cacheAuthInfo : Whether to cache authentication tokens in APC, XCache, ect.
* If those are not available, then the main cache will be used.
* This is probably insecure in shared hosting environments.
- * - rgwS3AccessKey : Ragos Gateway S3 "access key" value on the account.
+ * - rgwS3AccessKey : Rados Gateway S3 "access key" value on the account.
* Do not set this until it has been set in the backend.
* This is used for generating expiring pre-authenticated URLs.
* Only use this when using rgw and to work around
* http://tracker.newdream.net/issues/3454.
- * - rgwS3SecretKey : Ragos Gateway S3 "secret key" value on the account.
+ * - rgwS3SecretKey : Rados Gateway S3 "secret key" value on the account.
* Do not set this until it has been set in the backend.
* This is used for generating expiring pre-authenticated URLs.
* Only use this when using rgw and to work around
*
* @since 1.22
*/
+class JSONRCFeedFormatter extends MachineReadableRCFeedFormatter {
-class JSONRCFeedFormatter implements RCFeedFormatter {
- /**
- * Generates a notification that can be easily interpreted by a machine.
- * @see RCFeedFormatter::getLine
- */
- public function getLine( array $feed, RecentChange $rc, $actionComment ) {
- global $wgCanonicalServer, $wgScriptPath, $wgDBname;
- $attrib = $rc->getAttributes();
-
- $packet = array(
- // Usually, RC ID is exposed only for patrolling purposes,
- // but there is no real reason not to expose it in other cases,
- // and I can see how this may be potentially useful for clients.
- 'id' => $attrib['rc_id'],
- 'type' => $attrib['rc_type'],
- 'namespace' => $rc->getTitle()->getNamespace(),
- 'title' => $rc->getTitle()->getPrefixedText(),
- 'comment' => $attrib['rc_comment'],
- 'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
- 'user' => $attrib['rc_user_text'],
- 'bot' => (bool)$attrib['rc_bot'],
- );
-
- if ( isset( $feed['channel'] ) ) {
- $packet['channel'] = $feed['channel'];
- }
-
- $type = $attrib['rc_type'];
- if ( $type == RC_EDIT || $type == RC_NEW ) {
- global $wgUseRCPatrol, $wgUseNPPatrol;
-
- $packet['minor'] = $attrib['rc_minor'];
- if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
- $packet['patrolled'] = $attrib['rc_patrolled'];
- }
- }
-
- switch ( $type ) {
- case RC_EDIT:
- $packet['length'] = array( 'old' => $attrib['rc_old_len'], 'new' => $attrib['rc_new_len'] );
- $packet['revision'] = array( 'old' => $attrib['rc_last_oldid'], 'new' => $attrib['rc_this_oldid'] );
- break;
-
- case RC_NEW:
- $packet['length'] = array( 'old' => null, 'new' => $attrib['rc_new_len'] );
- $packet['revision'] = array( 'old' => null, 'new' => $attrib['rc_this_oldid'] );
- break;
-
- case RC_LOG:
- $packet['log_type'] = $attrib['rc_log_type'];
- $packet['log_action'] = $attrib['rc_log_action'];
- if ( $attrib['rc_params'] ) {
- wfSuppressWarnings();
- $params = unserialize( $attrib['rc_params'] );
- wfRestoreWarnings();
- if (
- // If it's an actual serialised false...
- $attrib['rc_params'] == serialize( false ) ||
- // Or if we did not get false back when trying to unserialise
- $params !== false
- ) {
- // From ApiQueryLogEvents::addLogParams
- $logParams = array();
- // Keys like "4::paramname" can't be used for output so we change them to "paramname"
- foreach ( $params as $key => $value ) {
- if ( strpos( $key, ':' ) === false ) {
- $logParams[$key] = $value;
- continue;
- }
- $logParam = explode( ':', $key, 3 );
- $logParams[$logParam[2]] = $value;
- }
- $packet['log_params'] = $logParams;
- } else {
- $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
- }
- }
- $packet['log_action_comment'] = $actionComment;
- break;
- }
-
- $packet['server_url'] = $wgCanonicalServer;
- $packet['server_script_path'] = $wgScriptPath ?: '/';
- $packet['wiki'] = $wgDBname;
-
+ protected function formatArray( array $packet ) {
return FormatJson::encode( $packet );
}
}
--- /dev/null
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Abstract class so there can be multiple formatters outputting the same data
+ *
+ * @since 1.23
+ */
+abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
+
+ /**
+ * Take the packet and return the formatted string
+ * @param array $packet
+ * @return string
+ */
+ abstract protected function formatArray( array $packet );
+
+ /**
+ * Generates a notification that can be easily interpreted by a machine.
+ * @see RCFeedFormatter::getLine
+ */
+ public function getLine( array $feed, RecentChange $rc, $actionComment ) {
+ global $wgCanonicalServer, $wgScriptPath;
+ $attrib = $rc->getAttributes();
+
+ $packet = array(
+ // Usually, RC ID is exposed only for patrolling purposes,
+ // but there is no real reason not to expose it in other cases,
+ // and I can see how this may be potentially useful for clients.
+ 'id' => $attrib['rc_id'],
+ 'type' => $attrib['rc_type'],
+ 'namespace' => $rc->getTitle()->getNamespace(),
+ 'title' => $rc->getTitle()->getPrefixedText(),
+ 'comment' => $attrib['rc_comment'],
+ 'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
+ 'user' => $attrib['rc_user_text'],
+ 'bot' => (bool)$attrib['rc_bot'],
+ );
+
+ if ( isset( $feed['channel'] ) ) {
+ $packet['channel'] = $feed['channel'];
+ }
+
+ $type = $attrib['rc_type'];
+ if ( $type == RC_EDIT || $type == RC_NEW ) {
+ global $wgUseRCPatrol, $wgUseNPPatrol;
+
+ $packet['minor'] = $attrib['rc_minor'];
+ if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
+ $packet['patrolled'] = $attrib['rc_patrolled'];
+ }
+ }
+
+ switch ( $type ) {
+ case RC_EDIT:
+ $packet['length'] = array(
+ 'old' => $attrib['rc_old_len'],
+ 'new' => $attrib['rc_new_len']
+ );
+ $packet['revision'] = array(
+ 'old' => $attrib['rc_last_oldid'],
+ 'new' => $attrib['rc_this_oldid']
+ );
+ break;
+
+ case RC_NEW:
+ $packet['length'] = array( 'old' => null, 'new' => $attrib['rc_new_len'] );
+ $packet['revision'] = array( 'old' => null, 'new' => $attrib['rc_this_oldid'] );
+ break;
+
+ case RC_LOG:
+ $packet['log_type'] = $attrib['rc_log_type'];
+ $packet['log_action'] = $attrib['rc_log_action'];
+ if ( $attrib['rc_params'] ) {
+ wfSuppressWarnings();
+ $params = unserialize( $attrib['rc_params'] );
+ wfRestoreWarnings();
+ if (
+ // If it's an actual serialised false...
+ $attrib['rc_params'] == serialize( false ) ||
+ // Or if we did not get false back when trying to unserialise
+ $params !== false
+ ) {
+ // From ApiQueryLogEvents::addLogParams
+ $logParams = array();
+ // Keys like "4::paramname" can't be used for output so we change them to "paramname"
+ foreach ( $params as $key => $value ) {
+ if ( strpos( $key, ':' ) === false ) {
+ $logParams[$key] = $value;
+ continue;
+ }
+ $logParam = explode( ':', $key, 3 );
+ $logParams[$logParam[2]] = $value;
+ }
+ $packet['log_params'] = $logParams;
+ } else {
+ $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
+ }
+ }
+ $packet['log_action_comment'] = $actionComment;
+ break;
+ }
+
+ $packet['server_url'] = $wgCanonicalServer;
+ $packet['server_script_path'] = $wgScriptPath ?: '/';
+ $packet['wiki'] = wfWikiID();
+
+ return $this->formatArray( $packet );
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @since 1.23
+ */
+class XMLRCFeedFormatter extends MachineReadableRCFeedFormatter {
+
+ protected function formatArray( array $packet ) {
+ return ApiFormatXml::recXmlPrint( 'recentchange', $packet, 0 );
+ }
+}
}
protected function getGroupName() {
- return 'other';
+ return 'wiki';
}
}
global $wgFeedLimit;
$opts = $this->getDefaultOptions();
-
foreach ( $this->getCustomFilters() as $key => $params ) {
$opts->add( $key, $params['default'] );
}
- $opts->fetchValuesFromRequest( $this->getRequest() );
+ $opts = $this->fetchOptionsFromRequest( $opts );
// Give precedence to subpage syntax
if ( $parameters !== null ) {
return $opts;
}
+ /**
+ * Fetch values for a FormOptions object from the WebRequest associated with this instance.
+ *
+ * Intended for subclassing, e.g. to add a backwards-compatibility layer.
+ *
+ * @param FormOptions $parameters
+ * @return FormOptions
+ */
+ protected function fetchOptionsFromRequest( $opts ) {
+ $opts->fetchValuesFromRequest( $this->getRequest() );
+ return $opts;
+ }
+
/**
* Get custom show/hide filters
*
}
/**
- * Map old pre-1.23 request parameters Watchlist used to use (different from Recentchanges' ones)
+ * Get a FormOptions object containing the default options
+ *
+ * @return FormOptions
+ */
+ public function getDefaultOptions() {
+ $opts = parent::getDefaultOptions();
+ $user = $this->getUser();
+
+ // Overwrite RC options with Watchlist options
+ // (calling #add() again is okay)
+ $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
+ $opts->add( 'hideminor', $user->getBoolOption( 'watchlisthideminor' ) );
+ $opts->add( 'hidebots', $user->getBoolOption( 'watchlisthidebots' ) );
+ $opts->add( 'hideanons', $user->getBoolOption( 'watchlisthideanons' ) );
+ $opts->add( 'hideliu', $user->getBoolOption( 'watchlisthideliu' ) );
+ $opts->add( 'hidepatrolled', $user->getBoolOption( 'watchlisthidepatrolled' ) );
+ $opts->add( 'hidemyself', $user->getBoolOption( 'watchlisthideown' ) );
+
+ // Add new ones
+ $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
+
+ return $opts;
+ }
+
+ /**
+ * Fetch values for a FormOptions object from the WebRequest associated with this instance.
+ *
+ * Maps old pre-1.23 request parameters Watchlist used to use (different from Recentchanges' ones)
* to the current ones.
*
- * This creates derivative context and request, pokes with request's parameters, and sets them as
- * the context for this class instance, mapping old keys to new ones completely transparently (as
- * long as nothing tries to access the globals instead of current context).
+ * @param FormOptions $parameters
+ * @return FormOptions
*/
- private function mapCompatibilityRequestParameters() {
- static $map = array(
+ protected function fetchOptionsFromRequest( $opts ) {
+ static $compatibilityMap = array(
'hideMinor' => 'hideminor',
'hideBots' => 'hidebots',
'hideAnons' => 'hideanons',
);
$params = $this->getRequest()->getValues();
- foreach ( $map as $from => $to ) {
+ foreach ( $compatibilityMap as $from => $to ) {
if ( isset( $params[$from] ) ) {
$params[$to] = $params[$from];
unset( $params[$from] );
}
}
- $context = new DerivativeContext( $this->getContext() );
- $request = new DerivativeRequest( $context->getRequest(), $params );
- $context->setRequest( $request );
- $this->setContext( $context );
+ // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization
+ // methods defined on WebRequest and removing this dependency would cause some code duplication.
+ $request = new DerivativeRequest( $this->getRequest(), $params );
+ $opts->fetchValuesFromRequest( $request );
+ return $opts;
+ }
+
+ /**
+ * Get custom show/hide filters
+ *
+ * @return array Map of filter URL param names to properties (msg/default)
+ */
+ protected function getCustomFilters() {
+ if ( $this->customFilters === null ) {
+ $this->customFilters = array();
+ wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
+ }
+
+ return $this->customFilters;
+ }
+
+ /**
+ * Process $par and put options found if $opts. Not used for Watchlist.
+ *
+ * @param string $par
+ * @param FormOptions $opts
+ */
+ public function parseParameters( $par, FormOptions $opts ) {
+ }
+
+ /**
+ * Get the current FormOptions for this request
+ */
+ public function getOptions() {
+ if ( $this->rcOptions === null ) {
+ $this->rcOptions = $this->setup( null );
+ }
+
+ return $this->rcOptions;
}
/**
function execute( $par ) {
global $wgRCShowWatchingUsers, $wgEnotifWatchlist, $wgShowUpdatedMarker;
- $this->mapCompatibilityRequestParameters();
-
$user = $this->getUser();
$output = $this->getOutput();
$output->addModuleStyles( 'mediawiki.special.changeslist' );
// Check permissions
$this->checkPermissions();
+ $request = $this->getRequest();
+ $opts = $this->getOptions();
+
+ $mode = SpecialEditWatchlist::getMode( $request, $par );
+ if ( $mode !== false ) {
+ if ( $mode === SpecialEditWatchlist::EDIT_RAW ) {
+ $title = SpecialPage::getTitleFor( 'EditWatchlist', 'raw' );
+ } else {
+ $title = SpecialPage::getTitleFor( 'EditWatchlist' );
+ }
+
+ $output->redirect( $title->getLocalURL() );
+ return;
+ }
+
+ if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
+ $request->wasPosted() )
+ {
+ $user->clearAllNotifications();
+ $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) );
+ return;
+ }
+
+ $this->setHeaders();
+ $this->outputHeader();
+
// Add feed links
$wlToken = $user->getTokenFromOption( 'watchlisttoken' );
if ( $wlToken ) {
) );
}
- $this->setHeaders();
- $this->outputHeader();
-
$output->addSubtitle(
$this->msg( 'watchlistfor2', $user->getName() )
->rawParams( SpecialEditWatchlist::buildTools( null ) )
);
- $request = $this->getRequest();
-
- $mode = SpecialEditWatchlist::getMode( $request, $par );
- if ( $mode !== false ) {
- if ( $mode === SpecialEditWatchlist::EDIT_RAW ) {
- $title = SpecialPage::getTitleFor( 'EditWatchlist', 'raw' );
- } else {
- $title = SpecialPage::getTitleFor( 'EditWatchlist' );
- }
+ $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
- $output->redirect( $title->getLocalURL() );
- return;
+ # Show a message about slave lag, if applicable
+ $lag = wfGetLB()->safeGetLag( $dbr );
+ if ( $lag > 0 ) {
+ $output->showLagWarning( $lag );
}
- $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
-
$nitems = $this->countItems( $dbr );
if ( $nitems == 0 ) {
$output->addWikiMsg( 'nowatchlist' );
return;
}
- // @todo use FormOptions!
- $defaults = array(
- /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ),
- /* bool */ 'hideminor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
- /* bool */ 'hidebots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
- /* bool */ 'hideanons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
- /* bool */ 'hideliu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
- /* bool */ 'hidepatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
- /* bool */ 'hidemyself' => (int)$user->getBoolOption( 'watchlisthideown' ),
- /* bool */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
- /* ? */ 'namespace' => '', //means all
- /* ? */ 'invert' => false,
- /* bool */ 'associated' => false,
- );
- $this->customFilters = array();
- wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
- foreach ( $this->customFilters as $key => $params ) {
- $defaults[$key] = $params['default'];
- }
-
- # Extract variables from the request, falling back to user preferences or
- # other default values if these don't exist
- $values = array();
- $values['days'] = floatval( $request->getVal( 'days', $defaults['days'] ) );
- $values['hideminor'] = (int)$request->getBool( 'hideminor', $defaults['hideminor'] );
- $values['hidebots'] = (int)$request->getBool( 'hidebots', $defaults['hidebots'] );
- $values['hideanons'] = (int)$request->getBool( 'hideanons', $defaults['hideanons'] );
- $values['hideliu'] = (int)$request->getBool( 'hideliu', $defaults['hideliu'] );
- $values['hidemyself'] = (int)$request->getBool( 'hidemyself', $defaults['hidemyself'] );
- $values['hidepatrolled'] = (int)$request->getBool( 'hidepatrolled', $defaults['hidepatrolled'] );
- $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
- foreach ( $this->customFilters as $key => $params ) {
- $values[$key] = (int)$request->getBool( $key, $defaults[$key] );
- }
-
# Get namespace value, if supplied, and prepare a WHERE fragment
- $nameSpace = $request->getIntOrNull( 'namespace' );
- $invert = $request->getBool( 'invert' );
- $associated = $request->getBool( 'associated' );
- if ( !is_null( $nameSpace ) ) {
+ $nameSpace = $opts['namespace'];
+ $invert = $opts['invert'];
+ $associated = $opts['associated'];
+
+ if ( $nameSpace !== '' ) {
$eq_op = $invert ? '!=' : '=';
$bool_op = $invert ? 'AND' : 'OR';
- $nameSpace = intval( $nameSpace ); // paranioa
if ( !$associated ) {
$nameSpaceClause = "rc_namespace $eq_op $nameSpace";
} else {
" rc_namespace $eq_op $associatedNS";
}
} else {
- $nameSpace = '';
$nameSpaceClause = '';
}
- $values['namespace'] = $nameSpace;
- $values['invert'] = $invert;
- $values['associated'] = $associated;
-
- // Dump everything here
- $nondefaults = array();
- foreach ( $defaults as $name => $defValue ) {
- wfAppendToArrayIfNotDefault( $name, $values[$name], $defaults, $nondefaults );
- }
-
- if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' )
- && $request->wasPosted()
- ) {
- $user->clearAllNotifications();
- $output->redirect( $this->getPageTitle()->getFullURL( $nondefaults ) );
- return;
- }
# Possible where conditions
$conds = array();
- if ( $values['days'] > 0 ) {
- $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
+ if ( $opts['days'] > 0 ) {
+ $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $opts['days'] * 86400 ) ) );
}
# Toggles
- if ( $values['hidemyself'] ) {
+ if ( $opts['hidemyself'] ) {
$conds[] = 'rc_user != ' . $user->getId();
}
- if ( $values['hidebots'] ) {
+ if ( $opts['hidebots'] ) {
$conds[] = 'rc_bot = 0';
}
- if ( $values['hideminor'] ) {
+ if ( $opts['hideminor'] ) {
$conds[] = 'rc_minor = 0';
}
- if ( $values['hideliu'] ) {
+ if ( $opts['hideliu'] ) {
$conds[] = 'rc_user = 0';
}
- if ( $values['hideanons'] ) {
+ if ( $opts['hideanons'] ) {
$conds[] = 'rc_user != 0';
}
- if ( $user->useRCPatrol() && $values['hidepatrolled'] ) {
+ if ( $user->useRCPatrol() && $opts['hidepatrolled'] ) {
$conds[] = 'rc_patrolled != 1';
}
if ( $nameSpaceClause ) {
}
# Toggle watchlist content (all recent edits or just the latest)
- if ( $values['extended'] ) {
+ if ( $opts['extended'] ) {
$limitWatchlist = $user->getIntOption( 'wllimit' );
$usePage = false;
} else {
$usePage = true;
}
- # Show a message about slave lag, if applicable
- $lag = wfGetLB()->safeGetLag( $dbr );
- if ( $lag > 0 ) {
- $output->showLagWarning( $lag );
- }
-
- # Create output
- $form = '';
-
- # Show watchlist header
- $form .= "<p>";
- $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
- if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
- $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
- }
- if ( $wgShowUpdatedMarker ) {
- $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
- }
- $form .= "</p>";
-
- if ( $wgShowUpdatedMarker ) {
- $form .= Xml::openElement( 'form', array( 'method' => 'post',
- 'action' => $this->getPageTitle()->getLocalURL(),
- 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
- Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
- Html::hidden( 'reset', 'all' ) . "\n";
- foreach ( $nondefaults as $key => $value ) {
- $form .= Html::hidden( $key, $value ) . "\n";
- }
- $form .= Xml::closeElement( 'form' ) . "\n";
- }
-
- $form .= Xml::openElement( 'form', array(
- 'method' => 'post',
- 'action' => $this->getPageTitle()->getLocalURL(),
- 'id' => 'mw-watchlist-form'
- ) );
- $form .= Xml::fieldset(
- $this->msg( 'watchlist-options' )->text(),
- false,
- array( 'id' => 'mw-watchlist-options' )
- );
-
- $form .= SpecialRecentChanges::makeLegend( $this->getContext() );
-
$tables = array( 'recentchanges', 'watchlist' );
$fields = RecentChange::selectFields();
$join_conds = array(
}
ChangeTags::modifyDisplayQuery( $tables, $fields, $conds, $join_conds, $options, '' );
- wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $values ) );
+ wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $opts ) );
$res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
$numRows = $res->numRows();
$lang = $this->getLanguage();
$wlInfo = '';
- if ( $values['days'] > 0 ) {
+ if ( $opts['days'] > 0 ) {
$timestamp = wfTimestampNow();
- $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
+ $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $opts['days'] * 24 ) )->params(
$lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
}
- $cutofflinks = $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
+ $nondefaults = $opts->getChangedValues();
+ $cutofflinks = $this->cutoffLinks( $opts['days'], $nondefaults ) . "<br />\n";
# Spit out some control panel links
$filters = array(
'hidemyself' => 'rcshowhidemine',
'hidepatrolled' => 'rcshowhidepatr'
);
- foreach ( $this->customFilters as $key => $params ) {
+ foreach ( $this->getCustomFilters() as $key => $params ) {
$filters[$key] = $params['msg'];
}
// Disable some if needed
$links = array();
foreach ( $filters as $name => $msg ) {
- $links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
+ $links[] = $this->showHideLink( $nondefaults, $msg, $name, $opts[$name] );
}
$hiddenFields = $nondefaults;
unset( $hiddenFields['invert'] );
unset( $hiddenFields['associated'] );
+ # Create output
+ $form = '';
+
+ # Show watchlist header
+ $form .= "<p>";
+ $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
+ if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
+ $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
+ }
+ if ( $wgShowUpdatedMarker ) {
+ $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
+ }
+ $form .= "</p>";
+
+ if ( $wgShowUpdatedMarker ) {
+ $form .= Xml::openElement( 'form', array( 'method' => 'post',
+ 'action' => $this->getPageTitle()->getLocalURL(),
+ 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+ Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+ Html::hidden( 'reset', 'all' ) . "\n";
+ foreach ( $nondefaults as $key => $value ) {
+ $form .= Html::hidden( $key, $value ) . "\n";
+ }
+ $form .= Xml::closeElement( 'form' ) . "\n";
+ }
+
+ $form .= Xml::openElement( 'form', array(
+ 'method' => 'post',
+ 'action' => $this->getPageTitle()->getLocalURL(),
+ 'id' => 'mw-watchlist-form'
+ ) );
+ $form .= Xml::fieldset(
+ $this->msg( 'watchlist-options' )->text(),
+ false,
+ array( 'id' => 'mw-watchlist-options' )
+ );
+
+ $form .= SpecialRecentChanges::makeLegend( $this->getContext() );
+
# Namespace filter and put the whole form together.
$form .= $wlInfo;
$form .= $cutofflinks;
'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
'editwarning-warning' => 'Salir d\'esta páxina pue causar la perda de cualesquier cambiu fechu.
Si aniciasti sesión, pue desactivase esti avisu na seición "Edición" de les tos preferencies.',
+'editpage-notsupportedcontentformat-title' => 'El formatu del conteníu nun tien sofitu',
+'editpage-notsupportedcontentformat-text' => 'El formatu del conteníu, $1, nun tien sofitu del modelu de conteníu $2.',
# Content models
'content-model-wikitext' => 'testu wiki',
'invalid-content-data' => 'Imbalidong datos nin laman',
'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
'editwarning-warning' => 'Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa "Pagliliwat" na seksyon kan saimong mga kamuyahan.',
+'editpage-notsupportedcontentformat-title' => 'Kalamnan nin pormat bakong suportado',
+'editpage-notsupportedcontentformat-text' => 'An pormat nin kalamnan na $1 bakong suportado kan modelong kalamnan na $2.',
# Content models
'content-model-wikitext' => 'wiki-teksto',
'listfiles_description' => 'Цуьнах лаьцна',
'listfiles_count' => 'Верси',
'listfiles-show-all' => 'Гайта суьртийн шира версеш',
+'listfiles-latestversion-yes' => 'ХӀаъ',
# File description page
'file-anchor-link' => 'Файл',
'pageinfo-language' => 'АгӀона мотт',
'pageinfo-toolboxlink' => 'Агlонах болу бовзам',
'pageinfo-redirectsto-info' => 'Хаам',
+'pageinfo-contentpage-yes' => 'ХӀаъ',
'pageinfo-protect-cascading' => 'Чахчарин гӀоралла кхузара',
+'pageinfo-protect-cascading-yes' => 'ХӀаъ',
'pageinfo-protect-cascading-from' => 'Чахчарин гӀоралла тӀера',
'pageinfo-category-info' => 'Категорех лаьцна хаам',
'tags-description-header' => 'МаьӀнан дуьззина сурт хӀоттор',
'tags-active-header' => 'Жигара?',
'tags-hitcount-header' => 'Къастам бина нисдарш',
+'tags-active-yes' => 'ХӀаъ',
'tags-edit' => 'нисйé',
'tags-hitcount' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
'htmlform-submit' => 'ДӀадахьийта',
'htmlform-reset' => 'Цаоьшу хийцамаш',
'htmlform-selectorother-other' => 'Кхин',
+'htmlform-yes' => 'ХӀаъ',
# New logging system
'logentry-delete-delete' => '$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3',
# Special:ExpandTemplates
'expandtemplates' => 'Кепаш схьаястар',
+'expand_templates_intro' => 'ХӀокху белхан агӀорахь йиш ю йоза хийца.
+Кхин кепаш схьаяста.
+<code><nowiki>{{#language:…}}</nowiki></code> кхочуш дан тайп
+<code><nowiki>{{CURRENTDAY}}</nowiki></code>.',
+'expand_templates_title' => 'АгӀона {{FULLPAGENAME}} корта кхин а:',
+'expand_templates_input' => 'Чудолу йоза:',
'expand_templates_output' => 'Хилам',
'expand_templates_remove_comments' => 'ДӀаяха комментареш',
+'expand_templates_remove_nowiki' => 'ДӀайоху тегаш <nowiki> хилча',
+'expand_templates_generate_xml' => 'Гойту дитта цу XML',
'expand_templates_preview' => 'Хьалха муха ю хьажа',
);
*
* @author Chmee2
* @author Danny B.
+ * @author DemonioCZ
* @author Dontlietome7
* @author Geitost
* @author Helix84
'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
Přihlášení uživatelé si mohou toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
+'editpage-notsupportedcontentformat-title' => 'Nepodporovaný formát obsahu',
+'editpage-notsupportedcontentformat-text' => 'Model obsahu $2 nepodporuje formát obsahu $1.',
# Content models
'content-model-wikitext' => 'wikitext',
'version-parser-function-hooks' => 'Funkce parseru',
'version-hook-name' => 'Název přípojného bodu',
'version-hook-subscribedby' => 'Volán z',
-'version-version' => '(Verze $1)',
+'version-version' => '($1)',
'version-license' => 'Licence MediaWiki',
'version-ext-license' => 'Licence',
'version-ext-colheader-name' => 'Rozšíření',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriy}}',
-'category_header' => 'Perré ke kategori da "$1" de yé',
+'category_header' => 'Pelê ke kategoriya "$1" derê',
'subcategories' => 'Kategoriyê bınêni',
'category-media-header' => 'Dosyeyê ke kategoriya "$1" derê',
'category-empty' => "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
'broken-file-category' => 'Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'about' => 'Heqdé cı',
+'about' => 'Heqa cı de',
'article' => 'Wesiqe',
'newwindow' => '(pençereyê newey de beno a)',
'cancel' => 'Bıtexelne',
'pool-errorunknown' => 'Xeta nêzanıtiye',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => 'Heqdé {{SITENAME}}',
-'aboutpage' => 'Project:Heqdê cı',
+'aboutsite' => 'Heqa {{SITENAME}} de',
+'aboutpage' => 'Project:Heqa cı de',
'copyright' => 'Zerrekacı $1 bındı not biya.',
'copyrightpage' => '{{ns:project}}:Heqa telifi',
'currentevents' => 'Veng u vac',
'currentevents-url' => 'Project:Rocani hadisey',
-'disclaimers' => 'Reddiya mesuliyeti',
+'disclaimers' => 'Redê mesuliyeti',
'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
'edithelp' => 'Peştdariya vurnayışi',
'helppage' => 'Help:Zerrek',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) bıvênên',
'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
-'searchprofile-articles' => 'Perré muhteway',
+'searchprofile-articles' => 'Pelê tedeestey',
'searchprofile-project' => 'Pelê peşti û procey',
'searchprofile-images' => 'Multimedya',
'searchprofile-everything' => 'Heme çi',
-'searchprofile-advanced' => 'Ravérden',
+'searchprofile-advanced' => 'Raverşiyaye',
'searchprofile-articles-tooltip' => '$1 de cı geyré',
'searchprofile-project-tooltip' => '$1 de bigêre',
'searchprofile-images-tooltip' => 'Dosya cı geyr',
'deletecomment' => 'Sebeb:',
'deleteotherreason' => 'Sebebo bin:',
'deletereasonotherlist' => 'Sebebo bin',
-'deletereason-dropdown' => '*Sebebé esterıti
-** Spam
+'deletereason-dropdown' => '* Sebebê esterıtışê pêroyi
+** Vurnayışo nêwaşte (spam)
** Vandalizm
-** İhlala heqdé telifi
-** WaÅ\9ftıÅ\9fé nustoği
-** Xırab hetenayış',
+** İxlalê heqa telifi
+** WaÅ\9ftıÅ\9fê nuÅ\9ftoği
+** Oryantasyono xırabe',
'delete-edit-reasonlist' => 'Sebebê vurnayışan bıvurne',
'delete-toobig' => 'no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.
qey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.',
'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł.
Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku „Wobźěłaś“ swójich nastajenjow znjemóžniś.',
+'editpage-notsupportedcontentformat-title' => 'Wopśimjeśowy format se njepódpěra.',
+'editpage-notsupportedcontentformat-text' => 'Wopśimjeśowy format $1 njepódpěra se pśez wopśimjeśowy model $2.',
# Content models
'content-model-wikitext' => 'wikitekst',
'yourpassword' => 'Pasvorto:',
'userlogin-yourpassword' => 'Pasvorto',
'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
+'createacct-yourpassword-ph' => 'Tajpu pasvorton',
'yourpasswordagain' => 'Retajpu pasvorton',
'createacct-yourpasswordagain' => 'Konfirmu pasvorton',
+'createacct-yourpasswordagain-ph' => 'Retajpu pasvorton',
'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
'userlogin-remembermypassword' => 'Memoru mian ensaluton',
'userlogin-signwithsecure' => 'Uzu sekurigitan konekton',
* @author Remember the dot
* @author Remux
* @author Richard Wolf VI
+ * @author Salvador alc
* @author Sanbec
* @author Savh
* @author Shirayuki
'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
'editwarning-warning' => 'Si abandonas esta página perderás tus cambios.
Si estás identificado, puedes deshabilitar esta advertencia en la sección "Edición" de tus preferencias.',
+'editpage-notsupportedcontentformat-title' => 'Formato de contenido no admitido',
+'editpage-notsupportedcontentformat-text' => 'El formato de contenido $1 no es compatible con el modelo de contenido $2.',
# Content models
'content-model-wikitext' => 'texto wiki',
'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
'editwarning-warning' => 'خروج از این صفحه ممکن است باعث از دست رفتن هرچه نوشتهاید شود.
اگر شما با نام کاربری وارد شدهاید میتوانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
+'editpage-notsupportedcontentformat-title' => 'فرمت محتوا پشتیبانی نشده',
+'editpage-notsupportedcontentformat-text' => 'فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشدهاست.',
# Content models
'content-model-wikitext' => 'ویکیمتن',
Pour créer cette page, entrez votre texte dans la boîte ci-dessous (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d'aide]] pour plus d'informations).
Si vous êtes arrivé{{GENDER:||e|(e)}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
'anontalkpagetext' => "---- ''Vous êtes sur la page de discussion d'un utilisateur anonyme qui n'a pas encore créé de compte ou qui n'en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l'identifier. Une adresse IP peut être partagée par plusieurs utilisateurs. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:UserLogin/signup|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d'éviter toute confusion future avec d'autres contributeurs anonymes.''",
-'noarticletext' => 'Il n\'y a pour l\'instant aucun texte sur cette page.
+'noarticletext' => 'Il n’y a pour l’instant aucun texte sur cette page.
Vous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]
ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.',
'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
+'editpage-notsupportedcontentformat-title' => 'Detdiar formoot gongt ei.',
+'editpage-notsupportedcontentformat-text' => 'Det formoot $1 gongt ei mä det model $2.',
# Content models
'content-model-wikitext' => 'wikitekst',
'version-parser-function-hooks' => 'Parser function hooks',
'version-hook-name' => 'Hook nööm',
'version-hook-subscribedby' => 'Aprepen faan',
-'version-version' => '(Werjuun $1)',
+'version-version' => '($1)',
'version-license' => 'MediaWiki-lisens',
'version-ext-license' => 'Lisens',
'version-ext-colheader-name' => 'Ütjwidjang',
'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
'editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
+'editpage-notsupportedcontentformat-title' => 'סוג התוכן אינו נתמך',
+'editpage-notsupportedcontentformat-text' => 'תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.',
# Content models
'content-model-wikitext' => 'טקסט ויקי',
'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
'editwarning-warning' => 'Hdyž so strona wopušća, móža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
+'editpage-notsupportedcontentformat-title' => 'Wobsahowy format so njepodpěruje',
+'editpage-notsupportedcontentformat-text' => 'Wobsahowy format $1 so přez wobsahowy model $2 njepodpěruje.',
# Content models
'content-model-wikitext' => 'wikitekst',
Si le file ha essite modificate ab su stato original, es possibile que alcun detalios non reflecte completemente le file modificate.',
'metadata-expand' => 'Revelar detalios extense',
'metadata-collapse' => 'Celar detalios extense',
-'metadata-fields' => 'Le campos de metadatos de imagine listate in iste message essera includite in le visualisation del pagina de imagine quando le tabula de metadatos es plicate.
+'metadata-fields' => 'Le campos de metadatos de imagine listate in iste message essera includite in le visualisation del pagina de imagine quando le tabella de metadatos es plicate.
Le alteres essera initialmente celate.
* make
* model
'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
'editwarning-warning' => 'Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.
Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
+'editpage-notsupportedcontentformat-title' => 'Formato contenuto non supportato',
+'editpage-notsupportedcontentformat-text' => 'Il formato del contenuto $1 non è supportato dal modello di contenuto $2.',
# Content models
'content-model-wikitext' => 'wikitesto',
'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
'editwarning-warning' => 'このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。
ログインしている場合、個人設定の「編集」タブでこの警告を表示しないようにすることができます。',
+'editpage-notsupportedcontentformat-title' => '対応していないコンテンツ形式',
+'editpage-notsupportedcontentformat-text' => 'コンテンツ モデル $2 は、コンテンツ形式 $1 に対応していません。',
# Content models
'content-model-wikitext' => 'ウィキテキスト',
'pool-errorunknown' => 'Xeta nêzanıtiye',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => 'Heqdé {{SITENAME}}',
+'aboutsite' => 'Heqa {{SITENAME}} de',
'aboutpage' => 'Project:Heqa',
'copyright' => 'Zerrek bınê $1 dero.',
'copyrightpage' => '{{ns:project}}:Telifheqiye',
'rows' => 'Rêji:',
'columns' => 'Ustıni:',
'searchresultshead' => 'Cıcêre',
-'resultsperpage' => 'Pelgê be vênıtun:',
'stub-threshold' => 'Tertibê şêmıga <a href="#" class="stub">stub link</a> (\'\'bytes\'\'):',
'recentchangesdays' => 'Rozê ke vurnaisunê peyênun de asenê:',
'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|roze|roji}}',
# Recent changes linked
'recentchangeslinked' => 'Байлам тюрлениуле',
-'recentchangeslinked-feed' => 'Ð\91айламлÑ\8b Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ле',
+'recentchangeslinked-feed' => 'Байламлы тюрлениуле',
'recentchangeslinked-toolbox' => 'Байламлы тюрлендириуле',
'recentchangeslinked-title' => '$1 бет бла байламлы тюрлендириуле',
'recentchangeslinked-summary' => "Белгиленнген бет (неда белгиленнген категориягъа киргенле) джиберген бетледе джангы тюрлениулени тизмеси.
'mypage' => 'Hoja',
'mytalk' => 'Mi diskusyon',
'anontalk' => 'Diskusyón para este adresso de IP',
-'navigation' => 'Navigación',
+'navigation' => 'Navigasyon',
'and' => ' i',
# Cologne Blue skin
'vector-action-undelete' => 'Traer atrás',
'vector-action-unprotect' => 'Trocar proteksyon',
'vector-simplesearch-preference' => 'Aktivar barra de buskida simplifikada (solamente kon aspekto Vector)',
-'vector-view-create' => 'Criar',
+'vector-view-create' => 'Krear',
'vector-view-edit' => 'Trocar',
'vector-view-history' => 'Ver la istoria',
'vector-view-view' => 'Meldar',
'tagline' => 'De {{SITENAME}}',
'help' => 'Ayudo',
'search' => 'Buxcar',
-'searchbutton' => 'Buxcar',
+'searchbutton' => 'Bushkar',
'go' => 'Ir',
'searcharticle' => 'Ir',
'history' => 'La istoria de la hoja',
'print' => 'Imprimir',
'view' => 'Ver',
'edit' => 'Trocar',
-'create' => 'Criar',
+'create' => 'Krear',
'editthispage' => 'Trocar esta hoja',
'create-this-page' => 'Criar esta hoja',
-'delete' => 'Efaçar',
+'delete' => 'Efasar',
'deletethispage' => 'Efassar esta hoja',
'undeletethispage' => 'Restorar esta pajina',
'undelete_short' => 'Traer atrás $1 {{PLURAL:$1|trocamientos|trocamientos}}',
'viewcount' => 'Este pajina fue vijitado {{PLURAL:$1|una vez|$1 vezes}}.',
'protectedpage' => 'Hoja guardada',
'jumpto' => 'Saltar a:',
-'jumptonavigation' => 'navigación',
-'jumptosearch' => 'Buxcar',
+'jumptonavigation' => 'navigasyon',
+'jumptosearch' => 'bushkar',
'view-pool-error' => 'Diskulpe, los servidores estan sovrekargado en est momento.
Ay demaziado usuarios estan aprovando a ver esta pajina.
Aspera un momento antes de aprovar esta pajina de muevo.
'feed-invalid' => 'Tipo de kanal de subskripsyon es invalido.',
'feed-unavailable' => 'Kanales de subskripsyon no estan disponibles',
'site-rss-feed' => 'Fuente de RSS de $1',
-'site-atom-feed' => 'Alimentela de Atom de $1',
+'site-atom-feed' => 'Kanal Atom de $1',
'page-rss-feed' => '"$1" Fuente RSS',
'page-atom-feed' => '"$1" Subscripción Atom',
'red-link-title' => '$1 (la hoja no egziste)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Hoja',
-'nstab-user' => 'Hoja de kullaneador',
+'nstab-user' => 'Pajina de usuario',
'nstab-media' => 'Hoja de Meddia',
'nstab-special' => 'Hoja especial',
'nstab-project' => 'Hoja del proyecto',
-'nstab-image' => 'Dosya',
+'nstab-image' => 'Archivo',
'nstab-mediawiki' => 'Messaj',
'nstab-template' => 'Şablón',
'nstab-help' => 'Ayudo',
'databaseerror-function' => 'Fonksyon: $1',
'databaseerror-error' => 'Yerro: $1',
'laggedslavemode' => "'''Aviso:''' Puede ke la pajina no kontiene las aktualizasyones mas resientes.",
-'missing-article' => 'La basa de dados no topó el teksto de la hoja llamada "$1" $2.
+'readonly' => 'Base de datos blokeada',
+'enterlockreason' => 'Eskrive un razon por el blokeo,incluyendo un estimasyon de kuando libera el blokeo',
+'readonlytext' => 'La base de datos esta blokeada a muevas entradas i otras modifikasyones,probablemente para mantenemento rutinas, Kuando akava se enkontra dispozible.
-En lo mas muncho, esto se cavsa de un "dif" anakróniko ou de un atamiento a la istoria de una hoja que se efaçó.
+El administrador ke blokeo dio esta esplikasyon: $1',
+'missing-article' => 'La base de datos no topó el teksto de una pajina ke se debe topar, llamada "$1" $2.
-Si esto no es el cavso, puede ser que topates una chincha en el lojikal.
-Si puede ser mete un [[Especial:ListaUsadores/sysop|administrador]] en corriente y también anota la URL.',
+Jeneralmente, esto se cavsa de un "dif" anakróniko o de una enlase de la istoria de una pajina que se efaso.
+
+Si esto no es el cavso, puede ser que topates un yerro en la programa.
+Si puede avisar [[Special:ListUsers/sysop|administrador]], anotando la URL.',
'missingarticle-rev' => '(nº. de revisión: $1)',
'missingarticle-diff' => '(Dif.: $1, $2)',
+'readonly_lag' => 'La base de datos se a blokeado mientres los servidores se sinkronizan',
+'internalerror' => 'Yerro enterno',
+'internalerror_info' => 'Yerro enterno: $1',
+'fileappenderrorread' => 'No se pudo meldar "$1" durante enkashyon.',
+'fileappenderror' => 'No se pudo enkashar "$1" a "$2".',
'filecopyerror' => 'No se pudo copiar el arxiv "$1" a "$2".',
+'filerenameerror' => 'No se pudo renombrar archivo "$1" a "$2".',
+'filedeleteerror' => 'No se pudo efasar archivo "$1".',
+'directorycreateerror' => 'No se pudo krear direktorio "$1".',
+'filenotfound' => 'No se pudo topar archivo "$1".',
+'fileexistserror' => 'No se pudo eskrivir al archivo "$1": Archivo ya egziste.',
+'unexpected' => 'Valor enasperado: "$1"="$2".',
+'formerror' => 'Yerro: No se pudo embiar fomulario.',
+'badarticleerror' => 'No se puede azer esta aksyon en este pajina.',
+'cannotdelete' => 'No pudo efasar esta pajina o archivo "$1".
+Puede ser ke ya a efasado otra persona.',
+'cannotdelete-title' => 'No se puede efasar pajina "$1"',
+'delete-hook-aborted' => 'Efasyon fue anulado por "hook".',
+'no-null-revision' => 'No pudo krear la mueva revizyon nula para la pajina "$1"',
'badtitle' => 'Titolo negro',
'badtitletext' => 'El título de la hoja demandada está vazío, no es valible, o es un link interlingua o interwiki incorrecto.
Puede ser que contiene uno o más caracteres que no se pueden usar en los títulos.',
+'perfcached' => 'Los sigiente datos se enkontra en el cache i puede ser ke no esta aktualizada. Un maksimo de {{PLURAL:$1|un resultado esta|$1 resultados estan}} enkontrado en el cache.',
+'perfcachedts' => 'Los sigiente datos se enkontra en el cache, i fue aktualizado $1. Un maksimo de {{PLURAL:$4|un resultado esta|$1 resultados estan}} enkontrado en el cache.',
+'querypage-no-updates' => 'Las aktualizasyones de esta pajina esta desaktivado.
+Las datos no va aktualizar agora.',
'viewsource' => 'Ver su manadero',
'viewsource-title' => 'Ver la fuente de $1',
'actionthrottled' => 'Aksyon limitada',
+'actionthrottledtext' => 'Komo prekosyon kontra el spam, ay un limite de kuanto vezes puede azer este aksyon en poko tiempo, i sovrepasaste este limite.
+Aprovar de muevo en unos minutos.',
+'protectedpagetext' => 'La pajina esta guardado kontra esdisyones i otras aksyones.',
+'viewsourcetext' => 'Puede ver i kopiar la fuente de este pajina:',
+'viewyourtext' => 'Puede ver i kopiar la fuente de "tus edisyones" a esta pajina:',
+'protectedinterface' => 'Esta pajina abastese teksto de la interfaz para la programa de este viki, i es guardado para empedir abuso.
+Para anyadir o kambiar traduksyones para todos los vikis, uza [//translatewiki.net/translatewiki.net], el projecto de lokalizasyon de MediaWiki.',
+'editinginterface' => "'''Aviso:''' Estas editando una pajina uzada para abasteser teksto de la interfaz para la programa.
+Kambios a esta pajina afectara la aparesemiento de la interfaz de usuario para los otros usuarios en este viki.
+Para anyadir o kambiar traduksyones para todos los vikis, uza [//translatewiki.net/translatewiki.net], el projecto de lokalizasyon de MediaWiki.",
# Virus scanner
'virus-unknownscanner' => 'antivirus deskonosido:',
'userlogin-yourname' => 'Nombre de usuario',
'userlogin-yourname-ph' => 'Eskrive tu nombre de usuario',
'createacct-another-username-ph' => 'Eskrive el nombre de usuario',
-'yourpassword' => 'Parola',
+'yourpassword' => 'Kontrasenya:',
'userlogin-yourpassword' => 'Kontrasenya',
'userlogin-yourpassword-ph' => 'Eskriva tu kontrasenya',
'createacct-yourpassword-ph' => 'Eskriva una kontrasenya',
-'yourpasswordagain' => 'Entra de muevo la parola',
+'yourpasswordagain' => 'Entra de muevo la kontrasenya',
'createacct-yourpasswordagain' => 'Konfirme contrasenya',
'createacct-yourpasswordagain-ph' => 'Eskrive la kontrasenya de muevo',
'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
'yourdomainname' => 'Tu dominyo:',
'password-change-forbidden' => 'No se puede kambiar contrasenyas en este viki.',
'login' => 'Entrar',
-'nav-login-createaccount' => 'Entrar / Criar un cuento',
+'nav-login-createaccount' => 'Entrar / krear un kuento',
'loginprompt' => 'Kale tener "cookies" aktivadas enel navegador para enrejistrarse en {{SITENAME}}',
'userlogin' => 'Entrar / Registrarse',
'logout' => 'Salir',
'userlogin-noaccount' => 'No tiene un kuento?',
'userlogin-joinproject' => 'Abonar {{SITENAME}}',
'nologin' => "¿No tienes un cuento? '''$1'''.",
-'nologinlink' => 'Crea un cuento',
-'createaccount' => 'Crea un nuevo cuento',
+'nologinlink' => 'Krear un kuento',
+'createaccount' => 'Krear un kuento',
'gotaccount' => "¿Ya tienes un cuento? '''$1'''.",
'gotaccountlink' => 'Entrar',
'userlogin-resetlink' => 'Olvidates tus detalyos de akseso?',
'createacct-emailoptional' => 'Korreo elektroniko (opsyonal)',
'createacct-email-ph' => 'Eskrive tu adreso de korreo elektroniko',
'createacct-another-email-ph' => 'Eskrive el adreso de korreo elektronico',
-'createaccountmail' => 'por una letra electrónica',
+'createaccountmail' => 'Uzar una contrasenya temporal y embiarla al korreo elektronico espesificado',
'createacct-realname' => 'Nombre verdadero (opsyonal)',
'createaccountreason' => 'Razon:',
'createacct-reason' => 'Razon',
'passwordreset-username' => 'Nombre de usador:',
'passwordreset-domain' => 'Dominio:',
'passwordreset-email' => 'Adresso de letral:',
+'passwordreset-emailelement' => 'Usuario: $1
+Kontrasenya temporal: $2',
# Special:ChangeEmail
'changeemail' => 'Kambiar adreso de korreo elektroniko',
'nowiki_sample' => 'Escribid aquí texto sin formato',
'nowiki_tip' => 'Iñorar el formato wiki',
'image_tip' => 'Imagen incorporada',
-'media_tip' => 'Atamiento de dosya',
+'media_tip' => 'Enlase de archivo',
'sig_tip' => 'Firma, data i ora',
'hr_tip' => 'Liña orizontala (úsala de vez en cuando)',
'loginreqlink' => 'entrar',
'loginreqpagetext' => 'Tienes que $1 para pueder ver otras hojas.',
'accmailtitle' => 'La kontrasenya ha sido embiada.',
-'accmailtext' => 'La kontrasenya para "$1" se ha embiado a $2.',
+'accmailtext' => "Se a embiado a $2 una kontrasenya jenerado por [[User talk:$1|$1]]. Se puede kambiar en la pajina ''[[Special:ChangePassword|cambiar kontrasenya]]'' al entrar.",
'newarticle' => '(Muevo)',
'newarticletext' => 'Arrivates a una hoja que daínda no egziste.
Para crear esta hoja, empeça a escribir en la caxa de abaxo. Mira [[{{MediaWiki:Helppage}}|la hoja de ayudo]] para saber más.
'histlegend' => "Selección de diferencias: marca los selectores de las versiones a comparar y pulsa ''enter'' o el botón de abajo.<br />
Leyenda: (act) = diferencias con la versión actual,
(prev) = diferencias con la versión previa, M = edición menor",
-'history-fieldset-title' => 'Buscar en la istoria',
+'history-fieldset-title' => 'Navegar en la istoria',
'history-show-deleted' => 'Sólamente efassado',
'histfirst' => 'Lo mas antiko',
'histlast' => 'Lo mas muevo',
'diff-multi' => '(No {{PLURAL:$1|es amostrado un trokamiento intermedio echo|son amostrados $1 trokamientos intermedios echos}} por {{PLURAL:$2|un usador|$2 usadores}})',
# Search results
-'searchresults' => 'Resultados de la búsquida',
-'searchresults-title' => 'Resultados de la búsquida de «$1»',
+'searchresults' => 'Resultados de la bushkida',
+'searchresults-title' => 'Resultados de la bushkida de «$1»',
'notextmatches' => 'No se pudo topar en dinguna hoja.',
'prevn' => '{{PLURAL:$1|$1}} de antes',
'nextn' => '{{PLURAL:$1|$1}} venideras',
# Preferences page
'preferences' => 'Preferencias',
'mypreferences' => 'Las mis preferensias',
+'prefs-edits' => 'Numero de edisyones:',
'prefs-skin' => 'Vista',
'skin-preview' => 'Previstear',
'prefs-datetime' => 'Data i ora',
'gender-male' => 'El redakto pajinas de viki',
'gender-female' => 'Eya redakto pajinas de viki',
'email' => 'Korreo elektroniko',
-'prefs-help-email' => 'El adreso de e-posta es menester para alimpiar la tu parola, si la olvidates',
+'prefs-help-email' => 'El adreso de korreo elektroniko es opsional, ma es menester para alimpiar la tu kontrasenya, si la olvidates',
'prefs-help-email-others' => 'Endemas puedes eskojer si keres dar pueder a otros usadores de azer kontakto kon ti por modre de e-posta, a traverso de un atamiento en tus ojas de usador i de diskusyon.',
'prefs-help-email-required' => 'Se nesesita adreso de korreo elektroniko.',
'prefs-info' => 'Informasyon basiko',
'rclinks' => 'Ver los dal cavo $1 trocamientos en los dal cavo $2 días.<br />$3',
'diff' => 'dif',
'hist' => 'ist',
-'hide' => 'Esconder',
+'hide' => 'Eskonder',
'show' => 'Amostrar',
'minoreditletter' => 'ch',
'newpageletter' => 'N',
'recentchangeslinked-to' => 'Amostra los trocamientos freskos en lugar de la hoja indicada',
# Upload
-'upload' => 'Suvir una dosya',
+'upload' => 'Suvir un archivo',
'uploadlogpage' => 'Subidas de arxivos',
'filename' => 'Nombre de archivo',
'filedesc' => 'Somario',
'listfiles-latestversion-no' => 'No',
# File description page
-'file-anchor-link' => 'Dosya',
+'file-anchor-link' => 'Archivo',
'filehist' => 'La istoria de la dosya',
'filehist-help' => 'Klika encima de una data/ora para vel la dosya desta data.',
'filehist-revert' => 'aboltar',
'filehist-thumb' => 'Minyatura',
'filehist-thumbtext' => 'Minyatura de la versión á las $1',
'filehist-nothumb' => 'Sin minyatura',
-'filehist-user' => 'Kullaneador',
+'filehist-user' => 'Usuario',
'filehist-dimensions' => 'Dimensiones',
'filehist-filesize' => 'El boy de la dosya',
'filehist-comment' => 'Comentario',
'statistics' => 'Estatísticas',
'statistics-articles' => 'Pajinas de kontenido',
'statistics-pages' => 'Pajinas',
+'statistics-users-active' => 'Usuarios aktivos',
'pageswithprop-submit' => 'Ir',
+'doubleredirects' => 'Redireksyones dobles',
+
'brokenredirects-edit' => 'trocar',
+'brokenredirects-delete' => 'efasar',
+'withoutinterwiki' => 'Pajinas sin enlases de lenguas',
'withoutinterwiki-submit' => 'Amostrar',
# Miscellaneous special pages
'watchlist' => 'Lista de akavidamiento',
'mywatchlist' => 'Mi lista de akavidamientos',
'watchlistfor2' => 'Para $1 $2',
-'addedwatchtext' => "La hoja «[[:$1]]» fue ajustada a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta hoja i en tu hoja de diskussión associada se van indicar aí, i la hoja va aparecer '''gordo''' en la hoja de [[Special:RecentChanges|trocamientos freskos]] para hazerla más kolay de detektar.
-
-Cuando queres eliminar la hoja de tu lista de escogidas, piza «Dexar de cudiar» en el menú.",
+'addedwatchtext' => 'La pajina "[[:$1]]" fue anyadido a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta pajina i en tu pajina de diskusyon assosiada va apareser ayi.',
'removedwatchtext' => 'La hoja «[[:$1]]» fue eliminada de tu [[Special:Watchlist|lista de escogidas]].',
'watch' => 'cudiar',
'watchthispage' => 'Cudia esta hoja',
'deletecomment' => 'Razón:',
'deleteotherreason' => 'Otra razon/razon adisiyonal:',
'deletereasonotherlist' => 'Otra razón',
-'deletereason-dropdown' => '* Motivos generales de efassamientos
-** La demanda del criador de la hoja
-** Violación de copyright
-** Vandalismo',
+'deletereason-dropdown' => '* Razones komunes de efassamientos
+** Spam
+** Vandalismo
+** Violasyon del derecho de otor
+** Demande del otor mizmo
+** Redireksyon rota',
# Rollback
'rollbacklink' => 'aboltar',
A continuación se mostran las opciones actuales de la hoja '''$1''':",
'protect-cascadeon' => 'Esta hoja está guardada en momento porque está incluida en {{PLURAL:$1|la hoja venidera|las hojas venideras}}, que tienen activada la opción de protección en grados. Puedes trocar el nivel de protección de esta hoja, ma no va afectar a la protección en grados.',
'protect-default' => 'Permitir todos los usuarios',
-'protect-fallback' => 'Tiene menester del permiso «$1»',
-'protect-level-autoconfirmed' => 'Bloquear usuarios nuevos y no registrados',
-'protect-level-sysop' => 'Sólo administradores',
+'protect-fallback' => 'Solo permitir usuarios kon permiso "$1"',
+'protect-level-autoconfirmed' => 'Solo permitir usuarios otokonfirmados',
+'protect-level-sysop' => 'Solo permitir administradores',
'protect-summary-cascade' => 'con grados',
'protect-expiring' => 'caduca el $1 (UTC)',
'protect-cascade' => 'Protección en cascada - guardar todas las hojas incluidas en ésta.',
'nolinkshere' => "Dinguna ója tiene atamientos kon '''[[:$1]]'''",
'isredirect' => 'Hoja redirigida',
'istemplate' => 'inclusión',
-'isimage' => 'Atamiento de la dossia',
+'isimage' => 'enlase de archivo',
'whatlinkshere-prev' => '{{PLURAL:$1|de antes|de antes $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|venidera|venideras $1}}',
-'whatlinkshere-links' => '← linkes',
+'whatlinkshere-links' => '← enlases',
'whatlinkshere-hideredirs' => '$1 redirecciones',
'whatlinkshere-hidetrans' => '$1 inclusiones',
-'whatlinkshere-hidelinks' => '$1 linkes',
+'whatlinkshere-hidelinks' => '$1 enlases',
'whatlinkshere-hideimages' => '$1 atamientos a imejes',
'whatlinkshere-filters' => 'Filtres',
'ipadressorusername' => 'Adreso de IP o nombre de usuario:',
'ipbreason' => 'Razon:',
'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 anyo:1 year,para siempre:infinite',
-'ipblocklist' => 'Usadores bloqueados',
+'badipaddress' => 'Adreso de IP invalido',
+'ipblocklist' => 'Usuarios blokeados',
'blocklist-reason' => 'Razon',
'ipblocklist-submit' => 'Bushkar',
'infiniteblock' => 'para siempre',
'blocklogpage' => 'Bloqueos de usuarios',
'blocklogentry' => 'bloqueó a [[$1]] $3 durante un tiempo de $2',
'unblocklogentry' => 'desbloqueó a "$1"',
-'block-log-flags-nocreate' => 'desactivada la creación de cuentos',
+'block-log-flags-nocreate' => 'desactivada la kreasyon de kuentos',
'block-log-flags-hiddenname' => 'nombre de usuario eskondido',
# Developer tools
'lockedbyandtime' => '(por {{GENDER:$1|$1}} el $2 a la $3)',
# Move page
-'movepagetext' => "Usando el formulario venidero se va renombrar una hoja, quitando todo su istoria a su nuevo nombre.
-El título de antes se va convertir en una redirección al nuevo título.
-Los linkes al antiguo título de la hoja no se van trocar.
-Asegúrate de no dexar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].
-Tú sos responsable de aranjjar los linkes de manera menesterosa.
-
-Acórdate que la hoja '''no''' va ser renombrada si ya egziste una hoja con esta nuevo título, a no ser que sea una hoja vazía o una redirección sin istoria.
-Esto siñifica que vas pueder renombrar una hoja a su título original si hazes un yerro, ma que no vas pueder sobrescribir una hoja que ya existe.
-
-'''¡Atansión!'''
-Este puede ser un trocamiento muy muy emportante e inesperado para una hoja popular;
-si puede ser, asegúrate de entender las resultados del lo que hazes antes de yir endelantre.",
+'movepagetext' => "Uzando el sigiente formulario va renombrar una pajina, kitando todo su istoria a su nuevo nombre.
+El titulo orijinal se va convertir en una redireksyon al muevo titulo.
+Puede aktualizar otomatikamente las redireksyones al titulo orijinal.
+Si eskoje no azerlo, asegurate de verifikar ke no ay [[Special:DoubleRedirects|redireksyones dobles]] o [[Special:BrokenRedirects|rotas]].
+Tú sos responsable de asegurar ke los enlases funksyonan korrectamente.
+
+Nota ke la pajina '''no''' va ser renombrada si ya egziste una hoja con esta muevo título, a no ser que sea una redireksyon sin istoria.
+Esto sinyifica que vas pueder renombrar una pajina a su titulo orijinal si hazes un yerro, ma que no vas pueder sobreskrivir una pajina que ya existe.
+
+'''Aviso!'''
+Este puede ser un trocamiento muy muy emportante e inesperado para una pajina popular;
+asegurate de entender las resultados del lo que azes antes de ir endelantre.",
'movepagetalktext' => "La hoja de diskussión associada, si egziste, va ser renombrada otomáticamente '''a menos que:'''
*Esté renombrando la hoja entre espacios de nombres diferentes,
*Una hoja de diskussión no vazía ya egziste con el nombre nuevo, o
# Thumbnails
'thumbnail-more' => 'Engrandece',
-'thumbnail_error' => 'Yerro kriando la imej chika: $1',
+'thumbnail_error' => 'Yerro kriando la minyatura: $1',
# Special:Import
'import-interwiki-submit' => 'Importar',
'importnopages' => 'No ay pajinas para importar.',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tu hoja de kullaneador',
+'tooltip-pt-userpage' => 'Tu pajina de usuario',
'tooltip-pt-mytalk' => 'Tu hoja de diskusyón',
'tooltip-pt-preferences' => 'Mis preferencias',
'tooltip-pt-watchlist' => 'La lista de los trocamientos acontècidos en las hojas akavidadas.',
'tooltip-ca-delete' => 'Efassar esta hoja',
'tooltip-ca-move' => 'Taxirea (renombra) esta hoja',
'tooltip-ca-watch' => 'Ajustar esta hoja a tu lista de akavidamientos',
-'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de escogidos',
-'tooltip-search' => 'Buxcar en {{SITENAME}}',
-'tooltip-search-go' => 'Si ay una hoja con este nombre egzakto, vate allá.',
+'tooltip-ca-unwatch' => 'Kita esta pajina de tu lista de escogidos',
+'tooltip-search' => 'Bushka en {{SITENAME}}',
+'tooltip-search-go' => 'Ir a la pajina con este nombre egzakto, si egziste.',
'tooltip-search-fulltext' => 'Buxca este teksto en las hojas',
'tooltip-p-logo' => 'Vate a la primera hoja',
-'tooltip-n-mainpage' => 'Vate a la primera hoja',
-'tooltip-n-mainpage-description' => 'Vate a la primera hoja',
+'tooltip-n-mainpage' => 'Vijitar a la primera hoja',
+'tooltip-n-mainpage-description' => 'Vijitar a la primera hoja',
'tooltip-n-portal' => 'Encima del projeto, lo que puedes hazer y ánde topar todo',
'tooltip-n-currentevents' => 'Jhaberes y acontècimientos de oy día',
'tooltip-n-recentchanges' => 'Lista de los trocamientos muevos en el viki',
'tooltip-feed-atom' => "Fuente de Atom d'esta hoja",
'tooltip-t-contributions' => 'Ver la lista de ajustamientos de este usuario',
'tooltip-t-emailuser' => 'A este usuario, mándale una letra electrόnica (ímey)',
-'tooltip-t-upload' => 'Suve las dosyas por aquí',
+'tooltip-t-upload' => 'Suvir un archivo',
'tooltip-t-specialpages' => 'Lista de todas las hojas especiales',
'tooltip-t-print' => 'Forma apropiada para imprimir esta hoja',
'tooltip-t-permalink' => 'Atamiento permanente a este enderechamiento de la hoja',
'tooltip-ca-nstab-main' => 'Ve el artíkolo de contènido',
-'tooltip-ca-nstab-user' => 'Ve la hoja de usuario',
+'tooltip-ca-nstab-user' => 'Ver la pajina de usuario',
'tooltip-ca-nstab-special' => 'Esta es una hoja especial, la hoja ya no se puede trocar',
'tooltip-ca-nstab-project' => 'Ver la hoja del prodjekto',
'tooltip-ca-nstab-image' => 'Ver la hoja de la dosya',
'confirmemail' => 'Konfirmar adreso de korreo elektronika',
'confirmemail_send' => 'Embiar el kodigo de konfirmasion.',
'confirmemail_sent' => 'Konfirmasion de pósta embiada.',
-'confirmemail_success' => 'Su adreso de korreo elektronika a sido konfirmada. Agóra puedes registrarse e kolaborar en el wiki.',
+'confirmemail_success' => 'Su adreso de korreo elektronika a sido konfirmada. Agóra puedes [[Special:UserLogin|entrar]] e kolaborar en el wiki.',
# Delete conflict
'recreate' => 'Krear de muevo',
'htmlform-yes' => 'Si',
# New logging system
-'logentry-newusers-autocreate' => 'El cuento $1 fue crîado otomatika mente',
+'logentry-newusers-autocreate' => 'El cuento de usuario $1 fue {{GENDER:$2|kreado}} otomatikamente',
'rightsnone' => '(dinguno)',
# Feedback
'aboutsite' => 'دباره {{SITENAME}}',
'aboutpage' => 'پروجه:دباره',
'copyright' => 'محتوا د دسرس هئ سی $1 مر وه شلک هنی نوشته بوئه',
-'copyrightpage' => '{{ns:پروجه}}:کپی رایت',
+'copyrightpage' => '{{ان اس:پروجه}}:کپی رایت',
'currentevents' => 'پيشومدل تازه باو',
'currentevents-url' => 'پروجه:پيشومدل تازه باو',
'disclaimers' => 'منكرون',
'sectioneditnotsupported-title' => 'ویرایشت بخش حمایت نبوئه',
'sectioneditnotsupported-text' => 'ویرایشت بشقی د ای بلگه نئیش.',
'permissionserrors' => 'خطا اجازه دئین',
+'permissionserrorstext' => 'شما حق ناریت ونه انجوم بیئت, سی{{جمی:$1|دلیل|دلیلیا}} نهایی:',
'permissionserrorstext-withaction' => 'شما سی $2 اجازه ناریت
سی دمال کردن{{PLURAL:$1|reason|reasons}}:',
'recreate-moveddeleted-warn' => "'''زنهار شما بلگه ای که وادما پاک بیه هنی راس کردیته'''
پاک بین و جمشت ای بلگه سی سرچشمه دئین فراهم بیه',
'edit-conflict' => 'مخالفت نه ویرایشت بکید',
'postedit-confirmation' => 'ویرایشتتو ذخیره بی',
+'edit-already-exists' => 'نبوئه یه گل بلگه تازه راس بکید.
+وه هئیش.',
'defaultmessagetext' => 'متن پیغوم پیش فرض',
+'content-failed-to-parse' => 'د یک تیچیسن چیا مئن $2 د مدل $1:$3',
# Content models
'content-model-wikitext' => 'ويكی متن',
# History pages
'viewpagelogs' => 'سی ای بلگه بوینتو.',
+'nohistory' => 'هیچ ویرگار ویرایشتی د ای بلگه نئ.',
'currentrev' => 'آخرین دوواره دیئن',
'currentrev-asof' => 'آخرين دووار ديئن چی $1',
'revisionasof' => 'دوواره ديئن $1',
'mergehistory' => 'ویرگاریا بلگه نه یکی بکید',
'mergehistory-from' => 'بلگه سرچشمه:',
'mergehistory-into' => 'بلگه مقصد:',
+'mergehistory-no-source' => 'سرچشمه بلگه $1 وجود ناره.',
'mergehistory-autocomment' => ' [[:$1]]وا[[:$2]] یکی بیه',
'mergehistory-comment' => ' [[:$1]]وا[[:$2]] یکی بیه:$3',
'mergehistory-reason' => 'دليل:',
'nextn' => 'نيايی {{PLURAL:$1|$1}}',
'prevn-title' => 'پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}',
'nextn-title' => 'نيايی $1 {{PLURAL:$1|نتيجه|نتيجيا}}',
-'shown-title' => 'نشون دئن $1 {{PLURAL:$1|نتيجه|نتيجه}} سی هر بلگه',
+'shown-title' => 'نشون دئن $1 {{جمی:$1|نتيجه|نتيجه}} سی هر بلگه',
'viewprevnext' => 'ديئن ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''ایچه بلگه ای هئ وه نوم\"[[:\$1]]\" که ها د ای ویکی'''",
'searchmenu-new' => "'''ای بلگه نه راس كو \"[[:\$1]]\" د ای ويكي!'''",
'searchprofile-images-tooltip' => 'بگرد سی فايليا',
'searchprofile-everything-tooltip' => 'همه محتوا نه پی جوری كو (شاملا بلگيا چك چنه)',
'searchprofile-advanced-tooltip' => 'نوم جايا نوم ديار بگرد',
-'search-result-size' => '$1 ({{PLURAL:$2|بی واچه يل|واچه تكی|واچه يل|$2 واچه يل|$2 واچه}})',
+'search-result-size' => '$1 ({{جمی:$2|بی واچه يل|واچه تكی|واچه يل|$2 واچه يل|$2 واچه}})',
'search-result-category-size' => '{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 فایل|$3 فایلیا}}',
'search-redirect' => '(ورگشتن $1)',
'search-section' => '(بشق $1)',
'prefs-rc' => 'آلشتیا تازه باو',
'prefs-watchlist' => 'سیل برگ',
'prefs-watchlist-days' => 'روزیا نه د سیل برگ نشو دئه بو:',
+'prefs-watchlist-edits-max' => 'فره تری شماره:1000',
'prefs-misc' => 'شيوسن',
'prefs-resetpass' => 'پاسورد نه آلشت بكيت',
'prefs-changeemail' => 'نشونی ایمیل تو نه آلشت بکید',
'searchresultshead' => 'پی جوری',
'stub-threshold-disabled' => 'د كار ونن',
'recentchangesdays' => 'روزیا آلشتیا تازه باو نه نشو بیه:',
+'recentchangesdays-max' => 'فره ترین $1 {{جمی:$1|روز|روزیا}}',
'savedprefs' => 'ویجه گیا هنی تو ذخیره بیه.',
'timezonelegend' => 'وخت راساگه',
'localtime' => 'وخت ولاتی:',
'action-importupload' => 'بلگه یا نه د فایل سوار بیه وارد بکید',
'action-siteadmin' => 'پاگا دونسمنی نه قلف بکید یا نکید',
'action-sendemail' => 'ایمیلیانه کل کو',
+'action-editmywatchlist' => 'سیل برگ خوتونه ویرایشت بکید',
'action-viewmywatchlist' => 'سیل برگ خوتونه بوینیت',
'action-viewmyprivateinfo' => 'دونسمنیا خوتونه بوینیت',
'action-editmyprivateinfo' => 'دونسمنیا شصقی خوتونه ویرایشت بکید',
'recentchanges-label-minor' => 'يه ويرايشت كؤچكيه',
'recentchanges-label-bot' => 'ای ويرايشت نه يه بوت انجوم ديئه',
'recentchanges-label-unpatrolled' => 'ای ويرايشت هنی تيه واداشت نبيه',
+'recentchanges-legend-newpage' => '(همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])',
'rcnotefrom' => 'د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)',
'rclistfrom' => 'آلشتیا تازه ایی که وا $1 شرو بیه نشونش بئه',
'rcshowhideminor' => 'ويرايشتيا کؤچک $1',
'minoreditletter' => 'م',
'newpageletter' => 'ن',
'boteditletter' => 'ب',
+'number_of_watching_users_pageview' => '[$1 دینه {{جمی:$1|کارور|کاروریا}}]',
'rc_categories' => 'دسه یا نه محدود کو(وا "|" جگا بوئن',
'rc_categories_any' => 'هرکوم',
'rc-change-size-new' => '$1 {{جمی:$1|بایت|بایتیا}} نها آلشت',
'upload' => 'بلم گير كردن فايلا',
'uploadbtn' => 'سوار کردن فایل',
'uploadnologin' => 'وارد نبیه',
+'uploadnologintext' => 'لطفن $1 سی سوارکرد فایلیا.',
'uploaderror' => 'خطا د سوار کردن',
'uploadlogpage' => 'سوارکرد',
'filename' => 'نوم فایل',
'filedesc' => 'چكسته',
'fileuploadsummary' => 'چکسه',
'filesource' => 'سرچشمه:',
+'uploadedfiles' => 'فایلیا سواربیه',
+'unknown-error' => 'یه گل خطا ناشناس ری ون کرده.',
+'savefile' => 'فایل نه ذخیره کو',
'uploadedimage' => 'سوارکرد"[[$1]]"',
'upload-source' => 'سرچشمه فایل',
+'sourcefilename' => 'سرچشمه نوم فایل:',
+'sourceurl' => 'سرچشمه يو آر ال:',
+'watchthisupload' => 'ای فایل بوینیت',
+'upload-success-subj' => 'سوار کرد خوش سرانجوم',
+'upload-failure-subj' => 'مشگل د سوارکردن',
+
+'upload-file-error' => 'خطا داخلی',
+'upload-unknown-size' => 'انازه نادیار',
# img_auth script messages
'img-auth-accessdenied' => 'دسرسی منع بی',
+'img-auth-nofile' => 'فایل $1 وجود ناره.',
+
+# HTTP errors
+'http-invalid-url' => 'یو آر ال نامعتور:$1',
+'http-read-error' => 'خطا د حنن اچ تی تی پی.',
'license' => 'ليانس دار بيئن',
'license-header' => 'د شكل ليسانس دار بيئن',
'nolinkstoimage' => 'ایچه هیژ بلگه ای سی هوم پیوند بیئن وا ای فایل نی',
'sharedupload-desc-here' => 'فایلی که د $1 شایت د مئن پروجیا هنی استفاده بیه.
توضی دباره[$2 file description page] د هار نشو دئئه بیه',
+'shared-repo-from' => 'د $1',
+
+# File reversion
+'filerevert-comment' => 'دليل:',
+'filerevert-submit' => 'ورگنین',
# File deletion
'filedelete-comment' => 'دليل:',
'filedelete-submit' => 'پاك كردن',
+'filedelete-nofile' => "'''$1''' وجود ناره.",
+'filedelete-reason-otherlist' => 'دليل هنی',
+'filedelete-edit-reasonlist' => 'دلیلیا پاک کردنه نه ویرایشت بکید',
# MIME search
'download' => 'گرتن',
# Statistics
'statistics' => 'آماريا',
+'statistics-header-pages' => 'بلگه آماریا',
+'statistics-header-edits' => 'آماریا نه ویرایشت بکید',
+'statistics-header-views' => 'آماریا نه بوینیت',
'statistics-pages' => 'بلگیا',
'statistics-users-active' => 'کاروریا کارکو',
'withoutinterwiki-submit' => 'نشون دائن',
# Miscellaneous special pages
-'nbytes' => '$1{{PLURAL:$1|كلی|بايت|بايت}}',
+'nbytes' => '$1{{جمی:$1|كلی|بايت|بايت}}',
+'nlinks' => '$1 {{جمی:$1|هوم پیوند|هوم پیوندیا}}',
'nmembers' => '$1 {{PLURAL:$1|اندوم|اندوميا}}',
'prefixindex' => 'همه بلگيا وا پيشون',
'usercreated' => '{{جنسیت:$3|راس بیه}}د $1 at $2',
# Core parser functions
'duplicate-defaultsort' => 'زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.',
+# Special:Version
+'version-ext-license' => 'ليسانس',
+'version-ext-colheader-version' => 'نسقه',
+'version-ext-colheader-license' => 'ليسانس',
+'version-ext-colheader-credits' => 'نیسنه یا',
+
# Special:SpecialPages
'specialpages' => 'بلگيا ويجه',
'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
+'editpage-notsupportedcontentformat-title' => 'Форматот на содржината не е поддржан',
+'editpage-notsupportedcontentformat-text' => 'Форматот $1 is не е поддржан од содржинскиот модел $2.',
# Content models
'content-model-wikitext' => 'викитекст',
'youhavenewmessagesfromusers' => 'तुमच्यासाठी {{PLURAL:$3|इतर सदस्याकडून|$3 सदस्यांकडून}} $1 आहेत. ($2)',
'youhavenewmessagesmanyusers' => 'तुमच्यासाठी बऱ्याच सदस्यांकडून $1 आहेत. ($2)',
'newmessageslinkplural' => '{{PLURAL:$1|एक नवीन संदेश|९९९=नवीन संदेश}}',
-'newmessagesdifflinkplural' => 'मागील {{PLURAL:$1|बदल}}',
+'newmessagesdifflinkplural' => 'मागील {{PLURAL:$1|999=बदल}}',
'youhavenewmessagesmulti' => '$1 वर तुमच्यासाठी नवीन संदेश आहेत.',
'editsection' => 'संपादन',
'editold' => 'संपादन',
'mailerror' => 'विपत्र पाठवण्यात त्रुटी: $1',
'acct_creation_throttle_hit' => 'माफ करा, तुम्ही आत्तापर्यंत {{PLURAL:$1|१ खाते उघडले आहे|$1 खाती उघडली आहेत}}. तुम्हाला आणखी खाती उघडता येणार नाहीत.',
'emailauthenticated' => 'तुमचा विपत्रपत्ता $2 ला $3 यावेळी तपासण्यात आला आहे.',
-'emailnotauthenticated' => 'तà¥\81मà¤\9aा à¤\88-मà¥\87ल पतà¥\8dता à¤\85दà¥\8dयाप à¤\85धिपà¥\8dरमाणित(à¤\91थà¥\87à¤\82à¤\9fिà¤\95à¥\87à¤\9fà¥\87ड) नाहà¥\80. à¤\96ालà¥\80ल à¤\95à¥\8bणतà¥\8dयाहà¥\80 फिà¤\9aरà¥\8dसà¤\95रिता ई-मेल पाठविला जाणार नाही.',
+'emailnotauthenticated' => 'तà¥\81मà¤\9aà¥\8dया à¤\88-मà¥\87ल पतà¥\8dतà¥\8dयाà¤\9aà¥\80 à¤\85दà¥\8dयाप निशà¥\8dà¤\9aितà¥\80 à¤\9dालà¥\87लà¥\80 नाहà¥\80. à¤\96ालà¥\80ल à¤\95à¥\8bणतà¥\8dयाहà¥\80 फिà¤\9aरà¥\8dससाठà¥\80 ई-मेल पाठविला जाणार नाही.',
'noemailprefs' => 'खालील सुविधा कार्यान्वित करण्यासाठी,पसंतीक्रमात ई-मेल पत्ता नमूद करा.',
'emailconfirmlink' => 'आपला ई-मेल पत्ता निश्चित करा.',
'invalidemailaddress' => 'तुम्ही दिलेला ई-मेल पत्ता चुकीचा आहे, कारण तो योग्यप्रकारे लिहिलेला नाही. कृपया योग्यप्रकारे ई-मेल पत्ता लिहा अथवा ती जागा मोकळी सोडा.',
'rclistfrom' => '$1 नंतर केले गेलेले बदल दाखवा.',
'rcshowhideminor' => 'छोटे बदल $1',
'rcshowhidebots' => 'सांगकामे(बॉट्स) $1',
-'rcshowhideliu' => 'सनोंद प्रवेशित सदस्य $1',
+'rcshowhideliu' => '$1नोंदणीकृत सदस्य',
'rcshowhideanons' => 'अनामिक सदस्य $1',
'rcshowhidepatr' => '$1 पहारा असलेली संपादने',
'rcshowhidemine' => 'माझे बदल $1',
शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.',
'editcomment' => "संपादन सारांश \"''\$1''\" होता.",
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.',
-'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून {{GENDER:$1|[[सदस्य:$1|$1]]}} यांच्या आवृत्तीप्रमाणे पूर्ववत केले.',
+'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून मागील आवृत्तीप्रमाणे पूर्ववत केले{{GENDER:$1|[[सदस्य:$1|$1]]}}',
'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.',
# Edit tokens
'version-parser-function-hooks' => 'पृथकक कार्य अंकुश',
'version-hook-name' => 'अंकुश नाव',
'version-hook-subscribedby' => 'वर्गणीदार',
-'version-version' => '(आवृत्ती $1)',
+'version-version' => '($1)',
'version-license' => 'मिडियाविकि परवाना',
'version-poweredby-credits' => "हा विकी '''[https://www.mediawiki.org/ मीडियाविकी]'''द्वारे संचालित आहे, प्रताधिकारित © २००१-$1 $2.",
'version-poweredby-others' => 'इतर',
# Special:Redirect
'redirect' => 'संचिका,सदस्य किंवा आवृत्ती या ओळखणीनुसार पुनर्निर्देशन',
'redirect-legend' => 'संचिका अथवा पानास पुनर्निर्देशन',
-'redirect-summary' => 'हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती ओळ्खण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).',
+'redirect-summary' => 'हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती किंवा पान ओळखण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).
+वापर:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], किंवा [[{{#Special:Redirect}}/user/101]].',
'redirect-submit' => 'जा',
'redirect-lookup' => 'बघा:',
'redirect-value' => 'मुल्य:',
'specialpages' => 'विशेष पृष्ठे',
'specialpages-note-top' => 'विवरण',
'specialpages-note' => '* सर्वसाधारण विशेष पृष्ठे.
-* <strong class="mw-specialpagerestricted">प्रतिबंधित विशेष पृष्ठे.</strong>',
+* <span class="mw-specialpagerestricted">प्रतिबंधित विशेष पृष्ठे.</span>',
'specialpages-group-maintenance' => 'व्यवस्थापन अहवाल',
'specialpages-group-other' => 'इतर विशेष पृष्ठे',
'specialpages-group-login' => 'प्रवेश / नवीन सदस्य नोंदणी',
# Special:ExpandTemplates
'expandtemplates' => 'साचे वाढवा',
-'expand_templates_intro' => 'हà¥\87 पान à¤\95ाहà¥\80 मà¤\9cà¤\95à¥\82र à¤\98à¥\87à¤\8aन तà¥\8dयातिल सर्व साचे वाढविते. तसेच हे पान पार्सर फंक्शन्स जसे की
+'expand_templates_intro' => 'हà¥\87 पान à¤\95ाहà¥\80 मà¤\9cà¤\95à¥\82र à¤\98à¥\87à¤\8aन à¤\86वरà¥\8dतà¥\80 पदà¥\8dधतà¥\80नà¥\87 तà¥\8dयातà¥\80ल सर्व साचे वाढविते. तसेच हे पान पार्सर फंक्शन्स जसे की
<nowiki>{{</nowiki>#language:...}}, व बदलणार्या किमती (variables) जसे की
-<nowiki>{{</nowiki>CURRENTDAY}}—म्हणजेच दोन ब्रेसेसमधील सर्व मजकूर वाढविते.
-मीडियाविकिमधून पार्सर स्टेज मागवून हे केले जाते.',
+<nowiki>{{</nowiki>CURRENTDAY}}—म्हणजेच दोन ब्रेसेसमधील बरेच काही वाढविते.',
'expand_templates_title' => '{{FULLPAGENAME}} वगैरे करीता, कन्टेक्स्ट शीर्षक:',
'expand_templates_input' => 'इनपुट मजकूर:',
'expand_templates_output' => 'निकाल',
'page_last' => 'xōcoyōc',
'history-fieldset-title' => 'Tictēmōz īpan tlahcuilōlloh',
'history-show-deleted' => 'Zan tlapolōlli',
-'histfirst' => 'Achto',
-'histlast' => 'Yancuīc',
+'histfirst' => 'in achto',
+'histlast' => 'in tlatzaucticah',
'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
'historyempty' => '(iztāc)',
'revisiondelete' => 'Tiquimpolōz/ahtiquimpolōz tlachiyaliztli',
'revdelete-show-file-submit' => 'Quēmah',
'revdelete-selected' => "'''{{PLURAL:$2|Tlachiyaliztli ōmoēlēhui|Tlachiyaliztli ōmoēlēhuih}} [[:$1]] ītechcopa:'''",
-'revdelete-hide-text' => 'Tictlātīz tlachiyaliztli ītlahcuilōl',
+'revdelete-hide-text' => 'In tlahtlachiyaliztli ītlahcuilōl',
'revdelete-hide-image' => 'Tictlātīz tlahcuilōlli ītlapiyaliz',
-'revdelete-radio-set' => 'Quēmah',
-'revdelete-radio-unset' => 'Ahmo',
+'revdelete-radio-set' => 'Tlaīnāyalli',
+'revdelete-radio-unset' => 'Ittalōni',
'revdel-restore' => 'Ticpatlāz tlattaliztli',
'pagehist' => 'Zāzanilli tlahcuilōlloh',
'deletedhist' => 'Ōtlapolo tlahcuilōlloh',
'rclistfrom' => 'Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1',
'rcshowhideminor' => '$1 tlapatlalitzintli',
'rcshowhidebots' => '$1 tepoztlācah',
-'rcshowhideliu' => '$1 tlatequitiltilīlli ōmocalacqueh',
+'rcshowhideliu' => '$1 tēmachiyōmacalli tlatequitiltilīltin',
'rcshowhideanons' => '$1 ahtōcā tlatequitiltilīlli',
'rcshowhidepatr' => '$1 tlapatlaliztli mochiyahua',
'rcshowhidemine' => '$1 notlahcuilōl',
'invalid-content-data' => 'Ugyldig innhold',
'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har utført. Om du er logget inn kan du slå av denne advarselen under «Redigering»-seksjonen i innstillingene.',
+'editpage-notsupportedcontentformat-title' => 'Innholdsformatet er ikke støttet',
+'editpage-notsupportedcontentformat-text' => 'Innholdsformatet $1 er ikke støttet av innholdsmodellen $2.',
# Content models
'content-model-wikitext' => 'WikiTekst',
'confirm-unwatch-button' => 'OK',
'confirm-unwatch-top' => 'Fjern denne siden fra overvåkningslisten din?',
+# Separators for various lists, etc.
+'quotation-marks' => '«$1»',
+
# Multipage image navigation
'imgmultipageprev' => '← forrige side',
'imgmultipagenext' => 'neste side →',
Usuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
'delete-warning-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
Bądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
-'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, masz zamiar usunąć, odwołują się inne strony.",
+'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się inne strony.",
# Rollback
'rollback' => 'Cofnij edycję',
'delete-warning-toobig' => 'Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
Eliminá-la poderá causar problemas na base de dados da {{SITENAME}};
prossiga com precaução.',
+'deleting-backlinks-warning' => "'''Aviso:''' Outras páginas têm ligação à página que está prestes a eliminar.",
# Rollback
'rollback' => 'Reverter edições',
but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
'editpage-notsupportedcontentformat-title' => 'Title of error page shown when using an incompatible format on EditPage',
-'editpage-notsupportedcontentformat-text' => 'Error message shown when using an incompatible format on EditPage.
-* $1 is the format id
-* $2 is the content model name',
+'editpage-notsupportedcontentformat-text' => 'Error message shown when using an incompatible format on EditPage. Parameters:
+* $1 - the format id
+* $2 - the content model name',
# Content models
'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
+'editpage-notsupportedcontentformat-title' => 'Formatul conținutului nu este acceptat',
+'editpage-notsupportedcontentformat-text' => 'Formatul de conținut $1 nu este acceptat de modelul de conținut $2.',
# Content models
'content-model-wikitext' => 'wikitext',
'tog-minordefault' => 'Помечать по умолчанию правки как малозначимые',
'tog-previewontop' => 'Помещать предпросмотр перед окном редактирования',
'tog-previewonfirst' => 'Показывать предпросмотр при переходе к редактированию',
-'tog-enotifwatchlistpages' => 'Уведомлять по эл. почте об изменениях страниц и файлов из списка наблюдения',
-'tog-enotifusertalkpages' => 'Уведомлять по эл. почте об изменении персональной страницы обсуждения',
+'tog-enotifwatchlistpages' => 'Уведомлять по электронной почте об изменениях страниц и файлов из списка наблюдения',
+'tog-enotifusertalkpages' => 'Уведомлять по электронной почте об изменении персональной страницы обсуждения',
'tog-enotifminoredits' => 'Уведомлять даже при незначительных изменениях страниц и файлов',
'tog-enotifrevealaddr' => 'Показывать мой почтовый адрес в сообщениях оповещения',
'tog-shownumberswatching' => 'Показывать число участников, включивших страницу в свой список наблюдения',
'tog-watchlisthideminor' => 'Скрывать малые правки из списка наблюдения',
'tog-watchlisthideliu' => 'Скрывать правки представившихся участников из списка наблюдения',
'tog-watchlisthideanons' => 'Скрывать правки анонимных участников из списка наблюдения',
-'tog-watchlisthidepatrolled' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c оÑ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе пÑ\80авки в Ñ\81пиÑ\81ке наблюдения',
+'tog-watchlisthidepatrolled' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c оÑ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе пÑ\80авки из Ñ\81пиÑ\81ка наблюдения',
'tog-ccmeonemails' => 'Отправлять мне копии писем, которые я посылаю другим участникам',
'tog-diffonly' => 'Не показывать содержание страницы под сравнением двух версий',
'tog-showhiddencats' => 'Показывать скрытые категории',
'protectedpages' => 'Защищённые страницы',
'protectedpages-indef' => 'Только бессрочные защиты',
'protectedpages-cascade' => 'Только каскадная защита',
+'protectedpages-noredirect' => 'Скрыть перенаправления',
'protectedpagesempty' => 'В настоящий момент нет защищённых страниц с указанными параметрами',
'protectedtitles' => 'Защищённые названия',
'protectedtitlesempty' => 'В настоящий момент нет запрещённых названий с указанными параметрами.',
См. [[Special:BlockList|список заблокированных IP-адресов]] для просмотра блокировок.',
'ipb-blockingself' => 'Вы пытаетесь заблокировать себя самого! Вы уверены, что вы хотите это сделать?',
'ipb-confirmhideuser' => 'Вы намереваетесь заблокировать участника и скрыть его имя. Оно не будет отображаться в списках и журналах. Вы уверены, что хотите это сделать?',
+'ipb-confirmaction' => 'Если вы уверены, что вы действительно хотите сделать это, пожалуйста, поставьте ниже отметку «{{int:ipb-confirm}}».',
'ipb-edit-dropdown' => 'Править список причин',
'ipb-unblock-addr' => 'Разблокировать $1',
'ipb-unblock' => 'Разблокировать участника или IP-адрес',
'version-ext-colheader-license' => 'Лицензия',
'version-ext-colheader-description' => 'Описание',
'version-ext-colheader-credits' => 'Авторы',
+'version-license-title' => 'Лицензия для $1',
+'version-license-not-found' => 'Для этого расширения нет подробных сведений о лицензии.',
+'version-credits-title' => 'Список авторов для $1',
+'version-credits-not-found' => 'Для этого расширения нет подробных сведений об авторах.',
'version-poweredby-credits' => "Эта вики работает на движке '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'другие',
'version-poweredby-translators' => 'переводчики translatewiki.net',
'redirect-lookup' => 'Поиск:',
'redirect-value' => 'Значение:',
'redirect-user' => 'Идентификатор участника',
+'redirect-page' => 'Идентификатор страницы',
'redirect-revision' => 'Версия страницы',
'redirect-file' => 'Название файла',
'redirect-not-exists' => 'Значение не найдено',
'api-error-overwrite' => 'Не допускается замена существующего файла.',
'api-error-stashfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
'api-error-publishfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
+'api-error-stasherror' => 'При загрузке файла в хранилище произошла ошибка.',
'api-error-timeout' => 'Сервер не отвечает в течение ожидаемого времени.',
'api-error-unclassified' => 'Произошла неизвестная ошибка',
'api-error-unknown-code' => 'Неизвестная ошибка: «$1»',
'expand_templates_input' => 'Входной текст:',
'expand_templates_output' => 'Результат',
'expand_templates_xml_output' => 'XML вывод',
+'expand_templates_html_output' => 'HTML-вывод',
'expand_templates_ok' => 'OK',
'expand_templates_remove_comments' => 'Удалить комментарии',
'expand_templates_remove_nowiki' => 'Подавлять теги <nowiki> в результате',
'expand_templates_generate_xml' => 'Показать дерево разбора XML',
+'expand_templates_generate_rawhtml' => 'Показать HTML',
'expand_templates_preview' => 'Предпросмотр',
);
'protectlogpage' => 'Дневник закључавања',
'protectlogtext' => 'Испод је списак измена у виду заштите страница.
Погледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.',
-'protectedarticle' => '{{GENDER:|је заштитио|је заштитила|је заштитио}} „[[$1]]“',
+'protectedarticle' => '{{GENDER:|је заштитио|је заштитила}} „[[$1]]“',
'modifiedarticleprotection' => '{{GENDER:|је променио|је променила|је променио}} степен заштите за „[[$1]]“',
'unprotectedarticle' => 'уклоњена заштита са странице „[[$1]]“',
'movedarticleprotection' => '{{GENDER:|је преместио|је преместила|је преместио}} поставке заштите са „[[$2]]“ на „[[$1]]“',
'protectlogpage' => 'Dnevnik zaključavanja',
'protectlogtext' => 'Ispod je spisak izmena u vidu zaštite stranica.
Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.',
-'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila|je zaštitio}} „[[$1]]“',
+'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“',
'modifiedarticleprotection' => '{{GENDER:|je promenio|je promenila|je promenio}} stepen zaštite za „[[$1]]“',
'unprotectedarticle' => 'uklonjena zaštita sa stranice „[[$1]]“',
'movedarticleprotection' => '{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“',
'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «Редагування» ваших налаштувань.',
+'editpage-notsupportedcontentformat-title' => 'Непідтримуваний формат вмісту',
+'editpage-notsupportedcontentformat-text' => 'Формат вмісту $1 не підтримується моделлю вмісту $2.',
# Content models
'content-model-wikitext' => 'вікітекст',
'last' => 'oxirgi',
'page_first' => 'birinchi',
'page_last' => 'oxirgi',
-'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
-Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
-(oxirgi) = avvalgi koʻrinish bilan farq, k = kichkina tahrir.',
+'histlegend' => "Farqlarni tanlash: solishtirish uchun kerakli radiobokslarni belgilang va '''{{int:compare-submit}}''' tugmasini bosing.<br />
+Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}})''' = avvalgi koʻrinish bilan farqi, '''{{int:minoreditletter}}''' = kichkina tahrir.",
'history-fieldset-title' => 'Tarixni koʻrish',
'history-show-deleted' => 'Faqat o‘chirilganlari',
'histfirst' => 'Eng avvalgi',
'recentchanges' => 'Yangi oʻzgarishlar',
'recentchanges-legend' => 'Yangi oʻzgarishlar moslamalari',
'recentchanges-summary' => 'Bu sahifada siz {{SITENAME}}da sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.',
+'recentchanges-noresult' => 'Koʻrsatilgan muddatga va shartlarga oid oʻzgarishlar topilmadi.',
'recentchanges-feed-description' => 'Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish',
-'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratildi',
-'recentchanges-label-minor' => 'Bu kichik tahrir',
-'recentchanges-label-bot' => 'Bu tahrirni bot bajardi',
+'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratilgan',
+'recentchanges-label-minor' => 'Bu tahrir kichik deb belgilangan',
+'recentchanges-label-bot' => 'Bu tahrirni bot bajargan',
'recentchanges-label-unpatrolled' => 'Bu tahrir hali tekshirilmagan',
+'recentchanges-label-plusminus' => 'sahifa vazni baytlarda qanchaga oʻzgargani',
+'recentchanges-legend-heading' => "'''Izoh:'''",
+'recentchanges-legend-newpage' => '(shuningdek qarang: [[Special:NewPages|yangi sahifalar roʻyxati]])',
'rcnotefrom' => "Quyida <strong>$2</strong> dan (<strong>$1</strong> gacha) bo'lgan o'zgarishlar keltirilgan.",
'rclistfrom' => '$1 dan boshlab yangi oʻzgarishlarni koʻrsat.',
'rcshowhideminor' => 'Kichik tahrirlarni $1',
'diff' => 'farq',
'hist' => 'tarix',
'hide' => 'yashir',
-'show' => 'Koʻrsat',
+'show' => 'koʻrsat',
'minoreditletter' => 'k',
'newpageletter' => 'Y',
'boteditletter' => 'b',
'activeusers-noresult' => 'Foydalanuvchilar topilmadi.',
# Special:ListGroupRights
-'listgrouprights' => 'Foydalanuvchilar guruhi huquqlari',
+'listgrouprights' => 'Foydalanuvchilar guruhlari roʻyxati',
'listgrouprights-summary' => 'Har bir viki-loyihada boʻlgani kabi, Oʻzbekcha Vikipediyada ham foydalanuvchilar bir nechta guruhlarga boʻlingan boʻlib, quyida ularning roʻyxati va tegishli huquqlari keltirilgan. Alohida huquqlar haqida [[{{MediaWiki:Listgrouprights-helppage}}|qoʻshimcha maʼlumotlar]] boʻlishi mumkin.',
'listgrouprights-key' => 'Izohlar:
* <span class="listgrouprights-granted">Amaldagi huquqlar</span>
'unwatchthispage' => "Kuzatuvni to'xtatish",
'notanarticle' => 'Maqola emas',
'watchlist-details' => 'Sizning kuzatuv roʻyxatingizda hozirda {{PLURAL:$1|bitta sahifa|$1ta sahifa}} mavjud (munozara sahifalarini hisobga olmaganda).',
+'wlheader-showupdated' => "Siz oxirgi marta kirganingizdan keyin oʻzgartirilgan sahifalar '''qalin''' yozuv bilan ajratib koʻrsatilgan.",
'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
-'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
+'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsat $3',
'watchlist-options' => 'Kuzatuv roʻyxati moslamalari',
# Displayed when you click the "watch" button and it is in the process of watching
'unwatching' => "Kuzatuv ro'yxatidan o'chirish...",
'enotif_mailer' => "{{SITENAME}} Pochta orqali e'lon qilish xizmati",
-'enotif_reset' => 'Hamma sahifalarni koʻrib chiqilgan deb belgilash',
+'enotif_reset' => 'Hammasini koʻrib chiqilgan deb belgilash',
'enotif_impersonal_salutation' => '{{SITENAME}} ishtirokchisi',
'enotif_subject_deleted' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi',
'enotif_subject_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi',
'exif-iimcategory-wea' => 'Ob-havo',
# 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'Barcha',
+'watchlistall2' => 'hammasi',
'namespacesall' => 'Barchasi',
'monthsall' => 'barchasi',
'table_pager_last' => 'Oxirgi sahifa',
# Auto-summaries
+'autosumm-blank' => 'Sahifa tozalandi',
'autoredircomment' => '[[$1]]ga yoʻnaltirildi',
'autosumm-new' => '"$1" yozuvi orqali yangi sahifa yaratildi',
# Special:Tags
'tag-filter' => '[[Special:Tags|Nishonlar]] filtri:',
+# Special:ComparePages
+'compare-submit' => 'Solishtirish',
+
# HTML forms
'htmlform-reset' => 'Oʻzgarishlarni bekor qilish',
'htmlform-selectorother-other' => 'Boshqa',
# Search suggestions
'searchsuggest-search' => 'Qidiruv',
+'searchsuggest-containing' => 'ichida bu boʻlgan...',
# API errors
'api-error-unknown-code' => 'Noaniq xato: "$1".',
'passwordtooshort' => 'Łe password e ga da contegnere almanco {{PLURAL:$1|1 caratere|$1 carateri}}.',
'password-name-match' => 'Ła password a ga da esare difarente dal nome utente.',
'password-login-forbidden' => 'Sto nome utente e/o password i xè stai proibìi',
-'mailmypassword' => 'Màndeme na password nova al me indirisso e-mail',
+'mailmypassword' => 'Rinposta ła password',
'passwordremindertitle' => 'Servisio Password Reminder de {{SITENAME}}',
'passwordremindertext' => 'Qualcheduni (probabilmente ti, da l\'indirizo IP $1) el gà domandà che ghe vegna mandà na nova password par {{SITENAME}} ($4).
Na password tenporànea par l\'utente "$2" la xe stà creà e inpostà a "$3".
'nosuchsectiontext' => 'Te ghè sercà de modificar na sezion che no esiste.
Forse la xe stà spostà o scancelà fin che te sèri drio vardar la pagina.',
'loginreqtitle' => "Par modificar sta pagina bisogna prima eseguir l'acesso al sito.",
-'loginreqlink' => 'login',
+'loginreqlink' => 'far el login',
'loginreqpagetext' => 'Par védar altre pagine bisogna $1.',
'accmailtitle' => 'Password spedia.',
'accmailtext' => "Na password xenerà casualmente par [[User talk:$1|$1]] la xe stà mandà a $2.
Legenda: '''({{int:cur}})''' = difarense co l'ultima version, '''({{int:last}})''' = difarense co la version subito prima, '''{{int:minoreditletter}}''' = canbiamento picenin",
'history-fieldset-title' => 'Ruma in te la storia',
'history-show-deleted' => 'Solo quei scancelà',
-'histfirst' => 'Prima',
-'histlast' => 'Ultema',
+'histfirst' => 'pi vecia',
+'histlast' => 'pi nova',
'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
'historyempty' => '(voda)',
* Informassion personali mia apropriate
*: ''indirissi de casa e nùmari de telefono, nùmari de previdensa sociale, etc.''",
'revdelete-legend' => 'Inposta le seguenti limitazion su le versioni scancelàe:',
-'revdelete-hide-text' => 'Scondi el testo de ła version',
+'revdelete-hide-text' => 'El testo de ła version',
'revdelete-hide-image' => 'Scondi i contenuti del file',
'revdelete-hide-name' => 'Scondi azion e ogeto de la stessa',
-'revdelete-hide-comment' => "Scondi l'oggetto de ła modifega",
-'revdelete-hide-user' => "Scondi el nome o l'indirisso IP dell'autore",
+'revdelete-hide-comment' => "L'ogeto de ła modifega",
+'revdelete-hide-user' => "El nome o l'indirisso IP de l'autor",
'revdelete-hide-restricted' => 'Scóndighe le informassion indicà anca ai aministradori',
'revdelete-radio-same' => '(no stà canbiar)',
-'revdelete-radio-set' => 'Sì',
-'revdelete-radio-unset' => 'No',
+'revdelete-radio-set' => 'Sconto',
+'revdelete-radio-unset' => 'Visibile',
'revdelete-suppress' => 'Scondi le informazion anca ai aministradori',
'revdelete-unsuppress' => 'Elimina le limitazion su le revision ripristinà',
'revdelete-log' => 'Motivassion:',
'prefs-dateformat' => 'Formato de la data',
'prefs-timeoffset' => 'Ore de difarensa',
'prefs-advancedediting' => 'Preferense avansade',
+'prefs-editor' => 'Contributor',
'prefs-advancedrc' => 'Preferense avansade',
'prefs-advancedrendering' => 'Preferense avansade',
'prefs-advancedsearchoptions' => 'Preferense avansade',
'rclistfrom' => 'Fà védar i canbiamenti fati dal $1',
'rcshowhideminor' => '$1 i canbiamenti picenini',
'rcshowhidebots' => '$1 i bot',
-'rcshowhideliu' => '$1 i utenti registrai',
+'rcshowhideliu' => '$1 i utenti registrài',
'rcshowhideanons' => '$1 i utenti anonimi',
'rcshowhidepatr' => '$1 łe modifeghe controłae',
'rcshowhidemine' => '$1 i me canbiamenti',
'rc_categories_any' => 'Qualsiasi',
'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} dopo ła modifega',
'newsectionsummary' => '/* $1 */ sezion nova',
-'rc-enhanced-expand' => 'Mostra detaji (richiede JavaScript)',
+'rc-enhanced-expand' => 'Mostra detaji',
'rc-enhanced-hide' => 'Scondi detaji',
'rc-old-title' => 'creà in orijine come "$1"',
'reuploaddesc' => 'Lassa pèrdar el caricamento e torna al modulo de caricamento',
'upload-tryagain' => 'Invia la descrission del file modificà',
'uploadnologin' => 'Te devi far el login par exeguire sta operassion.',
-'uploadnologintext' => 'Te ghè da far [[Special:UserLogin|el login]]
-par poder cargar dei file.',
+'uploadnologintext' => 'Te ghè da $1 par cargar dei file.',
'upload_directory_missing' => 'La cartèla de caricamento ($1) no la esiste mìa e no la pode vegner creàda dal browser web.',
'upload_directory_read_only' => "El server web no l'è bon de scrìvar ne la directory de caricamento ($1).",
'uploaderror' => 'Eror nel caricamento',
# Random page in category
'randomincategory' => 'Pagina a ocio in te na categoria',
+'randomincategory-invalidcategory' => '"$1" no\'l và mia ben come nome de categoria.',
'randomincategory-nopages' => 'No ghe xe mia pagine in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ciapa na pagina a ocio da la categoria: $1 $2.',
'randomincategory-selectcategory-submit' => 'Và',
# Random redirect
'protectedpages' => 'Pagine protete',
'protectedpages-indef' => 'Solo le protezion infinìe',
'protectedpages-cascade' => 'Solo protezion ricorsive',
+'protectedpages-noredirect' => 'Scondi rimandi',
'protectedpagesempty' => 'Al momento no ghe xe pagine protete',
'protectedtitles' => 'Titoli proteti',
'protectedtitlesempty' => 'Al momento no ghe xe titoli proteti coi parametri specificà.',
'listusers' => 'Elenco dei utenti',
'listusers-editsonly' => 'Fà védar sol che i utenti che gà fato dei contributi',
'listusers-creationsort' => 'Òrdena par data de creassion',
+'listusers-desc' => 'Ordina in senso decresente',
'usereditcount' => '$1 {{PLURAL:$1|contributo|contributi}}',
'usercreated' => '{{GENDER:$3|Creà|Creà}} el $1 a le $2',
'newpages' => 'Pagine nove',
'contributions' => 'Contributi {{GENDER:$1|utente}}',
'contributions-title' => 'Contributi de $1',
'mycontris' => 'Contributi',
-'contribsub2' => 'Par $1 ($2)',
+'contribsub2' => 'Par {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'No xe stà catà nissuna modifica che vaga ben par sti critèri.',
-'uctop' => '(ultima)',
+'uctop' => '(de dèsso)',
'month' => 'Dal mese (e quei prima):',
'year' => "Da l'ano (e quei prima):",
'svg-long-desc' => 'file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3',
'svg-long-desc-animated' => 'file in formato SVG animà, dimension nominałi $1 × $2 pixel, dimension del file: $3',
'svg-long-error' => 'File SVG mìa valido: $1',
-'show-big-image' => 'Version ad alta risołusion',
+'show-big-image' => 'File original',
'show-big-image-preview' => 'Dimension de sta anteprima: $1.',
'show-big-image-other' => '{{PLURAL:$2|Altra risołusion|Altre risołusion}}: $1.',
'show-big-image-size' => '$1 × $2 pixel',
'imgmultigo' => 'Và',
'imgmultigoto' => 'Và a la pagina $1',
+# Language selector for translatable SVGs
+'img-lang-default' => '(lengua predefinìa)',
+
# Table pager
'ascending_abbrev' => 'cresc',
'descending_abbrev' => 'decresc',
'version-hook-name' => "Nome de l'hook",
'version-hook-subscribedby' => 'Sotoscrizioni',
'version-version' => '(Version $1)',
-'version-license' => 'Licensa',
+'version-license' => 'Licensa MediaWiki',
+'version-ext-license' => 'Licensa',
+'version-ext-colheader-name' => 'Estension',
+'version-ext-colheader-version' => 'Version',
+'version-ext-colheader-license' => 'Licensa',
+'version-ext-colheader-description' => 'Descrission',
+'version-license-title' => 'Licensa par $1',
'version-poweredby-credits' => "Sta wiki la va con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altri',
'version-poweredby-translators' => 'tradutori de translatewiki.net',
'tags-tag' => 'Nome del tag',
'tags-display-header' => 'Aspetto ne la lista de le modifiche',
'tags-description-header' => 'Descrission conpleta del significado',
+'tags-active-header' => 'Ativo?',
'tags-hitcount-header' => 'Modifiche che gà dei tag',
'tags-edit' => 'modìfega',
'tags-hitcount' => '$1 {{PLURAL:$1|modìfega|modìfeghe}}',
'invalid-content-data' => '无效的内容数据',
'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
'editwarning-warning' => '离开本页面可能导致你失去任何你已经作出的更改。如果你处于登录状态,你可以在你的设置的“编辑”部分停用该警告。',
+'editpage-notsupportedcontentformat-title' => '内容格式尚不支持',
+'editpage-notsupportedcontentformat-text' => '内容模型$2尚不支持内容格式$1。',
# Content models
'content-model-wikitext' => 'wiki文本',
'invalid-content-data' => '內容資料無效',
'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
+'editpage-notsupportedcontentformat-title' => '內容格式尚無法支援',
+'editpage-notsupportedcontentformat-text' => '內容模型$2尚無法支援內容格式$1。',
# Content models
'content-model-wikitext' => '圍記文字(Wikitext)',
+++ /dev/null
-/**
- * LESS Stylesheet for collapsible nav
- */
-@import "mediawiki.mixins.less";
-
-#mw-panel.collapsible-nav {
- .portal {
- background-position: left top;
- background-repeat: no-repeat;
- .background-image('images/portal-break.png');
- padding: 0.25em 0 !important;
- margin: -11px 9px 10px 11px;
-
- h3 {
- font-size: @menu-main-heading-font-size;
- color: @collapsible-nav-heading-color;
- font-weight: normal;
- background-position: left center;
- background-repeat: no-repeat;
- .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
- padding: @collapsible-nav-heading-padding;
- margin-bottom: 0;
-
- &:hover {
- cursor: pointer;
- text-decoration: none;
- }
-
- a {
- color: @collapsible-nav-heading-color;
- text-decoration: none;
- }
- }
-
- .body {
- margin: @collapsible-nav-body-margin;
- background-image: none !important;
- padding-top: 0;
- display: none;
-
- ul {
- li {
- padding: 0.25em 0;
- }
- }
- }
-
-
- /* First */
- &.first {
- background-image: none;
- margin-top: 0;
- h3 {
- display: none;
- }
- }
-
- /* Persistent */
- &.persistent {
- .body {
- display: block;
- margin-left: 0.5em;
- }
-
- h3 {
- background-image: none !important;
- padding-left: 0.7em;
- cursor: default;
- }
- }
-
- /* Collapsed */
- &.collapsed {
- h3 {
- color: @collapsible-nav-heading-collapsed-color;
- background-position: left center;
- background-repeat: no-repeat;
- .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
- margin-bottom: 0;
-
- &:hover {
- text-decoration: underline;
- }
-
- a {
- color: @collapsible-nav-heading-collapsed-color;
- }
- }
- }
- }
-}
--- /dev/null
+/**
+ * LESS Stylesheet for collapsible nav
+ */
+@import "mediawiki.mixins.less";
+
+#mw-panel.collapsible-nav {
+ .portal {
+ background-position: left top;
+ background-repeat: no-repeat;
+ .background-image('images/portal-break.png');
+ padding: 0.25em 0 !important;
+ margin: -11px 9px 10px 11px;
+
+ h3 {
+ font-size: @menu-main-heading-font-size;
+ color: @collapsible-nav-heading-color;
+ font-weight: normal;
+ background-position: left center;
+ background-repeat: no-repeat;
+ .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
+ padding: @collapsible-nav-heading-padding;
+ margin-bottom: 0;
+
+ &:hover {
+ cursor: pointer;
+ text-decoration: none;
+ }
+
+ a {
+ color: @collapsible-nav-heading-color;
+ text-decoration: none;
+ }
+ }
+
+ .body {
+ margin: @collapsible-nav-body-margin;
+ background-image: none !important;
+ padding-top: 0;
+ display: none;
+
+ ul {
+ li {
+ padding: 0.25em 0;
+ }
+ }
+ }
+
+
+ /* First */
+ &.first {
+ background-image: none;
+ margin-top: 0;
+ h3 {
+ display: none;
+ }
+ }
+
+ /* Persistent */
+ &.persistent {
+ .body {
+ display: block;
+ margin-left: 0.5em;
+ }
+
+ h3 {
+ background-image: none !important;
+ padding-left: 0.7em;
+ cursor: default;
+ }
+ }
+
+ /* Collapsed */
+ &.collapsed {
+ h3 {
+ color: @collapsible-nav-heading-collapsed-color;
+ background-position: left center;
+ background-repeat: no-repeat;
+ .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
+ margin-bottom: 0;
+
+ &:hover {
+ text-decoration: underline;
+ }
+
+ a {
+ color: @collapsible-nav-heading-collapsed-color;
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+ font-size: @html-font-size;
+}
+html,
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ font-family: @content-font-family;
+}
+body {
+ background-color: #f6f6f6;
+ font-size: @body-font-size;
+}
+
+/* Content */
+div#content {
+ line-height: @content-line-height;
+ margin-left: 10em;
+ padding: @content-padding;
+ /* Border on top, left, and bottom side */
+ border: 1px solid #a7d7f9;
+ border-right-width: 0;
+ /* Merge the border with tabs' one (in their background image) */
+ margin-top: -1px;
+ background-color: white;
+ color: @content-font-color;
+ direction: ltr;
+}
+
+/* Hide empty portlets */
+div.emptyPortlet {
+ display: none;
+}
+
+ul {
+ list-style-type: disc;
+ .list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+ line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+ font-size: 0.8em;
+}
+
+#firstHeading {
+ padding-top: 0;
+ margin-top: 0;
+ font-size: @content-heading-font-size;
+}
+
+.redirectText {
+ font-size: 140%;
+}
+
+.redirectMsg img {
+ vertical-align: text-bottom;
+}
+
+#bodyContent {
+ position: relative;
+ width: 100%;
+ line-height: 1.5em;
+ font-size: @content-font-size;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+// FIXME: Should be part of jquery.tipsy.css
+.tipsy {
+ font-size: 0.8em;
+}
+
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+ div#content,
+ div#footer,
+ #left-navigation {
+ .transition(margin-left 250ms, padding 250ms;);
+ }
+
+ #p-logo {
+ .transition(left 250ms);
+ }
+
+ #mw-panel {
+ .transition(padding-right 250ms);
+ }
+
+ #p-search {
+ .transition(margin-right 250ms);
+ }
+
+ #p-personal {
+ .transition(right 250ms);
+ }
+
+ #mw-head-base {
+ .transition(margin-left 250ms);
+ }
+}
--- /dev/null
+// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
+@import "mediawiki.mixins.less";
+
+div#content a.external {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="https://"],
+.link-https {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/lock-icon.svg', 'images/lock-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="mailto:"],
+.link-mailto {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/mail-icon.svg', 'images/mail-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="news:"] {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/news-icon.svg', 'images/news-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="ftp://"],
+.link-ftp {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/file-icon.svg', 'images/file-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="irc://"],
+div#content a.external[href ^="ircs://"],
+.link-irc {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/talk-icon.svg', 'images/talk-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
+div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
+div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
+div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
+div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
+div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
+.link-audio {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/audio-icon.svg', 'images/audio-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
+div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
+div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
+div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
+.link-video {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/video-icon.svg', 'images/video-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
+div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
+div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
+.link-document {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image-svg('images/document-icon.svg', 'images/document-icon.png');
+ padding-right: 13px;
+}
--- /dev/null
+/* Footer */
+div#footer {
+ margin-left: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ direction: ltr;
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: 0;
+
+ li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333;
+ font-size: 0.7em;
+ }
+ }
+
+ #footer-icons {
+ float: right;
+
+ li {
+ float: left;
+ margin-left: 0.5em;
+ line-height: 2em;
+ text-align: right;
+ }
+ }
+
+ #footer-info {
+ li {
+ line-height: 1.4em;
+ }
+ }
+
+ #footer-places {
+ li {
+ float: left;
+ margin-right: 1em;
+ line-height: 2em;
+ }
+ }
+}
+
+body.ltr {
+ div#footer {
+ #footer-places {
+ /* @noflip */
+ float: left;
+ }
+ }
+}
--- /dev/null
+@import "mediawiki.mixins";
+@import "personalMenu";
+@import "collapsibleNav";
+@import "search";
+@import "tabs";
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+ position: absolute;
+ top: -9999px;
+}
+
+/* Head */
+#mw-page-base {
+ height: 5em;
+ background-color: white;
+ .background-image('images/page-fade.png');
+ background-position: bottom left;
+ background-repeat: repeat-x;
+}
+
+#mw-head-base {
+ margin-top: -5em;
+ margin-left: 10em;
+ height: 5em;
+}
+
+div#mw-head {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 100%;
+
+ h3 {
+ margin: 0;
+ padding: 0;
+ }
+}
+
+/* Navigation Containers */
+#left-navigation {
+ float: left;
+ margin-left: 10em;
+ margin-top: 2.5em;
+ /* When right nav would overlap left nav, it's placed below it
+ (normal CSS floats behavior). This rule ensures that no empty space
+ is shown between them due to right nav's margin-top. Page layout
+ is still broken, but at least the nav overlaps only the page title
+ instead of half the content. */
+ margin-bottom: -2.5em;
+ /* IE 6 double-margin bug fix */
+ display: inline;
+}
+
+#right-navigation {
+ float: right;
+ margin-top: 2.5em;
+}
+
+/* Logo */
+#p-logo {
+ position: absolute;
+ top: -160px;
+ left: 0;
+ width: 10em;
+ height: 160px;
+
+ a {
+ display: block;
+ width: 10em;
+ height: 160px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ text-decoration: none;
+ }
+}
+
+/* Panel */
+div#mw-panel {
+ font-size: @menu-main-font-size;
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ left: 0;
+
+ div.portal {
+ padding-bottom: 1.5em;
+ direction: ltr;
+
+ h3 {
+ font-weight: normal;
+ color: #444;
+ padding: @menu-main-heading-padding;
+ cursor: default;
+ border: none;
+ font-size: @menu-main-heading-font-size;
+ }
+
+ div.body {
+ padding-top: 0.5em;
+ margin: @menu-main-body-margin;
+
+ .background-image('images/portal-break.png');
+ background-repeat: no-repeat;
+ background-position: top left;
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ padding: @menu-main-body-padding;
+ margin: 0;
+
+ li {
+ line-height: 1.125em;
+ padding: 0;
+ padding-bottom: 0.5em;
+ margin: 0;
+ font-size: @menu-main-body-font-size;
+ word-wrap: break-word;
+
+ a {
+ color: @menu-main-body-link-color;
+ &:visited {
+ color: @menu-main-body-link-visited-color;
+ }
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/* mediawiki.notification */
+.skin-vector {
+ .mw-notification-area {
+ font-size: 0.8em;
+ }
+
+ .mw-notification-area-layout {
+ top: 7em;
+ }
+
+ .mw-notification {
+ background-color: #fff;
+ background-color: rgba(255, 255, 255, 0.93);
+ padding: 0.75em 1.5em;
+ border: solid 1px #a7d7f9;
+ border-radius: 0.75em;
+ -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+ box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+ }
+}
--- /dev/null
+/* Personal */
+#p-personal {
+ position: absolute;
+ top: 0.33em;
+ right: 0.75em;
+ /* Display on top of page tabs - bugs 37158, 48078 */
+ z-index: 100;
+
+ h3 {
+ display: none;
+ }
+
+ ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding-left: 10em; /* Keep from overlapping logo */
+ }
+
+ li {
+ line-height: 1.125em;
+ /* @noflip */
+ float: left;
+ margin-left: 0.75em;
+ margin-top: 0.5em;
+ font-size: @menu-personal-font-size;
+ white-space: nowrap;
+ }
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ background-position: left top;
+ background-repeat: no-repeat;
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+ padding-left: 15px !important;
+}
--- /dev/null
+/* Search */
+#p-search {
+ /* @noflip */
+ float: left;
+ margin-right: 0.5em;
+ margin-left: 0.5em;
+
+ h3 {
+ display: none;
+ }
+
+ form,
+ input {
+ margin: 0;
+ margin-top: 0.4em;
+ }
+}
+
+div#simpleSearch {
+ display: block;
+ width: 14em;
+ height: 1.4em;
+ margin-top: 0.65em;
+ position: relative;
+ min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+ border: solid 1px #aaa;
+ color: black;
+ background-color: white;
+ .background-image('images/search-fade.png');
+ background-position: top left;
+ background-repeat: repeat-x;
+
+ input {
+ color: black;
+ &:focus {
+ outline: none;
+ }
+
+ &.placeholder {
+ color: #999;
+ }
+
+ &:-ms-input-placeholder,
+ &:-moz-placeholder,
+ &::-webkit-input-placeholder {
+ color: #999;
+ }
+
+ &#searchInput {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 90%;
+ margin: 0;
+ padding: 0;
+ padding-left: 0.2em;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+ outline: none;
+ border: none;
+ /*
+ * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+ * this from ever being shown anyways.
+ */
+ font-size: 13px;
+ background-color: transparent;
+ direction: ltr;
+ }
+ }
+
+ button#searchButton {
+ position: absolute;
+ width: 10%;
+ right: 0;
+ top: 0;
+ padding: 0;
+ padding-top: 0.3em;
+ padding-bottom: 0.2em;
+ padding-right: 0.4em;
+ margin: 0;
+ border: none;
+ cursor: pointer;
+ background-color: transparent;
+ background-image: none;
+
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ img {
+ border: none;
+ margin: 0;
+ margin-top: -3px;
+ padding: 0;
+ }
+ /* IGNORED BY IE6 */
+ > img {
+ margin: 0;
+ }
+ }
+}
--- /dev/null
+/*
+Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
+*/
+
+/* Navigation Labels */
+div.vectorTabs h3,
+div.vectorMenu h3 span {
+ display: none;
+}
+
+/* Namespaces and Views */
+div.vectorTabs {
+ /* @noflip */
+ float: left;
+ height: 2.5em;
+ .background-image('images/tab-break.png');
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ padding-left: 1px;
+
+ ul {
+ /* @noflip */
+ float: left;
+ height: 100%;
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0;
+ padding: 0;
+ .background-image('images/tab-break.png');
+ background-position: right bottom;
+ background-repeat: no-repeat;
+
+ li {
+ /* @noflip */
+ float: left;
+ line-height: 1.125em;
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: #f3f3f3;
+ .background-image('images/tab-normal-fade.png');
+ background-position: bottom left;
+ background-repeat: repeat-x;
+ white-space: nowrap;
+ }
+
+ /* IGNORED BY IE6 which doesn't support child selector */
+ > li {
+ display: block;
+ }
+ }
+
+ li {
+ &.new {
+ a,
+ a:visited{
+ color: #a55858;
+ }
+ }
+
+ &.selected {
+ .background-image('images/tab-current-fade.png');
+ a,
+ a:visited{
+ color: #333;
+ text-decoration: none;
+ }
+ }
+
+ &.icon {
+ a {
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ }
+
+ a {
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ height: 1.9em;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ color: @menu-link-color;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+
+ /* Ignored by IE6 which doesn't support child selector */
+ > a {
+ display: block;
+ }
+ }
+
+ span {
+ display: inline-block;
+ .background-image('images/tab-break.png');
+ background-position: bottom right;
+ background-repeat: no-repeat;
+
+ a {
+ /* For IE6, overridden later to display:block by modern browsers */
+ display: inline-block;
+ padding-top: 1.25em;
+ }
+
+ /* Ignored by IE6 which doesn't support child selector */
+ > a {
+ /* @noflip */
+ float: left;
+ display: block;
+ }
+ }
+}
+
+/* Variants and Actions */
+div.vectorMenu {
+ /* @noflip */
+ direction: ltr;
+ /* @noflip */
+ float: left;
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+ /* @noflip */
+ background-position: 100% 60%;
+ background-repeat: no-repeat;
+ cursor: pointer;
+}
+
+div.vectorMenuFocus {
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+ background-position: 100% 60%;
+}
+
+body.rtl div.vectorMenu {
+ /* @noflip */
+ direction: rtl;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div#mw-head div.vectorMenu h3 {
+ /* @noflip */
+ float: left;
+ .background-image('images/tab-break.png');
+ background-repeat: no-repeat;
+ background-position: bottom left;
+ margin-left: -1px;
+}
+
+/* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h3 {
+ background-image: none;
+}
+
+div#mw-head div.vectorMenu h4,
+div.vectorMenu#p-variants #mw-vector-current-variant {
+ display: inline-block;
+ float: left;
+ font-size: 0.8em;
+ padding-left: 0.5em;
+ padding-top: 1.375em;
+ font-weight: normal;
+ border: none;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu h3 a {
+ display: inline-block;
+ width: 24px;
+ height: 1.9em;
+ text-decoration: none;
+ .background-image('images/tab-break.png');
+ background-repeat: no-repeat;
+ background-position: bottom right;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu h3 > a {
+ display: block;
+}
+
+div.vectorMenu div.menu {
+ position: relative;
+ display: none;
+ clear: both;
+ text-align: left;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+body.rtl div.vectorMenu div.menu {
+ /* @noflip */
+ margin-left: 24px;
+}
+
+/* IGNORED BY IE6 */
+body.rtl div.vectorMenu > div.menu {
+ /* @noflip */
+ margin-left: auto;
+}
+
+/* IGNORED BY IE6 */
+/* Also fixes old versions of FireFox */
+body.rtl div.vectorMenu > div.menu,
+x:-moz-any-link {
+ /* @noflip */
+ margin-left: 23px;
+}
+
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu div.menuForceShow {
+ display: block;
+}
+
+div.vectorMenu ul {
+ position: absolute;
+ background-color: white;
+ border: solid 1px silver;
+ border-top-width: 0;
+ list-style-type: none;
+ list-style-image: none;
+ padding: 0;
+ margin: 0;
+ margin-left: -1px;
+ text-align: left;
+}
+
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+ min-width: 5em;
+}
+
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+ min-width: 0;
+}
+
+div.vectorMenu li {
+ padding: 0;
+ margin: 0;
+ text-align: left;
+ line-height: 1em;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ color: @menu-link-color;
+ cursor: pointer;
+ font-size: 0.8em;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+ display: block;
+}
+
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+ color: #333;
+ text-decoration: none;
+}
+
+@import 'watchstar.less';
--- /dev/null
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ outline: none;
+ display: block;
+ width: 26px;
+ /* This hides the text but shows the background image */
+ padding-top: 3.1em;
+ margin-top: 0;
+ /* Only applied in IE6 */
+ margin-top: -0.8em !ie;
+ height: 0;
+ overflow: hidden;
+ .background-image('images/watch-icons.png');
+}
+#ca-unwatch.icon a {
+ background-position: -43px 60%;
+}
+#ca-watch.icon a {
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+ background-position: -67px 60%;
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+ background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ .background-image('images/watch-icon-loading.gif');
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+ display: none;
+}
+++ /dev/null
-// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
-@import "mediawiki.mixins.less";
-
-div#content a.external {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href ^="https://"],
-.link-https {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/lock-icon.svg', 'images/lock-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href ^="mailto:"],
-.link-mailto {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/mail-icon.svg', 'images/mail-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href ^="news:"] {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/news-icon.svg', 'images/news-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href ^="ftp://"],
-.link-ftp {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/file-icon.svg', 'images/file-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href ^="irc://"],
-div#content a.external[href ^="ircs://"],
-.link-irc {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/talk-icon.svg', 'images/talk-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
-div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
-div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
-div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
-div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
-div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
-.link-audio {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/audio-icon.svg', 'images/audio-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
-div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
-div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
-div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
-.link-video {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/video-icon.svg', 'images/video-icon.png');
- padding-right: 13px;
-}
-div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
-div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
-div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
-.link-document {
- background-position: center right;
- background-repeat: no-repeat;
- .background-image-svg('images/document-icon.svg', 'images/document-icon.png');
- padding-right: 13px;
-}
+++ /dev/null
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block.
- *
- * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-@import "mediawiki.mixins";
-
-/* Framework */
-html {
- font-size: @html-font-size;
-}
-html,
-body {
- height: 100%;
- margin: 0;
- padding: 0;
- font-family: @content-font-family;
-}
-body {
- background-color: #f6f6f6;
- font-size: @body-font-size;
-}
-/* Content */
-div#content {
- line-height: @content-line-height;
- margin-left: 10em;
- padding: @content-padding;
- /* Border on top, left, and bottom side */
- border: 1px solid #a7d7f9;
- border-right-width: 0;
- /* Merge the border with tabs' one (in their background image) */
- margin-top: -1px;
- background-color: white;
- color: @content-font-color;
- direction: ltr;
-}
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
- position: absolute;
- top: -9999px;
-}
-/* Head */
-#mw-page-base {
- height: 5em;
- background-color: white;
- .background-image('images/page-fade.png');
- background-position: bottom left;
- background-repeat: repeat-x;
-}
-#mw-head-base {
- margin-top: -5em;
- margin-left: 10em;
- height: 5em;
-}
-div#mw-head {
- position: absolute;
- top: 0;
- right: 0;
- width: 100%;
-}
-div#mw-head h3 {
- margin: 0;
- padding: 0;
-}
-/* Hide empty portlets */
-div.emptyPortlet {
- display: none;
-}
-/* Personal */
-#p-personal {
- position: absolute;
- top: 0.33em;
- right: 0.75em;
- /* Display on top of page tabs - bugs 37158, 48078 */
- z-index: 100;
-}
-#p-personal h3 {
- display: none;
-}
-#p-personal ul {
- list-style-type: none;
- list-style-image: none;
- margin: 0;
- padding-left: 10em; /* Keep from overlapping logo */
-}
-#p-personal li {
- line-height: 1.125em;
- /* @noflip */
- float: left;
- margin-left: 0.75em;
- margin-top: 0.5em;
- font-size: @menu-personal-font-size;
- white-space: nowrap;
-}
-/* Navigation Containers */
-#left-navigation {
- float: left;
- margin-left: 10em;
- margin-top: 2.5em;
- /* When right nav would overlap left nav, it's placed below it
- (normal CSS floats behavior). This rule ensures that no empty space
- is shown between them due to right nav's margin-top. Page layout
- is still broken, but at least the nav overlaps only the page title
- instead of half the content. */
- margin-bottom: -2.5em;
- /* IE 6 double-margin bug fix */
- display: inline;
-}
-#right-navigation {
- float: right;
- margin-top: 2.5em;
-}
-/* Navigation Labels */
-div.vectorTabs h3,
-div.vectorMenu h3 span {
- display: none;
-}
-/* Namespaces and Views */
-div.vectorTabs {
- /* @noflip */
- float: left;
- height: 2.5em;
-}
-div.vectorTabs {
- .background-image('images/tab-break.png');
- background-position: bottom left;
- background-repeat: no-repeat;
- padding-left: 1px;
-}
-div.vectorTabs ul {
- /* @noflip */
- float: left;
- height: 100%;
- list-style-type: none;
- list-style-image: none;
- margin: 0;
- padding: 0;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs ul li {
- /* @noflip */
- float: left;
- line-height: 1.125em;
- display: inline-block;
- height: 100%;
- margin: 0;
- padding: 0;
- background-color: #f3f3f3;
- .background-image('images/tab-normal-fade.png');
- background-position: bottom left;
- background-repeat: repeat-x;
- white-space: nowrap;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs ul > li {
- display: block;
-}
-div.vectorTabs li.selected {
- .background-image('images/tab-current-fade.png');
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs li a {
- display: inline-block;
- height: 1.9em;
- padding-left: 0.5em;
- padding-right: 0.5em;
- color: @menu-link-color;
- cursor: pointer;
- font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs li > a {
- display: block;
-}
-div.vectorTabs li.icon a {
- background-position: bottom right;
- background-repeat: no-repeat;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs span a {
- display: inline-block;
- padding-top: 1.25em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs span > a {
- /* @noflip */
- float: left;
- display: block;
-}
-div.vectorTabs span {
- display: inline-block;
- .background-image('images/tab-break.png');
- background-position: bottom right;
- background-repeat: no-repeat;
-}
-div.vectorTabs li.selected a,
-div.vectorTabs li.selected a:visited{
- color: #333;
- text-decoration: none;
-}
-div.vectorTabs li.new a,
-div.vectorTabs li.new a:visited{
- color: #a55858;
-}
-/* Variants and Actions */
-div.vectorMenu {
- /* @noflip */
- direction: ltr;
- /* @noflip */
- float: left;
- /* SVG support using a transparent gradient to guarantee cross-browser
- * compatibility (browsers able to understand gradient syntax support also SVG) */
- .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
- /* @noflip */
- background-position: 100% 60%;
- background-repeat: no-repeat;
- cursor: pointer;
-}
-div.vectorMenuFocus {
- /* SVG support using a transparent gradient to guarantee cross-browser
- * compatibility (browsers able to understand gradient syntax support also SVG) */
- .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
- background-position: 100% 60%;
-}
-body.rtl div.vectorMenu {
- /* @noflip */
- direction: rtl;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#mw-head div.vectorMenu h3 {
- /* @noflip */
- float: left;
- .background-image('images/tab-break.png');
- background-repeat: no-repeat;
- background-position: bottom left;
- margin-left: -1px;
-}
-/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h3 {
- background-image: none;
-}
-div#mw-head div.vectorMenu h4,
-div.vectorMenu#p-variants #mw-vector-current-variant {
- display: inline-block;
- float: left;
- font-size: 0.8em;
- padding-left: 0.5em;
- padding-top: 1.375em;
- font-weight: normal;
- border: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu h3 a {
- display: inline-block;
- width: 24px;
- height: 1.9em;
- text-decoration: none;
- .background-image('images/tab-break.png');
- background-repeat: no-repeat;
- background-position: bottom right;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu h3 > a {
- display: block;
-}
-div.vectorMenu div.menu {
- position: relative;
- display: none;
- clear: both;
- text-align: left;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-body.rtl div.vectorMenu div.menu {
- /* @noflip */
- margin-left: 24px;
-}
-/* IGNORED BY IE6 */
-body.rtl div.vectorMenu > div.menu {
- /* @noflip */
- margin-left: auto;
-}
-/* IGNORED BY IE6 */
-/* Also fixes old versions of FireFox */
-body.rtl div.vectorMenu > div.menu,
-x:-moz-any-link {
- /* @noflip */
- margin-left: 23px;
-}
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu div.menuForceShow {
- display: block;
-}
-div.vectorMenu ul {
- position: absolute;
- background-color: white;
- border: solid 1px silver;
- border-top-width: 0;
- list-style-type: none;
- list-style-image: none;
- padding: 0;
- margin: 0;
- margin-left: -1px;
- text-align: left;
-}
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
- min-width: 5em;
-}
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
- min-width: 0;
-}
-div.vectorMenu li {
- padding: 0;
- margin: 0;
- text-align: left;
- line-height: 1em;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
- display: inline-block;
- padding: 0.5em;
- white-space: nowrap;
- color: @menu-link-color;
- cursor: pointer;
- font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
- display: block;
-}
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
- color: #333;
- text-decoration: none;
-}
-/* Search */
-#p-search h3 {
- display: none;
-}
-#p-search {
- /* @noflip */
- float: left;
-}
-#p-search {
- margin-right: 0.5em;
- margin-left: 0.5em;
-}
-#p-search form,
-#p-search input {
- margin: 0;
- margin-top: 0.4em;
-}
-div#simpleSearch {
- display: block;
- width: 14em;
- height: 1.4em;
- margin-top: 0.65em;
- position: relative;
- min-height: 1px; /* Gotta trigger hasLayout for IE7 */
- border: solid 1px #aaa;
- color: black;
- background-color: white;
- .background-image('images/search-fade.png');
- background-position: top left;
- background-repeat: repeat-x;
-}
-div#simpleSearch input:focus {
- outline: none;
-}
-div#simpleSearch input {
- color: black;
-}
-div#simpleSearch input.placeholder {
- color: #999;
-}
-div#simpleSearch input::-webkit-input-placeholder {
- color: #999;
-}
-div#simpleSearch input:-moz-placeholder {
- color: #999;
-}
-div#simpleSearch input:-ms-input-placeholder {
- color: #999;
-}
-div#simpleSearch input#searchInput {
- position: absolute;
- top: 0;
- left: 0;
- width: 90%;
- margin: 0;
- padding: 0;
- padding-left: 0.2em;
- padding-top: 0.2em;
- padding-bottom: 0.2em;
- outline: none;
- border: none;
- /*
- * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
- * this from ever being shown anyways.
- */
- font-size: 13px;
- background-color: transparent;
- direction: ltr;
-}
-div#simpleSearch button#searchButton {
- position: absolute;
- width: 10%;
- right: 0;
- top: 0;
- padding: 0;
- padding-top: 0.3em;
- padding-bottom: 0.2em;
- padding-right: 0.4em;
- margin: 0;
- border: none;
- cursor: pointer;
- background-color: transparent;
- background-image: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#simpleSearch button#searchButton img {
- border: none;
- margin: 0;
- margin-top: -3px;
- padding: 0;
-}
-/* IGNORED BY IE6 */
-div#simpleSearch button#searchButton > img {
- margin: 0;
-}
-/* Panel */
-div#mw-panel {
- font-size: @menu-main-font-size;
- position: absolute;
- top: 160px;
- padding-top: 1em;
- width: 10em;
- left: 0;
-}
-div#mw-panel div.portal {
- padding-bottom: 1.5em;
- direction: ltr;
-}
-div#mw-panel div.portal h3 {
- font-weight: normal;
- color: #444;
- padding: @menu-main-heading-padding;
- cursor: default;
- border: none;
- font-size: @menu-main-heading-font-size;
-}
-div#mw-panel div.portal div.body {
- padding-top: 0.5em;
- margin: @menu-main-body-margin;
-
- .background-image('images/portal-break.png');
- background-repeat: no-repeat;
- background-position: top left;
-}
-div#mw-panel div.portal div.body ul {
- list-style-type: none;
- list-style-image: none;
- padding: @menu-main-body-padding;
- margin: 0;
-}
-div#mw-panel div.portal div.body ul li {
- line-height: 1.125em;
- padding: 0;
- padding-bottom: 0.5em;
- margin: 0;
- font-size: @menu-main-body-font-size;
- word-wrap: break-word;
-}
-div#mw-panel div.portal div.body ul li a {
- color: @menu-main-body-link-color;
- &:visited {
- color: @menu-main-body-link-visited-color;
- }
-}
-
-/* Footer */
-div#footer {
- margin-left: 10em;
- margin-top: 0;
- padding: 0.75em;
- direction: ltr;
-}
-div#footer ul {
- list-style-type: none;
- list-style-image: none;
- margin: 0;
- padding: 0;
-}
-div#footer ul li {
- margin: 0;
- padding: 0;
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- color: #333;
- font-size: 0.7em;
-}
-div#footer #footer-icons {
- float: right;
-}
-
-body.ltr div#footer #footer-places {
- /* @noflip */
- float: left;
-}
-div#footer #footer-info li {
- line-height: 1.4em;
-}
-div#footer #footer-icons li {
- float: left;
- margin-left: 0.5em;
- line-height: 2em;
- text-align: right;
-}
-div#footer #footer-places li {
- float: left;
- margin-right: 1em;
- line-height: 2em;
-}
-/* Logo */
-#p-logo {
- position: absolute;
- top: -160px;
- left: 0;
- width: 10em;
- height: 160px;
-}
-#p-logo a {
- display: block;
- width: 10em;
- height: 160px;
- background-repeat: no-repeat;
- background-position: center center;
- text-decoration: none;
-}
-
-ul {
- list-style-type: disc;
- .list-style-image('images/bullet-icon.png');
-}
-
-pre, .mw-code {
- line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
- font-size: 0.8em;
-}
-#firstHeading {
- padding-top: 0;
- margin-top: 0;
- font-size: @content-heading-font-size;
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
- background-position: left top;
- background-repeat: no-repeat;
- /* SVG support using a transparent gradient to guarantee cross-browser
- * compatibility (browsers able to understand gradient syntax support also SVG) */
- .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
- padding-left: 15px !important;
-}
-
-.redirectText {
- font-size: 140%;
-}
-
-.redirectMsg img {
- vertical-align: text-bottom;
-}
-
-#bodyContent {
- position: relative;
- width: 100%;
- line-height: 1.5em;
- font-size: @content-font-size;
-}
-
-/* mediawiki.notification */
-.skin-vector .mw-notification-area {
- font-size: 0.8em;
-}
-.skin-vector .mw-notification-area-layout {
- top: 7em;
-}
-.skin-vector .mw-notification {
- background-color: #fff;
- background-color: rgba(255, 255, 255, 0.93);
- padding: 0.75em 1.5em;
- border: solid 1px #a7d7f9;
- border-radius: 0.75em;
- -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
- box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-}
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
- margin: 0;
- padding: 0;
- outline: none;
- display: block;
- width: 26px;
- /* This hides the text but shows the background image */
- padding-top: 3.1em;
- margin-top: 0;
- /* Only applied in IE6 */
- margin-top: -0.8em !ie;
- height: 0;
- overflow: hidden;
- .background-image('images/watch-icons.png');
-}
-#ca-unwatch.icon a {
- background-position: -43px 60%;
-}
-#ca-watch.icon a {
- background-position: 5px 60%;
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
- background-position: -67px 60%;
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
- background-position: -19px 60%;
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
- .background-image('images/watch-icon-loading.gif');
- background-position: 5px 60%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
- display: none;
-}
-div.vectorTabs ul {
- .background-image('images/tab-break.png');
- background-position: right bottom;
- background-repeat: no-repeat;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
- font-size: 0.8em;
-}
-
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
- div#content,
- div#footer,
- #left-navigation {
- .transition(margin-left 250ms, padding 250ms;);
- }
-
- #p-logo {
- .transition(left 250ms);
- }
-
- #mw-panel {
- .transition(padding-right 250ms);
- }
-
- #p-search {
- .transition(margin-right 250ms);
- }
-
- #p-personal {
- .transition(right 250ms);
- }
-
- #mw-head-base {
- .transition(margin-left 250ms);
- }
-}
@import "variables.less";
@media screen {
- @import "screen.less";
- @import "externalLinks.less";
- @import "collapsibleNav.less";
+ @import "components/common.less";
+ @import "components/navigation.less";
+ @import "components/footer.less";
+ @import 'components/notifications.less';
+ @import "components/externalLinks.less";
}
@media screen and (min-width: 982px) {