$lang: The language code to use for the link in the wfMessage function
'EditFilter': Perform checks on an edit
-$editor: Edit form (see includes/EditPage.php)
+$editor: EditPage instance (object). The edit form (see includes/EditPage.php)
$text: Contents of the edit box
$section: Section being edited
&$error: Error message to return
'GenderCache' => 'includes/cache/GenderCache.php',
'GlobalDependency' => 'includes/cache/CacheDependency.php',
'HTMLCacheUpdate' => 'includes/cache/HTMLCacheUpdate.php',
- 'HTMLCacheUpdateJob' => 'includes/cache/HTMLCacheUpdate.php',
'HTMLFileCache' => 'includes/cache/HTMLFileCache.php',
'LinkBatch' => 'includes/cache/LinkBatch.php',
'LinkCache' => 'includes/cache/LinkCache.php',
'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
# includes/job
- 'DoubleRedirectJob' => 'includes/job/DoubleRedirectJob.php',
- 'EmaillingJob' => 'includes/job/EmaillingJob.php',
- 'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
'Job' => 'includes/job/Job.php',
'JobQueue' => 'includes/job/JobQueue.php',
'JobQueueDB' => 'includes/job/JobQueueDB.php',
'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
- 'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
- 'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
- 'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
+
+ # includes/job/jobs
+ 'DoubleRedirectJob' => 'includes/job/jobs/DoubleRedirectJob.php',
+ 'EmaillingJob' => 'includes/job/jobs/EmaillingJob.php',
+ 'EnotifNotifyJob' => 'includes/job/jobs/EnotifNotifyJob.php',
+ 'HTMLCacheUpdateJob' => 'includes/job/jobs/HTMLCacheUpdateJob.php',
+ 'RefreshLinksJob' => 'includes/job/jobs/RefreshLinksJob.php',
+ 'RefreshLinksJob2' => 'includes/job/jobs/RefreshLinksJob.php',
+ 'UploadFromUrlJob' => 'includes/job/jobs/UploadFromUrlJob.php',
# includes/json
'FormatJson' => 'includes/json/FormatJson.php',
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
* This allows for limited transactional logic across multiple backends for storing
* secondary data.
*
- * @static
* @param $updates array a list of DataUpdate instances
* @throws Exception|null
*/
wfDebug( __METHOD__ . ": Suppressing edit conflict, successful merge.\n" );
} else {
$this->section = '';
- #$this->textbox1 = $text; #redundant, nothing to do here?
+ $this->textbox1 = ContentHandler::getContentText( $content );
wfDebug( __METHOD__ . ": Keeping edit conflict, failed merge.\n" );
}
}
if ( $doEditStatus->isOK() ) {
$result['redirect'] = $content->isRedirect();
- $this->commitWatch();
+ $this->updateWatchlist();
wfProfileOut( __METHOD__ );
return $status;
} else {
}
/**
- * Commit the change of watch status
+ * Register the change of watch status
*/
- protected function commitWatch() {
+ protected function updateWatchlist() {
global $wgUser;
+
if ( $wgUser->isLoggedIn() && $this->watchthis != $wgUser->isWatched( $this->mTitle ) ) {
+ $fname = __METHOD__;
+ $title = $this->mTitle;
+ $watch = $this->watchthis;
+
+ // Do this in its own transaction to reduce contention...
$dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
- if ( $this->watchthis ) {
- WatchAction::doWatch( $this->mTitle, $wgUser );
- } else {
- WatchAction::doUnwatch( $this->mTitle, $wgUser );
- }
- $dbw->commit( __METHOD__ );
+ $dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
+ $dbw->begin( $fname );
+ if ( $watch ) {
+ WatchAction::doWatch( $title, $wgUser );
+ } else {
+ WatchAction::doUnwatch( $title, $wgUser );
+ }
+ $dbw->commit( $fname );
+ } );
}
}
$wgOut->addModules( 'mediawiki.action.edit' );
if ( $wgUser->getOption( 'uselivepreview', false ) ) {
- $wgOut->addModules( 'mediawiki.legacy.preview' );
+ $wgOut->addModules( 'mediawiki.action.edit.preview' );
}
// Bug #19334: textarea jumps when editing articles in IE8
$wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
# Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
if( $level && $format ) {
$note = "<div id='mw-{$level}{$format}preview'>" . wfMessage( "{$level}{$format}preview" )->text() . "</div>";
- } else {
- $note = wfMessage( 'previewnote' )->text() ;
}
- } else {
- $note = wfMessage( 'previewnote' )->text() ;
}
$rt = $content->getRedirectChain();
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @author Antoine Musso <hashar at free dot fr>, Aaron Schulz
+ * @author Antoine Musso "<hashar at free dot fr>", Aaron Schulz
*/
// Some regex definition to "play" with IP address and IP address blocks
array( 'action' => 'edit' )
);
}
- $outText .= '<li>' . self::link( $titleObj ) . ' (' . $editLink . ') ' . $protected . '</li>';
+ $outText .= '<li>' . self::link( $titleObj )
+ . wfMessage( 'word-separator' )->escaped()
+ . wfMessage( 'parentheses' )->rawParams( $editLink )->escaped()
+ . wfMessage( 'word-separator' )->escaped()
+ . $protected . '</li>';
}
$outText .= '</ul>';
}
} elseif ( !is_array( $param ) ) {
return array( 'before', $param );
} else {
- throw new MWException( "Invalid message parameter" );
+ throw new MWException( "Invalid message parameter: " . serialize( $param ) );
}
}
foreach ( array( 'id', 'class', 'active', 'tag' ) as $k ) {
unset( $link[$k] );
}
- if ( isset( $item['id'] ) ) {
+ if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
// The id goes on the <li> not on the <a> for single links
// but makeSidebarLink still needs to know what id to use when
// generating tooltips and accesskeys.
*/
public function isRestricted() {
// DWIM: If all anons can do something, then it is not restricted
- return $this->mRestriction != '' && User::groupHasPermission( '*', $this->mRestriction );
+ return $this->mRestriction != '' && !User::groupHasPermission( '*', $this->mRestriction );
}
/**
*
* @see self::getLocalURL
* @see wfExpandUrl
+ * @param $query
+ * @param $query2 bool
* @param $proto Protocol type to use in URL
* @return String the URL
*/
*
* See getLocalURL for the arguments.
*
+ * @param $query
+ * @param $query2 bool
* @param $proto Protocol to use; setting this will cause a full URL to be used
* @see self::getLocalURL
* @return String the URL
* @return String
*/
protected function getRawIP() {
- if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
- return IP::canonicalize( $_SERVER['REMOTE_ADDR'] );
- } else {
+ if ( !isset( $_SERVER['REMOTE_ADDR'] ) ) {
return null;
}
+
+ if ( is_array( $_SERVER['REMOTE_ADDR'] ) || strpos( $_SERVER['REMOTE_ADDR'], ',' ) !== false ) {
+ throw new MWException( __METHOD__ . " : Could not determine the remote IP address due to multiple values." );
+ } else {
+ $ipchain = $_SERVER['REMOTE_ADDR'];
+ }
+
+ return IP::canonicalize( $ipchain );
}
/**
* @param $value String: value to give cookie
* @param $expire Int: number of seconds til cookie expires
* @param $prefix String: Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
- * @param @domain String: Cookie domain to use, if not $wgCookieDomain
+ * @param $domain String: Cookie domain to use, if not $wgCookieDomain
* @param $forceSecure Bool:
* true: force the cookie to be set with the secure attribute
* false: force the cookie to be set without the secure attribute
* @param $expire Int: number of seconds til cookie expires (Default: 0)
* @param $prefix TODO DOCUMENT (Default: null)
* @param $domain TODO DOCUMENT (Default: null)
- *
+ * @param $forceSecure TODO DOCUMENT (Default: null)
*/
public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
$this->cookies[$name] = $value;
/**
* @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
- * @param $content Content: new content of the section
+ * @param $sectionContent Content: new content of the section
* @param $sectionTitle String: new section's subject, only if $section is 'new'
* @param $edittime String: revision timestamp or null to use the current revision
*
* @param $reason string delete reason for deletion log
* @param $suppress boolean suppress all revisions and log the deletion in
* the suppression log instead of the deletion log
+ * @param $id int article ID
* @param $commit boolean defaults to true, triggers transaction end
* @param &$error Array of errors to append to
* @param $user User The deleting user
}
/**
- * Returns the name that goes in the <h1> page title.
+ * Returns the name that goes in the "<h1>" page title.
*
* @return string
*/
}
/**
- * Returns the description that goes below the <h1> tag.
+ * Returns the description that goes below the "<h1>" tag.
*
* @return string
*/
if ( !$titleObj ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
+ if ( !$titleObj->canExist() ) {
+ $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+ }
$pageObj = WikiPage::factory( $titleObj );
if ( $load !== false ) {
$pageObj->loadPageData( $load );
*
* Created on Oct 22, 2006
*
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
if ( !$titleObj ) {
$this->dieUsageMsg( array( 'invalidtitle', $title ) );
}
+ if ( !$titleObj->canExist() ) {
+ $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+ }
$wgTitle = $titleObj;
$pageObj = WikiPage::factory( $titleObj );
private function getParsedContent( WikiPage $page, $popts, $pageId = null, $getWikitext = false ) {
$this->content = $page->getContent( Revision::RAW ); //XXX: really raw?
- if ( $this->section !== false ) {
+ if ( $this->section !== false && $this->content !== null ) {
$this->content = $this->getSectionContent(
$this->content,
!is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getText() );
array( 'invalidtitle', 'title' ),
array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ),
array( 'code' => 'notwikitext', 'info' => 'The requested operation is only supported on wikitext content.' ),
+ array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
) );
}
* @file
* @ingroup API
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
abstract class ApiQueryORM extends ApiQueryBase {
}
/**
- * Get the request parameters, handle the * value for the props param
- * and remove all params set to null (ie those that are not actually provided).
+ * Get the request parameters and remove all params set
+ * to null (ie those that are not actually provided).
*
* @since 1.21
*
/**
* Get the user-defined value
- * @return bool|\Mixed
+ * @return bool|Mixed
*/
function getValue() {
return $this->value;
}
}
}
-
-
-/**
- * Job wrapper for HTMLCacheUpdate. Gets run whenever a related
- * job gets called from the queue.
- *
- * @ingroup JobQueue
- */
-class HTMLCacheUpdateJob extends Job {
- var $table, $start, $end;
-
- /**
- * Construct a job
- * @param $title Title: the title linked to
- * @param $params Array: job parameters (table, start and end page_ids)
- * @param $id Integer: job id
- */
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
- $this->table = $params['table'];
- $this->start = $params['start'];
- $this->end = $params['end'];
- }
-
- public function run() {
- $update = new HTMLCacheUpdate( $this->title, $this->table, $this->start, $this->end );
- $update->doUpdate();
- return true;
- }
-}
*
* @since 1.21
*
- * @param $page \WikiPage the deleted page
- * @param $parserOutput null|\ParserOutput optional parser output object
+ * @param $page WikiPage the deleted page
+ * @param $parserOutput null|ParserOutput optional parser output object
* for efficient access to meta-information about the content object.
* Provide if you have one handy.
*
* @return string The wikitext to include when another page includes this
* content, or false if the content is not includable in a wikitext page.
*
- * @TODO: allow native handling, bypassing wikitext representation, like
+ * @todo allow native handling, bypassing wikitext representation, like
* for includable special pages.
- * @TODO: allow transclusion into other content models than Wikitext!
- * @TODO: used in WikiPage and MessageCache to get message text. Not so
+ * @todo allow transclusion into other content models than Wikitext!
+ * @todo used in WikiPage and MessageCache to get message text. Not so
* nice. What should we use instead?!
*/
public function getWikitextForTransclusion();
* string, a nested array structure, an object, a binary blob...
* anything, really.
*
- * @NOTE: Caller must be aware of content model!
+ * @note Caller must be aware of content model!
*/
public function getNativeData();
*
* @since 1.21
*
- * @param $page \WikiPage the deleted page
- * @param $parserOutput null|\ParserOutput optional parser output object
+ * @param $page WikiPage the deleted page
+ * @param $parserOutput null|ParserOutput optional parser output object
* for efficient access to meta-information about the content object.
* Provide if you have one handy.
*
*
* @since 1.21
*
- * @static
* @param $content Content|null
* @return null|string the textual form of $content, if available
* @throws MWException if $content is not an instance of TextContent and
*
* @since 1.21
*
- * @static
- *
* @param $text string the textual representation, will be
* unserialized to create the Content object
* @param $title null|Title the title of the page this text belongs to.
*
* @since 1.21
*
- * @static
* @param $title Title
* @return null|string default model name for the page given by $title
*/
*
* @since 1.21
*
- * @static
* @param $title Title
* @return ContentHandler
*/
*
* @since 1.21
*
- * @static
* @param $content Content
* @return ContentHandler
*/
*
* @since 1.21
*
- * @static
* @param $modelId String The ID of the content model for which to get a
* handler. Use CONTENT_MODEL_XXX constants.
* @return ContentHandler The ContentHandler singleton for handling the
* Model names are localized using system messages. Message keys
* have the form content-model-$name, where $name is getContentModelName( $id ).
*
- * @static
* @param $name String The content model ID, as given by a CONTENT_MODEL_XXX
* constant or returned by Revision::getContentModel().
*
*
* @since 1.21
*
- * @abstract
* @param $content Content The Content object to serialize
* @param $format null|String The desired serialization format
* @return string Serialized form of the content
*
* @since 1.21
*
- * @abstract
* @param $blob string serialized form of the content
* @param $format null|String the format used for serialization
* @return Content the Content object created by deserializing $blob
public function __construct( $text, $model_id = CONTENT_MODEL_TEXT ) {
parent::__construct( $model_id );
+ if ( $text === null || $text === false ) {
+ $text = '';
+ }
+
if ( !is_string( $text ) ) {
throw new MWException( "TextContent expects a string in the constructor." );
}
/**
* Returns the text represented by this Content object, as a string.
*
- * @param the raw text
+ * @return string: the raw text
*/
public function getNativeData( ) {
$text = $this->mText;
/**
* Returns the text represented by this Content object, as a string.
*
- * @param the raw text
+ * @return string: the raw text
*/
public function getTextForSearchIndex( ) {
return $this->getNativeData();
/**
* Returns the text represented by this Content object, as a string.
*
- * @param the raw text
+ * @return string: the raw text
*/
public function getWikitextForTransclusion( ) {
return $this->getNativeData();
}
/**
- * Diff this content object with another content object..
+ * Diff this content object with another content object.
*
* @since 1.21diff
*
- * @param $that Content the other content object to compare this content object to
- * @param $lang Language the language object to use for text segmentation.
+ * @param $that Content: The other content object to compare this content
+ * object to.
+ * @param $lang Language: The language object to use for text segmentation.
* If not given, $wgContentLang is used.
*
- * @return DiffResult a diff representing the changes that would have to be
+ * @return DiffResult: A diff representing the changes that would have to be
* made to this content object to make it equal to $that.
*/
public function diff( Content $that, Language $lang = null ) {
*
* This text-based implementation uses wfMerge().
*
- * @param $oldContent \Content|string String
- * @param $myContent \Content|string String
- * @param $yourContent \Content|string String
+ * @param $oldContent Content|string String
+ * @param $myContent Content|string String
+ * @param $yourContent Content|string String
*
* @return Content|Bool
*/
public function makeEmptyContent() {
return new TextContent( '' );
}
-}
\ No newline at end of file
+}
*
* @param $hasLinks Bool if it is known whether this content contains
* links, provide this information here, to avoid redundant parsing to
- * find out.
- * @param $title null|\Title
+ * find out (default: null).
+ * @param $title Title: (default: null)
*
* @internal param \IContextSource $context context for parsing if necessary
*
*
* @since 1.21
*
- * @param $content Content the content to render
- * @param $title \Title
- * @param $revId null
- * @param $options null|ParserOptions
- * @param $generateHtml bool
+ * @param $title Title
+ * @param $revId int Revision to pass to the parser (default: null)
+ * @param $options ParserOptions (default: null)
+ * @param $generateHtml bool (default: false)
*
* @internal param \IContextSource|null $context
* @return ParserOutput representing the HTML form of the text
$list .= "$value";
} elseif ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_array( $value ) ) {
if ( count( $value ) == 0 ) {
- throw new MWException( __METHOD__ . ': empty input' );
+ throw new MWException( __METHOD__ . ": empty input for field $field" );
} elseif ( count( $value ) == 1 ) {
// Special-case single values, as IN isn't terribly efficient
// Don't necessarily assume the single key is 0; we don't
* @param array|string $conds
* @param string $fname
* @throws DBUnexpectedError
- * @return bool|\ResultWrapper
+ * @return bool|ResultWrapper
*/
public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
if ( !$conds ) {
* @param array $insertOptions
* @param array $selectOptions
* @throws DBQueryError
- * @return null|\ResultWrapper
+ * @return null|ResultWrapper
*/
function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseMssql::insertSelect',
$insertOptions = array(), $selectOptions = array() ) {
* @file
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
* @file
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
* @file
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
interface ORMIterator extends Iterator {
* @file ORMResult.php
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
* @file ORMRow.php
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
*
* @since 1.20
*
- * @param string $name
- * @param mixed $default
+ * @param $name string: Field name
+ * @param $default mixed: Default value to return when none is found
+ * (default: null)
*
* @throws MWException
* @return mixed
*
* @since 1.20
*
- * @param string$name
+ * @param $name string
*
* @return mixed
*/
* @file ORMTable.php
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
* @since 1.19
* @param $msg string
* @param $callerOffset int
+ * @param $level int A PHP error level. See sendWarning()
* @return mixed
*/
public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
--- /dev/null
+/*!
+\ingroup FileBackend
+\page file_backend_design File backend design
+
+Some notes on the FileBackend architecture.
+
+\section intro Introduction
+
+To abstract away the differences among different types of storage media,
+MediaWiki is providing an interface known as FileBackend. Any MediaWiki
+interaction with stored files should thus use a FileBackend object.
+
+Different types of backing storage media are supported (ranging from local
+filesystem to distributed object stores). The types include:
+
+* FSFileBackend (used for mounted filesystems)
+* SwiftFileBackend (used for Swift or Ceph Rados+RGW object stores)
+* FileBackendMultiWrite (useful for transitioning from one backend to another)
+
+Configuration documentation for each type of backend is to be found in their
+__construct() inline documentation.
+
+
+\section setup Setup
+
+File backends are registered in LocalSettings.php via the global variable
+$wgFileBackends. To access one of those defined backend, one would use
+FileBackendStore::get( <name> ) which will bring back a FileBackend object
+handle. Such handles are reused for any subsequent get() call (singleton
+paradigm). The FileBackends objects are caching request calls such as file stats,
+SHA1 requests or TCP connection handles.
+
+\par Note:
+Some backends may require additional PHP extensions to be enabled or can rely on a
+MediaWiki extension. This is often the case when a FileBackend subclass makes use of an
+upstream client API for communicating with the backing store.
+
+
+\section fileoperations File operations
+
+The MediaWiki FileBackend API supports various operations on either files or
+directories. See FileBackend.php for full documentation for each function.
+
+
+\subsection reading Reading
+
+The following operations are supported for reading from a backend:
+
+On files:
+* state a file for basic information (timestamp, size)
+* read a file into a string or several files into a map of path names to strings
+* download a file or set of files to a temporary file (on a mounted file system)
+* get the SHA1 hash of a file
+* get various properties of a file (stat information, content time, mime information, ...)
+
+On directories:
+* get a list of files directly under a directory
+* get a recursive list of files under a directory
+* get a list of directories directly under a directory
+* get a recursive list of directories under a directory
+
+\par Note:
+Backend handles should return directory listings as iterators, all though in some cases
+they may just be simple arrays (which can still be iterated over). Iterators allow for callers to
+traverse a large number of file listings without consuming excessive RAM in the process. Either the
+memory consumed is flatly bounded (if the iterator does paging) or it is proportional to the depth
+of the portion of the directory tree being traversed (if the iterator works via recursion).
+
+
+\subsection writing Writing
+
+The following operations are supported for writing or changing in the backend:
+
+On files:
+* store (copying a mounted filesystem file into storage)
+* create (creating a file within storage from a string)
+* copy (within storage)
+* move (within storage)
+* delete (within storage)
+* lock/unlock (lock or unlock a file in storage)
+
+The following operations are supported for writing directories in the backend:
+* prepare (create parent container and directories for a path)
+* secure (try to lock-down access to a container)
+* publish (try to reverse the effects of secure)
+* clean (remove empty containers or directories)
+
+
+\subsection invokingoperation Invoking an operation
+
+Generally, callers should use doOperations() or doQuickOperations() when doing
+batches of changes, rather than making a suite of single operation calls. This
+makes the system tolerate high latency much better by pipelining operations
+when possible.
+
+doOperations() should be used for working on important original data, i.e. when
+consistency is important. The former will only pipeline operations that do not
+depend on each other. It is best if the operations that do not depend on each
+other occur in consecutive groups. This function can also log file changes to
+a journal (see FileJournal), which can be used to sync two backend instances.
+One might use this function for user uploads of file for example.
+
+doQuickOperations() is more geared toward ephemeral items that can be easily
+regenerated from original data. It will always pipeline without checking for
+dependencies within the operation batch. One might use this function for
+creating and purging generated thumbnails of original files for example.
+
+
+\section consistency Consistency
+
+Not all backing stores are sequentially consistent by default. Various FileBackend functions
+offer a "latest" option that can be passed in to assure (or try to assure) that the latest
+version of the file is read. Some backing stores are consistent by default, but callers should
+always assume that without this option, stale data may be read. This is actually true for stores
+that have eventual consistency.
+
+Note that file listing functions have no "latest" flag, and thus some systems may return stale
+data. Thus callers should avoid assuming that listings contain changes made my the current client
+or any other client from a very short time ago. For example, creating a file under a directory
+and then immediately doing a file listing operation on that directory may result in a listing
+that does not include that file.
+
+
+\section locking Locking
+
+Locking is effective if and only if a proper lock manager is registered and is
+actually being used by the backend. Lock managers can be registered in LocalSettings.php
+using the $wgLockManagers global configuration variable.
+
+For object stores, locking is not generally useful for avoiding partially
+written or read objects, since most stores use Multi Version Concurrency
+Control (MVCC) to avoid this. However, locking can be important when:
+* One or more operations must be done without objects changing in the meantime.
+* It can also be useful when a file read is used to determine a file write or DB change.
+ For example, doOperations() first checks that there will be no "file already exists"
+ or "file does not exist" type errors before attempted a given operation batch. This works
+ by stating the files first, and is only safe if the files are locked in the meantime.
+
+When locking, callers also should use the latest available file data for reads.
+Also, one should always lock the file *before* reading it, not after. If stale data is used
+to determine a write, there will be some data corruption, even when reads of the original file
+finally start returning the updated data without using the "latest" option (eventual consistency).
+
+Since acquiring locks can fail, and lock managers can be non-blocking, callers should:
+* Acquire all required locks up font
+* Be prepared for the case where locks fail to be acquired
+* Possible retry acquiring certain locks
+
+MVCC is also a useful pattern to use on top of the backend interface, because operations
+are not atomic, even with doOperations(), so doing complex batch file changes or changing files
+and updating a database row can result in partially written "transactions". One should avoid
+changing files once they have been stored, except perhaps with ephemeral data that are tolerant
+of some inconsistency.
+
+Callers can use their own locking (e.g. SELECT FOR UPDATE) if it is more convenient, but note
+that all callers that change any of the files should then go through functions that acquire these
+locks. For example, if a caller just directly uses the file backend store() function, it will
+ignore any custom "FOR UPDATE" locks, which can cause problems.
+
+\section objectstore Object stores
+
+Support for object stores (like Amazon S3/Swift) drive much of the API and design
+decisions of FileBackend, but using any POSIX compliant file systems works fine.
+The system essentially stores "files" in "containers". For a mounted file
+system as a backing store, these will just be "files" under "directories". For
+an object store as a backing store, the "files" will be "objects" stored in
+"containers".
+
+
+\section file_obj_diffs File and Object store differences
+
+An advantage of objects stores is the reduced Round-Trip Times. This is
+achieved by avoiding the need to create each parent directory before placing a
+file somewhere. It gets worse the deeper the directory hierarchy is. Both with
+object stores and file systems using "/" in filenames will allow for the
+intuitive use of directory functions. For example, creating a file in Swift
+called "container/a/b/file1" will mean that:
+- a "directory listing" of "container/a" will contain "b",
+- and a "file listing" of "b" will contain "file1"
+
+This means that switching from an object store to a file system and vise versa
+using the FileBackend interface will generally be harmless. You must aware of
+some reserves though:
+
+* In a filesystem, you cannot have a file and a directory within the same path
+ whereas it is possible in an object stores.
+* Some file systems have file name length restrictions or overall path length
+ restrictions that others do not. The same goes with object stores wich might
+ have maximum object length or a limitation regarding the number of files
+ under a container or volume.
+* Latency vary among systems, certain access patterns may not be tolerable for
+ certain backends but may hold up for others. Some backend subclasses use
+ MediaWiki's object caching for serving stat requests, which can greatly
+ reduce latency. Making sure that the backend has pipelining (see the
+ "parallelize" and "concurrency" settings) enabled can also combat latency in
+ batch operation scenarios.
+
+*/
return true; // nothing to do
}
wfProfileIn( __METHOD__ );
+ trigger_error( "$path was not stored with SHA-1 metadata.", E_USER_WARNING );
$status = Status::newGood();
$scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
if ( $status->isOK() ) {
* $readGrps is a list of the possible criteria for a request to have
* access to read a container. Each item is one of the following formats:
* - account:user : Grants access if the request is by the given user
- * - .r:<regex> : Grants access if the request is from a referrer host that
+ * - ".r:<regex>" : Grants access if the request is from a referrer host that
* matches the expression and the request is not for a listing.
* Setting this to '*' effectively makes a container public.
- * - .rlistings:<regex> : Grants access if the request is from a referrer host that
+ * -".rlistings:<regex>": Grants access if the request is from a referrer host that
* matches the expression and the request for a listing.
*
* $writeGrps is a list of the possible criteria for a request to have
/**
* The main sequence of page names. These will be displayed in turn.
- * To add one:
- * * Add it here
- * * Add a config-page-<name> message
- * * Add a WebInstaller_<name> class
+ *
+ * To add a new installer page:
+ * * Add it to this WebInstaller::$pageSequence property
+ * * Add a "config-page-<name>" message
+ * * Add a "WebInstaller_<name>" class
* @var array
*/
public $pageSequence = array(
+++ /dev/null
-<?php
-/**
- * Job to fix double redirects after moving a page.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job to fix double redirects after moving a page
- *
- * @ingroup JobQueue
- */
-class DoubleRedirectJob extends Job {
- var $reason, $redirTitle;
-
- /**
- * @var User
- */
- static $user;
-
- /**
- * Insert jobs into the job queue to fix redirects to the given title
- * @param $reason String: the reason for the fix, see message "double-redirect-fixed-<reason>"
- * @param $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
- * @param $destTitle bool Not used
- */
- public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
- # Need to use the master to get the redirect table updated in the same transaction
- $dbw = wfGetDB( DB_MASTER );
- $res = $dbw->select(
- array( 'redirect', 'page' ),
- array( 'page_namespace', 'page_title' ),
- array(
- 'page_id = rd_from',
- 'rd_namespace' => $redirTitle->getNamespace(),
- 'rd_title' => $redirTitle->getDBkey()
- ), __METHOD__ );
- if ( !$res->numRows() ) {
- return;
- }
- $jobs = array();
- foreach ( $res as $row ) {
- $title = Title::makeTitle( $row->page_namespace, $row->page_title );
- if ( !$title ) {
- continue;
- }
-
- $jobs[] = new self( $title, array(
- 'reason' => $reason,
- 'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
- # Avoid excessive memory usage
- if ( count( $jobs ) > 10000 ) {
- Job::batchInsert( $jobs );
- $jobs = array();
- }
- }
- Job::batchInsert( $jobs );
- }
-
- function __construct( $title, $params = false, $id = 0 ) {
- parent::__construct( 'fixDoubleRedirect', $title, $params, $id );
- $this->reason = $params['reason'];
- $this->redirTitle = Title::newFromText( $params['redirTitle'] );
- }
-
- /**
- * @return bool
- */
- function run() {
- if ( !$this->redirTitle ) {
- $this->setLastError( 'Invalid title' );
- return false;
- }
-
- $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
- if ( !$targetRev ) {
- wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
- return true;
- }
- $content = $targetRev->getContent();
- $currentDest = $content->getRedirectTarget();
- if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
- wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
- return true;
- }
-
- # Check for a suppression tag (used e.g. in periodically archived discussions)
- $mw = MagicWord::get( 'staticredirect' );
- if ( $content->matchMagicWord( $mw ) ) {
- wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
- return true;
- }
-
- # Find the current final destination
- $newTitle = self::getFinalDestination( $this->redirTitle );
- if ( !$newTitle ) {
- wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
- return true;
- }
- if ( $newTitle->equals( $this->redirTitle ) ) {
- # The redirect is already right, no need to change it
- # This can happen if the page was moved back (say after vandalism)
- wfDebug( __METHOD__.": skipping, already good\n" );
- }
-
- # Preserve fragment (bug 14904)
- $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
- $currentDest->getFragment(), $newTitle->getInterwiki() );
-
- # Fix the text
- $newContent = $content->updateRedirect( $newTitle );
-
- if ( $newContent->equals( $content ) ) {
- $this->setLastError( 'Content unchanged???' );
- return false;
- }
-
- # Save it
- global $wgUser;
- $oldUser = $wgUser;
- $wgUser = $this->getUser();
- $article = WikiPage::factory( $this->title );
- $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
- $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
- )->inContentLanguage()->text();
- $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
- $wgUser = $oldUser;
-
- return true;
- }
-
- /**
- * Get the final destination of a redirect
- *
- * @param $title Title
- *
- * @return bool if the specified title is not a redirect, or if it is a circular redirect
- */
- public static function getFinalDestination( $title ) {
- $dbw = wfGetDB( DB_MASTER );
-
- $seenTitles = array(); # Circular redirect check
- $dest = false;
-
- while ( true ) {
- $titleText = $title->getPrefixedDBkey();
- if ( isset( $seenTitles[$titleText] ) ) {
- wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
- return false;
- }
- $seenTitles[$titleText] = true;
-
- if ( $title->getInterwiki() ) {
- // If the target is interwiki, we have to break early (bug 40352).
- // Otherwise it will look up a row in the local page table
- // with the namespace/page of the interwiki target which can cause
- // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
- break;
- }
-
- $row = $dbw->selectRow(
- array( 'redirect', 'page' ),
- array( 'rd_namespace', 'rd_title', 'rd_interwiki' ),
- array(
- 'rd_from=page_id',
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey()
- ), __METHOD__ );
- if ( !$row ) {
- # No redirect from here, chain terminates
- break;
- } else {
- $dest = $title = Title::makeTitle( $row->rd_namespace, $row->rd_title, '', $row->rd_interwiki );
- }
- }
- return $dest;
- }
-
- /**
- * Get a user object for doing edits, from a request-lifetime cache
- * @return User
- */
- function getUser() {
- if ( !self::$user ) {
- self::$user = User::newFromName( wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text(), false );
- # FIXME: newFromName could return false on a badly configured wiki.
- if ( !self::$user->isLoggedIn() ) {
- self::$user->addToDatabase();
- }
- }
- return self::$user;
- }
-}
-
+++ /dev/null
-<?php
-/**
- * Old job for notification emails.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Old job used for sending single notification emails;
- * kept for backwards-compatibility
- *
- * @ingroup JobQueue
- */
-class EmaillingJob extends Job {
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'sendMail', Title::newMainPage(), $params, $id );
- }
-
- function run() {
- UserMailer::send(
- $this->params['to'],
- $this->params['from'],
- $this->params['subj'],
- $this->params['body'],
- $this->params['replyto']
- );
- return true;
- }
-
-}
+++ /dev/null
-<?php
-/**
- * Job for notification emails.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job for email notification mails
- *
- * @ingroup JobQueue
- */
-class EnotifNotifyJob extends Job {
-
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'enotifNotify', $title, $params, $id );
- }
-
- function run() {
- $enotif = new EmailNotification();
- // Get the user from ID (rename safe). Anons are 0, so defer to name.
- if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
- $editor = User::newFromId( $this->params['editorID'] );
- // B/C, only the name might be given.
- } else {
- # FIXME: newFromName could return false on a badly configured wiki.
- $editor = User::newFromName( $this->params['editor'], false );
- }
- $enotif->actuallyNotifyOnPageChange(
- $editor,
- $this->title,
- $this->params['timestamp'],
- $this->params['summary'],
- $this->params['minorEdit'],
- $this->params['oldid'],
- $this->params['watchers']
- );
- return true;
- }
-
-}
+++ /dev/null
-<?php
-/**
- * Job to update links for a given title.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Background job to update links for a given title.
- *
- * @ingroup JobQueue
- */
-class RefreshLinksJob extends Job {
- function __construct( $title, $params = '', $id = 0 ) {
- parent::__construct( 'refreshLinks', $title, $params, $id );
- $this->removeDuplicates = true; // job is expensive
- }
-
- /**
- * Run a refreshLinks job
- * @return boolean success
- */
- function run() {
- wfProfileIn( __METHOD__ );
-
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
-
- if ( is_null( $this->title ) ) {
- $this->error = "refreshLinks: Invalid title";
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- # Wait for the DB of the current/next slave DB handle to catch up to the master.
- # This way, we get the correct page_latest for templates or files that just changed
- # milliseconds ago, having triggered this job to begin with.
- if ( isset( $this->params['masterPos'] ) ) {
- wfGetLB()->waitFor( $this->params['masterPos'] );
- }
-
- $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
- if ( !$revision ) {
- $this->error = 'refreshLinks: Article not found "' .
- $this->title->getPrefixedDBkey() . '"';
- wfProfileOut( __METHOD__ );
- return false; // XXX: what if it was just deleted?
- }
-
- self::runForTitleInternal( $this->title, $revision, __METHOD__ );
-
- wfProfileOut( __METHOD__ );
- return true;
- }
-
- public static function runForTitleInternal( Title $title, Revision $revision, $fname ) {
- global $wgContLang;
-
- wfProfileIn( $fname . '-parse' );
- $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
- $content = $revision->getContent();
- $parserOutput = $content->getParserOutput( $title, $revision->getId(), $options, false );
- wfProfileOut( $fname . '-parse' );
-
- wfProfileIn( $fname . '-update' );
- $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
- DataUpdate::runUpdates( $updates );
- wfProfileOut( $fname . '-update' );
- }
-}
-
-/**
- * Background job to update links for a given title.
- * Newer version for high use templates.
- *
- * @ingroup JobQueue
- */
-class RefreshLinksJob2 extends Job {
- const MAX_TITLES_RUN = 10;
-
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'refreshLinks2', $title, $params, $id );
- }
-
- /**
- * Run a refreshLinks2 job
- * @return boolean success
- */
- function run() {
- wfProfileIn( __METHOD__ );
-
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
-
- if ( is_null( $this->title ) ) {
- $this->error = "refreshLinks2: Invalid title";
- wfProfileOut( __METHOD__ );
- return false;
- } elseif ( !isset( $this->params['start'] ) || !isset( $this->params['end'] ) ) {
- $this->error = "refreshLinks2: Invalid params";
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- // Back compat for pre-r94435 jobs
- $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
-
- // Avoid slave lag when fetching templates
- if ( isset( $this->params['masterPos'] ) ) {
- $masterPos = $this->params['masterPos'];
- } elseif ( wfGetLB()->getServerCount() > 1 ) {
- $masterPos = wfGetLB()->getMasterPos();
- } else {
- $masterPos = false;
- }
-
- $titles = $this->title->getBacklinkCache()->getLinks(
- $table, $this->params['start'], $this->params['end'] );
-
- if ( $titles->count() > self::MAX_TITLES_RUN ) {
- # We don't want to parse too many pages per job as it can starve other jobs.
- # If there are too many pages to parse, break this up into smaller jobs. By passing
- # in the master position here we can cut down on the time spent waiting for slaves to
- # catch up by the runners handling these jobs since time will have passed between now
- # and when they pop these jobs off the queue.
- $start = 0; // batch start
- $end = 0; // batch end
- $bsize = 0; // batch size
- $first = true; // first of batch
- $jobs = array();
- foreach ( $titles as $title ) {
- $start = $first ? $title->getArticleId() : $start;
- $end = $title->getArticleId();
- $first = false;
- if ( ++$bsize >= self::MAX_TITLES_RUN ) {
- $jobs[] = new RefreshLinksJob2( $this->title, array(
- 'table' => $table,
- 'start' => $start,
- 'end' => $end,
- 'masterPos' => $masterPos
- ) );
- $first = true;
- $start = $end = $bsize = 0;
- }
- }
- if ( $bsize > 0 ) { // group remaining pages into a job
- $jobs[] = new RefreshLinksJob2( $this->title, array(
- 'table' => $table,
- 'start' => $start,
- 'end' => $end,
- 'masterPos' => $masterPos
- ) );
- }
- Job::batchInsert( $jobs );
- } elseif ( php_sapi_name() != 'cli' ) {
- # Not suitable for page load triggered job running!
- # Gracefully switch to refreshLinks jobs if this happens.
- $jobs = array();
- foreach ( $titles as $title ) {
- $jobs[] = new RefreshLinksJob( $title, array( 'masterPos' => $masterPos ) );
- }
- Job::batchInsert( $jobs );
- } else {
- # Wait for the DB of the current/next slave DB handle to catch up to the master.
- # This way, we get the correct page_latest for templates or files that just changed
- # milliseconds ago, having triggered this job to begin with.
- if ( $masterPos ) {
- wfGetLB()->waitFor( $masterPos );
- }
- # Re-parse each page that transcludes this page and update their tracking links...
- foreach ( $titles as $title ) {
- $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
- if ( !$revision ) {
- $this->error = 'refreshLinks: Article not found "' .
- $title->getPrefixedDBkey() . '"';
- continue; // skip this page
- }
- RefreshLinksJob::runForTitleInternal( $title, $revision, __METHOD__ );
- wfWaitForSlaves();
- }
- }
-
- wfProfileOut( __METHOD__ );
- return true;
- }
-}
+++ /dev/null
-<?php
-/**
- * Job for asynchronous upload-by-url.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job for asynchronous upload-by-url.
- *
- * This job is in fact an interface to UploadFromUrl, which is designed such
- * that it does not require any globals. If it does, fix it elsewhere, do not
- * add globals in here.
- *
- * @ingroup JobQueue
- */
-class UploadFromUrlJob extends Job {
- const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
-
- /**
- * @var UploadFromUrl
- */
- public $upload;
-
- /**
- * @var User
- */
- protected $user;
-
- public function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'uploadFromUrl', $title, $params, $id );
- }
-
- public function run() {
- # Initialize this object and the upload object
- $this->upload = new UploadFromUrl();
- $this->upload->initialize(
- $this->title->getText(),
- $this->params['url'],
- false
- );
- $this->user = User::newFromName( $this->params['userName'] );
-
- # Fetch the file
- $status = $this->upload->fetchFile();
- if ( !$status->isOk() ) {
- $this->leaveMessage( $status );
- return true;
- }
-
- # Verify upload
- $result = $this->upload->verifyUpload();
- if ( $result['status'] != UploadBase::OK ) {
- $status = $this->upload->convertVerifyErrorToStatus( $result );
- $this->leaveMessage( $status );
- return true;
- }
-
- # Check warnings
- if ( !$this->params['ignoreWarnings'] ) {
- $warnings = $this->upload->checkWarnings();
- if ( $warnings ) {
-
- # Stash the upload
- $key = $this->upload->stashFile();
-
- if ( $this->params['leaveMessage'] ) {
- $this->user->leaveUserMessage(
- wfMessage( 'upload-warning-subj' )->text(),
- wfMessage( 'upload-warning-msg',
- $key,
- $this->params['url'] )->text()
- );
- } else {
- wfSetupSession( $this->params['sessionId'] );
- $this->storeResultInSession( 'Warning',
- 'warnings', $warnings );
- session_write_close();
- }
-
- return true;
- }
- }
-
- # Perform the upload
- $status = $this->upload->performUpload(
- $this->params['comment'],
- $this->params['pageText'],
- $this->params['watch'],
- $this->user
- );
- $this->leaveMessage( $status );
- return true;
-
- }
-
- /**
- * Leave a message on the user talk page or in the session according to
- * $params['leaveMessage'].
- *
- * @param $status Status
- */
- protected function leaveMessage( $status ) {
- if ( $this->params['leaveMessage'] ) {
- if ( $status->isGood() ) {
- $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
- wfMessage( 'upload-success-msg',
- $this->upload->getTitle()->getText(),
- $this->params['url']
- )->text() );
- } else {
- $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
- wfMessage( 'upload-failure-msg',
- $status->getWikiText(),
- $this->params['url']
- )->text() );
- }
- } else {
- wfSetupSession( $this->params['sessionId'] );
- if ( $status->isOk() ) {
- $this->storeResultInSession( 'Success',
- 'filename', $this->upload->getLocalFile()->getName() );
- } else {
- $this->storeResultInSession( 'Failure',
- 'errors', $status->getErrorsArray() );
- }
- session_write_close();
- }
- }
-
- /**
- * Store a result in the session data. Note that the caller is responsible
- * for appropriate session_start and session_write_close calls.
- *
- * @param $result String: the result (Success|Warning|Failure)
- * @param $dataKey String: the key of the extra data
- * @param $dataValue Mixed: the extra data itself
- */
- protected function storeResultInSession( $result, $dataKey, $dataValue ) {
- $session =& self::getSessionData( $this->params['sessionKey'] );
- $session['result'] = $result;
- $session[$dataKey] = $dataValue;
- }
-
- /**
- * Initialize the session data. Sets the intial result to queued.
- */
- public function initializeSessionData() {
- $session =& self::getSessionData( $this->params['sessionKey'] );
- $$session['result'] = 'Queued';
- }
-
- /**
- * @param $key
- * @return mixed
- */
- public static function &getSessionData( $key ) {
- if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
- $_SESSION[self::SESSION_KEYNAME][$key] = array();
- }
- return $_SESSION[self::SESSION_KEYNAME][$key];
- }
-}
--- /dev/null
+<?php
+/**
+ * Job to fix double redirects after moving a page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job to fix double redirects after moving a page
+ *
+ * @ingroup JobQueue
+ */
+class DoubleRedirectJob extends Job {
+ var $reason, $redirTitle;
+
+ /**
+ * @var User
+ */
+ static $user;
+
+ /**
+ * Insert jobs into the job queue to fix redirects to the given title
+ * @param $reason String: the reason for the fix, see message "double-redirect-fixed-<reason>"
+ * @param $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
+ * @param $destTitle bool Not used
+ */
+ public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
+ # Need to use the master to get the redirect table updated in the same transaction
+ $dbw = wfGetDB( DB_MASTER );
+ $res = $dbw->select(
+ array( 'redirect', 'page' ),
+ array( 'page_namespace', 'page_title' ),
+ array(
+ 'page_id = rd_from',
+ 'rd_namespace' => $redirTitle->getNamespace(),
+ 'rd_title' => $redirTitle->getDBkey()
+ ), __METHOD__ );
+ if ( !$res->numRows() ) {
+ return;
+ }
+ $jobs = array();
+ foreach ( $res as $row ) {
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ if ( !$title ) {
+ continue;
+ }
+
+ $jobs[] = new self( $title, array(
+ 'reason' => $reason,
+ 'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
+ # Avoid excessive memory usage
+ if ( count( $jobs ) > 10000 ) {
+ Job::batchInsert( $jobs );
+ $jobs = array();
+ }
+ }
+ Job::batchInsert( $jobs );
+ }
+
+ function __construct( $title, $params = false, $id = 0 ) {
+ parent::__construct( 'fixDoubleRedirect', $title, $params, $id );
+ $this->reason = $params['reason'];
+ $this->redirTitle = Title::newFromText( $params['redirTitle'] );
+ }
+
+ /**
+ * @return bool
+ */
+ function run() {
+ if ( !$this->redirTitle ) {
+ $this->setLastError( 'Invalid title' );
+ return false;
+ }
+
+ $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
+ if ( !$targetRev ) {
+ wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
+ return true;
+ }
+ $content = $targetRev->getContent();
+ $currentDest = $content->getRedirectTarget();
+ if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
+ wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
+ return true;
+ }
+
+ # Check for a suppression tag (used e.g. in periodically archived discussions)
+ $mw = MagicWord::get( 'staticredirect' );
+ if ( $content->matchMagicWord( $mw ) ) {
+ wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
+ return true;
+ }
+
+ # Find the current final destination
+ $newTitle = self::getFinalDestination( $this->redirTitle );
+ if ( !$newTitle ) {
+ wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
+ return true;
+ }
+ if ( $newTitle->equals( $this->redirTitle ) ) {
+ # The redirect is already right, no need to change it
+ # This can happen if the page was moved back (say after vandalism)
+ wfDebug( __METHOD__.": skipping, already good\n" );
+ }
+
+ # Preserve fragment (bug 14904)
+ $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
+ $currentDest->getFragment(), $newTitle->getInterwiki() );
+
+ # Fix the text
+ $newContent = $content->updateRedirect( $newTitle );
+
+ if ( $newContent->equals( $content ) ) {
+ $this->setLastError( 'Content unchanged???' );
+ return false;
+ }
+
+ # Save it
+ global $wgUser;
+ $oldUser = $wgUser;
+ $wgUser = $this->getUser();
+ $article = WikiPage::factory( $this->title );
+ $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
+ $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
+ )->inContentLanguage()->text();
+ $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
+ $wgUser = $oldUser;
+
+ return true;
+ }
+
+ /**
+ * Get the final destination of a redirect
+ *
+ * @param $title Title
+ *
+ * @return bool if the specified title is not a redirect, or if it is a circular redirect
+ */
+ public static function getFinalDestination( $title ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ $seenTitles = array(); # Circular redirect check
+ $dest = false;
+
+ while ( true ) {
+ $titleText = $title->getPrefixedDBkey();
+ if ( isset( $seenTitles[$titleText] ) ) {
+ wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
+ return false;
+ }
+ $seenTitles[$titleText] = true;
+
+ if ( $title->getInterwiki() ) {
+ // If the target is interwiki, we have to break early (bug 40352).
+ // Otherwise it will look up a row in the local page table
+ // with the namespace/page of the interwiki target which can cause
+ // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
+ break;
+ }
+
+ $row = $dbw->selectRow(
+ array( 'redirect', 'page' ),
+ array( 'rd_namespace', 'rd_title', 'rd_interwiki' ),
+ array(
+ 'rd_from=page_id',
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey()
+ ), __METHOD__ );
+ if ( !$row ) {
+ # No redirect from here, chain terminates
+ break;
+ } else {
+ $dest = $title = Title::makeTitle( $row->rd_namespace, $row->rd_title, '', $row->rd_interwiki );
+ }
+ }
+ return $dest;
+ }
+
+ /**
+ * Get a user object for doing edits, from a request-lifetime cache
+ * @return User
+ */
+ function getUser() {
+ if ( !self::$user ) {
+ self::$user = User::newFromName( wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text(), false );
+ # FIXME: newFromName could return false on a badly configured wiki.
+ if ( !self::$user->isLoggedIn() ) {
+ self::$user->addToDatabase();
+ }
+ }
+ return self::$user;
+ }
+}
+
--- /dev/null
+<?php
+/**
+ * Old job for notification emails.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Old job used for sending single notification emails;
+ * kept for backwards-compatibility
+ *
+ * @ingroup JobQueue
+ */
+class EmaillingJob extends Job {
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'sendMail', Title::newMainPage(), $params, $id );
+ }
+
+ function run() {
+ UserMailer::send(
+ $this->params['to'],
+ $this->params['from'],
+ $this->params['subj'],
+ $this->params['body'],
+ $this->params['replyto']
+ );
+ return true;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Job for notification emails.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job for email notification mails
+ *
+ * @ingroup JobQueue
+ */
+class EnotifNotifyJob extends Job {
+
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'enotifNotify', $title, $params, $id );
+ }
+
+ function run() {
+ $enotif = new EmailNotification();
+ // Get the user from ID (rename safe). Anons are 0, so defer to name.
+ if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
+ $editor = User::newFromId( $this->params['editorID'] );
+ // B/C, only the name might be given.
+ } else {
+ # FIXME: newFromName could return false on a badly configured wiki.
+ $editor = User::newFromName( $this->params['editor'], false );
+ }
+ $enotif->actuallyNotifyOnPageChange(
+ $editor,
+ $this->title,
+ $this->params['timestamp'],
+ $this->params['summary'],
+ $this->params['minorEdit'],
+ $this->params['oldid'],
+ $this->params['watchers']
+ );
+ return true;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * HTML cache invalidation of all pages linking to a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * Job wrapper for HTMLCacheUpdate. Gets run whenever a related
+ * job gets called from the queue.
+ *
+ * @ingroup JobQueue
+ */
+class HTMLCacheUpdateJob extends Job {
+ var $table, $start, $end;
+
+ /**
+ * Construct a job
+ * @param $title Title: the title linked to
+ * @param $params Array: job parameters (table, start and end page_ids)
+ * @param $id Integer: job id
+ */
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
+ $this->table = $params['table'];
+ $this->start = $params['start'];
+ $this->end = $params['end'];
+ }
+
+ public function run() {
+ $update = new HTMLCacheUpdate( $this->title, $this->table, $this->start, $this->end );
+ $update->doUpdate();
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job to update links for a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Background job to update links for a given title.
+ *
+ * @ingroup JobQueue
+ */
+class RefreshLinksJob extends Job {
+ function __construct( $title, $params = '', $id = 0 ) {
+ parent::__construct( 'refreshLinks', $title, $params, $id );
+ $this->removeDuplicates = true; // job is expensive
+ }
+
+ /**
+ * Run a refreshLinks job
+ * @return boolean success
+ */
+ function run() {
+ wfProfileIn( __METHOD__ );
+
+ $linkCache = LinkCache::singleton();
+ $linkCache->clear();
+
+ if ( is_null( $this->title ) ) {
+ $this->error = "refreshLinks: Invalid title";
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ # Wait for the DB of the current/next slave DB handle to catch up to the master.
+ # This way, we get the correct page_latest for templates or files that just changed
+ # milliseconds ago, having triggered this job to begin with.
+ if ( isset( $this->params['masterPos'] ) ) {
+ wfGetLB()->waitFor( $this->params['masterPos'] );
+ }
+
+ $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
+ if ( !$revision ) {
+ $this->error = 'refreshLinks: Article not found "' .
+ $this->title->getPrefixedDBkey() . '"';
+ wfProfileOut( __METHOD__ );
+ return false; // XXX: what if it was just deleted?
+ }
+
+ self::runForTitleInternal( $this->title, $revision, __METHOD__ );
+
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ public static function runForTitleInternal( Title $title, Revision $revision, $fname ) {
+ global $wgContLang;
+
+ wfProfileIn( $fname . '-parse' );
+ $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+ $content = $revision->getContent();
+ $parserOutput = $content->getParserOutput( $title, $revision->getId(), $options, false );
+ wfProfileOut( $fname . '-parse' );
+
+ wfProfileIn( $fname . '-update' );
+ $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
+ DataUpdate::runUpdates( $updates );
+ wfProfileOut( $fname . '-update' );
+ }
+}
+
+/**
+ * Background job to update links for a given title.
+ * Newer version for high use templates.
+ *
+ * @ingroup JobQueue
+ */
+class RefreshLinksJob2 extends Job {
+ const MAX_TITLES_RUN = 10;
+
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'refreshLinks2', $title, $params, $id );
+ }
+
+ /**
+ * Run a refreshLinks2 job
+ * @return boolean success
+ */
+ function run() {
+ wfProfileIn( __METHOD__ );
+
+ $linkCache = LinkCache::singleton();
+ $linkCache->clear();
+
+ if ( is_null( $this->title ) ) {
+ $this->error = "refreshLinks2: Invalid title";
+ wfProfileOut( __METHOD__ );
+ return false;
+ } elseif ( !isset( $this->params['start'] ) || !isset( $this->params['end'] ) ) {
+ $this->error = "refreshLinks2: Invalid params";
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ // Back compat for pre-r94435 jobs
+ $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
+
+ // Avoid slave lag when fetching templates
+ if ( isset( $this->params['masterPos'] ) ) {
+ $masterPos = $this->params['masterPos'];
+ } elseif ( wfGetLB()->getServerCount() > 1 ) {
+ $masterPos = wfGetLB()->getMasterPos();
+ } else {
+ $masterPos = false;
+ }
+
+ $titles = $this->title->getBacklinkCache()->getLinks(
+ $table, $this->params['start'], $this->params['end'] );
+
+ if ( $titles->count() > self::MAX_TITLES_RUN ) {
+ # We don't want to parse too many pages per job as it can starve other jobs.
+ # If there are too many pages to parse, break this up into smaller jobs. By passing
+ # in the master position here we can cut down on the time spent waiting for slaves to
+ # catch up by the runners handling these jobs since time will have passed between now
+ # and when they pop these jobs off the queue.
+ $start = 0; // batch start
+ $end = 0; // batch end
+ $bsize = 0; // batch size
+ $first = true; // first of batch
+ $jobs = array();
+ foreach ( $titles as $title ) {
+ $start = $first ? $title->getArticleId() : $start;
+ $end = $title->getArticleId();
+ $first = false;
+ if ( ++$bsize >= self::MAX_TITLES_RUN ) {
+ $jobs[] = new RefreshLinksJob2( $this->title, array(
+ 'table' => $table,
+ 'start' => $start,
+ 'end' => $end,
+ 'masterPos' => $masterPos
+ ) );
+ $first = true;
+ $start = $end = $bsize = 0;
+ }
+ }
+ if ( $bsize > 0 ) { // group remaining pages into a job
+ $jobs[] = new RefreshLinksJob2( $this->title, array(
+ 'table' => $table,
+ 'start' => $start,
+ 'end' => $end,
+ 'masterPos' => $masterPos
+ ) );
+ }
+ Job::batchInsert( $jobs );
+ } elseif ( php_sapi_name() != 'cli' ) {
+ # Not suitable for page load triggered job running!
+ # Gracefully switch to refreshLinks jobs if this happens.
+ $jobs = array();
+ foreach ( $titles as $title ) {
+ $jobs[] = new RefreshLinksJob( $title, array( 'masterPos' => $masterPos ) );
+ }
+ Job::batchInsert( $jobs );
+ } else {
+ # Wait for the DB of the current/next slave DB handle to catch up to the master.
+ # This way, we get the correct page_latest for templates or files that just changed
+ # milliseconds ago, having triggered this job to begin with.
+ if ( $masterPos ) {
+ wfGetLB()->waitFor( $masterPos );
+ }
+ # Re-parse each page that transcludes this page and update their tracking links...
+ foreach ( $titles as $title ) {
+ $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
+ if ( !$revision ) {
+ $this->error = 'refreshLinks: Article not found "' .
+ $title->getPrefixedDBkey() . '"';
+ continue; // skip this page
+ }
+ RefreshLinksJob::runForTitleInternal( $title, $revision, __METHOD__ );
+ wfWaitForSlaves();
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This job is in fact an interface to UploadFromUrl, which is designed such
+ * that it does not require any globals. If it does, fix it elsewhere, do not
+ * add globals in here.
+ *
+ * @ingroup JobQueue
+ */
+class UploadFromUrlJob extends Job {
+ const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
+
+ /**
+ * @var UploadFromUrl
+ */
+ public $upload;
+
+ /**
+ * @var User
+ */
+ protected $user;
+
+ public function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'uploadFromUrl', $title, $params, $id );
+ }
+
+ public function run() {
+ # Initialize this object and the upload object
+ $this->upload = new UploadFromUrl();
+ $this->upload->initialize(
+ $this->title->getText(),
+ $this->params['url'],
+ false
+ );
+ $this->user = User::newFromName( $this->params['userName'] );
+
+ # Fetch the file
+ $status = $this->upload->fetchFile();
+ if ( !$status->isOk() ) {
+ $this->leaveMessage( $status );
+ return true;
+ }
+
+ # Verify upload
+ $result = $this->upload->verifyUpload();
+ if ( $result['status'] != UploadBase::OK ) {
+ $status = $this->upload->convertVerifyErrorToStatus( $result );
+ $this->leaveMessage( $status );
+ return true;
+ }
+
+ # Check warnings
+ if ( !$this->params['ignoreWarnings'] ) {
+ $warnings = $this->upload->checkWarnings();
+ if ( $warnings ) {
+
+ # Stash the upload
+ $key = $this->upload->stashFile();
+
+ if ( $this->params['leaveMessage'] ) {
+ $this->user->leaveUserMessage(
+ wfMessage( 'upload-warning-subj' )->text(),
+ wfMessage( 'upload-warning-msg',
+ $key,
+ $this->params['url'] )->text()
+ );
+ } else {
+ wfSetupSession( $this->params['sessionId'] );
+ $this->storeResultInSession( 'Warning',
+ 'warnings', $warnings );
+ session_write_close();
+ }
+
+ return true;
+ }
+ }
+
+ # Perform the upload
+ $status = $this->upload->performUpload(
+ $this->params['comment'],
+ $this->params['pageText'],
+ $this->params['watch'],
+ $this->user
+ );
+ $this->leaveMessage( $status );
+ return true;
+
+ }
+
+ /**
+ * Leave a message on the user talk page or in the session according to
+ * $params['leaveMessage'].
+ *
+ * @param $status Status
+ */
+ protected function leaveMessage( $status ) {
+ if ( $this->params['leaveMessage'] ) {
+ if ( $status->isGood() ) {
+ $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
+ wfMessage( 'upload-success-msg',
+ $this->upload->getTitle()->getText(),
+ $this->params['url']
+ )->text() );
+ } else {
+ $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
+ wfMessage( 'upload-failure-msg',
+ $status->getWikiText(),
+ $this->params['url']
+ )->text() );
+ }
+ } else {
+ wfSetupSession( $this->params['sessionId'] );
+ if ( $status->isOk() ) {
+ $this->storeResultInSession( 'Success',
+ 'filename', $this->upload->getLocalFile()->getName() );
+ } else {
+ $this->storeResultInSession( 'Failure',
+ 'errors', $status->getErrorsArray() );
+ }
+ session_write_close();
+ }
+ }
+
+ /**
+ * Store a result in the session data. Note that the caller is responsible
+ * for appropriate session_start and session_write_close calls.
+ *
+ * @param $result String: the result (Success|Warning|Failure)
+ * @param $dataKey String: the key of the extra data
+ * @param $dataValue Mixed: the extra data itself
+ */
+ protected function storeResultInSession( $result, $dataKey, $dataValue ) {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $session['result'] = $result;
+ $session[$dataKey] = $dataValue;
+ }
+
+ /**
+ * Initialize the session data. Sets the intial result to queued.
+ */
+ public function initializeSessionData() {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $$session['result'] = 'Queued';
+ }
+
+ /**
+ * @param $key
+ * @return mixed
+ */
+ public static function &getSessionData( $key ) {
+ if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
+ $_SESSION[self::SESSION_KEYNAME][$key] = array();
+ }
+ return $_SESSION[self::SESSION_KEYNAME][$key];
+ }
+}
*
* @file
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
abstract class GenericArrayObject extends ArrayObject {
/// Database result row.
protected $row;
+ protected $performer;
protected function __construct( $row ) {
$this->row = $row;
}
public function getPerformer() {
- $userId = (int) $this->row->log_user;
- if ( $userId !== 0 ) { // logged-in users
- if ( isset( $this->row->user_name ) ) {
- return User::newFromRow( $this->row );
- } else {
- return User::newFromId( $userId );
+ if( !$this->performer ) {
+ $userId = (int) $this->row->log_user;
+ if ( $userId !== 0 ) { // logged-in users
+ if ( isset( $this->row->user_name ) ) {
+ $this->performer = User::newFromRow( $this->row );
+ } else {
+ $this->performer = User::newFromId( $userId );
+ }
+ } else { // IP users
+ $userText = $this->row->log_user_text;
+ $this->performer = User::newFromName( $userText, false );
}
- } else { // IP users
- $userText = $this->row->log_user_text;
- return User::newFromName( $userText, false );
}
+ return $this->performer;
}
public function getTarget() {
}
public function getPerformer() {
- $userId = (int) $this->row->rc_user;
- if ( $userId !== 0 ) {
- return User::newFromId( $userId );
- } else {
- $userText = $this->row->rc_user_text;
- // Might be an IP, don't validate the username
- return User::newFromName( $userText, false );
+ if( !$this->performer ) {
+ $userId = (int) $this->row->rc_user;
+ if ( $userId !== 0 ) {
+ $this->performer = User::newFromId( $userId );
+ } else {
+ $userText = $this->row->rc_user_text;
+ // Might be an IP, don't validate the username
+ $this->performer = User::newFromName( $userText, false );
+ }
}
+ return $this->performer;
}
public function getTarget() {
if ( !is_resource( $f ) ) {
return;
}
- $n = stream_select( $r = array( $f ), $w = null, $e = null, 0, 0 );
+ $r = array( $f );
+ $w = null;
+ $e = null;
+ $n = stream_select( $r, $w, $e, 0, 0 );
while ( $n == 1 && !feof( $f ) ) {
fread( $f, 1024 );
- $n = stream_select( $r = array( $f ), $w = null, $e = null, 0, 0 );
+ $r = array( $f );
+ $w = null;
+ $e = null;
+ $n = stream_select( $r, $w, $e, 0, 0 );
}
}
* Combines an associative array mapping media type to CSS into a
* single stylesheet with "@media" blocks.
*
- * @param $styles Array: Array keyed by media type containing (arrays of) CSS strings.
+ * @param $stylePairs Array: Array keyed by media type containing (arrays of) CSS strings.
*
* @return Array
*/
if ( $context->getDebug() ) {
$files = array_merge( $files, $this->debugScripts );
}
- return $files;
+
+ return array_unique( $files );
}
/**
/**
* Really find the title match.
- * @return null|\Title
+ * @return null|Title
*/
private static function getNearMatchInternal( $searchterm ) {
global $wgContLang, $wgEnableSearchContributorsByIP;
* @param $id Integer
* @param $title String
* @param $text String
- * @return bool|\ResultWrapper
+ * @return bool|ResultWrapper
*/
function update( $id, $title, $text ) {
// We store the column data as UTF-8 byte order marked binary stream
*
* @param $id Integer
* @param $title String
- * @return bool|\ResultWrapper
+ * @return bool|ResultWrapper
*/
function updateTitle( $id, $title ) {
$table = $this->db->tableName( 'searchindex' );
* @file
* @ingroup Site
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author John Erling Blad < jeblad@gmail.com >
* @author Daniel Kinzler
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*
* @since 1.21
*
- * @param string|false
+ * @param $pagename string: Page name (default: false)
*
* @return string
*/
* @file
* @ingroup Site
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
interface Site {
* @file
* @ingroup Site
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
class SiteArray extends GenericArrayObject implements SiteList {
* @file
* @ingroup Site
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
* @file
* @ingroup Site
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
* @author Daniel Werner
*/
* @file
* @ingroup Site
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
class Sites {
* @file
* @ingroup Site
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
class SitesTable extends ORMTable {
/**
* Returns whether a given ISBN (10 or 13) is valid. True indicates validity.
- * @param isbn string ISBN passed for check
+ * @param $isbn string ISBN passed for check
* @return bool
*/
public static function isValidISBN( $isbn ) {
*
* @since 1.20
*
- * @param {function} $computeFunction
+ * @param function $computeFunction
* @param array|mixed $args
* @param string|null $key
*
*
* @since 1.20
*
- * @param {function} $computeFunction
+ * @param function $computeFunction
* @param array $args
* @param string|null $key
*/
$this->opts['topOnly'] = false;
}
- $form = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+ $form = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
# Add hidden params for tracking except for parameters in $skipParameters
$skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
if ( $tagFilter ) {
$filterSelection =
- Xml::tags( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
- Xml::tags( 'td', array( 'class' => 'mw-input' ), implode( ' ', $tagFilter ) );
+ Html::rawElement( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
+ Html::rawElement( 'td', array( 'class' => 'mw-input' ), implode( ' ', $tagFilter ) );
} else {
- $filterSelection = Xml::tags( 'td', array( 'colspan' => 2 ), '' );
+ $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
}
- $targetSelection = Xml::tags( 'td', array( 'colspan' => 2 ),
+ $targetSelection = Html::rawElement( 'td', array( 'colspan' => 2 ),
Xml::radioLabel(
$this->msg( 'sp-contributions-newbies' )->text(),
'contribs',
''
)
) .
- Xml::tags( 'td', null,
+ Html::rawElement( 'td', null,
Html::namespaceSelector( array(
'selected' => $this->opts['namespace'],
'all' => '',
$deletedOnlyCheck = '';
}
- $extraOptions = Xml::tags( 'td', array( 'colspan' => 2 ),
+ $extraOptions = Html::rawElement( 'td', array( 'colspan' => 2 ),
$deletedOnlyCheck .
Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
Xml::checkLabel(
array( 'class' => 'mw-input' )
)
)
- ) ;
+ );
$dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
Xml::dateMenu(
$form .=
Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
- Xml::openElement( 'table', array( 'class' => 'mw-contributions-table' ) ) .
- Xml::openElement( 'tr' ) .
- $targetSelection .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $namespaceSelection .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $filterSelection .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $extraOptions .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $dateSelectionAndSubmit .
- Xml::closeElement( 'tr' ) .
- Xml::closeElement( 'table' );
+ Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
+ Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
+ Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
+ );
$explain = $this->msg( 'sp-contributions-explain' );
if ( $explain->exists() ) {
/**
* @param $context IContextSource
- * @param $par null|array
+ * @param $par array (Default null)
+ * @param $including boolean Whether this page is being transcluded in
+ * another page
*/
function __construct( IContextSource $context = null, $par = null, $including = null ) {
if ( $context ) {
$query['rcid'] = $result->rc_id;
}
- $plink = Linker::linkKnown(
+ // Linker::linkKnown() uses 'known' and 'noclasses' options. This breaks the colouration for stubs.
+ $plink = Linker::link(
$title,
null,
array( 'class' => 'mw-newpages-pagename' ),
$query,
- array( 'known' ) // Set explicitly to avoid the default of 'known','noclasses'. This breaks the colouration for stubs
+ array( 'known' )
);
$histLink = Linker::linkKnown(
$title,
$opts = parent::getDefaultOptions();
$opts->add( 'target', '' );
$opts->add( 'showlinkedto', false );
- $opts->add( 'tagfilter', '' );
return $opts;
}
/**
* Getter for file metadata.
*
- * @param key String: key under which file information is stored
+ * @param $key String: key under which file information is stored
* @return Array
*/
public function getMetadata ( $key ) {
/**
* Getter for fileProps
*
- * @param key String: key under which file information is stored
+ * @param $key String: key under which file information is stored
* @return Array
*/
public function getFileProps ( $key ) {
'pageinfo-watchers' => 'عدد المراقبين',
'pageinfo-redirects-name' => 'التحويلات إلى هذه الصفحة',
'pageinfo-subpages-name' => 'الصفحات الفرعية لهذه الصفحة',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|إعادة توجيه|إعادة توجيهات}}; $3 {{PLURAL:$3|غير إعادة توجه|غير إعادة توجيهات}})',
+'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|لا تحويلات|تحويلة واحدة|تحويلتان|$2 تحويلات|$2 تحويلة}}؛ $3 {{PLURAL:$3|من غير التحويلات}})',
'pageinfo-firstuser' => 'منشئ الصفحة',
'pageinfo-firsttime' => 'تاريخ إنشاء الصفحة',
'pageinfo-lastuser' => 'آخر محرر',
'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يوماً|$1 يوم}})',
'pageinfo-recent-authors' => 'عدد المؤلفين المختلفين الأخيرين',
'pageinfo-magic-words' => '{{PLURAL:$1|لا كلمات سحرية|الكلمة|الكلمات}} السحرية ($1)',
-'pageinfo-hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|التصنيف المخفي|التصنيفان المخفيان|التصانيف المخفية ($1)}}',
-'pageinfo-templates' => '{{PLURAL:$1|لا قوالب مضمنة|القالب المضمنن|القالبان المضمنان|القوالب المضمنة ($1)}}',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|التصنيف المخفي|التصنيفان المخفيان|التصنيفات المخفية ($1)}}',
+'pageinfo-templates' => '{{PLURAL:$1|لا قوالب مضمنة|القالب المضمن|القالبان المضمنان|القوالب المضمنة ($1)}}',
'pageinfo-toolboxlink' => 'معلومات عن هذه الصفحة',
'pageinfo-redirectsto' => 'تحويلة إلى',
'pageinfo-redirectsto-info' => 'معلومات',
'category_header' => 'ܦܐܬܬ̈ܐ ܒܣܕܪܐ ܕ "$1"',
'subcategories' => 'ܣܕܪ̈ܐ ܦܪ̈ܥܝܐ',
'category-media-header' => 'ܡܝܕܝܐ ܒܣܕܪܐ ܕ "$1"',
-'category-empty' => "''ܗܢܐ ܣܕܪܐ ܗܫܐ ܠܝܬ ܒܗ ܦܐܬܬ̈ܐ ܐܘ ܡܝܕܝܐ.''",
+'category-empty' => "''ܗܢܐ ܣܕܪܐ ܗܫܐܝܬ ܠܝܬ ܒܗ ܦܐܬܬ̈ܐ ܐܘ ܡܝܕܝܐ.''",
'hidden-categories' => '{{PLURAL:$1|ܣܕܪܐ ܛܘܫܝܐ|ܣܕܪ̈ܐ ܛܘܫܝܐ}}',
'hidden-category-category' => 'ܣܕܪ̈ܐ ܛܘܫܝ̈ܐ',
'category-subcat-count' => '{{PLURAL:$2|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ ܗܢܐ ܣܕܪܐ ܦܪܥܝܐ ܕܐܬܐ ܒܠܚܘܕ.|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ {{PLURAL:$1|ܣܕܪܐ ܦܪܥܝܐ ܕܐܬܐ|$1 ܣܕܪ̈ܐ ܦܪ̈ܥܝܐ ܕܐܬܝܢ}}، ܡܢ ܣܘܝܟܐ ܕ $2.}}',
'category-subcat-count-limited' => 'ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ {{PLURAL:$1|ܣܕܪܐ ܦܪܥܝܐ ܗܢܐ|$1 ܣܕܪ̈ܐ ܦܪ̈ܥܝܐ ܗܠܝܢ}}.',
-'category-article-count' => '{{PLURAL:$2|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ ܦܐܬܐ ܗܕܐ ܒܠܚܘܕ.|ܐܝܬ {{PLURAL:$1|ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܣܕܪܐ ܗܢܐ، ܡܢ ܣܘܝܟܐ ܕ$2.}}',
+'category-article-count' => '{{PLURAL:$2|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ ܦܐܬܐ ܗܕܐ ܒܠܚܘܕ.|ܐܝܬ {{PLURAL:$1|ܦܐܬܐ ܕܐܬܝܐ|$1 ܦܐܬܬ̈ܐ ܕܐܬܝܢ}} ܒܣܕܪܐ ܗܢܐ, ܡܢ ܣܘܝܟܐ ܕ $2.}}',
'category-article-count-limited' => '{{PLURAL:$1|ܦܐܬܐ ܗܕܐ|$1 ܦܐܬܬ̈ܐ ܗܠܝܢ}} ܒܣܕܪܐ ܗܢܐ.',
-'category-file-count' => '{{PLURAL:$2|Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90 Ü\90Ü\9dܬ Ü\92Ü\97 Ü Ü¦Ü¦Ü\90 Ü\97Ü¢Ü\90 Ü\92Ü Ü\9aÜ\98Ü\95.|{{PLURAL:$1|Ü Ü¦Ü¦Ü\90 Ü\95Ü\90ܬÜ\90 Ü\90Ü\9dܬÜ\98Ü\97Ü\9d|$1 Ü Ü¦Ü¦Ì\88Ü\90 Ü\95Ü\90ܬÜ\9dÜ¢ Ü\90Ü\9dܬÜ\9dÜ\97Ü\98Ü¢}} Ü\92Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90Ø\8c Ü¡Ü¢ Ü£Ü\98Ü\9dÜ\9fÜ\90 Ü\95$2 Ü\9fÜ Ü¢Ü\90Ü\9dܬ.}}',
+'category-file-count' => '{{PLURAL:$2|Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90 Ü\90Ü\9dܬ Ü\92Ü\97 Ü Ü¦Ü¦Ü\90 Ü\95Ü\90ܬÜ\90 Ü\92Ü Ü\9aÜ\98Ü\95.|{{PLURAL:$1|Ü Ü¦Ü¦Ü\90 Ü\95Ü\90ܬÜ\90 Ü\90Ü\9dܬÜ\98Ü\97Ü\9d|$1 Ü Ü¦Ü¦Ì\88Ü\90 Ü\95Ü\90ܬÜ\9dÜ¢ Ü\90Ü\9dܬÜ\9dÜ\97Ü\98Ü¢}} Ü\92Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90Ø\8c Ü¡Ü¢ Ü£Ü\98Ü\9dÜ\9fÜ\90 Ü\95 $2.}}',
'category-file-count-limited' => 'ܐܝܬ {{PLURAL:$1|ܠܦܦܐ ܕܐܬܐ|$1 ܠܦܦ̈ܐ ܕܐܬܝܢ}} ܒܣܕܪܐ ܗܫܝܐ.',
'listingcontinuesabbrev' => '(ܫܘܠܡܐ)',
'searchprofile-images' => 'ܡܝܕ̈ܝܐ ܣܓܝܐ̈ܐ (Multimedia)',
'searchprofile-everything' => 'ܟܠ ܡܕܡ',
'searchprofile-advanced' => 'ܡܬܩܕܡܢܐ',
-'searchprofile-articles-tooltip' => 'ܒܨܝ ܒ $1',
+'searchprofile-articles-tooltip' => 'ܒܨܝ ܒܓܘ $1',
'searchprofile-project-tooltip' => 'ܒܨܝ ܒ $1',
'searchprofile-images-tooltip' => 'ܒܨܝ ܥܠ ܠܦܦ̈ܐ',
'search-result-size' => '$1 ({{PLURAL:$2|1 ܡܠܬܐ|$2 ܡܠ̈ܐ}})',
'search-redirect' => '(ܨܝܒ $1)',
'search-section' => '(ܡܢܬܐ $1)',
-'search-suggest' => 'Ü£Ü\9fÜ ܐܢܬ: $1',
+'search-suggest' => 'Ü\90ܪÜ\90 Ü£Ü\9fÜ Ü\97Ü\98Ü\90 ܐܢܬ: $1',
'search-interwiki-caption' => 'ܬܪ̈ܡܝܬܐ ܐܚܘܬ̈ܐ',
'search-interwiki-default' => 'ܦܠܛ̈ܐ ܕ $1:',
'search-interwiki-more' => '(ܝܬܝܪ)',
'filehist-dimensions' => 'ܩܝܡ̈ܐ',
'filehist-filesize' => 'ܥܓܪܐ ܕܠܦܦܐ',
'filehist-comment' => 'ܥܘܩܒܐ',
-'imagelinks' => 'Ü\9aÜ«ܚܬܐ ܕܠܦܦܐ',
+'imagelinks' => 'Ü¡Ü¦Ü ܚܬܐ ܕܠܦܦܐ',
'linkstoimage' => '{{PLURAL:$1|ܦܐܬܐ ܗܕܐ ܐܣܪ|$1 ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܪܝܢ}} ܥܡ ܗܢܐ ܠܦܦܐ:',
'nolinkstoimage' => 'ܠܝܬ ܦܐܬܐ ܕܐܣܪ ܠܗܢܐ ܠܦܦܐ.',
'uploadnewversion-linktext' => 'ܐܣܩ ܨܚܚܐ ܚܕܬܐ ܡܢ ܗܢܐ ܠܦܦܐ',
'watching' => 'ܪܗܝܐ...',
'unwatching' => 'ܠܐ ܪܗܝܐ...',
-'enotif_reset' => 'ܫܘܕܥ ܟܠ ܦܐܬܬ̈ܐ ܐܝܟ ܣܥܝܪ̈ܐ',
+'enotif_reset' => 'Ü«Ü\98Ü\95Ü¥ Ü\9fÜ Ü¦Ü\90ܬܬÌ\88Ü\90 Ü\90Ü\9dÜ\9f ܣܥÜ\9dܪÌ\88ܬÜ\90',
'enotif_newpagetext' => 'ܗܕܐ ܗܝ ܦܐܬܐ ܚܕܬܐ',
'enotif_impersonal_salutation' => 'ܡܦܠܚܢܐ {{SITENAME}}',
'changed' => 'ܐܫܬܚܠܦܬ',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'ܦܐܬܐ ܕܡܦܠܚܢܐ ܕܝܠܟ',
-'tooltip-pt-mytalk' => 'ܦÜ\90ܬÜ\90 Ü\95Ü¡Ü¡Ü Ü\98ܟ',
+'tooltip-pt-mytalk' => 'ܦÜ\90ܬÜ\90 Ü\95Ü¡Ü¡Ü Ü Ü\90 Ü\95Ü\9dÜ ܟ',
'tooltip-pt-preferences' => 'Your preferences',
-'tooltip-pt-watchlist' => 'Ü¡Ü\9fܬÜ\92Ü¢Ü\98ܬÜ\90 Ü\95ܦÜ\90ܬܬÌ\88Ü\90 Ü\95Ü\92ܪÜ\97Ü\9dܬ ܐܢܬ ܫܘܚܠܦ̈ܐ ܕܬܗܘܐ ܒܗܘܢ',
+'tooltip-pt-watchlist' => 'Ü¡Ü\9fܬÜ\92Ü¢Ü\98ܬÜ\90 Ü\95ܦÜ\90ܬܬÌ\88Ü\90 Ü\95ܬܪÜ\97Ü\9d ܐܢܬ ܫܘܚܠܦ̈ܐ ܕܬܗܘܐ ܒܗܘܢ',
'tooltip-pt-mycontris' => 'ܡܟܬܒܢܘܬܐ ܕܫܘܬܦܘܝܬ̈ܟ',
'tooltip-pt-login' => 'ܢܠܒܒ ܠܟ ܕܣܓܠ ܐܢܬ ܥܠܠܐ ܕܝܠܟ، ܐܠܐ ܗܢܐ ܠܐ ܐܝܬܝܗܝ ܐܠܨܝܐ',
'tooltip-pt-logout' => 'ܦܠܛܐ',
'tooltip-ca-talk' => 'ܡܡܠܠܐ ܥܠ ܚܒܝܫܬܐ ܕܦܐܬܐ',
-'tooltip-ca-addsection' => 'ܫܪÜ\9d ܦܣÜ\98Ü©ܐ ܚܕܬܐ',
-'tooltip-ca-viewsource' => 'Ü\97Ü¢Ü\90 ܦÜ\90ܬÜ\90 Ü¢Ü\9bܪܬÜ\90 Ü\9dÜ Ü\97.
-Ü\90Ü\9dܬ Ü\92Ü\9f ܬÜ\9aÜ\99Ü\9d ܡܒܘܥܐ ܕܝܠܗ',
+'tooltip-ca-addsection' => 'ܫܪÜ\9d ܡܢܬܐ ܚܕܬܐ',
+'tooltip-ca-viewsource' => 'Ü\97Ü¢Ü\90 ܦÜ\90ܬÜ\90 Ü¢Ü\9bܪܬÜ\90 Ü\90Ü\9dܬÜ\9dÜ\97Ü\9d.
+ܡܨÜ\90 Ü\90ܢܬ Ü\95ܬÜ\9aÜ\99Ü\90 ܡܒܘܥܐ ܕܝܠܗ',
'tooltip-ca-protect' => 'ܢܛܘܪ ܗܕܐ ܦܐܬܐ',
'tooltip-ca-delete' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
'tooltip-ca-move' => 'ܫܢܝ ܦܐܬܐ ܗܕܐ',
'tooltip-n-mainpage-description' => 'ܬܪܘܩܬܐ ܕܦܐܬܐ ܪܝܫܝܬܐ',
'tooltip-n-portal' => 'ܚܕܪ ܬܪܡܝܬܐ، ܡܢܐ ܡܫܟܚ ܐܢܬ ܠܥܒܕܐ، ܐܝܟܐ ܬܚܙܝ ܟܠ ܡܐ ܕܣܢܝܩ ܐܢܬ ܠܗ',
'tooltip-n-recentchanges' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܒܓܘ ܘܝܩܝ.',
-'tooltip-n-randompage' => 'ܦܬÜ\98Ü\9f Ü¡Ü\93Ü Ü¬Ü\90 ܚܘܝܚܬܐ',
+'tooltip-n-randompage' => 'Ü\90Ü\9bܥܢ Ü¡Ü\93Ü Ü¬Ü\90 Ü\9aÜ\95 ܚܘܝܚܬܐ',
'tooltip-n-help' => 'ܕܘܟܐ ܠܥܘܕܪܢܐ',
-'tooltip-feed-atom' => 'ܬܪܣÜ\9dܬÜ\90 Ü\95Atom Ü Ü\97Ü¢Ü\90 ܦÜ\90ܬܬܐ',
+'tooltip-feed-atom' => 'Ü\9bÜ¥Ü\9dÜ¡Ü\98ܬÜ\90 Ü\95Ü\90Ü\9bÜ\98Ü¡ Ü Ü¦Ü\90ܬܬÜ\90 Ü\97Ü\95ܐ',
'tooltip-t-contributions' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܬܦ̈ܐ ܕܗܢܐ ܡܦܠܚܢܐ',
'tooltip-t-emailuser' => 'ܫܕܪ ܐܓܪܬܐ ܠܗܢܐ ܡܦܠܚܢܐ',
'tooltip-t-upload' => 'ܐܣܩ ܠܦܦ̈ܐ',
'tooltip-t-specialpages' => 'ܡܟܬܒܢܘܬܐ ܒܟܠ ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ',
-'tooltip-ca-nstab-main' => 'Ü\9aÜ\98Ü\9d ܦÜ\90ܬܬÜ\90 Ü\95Ü\9aÜ\92Ì\88Ü\9dܫܬÜ\90',
+'tooltip-ca-nstab-main' => 'ܚܘܝ ܦܐܬܐ ܕܚܒ̈ܝܫܬܐ',
'tooltip-ca-nstab-user' => 'ܚܘܝ ܦܐܬܐ ܕܡܦܠܚܢܐ',
'tooltip-ca-nstab-image' => 'ܚܘܝ ܦܐܬܐ ܕܠܦܦܐ',
'tooltip-ca-nstab-category' => 'ܚܘܝ ܦܐܬܐ ܕܣܕܪܐ',
'shared-repo-from' => 'de $1',
'shared-repo' => 'un repositoriu compartíu',
'filepage.css' => "/* El CSS allugáu equí s'incluye na páxina de descripción del ficheru, que tamién s'incluye nes wikis clientes foriates */",
-'upload-disallowed-here' => 'Por desgracia nun pues sobrescribir esta imaxe.',
+'upload-disallowed-here' => 'Nun pues sobrescribir esti ficheru.',
# File reversion
'filerevert' => 'Revertir $1',
# Info page
'pageinfo-title' => 'Información sobro "$1"',
+'pageinfo-not-current' => 'Namái se pue amosar la información pa la revisión actual.',
'pageinfo-header-basic' => 'Información básica',
'pageinfo-header-edits' => "Historial d'ediciones",
'pageinfo-header-restrictions' => 'Proteición de páxina',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría anubrida|Categoríes anubríes}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Plantía incluída|Plantíes incluíes}} ($1)',
'pageinfo-toolboxlink' => 'Información de la páxina',
+'pageinfo-redirectsto' => 'Redirixe a',
+'pageinfo-redirectsto-info' => 'información',
+'pageinfo-contentpage' => 'Contada como páxina de conteníu',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => "Les proteiciones s'activen en serie dende equí",
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => "Les proteiciones s'activen en serie dende",
# Skin names
'skinname-standard' => 'Clásicu',
'thu' => 'Кс',
'fri' => 'Йм',
'sat' => 'Шб',
-'january' => 'ғинуар (һыуығай)',
-'february' => 'февраль (шаҡай)',
-'march' => 'март (буранай)',
-'april' => 'апрель (алағарай)',
+'january' => 'ғинуар',
+'february' => 'февраль',
+'march' => 'март',
+'april' => 'апрель',
'may_long' => 'май (һабанай)',
-'june' => 'июнь (һөтай)',
-'july' => 'июль (майай)',
-'august' => 'август (урағай)',
-'september' => 'сентябрь (һарысай)',
-'october' => 'октябрь (ҡарасай)',
-'november' => 'ноябрь (ҡырпағай)',
-'december' => 'декабрь (аҡъюлай)',
-'january-gen' => 'ғинуар (һыуығай)',
-'february-gen' => 'февраль (шаҡай)',
+'june' => 'июнь',
+'july' => 'июль',
+'august' => 'август',
+'september' => 'сентябрь',
+'october' => 'октябрь',
+'november' => 'ноябрь',
+'december' => 'декабрь',
+'january-gen' => 'ғинуар',
+'february-gen' => 'февраль',
'march-gen' => 'март',
'april-gen' => 'апрель',
'may-gen' => 'май',
'august-gen' => 'август',
'september-gen' => 'сентябрь',
'october-gen' => 'октябрь',
-'november-gen' => 'ноябрь (ҡырпағай)',
-'december-gen' => 'декабрь (аҡъюлай)',
+'november-gen' => 'ноябрь',
+'december-gen' => 'декабрь',
'jan' => 'ғин',
'feb' => 'фев',
'mar' => 'мар',
'vector-action-protect' => 'Protektaran',
'vector-action-undelete' => 'Bawion sa pagkapara',
'vector-action-unprotect' => 'Ribayan an proteksyon',
-'vector-simplesearch-preference' => 'Paganahon an pinapusog na suhestiyon sa paghahanap (Yanong panhanap sana)',
+'vector-simplesearch-preference' => 'Paganahon an pinagyanong panukod sa paghahanap (Pansolong kublit sana)',
'vector-view-create' => 'Magmukna',
'vector-view-edit' => 'Liwatón',
'vector-view-history' => 'Tanawon sa historiya',
'protectedpagetext' => 'An pahinang ini pigsará tangarig pogolon an paghirá.',
'viewsourcetext' => 'Pwede mong hilingón asin arógon an ginikanan kan pahinang ini:',
'viewyourtext' => "Saimong mahihiling asin makokopya an gikanan kan '''saimong mga pinagriliwat''' sa pahinang ini:",
-'protectedinterface' => 'An pahinang ini nagtatao nin interface para sa software, asin sarado tangarig mapondo an pag-abuso.',
-'editinginterface' => "'''Warning:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.
+'protectedinterface' => 'An pahinang ini nagtatao nin panlaog-olay para sa software, asin protektado tangaring malikayan an abuso.
+Sa pagdagdag or pagliwat nin mga dakit-taramon para sa bilog na wiki, gamita tabi an [//translatewiki.net/translatewiki.net], an MediaWiki sa proyektong lokalisasyon.',
+'editinginterface' => "'''Patanid:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.
An mga pagbabago kaining pahina makaka-apekto sa hitsura kan pantahaw-olay nin paragamit para sa iba man na paragamit.
Para sa mga pagdadakit-taramon, pakikonsidera man tabi an paggagamit kan [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], an MediaWiking lokalisasyon kan proyekto.",
'sqlhidden' => '(nakatagô an hapót nin SQL)',
Ika mapuwedeng [[Special:Search/{{PAGENAME}}|maghanap para sa titulo kan pahinang ini]] sa iba pang mga pahina,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa magkasurundong mga talaan],
o [{{fullurl:{{FULLPAGENAME}}|action=edit}} liwaton ining pahina]</span>.',
-'noarticletext-nopermission' => 'Mayo tabi sa presente nin teksto sa pahinang ini.
-Ika mapuwedeng [[Special:Search/{{PAGENAME}}|maghanap para sa titulo kan pahinang ini]] sa iba pang mga pahina,
+'noarticletext-nopermission' => 'Mayong sa presente nin teksto an pahinang ini.
+Ika mapuwedeng [[Special:Search/{{PAGENAME}}|hanapa para kaining titulo kan pahina]] sa iba pang mga pahina,
o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa magkasurundong mga talaan]</span>.',
'missing-revision' => 'An rebisyon #$1 kan pahina pinagngaranan na "{{PAGENAME}}" bakong eksistido.
'edit-already-exists' => 'Dai maggibo an bàgong pahina.
Igwa na kaini.',
'defaultmessagetext' => 'Tugmadong mensahe sa teksto',
+'content-failed-to-parse' => 'Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3',
+'invalid-content-data' => 'Imbalidong datos nin laman',
+'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wiki-teksto',
+'content-model-text' => 'yanong-teksto',
+'content-model-javascript' => 'Java-Kurit',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Patanid tabi:''' Ining pahina naglalaman nin grabe kadakulon na ekspensibong programang pambaranga sa punksyon nin mga pag-aapod.
'revdelete-concurrent-change' => 'Napasalang pagsasangli kan item petsado $2, $1: An status nagpapahiling na pinagribayan kan ibang tawo habang ikan nagprubar na sanglian ini.
Paki-tsek tabi sa mga talaan.',
'revdelete-only-restricted' => 'Napasalang pagtatago kan item petsado $2, $1: Ika dae tabi makakapaglubog kan mga item na mahiling kan mga administrador na mayo kang piniling saro sa iba pang bisibilidad na mga pagpipilian.',
-'revdelete-reason-dropdown' => '*Pirmihang mga rason sa pagpura
+'revdelete-reason-dropdown' => '*Komon na mga rason sa pagpura
**Paglapas kan Copyright
**Bakong angay na personal na impormasyon
+**Bakong angay na pangaran nin paragamit
**Potensiyal na libelosong impormasyon',
'revdelete-otherreason' => 'Iba pa/kadagdagang rason:',
'revdelete-reasonotherlist' => 'Ibang rason',
'timezoneregion-indian' => 'Indiyang Kadagatan',
'timezoneregion-pacific' => 'Pasipikong Kadagatan',
'allowemail' => "Togotan an mga ''e''-surat halî sa ibang mga parágamit",
-'prefs-searchoptions' => 'Pagpipilian sa Paghahanap',
+'prefs-searchoptions' => 'Hanapa',
'prefs-namespaces' => 'Pangarang mga espasyo',
'defaultns' => 'Kun laen maghanap sa laog kaining pangarang mga espasyo:',
'default' => 'pwestong normal',
'prefs-signature' => 'Pirma',
'prefs-dateformat' => 'Pampetsang pormat',
'prefs-timeoffset' => 'Pan-oras na tapal',
+'prefs-advancedediting' => 'Pinag-abanteng mga Pagpipilian',
'prefs-advancedrc' => 'Pangenot na mga pagpipilian',
'prefs-advancedrendering' => 'Abantidong mga pagpipilian',
'prefs-advancedsearchoptions' => 'Abantidong mga pagpipilian',
'backend-fail-internal' => 'Sarong bakong bistadong kasalaan an nangyari sa panampad na sarayan "$1".',
'backend-fail-contenttype' => 'Dae makapagdeterminar sa tipo kan laog kan sagunson na magsaray sa "$1".',
'backend-fail-batchsize' => 'An panampad na sarayan pinagtao nin sarong batch kan sagunson sa $1 {{PLURAL:$1|operasyon|mga operasyon}}; an limit $2 {{PLURAL:$2|operasyon|mga operasyon}}.',
-'backend-fail-usable' => 'Dae makakapagsurat nin sagunson $1 sa dahilan na kulang an permiso o nawawara an mga direktoryo/kaaganan.',
+'backend-fail-usable' => 'Dae makakapagbasa o makakapagsurat nin sagunson sa "$1" nin hulita ta kulang an mga permiso o nawawara an mga direktoryo/kaaganan.',
# File journal errors
'filejournal-fail-dbconnect' => 'Dae makakasugpon sa datos-sarayan kan dyornal para sa panampad na sarayan "$1".',
'uploadnewversion-linktext' => 'Magkarga nin bàgong bersyon kaining file',
'shared-repo-from' => 'gikan sa $1',
'shared-repo' => 'sarong pinagheras na repositoryo',
+'upload-disallowed-here' => 'Ika dae makakapagpatong sa pagsurat kaining sagunson.',
# File reversion
'filerevert' => 'Ibalik an $1',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|byte|mga byte}}',
'ncategories' => '$1 {{PLURAL:$1|kategorya|mga kategorya}}',
+'ninterwikis' => '$1 {{PLURAL:$1|an interwiki|mga interwiki}}',
'nlinks' => '$1 {{PLURAL:$1|takod|mga takod}}',
'nmembers' => '$1 {{PLURAL:$1|myembro|mga myembro}}',
'nrevisions' => '$1 {{PLURAL:$1|pagpakarhay|mga pagpakarhay}}',
'mostlinkedtemplates' => 'An mga pinakanatakodan na templato',
'mostcategories' => 'Mga artikulong may pinaka dakol na kategorya',
'mostimages' => 'An pinakapakisugpunan na mga sagunson',
+'mostinterwikis' => 'Mga pahina na igwang mas kadakol na interwiki',
'mostrevisions' => 'Mga artikulong may pinakadakol na pagpakarháy',
'prefixindex' => 'Gabos na mga pahina na igwa nin enotang panigmit',
'prefixindex-namespace' => 'Gabos na mga pahina na igwa nin enotang panigmit ($1 espasyong ngaran)',
asin may marhay na ''e''-surat sa saimong [[Special:Preferences|Mga kabôtan]]
para makapadara nin ''e''-surat sa ibang parágamit.",
'emailuser' => 'E-koreohan ining paragamit',
+'emailuser-title-target' => 'E-surat kaining {{GENDER:$1|paragamit}}',
+'emailuser-title-notarget' => 'E-surat na paragamit',
'emailpage' => 'E-suratan an parágamit',
'emailpagetext' => 'Ika makakagamit kan porma na yaon sa ibaba tanganing magpadara nin e-surat na mensahe sa paragamit na ini.
An e-surat na adres na saimong ilalaog sa [[Special:Preferences|saimong paragamit kagustuhan]] magluluwas bilang iyo an "Gikan ki" adres kan e-surat, kaya an sinuratan makakapagsimbag direkta mismo saimo.',
'undeletedrevisions' => '{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} ipinagbalik',
'undeletedrevisions-files' => '{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} asin {{PLURAL:$2|1 sagunson|$2 mga sagunson}} ipinagbalik',
'undeletedfiles' => '{{PLURAL:$1|1 sagunson|$1 mga sagunson}} ipinagbalik',
-'cannotundelete' => 'Naprakaso an pagbalik kan pigparâ; pwede ser an binawi an pagparâ kan páhina kan ibang parágamit.',
+'cannotundelete' => 'An dae pagpura nagpalya:
+$1',
'undeletedpage' => "'''binalik na an $1 '''
Ikonsultar an [[Special:Log/delete|historial nin pagparâ]] para mahiling an lista nin mga kaaaging pagparâ asin pagbalik.",
'blocklogpage' => 'Usip nin pagbagat',
'blocklog-showlog' => 'Ining paragamit dati nang pinagbarahan.
An talaan nin pagbara nakahaya sa ibaba bilang reperensiya:',
+'blocklog-showsuppresslog' => 'Ining paragamit pinagkubkob asin dati nang ipinagtago.
+An talaan nin pagpaunlok ipinagtao sa ibaba para hilingan.',
'blocklogentry' => 'binagat na [[$1]] na may oras nin pagpaso na $2 $3',
-'blocklogtext' => 'Ini an historial kan pagbagat asin pagbawi sa pagbagat nin mga paragamit. An mga enseguidang binagat na direccion nin
-IP dai nakalista digdi. Hilingon an [[Special:BlockList|IP lista nin mga binagat]] para sa lista nin mga nakaandar na mga pagpangalad buda mga pagbagat.',
+'reblock-logentry' => 'pinagliwat an mga panuytoy nin pagkubkob para sa [[$1]] na igwang oras nin pagpaso kan $2 $3',
+'blocklogtext' => 'Ini sarong talaan kan mga aksyon nin paragamit sa pagkukubkob asin dae pagkukubkob.
+Awtomatikong pagkubkob kan IP address dae pinaglilista.
+Hilngon an [[Special:Blocklist|block list]] para sa listahan kan presenteng operasyonal na pagpangalad asin pagkukubkob.',
'unblocklogentry' => 'binawi an pagbagat $1',
'block-log-flags-anononly' => 'Mga paragamit na anónimo sana',
'block-log-flags-nocreate' => "pigpopondohán an paggibo nin ''account'",
'block-log-flags-noautoblock' => 'pigpopondo an enseguidang pagbagat',
'block-log-flags-noemail' => 'binagát an e-surat',
+'block-log-flags-angry-autoblock' => 'pinakusog na awto-kubkob pinaandar',
+'block-log-flags-hiddenname' => 'pangaran nin paragamit itinago',
'range_block_disabled' => 'Pigpopondo an abilidad kan sysop na maggibo nin bagat na hilera.',
'ipb_expiry_invalid' => 'Dai pwede ini bilang oras kan pagpasó.',
-'ipb_already_blocked' => 'Dating binagat na si "$1"',
+'ipb_expiry_temp' => 'Itinagong pangaran nin paragamit na nagkukubkob dapat na magin permanente.',
+'ipb_hide_invalid' => 'Dae nakayanan na untukon ining panindog; ini gayod nagkaigwa nin kadakulon na mga pagliliwat.',
+'ipb_already_blocked' => 'An "$1" pinagkubkob na',
+'ipb-needreblock' => 'An $1 pinagkubkob na. Gusto mong liwaton an mga panuytoy?',
+'ipb-otherblocks-header' => 'Ibang {{PLURAL:$1|kubkob|mga kubkob',
+'unblock-hideuser' => 'Ika dae makakakubkog kaining paragamit, siring na an saindang paragamit na ngaran itinatago.',
'ipb_cant_unblock' => 'Error: Dai nahanap an ID nin binagat na $1. Puede ser na dati nang binawi an pagbagat kaini.',
'ip_range_invalid' => 'Dai pwede ining serye nin IP.',
'proxyblocker' => 'Parabagát na karibay',
'viewyourtext' => "Vostè pot veure i copiar la font de ' ' les modificacions ' ' d'aquesta pàgina:",
'protectedinterface' => "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.
Per agregar o canviar les traduccions per a tots els wikis, si us plau fes servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
-'editinginterface' => "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Pel que fa a les traduccions, plantegeu-vos utilitzar la [//translatewiki.net/wiki/Main_Page?setlang=ca translatewiki.net], el projecte de traducció de MediaWiki.",
+'editinginterface' => "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Per afegir o modificar traduccions a totes les wikis, plantegeu-vos utilitzar la [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
'sqlhidden' => '(consulta SQL oculta)',
'cascadeprotected' => "Aquesta pàgina està protegida i no es pot modificar perquè està inclosa en {{PLURAL:$1|la següent pàgina, que té|les següents pàgines, que tenen}} activada l'opció de «protecció en cascada»:
$2",
'userpage-userdoesnotexist-view' => 'El compte d\'usuari "$1" no està registrat.',
'blocked-notice-logextract' => "En aquests moments aquest compte d'usuari es troba blocat.
Per més detalls, la darrera entrada del registre es mostra a continuació:",
-'clearyourcache' => "'''Nota:''' després de guardar possiblement necessites refrescar el teu cache per poder veure els canvis.
-* '''Firefox / Safari:''' pressiona ''Shift'' mentre cliques el botó ''Actualitzar'', o pressiona ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' a Mac)
-* '''Google Chrome:''' pressiona ''Ctrl+Shift+R'' (''⌘+Shift+R'' a Mac)
-* '''Internet Explorer:''' pressiona la tecla ''Ctrl'' mentre cliques a ''Actualitzar'' o pressiona ''Ctrl+F5''
-* '''Opera:''' buida la memòria cau (cache) ''Eines → Preferències''",
+'clearyourcache' => "'''Nota:''' Després de desar, possiblement necessiteu refrescar la memòria cau del vostre navegador per a veure'n els canvis.
+* '''Firefox / Safari:''' Premeu ''Shift'' mentre cliqueu el botó ''Actualitzar'', o pressioneu ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' a Mac)
+* '''Google Chrome:''' Premeu ''Ctrl+Shift+R'' (''⌘+Shift+R'' a Mac)
+* '''Internet Explorer:''' Premeu la tecla ''Ctrl'' mentre cliqueu a ''Actualitzar'' o pressioneu ''Ctrl+F5''
+* '''Opera:''' Netegeu la memòria cau ''Eines → Preferències''",
'usercssyoucanpreview' => "'''Consell:''' Utilitzeu el botó \"{{int:showpreview}}\" per provar el vostre nou CSS abans de desar-lo.",
'userjsyoucanpreview' => "'''Consell:''' Utilitzeu el botó \"{{int:showpreview}}\" per provar el vostre nou JavaScript abans de desar-lo.",
'usercsspreview' => "'''Recordeu que esteu previsualitzant el vostre CSS d'usuari.'''
'edit-already-exists' => "No s'ha pogut crear una pàgina.
Ja existeix.",
'defaultmessagetext' => 'Missatge per defecte',
+'content-failed-to-parse' => "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
+'invalid-content-data' => 'Dades de contingut no vàlides',
+'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
+
+# Content models
+'content-model-text' => 'text net',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "Atenció: Aquesta pàgina conté massa crides a funcions parserfunction complexes.
'uploadnewversion-linktext' => "Carrega una nova versió d'aquest fitxer",
'shared-repo-from' => 'des de $1',
'shared-repo' => 'un repositori compartit',
+'upload-disallowed-here' => 'No pot sobreescriure aquest fitxer.',
# File reversion
'filerevert' => 'Reverteix $1',
'mostlinkedtemplates' => 'Plantilles més usades',
'mostcategories' => 'Pàgines amb més categories',
'mostimages' => 'Fitxers més enllaçats',
+'mostinterwikis' => 'Pàgines amb més interwikis',
'mostrevisions' => 'Pàgines més modificades',
'prefixindex' => 'Totes les pàgines per prefix',
'prefixindex-namespace' => 'Totes les pàgines amb prefix (espai de noms $1)',
# Info page
'pageinfo-title' => 'Informació de «$1»',
+'pageinfo-not-current' => 'Només es pot visualitzar la informació per a la revisió actual.',
'pageinfo-header-basic' => 'Informació bàsica',
'pageinfo-header-edits' => "Historial d'edicions",
'pageinfo-header-restrictions' => 'Protecció de pàgina',
+'pageinfo-header-properties' => 'Propietats de la pàgina',
+'pageinfo-display-title' => 'Títol mostrat',
+'pageinfo-default-sort' => "Clau d'ordenació predeterminada",
+'pageinfo-length' => 'Mida de la pàgina (en bytes)',
+'pageinfo-article-id' => 'ID de la pàgina',
+'pageinfo-robot-policy' => 'Estat del motor de cerca',
'pageinfo-views' => 'Número de visites',
'pageinfo-watchers' => "Número d'usuaris que vigilen la pàgina",
'pageinfo-firstuser' => 'Creador de la pàgina',
'pageinfo-lasttime' => "Data de l'última edició",
'pageinfo-edits' => "Número total d'edicions",
'pageinfo-authors' => "Número total d'autors diferents",
+'pageinfo-toolboxlink' => 'Informació de la pàgina',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading-yes' => 'Sí',
# Skin names
'skinname-standard' => 'Clàssic',
'vector-action-protect' => 'Diogelu',
'vector-action-undelete' => 'Adfer',
'vector-action-unprotect' => 'Newid y diogelwch',
-'vector-simplesearch-preference' => 'Galluogi awgrymiadau chwilio uwch (gwedd Vector yn unig)',
+'vector-simplesearch-preference' => 'Galluogi bar chwilio syml (gwedd Vector yn unig)',
'vector-view-create' => 'Dechrau',
'vector-view-edit' => 'Golygu',
'vector-view-history' => 'Gweld yr hanes',
'anontalkpagetext' => "----''Dyma dudalen sgwrs ar gyfer defnyddiwr anhysbys sydd heb greu cyfrif eto, neu nad yw'n ei ddefnyddio. Felly mae'n rhaid inni ddefnyddio'r cyfeiriad IP i'w (h)adnabod. Mae cyfeiriadau IP yn gallu cael eu rhannu rhwng nifer o ddefnyddwyr. Os ydych chi'n ddefnyddiwr anhysbys ac yn teimlo'ch bod wedi derbyn sylwadau amherthnasol, [[Special:UserLogin/signup|crëwch gyfrif]] neu [[Special:UserLogin|mewngofnodwch]] i osgoi cael eich drysu gyda defnyddwyr anhysbys eraill o hyn ymlaen.''",
'noarticletext' => "Mae'r dudalen hon yn wag ar hyn o bryd.
Gallwch [[Special:Search/{{PAGENAME}}|chwilio am y teitl hwn]] ar dudalennau eraill, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chwilio drwy'r logiau perthnasol], neu [{{fullurl:{{FULLPAGENAME}}|action=edit}} golygu'r dudalen]</span>.",
-'noarticletext-nopermission' => 'Mae\'r dudalen hon yn wag ar hyn o bryd.
-Gallwch [[Special:Search/{{PAGENAME}}|chwilio am y teitl hwn]] ar dudalennau eraill, neu gallwch <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chwilio drwy\'r logiau perthnasol]</span>.',
+'noarticletext-nopermission' => "Mae'r dudalen hon yn wag ar hyn o bryd.
+Gallwch [[Special:Search/{{PAGENAME}}|chwilio am y teitl hwn]] ar dudalennau eraill, neu gallwch <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chwilio drwy'r logiau perthnasol]</span>, ond nid yw'r gallu gennych i ddechrau'r dudalen o'r dechrau cyntaf.",
'missing-revision' => 'Nid yw\'r diwygiad #$1 o\'r dudalen "{{PAGENAME}}" ar gael.
Fel arfer, fe ddigwydd hyn wrth ddilyn hen gyswllt i dudalen sydd wedi ei dileu.
'article' => 'Wesiqe',
'newwindow' => '(zerreyê pençereyê newey de beno a)',
'cancel' => 'Bıtexelne',
-'moredotdotdot' => 'Vêşêri...',
+'moredotdotdot' => 'Vêşi...',
'mypage' => 'Pela mı',
'mytalk' => 'Werênayışê mı',
'anontalk' => 'Pela werênayışê nê IPy',
# Vector skin
'vector-action-addsection' => 'Mesel Vırazê',
'vector-action-delete' => 'Besterne',
-'vector-action-move' => 'Wegirê',
+'vector-action-move' => 'Bere',
'vector-action-protect' => 'Bıpawe',
'vector-action-undelete' => 'Esterıtışi peyser bıgê',
'vector-action-unprotect' => 'Starkerdışi bıvurne',
'history' => 'Verora perer',
'history_short' => 'Vurnayışê verêni',
'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
-'printableversion' => 'Bınusnayen versiyon',
-'permalink' => 'Gıreyo manayen',
+'printableversion' => 'Asayışê çapkerdışi',
+'permalink' => 'Gıreyo jûqere',
'print' => 'Çap ke',
'view' => 'Bıvin',
'edit' => 'Bıvurnên',
'personaltools' => 'Haletê şexsi',
'postcomment' => 'Qısımo newe',
'articlepage' => 'Pela zerreki bıvêne',
-'talk' => 'Behse',
+'talk' => 'Werênayış',
'views' => 'Asayışi',
'toolbox' => 'Haceti',
'userpage' => 'Pela karberi bıvêne',
# Edit pages
'summary' => 'Xulasa:',
-'subject' => 'Mersel/Sernuşte:',
+'subject' => 'Mewzu/sernuşte:',
'minoredit' => 'Eno vurnayışo de qıckeko',
'watchthis' => 'Ena pele seyr ke',
'savearticle' => 'Pele qeyd ke',
'youremail' => 'E-Mail (mecbur niyo) *:',
'username' => 'Namey karberi:',
'uid' => 'Namey karberi:',
-'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grub|grubi}}:',
+'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grube|gruban}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Wextê qeydbiyayışi',
'prefs-registration-date-time' => '$1',
'prefs-displayrc' => 'Tercihan bımocne',
'prefs-displaysearchoptions' => 'Weçinayışê mocnayışi',
'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
-'prefs-diffs' => 'Diffs',
+'prefs-diffs' => 'Ferqi',
# User preference: e-mail validation using jQuery
'email-address-validity-valid' => 'e-posta adresi raştayo',
'editinguser' => "'''[[User:$1|$1]]''' keno weziyetê $2'i bıvurno",
'userrights-editusergroup' => 'Grubanê karberi/karbere sero bıgureye (bıxebetiye)',
'saveusergroups' => 'Grubanê karberi qeyd bıke',
-'userrights-groupsmember' => 'Ezaê / Ezaya:',
+'userrights-groupsmember' => 'Ezayê:',
'userrights-groupsmember-auto' => 'Ezao daxıl/ezaa daxıle ê:',
'userrights-groups-help' => 'şıma şenê grubanê nê karberi/na karbere, oyo/aya ke tede, bıvurnê:
* qutiya ke nışankerdiya, mocnena ke karber/e na grube dero/dera.
'userrights-irreversible-marker' => '$1*',
# Groups
-'group' => 'Grup:',
+'group' => 'Grube:',
'group-user' => 'Karberi',
'group-autoconfirmed' => 'Karberê ke xob xo biyê araşt',
'group-bot' => 'Boti',
'grouppage-bot' => '{{ns:project}}:Boti',
'grouppage-sysop' => '{{ns:project}}:İdarekeri',
'grouppage-bureaucrat' => '{{ns:project}}:Burokrati',
-'grouppage-suppress' => '{{ns:project}}:Kontrol',
+'grouppage-suppress' => '{{ns:project}}:Qontrol',
# Rights
'right-read' => 'Pelan bıwanê',
'right-deleterevision' => 'Vurnayışê xısusiyê ke ê pelanê, inan bestere ya zi peyser bia',
'right-deletedhistory' => 'Qeydanê tarixanê esterıteyan de qayt ke, bê nuştey inan',
'right-deletedtext' => 'Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke',
-'right-browsearchive' => 'Bıgeyre pelanê eserıtiyan',
+'right-browsearchive' => 'Pelanê esterıteyan bıgeyre',
'right-undelete' => 'Jû pela esterıtiye peyser bia',
'right-suppressrevision' => 'İdarekeran ra dızdeni/miyanki, newede vurnayışan de qayt ke u newede vıraze',
'right-suppressionlog' => 'Rocekanê xasan bıvêne',
'right-hideuser' => 'Yew namey karberi şari ra dızdeni/miyanki bloke bıke',
'right-ipblock-exempt' => 'Blokanê IPi, oto-blokan u blokanê menzıli ra ravêre',
'right-proxyunbannable' => 'Blokanê otomatikiê proksiyan ra ravêre',
-'right-unblockself' => 'Inan a bike',
+'right-unblockself' => 'İnan ake',
'right-protect' => 'Sewiyanê pawıtışi (mıhafezey) bıvurne u pelanê kılitbiyaiyan sero bıgureye.',
'right-editprotected' => 'Pelanê pawıtiyan sero bıgureye (bê pawıtena kaskadi (game be game))',
'right-editinterface' => 'Interfaceê karberi sero bıgureye',
'right-autopatrol' => 'Vurnayîşanê xo otomatik nîşan bike ke patrol biyê',
'right-patrolmarks' => 'Vurnayîşanê peniyî nîşan patrol biyê bivîne',
'right-unwatchedpages' => 'Yew listeyê pelanê seyrnibiye bivîne',
-'right-mergehistory' => 'Tarixê pelanê yew bike',
+'right-mergehistory' => 'Tarixê pelan yew ke',
'right-userrights' => 'Heqanê karberi pêro bıvurne',
'right-userrights-interwiki' => 'Heqqa karberanê ke ho wîkîyo binî de ey bivurne',
'right-siteadmin' => 'Database kilit bike u a bike',
'action-move-subpages' => 'ena pele, u pelanê daê bınênan bere',
'action-move-rootuserpages' => 'pelanê karberiyê bıngeyan bere',
'action-movefile' => 'ena dosya bere',
-'action-upload' => 'ena dosya bar bike',
+'action-upload' => 'ena dosya bar ke',
'action-reupload' => 'dosyayê ke database de esto ser ey binuse',
'action-reupload-shared' => 'dosyayê ki ho embarê medyayî de esto ser ay binusne',
'action-upload_by_url' => 'Ena dosya yew URL ra bar bike',
'rc-old-title' => '"$1"i orcinalê cı vıraşt',
# Recent changes linked
-'recentchangeslinked' => 'Elekeyın vurnayışi',
-'recentchangeslinked-feed' => 'Elekeyın vurnayışi',
-'recentchangeslinked-toolbox' => 'Elekeyın vurnayışi',
+'recentchangeslinked' => 'Vurnayışê eleqeyıni',
+'recentchangeslinked-feed' => 'Vurnayışê eleqeyıni',
+'recentchangeslinked-toolbox' => 'Vurnayışê eleqeyıni',
'recentchangeslinked-title' => 'vurnayışan ser "$1"',
'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdaoğan de lista de vurnayışê peyênana.
'filedesc' => 'Xulasa',
'fileuploadsummary' => 'Xulasa:',
'filereuploadsummary' => 'Vurnayîşê dosyayî:',
-'filestatus' => 'Weziyetê heqê telifiye:',
+'filestatus' => 'Weziyetê heqa telifi:',
'filesource' => 'Çıme:',
'uploadedfiles' => 'Dosyayê ke bar biye',
'ignorewarning' => 'Îkazi kebul meke u dosya reyna bar bike',
'upload-proto-error' => 'Porotokol raşt ni yo.',
'upload-proto-error-text' => 'Bar kerdişê durî gani URLî estbiye ke pe <code>http://</code> ya zi <code>ftp://</code> başli beno.',
-'upload-file-error' => 'Ğeletê dahilî',
+'upload-file-error' => 'Xeta daxılkiye',
'upload-file-error-text' => 'Peşkeşwan de wexta yew dosya vıraziyayene xeta bı.
kerem kerê [[Special:ListUsers/sysop|serkari]]de irtibat kewe.',
'upload-misc-error' => 'Ğeletê bar kerdişî nizanyeno',
'nlinks' => '$1 {{PLURAL:$1|link|linkî}}',
'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
'nrevisions' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
-'nviews' => '$1 {{PLURAL:$1|vînayîÅ\9f|vînayîÅ\9fî}}',
-'nimagelinks' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
-'ntransclusions' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
-'specialpage-empty' => 'Ser ena report netice çini yo.',
-'lonelypages' => 'Peleyê ke cı rê gıre nêdeyayo',
+'nviews' => '$1 {{PLURAL:$1|vênayıÅ\9f|vênayıÅ\9fi}}',
+'nimagelinks' => '$1 {{PLURAL:$1|pele de|pelan de}} gureyeno',
+'ntransclusions' => '$1 {{PLURAL:$1|pele de|pelan de}} gureyeno',
+'specialpage-empty' => 'Seba na rapore netice çıniyo.',
+'lonelypages' => 'Pelê seyi',
'lonelypagestext' => 'Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.',
'uncategorizedpages' => 'Pelayanê ke kategorî nibiye',
'uncategorizedcategories' => 'Kategoriyê ke bê kategorîyê',
'mostrevisions' => 'Pelan ke tewr zaf revizyonî biyê.',
'prefixindex' => 'Veroleya peley pêro',
'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
-'shortpages' => 'Peleyê kılmeki',
+'shortpages' => 'Pelê kılmeki',
'longpages' => 'Peleyê dergeki',
'deadendpages' => 'pelê ke pelê binan re gırey nêeşto',
'deadendpagestext' => 'Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.',
'usereditcount' => '$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}',
'usercreated' => '$2 de $1 {{GENDER:$3|viraziya}}',
'newpages' => 'Pelê newey',
-'newpages-username' => 'Namey Karberi:',
+'newpages-username' => 'Nameyê karberi:',
'ancientpages' => 'Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani',
-'move' => 'Wegirê',
+'move' => 'Bere',
'movethispage' => 'Ena pele bere',
'unusedimagestext' => 'Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.
Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.',
'allinnamespace' => 'Peli pênro ( $1 cayênameyî)',
'allnotinnamespace' => 'Pelanê hemî ($1 cayênameyî de niyo)',
'allpagesprev' => 'Verên',
-'allpagesnext' => 'ver şo',
+'allpagesnext' => 'Bahdo',
'allpagessubmit' => 'Şo',
'allpagesprefix' => 'herfê ke şıma tiya de nuşti, pê ney herfan pelê ke destpêkenê liste ker:',
'allpagesbadtitle' => 'pel o ke şıma kewenî cı, nameyê no peli de gıreyê zıwanan u wikiyi re elaqa esto, ê ra cıkewtış qebul niyo. ya zi sernameyan de karakterê qedexeyi tede esto.',
# Special:DeletedContributions
'deletedcontributions' => 'İştiraqê karberan de besternayına',
'deletedcontributions-title' => 'Îştirakê karberî wederna',
-'sp-deletedcontributions-contribs' => 'dekerdeni',
+'sp-deletedcontributions-contribs' => 'iştıraqi',
# Special:LinkSearch
'linksearch' => 'Gıreyê teberi cı geyrê',
'activeusers-from' => 'Enê karberi ra tepya bımocne:',
'activeusers-hidebots' => 'Botan bınımne',
'activeusers-hidesysops' => 'İdarekerdoğan bınımne',
-'activeusers-noresult' => 'Karberî çini yo.',
+'activeusers-noresult' => 'Karberi nêdiyayê.',
# Special:Log/newusers
-'newuserlogpage' => 'Cıkewtışê hesab-vıraştışi',
+'newuserlogpage' => 'Cıkewtışê hesabvıraştışi',
'newuserlogpagetext' => 'Ena log de viraştişê karberî esta.',
# Special:ListGroupRights
qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed]] belka esto.',
'listgrouprights-key' => '* <span class="listgrouprights-granted">Heqa daiye</span>
* <span class="listgrouprights-revoked">Heqa guretiye</span>',
-'listgrouprights-group' => 'Grup',
+'listgrouprights-group' => 'Grube',
'listgrouprights-rights' => 'Heqqî',
'listgrouprights-helppage' => 'Help:Heqqanê gruban',
'listgrouprights-members' => '(listey ezayan)',
'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>',
'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>',
-'listgrouprights-addgroup' => 'şıma eşkenî hesabê xo re {{PLURAL:$2|grub|gruban}} têare kerî: $1',
-'listgrouprights-removegroup' => 'şıma eşkenî hesabê xo ra {{PLURAL:$2|grub|gruban}} bıvecî: $1',
+'listgrouprights-addgroup' => '{{PLURAL:$2|Grube|Gruban}} cı kerê: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|Grube|Gruban}} bıvecê: $1',
'listgrouprights-addgroup-all' => 'şıma hesabê xo re heme gruban eşkeni têare bıkeri',
'listgrouprights-removegroup-all' => 'şıma hesabê xo ra heme gruban eşkeni veci',
'listgrouprights-addgroup-self' => 'şıma hesabê xo re eşkeni {{PLURAL:$2|grub|gruban}} têare bıkerî: $1',
'emailnotarget' => 'Qandê Gêreninamey karberiyo wuna çınyo yana xırabo.',
'emailtarget' => 'Namey Karberi defiyê de.',
'emailusername' => 'Nameyê karberi:',
-'emailusernamesubmit' => 'Stare dı',
+'emailusernamesubmit' => 'İtaet',
'email-legend' => 'karberê {{SITENAME}} binan re e-posta bıerşaw',
-'emailfrom' => 'Rışten:',
-'emailto' => 'Geren:',
-'emailsubject' => 'Mersel:',
-'emailmessage' => 'E-posta:',
-'emailsend' => 'bıerşawê/bıruşnê',
+'emailfrom' => 'Kami ra:',
+'emailto' => 'Kami rê:',
+'emailsubject' => 'Mewzu:',
+'emailmessage' => 'Mesac:',
+'emailsend' => 'Bırışe',
'emailccme' => 'kopyayekê mesaji mı re bıerşaw',
'emailccsubject' => '$2 kopyaya mesaj a ke şıma erşawıto/a $1:',
'emailsent' => 'E-posta bırşê',
'emailuserfooter' => 'na e-posta hetê ıney ra $1 erşawiya $2 no/na karberi/e re. pê fonksiyonê "Karberi/e re e-posta bıerşaw" no {{SITENAME}} keyepeli erşawiya.',
# User Messenger
-'usermessage-summary' => 'Mesajê sistemi caverd.',
+'usermessage-summary' => 'Mesacê sistemi caverde.',
'usermessage-editor' => 'Mesaj berdoxe sistemi',
'usermessage-template' => 'MediaWiki:UserMessage',
'removewatch' => 'Listedê mınê seyr kerdışi ra hewad',
'removedwatchtext' => 'Ena pela "[[:$1]]" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].',
'watch' => 'Temaşe ke',
-'watchthispage' => 'Peler seyr ke',
+'watchthispage' => 'Na pele seyr ke',
'unwatch' => 'Teqib mekerê',
'unwatchthispage' => 'temaşa kerdışê peli vındarn.',
'notanarticle' => 'mebhesê peli niyo',
# Contributions
'contributions' => 'İştiraqê karberi',
'contributions-title' => 'Dekerdenê karber de $1',
-'mycontris' => 'Dekerdenê mı',
+'mycontris' => 'İştıraqê mı',
'contribsub2' => 'Qandê $1 ($2)',
'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
'uctop' => '(top)',
'sp-contributions-submit' => 'Cı geyre',
# What links here
-'whatlinkshere' => 'Gıreyê perer',
+'whatlinkshere' => 'Gıreyê pele',
'whatlinkshere-title' => 'Per da "$1" rê perê ke gre danê',
'whatlinkshere-page' => 'Per:',
'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
'allmessages' => 'Mesacê sistemi',
'allmessagesname' => 'Name',
'allmessagesdefault' => 'Hesıbyaye metnê mesaci',
-'allmessagescurrent' => 'Metno ke karyayo',
+'allmessagescurrent' => 'Nuşteyê mesacê rocaney',
'allmessagestext' => 'na liste, listeya mesajê cayê nameyê wikimedya yo.
eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê [//www.mediawiki.org/wiki/Localisation mahalli kerdışê wikimedyayi] u [//translatewiki.net translatewiki.net] ziyaret bıkerê.',
'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' qefelnaye yo u ey ra '''{{ns:special}}:Allmessages''' karkerdışi re akerde niyo.",
'pageinfo-redirectsto' => 'Beno hetê',
'pageinfo-redirectsto-info' => 'melumat',
'pageinfo-contentpage' => 'Zey jû pela zerreki hesebiyena',
-'pageinfo-contentpage-yes' => 'E',
+'pageinfo-contentpage-yes' => 'Heya',
'pageinfo-protect-cascading' => 'Sıtarkerdey tiya cı ra yenê war',
-'pageinfo-protect-cascading-yes' => 'E',
+'pageinfo-protect-cascading-yes' => 'Heya',
'pageinfo-protect-cascading-from' => 'Sıtarkerdey cı ra yenê war',
# Skin names
'exif-subjectdistance-value' => '$1 metreyi',
-'exif-meteringmode-0' => 'Nêzanıte',
+'exif-meteringmode-0' => 'Nêzanayen',
'exif-meteringmode-1' => 'orta',
'exif-meteringmode-2' => 'gıraniyê merkeziyi ser',
'exif-meteringmode-3' => 'noqtayın',
'exif-meteringmode-6' => 'qısmî',
'exif-meteringmode-255' => 'Bin',
-'exif-lightsource-0' => 'Nêzanıte',
+'exif-lightsource-0' => 'Nêzanayen',
'exif-lightsource-1' => 'Roşnê Tici',
'exif-lightsource-2' => 'Florasant',
'exif-lightsource-3' => 'roşnê bêbızate',
'exif-sharpness-1' => 'Nerm',
'exif-sharpness-2' => 'Huşk',
-'exif-subjectdistancerange-0' => 'Nêzanıte',
+'exif-subjectdistancerange-0' => 'Nêzanayen',
'exif-subjectdistancerange-1' => 'Makro',
'exif-subjectdistancerange-2' => 'Vinayişê nezdiyi',
'exif-subjectdistancerange-3' => 'Vinayişê duri',
'standard.css' => '/* CSS placed here will affect users of the Standard skin */', # only translate this message to other languages if you have to change it
'nostalgia.css' => '/* CSS placed here will affect users of the Nostalgia skin */', # only translate this message to other languages if you have to change it
'cologneblue.css' => '/* CSS placed here will affect users of the Cologne Blue skin */', # only translate this message to other languages if you have to change it
-'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */', # only translate this message to other languages if you have to change it
+'monobook.css' => '/* CSS placed here will affect users of the MonoBook skin */', # only translate this message to other languages if you have to change it
'myskin.css' => '/* CSS placed here will affect users of the MySkin skin */', # only translate this message to other languages if you have to change it
'chick.css' => '/* CSS placed here will affect users of the Chick skin */', # only translate this message to other languages if you have to change it
'simple.css' => '/* CSS placed here will affect users of the Simple skin */', # only translate this message to other languages if you have to change it
'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a este usuario.
La dirección electrónica que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el remitente para que el destinatario pueda responderte.',
'usermailererror' => 'El sistema de correo devolvió un error:',
-'defemailsubject' => 'Correo de {{SITENAME}} para el usuario $1',
+'defemailsubject' => 'Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}',
'usermaildisabled' => 'Correo electrónico del usuario deshabilitado',
'usermaildisabledtext' => 'No puedes enviar correos electrónicos a otros usuarios en esta wiki',
'noemailtitle' => 'No hay dirección de correo electrónico',
'youhavenewmessagesfromusers' => "Vous avez $1 d'{{PLURAL:$3| un autre utilisateur|$3 autres utilisateurs}} ( $2 ).",
'youhavenewmessagesmanyusers' => 'Vous avez $1 de nombreux utilisateurs ($2).',
'newmessageslinkplural' => '{{PLURAL:$1|un message|nouveaux messages}}',
-'newmessagesdifflinkplural' => 'dernières {{PLURAL:$1|modification|modifications}}',
+'newmessagesdifflinkplural' => 'dernières modification{{PLURAL:$1||s}}',
'youhavenewmessagesmulti' => 'Vous avez de nouveaux messages sur $1.',
'editsection' => 'modifier',
'editold' => 'modifier',
Vous pouvez revenir en arrière et modifier une page existante, ou bien [[Special:UserLogin|vous connecter ou créer un compte]].',
'nocreate-loggedin' => 'Vous n’avez pas la permission de créer de nouvelles pages.',
'sectioneditnotsupported-title' => 'Modification de section non prise en charge',
-'sectioneditnotsupported-text' => 'La modification d’une section n’est pas supportée dans cette page de modification.',
+'sectioneditnotsupported-text' => 'La modification d’une section n’est pas prise en charge pour cette page.',
'permissionserrors' => 'Erreur de permissions',
'permissionserrorstext' => 'Vous n’avez pas la permission d’effectuer l’opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :',
'permissionserrorstext-withaction' => 'Vous n’êtes pas autorisé{{GENDER:||e|(e)}} à $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :',
'mergehistory-box' => 'Fusionner les versions de deux pages :',
'mergehistory-from' => 'Page d’origine :',
'mergehistory-into' => 'Page de destination :',
-'mergehistory-list' => 'Historique des modifications fusionnable',
+'mergehistory-list' => 'Historique fusionnable des modifications',
'mergehistory-merge' => 'Les versions suivantes de [[:$1]] peuvent être fusionnées avec [[:$2]]. Utilisez la colonne de boutons radio pour fusionner uniquement les versions créées du début jusqu’à la date indiquée. Notez bien que l’utilisation des liens de navigation réinitialisera cette colonne.',
'mergehistory-go' => 'Voir les modifications qui peuvent être fusionnées',
'mergehistory-submit' => 'Fusionner les versions',
'recentchangeslinked-feed' => 'Suivi des pages liées',
'recentchangeslinked-toolbox' => 'Suivi des pages liées',
'recentchangeslinked-title' => 'Suivi des pages associées à « $1 »',
-'recentchangeslinked-noresult' => 'Il n’y a pas de modification sur les pages liées pendant la période choisie.',
+'recentchangeslinked-noresult' => 'Il n’y a pas de modification des pages liées pendant la période choisie.',
'recentchangeslinked-summary' => "Cette page spéciale montre les modifications récentes sur les pages qui sont liées. Les pages de votre liste de suivi sont '''en gras'''.",
'recentchangeslinked-page' => 'Nom de la page :',
'recentchangeslinked-to' => 'Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l’inverse',
'filename-tooshort' => 'Le nom du fichier est trop court.',
'filetype-banned' => 'Ce type de fichier est interdit.',
'verification-error' => 'Ce fichier ne passe pas la vérification des fichiers.',
-'hookaborted' => 'La modification que vous avez essayé de faire a été arrêtée par un crochet d’une extension.',
+'hookaborted' => 'La modification que vous avez essayé de faire a été annulée par une extension.',
'illegal-filename' => 'Le nom du fichier n’est pas autorisé.',
'overwrite' => 'Écraser un fichier existant n’est pas autorisé.',
'unknown-error' => 'Une erreur inconnue s’est produite.',
# Import log
'importlogpage' => 'Journal des importations',
-'importlogpagetext' => 'Importations administratives de pages avec leur historique de modifications depuis d’autres wikis.',
+'importlogpagetext' => 'Importations administratives de pages d’autres wikis, avec leur historique de modification.',
'import-logentry-upload' => 'a importé [[$1]] par envoi de fichier',
'import-logentry-upload-detail' => '$1 version{{PLURAL:$1||s}}',
'import-logentry-interwiki' => 'a importé $1 d’un wiki à l’autre',
'api-error-filetype-banned' => 'Ce type de fichier est interdit.',
'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|n’est pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. {{PLURAL:$3|Le type de fichier autorisé est |Les types de fichiers autorisés sont}} $2.',
'api-error-filetype-missing' => 'L’extension du fichier est manquante.',
-'api-error-hookaborted' => 'La modification que vous avez essayé de faire a été arrêtée par un crochet d’une extension.',
+'api-error-hookaborted' => 'La modification que vous avez essayé de faire a été annulée par une extension.',
'api-error-http' => 'Erreur interne : ne peut se connecter au serveur.',
'api-error-illegal-filename' => 'Le nom du fichier n’est pas autorisé.',
'api-error-internal-error' => 'Erreur interne : Quelque chose s’est mal passé lors du traitement de votre import sur le wiki.',
'views' => 'Visualisacions',
'toolbox' => 'Bouèta d’outils',
'userpage' => 'Vêde la pâge utilisator',
-'projectpage' => 'Vêde la pâge du projèt',
+'projectpage' => 'Vêde la pâge projèt',
'imagepage' => 'Vêde la pâge du fichiér',
'mediawikipage' => 'Vêde la pâge du mèssâjo',
'templatepage' => 'Vêde la pâge du modèlo',
'youhavenewmessages' => 'Vos avéd de $1 ($2).',
'newmessageslink' => 'mèssâjos novéls',
'newmessagesdifflink' => 'dèrriér changement',
-'youhavenewmessagesfromusers' => 'Vos avéd $1 {{PLURAL:$3|d’un ôtro utilisator|de $3 ôtros utilisators}} ($2).',
+'youhavenewmessagesfromusers' => 'Vos avéd $1 {{PLURAL:$3|d’un ôtr’utilisator|de $3 ôtros utilisators}} ($2).',
'youhavenewmessagesmanyusers' => 'Vos avéd $1 d’un mouél d’utilisators ($2).',
'newmessageslinkplural' => '{{PLURAL:$1|un mèssâjo novél|de mèssâjos novéls}}',
'newmessagesdifflinkplural' => '{{PLURAL:$1|dèrriér changement|dèrriérs changements}}',
'perfcached' => 'Cetes donâs sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|yon rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
'perfcachedts' => 'Cetes donâs sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp a $1. Por lo més {{PLURAL:$1|yon rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
'querypage-no-updates' => 'Ora les mises a jorn por ceta pâge sont dèsactivâyes.
-Les donâs ce-desot sont pas betâyes a jorn.',
+Les donâs ique seront pas betâyes a jorn.',
'wrong_wfQuery_params' => 'Paramètros fôx dessus wfQuery()<br />
Fonccion : $1<br />
Demanda : $2',
'cascadeprotected' => 'Cela pâge-que est protègiêye perce qu’el est encllua dedens {{PLURAL:$1|ceta pâge, qu’est étâye protègiêye|cetes pâges, que sont étâyes protègiêyes}} avouéc lo chouèx « protèccion en cascâda » activâ :
$2',
'namespaceprotected' => "Vos avéd pas la pèrmission de changiér les pâges de l’èspâço de noms « '''$1''' ».",
-'customcssprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge CSS, perce que contint la configuracion a sè d’un ôtro utilisator.',
-'customjsprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge JavaScript, perce que contint la configuracion a sè d’un ôtro utilisator.',
+'customcssprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge CSS, perce que contint la configuracion a sè d’un ôtr’utilisator.',
+'customjsprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge JavaScript, perce que contint la configuracion a sè d’un ôtr’utilisator.',
'ns-specialprotected' => 'Les pâges spèciâles pôvont pas étre changiêyes.',
'titleprotected' => "Cél titro est étâ protègiê a la crèacion per [[User:$1|$1]].
La rêson balyêye est « ''$2'' ».",
'passwordsent' => 'Un contresegno novél est étâ mandâ a l’adrèce èlèctronica de l’utilisator « $1 ».
Vos volyéd tornar branchiér aprés l’avêr reçu.',
'blocked-mailpassword' => 'Voutron adrèce IP est blocâye en ècritura, la fonccion de sovegnence du contresegno est vêr dèsactivâye por èvitar los abus.',
-'eauthentsent' => 'Un mèssâjo de confirmacion est étâ mandâ a l’adrèce endicâye.
+'eauthentsent' => 'Un mèssâjo de confirmacion est étâ mandâ a l’adrèce èlèctronica endicâye.
Devant qu’un ôtro mèssâjo seye mandâ a ceti compto, vos devréd siuvre les enstruccions du mèssâjo et pués confirmar que lo compto est franc lo voutro.',
'throttled-mailpassword' => 'Un mèssâjo de sovegnence de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.
Por èvitar los abus, solament yon mèssâjo de sovegnence serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.',
Du côp la crèacion de compto est étâye dèsactivâye temporèrament por cel’adrèce IP.',
'emailauthenticated' => 'Voutron adrèce èlèctronica est étâye ôtentifiâye lo $2 a $3.',
'emailnotauthenticated' => 'Voutron adrèce èlèctronica est p’oncor ôtentifiâye.
-Nion mèssâjo serat mandâ por châcuna de cetes fonccions.',
-'noemailprefs' => 'Spècifiâd n’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccions.',
+Nion mèssâjo serat mandâ por châcuna de cetes fonccionalitâts.',
+'noemailprefs' => 'Spècifiâd n’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccionalitâts.',
'emailconfirmlink' => 'Confirmâd voutron adrèce èlèctronica',
'invalidemailaddress' => 'Cet’adrèce èlèctronica pôt pas étre accèptâye perce que semble avêr un format fôx.
Volyéd buchiér n’adrèce bien formatâye ou ben lèssiér cél champ vouedo.',
# Edit pages
'summary' => 'Rèsumâ :',
'subject' => 'Chousa / titro :',
-'minoredit' => 'Petiôt changement',
+'minoredit' => 'O est un petiôt changement',
'watchthis' => 'Siuvre ceta pâge',
'savearticle' => 'Sôvar la pâge',
'preview' => 'Prèvisualisacion',
-'showpreview' => 'Fâre vêre una prèvisualisacion',
-'showlivepreview' => 'Apèrçu vito fêt',
+'showpreview' => 'Fâre vêre na prèvisualisacion',
+'showlivepreview' => 'Apèrçu rapido',
'showdiff' => 'Fâre vêre los changements',
-'anoneditwarning' => "'''Atencion :''' vos éte pas branchiê.
-Voutra adrèce IP serat encartâ dens l’historico de ceta pâge.",
-'anonpreviewwarning' => "''Vos éte pas branchiê. Sôvar encarterat voutra adrèce IP dens l’historico des changements de la pâge.''",
-'missingsummary' => "'''Rapèl :''' vos éd p’oncor balyê lo rèsumâ de voutron changement.
-Se vos tornâd clicar dessus « {{int:savearticle}} », voutron changement serat sôvâ sen novél avèrtissement.",
-'missingcommenttext' => 'Volyéd fâre voutron comentèro ce-desot.',
-'missingcommentheader' => "'''Rapèl :''' vos éd p’oncor balyê de sujèt ou ben de titro a ceti comentèro.
-Se vos tornâd clicar dessus « {{int:savearticle}} », voutron changement serat sôvâ sen titro.",
-'summary-preview' => 'Prèvisualisacion du rèsumâ :',
-'subject-preview' => 'Prèvisualisacion du sujèt / titro :',
-'blockedtitle' => 'L’usanciér est blocâ.',
-'blockedtext' => "'''Voutron compto usanciér ou ben voutra adrèce IP at étâ blocâ.'''
-
-Lo blocâjo at étâ fêt per $1.
-La rêson balyê est ceta : ''$2''.
+'anoneditwarning' => "'''Atencion :''' vos éte pas branchiê(ye).
+Voutron adrèce IP serat encartâye dedens l’historico des changements de ceta pâge.",
+'anonpreviewwarning' => "''Vos éte pas branchiê(ye). Sôvar encarterat voutron adrèce IP dedens l’historico des changements de ceta pâge.''",
+'missingsummary' => "'''Sovegnence :''' vos éd balyê gins de rèsumâ de changement.
+Se vos tornâd clicar sur lo boton « {{int:savearticle}} », voutron changement serat sôvâ sen rèsumâ.",
+'missingcommenttext' => 'Volyéd buchiér un comentèro ce-desot.',
+'missingcommentheader' => "'''Sovegnence :''' vos éd balyê gins de chousa / titro a ceti comentèro.
+Se vos tornâd clicar sur lo boton « {{int:savearticle}} », voutron changement serat sôvâ sen chousa / titro.",
+'summary-preview' => 'Apèrçu du rèsumâ :',
+'subject-preview' => 'Apèrçu de la chousa / du titro :',
+'blockedtitle' => 'L’utilisator est blocâ',
+'blockedtext' => "'''Voutron nom d’utilisator ou ben voutron adrèce IP est étâ(ye) blocâ(ye).'''
+
+Lo blocâjo est étâ fêt per $1.
+La rêson balyêye est ''$2''.
* Comencement du blocâjo : $8
* Èxpiracion du blocâjo : $6
* Compto blocâ : $7
Vos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.
-Vos pouede pas utilisar la fonccionalitât « Lui mandar un mèssâjo » a muens que vos èyâd una adrèce èlèctronica valida encartâ dens voutres [[Special:Preferences|prèferences]] et que la fonccionalitât èye pas étâ dèsactivâ.
-Voutra adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
-Volyéd spècefiar cetes endicacions dens totes les requétes que vos faréd.",
-'autoblockedtext' => "Voutra adrèce IP at étâ blocâ ôtomaticament perce qu’el at étâ utilisâ per un ôtro usanciér, lui-mémo blocâ per $1.
-La rêson balyê est ceta :
+Vos pouede pas empleyér la fonccionalitât « Lui mandar un mèssâjo » a muens qu’un’adrèce èlèctronica valida est spècifiâye dens voutres [[Special:Preferences|prèferences]] et que vos éte pas étâ blocâ de l’empleyér.
+Voutron adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
+Volyéd encllure tôs los dètalys ce-dessus dedens quinta que seye demanda que vos faréd.",
+'autoblockedtext' => "Voutron adrèce IP est étâye blocâye ôtomaticament perce qu’el est étâye empleyêye per un ôtr’utilisator, lui-mémo blocâ per $1.
+La rêson balyêye est :
:''$2''
Vos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.
-Notâd que vos porréd pas utilisar la fonccionalitât « Lui mandar un mèssâjo » a muens que vos èyâd una adrèce èlèctronica valida encartâ dens voutres [[Special:Preferences|prèferences]] et que la fonccionalitât èye pas étâ dèsactivâ.
+Notâd que vos porréd pas empleyér la fonccionalitât « Lui mandar un mèssâjo » a muens que vos avéd n’adrèce èlèctronica valida encartâye dens voutres [[Special:Preferences|prèferences]] et que vos éte pas étâ blocâ de l’empleyér.
-Voutra adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
-Volyéd spècefiar cetes endicacions dens totes les requétes que vos faréd.",
-'blockednoreason' => 'gins de rêson balyê',
-'whitelistedittext' => 'Vos dête étre $1 por avêr la pèrmission de changiér lo contegnu.',
+Voutron adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
+Volyéd encllure tôs los dètalys ce-dessus dedens quinta que seye demanda que vos faréd.",
+'blockednoreason' => 'gins de rêson balyêye',
+'whitelistedittext' => 'Vos vos dête $1 por povêr changiér les pâges.',
'confirmedittext' => 'Vos dête confirmar voutra adrèce èlèctronica devant que changiér les pâges.
Volyéd buchiér et pués validar voutra adrèce èlèctronica dens voutres [[Special:Preferences|prèferences]].',
'nosuchsectiontitle' => 'Empossiblo de trovar la sèccion',
'rollbacklink' => 'reverter',
'rollbacklinkcount' => 'reverter $1 {{PLURAL:$1|edición|edicións}}',
'rollbacklinkcount-morethan' => 'reverter máis de $1 {{PLURAL:$1|edición|edicións}}',
-'rollbackfailed' => 'Houbo un fallo ao reverter as edicións',
+'rollbackfailed' => 'Houbo un erro ao reverter as edicións',
'cantrollback' => 'Non se pode desfacer a edición; o último colaborador é o único autor desta páxina.',
'alreadyrolled' => 'Non se pode desfacer a edición en "[[:$1]]" feita por [[User:$2|$2]] ([[User talk:$2|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); alguén máis editou ou desfixo os cambios desta páxina.
* @author Dineshjk
* @author Dsvyas
* @author Haritosh
+ * @author Harsh4101991
* @author Jay
* @author Kaganer
* @author KartikMistry
'tog-nocache' => 'બ્રાઉઝરનું પેજ કેશિંગ અક્રિય કરો',
'tog-enotifwatchlistpages' => 'મારી ધ્યાનસૂચિમાંનું પાનુ અને ફાઇલમાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો',
'tog-enotifusertalkpages' => 'મારી ચર્ચાનાં પાનામાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો',
-'tog-enotifminoredits' => 'પાનાં અનેફાઇલ્સમાં નાનાં ફેરફાર થાય તો પણ મને ઇ-મેલ મોકલો',
+'tog-enotifminoredits' => 'પાનાં અને ફાઇલ્સમાં નાનાં ફેરફાર થાય તો પણ મને ઇ-મેલ મોકલો',
'tog-enotifrevealaddr' => 'નોટીફીકેશનના ઇમેલમાં મારૂ ઇમેલ એડ્રેસ બતાવો',
'tog-shownumberswatching' => 'ધ્યાનમાં રાખતા સભ્યોની સંખ્યા બતાવો',
'tog-oldsig' => 'હાલના હસ્તાક્ષર',
'mailnologin' => 'મેળવનારનું સરનામું નથી',
'mailnologintext' => 'અન્ય સભ્યને ઇ-મેલ મોકલવા માટે તમે [[Special:UserLogin|logged in]] પ્રવેશ કરેલ હોવો જોઈએ અને તમારા[[Special:Preferences|preferences]] વિકલ્પોમાં તમારા ઈ-મેલ સરનામાની પુષ્ટિ થયેલી હોવી જોઈએ',
'emailuser' => 'સભ્યને ઇ-મેલ કરો',
+'emailuser-title-notarget' => 'ઇ-મેલ વપરાશકર્તા',
'emailpage' => 'ઈ-મેલ સભ્ય',
'emailpagetext' => 'તમે નીચે દર્શાવેલ ફોર્મ વાપરી ઇ-મેલ મોકલી શકો છો.
તમે તમારી માહિતીમાં [[Special:Preferences|your user preferences]] જે ઇ-મેલ લખ્યો હશે તે દ્વારા ના નામ હેઠળ દેખાશે, જેથી ઇ-મેલ મેળવનાર તમને સંદેશાનો જવાબ આપી શકશે.',
# Info page
'pageinfo-title' => ' $1 પાના ની માહિતી નૂ મથાડૂ',
'pageinfo-header-edits' => 'ઇતિહાસ સંપાદન',
+'pageinfo-length' => 'પૃષ્ઠની લંબાઇ (બાઇટમાં)',
'pageinfo-views' => 'જોનારાની સંખ્યા',
'pageinfo-watchers' => 'પાના નીરીક્ષકોની સંખ્યા',
'pageinfo-edits' => 'કુલ સંપાદનોની સંખ્યા',
'pageinfo-authors' => 'ક્ષેત્રના લેખકોની કુલ સંખ્યા',
+'pageinfo-toolboxlink' => 'પૃષ્ઠમાહિતી',
+'pageinfo-redirectsto-info' => 'માહિતી',
+'pageinfo-contentpage-yes' => 'હા',
+'pageinfo-protect-cascading-yes' => 'હા',
# Patrolling
'markaspatrolleddiff' => 'નિરીક્ષીત અંકિત કરો',
'editinguser' => "שינוי הרשאות המשתמש של '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'עריכת קבוצות משתמש',
'saveusergroups' => 'שמירת קבוצות משתמש',
-'userrights-groupsmember' => 'חבר בקבוצות:',
-'userrights-groupsmember-auto' => 'חבר אוטומטית בקבוצות:',
+'userrights-groupsmember' => '{{GENDER:$2|חבר|חברה}} ב{{PLURAL:$1|קבוצה|קבוצות}}:',
+'userrights-groupsmember-auto' => '{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:',
'userrights-groups-help' => 'באפשרותכם לשנות את הקבוצות שמשתמש זה חבר בהן:
* תיבה מסומנת פירושה שהמשתמש חבר בקבוצה.
* תיבה בלתי מסומנת פירושה שהמשתמש אינו חבר בקבוצה.
'category-empty' => "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}',
'hidden-category-category' => 'Nailemmeng a katkategoria',
-'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
'category-article-count-limited' => 'Ti sumaganad {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
'mainpage' => 'Umuna a Panid',
'mainpage-description' => 'Umuna a Panid',
'policy-url' => 'Project:Annuroten',
-'portal' => 'Pagdadanonan',
+'portal' => 'Portal ti komunidad',
'portal-url' => 'Project:Portal ti komunidad',
'privacy' => 'Annuroten iti kinapribado',
'privacypage' => 'Project:Annuroten iti kinapribado',
'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
Adda met daytoyen.',
'defaultmessagetext' => 'Kasisigud a testo ti mensahe',
+'invalid-content-data' => 'Imbalido a datos ti linaon',
+'content-not-allowed-here' => 'Ti "$1" a linaon ket saan a maipalubos idiay [[$2]] a panid',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'naranas a testo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an a panagtawtawag.
'uploadnewversion-linktext' => 'Mangipan ti kabarbaro a bersion iti daytoy a papeles',
'shared-repo-from' => 'Naggapo iti $1',
'shared-repo' => 'iti pagbingbingayan a nagikabilan',
-'upload-disallowed-here' => 'Daksanggasat a saanmo a mabalin a suratan manen daytoy nga imahen.',
+'upload-disallowed-here' => 'Saanmo a masuratan manen daytoy nga imahen.',
# File reversion
'filerevert' => 'Isubli ti $1',
'undeletedrevisions' => '{{PLURAL:$1|1 a binaliwan|dagiti $1 a binaliwan}} ti naisubli',
'undeletedrevisions-files' => '{{PLURAL:$1|1 a binaliwan|dagiti $1 a binaliwan}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli',
'undeletedfiles' => '{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli',
-'cannotundelete' => 'Napaay ti panagikkat;
-adda ngata immuna a nagikkat ti panid.',
+'cannotundelete' => 'Napaay ti panagikkat:
+$1',
'undeletedpage' => "'''Naisublin ti $1'''
Binsiren ti [[Special:Log/delete|listaan ti naik-ikkat]] para iti listaan dagiti naudi a naik-ikkat ken naisubsubli.",
# Info page
'pageinfo-title' => 'Pakaammo para iti "$1"',
+'pageinfo-not-current' => 'Ti pakaammo ket mabalin laeng a maiparang para iti agdama a panagbalbaliw.',
'pageinfo-header-basic' => 'Kangrunaan a pakaammuan',
'pageinfo-header-edits' => 'Pakasaritaan ti inurnos',
'pageinfo-header-restrictions' => 'Panagsalaknib ti panid',
'pageinfo-hidden-categories' => 'Nailemmeng {{PLURAL:$1|a kategoria|a katkategoria}} ($1)',
'pageinfo-templates' => 'Nailak-am {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
'pageinfo-toolboxlink' => 'Pakaammo ti panid',
+'pageinfo-redirectsto' => 'Maibaw-ing idiay',
+'pageinfo-redirectsto-info' => 'pakaammo',
+'pageinfo-contentpage' => 'Naibilang a kas naglaon a panid',
+'pageinfo-contentpage-yes' => 'Wen',
+'pageinfo-protect-cascading' => 'Dagiti panagsalaknib ket agsariap manipud ditoy',
+'pageinfo-protect-cascading-yes' => 'Wen',
+'pageinfo-protect-cascading-from' => 'Dagiti panagsalaknib ket agsariap manipud idiay',
# Patrolling
'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
# Scary transclusion
'scarytranscludedisabled' => '[Nabaldado ti Interwiki panagiraman]',
'scarytranscludefailed' => '[Napaay ti panagala ti plantilia para iti $1]',
+'scarytranscludefailed-httpstatus' => '[Napaay ti panagala ti plantilia para iti $1: HTTP $2]',
'scarytranscludetoolong' => '[Atiddog unay ti URL]',
# Delete conflict
'enotif_anon_editor' => 'ónefndum notanda $1',
'enotif_body' => 'Kæri $WATCHINGUSERNAME,
-Það lítur út fyrir að þú hafir ný skilaboð á {{SITENAME}} síðunni $PAGETITLE.
-Hún hefur verið $CHANGEDORCREATED $PAGEEDITDATE af
+Síðan „$PAGETITLE” sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið $CHANGEDORCREATED $PAGEEDITDATE af
$PAGEEDITOR. Breytingarágripið var:
$PAGESUMMARY
-Þetta er tengill á spjallsíðuna þína:
+Þetta er tengill á síðuna:
$PAGETITLE_URL
{{canonicalurl:{{#special:Preferences}}}}
-Til þess að hætta að fylgjast með $PAGETITLE, smelltu á:
+Til þess að hætta að fylgjast með „$PAGETITLE”, smelltu á:
$UNWATCHURL',
'colon-separator' => ': ',
'pipe-separator' => ' | ',
'word-separator' => ' ',
-'parentheses' => '($1)',
+'parentheses' => '($1)',
# Multipage image navigation
'imgmultipageprev' => '←前ページ',
Ilaq-asen deg udday taɣult n uswir imineg, am amedya « *.org ».<br />
Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
'linksearch-line' => '$1 yeqqen seg $2',
+'linksearch-error' => 'Tzemreḍ ad seqdeceḍ isekkilen usligen ala deg tazzwara n taɣult uselkim.',
# Special:ListUsers
'listusersfrom' => 'Ssken imseqdacen seg:',
# Special:ListGroupRights
'listgrouprights' => 'Izerfan n igrawen n iseqdacen',
+'listgrouprights-summary' => 'Asebter agi yesɛa yiwen umuɣ n igrawen i sengelen deg wiki agi dɣa izerfan n wadduf i qqenen.
+Zemrent ad ilint [[{{MediaWiki:Listgrouprights-helppage}}|tilɣa nniḍen]] ɣef izerfan n yiwen.',
+'listgrouprights-key' => '*<span class="listgrouprights-granted">Izerfan sefkan</span>
+*<span class="listgrouprights-revoked">Izerfan ekkesen</span>',
'listgrouprights-group' => 'Agraw',
'listgrouprights-rights' => 'Izerfan',
'listgrouprights-helppage' => 'Help:Izerfan n igrawen',
'delete-confirm' => 'Kkes "$1"',
'delete-legend' => 'Ekkes',
'historywarning' => 'Ɣur-wet : Asebter i ara temḥuḍ yesɛa amezruy s azal alemmas n $1 {{PLURAL:$1|lqem|ileqman}} :',
+'confirmdeletetext' => 'Aqlak ad mḥuḍ asebter naɣ afaylu, dɣa akkw ileqman-is iqdimen. Ilaq ad segegeḍ tigawt agi dɣa tfehemeḍ [[{{MediaWiki:Policy-url}}|ilugan n wiki]].',
'actioncomplete' => 'Axdam yekfa',
'actionfailed' => 'Tigawt agi texser',
'deletedtext' => '"$1" yettumḥa.
'qbbrowse' => 'Browse/تصفّح',
'qbedit' => 'ترمیم',
'qbpageoptions' => 'ھیہ صفحہ',
-'qbpageinfo' => 'مفہوم',
'qbmyoptions' => 'مہ صفحات',
'qbspecialpages' => 'خاص صفحات',
'faq' => 'عام معلومات',
'qbbrowse' => 'Килигун',
'qbedit' => 'Дегишарун',
'qbpageoptions' => 'Ччинин низамарунар',
-'qbpageinfo' => 'Ччиникай малумат',
'qbmyoptions' => 'Зи ччинар',
'qbspecialpages' => 'Кьетlен хъувун',
'faq' => 'Фад-фад гузвай жузунар (ФГЖ)',
'revertmerge' => 'Ччара авун',
# Diffs
-'history-title' => '$1 - масакIавилерин тарих',
+'history-title' => 'Masak\'avilerin q\'isa "$1"',
'lineno' => 'ЦIар $1:',
'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
'editundo' => 'гьич авун',
'shared-repo' => 'sebuah gedung kongsi',
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
'filepage.css' => '/* CSS yang ditempatkan di sini disertakan pada laman keterangan fail, dan juga pada klien wiki asing */',
-'upload-disallowed-here' => 'Maaf, anda tidak boleh menggantikan imej ini.',
+'upload-disallowed-here' => 'Anda tidak boleh menggantikan fail ini.',
# File reversion
'filerevert' => 'Balikkan $1',
# Info page
'pageinfo-title' => 'Maklumat untuk "$1"',
+'pageinfo-not-current' => 'Maklumat mungkin hanya dipaparkan untuk versi semasa.',
'pageinfo-header-basic' => 'Maklumat asas',
'pageinfo-header-edits' => 'Sunting sejarah',
'pageinfo-header-restrictions' => 'Perlindungan halaman',
'pageinfo-hidden-categories' => 'Kategori tersembunyi ($1)',
'pageinfo-templates' => 'Templat tertransklusi ($1)',
'pageinfo-toolboxlink' => 'Maklumat halaman',
+'pageinfo-redirectsto' => 'Melencong ke',
+'pageinfo-redirectsto-info' => 'maklumat',
+'pageinfo-contentpage' => 'Dikira sebagai halaman kandungan',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading' => 'Perlindungan sedang melata dari sini',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-protect-cascading-from' => 'Perlindungan sedang melata dari',
# Skin names
'skinname-standard' => 'Klasik',
'tog-minordefault' => 'Ticmachiyōtīz mochīntīn tlapatlalitzintli ic default',
'tog-previewontop' => 'Tiquittāz achtochīhualiztli achtopa tlapatlaliztli caxitl',
'tog-previewonfirst' => 'Xiquitta achtochīhualiztli inic cē tlapatlalizpan',
-'tog-enotifwatchlistpages' => 'Timitz-e-mailīzqueh ihcuāc mopatla cē zāzanilli tictlachiya.',
+'tog-enotifwatchlistpages' => 'Notech moēhualtia cē maltzinteyōtl netitlaniztli ihcuāc mopatla zāzanilli in notlachiyaliz.',
'tog-enotifusertalkpages' => 'Nēchihtoa ihcuāc tlecpatla motēixnāmiquiliz',
-'tog-enotifminoredits' => 'Timitz-e-mailīzqueh nō zāzanilpatlatzintli ītechcopa',
+'tog-enotifminoredits' => 'Notech moēhualtia cē maltzinteyōtl netitlaniztli nō ihcuāc mopatla tepitōn zāzanilli in notlachiyaliz.',
'tog-enotifrevealaddr' => 'Ticnēxtīz mo e-mailcān āxcāncayōtechcopa āmatlacuilizpan',
'tog-shownumberswatching' => 'Tiquinttāz tlatequitiltilīlli tlein tlachiyacateh',
'tog-forceeditsummary' => 'Xinēchnōtzāz ihcuāc ahmo niquihtōz inōn ōnitlapatlac',
'qbbrowse' => 'Titlatēmōz',
'qbedit' => 'Ticpatlāz',
'qbpageoptions' => 'Inīn zāzanilli',
-'qbpageinfo' => 'Tlahcuilōltechcopa',
'qbmyoptions' => 'Nozāzanil',
'qbspecialpages' => 'Nònkuâkìskàtlaìxtlapaltìn',
'faq' => 'Zan īc tētlatlanīliztli',
'timezoneregion-europe' => 'Europan',
'timezoneregion-indian' => 'Índico Ilhuicaātl',
'timezoneregion-pacific' => 'Pacífico Ilhuicaātl',
-'prefs-searchoptions' => 'Tlatēmoliztli tlaēlēhuiliztli',
+'prefs-searchoptions' => 'Titlatēmōz',
'prefs-namespaces' => 'Tōcātzin',
'defaultns' => 'Tlatēmōz inīn tōcātzimpan achtopa:',
'default' => 'ic default',
'uploadstash-summary' => 'Denne siden gir tilgang til filer som har blitt lastet opp (eller er i ferd med å bli lastet opp) men som ennå ikke er publisert til wikien. Disse filene er ikke synlige for andre enn brukeren som lastet dem opp.',
'uploadstash-clear' => 'Fjern stashede filer',
'uploadstash-nofiles' => 'Du har ingen stashede filer.',
-'uploadstash-badtoken' => 'Utføringen av den handlingen var mislykket, kanskje fordi dine redigeringsrettigheter har utløpt. Prøv igjen.',
+'uploadstash-badtoken' => 'Utføringen av den handlingen var mislykket, kanskje fordi redigeringsrettighetene dine har utløpt. Prøv igjen.',
'uploadstash-errclear' => 'Fjerning av filene var mislykket.',
'uploadstash-refresh' => 'Oppdater listen over filer',
'invalid-chunk-offset' => 'Ugyldig delforskyvning',
# Info page
'pageinfo-title' => 'Informatie over "$1"',
-'pageinfo-not-current' => 'Gegegevens worden mogelijk alleen weergegeven voor de huidige versie.',
+'pageinfo-not-current' => 'Gegevens worden mogelijk alleen weergegeven voor de huidige versie.',
'pageinfo-header-basic' => 'Basisgegevens',
'pageinfo-header-edits' => 'Bewerkingsgeschiedenis',
'pageinfo-header-restrictions' => 'Paginabeveiliging',
Sjekk gjerne loggføringa.',
'revdelete-only-restricted' => 'Feil under gøyming av objektet datert $2 $1: du kan ikkje gøyma objekt for administratorar utan å i tillegg velja eit av dei andre visingsvala.',
'revdelete-reason-dropdown' => '*Vanlege grunnar til sletting
-** Brot på opphavsrettar
-** Ikkje høveleg personleg informasjon
-** Mogleg falskt sladder',
+** Brot på opphavsrett
+** Kommentar eller personleg informasjon som ikkje høver seg
+** Brukarnamn som ikkje høver seg
+** Mogeleg falskt sladder',
'revdelete-otherreason' => 'Anna årsak, eller tilleggsårsak:',
'revdelete-reasonotherlist' => 'Annan grunn',
'revdelete-edit-reasonlist' => 'Endre grunnar til sletting',
# Diffs
'history-title' => '$1: Versjonshistorikk',
-'difference-title' => '$1: Skilnad mellom versjonar',
+'difference-title' => 'Skilnad mellom versjonar av «$1»',
'difference-title-multipage' => '$1 og $2: Skilnad mellom sidene',
'difference-multipage' => '(Skilnad mellom sider)',
'lineno' => 'Line $1:',
'editundo' => 'angre',
'diff-multi' => '({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} frå {{PLURAL:$2|éin brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
'diff-multi-manyusers' => '({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
+'difference-missing-revision' => '{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje funne.
+
+Dette skriv seg som oftast frå at ein har fylgd ei forelda versjonslenkje til ei side som er sletta.
+Detaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].',
# Search results
'searchresults' => 'Søkjeresultat',
'yourrealname' => 'Verkeleg namn:',
'yourlanguage' => 'Språk:',
'yourvariant' => 'Språkvariant for innhald:',
+'prefs-help-variant' => 'Varianten eller ortografien som du føretrekkjer at innhaldet i wikien vert vist på.',
'yournick' => 'Signatur:',
'prefs-help-signature' => 'Kommentarar på diskusjonssider bør alltid signerast med «<nowiki>~~~~</nowiki>», som vil konverterast til signaturen din med tidspunkt.',
'badsig' => 'Ugyldig råsignatur, sjekk HTML-kodinga.',
'backend-fail-synced' => 'Fila «$1» er i ei inkonsistent stode i dei interne lagringsbaksystema',
'backend-fail-connect' => 'Kunne ikkje kopla til filbaksystemet «$1».',
'backend-fail-internal' => 'Ein ukjend feil oppstod i lagringsbaksystemet «$1».',
+'backend-fail-batchsize' => 'Baksystemet vart gjeve ei gruppe med $1 {{PLURAL:$1|filoperasjon|filoperasjonar}}; grensa er $2 {{PLURAL:$2|operasjon|operasjonar}}.',
# File journal errors
'filejournal-fail-dbconnect' => 'Kunne ikkje kopla til journaldatabasen for lagringsbaksystemet «$1».',
Ho kan ikkje tryggingskontrollerast.',
# Special:UploadStash
+'uploadstash' => 'Lasta opp løynd samling',
+'uploadstash-summary' => 'Denne sida gjev tilgang til filer som er opplasta (eller i ferd med å verta det), men som ikkje er publiserte til wikien. Desse filene er ikkje synlege for andre enn opplastaren.',
+'uploadstash-clear' => 'Fjerna filer i den løynde samlinga',
+'uploadstash-nofiles' => 'Du har ingen filer i den løynde samlinga.',
+'uploadstash-badtoken' => 'Utføringa av handlinga lukkast ikkje; kan henda av di endringsrettane dine har gått ut. Freista om att.',
'uploadstash-errclear' => 'Fjerning av filene var mislykka.',
'uploadstash-refresh' => 'Oppdater fillista',
Denne wikien er sett opp som ein ålmennt tilgjengeleg wiki.
For best tryggleik, er img_auth.php sett ut av funksjon.',
'img-auth-noread' => 'Brukaren har ikkje rettar til å lesa «$1».',
+'img-auth-bad-query-string' => 'URL-en har ein ugild spørjestreng.',
# HTTP errors
'http-invalid-url' => 'Ugyldig URL: $1',
Sjå [$2 filskildringssida] for meir informasjon.',
'sharedupload-desc-here' => 'Denne fila er frå $1 og kan verta nytta av andre prosjekt.
Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
+'sharedupload-desc-edit' => 'Fila er frå $1 og kan vera nytta på andre prosjekt.
+Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
+'sharedupload-desc-create' => 'Fila er frå $1 og kan vera nytta på andre prosjekt.
+Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
'filepage-nofile' => 'Det finst ikkje noka fil med dette namnet.',
'filepage-nofile-link' => 'Inga fil med dette namnet finst, men du kan [$1 lasta ho opp].',
'uploadnewversion-linktext' => 'Last opp ny versjon av denne fila',
'statistics-edits' => 'Endringar sidan {{SITENAME}} vart oppretta',
'statistics-edits-average' => 'Gjennomsnittleg tal på endringar per side',
'statistics-views-total' => 'Totalt visningstal',
+'statistics-views-total-desc' => 'Visingar av sider som ikkje finst og spesialsider er ikkje tekne med',
'statistics-views-peredit' => 'Visingar per endring',
'statistics-users' => 'Registrerte [[Special:ListUsers|brukarar]]',
'statistics-users-active' => 'Aktive brukarar',
'wantedpages' => 'Etterspurde sider',
'wantedpages-badtitle' => 'Ugyldig tittel mellom resultata: $1',
'wantedfiles' => 'Etterspurde filer',
+'wantedfiletext-cat' => 'Desse filene er nytta men finst ikkje. Filer frå utannettstadlege samlingar kan vera lista opp sjølv om dei finst. Slike falske positivar vert <del>strokne ut</del>. Sider som nyttar filer som ikkje finst vert lista opp i [[:$1]].',
+'wantedfiletext-nocat' => 'Desse filene er nytta men finst ikkje. Filer frå utannettstadlege samlingar kan vera lista opp sjølv om dei finst. Slike falske positivar vert <del>strokne ut</del>.',
'wantedtemplates' => 'Etterspurde malar',
'mostlinked' => 'Sidene med flest lenkjer til seg',
'mostlinkedcategories' => 'Mest brukte kategoriar',
# Info page
'pageinfo-title' => 'Informasjon om «$1»',
+'pageinfo-not-current' => 'Informasjon vert berre vist for den gjeldande versjonen.',
'pageinfo-header-basic' => 'Grunnleggjande informasjon',
'pageinfo-header-edits' => 'Endringshistorikk',
'pageinfo-header-restrictions' => 'Sidevern',
'pageinfo-magic-words' => '{{PLURAL:$1|Trylleord}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Løynd kategori|Løynde kategoriar}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Inkludert mal|Inkluderte malar}} ($1)',
+'pageinfo-toolboxlink' => 'Sideinformasjon',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
'pageinfo-contentpage' => 'Tald som ei innhaldsside',
'pageinfo-contentpage-yes' => 'Ja',
'pageinfo-protect-cascading' => 'Djupvern byrjar her',
'shared-repo-from' => 'da $1',
'shared-repo' => "n'archivi condivis",
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
-'upload-disallowed-here' => 'A peul pa rampiassé sto archivi.',
+'upload-disallowed-here' => 'A peul pa rampiassé cost archivi.',
# File reversion
'filerevert' => "Buté torna $1 tanme ch'a l'era",
# Info page
'pageinfo-title' => 'Anformassion për «$1»',
-'pageinfo-not-current' => "L'anformassion a peul mach esse mostà për la revision corenta.",
+'pageinfo-not-current' => "J'anformassion a peulo mach esse smonùe për la revision an cors.",
'pageinfo-header-basic' => 'Anformassion ëd base',
'pageinfo-header-edits' => 'Modìfiche',
'pageinfo-header-restrictions' => 'Protession ëd la pàgina',
'exif-meteringmode-6' => 'Parsial',
'exif-meteringmode-255' => "n'àutr",
-'exif-lightsource-0' => 'Pa conossù',
+'exif-lightsource-0' => 'Dësconossùa',
'exif-lightsource-1' => 'Lus dël dì',
'exif-lightsource-2' => 'Fluoressenta',
'exif-lightsource-3' => 'Lus al tungsten (a incandessensa)',
-'exif-lightsource-4' => 'Flash',
+'exif-lightsource-4' => 'Lòsna',
'exif-lightsource-9' => 'Temp bel',
-'exif-lightsource-10' => 'Temp an-nivolà',
+'exif-lightsource-10' => 'Temp nìvol',
'exif-lightsource-11' => 'Ombra',
'exif-lightsource-12' => 'Fluoressensa tipo lus dël dì (D 5700 – 7100K)',
'exif-lightsource-13' => 'Fluoressensa bianca për ël dì (N 4600 – 5400K)',
'exif-lightsource-21' => 'Anluminant D65',
'exif-lightsource-22' => 'Anluminant D75',
'exif-lightsource-23' => 'Anluminant D50',
-'exif-lightsource-24' => 'Làmpada da studio ISO al tungsten',
+'exif-lightsource-24' => 'Làmpada da studi ISO al tungsten',
'exif-lightsource-255' => "Aùtra sorgiss d'anluminassion",
# Flash modes
'editfont-serif' => 'سېرېف ليکبڼه',
# Dates
-'sunday' => 'اتوار',
-'monday' => 'ګل',
-'tuesday' => 'نهي',
+'sunday' => 'يونۍ',
+'monday' => 'دونۍ',
+'tuesday' => 'درې نۍ',
'wednesday' => 'شورو',
'thursday' => 'زيارت',
'friday' => 'جمعه',
* @author Guglani
* @author Gustronico
* @author Hamilton Abreu
+ * @author Harsh4101991
* @author Helix84
* @author Holek
* @author Huji
'userrights-editusergroup' => '{{Identical|Edit user groups}}. Parameter:
* $1 is a username - optional, can be used for GENDER',
'saveusergroups' => 'Button text when editing user groups',
-'userrights-groupsmember' => 'Used when editing user groups in [[Special:Userrights]]. The messsage is followed by a list of group names.
+'userrights-groupsmember' => 'Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.
Parameters:
-* $1 - optional, for PLURAL use, the number of items in the list following the message. Avoid PLURAL, if your language can do without.',
+* $1 - the number of items in the list following the message, for PLURAL.
+* $2 - the user name, for GENDER.',
'userrights-groupsmember-auto' => 'Used when editing user groups in [[Special:Userrights]]. The messsage is followed by a list of group names.
"Implicit" is for groups that the user was automatically added to (such as "autoconfirmed"); cf. {{msg-mw|userrights-groupsmember}}
-Parameters:
-* $1 - optional, for PLURAL use, the number of items in the list following the message. Please avoid PLURAL, if your language can do without.',
+Parameters
+* $1 - the number of items in the list following the message, for PLURAL.
+* $2 - the user name, for GENDER.',
'userrights-groups-help' => 'Instructions displayed on [[Special:UserRights]]. Parameters:
* $1 is a username - optional, can be used for GENDER',
'userrights-reason' => 'Text beside log field when editing user groups
'pageinfo-header-properties' => 'Table section header in action=info.',
'pageinfo-display-title' => 'The title that is displayed when the page is viewed.',
'pageinfo-default-sort' => 'The key by which the page is sorted in categories by default.',
-'pageinfo-length' => 'The length of the page, in bytes.',
+'pageinfo-length' => 'પૃષ્ઠની લંબાઇ બાઇટમાં',
'pageinfo-article-id' => 'The numeric identifier of the page.',
'pageinfo-robot-policy' => 'The search engine status of the page, e.g. "marked as index".',
'pageinfo-robot-index' => 'An indication that the page is indexable.',
'noarticletext' => 'Non ge stè scritte ninde jndr\'à sta pàgene.
Tu puè [[Special:Search/{{PAGENAME}}|cercà pe quiste titele]] jndr\'à otre pàggene, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} cange sta pàgene]</span>.',
'noarticletext-nopermission' => "Pe mò non ge stè teste jndr'à sta pàgene.
-Tu puè [[Special:Search/{{PAGENAME}}|cercà pe stu titele]] jndr'à otre pàggene,
-o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche jndr'à l'archivije cullegate]</span>.",
+Tu puè [[Special:Search/{{PAGENAME}}|cercà pe stu titole]] jndr'à otre pàggene,
+o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche jndr'à l'archivije cullegate]</span>, ma non ge tìne le permesse pe ccrejà sta pàgene.",
'missing-revision' => "'A revisione #\$1 d'a pàgene chiamate \"{{PAGENAME}}\" non g'esiste.
Quiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.
'edit-already-exists' => "Non ge puè ccrejà 'na pàgene nove purcè esiste già!",
'defaultmessagetext' => 'Messàgge de teste de base',
+# Content models
+'content-model-text' => 'teste semblice',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => "Fà attenziò: Sta vosce tène 'nu sbuenne de funziune de chiamate a l'analizzatore.
'shared-repo' => "'nu condenitore de cose condivise",
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
'filepage.css' => "/* 'U CSS ca se iacchie aqquà jè ingluse sus 'a pàgene de descrizione d'u file, pure ingluse pe le client de le Uicchi furastire */",
-'upload-disallowed-here' => "Sfortunatamende non ge puè sovrascrivere st'immaggine.",
+'upload-disallowed-here' => 'Non ge puè sovrascrivere stu file.',
# File reversion
'filerevert' => "'Nvirte $1",
'undeletedrevisions' => '{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 file}} ripristinete',
-'cannotundelete' => "Repristine fallite;
-quaccheotre pò essere ca ha repristinate 'a pàgene apprime.",
+'cannotundelete' => 'Repristine fallite:
+$1',
'undeletedpage' => "'''$1 ha state repristinate'''
Ligge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.",
'pageinfo-magic-words' => '{{PLURAL:$1|Parole|Parole}} maggiche ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorije|Categorije}} scunnute ($1)',
'pageinfo-templates' => 'Esclude {{PLURAL:$1|template|template}} ($1)',
+'pageinfo-contentpage-yes' => 'Sine',
+'pageinfo-protect-cascading-yes' => 'Sine',
# Skin names
'skinname-standard' => 'Classeche',
* @author Lockal
* @author MaxBioHazard
* @author MaxSem
+ * @author NBS
* @author Ola
* @author Ole Yves
* @author Putnik
'djvu_no_xml' => 'Невозможно получить XML для DjVu',
'thumbnail-temp-create' => 'Не удаётся создать временный файл эскиза',
'thumbnail-dest-create' => 'Не удаётся сохранить эскиз по месту назначения',
-'thumbnail_invalid_params' => 'Ошибочный параметр миниатюры',
+'thumbnail_invalid_params' => 'Ошибочный параметр миниатюры или PNG-файл содержит более 12,5 млн. пикселей',
'thumbnail_dest_directory' => 'Невозможно создать целевую директорию',
'thumbnail_image-type' => 'Данный тип изображения не поддерживается',
'thumbnail_gd-library' => 'Неполная конфигурация библиотеки GD, отсутствует функция $1',
'vector-action-move' => 'ย้าย',
'vector-action-protect' => 'ป้องกัน',
'vector-action-undelete' => 'ยกเลิกการลบ',
-'vector-action-unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\84à¹\88าà¸\81ารà¸\9bà¸\81à¸\9bà¹\89à¸à¸\87à¸\82à¹\89à¸à¸¡à¸¹à¸¥',
+'vector-action-unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\84à¹\88าà¸\81ารà¸\9bà¹\89à¸à¸\87à¸\81ัà¸\99',
'vector-simplesearch-preference' => 'เปิดใช้งานคำแนะนำการค้นหาขั้นสูง (สำหรับสกิน Vector เท่านั้น)',
'vector-view-create' => 'สร้าง',
'vector-view-edit' => 'แก้ไข',
'vector-view-history' => 'ดูประวัติ',
'vector-view-view' => 'อ่าน',
'vector-view-viewsource' => 'ดูโค้ด',
-'actions' => 'à¸\81ารà¸\81ระà¸\97ำ',
+'actions' => 'à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81าร',
'namespaces' => 'เนมสเปซ',
'variants' => 'สิ่งที่แตกต่าง',
'delete' => 'ลบ',
'deletethispage' => 'ลบหน้านี้',
'undelete_short' => 'เรียกคืน {{PLURAL:$1|1 การแก้ไข|$1 การแก้ไข}}',
-'viewdeleted_short' => 'ดู{{PLURAL:$1|1 การแก้ไขที่ถูกลบ|$1 การแก้ไขที่ถูกลบ}}',
+'viewdeleted_short' => 'ดู {{PLURAL:$1|1 การแก้ไขที่ถูกลบ|$1 การแก้ไขที่ถูกลบ}}',
'protect' => 'ล็อก',
'protect_change' => 'เปลี่ยน',
'protectthispage' => 'ล็อกหน้านี้',
'badaccess' => 'มีข้อผิดพลาดในการใช้สิทธิ',
'badaccess-group0' => 'คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ร้องขอนี้',
-'badaccess-groups' => 'à¸\81ารà¸\81ระà¸\97ำà¸\97ีà¹\88รà¹\89à¸à¸\87à¸\82à¸à¸\99ีà¹\89สà¸\87วà¸\99à¹\84วà¹\89à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89{{PLURAL:$2|à¸\88าà¸\81à¸\81ลุà¹\88ม|à¸\88าà¸\81กลุ่มใดกลุ่มหนึ่ง ดังนี้}}: $1',
+'badaccess-groups' => 'à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\97ีà¹\88à¸\84ุà¸\93รà¹\89à¸à¸\87à¸\82à¸à¸\99ีà¹\89สà¸\87วà¸\99à¹\84วà¹\89à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\83à¸\99{{PLURAL:$2|à¸\81ลุà¹\88ม|กลุ่มใดกลุ่มหนึ่ง ดังนี้}}: $1',
'versionrequired' => 'ต้องการมีเดียวิกิรุ่น $1',
'versionrequiredtext' => 'ต้องการมีเดียวิกิรุ่น $1 สำหรับใช้งานหน้านี้ ดูเพิ่ม [[Special:Version|รุ่นซอฟต์แวร์]]',
'youhavenewmessages' => 'คุณมี $1 ($2)',
'newmessageslink' => 'ข้อความใหม่',
'newmessagesdifflink' => 'การเปลี่ยนแปลงล่าสุด',
+'youhavenewmessagesfromusers' => 'คุณมี $1 จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)',
+'youhavenewmessagesmanyusers' => 'คุณมี $1 จากผู้ใช้หลายคน ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|ข้อความใหม่|ข้อความใหม่}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|การเปลี่ยนแปลง|การเปลี่ยนแปลง}}ล่าสุด',
'youhavenewmessagesmulti' => 'คุณมีข้อความใหม่ที่ $1',
'editsection' => 'แก้ไข',
'editold' => 'แก้ไข',
'ns-specialprotected' => 'หน้าพิเศษไม่สามารถแก้ไขได้',
'titleprotected' => "หัวเรื่องนี้ได้รับการป้องกันไม่ให้สร้างใหม่ โดย [[User:$1|$1]]
เหตุผลที่ให้ไว้ คือ ''$2''",
+'exception-nologin' => 'ไม่ได้ล็อกอิน',
+'exception-nologin-text' => 'หน้าหรือปฏิบัติการนี้กำหนดให้คุณล็อกอินเข้าสู่วิกินี้ก่อน',
# Virus scanner
'virus-badscanner' => "การตั้งค่าผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: ''$1''",
# Diffs
'history-title' => 'ประวัติรุ่นปรับปรุงของ "$1"',
+'difference-title' => 'ความแตกต่างระหว่างรุ่นของ "$1"',
+'difference-title-multipage' => 'ความแตกต่างระหว่างหน้า "$1" และ "$2"',
'difference-multipage' => '(ความแตกต่างระหว่างหน้าต่างๆ)',
'lineno' => 'แถว $1:',
'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือก',
'allpagesprefix' => 'แสดงหน้าที่ขึ้นต้นด้วย:',
'allpagesbadtitle' => 'ชื่อเรื่องนี้ไม่ถูกต้อง อาจสะกดผิด ลิงก์มาจากภาษาอื่นหรือวิกิอื่น หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้',
'allpages-bad-ns' => '{{SITENAME}} ไม่มีเนมสเปซในชื่อ "$1"',
+'allpages-hide-redirects' => 'ซ่อนการเปลี่ยนทาง',
# Special:Categories
'categories' => 'หมวดหมู่',
'rollback' => 'ย้อนการแก้ไขกลับฉุกเฉิน',
'rollback_short' => 'ย้อนกลับฉุกเฉิน',
'rollbacklink' => 'ย้อนกลับฉุกเฉิน',
+'rollbacklinkcount' => 'ย้อนกลับฉุกเฉิน $1 การแก้ไข',
'rollbackfailed' => 'ย้อนไม่สำเร็จ',
'cantrollback' => 'ไม่สามารถย้อนการแก้ไขได้ เนื่องจากหน้านี้ไม่มีผู้แก้ไขรายอื่นอีก',
'alreadyrolled' => 'ไม่สามารถย้อนรุ่นล่าสุด
# New logging system
'logentry-delete-delete' => '$1 ลบหน้า $3',
'logentry-delete-restore' => '$1 กู้คืนหน้า $3',
+'logentry-delete-event' => '$1 เปลี่ยนทัศนวิสัยของ $5 รายการปูมใน $3: $4',
'revdelete-content-hid' => 'เนื้อหาถูกซ่อน',
'revdelete-summary-hid' => 'คำอธิบายอย่างย่อถูกซ่อน',
'revdelete-uname-hid' => 'ชื่อผู้ใช้ถูกซ่อน',
# Info page
'pageinfo-title' => 'Bilgi için "$1"',
'pageinfo-header-edits' => 'Değişiklikler',
+'pageinfo-header-restrictions' => 'Sayfa koruması',
+'pageinfo-header-properties' => 'Sayfa özellikleri',
+'pageinfo-display-title' => 'Görüntülenen başlık',
+'pageinfo-default-sort' => 'Varsayılan sıralama anahtarı',
+'pageinfo-article-id' => 'Sayfa ID',
+'pageinfo-robot-policy' => 'Arama motoru durumu',
+'pageinfo-robot-index' => 'İndekslenebilir',
+'pageinfo-robot-noindex' => 'İndekslenemez',
'pageinfo-views' => 'Görüntülenme sayısı',
'pageinfo-watchers' => 'İzleyen sayısı',
'pageinfo-redirects-value' => '$1',
+'pageinfo-firstuser' => 'Sayfa oluşturucu',
'pageinfo-edits' => 'Değişiklik sayısı',
# Skin names
'badtitletext' => 'Запитана назва сторінки неправильна, порожня, або неправильно зазначена міжмовна чи міжвікі назва.
Можливо, в назві використовуються недопустимі символи.',
'perfcached' => 'Наступні дані взяті з кешу і можуть бути застарілими. В кеші зберігається не більше {{PLURAL:$1| запису| записів}}.',
-'perfcachedts' => 'Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\96 данÑ\96 взÑ\8fÑ\82Ñ\96 з кеÑ\88Ñ\83, воÑ\81Ñ\82аннÑ\94 вÑ\96н оновлÑ\8eвавÑ\81Ñ\8f о $1. Ð\92 кеÑ\88Ñ\96 збеÑ\80Ñ\96гаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f не бÑ\96лÑ\8cÑ\88е {{PLURAL:$4|запису|записів}}.',
+'perfcachedts' => 'Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\96 данÑ\96 взÑ\8fÑ\82Ñ\96 з кеÑ\88Ñ\83, воÑ\81Ñ\82аннÑ\94 вÑ\96н оновлÑ\8eвавÑ\81Ñ\8f о $1. У кеÑ\88Ñ\96 збеÑ\80Ñ\96гаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f не бÑ\96лÑ\8cÑ\88е $4 {{PLURAL:$4|запису|записів}}.',
'querypage-no-updates' => 'Зміни цієї сторінки зараз заборонені. Дані тут не можуть бути оновлені зараз.',
'wrong_wfQuery_params' => 'Неприпустима параметри функцій wfQuery()<br />
Функція: $1<br />
'timezoneregion-indian' => 'Індійський океан',
'timezoneregion-pacific' => 'Тихий океан',
'allowemail' => 'Дозволити електронну пошту від інших користувачів',
-'prefs-searchoptions' => 'Ð\9fаÑ\80амеÑ\82Ñ\80и поÑ\88Ñ\83кÑ\83',
+'prefs-searchoptions' => 'Ð\9fоÑ\88Ñ\83к',
'prefs-namespaces' => 'Простори назв',
'defaultns' => 'Інакше шукати в таких просторах назв:',
'default' => 'за умовчанням',
Tên người dùng có phân biệt chữ hoa chữ thường.
Hãy kiểm tra lại chính tả, hoặc [[Special:UserLogin/signup|mở tài khoản mới]].',
'nosuchusershort' => 'Không có thành viên nào có tên “$1”. Xin hãy kiểm tra lại chính tả.',
-'nouserspecified' => 'Bạn phải đưa ra tên đăng ký.',
+'nouserspecified' => 'Bạn phải chỉ định một tên người dùng.',
'login-userblocked' => 'Thành viên này đã bị cấm. Không cho phép đăng nhập.',
'wrongpassword' => 'Mật khẩu sai. Xin vui lòng nhập lại.',
'wrongpasswordempty' => 'Bạn chưa gõ vào mật khẩu. Xin thử lần nữa.',
'passwordremindertext' => 'Ai đó (có thể là bạn, có địa chỉ IP $1) đã yêu cầu chúng tôi gửi mật khẩu mới của {{SITENAME}} ($4). Chúng tôi đã tạo một mật khẩu tạm “$3” cho thành viên “$2”. Nếu bạn chính là người đã yêu cầu mật khẩu, bạn cần phải đăng nhập và thay đổi mật khẩu ngay bây giờ. Mật khẩu tạm sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}.
Nếu bạn không yêu cầu gửi mật khẩu mới, hoặc bạn đã nhớ ra mật khẩu cũ của mình và không còn muốn đổi nó nữa, bạn có thể bỏ qua bức thư này và tiếp tục sử dụng mật khẩu cũ của bạn.',
-'noemail' => 'Thành viên “$1” không đăng ký thư điện tử.',
+'noemail' => 'Thành viên “$1” không ghi thư điện tử.',
'noemailcreate' => 'Bạn cần cung cấp một địa chỉ thư điện tử hợp lệ',
'passwordsent' => 'Mật khẩu mới đã được gửi tới thư điện tử của thành viên “$1”. Xin đăng nhập lại sau khi nhận thư.',
'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh lạm dụng.',
* Mục tiêu cấm: $7
Bạn có thể liên hệ với $1 hoặc một [[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.
-Bạn không thể sử dụng tính năng “gửi thư cho người này” trừ khi bạn đã đăng ký một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn tài khoản]] và bạn không bị khóa chức năng đó.
+Bạn không thể sử dụng tính năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn tài khoản]] và bạn không bị khóa chức năng đó.
Địa chỉ IP hiện tại của bạn là $3, và mã số cấm là #$5.
Xin hãy ghi kèm tất cả các thông tin trên vào thư yêu cầu của bạn.",
'autoblockedtext' => "Địa chỉ IP của bạn đã bị tự động cấm vì một người nào đó đã sử dụng nó, $1 là thành viên đã thực hiện cấm.
Bạn có thể liên hệ với $1 hoặc một trong số các
[[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.
-Chú ý rằng bạn sẽ không dùng được chức năng “gửi thư cho người này” trừ khi bạn đã đăng ký một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn]] và bạn không bị cấm dùng chức năng đó.
+Chú ý rằng bạn sẽ không dùng được chức năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn]] và bạn không bị cấm dùng chức năng đó.
Địa chỉ IP hiện tại của bạn là $3, mã số cấm là $5.
Xin hãy ghi kèm tất cả các chi tiết trên vào thư yêu cầu của bạn.",
Lỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến phiên bản cũ của một trang đã bị xóa.
Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].',
-'userpage-userdoesnotexist' => 'Tài khoản mang tên “<nowiki>$1</nowiki>” chưa được đăng ký. Xin hãy kiểm tra lại nếu bạn muốn tạo/sửa trang này.',
-'userpage-userdoesnotexist-view' => 'Tài khoản “$1” chưa được đăng ký.',
+'userpage-userdoesnotexist' => 'Đây chưa có tài khoản với tên “<nowiki>$1</nowiki>”. Xin hãy kiểm tra lại nếu bạn muốn tạo hay sửa trang này.',
+'userpage-userdoesnotexist-view' => 'Chưa có tài khoản với tên “$1”.',
'blocked-notice-logextract' => 'Người dùng này hiện đang bị cấm sửa đổi. Nhật trình cấm gần nhất được ghi ở dưới để tiện theo dõi:',
'clearyourcache' => "'''Chú ý:''' Sau khi lưu trang, có thể bạn sẽ phải xóa bộ nhớ đệm của trình duyệt để xem các thay đổi.
-* '''Firefox / Safari:''' Giữ phím ''Shift'' trong khi nhấn ''Reload'' (''Tải lại''), hoặc nhấn tổ hợp ''Ctrl-F5'' hay ''Ctrl-R'' (⌘R trên Mac)
+* '''Firefox / Safari:''' Giữ phím ''Shift'' trong khi nhấn ''Tải lại'' (''Reload''), hoặc nhấn tổ hợp ''Ctrl-F5'' hay ''Ctrl-R'' (⌘R trên Mac)
* '''Google Chrome:''' Nhấn tổ hợp ''Ctrl-Shift-R'' (⇧⌘R trên Mac)
-* '''Internet Explorer:''' Giữ phím ''Ctrl'' trong khi nhấn ''Refresh'', hoặc nhấn tổ hợp ''Ctrl-F5''
-* '''Opera:''' Xóa bộ nhớ đệm trong ''Tools → Preferences''",
+* '''Internet Explorer:''' Giữ phím ''Ctrl'' trong khi nhấn ''Làm tươi'' (''Refresh''), hoặc nhấn tổ hợp ''Ctrl-F5''
+* '''Opera:''' Xóa bộ nhớ đệm trong ''Công cụ → Sở thích'' (''Tools → Preferences'')",
'usercssyoucanpreview' => "'''Mẹo:''' Sử dụng nút “{{int:showpreview}}” để kiểm thử bản CSS của bạn trước khi lưu trang.",
'userjsyoucanpreview' => "'''Mẹo:''' Sử dụng nút “{{int:showpreview}}” để kiểm thử bản JS của bạn trước khi lưu trang.",
'usercsspreview' => "'''Hãy nhớ rằng bạn chỉ đang xem thử trang CSS cá nhân của bạn.
Bảo quản viên khi khóa dữ liệu đã đưa ra lý do: $1",
'protectedpagewarning' => "'''Cảnh báo: Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể sửa được.'''
Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
-'semiprotectedpagewarning' => "'''Lưu ý:''' Trang này đã bị khóa và chỉ có các thành viên đã đăng ký mới có thể sửa đổi được.
+'semiprotectedpagewarning' => "'''Lưu ý:''' Trang này đã bị khóa nên chỉ có các thành viên có tài khoản mới có thể sửa đổi được.
Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
'cascadeprotectedwarning' => "'''Cảnh báo:''' Trang này đã bị khóa, chỉ có thành viên có quyền quản lý mới có thể sửa đổi được, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} bị khóa theo tầng sau:",
'titleprotectedwarning' => "'''Cảnh báo: Trang này đã bị khóa và bạn phải có một số [[Special:ListGroupRights|quyền nhất định]] mới có thể tạo trang.'''
'username' => 'Tên người dùng:',
'uid' => 'Số thứ tự thành viên:',
'prefs-memberingroups' => 'Thành viên của {{PLURAL:$1|nhóm|nhóm}}:',
-'prefs-registration' => 'Thời điểm đăng ký:',
+'prefs-registration' => 'Lúc mở tài khoản:',
'yourrealname' => 'Tên thật:',
'yourlanguage' => 'Ngôn ngữ:',
'yourvariant' => 'Dạng chữ của nội dung:',
'statistics-views-total' => 'Số lần xem tổng cộng',
'statistics-views-total-desc' => 'Không bao gồm số lần xem các trang không tồn tại và các trang đặc biệt',
'statistics-views-peredit' => 'Số lần xem trên một sửa đổi',
-'statistics-users' => 'Số [[Special:ListUsers|thành viên]] đã đăng ký',
+'statistics-users' => 'Số [[Special:ListUsers|thành viên]] có tài khoản',
'statistics-users-active' => 'Số thành viên tích cực',
'statistics-users-active-desc' => 'Những thành viên đã hoạt động trong {{PLURAL:$1|ngày|$1 ngày}} qua',
'statistics-mostpopular' => 'Các trang được xem nhiều nhất',
'protect-cascadeon' => 'Trang này hiện bị khóa vì nó được nhúng vào {{PLURAL:$1|những trang|trang}} dưới đây bị khóa với tùy chọn “khóa theo tầng” được kích hoạt. Bạn có thể đổi mức độ khóa của trang này, nhưng nó sẽ không ảnh hưởng đến việc khóa theo tầng.',
'protect-default' => 'Cho phép mọi thành viên',
'protect-fallback' => 'Cần quyền “$1”',
-'protect-level-autoconfirmed' => 'Cấm thành viên mới và thành viên chưa đăng ký',
+'protect-level-autoconfirmed' => 'Cấm thành viên mới và người dùng chưa mở tài khoản',
'protect-level-sysop' => 'Cấm mọi thành viên (trừ bảo quản viên)',
'protect-summary-cascade' => 'khóa theo tầng',
'protect-expiring' => 'hết hạn $1 (UTC)',
'movearticle' => 'Di chuyển trang:',
'moveuserpage-warning' => "'''Cảnh báo:''' Bạn sắp di chuyển trang cá nhân của người dùng. Xin lưu ý rằng chỉ có trang này sẽ được di chuyển, còn người dùng sẽ ''không'' đổi tên.",
'movenologin' => 'Chưa đăng nhập',
-'movenologintext' => 'Bạn phải là thành viên đã đăng ký và [[Special:UserLogin|đăng nhập]] mới di chuyển trang được.',
+'movenologintext' => 'Bạn phải là thành viên đã mở tài khoản và [[Special:UserLogin|đăng nhập]] mới di chuyển trang được.',
'movenotallowed' => 'Bạn không có quyền di chuyển trang.',
'movenotallowedfile' => 'Bạn không có đủ quyền để di chuyển tập tin.',
'cant-move-user-page' => 'Bạn không có quyền di chuyển trang cá nhân (ngoại trừ trang con).',
'imageinvalidfilename' => 'Tên tập tin đích không hợp lệ',
'fix-double-redirects' => 'Cập nhật tất cả các trang đổi hướng chỉ đến tựa đề cũ',
'move-leave-redirect' => 'Để lại trang đổi hướng',
-'protectedpagemovewarning' => "'''Cảnh báo:''' Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể di chuyển được.
+'protectedpagemovewarning' => "'''Cảnh báo:''' Trang này đã bị khóa nên chỉ có các thành viên có quyền quản lý mới có thể di chuyển được.
Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
-'semiprotectedpagemovewarning' => "'''Lưu ý:''' Trang này đã bị khóa và chỉ có các thành viên đã đăng ký mới có thể di chuyển được.
+'semiprotectedpagemovewarning' => "'''Lưu ý:''' Trang này đã bị khóa nên chỉ có các thành viên có tài khoản mới có thể di chuyển được.
Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
'move-over-sharedrepo' => '== Tập tin đã tồn tại ==
[[:$1]] đã tồn tại trong kho dùng chung. Nếu đổi tên tập tin thành tên này thì sẽ ghi đè lên tập tin dùng chung.',
'confirmemail_error' => 'Có trục trặc khi lưu xác nhận của bạn.',
'confirmemail_subject' => 'Xác nhận thư điện tử tại {{SITENAME}}',
'confirmemail_body' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1,
-đã đăng ký tài khoản có tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
+đã mở tài khoản có tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
Để xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng thư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:
$3
-Nếu bạn *không* đăng ký tài khoản, hãy nhấn vào liên kết này
+Nếu bạn *không* mở tài khoản, hãy nhấn vào liên kết này
để hủy thủ tục xác nhận địa chỉ thư điện tử:
$5
Mã xác nhận này sẽ hết hạn vào $4.',
-'confirmemail_body_changed' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1, đã đăng ký tài khoản có
+'confirmemail_body_changed' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1, đã mở tài khoản có
tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
Để xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng
'vector-action-protect' => 'Panalipda',
'vector-action-undelete' => 'Igbalik an ginpara',
'vector-action-unprotect' => 'Liwani an panalipod',
+'vector-simplesearch-preference' => 'Ginpadulot an yinano nga pamiling nga kahon (Panit vector la)',
'vector-view-create' => 'Himo-a',
'vector-view-edit' => 'Igliwat',
'vector-view-history' => 'Kitaa an kaagi',
'exception-nologin-text' => 'Ini nga pakli o pagbuhat in nagkikinahanglan nga ikaw in mag-log-in ha dinhi nga wiki.',
# Virus scanner
+'virus-scanfailed' => 'Nagpalya an pag-scan (kodigo $1)',
'virus-unknownscanner' => 'diri-nasasabtan nga antivirus:',
# Login and logout pages
'login-abort-generic' => 'An imo paglog-in in diri malinamposon - Naundang',
'loginlanguagelabel' => 'Pinulongan: $1',
+# E-mail sending
+'php-mail-error-unknown' => 'Waray kasabti ha kanan PHP mail() function.',
+
# Change password dialog
'resetpass' => 'Igliwat an tigaman-pagsulod',
'resetpass_header' => 'Igliwan an akawnt nga tigaman-pagsulod',
'oldpassword' => 'Daan nga tigaman-pagsulod:',
'newpassword' => 'Bag-o nga tigaman-pagsulod:',
'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
+'resetpass_success' => 'Malinamposon nga nasalyuan na an imo tigaman-pagsulod!
+Ikaw in naglalog-in yana...',
'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
# Special:PasswordReset
'passwordreset' => 'igreset an tigaman-hit-pagsulod',
'passwordreset-text' => 'Kompletoha ini nga porma para makakarawat hin email hin pahinumdom han detalye han akawnt.',
+'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
'passwordreset-username' => 'Agnay hiton gumaramit:',
'passwordreset-domain' => 'Dominyo:',
'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
'passwordreset-emailelement' => 'Agnay han gumaramit: $1
Temporaryo nga tigaman han pagsakob: $2',
'passwordreset-emailsent' => 'Ginpadara hin usa ka pahinumdom nga e-mail.',
+'passwordreset-emailsent-capture' => 'Mayda pahinumdom nga ginpadangat ha im e-mail, kun diin ini in ginpapakita ha ubos.',
+'passwordreset-emailerror-capture' => 'Mayda pahinumdom nga e-mail han nahimo, kun diin ini in ginpapakita ha ubos, pero an pagpadangat ngada ha gumaramit in nagpalya: $1',
# Special:ChangeEmail
'changeemail' => 'Igliwan an e-mail address',
'showdiff' => 'Igpakita an mga ginliwat',
'anoneditwarning' => "'''Pahimatngon:''' Diri ka pa naka log-in.
An imo IP address in maitatala ha kaagi hinin pakli han pagliwat.",
+'anonpreviewwarning' => "''Diri ka naka-log in. Mahisusurat an imo IP address ngada ha kanan pakli kaagi hit pagliwat kun igtipig nimo.''",
'missingsummary' => "'''Pahinumdom:''' Waray ka nagbutang hin dalikyat nga sumat han pagliwat.
Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bisan waray hini.",
'missingcommenttext' => 'Alayon pagbutang hin komento ha ilarom.',
'blockednoreason' => 'waray katadungan nga ginhatag',
'whitelistedittext' => 'Kinahanglan mo mag-$1 para makaliwat han mga pakli.',
'nosuchsectiontitle' => 'Waray kaagi-i an bahin',
+'nosuchsectiontext' => 'Imo ginliwat an seksyon nga waray dida.
+Ini in puydi binmalhin o napara samtang ikaw in nagkikita han pakli.',
'loginreqtitle' => 'Nagkikinahanglan hin pan-sakob',
'loginreqlink' => 'Magpasabot nga masakob',
'loginreqpagetext' => 'Kinahanglan mo mag-$1 para makakita ha iba nga mga pakli.',
'template-protected' => '(pinaliporan)',
'template-semiprotected' => '(katunga nga pinasaliporan)',
'hiddencategories' => 'Ini nga pakli in api han {{PLURAL:$1|1 nakatago nga kaarangay|$1 nakatago nga kaarangay}}:',
+'nocreatetitle' => 'Limitado an pahimo hin pakli',
'nocreate-loggedin' => 'Diri ka gintutugotan paghimo hin mga bag-o nga pakli.',
+'sectioneditnotsupported-title' => 'Diri suportado han pagliwat han seksyon',
+'sectioneditnotsupported-text' => 'Diri suportado an pagliwat han seksyon ha dinhi nga pakli.',
'permissionserrors' => 'Mga sayop hin mga pagtugot',
'permissionserrorstext' => 'Diri ka gintutugotan pagbuhat hito, mahitungod han mga nasunod nga {{PLURAL:$1|katadungan|mga katadungan}}:',
'permissionserrorstext-withaction' => 'Waray ka permiso han $2, tungod han masunod nga {{PLURAL:$1|rason|mga rason}}:',
'edit-already-exists' => 'Diri nakakahimo hin bag-o nga pakli.
Aada na ito.',
'defaultmessagetext' => 'Aada-nga-daan nga teksto han mensahe',
+'content-not-allowed-here' => 'An sulod nga "$1" in diri gintutugotan ha pakli nga [[$2]]',
# Content models
'content-model-wikitext' => 'wikiteksto',
'rev-suppressed-no-diff' => "Diri mo makikita ini nga kaibhan tungod nga usa ha mga rebisyon in '''ginpara'''.",
'rev-delundel' => 'igpakita/igtago',
'rev-showdeleted' => 'igpakita',
+'revisiondelete' => 'Pagpara/pagtanggal han pagpara nga mga rebisyon',
+'revdelete-nologtype-title' => 'Waray ginhatag nga klase hit talaan',
'revdelete-show-file-confirm' => 'Sigurado ka nga gusto mo makita an ginpara nga pagliwat han file "<nowiki>$1</nowiki>" tikang $2 ha $3?',
'revdelete-show-file-submit' => 'Oo',
+'revdelete-hide-text' => 'Tagoon an rebisyon han teksto',
+'revdelete-hide-image' => 'Tagoon an sulod han paypay',
+'revdelete-hide-name' => 'Tagoon an buhat ngan kakadtoan',
+'revdelete-hide-comment' => 'Tagoon an dalikyat nga sumat han pagliwat',
'revdelete-radio-same' => '(ayaw balyu-e)',
'revdelete-radio-set' => 'Oo',
'revdelete-radio-unset' => 'Ayaw',
'mergehistory' => 'Igtampo an mga kasaysayan han pakli',
'mergehistory-from' => 'Ginkuhaan nga pakli:',
'mergehistory-into' => 'Kakadtoan nga pakli:',
+'mergehistory-submit' => 'Igtampo an mga rebisyon',
+'mergehistory-empty' => 'Waray mga rebisyon in puydi matampo.',
'mergehistory-no-source' => 'Waray pa an tinikangan nga pakli nga $1.',
'mergehistory-no-destination' => 'Waray pa an kakadtuan nga pakli nga $1.',
+'mergehistory-comment' => 'Gintampo an [[:$1]] ngada ha [[:$2]]: $3',
'mergehistory-same-destination' => 'An gintikangan ngan kakadtoan nga mga pakli in diri puydi magkaparo',
'mergehistory-reason' => 'Katadungan:',
# Merge log
+'mergelog' => 'Talaan hin pagtampo',
'revertmerge' => 'Igbulag an gintampo',
# Diffs
'history-title' => "Kaagi han pagbag-o han ''$1''",
+'difference-multipage' => '(Kaibhan ha butnga han mga pakli)',
'lineno' => 'Bagis $1:',
'compareselectedversions' => 'Igkumpara an mga pinili nga pagbabag-o',
'editundo' => 'Igpawara an ginbuhat',
# Search results
'searchresults' => 'Mga nabilingan han pagbiling',
'searchresults-title' => 'Mga nabilngan han pagbiling para han "$1"',
+'searchsubtitleinvalid' => "Imo ginpamiling an '''$1'''",
+'toomanymatches' => 'Sobra kadamo nga mga igo an ginbalik, alayon pagbuhat hin iba nga pakiana',
'prevn' => 'naha-una nga {{PLURAL:$1|$1}}',
'nextn' => 'sunod nga {{PLURAL:$1|$1}}',
'prevn-title' => 'Nahiuna $1 {{PLURAL:$1|resulta|mga resulta}}',
'search-suggest' => 'Buot sidngon mo ba: $1',
'search-interwiki-caption' => 'Mga bugto nga proyekto',
'search-interwiki-default' => '$1 nga resulta:',
+'search-interwiki-more' => '(damo pa)',
'search-relatedarticle' => 'kasumapy',
'searchrelated' => 'kadugtong',
'searchall' => 'ngatanan',
'search-nonefound' => 'Waray resulta an nakakabaton han pakiana.',
'powersearch' => 'Abansado nga pagbiling',
'powersearch-legend' => 'Abansado nga pagbiling',
+'powersearch-ns' => "Pamiling ha mga ngaran-lat'ang:",
+'powersearch-redir' => 'Talaan hin mga redirect',
'powersearch-field' => 'Bilnga an',
'powersearch-togglelabel' => 'Panginano-a:',
'powersearch-toggleall' => 'Ngatanan',
'preferences' => 'Mga karuyag',
'mypreferences' => 'Akon mga karuyag',
'prefs-edits' => 'Ihap han mga pagliwat:',
+'prefsnologin' => 'Diri nakalog-in',
'changepassword' => 'Igliwan an tigaman-pagsulod',
'prefs-skin' => 'Panit',
'skin-preview' => 'Pahiuna nga pagawas',
'datedefault' => 'Waray pinaurog nga karuyag',
'prefs-datetime' => 'Pitsa ngan oras',
+'prefs-user-pages' => 'Mga pakli hin gumaramit',
'prefs-personal' => 'Pangilal-an han nagamit',
'prefs-rc' => 'Kalalabay la nga mga pagbabag-o',
'prefs-watchlist-days' => 'Mga adlaw nga makikita ha barantayan:',
+'prefs-watchlist-days-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
+'prefs-watchlist-edits-max' => 'Pinakadako nga ihap: 1000',
'prefs-resetpass' => 'Igliwan an tigaman-pagsulod',
+'prefs-changeemail' => 'Igliwan an e-mail address',
+'prefs-email' => 'Mga pagpipilian han e-mail',
'prefs-rendering' => 'Hitsura',
'saveprefs' => 'Igtipig',
'resetprefs' => 'Pabay-i an diri nakatipig nga mga pagbabag-o',
'columns' => 'Mga rumbay patindog:',
'searchresultshead' => 'Bilnga',
'resultsperpage' => 'Mga igo kada pakli:',
+'stub-threshold-disabled' => 'Waray ginpagana',
+'recentchangesdays-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
'savedprefs' => 'Gintipig an im karuyag.',
'timezonelegend' => 'Zona hin oras',
'localtime' => 'Oras nga lokal',
+'timezoneuseserverdefault' => 'Gamita an aada-nga-daan han wiki ($1)',
'servertime' => 'Oras han serbidor:',
'guesstimezone' => 'Butanga tikang han panngaykay(browser)',
'timezoneregion-africa' => 'Aprika',
'prefs-info' => 'Panguna nga pananabotan',
'prefs-i18n' => 'Internasyonalisasyon',
'prefs-signature' => 'Pirma',
+'prefs-dateformat' => 'Batakan han petsa',
'prefs-advancedediting' => 'Abansado nga mga pagpipilian',
'prefs-advancedrc' => 'Abansado nga mga pagpipilian',
'prefs-advancedrendering' => 'Abansado nga mga pagpipilian',
'prefs-advancedsearchoptions' => 'Abansado nga mga pagpipilian',
'prefs-advancedwatchlist' => 'Abansado nga mga pagpipilian',
+'prefs-displayrc' => 'Mga pirilion hiunong han ginpapakita',
+'prefs-displaysearchoptions' => 'Mga pirilion hiunong han ginpapakita',
+'prefs-displaywatchlist' => 'Mga pirilion hiunong han ginpapakita',
'prefs-diffs' => 'Mga kaibhan',
# User preference: e-mail validation using jQuery
'userrights-lookup-user' => 'Pagdumaraa han mga hugpo han gumaramit',
'userrights-user-editname' => 'Igbutang an agnay han gumaramit:',
'editusergroup' => 'Igliwat han mga hugpo han gumaramit',
-'editinguser' => "Igliliwat an mga katungod han gumaramit han gumaramit '''[[Gumaramit:$1|$1]]''' $2",
+'editinguser' => "Igliliwat an mga katungod han gumaramit han gumaramit '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Igliwat an mga hugpo hin gumaramit',
'saveusergroups' => 'Igtipig an mga hugpo han gumaramit',
'userrights-groupsmember' => 'Api han:',
'right-block' => 'Pugnga an iba nga mga gumaramit ha pagliwat',
'right-blockemail' => 'Pugnga an uska gumaramit tikang ha pagpadangat hin e-mail',
'right-hideuser' => 'Pugnga an uska agnay-hin-gumaramit, tago-a ito tikang ha publiko',
+'right-unblockself' => 'Lugaring nga makakatanggal han pagpugong',
+'right-editusercssjs' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS ngan JavaScript',
+'right-editusercss' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS',
+'right-edituserjs' => 'Iliwat an kanan iba mga gumaramit nga paypay han JavaScript',
+'right-import' => 'Man-aangbit hin mga pakli tikang ha iba nga mga wiki',
+'right-importupload' => 'Man-aangbit hin mga pakli tikang ha uska paypay nga iginkarga-pasaka',
+'right-mergehistory' => 'Igtampo an kaagi han mga pakli',
+'right-userrights' => 'Igliwat an ngatanan nga mga katungod han gumaramit',
+'right-userrights-interwiki' => 'Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki',
+'right-sendemail' => 'Padad-i hin e-mail ngada ha iba nga mga gumaramit',
# User rights log
+'rightslog' => 'Talaan hin mga katungod han gumaramit',
'rightsnone' => '(waray)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'basaha ini nga pakli',
'action-edit' => 'liwata ini nga pakli',
'action-createpage' => 'pahimo hin mga pakli',
+'action-createtalk' => 'Paghimo hin hiruhimangraw nga mga pakli',
+'action-createaccount' => 'Himoa ini nga akawnt hin gumaramit',
'action-minoredit' => 'butanga hin tigaman hinin nga pagliwat komo gutiay',
'action-move' => 'balhina ini nga pakli',
+'action-move-subpages' => 'igbalhin ini nga pakli, ngan iya mga bahin-pakli',
+'action-move-rootuserpages' => 'Igbalhin an gamot nga mga pakli han gumaramit',
'action-movefile' => 'igbalhin ini nga paypay',
'action-upload' => 'igkarga-pasaka ini nga paypay',
'action-reupload' => 'igsapaw ini nga aanhi nga paypay',
+'action-upload_by_url' => 'igkaraga-pasaka ini nga paypay tikang ha uska URL',
'action-delete' => 'paraa ini nga pakli',
'action-deleterevision' => 'igpara ini nga pagbag-o',
+'action-deletedhistory' => 'kitaa an kanan hini nga pakli kaagi han mga ginpara',
+'action-browsearchive' => 'Pamiling hin mga ginpara nga mga pakli',
+'action-undelete' => 'Balika an ginpara hini nga pakli',
+'action-suppressionlog' => 'kitaa an kanan hini pribado nga talaan',
+'action-block' => 'Pugnga ini nga gumaramit ha pagliwat',
+'action-protect' => 'igsaliwan an katupngan han pananalipod para hini nga pakli',
+'action-import' => 'ig-angbit ini nga pakli tikang ha iba nga wiki',
+'action-importupload' => 'ig-angbit ini nga pakli tikang ha uska ginkarga-pasaka nga paypay',
+'action-mergehistory' => 'Igtampo an kaagi hini nga pakli',
+'action-userrights' => 'Igliwat an ngatanan nga mga katungod han gumaramit',
+'action-sendemail' => 'Padara hin mga e-mail',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|pagbag-o|mga pagbabag-o}}',
'newpageletter' => 'B',
'boteditletter' => 'b',
'rc_categories_any' => 'Bisan ano nga',
+'newsectionsummary' => '/* $1 */ bag-o nga bahin',
'rc-enhanced-expand' => 'Igpakita an detalye (nagkikinahanglan hin JavaScript)',
'rc-enhanced-hide' => 'Igtago an mga detalye',
+'rc-old-title' => 'orihinal nga ginhimo komo "$1"',
# Recent changes linked
'recentchangeslinked' => 'Mga may kalabotan nga binag-o',
# Upload
'upload' => 'Pagkarga hin file',
'uploadbtn' => 'Igkarga an file',
+'reuploaddesc' => 'Undanga an pagkarga-pasaka ngan balik ngadto ha porma han pagkarga-pasaka',
'uploadnologin' => 'Diri nakalog-in',
+'uploaderror' => 'Sayop hit pagkarga-pasaka',
'upload-recreate-warning' => "'''Pahimatngon: An fayl nga may-ada hiton nga ngaran in ginpara o ginbalhin.'''
An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
+'upload-permitted' => 'Gintutugotan nga mga klase han paypay: $1.',
+'upload-prohibited' => 'Gindidire nga mga klase han paypay: $1.',
'uploadlog' => 'Talaan hin ginkarga-pasaka',
'uploadlogpage' => 'Talaan han mga ginkarga-paigbaw',
'filename' => 'Ngaran han fayl',
'filereuploadsummary' => 'Mga pagbal-iw ha fayl:',
'filesource' => 'Tinikangan:',
'ignorewarning' => 'Pabay-i an pahimatngon ngan igtipig la ngahaw',
+'ignorewarnings' => 'Pasagdi an bisan ano nga mga pahimatngon',
'filename-toolong' => 'Iton ngaran hin paypay in diri puyde na mas lapos pa ha 240 ka mga byte.',
'badfilename' => 'An ngaran-han-paypay in ginliwat ngada ha "$1".',
'filename-tooshort' => 'An ngaran han fayl in halipot hin duro.',
'unknown-error' => 'Nahitabo an waray kasasabti nga sayop.',
'tmp-create-error' => 'Diri makakahimo hin temporaryo nga paypay.',
'tmp-write-error' => 'Sayop ha pagsurat hin temporaryo nga paypay.',
+'large-file' => 'Ginrerekomenda nga it mga paypay in diri malapos hin $1;
+ini nga paypay in $2.',
'largefileserver' => 'Ini nga paypay in durudako kaysa ha ginpapakarawat han serbidor.',
'uploadwarning' => 'Pahimatngon han pagkarga paigbaw',
'savefile' => 'Igtipig an paypay',
'upload-proto-error' => 'Sayop nga protocol',
'upload-file-error' => 'Sayop ha sulod',
'upload-unknown-size' => 'Waray kasabti an kadako',
+'upload-http-error' => 'Mayda nahitabo nga sayop hin HTTP: $1',
# File backend
+'backend-fail-notexists' => 'Waray ngada an paypay nga $1.',
'backend-fail-delete' => 'Diri nakakapara han paypay nga "$1".',
'backend-fail-alreadyexists' => 'May-ada na paypay nga "$1".',
-'backend-fail-store' => 'Diri nakakatipig han paypay "$1" ha "$".',
+'backend-fail-store' => 'Diri nakakatipig han paypay "$1" ha "$2".',
'backend-fail-copy' => 'Diri nakakakopya han paypay nga "$1" ngada "$2".',
'backend-fail-move' => 'Diri nakakabalhin han paypay "$1" ngada "$2".',
'backend-fail-opentemp' => 'Diri nakakaabre han temporaryo nga paypay.',
# img_auth script messages
'img-auth-accessdenied' => 'Diri gintutugutan makasulod',
+'img-auth-nofile' => 'Waray ngada an paypay nga "$1".',
# HTTP errors
'http-host-unreachable' => 'Diri nakakaabot ha URL.',
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Diri nakakaabot ha URL',
+'upload-curl-error28' => 'Linmapos ha oras an pagkarga-pasaka',
+
'license' => 'Palilisensya:',
'license-header' => 'Palilisensya:',
'nolicense' => 'Waray napili',
Alayon pagkita han [$2 nga pakli hin pagpahayag mahitungod hini nga fayl] para hin dugang nga kasayuran.',
'sharedupload-desc-here' => 'An fayl in tikang ha $1 ngan puydi mahigamitan para han iba nga mga proyekto.
An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakita ha sirong.',
+'uploadnewversion-linktext' => 'Igkarga-pasaka an ba-o nga bersyon hini nga paypay',
'shared-repo-from' => 'tikang $1',
+'upload-disallowed-here' => 'Diri nimo masasapaw ini nga paypay.',
# File reversion
'filerevert-comment' => 'Rason:',
'filedelete-success' => "Napara an '''$1'''",
'filedelete-otherreason' => 'Lain/dugang nga katadungan:',
'filedelete-reason-otherlist' => 'Lain nga katadungan',
+'filedelete-edit-reasonlist' => 'Igliwat an mga rason han pagpara',
+'filedelete-maintenance-title' => 'Diri nakakapara han paypay',
# MIME search
+'mimesearch' => 'MIME nga pamiling',
+'mimetype' => 'MIME nga klase:',
'download' => 'pagkarga paubos',
+# List redirects
+'listredirects' => 'Talaan hin mga redirect',
+
# Unused templates
+'unusedtemplates' => 'Waray kagamiti nga mga batakan',
'unusedtemplateswlh' => 'iba nga mga sumpay',
# Random page
'disambiguations' => 'Mga pakli nga nasumpay ha mga pansayod nga pakli',
'disambiguationspage' => 'Template:pansayod',
+'brokenredirects' => 'Mga redirect nga utod',
'brokenredirects-edit' => 'igliwat',
'brokenredirects-delete' => 'paraa',
+'withoutinterwiki' => 'Mga pakli nga waray sumpay nga yinaknan',
'withoutinterwiki-submit' => 'Igpakita',
+'fewestrevisions' => 'Mga pakli nga may pinakagutiay nga mga rebisyon',
+
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|nga byte|nga mga byte}}',
'ncategories' => '$1 {{PLURAL:$1|nga kaarangay|nga mga kaarangay}}',
'prefixindex' => 'Ngatanan nga pakli nga may-ada pahiuna-nga-sumpay',
'shortpages' => 'Haglipot nga mga pakli',
'longpages' => 'Haglaba nga mga pakli',
+'deadendpages' => 'Waray na kakadtoan nga mga pakli',
+'protectedpages' => 'Pinapasaliporan nga mga pakli',
'listusers' => 'Lista han mga gumaramit',
+'listusers-creationsort' => 'Ginsusunodsunod pinaagi han paghimo nga petsa',
+'usereditcount' => '$1 {{PLURAL:$1|ka pagliwat|ka mga pagliwat}}',
'usercreated' => '{{GENDER:$3|Ginhimo}} han $1 ha $2',
'newpages' => 'Bag-o nga mga pakli',
'newpages-username' => 'Agnay hiton gumaramit:',
'move' => 'Balhina',
'movethispage' => 'Balhina ini nga pakli',
'notargettitle' => 'Waray iiguon',
+'nopagetitle' => 'Waray sugad hito nga kakadtoan nga pakli',
'pager-newer-n' => '{{PLURAL:$1|burubag-o 1|burubag-o $1}}',
'pager-older-n' => '{{PLURAL:$1|durudaan 1|durudaan $1}}',
'specialloguserlabel' => 'Magburuhat:',
'speciallogtitlelabel' => 'iiguon (titulo o gumarami):',
'log' => 'Mga talaan',
+'all-logs-page' => 'Ngatanan nga mga talaan panpubliko',
# Special:AllPages
'allpages' => 'Ngatanan nga mga pakli',
'allpagesprev' => 'Naha-una',
'allpagesnext' => 'Sunod',
'allpagessubmit' => 'Kadto-a',
+'allpages-bad-ns' => '{{SITENAME}} in waray ngaran-lat\'ang nga "$1".',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Igkita an pinakaurhi.',
# Special:Categories
'categories' => 'Mga kaarangay',
# E-mail user
'emailuser' => 'Ig-e-mail ini nga gumaramit',
+'emailuser-title-target' => 'Ig-E-mail ini nga {{HENERO:$1|gumaramit}}',
+'emailuser-title-notarget' => 'Gumaramit han e-mail',
+'emailpage' => 'Gumaramit han e-mail',
+'defemailsubject' => '{{SITENAME}} e-mail tikang kan gumaramit na hi "$1"',
+'usermaildisabled' => 'Waray ginpagana an e-mail han gumaramit',
+'usermaildisabledtext' => 'Diri ka makakapadangat hin e-mail ha iba nga mga gumaramit ha dinhi nga wiki',
+'noemailtitle' => 'Waray e-mail address',
+'nowikiemailtitle' => 'Waray gintutugutan nga e-mail',
'emailusername' => 'Agnay hiton gumaramit:',
'emailfrom' => 'Tikang kan:',
'emailto' => 'Para kan:',
'emailccme' => 'Igemail ako hini nga kopya hit ak buot igpasabot.',
'emailsent' => 'Napadara an e-mail',
+# User Messenger
+'usermessage-summary' => 'Nabilin hin mensahe pansistema',
+'usermessage-editor' => 'Mensahero han sistema',
+
# Watchlist
'watchlist' => 'Akon barantayan',
'mywatchlist' => 'Akon angay timan-an',
'watchlistfor2' => 'Para ha $1 $2',
+'watchnologin' => 'Diri nakalog-in',
'watch' => 'Bantayi',
'watchthispage' => 'Bantayi ini nga pakli',
'unwatch' => 'Pabay-i an pagbantay',
'watchlist-options' => 'Mga pirilian han talaan han binabantayan',
'enotif_newpagetext' => 'Ini in bag-o nga pakli.',
+'enotif_impersonal_salutation' => 'gumaramit han {{SITENAME}}',
+'changed' => 'naliwanan',
'created' => 'nahimo',
'enotif_anon_editor' => 'waray magpakilala nga gumaramit $1',
# Delete
'deletepage' => 'Igpara an pakli',
+'confirm' => 'Kompirma',
'excontent' => "An sulod in: ''$1''",
'excontentauthor' => 'an sulod in: \'\'$1\'\' (ngan hi "[[Special:Contributions/$2|$2]]" la an nag-amot)',
'exblank' => 'waray sulod an pakli',
'deletedtext' => 'Ginpara an "$1".
Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
'dellogpage' => 'Talaan han mga ginpara',
+'deletionlog' => 'Talaan han mga ginpara',
+'reverted' => 'Ginbalik ha uruuna nga rebisyon',
'deletecomment' => 'Katadungan:',
+'deleteotherreason' => 'Lain/dugang nga katadungan:',
'deletereasonotherlist' => 'Lain nga katadungan',
'deletereason-dropdown' => "*Agsob nga rason hin pagpara
** Tugon han manunurat
** Pagtalapas ha katungod hin pagtatag-iya (''copyright'')
** Bandalismo",
+'delete-edit-reasonlist' => 'Igliwat an mga rason han pagpara',
# Rollback
'rollback' => 'Mga libot-pabalik nga pagliwat',
'protect-otherreason' => 'Lain/dugang nga katadongan:',
'protect-otherreason-op' => 'Lain nga katadongan',
'restriction-type' => 'Pagtugot:',
+'minimum-size' => 'Pinakaguti nga kadako',
+'maximum-size' => 'Pinakadako nga kadako:',
+'pagesize' => '(mga byte)',
# Restrictions (nouns)
'restriction-edit' => 'Igliwat',
'restriction-move' => 'Balhina',
'restriction-create' => 'Himo-a',
+'restriction-upload' => 'Igkarga-pasaka',
# Restriction levels
'restriction-level-all' => 'bisan ano nga katupngan',
'undeletelink' => 'igpakita/igbalik',
'undeleteviewlink' => 'kitaa',
'undeletecomment' => 'Katadungan:',
+'cannotundelete' => 'Nagpalya an pabalik han pinara:
+$1',
+'undelete-search-title' => 'Pamiling hin mga ginpara nga mga pakli',
+'undelete-search-box' => 'Pamiling hin mga ginpara nga mga pakli',
'undelete-search-submit' => 'Bilnga',
'undelete-show-file-submit' => 'Oo',
'year' => 'Tikang ha tuig (ngan uruunhan):',
'sp-contributions-newbies' => 'Igpakita an mga amot hin mga bag-o nga akawnt la',
+'sp-contributions-newbies-sub' => 'Para han bag-o nga mga akawnt',
'sp-contributions-blocklog' => 'Talaan han pagpugong',
'sp-contributions-uploads' => 'mga ginkarga-paigbaw',
'sp-contributions-logs' => 'Mga talaan',
** Pan-abusar hin dirudilain nga mga akawnt
** Diri makakarawat nga agnay-hit-gumaramit',
'ipbsubmit' => 'Pugngi ini nga gumaramit',
+'ipbother' => 'Iba nga oras:',
'ipboptions' => '2 ka oras:2 hours,1 ka adlaw:1 day,3 ka adlaw:3 days,1 ka semana:1 week,2 ka semana:2 weeks,1 ka bulan:1 month,3 ka bulan:3 months,6 ka bulan:6 months,1 ka tuig:1 year,waray katapusan:infinite',
'ipbotheroption' => 'iba',
'ipbotherreason' => 'Lain/dugang nga katadungan:',
'blockipsuccesssub' => 'Malinamposon an pagpugong',
+'ipb-edit-dropdown' => 'Igliwat an mga rason han pagpugong',
'ipblocklist' => 'Mga ginpugngan nga gumaramit',
'blocklist-target' => 'Gin-iigo',
'blocklist-expiry' => 'Napan-os',
'blocklist-reason' => 'Rason:',
'ipblocklist-submit' => 'Bilnga',
'ipblocklist-localblock' => 'Lokal nga pagpugong',
+'ipblocklist-otherblocks' => 'Iba {{PLURAL:$1|ka pagpugong|ka mga pagpugong}}',
'blocklink' => 'igpugong',
'unblocklink' => 'igtanggal an pagpugong',
'change-blocklink' => 'igliwan an papugong',
'contribslink' => 'mga ámot',
+'emaillink' => 'Padara hin e-mail',
'blocklogpage' => 'Talaan han pagpugong',
'blocklogentry' => 'ginpugngan hi [[$1]] nga natatapos ha takna hin $2 $3',
'block-log-flags-nocreate' => 'diri gintutugutan an paghimo hin akawnt',
+'block-log-flags-nousertalk' => 'diri makakaliwat hit kalugaringon nga hiruhimangraw nga pakli',
+'ipb_already_blocked' => '"$1" in ginpugngan na',
'blockme' => 'Pugngi ako',
'proxyblocksuccess' => 'Human na.',
+'ipbnounblockself' => 'Diri ka gintutugotan hin pagtanggal hit pagpugong ha kalugaringon',
# Developer tools
'databasenotlocked' => 'An database in diri nakatrangka.',
'move-page-legend' => 'Balhina an pakli:',
'movearticle' => 'Balhina an pakli:',
'moveuserpage-warning' => "'''Pahimatngon:''' Tibalhin ka hin pakli hin gumaramit. Alayon pagtigaman nga an pakli là an mababalhin ngan an gumaramit in ''diri'' mababalyoan hin ngaran.",
+'movenologin' => 'Diri nakalog-in',
+'movenotallowed' => 'Waray ka pagtugot para makabalhin hin mga pakli.',
+'movenotallowedfile' => 'Waray ka pagtugot para makabalhin hin mga paypay.',
'newtitle' => 'Para ha bag-o nga titulo:',
'movepagebtn' => 'Igbalhin an pakli',
'pagemovedsub' => 'Malinamposon an pagbalhin',
'movedto' => 'ginbalhin ngadto',
'movelogpage' => 'Talaan han pagbalhin',
+'movelogpagetext' => 'Ubos hini in uska talaan han ngatanan nga nabalhin nga pakli',
+'movenosubpage' => 'Ini nga pakli in waray mga bahin-pakli.',
'movereason' => 'Rason:',
'revertmove' => 'igbalik',
'delete_and_move' => 'Igapara ngan igbalhin',
+'delete_and_move_confirm' => 'Oo, paraa an pakli',
+'delete_and_move_reason' => 'Ginpara para makahatag hin aragian para makabalhin tikan "[[$1]]"',
+'selfmove' => 'An tinikangan ngan kakadtoan nga mga titulo in parehas;
+diri makakabalhin ha iya kalugaringon ngahaw.',
+'immobile-source-page' => 'Diri mababalhin ini nga pakli.',
# Export
'export' => 'Mga pakli hit pagexport',
'exportall' => 'Ig-export an ngatanan nga mga pakli',
+'exportlistauthors' => 'Lakip an bug-os nga talaan han mga man-aamot para ha kada pakli',
+'export-submit' => 'Ginpapaangbit',
'export-addcattext' => 'Igdugang an mga pakli tikang ha kaarangay:',
'export-addcat' => 'Dugngi',
'export-addnstext' => "Igdugang an mga pakli tikang ha ngaran-lat'ang:",
'export-addns' => 'Dugngi',
+'export-download' => 'Igtipig komo paypay',
# Namespace 8 related
+'allmessages' => 'Mga mensahe han sistema',
'allmessagesname' => 'Ngaran',
'allmessagesdefault' => 'Daan aada nga teksto hiton mensahe',
+'allmessagescurrent' => 'Yana nga teksto han mensahe',
+'allmessages-filter-legend' => 'Sara',
'allmessages-filter-all' => 'Ngatanan',
'allmessages-language' => 'Yinaknan:',
'allmessages-filter-submit' => 'Kadto-a',
'thumbnail_image-type' => 'An klase han hulagway in diri suportado',
# Special:Import
+'import' => 'Naangbit hit mga pakli',
+'import-interwiki-source' => 'Tinikangan nga wiki/pakli:',
+'import-interwiki-templates' => 'Lakip an ngatanan nga mga batakan',
+'import-interwiki-submit' => 'Naangbit',
+'import-interwiki-namespace' => "Kakadtoan nga ngaran-lat'ang:",
'import-upload-filename' => 'Ngaran han paypay:',
'import-comment' => 'Komento:',
+'importstart' => 'Nag-aangbit hin mga pakli...',
'importnopages' => 'Waray pakli nga ginpapaangbit.',
+'importbadinterwiki' => 'Maraot nga sumpay hit interwiki',
+'importnotext' => 'Waray sulod o waray teksto',
+'importsuccess' => 'Natapos an pag-aangbit!',
+'import-noarticle' => 'Waray pakli nga maaangbit!',
+
+# Import log
+'importlogpage' => 'Talaan hin pan-aangbit',
+'import-logentry-interwiki' => 'natranswiki $1',
+
+# JavaScriptTest
+'javascripttest-pagetext-skins' => 'Pagpili hin panit para ha pag-paandar han:',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'An imo pakli hin gumaramit',
'siteusers' => '{{SITENAME}} {{PLURAL:$2|gumaramit|mga gumaramit}} $1',
# Info page
+'pageinfo-title' => 'Impormasyon para "$1"',
'pageinfo-header-basic' => 'Panguna nga pananabotan',
'pageinfo-header-edits' => 'Kaagi han pagliwat',
'pageinfo-header-restrictions' => 'Panalipod han pakli',
'pageinfo-lastuser' => 'Giurhii nga nagliwat',
'pageinfo-lasttime' => 'Petsa han kataposan nga pagliwat',
'pageinfo-edits' => 'Ngatanan nga ihap han mga pakli',
+'pageinfo-toolboxlink' => 'Impormasyon han pakli',
+'pageinfo-contentpage' => 'Ginlakip komo uska unod nga pakli',
+'pageinfo-contentpage-yes' => 'Oo',
+'pageinfo-protect-cascading-yes' => 'Oo',
+
+# Patrolling
+'markaspatrolleddiff' => 'Igmarka komo ginpatrolya na',
+'markaspatrolledtext' => 'Markaha ini nga pakli komo ginpatrolya na',
+'markedaspatrolled' => 'Igmarka komo ginpatrolya na',
+'markedaspatrollederror' => 'Diri nakakamarka komo ginpatrolya na',
+
+# Patrol log
+'patrol-log-page' => 'Talaan han pagpatrolya',
+'patrol-log-header' => 'Ini in uska talaan hin mga ginpatrolya nga mga rebisyon.',
+'log-show-hide-patrol' => '$1 talaan hin pagpatrolya',
+
+# Image deletion
+'deletedrevision' => 'Ginpara an daan nga rebisyon $1',
+'filedeleteerror-short' => 'Nagsayop ha pagpara han paypay: $1',
+'filedeleteerror-long' => 'Mga sayop nga ginengkwentro samtang nagpapara hin paypay:
+
+$1',
+'filedelete-missing' => 'An paypay nga "$1" in diri mapapara, tunogd nga waray ini dida.',
# Browsing diffs
'previousdiff' => '← Durudaan nga pagliwat',
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pakli|mga pakli}}',
+'file-info' => 'Kadako han paypay: $1, klase han MIME: $2',
'file-info-size' => '$1 × $2 nga pixel, kadako han fayl: $3, MIME nga tipo: $4',
'file-nohires' => 'Waray mas hiruhitaas nga resolusyon.',
'svg-long-desc' => 'SVG nga fayl, ginbabanabanahan nga $1 × $2 nga mga pixel, kadako han fayl: $3',
'show-big-image' => 'Bug-os nga resolusyon',
+'show-big-image-preview' => 'Kadako hin nga pahiuna nga pagawas: $1.',
+'show-big-image-other' => 'Iba {{PLURAL:$2|nga resolusyon|nga mga resolusyon}}: $1.',
'show-big-image-size' => '$1 × $2 nga mga pixel',
# Special:NewFiles
+'newimages' => 'Galeryia hin mga paypay nga bag-o',
'newimages-legend' => 'Panara',
+'newimages-label' => 'Ngaran han paypay (o uska bahin hini):',
+'showhidebots' => '($1 ka mga bot)',
'noimages' => 'Waray makikit-an.',
'ilsubmit' => 'Bilnga',
+'bydate' => 'pinaagi han petsa',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'ago' => '$1 an nakalabay',
'exif-imagewidth' => 'Kahaluag',
'exif-imagelength' => 'Kahitaas',
'exif-ycbcrpositioning' => 'Pagpoposisyon han Y ngan C',
+'exif-referenceblackwhite' => 'Padis han itom nga busag nga reperensya hin mga balor',
+'exif-datetime' => 'Pagliwat han petsa ngan oras han paypay',
'exif-imagedescription' => 'Titulo han hulagway',
+'exif-make' => 'Naghimo han kamera',
+'exif-model' => 'Modelo han kamera',
+'exif-software' => 'Software nga gingamit',
'exif-artist' => 'Tag-iya',
+'exif-subsectime' => 'Mga bahin-segundo han PetsaOras',
+'exif-exposuretime-format' => '$1 seg ($2)',
+'exif-fnumber' => 'F Numero',
+'exif-lightsource' => 'Ginkuhaan han suga',
+'exif-filesource' => 'Ginkuhaan han paypay',
'exif-sharpness' => 'Pagkatarom',
+'exif-gpslatituderef' => 'Amihanan o salatan nga latitud',
+'exif-gpslatitude' => 'Latitud',
+'exif-gpslongituderef' => 'Sinirangan o katundan nga longitud',
+'exif-gpslongitude' => 'Longitud',
+'exif-gpsaltitude' => 'Altitud',
'exif-gpstimestamp' => 'GPS nga oras (atomiko nga relo)',
+'exif-gpssatellites' => 'Mga satelayt nga gingamit ha pagsukol',
+'exif-gpsstatus' => 'Kahimtang han nagkakarawat',
'exif-gpsspeedref' => 'Sukol han kalaksi',
+'exif-gpstrack' => 'Direksyon han kiwa',
+'exif-gpsdestdistance' => 'Distansya ha destinasyon',
+'exif-gpsareainformation' => 'Ngaran han lugar an GPS',
+'exif-gpsdatestamp' => 'petsa han GPS',
+'exif-jpegfilecomment' => 'Komento han JPEG nga paypay',
+'exif-worldregioncreated' => 'Rehiyon han kalibutan kun diin an ritrato ginkuha',
+'exif-countrycreated' => 'Nasod kun diin an ritrato ginkuha',
+'exif-countrycodecreated' => 'Kodigo han nasod kun diin an ritrato ginkuha',
+'exif-provinceorstatecreated' => 'Lalawigan o estado kun diin an ritrato ginkuha',
+'exif-citycreated' => 'An syudad kun diin an ritrato ginkuha',
+'exif-sublocationcreated' => 'Bahin-lokasyon han syudad kun diin an ritrato ginkuha',
+'exif-worldregiondest' => 'Ginpakita an rehiyon han kalibutan',
'exif-countrydest' => 'Ginpapakita an nasod',
'exif-countrycodedest' => 'Ginpapakita an kodigo han nasod',
'exif-provinceorstatedest' => 'Ginpapakita an lalawigan o estado',
'exif-iimcategory' => 'Kaarangay',
'exif-datetimeexpires' => 'Ayaw gamita kahuman han',
'exif-datetimereleased' => 'Ginpagawas han',
+'exif-lens' => 'Mga lente nga gingamit',
'exif-cameraownername' => 'Tag-iya han kamera',
+'exif-usageterms' => 'Mga termino hit paggamit',
+
+'exif-copyrighted-false' => 'Dominyo panpubliko',
+
+'exif-unknowndate' => 'Waray kasabti an petsa',
+
+'exif-orientation-1' => 'Normal',
'exif-exposureprogram-1' => 'Mano-mano',
'exif-subjectdistance-value' => '$1 ka mga metro',
'exif-meteringmode-0' => 'Waray kasabti',
+'exif-meteringmode-255' => 'iba',
'exif-lightsource-0' => 'Waray kasabti',
'exif-lightsource-9' => 'Maupay nga panahon',
'exif-gaincontrol-0' => 'Waray',
+'exif-contrast-0' => 'Normal',
'exif-contrast-1' => 'Mahumok',
'exif-contrast-2' => 'Matig-a',
+'exif-saturation-0' => 'Normal',
+
+'exif-sharpness-0' => 'Normal',
'exif-sharpness-1' => 'Mahumok',
'exif-sharpness-2' => 'Matig-a',
'exif-subjectdistancerange-0' => 'Waray kasabti',
'exif-subjectdistancerange-1' => 'Macro',
+'exif-subjectdistancerange-2' => 'Harani nga pagkita',
+'exif-subjectdistancerange-3' => 'Harayo nga pagkita',
# Pseudotags used for GPSAltitudeRef
'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|metro|mga metro}} bawbaw han katupngan ha dagat',
'exif-objectcycle-a' => 'Aga la',
'exif-objectcycle-p' => 'Gab-i la',
+'exif-objectcycle-b' => 'Pareho pan-aga ngan pan-gab-i',
# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
'exif-gpsdirection-t' => 'Tinood nga direksyon',
+'exif-ycbcrpositioning-1' => 'Nakabutnga',
+
+'exif-dc-contributor' => 'Mga nag-ámot',
'exif-dc-date' => '(Mga) petsa',
+'exif-dc-relation' => 'Nahisumpay nga medya',
'exif-dc-rights' => 'Mga katungod',
+'exif-dc-source' => 'Tinikangan nga medya',
+'exif-dc-type' => 'Klase nga medya',
'exif-rating-rejected' => 'Waray karawta',
+'exif-isospeedratings-overflow' => 'Lapos han 65535',
+
'exif-iimcategory-ace' => 'mga arte, kultura ngan panlibang',
'exif-iimcategory-clj' => 'Krimen ngan balaod',
'exif-iimcategory-fin' => 'Ekonomiya ngan negosyo',
'exif-iimcategory-war' => 'Gera, samok ngan diri namumurayawan',
'exif-iimcategory-wea' => 'panahon',
+'exif-urgency-normal' => 'Normal ($1)',
+'exif-urgency-low' => 'Hamubo ($1)',
+'exif-urgency-high' => 'Hataas ($1)',
+
# External editor support
'edit-externally' => 'Igliwat ini nga fayl gamit han gawas nga aplikasyon',
'edit-externally-help' => '(Kitaa an [//www.mediawiki.org/wiki/Manual:External_editors mga pagtutdo hin pag-ayad] para han dugang nga pananabutan)',
'monthsall' => 'ngatanan',
'limitall' => 'ngatanan',
+# E-mail address confirmation
+'confirmemail' => 'Igkompirma an e-mail address',
+'confirmemail_sent' => 'Ginpadara an kompirmasyon han e-mail.',
+'confirmemail_needlogin' => 'Kinahanglanon mo hin $1 para makakompirma han imo e-mail address.',
+'confirmemail_loggedin' => 'Ginkompirma na yana an imo e-mail address',
+'confirmemail_error' => 'Mayda diri asya nga nahitabo ha pagtipig ha imo kompirmasyon.',
+'confirmemail_subject' => '{{SITENAME}} kompirmasyon han e-mail address',
+
+# Scary transclusion
+'scarytranscludetoolong' => '[Hala hin duro an URL]',
+
# Delete conflict
+'deletedwhileediting' => "'''Pahimatngon''': Ini nga pakli in ginpara kahuman nim magtikang pagliwat!",
'recreate' => 'Himo-a utro',
# action=purge
# action=watch/unwatch
'confirm-watch-button' => 'OK',
+'confirm-watch-top' => 'Dudugngon ini nga pakli ngadto han imo talaan hin ginbibinantayan?',
'confirm-unwatch-button' => 'OK',
+'confirm-unwatch-top' => 'Tatanggalon ini nga pakli tikang han imo tala hin binabantayan?',
# Multipage image navigation
'imgmultipageprev' => '← naha-una nga pakli',
'table_pager_limit_submit' => 'Kadto-a',
'table_pager_empty' => 'Waray mga resulta',
+# Auto-summaries
+'autosumm-blank' => 'Blankoha an pakli',
+'autosumm-replace' => 'Ginsaliwanan an sulod hin "$1"',
+'autoredircomment' => 'Ginredirecta an pakli ngada ha [[$1]]',
+'autosumm-new' => 'Nahimo an pakli nga may "$1"',
+
# Size units
'size-bytes' => '$1 nga B',
'size-kilobytes' => '$1 nga KB',
'livepreview-ready' => 'Ginkakarga. . . Pag-andam!',
# Watchlist editor
+'watchlistedit-numitems' => 'An imo talaan hin binabantayan hin may sulod nga {{PLURAL:$1|1 ka titulo|$1 ka mga titulo}}, diri lakip an mga pakli nga hiruhimangraw.',
+'watchlistedit-noitems' => 'An imo talaan han binabantayan in waray sulod nga mga titulo.',
+'watchlistedit-normal-title' => 'Igliwat an talaan han binabantayan',
+'watchlistedit-normal-legend' => 'Igtanggal an mga titulo tikang ha talaan hit binabantayan',
'watchlistedit-normal-submit' => 'Igtanggal an mga titulo',
+'watchlistedit-raw-title' => 'Igliwat an hilaw nga talaan han binabantayan',
+'watchlistedit-raw-legend' => 'Igliwat an hilaw nga talaan han binabantayan',
'watchlistedit-raw-titles' => 'Mga titulo:',
# Watchlist editing tools
# Special:Version
'version' => 'Bersyon',
+'version-specialpages' => 'Mga pinaurog nga pakli',
+'version-variables' => 'Mga variable',
+'version-antispam' => 'Pamugong hin spam',
'version-skins' => 'Mga panit',
+'version-other' => 'iba',
'version-version' => '(Bersion $1)',
'version-license' => 'Lisensya',
+'version-poweredby-credits' => "Ini nga wiki in pinapaandar han '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'mga iba',
'version-software-product' => 'Produkto',
'version-software-version' => 'Bersyon',
+'version-entrypoints' => 'Surudlan nga mga URL',
+'version-entrypoints-header-entrypoint' => 'Surudlan',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Aragian han paypay',
'filepath-submit' => 'Kadto-a',
# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Pamiling hin nadoble nga mga paypay',
+'fileduplicatesearch-legend' => 'Pamiling hin nadoble',
+'fileduplicatesearch-filename' => 'Ngaran han paypay:',
'fileduplicatesearch-submit' => 'Pamilnga',
-'fileduplicatesearch-noresults' => 'Waray nabilngan nga paypay nga an ngaran in "$".',
+'fileduplicatesearch-noresults' => 'Waray nabilngan nga paypay nga an ngaran in "$1".',
# Special:SpecialPages
'specialpages' => 'Mga pinaurog nga pakli',
+'specialpages-group-maintenance' => 'Mga sumat han pagmintinar',
+'specialpages-group-other' => 'Mga iba nga pinaurog nga pakli',
'specialpages-group-login' => 'Magpalista nga masakob / paghimo hin bag-o nga akawnt',
'specialpages-group-users' => 'Mga gumaramit ngan mga katungod',
'specialpages-group-highuse' => 'Mga pakli nga damo nagamit',
'htmlform-selectorother-other' => 'iba',
# New logging system
+'revdelete-content-hid' => 'sulod nakatago',
+'revdelete-summary-hid' => 'nakatago an dalikyat nga sumat han pagliwat',
+'revdelete-uname-hid' => 'nakatago an agnay-hit-gumaramit',
'logentry-newusers-newusers' => '$1 in naghimo hin gumaramit nga akawnt',
'logentry-newusers-create' => '$1 in naghimo hin gumaramit nga akawnt',
'logentry-newusers-create2' => '$1 in naghimo hin gumaramit nga akawnt $3',
'newuserlog-byemail' => 'Ginpadangat an tigaman-pagsulod pinaagi han e-mail',
# Feedback
+'feedback-subject' => 'Himangrawon:',
+'feedback-message' => 'Mensahe:',
+'feedback-cancel' => 'Pasagdi',
+'feedback-error2' => 'Sayop: Nagpalya an pagliwat',
'feedback-close' => 'Human na.',
# Search suggestions
'api-error-badaccess-groups' => 'Diri ka gintutugotan pagkarga paigbaw ha dinhi nga wiki.',
'api-error-badtoken' => 'Sayop ha sulod: Maraot nga token.',
'api-error-copyuploaddisabled' => 'Pagkarga paigbaw pinaagi han URL in diri mahihimo ha dinhi nga serbidor.',
+'api-error-duplicate-popup-title' => 'Nadoble {{PLURAL:$1|nga paypay|nga mga paypay}}.',
'api-error-filename-tooshort' => 'An ngaran han paypay in halipot hin duro.',
'api-error-filetype-banned' => 'Diri gintutugotan ini nga klase nga paypay.',
'api-error-filetype-missing' => 'Ini nga ngaran han paypay in nawawad-an hin ekstensyon.',
'api-error-http' => 'Sayop ha sulod: Diri nakakasumpay ha serbidor.',
'api-error-illegal-filename' => 'Diri gintutugotan an ngaran-han-paypay.',
+'api-error-mustbeloggedin' => 'Diri ka nakalog-in para makapagkarga-pasaka hin mga paypay.',
+'api-error-mustbeposted' => 'Sayop ha sulod: Iton paalayon in nagkikinahanglan hin HTTP POST.',
'api-error-overwrite' => 'Pagsasapaw in aada nga paypay in diri gintutugotan.',
'api-error-stashfailed' => 'Sayop ha sulod: An serbidor in waray makatipig han temporaryo nga paypay.',
'api-error-timeout' => 'An serbidor in diri nabaton ha sulod han ginaasahan nga oras.',
'shared-repo-from' => 'פֿון $1',
'shared-repo' => 'א געמיינזאַמער זאַפאַס',
'shared-repo-name-wikimediacommons' => 'וויקימעדיע קאמאנס',
-'upload-disallowed-here' => '×\9c×\99×\99×\93ער ×§×¢× ×\98 ×\90×\99ר × ×\99ש×\98 ×\90×\99×\91ערשר×\99×\99×\91×\9f ×\93×\90ס ×\91×\99×\9c×\93.',
+'upload-disallowed-here' => '×\90×\99ר ×§×¢× ×\98 × ×\99ש×\98 ×\90×\99×\91ערשר×\99×\99×\91×\9f ×\93×\99 ×\98עקע.',
# File reversion
'filerevert' => 'צוריקדרייען $1',
'filedelete-success' => "'''$1''' איז געווען אויסגעמעקט.",
'filedelete-success-old' => "די ווערסיע פֿון '''[[Media:$1|$1]]''' פֿון $3, $2 איז געווארן אויסגעמעקט.",
'filedelete-nofile' => "'''$1''' עקזיסטירט נישט.",
+'filedelete-nofile-old' => "נישט פאראן קיין ארכיווירטע ווערסיע פון '''$1''' מיט די ספעציפירטע אייגנקייטן.",
'filedelete-otherreason' => 'אנדער/נאך א סיבה:',
'filedelete-reason-otherlist' => 'אַנדער אורזאַך',
'filedelete-reason-dropdown' => '*אַלגעמיינע אויסמעקן סיבות
'pageinfo-authors' => '不同编者总计',
'pageinfo-recent-edits' => '最近的编辑数($1内)',
'pageinfo-recent-authors' => '最近的不同编者数',
-'pageinfo-magic-words' => '魔术字 ($1)',
-'pageinfo-hidden-categories' => '隐藏分类 ($1)',
-'pageinfo-templates' => '使用的模板 ($1)',
+'pageinfo-magic-words' => '魔术字($1)',
+'pageinfo-hidden-categories' => '隐藏分类($1)',
+'pageinfo-templates' => '使用的模板($1)',
+'pageinfo-toolboxlink' => '页面信息',
# Skin names
'skinname-standard' => '标准',
'pageinfo-authors' => '作者總數',
'pageinfo-recent-edits' => '最近編輯次數 (過去 $1 內)',
'pageinfo-recent-authors' => '最近作者數目',
-'pageinfo-magic-words' => '魔術{{PLURAL:$1|字|字}} ( $1 )',
-'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}} ( $1 )',
-'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}} ( $1 )',
+'pageinfo-magic-words' => '魔術{{PLURAL:$1|字|字}}($1)',
+'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}}($1)',
+'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}}($1)',
'pageinfo-toolboxlink' => '頁面資訊',
'pageinfo-redirectsto' => '重定向到',
'pageinfo-redirectsto-info' => '資訊',
"protected=\access protected" \
"public=\access public" \
"copyright=\note" \
- "license=\note"
+ "license=\note" \
+ "codeCoverageIgnore="
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
*.PHP5 \
*.M \
*.MM \
- *.PY
+ *.PY \
+ *.txt \
+ README
RECURSIVE = YES
EXCLUDE_SYMLINKS = YES
EXCLUDE_PATTERNS = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
array_push( $keys, $row->us_key );
}
- $this->output( 'Removing ' . count($keys) . " file(s)...\n" );
+ $this->output( 'Removing ' . count( $keys ) . " file(s)...\n" );
// this could be done some other, more direct/efficient way, but using
// UploadStash's own methods means it's less likely to fall accidentally
// out-of-date someday
$this->output( "Deleting old thumbnails...\n" );
$i = 0;
foreach ( $iterator as $file ) {
+ $i++;
if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
$tempRepo->quickPurge( "$dir/$file" );
}
},
select: function ( $input ) {
$input.closest( 'form' ).append(
- $( '<input type="hidden"/>', {
- name: 'fulltext',
- val: '1'
- })
+ $( '<input type="hidden" name="fulltext" value="1"/>' )
);
$input.closest( 'form' ).submit();
}
} );
-}( mediaWiki, jQuery ) );
\ No newline at end of file
+}( mediaWiki, jQuery ) );
class CologneBlueTemplate extends BaseTemplate {
function execute() {
+ // Suppress warnings to prevent notices about missing indexes in $this->data
+ wfSuppressWarnings();
$this->html( 'headelement' );
echo $this->beforeContent();
$this->html( 'bodytext' );
$this->html( 'dataAfterContent' );
$this->printTrail();
echo "\n</body></html>";
+ wfRestoreWarnings();
}
/**
}
}
+ // @fixed
function talkLink() {
$title = $this->getSkin()->getTitle();
- if ( NS_SPECIAL == $title->getNamespace() ) {
- # No discussion links for special pages
- return '';
+
+ if ( $title->getNamespace() == NS_SPECIAL ) {
+ // No discussion links for special pages
+ return "";
}
- $linkOptions = array();
-
- if ( $title->isTalkPage() ) {
- $link = $title->getSubjectPage();
- switch( $link->getNamespace() ) {
- case NS_MAIN:
- $text = wfMessage( 'articlepage' );
- break;
- case NS_USER:
- $text = wfMessage( 'userpage' );
- break;
- case NS_PROJECT:
- $text = wfMessage( 'projectpage' );
- break;
- case NS_FILE:
- $text = wfMessage( 'imagepage' );
- # Make link known if image exists, even if the desc. page doesn't.
- if ( wfFindFile( $link ) )
- $linkOptions[] = 'known';
- break;
- case NS_MEDIAWIKI:
- $text = wfMessage( 'mediawikipage' );
- break;
- case NS_TEMPLATE:
- $text = wfMessage( 'templatepage' );
- break;
- case NS_HELP:
- $text = wfMessage( 'viewhelppage' );
- break;
- case NS_CATEGORY:
- $text = wfMessage( 'categorypage' );
- break;
- default:
- $text = wfMessage( 'articlepage' );
- }
+ $companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
+ $companionNamespace = $companionTitle->getNamespace();
+
+ // TODO these messages appear to only be used by CologneBlue and legacy skins,
+ // kill and replace with something more sensibly named?
+ $nsToMessage = array(
+ NS_MAIN => 'articlepage',
+ NS_USER => 'userpage',
+ NS_PROJECT => 'projectpage',
+ NS_FILE => 'imagepage',
+ NS_MEDIAWIKI => 'mediawikipage',
+ NS_TEMPLATE => 'templatepage',
+ NS_HELP => 'viewhelppage',
+ NS_CATEGORY => 'categorypage',
+ NS_FILE => 'imagepage',
+ );
+
+ // Find out the message to use for link text. Use either the array above or,
+ // for non-talk pages, a generic "discuss this" message.
+ // Default is the same as for main namespace.
+ if ( isset( $nsToMessage[$companionNamespace] ) ) {
+ $message = $nsToMessage[$companionNamespace];
} else {
- $link = $title->getTalkPage();
- $text = wfMessage( 'talkpage' );
+ $message = $companionTitle->isTalkPage() ? 'talkpage' : 'articlepage';
}
- $s = Linker::link( $link, $text->text(), array(), array(), $linkOptions );
+ // Obviously this can't be reasonable and just return the key for talk namespace, only for content ones.
+ // Thus we have to mangle it in exactly the same way SkinTemplate does. (bug 40805)
+ $key = $companionTitle->getNamespaceKey( '' );
+ if ( $companionTitle->isTalkPage() ) {
+ $key = ( $key == 'main' ? 'talk' : $key . "_talk" );
+ }
- return $s;
+ // Use the regular navigational link, but replace its text. Everything else stays unmodified.
+ $namespacesLinks = $this->data['content_navigation']['namespaces'];
+ $link = $this->processNavlinkForDocument( $namespacesLinks[ $key ] );
+ $link['text'] = wfMessage( $message )->text();
+
+ return $this->makeListItem( $message, $link, array( 'tag' => 'span' ) );
+ }
+
+ /**
+ * Takes a navigational link generated by SkinTemplate in whichever way
+ * and mangles attributes unsuitable for repeated use. In particular, this modifies the ids
+ * and removes the accesskeys. This is necessary to be able to use the same navlink twice,
+ * e.g. in sidebar and in footer.
+ *
+ * @param $navlink array Navigational link generated by SkinTemplate
+ * @param $idPrefix mixed Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
+ */
+ function processNavlinkForDocument( $navlink, $idPrefix='cb-' ) {
+ if ( $navlink['id'] ) {
+ $navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
+ $navlink['tooltiponly'] = true; // but no accesskeys
+
+ // mangle or remove the id
+ if ( $idPrefix === false ) {
+ unset( $navlink['id'] );
+ } else {
+ $navlink['id'] = $idPrefix . $navlink['id'];
+ }
+ }
+
+ return $navlink;
}
/**
!!end
###
-### Parsoid-centric tests for testing RT edge cases
-### around comments and white-space inside pre blocks
+### Parsoid-centric tests for testing RT edge cases for pre
###
!!test
</pre>
!!end
+!!test
+2a. Pre and tables
+!!input
+ {|
+ |-
+ !h1!!h2
+ |foo||bar
+ |}
+!!result
+<table>
+
+<tr>
+<th>h1</th>
+<th>h2
+</th>
+<td>foo</td>
+<td>bar
+</td></tr></table>
+
+!!end
+
+!!test
+2b. Pre and tables
+!!input
+ {|
+ |-
+|foo
+|}
+!!result
+<table>
+
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+3. Pre and block tags
+!!input
+ <p> foo </p>
+ <div> foo </div>
+ <span> foo </span>
+!!result
+ <p> foo </p>
+ <div> foo </div>
+<pre><span> foo </span>
+</pre>
+!!end
+
+!!test
+4. Multiple spaces at start-of-line
+!!input
+ <p> foo </p>
+ foo
+ {|
+|foo
+|}
+!!result
+ <p> foo </p>
+<pre> foo
+</pre>
+<table>
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
###
### Definition lists
###
!! end
+!! test
+Definition Lists: Hacky use to indent tables
+!! input
+::{|
+|foo
+|bar
+|}
+this text
+should be left alone
+!! result
+<dl><dd><dl><dd><table>
+<tr>
+<td>foo
+</td>
+<td>bar
+</td></tr></table></dd></dl></dd></dl>
+<p>this text
+should be left alone
+</p>
+!! end
## The PHP parser treats : items (dd) without a corresponding ; item (dt)
## as an empty dt item. It also ignores all but the last ";" when followed
## by ":" later on. So, ";" are not ignored in ";;;t3" but are ignored in
!! end
+!! test
+Simple table but with multiple dashes for row wikitext
+!! input
+{|
+| foo
+|-----
+| bar
+|}
+!! result
+<table>
+<tr>
+<td> foo
+</td></tr>
+<tr>
+<td> bar
+</td></tr></table>
+
+!! end
!! test
Multiplication table
!! input
!! end
+!!test
+Allow +/- in 2nd and later cells in a row
+!!input
+{|
+| 1 || 2 || 3
+|-
+| 1 || +2 || -3
+|}
+!!result
+<table>
+<tr>
+<td> 1 </td>
+<td> 2 </td>
+<td> 3
+</td></tr>
+<tr>
+<td> 1 </td>
+<td> +2 </td>
+<td> -3
+</td></tr></table>
+
+!!end
+
!! test
Table rowspan
!! input
!! end
+!! test
+1. Lists with start-of-line-transparent tokens before bullets: Comments
+!! input
+*foo
+*<!--cmt-->bar
+<!--cmt-->*baz
+!! result
+<ul><li>foo
+</li><li>bar
+</li><li>baz
+</li></ul>
+
+!! end
+
+!! test
+2. Lists with start-of-line-transparent tokens before bullets: Template close
+!! input
+*foo {{echo|bar
+}}*baz
+!! result
+<ul><li>foo bar
+</li><li>baz
+</li></ul>
+
+!! end
!! test
List items are not parsed correctly following a <pre> block (bug 785)
!!end
+!!test
+Templates: Ugly templates: 1. Navbox template parses badly leading to table misnesting
+(Parsoid-centric)
+!! options
+disabled
+!!input
+{|
+|{{echo|foo</table>}}
+|bar
+|}
+!!result
+<table data-parsoid="{"src":"{|\n|{{echo|foo</table>}}\n|bar\n|}"}" about="#mwt1" typeof="mw:Object/Template ">
+<tbody><tr><td>foo</td></tr></tbody></table><span about="#mwt1">
+bar</span><span about="#mwt1">
+</span>
+!!end
+
+!!test
+Templates: Ugly templates: 2. Navbox template parses badly leading to table misnesting
+(Parsoid-centric)
+!! options
+disabled
+!!input
+<table>
+ <tr>
+ <td>
+ <table>
+ <tr>
+ <td>1. {{echo|foo </table>}}</td>
+ <td> bar </td>
+ <td>2. {{echo|baz </table>}}</td>
+ </tr>
+ <tr>
+ <td>abc</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>xyz</td>
+ </tr>
+</table>
+!!result
+<table data-parsoid="{"src":"<table>\n <tr>\n <td>\n <table>\n <tr>\n <td>1. {{echo|foo </table>}}</td>\n <td> bar </td>\n <td>2. {{echo|baz </table>}}</td>\n </tr>\n <tr>\n <td>abc</td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td>xyz</td>\n </tr>\n</table>"}" about="#mwt1" typeof="mw:Object/Template">
+ <tbody><tr data-parsoid="{"stx":"html"}">
+ <td data-parsoid="{"stx":"html"}">
+ <table data-parsoid="{"stx":"html"}">
+ <tbody><tr data-parsoid="{"stx":"html"}">
+ <td data-parsoid="{"stx":"html"}">1. foo </td></tr></tbody></table></td>
+ <td data-parsoid="{"stx":"html"}"> bar </td>
+ <td data-parsoid="{"stx":"html"}">2. baz </td></tr></tbody></table><span about="#mwt1">
+ </span><span about="#mwt1">
+
+ abc</span><span about="#mwt1">
+ </span><span about="#mwt1">
+ </span><span about="#mwt1">
+ </span><span about="#mwt1">
+ </span><span about="#mwt1">
+
+ xyz</span><span about="#mwt1">
+ </span><span about="#mwt1">
+</span>
+!!end
+
!!test
Parser Functions: 1. Simple example
!!input
!! end
+!! test
+Image with link tails
+!! input
+123[[Image:foobar.jpg]]456
+123[[Image:foobar.jpg|right]]456
+123[[Image:foobar.jpg|thumb]]456
+!! result
+<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
+</p>
+123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>456
+123<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>456
+
+!! end
+
+!! test
+Image with multiple captions -- only last one is accepted
+!! input
+[[Image:foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
+!! result
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! end
+
!! test
Image with link parameter, wiki target
!! input
[[Category:Foo (bar)|Foo]]
!! end
+!! test
+Category with link tail
+!! options
+cat
+pst
+!! input
+123[[Category:Foo]]456
+!! result
+123[[Category:Foo]]456
+!! end
+
!! test
Category with template
!! options
/** creates a title object and its article object */
protected function setUp() {
+ parent::setUp();
$this->title = Title::makeTitle( NS_MAIN, 'SomePage' );
$this->article = new Article( $this->title );
-
}
/** cleanup title object and its article object */
protected function tearDown() {
+ parent::tearDown();
$this->title = null;
$this->article = null;
-
}
function testImplementsGetMagic() {
protected function setUp() {
parent::setUp();
- $this->setMwGlobals( 'wgContLang', Language::factory( 'en' ) );
+ $this->setMwGlobals( array(
+ 'wgLanguageCode' => 'en',
+ 'wgContLang' => Language::factory( 'en' )
+ ) );
}
function addDBData() {
class CdbTest extends MediaWikiTestCase {
protected function setUp() {
+ parent::setUp();
if ( !CdbReader::haveExtension() ) {
$this->markTestSkipped( 'Native CDB support is not available' );
}
protected function setUp() {
parent::setUp();
+ $contLang = Language::factory( 'en' );
$this->setMwGlobals( array(
'wgShowDBErrorBacktrace' => true,
'wgLanguageCode' => 'en',
- 'wgContLang' => Language::factory( 'en' ),
+ 'wgContLang' => $contLang,
'wgLang' => Language::factory( 'en' ),
'wgMemc' => new EmptyBagOStuff,
'wgAlwaysUseTidy' => false,
'wgCleanSignatures' => true,
) );
- $this->options = new ParserOptions;
+ $this->options = ParserOptions::newFromUserAndLang( new User, $contLang );
$this->options->setTemplateCallback( array( __CLASS__, 'statelessFetchTemplate' ) );
$this->parser = new Parser;
var $response;
protected function setUp() {
+ parent::setUp();
$this->response = new FauxResponse;
}
* with.
*/
protected function setUp() {
+ parent::setUp();
$this->object = new FormOptionsExposed();
-
}
public function testAddStringOption() {
protected $object;
/**
- * Instanciates a FormOptions object to play with.
+ * Instanciates a FormOptions object to play with.
* FormOptions::add() is tested by the class FormOptionsInitializationTest
* so we assume the function is well tested already an use it to create
* the fixture.
*/
protected function setUp() {
+ parent::setUp();
$this->object = new FormOptions;
$this->object->add( 'string1', 'string one' );
$this->object->add( 'string2', 'string two' );
}
protected function setUp() {
+ parent::setUp();
$dbw = wfGetDB( DB_MASTER );
$dbw->replace(
'interwiki',
class PathRouterTest extends MediaWikiTestCase {
protected function setUp() {
+ parent::setUp();
$router = new PathRouter;
$router->add("/wiki/$1");
$this->basicRouter = $router;
public function setUp() {
global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+ parent::setUp();
+
$wgExtraNamespaces[ 12312 ] = 'Dummy';
$wgExtraNamespaces[ 12313 ] = 'Dummy_talk';
public function tearDown() {
global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+ parent::tearDown();
+
unset( $wgExtraNamespaces[ 12312 ] );
unset( $wgExtraNamespaces[ 12313 ] );
var $mConf;
protected function setUp() {
+ parent::setUp();
+
$this->mConf = new SiteConfiguration;
$this->mConf->suffixes = array( 'wiki' );
$GLOBALS['global'] = array( 'global' => 'global' );
}
-
function testSiteFromDb() {
$this->assertEquals(
array( 'wikipedia', 'en' ),
public function setup() {
global $wgUser;
+ parent::setUp();
+
// anon user
$wgUser = new User();
$wgUser->setName( '127.0.0.1' );
public function setup() {
global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContLang;
+ parent::setUp();
+
$this->mergeMwGlobalArrayValue(
'wgExtraNamespaces',
array(
public function teardown() {
global $wgContLang;
+ parent::tearDown();
+
MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
$wgContLang->resetNamespaces(); # reset namespace cache
}
public function testGetParserOutput( $model, $text, $expectedHtml ) {
$page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
- $opt = new ParserOptions();
+ $opt = $page->makeParserOptions( 'canonical' );
$po = $page->getParserOutput( $opt );
$text = $po->getText();
var $handler;
public function setup() {
+ parent::setUp();
$this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
}
- public function teardown() {
- }
-
public function testSerializeContent( ) {
$content = new WikitextContent( 'hello world' );
protected $select;
protected function setUp() {
+ parent::setUp();
$this->select = new XmlSelect();
}
protected function tearDown() {
+ parent::tearDown();
$this->select = null;
}
var $zipDir, $entries;
protected function setUp() {
+ parent::setUp();
$this->zipDir = __DIR__ . '/../data/zip';
}
var $db, $functionTest = false;
protected function setUp() {
+ parent::setUp();
$this->db = wfGetDB( DB_MASTER );
}
protected function tearDown() {
+ parent::tearDown();
if ( $this->functionTest ) {
$this->dropFunctions();
$this->functionTest = false;
protected function setUp() {
+ parent::setUp();
// Make sure MWDebug class is enabled
static $MWDebugEnabled = false;
if( !$MWDebugEnabled ) {
protected function tearDown() {
wfRestoreWarnings();
+ parent::tearDown();
}
function testAddLog() {
class PNGMetadataExtractorTest extends MediaWikiTestCase {
protected function setUp() {
+ parent::setUp();
$this->filePath = __DIR__ . '/../../data/media/';
}
/**
class SVGMetadataExtractorTest extends MediaWikiTestCase {
protected function setUp() {
+ parent::setUp();
AutoLoader::loadClass( 'SVGMetadataExtractorTest' );
}
class XMPTest extends MediaWikiTestCase {
protected function setUp() {
+ parent::setUp();
if ( !wfDl( 'xml' ) ) {
$this->markTestSkipped( 'Requires libxml to do XMP parsing' );
}
protected function setUp() {
parent::setUp();
- $this->setMwGlobals( 'wgContLang', Language::factory( 'en' ) );
+ $contLang = Language::factory( 'en' );
+ $this->setMwGlobals( 'wgContLang', $contLang );
$this->testParser = new Parser();
- $this->testParser->Options( new ParserOptions() );
+ $this->testParser->Options( ParserOptions::newFromUserAndLang( new User, $contLang ) );
# initialize parser output
$this->testParser->clearState();
private $title;
protected function setUp() {
- $this->testParserOptions = new ParserOptions();
+ global $wgContLang;
+
+ parent::setUp();
+ $this->testParserOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
$this->testParser = new Parser();
$this->testParser->Options( $this->testParserOptions );
}
protected function tearDown() {
+ parent::tearDown();
+
unset( $this->testParser );
unset( $this->title );
}
var $mOptions;
protected function setUp() {
- global $wgParserConf;
- $this->mOptions = new ParserOptions();
+ global $wgParserConf, $wgContLang;
+ parent::setUp();
+ $this->mOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
$name = isset( $wgParserConf['preprocessorClass'] ) ? $wgParserConf['preprocessorClass'] : 'Preprocessor_DOM';
$this->mPreprocessor = new $name( $this );
* @dataProvider provideValidNames
*/
function testTagHooks( $tag ) {
- global $wgParserConf;
+ global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
$parser->setHook( $tag, array( $this, 'tagCallback' ) );
- $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+ $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
$this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
$parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
* @expectedException MWException
*/
function testBadTagHooks( $tag ) {
- global $wgParserConf;
+ global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
$parser->setHook( $tag, array( $this, 'tagCallback' ) );
- $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+ $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
$this->fail('Exception not thrown.');
}
* @dataProvider provideValidNames
*/
function testFunctionTagHooks( $tag ) {
- global $wgParserConf;
+ global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
$parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), 0 );
- $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+ $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
$this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
$parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
* @expectedException MWException
*/
function testBadFunctionTagHooks( $tag ) {
- global $wgParserConf;
+ global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
$parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), SFH_OBJECT_ARGS );
- $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+ $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
$this->fail('Exception not thrown.');
}
*/
protected $rc;
- protected function setUp() {
- }
-
/** helper to test SpecialRecentchanges::buildMainQueryConds() */
private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
$context = new RequestContext;