The file never contained any re-usable components. To use it in a skin, load
'mediawiki.legacy.wikibits' (which IEFixes depends on) and that will import
IEFixes automatically if user agent conditions are met.
+* Code specific to the Math extension was marked as deprecated.
== Compatibility ==
production.
=== Configuration changes in 1.23 ===
+* $wgDebugLogGroups values may be set to an associative array with a
+ 'destination' key specifying the log destination. The array may also contain
+ a 'sample' key with a positive integer value N indicating that the log group
+ should be sampled by dispatching one in every N messages on average. The
+ sampling is random.
+* In addition to the current exception log format, MediaWiki now serializes
+ exception metadata to JSON and logs it to the 'exception-json' log group.
+ This makes MediaWiki easier to integrate with log aggregation and analysis
+ tools.
=== New features in 1.23 ===
* ResourceLoader can utilize the Web Storage API to cache modules client-side.
== PHP client for memcached ==
MediaWiki uses a fork of Ryan T. Dean's pure-PHP memcached client.
-The newer PECL module is not yet supported.
+It also supports the PECL PHP extension for memcached.
MediaWiki uses three object for object caching:
* $wgMemc, controlled by $wgMainCacheType
disable itself fairly smoothly.
By default, $wgMemc is used but when it is $parserMemc or $messageMemc
-this is mentionned below.
+this is mentioned below.
== Keys used ==
$wgDebugDumpSql = false;
/**
- * Set to an array of log group keys to filenames.
+ * Map of string log group names to log destinations.
+ *
* If set, wfDebugLog() output for that group will go to that file instead
* of the regular $wgDebugLogFile. Useful for enabling selective logging
* in production.
+ *
+ * Log destinations may be string values specifying a filename or URI, or they
+ * may be filename or an associative array mapping 'destination' to the desired
+ * filename. The associative array may also contain a 'sample' key with an
+ * integer value, specifying a sampling factor.
+ *
+ * @par Example:
+ * @code
+ * $wgDebugLogGroups['redis'] = '/var/log/mediawiki/redis.log';
+ * @endcode
+ *
+ * @par Advanced example:
+ * @code
+ * $wgDebugLogGroups['memcached'] = (
+ * 'destination' => '/var/log/mediawiki/memcached.log',
+ * 'sample' => 1000, // log 1 message out of every 1,000.
+ * );
+ * @endcode
*/
$wgDebugLogGroups = array();
return $e->_mwLogId;
}
+ /**
+ * If the exception occurred in the course of responding to a request,
+ * returns the requested URL. Otherwise, returns false.
+ *
+ * @since 1.23
+ * @return string|bool
+ */
+ public static function getURL() {
+ global $wgRequest;
+ if ( !isset( $wgRequest ) || $wgRequest instanceof FauxRequest ) {
+ return false;
+ }
+ return $wgRequest->getRequestURL();
+ }
+
/**
* Return the requested URL and point to file and line number from which the
* exception occurred.
* @return string
*/
public static function getLogMessage( Exception $e ) {
- global $wgRequest;
-
$id = self::getLogId( $e );
$file = $e->getFile();
$line = $e->getLine();
$message = $e->getMessage();
+ $url = self::getURL() ?: '[no req]';
- if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
- $url = $wgRequest->getRequestURL();
- if ( !$url ) {
- $url = '[no URL]';
- }
- } else {
- $url = '[no req]';
+ return "[$id] $url Exception from line $line of $file: $message";
+ }
+
+ /**
+ * Serialize an Exception object to JSON.
+ *
+ * The JSON object will have keys 'id', 'file', 'line', 'message', and
+ * 'url'. These keys map to string values, with the exception of 'line',
+ * which is a number, and 'url', which may be either a string URL or or
+ * null if the exception did not occur in the context of serving a web
+ * request.
+ *
+ * If $wgLogExceptionBacktrace is true, it will also have a 'backtrace'
+ * key, mapped to the array return value of Exception::getTrace, but with
+ * each element in each frame's "args" array (if set) replaced with the
+ * argument's class name (if the argument is an object) or type name (if
+ * the argument is a PHP primitive).
+ *
+ * @par Sample JSON record ($wgLogExceptionBacktrace = false):
+ * @code
+ * {
+ * "id": "c41fb419",
+ * "file": "/var/www/mediawiki/includes/cache/MessageCache.php",
+ * "line": 704,
+ * "message": "Non-string key given",
+ * "url": "/wiki/Main_Page"
+ * }
+ * @endcode
+ *
+ * @par Sample JSON record ($wgLogExceptionBacktrace = true):
+ * @code
+ * {
+ * "id": "dc457938",
+ * "file": "/vagrant/mediawiki/includes/cache/MessageCache.php",
+ * "line": 704,
+ * "message": "Non-string key given",
+ * "url": "/wiki/Main_Page",
+ * "backtrace": [{
+ * "file": "/vagrant/mediawiki/extensions/VisualEditor/VisualEditor.hooks.php",
+ * "line": 80,
+ * "function": "get",
+ * "class": "MessageCache",
+ * "type": "->",
+ * "args": ["array"]
+ * }]
+ * }
+ * @endcode
+ *
+ * @since 1.23
+ * @param Exception $e
+ * @param bool $pretty Add non-significant whitespace to improve readability (default: false).
+ * @param int $escaping Bitfield consisting of FormatJson::.*_OK class constants.
+ * @return string|bool: JSON string if successful; false upon failure
+ */
+ public static function jsonSerializeException( Exception $e, $pretty = false, $escaping = 0 ) {
+ global $wgLogExceptionBacktrace;
+
+ $exceptionData = array(
+ 'id' => self::getLogId( $e ),
+ 'file' => $e->getFile(),
+ 'line' => $e->getLine(),
+ 'message' => $e->getMessage(),
+ );
+
+ // Because MediaWiki is first and foremost a web application, we set a
+ // 'url' key unconditionally, but set it to null if the exception does
+ // not occur in the context of a web request, as a way of making that
+ // fact visible and explicit.
+ $exceptionData['url'] = self::getURL() ?: null;
+
+ if ( $wgLogExceptionBacktrace ) {
+ // Argument values may not be serializable, so redact them.
+ $exceptionData['backtrace'] = self::getRedactedTrace( $e );
}
- return "[$id] $url Exception from line $line of $file: $message";
+ return FormatJson::encode( $exceptionData, $pretty, $escaping );
}
/**
} else {
wfDebugLog( 'exception', $log );
}
+
+ $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
+ if ( $json !== false ) {
+ wfDebugLog( 'exception-json', $json, false );
+ }
}
+
}
}
* no valid URL can be constructed
*/
function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
- global $wgServer, $wgCanonicalServer, $wgInternalServer;
+ global $wgServer, $wgCanonicalServer, $wgInternalServer, $wgRequest;
$serverUrl = $wgServer;
if ( $defaultProto === PROTO_CANONICAL ) {
$serverUrl = $wgCanonicalServer;
$serverUrl = $wgInternalServer;
}
if ( $defaultProto === PROTO_CURRENT ) {
- $defaultProto = WebRequest::detectProtocol() . '://';
+ $defaultProto = $wgRequest->getProtocol() . '://';
}
// Analyze $serverUrl to obtain its protocol
/**
* Send a line to a supplementary debug log file, if configured, or main debug log if not.
- * $wgDebugLogGroups[$logGroup] should be set to a filename to send to a separate log.
+ * To configure a supplementary log file, set $wgDebugLogGroups[$logGroup] to a string
+ * filename or an associative array mapping 'destination' to the desired filename. The
+ * associative array may also contain a 'sample' key with an integer value, specifying
+ * a sampling factor.
+ *
+ * @since 1.23 support for sampling log messages via $wgDebugLogGroups.
*
* @param $logGroup String
* @param $text String
function wfDebugLog( $logGroup, $text, $public = true ) {
global $wgDebugLogGroups;
$text = trim( $text ) . "\n";
- if ( isset( $wgDebugLogGroups[$logGroup] ) ) {
- $time = wfTimestamp( TS_DB );
- $wiki = wfWikiID();
- $host = wfHostname();
- wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
- } elseif ( $public === true ) {
- wfDebug( "[$logGroup] $text", false );
+
+ if ( !isset( $wgDebugLogGroups[$logGroup] ) ) {
+ if ( $public === true ) {
+ wfDebug( "[$logGroup] $text", false );
+ }
+ return;
}
+
+ $logConfig = $wgDebugLogGroups[$logGroup];
+ if ( is_array( $logConfig ) ) {
+ if ( isset( $logConfig['sample'] ) && mt_rand( 1, $logConfig['sample'] ) !== 1 ) {
+ return;
+ }
+ $destination = $logConfig['destination'];
+ } else {
+ $destination = strval( $logConfig );
+ }
+
+ $time = wfTimestamp( TS_DB );
+ $wiki = wfWikiID();
+ $host = wfHostname();
+ wfErrorLog( "$time $host $wiki: $text", $destination );
}
/**
*/
private $ip;
+ /**
+ * Cached URL protocol
+ * @var string
+ */
+ private $protocol;
+
public function __construct() {
/// @todo FIXME: This preemptive de-quoting can interfere with other web libraries
/// and increases our memory footprint. It would be cleaner to do on
* @return string
*/
public static function detectServer() {
- list( $proto, $stdPort ) = self::detectProtocolAndStdPort();
+ $proto = self::detectProtocol();
+ $stdPort = $proto === 'https' ? 443 : 80;
$varNames = array( 'HTTP_HOST', 'SERVER_NAME', 'HOSTNAME', 'SERVER_ADDR' );
$host = 'localhost';
}
/**
+ * Detect the protocol from $_SERVER.
+ * This is for use prior to Setup.php, when no WebRequest object is available.
+ * At other times, use the non-static function getProtocol().
+ *
* @return array
*/
- public static function detectProtocolAndStdPort() {
+ public static function detectProtocol() {
if ( ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ||
( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) ) {
- $arr = array( 'https', 443 );
+ return 'https';
} else {
- $arr = array( 'http', 80 );
+ return 'http';
}
return $arr;
}
/**
+ * Get the current URL protocol (http or https)
* @return string
*/
- public static function detectProtocol() {
- list( $proto, ) = self::detectProtocolAndStdPort();
- return $proto;
+ public function getProtocol() {
+ if ( $this->protocol === null ) {
+ $this->protocol = self::detectProtocol();
+ }
+ return $this->protocol;
}
/**
* fake GET/POST values
* @param bool $wasPosted whether to treat the data as POST
* @param $session Mixed: session array or null
+ * @param string $protocol 'http' or 'https'
* @throws MWException
*/
- public function __construct( $data = array(), $wasPosted = false, $session = null ) {
+ public function __construct( $data = array(), $wasPosted = false, $session = null, $protocol = 'http' ) {
if ( is_array( $data ) ) {
$this->data = $data;
} else {
if ( $session ) {
$this->session = $session;
}
+ $this->protocol = $protocol;
}
/**
$this->notImplemented( __METHOD__ );
}
+ public function getProtocol() {
+ return $this->protocol;
+ }
+
/**
* @param string $name The name of the header to get (case insensitive).
* @return bool|string
public function getIP() {
return $this->base->getIP();
}
+
+ public function getProtocol() {
+ return $this->base->getProtocol();
+ }
}
&& $this->context->getUser()->requiresHTTPS()
)
) &&
- $request->detectProtocol() == 'http'
+ $request->getProtocol() == 'http'
) {
$oldUrl = $request->getFullRequestURL();
$redirUrl = str_replace( 'http://', 'https://', $oldUrl );
$updates = $this->getDeletionUpdates( $content );
DataUpdate::runUpdates( $updates );
+ // Reparse any pages transcluding this page
+ LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+
// Clear caches
WikiPage::onArticleDelete( $this->mTitle );
/**
* Makes a pseudo-RC entry from a cur row
*
- * @deprected in 1.22
+ * @deprecated in 1.22
* @param $row
*/
public function loadFromCurRow( $row ) {
}
}
}
+
+ /**
+ * Resend an AUTH request to the redis server (useful after disconnects)
+ *
+ * This method is for internal use only
+ *
+ * @param string $server
+ * @param Redis $conn
+ * @return bool Success
+ */
+ public function reauthenticateConnection( $server, Redis $conn ) {
+ if ( $this->password !== null ) {
+ if ( !$conn->auth( $this->password ) ) {
+ wfDebugLog( 'redis', "Authentication error connecting to $server" );
+ return false;
+ }
+ }
+ return true;
+ }
}
/**
public function luaEval( $script, array $params, $numKeys ) {
$sha1 = sha1( $script ); // 40 char hex
$conn = $this->conn; // convenience
+ $server = $this->server; // convenience
// Try to run the server-side cached copy of the script
$conn->clearLastError();
$res = $conn->evalSha( $sha1, $params, $numKeys );
+ // If we got a permission error reply that means that (a) we are not in
+ // multi()/pipeline() and (b) some connection problem likely occured. If
+ // the password the client gave was just wrong, an exception should have
+ // been thrown back in getConnection() previously.
+ if ( preg_match( '/^ERR operation not permitted\b/', $conn->getLastError() ) ) {
+ $this->pool->reauthenticateConnection( $server, $conn );
+ $conn->clearLastError();
+ $res = $conn->eval( $script, $params, $numKeys );
+ wfDebugLog( 'redis', "Used automatic re-authentication for Lua script $sha1." );
+ }
// If the script is not in cache, use eval() to retry and cache it
if ( preg_match( '/^NOSCRIPT/', $conn->getLastError() ) ) {
$conn->clearLastError();
}
if ( $conn->getLastError() ) { // script bug?
- $server = $this->server;
wfDebugLog( 'redis', "Lua script error on server $server: " . $conn->getLastError() );
}
$s = preg_replace( '/\(\d+\)/', '', $s );
// No FULLTEXT
$s = preg_replace( '/\bfulltext\b/i', '', $s );
+ } elseif ( preg_match( '/^\s*DROP INDEX/i', $s ) ) {
+ // DROP INDEX is database-wide, not table-specific, so no ON <table> clause.
+ $s = preg_replace( '/\sON\s+[^\s]*/i', '', $s );
}
return $s;
}
*/
final public function __construct( FileBackendStore $backend, array $params ) {
$this->backend = $backend;
- list( $required, $optional ) = $this->allowedParams();
- // @todo normalizeAnyStoragePaths() calls are overzealous, use a parameter list
+ list( $required, $optional, $paths ) = $this->allowedParams();
foreach ( $required as $name ) {
if ( isset( $params[$name] ) ) {
- // Normalize paths so the paths to the same file have the same string
- $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
+ $this->params[$name] = $params[$name];
} else {
throw new MWException( "File operation missing parameter '$name'." );
}
}
foreach ( $optional as $name ) {
if ( isset( $params[$name] ) ) {
- // Normalize paths so the paths to the same file have the same string
- $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
+ $this->params[$name] = $params[$name];
}
}
- $this->params = $params;
- }
-
- /**
- * Normalize $item or anything in $item that is a valid storage path
- *
- * @param string $item|array
- * @return string|Array
- */
- protected function normalizeAnyStoragePaths( $item ) {
- if ( is_array( $item ) ) {
- $res = array();
- foreach ( $item as $k => $v ) {
- $k = self::normalizeIfValidStoragePath( $k );
- $v = self::normalizeIfValidStoragePath( $v );
- $res[$k] = $v;
+ foreach ( $paths as $name ) {
+ if ( isset( $this->params[$name] ) ) {
+ // Normalize paths so the paths to the same file have the same string
+ $this->params[$name] = self::normalizeIfValidStoragePath( $this->params[$name] );
}
- return $res;
- } else {
- return self::normalizeIfValidStoragePath( $item );
}
}
+
/**
* Normalize a string if it is a valid storage path
*
/**
* Get the file operation parameters
*
- * @return Array (required params list, optional params list)
+ * @return Array (required params list, optional params list, list of params that are paths)
*/
protected function allowedParams() {
- return array( array(), array() );
+ return array( array(), array(), array() );
}
/**
*/
class CreateFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'content', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'headers' ) );
+ return array(
+ array( 'content', 'dst' ),
+ array( 'overwrite', 'overwriteSame', 'headers' ),
+ array( 'dst' )
+ );
}
protected function doPrecheck( array &$predicates ) {
*/
class StoreFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'headers' ) );
+ return array(
+ array( 'src', 'dst' ),
+ array( 'overwrite', 'overwriteSame', 'headers' ),
+ array( 'src', 'dst' )
+ );
}
protected function doPrecheck( array &$predicates ) {
*/
class CopyFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
+ return array(
+ array( 'src', 'dst' ),
+ array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ),
+ array( 'src', 'dst' )
+ );
}
protected function doPrecheck( array &$predicates ) {
*/
class MoveFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
+ return array(
+ array( 'src', 'dst' ),
+ array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ),
+ array( 'src', 'dst' )
+ );
}
protected function doPrecheck( array &$predicates ) {
*/
class DeleteFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'src' ), array( 'ignoreMissingSource' ) );
+ return array( array( 'src' ), array( 'ignoreMissingSource' ), array( 'src' ) );
}
protected function doPrecheck( array &$predicates ) {
*/
class DescribeFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'src' ), array( 'headers' ) );
+ return array( array( 'src' ), array( 'headers' ), array( 'src' ) );
}
protected function doPrecheck( array &$predicates ) {
/**
* Get a labelled checkbox to configure a local boolean variable.
*
+ * @param string $var
+ * @param string $label
+ * @param array $attribs Optional.
+ * @param string $helpData Optional.
* @return string
*/
public function getCheckBox( $var, $label, $attribs = array(), $helpData = "" ) {
/**
* Get a standard web-user fieldset
- * @param string $noCreateMsg Message to display instead of the creation checkbox.
- * Set this to false to show a creation checkbox.
+ * @param string|bool $noCreateMsg Message to display instead of the creation checkbox.
+ * Set this to false to show a creation checkbox (default).
*
* @return String
*/
/**
* File handle for SQL output.
*
- * @var Filehandle
+ * @var resource
*/
protected $fileHandle = null;
/**
* Constructor
*
- * @param $db DatabaseBase object to perform updates on
+ * @param DatabaseBase $db To perform updates on
* @param bool $shared Whether to perform updates on shared tables
- * @param $maintenance Maintenance Maintenance object which created us
+ * @param Maintenance $maintenance Maintenance object which created us
*/
protected function __construct( DatabaseBase &$db, $shared, Maintenance $maintenance = null ) {
$this->db = $db;
*
* @since 1.17
*
- * @param array $update the update to run. Format is the following:
+ * @param array $update The update to run. Format is the following:
* first item is the callback function, it also can be a
* simple string with the name of a function in this class,
* following elements are parameters to the function.
/**
* Do all the updates
*
- * @param array $what what updates to perform
+ * @param array $what What updates to perform
*/
public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
global $wgVersion;
* Helper function for doUpdates()
*
* @param array $updates of updates to run
- * @param $passSelf Boolean: whether to pass this object we calling external
+ * @param bool $passSelf Whether to pass this object we calling external
* functions
*/
private function runUpdates( array $updates, $passSelf ) {
}
/**
- * @param $version
- * @param $updates array
+ * @param string $version
+ * @param array $updates
*/
protected function setAppliedUpdates( $version, $updates = array() ) {
$this->db->clearFlag( DBO_DDLMODE );
* Obviously, only use this for updates that occur after the updatelog table was
* created!
* @param string $key Name of the key to check for
- *
* @return bool
*/
public function updateRowExists( $key ) {
* Obviously, only use this for updates that occur after the updatelog table was
* created!
* @param string $key Name of key to insert
- * @param string $val [optional] value to insert along with the key
+ * @param string $val [optional] Value to insert along with the key
*/
public function insertUpdateRow( $key, $val = null ) {
$this->db->clearFlag( DBO_DDLMODE );
* Updates will be prevented if the table is a shared table and it is not
* specified to run updates on shared tables.
*
- * @param string $name table name
+ * @param string $name Table name
* @return bool
*/
protected function doTable( $name ) {
* 1.13...) with the values being arrays of updates, identical to how
* updaters.inc did it (for now)
*
- * @return Array
+ * @return array
*/
abstract protected function getCoreUpdateList();
*
* This is used as a callback for for sourceLine().
*
- * @param string $line text to append to the file
- * @return Boolean false to skip actually executing the file
+ * @param string $line Text to append to the file
+ * @return bool False to skip actually executing the file
* @throws MWException
*/
public function appendLine( $line ) {
* @param string $path Path to the patch file
* @param $isFullPath Boolean Whether to treat $path as a relative or not
* @param string $msg Description of the patch
- * @return boolean false if patch is skipped.
+ * @return bool False if patch is skipped.
*/
protected function applyPatch( $path, $isFullPath = false, $msg = null ) {
if ( $msg === null ) {
*
* @param string $name Name of the new table
* @param string $patch Path to the patch file
- * @param $fullpath Boolean Whether to treat $patch path as a relative or not
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param bool $fullpath Whether to treat $patch path as a relative or not
+ * @return bool False if this was skipped because schema changes are skipped
*/
protected function addTable( $name, $patch, $fullpath = false ) {
if ( !$this->doTable( $name ) ) {
* @param string $table Name of the table to modify
* @param string $field Name of the new field
* @param string $patch Path to the patch file
- * @param $fullpath Boolean Whether to treat $patch path as a relative or not
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param bool $fullpath Whether to treat $patch path as a relative or not
+ * @return bool False if this was skipped because schema changes are skipped
*/
protected function addField( $table, $field, $patch, $fullpath = false ) {
if ( !$this->doTable( $table ) ) {
* @param string $table Name of the table to modify
* @param string $index Name of the new index
* @param string $patch Path to the patch file
- * @param $fullpath Boolean Whether to treat $patch path as a relative or not
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param bool $fullpath Whether to treat $patch path as a relative or not
+ * @return bool False if this was skipped because schema changes are skipped
*/
protected function addIndex( $table, $index, $patch, $fullpath = false ) {
if ( !$this->doTable( $table ) ) {
* @param string $table Name of the table to modify
* @param string $field Name of the old field
* @param string $patch Path to the patch file
- * @param $fullpath Boolean Whether to treat $patch path as a relative or not
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param bool $fullpath Whether to treat $patch path as a relative or not
+ * @return bool False if this was skipped because schema changes are skipped
*/
protected function dropField( $table, $field, $patch, $fullpath = false ) {
if ( !$this->doTable( $table ) ) {
* @param string $table Name of the table to modify
* @param string $index Name of the index
* @param string $patch Path to the patch file
- * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param bool $fullpath Whether to treat $patch path as a relative or not
+ * @return bool False if this was skipped because schema changes are skipped
*/
protected function dropIndex( $table, $index, $patch, $fullpath = false ) {
if ( !$this->doTable( $table ) ) {
* @param $skipBothIndexExistWarning Boolean: Whether to warn if both the
* old and the new indexes exist.
* @param string $patch Path to the patch file
- * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param bool $fullpath Whether to treat $patch path as a relative or not
+ * @return bool False if this was skipped because schema changes are skipped
*/
protected function renameIndex( $table, $oldIndex, $newIndex,
$skipBothIndexExistWarning, $patch, $fullpath = false
*
* Public @since 1.20
*
- * @param $table string
- * @param $patch string|false
- * @param $fullpath bool
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param string $table Table to drop.
+ * @param string|bool $patch String of patch file that will drop the table. Default: false.
+ * @param bool $fullpath Whether $patch is a full path. Default: false.
+ * @return bool False if this was skipped because schema changes are skipped
*/
public function dropTable( $table, $patch = false, $fullpath = false ) {
if ( !$this->doTable( $table ) ) {
/**
* Modify an existing field
*
- * @param string $table name of the table to which the field belongs
- * @param string $field name of the field to modify
- * @param string $patch path to the patch file
- * @param $fullpath Boolean: whether to treat $patch path as a relative or not
- * @return Boolean false if this was skipped because schema changes are skipped
+ * @param string $table Name of the table to which the field belongs
+ * @param string $field Name of the field to modify
+ * @param string $patch Path to the patch file
+ * @param bool $fullpath Whether to treat $patch path as a relative or not
+ * @return bool False if this was skipped because schema changes are skipped
*/
public function modifyField( $table, $field, $patch, $fullpath = false ) {
if ( !$this->doTable( $table ) ) {
/**
* Same as locateExecutable(), but checks in getPossibleBinPaths() by default
* @see locateExecutable()
- * @param $names
- * @param $versionInfo bool
+ * @param array $names Array of possible names.
+ * @param array|bool $versionInfo Default: false or array with two members:
+ * 0 => Command to run for version check, with $1 for the full executable name
+ * 1 => String to compare the output with
+ *
+ * If $versionInfo is not false, only executables with a version
+ * matching $versionInfo[1] will be returned.
* @return bool|string
*/
public static function locateExecutableInDefaultPaths( $names, $versionInfo = false ) {
* 1.4 betas were missing the 'binary' marker from logging.log_title,
* which causes a collation mismatch error on joins in MySQL 4.1.
*
- * @param string $table table name
- * @param string $field field name to check
- * @param string $patchFile path to the patch to correct the field
+ * @param string $table Table name
+ * @param string $field Field name to check
+ * @param string $patchFile Path to the patch to correct the field
+ * @return bool
*/
protected function checkBin( $table, $field, $patchFile ) {
if ( !$this->doTable( $table ) ) {
/**
* Check whether an index contain a field
*
- * @param string $table table name
- * @param string $index index name to check
- * @param string $field field that should be in the index
- * @return Boolean
+ * @param string $table Table name
+ * @param string $index Index name to check
+ * @param string $field Field that should be in the index
+ * @return bool
*/
protected function indexHasField( $table, $index, $field ) {
if ( !$this->doTable( $table ) ) {
/**
* Constructor.
*
- * @param $request WebRequest
+ * @param WebRequest $request
*/
public function __construct( WebRequest $request ) {
parent::__construct();
*
* @param array $session initial session array
*
- * @return Array: new session array
+ * @return array New session array
*/
public function execute( array $session ) {
$this->session = $session;
/**
* Temporary error handler for session start debugging.
* @param $errno
- * @param $errstr string
+ * @param string $errstr
*/
public function errorHandler( $errno, $errstr ) {
$this->phpErrors[] = $errstr;
/**
* Get a URL for submission back to the same script.
*
- * @param $query array
+ * @param array $query
* @return string
*/
public function getUrl( $query = array() ) {
/**
* Get a WebInstallerPage by name.
*
- * @param $pageName String
+ * @param string $pageName
* @return WebInstallerPage
*/
public function getPageByName( $pageName ) {
/**
* Get a session variable.
*
- * @param $name String
+ * @param string $name
* @param $default
* @return null
*/
/**
* Set a session variable.
- * @param string $name key for the variable
- * @param $value Mixed
+ * @param string $name Key for the variable
+ * @param mixed $value
*/
public function setSession( $name, $value ) {
$this->session[$name] = $value;
/**
* Called by execute() before page output starts, to show a page list.
*
- * @param $currentPageName string
+ * @param string $currentPageName
*/
private function startPageWrapper( $currentPageName ) {
$s = "<div class=\"config-page-wrapper\">\n";
/**
* Get a list item for the page list.
*
- * @param $pageName string
- * @param $enabled boolean
- * @param $currentPageName string
+ * @param string $pageName
+ * @param bool $enabled
+ * @param string $currentPageName
*
* @return string
*/
/**
* Get HTML for an error box with an icon.
*
- * @param string $text wikitext, get this with wfMessage()->plain()
+ * @param string $text Wikitext, get this with wfMessage()->plain()
*
* @return string
*/
/**
* Get HTML for a warning box with an icon.
*
- * @param string $text wikitext, get this with wfMessage()->plain()
+ * @param string $text Wikitext, get this with wfMessage()->plain()
*
* @return string
*/
/**
* Get HTML for an info box with an icon.
*
- * @param string $text wikitext, get this with wfMessage()->plain()
- * @param string $icon icon name, file in skins/common/images
- * @param string $class additional class name to add to the wrapper div
+ * @param string $text Wikitext, get this with wfMessage()->plain()
+ * @param string|bool $icon Icon name, file in skins/common/images. Default: false
+ * @param string|bool $class Additional class name to add to the wrapper div. Default: false.
*
* @return string
*/
/**
* Output a help box.
- * @param string $msg key for wfMessage()
+ * @param string $msg Key for wfMessage()
*/
public function showHelpBox( $msg /*, ... */ ) {
$args = func_get_args();
* Show a short informational message.
* Output looks like a list.
*
- * @param $msg string
+ * @param string $msg
*/
public function showMessage( $msg /*, ... */ ) {
$args = func_get_args();
}
/**
- * @param $status Status
+ * @param Status $status
*/
public function showStatusMessage( Status $status ) {
$errors = array_merge( $status->getErrorsArray(), $status->getWarningsArray() );
* @param $msg
* @param $forId
* @param $contents
- * @param $helpData string
+ * @param string $helpData
* @return string
*/
public function label( $msg, $forId, $contents, $helpData = "" ) {
/**
* Get a labelled text box to configure a variable.
*
- * @param $params Array
+ * @param array $params
* Parameters are:
* var: The variable to be configured (required)
* label: The message name for the label (required)
/**
* Get a labelled textarea to configure a variable
*
- * @param $params Array
+ * @param array $params
* Parameters are:
* var: The variable to be configured (required)
* label: The message name for the label (required)
* Get a labelled password box to configure a variable.
*
* Implements password hiding
- * @param $params Array
+ * @param array $params
* Parameters are:
* var: The variable to be configured (required)
* label: The message name for the label (required)
/**
* Get a labelled checkbox to configure a boolean variable.
*
- * @param $params Array
+ * @param array $params
* Parameters are:
* var: The variable to be configured (required)
* label: The message name for the label (required)
/**
* Get a set of labelled radio buttons.
*
- * @param $params Array
+ * @param array $params
* Parameters are:
* var: The variable to be configured (required)
* label: The message name for the label (required)
/**
* Output an error or warning box using a Status object.
*
- * @param $status Status
+ * @param Status $status
*/
public function showStatusBox( $status ) {
if ( !$status->isGood() ) {
* Assumes that variables containing "password" in the name are (potentially
* fake) passwords.
*
- * @param $varNames Array
- * @param string $prefix the prefix added to variables to obtain form names
+ * @param array $varNames
+ * @param string $prefix The prefix added to variables to obtain form names
*
* @return array
*/
* @param $text
* @param $attribs
* @param $parser
- * @return String Html for download link
+ * @return string Html for download link
*/
public function downloadLinkHook( $text, $attribs, $parser ) {
$img = Html::element( 'img', array(
/** @var BagOStuff */
protected $cache;
+ protected $maxPartitionsTry; // integer; maximum number of partitions to try
+
const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
* the federated queue itself (e.g. 'order' and 'claimTTL').
* - partitionsNoPush : List of partition names that can handle pop() but not push().
* This can be used to migrate away from a certain partition.
+ * - maxPartitionsTry : Maximum number of times to attempt job insertion using
+ * different partition queues. This improves availability
+ * during failure, at the cost of added latency and somewhat
+ * less reliable job de-duplication mechanisms.
* @param array $params
*/
protected function __construct( array $params ) {
if ( !isset( $params['partitionsBySection'][$section] ) ) {
throw new MWException( "No configuration for section '$section'." );
}
+ $this->maxPartitionsTry = isset( $params['maxPartitionsTry'] )
+ ? $params['maxPartitionsTry']
+ : 2;
// Get the full partition map
$this->partitionMap = $params['partitionsBySection'][$section];
arsort( $this->partitionMap, SORT_NUMERIC );
}
// Get the config to pass to merge into each partition queue config
$baseConfig = $params;
- foreach ( array( 'class', 'sectionsByWiki',
+ foreach ( array( 'class', 'sectionsByWiki', 'maxPartitionsTry',
'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o )
{
- unset( $baseConfig[$o] );
+ unset( $baseConfig[$o] ); // partition queue doesn't care about this
}
// Get the partition queue objects
foreach ( $this->partitionMap as $partition => $w ) {
}
protected function doBatchPush( array $jobs, $flags ) {
- if ( !count( $jobs ) ) {
- return true; // nothing to do
- }
// Local ring variable that may be changed to point to a new ring on failure
$partitionRing = $this->partitionPushRing;
- // Try to insert the jobs and update $partitionsTry on any failures
- $jobsLeft = $this->tryJobInsertions( $jobs, $partitionRing, $flags );
- if ( count( $jobsLeft ) ) { // some jobs failed to insert?
- // Try to insert the remaning jobs once more, ignoring the bad partitions
- return !count( $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags ) );
+ // Try to insert the jobs and update $partitionsTry on any failures.
+ // Retry to insert any remaning jobs again, ignoring the bad partitions.
+ $jobsLeft = $jobs;
+ for ( $i = $this->maxPartitionsTry; $i > 0 && count( $jobsLeft ); --$i ) {
+ $jobsLeft = $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags );
+ }
+ if ( count( $jobsLeft ) ) {
+ throw new JobQueueError(
+ "Could not insert job(s), {$this->maxPartitionsTry} partitions tried." );
}
return true;
}
/**
* @params include:
* - redisConfig : An array of parameters to RedisConnectionPool::__construct().
- * Note that the serializer option is ignored "none" is always used.
+ * Note that the serializer option is ignored as "none" is always used.
* - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
* If a hostname is specified but no port, the standard port number
* 6379 will be used. Required.
$common = $file->getCommonMetaArray();
- foreach ( $common as $key => $value ) {
- $fileMetadata[$key] = array(
- 'value' => $value,
- 'source' => 'file-metadata',
- );
+ if ( $common !== false ) {
+ foreach ( $common as $key => $value ) {
+ $fileMetadata[$key] = array(
+ 'value' => $value,
+ 'source' => 'file-metadata',
+ );
+ }
}
wfProfileOut( __METHOD__ );
function getExternalLinkTarget() { return $this->mExternalLinkTarget; }
function getDisableContentConversion() { return $this->mDisableContentConversion; }
function getDisableTitleConversion() { return $this->mDisableTitleConversion; }
+ /** @deprecated since 1.22 use User::getOption('math') instead */
function getMath() { $this->optionUsed( 'math' );
return $this->mMath; }
function getThumbSize() { $this->optionUsed( 'thumbsize' );
function setExternalLinkTarget( $x ) { return wfSetVar( $this->mExternalLinkTarget, $x ); }
function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); }
function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); }
+ /** @deprecated since 1.22 */
function setMath( $x ) { return wfSetVar( $this->mMath, $x ); }
function setUserLang( $x ) {
if ( is_string( $x ) ) {
$this->mAction = $request->getVal( 'action' );
$this->mRemember = $request->getCheck( 'wpRemember' );
$this->mFromHTTP = $request->getBool( 'fromhttp', false );
- $this->mStickHTTPS = ( !$this->mFromHTTP && $request->detectProtocol() === 'https' ) || $request->getBool( 'wpForceHttps', false );
+ $this->mStickHTTPS = ( !$this->mFromHTTP && $request->getProtocol() === 'https' ) || $request->getBool( 'wpForceHttps', false );
$this->mLanguage = $request->getText( 'uselang' );
$this->mSkipCookieCheck = $request->getCheck( 'wpSkipCookieCheck' );
$this->mToken = ( $this->mType == 'signup' ) ? $request->getVal( 'wpCreateaccountToken' ) : $request->getVal( 'wpLoginToken' );
// If logging in and not on HTTPS, either redirect to it or offer a link.
global $wgSecureLogin;
- if ( WebRequest::detectProtocol() !== 'https' ) {
+ if ( $this->mRequest->getProtocol() !== 'https' ) {
$title = $this->getFullTitle();
$query = array(
'returnto' => $this->mReturnTo,
$template->set( 'secureLoginUrl', $this->mSecureLoginUrl );
// Use loginend-https for HTTPS requests if it's not blank, loginend otherwise
// Ditto for signupend. New forms use neither.
- $usingHTTPS = WebRequest::detectProtocol() == 'https';
+ $usingHTTPS = $this->mRequest->getProtocol() == 'https';
$loginendHTTPS = $this->msg( 'loginend-https' );
$signupendHTTPS = $this->msg( 'signupend-https' );
if ( $usingHTTPS && !$loginendHTTPS->isBlank() ) {
function markNoConversion( $text, $noParse = false ) { return $text; }
function convertCategoryKey( $key ) { return $key; }
function convertLinkToAllVariants( $text ) { return $this->autoConvertToAllVariants( $text ); }
+ /** @deprecated since 1.22 is no longer used */
function armourMath( $text ) { return $text; }
function validateVariant( $variant = null ) { return $variant === $this->mLang->getCode() ? $variant : null; }
function translate( $text, $variant ) { return $text; }
*
* @param $text string
* @return string
+ * @deprecated since 1.22 is no longer used
*/
public function armourMath( $text ) {
return $this->mConverter->armourMath( $text );
* @param $text String: text to armour against conversion
* @return String: armoured text where { and } have been converted to
* { and }
+ * @deprecated since 1.22 is no longer used
*/
public function armourMath( $text ) {
// convert '-{' and '}-' to '-{' and '}-' to prevent
'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
'am' => 'አማርኛ', # Amharic
'an' => 'aragonés', # Aragonese
- 'ang' => 'Ænglisc', # Old English (Bug 23283)
+ 'ang' => 'Ænglisc', # Old English, bug 23283
'anp' => 'अङ्गिका', # Angika
'ar' => 'العربية', # Arabic
'arc' => 'ܐܪܡܝܐ', # Aramaic
'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
'be' => 'беларуская', # Belarusian normative
'be-tarask' => "беларуская (тарашкевіца)\xE2\x80\x8E", # Belarusian in Taraskievica orthography
- 'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E", # Belarusian in Taraskievica orthography; compat link
+ 'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E", # (be-tarask compat)
'bg' => 'български', # Bulgarian
- 'bh' => 'भोजपुरी', # Bihari macro language. Falls back to Bhojpuri (bho). The name actually says "Bhojpuri".
+ 'bh' => 'भोजपुरी', # Bihari macro language. Falls back to Bhojpuri (bho)
'bho' => 'भोजपुरी', # Bhojpuri
'bi' => 'Bislama', # Bislama
'bjn' => 'Bahasa Banjar', # Banjarese
'gl' => 'galego', # Galician
'glk' => 'گیلکی', # Gilaki
'gn' => 'Avañe\'ẽ', # Guaraní, Paraguayan
+ 'gom-latn' => 'Konknni', # Goan Konkani (Latin script)
'got' => '𐌲𐌿𐍄𐌹𐍃𐌺', # Gothic
'grc' => 'Ἀρχαία ἑλληνικὴ', # Ancient Greek
'gsw' => 'Alemannisch', # Alemannic
'ig' => 'Igbo', # Igbo
'ii' => 'ꆇꉙ', # Sichuan Yi
'ik' => 'Iñupiak', # Inupiak (Inupiatun, Northwest Alaska / Inupiatun, North Alaskan)
- 'ike-cans' => 'ᐃᓄᒃᑎᑐᑦ', # Inuktitut, Eastern Canadian/Eastern Canadian "Eskimo"/"Eastern Arctic Eskimo"/Inuit (Unified Canadian Aboriginal Syllabics)
+ 'ike-cans' => 'ᐃᓄᒃᑎᑐᑦ', # Inuktitut, Eastern Canadian (Unified Canadian Aboriginal Syllabics)
'ike-latn' => 'inuktitut', # Inuktitut, Eastern Canadian (Latin script)
'ilo' => 'Ilokano', # Ilokano
'inh' => 'ГӀалгӀай', # Ingush
'io' => 'Ido', # Ido
'is' => 'íslenska', # Icelandic
'it' => 'italiano', # Italian
- 'iu' => 'ᐃᓄᒃᑎᑐᑦ/inuktitut', # Inuktitut (macro language - do no localise, see ike/ikt - falls back to ike-cans)
+ 'iu' => 'ᐃᓄᒃᑎᑐᑦ/inuktitut', # Inuktitut (macro language, see ike/ikt, falls back to ike-cans)
'ja' => '日本語', # Japanese
'jam' => 'Patois', # Jamaican Creole English
'jbo' => 'Lojban', # Lojban
'ltg' => 'latgaļu', # Latgalian
'lus' => 'Mizo ţawng', # Mizo/Lushai
'lv' => 'latviešu', # Latvian
- 'lzh' => '文言', # Literary Chinese -- (bug 8217) lzh instead of zh-classical, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=l
+ 'lzh' => '文言', # Literary Chinese, bug 8217
'lzz' => 'Lazuri', # Laz
'mai' => 'मैथिली', # Maithili
'map-bms' => 'Basa Banyumasan', # Banyumasan
'myv' => 'эрзянь', # Erzya
'mzn' => 'مازِرونی', # Mazanderani
'na' => 'Dorerin Naoero', # Nauruan
- 'nah' => 'Nāhuatl', # Nahuatl, en:Wikipedia writes Nahuatlahtolli, while another form is Náhuatl
- 'nan' => 'Bân-lâm-gú', # Min-nan -- (bug 8217) nan instead of zh-min-nan, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=n
+ 'nah' => 'Nāhuatl', # Nahuatl (not in ISO 639-3)
+ 'nan' => 'Bân-lâm-gú', # Min-nan, bug 8217
'nap' => 'Napulitano', # Neapolitan, bug 43793
'nb' => "norsk bokmål", # Norwegian (Bokmal)
'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
'oc' => 'occitan', # Occitan
'om' => 'Oromoo', # Oromo
'or' => 'ଓଡ଼ିଆ', # Oriya
- 'os' => 'Ирон', # Ossetic -- fixed per bug 29091
+ 'os' => 'Ирон', # Ossetic, bug 29091
'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
'pag' => 'Pangasinan', # Pangasinan
'pam' => 'Kapampangan', # Pampanga
'pt' => 'português', # Portuguese
'pt-br' => 'português do Brasil', # Brazilian Portuguese
'qu' => 'Runa Simi', # Southern Quechua
- 'qug' => 'Runa shimi', # Kichwa/Northern Quechua (one of the codes it covers; temporarily used until Kichwa has its own)
+ 'qug' => 'Runa shimi', # Kichwa/Northern Quechua (temporarily used until Kichwa has its own)
'rgn' => 'Rumagnôl', # Romagnol
'rif' => 'Tarifit', # Tarifit
'rm' => 'rumantsch', # Raeto-Romance
'war' => 'Winaray', # Waray-Waray
'wo' => 'Wolof', # Wolof
'wuu' => '吴语', # Wu Chinese
- 'xal' => 'хальмг', # Kalmyk-Oirat (Kalmuk, Kalmuck, Kalmack, Qalmaq, Kalmytskii Jazyk, Khal:mag, Oirat, Volga Oirat, European Oirat, Western Mongolian)
+ 'xal' => 'хальмг', # Kalmyk-Oirat
'xh' => 'isiXhosa', # Xhosan
'xmf' => 'მარგალური', # Mingrelian
'yi' => 'ייִדיש', # Yiddish
'yo' => 'Yorùbá', # Yoruba
- 'yue' => '粵語', # Cantonese -- (bug 8217) yue instead of zh-yue, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=y
+ 'yue' => '粵語', # Cantonese
'za' => 'Vahcuengh', # Zhuang
'zea' => 'Zeêuws', # Zeeuws/Zeaws
'zh' => '中文', # (Zhōng Wén) - Chinese
# 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' => 'O projektu {{SITENAME}}',
'aboutpage' => 'Project:O_projektu_{{SITENAME}}',
-'copyright' => 'Svi sadržaji podliježu "$1" licenci.',
+'copyright' => 'Sadržaj je dostupan pod licencom $1 osim ako je drugačije navedeno.',
'copyrightpage' => '{{ns:project}}:Autorska_prava',
'currentevents' => 'Trenutni događaji',
'currentevents-url' => 'Project:Novosti',
* Osjetljive korisničke informacije
*: ''kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.''",
'revdelete-legend' => 'Postavi ograničenja vidljivosti',
-'revdelete-hide-text' => 'Sakrij tekst revizije',
+'revdelete-hide-text' => 'Tekst revizije',
'revdelete-hide-image' => 'Sakrij sadržaj datoteke',
'revdelete-hide-name' => 'Sakrij akciju i cilj',
'revdelete-hide-comment' => 'Sakrij izmjene komentara',
-'revdelete-hide-user' => 'Sakrij korisničko ime urednika/IP',
+'revdelete-hide-user' => 'Korisničko ime urednika/IP',
'revdelete-hide-restricted' => 'Ograniči podatke za administratore kao i za druge korisnike',
'revdelete-radio-same' => '(ne mijenjaj)',
-'revdelete-radio-set' => 'Da',
-'revdelete-radio-unset' => 'Ne',
+'revdelete-radio-set' => 'Vidljivo',
+'revdelete-radio-unset' => 'Sakriveno',
'revdelete-suppress' => 'Sakrij podatke od administratora kao i od drugih',
'revdelete-unsuppress' => 'Ukloni ograničenja na vraćenim revizijama',
'revdelete-log' => 'Razlog:',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|izmjena od vaše posljedne posjete}}',
'enhancedrc-history' => 'historija',
'recentchanges' => 'Nedavne izmjene',
'recentchanges-legend' => 'Postavke nedavnih izmjena',
'vector-action-undelete' => 'Restaura',
'vector-action-unprotect' => 'Desprotegeix',
'vector-simplesearch-preference' => 'Activar la barra de cerca simplificada (només aparença Vector)',
-'vector-view-create' => 'Inicia',
+'vector-view-create' => 'Crea',
'vector-view-edit' => 'Modifica',
'vector-view-history' => "Mostra l'historial",
'vector-view-view' => 'Mostra',
-'vector-view-viewsource' => 'Mostra la font',
+'vector-view-viewsource' => 'Mostra el codi',
'actions' => 'Accions',
'namespaces' => 'Espais de noms',
'variants' => 'Variants',
'wrong_wfQuery_params' => 'Paràmetres incorrectes per a wfQuery()<br />
Funció: $1<br />
Consulta: $2',
-'viewsource' => 'Mostra la font',
+'viewsource' => 'Mostra el codi',
'viewsource-title' => 'Mostra la font per a $1',
'actionthrottled' => 'Acció limitada',
'actionthrottledtext' => "Com a mesura per a prevenir la propaganda indiscriminada (spam), no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d'ací uns minuts.",
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'seconds-abbrev' => '$1оцу',
+'days' => '{{PLURAL:$1|$1 де}}',
+'ago' => '$1 хьалха',
# Human-readable timestamps
'hours-ago' => '$1 {{PLURAL:$1|сахьат}} хьалха',
# Search suggestions
'searchsuggest-search' => 'Лаха',
+# Durations
+'duration-days' => '$1 {{PLURAL:$1|де}}',
+
# Limit report
'limitreport-title' => 'АгӀона хӀоттам къасторан хаамаш:',
'limitreport-cputime' => 'Процессоран хан лелор',
'gotaccount' => 'Already have an account? $1.',
'gotaccountlink' => 'Log in',
'userlogin-resetlink' => 'Forgotten your login details?',
-'userlogin-resetpassword-link' => 'Reset your password',
+'userlogin-resetpassword-link' => 'Forgot your password?',
'helplogin-url' => 'Help:Logging in',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
'userlogin-loggedin' => 'You are already logged in as {{GENDER:$1|$1}}.
'revdelete-no-change' => "'''Abisua:''' $1 $2 data duen elementuak jadanik bazituen eskatutako ikusgaitasun ezarpenak.",
'revdelete-concurrent-change' => 'Errorea, $1 $2 data duen elementua aldatzean: badirudi haren egoera aldatu duela nor edo nork, zu aldatzen saiatzen ari zinela.
Begira itzazu erregistroak.',
+'revdelete-only-restricted' => '$2 data duen $1 elementua ezkutatzen arazoa: ezin dira kendu adminstratzaileen ikuskaritzatik elementuak ez badago beste ikusgarritasun aukerarik hautatua.',
'revdelete-reason-dropdown' => '*Ezabatzeko ohiko arrazoiak
** Egile eskubideak urratzea
** Informazio pertsonal edo iruzkin desegokia
'badsig' => 'Baliogabeko sinadura; egiaztatu HTML etiketak.',
'badsiglength' => 'Zure sinadura luzeegia da.
$1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
-'yourgender' => 'Generoa:',
-'gender-unknown' => 'Zehaztugabea',
-'gender-male' => 'Gizona',
-'gender-female' => 'Emakumea',
-'prefs-help-gender' => 'Hautazkoa: softwareak generoa zehazteko erabilia. Informazio hau publikoa da.',
+'yourgender' => 'Nola nahiagu duzu deskribatua izatea?',
+'gender-unknown' => 'Nahiago dut ez esatea',
+'gender-male' => 'Wiki orrialdeak editatzen dituen gizona',
+'gender-female' => 'Wiki orrialdeak editatzen dituen emakumea',
+'prefs-help-gender' => 'Hobespen hau jartzea aukerazkoa da.
+Softwareak bere balioak erabiltzen ditu zu aipatzeko eta beste batzuek genero gramatikala erabiltzeko aukera izan dezaten.
+Informazio hau publikoa da.',
'email' => 'E-posta',
'prefs-help-realname' => '* Benetako izena (aukerakoa): zehaztea erabakiz gero, zure lanarentzako atribuzio bezala balioko du.',
'prefs-help-email' => 'E-posta helbidea aukerakoa da, baina zure pasahitza ahaztekotan berriro zure e-postara bidaltzeko aukera ematen dizu.',
'prefs-signature' => 'Sinadura',
'prefs-dateformat' => 'Data-formatua',
'prefs-timeoffset' => 'Denbora ezberdintasuna',
-'prefs-advancedediting' => 'Aukera aurreratuak',
+'prefs-advancedediting' => 'Genero aukerak',
'prefs-advancedrc' => 'Aukera aurreratuak',
'prefs-advancedrendering' => 'Aukera aurreratuak',
'prefs-advancedsearchoptions' => 'Aukera aurreratuak',
'rc_categories_any' => 'Edozein',
'rc-change-size-new' => '{{PLURAL:$1|Byte 1|$1 byte}} aldaketaren ostean',
'newsectionsummary' => '/* $1 */ atal berria',
-'rc-enhanced-expand' => 'Erakutsi xehetasunak (JavaScript beharrezkoa da)',
+'rc-enhanced-expand' => 'Erakutsi xehetasunak',
'rc-enhanced-hide' => 'Xehetasunak ezkutatu',
'rc-old-title' => 'hasiera batean "$1" gisa sortua',
'upload-too-many-redirects' => 'URLak birzuzenketa gehiegi zituen',
'upload-unknown-size' => 'Tamaina ezezaguna',
'upload-http-error' => 'HTTP errorea gertatu da: $1',
+'upload-copy-upload-invalid-domain' => 'Domeinu honetan ezin dira igoerak kopiatu.',
# File backend
'backend-fail-stream' => 'Ezin izan da "$1" fitxategiaren stream egin.',
'backend-fail-notsame' => 'Berdina ez den beste fitxategi bat dago "$1"n',
'backend-fail-invalidpath' => '"$1" ez da gordetzeko helbide baliagarria.',
'backend-fail-delete' => 'Ezin izan da ezabatu "$1" fitxategia.',
+'backend-fail-describe' => 'Ezin dira "$1" fitxategiaren metadatuak aldatu.',
'backend-fail-alreadyexists' => '"$1" fitxategia jadanik badago.',
'backend-fail-store' => 'Ezin izan da gorde "$1" fitxategia "$2" helbidean.',
'backend-fail-copy' => 'Ezin izan da kopiatu "$1" fitxategia "$2" helbidean.',
# Lock manager
'lockmanager-notlocked' => 'Ezin izan da "$1" askatu; ez dago itxita.',
'lockmanager-fail-closelock' => 'Ezin izan da "$1" fitxategiaren giltza itxi.',
+'lockmanager-fail-deletelock' => 'Ezin izan da "$1" fitxategia desblokeatu.',
+'lockmanager-fail-acquirelock' => 'Ezin izan da "$1" blokeoa eskuratu.',
+'lockmanager-fail-openlock' => 'Ezin izan da "$1" blokeo fitxategia ireki.',
# ZipDirectoryReader
'zip-wrong-format' => 'Zehaztutako fitxategia ez zen ZIP motakoa.',
# Special:UploadStash
+'uploadstash' => 'Gordailu bat igo',
'uploadstash-refresh' => 'Fitxategien zerrenda eguneratu',
# img_auth script messages
'contributions' => '{{GENDER:$1|Lankidearen}} ekarpenak',
'contributions-title' => '$1(r)entzat lankidearen ekarpenak',
'mycontris' => 'Ekarpenak',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|$1(r)entzat}} ($2)',
'nocontribs' => 'Ez da ezaugarri horiekin bat datorren aldaketarik aurkitu.',
'uctop' => '(azken aldaketa)',
'month' => 'Hilabetea (eta lehenagokoak):',
'exportcuronly' => 'Oraingo berrikuspena bakarrik hartu, ez historia guztia',
'exportnohistory' => "----
'''Oharra:''' Formulario honen bitartez orrialdeen historia osoak esportatzeko aukera ezgaitu egin da, errendimendua dela-eta.",
+'exportlistauthors' => 'Orrialde bakoitzaren lankideen zerrenda osoa sartu',
'export-submit' => 'Esportatu',
'export-addcattext' => 'Orrialdeak gehitu kategoria honetatik:',
'export-addcat' => 'Gehitu',
'thumbnail_error' => 'Errorea irudi txikia sortzerakoan: $1',
'djvu_page_error' => 'DjVu orrialdea eremuz kanpo',
'djvu_no_xml' => 'Ezinezkoa izan da DjVu fitxategiaren XML lortzea',
+'thumbnail-temp-create' => 'Ezin izan da behin-behineko iruditxoa sortu',
'thumbnail-dest-create' => 'Ezin izan da iruditxoa gorde helburuan',
'thumbnail_invalid_params' => 'Irudi txikiaren ezarpenak ez dira baliagarriak',
'thumbnail_dest_directory' => 'Ezinezkoa izan da helburu direktorioa sortu',
'spambot_username' => 'MediaWikiren spam garbiketa',
'spam_reverting' => '$1(e)rako loturarik ez daukan azken bertsiora itzultzen',
'spam_blanking' => 'Berrikuspen guztiek $1(e)rako lotura zeukaten, husten',
+'spam_deleting' => '$1(e)ra loturak dituzten errebisio guztiak ezabatzen',
'simpleantispam-label' => "Anti-spam egiaztapena.
Atal hau '''EZ''' bete!",
'exif-source' => 'Jatorria',
'exif-editstatus' => 'Irudiaren egoera editoriala',
'exif-urgency' => 'Larrialdia',
+'exif-fixtureidentifier' => 'Konpontzearen izena',
'exif-locationdest' => 'Agertzen den lekua',
'exif-locationdestcode' => 'Agertzen den lekuaren kodea',
'exif-objectcycle' => 'Media hau baliagarria den egunaren ordua',
'exif-iimsupplementalcategory' => 'Kategoria gehigarriak',
'exif-datetimeexpires' => 'Ez erabili data hau pasata:',
'exif-datetimereleased' => 'Ekoizpen data:',
+'exif-originaltransmissionref' => 'Trasmisio originalaren kokapen kodea',
'exif-identifier' => 'Identifikatzailea',
'exif-lens' => 'Erabilitako lentea',
'exif-serialnumber' => 'Kameraren serie-zenbakia',
'exif-cameraownername' => 'Kameraren jabea',
'exif-label' => 'Etiketa',
+'exif-datetimemetadata' => 'Datuaren metadata azken aldiz aldatu da',
+'exif-nickname' => 'Irudiaren izen ez-formala',
'exif-rating' => 'Balorazioa (5 arte)',
'exif-rightscertificate' => 'Eskubideen kudeaketa ziurtagiria',
'exif-copyrighted' => 'Copyright egoera',
# Exif attributes
'exif-compression-1' => 'Konprimatu gabe',
+'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman kodetzea abiatu da',
'exif-compression-6' => 'JPEG',
'exif-copyrighted-true' => 'Copyrightduna',
'feedback-message' => 'Mezua:',
'feedback-cancel' => 'Utzi',
'feedback-submit' => 'Feedbacka bidali',
+'feedback-error1' => 'Akatsa: APIaren emaitza ez ezagunak',
'feedback-error2' => 'Akatsa: Aldaketa ez da egin',
+'feedback-error3' => 'Akatsa: APIaren erantzunik gabe',
'feedback-close' => 'Egina',
'feedback-bugnew' => 'Txekeatu dut. Bug berria bidaliko',
# API errors
'api-error-badaccess-groups' => 'Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.',
'api-error-badtoken' => 'Barne akatsa: token okerra.',
+'api-error-empty-file' => 'Bidali duzun fitxategia hutsik dago.',
+'api-error-emptypage' => 'Berria sortzerako garaian orrialde hutsak ezin dira erabili.',
+'api-error-fetchfileerror' => 'Barne akatsa: zerbait gaizki joan da fitxategia eskuratzerakoan.',
+'api-error-file-too-large' => 'Bidali duzun fitxategia handiegia zen.',
'api-error-filename-tooshort' => 'Fitxategiaren izena laburregia da.',
'api-error-filetype-banned' => 'Mota horretako fitxategiak debekatuta daude.',
+'api-error-filetype-missing' => 'Fitxategiak ez zuen luzapenik.',
'api-error-illegal-filename' => 'Fitxategiaren izena ez da onartzen.',
+'api-error-mustbeloggedin' => 'Fitxategiak igotzeko izena emanda eduki behar duzu.',
+'api-error-mustbeposted' => 'Barne arazoa: HTTP POST beharrezkoa da.',
+'api-error-noimageinfo' => 'Igoera ondo egin da, baina zerbitzariak ez digu informaziorik eman zerbitzariaren inguruan.',
+'api-error-nomodule' => 'Barne arazoa: igoera modulurik ez dago.',
+'api-error-ok-but-empty' => 'Barne arazoa: zerbitzariaren erantzunik ez.',
+'api-error-overwrite' => 'Existitzen den fitxategi bat gain-idaztea ez da posible.',
+'api-error-stashfailed' => 'Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde',
+'api-error-timeout' => 'Zerbitzariak ez du erantzun espero zitekeen denboran.',
'api-error-unclassified' => 'Ezezaguna den errorea gertatu da.',
'api-error-unknown-code' => 'Akats ezezaguna: "$1".',
+'api-error-unknown-error' => 'Barne arazoa: fitxategia igotzen saiatzerakoan zerbait gaizki egon da.',
'api-error-unknown-warning' => 'Ohartarazpen ezezaguna: "$1".',
'api-error-unknownerror' => 'Akats ezezaguna: "$1".',
'api-error-uploaddisabled' => 'Wiki honetan ezin dira igoerak egin.',
شما باید هماکنون وارد شده و یک گذرواژهٔ جدید برگزینید. اگر شخص دیگری این درخواست را داده است، یا اگر گذرواژهٔ اصلیتان را به خاطر آوردید و دیگر نمیخواهید آن را تغییر دهید، میتوانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلیتان ادامه دهید.',
'passwordreset-emailelement' => 'نام کاربری: $1
گذرواژهٔ موقت: $2',
-'passwordreset-emailsent' => 'یک نامهٔ بازنشانی گذرواژه فرستاده شده است.',
+'passwordreset-emailsent' => 'یک نامهٔ بازنشانی گذرواژه فرستاده شدهاست.',
'passwordreset-emailsent-capture' => 'یک رایانامهٔ بازنشانی که در پایین نمایش داده شده، فرستاده شده است.',
'passwordreset-emailerror-capture' => 'رایانامهٔ بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیتآمیز نبود: $1',
'right-ipblock-exempt' => 'تاثیر نپذیرفتن از قطع دسترسیهای آیپی، خودکار یا فاصلهای',
'right-proxyunbannable' => 'تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسیها',
'right-unblockself' => 'بازکردن دسترسی خود',
-'right-protect' => 'تغییر میزان محافظت صفحهها و ویرایش صفحههای محافظت شده آبشاری',
+'right-protect' => 'تغییر میزان محافظت صفحهها و ویرایش صفحههای محافظتشده آبشاری',
'right-editprotected' => 'ویرایش صفحههای محافظت شده به عنوان "{{int:protect-level-sysop}}"',
'right-editsemiprotected' => 'ویرایش صفحه حفاظتشده به عنوان "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'ویرایش واسط کاربری',
'action-delete' => 'حذف این صفحه',
'action-deleterevision' => 'حذف این نسخه',
'action-deletedhistory' => 'مشاهدهٔ تاریخچهٔ حذف شدهٔ این صفحه',
-'action-browsearchive' => 'جستجوی صفحههای حذف شده',
+'action-browsearchive' => 'جستجوی صفحههای حذفشده',
'action-undelete' => 'احیای این صفحه',
'action-suppressrevision' => 'مشاهده و احیای ویرایشهای حذف شده',
'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی',
برای دیدن سیاههٔ حذفها و احیاهای اخیر به [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
'undelete-header' => 'برای دیدن صفحههای حذفشدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.',
-'undelete-search-title' => 'جستجوی صفحههای حذف شده',
+'undelete-search-title' => 'جستجوی صفحههای حذفشده',
'undelete-search-box' => 'جستجوی صفحههای حذفشده.',
'undelete-search-prefix' => 'نمایش صفحهها با شروع از:',
'undelete-search-submit' => 'برو',
'javascripttest-title' => 'در حال اجرای آزمایشهای $1',
'javascripttest-pagetext-noframework' => 'این صفحه برای اجرای آزمایشهای جاوا اسکریپت کنار گذاشته شدهاست.',
'javascripttest-pagetext-unknownframework' => 'چارچوب آزمایشی ناشناخته «$1».',
-'javascripttest-pagetext-frameworks' => 'لطفاً یکی از فریمورکهای آزمایشی زیر را انتخاب کنید: $1',
+'javascripttest-pagetext-frameworks' => 'لطفاً یکی از چارچوبهای آزمایش زیر را انتخاب کنید: $1',
'javascripttest-pagetext-skins' => 'پوستهای را برای اجرای آزمایشها انتخاب کنید:',
'javascripttest-qunit-intro' => '[$1 مستندات آزمایش] را در mediawiki.org ببینید.',
'javascripttest-qunit-heading' => 'مجموعه آزمایش QUnit جاوااسکریپت برای مدیاویکی',
'sp-newimages-showfrom' => 'نشاندادن تصویرهای جدید از $2، $1 به بعد',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1 ثانیه',
+'minutes-abbrev' => '$1 دقیقه',
+'hours-abbrev' => '$1 ساعت',
+'days-abbrev' => '$1 روز',
'seconds' => '{{PLURAL:$1|$1ثانیه| $1 ثانیه}}',
'minutes' => '{{PLURAL: $1|دقیقه|دقیقه}}',
'hours' => '{{PLURAL: $1|ساعت|ساعت}}',
'resettokens-legend' => 'Ath-shuidhich na tòcanan',
'resettokens-tokens' => 'Tòcanan:',
'resettokens-token-label' => "$1 ('s e $2 an luach làithreach)",
+'resettokens-watchlist-token' => "Tòcan airson an inbhir-lìn (Atom/RSS) a sheallas dhut [[Special:Watchlist|atharraichean air duilleagan a tha air a' chlàr-fhaire agad]]",
+'resettokens-done' => 'Chaidh na tòcanan ath-shuidheachadh.',
+'resettokens-resetbutton' => 'Ath-shuidhich na tòcanan a chaidh a thaghadh',
# Edit page toolbar
'bold_sample' => 'Teacs trom',
Tha coltas gun deach a sguabadh às.",
'edit-conflict' => 'Còmhstri deasachaidh.',
'edit-no-change' => "Chaidh an obair-dheasachaidh agad a leigeil seachad a chionn 's nach do dh'atharraich thu dad.",
+'postedit-confirmation' => 'Chaidh na dheasaich thu a shàbhaladh.',
'edit-already-exists' => "Cha b' urrainn dhuinn an duilleag ùr a chruthachadh.
Tha e ann mu thràth.",
'defaultmessagetext' => 'Teacsa bunaiteach na teachdaireachd',
Chaidh na h-argamaidean sinn a leigeil seachad.",
'post-expand-template-argument-category' => 'Duilleagan air an deach argamaidean teamplaidean fhàgail às',
'parser-template-loop-warning' => 'Mhothaicheadh do lùb teamplaid: [[$1]]',
+'parser-template-recursion-depth-warning' => 'Chaidh thu thairis air crìoch doimhne nan ath-chùrsaidhean teamplaid ($1)',
+'language-converter-depth-warning' => 'Chaidh thu thairis air crìoch doimhne an iompachair chànain ($1)',
+'node-count-exceeded-category' => 'Duilleagan far an deachas thairis air cunntas nan nòdan',
+'node-count-exceeded-warning' => 'Chaidh an duilleag thairis air cunntas nan nòdan',
+'expansion-depth-exceeded-category' => "Duilleagan far an deachas thairis air a' chrìoch leudachaidh",
+'expansion-depth-exceeded-warning' => 'Chaidh an duilleag thairis air an doimhne leudachaidh',
'parser-unstrip-loop-warning' => 'Mhothaich sinn do lùb unstrip',
+'parser-unstrip-recursion-limit' => 'Chaidheas thairis air crìoch unstrip recursion ($1)',
+'converter-manual-rule-error' => 'Mhothaich sinn do mhearachd san riaghailt iompachadh làimhe airson cànan',
+
+# "Undo" feature
+'undo-success' => "Gabhaidh an deasachadh seo a neo-dhèanamh.
+Thoir sùil air a' choimeas gu h-ìosal is dearbh gur e sin a tha fa-near dhut agus sàbhail na h-atharraichean gu h-ìosal gus neo-dhèanamh an deasachaidh a choileanadh.",
+'undo-failure' => "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh air sgàth 's gun robh deasachaidhean eile sa mheadhan.",
+'undo-norev' => "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh a chionn 's nach robh e ann no gun deach a sguabadh às.",
+'undo-summary' => 'Neo-dhèan mùthadh $1 le [[Special:Contributions/$2|$2]] ([[User talk:$2|Deasbaireachd]])',
+'undo-summary-username-hidden' => 'Neo-dhèan am mùthadh $1 le cleachdaiche falaichte',
# Account creation failure
'cantcreateaccounttitle' => 'Cha ghabh an cunntas a chruthachadh',
+'cantcreateaccount-text' => "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo ('''$1''').
+
+Dh'innise $3 gun do rinn iad seo air sgàth: ''$2''",
# History pages
'viewpagelogs' => 'Seall logaichean na duilleige seo',
'rev-deleted-comment' => '(chaidh gearr-chunntas an deasachaidh a thoirt air falbh)',
'rev-deleted-user' => '(chaidh an t-ainm-cleachdaiche a thoirt air falbh)',
'rev-deleted-event' => '(chaidh gnìomh an loga a thoirt air falbh)',
+'rev-deleted-user-contribs' => '[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chan fhaic na com-pàirtichean an deasachadh]',
+'rev-deleted-text-permission' => "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.
+Gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+'rev-deleted-text-unhide' => "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.
+Gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].
+'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+'rev-suppressed-text-unhide' => "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.
+Gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].
+'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+'rev-deleted-text-view' => "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.
+'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+'rev-suppressed-text-view' => "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.
+'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
+'rev-deleted-no-diff' => "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.
+Gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+'rev-suppressed-no-diff' => "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.",
+'rev-deleted-unhide-diff' => "Chaidh mùthadh dhen diff seo '''a sguabadh às'''.
+Gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].
+'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
+'rev-suppressed-unhide-diff' => "Chaidh mùthadh an diff seo '''a mhùchadh'''.
+Gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].
+'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
+'rev-deleted-diff-view' => "Chaidh mùthadh an diff seo '''a sguabadh às'''.
+'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+'rev-suppressed-diff-view' => "Chaidh mùthadh an diff seo '''a mhùchadh'''.
+'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
'rev-delundel' => 'seall/falaich',
'rev-showdeleted' => 'seall',
+'revisiondelete' => 'Sguab às/neo-dhèan sguabadh às mhùthaidhean',
+'revdelete-nooldid-title' => 'Tha am mùthadh seo mì-dhligheach',
+'revdelete-nooldid-text' => "Cha do shònraich thu mùthadh airson seo a dhèanamh, chan eil e ann no tha thu a' feuchainn ris am mùthadh làithreach a chur am falach.",
+'revdelete-nologtype-title' => 'Cha deach seòrsa an loga a shònrachadh',
+'revdelete-nologtype-text' => 'Cha do shònraich thu seòrsa an loga air an dèanar seo.',
+'revdelete-nologid-title' => 'Innteart mì-dhligheach an loga',
+'revdelete-nologid-text' => 'Cha do shònraich thu tachartas loga targaide gus seo a dhèanamh no chan eil an t-innteart seo ann.',
+'revdelete-no-file' => 'Chan eil am faidhle a shònraich thu ann.',
+'revdelete-show-file-confirm' => 'A bheil thu cinnteach gu bheil thu airson coimhead air mùthadh an fhaidhle "<nowiki>$1</nowiki>" a chaidh a sguabadh às $2 aig $3?',
+'revdelete-show-file-submit' => 'Tha',
'revdelete-selected' => "'''{{PLURAL:$2|Lèirmheas|Lèirmheasan}} de [[:$1]] a thagh thu:'''",
'logdelete-selected' => "'''{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:'''",
+'revdelete-hide-text' => "Teacsa a' mhùthaidh",
+'revdelete-hide-image' => 'Falaich susbaint an fhaidhle',
+'revdelete-hide-name' => 'Falaich an gnìomh agus an targaid',
+'revdelete-hide-comment' => 'Gearr-chunntas an deasachaidh',
'revdelete-hide-user' => 'Ainm-cleachdaiche/seòladh IP an deasaiche',
+'revdelete-hide-restricted' => 'Mùch dàta o rianairean agus càch',
'revdelete-radio-same' => '(na atharraich)',
'revdelete-radio-set' => 'Ri fhaicinn',
'revdelete-radio-unset' => 'Falaichte',
+'revdelete-suppress' => 'Mùch dàta o rianairean agus càch',
+'revdelete-unsuppress' => 'Thoir air falbh na bacaidhean air mùthaidhean a chaidh aiseag',
'revdelete-log' => 'Adhbhar:',
'revdelete-submit' => 'Cuir air {{PLURAL:$1|an lèirmheas|na lèirmheasan}} a thagh thu',
+'revdelete-success' => "'''Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.'''",
+'revdelete-failure' => "'''Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:'''
+$1",
+'logdelete-success' => "'''Chaidh faicsinneachd an loga a shuidheachadh.'''",
+'logdelete-failure' => "'''Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:'''
+$1",
'revdel-restore' => 'mùth follaiseachd',
'revdel-restore-deleted' => 'mùthaidhean a chaidh a sguabadh às',
'revdel-restore-visible' => 'mùthaidhean faicsinneach',
'pagehist' => 'Eachdraidh na duilleige',
+'deletedhist' => 'Eachdraidh a chaidh a sguabadh às',
'revdelete-otherreason' => 'Adhbhar eile/a bharrachd:',
'revdelete-reasonotherlist' => 'Adhbhar eile',
'revdelete-edit-reasonlist' => 'Deasaich adhbharan an sguabaidh às',
# History merging
'mergehistory-from' => 'An duilleag thùsail:',
+'mergehistory-autocomment' => 'Chaidh [[:$1]] a cho-aonadh dha [[:$2]]',
+'mergehistory-comment' => 'Chaidh [[:$1]] a cho-aonadh dha [[:$2]]: $3',
'mergehistory-reason' => 'Adhbhar:',
# Merge log
+'mergelog' => "Loga a' cho-aonaidh",
'revertmerge' => 'Dì-aontaich',
# Diffs
'compareselectedversions' => 'Dèan coimeas eadar na mùthaidhean a thagh thu',
'showhideselectedversions' => 'Seall/Falaich na lèirmheasan a thagh thu',
'editundo' => 'neo-dhèan',
+'diff-empty' => '(Gun diofar eatarra)',
'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
'diff-multi-manyusers' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
'prefs-watchlist' => 'An clàr-faire',
'prefs-watchlist-days' => "Co mheud latha a sheallar air a' chlàr-fhaire:",
'prefs-watchlist-days-max' => "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+'prefs-watchlist-edits-max' => 'Àireamh as motha: 1000',
+'prefs-watchlist-token' => "Tòcan a' chlàir-fhaire:",
+'prefs-misc' => 'Measgachadh',
'prefs-resetpass' => 'Atharraich am facal-faire',
'prefs-changeemail' => 'Atharraich am post-d',
'prefs-setemail' => 'Suidhich seòladh puist-d',
'columns' => 'Colbhan',
'searchresultshead' => 'Lorg',
'stub-threshold-disabled' => 'À comas',
+'recentchangesdays-max' => "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+'recentchangescount' => 'Uiread a dheasachaidhean a thèid a shealltainn a ghnàth:',
'savedprefs' => 'Tha na roghainnean agad air an sàbhaladh.',
'timezonelegend' => 'Roinn-tìde:',
'localtime' => 'An t-àm ionadail:',
+'timezoneuseserverdefault' => 'Cleachd bun-roghainn na h-Uicipeid ($1)',
'servertime' => 'Àm an fhrithealaichte:',
+'guesstimezone' => 'Lìon on bhrabhsair',
'timezoneregion-africa' => 'Afraga',
'timezoneregion-america' => 'Aimeireaga',
'timezoneregion-antarctica' => 'An Antartaig',
'timezoneregion-europe' => 'An Roinn-Eòrpa',
'timezoneregion-indian' => 'An Cuan Innseanach',
'timezoneregion-pacific' => 'An Cuan Sèimh',
+'allowemail' => 'Ceadaich post-d o chleachdaichean eile',
+'prefs-searchoptions' => 'Lorg',
'prefs-namespaces' => 'Namespaces',
'default' => 'an roghainn bhunaiteach',
'prefs-files' => 'Faidhlichean',
'prefs-dateformat' => "Fòrmat a' chinn-là",
'prefs-timeoffset' => 'Diofar ama',
'prefs-advancedediting' => 'Roghainnean coitcheann',
+'prefs-editor' => 'Deasaiche',
+'prefs-preview' => 'Ro-shealladh',
'prefs-advancedrc' => 'Roghainnean adhartach',
'prefs-advancedrendering' => 'Roghainnean adhartach',
'prefs-advancedsearchoptions' => 'Roghainnean adhartach',
'prefs-displayrc' => 'Roghainnean taisbeanaidh',
'prefs-displaysearchoptions' => 'Roghainnean taisbeanaidh',
'prefs-displaywatchlist' => 'Roghainnean taisbeanaidh',
+'prefs-tokenwatchlist' => 'Tòcan',
'prefs-diffs' => 'Diffs',
# User preference: email validation using jQuery
--- /dev/null
+<?php
+/** Goan Konkani (Latin script) (Konknni)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Deepak D'Souza
+ * @author Isidore Dantas
+ * @author The Discoverer
+ */
+
+$messages = array(
+'underline-always' => 'Soddankal',
+'underline-never' => 'Kednach na',
+
+# Dates
+'sunday' => 'Aitar',
+'monday' => 'Somar',
+'tuesday' => 'Munglar',
+'wednesday' => 'Budhwar',
+'thursday' => 'Birestar',
+'friday' => 'Sukrar',
+'saturday' => 'Sonvar',
+'sun' => 'Ait',
+'mon' => 'Som',
+'tue' => 'Mung',
+'wed' => 'Budh',
+'thu' => 'Bres',
+'fri' => 'Sukr',
+'sat' => 'Son',
+'january' => 'Janer',
+'february' => 'Febrer',
+'march' => 'Mars',
+'april' => 'Abril',
+'may_long' => 'Mai',
+'june' => 'Jun',
+'july' => 'Julai',
+'august' => 'Agost',
+'september' => 'Setembr',
+'october' => 'Otubr',
+'november' => 'Novembr',
+'december' => 'Dezembr',
+'january-gen' => 'Janer',
+'february-gen' => 'Febrer',
+'march-gen' => 'Mars',
+'april-gen' => 'Abril',
+'may-gen' => 'Mai',
+'june-gen' => 'Jun',
+'july-gen' => 'Julai',
+'august-gen' => 'Agost',
+'september-gen' => 'Setembr',
+'october-gen' => 'Otubr',
+'november-gen' => 'Novembr',
+'december-gen' => 'Dezembr',
+'jan' => 'Jan',
+'feb' => 'Feb',
+'mar' => 'Mar',
+'apr' => 'Abr',
+'may' => 'Mai',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Ago',
+'sep' => 'Set',
+'oct' => 'Otu',
+'nov' => 'Nov',
+'dec' => 'Dez',
+'january-date' => '$1 Janer',
+'february-date' => '$1 Febrer',
+'march-date' => '$1 Mars',
+'april-date' => '$1 Abril',
+'may-date' => '$1 Mai',
+'june-date' => '$1 Jun',
+'july-date' => '$1 Julai',
+'august-date' => '$1 Agost',
+'september-date' => '$1 Setembr',
+'october-date' => '$1 Otubr',
+'november-date' => '$1 Novembr',
+'december-date' => '$1 Dezembr',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Vorg|Vorgam}}',
+'category_header' => '"$1" vorgantlim panam',
+'subcategories' => 'Upvorg',
+'category-media-header' => '"$1" hea vorgan madheom\'ma',
+'category-empty' => "''Hea vorgan sodhea ekui pan vo madheom na''",
+'hidden-categories' => '{{PLURAL:$1|Lipoilolo vorg|Lipoilole vorg}}',
+'category-subcat-count' => '{{PLURAL:$2|Hea vorgan fokot hi ek upvorg asa.|Hea vorgan {{PLURAL:$1|hi upvorg asa|heo $1 upvorg asat}}, beriz $2 upvorga modem.}}',
+'category-article-count' => '{{PLURAL:$2|Hea vorgan fokot hi ek pan asa.|Hea vorgan {{PLURAL:$1|hi pan asa|him $1 panam asat}} beriz $2 panam modem.}}',
+'category-file-count' => '{{PLURAL:$2|Hea vorgan fokot hi ek fail asa.|Hea vorgan {{PLURAL:$1|hi fail asa|heo $1 faili asat}}, beriz $2 faili modem.}}',
+'listingcontinuesabbrev' => 'chalu',
+'noindex-category' => 'Suchi-potran zoddunk-naslelim panam',
+
+'about' => 'Hea vixoiavoir',
+'article' => 'Vixoi sombondhi pan',
+'newwindow' => '(novea zonelant uktem zata)',
+'cancel' => "Rod'd kor",
+'mytalk' => 'Bhasabhas',
+'navigation' => 'Dixa-niontronn',
+
+# Cologne Blue skin
+'qbfind' => 'Sod',
+'qbedit' => 'Bodol',
+'qbspecialpages' => 'Khaxelim panam',
+'faq' => 'Choddxe vicharlole prosn',
+
+# Vector skin
+'vector-action-addsection' => 'Vixoi zodd',
+'vector-action-delete' => 'Kadd',
+'vector-action-move' => 'Fuddem voch',
+'vector-action-protect' => 'Rakh',
+'vector-view-create' => 'Roch',
+'vector-view-edit' => 'sudar',
+'vector-view-history' => 'Itihas polloi',
+'vector-view-view' => 'Vach',
+'vector-view-viewsource' => 'Mull polloi',
+'actions' => 'Karvaio',
+'namespaces' => 'Nanv-thollam',
+'variants' => 'Dusre',
+
+'errorpagetitle' => 'Chuk',
+'returnto' => '$1 hanga porot voch.',
+'tagline' => '{{SITENAME}} savn',
+'help' => 'Adar',
+'search' => 'Sod',
+'searchbutton' => 'Sod',
+'go' => 'Pavl mar',
+'searcharticle' => 'Fuddem voch',
+'history' => 'Panacho itihas',
+'history_short' => 'Itihas',
+'printableversion' => "Chapp'pachi avruti",
+'permalink' => 'Togpi zodd',
+'view' => 'Poloi',
+'edit' => 'Sudar',
+'create' => 'Roch',
+'editthispage' => 'Hem pan bodol',
+'create-this-page' => 'Ho pan roch',
+'delete' => 'Vogllai',
+'deletethispage' => 'Hem pan kad',
+'protect' => 'Rakh',
+'protect_change' => 'bodol',
+'protectthispage' => 'Hem pan rakh',
+'newpage' => 'Novem pan',
+'talkpage' => 'Hea panachem bhasabhas kor',
+'talkpagelinktext' => 'Bhasabhas',
+'specialpage' => 'Khaxhel pan',
+'personaltools' => 'Khasgi avtam',
+'articlepage' => 'Vixoi sombondhi pan poloi',
+'talk' => 'Bhasabhas',
+'views' => 'Niall',
+'toolbox' => 'Avtam',
+'userpage' => 'Vangddiacho pan poloi',
+'imagepage' => 'Imazichem pan poloi',
+'viewhelppage' => 'Adar pan poloi',
+'categorypage' => 'Vorgachem pan poloi',
+'otherlanguages' => 'Dusrea bhasanim',
+'redirectedfrom' => '($1 savn porot dixent)',
+'redirectpagesub' => 'Punornirdexan pan',
+'lastmodifiedat' => 'Hem pan xevtim $1 disa, $2 vazta bodolelem.',
+'jumpto' => 'Hangachean voch',
+'jumptonavigation' => 'Dixa-niontronn',
+'jumptosearch' => 'sod',
+
+# 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' => '(Thollachea) babtint',
+'aboutpage' => 'Project:Vixoiavixim',
+'copyrightpage' => '{{ns:project}}:Prat-hokk',
+'currentevents' => 'Chalu ghoddnneo',
+'currentevents-url' => 'Project:Chalu ghoddneo',
+'disclaimers' => 'Chotraio',
+'disclaimerpage' => 'Project:Sadeo chotraio',
+'edithelp' => 'Sudarunk palov',
+'helppage' => 'Help:Mozkur',
+'mainpage' => 'Mukhel Pan',
+'mainpage-description' => 'Mukhel Pan',
+'portal' => 'Somudaik proves-dar',
+'portal-url' => 'Project:Somudaik proves-dar',
+'privacy' => 'Gupitaiechem dhoronn',
+'privacypage' => 'Project:Gupitachem dhoronn',
+
+'badaccess-group0' => "Tumi tillson kel'lem kary korunk tumkam permissanv na.",
+'badaccess-groups' => "Tumi tillson kel'lem kary mat {{PLURAL:$2|the group|one of the groups}}: $1 -ak permissanv asa.",
+
+'versionrequired' => 'MediaWikichem $1 version zai',
+'versionrequiredtext' => 'Hem pan vaprunk MediaWikichem $1 version zai.
+[[Special:Version|version page]] pan poloea.',
+
+'ok' => 'Zait',
+'retrievedfrom' => '"$1" savn prapt kelam',
+'youhavenewmessages' => 'Tumkam $1 ($2) asat.',
+'newmessageslink' => 'nove sondex',
+'newmessagesdifflink' => 'nimannem bodlop',
+'editsection' => 'sudar',
+'editold' => 'sudar',
+'viewsourceold' => 'mull poloi',
+'editlink' => 'sudar',
+'viewsourcelink' => 'mull polloi',
+'editsectionhint' => 'khondd sudar: $1',
+'toc' => 'Suchi potr',
+'showtoc' => 'dakhoi',
+'hidetoc' => 'lipoi',
+'site-atom-feed' => '$1 Atom purvoi',
+'page-atom-feed' => '"$1" Atom purvonn',
+'red-link-title' => '$1 (hea nanvachem pan na)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Pan',
+'nstab-user' => 'Vapuddpeachem pan',
+'nstab-special' => 'Kherit pan',
+'nstab-project' => 'Project-ache pan',
+'nstab-image' => 'Fail',
+'nstab-mediawiki' => 'Sondex',
+'nstab-template' => 'Saacho',
+'nstab-category' => 'Vorg',
+
+# General errors
+'missing-article' => 'Totv-kox (Database) hantun mellunk zai aslem tem mozkur "$1" $2 mellunk-nam.
+
+Horxim, oxem ek pornem frk vo eka panachem itihasachem zodd vogllailem, tedna zata.
+
+Oxem nhoi zalear, tuka softwer-an chuk sampodlam zait.
+Upkar korun eka [[Special:ListUsers/sysop|karbhari]]chea nodrek hadd, Internet Zago Sodpi (URL) hachi nond gheun.',
+'missingarticle-rev' => '(uzollnni#: $1)',
+'badtitle' => 'Chukichem nanv',
+'badtitletext' => 'Tuven maglelem panache nanv chukichem, rintem, vo ek sarkem zodunk-naslelem bhase-modlem vo wiki-modlem nanv.
+
+Tantun ek vo sabaar okxor asot jenka nanvanim uzar korunk zainan.',
+'viewsource' => 'Mull polloi',
+
+# Login and logout pages
+'welcomeuser' => 'Ievkar, $1!',
+'yourname' => 'Vapuddpeachem nanv:',
+'yourpassword' => 'Gupitutor:',
+'yourpasswordagain' => 'Gupit utor porot boroi:',
+'remembermypassword' => 'Hea internet browseran mhojem sotrachem ugdas dovor (chodan chod $1 {{PLURAL:$1|disak|disank}})',
+'login' => 'Sotrromb kor',
+'nav-login-createaccount' => 'Sotrrombh kor / khato roch',
+'loginprompt' => "{{SITENAME}}, hea siticher sotrorombh korunktujea internet browseran ''cookies'' suru asunk zai.",
+'userlogin' => 'Sotrrombh kor / khatem roch',
+'logout' => 'Bhair podd',
+'userlogout' => 'Sotracho xevott',
+'nologin' => 'Tuje kodde khatem na? $1.',
+'nologinlink' => 'Novem khatem ughodd',
+'createaccount' => 'Khatem roch',
+'gotaccount' => 'Tuje kodem khatem asa? $1.',
+'gotaccountlink' => 'Sotrorombh kor',
+'userlogin-resetlink' => 'Sotrorombh korpacheo bariksai visorlai?',
+'mailmypassword' => 'Novem gupitutor email kor',
+'loginlanguagelabel' => 'Bhas: $1',
+
+# Edit page toolbar
+'bold_sample' => 'Datt mozkur',
+'bold_tip' => 'Datt mozkur',
+'italic_sample' => 'Palso mozkur',
+'italic_tip' => 'Palso mozkur',
+'link_sample' => 'Zoddachem nanv',
+'link_tip' => 'Bhitorlem zoddop',
+'extlink_sample' => 'http://www.udaronn.in zoddachem nanv',
+'extlink_tip' => 'Bhailem site (survatek http:// visronakai)',
+'headline_sample' => 'Mathalleacho mozkur',
+'headline_tip' => 'Dusrea patllicho mathallo',
+'nowiki_sample' => 'Sworup diunk naslelem mozkur hanga ghal',
+'nowiki_tip' => 'Wiki sworup durlokx kor',
+'image_tip' => 'Bosoileli fail',
+'media_tip' => 'Failichem zodd',
+'sig_tip' => 'Tuji soi, vell-chaap soit',
+'hr_tip' => 'Adhvem rang (Komi uzar kor)',
+
+# Edit pages
+'summary' => 'Sar:',
+'subject' => 'Vishoy:',
+'minoredit' => 'Hem ek dhaktem sudarop',
+'watchthis' => 'Hea panar nodor dovor',
+'savearticle' => 'Pan samball',
+'preview' => 'Zholok',
+'showpreview' => 'Zholok dakhoi',
+'showdiff' => 'Bodolpam dakhoi',
+'anoneditwarning' => "'''Chotrai:''' Tuven sotrorombh korunk nai.
+Tuzo internet potteachi nond panachem itihasan zatelem.",
+'newarticle' => '(Novem)',
+'newarticletext' => "Tuven ek zoddache patlav kelai, zachem pan azun rochunk na.
+Pan rochunk, khallchea chovkottan boroi (anik mahitik [[{{MediaWiki:Helppage}}|adar pan]] polloi).
+Tu hangasor chukin pavlai zalear tujea internet browser-achi '''Fatim'' vo '''Back''' butao dab.",
+'noarticletext' => 'Sodheak hem pan rinte asa.
+Tujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], vo [{{fullurl:{{FULLPAGENAME}}|action=edit}} hem pan sudharunk zata]</span>.',
+'noarticletext-nopermission' => 'Sodheak hem pan rinte asa.
+Tujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], vo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], pun tuka hem pan rochunk porvangi na.',
+'previewnote' => "'''Hi fokot ek zholok mhonn ugddas dhor.'''
+Tujim bodolpam azun sambhallun dovrunk nant!",
+'editing' => '$1 sudarop',
+'editingsection' => '(Vibhag) $1 sudar',
+'templatesused' => "Hea panant uzar {{PLURAL:$1|kel'lo sancho|kel'le sanche}}:",
+'template-protected' => '(rakhlelem)',
+'template-semiprotected' => '(ordhem rakhun dovorlelem)',
+'hiddencategories' => 'Hem pan {{PLURAL:$1|1 lipoilelea vorgacho vangddi|$1 lipoileleam vorgancho vangddi}}:',
+'permissionserrorstext-withaction' => '$2, hem korpak tuka porvangi na, {{PLURAL:$1|hea karnnak lagon|hea karnnank lagun}}:',
+'recreate-moveddeleted-warn' => "'''Xittkavnni: Tum ek pan porot rochtai jem fattim vogllailelem .'''
+
+Panacho sudar korop sarkem zalear dhean di.
+Pan vogllavpachem ani sotr halovpachem, sovloti khatir hangasor dilelem asa:",
+'moveddeleted-notice' => 'Hem pan vogllailem asa.
+Panachea vogllaonechi ani hallonechi sotr mahiti khatir sokoil sondorba khatir dilea.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Chotrai:''' Sacho zoddpacho akar chod vhodlem asa.
+Thodde sache zoddchenant",
+'post-expand-template-inclusion-category' => 'Zea panani sache zoddpachem akarachem merakin chod zala',
+'post-expand-template-argument-warning' => "'''Chotrai:''' Hea panan ek tori oslo sacheacho parametro asa zacho patlloylea uprant akar chod vhoddlo zata.
+Heo parametrank durlokx keleat.",
+'post-expand-template-argument-category' => 'Sacheache parametro zoddunknan osle panam',
+
+# History pages
+'viewpagelogs' => 'Hea panachim sotram polloi',
+'currentrev-asof' => '$1, hachi halinchi uzollnni',
+'revisionasof' => '$1 hachi uzollnni',
+'revision-info' => '$2 hannem $1, hachi uzollnni',
+'previousrevision' => '← Adli uzollnni',
+'nextrevision' => 'Novi uzolnni →',
+'currentrevisionlink' => 'Sogleanvon novi uzollnni',
+'cur' => 'chal',
+'last' => 'adl',
+'page_first' => 'poilem',
+'page_last' => 'akhirchem',
+'histlegend' => "Frk nivoddni: Jeo uzollneo tuka comparar korunk zai, tenche fudle ''radio'' butao petoi
+Vivron: '''({{int:cur}})''' = halinchi uzollnie borobor forok, '''({{int:last}})''' = adli uzollnie borobor forok, '''{{int:minoreditletter}}''' = dhaktem sudharop.",
+'history-fieldset-title' => 'Itihas chall',
+'history-show-deleted' => 'Fokot vogllailelem',
+'histfirst' => 'sogleavon adhlem',
+'histlast' => 'sogleavon novem',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 hannem $4, $3 hea vellar',
+
+# Revision deletion
+'rev-delundel' => 'dakhoi/lipoi',
+'revdel-restore' => 'Disnnem bodol',
+'revdel-restore-deleted' => "rod'd kelelo uzollnneo",
+'revdel-restore-visible' => 'Dispi uzollnneo',
+
+# Merge log
+'revertmerge' => 'Doxim kor',
+
+# Diffs
+'history-title' => '"$1" hachea uzollnnecho itihas',
+'lineno' => 'Line ank $1:',
+'compareselectedversions' => 'Nivodloleo uzollneo comparar kor',
+'editundo' => "rod'd kor",
+'diff-multi' => "({{PLURAL:$2|Eka vapuddpean|$2 vapuddpeamni}} {{PLURAL:$1|kel'li ek modli uzollnni|kel'leo $1 modleo uzollnneo}} dakhonk nant)",
+
+# Search results
+'searchresults' => 'Sodacho nikal',
+'searchresults-title' => '"$1" -khatir sodacho nikal',
+'prevn' => 'adlem {{PLURAL:$1|$1}}',
+'nextn' => 'fuddlem {{PLURAL:$1|$1}}',
+'prevn-title' => '{{PLURAL:$1|Fattlem $1 porinnam|Fattlem $1 porinam}}',
+'nextn-title' => '{{PLURAL:$1|Fuddlem $1 porinnam|Fudnlim $1 porinnam}}',
+'shown-title' => 'Dor panar {{PLURAL:$1|porinam|porinam}} dakhoi',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) poloi',
+'searchmenu-exists' => "'''Hea Wikicher \"[[:\$1]]\" nanvanche pan asa.'''",
+'searchmenu-new' => "'''\"[[:\$1]]\" hem pan hea vikint roch!'''",
+'searchprofile-articles' => 'Mozkurachim panam',
+'searchprofile-project' => 'Adar ani Project panam',
+'searchprofile-images' => 'Bhovmadhiom',
+'searchprofile-everything' => 'Sogllem',
+'searchprofile-advanced' => 'Sodpache poryay',
+'searchprofile-articles-tooltip' => '$1 hantunt sod',
+'searchprofile-project-tooltip' => '$1 hantunt sod',
+'searchprofile-images-tooltip' => 'Faili sod',
+'searchprofile-everything-tooltip' => "Akhea sitin sod (Bhasabhas panant'ui)",
+'searchprofile-advanced-tooltip' => 'chalu nanvthollancher sod',
+'search-result-size' => '$1 {{PLURAL:$2|1 utor|$2 utram}}',
+'search-result-category-size' => '{{PLURAL:$1|1 vangddi|$1 vangddi}} ({{PLURAL:$2|1 upvorg|$2 upvorg}}, {{PLURAL:$3|1 fichier|$3 fichieri}})',
+'search-redirect' => '($1 porot dixen dhaddop)',
+'search-section' => '(vibhag $1)',
+'search-suggest' => 'mhonnunk sodi: $1',
+'searchrelated' => 'sombondit',
+'searchall' => 'soglle',
+'showingresultsheader' => "{{PLURAL:$5|'''$3''' hantlem '''$1''' porinam|'''$3''' hantlim '''$1 - $2''' porinam}}, '''$4''' haka",
+'search-nonefound' => 'Tujea sodak mell khata toslem kai porinam nan.',
+'powersearch-field' => 'Hachea khatir sodha',
+
+# Preferences page
+'preferences' => 'Posondeo',
+'mypreferences' => 'Posonti',
+'youremail' => 'Tuzo email potto',
+'yourrealname' => 'Khorem nanv:',
+'prefs-help-email' => 'Email potto sokticho na, pun tum gupitutor visroxi zalear gupitutor punorsthapon korunk email pottechi goroz podta.',
+'prefs-help-email-others' => 'Tujean dusreank tujea vapurpeacho panar vo bhasabhasache panar aslele eke email zodde vorvim tuje xim sompork korunk diunk zata.
+Dusre tuje xim sompork kortat tednam tuzo email potto tankam kollchenam.',
+
+# Groups
+'group-all' => '(soglle)',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Vapurpi rochnnechem sotr',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'hem pan bodol',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|bodlop|bodlopam}}',
+'recentchanges' => 'Halincho bodol',
+'recentchanges-legend' => 'Hallinch zalleo bodlopancheo poryay',
+'recentchanges-feed-description' => "Wiki'k kel'le halinche bodlopancher hea vhawa vorvim nodor dovor.",
+'recentchanges-label-newpage' => 'Hea sudaran ek novem pan rochlam',
+'recentchanges-label-minor' => 'Ho ek dhaktto sudar',
+'recentchanges-label-bot' => "Hem bodlop eka robotan kel'lem",
+'recentchanges-label-unpatrolled' => 'Hem sudharop azun topasunk nam',
+'rcnote' => "Sokoil {{PLURAL:$1|dilelim nimannim '''1''' bodlopam| '''$1''' bodlopam}} {{PLURAL:$2|xevotchea disan|xevottchim '''$2''' disanim}}, $5, $4 porian.",
+'rcnotefrom' => "Sokoil '''$2''' savn zalelim bodolpam dileant ( '''$1'''meren dakhoileant).",
+'rclistfrom' => '$1 savn suru zatelim novim bodolpam dakhoi',
+'rcshowhideminor' => '$1 dhaktteo sudarnneo',
+'rcshowhidebots' => '$1 robot',
+'rcshowhideliu' => '$1 sotrromb kelele vapuddpi',
+'rcshowhideanons' => '$1 nanv-naslelim vapurpi',
+'rcshowhidepatr' => '$1 topaslele sudharop',
+'rcshowhidemine' => 'Mhojem sudarop $1',
+'rclinks' => "Xevtiche $2 disanim zal'le $1 bodlopam dakhoi<br />$3",
+'diff' => 'frk',
+'hist' => 'iti',
+'hide' => 'Lipoi',
+'show' => 'Dakhoi',
+'minoreditletter' => 'd',
+'newpageletter' => 'N',
+'boteditletter' => 'r',
+'rc-enhanced-expand' => 'Bariksann dakhoi',
+'rc-enhanced-hide' => 'Bariksann lipoi',
+
+# Recent changes linked
+'recentchangeslinked' => 'Sombondit bodolpam',
+'recentchangeslinked-toolbox' => 'Sombondit bodolpam',
+'recentchangeslinked-title' => '"$1" sombondit zalelim bodolpam',
+'recentchangeslinked-summary' => "Hem zaun asa eke panaksun vo eka voraksun, halinch kel'lim bodlopanchi suchi.
+
+[[Special:Watchlist|Tujea sadurvollerint]] aslelim panam 'datt' asat.",
+'recentchangeslinked-page' => 'Panache nanv:',
+'recentchangeslinked-to' => "Dil'em panache bodlek haka zodlelem panank kel'lim bodlopam dakhoi",
+
+# Upload
+'upload' => 'Fail upload kor',
+'uploadlogpage' => 'Uploadachem sotr',
+'filedesc' => 'Sar',
+'uploadedimage' => ' "[[$1]]" upload zalem',
+'watchthisupload' => 'Hea faylar dixtt dovor',
+
+'license' => 'Porvangi',
+'license-header' => 'Porvangi',
+
+# File description page
+'file-anchor-link' => 'Fail',
+'filehist' => 'Failicho itihas',
+'filehist-help' => ' Tea vellar aslelea rupan pollonvk tarikh/vellar koll mar',
+'filehist-revert' => 'Nimanea avruttik porot vor',
+'filehist-current' => 'chalont',
+'filehist-datetime' => 'Tarikh/Vell',
+'filehist-thumb' => 'Lhan-imaz',
+'filehist-thumbtext' => '$1 avrute khatir lhan-imaz',
+'filehist-user' => 'Vaporpi',
+'filehist-dimensions' => 'Akar',
+'filehist-comment' => 'vivek',
+'imagelinks' => 'Failicho vapor',
+'linkstoimage' => '{{PLURAL:$1|Hem pan|$1 Him panam}} hea failik {{PLURAL:$1|zoddtta|zoddttat}}',
+'nolinkstoimage' => 'Hea failik zoddpi panam nant',
+'sharedupload-desc-here' => 'Hi fail $1, hachi ani dusreo projectanim haka uzar korunk zata.
+Hachem [$2 failichem vivron panan] asleli vivron khala dilea:',
+
+# File deletion
+'filedelete-otherreason' => 'Dusrem/aniki karon:',
+
+# Random page
+'randompage' => 'Khoincheim pan',
+
+# Statistics
+'statistics' => 'Ankddevari',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|byte|bytesi}}',
+'nmembers' => '$1 {{PLURAL:$1|vangddi}}',
+'prefixindex' => 'Panam jenche nanvache survatek asa...',
+'shortpages' => 'Dhaktim panam',
+'longpages' => 'Lamb panam',
+'usercreated' => '$3 hannem $1 disa $2 vaztam rochlelem',
+'newpages' => 'Novim panam',
+'move' => 'Zago bodol',
+'pager-newer-n' => '{{PLURAL:$1|novem 1|novim $1}}',
+'pager-older-n' => '{{PLURAL:$1|adlem 1|adlim $1}}',
+
+# Book sources
+'booksources' => 'Pustokachem mull',
+'booksources-search-legend' => 'Pustokachim mullam sod',
+'booksources-go' => 'Fuddem voch',
+
+# Special:Log
+'speciallogtitlelabel' => 'Vishoi vo vapurpi:',
+'log' => 'Sotram',
+
+# Special:AllPages
+'allpages' => 'Sogllim panam',
+'alphaindexline' => '$1 savn $2',
+'nextpage' => 'Mukklem pan ($1)',
+'prevpage' => "Ad'dlem pan ($1)",
+'allpagesfrom' => 'Hanga thavn suru zatelea panank dakhoi:',
+'allarticles' => 'Sogllim panam',
+'allpagessubmit' => 'Fuddem voch',
+
+# Special:Categories
+'categories' => 'Vorg',
+
+# Special:LinkSearch
+'linksearch-line' => '$1 $2 savn zoddlelem asa',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(vapuddpeanchi suchi)',
+
+# Email user
+'emailuser' => 'Email dhadd',
+
+# Watchlist
+'watchlist' => 'Sadurachi volleri',
+'mywatchlist' => 'Sadurachi volleri',
+'watchlistfor2' => '$1 hache khatir $2',
+'watch' => 'Sadur rav',
+'watchthispage' => 'Hea panar dixtt dovor',
+'unwatch' => 'Nodor kadd',
+'watchlist-details' => '{{PLURAL:$1|$1 pan tujea sadurvollerint asa|$1 panam tujea sadurvollerint asat}} , ulovpachim panam meznastanam.',
+'wlshowlast' => 'Xevottchim $1 voram $2 dis $3 dakhoi',
+'watchlist-options' => 'Sadurvollericheo poryay',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Disht dovortanv...',
+'unwatching' => 'Disht kaddthanv...',
+
+# Delete
+'actioncomplete' => 'Karvai sompurnn',
+'actionfailed' => 'Karvai oiesiesvi',
+'dellogpage' => 'Vogllaoneche sotr',
+'deleteotherreason' => 'Dusrem/aniki karon:',
+
+# Rollback
+'rollbacklink' => 'kovoll',
+
+# Protect
+'protectlogpage' => 'Surokxitechem sotr',
+'protectedarticle' => 'rakhlelem "[[$1]]"',
+'protect-otherreason' => 'Dusrem/aniki karon:',
+'protect-otherreason-op' => 'Dusrem karon',
+
+# Undelete
+'undeletelink' => 'polloi/adlea zagear hadd',
+'undeleteviewlink' => 'polloi',
+
+# Namespace form on various pages
+'namespace' => 'Nanv-tholl',
+'invert' => 'Nonddni urfattoi',
+'blanknamespace' => '(Mukhel)',
+
+# Contributions
+'contributions' => '{{GENDER:$1|Vapuddpi}}borovpam',
+'contributions-title' => '$1 hea vapuddpean kelelim borovpam',
+'mycontris' => 'Borovpam',
+'contribsub2' => '{{GENDER:$3|$1}} hacheo ($2)',
+'uctop' => '(atachem)',
+'month' => 'Mhoinea savn (ani adichem):',
+'year' => 'Hea vorsa savn (ani adichem):',
+
+'sp-contributions-newbies' => 'Fokot novea khateachim borovpam dakhoi',
+'sp-contributions-blocklog' => 'addavnniache sotr',
+'sp-contributions-uploads' => 'upload',
+'sp-contributions-logs' => 'sotr',
+'sp-contributions-talk' => 'bhasabhas',
+'sp-contributions-search' => 'Borovpam sod',
+'sp-contributions-username' => 'Antorzall namo vo vapuddpeachem nanv:',
+'sp-contributions-toponly' => 'Fokot halincheo uzollnneo dakhoi',
+'sp-contributions-submit' => 'Sod',
+
+# What links here
+'whatlinkshere' => 'Hanga kitem zoddta',
+'whatlinkshere-title' => '"$1" haka zoddlelim panam',
+'whatlinkshere-page' => 'Pan:',
+'linkshere' => "Sokoilim panam '''[[:$1]]''' ak zoddtat:",
+'nolinkshere' => "Khoincheim pan '''[[:$1]]''' ak zoddna.",
+'isredirect' => 'Porot dixen pan dhadd',
+'istemplate' => 'Durasth-somaves',
+'isimage' => 'failichem zoddop',
+'whatlinkshere-prev' => '{{PLURAL:$1|adlem|adlem $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|fuddlem|fuddlim $1}}',
+'whatlinkshere-links' => '← zoddpam',
+'whatlinkshere-hideredirs' => '$1 porot dixen',
+'whatlinkshere-hidetrans' => '$1 durasth-somaves',
+'whatlinkshere-hidelinks' => '$1 zoddpam',
+'whatlinkshere-hideimages' => 'Failinchim zoddpam $1',
+'whatlinkshere-filters' => 'Challnio',
+
+# Block/unblock
+'ipboptions' => '2 voram:2 hours,1 dis:1 day,3 dis:3 days,1 satollo:1 week,2 satolle:2 weeks,1 mhoino:1 month,3 mhoine:3 months,6 mhoine:6 months,1 voros:1 year,sasnnank:infinite',
+'ipbotherreason' => 'Dusrem/aniki karon:',
+'ipblocklist' => 'Addhailele vapuddpi',
+'blocklink' => 'addavnnni',
+'unblocklink' => 'Addavnni kadd',
+'change-blocklink' => 'Addavnnni bodol',
+'contribslink' => 'borovp',
+'blocklogpage' => 'addavnnechem sotr',
+'blocklogentry' => '[[$1]] addailelem $2 asun vellacho ont: $3',
+'block-log-flags-nocreate' => 'Khatem rochop opatr kelam',
+
+# Move page
+'move-watch' => 'Hea panar disht dovor',
+'movelogpage' => 'Sotr bodol',
+'movereason' => 'Karonn:',
+'revertmove' => 'porti',
+
+# Export
+'export' => 'Panank niryat kor',
+
+# Namespace 8 related
+'allmessagesname' => 'Nanv',
+'allmessagesdefault' => 'Falta sondex mozkur',
+
+# Thumbnails
+'thumbnail-more' => 'vaddoi',
+'thumbnail_error' => 'Lhan-imaz toiar kortana chuk zali. Karonn: $1',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Tujem vapuddpachem pan',
+'tooltip-pt-mytalk' => 'Tumchem ulovpachem pan',
+'tooltip-pt-preferences' => 'Tumcheo avddi',
+'tooltip-pt-watchlist' => 'Bodlachea dekhrekh korpachea panachi volleri',
+'tooltip-pt-mycontris' => 'Tujea borovpanchi suchi',
+'tooltip-pt-login' => 'Tumkam sotrrombh korunk protsavan asa; em soktichem nhoi',
+'tooltip-pt-logout' => 'Sotracho xevott',
+'tooltip-ca-talk' => 'Mozkurachea vixoiavoir bhasabhas',
+'tooltip-ca-edit' => 'Tumchean hem pan sudarunk zata. Upkar korun sambhallche adim zholok butanv vapor',
+'tooltip-ca-addsection' => 'Novo vibhag suru kor',
+'tooltip-ca-viewsource' => 'Hem pan rakhun dovorlam.
+Tujean tachem mull pollonv ieta',
+'tooltip-ca-history' => 'Hea panacheo adleo uzollnneo',
+'tooltip-ca-protect' => 'Hem pan rakh',
+'tooltip-ca-delete' => 'Hem pan vogllai',
+'tooltip-ca-move' => 'Hem pan fuddem vhor',
+'tooltip-ca-watch' => 'Hem pan tujea sadurvollerint zodd',
+'tooltip-ca-unwatch' => 'Hem pan tumchea sadurtaievelean kadd',
+'tooltip-search' => '{{SITENAME}} sod',
+'tooltip-search-go' => 'Hea just nanvachem pan asa zalear tea panar voch',
+'tooltip-search-fulltext' => 'Hea utarea khatir pana sod',
+'tooltip-p-logo' => 'Mukhel panal bhett di',
+'tooltip-n-mainpage' => 'Mukhel panak bhett di',
+'tooltip-n-mainpage-description' => 'Mukhel Panak bhett di',
+'tooltip-n-portal' => 'Hea prokolpa vixim, tumchean kitem korum ieta, khoim kitem sodchem',
+'tooltip-n-currentevents' => 'Chalu ghoddneachea fattbhuichi mahiti sod',
+'tooltip-n-recentchanges' => 'Wikint halinch bodol keleleachi volleri',
+'tooltip-n-randompage' => 'Khoincheim ek pan uktem kor',
+'tooltip-n-help' => 'sodpachem tholl',
+'tooltip-t-whatlinkshere' => 'Hanga zoddlelea sogllea wiki pananchi volleri',
+'tooltip-t-recentchangeslinked' => 'Hea panak zoddlelea panachim halinchim bodolpam',
+'tooltip-feed-atom' => 'Hea panak Atom purovnni',
+'tooltip-t-contributions' => 'Hea vapuddpeachea borovpanchi iadi',
+'tooltip-t-emailuser' => 'Hea vapuddpeak email patthoi',
+'tooltip-t-upload' => 'Faili upload kor',
+'tooltip-t-specialpages' => 'Kherit pananchi volleri',
+'tooltip-t-print' => 'Hea panachem chhapunk ietelem rupantor',
+'tooltip-t-permalink' => 'Hea panache uzollnnek togpi zodd',
+'tooltip-ca-nstab-main' => 'Suchi pan polloi',
+'tooltip-ca-nstab-user' => 'Vapuddpeachem pan polloi',
+'tooltip-ca-nstab-special' => 'Hem ek kherit pan, tujeam hem pan sudarunk zaina',
+'tooltip-ca-nstab-project' => 'Project-achem pan polloi',
+'tooltip-ca-nstab-image' => 'Failichem pan polloi',
+'tooltip-ca-nstab-template' => 'Saacho polloi',
+'tooltip-ca-nstab-category' => 'Vorgachem pan polloi',
+'tooltip-minoredit' => 'Haka ek kirkoll sudharop mhunn khunnay',
+'tooltip-save' => 'Tujim bodolpam sambhall',
+'tooltip-preview' => 'Bodlopanchi zholok polloi, upkar hem samballche adim vapor!',
+'tooltip-diff' => 'Tumi hea mozkurant kelelo bodol dakhoiat',
+'tooltip-compareselectedversions' => 'Hea panacheo don nivoddleleo uzollneo modem forok polloi',
+'tooltip-watch' => 'Hem pan tujea xadurvollerint zodd',
+'tooltip-rollback' => '"Kovllop" hea panachea xevttachea borovpa kodde kea kollant portota.',
+'tooltip-undo' => '"Rodd\' kor" sudharop portita ani sudharopak Zholok ritin ukodta. Tem saran karon zoddunk dita.',
+'tooltip-summary' => 'Mottvo sar ghal',
+
+# Browsing diffs
+'previousdiff' => '← Adlo sudar',
+'nextdiff' => 'Fuddlem bodlop →',
+
+# Media information
+'file-info-size' => '$1 × $2 pixelam, failicho akar: $3, MIME prokar: $4',
+'file-nohires' => 'Odhik bariksai na.',
+'svg-long-desc' => 'SVG fail, nanvak $1 × $2 pixeli, failcho akar: $3',
+'show-big-image' => 'Akhi bariksai',
+
+# Bad image list
+'bad_image_list' => 'Akar oso asa:
+
+Fokot suchicheo vostu (*-chean suru zateleo) dheanant ghevcheo
+Tech vollir, uprantli zoddnni opvad dhorpant ieta,mhonnche zoim pana failichea ek vollint asunk xoktat.',
+
+# Metadata
+'metadata' => 'Metadata',
+'metadata-help' => "Hea failin anikui mahiti asa, hi fail korunk uzar kel'le digital camera vo scanner sun tem aila zait.
+Zori tor hi failik bodol'lam zalear kai mahiti bodololem failik sarkem mell khaina zait.",
+'metadata-fields' => 'Metadata chovkott konsollttoch, hea sondexant metadata molleantlea murtipanachea dakhovnnent aspav astolo.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# External editor support
+'edit-externally' => 'Hea failik bhaili program uzar korun bodol.',
+'edit-externally-help' => '(Odhik mahite khatir [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] polloi)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'soglle',
+'namespacesall' => 'sogllem',
+'monthsall' => 'sogllem',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Sombondhi bodlopam polloi',
+'watchlisttools-edit' => 'Sadurvolleri polloi ani sudar',
+'watchlisttools-raw' => 'Sadurvollerichi mull-an bodol kor',
+
+# Core parser functions
+'duplicate-defaultsort' => "'''Chotrai:''' Falta anukraman mukhel ''$2'' rodd korta adhlem falta anukraman mukhel ''$1'', haka.",
+
+# Special:SpecialPages
+'specialpages' => 'Khaxelim Panam',
+
+# External image whitelist
+'external_image_whitelist' => " #Hi voll asa toxich dovor<pre>
+#Khala sodpache sache (''regular expressions'') ghal (fokot // modem voita poi tem bhag)
+#Hanche borobor bhaile zodlele murt comparar kel'le zatele
+#Mell khatat tim murt koxeo distele, na zalear fokot mortek ek zodd distele
+#Jeo voll #-an suru zatele tem vivek mhunn manlele zatele
+#Hanga vhodle and dhakte okxora modem forok podona
+
+#Soglle sodpache sache hea volla voir ghal. Hi voll asa toxich dovor</pre>",
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Dospi]] challni:',
+
+);
כל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה"אמיתי" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.
פריטים <del>מחוקים</del> כבר תוקנו.',
'double-redirect-fixed-move' => '[[$1]] הועבר.
-×\9bעת ×\96×\90ת הפניה לדף [[$2]].',
+×\9bעת ×\96×\95 הפניה לדף [[$2]].',
'double-redirect-fixed-maintenance' => 'תיקון הפניה כפולה מ[[$1]] ל[[$2]].',
'double-redirect-fixer' => 'מתקן הפניות',
'newwindow' => '(opnast í nýjum glugga)',
'cancel' => 'Hætta við',
'moredotdotdot' => 'Meira...',
-'morenotlisted' => 'fleiri ekki skráð...',
+'morenotlisted' => 'Þessi listi er ekki tæmandi.',
'mypage' => 'Síða',
'mytalk' => 'Spjall',
'anontalk' => 'Spjallsíða þessa vistfangs.',
# 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' => 'Um {{SITENAME}}',
'aboutpage' => 'Project:Um verkefnið',
-'copyright' => 'Efni má nota samkvæmt $1.',
+'copyright' => 'Efni má nota samkvæmt $1 nema kemur fram annars.',
'copyrightpage' => '{{ns:project}}:Höfundarréttur',
'currentevents' => 'Potturinn',
'currentevents-url' => 'Project:Potturinn',
# General errors
'error' => 'Villa',
'databaseerror' => 'Gagnagrunnsvilla',
+'databaseerror-error' => 'Villa: $1',
'laggedslavemode' => 'Viðvörun: Síðan inniheldur ekki nýjustu uppfærslur.',
'readonly' => 'Gagnagrunnur læstur',
'enterlockreason' => 'Gefðu fram ástæðu fyrir læsingunni, og einnig áætlun
'yourname' => 'Notandanafn:',
'userlogin-yourname' => 'Notandanafn',
'userlogin-yourname-ph' => 'Skrifaðu inn notendanafnið þitt',
+'createacct-another-username-ph' => 'Skrifaðu inn notendanafnið',
'yourpassword' => 'Lykilorð:',
'userlogin-yourpassword' => 'Lykilorð',
'userlogin-yourpassword-ph' => 'Skrifaðu niður lykilorðið þitt',
'userlogin-resetpassword-link' => 'Endursetja lykilorð',
'helplogin-url' => 'Help:Innskráning',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp við innskráningu]]',
+'userlogin-loggedin' => 'Þú ert búin(n) að skrá þig inn sem {{GENDER:$1|$1}}.
+Notaðu eyðablaðið fyrir neðan til að skrá þig inn sem annar notandi.',
+'userlogin-createanother' => 'Stofna annan aðgang',
'createacct-join' => 'Sláðu inn þínar upplýsingar fyrir neðan.',
+'createacct-another-join' => 'Skrifaðu upplýsingar um nýja aðganginn fyrir neðan.',
'createacct-emailrequired' => 'Netfang',
'createacct-emailoptional' => 'Netfang (valfrjálst)',
'createacct-email-ph' => 'Skrifaðu niður netfangið þitt',
+'createacct-another-email-ph' => 'Skrifaðu netfang',
'createaccountmail' => 'Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan',
'createacct-realname' => 'Raunverulegt nafn (valfrjálst)',
'createaccountreason' => 'Ástæða:',
'createacct-captcha' => 'Öryggis athugun',
'createacct-imgcaptcha-ph' => 'Sláðu inn textann að ofan',
'createacct-submit' => 'Búa til aðganginn',
+'createacct-another-submit' => 'Stofna annan aðgang',
'createacct-benefit-heading' => '{{SITENAME}} er skrifuð af fólki eins og þér.',
'createacct-benefit-body1' => '{{PLURAL:$1|breyting|breytingar}}',
'createacct-benefit-body2' => '{{PLURAL:$1|síða|síður}}',
Þú getur hunsað þessi skilaboð, ef villa hefur átt sér stað.',
'usernamehasherror' => 'Notendanöfn mega ekki innihalda kassa (#)',
'login-throttled' => 'Þér hefur mistekist að skrá þig inn undir þessu notendanafni of oft.
-Vinsamlegast reynið aftur síðar.',
+Vinsamlegast bíðið $1 áður en þú reynir aftur.',
'login-abort-generic' => 'Innskráningin misheppnaðist - hætt var við hana.',
'loginlanguagelabel' => 'Tungumál: $1',
'suspicious-userlogout' => 'Beiðni um útskráningu hafnað því hún var líklegast send frá biluðum vafra eða vefseli sem hefur vistað vefsíðuna í flýtiminni.',
+'createacct-another-realname-tip' => 'Alvöru nafn er valfrjálst. Ef þú kýst að gefa það upp, verður það notað til að gefa þér heiður af verkum þínum.',
# Email sending
'php-mail-error-unknown' => 'Óþekkt villa í PHP mail() aðgerð.',
'newpassword' => 'Nýja lykilorðið',
'retypenew' => 'Endurtaktu nýja lykilorðið:',
'resetpass_submit' => 'Skrifaðu aðgangsorðið og skráðu þig inn',
-'changepassword-success' => 'Aðgangsorðinu þínu hefur verið breytt! Skráir þig inn...',
+'changepassword-success' => 'Það tókst að breyta lykilorðinu þínu!',
'resetpass_forbidden' => 'Ekki er hægt að breyta lykilorðum',
'resetpass-no-info' => 'Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.',
'resetpass-submit-loggedin' => 'Breyta lykilorði',
'changeemail-submit' => 'Breyta netfangi',
'changeemail-cancel' => 'Hætta við',
+# Special:ResetTokens
+'resettokens' => 'Endurstilla lykla',
+'resettokens-text' => 'Hér getur þú endurstillt lykla sem veita þér aðgang að ákveðnum persónuupplýsingum um aðganginn þinn.
+
+Þú átt að gera það ef þú ert búin(n) að deila þeim með einhverjum öðrum óviljandi eða ef búið er að brjóta inn í aðganginn þinn.',
+'resettokens-no-tokens' => 'Það eru engir lyklar að endurstilla.',
+'resettokens-legend' => 'Endurstilla lykla',
+'resettokens-tokens' => 'Lyklar:',
+'resettokens-token-label' => '$1 (núverandi gildi: $2)',
+'resettokens-done' => 'Lyklarnir hafa verið endurstilltir.',
+'resettokens-resetbutton' => 'Endurstilla valda lykla',
+
# Edit page toolbar
'bold_sample' => 'Feitletraður texti',
'bold_tip' => 'Feitletraður texti',
'nocreate-loggedin' => 'Þú hefur ekki leyfi til að skapa nýjar síður.',
'sectioneditnotsupported-title' => 'Hlutabreyting er ekki virk',
'sectioneditnotsupported-text' => 'Hlutabreyting er ekki virk á þessari síðu.',
-'permissionserrors' => 'Leyfisvillur',
+'permissionserrors' => 'Leyfisvilla',
'permissionserrorstext' => 'Þú hefur ekki leyfi til að gera þetta, af eftirfarandi {{PLURAL:$1|ástæðu|ástæðum}}:',
'permissionserrorstext-withaction' => 'Þú hefur ekki réttindi til að $2, af eftirfarandi {{PLURAL:$1|ástæðu|ástæðum}}:',
'recreate-moveddeleted-warn' => "'''Viðvörun: Þú ert að endurskapa síðu sem áður hefur verið eytt.'''
'undo-failure' => 'Breytinguna var ekki hægt að taka tilbaka vegna breytinga í millitíðinni.',
'undo-norev' => 'Ekki var hægt að taka breytinguna aftr því að hún er ekki til eða henni var eytt.',
'undo-summary' => 'Tek aftur breytingu $1 frá [[Special:Contributions/$2|$2]] ([[User talk:$2|spjall]])',
+'undo-summary-username-hidden' => 'Afturkalla breytingu $1 eftir faldan notanda',
# Account creation failure
'cantcreateaccounttitle' => 'Ekki hægt að búa til aðgang',
'history-fieldset-title' => 'Skoða breytingaskrá',
'history-show-deleted' => 'Eingöngu eyddar breytingar',
'histfirst' => 'elstu',
-'histlast' => 'yngstu',
+'histlast' => 'nýjustu',
'historysize' => '({{PLURAL:$1|1 bæti|$1 bæti}})',
'historyempty' => '(tóm)',
* Óviðeigandi persónulegar upplýsingar
*: ''heimilisfang, símanúmer, kennitala, osfrv.''",
'revdelete-legend' => 'Setja sjáanlegar hamlanir',
-'revdelete-hide-text' => 'Fela breytingatexta',
+'revdelete-hide-text' => 'Breytingatexti',
'revdelete-hide-image' => 'Fela efni skráar',
'revdelete-hide-name' => 'Fela aðgerð og mark',
-'revdelete-hide-comment' => 'Fela breytingarágrip',
-'revdelete-hide-user' => 'Fela notandanafn/vistfang',
+'revdelete-hide-comment' => 'Breytingarágrip',
+'revdelete-hide-user' => 'Notandanafn/vistfang',
'revdelete-hide-restricted' => 'Dylja gögn frá stjórnendum og öðrum',
'revdelete-radio-same' => '(ekki breyta)',
-'revdelete-radio-set' => 'Já',
-'revdelete-radio-unset' => 'Nei',
+'revdelete-radio-set' => 'Sjáanlegt',
+'revdelete-radio-unset' => 'Falið',
'revdelete-suppress' => 'Dylja gögn frá stjórnendum og öðrum',
'revdelete-unsuppress' => 'Fjarlægja takmarkanir á endurvöktum breytingum',
'revdelete-log' => 'Ástæða:',
'compareselectedversions' => 'Bera saman valdar útgáfur',
'showhideselectedversions' => 'Sýna/fela valdar breytingar',
'editundo' => 'Taka aftur þessa breytingu',
+'diff-empty' => '(Enginn munur)',
'diff-multi' => '({{PLURAL:$1|Ein millibreyting ekki sýnd|$1 millibreytingar ekki sýndar}} frá {{PLURAL:$2|notanda|$2 notendum}}.)',
'diff-multi-manyusers' => '({{PLURAL:$1|Ein millibreyting ekki sýnd|$1 millibreytingar ekki sýndar}} frá fleiri en {{PLURAL:$2|einum notanda|$2 notendum}}.)',
'difference-missing-revision' => '{{PLURAL:$2|Ein útgáfa|$2 útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.
'prefs-rendering' => 'Útlit',
'saveprefs' => 'Vista',
'resetprefs' => 'Endurstilla valmöguleika',
-'restoreprefs' => 'Endurheimta allar stillingar',
+'restoreprefs' => 'Endurstilla allar sjálfgefnar stillingar (í öllum hlutum)',
'prefs-editing' => 'Breytingarflipinn',
'rows' => 'Raðir',
'columns' => 'Dálkar',
'badsig' => 'Ógild hrá undirskrift. Athugaðu HTML-kóða.',
'badsiglength' => 'Undirskriftin er of löng.
Hún þarf að vera færri en $1 {{PLURAL:$1|stafur|stafir}}.',
-'yourgender' => 'Kyn:',
-'gender-unknown' => 'Ã\93skilgreint',
-'gender-male' => 'Karl',
-'gender-female' => 'Kona',
+'yourgender' => 'Hvernig vilt þú helst lýsa þér?',
+'gender-unknown' => 'Ã\89g vil heldur ekki gefa upp',
+'gender-male' => 'Hann breytir wikisíðum',
+'gender-female' => 'Hún breytir wikisíðum',
'prefs-help-gender' => 'Valfrjálst: notað til að aðgreina kynin í meldingum hugbúnaðarins. Þessar upplýsingar verða aðgengilegar öllum.',
'email' => 'Tölvupóstur',
'prefs-help-realname' => 'Alvöru nafn er valfrjálst.
'prefs-signature' => 'Undirskrift',
'prefs-dateformat' => 'Dagasnið',
'prefs-timeoffset' => 'Tímamismunur',
-'prefs-advancedediting' => 'Háþróaðir möguleikar',
+'prefs-advancedediting' => 'Almennir valkostir',
+'prefs-editor' => 'Ritsjóri',
+'prefs-preview' => 'Forskoðun',
'prefs-advancedrc' => 'Háþróaðir möguleikar',
'prefs-advancedrendering' => 'Háþróaðir möguleikar',
'prefs-advancedsearchoptions' => 'Háþróaðir möguleikar',
'prefs-displayrc' => 'Útlitsmöguleikar',
'prefs-displaysearchoptions' => 'Útlitsmöguleikar',
'prefs-displaywatchlist' => 'Útlitsmöguleikar',
+'prefs-tokenwatchlist' => 'Lykill',
'prefs-diffs' => 'Breytingar',
+'prefs-help-prefershttps' => 'Þessi stilling tekur gildi í næsta skiptið sem þú skráir inn.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Netfang virðist vera virkt.',
'userrights-no-interwiki' => 'Þú hefur ekki leyfi til að breyta notandaréttindum á öðrum wiki-síðum.',
'userrights-nodatabase' => 'Gagnagrunnurinn $1 er ekki til eða ekki staðbundinn.',
'userrights-nologin' => 'Þú verður að [[Special:UserLogin|innskrá]] þig á möppudýraaðgang til að geta útdeilt notandaréttindum.',
-'userrights-notallowed' => 'Þinn aðgangur hefur ekki réttindi til að útdeila notandaréttindum.',
+'userrights-notallowed' => 'Þú hefur ekki réttindi til að útdeila eða draga til baka notandaréttini.',
'userrights-changeable-col' => 'Hópar sem þú getur breytt',
'userrights-unchangeable-col' => 'Hópar sem þú getur ekki breytt',
+'userrights-conflict' => 'Árekstur í að breyta notandaréttindum! Vinsamlegast skoðaðu aftur og staðfestu breytingar þínar.',
+'userrights-removed-self' => 'Þér hefur tekist að fjarlægja þín eigin réttindi. Vegna þess mátt þú ekki lengur skoða þessa síðu.',
# Groups
'group' => 'Hópur:',
'right-proxyunbannable' => 'Sneiða hjá sjálfvirkum proxy-bönnum',
'right-unblockself' => 'Afbanna sjálfan sig',
'right-protect' => 'Breyta verndunarstigi og breyta vernduðum síðum',
-'right-editprotected' => 'Breyta verndaðar síður (án keðjuverndunar)',
+'right-editprotected' => 'Breyta síðum vernduðum sem „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Breyta síðum vernduðum sem „{{int:protect-level-autoconfirmed}}“',
'right-editinterface' => 'Breyta notandaviðmótinu',
'right-editusercssjs' => 'Breyta CSS- og JS-skrám annarra',
'right-editusercss' => 'Breyta CSS-skrám annarra',
'right-edituserjs' => 'Breyta JS-skrám annarra',
'right-editmyusercss' => 'Breyta þinni eigin CSS-notandaskrá',
'right-editmyuserjs' => 'Breyta þinni eigin JavaScript-notandaskrá',
+'right-viewmywatchlist' => 'Skoða þinn eigin vaktlista',
+'right-editmywatchlist' => 'Breyta þínum eigin vaktlista. Athugið að nokkrar aðgerðir bæta enn við síður án þessa réttindis.',
+'right-viewmyprivateinfo' => 'Skoða þínar eigin persónuupplýsingar (t.d. netfang, alvörunafn)',
+'right-editmyprivateinfo' => 'Breyta þínum eigin persónuupplýsingum (t.d. netfangi, alvörunafni)',
+'right-editmyoptions' => 'Breyta þínum eigin stillingum',
'right-rollback' => 'Taka snögglega aftur breytingar síðasta notanda sem breytti síðunni',
'right-markbotedits' => 'Merkja endurtektar breytingar sem vélmennabreytingar',
'right-noratelimit' => 'Sneiða hjá takmörkunum',
'action-block' => 'Banna notandanum að gera breytingar',
'action-protect' => 'breyta verndunarstigum fyrir þessa síðu',
'action-rollback' => 'Taka snögglega aftur breytingar síðasta notanda sem breytti ákveðinni síðu',
-'action-import' => 'Flytja inn þessa skrá frá öðrum wiki',
-'action-importupload' => 'Flytja inn þessa síðu frá skráar upphali',
+'action-import' => 'flytja inn síður frá öðrum wiki',
+'action-importupload' => 'flytja inn síður frá skráarupphali',
'action-patrol' => 'Merkja breytingar annara sem yfirfarnar',
'action-autopatrol' => 'Merkja eigin breytingu sem yfirfarna',
'action-unwatchedpages' => 'Skoða lista yfir óvaktaðar síður',
'action-userrights-interwiki' => 'breyta notandaréttindum annarra notenda á öðrum wiki-verkefnum',
'action-siteadmin' => 'læsa eða opna gagnagrunninn',
'action-sendemail' => 'senda tölvupósta',
+'action-editmywatchlist' => 'breyta vaktlistanum þínum',
+'action-viewmywatchlist' => 'skoða vaktlistann þinn',
+'action-viewmyprivateinfo' => 'skoða persónuupplýsingar þínar',
+'action-editmyprivateinfo' => 'breyta persónuupplýsingum þínum',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|breyting|breytingar}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|síðan síðustu heimsókn}}',
+'enhancedrc-history' => 'breytingaskrá',
'recentchanges' => 'Nýlegar breytingar',
'recentchanges-legend' => 'Stillingar nýlegra breytinga',
'recentchanges-summary' => 'Hér geturðu fylgst með nýjustu breytingunum.',
+'recentchanges-noresult' => 'Engar breytingar í uppgefna tímabilinu sem passa við þessa mælikvarða.',
'recentchanges-feed-description' => 'Hér er hægt að fylgjast með nýlegum breytingum á {{SITENAME}}.',
'recentchanges-label-newpage' => 'Þessi breyting skapaði nýja síðu',
'recentchanges-label-minor' => 'Þetta er minniháttar breyting',
'rc_categories_any' => 'Alla',
'rc-change-size-new' => '$1 {{PLURAL:$1|bæt|bæti}} eftir breytingu',
'newsectionsummary' => 'Nýr hluti: /* $1 */',
-'rc-enhanced-expand' => 'Sýna upplýsingar (þarfnast JavaScript)',
+'rc-enhanced-expand' => 'Sýna upplýsingar',
'rc-enhanced-hide' => 'Fela ítarefni',
'rc-old-title' => 'Upphaflega búin til undir nafninu "$1"',
'reuploaddesc' => 'Aftur á innhlaðningarformið.',
'upload-tryagain' => 'Sendu breytta myndlýsingu',
'uploadnologin' => 'Óinnskráð(ur)',
-'uploadnologintext' => 'Þú verður að vera [[Special:UserLogin|skráð(ur) inn]]
-til að hlaða inn skrám.',
+'uploadnologintext' => 'Þú verður $1 til að hala upp skrár.',
'upload_directory_missing' => 'Mappa upphlaða ($1) er týnd og vefþjónninn gat ekki búið hana til.',
'upload_directory_read_only' => 'Mistókst að skrifa í möppu upphlaða ($1) á vefþjóni.',
'uploaderror' => 'Villa í innhlaðningu',
'upload_source_file' => '(skrá á tölvunni þinni)',
# Special:ListFiles
-'listfiles-summary' => 'Þessi kerfissíða sýnir allar upphlaðnar skrár.
-Þegar hún er síuð ákveðnu notendanafni birtast eingöngu myndir frá honum.',
+'listfiles-summary' => 'Þessi kerfissíða sýnir allar upphlaðnar skrár.',
'listfiles_search_for' => 'Leita að miðilsnafni:',
'imgfile' => 'skrá',
'listfiles' => 'Skráalisti',
'listfiles_size' => 'Stærð (bæti)',
'listfiles_description' => 'Lýsing',
'listfiles_count' => 'Útgáfur',
+'listfiles-show-all' => 'Taka með gamlar útgáfur af myndum',
+'listfiles-latestversion' => 'Núverandi útgáfa',
+'listfiles-latestversion-yes' => 'Já',
+'listfiles-latestversion-no' => 'Nei',
# File description page
'file-anchor-link' => 'Skrá',
'randompage' => 'Handahófsvalin grein',
'randompage-nopages' => 'Það eru engar síður í {{PLURAL:$2|nafnrýminu|nafnrýmunum}}: $1.',
+# Random page in category
+'randomincategory' => 'Handhófsvalin síða í flokki',
+'randomincategory-invalidcategory' => '„$1“ er ekki gilt flokkarheiti',
+'randomincategory-nopages' => 'Það eru engar síður í flokkinum [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'Fá handhófsvalda síðu úr flokkinum: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Fara',
+
# Random redirect
'randomredirect' => 'Handahófsvalin tilvísun',
'randomredirect-nopages' => 'Það eru engar tilvísanir í nafnrýminu „$1“.',
'statistics-users-active-desc' => 'Notendur sem hafa framkvæmt aðgerð {{PLURAL:$1|síðastliðin dag|síðastliðna $1 daga}}',
'statistics-mostpopular' => 'Mest skoðuðu síður',
+'pageswithprop' => 'Síður með eiginleika',
+'pageswithprop-legend' => 'Síður með síðueiginleika',
+'pageswithprop-text' => 'Á þessari síðu er listi yfir síður sem hafa ákveðna síðueiginleika.',
+'pageswithprop-prop' => 'Heiti eiginleika:',
'pageswithprop-submit' => 'Áfram',
'doubleredirects' => 'Tvöfaldar tilvísanir',
'mostrevisions' => 'Síður eftir fjölda breytinga',
'prefixindex' => 'Allar síður með forskeyti',
'prefixindex-namespace' => 'Allar síður með forskeyti ($1 nafnrými)',
+'prefixindex-strip' => 'Fjarlægja forskeyti í listanum',
'shortpages' => 'Stuttar síður',
'longpages' => 'Langar síður',
'deadendpages' => 'Botnlangar',
'listusers' => 'Notendalisti',
'listusers-editsonly' => 'Sýna eingöngu notendur með breytingar',
'listusers-creationsort' => 'Raða eftir stofndegi',
+'listusers-desc' => 'Raða í lækkandi röð',
'usereditcount' => '$1 {{PLURAL:$1|breyting|breytingar}}',
'usercreated' => '{{GENDER:$3|Stofnað|}} $1 $2',
'newpages' => 'Nýjustu greinar',
'contributions' => 'Framlög {{GENDER:$1|notanda}}',
'contributions-title' => 'Framlög notanda $1',
'mycontris' => 'Framlög',
-'contribsub2' => 'Eftir $1 ($2)',
+'contribsub2' => 'Eftir {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Engar breytingar fundnar sem passa við þessa viðmiðun.',
'uctop' => '(núverandi)',
'month' => 'Frá mánuðinum (og fyrr):',
'spam_reverting' => 'Tek aftur síðustu breytingu sem inniheldur ekki tengil á $1',
'spam_blanking' => 'Allar útgáfur innihéldu tengla á $1, tæmi síðuna',
'spam_deleting' => 'Allar útgáfur innihéldu tengla á $1, eyði síðunni',
-'simpleantispam-label' => 'Kæfuvörn.
-Ekki fylla þetta út!',
+'simpleantispam-label' => "Kæfuvörn.
+'''EKKI''' fylla þetta út!",
# Info page
'pageinfo-title' => 'Upplýsingar um $1',
'pageinfo-article-id' => 'Einkennisnúmer síðunnar',
'pageinfo-language' => 'Tungumál síðunnar',
'pageinfo-robot-policy' => 'Leitarvélastaða',
-'pageinfo-robot-index' => 'Skráanleg',
-'pageinfo-robot-noindex' => 'Óskráanleg',
+'pageinfo-robot-index' => 'Heimilað',
+'pageinfo-robot-noindex' => 'Ekki heimilað',
'pageinfo-views' => 'Fjöldi innlita',
'pageinfo-watchers' => 'Fjöldi notenda, sem vakta síðuna',
'pageinfo-few-watchers' => 'Vöktuð af færri en $1 {{PLURAL:$1|notanda|notendum}}',
-'pageinfo-redirects-name' => 'Tilvísanir til þessarar síðu',
+'pageinfo-redirects-name' => 'Fjöldi tilvísana til þessarar síðu',
'pageinfo-subpages-name' => 'Undirsíður þessarar síðu',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|tilvísun|tilvísanir}}; $3 {{PLURAL:$3|ekki tilvísun|ekki tilvísanir}})',
'pageinfo-firstuser' => 'Stofnandi síðunnar',
'exif-disclaimer' => 'Fyrirvari',
'exif-contentwarning' => 'Viðvörun innihalds myndar',
'exif-giffilecomment' => 'GIF athugasemd',
+'exif-intellectualgenre' => 'Tegund hlutar',
'exif-scenecode' => 'IPTC kóði myndefnis',
'exif-event' => 'Lýsir viðburðinum',
'exif-organisationinimage' => 'Lýsir félaginu',
'tags-tag' => 'Nafn tags',
'tags-display-header' => 'Útlit í breytingarskrá',
'tags-description-header' => 'Tæmandi merkingarlýsing',
+'tags-active-header' => 'Virkt?',
'tags-hitcount-header' => 'Merktar breytingar',
+'tags-active-yes' => 'Já',
+'tags-active-no' => 'Nei',
'tags-edit' => 'breyta',
'tags-hitcount' => '$1 {{PLURAL:$1|breyting|breytingar}}',
'dberr-problems' => 'Því miður!Tæknilegir örðugleikar eru á þessari síðu.',
'dberr-again' => 'Reyndu að bíða í nokkrar mínútur og endurhladdu síðan síðuna.',
'dberr-info' => '(Mistókst að hafa samband við gagnaþjón: $1)',
+'dberr-info-hidden' => '(Mistókst að hafa samband við gagnaþjón)',
'dberr-usegoogle' => 'Þú getur notað Google til að leita á meðan.',
'dberr-outofdate' => 'Athugaðu að afrit þeirra gætu verið úreld.',
'dberr-cachederror' => 'Þetta er afritað eintak af umbeðinni síðu og gæti verið úreld.',
# Image rotation
'rotate-comment' => 'Myndinni var snúið um $1 {{PLURAL:$1|gráðu|gráður}} réttsælis',
+# Limit report
+'limitreport-walltime' => 'Rauntímanotkun',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekúnda|sekúndur}}',
+
);
'searchprofile-articles-tooltip' => 'Quaerere in $1',
'searchprofile-project-tooltip' => 'Quaerere in $1',
'searchprofile-images-tooltip' => 'Fasciculos quaerere',
-'searchprofile-everything-tooltip' => 'Omnia perscrutari (etiam paginae disputatoriae)',
+'searchprofile-everything-tooltip' => 'Omnia perscrutari (etiam paginae disputationis)',
'searchprofile-advanced-tooltip' => 'In spatiis nominalibus accommotis quaerere',
'search-result-size' => '$1 ({{PLURAL:$2|1 verbum|$2 verba}})',
'search-result-score' => 'Gravitas: $1%',
* Informação pessoal imprópria
*: ''endereços de domicílio e números de telefone, números da segurança social, etc''",
'revdelete-legend' => 'Definir restrições de visibilidade',
-'revdelete-hide-text' => 'Ocultar texto da edição',
+'revdelete-hide-text' => 'Revisão do texto',
'revdelete-hide-image' => 'Ocultar conteúdo do ficheiro',
'revdelete-hide-name' => 'Ocultar operação e destino',
-'revdelete-hide-comment' => 'Ocultar resumo da edição',
-'revdelete-hide-user' => 'Ocultar nome de utilizador/IP',
+'revdelete-hide-comment' => 'Resumo da edição',
+'revdelete-hide-user' => 'Nome de utilizador/endereço de IP',
'revdelete-hide-restricted' => 'Ocultar dados dos administradores e de todos os outros',
'revdelete-radio-same' => '(manter)',
-'revdelete-radio-set' => 'Sim',
-'revdelete-radio-unset' => 'Não',
+'revdelete-radio-set' => 'Visível',
+'revdelete-radio-unset' => 'Escondido',
'revdelete-suppress' => 'Ocultar dados dos administradores e de todos os outros',
'revdelete-unsuppress' => 'Remover restrições das revisões restauradas',
'revdelete-log' => 'Motivo:',
'right-edituserjs' => 'Editar os ficheiros JS de outros utilizadores',
'right-editmyusercss' => 'Editar os seus próprios ficheiros CSS de utilizador',
'right-editmyuserjs' => 'Editar os seus próprios ficheiros JavaScript de utilizador',
+'right-viewmywatchlist' => 'Ver sua própria lista de páginas vigiadas',
+'right-editmywatchlist' => 'Editar sua própria lista de páginas vigiadas. Observe que algumas ações seguirão adicionando páginas, mesmo sem este direito.',
'right-viewmyprivateinfo' => 'Ver os seus próprios dados privados (ex.: endereço de e-mail, nome real)',
'right-editmyprivateinfo' => 'Editar os seus próprios dados privados (ex.: endereço de e-mail, nome real)',
'right-editmyoptions' => 'Editar as suas próprias preferências',
'action-userrights-interwiki' => 'editar privilégios de utilizadores de outras wikis',
'action-siteadmin' => 'bloquear ou desbloquear a base de dados',
'action-sendemail' => 'enviar e-mails',
+'action-editmywatchlist' => 'Editar sua lista de páginas vigiadas',
+'action-viewmywatchlist' => 'Ver sua lista de páginas vigiadas',
+'action-viewmyprivateinfo' => 'Ver sua informação privada',
+'action-editmyprivateinfo' => 'Editar sua informação privada',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
# Random page in category
'randomincategory-nopages' => 'Não há páginas na categoria [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'Obter página aleatória da categoria: $1 $2',
'randomincategory-selectcategory-submit' => 'Ir',
# Random redirect
'listusers' => 'Utilizadores',
'listusers-editsonly' => 'Mostrar apenas utilizadores com edições',
'listusers-creationsort' => 'Ordenar por data de criação',
+'listusers-desc' => 'Ordenar de forma decrescente',
'usereditcount' => '$1 {{PLURAL:$1|edição|edições}}',
'usercreated' => '{{GENDER:$3|Criado|Criada}} em $1 às $2',
'newpages' => 'Páginas recentes',
# Special:Redirect
'redirect' => 'Redirecionar pelo ID do ficheiro, utilizador ou revisão',
'redirect-legend' => 'Redirecionar para um ficheiro ou página',
-'redirect-summary' => 'Esta página especial redireciona a um ficheiro (dado o nome do ficheiro), a uma página (dado um ID de revisão) ou a uma página de utilizador (dado o ID do utilizador).',
+'redirect-summary' => 'Esta página especial redireciona a um ficheiro (dado o nome do ficheiro), a uma página (dado um ID de revisão) ou a uma página de utilizador (dado o ID do utilizador). Utilização: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]].',
'redirect-submit' => 'Ir',
'redirect-lookup' => 'Pesquisa:',
'redirect-value' => 'Valor:',
'rotate-comment' => 'Imagem rodada em $1 {{PLURAL:$1|grau|graus}} no sentido dos ponteiros do relógio',
# Limit report
+'limitreport-title' => 'Dados de perfis do analisador:',
'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
-'enhancedrc-since-last-visit' => '$1 с последнего посещения',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|с последнего посещения}}',
'enhancedrc-history' => 'история',
'recentchanges' => 'Свежие правки',
'recentchanges-legend' => 'Настройки свежих правок',
'myprivateinfoprotected' => 'Немате дозволу за мењање ваших личних информација.',
'mypreferencesprotected' => 'Немате дозволу за мењање ваших подешавања.',
'ns-specialprotected' => 'Посебне странице се не могу уређивати.',
-'titleprotected' => "Овај наслов је {{GENDER:$1|заштитио корисник|заштитила корисница|заштитио корисник}} [[User:$1|$1]].
-Наведени разлог: ''$2''.",
+'titleprotected' => "Овај назив је [[User:$1|$1]] заштитио од прављења. Разлог: ''$2''.",
'filereadonlyerror' => 'Не могу да изменим датотеку „$1“ јер је ризница „$2“ у режиму за читање.
Администратор који ју је закључао понудио је следеће објашњење: „$3“.',
'mergehistory-reason' => 'Разлог:',
# Merge log
-'mergelog' => 'Ð\94невник спајања',
+'mergelog' => 'Ð\98Ñ\81Ñ\82оÑ\80иÑ\98а спајања',
'pagemerge-logentry' => 'страница [[$1]] је спојена у [[$2]] (све до измене $3)',
'revertmerge' => 'растави',
'mergelogpagetext' => 'Испод се налази списак скорашњих спајања историја страница.',
'deletepage' => 'Обриши страницу',
'confirm' => 'Потврди',
'excontent' => 'садржај је био: „$1“',
-'excontentauthor' => 'садржај је био: „$1“ (једину измену {{GENDER:|направио је|направила је|направио је}} [[Special:Contributions/$2|$2]])',
+'excontentauthor' => 'садржај је био: „$1“ (а једини уређивач је био „[[Special:Contributions/$2|$2]]“)',
'exbeforeblank' => 'садржај пре брисања је био: „$1“',
'exblank' => 'страница је била празна',
'delete-confirm' => 'Брисање странице „$1“',
'actionfailed' => 'Радња није успела',
'deletedtext' => "Страница „$1“ је обрисана.
Погледајте ''$2'' за више детаља.",
-'dellogpage' => 'Ð\94невник брисања',
+'dellogpage' => 'Ð\98Ñ\81Ñ\82оÑ\80иÑ\98а брисања',
'dellogpagetext' => 'Испод је списак последњих брисања.',
'deletionlog' => 'дневник брисања',
'reverted' => 'Враћено на ранију измену',
'tags-tag' => 'Назив ознаке',
'tags-display-header' => 'Изглед на списковима измена',
'tags-description-header' => 'Опис значења',
+'tags-active-header' => 'Активна?',
'tags-hitcount-header' => 'Означене измене',
+'tags-active-yes' => 'Да',
'tags-edit' => 'уреди',
'tags-hitcount' => '$1 {{PLURAL:$1|измена|измене|измена}}',
'customcssprotected' => 'Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.',
'customjsprotected' => 'Nemate dozvolu da menjate ovu stranicu javaskripta jer sadrži lične postavke drugog korisnika.',
'ns-specialprotected' => 'Posebne stranice se ne mogu uređivati.',
-'titleprotected' => "Ovaj naslov je {{GENDER:$1|zaštitio korisnik|zaštitila korisnica|zaštitio korisnik}} [[User:$1|$1]].
-Navedeni razlog: ''$2''.",
+'titleprotected' => "Ovaj naziv je [[User:$1|$1]] zaštitio od pravljenja. Razlog: ''$2''.",
'filereadonlyerror' => 'Ne mogu da izmenim datoteku „$1“ jer je riznica „$2“ u režimu za čitanje.
Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.',
'mergehistory-reason' => 'Razlog:',
# Merge log
-'mergelog' => 'Dnevnik spajanja',
+'mergelog' => 'Istorija spajanja',
'pagemerge-logentry' => 'stranica [[$1]] je spojena u [[$2]] (sve do izmene $3)',
'revertmerge' => 'rastavi',
'mergelogpagetext' => 'Ispod se nalazi spisak skorašnjih spajanja istorija stranica.',
'deletepage' => 'Obriši stranicu',
'confirm' => 'Potvrdi',
'excontent' => 'sadržaj je bio: „$1“',
-'excontentauthor' => 'sadržaj je bio: „$1“ (jedinu izmenu {{GENDER:|napravio je|napravila je|napravio je}} [[Special:Contributions/$2|$2]])',
+'excontentauthor' => 'sadržaj je bio: „$1“ (a jedini uređivač je bio „[[Special:Contributions/$2|$2]]“)',
'exbeforeblank' => 'sadržaj pre brisanja je bio: „$1“',
'exblank' => 'stranica je bila prazna',
'delete-confirm' => 'Brisanje stranice „$1“',
'actionfailed' => 'Radnja nije uspela',
'deletedtext' => "Stranica „$1“ je obrisana.
Pogledajte ''$2'' za više detalja.",
-'dellogpage' => 'Dnevnik brisanja',
+'dellogpage' => 'Istorija brisanja',
'dellogpagetext' => 'Ispod je spisak poslednjih brisanja.',
'deletionlog' => 'dnevnik brisanja',
'reverted' => 'Vraćeno na raniju izmenu',
'pageinfo-magic-words' => '{{PLURAL:$1|Magična reč|Magične reči}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)',
'pageinfo-toolboxlink' => 'Podaci o stranici',
'pageinfo-redirectsto' => 'Preusmerava na',
'pageinfo-redirectsto-info' => 'podaci',
'tags-tag' => 'Naziv oznake',
'tags-display-header' => 'Izgled na spiskovima izmena',
'tags-description-header' => 'Opis značenja',
+'tags-active-header' => 'Aktivna?',
'tags-hitcount-header' => 'Označene izmene',
+'tags-active-yes' => 'Da',
'tags-edit' => 'uredi',
'tags-hitcount' => '$1 {{PLURAL:$1|izmena|izmene|izmena}}',
'next' => 'nästa',
'last' => 'föregående',
'page_first' => 'första',
-'page_last' => 'senaste',
+'page_last' => 'sista',
'histlegend' => "Val av diff: markera i klickrutorna för att jämföra versioner och tryck enter eller knappen längst ner.<br />
Förklaring: (nuvarande) = skillnad mot nuvarande version; (föregående) = skillnad mot föregående version; '''m''' = mindre ändring.",
'history-fieldset-title' => 'Bläddra i historiken',
'articlepage' => 'విషయపు పేజీని చూడండి',
'talk' => 'చర్చ',
'views' => 'చూపులు',
-'toolbox' => 'పనిముట్ల పెట్టె',
+'toolbox' => 'పనిముట్లు',
'userpage' => 'వాడుకరి పేజీని చూడండి',
'projectpage' => 'ప్రాజెక్టు పేజీని చూడు',
'imagepage' => 'ఫైలు పేజీని చూడండి',
'viewhelppage' => 'సహాయం పేజీని చూడు',
'categorypage' => 'వర్గం పేజీని చూడు',
'viewtalkpage' => 'చర్చను చూడు',
-'otherlanguages' => 'à°\87తర à°à°¾à°·à°²à°²à±\8a',
+'otherlanguages' => 'à°\87తర à°à°¾à°·à°²à°²à±\8b',
'redirectedfrom' => '($1 నుండి మళ్ళించబడింది)',
'redirectpagesub' => 'దారిమార్పు పుట',
'lastmodifiedat' => 'ఈ పేజీకి $2, $1న చివరి మార్పు జరిగినది.',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
'aboutsite' => '{{SITENAME}} గురించి',
'aboutpage' => 'Project:గురించి',
-'copyright' => 'విషయ సంగ్రహం $1 కి లోబడి లభ్యం.',
+'copyright' => 'విషయం $1 కి లోబడి లభ్యం, వేరుగా పేర్కొంటే తప్ప.',
'copyrightpage' => '{{ns:project}}:ప్రచురణ హక్కులు',
'currentevents' => 'ఇప్పటి ముచ్చట్లు',
'currentevents-url' => 'Project:ఇప్పటి ముచ్చట్లు',
'nocreate-loggedin' => 'కొత్త పేజీలను సృష్టించేందుకు మీకు అనుమతి లేదు.',
'sectioneditnotsupported-title' => 'విభాగపు దిద్దిబాట్లకి తొడ్పాటు లేదు',
'sectioneditnotsupported-text' => 'ఈ పేజీలో విభాగాల దిద్దుబాటుకి తోడ్పాటు లేదు.',
-'permissionserrors' => 'à°\85à°¨à±\81మతà±\81à°² తపà±\8dపిదాలà±\81',
+'permissionserrors' => 'à°\85à°¨à±\81మతి à°²à±\8bà°ªà°\82',
'permissionserrorstext' => 'కింద పేర్కొన్న {{PLURAL:$1|కారణం|కారణాల}} మూలంగా, ఆ పని చెయ్యడానికి మీకు అనుమతిలేదు:',
'permissionserrorstext-withaction' => 'ఈ క్రింది {{PLURAL:$1|కారణం|కారణాల}} వల్ల, మీకు $2 అనుమతి లేదు:',
'recreate-moveddeleted-warn' => "'''హెచ్చరిక: ఇంతకు మునుపు ఒకసారి తొలగించిన పేజీని మళ్లీ సృష్టిద్దామని మీరు ప్రయత్నిస్తున్నారు.'''
* అనుచితమైన వ్యక్తిగత సమాచారం
* "ఇంటి చిరునామాలు, టెలిఫోను నంబర్లు, సోషల్ సెక్యూరిటీ నంబర్లు, వగైరాలు"',
'revdelete-legend' => 'సందర్శక నిబంధనలు అమర్చు',
-'revdelete-hide-text' => 'à°\95à±\82à°°à±\8dà°ªà±\81 పాఠà±\8dయానà±\8dని దాà°\9aà±\81',
+'revdelete-hide-text' => 'à°\95à±\82à°°à±\8dà°ªà±\81 పాఠà±\8dà°¯à°\82',
'revdelete-hide-image' => 'ఫైలులోని విషయాన్ని దాచు',
'revdelete-hide-name' => 'చర్యను, లక్ష్యాన్నీ దాచు',
'revdelete-hide-comment' => 'దిద్దుబాటు వ్యాఖ్యను దాచు',
'rc_categories_any' => 'ఏదయినా',
'rc-change-size-new' => 'మార్పు తర్వాత $1 {{PLURAL:$1|బైటు|బైట్లు}}',
'newsectionsummary' => '/* $1 */ కొత్త విభాగం',
-'rc-enhanced-expand' => 'వివరాలని à°\9aà±\82పిà°\82à°\9aà±\81 (à°\9cావాసà±\8dà°\95à±\8dà°°à°¿à°ªà±\8dà°\9fà±\8d à°\85వసరà°\82)',
+'rc-enhanced-expand' => 'వివరాలనà±\81 à°\9aà±\82పిà°\82à°\9aà±\81',
'rc-enhanced-hide' => 'వివరాలను దాచు',
'rc-old-title' => 'మొదట "$1"గా సృష్టించారు',
'contributions' => '{{GENDER:$1|వాడుకరి}} రచనలు',
'contributions-title' => '$1 యొక్క మార్పులు-చేర్పులు',
'mycontris' => 'మార్పులు చేర్పులు',
-'contribsub2' => '$1 ($2) కొరకు',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) కొరకు',
'nocontribs' => 'ఈ విధమైన మార్పులేమీ దొరకలేదు.',
-'uctop' => '(à°ªà±\88ది)',
+'uctop' => '(à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤)',
'month' => 'ఈ నెల నుండి (అంతకు ముందువి):',
'year' => 'ఈ సంవత్సరం నుండి (అంతకు ముందువి):',
* Непотрібна особиста інформація
*: ''домашні адреси, номери телефонів, номер паспорта тощо.''",
'revdelete-legend' => 'Установити обмеження',
-'revdelete-hide-text' => 'Ð\9fÑ\80иÑ\85ований Ñ\82екÑ\81Ñ\82 Ñ\86Ñ\96Ñ\94Ñ\97 веÑ\80Ñ\81Ñ\96Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки',
+'revdelete-hide-text' => 'ТекÑ\81Ñ\82 випÑ\80авленÑ\8c',
'revdelete-hide-image' => 'Приховати вміст файлу',
'revdelete-hide-name' => "Приховати дію та її об'єкт",
-'revdelete-hide-comment' => 'Ð\9fÑ\80иÑ\85оваÑ\82и коменÑ\82аÑ\80',
-'revdelete-hide-user' => "Ð\9fÑ\80иÑ\85оваÑ\82и Ñ\96м'Ñ\8f авÑ\82оÑ\80а",
+'revdelete-hide-comment' => 'Ð\9fÑ\96дÑ\81Ñ\83мок змÑ\96н',
+'revdelete-hide-user' => "Ð\86м'Ñ\8f авÑ\82оÑ\80а/IP адÑ\80еÑ\81а",
'revdelete-hide-restricted' => 'Приховати дані також і від адміністраторів',
'revdelete-radio-same' => '(не змінювати)',
-'revdelete-radio-set' => 'Так',
-'revdelete-radio-unset' => 'Ð\9dÑ\96',
+'revdelete-radio-set' => 'Ð\92идимий',
+'revdelete-radio-unset' => 'Ð\9fÑ\80иÑ\85ований',
'revdelete-suppress' => 'Приховувати дані також і від адміністраторів',
'revdelete-unsuppress' => 'Зняти обмеження з відновлених версій',
'revdelete-log' => 'Причина:',
* אויפדעקונג פון פריוואטקייט אינפארמאציע
* ''היים אדרעסן, טעלעפאן נומערן, אדער סאשעל סעקיורעטי, א.א.וו.:'''",
'revdelete-legend' => 'שטעלט ווייזונג באגרענעצונגען',
-'revdelete-hide-text' => '×\91×\90×\94×\90×\9c×\98 ×\90×\99× ×\94×\90×\9c×\98 פ×\95×\9f ×\95×\95ערס×\99×¢',
+'revdelete-hide-text' => '×\95×\95ערס×\99×¢ ×\98עקס×\98',
'revdelete-hide-image' => 'באהאלט טעקע אינהאלט',
'revdelete-hide-name' => 'באהאלט אקציע און ציל',
-'revdelete-hide-comment' => '×\91×\90×\94×\90×\9c×\98 ×¢× ×\93ער×\9f ×\94ער×\94',
-'revdelete-hide-user' => "×\91×\90Ö·×\94×\90Ö·×\9c×\98×\9f רע×\93×\90ַק×\98×\90ר'ס ×\91×\90× ×\99צער-× ×\90×\9e×¢×\9f/IP-×\90Ö·×\93רעס",
+'revdelete-hide-comment' => 'רע×\93×\90ק×\98×\99ר×\95× ×\92 רע×\96×\95×\9e×¢',
+'revdelete-hide-user' => "רעדאַקטאר'ס באניצער-נאמען/IP-אַדרעס",
'revdelete-hide-restricted' => 'באהאלט אינפארמאציע אויך פון אדמיניסטראטורן פונקט ווי פשוטע באנוצער',
'revdelete-radio-same' => '(נישט ענדערן)',
-'revdelete-radio-set' => '×\99×\90',
-'revdelete-radio-unset' => '× ×\99×\99ן',
+'revdelete-radio-set' => '×\96×¢×\91×\90ר',
+'revdelete-radio-unset' => 'פֿ×\90ַר×\91×\90ָר×\92ן',
'revdelete-suppress' => 'באַהאַלטן אינפֿארמאַציע פון אַדמיניסטראַטארן ווי אויך אנדערע',
'revdelete-unsuppress' => 'טוה אפ באגרענעצונגן אין גענדערטע רעוויזיעס',
'revdelete-log' => 'אורזאַך:',
'userrights-notallowed' => 'איר האט נישט קיין ערלויבניש צוצולייגן אדער אוועקנעמען באַניצער רעכטן.',
'userrights-changeable-col' => 'גרופעס איר קענט ענדערן',
'userrights-unchangeable-col' => 'גרופעס איר קענט נישט ענדערן',
+'userrights-conflict' => 'קאנפֿליקט פון באניצער־רעכטן ענדערונגען! זייט אזוי גוט רעצענזירן און באשטעטיקן אײַערע ענדערונגען.',
+'userrights-removed-self' => 'איר האט דערפאלגרייך אראפגענומען אייערע אייגענע רעכטע. אזוי קענט איר מער נישט דערגרייכן דעם בלאט.',
# Groups
'group' => 'גרופע:',
'no-null-revision' => '无法创建对"$1"页面新的空白修订',
'badtitle' => '错误标题',
'badtitletext' => '所请求页面的标题是无效的、不存在,跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。',
-'perfcached' => '下列数据已缓存,但可能已过时。最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中可用。',
-'perfcachedts' => '下列数据已缓存,最后更新于$1。缓存中最多可有{{PLURAL:$4|1个结果|$4个结果}}。',
-'querypage-no-updates' => '当前禁止对此页面进行更新。
-此处的数据将不能被立即刷新。',
+'perfcached' => '以下是缓存的数据,可能不是最新的数据。缓存中最多有{{PLURAL:$1|$1条结果}}。',
+'perfcachedts' => '以下是缓存的数据,最后更新于$1。缓存中最多有{{PLURAL:$4|$4条结果}}。',
+'querypage-no-updates' => '该页面的更新目前停用。这里的数据不会马上刷新。',
'wrong_wfQuery_params' => '错误的参数被传递到 wfQuery()<br />
函数:$1<br />
查询:$2',
'powersearch' => '高级搜索',
'powersearch-legend' => '高级搜索',
'powersearch-ns' => '在以下的名字空间中搜索:',
-'powersearch-redir' => '列出重定向页',
+'powersearch-redir' => '列出重定向',
'powersearch-field' => '搜索',
'powersearch-togglelabel' => '选择:',
'powersearch-toggleall' => '全选',
'brokenredirects-delete' => '删除',
'withoutinterwiki' => '无语言链接页面',
-'withoutinterwiki-summary' => '以下的页面是未有语言链接到其它语言版本。',
+'withoutinterwiki-summary' => '以下页面没有链接至其它语言版本。',
'withoutinterwiki-legend' => '前缀',
'withoutinterwiki-submit' => '显示',
'ntransclusions' => '用于$1个页面中',
'specialpage-empty' => '无该报告的结果。',
'lonelypages' => '孤立页面',
-'lonelypagestext' => '以下页面尚未被{{SITENAME}}中的其它页面链接或被之包含。',
+'lonelypagestext' => '以下页面没有被{{SITENAME}}的其它页面链接或包含。',
'uncategorizedpages' => '未归类页面',
'uncategorizedcategories' => '未归类分类',
'uncategorizedimages' => '未归类文件',
'shortpages' => '短页面',
'longpages' => '长页面',
'deadendpages' => '断链页面',
-'deadendpagestext' => '以下页面没有链接到{{SITENAME}}中的其它页面。',
+'deadendpagestext' => '以下页面没有链接至{{SITENAME}}的其它页面。',
'protectedpages' => '受保护页面',
'protectedpages-indef' => '仅无限期保护',
'protectedpages-cascade' => '仅连锁保护',
'protectedpagestext' => '以下页面受到保护,不能移移或编辑',
'protectedpagesempty' => '在这些参数下没有页面正在保护。',
'protectedtitles' => '受保护标题',
-'protectedtitlestext' => '以下的页面已经被保护以防止创建',
+'protectedtitlestext' => '以下标题受到保护,不能创建',
'protectedtitlesempty' => '在这些参数之下并无标题正在保护。',
'listusers' => '用户列表',
'listusers-editsonly' => '只显示有编辑的用户',
'movethispage' => '移动本页',
'unusedimagestext' => '下列文件已存在,但并未插入任何页面。
请注意其它网站可能会直接通过URL链接此文件,因此下面列出的文件依然有可能被使用。',
-'unusedcategoriestext' => '虽然没有被其它页面或者分类所采用,但列表中的分类页依然存在。',
+'unusedcategoriestext' => '以下分类页面实际存在,即使没有其它页面或分类利用它们。',
'notargettitle' => '无目标',
'notargettext' => '您还没有指定一个目标页面或用户以进行此项操作。',
'nopagetitle' => '无目标页面',
wfCountDown( 5 );
}
+ $time1 = new MWTimestamp();
+
$shared = $this->hasOption( 'doshared' );
$updates = array( 'core', 'extensions' );
if ( !$this->hasOption( 'nopurge' ) ) {
$updater->purgeCache();
}
+ $time2 = new MWTimestamp();
$this->output( "\nDone.\n" );
+ $this->output( "\nThe job took ". $time2->diff( $time1 )->format( "%i:%S" ). "\n" );
}
function afterFinalSetup() {
--- /dev/null
+<?php
+/**
+ * Tests for includes/Exception.php.
+ *
+ * @author Antoine Musso
+ * @copyright Copyright © 2013, Antoine Musso
+ * @copyright Copyright © 2013, Wikimedia Foundation Inc.
+ * @file
+ */
+
+class ExceptionTest extends MediaWikiTestCase {
+
+ /**
+ * @expectedException MWException
+ */
+ function testMwexceptionThrowing() {
+ throw new MWException();
+ }
+
+ /**
+ * Verify the exception classes are JSON serializabe.
+ *
+ * @covers MWExceptionHandler::jsonSerializeException
+ * @dataProvider provideExceptionClasses
+ */
+ function testJsonSerializeExceptions( $exception_class ) {
+ $json = MWExceptionHandler::jsonSerializeException(
+ new $exception_class()
+ );
+ $this->assertNotEquals( false, $json,
+ "The $exception_class exception should be JSON serializable, got false." );
+ }
+
+ function provideExceptionClasses() {
+ return array(
+ array( 'Exception' ),
+ array( 'MWException' ),
+ );
+ }
+
+
+ /**
+ * Lame JSON schema validation.
+ *
+ * @covers MWExceptionHandler::jsonSerializeException
+ *
+ * @param $expectedKeyType String Type expected as returned by gettype()
+ * @param $exClass String An exception class (ie: Exception, MWException)
+ * @param $key String Name of the key to validate in the serialized JSON
+ * @dataProvider provideJsonSerializedKeys
+ */
+ function testJsonserializeexceptionKeys($expectedKeyType, $exClass, $key) {
+
+ # Make sure we log a backtrace:
+ $this->setMwGlobals( array( 'wgLogExceptionBacktrace' => true ) );
+
+ $json = json_decode(
+ MWExceptionHandler::jsonSerializeException( new $exClass())
+ );
+ $this->assertObjectHasAttribute( $key, $json,
+ "JSON serialized exception is missing key '$key'"
+ );
+ $this->assertInternalType( $expectedKeyType, $json->$key,
+ "JSON serialized key '$key' has type " . gettype($json->$key)
+ . " (expected: $expectedKeyType)."
+ );
+ }
+
+ /**
+ * Returns test cases: exception class, key name, gettype()
+ */
+ function provideJsonSerializedKeys() {
+ $testCases = array();
+ foreach( array( 'Exception', 'MWException' ) as $exClass ) {
+ $exTests = array(
+ array( 'string', $exClass, 'id' ),
+ array( 'string', $exClass, 'file' ),
+ array( 'integer', $exClass, 'line' ),
+ array( 'string', $exClass, 'message' ),
+ array( 'null', $exClass, 'url' ),
+ # Backtrace only enabled with wgLogExceptionBacktrace = true
+ array( 'array', $exClass, 'backtrace' ),
+ );
+ $testCases = array_merge($testCases, $exTests);
+ }
+ return $testCases;
+ }
+
+ /**
+ * Given wgLogExceptionBacktrace is true
+ * then serialized exception SHOULD have a backtrace
+ *
+ * @covers MWExceptionHandler::jsonSerializeException
+ */
+ function testJsonserializeexceptionBacktracingEnabled() {
+ $this->setMwGlobals( array( 'wgLogExceptionBacktrace' => true ) );
+ $json = json_decode(
+ MWExceptionHandler::jsonSerializeException( new Exception() )
+ );
+ $this->assertObjectHasAttribute( 'backtrace', $json );
+ }
+
+ /**
+ * Given wgLogExceptionBacktrace is false
+ * then serialized exception SHOULD NOT have a backtrace
+ *
+ * @covers MWExceptionHandler::jsonSerializeException
+ */
+ function testJsonserializeexceptionBacktracingDisabled() {
+ $this->setMwGlobals( array( 'wgLogExceptionBacktrace' => false ) );
+ $json = json_decode(
+ MWExceptionHandler::jsonSerializeException( new Exception() )
+ );
+ $this->assertObjectNotHasAttribute( 'backtrace', $json );
+
+ }
+
+}
* @dataProvider provideExpandableUrls
*/
public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
- // Fake $wgServer and $wgCanonicalServer
+ // Fake $wgServer, $wgCanonicalServer and $wgRequest->getProtocol()
$this->setMwGlobals( array(
'wgServer' => $server,
'wgCanonicalServer' => $canServer,
+ 'wgRequest' => new FauxRequest( array(), false, null, $httpsMode ? 'https' : 'http' )
) );
- // Fake $_SERVER['HTTPS'] if needed
- if ( $httpsMode ) {
- $_SERVER['HTTPS'] = 'on';
- } else {
- unset( $_SERVER['HTTPS'] );
- }
-
$this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
}
* @covers Title::getParentCategories
*/
public function testTemplateCategories() {
- $title = Title::newFromText( "Categorized from template" );
- $page = WikiPage::factory( $title );
$user = new User();
- $user->mRights = array( 'createpage', 'edit', 'purge' );
+ $user->mRights = array( 'createpage', 'edit', 'purge', 'delete' );
+ $title = Title::newFromText( "Categorized from template" );
+ $page = WikiPage::factory( $title );
$page->doEditContent(
new WikitextContent( '{{Categorising template}}' ),
'Create a page with a template',
);
$this->assertEquals(
- array()
- , $title->getParentCategories()
+ array(),
+ $title->getParentCategories(),
+ 'Verify that the category doesn\'t contain the page before the template is created'
);
+ // Create template
$template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
-
$template->doEditContent(
new WikitextContent( '[[Category:Solved bugs]]' ),
'Add a category through a template',
$jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
$jobs->execute();
+ // Make sure page is in the category
$this->assertEquals(
- array( 'Category:Solved_bugs' => $title->getPrefixedText() )
- , $title->getParentCategories()
+ array( 'Category:Solved_bugs' => $title->getPrefixedText() ),
+ $title->getParentCategories(),
+ 'Verify that the page is in the category after the template is created'
+ );
+
+ // Edit the template
+ $template->doEditContent(
+ new WikitextContent( '[[Category:Solved bugs 2]]' ),
+ 'Change the category added by the template',
+ 0,
+ false,
+ $user
);
+
+ // Run the job queue
+ JobQueueGroup::destroySingletons();
+ $jobs = new RunJobs;
+ $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+ $jobs->execute();
+
+ // Make sure page is in the right category
+ $this->assertEquals(
+ array( 'Category:Solved_bugs_2' => $title->getPrefixedText() ),
+ $title->getParentCategories(),
+ 'Verify that the page is in the right category after the template is edited'
+ );
+
+ // Now delete the template
+ $error = '';
+ $template->doDeleteArticleReal( 'Delete the template', false, 0, true, $error, $user );
+
+ // Run the job queue
+ JobQueueGroup::destroySingletons();
+ $jobs = new RunJobs;
+ $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+ $jobs->execute();
+
+ // Make sure the page is no longer in the category
+ $this->assertEquals(
+ array(),
+ $title->getParentCategories(),
+ 'Verify that the page is no longer in the category after template deletion'
+ );
+
}
}
--- /dev/null
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ */
+class ApiBaseTest extends ApiTestCase {
+
+ /**
+ * @covers ApiBase::requireOnlyOneParameter
+ */
+ public function testRequireOnlyOneParameterDefault() {
+ $mock = new MockApi();
+ $mock->requireOnlyOneParameter(
+ array( "filename" => "foo.txt", "enablechunks" => false ),
+ "filename", "enablechunks"
+ );
+ $this->assertTrue( true );
+ }
+
+ /**
+ * @expectedException UsageException
+ * @covers ApiBase::requireOnlyOneParameter
+ */
+ public function testRequireOnlyOneParameterZero() {
+ $mock = new MockApi();
+ $mock->requireOnlyOneParameter(
+ array( "filename" => "foo.txt","enablechunks" => 0 ),
+ "filename", "enablechunks"
+ );
+ }
+
+ /**
+ * @expectedException UsageException
+ * @covers ApiBase::requireOnlyOneParameter
+ */
+ public function testRequireOnlyOneParameterTrue() {
+ $mock = new MockApi();
+ $mock->requireOnlyOneParameter(
+ array( "filename" => "foo.txt", "enablechunks" => true ),
+ "filename", "enablechunks"
+ );
+ }
+
+}
--- /dev/null
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiLogin
+ */
+class ApiLoginTest extends ApiTestCase {
+
+ /**
+ * Test result of attempted login with an empty username
+ */
+ public function testApiLoginNoName() {
+ $data = $this->doApiRequest( array( 'action' => 'login',
+ 'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
+ ) );
+ $this->assertEquals( 'NoName', $data[0]['login']['result'] );
+ }
+
+ public function testApiLoginBadPass() {
+ global $wgServer;
+
+ $user = self::$users['sysop'];
+ $user->user->logOut();
+
+ if ( !isset( $wgServer ) ) {
+ $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
+ }
+ $ret = $this->doApiRequest( array(
+ "action" => "login",
+ "lgname" => $user->username,
+ "lgpassword" => "bad",
+ ) );
+
+ $result = $ret[0];
+
+ $this->assertNotInternalType( "bool", $result );
+ $a = $result["login"]["result"];
+ $this->assertEquals( "NeedToken", $a );
+
+ $token = $result["login"]["token"];
+
+ $ret = $this->doApiRequest(
+ array(
+ "action" => "login",
+ "lgtoken" => $token,
+ "lgname" => $user->username,
+ "lgpassword" => "badnowayinhell",
+ ),
+ $ret[2]
+ );
+
+ $result = $ret[0];
+
+ $this->assertNotInternalType( "bool", $result );
+ $a = $result["login"]["result"];
+
+ $this->assertEquals( "WrongPass", $a );
+ }
+
+ public function testApiLoginGoodPass() {
+ global $wgServer;
+
+ if ( !isset( $wgServer ) ) {
+ $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
+ }
+
+ $user = self::$users['sysop'];
+ $user->user->logOut();
+
+ $ret = $this->doApiRequest( array(
+ "action" => "login",
+ "lgname" => $user->username,
+ "lgpassword" => $user->password,
+ )
+ );
+
+ $result = $ret[0];
+ $this->assertNotInternalType( "bool", $result );
+ $this->assertNotInternalType( "null", $result["login"] );
+
+ $a = $result["login"]["result"];
+ $this->assertEquals( "NeedToken", $a );
+ $token = $result["login"]["token"];
+
+ $ret = $this->doApiRequest(
+ array(
+ "action" => "login",
+ "lgtoken" => $token,
+ "lgname" => $user->username,
+ "lgpassword" => $user->password,
+ ),
+ $ret[2]
+ );
+
+ $result = $ret[0];
+
+ $this->assertNotInternalType( "bool", $result );
+ $a = $result["login"]["result"];
+
+ $this->assertEquals( "Success", $a );
+ }
+
+ /**
+ * @group Broken
+ */
+ public function testApiLoginGotCookie() {
+ $this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
+
+ global $wgServer, $wgScriptPath;
+
+ if ( !isset( $wgServer ) ) {
+ $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
+ }
+ $user = self::$users['sysop'];
+
+ $req = MWHttpRequest::factory( self::$apiUrl . "?action=login&format=xml",
+ array( "method" => "POST",
+ "postData" => array(
+ "lgname" => $user->username,
+ "lgpassword" => $user->password
+ )
+ )
+ );
+ $req->execute();
+
+ libxml_use_internal_errors( true );
+ $sxe = simplexml_load_string( $req->getContent() );
+ $this->assertNotInternalType( "bool", $sxe );
+ $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
+ $this->assertNotInternalType( "null", $sxe->login[0] );
+
+ $a = $sxe->login[0]->attributes()->result[0];
+ $this->assertEquals( ' result="NeedToken"', $a->asXML() );
+ $token = (string)$sxe->login[0]->attributes()->token;
+
+ $req->setData( array(
+ "lgtoken" => $token,
+ "lgname" => $user->username,
+ "lgpassword" => $user->password ) );
+ $req->execute();
+
+ $cj = $req->getCookieJar();
+ $serverName = parse_url( $wgServer, PHP_URL_HOST );
+ $this->assertNotEquals( false, $serverName );
+ $serializedCookie = $cj->serializeToHttpRequest( $wgScriptPath, $serverName );
+ $this->assertNotEquals( '', $serializedCookie );
+ $this->assertRegexp( '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . $user->userName . '; .*Token=/', $serializedCookie );
+ }
+
+ public function testRunLogin() {
+ $sysopUser = self::$users['sysop'];
+ $data = $this->doApiRequest( array(
+ 'action' => 'login',
+ 'lgname' => $sysopUser->username,
+ 'lgpassword' => $sysopUser->password ) );
+
+ $this->assertArrayHasKey( "login", $data[0] );
+ $this->assertArrayHasKey( "result", $data[0]['login'] );
+ $this->assertEquals( "NeedToken", $data[0]['login']['result'] );
+ $token = $data[0]['login']['token'];
+
+ $data = $this->doApiRequest( array(
+ 'action' => 'login',
+ "lgtoken" => $token,
+ "lgname" => $sysopUser->username,
+ "lgpassword" => $sysopUser->password ), $data[2] );
+
+ $this->assertArrayHasKey( "login", $data[0] );
+ $this->assertArrayHasKey( "result", $data[0]['login'] );
+ $this->assertEquals( "Success", $data[0]['login']['result'] );
+ $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
+ }
+
+}
--- /dev/null
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiMain
+ */
+class ApiMainTest extends ApiTestCase {
+
+ /**
+ * Test that the API will accept a FauxRequest and execute. The help action
+ * (default) throws a UsageException. Just validate we're getting proper XML
+ *
+ * @expectedException UsageException
+ */
+ public function testApi() {
+ $api = new ApiMain(
+ new FauxRequest( array( 'action' => 'help', 'format' => 'xml' ) )
+ );
+ $api->execute();
+ $api->getPrinter()->setBufferResult( true );
+ $api->printResult( false );
+ $resp = $api->getPrinter()->getBuffer();
+
+ libxml_use_internal_errors( true );
+ $sxe = simplexml_load_string( $resp );
+ $this->assertNotInternalType( "bool", $sxe );
+ $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
+ }
+
+}
+++ /dev/null
-<?php
-
-/**
- * @group API
- * @group Database
- * @group medium
- */
-class ApiTest extends ApiTestCase {
-
- public function testRequireOnlyOneParameterDefault() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter( array( "filename" => "foo.txt",
- "enablechunks" => false ), "filename", "enablechunks" ) );
- }
-
- /**
- * @expectedException UsageException
- */
- public function testRequireOnlyOneParameterZero() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter( array( "filename" => "foo.txt",
- "enablechunks" => 0 ), "filename", "enablechunks" ) );
- }
-
- /**
- * @expectedException UsageException
- */
- public function testRequireOnlyOneParameterTrue() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter( array( "filename" => "foo.txt",
- "enablechunks" => true ), "filename", "enablechunks" ) );
- }
-
- /**
- * Test that the API will accept a FauxRequest and execute. The help action
- * (default) throws a UsageException. Just validate we're getting proper XML
- *
- * @expectedException UsageException
- */
- public function testApi() {
- $api = new ApiMain(
- new FauxRequest( array( 'action' => 'help', 'format' => 'xml' ) )
- );
- $api->execute();
- $api->getPrinter()->setBufferResult( true );
- $api->printResult( false );
- $resp = $api->getPrinter()->getBuffer();
-
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $resp );
- $this->assertNotInternalType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- }
-
- /**
- * Test result of attempted login with an empty username
- */
- public function testApiLoginNoName() {
- $data = $this->doApiRequest( array( 'action' => 'login',
- 'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
- ) );
- $this->assertEquals( 'NoName', $data[0]['login']['result'] );
- }
-
- public function testApiLoginBadPass() {
- global $wgServer;
-
- $user = self::$users['sysop'];
- $user->user->logOut();
-
- if ( !isset( $wgServer ) ) {
- $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
- }
- $ret = $this->doApiRequest( array(
- "action" => "login",
- "lgname" => $user->username,
- "lgpassword" => "bad",
- ) );
-
- $result = $ret[0];
-
- $this->assertNotInternalType( "bool", $result );
- $a = $result["login"]["result"];
- $this->assertEquals( "NeedToken", $a );
-
- $token = $result["login"]["token"];
-
- $ret = $this->doApiRequest(
- array(
- "action" => "login",
- "lgtoken" => $token,
- "lgname" => $user->username,
- "lgpassword" => "badnowayinhell",
- ),
- $ret[2]
- );
-
- $result = $ret[0];
-
- $this->assertNotInternalType( "bool", $result );
- $a = $result["login"]["result"];
-
- $this->assertEquals( "WrongPass", $a );
- }
-
- public function testApiLoginGoodPass() {
- global $wgServer;
-
- if ( !isset( $wgServer ) ) {
- $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
- }
-
- $user = self::$users['sysop'];
- $user->user->logOut();
-
- $ret = $this->doApiRequest( array(
- "action" => "login",
- "lgname" => $user->username,
- "lgpassword" => $user->password,
- )
- );
-
- $result = $ret[0];
- $this->assertNotInternalType( "bool", $result );
- $this->assertNotInternalType( "null", $result["login"] );
-
- $a = $result["login"]["result"];
- $this->assertEquals( "NeedToken", $a );
- $token = $result["login"]["token"];
-
- $ret = $this->doApiRequest(
- array(
- "action" => "login",
- "lgtoken" => $token,
- "lgname" => $user->username,
- "lgpassword" => $user->password,
- ),
- $ret[2]
- );
-
- $result = $ret[0];
-
- $this->assertNotInternalType( "bool", $result );
- $a = $result["login"]["result"];
-
- $this->assertEquals( "Success", $a );
- }
-
- /**
- * @group Broken
- */
- public function testApiGotCookie() {
- $this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
-
- global $wgServer, $wgScriptPath;
-
- if ( !isset( $wgServer ) ) {
- $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
- }
- $user = self::$users['sysop'];
-
- $req = MWHttpRequest::factory( self::$apiUrl . "?action=login&format=xml",
- array( "method" => "POST",
- "postData" => array(
- "lgname" => $user->username,
- "lgpassword" => $user->password
- )
- )
- );
- $req->execute();
-
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $req->getContent() );
- $this->assertNotInternalType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- $this->assertNotInternalType( "null", $sxe->login[0] );
-
- $a = $sxe->login[0]->attributes()->result[0];
- $this->assertEquals( ' result="NeedToken"', $a->asXML() );
- $token = (string)$sxe->login[0]->attributes()->token;
-
- $req->setData( array(
- "lgtoken" => $token,
- "lgname" => $user->username,
- "lgpassword" => $user->password ) );
- $req->execute();
-
- $cj = $req->getCookieJar();
- $serverName = parse_url( $wgServer, PHP_URL_HOST );
- $this->assertNotEquals( false, $serverName );
- $serializedCookie = $cj->serializeToHttpRequest( $wgScriptPath, $serverName );
- $this->assertNotEquals( '', $serializedCookie );
- $this->assertRegexp( '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . $user->userName . '; .*Token=/', $serializedCookie );
-
- return $cj;
- }
-
- public function testRunLogin() {
- $sysopUser = self::$users['sysop'];
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- 'lgname' => $sysopUser->username,
- 'lgpassword' => $sysopUser->password ) );
-
- $this->assertArrayHasKey( "login", $data[0] );
- $this->assertArrayHasKey( "result", $data[0]['login'] );
- $this->assertEquals( "NeedToken", $data[0]['login']['result'] );
- $token = $data[0]['login']['token'];
-
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- "lgtoken" => $token,
- "lgname" => $sysopUser->username,
- "lgpassword" => $sysopUser->password ), $data[2] );
-
- $this->assertArrayHasKey( "login", $data[0] );
- $this->assertArrayHasKey( "result", $data[0]['login'] );
- $this->assertEquals( "Success", $data[0]['login']['result'] );
- $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
-
- return $data;
- }
-
- public function testGettingToken() {
- foreach ( self::$users as $user ) {
- $this->runTokenTest( $user );
- }
- }
-
- function runTokenTest( $user ) {
- $tokens = $this->getTokenList( $user );
-
- $rights = $user->user->getRights();
-
- $this->assertArrayHasKey( 'edittoken', $tokens );
- $this->assertArrayHasKey( 'movetoken', $tokens );
-
- if ( isset( $rights['delete'] ) ) {
- $this->assertArrayHasKey( 'deletetoken', $tokens );
- }
-
- if ( isset( $rights['block'] ) ) {
- $this->assertArrayHasKey( 'blocktoken', $tokens );
- $this->assertArrayHasKey( 'unblocktoken', $tokens );
- }
-
- if ( isset( $rights['protect'] ) ) {
- $this->assertArrayHasKey( 'protecttoken', $tokens );
- }
-
- return $tokens;
- }
-}
--- /dev/null
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiTokens
+ */
+class ApiTokensTest extends ApiTestCase {
+
+ public function testGettingToken() {
+ foreach ( self::$users as $user ) {
+ $this->runTokenTest( $user );
+ }
+ }
+
+ protected function runTokenTest( $user ) {
+ $tokens = $this->getTokenList( $user );
+
+ $rights = $user->user->getRights();
+
+ $this->assertArrayHasKey( 'edittoken', $tokens );
+ $this->assertArrayHasKey( 'movetoken', $tokens );
+
+ if ( isset( $rights['delete'] ) ) {
+ $this->assertArrayHasKey( 'deletetoken', $tokens );
+ }
+
+ if ( isset( $rights['block'] ) ) {
+ $this->assertArrayHasKey( 'blocktoken', $tokens );
+ $this->assertArrayHasKey( 'unblocktoken', $tokens );
+ }
+
+ if ( isset( $rights['protect'] ) ) {
+ $this->assertArrayHasKey( 'protecttoken', $tokens );
+ }
+ }
+
+}
*/
class ApiFormatWddxTest extends ApiFormatTestBase {
+ /**
+ * @requires function wddx_deserialize
+ */
public function testValidSyntax( ) {
$data = $this->apiRequest( 'wddx', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
$this->assertEquals( "ALTER TABLE foo ADD COLUMN foo_bar INTEGER DEFAULT 42",
$this->replaceVars( "ALTER TABLE foo\nADD COLUMN foo_bar int(10) unsigned DEFAULT 42" )
);
+
+ $this->assertEquals( "DROP INDEX foo",
+ $this->replaceVars( "DROP INDEX /*i*/foo ON /*_*/bar" )
+ );
+
+ $this->assertEquals( "DROP INDEX foo -- dropping index",
+ $this->replaceVars( "DROP INDEX /*i*/foo ON /*_*/bar -- dropping index" )
+ );
}
/**