array.
* (bug 29753) mw.util.tooltipAccessKeyPrefix should be alt-shift for Chrome
on Windows
-* (bug 25095) Special:Categories should also include the first relevant item
- when "from" is filled.
* (bug 12262) Indents and lists are now aligned
* (bug 34972) An error occurred while changing your watchlist settings for
[[Special:WhatLinksHere/Example]]
$wgDebugLogFile['memcached'] to some filepath.
* (bug 35685) api.php URL and other entry point URLs are now listed on
Special:Version
+* Edit notices can now be translated.
+* (bug 22887) Add warning and tracking category for preprocessor errors
+* (bug 31704) Allow selection of associated namespace on the watchlist
=== Bug fixes in 1.20 ===
* (bug 30245) Use the correct way to construct a log page title.
* (bug 31236) "Next" and "Previous" buttons are shown incorrectly in
an RTL environment.
* (bug 35680) jQuery upgraded to 1.7.2.
-* (bug 35681) jQuery UI upgraded to 1.8.18.
+* jQuery UI upgraded to 1.8.19.
* (bug 35705) QUnit upgraded from 1.2.0 to 1.5.0
* (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
Subversion when invoked with the --modified option.
* (bug 33564) transwiki import sometimes result in invalid title.
* (bug 35572) Blocks appear to succeed even if query fails due to wrong DB structure
* (bug 31757) Add a word-separator between help-messages in HTMLForm
+* (bug 30410) Removed deprecated $wgFilterCallback and the 'filtered' API error.
=== API changes in 1.20 ===
* (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
* (bug 32492) API now allows editing using pageid
* (bug 32497) API now allows changing of protection level using pageid
* (bug 32498) API now allows comparing pages using pageids
+* (bug 30975) API import of pages with invalid characters in this wiki leads to Fatal Error
+* (bug 30488) API now allows listing of backlinks/embeddedin/imageusage per pageid
=== Languages updated in 1.20 ===
required.
&$apis: array of services
+'ApiTokensGetTokenTypes': use this hook to extend action=tokens with new
+token types.
+&$tokenTypes: supported token types in format 'type' => callback function
+used to retrieve this type of tokens.
+
'ArticleAfterFetchContent': after fetching content of an article from
the database
$article: the article (object) being loaded from the database
$user: user who performed the deletion
$reason: reason
+'FileTransformed': When a file is transformed and moved into storage
+$file: reference to the File object
+$thumb: the MediaTransformOutput object
+$tmpThumbPath: The temporary file system path of the transformed file
+$thumbPath: The permanent storage path of the transformed file
+
'FileUpload': When a file upload occurs
$file : Image object representing the file that was uploaded
$reupload : Boolean indicating if there was a previously another image there or not (since 1.17)
'FileBackend' => 'includes/filerepo/backend/FileBackend.php',
'FileBackendStore' => 'includes/filerepo/backend/FileBackendStore.php',
'FileBackendStoreShardListIterator' => 'includes/filerepo/backend/FileBackendStore.php',
+ 'FileBackendStoreShardDirIterator' => 'includes/filerepo/backend/FileBackendStore.php',
+ 'FileBackendStoreShardFileIterator' => 'includes/filerepo/backend/FileBackendStore.php',
'FileBackendMultiWrite' => 'includes/filerepo/backend/FileBackendMultiWrite.php',
'FSFileBackend' => 'includes/filerepo/backend/FSFileBackend.php',
+ 'FSFileBackendList' => 'includes/filerepo/backend/FSFileBackend.php',
+ 'FSFileBackendDirList' => 'includes/filerepo/backend/FSFileBackend.php',
'FSFileBackendFileList' => 'includes/filerepo/backend/FSFileBackend.php',
'SwiftFileBackend' => 'includes/filerepo/backend/SwiftFileBackend.php',
+ 'SwiftFileBackendList' => 'includes/filerepo/backend/SwiftFileBackend.php',
+ 'SwiftFileBackendDirList' => 'includes/filerepo/backend/SwiftFileBackend.php',
'SwiftFileBackendFileList' => 'includes/filerepo/backend/SwiftFileBackend.php',
'FileJournal' => 'includes/filerepo/backend/filejournal/FileJournal.php',
'DBFileJournal' => 'includes/filerepo/backend/filejournal/DBFileJournal.php',
* @param $rows ResultWrapper object with rows in recentchanges table
* @param $lastmod Integer: timestamp of the last item in the recentchanges table (only used for the cache key)
* @param $opts FormOptions as in SpecialRecentChanges::getDefaultOptions()
- * @return null or true
+ * @return null|bool True or null
*/
public function execute( $feed, $rows, $lastmod, $opts ) {
global $wgLang, $wgRenderHashAppend;
if ( !FeedUtils::checkFeedOutput( $this->format ) ) {
- return;
+ return null;
}
$optionsHash = md5( serialize( $opts->getAllValues() ) ) . $wgRenderHashAppend;
array( 640, 480 ),
array( 800, 600 ),
array( 1024, 768 ),
- array( 1280, 1024 ),
- array( 10000, 10000 )
+ array( 1280, 1024 )
);
/**
/** Same as the above except for edit summaries */
$wgSummarySpamRegex = array();
-/**
- * Similarly you can get a function to do the job. The function will be given
- * the following args:
- * - a Title object for the article the edit is made on
- * - the text submitted in the textarea (wpTextbox1)
- * - the section number.
- * The return should be boolean indicating whether the edit matched some evilness:
- * - true : block it
- * - false : let it through
- *
- * @deprecated since 1.17 Use hooks. See SpamBlacklist extension.
- * @var $wgFilterCallback bool|string|Closure
- */
-$wgFilterCallback = false;
-
/**
* Whether to use DNS blacklists in $wgDnsBlacklistUrls to check for open proxies
* @since 1.16
*/
const AS_HOOK_ERROR = 210;
- /**
- * Status: The filter function set in $wgFilterCallback returned true (= block it)
- */
- const AS_FILTERING = 211;
-
/**
* Status: A hook function returned an error
*/
*/
const AS_IMAGE_REDIRECT_LOGGED = 234;
+ /**
+ * HTML id and name for the beginning of the edit form.
+ */
+ const EDITFORM_ID = 'editform';
+
/**
* @var Article
*/
# If we just undid one rev, use an autosummary
$firstrev = $oldrev->getNext();
- if ( $firstrev->getId() == $undo ) {
+ if ( $firstrev && $firstrev->getId() == $undo ) {
$undoSummary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() );
if ( $this->summary === '' ) {
$this->summary = $undoSummary;
return true;
case self::AS_HOOK_ERROR:
- case self::AS_FILTERING:
return false;
case self::AS_SUCCESS_NEW_ARTICLE:
* AS_CONTENT_TOO_BIG and AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some time.
*/
function internalAttemptSave( &$result, $bot = false ) {
- global $wgFilterCallback, $wgUser, $wgRequest, $wgParser;
- global $wgMaxArticleSize;
+ global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize;
$status = Status::newGood();
wfProfileOut( __METHOD__ );
return $status;
}
- if ( $wgFilterCallback && is_callable( $wgFilterCallback ) && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section, $this->hookError, $this->summary ) ) {
- # Error messages or other handling should be performed by the filter function
- $status->setResult( false, self::AS_FILTERING );
- wfProfileOut( __METHOD__ . '-checks' );
- wfProfileOut( __METHOD__ );
- return $status;
- }
if ( !wfRunHooks( 'EditFilter', array( $this, $this->textbox1, $this->section, &$this->hookError, $this->summary ) ) ) {
# Error messages etc. could be handled within the hook...
$status->fatal( 'hookaborted' );
} elseif ( $contextTitle->exists() && $this->section != '' ) {
$msg = $this->section == 'new' ? 'editingcomment' : 'editingsection';
} else {
- $msg = $contextTitle->exists() || ( $contextTitle->getNamespace() == NS_MEDIAWIKI && $contextTitle->getDefaultMessageText() !== false ) ?\r
- 'editing' : 'creating';\r
+ $msg = $contextTitle->exists() || ( $contextTitle->getNamespace() == NS_MEDIAWIKI && $contextTitle->getDefaultMessageText() !== false ) ?
+ 'editing' : 'creating';
}
# Use the title defined by DISPLAYTITLE magic word when present
- $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;\r
- if ( $displayTitle === false ) {\r
- $displayTitle = $contextTitle->getPrefixedText();\r
+ $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
+ if ( $displayTitle === false ) {
+ $displayTitle = $contextTitle->getPrefixedText();
}
$wgOut->setPageTitle( wfMessage( $msg, $displayTitle ) );
}
}
}
- $wgOut->addHTML( Html::openElement( 'form', array( 'id' => 'editform', 'name' => 'editform',
+ $wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
'enctype' => 'multipart/form-data' ) ) );
# Optional notices on a per-namespace and per-page basis
$editnotice_ns = 'editnotice-' . $this->mTitle->getNamespace();
- $editnotice_ns_message = wfMessage( $editnotice_ns )->inContentLanguage();
+ $editnotice_ns_message = wfMessage( $editnotice_ns );
if ( $editnotice_ns_message->exists() ) {
$wgOut->addWikiText( $editnotice_ns_message->plain() );
}
$editnotice_base = $editnotice_ns;
while ( count( $parts ) > 0 ) {
$editnotice_base .= '-' . array_shift( $parts );
- $editnotice_base_msg = wfMessage( $editnotice_base )->inContentLanguage();
+ $editnotice_base_msg = wfMessage( $editnotice_base );
if ( $editnotice_base_msg->exists() ) {
$wgOut->addWikiText( $editnotice_base_msg->plain() );
}
} else {
# Even if there are no subpages in namespace, we still don't want / in MW ns.
$editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->mTitle->getDBkey() );
- $editnoticeMsg = wfMessage( $editnoticeText )->inContentLanguage();
+ $editnoticeMsg = wfMessage( $editnoticeText );
if ( $editnoticeMsg->exists() ) {
$wgOut->addWikiText( $editnoticeMsg->plain() );
}
* @return string
*/
function getPreviewText() {
- global $wgOut, $wgUser, $wgParser, $wgRawHtml;
+ global $wgOut, $wgUser, $wgParser, $wgRawHtml, $wgLang;
wfProfileIn( __METHOD__ );
} elseif ( $this->incompleteForm ) {
$note = wfMsg( 'edit_form_incomplete' );
} else {
- $note = wfMsg( 'previewnote' );
+ $note = wfMsg( 'previewnote' ) .
+ ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMsg( 'continue-editing' ) . ']]';
}
$parserOptions = ParserOptions::newFromUser( $wgUser );
$parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
# don't parse non-wikitext pages, show message about preview
- # XXX: stupid php bug won't let us use $this->getContextTitle()->isCssJsSubpage() here -- This note has been there since r3530. Sure the bug was fixed time ago?
-
- if ( $this->isCssJsSubpage || !$this->mTitle->isWikitextPage() ) {
+ if ( $this->mTitle->isCssJsSubpage() || !$this->mTitle->isWikitextPage() ) {
if ( $this->mTitle->isCssJsSubpage() ) {
$level = 'user';
} elseif ( $this->mTitle->isCssOrJsPage() ) {
# Used messages to make sure grep find them:
# Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
+ $class = 'mw-code';
if ( $level ) {
if ( preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
$previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMsg( "{$level}csspreview" ) . "\n</div>";
- $class = "mw-code mw-css";
+ $class .= " mw-css";
} elseif ( preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
$previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMsg( "{$level}jspreview" ) . "\n</div>";
- $class = "mw-code mw-js";
+ $class .= " mw-js";
} else {
throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
}
+ $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
+ $previewHTML = $parserOutput->getText();
+ } else {
+ $previewHTML = '';
}
- $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
- $previewHTML = $parserOutput->mText;
$previewHTML .= "<pre class=\"$class\" dir=\"ltr\">\n" . htmlspecialchars( $this->textbox1 ) . "\n</pre>\n";
} else {
$toparse = $this->textbox1;
global $wgExceptionHooks;
if ( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) ) {
- return; // Just silently ignore
+ return null; // Just silently ignore
}
if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
- return;
+ return null;
}
$hooks = $wgExceptionHooks[ $name ];
return $result;
}
}
+ return null;
}
/**
const TEXT = 0;
const STUB = 1;
+ var $buffer;
+
+ var $text;
+
+ /**
+ * @var DumpOutput
+ */
+ var $sink;
+
/**
* If using WikiExporter::STREAM to stream a large amount of data,
* provide a database connection which is not managed by
' AND page_title=' . $this->db->addQuotes( $title->getDBkey() ) );
}
+ /**
+ * @param $name string
+ * @throws MWException
+ */
public function pageByName( $name ) {
$title = Title::newFromText( $name );
if ( is_null( $title ) ) {
}
}
+ /**
+ * @param $names array
+ */
public function pagesByName( $names ) {
foreach ( $names as $name ) {
$this->pageByName( $name );
$this->dumpFrom( '' );
}
+ /**
+ * @param $start int
+ * @param $end int
+ */
public function logsByRange( $start, $end ) {
$condition = 'log_id >= ' . intval( $start );
if ( $end ) {
$this->dumpFrom( $condition );
}
- # Generates the distinct list of authors of an article
- # Not called by default (depends on $this->list_authors)
- # Can be set by Special:Export when not exporting whole history
+ /**
+ * Generates the distinct list of authors of an article
+ * Not called by default (depends on $this->list_authors)
+ * Can be set by Special:Export when not exporting whole history
+ *
+ * @param $cond
+ */
protected function do_list_authors( $cond ) {
wfProfileIn( __METHOD__ );
$this->author_list = "<contributors>";
wfProfileOut( __METHOD__ );
}
+ /**
+ * @param $cond string
+ * @throws MWException
+ * @throws Exception
+ */
protected function dumpFrom( $cond = '' ) {
wfProfileIn( __METHOD__ );
# For logging dumps...
}
}
+ /**
+ * @param $resultset array
+ */
protected function outputLogStream( $resultset ) {
foreach ( $resultset as $row ) {
$output = $this->writer->writeLogItem( $row );
$this->siteInfo();
}
+ /**
+ * @return string
+ */
function siteInfo() {
$info = array(
$this->sitename(),
"\n </siteinfo>\n";
}
+ /**
+ * @return string
+ */
function sitename() {
global $wgSitename;
return Xml::element( 'sitename', array(), $wgSitename );
}
+ /**
+ * @return string
+ */
function generator() {
global $wgVersion;
return Xml::element( 'generator', array(), "MediaWiki $wgVersion" );
}
+ /**
+ * @return string
+ */
function homelink() {
return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalUrl() );
}
+ /**
+ * @return string
+ */
function caseSetting() {
global $wgCapitalLinks;
// "case-insensitive" option is reserved for future
return Xml::element( 'case', array(), $sensitivity );
}
+ /**
+ * @return string
+ */
function namespaces() {
global $wgContLang;
$spaces = "<namespaces>\n";
if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
$out .= " " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
} elseif ( $row->rev_comment != '' ) {
- $out .= " " . Xml::elementClean( 'comment', null, strval( $row->rev_comment ) ) . "\n";
+ $out .= " " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
}
$text = '';
return $out;
}
+ /**
+ * @param $timestamp string
+ * @return string
+ */
function writeTimestamp( $timestamp ) {
$ts = wfTimestamp( TS_ISO_8601, $timestamp );
return " " . Xml::element( 'timestamp', null, $ts ) . "\n";
}
+ /**
+ * @param $id
+ * @param $text string
+ * @return string
+ */
function writeContributor( $id, $text ) {
$out = " <contributor>\n";
if ( $id || !IP::isValid( $text ) ) {
/**
* Warning! This data is potentially inconsistent. :(
+ * @param $row
+ * @param $dumpContents bool
* @return string
*/
function writeUploads( $row, $dumpContents = false ) {
* @ingroup Dump
*/
class DumpOutput {
+
+ /**
+ * @param $string string
+ */
function writeOpenStream( $string ) {
$this->write( $string );
}
+ /**
+ * @param $string string
+ */
function writeCloseStream( $string ) {
$this->write( $string );
}
+ /**
+ * @param $page
+ * @param $string string
+ */
function writeOpenPage( $page, $string ) {
$this->write( $string );
}
+ /**
+ * @param $string string
+ */
function writeClosePage( $string ) {
$this->write( $string );
}
+ /**
+ * @param $rev
+ * @param $string string
+ */
function writeRevision( $rev, $string ) {
$this->write( $string );
}
+ /**
+ * @param $rev
+ * @param $string string
+ */
function writeLogItem( $rev, $string ) {
$this->write( $string );
}
/**
* Override to write to a different stream type.
+ * @param $string string
* @return bool
*/
function write( $string ) {
class DumpFileOutput extends DumpOutput {
protected $handle = false, $filename;
+ /**
+ * @param $file
+ */
function __construct( $file ) {
$this->handle = fopen( $file, "wt" );
$this->filename = $file;
}
+ /**
+ * @param $string string
+ */
function writeCloseStream( $string ) {
parent::writeCloseStream( $string );
if ( $this->handle ) {
}
}
+ /**
+ * @param $string string
+ */
function write( $string ) {
fputs( $this->handle, $string );
}
+ /**
+ * @param $newname
+ */
function closeRenameAndReopen( $newname ) {
$this->closeAndRename( $newname, true );
}
+ /**
+ * @param $newname
+ * @throws MWException
+ */
function renameOrException( $newname ) {
if (! rename( $this->filename, $newname ) ) {
throw new MWException( __METHOD__ . ": rename of file {$this->filename} to $newname failed\n" );
}
}
+ /**
+ * @param $newname array
+ * @return mixed
+ * @throws MWException
+ */
function checkRenameArgCount( $newname ) {
if ( is_array( $newname ) ) {
if ( count( $newname ) > 1 ) {
return $newname;
}
+ /**
+ * @param $newname mixed
+ * @param $open bool
+ */
function closeAndRename( $newname, $open = false ) {
$newname = $this->checkRenameArgCount( $newname );
if ( $newname ) {
}
}
+ /**
+ * @return string|null
+ */
function getFilenames() {
return $this->filename;
}
protected $command, $filename;
protected $procOpenResource = false;
+ /**
+ * @param $command
+ * @param $file null
+ */
function __construct( $command, $file = null ) {
if ( !is_null( $file ) ) {
$command .= " > " . wfEscapeShellArg( $file );
$this->filename = $file;
}
+ /**
+ * @param $string string
+ */
function writeCloseStream( $string ) {
parent::writeCloseStream( $string );
if ( $this->procOpenResource ) {
}
}
+ /**
+ * @param $command
+ */
function startCommand( $command ) {
$spec = array(
0 => array( "pipe", "r" ),
$this->handle = $pipes[0];
}
+ /**
+ * @param mixed $newname
+ */
function closeRenameAndReopen( $newname ) {
$this->closeAndRename( $newname, true );
}
+ /**
+ * @param $newname mixed
+ * @param $open bool
+ */
function closeAndRename( $newname, $open = false ) {
$newname = $this->checkRenameArgCount( $newname );
if ( $newname ) {
* @ingroup Dump
*/
class DumpGZipOutput extends DumpPipeOutput {
+
+ /**
+ * @param $file string
+ */
function __construct( $file ) {
parent::__construct( "gzip", $file );
}
* @ingroup Dump
*/
class DumpBZip2Output extends DumpPipeOutput {
+
+ /**
+ * @param $file string
+ */
function __construct( $file ) {
parent::__construct( "bzip2", $file );
}
* @ingroup Dump
*/
class Dump7ZipOutput extends DumpPipeOutput {
+
+ /**
+ * @param $file string
+ */
function __construct( $file ) {
$command = $this->setup7zCommand( $file );
parent::__construct( $command );
$this->filename = $file;
}
+ /**
+ * @param $file string
+ * @return string
+ */
function setup7zCommand( $file ) {
$command = "7za a -bd -si " . wfEscapeShellArg( $file );
// Suppress annoying useless crap from p7zip
return( $command );
}
+ /**
+ * @param $newname string
+ * @param $open bool
+ */
function closeAndRename( $newname, $open = false ) {
$newname = $this->checkRenameArgCount( $newname );
if ( $newname ) {
}
}
-
-
/**
* Dump output filter class.
* This just does output filtering and streaming; XML formatting is done
* @ingroup Dump
*/
class DumpFilter {
+
+ /**
+ * @var DumpOutput
+ */
+ protected $sink;
+
+ /**
+ * @var bool
+ */
+ protected $sendingThisPage;
+
+ /**
+ * @param $sink DumpOutput
+ */
function __construct( &$sink ) {
$this->sink =& $sink;
}
+ /**
+ * @param $string string
+ */
function writeOpenStream( $string ) {
$this->sink->writeOpenStream( $string );
}
+ /**
+ * @param $string string
+ */
function writeCloseStream( $string ) {
$this->sink->writeCloseStream( $string );
}
+ /**
+ * @param $page
+ * @param $string string
+ */
function writeOpenPage( $page, $string ) {
$this->sendingThisPage = $this->pass( $page, $string );
if ( $this->sendingThisPage ) {
}
}
+ /**
+ * @param $string string
+ */
function writeClosePage( $string ) {
if ( $this->sendingThisPage ) {
$this->sink->writeClosePage( $string );
}
}
+ /**
+ * @param $rev
+ * @param $string string
+ */
function writeRevision( $rev, $string ) {
if ( $this->sendingThisPage ) {
$this->sink->writeRevision( $rev, $string );
}
}
+ /**
+ * @param $rev
+ * @param $string string
+ */
function writeLogItem( $rev, $string ) {
$this->sink->writeRevision( $rev, $string );
}
+ /**
+ * @param $newname string
+ */
function closeRenameAndReopen( $newname ) {
$this->sink->closeRenameAndReopen( $newname );
}
+ /**
+ * @param $newname string
+ * @param $open bool
+ */
function closeAndRename( $newname, $open = false ) {
$this->sink->closeAndRename( $newname, $open );
}
+ /**
+ * @return array
+ */
function getFilenames() {
return $this->sink->getFilenames();
}
/**
* Override for page-based filter types.
+ * @param $page
* @return bool
*/
function pass( $page ) {
* @ingroup Dump
*/
class DumpNotalkFilter extends DumpFilter {
+
+ /**
+ * @param $page
+ * @return bool
+ */
function pass( $page ) {
return !MWNamespace::isTalk( $page->page_namespace );
}
var $invert = false;
var $namespaces = array();
+ /**
+ * @param $sink DumpOutput
+ * @param $param
+ */
function __construct( &$sink, $param ) {
parent::__construct( $sink );
}
}
+ /**
+ * @param $page
+ * @return bool
+ */
function pass( $page ) {
$match = isset( $this->namespaces[$page->page_namespace] );
return $this->invert xor $match;
class DumpLatestFilter extends DumpFilter {
var $page, $pageString, $rev, $revString;
+ /**
+ * @param $page
+ * @param $string string
+ */
function writeOpenPage( $page, $string ) {
$this->page = $page;
$this->pageString = $string;
}
+ /**
+ * @param $string string
+ */
function writeClosePage( $string ) {
if ( $this->rev ) {
$this->sink->writeOpenPage( $this->page, $this->pageString );
$this->pageString = null;
}
+ /**
+ * @param $rev
+ * @param $string string
+ */
function writeRevision( $rev, $string ) {
if ( $rev->rev_id == $this->page->page_latest ) {
$this->rev = $rev;
* @ingroup Dump
*/
class DumpMultiWriter {
+
+ /**
+ * @param $sinks
+ */
function __construct( $sinks ) {
$this->sinks = $sinks;
$this->count = count( $sinks );
}
+ /**
+ * @param $string string
+ */
function writeOpenStream( $string ) {
for ( $i = 0; $i < $this->count; $i++ ) {
$this->sinks[$i]->writeOpenStream( $string );
}
}
+ /**
+ * @param $string string
+ */
function writeCloseStream( $string ) {
for ( $i = 0; $i < $this->count; $i++ ) {
$this->sinks[$i]->writeCloseStream( $string );
}
}
+ /**
+ * @param $page
+ * @param $string string
+ */
function writeOpenPage( $page, $string ) {
for ( $i = 0; $i < $this->count; $i++ ) {
$this->sinks[$i]->writeOpenPage( $page, $string );
}
}
+ /**
+ * @param $string
+ */
function writeClosePage( $string ) {
for ( $i = 0; $i < $this->count; $i++ ) {
$this->sinks[$i]->writeClosePage( $string );
}
}
+ /**
+ * @param $rev
+ * @param $string
+ */
function writeRevision( $rev, $string ) {
for ( $i = 0; $i < $this->count; $i++ ) {
$this->sinks[$i]->writeRevision( $rev, $string );
}
}
+ /**
+ * @param $newnames
+ */
function closeRenameAndReopen( $newnames ) {
$this->closeAndRename( $newnames, true );
}
+ /**
+ * @param $newnames array
+ * @param bool $open
+ */
function closeAndRename( $newnames, $open = false ) {
for ( $i = 0; $i < $this->count; $i++ ) {
$this->sinks[$i]->closeAndRename( $newnames[$i], $open );
}
}
+ /**
+ * @return array
+ */
function getFilenames() {
$filenames = array();
for ( $i = 0; $i < $this->count; $i++ ) {
}
+/**
+ * @param $string string
+ * @return string
+ */
function xmlsafe( $string ) {
wfProfileIn( __FUNCTION__ );
} elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
$type = "Edit file";
$image = wfLocalFile( $this->getTitle() );
- $urls = array( 'File' => array(
- 'Extension' => $image->getExtension(),
- 'URL' => $image->getCanonicalURL()
- ) );
+ if ( $image ) {
+ $urls = array(
+ 'File' => array(
+ 'Extension' => $image->getExtension(),
+ 'URL' => $image->getCanonicalURL()
+ )
+ );
+ } else{
+ $urls = array();
+ }
} else {
$type = "Edit text";
# *.wiki file extension is used by some editors for syntax
// Don't share DB, storage, or memcached connections
wfGetLBFactory()->destroyInstance();
FileBackendGroup::destroySingleton();
+ LockManagerGroup::destroySingleton();
ObjectCache::clear();
$wgMemc = null;
}
if ( preg_match( "/ref: (.*)/", $HEAD, $m ) ) {
return rtrim( $m[1] );
} else {
- return $HEAD;
+ return rtrim( $HEAD );
}
}
$diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
if ( $this->getTitle()->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) {
- return parent::view();
+ parent::view();
+ return;
}
$this->loadFile();
// mTitle is the same as the redirect target so ask Article
// to perform the redirect for us.
$wgRequest->setVal( 'diffonly', 'true' );
- return parent::view();
+ parent::view();
+ return;
} else {
// mTitle is not the same as the redirect target so it is
// probably the redirect page itself. Fake the redirect symbol
$extraQuery
);
$context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
- // Drop modules that know they're empty
+ // Extract modules that know they're empty
+ $emptyModules = array ();
foreach ( $modules as $key => $module ) {
if ( $module->isKnownEmpty( $context ) ) {
+ $emptyModules[$key] = 'ready';
unset( $modules[$key] );
}
}
+ // Inline empty modules: since they're empty, just mark them as 'ready'
+ if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
+ // If we're only getting the styles, we don't need to do anything for empty modules.
+ $links .= Html::inlineScript(\r
+ ResourceLoader::makeLoaderConditionalScript(\r
+ ResourceLoader::makeLoaderStateScript( $emptyModules )\r
+ )\r
+ ) . "\n";
+ }
+
// If there are no modules left, skip this group
if ( $modules === array() ) {
continue;
// Automatically select style/script elements
if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
$link = Html::linkedStyle( $url );
- } else if ( $loadCall ) {
+ } else if ( $loadCall ) {
$link = Html::inlineScript(
ResourceLoader::makeLoaderConditionalScript(
Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
*/
function getHeadScripts() {
global $wgResourceLoaderExperimentalAsyncLoading;
-
+
// Startup - this will immediately load jquery and mediawiki modules
$scripts = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
)
);
}
-
+
if ( $wgResourceLoaderExperimentalAsyncLoading ) {
$scripts .= $this->getScriptsForBottomQueue( true );
}
// Legacy Scripts
$scripts .= "\n" . $this->mScripts;
- $userScripts = array();
+ $defaultModules = array();
// Add site JS if enabled
if ( $wgUseSiteJs ) {
$scripts .= $this->makeResourceLoaderLink( 'site', ResourceLoaderModule::TYPE_SCRIPTS,
/* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
);
- if( $this->getUser()->isLoggedIn() ){
- $userScripts[] = 'user.groups';
- }
+ $defaultModules['site'] = 'loading';
+ } else {
+ // The wiki is configured to not allow a site module.
+ $defaultModules['site'] = 'missing';
}
// Add user JS if enabled
- if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() ) {
- if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
- # XXX: additional security check/prompt?
- // We're on a preview of a JS subpage
- // Exclude this page from the user module in case it's in there (bug 26283)
- $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
- array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
- );
- // Load the previewed JS
- $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+ if ( $wgAllowUserJs ) {
+ if ( $this->getUser()->isLoggedIn() ) {
+ if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+ # XXX: additional security check/prompt?
+ // We're on a preview of a JS subpage
+ // Exclude this page from the user module in case it's in there (bug 26283)
+ $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
+ array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
+ );
+ // Load the previewed JS
+ $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+ // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
+ // asynchronously and may arrive *after* the inline script here. So the previewed code
+ // may execute before ./common.js runs. Normally, ./common.js runs before ./vector.js...
+ } else {
+ // Include the user module normally, i.e., raw to avoid it being wrapped in a closure.
+ $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+ /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+ );
+ }
+ $defaultModules['user'] = 'loading';
} else {
- // Include the user module normally
- // We can't do $userScripts[] = 'user'; because the user module would end up
- // being wrapped in a closure, so load it raw like 'site'
- $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+ // Non-logged-in users have no user module. Treat it as empty and 'ready' to avoid
+ // blocking default gadgets that might depend on it. Although arguably default-enabled
+ // gadgets should not depend on the user module, it's harmless and less error-prone to
+ // handle this case.
+ $defaultModules['user'] = 'ready';
+ }
+ } else {
+ // User JS disabled
+ $defaultModules['user'] = 'missing';
+ }
+
+ // Group JS is only enabled if site JS is enabled.
+ if ( $wgUseSiteJs ) {
+ if ( $this->getUser()->isLoggedIn() ) {
+ $scripts .= $this->makeResourceLoaderLink( 'user.groups', ResourceLoaderModule::TYPE_COMBINED,
/* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
);
+ $defaultModules['user.groups'] = 'loading';
+ } else {
+ // Non-logged-in users have no user.groups module. Treat it as empty and 'ready' to
+ // avoid blocking gadgets that might depend upon the module.
+ $defaultModules['user.groups'] = 'ready';
}
+ } else {
+ // Site (and group JS) disabled
+ $defaultModules['user.groups'] = 'missing';
}
- $scripts .= $this->makeResourceLoaderLink( $userScripts, ResourceLoaderModule::TYPE_COMBINED,
- /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
- );
- return $scripts;
+ $loaderInit = '';
+ if ( $inHead ) {
+ // We generate loader calls anyway, so no need to fix the client-side loader's state to 'loading'.
+ foreach ( $defaultModules as $m => $state ) {
+ if ( $state == 'loading' ) {
+ unset( $defaultModules[$m] );
+ }
+ }
+ }
+ if ( count( $defaultModules ) > 0 ) {
+ $loaderInit = Html::inlineScript(
+ ResourceLoader::makeLoaderConditionalScript(
+ ResourceLoader::makeLoaderStateScript( $defaultModules )
+ )
+ ) . "\n";
+ }
+ return $loaderInit . $scripts;
}
/**
}
/**
- * @param $unused
- * @param $addContentType bool
+ * @param $addContentType bool: Whether <meta> specifying content type should be returned
*
- * @return string HTML tag links to be put in the header.
+ * @return array in format "link name or number => 'link html'".
*/
- public function getHeadLinks( $unused = null, $addContentType = false ) {
+ public function getHeadLinksArray( $addContentType = false ) {
global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
$wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
$wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
if ( $wgHtml5 ) {
# More succinct than <meta http-equiv=Content-Type>, has the
# same effect
- $tags[] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+ $tags['meta-charset'] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
} else {
- $tags[] = Html::element( 'meta', array(
+ $tags['meta-content-type'] = Html::element( 'meta', array(
'http-equiv' => 'Content-Type',
'content' => "$wgMimeType; charset=UTF-8"
) );
- $tags[] = Html::element( 'meta', array( // bug 15835
+ $tags['meta-content-style-type'] = Html::element( 'meta', array( // bug 15835
'http-equiv' => 'Content-Style-Type',
'content' => 'text/css'
) );
}
}
- $tags[] = Html::element( 'meta', array(
+ $tags['meta-generator'] = Html::element( 'meta', array(
'name' => 'generator',
'content' => "MediaWiki $wgVersion",
) );
if( $p !== 'index,follow' ) {
// http://www.robotstxt.org/wc/meta-user.html
// Only show if it's different from the default robots policy
- $tags[] = Html::element( 'meta', array(
+ $tags['meta-robots'] = Html::element( 'meta', array(
'name' => 'robots',
'content' => $p,
) );
"/<.*?" . ">/" => '',
"/_/" => ' '
);
- $tags[] = Html::element( 'meta', array(
+ $tags['meta-keywords'] = Html::element( 'meta', array(
'name' => 'keywords',
'content' => preg_replace(
array_keys( $strip ),
} else {
$a = 'name';
}
- $tags[] = Html::element( 'meta',
+ $tagName = "meta-{$tag[0]}";
+ if ( isset( $tags[$tagName] ) ) {
+ $tagName .= $tag[1];
+ }
+ $tags[$tagName] = Html::element( 'meta',
array(
$a => $tag[0],
'content' => $tag[1]
&& ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
// Original UniversalEditButton
$msg = $this->msg( 'edit' )->text();
- $tags[] = Html::element( 'link', array(
+ $tags['universal-edit-button'] = Html::element( 'link', array(
'rel' => 'alternate',
'type' => 'application/x-wiki',
'title' => $msg,
'href' => $this->getTitle()->getLocalURL( 'action=edit' )
) );
// Alternate edit link
- $tags[] = Html::element( 'link', array(
+ $tags['alternative-edit'] = Html::element( 'link', array(
'rel' => 'edit',
'title' => $msg,
'href' => $this->getTitle()->getLocalURL( 'action=edit' )
# uses whichever one appears later in the HTML source. Make sure
# apple-touch-icon is specified first to avoid this.
if ( $wgAppleTouchIcon !== false ) {
- $tags[] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
+ $tags['apple-touch-icon'] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
}
if ( $wgFavicon !== false ) {
- $tags[] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
+ $tags['favicon'] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
}
# OpenSearch description link
- $tags[] = Html::element( 'link', array(
+ $tags['opensearch'] = Html::element( 'link', array(
'rel' => 'search',
'type' => 'application/opensearchdescription+xml',
'href' => wfScript( 'opensearch_desc' ),
# for the MediaWiki API (and potentially additional custom API
# support such as WordPress or Twitter-compatible APIs for a
# blogging extension, etc)
- $tags[] = Html::element( 'link', array(
+ $tags['rsd'] = Html::element( 'link', array(
'rel' => 'EditURI',
'type' => 'application/rsd+xml',
// Output a protocol-relative URL here if $wgServer is protocol-relative
if ( !$urlvar ) {
$variants = $lang->getVariants();
foreach ( $variants as $_v ) {
- $tags[] = Html::element( 'link', array(
+ $tags["variant-$_v"] = Html::element( 'link', array(
'rel' => 'alternate',
'hreflang' => $_v,
'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
);
}
} else {
- $tags[] = Html::element( 'link', array(
+ $tags['canonical'] = Html::element( 'link', array(
'rel' => 'canonical',
'href' => $this->getTitle()->getCanonicalUrl()
) );
}
if ( $copyright ) {
- $tags[] = Html::element( 'link', array(
+ $tags['copyright'] = Html::element( 'link', array(
'rel' => 'copyright',
'href' => $copyright )
);
}
}
}
- return implode( "\n", $tags );
+ return $tags;
+ }
+
+ /**
+ * @param $unused
+ * @param $addContentType bool: Whether <meta> specifying content type should be returned
+ *
+ * @return string HTML tag links to be put in the header.
+ */
+ public function getHeadLinks( $unused = null, $addContentType = false ) {
+ return implode( "\n", $this->getHeadLinksArray( $addContentType ) );
}
/**
$otherTags .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() )
);
-
+
// Load the previewed CSS
// If needed, Janus it first. This is user-supplied CSS, so it's
// assumed to be right for the content language directionality.
* the relevant contents
* - The default behavior is equivalent to `array( 'title' => '$1' )`,
* if you don't want the title parameter you can explicitly use `array( 'title' => false )`
- * - You can specify a value that won't have replacements in it
+ * - You can specify a value that won't have replacements in it
* using `'foo' => array( 'value' => 'bar' );`
*
* Options:
*/
class PathRouter {
+ /**
+ * @var array
+ */
+ private $patterns = array();
+
/**
* Protected helper to do the actual bulk work of adding a single pattern.
* This is in a separate method so that add() can handle the difference between
* a single string $path and an array() $path that contains multiple path
* patterns each with an associated $key to pass on.
+ * @param $path string
+ * @param $params array
+ * @param $options array
+ * @param $key null|string
*/
protected function doAdd( $path, $params, $options, $key = null ) {
// Make sure all paths start with a /
/**
* Add a new path pattern to the path router with the strict option on
* @see self::add
+ * @param $path string|array
+ * @param $params array
+ * @param $options array
*/
public function addStrict( $path, $params = array(), $options = array() ) {
$options['strict'] = true;
array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
}
+ /**
+ * @param $pattern object
+ * @return float|int
+ */
protected static function makeWeight( $pattern ) {
# Start with a weight of 0
$weight = 0;
// Make sure our patterns are sorted by weight so the most specific
// matches are tested first
$this->sortByWeight();
-
+
$matches = null;
foreach ( $this->patterns as $pattern ) {
return is_null( $matches ) ? array() : $matches;
}
+ /**
+ * @param $path string
+ * @param $pattern string
+ * @return array|null
+ */
protected static function extractTitle( $path, $pattern ) {
// Convert the path pattern into a regexp we can match with
$regexp = preg_quote( $pattern->path, '#' );
* We do this inside of a replacement callback because after replacement we can't tell the
* difference between a $1 that was not replaced and a $1 that was part of
* the content a $1 was replaced with.
+ * @param $value string
+ * @return string
*/
public function replace( $value ) {
$this->error = false;
return $value;
}
+ /**
+ * @param $m array
+ * @return string
+ */
protected function callback( $m ) {
if ( $m[1] == "key" ) {
if ( is_null( $this->key ) ) {
var $mRedirect = null; // /< Is the article at this title a redirect?
var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false
var $mBacklinkCache = null; // /< Cache of links to this title
+ var $mHasSubpage; // /< Whether a page has any subpages
// @}
* fied by a prefix. If you want to force a specific namespace even if
* $text might begin with a namespace prefix, use makeTitle() or
* makeTitleSafe().
- * @return Title, or null on an error.
+ * @throws MWException
+ * @return Title|null - Title or null on an error.
*/
public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
if ( is_object( $text ) ) {
}
}
- // Strip off subpages
- $pagename = $this->getText();
- if ( strpos( $pagename, '/' ) !== false ) {
- list( $username , ) = explode( '/', $pagename, 2 );
- } else {
- $username = $pagename;
- }
-
if ( $wgContLang->needsGenderDistinction() &&
MWNamespace::hasGenderDistinction( $this->mNamespace ) ) {
- $gender = GenderCache::singleton()->getGenderOf( $username, __METHOD__ );
+ $gender = GenderCache::singleton()->getGenderOf( $this->getText(), __METHOD__ );
return $wgContLang->getGenderNsText( $this->mNamespace, $gender );
}
* This is MUCH simpler than individually testing for equivilance
* against both NS_USER and NS_USER_TALK, and is also forward compatible.
* @since 1.19
+ * @param $ns int
* @return bool
*/
public function hasSubjectNamespace( $ns ) {
* andthe wfArrayToCGI moved to getLocalURL();
*
* @since 1.19 (r105919)
+ * @param $query
+ * @param $query2 bool
* @return String
*/
private static function fixUrlQueryArgs( $query, $query2 = false ) {
* See getLocalURL for the arguments.
*
* @see self::getLocalURL
+ * @param $query string
+ * @param $query2 bool|string
* @return String the URL
*/
public function escapeLocalURL( $query = '', $query2 = false ) {
/**
* Get the expiry time for the restriction against a given action
*
+ * @param $action
* @return String|Bool 14-char timestamp, or 'infinity' if the page is protected forever
- * or not protected at all, or false if the action is not recognised.
+ * or not protected at all, or false if the action is not recognised.
*/
public function getRestrictionExpiry( $action ) {
if ( !$this->mRestrictionsLoaded ) {
* $wgLang (such as special pages, which are in the user language).
*
* @since 1.18
- * @return object Language
+ * @return Language
*/
public function getPageLanguage() {
global $wgLang;
/**
* HTML-safe version of appendQuery().
+ * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
*
* @param $query String: query string fragment; do not include initial '?'
* @return String
* @return WikiPage|null
*/
public static function newFromID( $id ) {
- $t = Title::newFromID( $id );
- if ( $t ) {
- return self::factory( $t );
+ $dbr = wfGetDB( DB_SLAVE );
+ $row = $dbr->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+ if ( !$row ) {
+ return null;
}
- return null;
+ return self::newFromRow( $row );
+ }
+
+ /**
+ * Constructor from a database row
+ *
+ * @since 1.20
+ * @param $row object: database row containing at least fields returned
+ * by selectFields().
+ * @return WikiPage
+ */
+ public static function newFromRow( $row ) {
+ $page = self::factory( Title::newFromRow( $row ) );
+ $page->loadFromRow( $row );
+ return $page;
}
/**
}
}
+ $this->loadFromRow( $data );
+ }
+
+ /**
+ * Load the object from a database row
+ *
+ * @since 1.20
+ * @param $data object: database row containing at least fields returned
+ * by selectFields()
+ */
+ public function loadFromRow( $data ) {
$lc = LinkCache::singleton();
if ( $data ) {
* @param &$cascade Integer. Set to false if cascading protection isn't allowed.
* @param $expiry Array: per restriction type expiration
* @param $user User The user updating the restrictions
- * @return bool true on success
+ * @return Status
*/
public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
global $wgContLang;
);
}
+ /**
+ * @param $params array
+ * @return Title
+ */
+ public function getTitleOrPageId( $params ) {
+ $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+ $titleObj = null;
+ if ( isset( $params['title'] ) ) {
+ $titleObj = Title::newFromText( $params['title'] );
+ if ( !$titleObj ) {
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
+ } elseif ( isset( $params['pageid'] ) ) {
+ $titleObj = Title::newFromID( $params['pageid'] );
+ if ( !$titleObj ) {
+ $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+ }
+ }
+ return $titleObj;
+ }
+
+ /**
+ * @return array
+ */
+ public function getTitleOrPageIdErrorMessage() {
+ return array_merge(
+ $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+ array(
+ array( 'invalidtitle', 'title' ),
+ array( 'nosuchpageid', 'pageid' ),
+ )
+ );
+ }
+
/**
* Callback function used in requireOnlyOneParameter to check whether reequired parameters are set
*
'noimageredirect-anon' => array( 'code' => 'noimageredirect-anon', 'info' => "Anonymous users can't create image redirects" ),
'noimageredirect-logged' => array( 'code' => 'noimageredirect', 'info' => "You don't have permission to create image redirects" ),
'spamdetected' => array( 'code' => 'spamdetected', 'info' => "Your edit was refused because it contained a spam fragment: \"\$1\"" ),
- 'filtered' => array( 'code' => 'filtered', 'info' => "The filter callback function refused your edit" ),
'contenttoobig' => array( 'code' => 'contenttoobig', 'info' => "The content you supplied exceeds the article size limit of \$1 kilobytes" ),
'noedit-anon' => array( 'code' => 'noedit-anon', 'info' => "Anonymous users can't edit pages" ),
'noedit' => array( 'code' => 'noedit', 'info' => "You don't have permission to edit pages" ),
public function execute() {
$params = $this->extractRequestParams();
- $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
- if ( isset( $params['title'] ) ) {
- $titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
- }
- $pageObj = WikiPage::factory( $titleObj );
- $pageObj->loadPageData( 'fromdbmaster' );
- if ( !$pageObj->exists() ) {
- $this->dieUsageMsg( 'notanarticle' );
- }
- } elseif ( isset( $params['pageid'] ) ) {
- $pageObj = WikiPage::newFromID( $params['pageid'] );
- if ( !$pageObj ) {
- $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
- }
- $titleObj = $pageObj->getTitle();
+ $titleObj = $this->getTitleOrPageId( $params );
+ $pageObj = WikiPage::factory( $titleObj );
+ $pageObj->loadPageData( 'fromdbmaster' );
+ if ( !$pageObj->exists() ) {
+ $this->dieUsageMsg( 'notanarticle' );
}
$reason = ( isset( $params['reason'] ) ? $params['reason'] : null );
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(),
- $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+ $this->getTitleOrPageIdErrorMessage(),
array(
- array( 'invalidtitle', 'title' ),
- array( 'nosuchpageid', 'pageid' ),
array( 'notanarticle' ),
array( 'hookaborted', 'error' ),
array( 'delete-toobig', 'limit' ),
$this->dieUsageMsg( 'missingtext' );
}
- $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
- if ( isset( $params['title'] ) ) {
- $titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj || $titleObj->isExternal() ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
- }
- } elseif ( isset( $params['pageid'] ) ) {
- $titleObj = Title::newFromID( $params['pageid'] );
- if ( !$titleObj ) {
- $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
- }
+ $titleObj = $this->getTitleOrPageId( $params );
+ if ( $titleObj->isExternal() ) {
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
$apiResult = $this->getResult();
case EditPage::AS_SPAM_ERROR:
$this->dieUsageMsg( array( 'spamdetected', $result['spam'] ) );
- case EditPage::AS_FILTERING:
- $this->dieUsageMsg( 'filtered' );
-
case EditPage::AS_BLOCKED_PAGE_FOR_USER:
$this->dieUsageMsg( 'blockedtext' );
global $wgMaxArticleSize;
return array_merge( parent::getPossibleErrors(),
- $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+ $this->getTitleOrPageIdErrorMessage(),
array(
- array( 'nosuchpageid', 'pageid' ),
array( 'missingtext' ),
- array( 'invalidtitle', 'title' ),
array( 'createonly-exists' ),
array( 'nocreate-missing' ),
array( 'nosuchrevid', 'undo' ),
array( 'noimageredirect-logged' ),
array( 'spamdetected', 'spam' ),
array( 'summaryrequired' ),
- array( 'filtered' ),
array( 'blockedtext' ),
array( 'contenttoobig', $wgMaxArticleSize ),
array( 'noedit-anon' ),
'sectiontitle' => 'The title for a new section',
'text' => 'Page content',
'token' => array( 'Edit token. You can get one of these through prop=info.',
- 'The token should always be sent as the last parameter, or at least, after the text parameter'
+ "The token should always be sent as the last parameter, or at least, after the {$p}text parameter"
),
- 'summary' => 'Edit summary. Also section title when section=new',
+ 'summary' => "Edit summary. Also section title when {$p}section=new and {$p}sectiontitle is not set",
'minor' => 'Minor edit',
'notminor' => 'Non-minor edit',
'bot' => 'Mark this edit as bot',
'basetimestamp' => array( 'Timestamp of the base revision (obtained through prop=revisions&rvprop=timestamp).',
- 'Used to detect edit conflicts; leave unset to ignore conflicts.'
+ 'Used to detect edit conflicts; leave unset to ignore conflicts'
),
'starttimestamp' => array( 'Timestamp when you obtained the edit token.',
'Used to detect edit conflicts; leave unset to ignore conflicts'
'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
'If set, the edit won\'t be done unless the hash is correct' ),
'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text",
- 'appendtext' => "Add this text to the end of the page. Overrides {$p}text",
+ 'appendtext' => array( "Add this text to the end of the page. Overrides {$p}text.",
+ "Use {$p}section=new to append a new section" ),
'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext",
'undoafter' => 'Undo all revisions from undo to this one. If not set, just undo one revision',
'redirect' => 'Automatically resolve redirects',
'Subject' => $params['subject'],
'CCMe' => $params['ccme'],
);
- $retval = SpecialEmailUser::submit( $data );
+ $retval = SpecialEmailUser::submit( $data, $this->getContext() );
if ( $retval instanceof Status ) {
// SpecialEmailUser sometimes returns a status
public function getParamDescription() {
$params = array(
- 'filename' => 'Target filename',
+ 'filename' => 'Target filename without the File: prefix',
'token' => 'Edit token. You can get one of these through prop=info',
'comment' => 'Upload comment',
'archivename' => 'Archive name of the revision to revert to',
You are looking at the HTML representation of the <?php echo( $this->mFormat ); ?> format.<br />
HTML is good for debugging, but is unsuitable for application use.<br />
Specify the format parameter to change the output format.<br />
-To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( $this->mFormat ); ?>.<br />
+To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( strtolower( $this->mFormat ) ); ?>.<br />
See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
<a href='<?php echo( $script ); ?>'>API help</a> for more information.
</small>
function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
// Add a result entry
$r = array();
- ApiQueryBase::addTitleInfo( $r, $title );
- $r['revisions'] = intval( $successCount );
+
+ if ( $title === null ) {\r
+ # Invalid or non-importable title
+ $r['title'] = $pageInfo['title'];
+ $r['invalid'] = '';\r
+ } else {\r
+ ApiQueryBase::addTitleInfo( $r, $title );
+ $r['revisions'] = intval( $successCount );
+ }
+
$this->mResultArr[] = $r;
// Piggyback on the parent to do the logging
// Try the parser cache first
// getParserOutput will save to Parser cache if able
$pout = $page->getParserOutput( $popts );
+ if ( !$pout ) {
+ $this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' );
+ }
if ( $getWikitext ) {
$this->text = $page->getRawText();
}
global $wgRestrictionLevels;
$params = $this->extractRequestParams();
- $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
- if ( isset( $params['title'] ) ) {
- $titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
- }
- } elseif ( isset( $params['pageid'] ) ) {
- $titleObj = Title::newFromID( $params['pageid'] );
- if ( !$titleObj ) {
- $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
- }
- }
+ $titleObj = $this->getTitleOrPageId( $params );
+ $pageObj = WikiPage::factory( $titleObj );
$errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
if ( $errors ) {
$watch = $params['watch'] ? 'watch' : $params['watchlist'];
$this->setWatch( $watch, $titleObj );
- $pageObj = WikiPage::factory( $titleObj );
$status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
if ( !$status->isOK() ) {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(),
- $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+ $this->getTitleOrPageIdErrorMessage(),
array(
- array( 'invalidtitle', 'title' ),
- array( 'nosuchpageid', 'pageid' ),
array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ),
array( 'create-titleexists' ),
array( 'missingtitle-createonly' ),
parent::__construct( $query, $moduleName, 'au' );
}
+ /**
+ * This function converts the user name to a canonical form
+ * which is stored in the database.
+ * @param String $name
+ * @return String
+ */
+ private function getCanonicalUserName( $name ) {
+ return str_replace( '_', ' ', $name );
+ }
+
public function execute() {
$db = $this->getDB();
$params = $this->extractRequestParams();
$useIndex = true;
$dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
- $from = is_null( $params['from'] ) ? null : $this->keyToTitle( $params['from'] );
- $to = is_null( $params['to'] ) ? null : $this->keyToTitle( $params['to'] );
+ $from = is_null( $params['from'] ) ? null : $this->getCanonicalUserName( $params['from'] );
+ $to = is_null( $params['to'] ) ? null : $this->getCanonicalUserName( $params['to'] );
# MySQL doesn't seem to use 'equality propagation' here, so like the
# ActiveUsers special page, we have to use rc_user_text for some cases.
if ( !is_null( $params['prefix'] ) ) {
$this->addWhere( $userFieldToSort .
- $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) );
+ $db->buildLike( $this->getCanonicalUserName( $params['prefix'] ), $db->anyString() ) );
}
if ( !is_null( $params['rights'] ) ) {
$lastUserData = null;
if ( !$fit ) {
- $this->setContinueEnumParameter( 'from',
- $this->keyToTitle( $lastUserData['name'] ) );
+ $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
break;
}
}
if ( $count > $limit ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
- $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->user_name ) );
+ $this->setContinueEnumParameter( 'from', $row->user_name );
break;
}
'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' );
}
- $lastUserObj = User::newFromName( $lastUser );
+ $lastUserObj = User::newFromId( $row->user_id );
// Add user's group info
if ( $fld_groups ) {
- if ( !isset( $lastUserData['groups'] ) && $lastUserObj ) {
- $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+ if ( !isset( $lastUserData['groups'] ) ) {
+ if ( $lastUserObj ) {
+ $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+ } else {
+ // This should not normally happen
+ $lastUserData['groups'] = array();
+ }
}
if ( !is_null( $row->ug_group2 ) ) {
$lastUserData['groups'][] = $row->ug_group2;
}
+
$result->setIndexedTagName( $lastUserData['groups'], 'g' );
}
$result->setIndexedTagName( $lastUserData['implicitgroups'], 'g' );
}
if ( $fld_rights ) {
- if ( !isset( $lastUserData['rights'] ) && $lastUserObj ) {
- $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+ if ( !isset( $lastUserData['rights'] ) ) {
+ if ( $lastUserObj ) {
+ $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+ } else {
+ // This should not normally happen
+ $lastUserData['rights'] = array();
+ }
}
+
if ( !is_null( $row->ug_group2 ) ) {
$lastUserData['rights'] = array_unique( array_merge( $lastUserData['rights'],
User::getGroupPermissions( array( $row->ug_group2 ) ) ) );
}
+
$result->setIndexedTagName( $lastUserData['rights'], 'r' );
}
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ),
null, $lastUserData );
if ( !$fit ) {
- $this->setContinueEnumParameter( 'from',
- $this->keyToTitle( $lastUserData['name'] ) );
+ $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
}
}
if ( !is_null( $this->params['continue'] ) ) {
$this->parseContinueParam();
} else {
- if ( $this->params['title'] !== '' ) {
- $title = Title::newFromText( $this->params['title'] );
- if ( !$title ) {
- $this->dieUsageMsg( array( 'invalidtitle', $this->params['title'] ) );
- } else {
- $this->rootTitle = $title;
- }
- }
+ $this->rootTitle = $this->getTitleOrPageId( $this->params );
}
// only image titles are allowed for the root in imageinfo mode
$retval = array(
'title' => array(
ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => true
+ ),
+ 'pageid' => array(
+ ApiBase::PARAM_TYPE => 'integer',
),
'continue' => null,
'namespace' => array(
public function getParamDescription() {
$retval = array(
- 'title' => 'Title to search',
+ 'title' => "Title to search. Cannot be used together with {$this->bl_code}pageid",
+ 'pageid' => "Pageid to search. Cannot be used together with {$this->bl_code}title",
'continue' => 'When more results are available, use this to continue',
'namespace' => 'The namespace to enumerate',
);
}
public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'invalidtitle', 'title' ),
- array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
- ) );
+ return array_merge( parent::getPossibleErrors(),
+ $this->getTitleOrPageIdErrorMessage(),
+ array(
+ array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
+ array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+ )
+ );
}
public function getExamples() {
private function run( $resultPageSet = null ) {
$params = $this->extractRequestParams();
- $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
- if ( isset( $params['title'] ) ) {
- $categoryTitle = Title::newFromText( $params['title'] );
-
- if ( is_null( $categoryTitle ) || $categoryTitle->getNamespace() != NS_CATEGORY ) {
- $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
- }
- } elseif( isset( $params['pageid'] ) ) {
- $categoryTitle = Title::newFromID( $params['pageid'] );
-
- if ( !$categoryTitle ) {
- $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
- } elseif ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
- $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
- }
+ $categoryTitle = $this->getTitleOrPageId( $params );
+ if ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
+ $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
}
$prop = array_flip( $params['prop'] );
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(),
- $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+ $this->getTitleOrPageIdErrorMessage(),
array(
array( 'code' => 'invalidcategory', 'info' => 'The category name you entered is not valid' ),
array( 'code' => 'badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
- array( 'nosuchpageid', 'pageid' ),
)
);
}
' mime - Adds MIME of the image',
' metadata - Lists EXIF metadata for the version of the image',
' bitdepth - Adds the bit depth of the version',
- ),
+ ),
);
}
public function getExamples() {
return array(
'api.php?action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks',
- 'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&iwblprefix=wikibooks&prop=info'
+ 'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
);
}
public function getExamples() {
return array(
'api.php?action=query&list=langbacklinks&lbltitle=Test&lbllang=fr',
- 'api.php?action=query&generator=langbacklinks&glbltitle=Test&lbllang=fr&prop=info'
+ 'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
);
}
);
}
- $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
- if ( isset( $params['lang'] ) ) {
+ $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+ if ( isset( $params['lang'] ) ) {
$this->addWhereFld( 'll_lang', $params['lang'] );
if ( isset( $params['title'] ) ) {
$this->addWhereFld( 'll_title', $params['title'] );
if ( !is_null( $show ) ) {
$show = array_flip( $show );
if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
- || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) ) {
+ || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) ) {
$this->dieUsageMsg( 'show' );
}
return $this->tokenFunctions;
}
- /**
- * @param $user User
- * @return String
- */
+ /**
+ * @param $user User
+ * @return String
+ */
public static function getUserrightsToken( $user ) {
global $wgUser;
// Since the permissions check for userrights is non-trivial,
}
public function execute() {
+ wfProfileIn( __METHOD__ );
$params = $this->extractRequestParams();
$res = array();
+ $types = $this->getTokenTypes();
foreach ( $params['type'] as $type ) {
$type = strtolower( $type );
- $func = 'get' .
- ucfirst( $type ) .
- 'Token';
- if ( $type === 'patrol' ) {
- $val = call_user_func( array( 'ApiQueryRecentChanges', $func ), null, null );
- } else {
- $val = call_user_func( array( 'ApiQueryInfo', $func ), null, null );
- }
+
+ $val = call_user_func( $types[$type], null, null );
+
if ( $val === false ) {
$this->setWarning( "Action '$type' is not allowed for the current user" );
} else {
}
$this->getResult()->addValue( null, $this->getModuleName(), $res );
+ wfProfileOut( __METHOD__ );
+ }
+
+ private function getTokenTypes() {
+ static $types = null;
+ if ( $types ) {
+ return $types;
+ }
+ wfProfileIn( __METHOD__ );
+ $types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
+ $names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
+ 'email', 'import', 'watch' );
+ foreach ( $names as $name ) {
+ $types[$name] = 'ApiQUeryInfo::get' . ucfirst( $name ) . 'Token';
+ }
+ wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
+ ksort( $types );
+ wfProfileOut( __METHOD__ );
+ return $types;
}
public function getAllowedParams() {
'type' => array(
ApiBase::PARAM_DFLT => 'edit',
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => array(
- 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
- 'email', 'import', 'watch', 'patrol'
- )
- )
+ ApiBase::PARAM_TYPE => array_keys( $this->getTokenTypes() ),
+ ),
);
}
$info['title'] = $titleObj->getPrefixedText();
$info['revisions'] = intval( $retval[0] );
$info['fileversions'] = intval( $retval[1] );
- $info['reason'] = intval( $retval[2] );
+ $info['reason'] = $retval[2];
$this->getResult()->addValue( null, $this->getModuleName(), $info );
}
*/
private function getChunkResult(){
$result = array();
-
+
$result['result'] = 'Continue';
$request = $this->getMain()->getRequest();
$chunkPath = $request->getFileTempname( 'chunk' );
$this->mParams['offset']);
if ( !$status->isGood() ) {
$this->dieUsage( $status->getWikiText(), 'stashfailed' );
- return ;
+ return array();
}
// Check we added the last chunk:
if ( !$status->isGood() ) {
$this->dieUsage( $status->getWikiText(), 'stashfailed' );
- return ;
+ return array();
}
// We have a new filekey for the fully concatenated file.
$username = $username->getName();
}
- $username = strtr( $username, '_', ' ' );
+ $username = self::normalizeUsername( $username );
if ( !isset( $this->cache[$username] ) ) {
if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) {
} else {
$this->misses++;
- if ( !User::isValidUserName( $username ) ) {
- $this->cache[$username] = $this->getDefault();
- } else {
- $this->doQuery( $username, $caller );
- }
+ $this->doQuery( $username, $caller );
}
}
foreach ( $data as $ns => $pagenames ) {
if ( !MWNamespace::hasGenderDistinction( $ns ) ) continue;
foreach ( array_keys( $pagenames ) as $username ) {
- if ( isset( $this->cache[$username] ) ) continue;
$users[$username] = true;
}
}
public function doQuery( $users, $caller = '' ) {
$default = $this->getDefault();
- foreach ( (array) $users as $index => $value ) {
- $name = strtr( $value, '_', ' ' );
- if ( isset( $this->cache[$name] ) ) {
- // Skip users whose gender setting we already know
- unset( $users[$index] );
- } else {
- $users[$index] = $name;
+ $usersToCheck = array();
+ foreach ( (array) $users as $value ) {
+ $name = self::normalizeUsername( $value );
+ // Skip users whose gender setting we already know
+ if ( !isset( $this->cache[$name] ) ) {
// For existing users, this value will be overwritten by the correct value
$this->cache[$name] = $default;
+ // query only for valid names, which can be in the database
+ if( User::isValidUserName( $name ) ) {
+ $usersToCheck[] = $name;
+ }
}
}
- if ( count( $users ) === 0 ) {
+ if ( count( $usersToCheck ) === 0 ) {
return;
}
$dbr = wfGetDB( DB_SLAVE );
$table = array( 'user', 'user_properties' );
$fields = array( 'user_name', 'up_value' );
- $conds = array( 'user_name' => $users );
+ $conds = array( 'user_name' => $usersToCheck );
$joins = array( 'user_properties' =>
array( 'LEFT JOIN', array( 'user_id = up_user', 'up_property' => 'gender' ) ) );
if ( strval( $caller ) !== '' ) {
$comment .= "/$caller";
}
- $res = $dbr->select( $table, $fields, $conds, $comment, $joins, $joins );
+ $res = $dbr->select( $table, $fields, $conds, $comment, array(), $joins );
foreach ( $res as $row ) {
$this->cache[$row->user_name] = $row->up_value ? $row->up_value : $default;
}
}
+ private static function normalizeUsername( $username ) {
+ // Strip off subpages
+ $indexSlash = strpos( $username, '/' );
+ if ( $indexSlash !== false ) {
+ $username = substr( $username, 0, $indexSlash );
+ }
+ // normalize underscore/spaces
+ return strtr( $username, '_', ' ' );
+ }
}
}
$genderCache = GenderCache::singleton();
- $genderCache->dolinkBatch( $this->data, $this->caller );
+ $genderCache->doLinkBatch( $this->data, $this->caller );
return true;
}
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Database
*/
/**
* @defgroup Database Database
*
+ * This file deals with database interface functions
+ * and query specifics/optimisations.
+ *
+ * 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 Database
- * This file deals with database interface functions
- * and query specifics/optimisations
*/
/** Number of times to re-try an operation in case of deadlock */
<?php
+/**
+ * This file contains database error classes.
+ *
+ * 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 Database
+ */
/**
* Database error base class
/**
* This is the IBM DB2 database abstraction layer.
* See maintenance/ibm_db2/README for development notes
- * and other specific information
+ * and other specific information.
+ *
+ * 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 Database
/**
* This is the MS SQL Server Native database abstraction layer.
*
+ * 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 Database
* @author Joel Penner <a-joelpe at microsoft dot com>
/**
* This is the MySQL database abstraction layer.
*
+ * 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 Database
*/
/**
* This is the Oracle database abstraction layer.
*
+ * 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 Database
*/
/**
* This is the Postgres database abstraction layer.
*
+ * 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 Database
*/
i.indoption[s.g] as option,
pg_am.amname
FROM
- (SELECT generate_subscripts(isub.indkey, 1) AS g
+ (SELECT generate_series(array_lower(isub.indkey,1), array_upper(isub.indkey,1)) AS g
FROM
pg_index isub
JOIN pg_class cis
* This is the SQLite database abstraction layer.
* See maintenance/sqlite/README for development notes and other specific information
*
+ * 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 Database
*/
<?php
+/**
+ * This file contains database-related utiliy classes.
+ *
+ * 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 Database
+ */
+
/**
* Utility class.
* @ingroup Database
<?php
/**
- * Generator of database load balancing objects
+ * Generator of database load balancing objects.
+ *
+ * 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 Database
<?php
/**
- * Advanced generator of database load balancing objects for wiki farms
+ * Advanced generator of database load balancing objects for wiki farms.
+ *
+ * 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 Database
<?php
+/**
+ * Simple generator of database connections that always returns the same object.
+ *
+ * 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 Database
+ */
/**
* An LBFactory class that always returns a single database object.
<?php
/**
- * Database load balancing
+ * Database load balancing.
+ *
+ * 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 Database
<?php
/**
- * Database load monitoring
+ * Database load monitoring.
+ *
+ * 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 Database
<?php
-
/**
* Result of a ORMTable::select, which returns ORMRow objects.
*
+ * 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
+ *
* @since 1.20
*
* @file ORMResult.php
* @licence GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
+
class ORMResult implements Iterator {
/**
<?php
-
/**
* Abstract base class for representing objects that are stored in some DB table.
* This is basically an ORM-like wrapper around rows in database tables that
* aims to be both simple and very flexible. It is centered around an associative
* array of fields and various methods to do common interaction with the database.
*
+ * 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
+ *
* These methods are likely candidates for overriding:
* * getDefaults
* * remove
* @licence GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
+
abstract class ORMRow {
/**
<?php
-
/**
* Abstract base class for representing a single database table.
*
+ * 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
+ *
* @since 1.20
*
* @file ORMTable.php
* @licence GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
+
abstract class ORMTable {
/**
<?php
+/**
+ * Debug toolbar related code
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
/**
* New debugger system that outputs a toolbar on page view
/**
* Import a file from the local file system into the repo.
* This does no locking nor journaling and overrides existing files.
+ * This function can be used to write to otherwise read-only foreign repos.
* This is intended for copying generated thumbnails into the repo.
*
* @param $src string File system path
/**
* Purge a file from the repo. This does no locking nor journaling.
- * This is intended for purging thumbnail.
+ * This function can be used to write to otherwise read-only foreign repos.
+ * This is intended for purging thumbnails.
*
* @param $path string Virtual URL or storage path
* @return FileRepoStatus
return $this->quickPurgeBatch( array( $path ) );
}
+ /**
+ * Deletes a directory if empty.
+ * This function can be used to write to otherwise read-only foreign repos.
+ *
+ * @param $dir string Virtual URL (or storage path) of directory to clean
+ * @return Status
+ */
+ public function quickCleanDir( $dir ) {
+ $status = $this->newGood();
+ $status->merge( $this->backend->clean(
+ array( 'dir' => $this->resolveToStoragePath( $dir ) ) ) );
+
+ return $status;
+ }
+
/**
* Import a batch of files from the local file system into the repo.
* This does no locking nor journaling and overrides existing files.
+ * This function can be used to write to otherwise read-only foreign repos.
* This is intended for copying generated thumbnails into the repo.
*
* @param $src Array List of tuples (file system path, virtual URL or storage path)
* @return FileRepoStatus
*/
public function quickImportBatch( array $pairs ) {
- $this->assertWritableRepo(); // fail out if read-only
-
$status = $this->newGood();
$operations = array();
foreach ( $pairs as $pair ) {
}
/**
- * Purge a batch of files from the repo. This does no locking nor journaling.
- * This is intended for purging thumbnails.
+ * Purge a batch of files from the repo.
+ * This function can be used to write to otherwise read-only foreign repos.
+ * This does no locking nor journaling and is intended for purging thumbnails.
*
* @param $path Array List of virtual URLs or storage paths
* @return FileRepoStatus
*/
public function quickPurgeBatch( array $paths ) {
- $this->assertWritableRepo(); // fail out if read-only
-
$status = $this->newGood();
$operations = array();
foreach ( $paths as $path ) {
}
/**
- * Deletes a directory if empty
+ * Deletes a directory if empty.
*
* @param $dir string Virtual URL (or storage path) of directory to clean
* @return Status
/**
* @brief Class for a file system (FS) based file backend.
- *
+ *
* All "containers" each map to a directory under the backend's base directory.
* For backwards-compatibility, some container paths can be set to custom paths.
* The wiki ID will not be used in any custom paths, so this should be avoided.
- *
+ *
* Having directories with thousands of files will diminish performance.
* Sharding can be accomplished by using FileRepo-style hash paths.
*
/**
* Sanity check a relative file system path for validity
- *
+ *
* @param $path string Normalized relative path
* @return bool
*/
/**
* Given the short (unresolved) and full (resolved) name of
* a container, return the file system path of the container.
- *
+ *
* @param $shortCont string
* @param $fullCont string
- * @return string|null
+ * @return string|null
*/
protected function containerFSRoot( $shortCont, $fullCont ) {
if ( isset( $this->containerPaths[$shortCont] ) ) {
- return $this->containerPaths[$shortCont];
+ return $this->containerPaths[$shortCont];
} elseif ( isset( $this->basePath ) ) {
return "{$this->basePath}/{$fullCont}";
}
/**
* Get the absolute file system path for a storage path
- *
+ *
* @param $storagePath string Storage path
* @return string|null
*/
clearstatcache(); // clear the PHP file stat cache
}
+ /**
+ * @see FileBackendStore::doDirectoryExists()
+ * @return bool|null
+ */
+ protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
+ list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+ $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+
+ $this->trapWarnings(); // don't trust 'false' if there were errors
+ $exists = is_dir( $dir );
+ $hadError = $this->untrapWarnings();
+
+ return $hadError ? null : $exists;
+ }
+
+ /**
+ * @see FileBackendStore::getDirectoryListInternal()
+ * @return Array|null
+ */
+ public function getDirectoryListInternal( $fullCont, $dirRel, array $params ) {
+ list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+ $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+ $exists = is_dir( $dir );
+ if ( !$exists ) {
+ wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
+ return array(); // nothing under this dir
+ } elseif ( !is_readable( $dir ) ) {
+ wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
+ return null; // bad permissions?
+ }
+ return new FSFileBackendDirList( $dir, $params );
+ }
+
/**
* @see FileBackendStore::getFileListInternal()
* @return array|FSFileBackendFileList|null
if ( !$exists ) {
wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
return array(); // nothing under this dir
- }
- $readable = is_readable( $dir );
- if ( !$readable ) {
+ } elseif ( !is_readable( $dir ) ) {
wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
return null; // bad permissions?
}
- return new FSFileBackendFileList( $dir );
+ return new FSFileBackendFileList( $dir, $params );
}
/**
return $tmpFile;
}
+ /**
+ * @see FileBackendStore::directoriesAreVirtual()
+ * @return bool
+ */
+ protected function directoriesAreVirtual() {
+ return false;
+ }
+
/**
* Chmod a file, suppressing the warnings
*
}
/**
- * Wrapper around RecursiveDirectoryIterator that catches
- * exception or does any custom behavoir that we may want.
+ * Wrapper around RecursiveDirectoryIterator/DirectoryIterator that
+ * catches exception or does any custom behavoir that we may want.
* Do not use this class from places outside FSFileBackend.
*
* @ingroup FileBackend
*/
-class FSFileBackendFileList implements Iterator {
- /** @var RecursiveIteratorIterator */
+abstract class FSFileBackendList implements Iterator {
+ /** @var Iterator */
protected $iter;
protected $suffixStart; // integer
protected $pos = 0; // integer
+ /** @var Array */
+ protected $params = array();
/**
* @param $dir string file system directory
*/
- public function __construct( $dir ) {
+ public function __construct( $dir, array $params ) {
$dir = realpath( $dir ); // normalize
$this->suffixStart = strlen( $dir ) + 1; // size of "path/to/dir/"
+ $this->params = $params;
+
try {
+ $this->iter = $this->initIterator( $dir );
+ } catch ( UnexpectedValueException $e ) {
+ $this->iter = null; // bad permissions? deleted?
+ }
+ }
+
+ /**
+ * Return an appropriate iterator object to wrap
+ *
+ * @param $dir string file system directory
+ * @return Iterator
+ */
+ protected function initIterator( $dir ) {
+ if ( !empty( $this->params['topOnly'] ) ) { // non-recursive
+ # Get an iterator that will get direct sub-nodes
+ return new DirectoryIterator( $dir );
+ } else { // recursive
# Get an iterator that will return leaf nodes (non-directories)
if ( MWInit::classExists( 'FilesystemIterator' ) ) { // PHP >= 5.3
# RecursiveDirectoryIterator extends FilesystemIterator.
# FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
- $flags = FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS;
- $this->iter = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator( $dir, $flags ) );
+ $flags = FilesystemIterator::CURRENT_AS_SELF | FilesystemIterator::SKIP_DOTS;
+ return new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator( $dir, $flags ),
+ RecursiveIteratorIterator::CHILD_FIRST // include dirs
+ );
} else { // PHP < 5.3
# RecursiveDirectoryIterator extends DirectoryIterator
- $this->iter = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator( $dir ) );
+ return new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator( $dir ),
+ RecursiveIteratorIterator::CHILD_FIRST // include dirs
+ );
}
- } catch ( UnexpectedValueException $e ) {
- $this->iter = null; // bad permissions? deleted?
}
}
- /**
- * @see Iterator::current()
- * @return string|bool String or false
- */
- public function current() {
- // Return only the relative path and normalize slashes to FileBackend-style
- // Make sure to use the realpath since the suffix is based upon that
- return str_replace( '\\', '/',
- substr( realpath( $this->iter->current() ), $this->suffixStart ) );
- }
-
/**
* @see Iterator::key()
* @return integer
return $this->pos;
}
+ /**
+ * @see Iterator::current()
+ * @return string|bool String or false
+ */
+ public function current() {
+ return $this->getRelPath( $this->iter->current()->getPathname() );
+ }
+
/**
* @see Iterator::next()
* @return void
public function next() {
try {
$this->iter->next();
+ $this->filterViaNext();
} catch ( UnexpectedValueException $e ) {
$this->iter = null;
}
$this->pos = 0;
try {
$this->iter->rewind();
+ $this->filterViaNext();
} catch ( UnexpectedValueException $e ) {
$this->iter = null;
}
public function valid() {
return $this->iter && $this->iter->valid();
}
+
+ /**
+ * Filter out items by advancing to the next ones
+ */
+ protected function filterViaNext() {}
+
+ /**
+ * Return only the relative path and normalize slashes to FileBackend-style.
+ * Uses the "real path" since the suffix is based upon that.
+ *
+ * @param $path string
+ * @return string
+ */
+ protected function getRelPath( $path ) {
+ return strtr( substr( realpath( $path ), $this->suffixStart ), '\\', '/' );
+ }
+}
+
+class FSFileBackendDirList extends FSFileBackendList {
+ protected function filterViaNext() {
+ while ( $this->iter->valid() ) {
+ if ( $this->iter->current()->isDot() || !$this->iter->current()->isDir() ) {
+ $this->iter->next(); // skip non-directories and dot files
+ } else {
+ break;
+ }
+ }
+ }
+}
+
+class FSFileBackendFileList extends FSFileBackendList {
+ protected function filterViaNext() {
+ while ( $this->iter->valid() ) {
+ if ( !$this->iter->current()->isFile() ) {
+ $this->iter->next(); // skip non-files and dot files
+ } else {
+ break;
+ }
+ }
+ }
}
* contents as the new contents to be written there.
*
* $opts is an associative of boolean flags, including:
- * 'force' : Errors that would normally cause a rollback do not.
- * The remaining operations are still attempted if any fail.
+ * 'force' : Operation precondition errors no longer trigger an abort.
+ * Any remaining operations are still attempted. Unexpected
+ * failures may still cause remaning operations to be aborted.
* 'nonLocking' : No locks are acquired for the operations.
* This can increase performance for non-critical writes.
* This has no effect unless the 'force' flag is set.
* otherwise safe from modification from other processes. Normally,
* the file will be a new temp file, which should be adequate.
* $params include:
- * srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
- * dst : file system path to 0-byte temp file
+ * srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
+ * dst : file system path to 0-byte temp file
*
* @param $params Array Operation parameters
* @return Status
* is that of an empty container, in which case it should be deleted.
*
* $params include:
- * dir : storage directory
+ * dir : storage directory
+ * recursive : recursively delete empty subdirectories first (@since 1.20)
*
* @param $params Array
* @return Status
abstract public function getLocalCopy( array $params );
/**
- * Get an iterator to list out all stored files under a storage directory.
+ * Check if a directory exists at a given storage path.
+ * Backends using key/value stores will check if the path is a
+ * virtual directory, meaning there are files under the given directory.
+ *
+ * Storage backends with eventual consistency might return stale data.
+ *
+ * $params include:
+ * dir : storage directory
+ *
+ * @return bool|null Returns null on failure
+ * @since 1.20
+ */
+ abstract public function directoryExists( array $params );
+
+ /**
+ * Get an iterator to list *all* directories under a storage directory.
+ * If the directory is of the form "mwstore://backend/container",
+ * then all directories in the container should be listed.
+ * If the directory is of form "mwstore://backend/container/dir",
+ * then all directories directly under that directory should be listed.
+ * Results should be storage directories relative to the given directory.
+ *
+ * Storage backends with eventual consistency might return stale data.
+ *
+ * $params include:
+ * dir : storage directory
+ * topOnly : only return direct child dirs of the directory
+ *
+ * @return Traversable|Array|null Returns null on failure
+ * @since 1.20
+ */
+ abstract public function getDirectoryList( array $params );
+
+ /**
+ * Same as FileBackend::getDirectoryList() except only lists
+ * directories that are immediately under the given directory.
+ *
+ * Storage backends with eventual consistency might return stale data.
+ *
+ * $params include:
+ * dir : storage directory
+ *
+ * @return Traversable|Array|null Returns null on failure
+ * @since 1.20
+ */
+ final public function getTopDirectoryList( array $params ) {
+ return $this->getDirectoryList( array( 'topOnly' => true ) + $params );
+ }
+
+ /**
+ * Get an iterator to list *all* stored files under a storage directory.
* If the directory is of the form "mwstore://backend/container",
* then all files in the container should be listed.
* If the directory is of form "mwstore://backend/container/dir",
- * then all files under that container directory should be listed.
+ * then all files under that directory should be listed.
* Results should be storage paths relative to the given directory.
*
* Storage backends with eventual consistency might return stale data.
*
* $params include:
- * dir : storage path directory
+ * dir : storage directory
+ * topOnly : only return direct child files of the directory (@since 1.20)
*
* @return Traversable|Array|null Returns null on failure
*/
abstract public function getFileList( array $params );
+ /**
+ * Same as FileBackend::getFileList() except only lists
+ * files that are immediately under the given directory.
+ *
+ * Storage backends with eventual consistency might return stale data.
+ *
+ * $params include:
+ * dir : storage directory
+ *
+ * @return Traversable|Array|null Returns null on failure
+ * @since 1.20
+ */
+ final public function getTopFileList( array $params ) {
+ return $this->getFileList( array( 'topOnly' => true ) + $params );
+ }
+
/**
* Invalidate any in-process file existence and property cache.
* If $paths is given, then only the cache for those files will be cleared.
*
* @param $path string
* @return bool
+ * @since 1.20
*/
final public static function isPathTraversalFree( $path ) {
return ( self::normalizeContainerPath( $path ) !== null );
protected $backends = array();
protected function __construct() {}
- protected function __clone() {}
/**
* @return FileBackendGroup
/**
* @brief Proxy backend that mirrors writes to several internal backends.
- *
+ *
* This class defines a multi-write backend. Multiple backends can be
* registered to this proxy backend and it will act as a single backend.
* Use this when all access to those backends is through this proxy backend.
$status = Status::newGood();
$performOps = array(); // list of FileOp objects
- $filesRead = array(); // storage paths read from
- $filesChanged = array(); // storage paths written to
+ $paths = array(); // storage paths read from or written to
// Build up a list of FileOps. The list will have all the ops
// for one backend, then all the ops for the next, and so on.
// These batches of ops are all part of a continuous array.
foreach ( $this->backends as $index => $backend ) {
$backendOps = $this->substOpBatchPaths( $ops, $backend );
// Add on the operation batch for this backend
- $performOps = array_merge( $performOps, $backend->getOperations( $backendOps ) );
+ $performOps = array_merge( $performOps,
+ $backend->getOperationsInternal( $backendOps ) );
if ( $index == 0 ) { // first batch
// Get the files used for these operations. Each backend has a batch of
// the same operations, so we only need to get them from the first batch.
- foreach ( $performOps as $fileOp ) {
- $filesRead = array_merge( $filesRead, $fileOp->storagePathsRead() );
- $filesChanged = array_merge( $filesChanged, $fileOp->storagePathsChanged() );
- }
+ $paths = $backend->getPathsToLockForOpsInternal( $performOps );
// Get the paths under the proxy backend's name
- $filesRead = $this->unsubstPaths( $filesRead );
- $filesChanged = $this->unsubstPaths( $filesChanged );
+ $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
+ $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
}
}
// Try to lock those files for the scope of this function...
if ( empty( $opts['nonLocking'] ) ) {
- $filesLockSh = array_diff( $filesRead, $filesChanged ); // optimization
- $filesLockEx = $filesChanged;
- // Get a shared lock on the parent directory of each path changed
- $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
// Try to lock those files for the scope of this function...
- $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
- $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+ $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+ $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
if ( !$status->isOK() ) {
return $status; // abort
}
// Do a consistency check to see if the backends agree
if ( count( $this->backends ) > 1 ) {
- $status->merge( $this->consistencyCheck( array_merge( $filesRead, $filesChanged ) ) );
+ $status->merge( $this->consistencyCheck( array_merge( $paths['sh'], $paths['ex'] ) ) );
if ( !$status->isOK() ) {
return $status; // abort
}
/**
* Substitute the backend name in storage path parameters
* for a set of operations with that of a given internal backend.
- *
+ *
* @param $ops Array List of file operation arrays
* @param $backend FileBackendStore
* @return Array
/**
* Same as substOpBatchPaths() but for a single operation
- *
+ *
* @param $op File operation array
* @param $backend FileBackendStore
* @return Array
/**
* Substitute the backend of storage paths with an internal backend's name
- *
+ *
* @param $paths Array|string List of paths or single string path
* @param $backend FileBackendStore
* @return Array|string
/**
* Substitute the backend of internal storage paths with the proxy backend's name
- *
+ *
* @param $paths Array|string List of paths or single string path
* @return Array|string
*/
}
/**
- * @see FileBackend::getFileList()
+ * @see FileBackend::concatenate()
*/
public function concatenate( array $params ) {
// We are writing to an FS file, so we don't need to do this per-backend
return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
}
+ /**
+ * @see FileBackend::directoryExists()
+ */
+ public function directoryExists( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->directoryExists( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getSubdirectoryList()
+ */
+ public function getDirectoryList( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
+ }
+
/**
* @see FileBackend::getFileList()
*/
* @since 1.19
*/
abstract class FileBackendStore extends FileBackend {
+ /** @var BagOStuff */
+ protected $memCache;
+
/** @var Array Map of paths to small (RAM/disk) cache items */
protected $cache = array(); // (storage path => key => value)
- protected $maxCacheSize = 100; // integer; max paths with entries
+ protected $maxCacheSize = 300; // integer; max paths with entries
/** @var Array Map of paths to large (RAM/disk) cache items */
protected $expensiveCache = array(); // (storage path => key => value)
- protected $maxExpensiveCacheSize = 10; // integer; max paths with entries
+ protected $maxExpensiveCacheSize = 5; // integer; max paths with entries
/** @var Array Map of container names to sharding settings */
protected $shardViaHashLevels = array(); // (container name => config array)
protected $maxFileSize = 4294967296; // integer bytes (4GiB)
+ /**
+ * @see FileBackend::__construct()
+ *
+ * @param $config Array
+ */
+ public function __construct( array $config ) {
+ parent::__construct( $config );
+ $this->memCache = new EmptyBagOStuff(); // disabled by default
+ }
+
/**
* Get the maximum allowable file size given backend
* medium restrictions and basic performance constraints.
} else {
$status = $this->doCreateInternal( $params );
$this->clearCache( array( $params['dst'] ) );
+ $this->deleteFileCache( $params['dst'] ); // persistent cache
}
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
} else {
$status = $this->doStoreInternal( $params );
$this->clearCache( array( $params['dst'] ) );
+ $this->deleteFileCache( $params['dst'] ); // persistent cache
}
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
wfProfileIn( __METHOD__ . '-' . $this->name );
$status = $this->doCopyInternal( $params );
$this->clearCache( array( $params['dst'] ) );
+ $this->deleteFileCache( $params['dst'] ); // persistent cache
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
return $status;
wfProfileIn( __METHOD__ . '-' . $this->name );
$status = $this->doDeleteInternal( $params );
$this->clearCache( array( $params['src'] ) );
+ $this->deleteFileCache( $params['src'] ); // persistent cache
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
return $status;
wfProfileIn( __METHOD__ . '-' . $this->name );
$status = $this->doMoveInternal( $params );
$this->clearCache( array( $params['src'], $params['dst'] ) );
+ $this->deleteFileCache( $params['src'] ); // persistent cache
+ $this->deleteFileCache( $params['dst'] ); // persistent cache
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
return $status;
wfProfileIn( __METHOD__ . '-' . $this->name );
$status = Status::newGood();
+ // Recursive: first delete all empty subdirs recursively
+ if ( !empty( $params['recursive'] ) && !$this->directoriesAreVirtual() ) {
+ $subDirsRel = $this->getTopDirectoryList( array( 'dir' => $params['dir'] ) );
+ if ( $subDirsRel !== null ) { // no errors
+ foreach ( $subDirsRel as $subDirRel ) {
+ $subDir = $params['dir'] . "/{$subDirRel}"; // full path
+ $status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
+ }
+ }
+ }
+
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) {
$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
if ( $shard !== null ) { // confined to a single container/shard
$status->merge( $this->doCleanInternal( $fullCont, $dir, $params ) );
+ $this->deleteContainerCache( $fullCont ); // purge cache
} else { // directory is on several shards
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
$status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+ $this->deleteContainerCache( "{$fullCont}{$suffix}" ); // purge cache
}
}
wfProfileOut( __METHOD__ );
return false; // invalid storage path
}
- $latest = !empty( $params['latest'] );
+ $latest = !empty( $params['latest'] ); // use latest data?
+ if ( !isset( $this->cache[$path]['stat'] ) ) {
+ $this->primeFileCache( array( $path ) ); // check persistent cache
+ }
if ( isset( $this->cache[$path]['stat'] ) ) {
// If we want the latest data, check that this cached
// value was in fact fetched with the latest available data.
wfProfileOut( __METHOD__ . '-miss-' . $this->name );
wfProfileOut( __METHOD__ . '-miss' );
if ( is_array( $stat ) ) { // don't cache negatives
+ $stat['latest'] = $latest;
$this->trimCache(); // limit memory
$this->cache[$path]['stat'] = $stat;
- $this->cache[$path]['stat']['latest'] = $latest;
+ $this->setFileCache( $path, $stat ); // update persistent cache
}
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
}
/**
- * @copydoc FileBackend::getFileList()
- * @return Array|null|Traversable
+ * @see FileBackend::directoryExists()
+ * @return bool|null
+ */
+ final public function directoryExists( array $params ) {
+ list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+ if ( $dir === null ) {
+ return false; // invalid storage path
+ }
+ if ( $shard !== null ) { // confined to a single container/shard
+ return $this->doDirectoryExists( $fullCont, $dir, $params );
+ } else { // directory is on several shards
+ wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+ list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ $res = false; // response
+ foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+ $exists = $this->doDirectoryExists( "{$fullCont}{$suffix}", $dir, $params );
+ if ( $exists ) {
+ $res = true;
+ break; // found one!
+ } elseif ( $exists === null ) { // error?
+ $res = null; // if we don't find anything, it is indeterminate
+ }
+ }
+ return $res;
+ }
+ }
+
+ /**
+ * @see FileBackendStore::directoryExists()
+ *
+ * @param $container string Resolved container name
+ * @param $dir string Resolved path relative to container
+ * @param $params Array
+ * @return bool|null
+ */
+ abstract protected function doDirectoryExists( $container, $dir, array $params );
+
+ /**
+ * @see FileBackend::getDirectoryList()
+ * @return Traversable|Array|null Returns null on failure
+ */
+ final public function getDirectoryList( array $params ) {
+ list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+ if ( $dir === null ) { // invalid storage path
+ return null;
+ }
+ if ( $shard !== null ) {
+ // File listing is confined to a single container/shard
+ return $this->getDirectoryListInternal( $fullCont, $dir, $params );
+ } else {
+ wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+ // File listing spans multiple containers/shards
+ list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ return new FileBackendStoreShardDirIterator( $this,
+ $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
+ }
+ }
+
+ /**
+ * Do not call this function from places outside FileBackend
+ *
+ * @see FileBackendStore::getDirectoryList()
+ *
+ * @param $container string Resolved container name
+ * @param $dir string Resolved path relative to container
+ * @param $params Array
+ * @return Traversable|Array|null Returns null on failure
+ */
+ abstract public function getDirectoryListInternal( $container, $dir, array $params );
+
+ /**
+ * @see FileBackend::getFileList()
+ * @return Traversable|Array|null Returns null on failure
*/
final public function getFileList( array $params ) {
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
// File listing spans multiple containers/shards
list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
- return new FileBackendStoreShardListIterator( $this,
+ return new FileBackendStoreShardFileIterator( $this,
$fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
}
}
* @param $container string Resolved container name
* @param $dir string Resolved path relative to container
* @param $params Array
- * @return Traversable|Array|null
+ * @return Traversable|Array|null Returns null on failure
*/
abstract public function getFileListInternal( $container, $dir, array $params );
* @return Array List of FileOp objects
* @throws MWException
*/
- final public function getOperations( array $ops ) {
+ final public function getOperationsInternal( array $ops ) {
$supportedOps = $this->supportedOperations();
$performOps = array(); // array of FileOp objects
// Append the FileOp class
$performOps[] = new $class( $this, $params );
} else {
- throw new MWException( "Operation `$opName` is not supported." );
+ throw new MWException( "Operation '$opName' is not supported." );
}
}
return $performOps;
}
+ /**
+ * Get a list of storage paths to lock for a list of operations
+ * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
+ * each corresponding to a list of storage paths to be locked.
+ *
+ * @param $performOps Array List of FileOp objects
+ * @return Array ('sh' => list of paths, 'ex' => list of paths)
+ */
+ final public function getPathsToLockForOpsInternal( array $performOps ) {
+ // Build up a list of files to lock...
+ $paths = array( 'sh' => array(), 'ex' => array() );
+ foreach ( $performOps as $fileOp ) {
+ $paths['sh'] = array_merge( $paths['sh'], $fileOp->storagePathsRead() );
+ $paths['ex'] = array_merge( $paths['ex'], $fileOp->storagePathsChanged() );
+ }
+ // Optimization: if doing an EX lock anyway, don't also set an SH one
+ $paths['sh'] = array_diff( $paths['sh'], $paths['ex'] );
+ // Get a shared lock on the parent directory of each path changed
+ $paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
+
+ return $paths;
+ }
+
/**
* @see FileBackend::doOperationsInternal()
* @return Status
$status = Status::newGood();
// Build up a list of FileOps...
- $performOps = $this->getOperations( $ops );
+ $performOps = $this->getOperationsInternal( $ops );
// Acquire any locks as needed...
if ( empty( $opts['nonLocking'] ) ) {
// Build up a list of files to lock...
- $filesLockEx = $filesLockSh = array();
- foreach ( $performOps as $fileOp ) {
- $filesLockSh = array_merge( $filesLockSh, $fileOp->storagePathsRead() );
- $filesLockEx = array_merge( $filesLockEx, $fileOp->storagePathsChanged() );
- }
- // Optimization: if doing an EX lock anyway, don't also set an SH one
- $filesLockSh = array_diff( $filesLockSh, $filesLockEx );
- // Get a shared lock on the parent directory of each path changed
- $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
+ $paths = $this->getPathsToLockForOpsInternal( $performOps );
// Try to lock those files for the scope of this function...
- $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
- $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+ $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+ $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
if ( !$status->isOK() ) {
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
}
}
- // Clear any cache entries (after locks acquired)
+ // Clear any file cache entries (after locks acquired)
$this->clearCache();
+ // Load from the persistent file and container caches
+ $this->primeFileCache( $performOps );
+ $this->primeContainerCache( $performOps );
+
// Actually attempt the operation batch...
$subStatus = FileOp::attemptBatch( $performOps, $opts, $this->fileJournal );
*/
protected function doClearCache( array $paths = null ) {}
+ /**
+ * Is this a key/value store where directories are just virtual?
+ * Virtual directories exists in so much as files exists that are
+ * prefixed with the directory path followed by a forward slash.
+ *
+ * @return bool
+ */
+ abstract protected function directoriesAreVirtual();
+
/**
* Move a cache entry to the top (such as when accessed)
*
* @param $path string Storage path
+ * @return void
*/
protected function pingCache( $path ) {
if ( isset( $this->cache[$path] ) ) {
* Move a cache entry to the top (such as when accessed)
*
* @param $path string Storage path
+ * @return void
*/
protected function pingExpensiveCache( $path ) {
if ( isset( $this->expensiveCache[$path] ) ) {
return ''; // no sharding
}
+ /**
+ * Check if a storage path maps to a single shard.
+ * Container dirs like "a", where the container shards on "x/xy",
+ * can reside on several shards. Such paths are tricky to handle.
+ *
+ * @param $storagePath string Storage path
+ * @return bool
+ */
+ final public function isSingleShardPathInternal( $storagePath ) {
+ list( $c, $r, $shard ) = $this->resolveStoragePath( $storagePath );
+ return ( $shard !== null );
+ }
+
/**
* Get the sharding config for a container.
* If greater than 0, then all file storage paths within
protected function resolveContainerPath( $container, $relStoragePath ) {
return $relStoragePath;
}
+
+ /**
+ * Get the cache key for a container
+ *
+ * @param $container Resolved container name
+ * @return string
+ */
+ private function containerCacheKey( $container ) {
+ return wfMemcKey( 'backend', $this->getName(), 'container', $container );
+ }
+
+ /**
+ * Set the cached info for a container
+ *
+ * @param $container Resolved container name
+ * @param $val mixed Information to cache
+ * @return void
+ */
+ final protected function setContainerCache( $container, $val ) {
+ $this->memCache->set( $this->containerCacheKey( $container ), $val, 14*86400 );
+ }
+
+ /**
+ * Delete the cached info for a container
+ *
+ * @param $container Resolved container name
+ * @return void
+ */
+ final protected function deleteContainerCache( $container ) {
+ for ( $attempts=1; $attempts <= 3; $attempts++ ) {
+ if ( $this->memCache->delete( $this->containerCacheKey( $container ) ) ) {
+ return; // done!
+ }
+ }
+ trigger_error( "Unable to delete stat cache for container $container." );
+ }
+
+ /**
+ * Do a batch lookup from cache for container stats for all containers
+ * used in a list of container names, storage paths, or FileOp objects.
+ *
+ * @param $items Array
+ * @return void
+ */
+ final protected function primeContainerCache( array $items ) {
+ wfProfileIn( __METHOD__ );
+ wfProfileIn( __METHOD__ . '-' . $this->name );
+ $paths = array(); // list of storage paths
+ $contNames = array(); // (cache key => resolved container name)
+ // Get all the paths/containers from the items...
+ foreach ( $items as $item ) {
+ if ( $item instanceof FileOp ) {
+ $paths = array_merge( $paths, $item->storagePathsRead() );
+ $paths = array_merge( $paths, $item->storagePathsChanged() );
+ } elseif ( self::isStoragePath( $item ) ) {
+ $paths[] = $item;
+ } elseif ( is_string( $item ) ) { // full container name
+ $contNames[$this->containerCacheKey( $item )] = $item;
+ }
+ }
+ // Get all the corresponding cache keys for paths...
+ foreach ( $paths as $path ) {
+ list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+ if ( $fullCont !== null ) { // valid path for this backend
+ $contNames[$this->containerCacheKey( $fullCont )] = $fullCont;
+ }
+ }
+
+ $contInfo = array(); // (resolved container name => cache value)
+ // Get all cache entries for these container cache keys...
+ $values = $this->memCache->getBatch( array_keys( $contNames ) );
+ foreach ( $values as $cacheKey => $val ) {
+ $contInfo[$contNames[$cacheKey]] = $val;
+ }
+
+ // Populate the container process cache for the backend...
+ $this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
+ wfProfileOut( __METHOD__ . '-' . $this->name );
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Fill the backend-specific process cache given an array of
+ * resolved container names and their corresponding cached info.
+ * Only containers that actually exist should appear in the map.
+ *
+ * @param $containerInfo Array Map of resolved container names to cached info
+ * @return void
+ */
+ protected function doPrimeContainerCache( array $containerInfo ) {}
+
+ /**
+ * Get the cache key for a file path
+ *
+ * @param $path Storage path
+ * @return string
+ */
+ private function fileCacheKey( $path ) {
+ return wfMemcKey( 'backend', $this->getName(), 'file', sha1( $path ) );
+ }
+
+ /**
+ * Set the cached stat info for a file path
+ *
+ * @param $path Storage path
+ * @param $val mixed Information to cache
+ * @return void
+ */
+ final protected function setFileCache( $path, $val ) {
+ $this->memCache->set( $this->fileCacheKey( $path ), $val, 7*86400 );
+ }
+
+ /**
+ * Delete the cached stat info for a file path
+ *
+ * @param $path Storage path
+ * @return void
+ */
+ final protected function deleteFileCache( $path ) {
+ for ( $attempts=1; $attempts <= 3; $attempts++ ) {
+ if ( $this->memCache->delete( $this->fileCacheKey( $path ) ) ) {
+ return; // done!
+ }
+ }
+ trigger_error( "Unable to delete stat cache for file $path." );
+ }
+
+ /**
+ * Do a batch lookup from cache for file stats for all paths
+ * used in a list of storage paths or FileOp objects.
+ *
+ * @param $items Array List of storage paths or FileOps
+ * @return void
+ */
+ final protected function primeFileCache( array $items ) {
+ wfProfileIn( __METHOD__ );
+ wfProfileIn( __METHOD__ . '-' . $this->name );
+ $paths = array(); // list of storage paths
+ $pathNames = array(); // (cache key => storage path)
+ // Get all the paths/containers from the items...
+ foreach ( $items as $item ) {
+ if ( $item instanceof FileOp ) {
+ $paths = array_merge( $paths, $item->storagePathsRead() );
+ $paths = array_merge( $paths, $item->storagePathsChanged() );
+ } elseif ( self::isStoragePath( $item ) ) {
+ $paths[] = $item;
+ }
+ }
+ // Get all the corresponding cache keys for paths...
+ foreach ( $paths as $path ) {
+ list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
+ if ( $rel !== null ) { // valid path for this backend
+ $pathNames[$this->fileCacheKey( $path )] = $path;
+ }
+ }
+ // Get all cache entries for these container cache keys...
+ $values = $this->memCache->getBatch( array_keys( $pathNames ) );
+ foreach ( $values as $cacheKey => $val ) {
+ if ( is_array( $val ) ) {
+ $this->trimCache(); // limit memory
+ $this->cache[$pathNames[$cacheKey]]['stat'] = $val;
+ }
+ }
+ wfProfileOut( __METHOD__ . '-' . $this->name );
+ wfProfileOut( __METHOD__ );
+ }
}
/**
- * FileBackendStore helper function to handle file listings that span container shards.
+ * FileBackendStore helper function to handle listings that span container shards.
* Do not use this class from places outside of FileBackendStore.
*
* @ingroup FileBackend
*/
-class FileBackendStoreShardListIterator implements Iterator {
- /* @var FileBackendStore */
+abstract class FileBackendStoreShardListIterator implements Iterator {
+ /** @var FileBackendStore */
protected $backend;
- /* @var Array */
+ /** @var Array */
protected $params;
- /* @var Array */
+ /** @var Array */
protected $shardSuffixes;
- protected $container; // string
- protected $directory; // string
+ protected $container; // string; full container name
+ protected $directory; // string; resolved relative path
- /* @var Traversable */
+ /** @var Traversable */
protected $iter;
protected $curShard = 0; // integer
protected $pos = 0; // integer
+ /** @var Array */
+ protected $multiShardPaths = array(); // (rel path => 1)
+
/**
* @param $backend FileBackendStore
* @param $container string Full storage container name
} else {
$this->iter->next();
}
+ // Filter out items that we already listed
+ $this->filterViaNext();
// Find the next non-empty shard if no elements are left
$this->nextShardIteratorIfNotValid();
}
$this->pos = 0;
$this->curShard = 0;
$this->setIteratorFromCurrentShard();
+ // Filter out items that we already listed
+ $this->filterViaNext();
// Find the next non-empty shard if this one has no elements
$this->nextShardIteratorIfNotValid();
}
* @return bool
*/
public function valid() {
- if ( $this->iter == null ) {
+ if ( $this->iter === null ) {
return false; // some failure?
} elseif ( is_array( $this->iter ) ) {
return ( current( $this->iter ) !== false ); // no paths can have this value
}
}
+ /**
+ * Filter out duplicate items by advancing to the next ones
+ */
+ protected function filterViaNext() {
+ while ( $this->iter->valid() ) {
+ $rel = $this->iter->current(); // path relative to given directory
+ $path = $this->params['dir'] . "/{$rel}"; // full storage path
+ if ( !$this->backend->isSingleShardPathInternal( $path ) ) {
+ // Don't keep listing paths that are on multiple shards
+ if ( isset( $this->multiShardPaths[$rel] ) ) {
+ $this->iter->next(); // we already listed this path
+ } else {
+ $this->multiShardPaths[$rel] = 1;
+ break;
+ }
+ }
+ }
+ }
+
/**
* If the list iterator for this container shard is out of items,
* then move on to the next container that has items.
*/
protected function setIteratorFromCurrentShard() {
$suffix = $this->shardSuffixes[$this->curShard];
- $this->iter = $this->backend->getFileListInternal(
+ $this->iter = $this->listFromShard(
"{$this->container}{$suffix}", $this->directory, $this->params );
}
+
+ /**
+ * Get the list for a given container shard
+ *
+ * @param $container string Resolved container name
+ * @param $dir string Resolved path relative to container
+ * @param $params Array
+ * @return Traversable|Array|null
+ */
+ abstract protected function listFromShard( $container, $dir, array $params );
+}
+
+/**
+ * Iterator for listing directories
+ */
+class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator {
+ protected function listFromShard( $container, $dir, array $params ) {
+ return $this->backend->getDirectoryListInternal( $container, $dir, $params );
+ }
+}
+
+/**
+ * Iterator for listing regular files
+ */
+class FileBackendStoreShardFileIterator extends FileBackendStoreShardListIterator {
+ protected function listFromShard( $container, $dir, array $params ) {
+ return $this->backend->getFileListInternal( $container, $dir, $params );
+ }
}
protected $auth; // Swift authentication handler
protected $authTTL; // integer seconds
protected $swiftAnonUser; // string; username to handle unauthenticated requests
- protected $maxContCacheSize = 100; // integer; max containers with entries
+ protected $maxContCacheSize = 300; // integer; max containers with entries
/** @var CF_Connection */
protected $conn; // Swift connection handle
// Optional settings
$this->authTTL = isset( $config['swiftAuthTTL'] )
? $config['swiftAuthTTL']
- : 120; // some sane number
+ : 5 * 60; // some sane number
$this->swiftAnonUser = isset( $config['swiftAnonUser'] )
? $config['swiftAnonUser']
: '';
$this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
? $config['shardViaHashLevels']
: '';
+ // Cache container info to mask latency
+ $this->memCache = wfGetMainCache();
}
/**
return $data;
}
+ /**
+ * @see FileBackendStore::doDirectoryExists()
+ * @return bool|null
+ */
+ protected function doDirectoryExists( $fullCont, $dir, array $params ) {
+ try {
+ $container = $this->getContainer( $fullCont );
+ $prefix = ( $dir == '' ) ? null : "{$dir}/";
+ return ( count( $container->list_objects( 1, null, $prefix ) ) > 0 );
+ } catch ( NoSuchContainerException $e ) {
+ return false;
+ } catch ( InvalidResponseException $e ) {
+ } catch ( Exception $e ) { // some other exception?
+ $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
+ }
+
+ return null; // error
+ }
+
+ /**
+ * @see FileBackendStore::getDirectoryListInternal()
+ * @return SwiftFileBackendDirList
+ */
+ public function getDirectoryListInternal( $fullCont, $dir, array $params ) {
+ return new SwiftFileBackendDirList( $this, $fullCont, $dir, $params );
+ }
+
/**
* @see FileBackendStore::getFileListInternal()
* @return SwiftFileBackendFileList
*/
public function getFileListInternal( $fullCont, $dir, array $params ) {
- return new SwiftFileBackendFileList( $this, $fullCont, $dir );
+ return new SwiftFileBackendFileList( $this, $fullCont, $dir, $params );
}
/**
*
* @param $fullCont string Resolved container name
* @param $dir string Resolved storage directory with no trailing slash
- * @param $after string Storage path of file to list items after
+ * @param $after string|null Storage path of file to list items after
* @param $limit integer Max number of items to list
- * @return Array
+ * @param $params Array Includes flag for 'topOnly'
+ * @return Array List of relative paths of dirs directly under $dir
*/
- public function getFileListPageInternal( $fullCont, $dir, $after, $limit ) {
+ public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
+ $dirs = array();
+
+ try {
+ $container = $this->getContainer( $fullCont );
+ $prefix = ( $dir == '' ) ? null : "{$dir}/";
+ // Non-recursive: only list dirs right under $dir
+ if ( !empty( $params['topOnly'] ) ) {
+ $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+ foreach ( $objects as $object ) { // files and dirs
+ if ( substr( $object, -1 ) === '/' ) {
+ $dirs[] = $object; // directories end in '/'
+ }
+ $after = $object; // update last item
+ }
+ // Recursive: list all dirs under $dir and its subdirs
+ } else {
+ // Get directory from last item of prior page
+ $lastDir = $this->getParentDir( $after ); // must be first page
+ $objects = $container->list_objects( $limit, $after, $prefix );
+ foreach ( $objects as $object ) { // files
+ $objectDir = $this->getParentDir( $object ); // directory of object
+ if ( $objectDir !== false ) { // file has a parent dir
+ // Swift stores paths in UTF-8, using binary sorting.
+ // See function "create_container_table" in common/db.py.
+ // If a directory is not "greater" than the last one,
+ // then it was already listed by the calling iterator.
+ if ( $objectDir > $lastDir ) {
+ $pDir = $objectDir;
+ do { // add dir and all its parent dirs
+ $dirs[] = "{$pDir}/";
+ $pDir = $this->getParentDir( $pDir );
+ } while ( $pDir !== false // sanity
+ && $pDir > $lastDir // not done already
+ && strlen( $pDir ) > strlen( $dir ) // within $dir
+ );
+ }
+ $lastDir = $objectDir;
+ }
+ $after = $object; // update last item
+ }
+ }
+ } catch ( NoSuchContainerException $e ) {
+ } catch ( InvalidResponseException $e ) {
+ } catch ( Exception $e ) { // some other exception?
+ $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
+ }
+
+ return $dirs;
+ }
+
+ protected function getParentDir( $path ) {
+ return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
+ }
+
+ /**
+ * Do not call this function outside of SwiftFileBackendFileList
+ *
+ * @param $fullCont string Resolved container name
+ * @param $dir string Resolved storage directory with no trailing slash
+ * @param $after string|null Storage path of file to list items after
+ * @param $limit integer Max number of items to list
+ * @param $params Array Includes flag for 'topOnly'
+ * @return Array List of relative paths of files under $dir
+ */
+ public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
$files = array();
try {
$container = $this->getContainer( $fullCont );
$prefix = ( $dir == '' ) ? null : "{$dir}/";
- $files = $container->list_objects( $limit, $after, $prefix );
+ // Non-recursive: only list files right under $dir
+ if ( !empty( $params['topOnly'] ) ) { // files and dirs
+ $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+ foreach ( $objects as $object ) {
+ if ( substr( $object, -1 ) !== '/' ) {
+ $files[] = $object; // directories end in '/'
+ }
+ }
+ // Recursive: list all files under $dir and its subdirs
+ } else { // files
+ $files = $container->list_objects( $limit, $after, $prefix );
+ }
+ $after = end( $files ); // update last item
+ reset( $files ); // reset pointer
} catch ( NoSuchContainerException $e ) {
} catch ( InvalidResponseException $e ) {
} catch ( Exception $e ) { // some other exception?
return $tmpFile;
}
+ /**
+ * @see FileBackendStore::directoriesAreVirtual()
+ * @return bool
+ */
+ protected function directoriesAreVirtual() {
+ return true;
+ }
+
/**
* Get headers to send to Swift when reading a file based
* on a FileBackend params array, e.g. that of getLocalCopy().
* Use $reCache if the file count or byte count is needed.
*
* @param $container string Container name
- * @param $reCache bool Refresh the process cache
+ * @param $bypassCache bool Bypass all caches and load from Swift
* @return CF_Container
+ * @throws InvalidResponseException
*/
- protected function getContainer( $container, $reCache = false ) {
+ protected function getContainer( $container, $bypassCache = false ) {
$conn = $this->getConnection(); // Swift proxy connection
- if ( $reCache ) {
- unset( $this->connContainers[$container] ); // purge cache
+ if ( $bypassCache ) { // purge cache
+ unset( $this->connContainers[$container] );
+ } elseif ( !isset( $this->connContainers[$container] ) ) {
+ $this->primeContainerCache( array( $container ) ); // check persistent cache
}
if ( !isset( $this->connContainers[$container] ) ) {
$contObj = $conn->get_container( $container );
// NoSuchContainerException not thrown: container must exist
if ( count( $this->connContainers ) >= $this->maxContCacheSize ) { // trim cache?
reset( $this->connContainers );
- $key = key( $this->connContainers );
- unset( $this->connContainers[$key] );
+ unset( $this->connContainers[key( $this->connContainers )] );
}
$this->connContainers[$container] = $contObj; // cache it
+ if ( !$bypassCache ) {
+ $this->setContainerCache( $container, // update persistent cache
+ array( 'bytes' => $contObj->bytes_used, 'count' => $contObj->object_count )
+ );
+ }
}
return $this->connContainers[$container];
}
*
* @param $container string Container name
* @return CF_Container
+ * @throws InvalidResponseException
*/
protected function createContainer( $container ) {
$conn = $this->getConnection(); // Swift proxy connection
*
* @param $container string Container name
* @return void
+ * @throws InvalidResponseException
*/
protected function deleteContainer( $container ) {
$conn = $this->getConnection(); // Swift proxy connection
unset( $this->connContainers[$container] ); // purge cache
}
+ /**
+ * @see FileBackendStore::doPrimeContainerCache()
+ * @return void
+ */
+ protected function doPrimeContainerCache( array $containerInfo ) {
+ try {
+ $conn = $this->getConnection(); // Swift proxy connection
+ foreach ( $containerInfo as $container => $info ) {
+ $this->connContainers[$container] = new CF_Container(
+ $conn->cfs_auth,
+ $conn->cfs_http,
+ $container,
+ $info['count'],
+ $info['bytes']
+ );
+ }
+ } catch ( InvalidResponseException $e ) {
+ } catch ( Exception $e ) { // some other exception?
+ $this->logException( $e, __METHOD__, array() );
+ }
+ }
+
/**
* Log an unexpected exception for this backend
*
}
/**
- * SwiftFileBackend helper class to page through object listings.
+ * SwiftFileBackend helper class to page through listings.
* Swift also has a listing limit of 10,000 objects for sanity.
* Do not use this class from places outside SwiftFileBackend.
*
* @ingroup FileBackend
*/
-class SwiftFileBackendFileList implements Iterator {
+abstract class SwiftFileBackendList implements Iterator {
/** @var Array */
protected $bufferIter = array();
protected $bufferAfter = null; // string; list items *after* this path
protected $pos = 0; // integer
+ /** @var Array */
+ protected $params = array();
/** @var SwiftFileBackend */
protected $backend;
- protected $container; //
- protected $dir; // string storage directory
+ protected $container; // string; container name
+ protected $dir; // string; storage directory
protected $suffixStart; // integer
const PAGE_SIZE = 5000; // file listing buffer size
* @param $backend SwiftFileBackend
* @param $fullCont string Resolved container name
* @param $dir string Resolved directory relative to container
+ * @param $params Array
*/
- public function __construct( SwiftFileBackend $backend, $fullCont, $dir ) {
+ public function __construct( SwiftFileBackend $backend, $fullCont, $dir, array $params ) {
$this->backend = $backend;
$this->container = $fullCont;
$this->dir = $dir;
} else { // dir within container
$this->suffixStart = strlen( $this->dir ) + 1; // size of "path/to/dir/"
}
- }
-
- /**
- * @see Iterator::current()
- * @return string|bool String or false
- */
- public function current() {
- return substr( current( $this->bufferIter ), $this->suffixStart );
+ $this->params = $params;
}
/**
// Check if there are no files left in this page and
// advance to the next page if this page was not empty.
if ( !$this->valid() && count( $this->bufferIter ) ) {
- $this->bufferAfter = end( $this->bufferIter );
- $this->bufferIter = $this->backend->getFileListPageInternal(
- $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
- );
+ $this->bufferIter = $this->pageFromList(
+ $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+ ); // updates $this->bufferAfter
}
}
public function rewind() {
$this->pos = 0;
$this->bufferAfter = null;
- $this->bufferIter = $this->backend->getFileListPageInternal(
- $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
- );
+ $this->bufferIter = $this->pageFromList(
+ $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+ ); // updates $this->bufferAfter
}
/**
* @return bool
*/
public function valid() {
- return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+ if ( $this->bufferIter === null ) {
+ return false; // some failure?
+ } else {
+ return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+ }
+ }
+
+ /**
+ * Get the given list portion (page)
+ *
+ * @param $container string Resolved container name
+ * @param $dir string Resolved path relative to container
+ * @param $after string|null
+ * @param $limit integer
+ * @param $params Array
+ * @return Traversable|Array|null Returns null on failure
+ */
+ abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
+}
+
+/**
+ * Iterator for listing directories
+ */
+class SwiftFileBackendDirList extends SwiftFileBackendList {
+ /**
+ * @see Iterator::current()
+ * @return string|bool String (relative path) or false
+ */
+ public function current() {
+ return substr( current( $this->bufferIter ), $this->suffixStart, -1 );
+ }
+
+ /**
+ * @see SwiftFileBackendList::pageFromList()
+ * @return Array|null
+ */
+ protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+ return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
+ }
+}
+
+/**
+ * Iterator for listing regular files
+ */
+class SwiftFileBackendFileList extends SwiftFileBackendList {
+ /**
+ * @see Iterator::current()
+ * @return string|bool String (relative path) or false
+ */
+ public function current() {
+ return substr( current( $this->bufferIter ), $this->suffixStart );
+ }
+
+ /**
+ * @see SwiftFileBackendList::pageFromList()
+ * @return Array|null
+ */
+ protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+ return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
}
}
$this->type = $type;
}
- protected function __clone() {}
-
/**
* Get a ScopedLock object representing a lock on resource paths.
* Any locks are released once this object goes out of scope.
protected $managers = array();
protected function __construct() {}
- protected function __clone() {}
-
/**
* @return LockManagerGroup
*/
array( 'ORDER BY' => 'fa_timestamp DESC' ) );
if ( $res == false || $dbr->numRows( $res ) == 0 ) {
// this revision does not exist?
- return;
+ return null;
}
$ret = $dbr->resultObject( $res );
$row = $ret->fetchObject();
}
}
+ // If the backend is ready-only, don't keep generating thumbnails
+ // only to return transformation errors, just return the error now.
+ if ( $this->repo->getReadOnlyReason() !== false ) {
+ $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
+ break;
+ }
+
// Create a temp FS file with the same extension and the thumbnail
$thumbExt = FileBackend::extensionFromPath( $thumbPath );
$tmpFile = TempFSFile::factory( 'transform_', $thumbExt );
} else {
$thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
}
+ // Give extensions a chance to do something with this thumbnail...
+ wfRunHooks( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
}
// Purge. Useful in the event of Core -> Squid connection failure or squid
# Delete the thumbnails
$this->repo->quickPurgeBatch( $purgeList );
# Clear out the thumbnail directory if empty
- $this->repo->cleanDir( $dir );
+ $this->repo->quickCleanDir( $dir );
}
}
# Delete the thumbnails
$this->repo->quickPurgeBatch( $purgeList );
# Clear out the thumbnail directory if empty
- $this->repo->cleanDir( $dir );
+ $this->repo->quickCleanDir( $dir );
}
/** purgeDescription inherited */
* @since 1.20
*
* @param $tableName string
+ * @return bool
*/
public function tableExists( $tableName ) {
return ( $this->db->tableExists( $tableName, __METHOD__ ) );
array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ),
array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ),
array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ),
- array( 'setDefault', 'image', 'img_metadata', '\'\x\'::bytea'),
array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'),
- array( 'setDefault', 'filearchive', 'fa_metadata', '\'\x\'::bytea'),
array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'),
array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
* - formatting log entries based on database fields
* - user is now part of the action message
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @author Niklas Laxström
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
/**
* Contains classes for formatting log entries
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @author Niklas Laxström
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
<?php
-
/**
- * Class containing static functions for working with
- * logs of patrol events
+ * Specific methods for the patrol log.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @author Rob Church <robchur@gmail.com>
* @author Niklas Laxström
*/
+
+/**
+ * Class containing static functions for working with
+ * logs of patrol events
+ */
class PatrolLog {
/**
<?php
+/**
+ * Object caching using PHP's APC accelerator.
+ *
+ * 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
+ */
/**
* This is a wrapper for APC's shared memory functions
/**
* Get an item with the given key. Returns false if it does not exist.
* @param $key string
- *
- * @return bool|Object
+ * @return mixed Returns false on failure
*/
abstract public function get( $key );
* Get an associative array containing the item for each of the given keys.
* Each item will be false if it does not exist.
* @param $keys Array List of strings
- *
* @return Array
*/
public function getBatch( array $keys ) {
* @param $key string
* @param $value mixed
* @param $exptime int Either an interval in seconds or a unix timestamp for expiry
+ * @return bool success
*/
abstract public function set( $key, $value, $exptime = 0 );
* Delete an item.
* @param $key string
* @param $time int Amount of time to delay the operation (mostly memcached-specific)
+ * @return bool success
*/
abstract public function delete( $key, $time = 0 );
+ /**
+ * @param $key string
+ * @param $timeout integer
+ * @return bool success
+ */
public function lock( $key, $timeout = 0 ) {
/* stub */
return true;
}
+ /**
+ * @param $key string
+ * @return bool success
+ */
public function unlock( $key ) {
/* stub */
return true;
}
+ /**
+ * @todo: what is this?
+ * @return Array
+ */
public function keys() {
/* stub */
return array();
/* *** Emulated functions *** */
+ /**
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime integer
+ * @return bool success
+ */
public function add( $key, $value, $exptime = 0 ) {
if ( !$this->get( $key ) ) {
- $this->set( $key, $value, $exptime );
-
- return true;
+ return $this->set( $key, $value, $exptime );
}
+ return true;
}
+ /**
+ * @param $key string
+ * @param $value mixed
+ * @return bool success
+ */
public function replace( $key, $value, $exptime = 0 ) {
if ( $this->get( $key ) !== false ) {
- $this->set( $key, $value, $exptime );
+ return $this->set( $key, $value, $exptime );
}
+ return true;
}
/**
* @param $key String: Key to increase
* @param $value Integer: Value to add to $key (Default 1)
* @return null if lock is not possible else $key value increased by $value
+ * @return success
*/
public function incr( $key, $value = 1 ) {
if ( !$this->lock( $key ) ) {
return $n;
}
+ /**
+ * @param $key String
+ * @param $value Integer
+ * @return bool success
+ */
public function decr( $key, $value = 1 ) {
return $this->incr( $key, - $value );
}
+ /**
+ * @param $text string
+ */
public function debug( $text ) {
if ( $this->debugMode ) {
$class = get_class( $this );
/**
* Convert an optionally relative time to an absolute time
+ * @param $exptime integer
* @return int
*/
protected function convertExpiry( $exptime ) {
}
}
}
-
-
<?php
+/**
+ * Object caching using DBA backend.
+ *
+ * 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
+ */
/**
* Cache that uses DBA as a backend.
<?php
+/**
+ * Object caching using the Ehcache RESTful web service.
+ *
+ * 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
+ */
/**
* Client for the Ehcache RESTful web service - http://ehcache.org/documentation/cache_server.html
* TODO: Simplify configuration and add to the installer.
+ *
+ * @ingroup Cache
*/
class EhcacheBagOStuff extends BagOStuff {
var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
<?php
+/**
+ * Dummy object caching.
+ *
+ * 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
+ */
/**
* A BagOStuff object with no objects in it. Used to provide a no-op object to calling code.
<?php
+/**
+ * Object caching using PHP arrays.
+ *
+ * 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
+ */
/**
* This is a test of the interface, mainly. It stores things in an associative
<?php
/**
+ * Memcached client for PHP.
+ *
* +---------------------------------------------------------------------------+
* | memcached client, PHP |
* +---------------------------------------------------------------------------+
$this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
}
- if ( $res == "DELETED" ) {
+ if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
return true;
}
+
return false;
}
<?php
+/**
+ * Object caching using memcached.
+ *
+ * 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
+ */
/**
* A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
+ *
+ * @ingroup Cache
*/
class MemcachedPhpBagOStuff extends BagOStuff {
<?php
+/**
+ * Wrapper for object caching in different caches.
+ *
+ * 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
+ */
/**
* A cache class that replicates all writes to multiple child caches. Reads
* are implemented by reading from the caches in the order they are given in
* the configuration until a cache gives a positive result.
+ *
+ * @ingroup Cache
*/
class MultiWriteBagOStuff extends BagOStuff {
var $caches;
<?php
/**
- * Functions to get cache objects
+ * Functions to get cache objects.
+ *
+ * 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
*/
+
+/**
+ * Functions to get cache objects
+ *
+ * @ingroup Cache
+ */
class ObjectCache {
static $instances = array();
<?php
+/**
+ * Object caching using a SQL database.
+ *
+ * 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
+ */
/**
* Class to store objects in the database
<?php
+/**
+ * Object caching using WinCache.
+ *
+ * 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
+ */
/**
* Wrapper for WinCache object caching functions; identical interface
<?php
+/**
+ * Object caching using XCache.
+ *
+ * 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
+ */
/**
* Wrapper for XCache object caching functions; identical interface
/**
* Link functions provided by MediaWiki core; experimental
*
+ * 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 Parser
*/
/**
/**
* Parser functions provided by MediaWiki core
*
+ * 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 Parser
*/
/**
/**
* Tag hooks provided by MediaWiki core
*
+ * 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 Parser
*/
/**
/**
* Date formatter
*
+ * 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 Parser
*/
/**
/**
* Holder of replacement pairs for wiki links
*
+ * 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 Parser
*/
/**
<?php
/**
- * @defgroup Parser Parser
+ * PHP parser that converts wiki markup to HTML.
+ *
+ * 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 Parser
- * File for Parser and related classes
*/
+/**
+ * @defgroup Parser Parser
+ */
/**
* PHP Parser - Processes wiki markup (which uses a more user-friendly
public function __construct( $conf = array() ) {
$this->mConf = $conf;
$this->mUrlProtocols = wfUrlProtocols();
- $this->mExtLinkBracketedRegex = '/\[((' . wfUrlProtocols() . ')'.
+ $this->mExtLinkBracketedRegex = '/\[((' . $this->mUrlProtocols . ')'.
self::EXT_LINK_URL_CLASS.'+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
if ( isset( $conf['preprocessorClass'] ) ) {
$this->mPreprocessorClass = $conf['preprocessorClass'];
# Don't allow internal links to pages containing
# PROTO: where PROTO is a valid URL protocol; these
# should be external links.
- if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $m[1] ) ) {
+ if ( preg_match( '/^(?:' . $this->mUrlProtocols . ')/', $m[1] ) ) {
$s .= $prefix . '[[' . $line ;
wfProfileOut( __METHOD__."-misc" );
continue;
* @return String: less-or-more HTML with NOPARSE bits
*/
function armorLinks( $text ) {
- return preg_replace( '/\b(' . wfUrlProtocols() . ')/',
+ return preg_replace( '/\b(' . $this->mUrlProtocols . ')/',
"{$this->mUniqPrefix}NOPARSE$1", $text );
}
# @todo FIXME: Not tolerant to blank link text
# I.E. [http://www.mediawiki.org] will render as [1] or something depending
# on how many empty links there are on the page - need to figure that out.
- $text = preg_replace( '/\[(?:' . wfUrlProtocols() . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
+ $text = preg_replace( '/\[(?:' . $this->mUrlProtocols . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
# Parse wikitext quotes (italics & bold)
$text = $this->doQuotes( $text );
/**
* Cache for outputs of the PHP parser
*
+ * 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 Parser
*/
/**
<?php
/**
- * \brief Options for the PHP parser
+ * Options for the PHP parser
+ *
+ * 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 Parser
/**
* Output of the PHP parser
*
+ * 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 Parser
*/
* @todo document
* @ingroup Parser
*/
-
class CacheTime {
var $mVersion = Parser::VERSION, # Compatibility check
$mCacheTime = '', # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
/**
* Fake parser that output the difference of two different parsers
*
+ * 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 Parser
*/
/**
/**
* Modified version of the PHP parser with hooks for wiki links; experimental
*
+ * 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 Parser
*/
/**
/**
* Interfaces for preprocessors
*
+ * 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 Parser
*/
/**
/**
* Preprocessor using PHP's dom extension
*
+ * 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 Parser
*/
}
if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+ $this->parser->limitationWarn( 'node-count-exceeded',
+ $this->parser->mPPNodeCount,
+ $this->parser->mOptions->getMaxPPNodeCount()
+ );
return '<span class="error">Node-count limit exceeded</span>';
}
if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+ $this->parser->limitationWarn( 'expansion-depth-exceeded',
+ $expansionDepth,
+ $this->parser->mOptions->getMaxPPExpandDepth()
+ );
return '<span class="error">Expansion depth limit exceeded</span>';
}
wfProfileIn( __METHOD__ );
/**
* Preprocessor using PHP arrays
*
+ * 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 Parser
*/
}
if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+ $this->parser->limitationWarn( 'node-count-exceeded',
+ $this->parser->mPPNodeCount,
+ $this->parser->mOptions->getMaxPPNodeCount()
+ );
return '<span class="error">Node-count limit exceeded</span>';
}
if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+ $this->parser->limitationWarn( 'expansion-depth-exceeded',
+ $expansionDepth,
+ $this->parser->mOptions->getMaxPPExpandDepth()
+ );
return '<span class="error">Expansion depth limit exceeded</span>';
}
++$expansionDepth;
* A preprocessor optimised for HipHop, using HipHop-specific syntax.
* vim: ft=php
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Parser
*/
}
if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+ $this->parser->limitationWarn( 'node-count-exceeded',
+ $this->parser->mPPNodeCount,
+ $this->parser->mOptions->getMaxPPNodeCount()
+ );
return '<span class="error">Node-count limit exceeded</span>';
}
if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+ $this->parser->limitationWarn( 'expansion-depth-exceeded',
+ $expansionDepth,
+ $this->parser->mOptions->getMaxPPExpandDepth()
+ );
return '<span class="error">Expansion depth limit exceeded</span>';
}
++$expansionDepth;
<?php
+/**
+ * Holder for stripped items when parsing wiki markup.
+ *
+ * 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 Parser
+ */
/**
* @todo document, briefly.
/**
* HTML validation and correction
*
+ * 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 Parser
*/
/**
*
* This re-uses some of the parser's UNIQ tricks, though some of it is private so it's
* duplicated. Perhaps we should create an abstract marker hiding class.
+ *
+ * @ingroup Parser
*/
class MWTidyWrapper {
<?php
/**
- * @defgroup Profiler Profiler
+ * Base class and functions for profiling.
+ *
+ * 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 Profiler
* This file is only included if profiling is enabled
*/
+/**
+ * @defgroup Profiler Profiler
+ */
+
/**
* Begin profiling of a function
* @param $functionname String: name of the function we will profile
<?php
/**
+ * Base class for simple profiling.
+ *
+ * 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 Profiler
*/
<?php
/**
+ * Profiler showing output in page source.
+ *
+ * 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 Profiler
*/
<?php
/**
+ * Profiler showing execution trace.
+ *
+ * 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 Profiler
*/
<?php
/**
+ * Profiler sending messages over UDP.
+ *
+ * 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 Profiler
*/
<?php
/**
- * Stub profiling functions
+ * Stub profiling functions.
+ *
+ * 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 Profiler
*/
+
+/**
+ * Stub profiler that does nothing
+ *
+ * @ingroup Profiler
+ */
class ProfilerStub extends Profiler {
public function isStub() {
return true;
<?php
/**
+ * Base class for resource loading system.
+ *
* 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
<?php
/**
+ * Context for resource loader modules.
+ *
* 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
<?php
/**
+ * Resource loader module based on local JavaScript/CSS files.
+ *
* 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
<?php
+/**
+ * Resource loader module for MediaWiki:Filepage.css
+ *
+ * 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
+ */
+
/**
* ResourceLoader definition for MediaWiki:Filepage.css
*/
<?php
/**
+ * Resource loader module for populating language specific data.
+ *
* 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
<?php
/**
+ * Abstraction for resource loader modules.
+ *
* 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
<?php
/**
+ * Resource loader for site customizations for users without JavaScript enabled.
+ *
* 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
<?php
/**
+ * Resource loader module for site customizations.
+ *
* 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
<?php
/**
+ * Module for resource loader initialization.
+ *
* 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
<?php
/**
+ * Resource loader module for user preference customizations.
+ *
* 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
<?php
/**
+ * Resource loader module for user customizations.
+ *
* 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
<?php
/**
+ * Resource loader module for user customizations.
+ *
* 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
<?php
/**
+ * Resource loader module for user preference customizations.
+ *
* 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
<?php
/**
+ * Resource loader module for user tokens.
+ *
* 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
<?php
/**
+ * Abstraction for resource loader modules which pull from wiki pages.
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
*/
protected function getContent( $title ) {
if ( $title->getNamespace() === NS_MEDIAWIKI ) {
- $message = wfMessage( $title->getDBkey() )->inContentLanguage();
- return $message->exists() ? $message->plain() : '';
+ // The first "true" is to use the database, the second is to use the content langue
+ // and the last one is to specify the message key already contains the language in it ("/de", etc.)
+ $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
+ return $text === false ? '' : $text;
}
if ( !$title->isCssJsSubpage() && !$title->isCssOrJsPage() ) {
return null;
<?php
+/**
+ * Base implementations for deletable items.
+ *
+ * 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 RevisionDelete
+ */
+
/**
* List for revision table items
*
<?php
+/**
+ * Interface definition for deletable items.
+ *
+ * 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 RevisionDelete
+ */
/**
* Abstract base class for a list of deletable items. The list class
<?php
/**
- * Backend functions for suppressing and unsuppressing all references to a given user,
- * used when blocking with HideUser enabled. This was spun out of SpecialBlockip.php
- * in 1.18; at some point it needs to be rewritten to either use RevisionDelete abstraction,
- * or at least schema abstraction.
+ * Backend functions for suppressing and unsuppressing all references to a given user.
*
* 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
* @file
* @ingroup RevisionDelete
*/
+
+/**
+ * Backend functions for suppressing and unsuppressing all references to a given user,
+ * used when blocking with HideUser enabled. This was spun out of SpecialBlockip.php
+ * in 1.18; at some point it needs to be rewritten to either use RevisionDelete abstraction,
+ * or at least schema abstraction.
+ *
+ * @ingroup RevisionDelete
+ */
class RevisionDeleteUser {
/**
/**
* Revision/log/file deletion backend
*
+ * 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 RevisionDelete
*/
/**
/**
* Basic search engine
*
+ * 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 Search
*/
*
* See deferred.txt
*
+ * 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 Search
*/
* @ingroup SpecialPage Pager
*/
class CategoryPager extends AlphabeticPager {
- private $conds = array( 'cat_pages > 0' );
-
function __construct( IContextSource $context, $from ) {
parent::__construct( $context );
$from = str_replace( ' ', '_', $from );
if( $from !== '' ) {
$from = Title::capitalize( $from, NS_CATEGORY );
- $dbr = wfGetDB( DB_SLAVE );
- $this->conds[] = 'cat_title >= ' . $dbr->addQuotes( $from );
- $this->setOffset( '' );
+ $this->mOffset = $from;
}
}
return array(
'tables' => array( 'category' ),
'fields' => array( 'cat_title','cat_pages' ),
- 'conds' => $this->conds,
+ 'conds' => array( 'cat_pages > 0' ),
'options' => array( 'USE INDEX' => 'cat_title' ),
);
}
if ( $request->getVal( 'contribs' ) == 'newbie' ) {
$target = 'newbies';
$this->opts['contribs'] = 'newbie';
+ } elseif ( $par === 'newbies' ) { // b/c for WMF
+ $target = 'newbies';
+ $this->opts['contribs'] = 'newbie';
} else {
$this->opts['contribs'] = 'user';
}
} else {
$condition['rev_user_text'] = $this->target;
$index = 'usertext_timestamp';
- }
+ }
}
if ( $this->deletedOnly ) {
$condition[] = "rev_deleted != '0'";
* @defgroup Watchlist Users watchlist handling
*/
+/**
+ * Implements Special:EditWatchlist
+ *
+ * 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 SpecialPage
+ * @ingroup Watchlist
+ */
+
/**
* Provides the UI through which users can perform editing
* operations on their watchlist
*
+ * @ingroup SpecialPage
* @ingroup Watchlist
* @author Rob Church <robchur@gmail.com>
*/
),
'Subject' => array(
'type' => 'text',
- 'default' => wfMsgExt( 'defemailsubject', array( 'content', 'parsemag' ), $this->getUser()->getName() ),
+ 'default' => $this->msg( 'defemailsubject',
+ $this->getUser()->getName() )->inContentLanguage()->text(),
'label-message' => 'emailsubject',
'maxlength' => 200,
'size' => 60,
$this->mTargetObj = $ret;
$form = new HTMLForm( $this->getFormFields(), $this->getContext() );
- $form->addPreText( wfMsgExt( 'emailpagetext', 'parseinline' ) );
- $form->setSubmitText( wfMsg( 'emailsend' ) );
+ $form->addPreText( $this->msg( 'emailpagetext' )->parse() );
+ $form->setSubmitTextMsg( 'emailsend' );
$form->setTitle( $this->getTitle() );
- $form->setSubmitCallback( array( __CLASS__, 'submit' ) );
- $form->setWrapperLegend( wfMsgExt( 'email-legend', 'parsemag' ) );
+ $form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
+ $form->setWrapperLegendMsg( 'email-legend' );
$form->loadData();
if( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
$string = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' ) ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::openElement( 'fieldset' ) .
- Html::rawElement( 'legend', null, wfMessage( 'emailtarget' )->parse() ) .
- Xml::inputLabel( wfMessage( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
- Xml::submitButton( wfMessage( 'emailusernamesubmit' )->text() ) .
+ Html::rawElement( 'legend', null, $this->msg( 'emailtarget' )->parse() ) .
+ Xml::inputLabel( $this->msg( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
+ Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' ) . "\n";
return $string;
}
+ /**
+ * Submit callback for an HTMLForm object, will simply call submit().
+ *
+ * @since 1.20
+ * @param $data array
+ * @param $form HTMLForm object
+ * @return Status|string|bool
+ */
+ public static function uiSubmit( array $data, HTMLForm $form ) {
+ return self::submit( $data, $form->getContext() );
+ }
+
/**
* Really send a mail. Permissions should have been checked using
* getPermissionsError(). It is probably also a good
* @return Mixed: Status object, or potentially a String on error
* or maybe even true on success if anything uses the EmailUser hook.
*/
- public static function submit( $data ) {
+ public static function submit( array $data, IContextSource $context ) {
global $wgUser, $wgUserEmailUseReplyTo;
$target = self::getTarget( $data['Target'] );
if( !$target instanceof User ) {
- return wfMsgExt( $target . 'text', 'parse' );
+ return $context->msg( $target . 'text' )->parseAsBlock();
}
$to = new MailAddress( $target );
- $from = new MailAddress( $wgUser );
+ $from = new MailAddress( $context->getUser() );
$subject = $data['Subject'];
$text = $data['Text'];
// Add a standard footer and trim up trailing newlines
$text = rtrim( $text ) . "\n\n-- \n";
- $text .= wfMsgExt(
- 'emailuserfooter',
- array( 'content', 'parsemag' ),
- array( $from->name, $to->name )
- );
+ $text .= $context->msg( 'emailuserfooter',
+ $from->name, $to->name )->inContentLanguage()->text();
$error = '';
if( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
// unless they are emailing themselves, in which case one
// copy of the message is sufficient.
if ( $data['CCMe'] && $to != $from ) {
- $cc_subject = wfMsg(
- 'emailccsubject',
- $target->getName(),
- $subject
- );
+ $cc_subject = $context->msg( 'emailccsubject' )->rawParams(
+ $target->getName(), $subject )->text();
wfRunHooks( 'EmailUserCC', array( &$from, &$from, &$cc_subject, &$text ) );
$ccStatus = UserMailer::send( $from, $from, $cc_subject, $text );
$status->merge( $ccStatus );
<?php
/**
- * @ingroup SpecialPage
+ * Implements Special:JavaScriptTest
+ *
+ * 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 SpecialPage
*/
/**
$this->outputHeader();
if( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
- return $this->merge();
+ $this->merge();
+ return;
}
if ( !$this->mSubmitted ) {
public function getFeedObject( $feedFormat ){
$changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
$formatter = $changesFeed->getFeedObject(
- wfMsgForContent( 'recentchanges' ),
- wfMsgForContent( 'recentchanges-feed-description' ),
+ $this->msg( 'recentchanges' )->inContentLanguage()->text(),
+ $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
$this->getTitle()->getFullURL()
);
return array( $changesFeed, $formatter );
$extraOpts = $this->getExtraOptions( $opts );
$extraOptsCount = count( $extraOpts );
$count = 0;
- $submit = ' ' . Xml::submitbutton( wfMsg( 'allpagessubmit' ) );
+ $submit = ' ' . Xml::submitbutton( $this->msg( 'allpagessubmit' )->text() );
$out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
foreach( $extraOpts as $name => $optionRow ) {
$panelString = implode( "\n", $panel );
$this->getOutput()->addHTML(
- Xml::fieldset( wfMsg( 'recentchanges-legend' ), $panelString, array( 'class' => 'rcoptions' ) )
+ Xml::fieldset( $this->msg( 'recentchanges-legend' )->text(), $panelString, array( 'class' => 'rcoptions' ) )
);
$this->setBottomText( $opts );
$this->getOutput()->addWikiText(
Html::rawElement( 'p',
array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
- "\n" . wfMsgForContentNoTrans( 'recentchangestext' ) . "\n"
+ "\n" . $this->msg( 'recentchangestext' )->inContentLanguage()->plain() . "\n"
),
/* $lineStart */ false,
/* $interface */ false
array( 'selected' => $opts['namespace'], 'all' => '' ),
array( 'name' => 'namespace', 'id' => 'namespace' )
);
- $nsLabel = Xml::label( wfMsg( 'namespace' ), 'namespace' );
+ $nsLabel = Xml::label( $this->msg( 'namespace' )->text(), 'namespace' );
$invert = Xml::checkLabel(
- wfMsg( 'invert' ), 'invert', 'nsinvert',
+ $this->msg( 'invert' )->text(), 'invert', 'nsinvert',
$opts['invert'],
- array( 'title' => wfMsg( 'tooltip-invert' ) )
+ array( 'title' => $this->msg( 'tooltip-invert' )->text() )
);
$associated = Xml::checkLabel(
- wfMsg( 'namespace_association' ), 'associated', 'nsassociated',
+ $this->msg( 'namespace_association' )->text(), 'associated', 'nsassociated',
$opts['associated'],
- array( 'title' => wfMsg( 'tooltip-namespace_association' ) )
+ array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
);
return array( $nsLabel, "$nsSelect $invert $associated" );
}
* @return Array
*/
protected function categoryFilterForm( FormOptions $opts ) {
- list( $label, $input ) = Xml::inputLabelSep( wfMsg( 'rc_categories' ),
+ list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
'categories', 'mw-categories', false, $opts['categories'] );
- $input .= ' ' . Xml::checkLabel( wfMsg( 'rc_categories_any' ),
+ $input .= ' ' . Xml::checkLabel( $this->msg( 'rc_categories_any' )->text(),
'categories_any', 'mw-categories_any', $opts['categories_any'] );
return array( $label, $input );
$options = $nondefaults + $defaults;
$note = '';
- if( !wfEmptyMsg( 'rclegend' ) ) {
- $note .= '<div class="mw-rclegend">' .
- wfMsgExt( 'rclegend', array( 'parseinline' ) ) . "</div>\n";
+ $msg = $this->msg( 'rclegend' );
+ if( !$msg->isDisabled() ) {
+ $note .= '<div class="mw-rclegend">' . $msg->parse() . "</div>\n";
}
+
+ $lang = $this->getLanguage();
+ $user = $this->getUser();
if( $options['from'] ) {
- $note .= wfMsgExt( 'rcnotefrom', array( 'parseinline' ),
- $this->getLanguage()->formatNum( $options['limit'] ),
- $this->getLanguage()->timeanddate( $options['from'], true ),
- $this->getLanguage()->date( $options['from'], true ),
- $this->getLanguage()->time( $options['from'], true ) ) . '<br />';
+ $note .= $this->msg( 'rcnotefrom' )->numParams( $options['limit'] )->params(
+ $lang->userTimeAndDate( $options['from'], $user ),
+ $lang->userDate( $options['from'], $user ),
+ $lang->userTime( $options['from'], $user ) )->parse() . '<br />';
}
# Sort data for display and make sure it's unique after we've added user data.
// limit links
foreach( $wgRCLinkLimits as $value ) {
- $cl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
+ $cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
}
- $cl = $this->getLanguage()->pipeList( $cl );
+ $cl = $lang->pipeList( $cl );
// day links, reset 'from' to none
foreach( $wgRCLinkDays as $value ) {
- $dl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
+ $dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
}
- $dl = $this->getLanguage()->pipeList( $dl );
+ $dl = $lang->pipeList( $dl );
// show/hide links
- $showhide = array( wfMsg( 'show' ), wfMsg( 'hide' ) );
+ $showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
$filters = array(
'hideminor' => 'rcshowhideminor',
'hidebots' => 'rcshowhidebots',
$filters[$key] = $params['msg'];
}
// Disable some if needed
- if ( !$this->getUser()->useRCPatrol() ) {
+ if ( !$user->useRCPatrol() ) {
unset( $filters['hidepatrolled'] );
}
foreach ( $filters as $key => $msg ) {
$link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
array( $key => 1-$options[$key] ), $nondefaults );
- $links[] = wfMsgHtml( $msg, $link );
+ $links[] = $this->msg( $msg )->rawParams( $link )->escaped();
}
// show from this onward link
$timestamp = wfTimestampNow();
- $now = $this->getLanguage()->timeanddate( $timestamp, true );
+ $now = $lang->userTimeAndDate( $timestamp, $user );
$tl = $this->makeOptionsLink(
$now, array( 'from' => $timestamp ), $nondefaults
);
- $rclinks = wfMsgExt( 'rclinks', array( 'parseinline', 'replaceafter' ),
- $cl, $dl, $this->getLanguage()->pipeList( $links ) );
- $rclistfrom = wfMsgExt( 'rclistfrom', array( 'parseinline', 'replaceafter' ), $tl );
+ $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )->parse();
+ $rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
return "{$note}$rclinks<br />$rclistfrom";
}
public function getFeedObject( $feedFormat ){
$feed = new ChangesFeed( $feedFormat, false );
$feedObj = $feed->getFeedObject(
- wfMsgForContent( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() ),
- wfMsgForContent( 'recentchangeslinked-feed' ),
+ $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
+ ->inContentLanguage()->text(),
+ $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
$this->getTitle()->getFullUrl()
);
return array( $feed, $feedObj );
$opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
$extraOpts = array();
$extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
- $extraOpts['target'] = array( wfMsgHtml( 'recentchangeslinked-page' ),
+ $extraOpts['target'] = array( $this->msg( 'recentchangeslinked-page' )->escaped(),
Xml::input( 'target', 40, str_replace('_',' ',$opts['target']) ) .
Xml::check( 'showlinkedto', $opts['showlinkedto'], array('id' => 'showlinkedto') ) . ' ' .
- Xml::label( wfMsg("recentchangeslinked-to"), 'showlinkedto' ) );
+ Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
$tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
if ($tagFilter) {
$extraOpts['tagfilter'] = $tagFilter;
$t = Title::newFromText( $term );
# If the string cannot be used to create a title
if( is_null( $t ) ) {
- return $this->showResults( $term );
+ $this->showResults( $term );
+ return;
}
# If there's an exact or very near match, jump right there.
$t = SearchEngine::getNearMatch( $term );
return;
}
}
- return $this->showResults( $term );
+ $this->showResults( $term );
}
/**
<?php
/**
+ * Implements Special:Unblock
+ *
* 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
/* bool */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
/* ? */ 'namespace' => 'all',
/* ? */ 'invert' => false,
+ /* bool */ 'associated' => false,
);
$this->customFilters = array();
wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
# Get namespace value, if supplied, and prepare a WHERE fragment
$nameSpace = $request->getIntOrNull( 'namespace' );
- $invert = $request->getIntOrNull( 'invert' );
+ $invert = $request->getBool( 'invert' );
+ $associated = $request->getBool( 'associated' );
if ( !is_null( $nameSpace ) ) {
+ $eq_op = $invert ? '!=' : '=';\r
+ $bool_op = $invert ? 'AND' : 'OR';
$nameSpace = intval( $nameSpace ); // paranioa
- if ( $invert ) {
- $nameSpaceClause = "rc_namespace != $nameSpace";
+ if ( !$associated ) {
+ $nameSpaceClause = "rc_namespace $eq_op $nameSpace";
} else {
- $nameSpaceClause = "rc_namespace = $nameSpace";
+ $associatedNS = MWNamespace::getAssociated( $nameSpace );\r
+ $nameSpaceClause =
+ "rc_namespace $eq_op $nameSpace " .\r
+ $bool_op .\r
+ " rc_namespace $eq_op $associatedNS";
}
} else {
$nameSpace = '';
}
$values['namespace'] = $nameSpace;
$values['invert'] = $invert;
+ $values['associated'] = $associated;
if( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
$big = 1000; /* The magical big */
$tables = array( 'recentchanges', 'watchlist' );
$fields = array( $dbr->tableName( 'recentchanges' ) . '.*' );
$join_conds = array(
- 'watchlist' => array('INNER JOIN',"wl_user='{$user->getId()}' AND wl_namespace=rc_namespace AND wl_title=rc_title"),
+ 'watchlist' => array(
+ 'INNER JOIN',
+ array(
+ 'wl_user' => $user->getId(),
+ 'wl_namespace=rc_namespace',
+ 'wl_title=rc_title'
+ ),
+ ),
);
$options = array( 'ORDER BY' => 'rc_timestamp DESC' );
if( $wgShowUpdatedMarker ) {
'class' => 'namespaceselector',
)
) . ' ';
- $form .= Xml::checkLabel( $this->msg( 'invert' )->text(), 'invert', 'nsinvert', $invert ) . ' ';
+ $form .= Xml::checkLabel(
+ $this->msg( 'invert' )->text(),
+ 'invert',
+ 'nsinvert',
+ $invert,
+ array( 'title' => $this->msg( 'tooltip-invert' )->text() )
+ ) . ' ';
+ $form .= Xml::checkLabel(
+ $this->msg( 'namespace_association' )->text(),
+ 'associated',
+ 'associated',
+ $associated,
+ array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
+ ) . ' ';
$form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . '</p>';
$form .= Html::hidden( 'days', $values['days'] );
foreach ( $filters as $key => $msg ) {
أو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعديل هذه الصفحة]</span>.',
'noarticletext-nopermission' => 'لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.',
'previewnote' => "'''تذكر أن هذه مجرد معاينة للصفحة؛''''
-لم تحفظ تغييراتك إلى الآن[[#editform|→ Continue editing]]",
+لم تحفظ تغييراتك إلى الآن",
'editing' => 'تحرير $1',
'editingsection' => 'تحرير $1 (قسم)',
'templatesused' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:',
'updated' => '(Gewysig)',
'note' => "'''Nota:'''",
'previewnote' => "'''Onthou dat hierdie slegs 'n voorskou is.'''
-U teks is nog nie gestoor nie! [[#editform|→ Wysig verder]]",
+U teks is nog nie gestoor nie!",
'previewconflict' => 'Hierdie voorskou vertoon die teks in die boonste teksarea soos dit sou lyk indien u die bladsy stoor.',
'session_fail_preview' => "'''Jammer! Weens verlies aan sessie-inligting is die wysiging nie verwerk nie.
Probeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te teken.'''",
'updated' => '(محدثة)',
'note' => "'''ملاحظة:'''",
'previewnote' => "'''تذكر أن هذه مجرد معاينة أولية.'''
-لم تحفظ تغييراتك إلى الآن! [[#editform|→ Continue editing]]",
+لم تحفظ تغييراتك إلى الآن!",
'previewconflict' => 'هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.',
'session_fail_preview' => "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.
من فضلك حاول مرة أخرى.
هذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
'edit_form_incomplete' => "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
'editing' => 'تحرير $1',
+'creating' => 'إنشاء $1',
'editingsection' => 'تحرير $1 (قسم)',
'editingcomment' => 'تعديل $1 (قسم جديد)',
'editconflict' => 'تضارب في التحرير: $1',
'yourrealname' => 'الاسم الحقيقي:',
'yourlanguage' => 'اللغة:',
'yourvariant' => 'لهجة المحتوى:',
+'prefs-help-variant' => 'عرض لهجتك المفضلة أو إملاؤها في صفحات المحتوى لهذا الويكي.',
'yournick' => 'التوقيع:',
'prefs-help-signature' => 'يجب أن توقع تعليقات صفحات النقاش باستخدام "<nowiki>~~~~</nowiki>" الذي سيحول إلى توقيعك مع طابع زمني.',
'badsig' => 'توقيع خام غير صحيح؛ تحقق من وسوم HTML.',
'action-suppressionlog' => 'رؤية هذا السجل الخاص',
'action-block' => 'منع هذا المستخدم من التعديل',
'action-protect' => 'تغيير مستويات الحماية لهذه الصفحة',
+'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
'action-import' => 'استيراد هذه الصفحة من ويكي آخر',
'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع',
'action-patrol' => 'التعليم على تعديلات الآخرين كمراجعة',
'upload-http-error' => 'صودف خطأ HTTP: $1',
# File backend
+'backend-fail-stream' => 'لا يمكن عرض الملف $1.',
+'backend-fail-backup' => 'لا يمكن صنع نسخة أحتياطية للملف $1.',
'backend-fail-notexists' => 'الملف $1 غير موجود.',
+'backend-fail-notsame' => 'يوجد بالفعل ملف غير متطابق في $1.',
+'backend-fail-invalidpath' => '$1 ليس مسارا صالحا للتخزين.',
+'backend-fail-delete' => 'لم يمكن حذف الملف $1.',
+'backend-fail-alreadyexists' => 'الملف $1 موجود بالفعل.',
+'backend-fail-store' => 'لا يمكن تخزين الملف $1 في $2 .',
'backend-fail-copy' => 'لا يمكن نسخ الملف $1 إلى $2 .',
+'backend-fail-move' => 'تعذر نقل ملف $1 إلى $2 .',
'backend-fail-opentemp' => 'تعذّر فتح ملف مؤقت.',
'backend-fail-writetemp' => 'تعذّرت كتابة ملف مؤقت.',
'backend-fail-closetemp' => 'تعذّر إغلاق ملف مؤقت.',
+'backend-fail-read' => 'لا يمكن قراءة الملف $1.',
+'backend-fail-create' => 'تعذر إنشاء الملف $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'تعذر فتح "$1"، الملف غير مغلق.',
+'lockmanager-fail-closelock' => 'تعذر إغلاق ملف التأمين "$1".',
+'lockmanager-fail-deletelock' => 'تعذر حذف ملف التأمين "$1".',
+'lockmanager-fail-acquirelock' => 'لا يمكن الحصول على تأمين لـ "$1".',
+'lockmanager-fail-openlock' => 'تعذر إغلاق ملف التأمين "$1".',
+'lockmanager-fail-releaselock' => 'تعذر تحرير التأمين لـ "$1"..',
+'lockmanager-fail-db-bucket' => 'تعذر الإتصال بعدد كافي من قواعد تأمين البيانات في الحزمة $1.',
+'lockmanager-fail-db-release' => 'تعذر تحرير الأقفال في قاعدة البيانات $1.',
+'lockmanager-fail-svr-release' => 'تعذر تحرير الأقفال على الخادم $1.',
# ZipDirectoryReader
'zip-file-open-error' => 'صودف خطأ أثناء فتح الملف لفحوصات ZIP.',
'uploadstash-badtoken' => 'لم ينجح أداء ذلك العمل، ربما لأن وثائق تفويض التحرير الخاصة بك منتهية الصلاحية. حاول مرة أخرى.',
'uploadstash-errclear' => 'لم تنجح عملية مسح الملفات.',
'uploadstash-refresh' => 'تحديث قائمة الملفات',
+'invalid-chunk-offset' => 'قطعة أوفست غير صالحة',
# img_auth script messages
'img-auth-accessdenied' => 'رفض الوصول',
من فضلك انظر [$2 صفحة وصف الملف] لمزيد من المعلومات.',
'sharedupload-desc-here' => 'هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.
الوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.',
+'sharedupload-desc-edit' => 'هذا ملف من $1 وقد يكون مستخدما في مشاريع أخرى.
+يمكن لك تريد أن تعدل وصف الملف في [$2 صفحته] هناك.',
+'sharedupload-desc-create' => 'هذا ملف من $1 وقد يكون مستخدما في مشاريع أخرى.
+يمكن لك تريد أن تعدل وصف الملف في [$2 صفحته] هناك.',
'filepage-nofile' => 'لا ملف موجود بهذا الاسم.',
'filepage-nofile-link' => 'لا يوجد ملف بهذا الاسم، لكن يمكنك [$1 رفعه].',
'uploadnewversion-linktext' => 'ارفع نسخة جديدة من هذا الملف',
'wantedpages' => 'صفحات مطلوبة',
'wantedpages-badtitle' => 'عنوان غير صحيح في مجموعة النتائج: $1',
'wantedfiles' => 'ملفات مطلوبة',
+'wantedfiletext-cat' => 'الملفات التالية مستعملة ولكن لا وجود لها. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة. بالإضافة، أي صفحات تتضمن الملفات الغير موجودة تم سردها في [[:$1]].',
+'wantedfiletext-nocat' => 'الملفات التالية مستعملة ولكن غير متوفرة. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة.',
'wantedtemplates' => 'قوالب مطلوبة',
'mostlinked' => 'أكثر الصفحات وصلا',
'mostlinkedcategories' => 'أكثر التصنيفات ارتباطا',
'mostimages' => 'أكثر الملفات ارتباطا',
'mostrevisions' => 'أكثر الصفحات تعديلا',
'prefixindex' => 'كل الصفحات بالبادئة',
+'prefixindex-namespace' => 'كل الصفحات مع بادئة ($1 مساحة الأسم)',
'shortpages' => 'صفحات قصيرة',
'longpages' => 'صفحات طويلة',
'deadendpages' => 'صفحات نهاية مسدودة',
'protect-title' => 'ضبط مستوى الحماية ل"$1"',
'protect-title-notallowed' => 'عرض مستوى الحماية ل "$1"',
'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]',
+'protect-badnamespace-title' => 'مساحة إسم غير محمية',
+'protect-badnamespace-text' => 'لا يمكن حماية الصفحات الموجودة في مساحة الإسم',
'protect-legend' => 'تأكيد الحماية',
'protectcomment' => 'السبب:',
'protectexpiry' => 'تنتهي في:',
'undelete-cleanup-error' => 'خطأ حذف ملف أرشيف غير مستخدم "$1".',
'undelete-missing-filearchive' => 'غير قادر على استرجاع ملف الأرشيف رقم $1 لأنه ليس في قاعدة البيانات.
ربما يكون قد تم استرجاعه.',
+'undelete-error' => 'وقع خطأ عند إلغاء حذف الصفحة',
'undelete-error-short' => 'خطأ استرجاع ملف: $1',
'undelete-error-long' => 'حدثت أخطاء أثناء استرجاع الملف:
'exportcuronly' => 'ضمن المراجعة الحالية فقط، وليس التاريخ الكامل',
'exportnohistory' => "----
ملاحظة:''' تصدير التاريخ الكامل للصفحات من خلال هذه الاستمارة تم تعطيله لأسباب تتعلق بالأداء'''",
+'exportlistauthors' => 'أضف قائمة كاملة بالمساهمين لكل صفحة',
'export-submit' => 'صدر',
'export-addcattext' => 'أضف صفحات من تصنيف:',
'export-addcat' => 'أضف',
'thumbnail_error' => 'خطأ في إنشاء صورة مصغرة: $1',
'djvu_page_error' => 'صفحة DjVu خارج النطاق',
'djvu_no_xml' => 'لا يمكن جلب XML لملف DjVu',
+'thumbnail-temp-create' => 'تعذر إنشاء ملف الصورة المصغرة المؤقت',
+'thumbnail-dest-create' => 'تعذر حفظ الصورة المصغرة للوجهة',
'thumbnail_invalid_params' => 'محددات التصغير غير صحيحة',
'thumbnail_dest_directory' => 'غير قادر على إنشاء المجلد الهدف',
'thumbnail_image-type' => 'نوع الصورة غير مدعوم',
'internalerror' => 'ܦܘܕܐ ܓܘܝܐ',
'internalerror_info' => 'ܦܘܕܐ ܓܘܝܐ: $1',
'badtitle' => 'ܟܘܢܝܐ ܠܐ ܛܒܐ',
+'perfcached' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܕܠܐ ܢܗܘܢ ܚܘ̈ܕܬܐ. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$1|ܚܕ ܦܠܛܐ|$1 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
+'perfcachedts' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܚܘܕܬܐ ܐܚܪܝܐ ܗܘܐ ܒ $1. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$4|ܚܕ ܦܠܛܐ|$4 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
'viewsource' => 'ܚܙܝ ܡܒܘܥܐ',
-'actionthrottled' => 'ܠܐ ܘܪܕ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܐܗܐ ܥܒܕܐ',
-'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܠܚܙܝܐ ܘܢܣܚܐ ܠܡܒܘܥ̈ܐ ܕܐܗܐ ܦܐܬܐ:',
-'protectedinterface' => 'ܐܗܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ, ܘܐܝܠܗ ܢܛܪܬܐ ܠܡܘܢܥܐ ܚܪܒܐ.',
+'viewsource-title' => 'ܚܙܝ ܡܒܘܥܐ ܕ $1',
+'actionthrottled' => 'ܠܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܗܢܐ ܥܒܕܐ',
+'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܕܢܚܙܐ ܘܢܣܚܐ ܠܡܒܘ̈ܥܐ ܕܗܕܐ ܦܐܬܐ:',
+'protectedinterface' => 'ܗܕܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ, ܘܐܝܬܝܗܝ ܢܛܪܬܐ ܠܡܘܢܥ ܚܘܒܠܐ.',
'editinginterface' => "''ܙܘܗܪܐ:''' ܐܢܬ ܥܒܕܬ ܫܚܠܦܬܐ ܒܦܐܬܐ ܡܬܦܠܚܬ ܠܡܘܬܘܪ̈ܐ ܦܐܬܘܬ̈ܐ ܟܬܝܒ̈ܐ ܠܚܘܪܙܐ.
ܟܠ ܫܘܚܠܦܐ ܒܐܗܐ ܦܐܬܐ ܒܕ ܥܒܕ ܟܪ ܥܠ ܡܚܙܝܬܐ ܦܐܬܐ ܕܡܦܠܚܢܐ ܠܡܦܠܚܢ̈ܐ ܐܚܪ̈ܝܢܐ.
ܠܬܘܪ̈ܓܡܐ، ܡܦܠܚ ܬܪܡܝܬܐ ܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
'updated' => '(ܐܬܚܕܬ)',
'note' => "'''ܡܥܝܪܢܘܬܐ:'''",
'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''.
-ܫܘܚܠܦ̈ܐ ܕܝܠܟ ܠܐ ܐܬܠܒܟܘ ܥܕܡܐ ܠܗܫܐ! [[#editform|→ ܐܫܠܡ ܠܫܚܠܦܬܟ]]",
+ܫܘܚܠܦ̈ܐ ܕܝܠܟ ܠܐ ܐܬܠܒܟܘ ܥܕܡܐ ܠܗܫܐ!",
'editing' => 'ܫܚܠܦܬܐ ܕ $1',
'editingsection' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ)',
'editingcomment' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ ܚܕܬܐ)',
ܗܫܐ ܐܝܬܝܗܝ ܨܘܝܒܐ ܠ [[$2]].',
'brokenredirects' => 'ܨܘܝܒ̈ܐ ܬܒܝܪ̈ܐ',
-'brokenredirectstext' => 'ܨܘ̈ܝܒܐ ܗܠܝܢ ܡܛܝܢ ܠܕ̈ܦܐ ܕܠܝܬ:',
+'brokenredirectstext' => 'ܨܘ̈ܝܒܐ ܗܠܝܢ ܡܛܝܢ ܠܕ̈ܦܐ ܕܠܝܬܠܗܘܢ ܐܝܬܘܬܐ:',
'brokenredirects-edit' => 'ܫܚܠܦ',
'brokenredirects-delete' => 'ܫܘܦ',
Eymi [[Special:Search/{{PAGENAME}}|pepikintuymi tüfachi üy]] kake wülngiñ mew,
kam <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} kintuymi koneltuyelelu wirintukun]</span>.',
'previewnote' => "'''Ngüneduamimi tüfachi wüne pen petu eltukawam!'''
-Eltukawlelay feychi kalekünun! [[#editform|→ Continuar editando]]",
+Eltukawlelay feychi kalekünun!",
'editing' => 'Kümeelngey $1',
'editingsection' => 'Wirin $1 (Dungu)',
'editingcomment' => 'Wirin $1 (we dungu)',
'userinvalidcssjstitle' => "'''সতৰ্কবাণী:''' \"\$1\" নামৰ কোনো আৱৰণ নাই। Custom .css আৰু .js পৃষ্ঠাই সৰুফলাৰ শিৰোনামা ব্যৱহাৰ কৰে, যেনে- {{ns:user}}:Foo/Vector.css ৰ সলনি {{ns:user}}:Foo/vector.css।",
'updated' => "(আপডেট কৰা হ'ল)",
'note' => "'''টোকা:'''",
-'previewnote' => "'''এয়া প্ৰাকদৰ্শনহে মাথোন। পৰিৱৰ্তনসমূহ এতিয়ও সংৰক্ষণ কৰা হোৱা নাই!'''",
+'previewnote' => "'''মনত ৰাখিব এয়া মাথোন প্ৰাক্দৰ্শনহে।'''
+আপোনাৰ সালসলনিসমূহ এতিয়াও সংৰক্ষণ কৰা হোৱা নাই!",
'previewconflict' => 'এই প্ৰাকদৰ্শনে ওপৰৰ সম্পাদনা ক্ষেত্ৰৰ লেখা সাঁচি ৰাখিলে যেনেকুৱা দেখা যাব তেনেকুৱা দেখাইছে ।',
'session_fail_preview' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক ।
কোনো আসোঁৱাহপূৰ্ণ ৱেব-ভিত্তিক বেনামী প্ৰক্সী সেৱা ব্যৱহাৰ কৰিলে এনে হ’ব পাৰে ।",
'edit_form_incomplete' => "'''এই সম্পাদনাৰ কিছু অংশ চাৰ্ভাৰলৈ নগ’ল; আপোনাৰ সম্পাদনা ঠিকে আছেনে পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক ।'''",
'editing' => '$1 সম্পাদনা',
-'creating' => 'সৃষ্টি কৰি থকা হৈছে $1',
+'creating' => '$1 পৃষ্ঠাখন আপুনি সৃষ্টি কৰি আছে',
'editingsection' => '$1 (বিভাগ) সম্পাদনা কৰি থকা হৈছে',
'editingcomment' => '$1 (নতুন বিভাগ) সম্পাদনা কৰি থকা হৈছে',
'editconflict' => 'সম্পাদনা দ্বন্দ: $1',
'edit-no-change' => 'আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই',
'edit-already-exists' => "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল ।
পৃষ্ঠাখন ইতিমধ্যে আছেই ।",
+'defaultmessagetext' => 'সাধাৰণ বাৰ্তা পাঠ্য',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''সতৰ্কবাণী:''' এই পৃষ্ঠাখনত অধিক এক্সপেনচিভ পাৰ্চাৰ ফাংচন কল আছে ।
'revdelete-legend' => 'দৃষ্টিপাত সীমাবদ্ধ কৰক',
'revdelete-hide-text' => 'সংশোধিত পাঠ গোপন কৰক',
'revdelete-hide-image' => 'ফাইলৰ বিষয়বস্তু গোপন কৰক',
-'revdelete-hide-name' => 'কাৰ্য্য আৰু লক্ষ্য গোপন কৰক',
+'revdelete-hide-name' => 'কাৰ্য আৰু লক্ষ্য গোপন কৰক',
'revdelete-hide-comment' => 'সম্পাদনা মন্তব্য আতৰাই থওক',
'revdelete-hide-user' => 'সম্পাদকৰ সদস্যনাম/আই-পি ঠিকনা গোপন কৰক',
'revdelete-hide-restricted' => 'প্ৰশাসকবৃন্দৰ লগতে আনৰ পৰাও তথ্য ৰোধ কৰক',
'revdel-restore-deleted' => 'বাতিল কৰা সংশোধনসমূহ',
'revdel-restore-visible' => 'দৃশ্যমান সংশোধনসমূহ',
'pagehist' => 'পৃষ্ঠা ইতিহাস',
-'deletedhist' => 'মà¦\9aি পà§\87লà§\8bৱা ইতিহাস',
+'deletedhist' => 'বিলà§\8bপ à¦\95ৰাৰ ইতিহাস',
'revdelete-hide-current' => ' $2, $1 তাৰিখৰ এই আইটেমটো গোপন কৰাত সমস্যা হৈছে: এইটো বৰ্তমানৰ সংশোধনী ।
এইটোক গোপন কৰিব পৰা নাযাব ।',
'revdelete-show-no-access' => '$2, $1 তাৰিখৰ এই আইটেমটো দেখুওৱাত সমস্যা হৈছে: এই আইটেমটো "সীমাবদ্ধ" হিছাপে চিহ্নিত ।
# Suppression log
'suppressionlog' => 'নিবাৰণ ল’গ',
-'suppressionlogtext' => 'প্ৰশাসকৰ পৰা গোপনে ৰখা অৱলুপ্তি আৰু প্ৰতিবন্ধকৰ তালিকা তলত দিয়া হৈছে ।
-বৰ্তমান কাৰ্য্যৰত নিষেধ আৰু প্ৰতিবন্ধকসমূহৰ বাবে [[Special:BlockList|IP প্ৰতিবন্ধক তালিকা]] ।',
+'suppressionlogtext' => 'পà§\8dৰশাসà¦\95ৰ পৰা à¦\97à§\8bপনà§\87 ৰà¦\96া সমল সমà§\8dপৰà§\8dà¦\95à§\80য় à¦\85ৱলà§\81পà§\8dতি à¦\86ৰà§\81 পà§\8dৰতিবনà§\8dধà¦\95ৰ তালিà¦\95া তলত দিয়া হà§\88à¦\9bà§\87 ।
+বৰà§\8dতমান à¦\95াৰà§\8dযà§\8dযৰত নিষà§\87ধ à¦\86ৰà§\81 পà§\8dৰতিবনà§\8dধà¦\95সমà§\82হৰ বাবà§\87 [[Special:BlockList|IP পà§\8dৰতিবনà§\8dধà¦\95 তালিà¦\95া]] à¦\9aাà¦\93à¦\95।',
# History merging
'mergehistory' => 'পৃষ্ঠাৰ ইতিহাসবোৰ মিলাই দিয়ক',
'showhideselectedversions' => 'নিৰ্বাচিত সংশোধনসমূহ দেখুৱাওক/আঁৰ কৰক',
'editundo' => 'পূৰ্ববত কৰক',
'diff-multi' => '({{PLURAL:$2|এজন সদস্যৰ|$2জন সদস্যৰ}} দ্বাৰা {{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1-টা মধ্যৱৰ্তী সংশোধন}} দেখোৱা হোৱা নাই)',
-'diff-multi-manyusers' => '({{PLURAL:$2|à¦\8fà¦\9cনতà¦\95à§\88|$2-à¦\9cনতà¦\95à§\88}} à¦\85ধিà¦\95 সদসà§\8dযৰ দà§\8dবাৰা {{PLURAL:$1|à¦\8fà¦\9fা মধà§\8dযৱৰà§\8dতà§\80 সà¦\82শà§\8bধন|$1-à¦\9fা মধà§\8dযৱৰà§\8dতà§\80 সà¦\82শà§\8bধন}} দà§\87à¦\96à§\8bৱা হোৱা নাই)',
+'diff-multi-manyusers' => '({{PLURAL:$2|à¦\8fà¦\9cনতà¦\95à§\88|$2-à¦\9cনতà¦\95à§\88}} à¦\85ধিà¦\95 সদসà§\8dযৰ দà§\8dবাৰা {{PLURAL:$1|à¦\8fà¦\9fা মধà§\8dযৱৰà§\8dতà§\80 সà¦\82শà§\8bধন|$1-à¦\9fা মধà§\8dযৱৰà§\8dতà§\80 সà¦\82শà§\8bধন}} দà§\87à¦\96à§\81à¦\93ৱা হোৱা নাই)',
# Search results
'searchresults' => 'অনুসন্ধানৰ ফলাফল',
'filename-bad-prefix' => "আপুনি আপলোড কৰা ফাইলৰ নামটো '''\"\$1\"''' দি আৰম্ভ হৈছে, যিটো ডিজিটেল কেমেৰাই স্বয়ংক্ৰিয়ভাৱে দিয়ে আৰু সি ব্যাখ্যামূলক নহয় ।
অনুগ্ৰহ কৰি আপোনাৰ ফাইলটোৰ বাবে এটা ব্যাখ্যামূলক নাম বাছি লওক ।",
'upload-success-subj' => "আপলোড সফল হ'ল",
-'upload-success-msg' => '[$2] ৰ পৰা à¦\86পà§\8bনাৰ à¦\86পলà§\8bড সফল হà§\88à¦\9bà§\87 । à¦\8fà¦\87à¦\9fà§\8b à¦\87য়াত à¦\89পলবà§\8dদà§\8dধ: [[:{{ns:file}}:$1]]',
+'upload-success-msg' => '[$2] ৰ পৰা আপোনাৰ আপলোড সফল হৈছে । এইটো ইয়াত উপলদ্ধ: [[:{{ns:file}}:$1]]',
'upload-failure-subj' => 'আপল’ডত সমস্যা হৈছে',
'upload-failure-msg' => '[$2] ৰ পৰা আপুনি কৰা আপল’ডত এটা সমস্যাই দেখা দিছে:
'allpages-bad-ns' => '{{SITENAME}} ত কোনো "$1" নামস্থান নাই ।',
'allpages-hide-redirects' => 'পুনঃনিৰ্দেশ লুকুৱাওক',
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'শেহতীয়া পাঠ্য',
+
# Special:Categories
'categories' => 'শ্ৰেণী',
'categoriespagetext' => 'এই {{PLURAL:$1|বিষয়শ্ৰেণীত|বিষয়শ্ৰেণীসমূহত}} পৃষ্ঠা বা মিডিয়া ফাইল আছে ।
'ipb-confirm' => 'প্ৰতিবন্ধক নিশ্চিত কৰক',
'badipaddress' => 'অগ্ৰহণযোগ্য আই-পি ঠিকনা',
'blockipsuccesssub' => "বাৰণ কৰা সফল হ'ল",
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ক বাধা দিয়া হৈছে ।<br />
-প্ৰতিবন্ধকৰ পুনৰ্বিবেচনাৰ বাবে [[Special:BlockList|IP প্ৰতিবন্ধক তালিকা]]',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ক বাধা দিয়া হৈছে।<br />
+প্ৰতিবন্ধকৰ পুনৰ্বিবেচনাৰ বাবে [[Special:BlockList|প্ৰতিবন্ধক তালিকা]] চাওক।',
'ipb-blockingself' => 'আপুনি নিজকে বাধাপ্ৰদান কৰিব বিচাৰিছে ! আপুনি নিশ্চিতনে আপুনি এনে কৰিব ?',
'ipb-confirmhideuser' => 'আপুনি "সদস্য গোপন কৰক" বৈশিষ্ট সক্ৰিয় থকা এজন সদস্যক বাৰণ কৰিবলৈ ওলাইছে । এই কাৰ্যই সকলো তালিকা আৰু ল\'গ ভৰ্তিৰ পৰা তেওঁৰ নাম আঁতৰাই পেলাব । এই কাম কৰিব বুলি আপুনি নিশ্চিতনে ?',
'ipb-edit-dropdown' => 'প্ৰতিবন্ধকৰ কাৰণসমূহ সম্পাদনা কৰক',
তথ্যসূত্ৰ হিছাপে নিবাৰণ ল’গ তলত দিয়া হ’ল ।',
'blocklogentry' => '"[[$1]]" ক $2 $3 লৈ সাল-সলনি কৰাৰ পৰা বাৰণ কৰা হৈছে।',
'reblock-logentry' => '[[$1]]ৰ প্ৰতিবন্ধক ছেটিং ম্যাদ উকলা সময় $2 $3ৰ সৈতে সলনি কৰা হ’ল ।',
-'blocklogtext' => 'এই ল’গখন অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয় ।
-স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই ।
-সামà§\8dপà§\8dৰতিà¦\95 à¦\95াৰà§\8dযৰত নিষà§\87ধ à¦\86ৰà§\81 পà§\8dৰতিবনà§\8dধà¦\95ৰ বাবà§\87 [[Special:BlockList|à¦\86à¦\87.পি. পà§\8dৰতিবনà§\8dধà¦\95 তালিà¦\95া]] à¦\9aাà¦\93à¦\95 ।',
+'blocklogtext' => 'এই ল’গখন অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।
+স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।
+সামà§\8dপà§\8dৰতিà¦\95 à¦\95াৰà§\8dযৰত নিষà§\87ধ à¦\86ৰà§\81 পà§\8dৰতিবনà§\8dধà¦\95ৰ বাবà§\87 [[Special:BlockList|পà§\8dৰতিবনà§\8dধà¦\95 তালিà¦\95া]] à¦\9aাà¦\93à¦\95।',
'unblocklogentry' => '$1 বাৰণ উঠাই লোৱা হ’ল',
'block-log-flags-anononly' => 'কেৱল বেনামী সদস্য',
'block-log-flags-nocreate' => 'একাউন্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে',
'api-error-uploaddisabled' => "এই ৱিকিত আপল'ড নিষ্ক্ৰিয় কৰা হৈছে।",
'api-error-verification-error' => 'সম্ভৱতঃ এই ফাইলটো ত্ৰুটিপূৰ্ণ বা তাৰ এক্সটেন্ছনটো ভুল।',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}}',
+'duration-minutes' => '$1 {{PLURAL:$1|মিনিট|মিনিট}}',
+'duration-hours' => '$1 {{PLURAL:$1|ঘন্টা|ঘন্টা}}',
+'duration-days' => '$1 {{PLURAL:$1|দিন|দিন}}',
+'duration-weeks' => '{{PLURAL: $1|সপ্তাহ|সপ্তাহ}}',
+'duration-years' => '$1 {{PLURAL:$1|বছৰ|বছৰ}}',
+'duration-decades' => '$1 {{PLURAL:$1|দশক|দশক}}',
+'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
+'duration-millennia' => '$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}',
+
);
* '''Konqueror:''' Calca en ''Recargar'', o calca ''F5''
* '''Opera:''' llimpia la caché en ''Ferramientes → Preferencies''",
'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to CSS nuevu enantes de guardalu.",
-'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to nuevu JavaScript enantes de guardalu.",
+'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to JavaScript nuevu enantes de guardalu.",
'usercsspreview' => "'''Recuerda que namái tas previsualizando'l to CSS d'usuariu.'''
'''¡Tovía nun ta guardáu!'''",
-'userjspreview' => "'''¡Recuerda que namái tas probando/previsualizando'l to JavaScript d'usuariu, entá nun se grabó!'''",
+'userjspreview' => "'''¡Recuerda que namái tas probando/previsualizando'l to JavaScript d'usuariu.'''
+'''¡Tovía nun ta guardáu!'''",
'sitecsspreview' => "'''Recuerda que namái tas previsualizando esti CSS.'''
'''¡Tovía nun ta guardáu!'''",
-'sitejspreview' => "'''¡Recuerda que namái tas probando esti códigu JavaScript'''
+'sitejspreview' => "'''¡Recuerda que namái tas probando esti códigu JavaScript.'''
'''¡Tovía nun tá guardáu!'''",
-'userinvalidcssjstitle' => "'''Avisu:''' Nun hai piel \"\$1\". Recuerda que les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
+'userinvalidcssjstitle' => "'''Avisu:''' Nun hai apariencia «$1».
+Les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
'updated' => '(Actualizao)',
'note' => "'''Nota:'''",
'previewnote' => "'''Alcuerdate de qu'esto ye sólo una vista previa.'''
-¡Los cambios entá nun se guardaron! [[#editform|→ Siguir editando]]",
+¡Los cambios entá nun se guardaron!",
+'continue-editing' => 'Siguir editando',
'previewconflict' => "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.",
'session_fail_preview' => "'''¡Sentímoslo muncho! Nun se pudo procesar la to edición porque hebo una perda de datos de la sesión.
Inténtalo otra vuelta. Si nun se t'arregla, intenta salir y volver a rexistrate.'''",
'parser-template-loop-warning' => 'Hai una rueda de plantíes: [[$1]]',
'parser-template-recursion-depth-warning' => 'Se pasó la llende de fondura recursiva de les plantíes ($1)',
'language-converter-depth-warning' => 'Se pasó la llende de fondura del convertidor de llingües ($1)',
+'node-count-exceeded-category' => 'Páxines onde se pasó la cuenta de nodios',
+'node-count-exceeded-warning' => 'La páxina pasó la cuenta de nodios',
+'expansion-depth-exceeded-category' => "Páxines onde se pasó la fondura d'espansión",
+'expansion-depth-exceeded-warning' => "La páxina pasó la fondura d'espansión",
# "Undo" feature
'undo-success' => "La edición se pue esfacer.
'updated' => '(Nuskeyen)',
'note' => "'''Straga :'''",
'previewnote' => "'''Obral, bat krent anton tir abdinedik.'''
-Rinafa betara men tid giwayan ! [[#editform|→ Continue editing]]",
+Rinafa betara men tid giwayan !",
'previewconflict' => 'Abdinedira nedir va krent ke batu bu inde in giwayanon titir.',
'editing' => 'betara va $1',
'editingsection' => 'betara va $1 (gabot)',
'previewconflict' => 'Bu sınaq göstərişidir və yaddaşda saxlayacağınız təqdirdə mətnin redaktə səhifəsinin yuxarı hissəsində nəticənin necə olacağını göstərir.',
'session_fail_preview' => "'''Üzr istəyirik! Sizin redaktəniz saxlanılmadı. Serverdə identifikasiyanızla bağlı problemlər yaranmışdır. Lütfən bir daha təkrar edin. Problem həll olunmazsa hesabınızdan çıxın və yenidən daxil olun.'''",
'editing' => 'Redaktə $1',
+'creating' => 'Qurulur $1',
'editingsection' => 'Redaktə $1 (bölmə)',
'editingcomment' => 'Redaktə et $1 (yeni bölmə)',
'editconflict' => 'Eyni vaxtda redaktə: $1',
'allpagesnext' => 'Sonrakı',
'allpagessubmit' => 'Seç',
'allpagesprefix' => 'Bu prefiksli səhifələri göstər:',
+'allpages-hide-redirects' => 'Yönləndirmələri gizlət',
# Special:Categories
'categories' => 'Kateqoriyalar',
'version-poweredby-others' => 'digərləri',
'version-software-product' => 'Məhsul',
'version-software-version' => 'Versiya',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Fayl yolu',
'api-error-unknownerror' => 'Naməlum xəta: "$1".',
'api-error-uploaddisabled' => 'Bu vikidə fayl yükləmə mümkün deyil.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniyə|saniyə}}',
+'duration-minutes' => '$1 {{PLURAL:$1|dəqiqə|dəqiqə}}',
+'duration-hours' => '$1 {{PLURAL:$1|saat|saat}}',
+'duration-days' => '$1 {{PLURAL:$1|gün|gün}}',
+'duration-weeks' => '$1 {{PLURAL:$1|həftə|həftə}}',
+'duration-years' => '$1 {{PLURAL:$1|il|il}}',
+'duration-decades' => '$1 {{PLURAL:$1|onillik|onillik}}',
+'duration-centuries' => '$1 {{PLURAL:$1|əsr|əsr}}',
+'duration-millennia' => '$1 {{PLURAL:$1|minillik|minillik}}',
+
);
* @author Kaganer
* @author Reedy
* @author Roustammr
+ * @author Sagan
* @author Timming
* @author Рустам Нурыев
* @author ҒатаУлла
'versionrequiredtext' => 'Был бит менән эшләү өсөн MediaWiki-ның $1 версияһы кәрәк. [[Special:Version|Ҡулланылған версия тураһында мәғлүмәт битен]] ҡара.',
'ok' => 'Тамам',
+'pagetitle' => '{{SITENAME}} проектынан',
'retrievedfrom' => 'Сығанағы — «$1»',
'youhavenewmessages' => 'Яңы $1 бар ($2).',
'newmessageslink' => 'яңы хәбәр',
'updated' => '(Яңыртылды)',
'note' => "'''Иҫкәрмә:'''",
'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''
-Һеҙҙең үҙгәртеүҙәр әле яҙылмаған! [[#editform|→ мөхәрирләүҙә дауам итеү]]",
+Һеҙҙең үҙгәртеүҙәр әле яҙылмаған!",
'previewconflict' => 'Әлеге алдан ҡарау, мөхәррирләү тәҙрәһенең өҫтөндә, һаҡланғандан һуң текстың нисек күренәсәген күрһәтә.',
'session_fail_preview' => "'''Ҡыҙғанысҡа ҡаршы, һеҙҙең ултырыш идентификаторығыҙ юғалды. Һөҙөмтәлә үҙгәртеүҙәрегеҙ ҡабул ителмәйәсәк.
Зинһар, тағы бер тапҡыр ҡабатлағыҙ.
'badipaddress' => 'IP адрес дөрөҫ түгел',
'blockipsuccesssub' => 'Бикләү уңышлы башҡарылды',
'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] бикләнде.<br />
-[[Special:BlockList|Бикләнгән IP адрестарҙы]] ҡарарға.',
+Биктәрҙе күреү өсөн [[Special:BlockList|бикләнгән IP адрестарҙы]] ҡарағыҙ.',
'ipb-blockingself' => 'Һеҙ үҙегеҙҙе бикләргә теләйһегеҙ! Быны эшләүҙе раҫлайһығыҙмы?',
'ipb-confirmhideuser' => '"Ҡулланыусыны йәшер" ғәмәлдә саҡта ҡулланыусыны блокларға теләйһегеҙ. Уның исеме исемлектәрҙә һәм журналдарҙа күренмәйәсәк. Быны эшләргә теләүегеҙҙе раҫлайһығыҙмы?',
'ipb-edit-dropdown' => 'Бикләү сәбәптәрен мөхәррирләргә',
Түбәндә белешмә өсөн йәшереү яҙмалары журналы килтерелгән:',
'blocklogentry' => '[[$1]] бикләгән, тамамланыу ваҡыты: $2 $3',
'reblock-logentry' => '[[$1]] ҡатнашыусыһының бикләү көйләүҙәрен үҙгәрткән, тамамланыу ваҡыты — $2 $3',
-'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу яҙмалары журналы.
-Авто бикләнеүсе IP адрестар бында күрһәтелмәй.
+'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу журналы.
+Автоматик бикләнгән IP адрестар бында күрһәтелмәй.
[[Special:BlockList|Ғәмәлдәге тыйыуҙырҙы һәм бикләүҙәрҙе]] ҡарай алаһығыҙ.',
'unblocklogentry' => '$1 ҡулланыусыһының блокланыу ваҡыты тамамланды',
'block-log-flags-anononly' => 'танылмаған ҡатнашыусылар ғына',
'updated' => '(Абноўлена)',
'note' => "'''Заўвага: '''",
'previewnote' => "'''Гэта толькі папярэдні прагляд.'''
-Вашыя зьмены яшчэ не былі захаваныя! [[#editform|→ Працягнуць рэдагаваньне]]",
+Вашыя зьмены яшчэ не былі захаваныя!",
+'continue-editing' => 'Працягнуць рэдагаваньне',
'previewconflict' => 'Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.',
'session_fail_preview' => "'''Не атрымалася захаваць Вашую праўку праз тое, што былі страчаныя зьвесткі пра сэсію.
Калі ласка, паспрабуйце яшчэ раз. Калі памылка ня зьнікне, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў.'''",
'parser-template-loop-warning' => 'Выяўлены цыкль у шаблёнах: [[$1]]',
'parser-template-recursion-depth-warning' => 'Перавышана мяжа глыбіні рэкурсіі шаблёнаў ($1)',
'language-converter-depth-warning' => 'Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)',
+'node-count-exceeded-category' => 'Старонкі зь перавышанай колькасьцю вузлоў',
+'node-count-exceeded-warning' => 'Старонка перавысіла дазволеную колькасьць вузлоў',
+'expansion-depth-exceeded-category' => 'Старонкі зь перавышанай глыбінёй уключэньня',
+'expansion-depth-exceeded-warning' => 'Старонка перавысіла дазволеную глыбіню ўключэньняў',
# "Undo" feature
'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
'ipb-confirm' => 'Пацьвердзіць блякаваньне',
'badipaddress' => 'Некарэктны IP-адрас',
'blockipsuccesssub' => 'Блякаваньне пасьпяховае',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|быў заблякаваны|была заблякаваная}}.
-<br />Глядзіце [[Special:BlockList|сьпіс заблякаваных IP-адрасоў]] дзеля перагляду блякаваньняў.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|быў заблякаваны|была заблякаваная}}.<br />
+Глядзіце [[Special:BlockList|сьпіс блякаваньняў]] дзеля іх перагляду.',
'ipb-blockingself' => 'Вы зьбіраецеся заблякаваць самога сябе! Вы ўпэўнены, што жадаеце гэта зрабіць?',
'ipb-confirmhideuser' => 'Вы зьбіраецеся заблякаваць удзельніка са статусам «схаваны». Гэтае дзеяньне прывядзе да таго, што яго імя зьявіцца ва ўсіх сьпісах і журналах уваходу. Вы ўпэўнены, што жадаеце гэта зрабіць?',
'ipb-edit-dropdown' => 'Рэдагаваць прычыны блякіровак',
'blocklog-showsuppresslog' => 'Гэты ўдзельнік ужо заблякаваны і схаваны. Журнал хаваньняў пададзены ніжэй:',
'blocklogentry' => 'заблякаваны [[$1]] на тэрмін: $2 $3',
'reblock-logentry' => 'зьмененыя парамэтры блякаваньня для [[$1]] на тэрмін: з $2 да $3',
-'blocklogtext' => 'Гэта журнал уліку блякаваньняў і разблякаваньняў удзельнікаў. Аўтаматычна заблякаваныя IP-адрасы не пазначаныя. Глядзіце [[Special:BlockList|сьпіс заблякаваных IP-адрасоў]], каб пабачыць дзейныя ў гэты момант блякаваньні.',
+'blocklogtext' => 'Гэта журнал уліку блякаваньняў і разблякаваньняў удзельнікаў.
+Аўтаматычна заблякаваныя IP-адрасы не пазначаныя.
+Глядзіце [[Special:BlockList|сьпіс блякаваньняў]], каб пабачыць дзейныя ў гэты момант блякаваньні.',
'unblocklogentry' => 'разблякаваны $1',
'block-log-flags-anononly' => 'толькі ананімныя ўдзельнікі',
'block-log-flags-nocreate' => 'стварэньне рахункаў забароненае',
'version-software' => 'Усталяванае праграмнае забесьпячэньне',
'version-software-product' => 'Прадукт',
'version-software-version' => 'Вэрсія',
+'version-entrypoints' => 'Уваходныя адрасы',
+'version-entrypoints-header-entrypoint' => 'Пункт уваходу',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Шлях да файла',
'updated' => '(обновена)',
'note' => "'''Забележка:'''",
'previewnote' => "'''Това е само предварителен преглед. Промените все още не са съхранени!'''",
+'continue-editing' => 'Продължаване на редактирането',
'previewconflict' => 'Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.',
'session_fail_preview' => "'''За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия. Опитайте отново. Ако все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново.'''",
'session_fail_preview_html' => "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''
'token_suffix_mismatch' => "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
'edit_form_incomplete' => "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
'editing' => 'Редактиране на „$1“',
+'creating' => 'Създаване на $1',
'editingsection' => 'Редактиране на „$1“ (раздел)',
'editingcomment' => 'Редактиране на „$1“ (нов раздел)',
'editconflict' => 'Различна редакция: $1',
'allpagesprefix' => 'Показване на страници, започващи със:',
'allpagesbadtitle' => 'Зададеното име е невалидно. Възможно е да съдържа междуезикова или междупроектна представка или пък знаци, които не могат да се използват в заглавия.',
'allpages-bad-ns' => 'В {{SITENAME}} не съществува именно пространство „$1“.',
+'allpages-hide-redirects' => 'Скриване на пренасочванията',
# Special:Categories
'categories' => 'Категории',
'undelete-bad-store-key' => 'Не е възможно възстановяването на файловата версия с времеви отпечатък $1: файлът е липсвал преди изтриването.',
'undelete-cleanup-error' => 'Грешка при изтриване на неизползвания архивен файл „$1“.',
'undelete-missing-filearchive' => 'Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.',
+'undelete-error' => 'Грешка при възстановяване на страницата',
'undelete-error-short' => 'Грешка при възстановяването на изтрития файл: $1',
'undelete-error-long' => 'Възникнаха грешки при възстановяването на изтрития файл:
'exif-serialnumber' => 'Сериен номер на фотоапарата',
'exif-cameraownername' => 'Собственик на фотоапарата',
'exif-label' => 'Етикет',
+'exif-datetimemetadata' => 'Дата на последна модификация на метаданните',
'exif-nickname' => 'Неформално име на изображението',
'exif-rating' => 'Рейтинг (от 5)',
'exif-rightscertificate' => 'Сертификат за управление на правата',
+'exif-copyrighted' => 'Авторскоправен статут',
'exif-copyrightowner' => 'Носител на авторското право',
'exif-usageterms' => 'Условия за използване',
'exif-originaldocumentid' => 'Уникален номер на оригиналния документ',
'logentry-delete-restore' => '$1 възстанови страницата $3',
'logentry-suppress-revision' => '$1 тайно промени видимостта на {{PLURAL:$5|една версия|$5 версии}} на страницата $3: $4',
'logentry-suppress-revision-legacy' => '$1 тайно промени видимостта на версиите на страница $3',
+'revdelete-content-hid' => 'скрито съдържание',
+'revdelete-summary-hid' => 'скрито резюме на редакцията',
+'revdelete-uname-hid' => 'скрито потребителско име',
'revdelete-restricted' => 'добавени ограничения за администраторите',
'revdelete-unrestricted' => 'премахнати ограничения за администраторите',
+'logentry-move-move' => '$1 премести страницата $3 към заглавие $4',
+'logentry-move-move-noredirect' => '$1 премести страницата $3 към заглавие $4 без да оставя пренасочване',
'logentry-move-move_redir' => '$1 премести страницата $3 като $4 (върху пренасочване)',
+'logentry-move-move_redir-noredirect' => '$1 премести върху пренасочване страницата $3 към заглавие $4 (без пренасочване)',
'logentry-patrol-patrol' => '$1 отбеляза като патрулирана версия $4 на страницата „$3“',
'logentry-patrol-patrol-auto' => '$1 автоматично отбеляза като патрулирана версия $4 на страницата $3',
'logentry-newusers-newusers' => '$1 създаде потребителска сметка',
'api-error-uploaddisabled' => 'Достъпът за качване на файлове в това уики е прекратен.',
'api-error-verification-error' => 'Файлът може би е повреден или има грешно разширение.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минута|минути}}',
+'duration-hours' => '$1 {{PLURAL:$1|час|часа}}',
+'duration-days' => '$1 {{PLURAL:$1|ден|дни}}',
+'duration-weeks' => '$1 {{PLURAL:$1|седмица|седмици}}',
+'duration-years' => '$1 {{PLURAL:$1|година|години}}',
+'duration-decades' => '$1 {{PLURAL:$1|десетилетие|десетилетия}}',
+'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
+'duration-millennia' => '$1 {{PLURAL:$1|хилядолетие|хилядолетия}}',
+
);
Katasunduk gasan pamakai hanyar nangini kawa diubah pintang tungkaran ''[[Special:ChangePassword|ubah katasunduk]]'' wayah babuat log.",
'newarticle' => '(Hanyar)',
'newarticletext' => "Pian maumpati sabuah tautan ka tungkaran nang baluman ada lagi. Gasan maulah tungkaran, mulai ja mangatik pada kutak di bawah (lihati [[{{MediaWiki:Helppage}}|tungkaran patulung]] gasan panjalasan labih). Amun Pian ka sia cagaran tasalah, klik picikan '''back''' di panjalajah web Pian.",
-'anontalkpagetext' => "----''Ini adalah tungkaran pamandiran gasan pamuruk kada bangaran nang baluman maulah akun pulang, atawa kada mamuruknya. Kami tapaksa mamuruk numurik alamat IP hagan maminanduinya.
-Alamat IP nangkaini kawaai dipuruk ulih babarapa pamuruk.
+'anontalkpagetext' => "----''Ngini adalah tungkaran pamandiran gasan pamakai kada bangaran nang baluman ma-ulah akun pulang, atawa kada mamakainya. Kami tapaksa mamakai numurik alamat IP hagan maminanduinya.
+Alamat IP nangkaini kawaai dipuruk ulih babarapa pamakai.
Amun Pian adalah pamuruk kada bangaran wan marasa kumin nang kada pas ta ka Pian, muhun [[Special:UserLogin/signup|ulah sabuah akun]] or [[Special:UserLogin|babuat log]] hagan mahindari kabingungan awan pamuruk kada bangaran lain kaina.",
'noarticletext' => 'Parhatan ini kadada naskah di tungkaran ini.
Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ini]] pintang tungkaran lain,
Inatakan bahwasa saragam tungkaran-tungkaran .css wan .js mamuruk aksara halus, cuntuh {{ns:user}}:Foo/vector.css sawagai tandingan {{ns:user}}:Foo/Vector.css.",
'updated' => '(Dihanyarakan)',
'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingatakanlah bahwasa ini titilikan haja nang balum disimpan!'''",
+'previewnote' => "'''Ingatakanlah bahwasa ngini titilikan haja''' Parubahan Pian nang baluman disimpan!",
'previewconflict' => 'Titilikan ini mancarminakan naskah dalam naskah wilayah atas babakan sawagai mana ini akan mancungul amun disimpan.',
'session_fail_preview' => "'''Ampun! Kami kada kawa manarusakan babakan Pian karana kahilangan sési data.'''
Cubai pang sa'asa pulang.
Nangini ambahanu tajadi amun Pian mamuruk sabuah layanan proxy buggy bapandal web kada bangaran.",
'edit_form_incomplete' => "'''Babarapa hagian matan purmulir babakan kada sampai server; pariksa pulang apakah babakan Pian tatap utuh wan cubai lagi.'''",
'editing' => 'Mambabak $1',
+'creating' => 'Ma-ulah $1',
'editingsection' => 'Mambabak $1 (hagian)',
'editingcomment' => 'Mambabak $1 (hagian hanyar)',
'editconflict' => 'Babakan bacakut: $1',
Amun Pian kada hakun tulisan Pian dibabak kada baumpat lalu, lalu ai kada usah manyumbang di sia.<br />
Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini matan sabuah asal mula ampun umum atawa nang samacam asal mula bibas (lihati $1 gasan rarincian).
'''Jangan kirimkan gawian bahak cipta kada baijin!'''",
-'longpageerror' => "'''Kasalahan: Naskah nang Pian kirim panjangnya $1 kilubita, nangapa tapanjang pada pamanjangnya nang kawa $2 kilubita.'''
+'longpageerror' => "'''Kasalahan: Naskah nang Pian kirim panjangnya {{PLURAL:$1|asa kilubita|$1 kilubita}}, nangapa tapanjang pada pamanjangnya nang kawa {{PLURAL:$2|asa kilubita|$2 kilubita}}.'''
Nangini kada kawa disimpan.",
'readonlywarning' => "'''Paringatan: Basis data sudah tasunduk gasan diharagu, jadinya Pian kada kawa manyimpan babakab Pian parhatan ini.'''
Pian kawa amun handak cut-n-paste naskah ka sabuah barakas naskah wan simpan ini gasan kaina.
'edit-no-change' => 'Babakan Pian diabaiakan, karana kadada parubahan diulah ka naskah ini.',
'edit-already-exists' => 'Kada kawa maulah sabuah tungkaran hanyar.
Nangini sudah ada.',
+'defaultmessagetext' => 'Naskah baku pasan',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Paringatan:''' Tungkaran ini mangandung kabanyakan pungsi parser kiauan.
# Suppression log
'suppressionlog' => 'Log panikinan',
-'suppressionlogtext' => 'Nang di bawah adalah sabuah daptar matan pahahapusan wan Pamblublukiran tamasuk isi tasungkup matan papambakal. Lihati [[Special:IPBlockList|Daptar IP diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blublukir.',
+'suppressionlogtext' => 'Nang di bawah adalah sabuting daptar matan pahapusan wan pamblukiran tamasuk isi tasungkup matan pambakal. Lihati [[Special:BlockList|Daptar diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blukir.',
# History merging
'mergehistory' => 'Gabungakan hahalam tungkaran',
'historywarning' => "'''Paringatan:''' Tungkaran nang Pian pasal hagan hapus baisi sabuah halam sakitar $1 {{PLURAL:$1|ralatan|raralatan}}:",
'confirmdeletetext' => 'Pian handak mahapus sabuah tungkaran awan samunyaan halamnya.
Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, wan apa nang Pian gawi ini sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan {{SITENAME}}]].',
-'actioncomplete' => 'Pangulahan tuntung',
+'actioncomplete' => 'Pa-ulahan tuntung',
'actionfailed' => 'Palakuan luput',
'deletedtext' => '"$1" sudah tahapus. Lihati $2 sabuah rakaman gasan nang hanyar ni tahapus.',
'dellogpage' => 'Log pahapusan',
'ipb-confirm' => 'Yakinakan blukir',
'badipaddress' => 'Alamat IP kada sah',
'blockipsuccesssub' => 'Pamblukiran ruhui',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] sudah diblukir.<br />
-Janaki [[Special:BlockList|daptar IP dibluk]] hagan maniring-pulang blukir.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] hudah diblukir.<br />
+Janaki [[Special:BlockList|daptar dibluk]] hagan maniring-pulang blukir.',
'ipb-blockingself' => 'Pian pasal mamblukir Pian surang! Bujurkah Pian mahandaki ngitu?',
'ipb-confirmhideuser' => 'Pian pasal mamblukir saurang pamuruk awan "sungkupakan pamuruk" di-kawa-akan. Ngini akan manikin/kadada ngaran pamuruk dalam samunyaan daptar wan log masukan. Pian yakin kah handak manggawi ngitu?',
'ipb-edit-dropdown' => 'Aalasan pamblukiran babakan',
'blocklogentry' => 'mamblukir [[$1]] sampai wayah $2 $3',
'reblock-logentry' => 'setelan blukir diubah gasan [[$1]] awan sabuah wayah kadaluarsa $2 $3',
'blocklogtext' => 'Ngini adalah log matan blukir wan lapas-blukir pamuruk.
-Blukir alamat IP utumatis kada didaptar.
-Janaki [[Special:BlockList|daptar IP diblukir]] gasan daptar oparasi diikat wan diblukir tadamini.',
+Blukir alamat IP utumatis kada tadaptar.
+Janaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pamblukiran pahanyarnya.',
'unblocklogentry' => 'Mahilangakan blukir "$1"',
'block-log-flags-anononly' => 'papamuruk kada bangaran haja',
'block-log-flags-nocreate' => 'Paulahan akun dipajahakan',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ralatan|raralatan}} matan $2',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tungkaran pamuruk Pian',
+'tooltip-pt-userpage' => 'Tungkaran pamakai Pian',
'tooltip-pt-anonuserpage' => 'Tungkaran pamuruk matan alamat IP Pian mambabak sawagai',
'tooltip-pt-mytalk' => 'Tungkaran pamandiran Pian',
'tooltip-pt-anontalk' => 'Pamandiran pasal bababakan matan alamat IP ngini',
'svg-long-desc' => 'Barakas SVG, nominal $1 × $2 piksel, basar barakas: $3',
'show-big-image' => 'Ukuran hibak',
'show-big-image-preview' => 'Takaran tilikan ngini: $1.',
-'show-big-image-other' => 'Resolusi lain: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Risulusi|Risulusi}} lain: $1.',
'show-big-image-size' => '$1 × $2 piksal',
'file-info-gif-looped' => 'mambulat',
'file-info-gif-frames' => '$1 {{PLURAL:$1|pigura|pipigura}}',
'logentry-move-move_redir-noredirect' => '$1 diugah tungkaran $3 ka $4 lung sabuah paugahan awan-kada maninggalakan sabuah paugahan',
'logentry-patrol-patrol' => "$1 diciri'i ralatan $4 matan tungkaran $3 taawasi",
'logentry-patrol-patrol-auto' => "$1 utumatis diciri'i ralatan $4 matan tungkaran $3 taawasi",
-'logentry-newusers-newusers' => '$1 diulah sabuah akun pamuruk',
-'logentry-newusers-create' => '$1 diulah sabuah akun pamuruk',
-'logentry-newusers-create2' => '$1 diulah sabuah akun pamuruk $3',
+'logentry-newusers-newusers' => '$1 ma-ulah sabuting akun pamakai',
+'logentry-newusers-create' => '$1 ma-ulah sabuting akun pamakai',
+'logentry-newusers-create2' => '$1 ma-ulah sabuting akun pamakai $3',
'logentry-newusers-autocreate' => 'Akun $1 utumatis diulah',
'newuserlog-byemail' => 'Katasunduk dikirimakan lung suril.',
'customjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
'ns-specialprotected' => '{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।',
'titleprotected' => "[[User:$1|$1]]-কে এই শিরোনামের পাতা সৃষ্টি করতে বাধা দেয়া হচ্ছে। কারণ: ''$2''।",
+'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
+
+একজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: "$3"',
# Virus scanner
'virus-badscanner' => "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
'emailconfirmlink' => 'আপনার ই-মেইলের ঠিকানা নিশ্চিত করুন',
'invalidemailaddress' => 'এই ই-মেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক ফরম্যাটে লেখা হয়নি। অনুগ্রহ করে সঠিক ফরম্যাটে লেখা ই-মেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।',
'cannotchangeemail' => 'একাউন্ট ইমেইল ঠিকানা এই উইকিতে পরিবর্তন করা যাবে না।',
+'emaildisabled' => 'এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।',
'accountcreated' => 'অ্যাকাউন্ট তৈরি করা হয়েছে',
'accountcreatedtext' => '$1 এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।',
'createaccount-title' => '{{SITENAME}}-এর জন্য অ্যাকাউন্ট সৃষ্টি',
'passwordreset-username' => 'ব্যবহারকারী নাম:',
'passwordreset-domain' => 'ডোমেইন:',
'passwordreset-capture' => 'অনুসন্ধানের ফলাফলের ইমেইল দেখুন?',
+'passwordreset-capture-help' => 'আপনি যদি এই চেক বক্সে ক্লিক করেন, তবে অস্থায়ী শব্দচাবিসহ একটি ই-মেইল আপনাকে দেখানো হবে ও সেইসাথে ব্যবহারকারীকে তা পাঠানো হবে।',
'passwordreset-email' => 'ইমেইল ঠিকানা:',
'passwordreset-emailtitle' => '{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি',
'passwordreset-emailtext-ip' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
'userpage-userdoesnotexist-view' => 'ব্যবহারকারী অ্যাকাউন্ট "$1" অনিবন্ধিত।',
'blocked-notice-logextract' => 'এই ব্যবহারকারী বর্তমানে ব্লক রয়েছে।
রেফারেন্সের জন্য সাম্প্রতিক ব্লক লগ ভুক্তি নিচে দেওয়া হল:',
-'clearyourcache' => "'''লক্ষ্য করুন:আপনার পছন্দগুলো রক্ষা করার পর পরিবর্তনগুলো দেখার জন্য আপনাকে ব্রাউজারের ক্যাশ এড়াতে হতে পারে।'''
-*'''ফায়ারফক্স/সাফারি:''' ''শিফট'' কী চেপে ধরে ''রিলোড''-এ ক্লিক করুন, কিংবা হয় ''কন্ট্রোল-F5'' অথবা ''কন্ট্রোল-R''(ম্যাক-এ ''কমান্ড-R'') একসাথে চাপুন;
-*'''গুগল ক্রোম:''' ''কন্ট্রোল-শিফট-R'' (ম্যাক-এ ''কমান্ড-শিফট-R'') চাপতে হবে
-*'''ইন্টারনেট এক্সপ্লোরার:''' ''কন্ট্রোল'' চেপে ধরে ''রিফ্রেশ''-এ ক্লিক করুন, কিংবা ''কন্ট্রোল-F5'' চাপুন
-*'''কংকারার:''' কেবল ''রিলোড'' ক্লিক করলেই বা ''F5'' চাপলেই চলবে;
-*'''অপেরা:''' ''Tools→Preferences''-এ গিয়ে ক্যাশ পরিষ্কার করে নিন;",
+'clearyourcache' => "'''লক্ষ্য করুন:''' সংরক্ষণের পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারে ক্যাশে পরিস্কার করার প্রয়োজন হতে পারে।
+* '''ফায়ারফক্স / সাফারি:''' ''শিফট'' কি ধরে রাখা অবস্থায় ''রিলোড''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' বা ''Ctrl-R'' (ম্যাক-এ ''⌘-R'') চাপুন
+* '''গুগল ক্রোম:''' ''Ctrl-Shift-R'' (ম্যাক-এ ''⌘-Shift-R'') চাপুন
+* '''ইন্টারনেট এক্সপ্লোরার:''' ''Ctrl'' কি ধরে রাখা অবস্থায় ''রিফ্রেশ''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' চাপুন
+* '''কনকুয়েরার:''' ''রিলোড''-এ ক্লিক করুন বা ''F5'' চাপুন
+* '''অপেরা:''' ''টুলস → প্রিফারেন্স''-এ গিয়ে ক্যাশে পরিস্কার করে নিন",
'usercssyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
'userjsyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
'usercsspreview' => "'''মনে রাখবেন আপনি আপনার জন্য বরাদ্ধকৃত সিএসএস প্রাকদর্শন করছেন।
'updated' => '(হালনাগাদ)',
'note' => "'''নোট:'''",
'previewnote' => "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''
-আপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি! [[#editform|→ সম্পাদনা চালিয়ে যান]]",
+আপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!",
+'continue-editing' => 'সম্পাদনা চালিয়ে যান',
'previewconflict' => 'এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।',
'session_fail_preview' => "'''দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি। দয়া করে লেখাটি আবার জমা দেয়ার চেষ্টা করুন। যদি এতেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন।'''",
'session_fail_preview_html' => "'''দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।'''
'token_suffix_mismatch' => "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''",
'edit_form_incomplete' => "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''",
'editing' => 'সম্পাদনা করছেন: $1',
+'creating' => '$1 পাতাটি তৈরি করছেন',
'editingsection' => 'সম্পাদনা করছেন $1 (অনুচ্ছেদ)',
'editingcomment' => 'সম্পাদনা করছেন $1 (নতুন অনুচ্ছেদ)',
'editconflict' => 'সম্পাদনা দ্বন্দ্ব: $1',
আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।
'''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
'copyrightwarning2' => "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
-'longpageerror' => "'''ত্রুটি: আপনার জমা দেয়া টেক্সটের পরিমাণ $1 কিলোবাইট, যা সর্বোচ্চ সীমা $2 কিলোবাইটের চেয়ে বেশি। এটি সংরক্ষণ করা সম্ভব নয়।'''",
+'longpageerror' => " '''ত্রুটি: আপনার জমা দেয়া টেক্সটের পরিমাণ $1 কিলোবাইট, যা সর্বোচ্চ সীমা $2 কিলোবাইটের চেয়ে বেশি। এটি সংরক্ষণ করা সম্ভব নয়।'''",
'readonlywarning' => "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।
আপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।'''
'edit-no-change' => 'আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।',
'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
পাতাটি ইতিমধ্যেই বিদ্যমান।',
+'defaultmessagetext' => 'আদি টেক্সট',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
তাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
'post-expand-template-argument-category' => 'বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা',
'parser-template-loop-warning' => 'টেম্পলেট লুপ সনাক্ত হয়েছে: [[$1]]',
+'parser-template-recursion-depth-warning' => 'টেমপ্লেট পুনরাবৃত্তি (রিকার্শন) ডেপথ্ সীমা অতক্রম করেছে ($1)',
+'language-converter-depth-warning' => 'ভাষা পরিবর্তন ডেপথ্ সীমা অতক্রম করেছে ($1)',
# "Undo" feature
'undo-success' => 'সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।',
'revdelete-submit' => 'নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো',
'revdelete-success' => "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
'logdelete-success' => "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
+'logdelete-failure' => "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''
+$1",
'revdel-restore' => 'দৃশ্যমানতা পরিবর্তন করো',
'revdel-restore-deleted' => 'অপসারিত সংস্করণ',
'revdel-restore-visible' => 'প্রদর্শনযোগ্য সংস্করণ',
'userrights-lookup-user' => 'ব্যবহারকারী দল ব্যবস্থাপনা করুন',
'userrights-user-editname' => 'ব্যবহারকারীর নাম লিখুন:',
'editusergroup' => 'ব্যবহারকারীর দল সম্পাদনা করো',
-'editinguser' => "ব্যবহারকারী সম্পাদনা করছেন '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "'''[[User:$1|$1]]''' $2 ব্যবহারকারীর জন্য ব্যবহারকারী অধিকার পরিবর্তন করছেন",
'userrights-editusergroup' => 'ব্যবহারকারীর দল সম্পাদনা করো',
'saveusergroups' => 'ব্যবহারকারীর দল সংরক্ষণ করো',
'userrights-groupsmember' => 'সদস্য:',
'illegalfilename' => '"$1" ফাইলনামটিতে এমন কিছু ক্যারেক্টার আছে যেগুলি পাতার শিরোনামে ব্যবহার করা অবৈধ। অনুগ্রহ করে ফাইলটি নতুন করে নামকরণ করুন এবং তারপর আপলোড করার চেষ্টা করুন।',
'badfilename' => 'ফাইলের নামটি পরিবর্তন করে $1" করা হয়েছে।',
'filetype-badmime' => '"$1" MIME ধরনের ফাইল আপলোড করা যাবে না।',
+'filetype-bad-ie-mime' => 'এই ফাইলটি আপলোড করা সম্ভব নয় কারণ ইন্টারনেট এক্সপ্লোরার একে "$1" হিসেবে সনাক্ত করতে পারে, যা অননুমোদিত এবং সম্ভাব্য ক্ষতিকারক ফাইল টাইপ।',
'filetype-unwanted-type' => "'''\".\$1\"''' ফাইল ধরনটি অগ্রহণযোগ্য।
পছন্দনীয় {{PLURAL:\$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হলো \$2।",
'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2।',
'filename-tooshort' => 'ফাইল নামটি খুব ছোট।',
'filetype-banned' => 'এই ধরনের ফাইল নিষিদ্ধ।',
'illegal-filename' => 'ফাইলের এই নামটি গ্রহণযোগ্য নয়।',
+'overwrite' => 'বিদ্যমান কোনো ফাইল প্রতিস্থাপন গ্রহণযোগ্য নয়।',
'unknown-error' => 'একটি অজানা ত্রুটি দেখা দিয়েছে।',
'tmp-create-error' => 'অস্থায়ী ফাইল তৈরি করা যাবে না।',
'tmp-write-error' => 'অস্থায়ী ফাইলে লিখতে সমস্যা হয়েছে।',
'large-file' => '$1-এর চেয়ে বড় আকারের ফাইল সুপারিশ করা হয় না; এই ফাইলটি $2।',
'largefileserver' => 'সার্ভারে যতখানি অনুমোদিত তার চেয়ে এই ফাইলের আকার বড়।',
'emptyfile' => 'আপনি যে ফাইলটি আপলোড করেছেন, তা খালি মনে হচ্ছে। ফাইলের নামে টাইপিং ত্রুটির কারণে এরকম হতে পারে। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি আসলেই এই ফাইলটি আপলোড করতে চান কি না।',
+'windows-nonascii-filename' => 'এই উইকি বিশেষ ক্যারেক্টারসমৃদ্ধ ফাইলের নাম সমর্থন করে না।',
'fileexists' => "এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান। অনুগ্রহ করে '''<tt>[[:$1]]</tt>''' পরীক্ষা করে দেখুন, যদি আপনি এটি পরিবর্তনের ব্যাপারে নিশ্চিত না হন। [[$1|thumb]]",
'fileexists-extension' => "একই নামের আরেকটি ফাইল আছে: [[$2|thumb]]
* আপলোড করা ফাইলের নাম: '''<tt>[[:$1]]</tt>'''
'overwroteimage' => '"[[$1]]"-এর একটি নতুন সংস্করণ আপলোড করা হয়েছে',
'uploaddisabled' => 'আপলোড নিষ্ক্রিয় আছে',
'copyuploaddisabled' => 'ইউআরএল এর মাধ্যমে আপলোড নিস্ক্রিয় রয়েছে।',
+'uploadfromurl-queued' => 'আপনার আপলোড সারিবদ্ধ হয়েছে।',
'uploaddisabledtext' => 'ফাইল আপলোড নিষ্ক্রিয়।',
'php-uploaddisabledtext' => 'পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।
অনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।',
'filewasdeleted' => 'এই নামের একটি ফাইল পূর্বে আপলোড করা হয়েছিল এবং তারপর মুছে ফেলা হয়েছিল। আপনি ফাইলটি আবার আপলোড করার আগে $1 পরীক্ষা করে দেখুন।',
'filename-bad-prefix' => "আপনি যে ফাইলটি আপলোড করছেন, তার নাম '''\"\$1\"''' দিয়ে শুরু হয়েছে। এ ধরনের নাম সাধারণত ডিজিটাল ক্যামেরাগুলি স্বয়ংক্রিয়ভাবে দিয়ে থাকে এবং এগুলি ব্যাখ্যামূলক নয়। অনুগ্রহ করে আপনার ফাইলের জন্য আরও ব্যাখ্যামূলক একটি নাম পছন্দ করুন।",
'upload-success-subj' => 'আপলোড সফল হয়েছে',
+'upload-success-msg' => '[$2] থেকে আপনার আপলোড সফল হয়েছে। এটি এখানে: [[:{{ns:file}}:$1]] পাওয়া যাবে',
'upload-failure-subj' => 'আপলোড সমস্যা',
'upload-warning-subj' => 'আপলোড সতর্কীকরণ',
+'upload-warning-msg' => '[$2] থেকে করা আপনার আপলোডে সমস্যা হয়েছে। সমস্যার সমাধানকল্পে আপনাকে সম্ভবত [[Special:Upload/stash/$1|আপলোড ফর্ম]]-এ ফিরে যেতে হবে।',
'upload-proto-error' => 'ভুল প্রোটোকল',
'upload-proto-error-text' => 'দূরবর্তী আপলোডের জন্য URLগুলি <code>http://</code> বা <code>ftp://</code> দিয়ে শুরু হওয়া আবশ্যক।',
'http-invalid-url' => 'ভুল ইউআরএল: $1',
'http-read-error' => 'HTTP পঠন ত্রুটি।',
'http-timed-out' => 'HTTP অনুরোধের সময় পার হয়েছে।',
+'http-curl-error' => 'ইউআরএল নিয়ে আসার ক্ষেত্রে ত্রুটি: $1',
'http-host-unreachable' => 'URL-এ পৌঁছানো যায়নি',
'http-bad-status' => 'HTTP অনুরোধের সময় কোন সমস্যা হয়েছে: $1 $2',
** ফাইলের অনুলিপি',
'filedelete-edit-reasonlist' => 'অপসারণের কারণ সম্পাদনা',
'filedelete-maintenance' => 'রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।',
+'filedelete-maintenance-title' => 'ফাইলটি অপসারণ করা সম্ভব নয়',
# MIME search
'mimesearch' => 'MIME অনুসন্ধান',
'statistics-users-active-desc' => 'ব্যবহারকারী যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} একটি কাজ করেছেন।',
'statistics-mostpopular' => 'সবচেয়ে বেশী বার দেখা পাতাসমূহ',
-'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহ',
+'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহে সংযোগকৃত পাতাসমূহ',
'disambiguationspage' => 'Template:দ্ব্যর্থতা_নিরসন',
'disambiguations-text' => "নিচের পাতাগুলি থেকে একটি '''দ্ব্যর্থতা নিরসন পাতা'''-তে সংযোগ আছে। এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
'allpagesprefix' => 'এই উপসর্গবিশিষ্ট পাতাগুলো দেখাও:',
'allpagesbadtitle' => 'প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।',
'allpages-bad-ns' => '{{SITENAME}}-এ "$1" নামের কোন নামস্থান নেই।',
+'allpages-hide-redirects' => 'পুনর্নির্দেশনাগুলো লুকাও',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'সাম্প্রতিকগুলো প্রদর্শন করো।',
# Special:Categories
'categories' => 'বিষয়শ্রেণীসমূহ',
'import-logentry-interwiki' => '$1 উইকি-স্থানান্তরিত',
'import-logentry-interwiki-detail' => '$2-এর করা $1 {{PLURAL:$1|সংশোধন|টি সংশোধন}}',
+# JavaScriptTest
+'javascripttest' => 'জাভাস্ক্রিপ্ট পরীক্ষা',
+
# Tooltip help for the actions
'tooltip-pt-userpage' => 'আপনার ব্যবহারকারী পাতা',
'tooltip-pt-anonuserpage' => 'যে আইপি ঠিকানা থেকে আপনি সম্পাদনা করছেন, তার ব্যবহারকারী পাতা',
'tooltip-diff' => 'আপনি টেক্সটে কী কী পরিবর্তন করেছেন, তা দেখানো হোক।',
'tooltip-compareselectedversions' => 'এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।',
'tooltip-watch' => 'এই পাতাটি আমার নজরতালিকায় যোগ করো',
+'tooltip-watchlistedit-normal-submit' => 'শিরোনাম অপসারণ',
'tooltip-recreate' => 'মুছে ফেলা সত্ত্বেও পাতাটি পুনরায় সৃষ্টি করুন',
'tooltip-upload' => 'আপলোড শুরু করো',
'tooltip-rollback' => '"পুনর্বহাল" এই পাতায় সর্বশেষ অবদানকারীর সম্পাদনাসমূহ বাতিল করে পাতাটিকে পূর্বাবস্থায় ফিরিয়ে দেয়',
# Pseudotags used for GPSDestDistanceRef
'exif-gpsdestdistance-k' => 'কিলোমিটার',
'exif-gpsdestdistance-m' => 'ফাইল',
+'exif-gpsdestdistance-n' => 'নটিক্যাল মাইল',
'exif-gpsdop-excellent' => 'খুব ভাল ($1)',
'exif-gpsdop-good' => 'ভাল ($1)',
'exif-rating-rejected' => 'প্রত্যাখাত',
+'exif-iimcategory-ace' => 'শিল্প, সংস্কৃতি এবং বিনোদন',
'exif-iimcategory-clj' => 'অপরাধ ও আইন',
'exif-iimcategory-dis' => 'দুর্যোগ ও দুর্ঘটনা',
'exif-iimcategory-fin' => 'অর্থনীতি এবং বাণিজ্য',
# action=purge
'confirm_purge_button' => 'ঠিক আছে',
'confirm-purge-top' => 'এই পাতার ক্যাশে পরিষ্কার করতে চান?',
+'confirm-purge-bottom' => 'পাতার ক্যাশে পরিস্কারের ফলে তা আপনাকে পাতাটির সবচেয়ে সাম্প্রতিক সংস্করণ প্রদর্শনে বাধ্য করে।',
# action=watch/unwatch
'confirm-watch-button' => 'ঠিক আছে',
'confirm-watch-top' => 'এই পাতাটি আপনার নজরতালিকায় যুক্ত করা হবে?',
'confirm-unwatch-button' => 'ঠিক আছে',
+'confirm-unwatch-top' => 'এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?',
# Multipage image navigation
'imgmultipageprev' => '← পূর্ববর্তী পাতা',
'version-software' => 'ইনস্টলকৃত সফটওয়্যার',
'version-software-product' => 'পণ্য',
'version-software-version' => 'সংস্করণ',
+'version-entrypoints-header-url' => 'ইউআরএল',
# Special:FilePath
'filepath' => 'ফাইলের পাথ',
# New logging system
'logentry-delete-delete' => '$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে',
'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি ফিরিয়ে আনা হয়েছে',
+'revdelete-content-hid' => 'বিষয়বস্তু লুকায়িত',
+'revdelete-summary-hid' => 'সম্পাদনা সারাংশ লুকায়িত',
+'revdelete-uname-hid' => 'ব্যবহারকারী নাম লুকায়িত',
+'revdelete-content-unhid' => 'বিষয়বস্তু প্রদর্শিত',
+'revdelete-summary-unhid' => 'সম্পাদনা সারাংশ প্রদর্শিত',
+'revdelete-uname-unhid' => 'ব্যবহারকারী নাম প্রদর্শিত',
'revdelete-restricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে প্রয়োগ করো',
'revdelete-unrestricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে তুলে নাও',
+'logentry-move-move' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে স্থানান্তর করেছেন',
+'logentry-move-move-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
+'logentry-move-move_redir' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার ওপর দিয়ে স্থানান্তর করেছেন',
+'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনার ওপর দিয়ে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
+'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
+'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
+'logentry-newusers-newusers' => '$1 একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-create' => '$1 একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামে একটি অ্যাকাউন্ট তৈরি করেছেন',
+'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছে',
'newuserlog-byemail' => 'শব্দচাবি ইমেইলের মাধ্যমে পাঠানো হয়েছে',
# Feedback
'feedback-error1' => 'ত্রুটি: এপিআই থেকে অজানা ফলাফল এসেছে',
'feedback-error2' => 'ত্রুটি: সম্পাদনা ব্যর্থ',
'feedback-error3' => 'ত্রুটি: এপিআই থেকে কোন সাড়া নেই',
+'feedback-close' => 'সম্পন্ন',
+'feedback-bugnew' => 'আমি পরীক্ষা করেছি। নতুন একটি বাগ রিপোর্ট করুন।',
# API errors
'api-error-badaccess-groups' => 'আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।',
'api-error-duplicate-archive-popup-title' => 'অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}} যা ইতমধ্যে অপসারণ করা হয়েছে',
'api-error-duplicate-popup-title' => 'অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}}',
'api-error-empty-file' => 'আপনার জমাদানকৃত ফাইলটি খালি।',
+'api-error-emptypage' => 'নতুন ও খালি পাতা তৈরি গ্রহণযোগ্য নয়।',
'api-error-fetchfileerror' => 'অভ্যন্তরীণ ত্রুটি: ফাইল নিয়ে আসার সময় কোনো সমস্যা হয়েছিলো।',
'api-error-file-too-large' => 'আপনার জমাদানকৃত ফাইলটি অনেক বড়।',
'api-error-filename-tooshort' => 'এই ফাইল নামটি খুবই ছোট।',
'api-error-unknown-code' => 'অজানা ত্রুটি: "$1"',
'api-error-unknown-error' => 'অভ্যন্তরীণ ত্রুটি: আপনার ফাইলটি আপলোড করার সময় কিছু সমস্যা হয়েছে।',
'api-error-unknown-warning' => 'অজানা সতর্কীকরণ: $1',
+'api-error-unknownerror' => 'অজানা ত্রুটি: "$1"',
'api-error-uploaddisabled' => 'এই উইকির জন্য আপলোড সুবিধা নিস্ক্রিয় রয়েছে।',
'api-error-verification-error' => 'সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|সেকেন্ড|সেকেন্ড}}',
+'duration-minutes' => '$1 {{PLURAL:$1|মিনিট|মিনিট}}',
+'duration-hours' => '$1 {{PLURAL:$1|ঘন্টা|ঘন্টা}}',
+'duration-days' => '$1 {{PLURAL:$1|দিন|দিন}}',
+'duration-weeks' => '{{PLURAL: $1|সপ্তাহ|সপ্তাহ}}',
+'duration-years' => '$1 {{PLURAL:$1|বছর|বছর}}',
+'duration-decades' => '$1 {{PLURAL:$1|দশক|দশক}}',
+'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
+'duration-millennia' => '$1 {{PLURAL:$1|সহস্রাব্দ|সহস্রাব্দ}}',
+
);
'updated' => '(Hizivaet)',
'note' => "'''Notenn :'''",
'previewnote' => "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''
-N'eo ket bet enrollet ho kemmoù evit c'hoazh ! [[#editform|→ Kenderc'hel da gemmañ]]",
+N'eo ket bet enrollet ho kemmoù evit c'hoazh !",
+'continue-editing' => "Kenderc'hel da gemmañ",
'previewconflict' => 'Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.',
'session_fail_preview' => "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''
Klaskit en-dro mar plij.
'parser-template-loop-warning' => "Patrom e kelc'h detektet : [[$1]]",
'parser-template-recursion-depth-warning' => 'Tizhet bevenn donder galvoù ar patromoù ($1)',
'language-converter-depth-warning' => "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
+'node-count-exceeded-category' => "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
+'node-count-exceeded-warning' => "Pajenn a ya en tu all d'an niver a skoulmoù",
+'expansion-depth-exceeded-category' => "Pajennoù m'eur aet dreist d'an donder astenn",
+'expansion-depth-exceeded-warning' => "Pajenn a ya dreist d'an donder astenn",
# "Undo" feature
'undo-success' => "Gallout a reer disteurel ar c'hemmoù-mañ. Gwiriit, mar plij, gant ar geñveriadenn a-is evit bezañ sur eo an dra-se a fell deoc'h ober; goude-se enrollit ar c'hemmoù a-is a-benn echuiñ disteurel ar c'hemmoù.",
'feedback-bugornote' => "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [\$1 kemenn un draen].
A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[\$3 \$2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
'feedback-subject' => 'Danvez :',
-'feedback-message' => 'Kemennadenn:',
+'feedback-message' => 'Kemennadenn :',
'feedback-cancel' => 'Nullañ',
'feedback-submit' => 'Kas ho soñj',
'feedback-adding' => "Oc'h ouzhpennañ ho soñj war ar bajenn...",
'updated' => '(Osvježeno)',
'note' => "'''Pažnja:'''",
'previewnote' => "'''Ne zaboravite da je ovo samo pregled'''
-Izmjene stranice nisu još sačuvane! [[#editform|→ Nastavi s uređivanjem]]",
+Izmjene stranice nisu još sačuvane!",
'previewconflict' => 'Ovaj pregled reflektuje tekst u gornjem polju
kako će izgledati ako pritisnete "Sačuvaj članak".',
'session_fail_preview' => "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
'updated' => '(Actualitzat)',
'note' => "'''Nota:'''",
'previewnote' => "'''Recorda que això és només una previsualització.'''
-Els vostres canvis encara no s'han desat! [[#editform|→ Continuar editant]]",
+Els vostres canvis encara no s'han desat!",
'previewconflict' => "Aquesta previsualització reflecteix, a l'àrea
d'edició superior, el text tal i com apareixerà si trieu desar-lo.",
'session_fail_preview' => "'''No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.
'updated' => '(Změna uložena)',
'note' => "'''Poznámka:''' ",
'previewnote' => "'''Pamatujte, že toto je pouze náhled.'''
-Změny zatím nebyly uloženy! [[#editform|→ Pokračovat v editaci]]",
+Změny zatím nebyly uloženy!",
+'continue-editing' => 'Pokračovat v editaci',
'previewconflict' => 'Tento náhled ukazuje text tak, jak bude vypadat po uložení stránky.',
'session_fail_preview' => "'''Váš požadavek se nepodařilo zpracovat kvůli ztrátě dat z relace.
Zkuste to prosím znovu.
'parser-template-loop-warning' => 'Nalezena smyčka šablon: [[$1]]',
'parser-template-recursion-depth-warning' => 'Překročen limit hloubky rekurzivního vkládání šablon ($1)',
'language-converter-depth-warning' => 'Překročen limit vnoření u jazykové konverze ($1)',
+'node-count-exceeded-category' => 'Stránky překračující počet uzlů',
+'node-count-exceeded-warning' => 'Stránka překročila počet uzlů',
+'expansion-depth-exceeded-category' => 'Stránky překračující hloubku expanze',
+'expansion-depth-exceeded-warning' => 'Stránka překročila hloubku expanze',
# "Undo" feature
'undo-success' => 'Editace může být zrušena. Zkontrolujte a pak potvrďte změny zobrazené níže.',
'version-software' => 'Nainstalovaný software',
'version-software-product' => 'Název',
'version-software-version' => 'Verze',
+'version-entrypoints' => 'URL vstupních bodů',
+'version-entrypoints-header-entrypoint' => 'Vstupní bod',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Cesta k souboru',
Cofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:user}}:Foo/vector.css yn hytrach na {{ns:user}}:Foo/Vector.css.",
'updated' => '(Diweddariad)',
'note' => "'''Dalier sylw:'''",
-'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto! [[#editform|→ Parhau i olygu]]",
+'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto!",
+'continue-editing' => 'Parhau i olygu',
'previewconflict' => "Mae'r rhagolwg hwn yn dangos y testun yn yr ardal golygu uchaf, fel ag y byddai'n ymddangos petaech yn rhoi'r dudalen ar gadw.",
'session_fail_preview' => "'''Ymddiheurwn! Methwyd prosesu eich golygiad gan fod rhan o ddata'r sesiwn wedi'i golli. Ceisiwch eto.
Os digwydd yr un peth eto, ceisiwch [[Special:UserLogout|allgofnodi]] ac yna mewngofnodi eto.'''",
'allpages-bad-ns' => 'Nid oes gan {{SITENAME}} barth o\'r enw "$1".',
'allpages-hide-redirects' => 'Cuddio tudalennau ailgyfeirio',
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Gweld y diwygiad diweddaraf.',
+
# Special:Categories
'categories' => 'Categorïau',
'categoriespagetext' => "Mae'r {{PLURAL:$1|categori|categori|categorïau|categorïau|categorïau|categorïau}} isod yn cynnwys tudalennau neu ffeiliau amlgyfrwng.
'duration-weeks' => '$1 {{PLURAL:$1|wythnos}}',
'duration-years' => '$1 {{PLURAL:$1|mlynedd|mlynedd|flynedd|mlynedd|mlynedd|mlynedd}}',
'duration-decades' => '$1 {{PLURAL:$1|degawd|degawd|ddegawd|degawd|degawd|degawd}}',
-'duration-centuries' => '$1 {{PLURAL:$1|canrif|canrif|ganrif|chanrif|chanrif|canrif}}',
+'duration-centuries' => '$1 {{PLURAL:$1|canmlwydd|ganmlwydd|ganmlwydd|canmlwydd|chanmlwydd|canmlwydd}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milflwydd|filflwydd|filflwydd|milflwydd|milflwydd|milflwydd}}',
);
'updated' => '(Opdateret)',
'note' => "'''Bemærk:'''",
'previewnote' => "'''Husk at dette er kun en forhåndsvisning.'''
-Dine ændringer er endnu ikke blevet gemt! [[#editform|→ Fortsæt med at redigere]]",
+Dine ændringer er endnu ikke blevet gemt!",
+'continue-editing' => 'Fortsæt med at redigere',
'previewconflict' => 'Denne forhåndsvisning er resultatet af den redigérbare tekst ovenfor, sådan vil det komme til at se ud hvis du vælger at gemme teksten.',
'session_fail_preview' => "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.
Prøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
'updated' => '(Geändert)',
'note' => "'''Hinweis:'''",
'previewnote' => "'''Dies ist nur eine Vorschau.'''
-Die Seite wurde noch nicht gespeichert! [[#editform|→ Weiter bearbeiten]]",
+Die Seite wurde noch nicht gespeichert!",
+'continue-editing' => 'Weiter bearbeiten',
'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn du jetzt speicherst.',
'session_fail_preview' => "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.
Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.
'parser-template-loop-warning' => 'Vorlagenschleife entdeckt: [[$1]]',
'parser-template-recursion-depth-warning' => 'Vorlagenrekursionstiefengrenze überschritten ($1)',
'language-converter-depth-warning' => 'Sprachkonvertertiefenlimit überschritten ($1)',
+'node-count-exceeded-category' => 'Seiten, die die Knotenanzahl überschritten haben',
+'node-count-exceeded-warning' => 'Die Seite hat die Knotenpunktanzahl überschritten.',
+'expansion-depth-exceeded-category' => 'Seiten, die die Expansionstiefe überschritten haben',
+'expansion-depth-exceeded-warning' => 'Die Seite hat die Expansionstiefe überschritten.',
# "Undo" feature
'undo-success' => 'Die Bearbeitung kann rückgängig gemacht werden.
* ({{int:cur}}) = Unterschied zur aktuellen Version, ({{int:last}}) = Unterschied zur vorherigen Version
* Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, {{int:minoreditletter}} = Kleine Änderung',
'history-fieldset-title' => 'In der Versionsgeschichte suchen',
-'history-show-deleted' => 'nur gelöschte Versionen',
+'history-show-deleted' => 'Nur gelöschte Versionen zeigen',
'histfirst' => 'Älteste',
'histlast' => 'Neueste',
'historysize' => '({{PLURAL:$1|1 Byte|$1 Bytes}})',
'datedefault' => 'Standard',
'prefs-beta' => 'Beta-Funktionen',
'prefs-datetime' => 'Datum und Zeit',
-'prefs-labs' => 'Alpha-Funktionen (experimentell)',
+'prefs-labs' => 'Alpha-Funktionen',
'prefs-personal' => 'Benutzerdaten',
'prefs-rc' => 'Letzte Änderungen',
'prefs-watchlist' => 'Beobachtungsliste',
'lockmanager-fail-openlock' => 'Die Sperrdatei für „$1“ konnte nicht geöffnet werden.',
'lockmanager-fail-releaselock' => 'Die Sperre für „$1“ konnte nicht freigegeben werden.',
'lockmanager-fail-db-bucket' => 'Es konnte mit Sammelabruf $1 keine ausreichende Anzahl an Verbindungen zu Sperrdatenbanken hergestellt werden.',
-'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnte nicht freigegeben werden.',
-'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnte nicht freigegeben werden.',
+'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnten nicht freigegeben werden.',
+'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnten nicht freigegeben werden.',
# ZipDirectoryReader
'zip-file-open-error' => 'Es ist ein Fehler beim Öffnen der Datei zur ZIP-Überprüfung aufgetreten.',
'qbpageoptions' => 'Ena pele',
'qbpageinfo' => 'Gıre',
'qbmyoptions' => 'Pelê mı',
-'qbspecialpages' => 'Pelê Mêniye',
+'qbspecialpages' => 'Peley xısusi',
'faq' => 'PZP (Persê ke zehf persiyenê)',
'faqpage' => 'Project: PZP',
'history_short' => 'Tarix',
'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
'printableversion' => 'Asayışê çapkerdışi',
-'permalink' => 'Gıreyo jûqere',
+'permalink' => 'Gıreyo daimi',
'print' => 'Çap ke',
'view' => 'Bıvêne',
'edit' => 'Bıvurne',
'newpage' => 'Pela newiye',
'talkpage' => 'Ena pele sero werêne',
'talkpagelinktext' => 'Werênayış',
-'specialpage' => 'Pela xase',
+'specialpage' => 'Pela xısusi',
'personaltools' => 'Hacetê şexsi',
'postcomment' => 'Qısımo newe',
'articlepage' => 'Pela zerreki bıvêne',
'showtoc' => 'bımocne',
'hidetoc' => 'bınımne',
'collapsible-collapse' => 'Kılmever ke',
-'collapsible-expand' => 'Hera',
+'collapsible-expand' => 'Hera ke',
'thisisdeleted' => 'Bıvêne ya zi $1 peyser bia?',
'viewdeleted' => '$1 bıvêne?',
'restorelink' => '{{PLURAL:$1|yew vurnayışo esterıte|$1 vurnayışê esterıtey}}',
'nstab-main' => 'Pele',
'nstab-user' => 'Pela Karberi',
'nstab-media' => 'Pela Medya',
-'nstab-special' => 'Pela xase',
+'nstab-special' => 'Pela xısusi',
'nstab-project' => 'Pela Procey',
'nstab-image' => 'Dosya',
'nstab-mediawiki' => 'Mesac',
'cascadeprotected' => 'No pel de vurnayiş qedexe biyo, çunke şıma tuşa "kademeyın" aqtif kerdo u no {{PLURAL:$1|pelo|pelo}} pawıteyo de xebıtyeno:
$2',
'namespaceprotected' => "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
-'ns-specialprotected' => 'Pelê mêniye nênê vurnayış.',
+'ns-specialprotected' => 'Peley xısusi nênê vurnayış.',
'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
Sebeb: "\'\'$2\'\'".',
'updated' => '(Biyo rocane)',
'note' => "'''Not:'''",
'previewnote' => "Teme! ena teyna verqeyda.'''
-Vurnayışê tu hama qeyd nıbiyo![[#editform|→ timar kerdışi rê dewam ke]]",
+Vurnayışê tu hama qeyd nıbiyo!",
'previewconflict' => 'No seyrkerdışê verqaydi serê qutiyê nuşte tezim kerdış de yo, eke şıma qayile vurnayişê maddeyi seyino bıvini, no mocneno şıma.',
'session_fail_preview' => 'Ma ef kere. Vindibiyayişê tayê datay ra a kerdışê hesabê şıma de ma vurnayişê şıma qayd nêkerd. Newe ra tesel (cereb) bıkere. Eke no qayde zi nêbo, [[Special:UserLogout|hesabê xo bıqefelne]] u newera a kere.',
'session_fail_preview_html' => "'''Ma meluli! Sebayê vindbiyayişê datasistemi ma vurnayişê şıma nêeşkeni qaydker.'''
Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena.',
'prefs-help-email-required' => 'E-mail adrese mecburiya.',
'prefs-info' => 'Enformasyonê temelî',
-'prefs-i18n' => 'Beynelbinel kerdişî',
+'prefs-i18n' => 'Şaryayış kerdış',
'prefs-signature' => 'İmza',
'prefs-dateformat' => 'Formatê tarixi',
'prefs-timeoffset' => 'Wext offset',
'blanknamespace' => '(Ser)',
# Contributions
-'contributions' => 'İştiraqê karberi',
+'contributions' => 'İştirakê karberi',
'contributions-title' => '$1 de iştırakê karberi',
'mycontris' => 'İştırakê mı',
'contribsub2' => 'Semedê $1 ($2)',
'export-pagelinks' => 'behsê xorıniya pelê pêrabesteyani:',
# Namespace 8 related
-'allmessages' => 'Mesajanê sistemi',
+'allmessages' => 'Mesacê sistemi',
'allmessagesname' => 'Name',
'allmessagesdefault' => 'nuşteyo orjinal',
'allmessagescurrent' => 'nuşte yo ke şuxuliyeno',
Na rêze de her gırêyo bin zey istisna vêniyeno, yanê pelê ke dosya beno ke sero rêzbiyaye asena.',
# Metadata
-'metadata' => 'Metadata',
+'metadata' => 'Melumato serên',
'metadata-help' => 'Ena dosya dı zafyer informasyoni esto. Belki ena dosya yew kamareyo dijital ya zi skaner ra vıraziyo.
Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.',
-'metadata-expand' => 'Extended detayan bımoc',
+'metadata-expand' => 'Detayan bımocne',
'metadata-collapse' => 'extended details bınım',
'metadata-fields' => 'Resımê meydanê metadataê ke na pele de benê lista, pela resımmocnaene de ke tabloê metadata gına waro, gureniyenê.
Ê bini zey sayekerdoğan nımiyenê.
'confirm-unwatch-top' => 'Ena pele lista xoya seyirkerdışi ra bıvece?',
# Multipage image navigation
-'imgmultipageprev' => 'peleyê verin',
+'imgmultipageprev' => '← peleyê verin',
'imgmultipagenext' => 'pelo serîn →',
'imgmultigo' => 'Şı!',
'imgmultigoto' => 'Şi pel $1',
'fileduplicatesearch-noresults' => 'Ebe namey "$1" ra dosya nêdiyayê.',
# Special:SpecialPages
-'specialpages' => 'Pelê mêniye',
+'specialpages' => 'Peley xısusi',
'specialpages-note' => '----
* Xısusi pelaya normal
* <span class="mw-specialpagerestricted">Xısusi peleyê keı rê ray nê deyaya.</span>
* @ingroup Language
* @file
*
+ * @author Dbc334
* @author Derbeth
* @author Dunak
* @author Dundak
'updated' => '(Zaktualizěrowane)',
'note' => "'''Pokazka:'''",
'previewnote' => "'''Wobmysli, až to jo jano pśeglěd.'''
-Twóje změny hyšći njejsu składowane! [[#editform|→ Dalej wobźěłaś]]",
+Twóje změny hyšći njejsu składowane!",
+'continue-editing' => 'Dalej wobźěłaś',
'previewconflict' => 'Toś ten pśeglěd wótbłyšćujo tekst górjejcnego póla. Bok buźo tak wuglědaś, jolic jen něnto składujoš.',
'session_fail_preview' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili. Pšosym wopytaj hyšći raz. Jolic až to pón pśecej hyšći njejźo, wopytaj se wótzjawiś a zasej pśizjawiś.'''",
'session_fail_preview_html' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili.'''
'parser-template-loop-warning' => 'Pśedłogowa šlejfa namakana: [[$1]]',
'parser-template-recursion-depth-warning' => 'Limit rekursijneje dłymi pśedłogi pśekšocony ($1)',
'language-converter-depth-warning' => 'Limit dłymokosći rěcnego konwertera pśekšocony ($1)',
+'node-count-exceeded-category' => 'Boki, źož licba sukow jo pśekšocona',
+'node-count-exceeded-warning' => 'Bok jo licbu sukow pśekšocył',
+'expansion-depth-exceeded-category' => 'Boki, źož ekspansiska dłymokosć jo pśekšocona',
+'expansion-depth-exceeded-warning' => 'Bok jo ekspansisku dłymokosć pśekšocył',
# "Undo" feature
'undo-success' => 'Wobźěłanje móžo se wótpóraś. Pšosym pśeglěduj dołojcne pśirownowanje aby se wěsty był, až to wót wěrnosći coš, a pón składuj změny, aby se wobźěłanje doskóńcnje wótpórało.',
# Suppression log
'suppressionlog' => 'Protokol pódłocowanjow',
-'suppressionlogtext' => 'To jo lisćina wulašowanjow a blokěrowanjow, kótaraž ma wopśimjeśe, kótarež jo wót administratorow schowane. Glědaj [[Special:BlockList|lisćinu IP-blokěrowanjow]] za lisćinu aktualnych wugnanjow a blokěrowanjow.',
+'suppressionlogtext' => 'To jo lisćina wulašowanjow a blokěrowanjow, kótaraž ma wopśimjeśe, kótarež jo wót administratorow schowane. Glědaj [[Special:BlockList|lisćinu blokěrowanjow]] za lisćinu aktualnych wugnanjow a blokěrowanjow.',
# History merging
'mergehistory' => 'Zwězaś stawizny bokow',
'prefs-skin' => 'Šat',
'skin-preview' => 'Pśeglěd',
'datedefault' => 'Standard',
-'prefs-beta' => 'Betafunkcije',
+'prefs-beta' => 'Preizkusne funkcije',
'prefs-datetime' => 'Datum a cas',
'prefs-labs' => 'Laborowe funkcije',
'prefs-personal' => 'Wužywarski profil',
'upload-curl-error28-text' => 'Bok pśedłujko njejo wótegronił. Kontrolěruj, lic jo bok online, pócakaj wokognuśe a wopytaj pón hyšći raz. Móžo byś zmysłapołne, w drugem casu hyšći raz proběrowaś.',
'license' => 'Licenca:',
-'license-header' => 'Licencowanje',
+'license-header' => 'Licencěrowanje',
'nolicense' => 'Nic njejo wuzwólone.',
'license-nopreview' => '(Pśeglěd njejo móžny.)',
'upload_source_url' => ' (płaśeca, zjawnje pśistupna URL)',
'ipb-confirm' => 'Blokěrowanje wobkšuśiś',
'badipaddress' => 'IP-adresa jo njekorektna',
'blockipsuccesssub' => 'Wuspěšnje blokěrowane',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] jo se blokěrował.<br />
-Glědaj do [[Special:BlockList|lisćiny aktiwnych blokěrowanjow]], aby blokěrowanja pśeglědał.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] jo se {{GENDER:$1|blokěrował|blokěrowała}}.<br />
+Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśeglědał.',
'ipb-blockingself' => 'Coš samogo blokěrowaś! Coš to napšawdu cyniś?',
'ipb-confirmhideuser' => 'Coš rowno wužywarja z nastajenim "wužywarja schowaś" blokěrowaś. To k tomu dowjeźo, až mě wužywarja pódłocyjo se we wšych lisćinach a protokolowych zapiskach. Coš to napšawdu cyniś?',
'ipb-edit-dropdown' => 'Pśicyny blokěrowanja wobźěłaś',
'blocklog-showsuppresslog' => 'Toś ten wužywaŕ jo se pjerwjej zablokěrował a schował. Protokol pódtłocowanjow pódawa se dołojce ako referenca:',
'blocklogentry' => '[[$1]] blokěrujo se na $2 $3',
'reblock-logentry' => 'jo změnił blokěrowańske nastajenja za [[$1]] z casom spadnjenja $2 $3',
-'blocklogtext' => 'To jo protokol blokěrowanjow a dopušćenjow.
-IP-adresy, ako su awtomatiski se blokěrowali, se njepokažu.
-Na boce [[Special:BlockList|Lisćina blokěrowanych IP-adresow a wužywarskich mjenjow]] jo móžno, akualne blokěrowanja pśeglědowaś.',
+'blocklogtext' => 'To jo protokol blokěrowanja a wótblokěrowanja wužywarjow. Awtomatiski blokěrowane IP-adrese se njenalistuju. Glědaj [[Special:BlockList|lisćinu blokěrowanjow]] za lisćinu tuchylnych wugnanjow a blokěrowanjow.',
'unblocklogentry' => 'jo $1 zasej dopušćił',
'block-log-flags-anononly' => 'jano anonymne',
'block-log-flags-nocreate' => 'stwórjenje konta jo se znjemóžniło',
'exif-gpsdestdistance' => 'Distanca k celowemu městnu',
'exif-gpsprocessingmethod' => 'Mě metody pśeźěłanja GPS',
'exif-gpsareainformation' => 'Mě wobcerka GPS',
-'exif-gpsdatestamp' => 'Datum GPS',
+'exif-gpsdatestamp' => 'GPS-datum',
'exif-gpsdifferential' => 'Diferencialna korektura GPS',
'exif-jpegfilecomment' => 'Komentar JPEG-dataje',
'exif-keywords' => 'Klucowe słowa',
'version-software' => 'Instalěrowana software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Wersija',
+'version-entrypoints' => 'URL zastupneho dypka',
+'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Datajowa droga',
'tog-showjumplinks' => 'Ενεργοποίησε τους συνδέσμους προσβασιμότητας του τύπου "μετάβαση σε"',
'tog-uselivepreview' => 'Χρησιμοποίησε άμεση προεπισκόπηση (JavaScript) (Πειραματικό)',
'tog-forceeditsummary' => 'Ειδοποίησέ με όταν εισάγω μια κενή σύνοψη επεξεργασίας',
-'tog-watchlisthideown' => 'Απόκρυψε τις επεξεργασίες μου απο τη λίστα παρακολούθησης',
-'tog-watchlisthidebots' => 'Απόκρυψε τις επεξεργασίες των bots από τη λίστα παρακολούθησης',
+'tog-watchlisthideown' => 'Απόκρυψε τις επεξεργασίες μου από τη λίστα παρακολούθησης',
+'tog-watchlisthidebots' => 'Απόκρυψε τις επεξεργασίες των bot από τη λίστα παρακολούθησης',
'tog-watchlisthideminor' => 'Απόκρυψε τις μικρής σημασίας επεξεργασίες από τη λίστα παρακολούθησης',
'tog-watchlisthideliu' => 'Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης',
'tog-watchlisthideanons' => 'Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης',
'ns-specialprotected' => 'Σελίδες στον τομέα {{ns:special}} δεν γίνεται να επεξεργαστούν.',
'titleprotected' => "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].
Ο λόγος που δίνεται είναι ''$2''.",
+'filereadonlyerror' => 'Δεν είναι δυνατή η τροποποίηση του αρχείου " $1 " επειδή το αποθετήριο αρχείων " $2 " είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.
+
+Ο διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: " $3 ".',
# Virus scanner
'virus-badscanner' => "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
'emailconfirmlink' => 'Επαληθεύστε την ηλεκτρονική σας διεύθυνση',
'invalidemailaddress' => 'Η ηλεκτρονική διεύθυνση δεν μπορεί να γίνει δεκτή γιατί ενδεχομένως δεν έχει έγκυρη μορφή. Παρακαλούμε συμπληρώστε μια σωστά διαμορφωμένη διεύθυνση ή αφήστε το πεδίο κενό.',
'cannotchangeemail' => "Οι διευθύνσεις ηλεκτρονικού ταχυδρομείου του λογαριασμού δεν μπορούν να αλλάξουν σ' αυτό το wiki.",
+'emaildisabled' => 'Αυτός ο ιστότοπος δεν μπορεί να στείλει μηνύματα ηλεκτρονικού ταχυδρομείου.',
'accountcreated' => 'Ο λογαριασμός δημιουργήθηκε',
'accountcreatedtext' => 'Ο λογαριασμός χρήστη για τον/την $1 έχει δημιουργηθεί.',
'createaccount-title' => 'Δημιουργία λογαριασμού για {{SITENAME}}',
'userinvalidcssjstitle' => "'''Προσοχή:''' Δεν υπάρχει skin με τίτλο \"\$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css και .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
'updated' => '(Ενημερώθηκε)',
'note' => "'''Προσοχή: '''",
-'previewnote' => "'''Σας υπενθυμίζουμε ότι βλέπετε μόνον την προεπισκόπηση -δεν έχετε ακόμα αποθηκεύσει τις αλλαγές σας!'''",
+'previewnote' => "'''Να θυμάστε ότι αυτή είναι μόνο μια προεπισκόπηση.'''
+Οι αλλαγές σας δεν έχουν ακόμη αποθηκευτεί!",
+'continue-editing' => 'Συνέχεια επεξεργασίας',
'previewconflict' => 'Αυτή η προεπισκόπηση απεικονίζει το κείμενο στην επάνω περιοχή επεξεργασίας κειμένου, όπως θα εμφανιστεί εάν επιλέξετε να το αποθηκεύσετε.',
'session_fail_preview' => "'''Συγγνώμη! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.
Παρακαλώ προσπαθήστε ξανά. Αν δεν δουλεύει ξανά, δοκιμάστε να αποσυνδεθείτε και να συνδεθείτε πάλι.'''",
Αυτό μερικές φορές συμβαίνει όταν χρησιμοποιείται ένας ανώνυμος διακομιστής μεσολάβησης διαθέσιμος μέσω του παγκόσμιου ιστού με σφάλματα.'''",
'edit_form_incomplete' => "'''Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Ελέγξτε ότι οι αλλαγές σας είναι άθικτες και προσπαθήστε ξανά.'''",
'editing' => 'Επεξεργασία $1',
+'creating' => 'Δημιουργία: $1',
'editingsection' => 'Επεξεργασία $1 (τμήμα)',
'editingcomment' => 'Επεξεργασία $1 (νέο τμήμα)',
'editconflict' => 'Σύγκρουση επεξεργασίας: $1',
'edit-no-change' => 'Η επεξεργασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.',
'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.
Υπάρχει ήδη.',
+'defaultmessagetext' => 'Προεπιλεγμένο κείμενο μηνύματος',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Προειδοποίηση: Αυτή η σελίδα περιέχει πάρα πολύ ακριβό αναλυτή λειτουργικών κλήσεων.
# Suppression log
'suppressionlog' => 'Κατάλογος διαγραφών',
-'suppressionlogtext' => 'Παρακάτω βρίσκεται μία λίστα με τις διαγραφές και τις φραγές σχετικές με περιεχόμενο που έχει κρυφθεί από τους διαχειριστές.
+'suppressionlogtext' => 'Παρακάτω βρίσκεται μία λίστα με τις διαγραφές και τις φραγές σχετικό με περιεχόμενο που έχει αποκρυβεί από τους διαχειριστές.
Δείτε την [[Special:BlockList|λίστα φραγών IP]] για τις τρέχουσες λειτουργικές απαγορεύσεις και φραγές.',
# History merging
'newsectionsummary' => '/* $1 */ νέα ενότητα',
'rc-enhanced-expand' => 'Εμφάνιση λεπτομερειών (απαιτείται JavaScript)',
'rc-enhanced-hide' => 'Απόκρυψη λεπτομερειών',
+'rc-old-title' => 'αρχικά δημιουργήθηκε ως " $1 "',
# Recent changes linked
'recentchangeslinked' => 'Σχετικές αλλαγές',
Παρακαλούμε δείτε τη [$2 σελίδα περιγραφής του αρχείου] για περισσότερες πληροφορίες.',
'sharedupload-desc-here' => 'Το αρχείο είναι από το $1 και ενδέχεται να χρησιμοποιείται από άλλα εγχειρήματα.
Η περιγραφή στη [$2 σελίδα περιγραφής αρχείου] εμφανίζεται παρακάτω.',
+'sharedupload-desc-edit' => 'Αυτό το αρχείο είναι από $1 και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.
+Ίσως θέλετε να επεξεργαστείτε την περιγραφή του στην [$2 σελίδα περιγραφής αρχείου] εκεί.',
+'sharedupload-desc-create' => 'Αυτό το αρχείο είναι από $1 και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.
+Ίσως θέλετε να επεξεργαστείτε την περιγραφή του στην [$2 σελίδα περιγραφής αρχείου] εκεί.',
'filepage-nofile' => 'Κανένα αρχείο με αυτό το όνομα δεν υπάρχει',
'filepage-nofile-link' => 'Δεν υπάρχει τέτοιο αρχείο, αλλἀ μπορείτε να [$1 το επιφορτώσετε].',
'uploadnewversion-linktext' => 'Φορτώστε μια νέα έκδοση αυτού του αρχείου',
'allpagesprefix' => 'Προβολή των σελίδων με πρόθεμα:',
'allpagesbadtitle' => 'Ο δοσμένος τίτλος σελίδας ήταν άκυρος ή είχε ένα διαγλωσσικό ή δια-wiki πρόθεμα. Μπορεί να περιέχει έναν ή περισσότερους χαρακτήρες οι οποίοι δεν μπορούν να χρησιμοποιοθούν σε τίτλους.',
'allpages-bad-ns' => 'Το {{SITENAME}} δεν έχει τον τομέα "$1".',
+'allpages-hide-redirects' => 'Απόκρυψη ανακατευθύνσεων',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Προβολή τελευταίας.',
# Special:Categories
'categories' => 'Κατηγορίες',
'linksearch-pat' => 'Μοτίβο αναζήτησης:',
'linksearch-ns' => 'Περιοχή:',
'linksearch-ok' => 'Αναζήτηση',
-'linksearch-text' => '',
+'linksearch-text' => 'Χαρακτήρες όπως "*.wikipedia.org" μπορούν να χρησιμοποιηθούν.
+Χρειάζεται τουλάχιστον ένα domain ανώτατου επιπέδου, για παράδειγμα "*.org".<br />
+Υποστηριζόμενα πρωτόκολλα: <tt> $1 </tt> (μην προσθέτετε οποιαδήποτε από αυτές στην αναζήτησή σας).',
'linksearch-line' => 'Η $1 συνδεδεμένη από την $2',
'linksearch-error' => 'Λέξεις-μπαλαντέρ μπορεί να εμφανιστούν μόνο στην αρχή τού ονόματος ιστοτόπου (hostname).',
'protect-title-notallowed' => 'Εμφάνιση επιπέδου προστασίας για την "$1"',
'prot_1movedto2' => 'Η [[$1]] μετακινήθηκε στη θέση [[$2]]',
'protect-badnamespace-title' => 'Μη-προστατευόμενη ομάδα σελίδων',
+'protect-badnamespace-text' => 'Οι σελίδες σε αυτόν τον ονοματοχώρο δεν μπορούν να κλειδωθούν.',
'protect-legend' => 'Επιβεβαίωση κλειδώματος',
'protectcomment' => 'Αιτία:',
'protectexpiry' => 'Λήξη',
'ipb-confirm' => 'Επιβεβαίωση φραγής',
'badipaddress' => 'Άκυρη διεύθυνση IP.',
'blockipsuccesssub' => 'Η φραγή ολοκληρώθηκε επιτυχώς.',
-'blockipsuccesstext' => 'Η διεύθυνση [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />
-Î\94είÏ\84ε Ï\84η [[Special:BlockList|λίÏ\83Ï\84α διεÏ\85θÏ\8dνÏ\83εÏ\89ν IP Ï\80οÏ\85 ÎÏ\87οÏ\85ν Ï\85Ï\80οÏ\83Ï\84εί Ï\86Ï\81αγή]] για να Ï\84ο εÏ\80ιβεβαιÏ\8eÏ\83εÏ\84ε.',
+'blockipsuccesstext' => '{{GENDER:$1|Ο|Η}} [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />
+Î\94είÏ\84ε Ï\84ον [[Special:BlockList|καÏ\84άλογο Ï\86Ï\81αγÏ\8eν]] για να εÏ\80οÏ\80Ï\84εÏ\8dÏ\83εÏ\84ε Ï\84ιÏ\82 Ï\86Ï\81αγÎÏ\82.',
'ipb-blockingself' => 'Είστε έτοιμος να επιβάλετε φραγή στον ευατό σας! Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;',
'ipb-confirmhideuser' => 'Είστε {{GENDER:|έτοιμος|έτοιμη}} να μπλοκάρετε ένα χρήστη με ενεργοποιημένη την "απόκρυψη χρήστη" . Αυτό θα καταστείλει το όνομα του χρήστη σε όλες τις λίστες και τις καταχωρήσεις ημερολογίου. Είστε {{GENDER:|σίγουρος|σίγουρη}} ότι θέλετε να το κάνετε αυτό;',
'ipb-edit-dropdown' => 'Επεξεργασία λόγων φραγής',
'blocklogentry' => 'O/H [[$1]] φράχθηκε με χρόνο λήξης $2 $3',
'reblock-logentry' => 'άλλαξε τις ρυθμίσεις φραγής για τον/την [[$1]] με χρόνο λήξης $2 $3',
'blocklogtext' => 'Αυτό είναι ένα αρχείο καταγραφής των ενεργειών φραγής και κατάργησης φραγής χρηστών.
-Δεν συμπεριλαμβάνονται οι διευθύνσεις IP που υπέστησαν αυτόματα φραγή.
-Δείτε τον [[Special:BlockList|κατάλογο φραγμένων διευθύνσεων IP]] για τη λίστα των τρεχόντων ενεργών αποκλεισμών και φραγών.',
+Δεν συμπεριλαμβάνονται οι διευθύνσεις IP που υπέστησαν φραγή αυτόματα.
+Δείτε τον [[Special:BlockList|κατάλογο φραγών]] για τη λίστα των τρεχόντων ενεργών αποκλεισμών και φραγών.',
'unblocklogentry' => 'Άρση φραγής του "$1"',
'block-log-flags-anononly' => 'μόνο ανώνυμοι χρήστες',
'block-log-flags-nocreate' => 'δημιουργία λογαριασμού απενεργοποιημένη',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} από $2',
# JavaScriptTest
+'javascripttest' => 'Δοκιμή JavaScript',
'javascripttest-disabled' => 'Αυτή η λειτουργία έχει απενεργοποιηθεί.',
# Tooltip help for the actions
'tooltip-diff' => 'Προβολή των αλλαγών που κάνατε στο κείμενο.',
'tooltip-compareselectedversions' => 'Εμφάνιση των διαφορών ανάμεσα στις δύο αναθεωρήσεις της σελίδας που έχετε επιλέξει.',
'tooltip-watch' => 'Προσθήκη της σελίδας στη λίστα παρακολούθησης',
+'tooltip-watchlistedit-normal-submit' => 'Μετακίνηση τίτλων',
'tooltip-watchlistedit-raw-submit' => 'Ενημέρωση λίστας παρακολούθησης',
'tooltip-recreate' => 'Ξαναδημιούργησε τη σελίδα παρόλο που έχει διαγραφεί',
'tooltip-upload' => 'Έναρξη φόρτωσης',
'watchlisttools-edit' => 'Δείτε και επεξεργαστείτε τη λίστα παρακολούθησης',
'watchlisttools-raw' => 'Επεξεργαστείτε την πρωτογενή λίστα παρακολούθησης',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|συζήτηση]])',
+
# Core parser functions
'unknown_extension_tag' => 'Άγνωστη ετικέτα επέκτασης "$1"',
'duplicate-defaultsort' => 'Προσοχή: Το προκαθορισμένο κλειδί ταξινόμησης "$2" υπερκαλύπτει το προηγούμενο "$1".',
'version-software' => 'Εγκατεστημένο λογισμικό',
'version-software-product' => 'Προϊόν',
'version-software-version' => 'Έκδοση',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Διαδρομή αρχείου',
# New logging system
'logentry-delete-delete' => 'Ο/η $1 διέγραψε τη σελίδα $3',
'logentry-delete-restore' => 'Ο/η $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-event' => '$1 άλλαξε την ορατότητα σε {{PLURAL:$5|ένα γεγονός καταγραφής|$5 log events}} στο $3: $4',
'revdelete-content-hid' => 'το περιεχόμενο αποκρύφθηκε',
'revdelete-summary-hid' => 'Η σύνοψη επεξεργασίας αποκρύφθηκε',
'revdelete-uname-hid' => 'Το όνομα χρήστη αποκρύφθηκε',
'revdelete-restricted' => 'εφάρμοσε περιορισμούς στους sysops',
'revdelete-unrestricted' => 'αφαίρεσε περιορισμούς στους sysops',
-'logentry-newusers-create' => '$1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
+'logentry-move-move-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 χωρίς να αφήσει ανακατεύθυνση',
+'logentry-move-move_redir' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 πάνω από την ανανακατεύθυνση',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
+'logentry-patrol-patrol' => '{{GENDER:$1|Ο|Η}} $1 σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-patrol-patrol-auto' => '{{GENDER:$1|Ο|Η}} $1 αυτόματα σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-newusers-newusers' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-newusers-create' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
+'logentry-newusers-create2' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε τον λογαριασμό χρήστη $3',
'logentry-newusers-autocreate' => 'Ο λογαριασμός $1 δημιουργήθηκε αυτόματα',
'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτρονικού μηνύματος',
'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
'feedback-thanks' => 'Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα "[$2 $1]".',
'feedback-close' => 'Ολοκληρώθηκε',
+'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
# API errors
'api-error-badaccess-groups' => 'Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.',
'api-error-uploaddisabled' => 'Η επιφόρτωση είναι απενεργοποιημένη σε αυτό το wiki.',
'api-error-verification-error' => 'Αυτό το αρχείο μπορεί να είναι κατεστραμμένο, ή να έχει λανθασμένη επέκταση.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}}',
+'duration-minutes' => '$1 {{PLURAL:$1|λεπτό|λεπτά}}',
+'duration-hours' => '$1 {{PLURAL:$1|ώρα|ώρες}}',
+'duration-days' => '$1 {{PLURAL:$1|μέρα|μέρες}}',
+'duration-weeks' => '$1 {{PLURAL:$1|εβδομάδα|εβδομάδες}}',
+'duration-years' => '$1 {{PLURAL:$1|χρόνο|χρόνια}}',
+'duration-decades' => '$1 {{PLURAL:$1|δεκαετία|δεκαετίες}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Αιώνα|αιώνες}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Χιλιετία|Χιλιετίες}}',
+
);
'updated' => '(Updated)',
'note' => "'''Note:'''",
'previewnote' => "'''Remember that this is only a preview.'''
-Your changes have not yet been saved! [[#editform|→ Continue editing]]",
+Your changes have not yet been saved!",
+'continue-editing' => "Continue editing",
'previewconflict' => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.',
'session_fail_preview' => "'''Sorry! We could not process your edit due to a loss of session data.'''
Please try again.
'parser-template-loop-warning' => 'Template loop detected: [[$1]]',
'parser-template-recursion-depth-warning' => 'Template recursion depth limit exceeded ($1)',
'language-converter-depth-warning' => 'Language converter depth limit exceeded ($1)',
+'node-count-exceeded-category' => 'Pages where node-count is exceeded',
+'node-count-exceeded-warning' => 'Page exceeded the node-count',
+'expansion-depth-exceeded-category' => 'Pages where expansion depth is exceeded',
+'expansion-depth-exceeded-warning' => 'Page exceeded the expansion depth',
# "Undo" feature
'undo-success' => 'The edit can be undone.
Rememoru ke individuaj .css-aj kaj .js-aj paĝoj uzas minusklan titolon, ekz. {{ns:user}}:Foo/vector.css kontraŭe al {{ns:user}}:Foo/Vector.css.",
'updated' => '(Ŝanĝo registrita)',
'note' => "'''Noto:'''",
-'previewnote' => "'''Memoru, ke ĉi tio estas nur antaŭrigardo kaj ankoraŭ ne konservita!'''",
+'previewnote' => "'''Memoru, ke ĉi tio estas nur antaŭrigardo.'''
+Viaj ŝanĝoj ne ankoraŭ estas konservitaj!",
'previewconflict' => 'La jena antaŭrigardo montras la tekston el la supra tekstujo,
kiel ĝi aperos se vi elektos konservi la paĝon.',
'session_fail_preview' => "'''Ni ne povas procezi vian redakton pro perdo de seancaj datenoj.
Ĉi tiel malofte okazas kiam vi uzas fuŝan TTT-an anoniman prokurilon.'''",
'edit_form_incomplete' => "'''Kelkaj partoj de la redaktada formo ne atingis la servilon; rekontrolu ke via redakto estas ĝusta kaj reprovu.'''",
'editing' => 'Redaktado de $1',
+'creating' => 'Kreado de $1',
'editingsection' => 'Redaktante $1 (sekcion)',
'editingcomment' => 'Redaktante $1 (nova sekcio)',
'editconflict' => 'Redakta konflikto: $1',
* @author Hercule
* @author Icvav
* @author Imre
+ * @author Invadinado
* @author Jatrobat
* @author Jens Liebenau
* @author Jurock
'tog-previewontop' => 'Mostrar previsualización antes del cuadro de edición',
'tog-previewonfirst' => 'Mostrar previsualización en la primera edición',
'tog-nocache' => 'Desactivar la caché de páginas del navegador',
-'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando una página en mi lista de seguimiento sea modificada',
-'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando mi página de discusión sea modificada',
+'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando se modifique una página en mi lista de seguimiento',
+'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando se modifique mi página de discusión',
'tog-enotifminoredits' => 'Notificarme también los cambios menores de páginas',
'tog-enotifrevealaddr' => 'Revelar mi dirección de correo electrónico en los correos de notificación',
'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
'tog-oldsig' => 'Firma actual:',
'tog-fancysig' => 'Tratar firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos pues necesitas ajustes especiales en tu ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos pues necesitas ajustes especiales en tu ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
+'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
'tog-showjumplinks' => 'Habilitar enlaces de accesibilidad «saltar a»',
'tog-uselivepreview' => 'Usar live preview (JavaScript) (Experimental)',
'tog-forceeditsummary' => 'Alertar al grabar sin resumen de edición.',
'category-empty' => "''La categoría no contiene actualmente ningún artículo o archivo multimedia.''",
'hidden-categories' => '{{PLURAL:$1|Categoría escondida|Categorías escondidas}}',
'hidden-category-category' => 'Categorías ocultas',
-'category-subcat-count' => '{{PLURAL:$2|Esta categoría comprende solamente la siguiente categoría.|Esta categoría incluye {{PLURAL:$1|la siguiente categorías|las siguientes $1 subcategorías}}, de un total de $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}, de un total de $2.}}',
'category-subcat-count-limited' => 'Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}.',
'category-article-count' => '{{PLURAL:$2|Esta categoría incluye solamente la siguiente página.|{{PLURAL:$1|La siguiente página página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría, de un total de $2.}}',
'category-article-count-limited' => '{{PLURAL:$1|La siguiente página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría.',
'category-file-count-limited' => '{{PLURAL:$1|El siguiente fichero pertenece|Los siguientes $1 ficheros pertenecen}} a esta categoría.',
'listingcontinuesabbrev' => 'cont.',
'index-category' => 'Páginas indexadas',
-'noindex-category' => 'Páginas no indizadas',
+'noindex-category' => 'Páginas no indexadas',
'broken-file-category' => 'Páginas con enlaces rotos a archivos',
'about' => 'Acerca de',
'article' => 'Artículo',
-'newwindow' => '(Se abre en una ventana nueva)',
+'newwindow' => '(se abre en una ventana nueva)',
'cancel' => 'Cancelar',
'moredotdotdot' => 'Más...',
'mypage' => 'Mi página',
'login-throttled' => 'Has intentado demasiadas veces iniciar sesión. Por favor espera antes de intentarlo nuevamente.',
'login-abort-generic' => 'Tu inicio de sesión no fue exitoso - Cancelado',
'loginlanguagelabel' => 'Idioma: $1',
-'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada debido a que parece que ésta ha sido enviada desde un navegador defectuoso o un proxy caché.',
+'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
# E-mail sending
'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP',
Tu dirección IP se almacenará en el historial de ediciones de la página.",
'anonpreviewwarning' => "''No has iniciado sesión con una cuenta de usuario. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de la página.''",
'missingsummary' => "'''Atención:''' No has escrito un resumen de edición. Si haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
-'missingcommenttext' => 'Por favor introduce texto debajo.',
+'missingcommenttext' => 'Por favor, introduce un texto debajo.',
'missingcommentheader' => "'''Recordatorio:''' No has escrito un título para este comentario. Si haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
'summary-preview' => 'Previsualización del resumen:',
'subject-preview' => 'Previsualización del tema/título:',
'updated' => '(Actualizado)',
'note' => "'''Nota:'''",
'previewnote' => "'''¡Recuerda que esto es solo una previsualización.'''
-¡Tus cambios aún no se ha guardado! [[#editform|→ Continuar editando]]",
+¡Tus cambios aún no se ha guardado!",
+'continue-editing' => 'Continuar editando',
'previewconflict' => 'Esta previsualización refleja el texto en el área de edición superior como aparecerá una vez guardados los cambios.',
'session_fail_preview' => "'''Lo sentimos, no pudimos procesar la edición debido a una pérdida de los datos de sesión.'''
Por favor, inténtalo de nuevo.
El registro de borrados y traslados para la página están provistos debajo como referencia.',
'log-fulllog' => 'Ver el registro completo',
'edit-hook-aborted' => 'Edición cancelada por la extensión.
-No dió explicaciones.',
+No se aportaron explicaciones.',
'edit-gone-missing' => 'No se pudo actualizar la página.
Parece que ha sido borrada.',
'edit-conflict' => 'Conflicto de edición.',
'parser-template-loop-warning' => 'Detectado bucle de plantilla: [[$1]]',
'parser-template-recursion-depth-warning' => 'Se ha excedido el límite de recursión de plantillas ($1)',
'language-converter-depth-warning' => 'El límite de profundidad del convertidor de idioma ha excedido ($1)',
+'node-count-exceeded-category' => 'Páginas donde se supera el número de nodos',
+'node-count-exceeded-warning' => 'Página que ha superado el número de nodos',
+'expansion-depth-exceeded-category' => 'Páginas donde se supera la profundidad de expansión',
+'expansion-depth-exceeded-warning' => 'Página que ha superado la profundidad de expansión',
# "Undo" feature
'undo-success' => 'La edición puede deshacerse. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así deshacer la edición.',
'updated' => '(Värskendatud)',
'note' => "'''Meeldetuletus:'''",
'previewnote' => "'''Ära unusta, et see on kõigest eelvaade!'''
-Sinu muudatused pole veel salvestatud! [[#editform|→ Jätka redigeerimist]]",
+Sinu muudatused pole veel salvestatud!",
+'continue-editing' => 'Jätka redigeerimist',
'previewconflict' => 'See eelvaade näitab, kuidas ülemises toimetuskastis olev tekst hakkab välja nägema, kui otsustate salvestada.',
'session_fail_preview' => "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''
Palun proovi uuesti.
# Suppression log
'suppressionlog' => 'Varjamislogi',
'suppressionlogtext' => 'Allpool on nimekiri kustutamistest ja blokeeringutest, millega kaasneb administraatorite eest sisu varjamine.
-Jõus olevad keelud ja blokeeringud leiad [[Special:BlockList|blokeeritud IP-aadresside loendist]].',
+Jõus olevad keelud ja blokeeringud leiad [[Special:BlockList|blokeerimisnimekirja]].',
# History merging
'mergehistory' => 'Ühenda lehtede ajalood',
'allpages-bad-ns' => '{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimeruumi "$1".',
'allpages-hide-redirects' => 'Peida ümbersuunamised',
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Vaata vahemälus olevat lehekülje versiooni, mis võib olla kuni $1 vanune.',
+'cachedspecial-viewing-cached-ts' => 'Vaatad vahemälus olevat lehekülje versiooni, mis ei pruugi olla täiesti ajakohane.',
+'cachedspecial-refresh-now' => 'Vaata uusimat versiooni.',
+
# Special:Categories
'categories' => 'Kategooriad',
'categoriespagetext' => 'Vikis on {{PLURAL:$1|järgmine kategooria|järgmised kategooriad}}.
'undeletehistorynoadmin' => 'See lehekülg on kustutatud.
Kustutamise põhjus ning selle lehekülje kustutamiseelne redigeerimislugu on näha allolevas kokkuvõttes.
Lehekülje kustutamiseelsed redaktsioonid on kättesaadavad ainult administraatoritele.',
-'undelete-revision' => 'Lehekülje $1 kustutatud redaktsioonid, mille autor on $3, seisuga $4 kell $5.',
+'undelete-revision' => 'Lehekülje $1 kustutatud redaktsioon, mille autor on $3, seisuga $4, kell $5.',
'undeleterevision-missing' => 'Vigane või puuduv redaktsioon.
Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist eemaldatud.',
'undelete-nodiff' => 'Varasemat redaktsiooni ei leidunud.',
'badipaddress' => 'Vigane IP-aadress',
'blockipsuccesssub' => 'Blokeerimine õnnestus',
'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] on blokeeritud.<br />
-Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeeringute loendist]].',
+Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeerimisnimekirjast]].',
'ipb-blockingself' => 'Sa blokeerid iseenda! Kas tahad tõesti seda teha?',
'ipb-confirmhideuser' => 'Avaldasid soovi kasutaja blokeerida ja peita. Kasutaja nimi peidetakse kõigist loenditest ja logisissekannetest. Kas oled kindel, et soovid seda teha?',
'ipb-edit-dropdown' => 'Muuda blokeeringu põhjuseid',
'blocklog-showsuppresslog' => 'See kasutaja on varem blokeeritud ja peidetud. Allpool on toodud varjamislogi:',
'blocklogentry' => 'blokeeris kasutaja [[$1]]. Blokeeringu aegumistähtaeg on $2 $3',
'reblock-logentry' => 'muutis kasutaja või IP-aadressi [[$1]] blokeeringu sätteid. Blokeering aegumistähtaeg: $2. Põhjus: $3',
-'blocklogtext' => 'See on kasutajate blokeerimiste ja blokeeringute eemaldamiste nimekiri. Automaatselt blokeeritud IP aadresse siin ei näidata. Hetkel aktiivsete blokeeringute ja redigeerimiskeeldude nimekirja vaata [[Special:BlockList|IP blokeeringute nimekirja]] leheküljelt.',
+'blocklogtext' => 'See on kasutajate blokeerimiste ja blokeeringute eemaldamiste logi.
+Automaatselt blokeeritud IP-aadresse siin ei näidata.
+Praegu jõus olevad blokeeringud ja redigeerimiskeelud leiad [[Special:BlockList|blokeerimisnimekirjast]].',
'unblocklogentry' => 'eemaldas kasutaja $1 blokeeringu',
'block-log-flags-anononly' => 'ainult anonüümsed kasutajad',
'block-log-flags-nocreate' => 'kontode loomine on blokeeritud',
'version-software' => 'Paigaldatud tarkvara',
'version-software-product' => 'Toode',
'version-software-version' => 'Versioon',
+'version-entrypoints' => 'Sisendpunktide internetiaadressid',
+'version-entrypoints-header-entrypoint' => 'Sisendpunkt',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Failitee',
'api-error-uploaddisabled' => 'Üleslaadimine on selles vikis keelatud.',
'api-error-verification-error' => 'See fail võib olla rikutud või vale laiendiga.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekundi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuti}}',
+'duration-hours' => '$1 {{PLURAL:$1|tunni}}',
+'duration-days' => '$1 {{PLURAL:$1|päeva}}',
+'duration-weeks' => '$1 {{PLURAL:$1|nädala}}',
+'duration-years' => '$1 {{PLURAL:$1|aasta}}',
+'duration-decades' => '$1 {{PLURAL:$1|kümnendi}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sajandi}}',
+'duration-millennia' => '$1 {{PLURAL:$1|aastatuhande}}',
+
);
'updated' => '(بهروز شد)',
'note' => "'''نکته:'''",
'previewnote' => "'''به یاد داشته باشید که این فقط پیشنمایش است.'''
-تغییرات شما هنوز ذخیره نشدهاست! [[#editform|ادامه ویرایش ←]]",
+تغییرات شما هنوز ذخیره نشدهاست!",
+'continue-editing' => 'ادامهٔ ویرایش',
'previewconflict' => 'این پیشنمایش منعکسکنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به شکلی که اگر متن را ذخیره کنید نمایش خواهد یافت.',
'session_fail_preview' => "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمیتوانیم ویرایش شما را پردازش کنیم.'''
لطفاً دوباره سعی کنید.
'logentry-newusers-newusers' => '$1 یک حساب کاربری ایجاد کرد',
'logentry-newusers-create' => '$1 یک حساب کاربری ایجاد کرد',
'logentry-newusers-create2' => '$1 یک حساب کاربری ایجاد کرد $3',
-'logentry-newusers-autocreate' => 'کاروری حساب $1 بساتن به شکل خودکار',
+'logentry-newusers-autocreate' => 'حساب $1 به شکل خودکار ساخته شد',
'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
# Feedback
'customjsprotected' => 'Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
'titleprotected' => "Käyttäjä [[User:$1|$1]] on asettanut tämän sivun luontikieltoon: ''$2''.",
+'filereadonlyerror' => 'Tiedostoa "$1" ei voi muuttaa, koska jaettu mediavarasto "$2" on "vain luku" -tilassa.
+
+Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: "$3".',
# Virus scanner
'virus-badscanner' => "Virheellinen asetus: Tuntematon virustutka: ''$1''",
'emailconfirmlink' => 'Varmenna sähköpostiosoite',
'invalidemailaddress' => 'Sähköpostiosoitetta ei voida hyväksyä, koska se ei ole oikeassa muodossa. Ole hyvä ja anna oikea sähköpostiosoite tai jätä kenttä tyhjäksi.',
'cannotchangeemail' => 'Tunnuksien sähköpostiosoitteita ei voi muuttaa tässä wikissä.',
+'emaildisabled' => 'Tältä sivustolta ei voi lähettää sähköpostia.',
'accountcreated' => 'Käyttäjätunnus luotiin',
'accountcreatedtext' => 'Käyttäjän $1 käyttäjätunnus luotiin.',
'createaccount-title' => 'Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}',
'userinvalidcssjstitle' => "'''Varoitus:''' Tyyliä nimeltä ”$1” ei ole olemassa. Muista, että käyttäjän määrittelemät .css- ja .js-sivut alkavat pienellä alkukirjaimella, esim. {{ns:user}}:Matti Meikäläinen/vector.css eikä {{ns:user}}:Matti Meikäläinen/Vector.css.",
'updated' => '(Päivitetty)',
'note' => "'''Huomautus:'''",
-'previewnote' => "'''Tämä on vasta sivun esikatselu. Sivua ei ole vielä tallennettu!'''",
+'previewnote' => "'''Tämä on vasta sivun esikatselu. Tekemiäsi muokkauksia ei ole vielä tallennettu!'''",
+'continue-editing' => 'Jatka muokkaamista',
'previewconflict' => 'Tämä esikatselu näyttää miltä muokkausalueella oleva teksti näyttää tallennettuna.',
'session_fail_preview' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.''' Yritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään.",
'session_fail_preview_html' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.'''
'token_suffix_mismatch' => "'''Muokkauksesi on hylätty, koska asiakasohjelmasi ei osaa käsitellä välimerkkejä muokkaustarkisteessa. Syynä voi olla viallinen välityspalvelin.'''",
'edit_form_incomplete' => "'''Osa muokkauslomakkeesta ei saavuttanut palvelinta. Tarkista, että muokkauksesi ovat vahingoittumattomia ja yritä uudelleen.'''",
'editing' => 'Muokataan sivua $1',
+'creating' => 'Sivun $1 luonti',
'editingsection' => 'Muokataan osiota sivusta $1',
'editingcomment' => 'Muokataan uutta osiota sivulla $1',
'editconflict' => 'Päällekkäinen muokkaus: $1',
'yourdiff' => 'Eroavaisuudet',
'copyrightwarning' => "'''Muutoksesi astuvat voimaan välittömästi.''' Kaikki {{GRAMMAR:illative|{{SITENAME}}}} tehtävät tuotokset katsotaan julkaistuksi $2 -lisenssin mukaisesti ($1). Jos et halua, että kirjoitustasi muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi. Tallentamalla muutoksesi lupaat, että kirjoitit tekstisi itse, tai kopioit sen jostain vapaasta lähteestä. '''ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!'''",
'copyrightwarning2' => "Huomaa, että kuka tahansa voi muokata, muuttaa ja poistaa kaikkia sivustolle tekemiäsi lisäyksiä ja muutoksia. Muokkaamalla sivustoa luovutat sivuston käyttäjille tämän oikeuden ja takaat, että lisäämäsi aineisto on joko itse kirjoittamaasi tai peräisin jostain vapaasta lähteestä. Lisätietoja sivulla $1. '''TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!'''",
-'longpageerror' => "'''Sivun koko on $1 binäärikilotavua. Sivua ei voida tallentaa, koska enimmäiskoko on $2 binäärikilotavua.'''",
+'longpageerror' => "'''Virhe: Lähettämäsi tekstin pituus on {{PLURAL:$1|kilotavu|$1 kilotavua}}. Tekstiä ei voida tallentaa, koska se on pitempi kuin sallittu enimmäispituus {{PLURAL:$2|yksi kilotavu|$2 kilotavua}}.'''",
'readonlywarning' => "'''Varoitus: Tietokanta on lukittu huoltoa varten, joten et pysty tallentamaan muokkauksiasi juuri nyt.'''
Saattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.
'edit-no-change' => 'Muokkauksesi sivuutettiin, koska tekstiin ei tehty mitään muutoksia.',
'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
Se on jo olemassa.',
+'defaultmessagetext' => 'Viestin oletusteksti',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.
# Suppression log
'suppressionlog' => 'Häivytysloki',
-'suppressionlogtext' => 'Alla on lista uusimmista poistoista ja muokkausestoista, jotka sisältävät ylläpitäjiltä piilotettua materiaalia.
-[[Special:BlockList|Muokkausestolistassa]] on tämänhetkiset muokkausestot.',
+'suppressionlogtext' => 'Alla on luettelo poistoista ja muokkausestoista, jotka sisältävät ylläpitäjiltä piilotettua materiaalia.
+[[Special:BlockList|Estolistassa]] on lueteltu voimassa olevat muokkauskiellot ja muokkausestot.',
# History merging
'mergehistory' => 'Yhdistä muutoshistoriat',
$1 {{int:pipe-separator}} $2',
'searchmenu-legend' => 'Hakuasetukset',
-'searchmenu-exists' => "'''Sivu [[:$1]] löytyy tästä wikistä.'''",
+'searchmenu-exists' => "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähän wikiin.'''",
'searchhelp-url' => 'Help:Sisällys',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Selaa sivuja tällä etuliitteellä]]',
'newsectionsummary' => '/* $1 */ uusi osio',
'rc-enhanced-expand' => 'Näytä yksityiskohdat (JavaScript)',
'rc-enhanced-hide' => 'Piilota yksityiskohdat',
+'rc-old-title' => 'alun perin luotu nimellä "$1"',
# Recent changes linked
'recentchangeslinked' => 'Linkitettyjen sivujen muutokset',
'backend-fail-closetemp' => 'Väliaikaista tiedostoa ei voitu sulkea.',
'backend-fail-read' => 'Tiedostoa $1 ei voitu lukea.',
'backend-fail-create' => 'Tiedostoa $1 ei voitu luoda.',
+'backend-fail-connect' => 'Varastojärjestelmään "$1" ei saada yhteyttä.',
# Lock manager
'lockmanager-notlocked' => 'Kohteen $1 lukitusta ei voitu poistaa, koska se ei ole lukittu.',
Katso [$2 tiedoston kuvaussivulta] lisätietoja.',
'sharedupload-desc-here' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä.
Tiedot [$2 tiedoston kuvaussivulta] näkyvät alla.',
+'sharedupload-desc-edit' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä.
+Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
+'sharedupload-desc-create' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä.
+Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
'filepage-nofile' => 'Tämän nimistä tiedostoa ei ole olemassa.',
'filepage-nofile-link' => 'Tämän nimistä tiedostoa ei ole olemassa, mutta voit [$1 tallentaa sen].',
'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
'wantedpages' => 'Halutut sivut',
'wantedpages-badtitle' => 'Virheellinen otsikko tuloksissa: $1',
'wantedfiles' => 'Halutut tiedostot',
+'wantedfiletext-cat' => 'Seuraavia tiedostoja käytetään, mutta niitä ei ole olemassa. Ulkopuolissa mediavarastoissa olevat tiedostot voivat näkyä tällä listalla, vaikka ne ovat olemassa. Tällaiset väärät merkinnät on <del>yliviivattu</del>. Lisäksi sellaiset sivut, joihin on sisällytetty tiedostoja, jotka eivät ole olemassa, on luetteloitu [[:$1|täällä]].',
+'wantedfiletext-nocat' => 'Seuraavia tiedostoja käytetään, mutta niitä ei ole olemassa. Ulkopuolissa mediavarastoissa olevat tiedostot voivat näkyä tällä listalla, vaikka ne ovat olemassa. Tällaiset väärät merkinnät on <del>yliviivattu</del.>',
'wantedtemplates' => 'Halutut mallineet',
'mostlinked' => 'Viitatuimmat sivut',
'mostlinkedcategories' => 'Viitatuimmat luokat',
'allpagesprefix' => 'Katkaisuhaku',
'allpagesbadtitle' => 'Annettu otsikko oli kelvoton tai siinä oli wikien välinen etuliite.',
'allpages-bad-ns' => '{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimiavaruutta ”$1”.',
+'allpages-hide-redirects' => 'Piilota ohjaussivut',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Katselet arkistoitua versiota tästä sivusta, joka voi olla jopa $1 vanha.',
+'cachedspecial-viewing-cached-ts' => 'Katselet arkistoitua versiota tästä sivusta, joka ei välttämättä ole sivun viimeisin versio.',
+'cachedspecial-refresh-now' => 'Näytä uusin versio.',
# Special:Categories
'categories' => 'Luokat',
'watchnochange' => 'Valittuna ajanjaksona yhtäkään tarkkailemistasi sivuista ei muokattu.',
'watchlist-details' => 'Tarkkailulistalla on {{PLURAL:$1|$1 sivu|$1 sivua}} keskustelusivuja mukaan laskematta.',
'wlheader-enotif' => '* Sähköposti-ilmoitukset ovat käytössä.',
-'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen on '''lihavoitu'''.",
+'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
'watchmethod-recent' => 'tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille',
'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
-'cannotundelete' => 'Palauttaminen epäonnistui.',
+'cannotundelete' => 'Palauttaminen epäonnistui; joku muu on voinut jo palauttaa sivun.',
'undeletedpage' => "'''$1 on palautettu.'''
[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
'badipaddress' => 'IP-osoite on väärin muotoiltu.',
'blockipsuccesssub' => 'Esto onnistui',
'blockipsuccesstext' => 'Käyttäjä tai IP-osoite [[Special:Contributions/$1|$1]] on estetty.<br />
-Nykyiset estot löytyvät [[Special:BlockList|estolistalta]].',
+Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
'ipb-blockingself' => 'Olet estämässä itseäsi. Oletko varma, että haluat tehdä niin?',
'ipb-confirmhideuser' => 'Olet estämässä käyttäjää ”piilota käyttäjä” -toiminnon kanssa. Tämä piilottaa käyttäjän nimen kaikissa luetteloissa ja lokitapahtumissa. Oletko varma, että haluat tehdä näin?',
'ipb-edit-dropdown' => 'Muokkaa estosyitä',
Alla on ote häivytyslokista.',
'blocklogentry' => 'esti käyttäjän tai IP-osoitteen [[$1]]. Eston kesto $2 $3',
'reblock-logentry' => 'muutti käyttäjän tai IP-osoitteen [[$1]] eston asetuksia. Eston kesto $2 $3',
-'blocklogtext' => 'Tämä on loki muokkausestoista ja niiden purkamisista. Automaattisesti estettyjä IP-osoitteita ei kirjata. Tutustu [[Special:BlockList|estolistaan]] nähdäksesi listan tällä hetkellä voimassa olevista estoista.',
+'blocklogtext' => 'Tämä on loki muokkausestoista ja niiden purkamisista. Automaattisesti estettyjä IP-osoitteita ei kirjata. Tutustu [[Special:BlockList|estolistaan]] nähdäksesi luettelon tällä hetkellä voimassa olevista estoista.',
'unblocklogentry' => 'poisti käyttäjältä $1 muokkauseston',
'block-log-flags-anononly' => 'vain kirjautumattomat käyttäjät estetty',
'block-log-flags-nocreate' => 'tunnusten luonti estetty',
# JavaScriptTest
'javascripttest' => 'JavaScriptin testaus',
-'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä.',
+'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä tässä wikissä.',
'javascripttest-title' => 'Suoritetaan $1-testejä.',
'javascripttest-pagetext-noframework' => 'Tämä sivu on varattu JavaScript-testien suorittamiseen.',
'javascripttest-pagetext-unknownframework' => 'Tuntematon testausalusta $1.',
'version-software' => 'Asennettu ohjelmisto',
'version-software-product' => 'Tuote',
'version-software-version' => 'Versio',
+'version-entrypoints' => 'Aloituskohtien URL-osoitteet',
+'version-entrypoints-header-entrypoint' => 'Aloituskohta',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Tiedoston osoite',
'api-error-duplicate-archive-popup-title' => 'Tiedostolla on {{PLURAL:$1|poistettu kaksoiskappale|poistettuja kaksoiskappaleita}}',
'api-error-duplicate-popup-title' => 'Tiedoston {{PLURAL:$1|kaksoiskappale|kaksoiskappaleet}}',
'api-error-empty-file' => 'Määrittämäsi tiedosto on tyhjä.',
+'api-error-emptypage' => 'Ei ole sallittua luoda uutta, tyhjää sivua.',
'api-error-fetchfileerror' => 'Sisäinen virhe: jotakin meni pieleen tiedoston haussa.',
'api-error-file-too-large' => 'Määrittämäsi tiedosto on liian iso.',
'api-error-filename-tooshort' => 'Tiedoston nimi on liian lyhyt.',
'api-error-uploaddisabled' => 'Tiedostojen tallentaminen ei ole käytössä.',
'api-error-verification-error' => 'Tiedosto voi olla vioittunut, tai sillä saattaa olla väärä tiedostopääte.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuutti|minuuttia}}',
+'duration-hours' => '$1 {{PLURAL:$1|tunti|tuntia}}',
+'duration-days' => '$1 {{PLURAL:$1|päivä|päivää}}',
+'duration-weeks' => '$1 {{PLURAL:$1|viikko|viikkoa}}',
+'duration-years' => '$1 {{PLURAL:$1|vuosi|vuotta}}',
+'duration-decades' => '$1 {{PLURAL:$1|vuosikymmen|vuosikymmentä}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vuosisata|vuosisataa}}',
+'duration-millennia' => '$1 {{PLURAL:$1|vuosituhat|vuosituhatta}}',
+
);
'updated' => '(Mis à jour)',
'note' => "'''Note :'''",
'previewnote' => "'''Rappelez-vous que ce n’est qu’une prévisualisation.'''
-Vos modifications n’ont pas encore été enregistrées ! [[#editform|→ Continuer la modification]]",
+Vos modifications n’ont pas encore été enregistrées !",
+'continue-editing' => 'Continuer la modification',
'previewconflict' => 'Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.',
'session_fail_preview' => "'''Nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.'''
Veuillez réessayer.
'parser-template-loop-warning' => 'Modèle en boucle détecté : [[$1]]',
'parser-template-recursion-depth-warning' => 'Limite de profondeur des appels de modèles dépassée ($1)',
'language-converter-depth-warning' => 'Limite de profondeur du convertisseur de langue dépassée ($1)',
+'node-count-exceeded-category' => 'Pages où nombre de nœuds est dépassé',
+'node-count-exceeded-warning' => 'Page dépassant le nombre de nœuds',
+'expansion-depth-exceeded-category' => "Pages où la profondeur d'expansion est dépassée",
+'expansion-depth-exceeded-warning' => "Page dépassant la profondeur d'expansion",
# "Undo" feature
'undo-success' => 'Cette modification va être défaite. Veuillez vérifier les modifications ci-dessous, puis publier si c’est bien ce que vous voulez faire.',
no <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span>.',
'updated' => '(Air ùrachadh)',
'previewnote' => "'''Cuimhnich nach eil ann ach ro-shealladh.'''
-Cha deach na mùthaidhean agad a shàbhaladh fhathast! [[#editform|→ Lean ort a' deasachadh]]",
+Cha deach na mùthaidhean agad a shàbhaladh fhathast!",
'editing' => "A' deasachadh $1",
'editingsection' => "A' deasachadh $1 (earrann)",
'editconflict' => 'Còmhstri deasachaidh: $1',
Lembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo {{ns:user}}:Foo/vector.css no canto de {{ns:user}}:Foo/Vector.css.",
'updated' => '(Actualizado)',
'note' => "'''Nota:'''",
-'previewnote' => "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!''' [[#editform|→ Continuar editando]]",
+'previewnote' => "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
+'continue-editing' => 'Continuar editando',
'previewconflict' => 'Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.',
'session_fail_preview' => "'''O sistema non pode procesar a súa edición porque se perderon os datos de inicio da sesión.
Por favor, inténteo de novo.
# Suppression log
'suppressionlog' => 'Rexistro de supresións',
'suppressionlogtext' => 'A continuación móstrase unha lista coas eliminacións e cos bloqueos recentes, que inclúen contido oculto dos administradores.
-Vexa a [[Special:BlockList|lista de enderezos IP bloqueados]] para comprobar as prohibicións e os bloqueos vixentes.',
+Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixentes.',
# History merging
'mergehistory' => 'Fusionar os historiais das páxinas',
'filedelete-otherreason' => 'Outro motivo:',
'filedelete-reason-otherlist' => 'Outro motivo',
'filedelete-reason-dropdown' => '*Motivos frecuentes para borrar
-** Violación dos dereitos de autor
+** Violación dos dereitos de autoría
** Ficheiro duplicado',
'filedelete-edit-reasonlist' => 'Editar os motivos de borrado',
'filedelete-maintenance' => 'Os borrados e restauracións de ficheiros están desactivados temporalmente durante o mantemento.',
'deleteotherreason' => 'Outro motivo:',
'deletereasonotherlist' => 'Outro motivo',
'deletereason-dropdown' => '*Motivos frecuentes para borrar
-** Solicitado polo autor
-** Violación dos dereitos de autor
+** Solicitado pola persoa que o creou
+** Violación dos dereitos de autoría
** Vandalismo',
'delete-edit-reasonlist' => 'Editar os motivos de borrado',
'delete-toobig' => 'Esta páxina conta cun historial longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.
'ipb-confirm' => 'Confirmar o bloqueo',
'badipaddress' => 'O enderezo IP non é válido',
'blockipsuccesssub' => 'Bloqueo exitoso',
-'blockipsuccesstext' => 'O enderezo IP [[Special:Contributions/$1|$1]] foi bloqueado.<br />
-Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] para revisalo.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
+Olle a [[Special:BlockList|lista de bloqueos]] para revisalo.',
'ipb-blockingself' => 'Está a piques de se bloquear! Está seguro de querer facelo?',
'ipb-confirmhideuser' => 'Está a piques de bloquear un usuario coa opción "agochar o usuario" activada. Isto suprime o nome de usuario de todas as listas e entradas de rexistro. Está seguro de querer facelo?',
'ipb-edit-dropdown' => 'Editar os motivos de bloqueo',
'reblock-logentry' => 'cambiou as configuracións do bloqueo de "[[$1]]" cunha caducidade de $2 $3',
'blocklogtext' => 'Este é o rexistro das accións de bloqueo e desbloqueo de usuarios.
Non se listan os enderezos IP bloqueados automaticamente.
-Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] se quere comprobar a lista cos bloqueos vixentes.',
+Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixentes.',
'unblocklogentry' => 'desbloqueou a "$1"',
'block-log-flags-anononly' => 'só os usuarios anónimos',
'block-log-flags-nocreate' => 'desactivada a creación de contas',
'version-software' => 'Software instalado',
'version-software-product' => 'Produto',
'version-software-version' => 'Versión',
+'version-entrypoints' => 'Enderezos URL de punto de entrada',
+'version-entrypoints-header-entrypoint' => 'Punto de entrada',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta do artigo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta da escritura]',
# Special:FilePath
'filepath' => 'Ruta do ficheiro',
'noindex-category' => 'Syte wu nit verzeichnet sin',
'broken-file-category' => 'Syte mit kaputtige Dateilink',
-'about' => 'Über',
+'about' => 'Iber',
'article' => 'Inhaltssyte',
'newwindow' => '(imene nöie Fänschter)',
'cancel' => 'Abbräche',
'create' => 'Erstelle',
'editthispage' => 'Syte bearbeite',
'create-this-page' => 'Die Syte afange',
-'delete' => 'Lösche',
+'delete' => 'Lesche',
'deletethispage' => 'Syte lösche',
'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versione}} widerherstelle',
'viewdeleted_short' => '{{PLURAL:$1|ei gleschti Änderig|$1 gleschti Ändrige}} aaluege',
'internalerror_info' => 'Interne Fähler: $1',
'fileappenderrorread' => '„$1“ het nit chenne gläse wäre bim Aahänke.',
'fileappenderror' => 'Het „$1“ nit an „$2“ chenne anhänke.',
-'filecopyerror' => 'Datei "$1" het nit noch "$2" kopiert werre kinne.',
+'filecopyerror' => 'D Datei $1 het nit no $2 chenne kopiert wäre.',
'filerenameerror' => 'D Datei "$1" het nit in "$2" umgnennt werre kinne.',
'filedeleteerror' => 'Datei "$1" het nit glöscht werre kinne.',
'directorycreateerror' => 'S Verzeichnis „$1“ het nit chenne aaglait wäre.',
'formerror' => 'Fähler: Ds Formular het nid chönne verarbeitet wärde',
'badarticleerror' => 'D Aktion konn uf denne Artikel nit ongwendet werre.',
'cannotdelete' => 'D Syte oder d Datei „$1“ cha nit glescht wäre. Si isch villicht scho vu eber anderem glescht wore.',
+'cannotdelete-title' => 'Syte „$1“ cha nit glescht wäre',
'badtitle' => 'Ugültiger Titel',
'badtitletext' => 'Dr Titel vu dr agforderte Syte isch nit giltig gsi, leer, oder e nit giltig Sprochgleich vun eme andre Wiki.',
-'perfcached' => 'Die Informatione chömme us em Zwüschespeicher un sin derwiil villicht nid aktuell. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.
-----',
-'perfcachedts' => 'Die Date stamme us em Cache un sin am $1 s letscht Mol aktualisiert wore. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Die Informatione chemme us em Zwischespycher un sin derwyl villicht nit aktuäll. Maximal {{PLURAL:$1|ei Ergebnis isch|$1 Ergebnis sin}} im Cache verfiegbar.',
+'perfcachedts' => 'Die Date stamme us em Zwischespycher un sin am $1 s letscht Mol aktualisiert wore. Maximal {{PLURAL:$4|ei Ergebnis isch|$4 Ergebnis sin}} im Zwischespycher verfiegbar.',
'querypage-no-updates' => "'''D Aktualisierigsfunktion fir die Syte isch im Momänt deaktiviert. D Date wäre vorerscht nit ernejert.'''",
'wrong_wfQuery_params' => 'Falschi Parameter fir wfQuery()<br />
Funktion: $1<br />
Abfrog: $2',
'viewsource' => 'Quelltext aaluege',
+'viewsource-title' => 'Quälltext vu $1 aaluege',
'actionthrottled' => 'Aktionsaazahl limitiert',
'actionthrottledtext' => 'As Schutz vor Spam cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.',
'protectedpagetext' => 'Die Syte isch fir s Bearbeite gsperrt.',
'viewsourcetext' => 'Quelltext vo dere Syte:',
+'viewyourtext' => "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
'protectedinterface' => 'In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.',
'editinginterface' => "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
'sqlhidden' => '(SQL-Abfrog verschteckt)',
'ns-specialprotected' => 'Spezialsyte chenne nid bearbeitet wäre.',
'titleprotected' => "E Syte mit däm Name cha nid aaglait wäre.
Die Sperri isch dur [[User:$1|$1]] yygrichtet wore mit dr Begrindig ''„$2“''.",
+'filereadonlyerror' => 'D Datei „$1“ cha nit gänderet wäre, wel uf s Dateirepositorium „$2“ nume Läsezuegriff megli isch.
+
+Dr Administrator, wu dr Schrybzuegriff gsperrt het, het dää Grund aagee: „$3“.',
# Virus scanner
'virus-badscanner' => "Fählerhafti Konfiguration: Virescanner, wu nid bekannt isch: ''$1''",
'invalidemailaddress' => 'Diä E-Mail-Adress isch nit akzeptiert worre, wil s ä ugültigs Format ghet het.
Bitte gib ä neiji Adress in nem gültige Format ii, odr tue s Feld leere.',
'cannotchangeemail' => 'E-Mail-Adrässe chönne in däm Wiki nit gänderet werde.',
+'emaildisabled' => 'Iber die Websyte chenne kei E-Mail verschickt wäre.',
'accountcreated' => 'S Benutzerkonto isch aagleit wore.',
'accountcreatedtext' => 'S Benutzerkonto $1 isch aagleit wore.',
'createaccount-title' => 'Aalege vum e Benutzerkonto fir {{SITENAME}}',
Du chasch d „E-Mail an dää Benutzer“-Funktion nit bruche, solang kei giltigi E-Mail-Adräss in Dyyne [[Special:Preferences|Benutzerkonto-Yystellige]] yydrait isch, oder solang die Funktion fir Di gsperrt isch.
Dyy aktuälli IP-Adräss isch $3, un d Sperr-ID isch #$5.
Bitte fieg in jedi Aafrog, wu du stellsch, alli Information yy.",
-'autoblockedtext' => 'Dyyni IP-Adräss isch automatisch gsperrt wore, wel si vu me andere Benutzer brucht woren isch, wu dur $1 gsperrt woren isch.
+'autoblockedtext' => "Dyyni IP-Adräss isch automatisch gsperrt wore, wel si vu me andere Benutzer brucht woren isch, wu dur $1 gsperrt woren isch.
As Grund isch aagee wore:
-:\'\'$2\'\' (<span class="plainlinks">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 Logbucheintrag]</span>)
+:''$2''
-<p style="border-style: solid; border-color: red; border-width: 1px; padding:5px;"><b>E Zuegriff zum Läse isch alno megli,</b>
-nume d Bearbeitig un s Aalege vu Syte in {{SITENAME}} isch gsperrt wore.
-Wänn die Nochricht aazeigt wird, au wänn Du nume zum Läse zuegriffe hesch, bisch eme (rote) Link uf e Syte noogange, wu s nonig git.</p>
+* Aafang vu dr Sperri: $8
+* Änd vu dr Sperri: $6
+* Sperre betrifft: $7
Du chasch $1 oder ein vu dr andre [[{{MediaWiki:Grouppage-sysop}}|Ammanne]] kontaktiere, zum iber die Sperri z diskutiere.
-<div style="border-style: solid; border-color: red; border-width: 1px; padding:5px;">
-\'\'\'Bitte gib in jedere Aafrog die Date aa:\'\'\'
-*Ammann, wu gsperrt het: $1
-*Sperrgrund: $2
-*Aafang vu dr Sperri: $8
-*Sperr-Änd: $6
-*IP-Adräss: $3
-*Sperri betrifft: $7
-*Sperr-ID: #$5
-</div>',
+Du chasch d „E-Mail an dää Benutzer“-Funktion nit nutze, solange kei giltigi E-Mail-Adräss in Dyne [[Special:Preferences|Benutzerkonto-Yystellige]] yytrait isch oder die Funktion fir di gsperrt woren isch.
+
+Dyy aktuäll IP-Adräss isch $3, un d Sperr-ID isch $5.
+Bitte fieg alli Informatione jedere Aafrog zue, wu Du stellsch.",
'blockednoreason' => 'kei Begrindig aagee',
'whitelistedittext' => 'Du muesch Di $1 zum Artikel bearbeite.',
'confirmedittext' => 'Si mien Ihri E-Mail-Adräss zerscht bstätige, voreb Si Syte chenne ändere. Bitte setze Si in [[Special:Preferences|Ihre Iistellige]] Ihri E-Mail-Adräss yy un len Si si priefe.',
'userinvalidcssjstitle' => "'''Achtig:''' D Skin „$1“ git s nid. Dänk dra, ass benutzerspezifischi .css- und .js-Syte mit eme Chleibuechstabe mien aafange, also z B. ''{{ns:user}}:Mustermann/vector.css'' statt ''{{ns:user}}:Mustermann/Vector.css''.",
'updated' => '(Gänderet)',
'note' => "'''Obacht: '''",
-'previewnote' => "'''Das isch numen e Vorschau und nonig gspycheret!'''",
+'previewnote' => "'''Das isch numen e Vorschau und nonig gspycheret!'''
+Die Syte isch nonig gspycheret wore!",
'previewconflict' => 'Die Vorschau zeigt dr Inhalt vum obere Täxtfäld. Eso siht dr Artikel us, wän Du jetz uf Spychere drucksch.',
'session_fail_preview' => "'''Dyyni Bearbeitig het nid chenne gspycheret wäre, wel Sitzigsdate verlore gange sin.
Bitte versuech s nomol. Derzue drucksch unter däre Täxtvorschau nomol uf „Syte spychere“.
S Spichere cha dr Inhalt vu dr Syte hii mache. Des git s e mänkmol, wänn eber e anonyme Proxy-Dienscht brucht, wu Fähler macht.'''",
'edit_form_incomplete' => "'''Dr Inhalt vum Bearbeitigsformular isch nit vollständig zum Server chuu. Bitte prief Dyy Bearbeitigen uf Vollständigkeit un versuech s nomol.'''",
'editing' => 'Bearbeite vo «$1»',
+'creating' => 'Am Aalege vu „$1“',
'editingsection' => 'Bearbeite vo «$1» (Absatz)',
'editingcomment' => 'Bearbeite vu $1 (Neje Abschnitt)',
'editconflict' => 'Bearbeitigs-Konflikt: «$1»',
'copyrightwarning2' => "Dängge Si dra, dass alli Änderige {{GRAMMAR:dativ {{SITENAME}}}} vo andere Benutzer wider gänderet oder glöscht chönne wärde. Wenn Si nit wänn, dass ander Lüt an Ihrem Tekscht ummedoktere denn schicke Si ihn jetz nit ab.<br />
Si verspräche uns usserdäm, dass Si des alles selber gschribe oder vo nere Quälle kopiert hen, wo Public Domain odr sunscht frei isch (lueg $1 für Details).
'''SETZE SI DO OHNI ERLAUBNIS KEINI URHEBERRÄCHTLICH GSCHÜTZTI WÄRK INE!'''",
-'longpageerror' => "'''Fähler: Dä Täxt, wu Du spichere wit, isch $1 KB gross. Des isch gresser wie s erlaubt Maximum vu $2 KB – s Spichere isch nid megli.'''",
+'longpageerror' => "'''Fähler: Dä Täxt, wu Du spychere wit, isch {{PLURAL:$1|ei Kilobyte|$1 Kilobyte}} groß. Des isch greßer wie s erlaubt Maximum vu {{PLURAL:$2|eim Kilobyte|$2 Kilobyte}}.''' S Spychere isch nit megli.",
'readonlywarning' => "'''Achtung: Die Datebank isch fir Wartigsarbete gesperrt. Wäge däm chenne Dyyni Änderige im Momänt nid gspicheret wäre.
Sichere de Täxt bitte lokal uf Dyynem Computer un versuech speter nomol, d Änderige z ibertrage.'''
'edit-conflict' => 'Bearbeitigskonflikt.',
'edit-no-change' => 'Dyyni Bearbeitig isch ignoriert wore, wel kei Änderig am Täxt gmacht woren isch.',
'edit-already-exists' => 'Di nej Syte het nid chenne aaglait wäre, wel s si scho git.',
+'defaultmessagetext' => 'Standardtext',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Achtig: In däre Syte het s z vyyl Ufruef vu ufwändige Parserfunktione.
'prefs-rc' => 'Letschti Änderige',
'prefs-watchlist' => 'Beobachtigslischte',
'prefs-watchlist-days' => 'Aazahl vu dr Täg, wu d Beobchtigslischt standardmässig soll umfasse:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Maximal {{PLURAL:$1|ei Tag|$1 Täg}}',
'prefs-watchlist-edits' => 'Maximali Zahl vu dr Yyträg:',
'prefs-watchlist-edits-max' => 'Maximali Aazahl: 1000',
'prefs-watchlist-token' => 'Beobachtigslischte-Chännzeiche:',
'action-suppressionlog' => 's privat Logbuech aazluege',
'action-block' => 'dä Benutzer z sperre',
'action-protect' => 'dr Schutzstatus vu Syte z ändere',
+'action-rollback' => 'd Änderige vum letschte Bearbeiter vun ere bstimmte Syte schnäll zruckzsetze',
'action-import' => 'Syte us eme andere Wiki z importiere',
'action-importupload' => 'Syte z importiere iber s Uffelade vun ere Datei',
'action-patrol' => 'd Bearbeitige vu andere Benutzer as kontrolliert z markiere',
'action-userrights' => 'Benutzerrächt z ändere',
'action-userrights-interwiki' => 'd Rächt vu Benutzer in andere Wiki z ändere',
'action-siteadmin' => 'd Datebank z sperre oder frejzgee',
+'action-sendemail' => 'E-Mail z schicke',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|Änderig|Änderige}}',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]',
'rc_categories' => 'Nume Syten us dr Kategorie (trennt mit „|“):',
'rc_categories_any' => 'Alli',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig',
'newsectionsummary' => 'Neje Abschnitt /* $1 */',
'rc-enhanced-expand' => 'Detail aazeige (brucht JavaScript)',
'rc-enhanced-hide' => 'Detail verstecke',
+'rc-old-title' => 'urspringlig aaglait as „$1“',
# Recent changes linked
'recentchangeslinked' => 'Verlinktes prüefe',
'illegal-filename' => 'Dr Dateiname isch nit erlaubt.',
'overwrite' => 'S Iberschryybe vun ere Datei, wu s scho git, isch nit erlaubt.',
'unknown-error' => 'S het e nit bekannte Fähler gee.',
-'tmp-create-error' => 'E tämporäri Datei het nit chenne aagleit.',
+'tmp-create-error' => 'E tämporäri Datei het nit chenne aagleit wäre.',
'tmp-write-error' => 'Fähler bim Schryybe vu dr tämporäre Datei',
'large-file' => 'D Dateigressi sott, wänn s goht, nit gresser syy wie $1. Die Datei isch $2 gross.',
'largefileserver' => 'Die Datei isch gresser wie die vum Server yygstellti Maximalgressi.',
'upload-too-many-redirects' => 'In dr URL het s zvyl Wyterleitige',
'upload-unknown-size' => 'Nit bekannti Greßi',
'upload-http-error' => 'E HTTP-Fähler isch ufträtte: $1',
+'upload-copy-upload-invalid-domain' => 'As Kopi uffeladbari Dateie sin iber die Domain nit verfiegbar.',
+
+# File backend
+'backend-fail-stream' => 'D Datei $1 het nit chenne ibertrait wäre.',
+'backend-fail-backup' => 'D Datei $1 het nit chenne gsicheret wäre.',
+'backend-fail-notexists' => 'D Datei $1 git s nit.',
+'backend-fail-hashes' => 'D Streiwärt vu dr Datei hän nit zum Verglych chenne abgruefe wäre.',
+'backend-fail-notsame' => 'S git scho ne Datei $1, wu nit idäntisch isch.',
+'backend-fail-invalidpath' => '$1 isch kei giltige Pfad zum Spychere.',
+'backend-fail-delete' => 'D Datei $1 het nit glöscht werre kinne.',
+'backend-fail-alreadyexists' => 'D Datei „$1“ git s scho.',
+'backend-fail-store' => 'D Datei $1 het nit chenne unter em Name $2 gspycheret wäre.',
+'backend-fail-copy' => 'D Datei $1 het nit no $2 chenne kopiert wäre.',
+'backend-fail-move' => 'D Datei $1 het nit no $2 chenne verschobe wäre.',
+'backend-fail-opentemp' => 'Di temporär Datei het nit chenne ufgmacht wäre.',
+'backend-fail-writetemp' => 'Di temporär Datei het nit chenne gschribe wäre.',
+'backend-fail-closetemp' => 'Di temporär Datei het nit chenne zuegmacht wäre.',
+'backend-fail-read' => 'D Datei $1 het nit chenne gläse wäre.',
+'backend-fail-create' => 'D Datei $1 het nit chenne aagleit wäre.',
+'backend-fail-maxsize' => 'D Datei $1 het nit chenne aalgeit wäre, wel si greßer isch wie {{PLURAL:$2|ei Byte|$2 Byte}}.',
+'backend-fail-readonly' => 'S Spycher-Backend „$1“ isch zurzyt im Läsemodus. Dr Grund, wu aagee isch, isch: „$2“',
+'backend-fail-synced' => 'D Datei „$1“ isch im intärne Spycher-Backend in eme inkonsischtänte Zuestand.',
+'backend-fail-connect' => 'S het kei Verbindig chenne härgstellt wäre zum Spycher-Backend „$1“.',
+'backend-fail-internal' => 'Im Spycher-Backend „$1“ isch e nit bekannte Fähler ufträtte.',
+'backend-fail-contenttype' => 'Dr Inhaltstyp vu dr Datei, wu im Pfad „$1“ gspycheret soll wäre, het nit chenne bstimmt wäre.',
+'backend-fail-batchsize' => 'E Bygiverarbeitigsdatei, wu s {{PLURAL:$1|ei Operation|$1 Operatione}} din het, isch an s Spycher-Backend gschickt wore. D Gränz lyt aber bi {{PLURAL:$2|eire Operation|$2 Operatione}}.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'S het kei Verbindig chenne härgstellt würe zue dr Journaldatebank vum Spycher-Backend „$1“.',
+'filejournal-fail-dbquery' => 'D Journaldatebank vum Spycher-Backend „$1“ het nit chenne aktualisiert wäre.',
+
+# Lock manager
+'lockmanager-notlocked' => '„$1“ het nit chenne entsperrt wäre, wel s kei Sperrig git.',
+'lockmanager-fail-closelock' => 'D Sperrdatei fir „$1“ het nit chenne zuegmacht wäre.',
+'lockmanager-fail-deletelock' => 'D Sperrdatei fir „$1“ het nit chenne glescht wäre.',
+'lockmanager-fail-acquirelock' => 'D Sperri fir „$1“ het nit chenne abgruefe wäre.',
+'lockmanager-fail-openlock' => 'D Sperrdatei fir „$1“ het nit chenne ufgmacht wäre.',
+'lockmanager-fail-releaselock' => 'D Sperri fir „$1“ het nit chenne frejgee wäre.',
+'lockmanager-fail-db-bucket' => 'Mit em Sammelabruef $1 hän nit gnue Verbindige zue Sperrdatebanke chenne härgstellt wäre.',
+'lockmanager-fail-db-release' => 'D Sperrine uf dr Datebank $1 hän nit chenne frejgee wäre.',
+'lockmanager-fail-svr-release' => 'D Sperrine uf em Server $1 hän nit chenne frejgee wäre.',
# ZipDirectoryReader
'zip-file-open-error' => 'S het e Fähler gee bim Ufmache vu dr Datei fir d ZIP-Iberpriefig.',
'uploadstash-badtoken' => 'S Uuseneh vu dr vorab gspycherete Dateien isch fählgschlaa, villicht wel d Sitzigsdaten abglofe sin. Bitte versuech s nomol.',
'uploadstash-errclear' => 'S Uuseneh vu dr vorab gspycherete Dateie isch fählgschlaa.',
'uploadstash-refresh' => 'Lischt vu dr Dateie aktualisiere',
+'invalid-chunk-offset' => 'Nit giltige Startpunkt',
# img_auth script messages
'img-auth-accessdenied' => 'Zuegriff verweigeret',
'sharedupload' => 'Die Datei isch vu $1. S cha syy, ass si vu andere Projekt brucht wird.',
'sharedupload-desc-there' => 'Die Datei isch vu $1 un derf vu andere Projäkt bruucht wäre. Lueg uf dr [$2 Dateibschryybigssyte] no wytere Informatione.',
'sharedupload-desc-here' => 'Die Datei isch vu $1 un derf vu andere Projäkt bruucht wäre. D Bschryybig vu dr [$2 Dateibschryybigssyte] wird unten aazeigt.',
+'sharedupload-desc-edit' => 'Die Datei stammt us $1 un cha uf andere Projäkt brucht wäre.
+Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
+'sharedupload-desc-create' => 'Die Datei stammt us $1 un cha uf andere Projäkt brucht wäre.
+Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
'filepage-nofile' => 'S git kei Datei mit däm Name.',
'filepage-nofile-link' => 'S git no kei Datei mit däm Name, aber Du chasch [$1 si ufelade].',
'uploadnewversion-linktext' => 'E nöui Version vo dere Datei ufelade',
** Duplikat',
'filedelete-edit-reasonlist' => 'Leschgrind bearbeite',
'filedelete-maintenance' => 'S Leschen un Widerhärstelle vu Dateie isch wäge Wartigsarbete e Zytlang deaktiviert.',
+'filedelete-maintenance-title' => 'D Datei cha nit glescht wäre.',
# MIME search
'mimesearch' => 'MIME-Suechi',
'statistics-users-active-desc' => 'Benutzer mit Bearbeitige {{PLURAL:$1|in dr letschte 24 Stund|in dr letschte $1 Täg}}',
'statistics-mostpopular' => 'Am meischte aagluegti Syte',
-'disambiguations' => 'Begriffsklärigssytene',
+'disambiguations' => 'Syte, wu uf Begriffsklärigssyte verlinke',
'disambiguationspage' => 'Template:Begriffsklärig',
'disambiguations-text' => 'Die Syte verwyyse uf e Begriffsklärigs-Syte. Sie sotte aber besser uf d Syte verwyyse, wu eigetli gmeint sin.<br />E Syte wird as Begriffsklärigs-Syte behandlet, wänn [[MediaWiki:Disambiguationspage]] uf si verwyyst.<br />Link us Namensryym wäre do nit ufglischtet.',
'wantedpages' => 'Artikel, wo fähle',
'wantedpages-badtitle' => 'Nit giltige Titel im Ergebnis: $1',
'wantedfiles' => 'Dateie, wu fähle',
+'wantedfiletext-cat' => 'Die Dateie wäre brucht, s git si aber nit. Dateie us främde Repositorie chenne einewäg do ufglischtet syy un wäre <del>durgstriche</del> dargstellt. Zuesätzli wäre Syte, wu s die nit vorhande Datei dinne het, in d [[:$1]] yygordnet.',
+'wantedfiletext-nocat' => 'Die Dateie wäre brucht, s git si aber nit. Vorhandeni Dateie us främde Repositorie chenne dp einewäg ufglischtet syy un wäre <del>durgstriche</del> dargstellt.',
'wantedtemplates' => 'Vorlage, wu fähle',
'mostlinked' => 'Syte, wo am meischte druff verwyyse wird',
'mostlinkedcategories' => 'Am meischte verlinkti Kategorië',
'mostimages' => 'Am meischte verlinkti Dateie',
'mostrevisions' => 'Syte mit de meischte Bearbeitige',
'prefixindex' => 'Alli Syte (mit Präfix)',
+'prefixindex-namespace' => 'Alli Syte mit Präfix (Nameruum $1)',
'shortpages' => 'Churzi Artikel',
'longpages' => 'Langi Artikel',
'deadendpages' => 'Artikel ohni Links («Sackgasse»)',
'booksources-invalid-isbn' => 'D ISBN isch schyyns falsch. Lueg no Fähler in dr Kopii.',
# Special:Log
-'specialloguserlabel' => 'Benutzer:',
-'speciallogtitlelabel' => 'Titel:',
+'specialloguserlabel' => 'Benutzer, wu des gmacht het:',
+'speciallogtitlelabel' => 'Ziil (Titel oder Benutzer):',
'log' => 'Logbiecher',
'all-logs-page' => 'Alli effetligi Logbüecher',
'alllogstext' => 'Kombinierti Aasicht vu alle in {{SITENAME}} gfierte Protokoll.
'allpagesprefix' => 'Alli Sytene mit em Präfix:',
'allpagesbadtitle' => 'Dr Sytename, wu yygee hesch, isch nit giltig: Er het entwäder e vorgstellt Sproch-, e Interwiki-Chirzel oder s het ei oder meh Zeiche din, wu in eme Sytename nit derfe brucht wäre.',
'allpages-bad-ns' => 'Dr Namensruum „$1“ isch in {{SITENAME}} nit vorhande.',
+'allpages-hide-redirects' => 'Wyterleitige uusblände',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du siisch d Zwischespycher-Version vu däre Syte, wu bis zue $1 cha alt syy.',
+'cachedspecial-viewing-cached-ts' => 'Du siisch d Zwischespycher-Version vu däre Syte, wu villicht nit aktuäll isch.',
+'cachedspecial-refresh-now' => 'Aktuälli Version aaluege.',
# Special:Categories
'categories' => 'Kategorie',
'sp-deletedcontributions-contribs' => 'Byyträg',
# Special:LinkSearch
-'linksearch' => 'Netzgleicher',
+'linksearch' => 'Weblinksuechi',
'linksearch-pat' => 'Suechmuschter:',
'linksearch-ns' => 'Namensruum:',
'linksearch-ok' => 'Sueche',
-'linksearch-text' => 'S chönne Platzhalter wie "*.wikipedia.org" benutzt werre.<br />Unterschtützti Protokoll: <tt>$1</tt>',
+'linksearch-text' => 'Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <tt>*.byschpel.de</tt> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />Unterstitzti Protokoll: <tt>$1</tt> (Die bitte nit bi dr Suechaafrog aagee.)',
'linksearch-line' => '$1 isch vo $2 verknüpft',
'linksearch-error' => 'Platzhalter chönne numme am Aafang verwändet werre.',
'watchmethod-list' => 'Iberpriefe vu dr Beobachtigslischt no letschte Bearbeitige',
'watchlistcontains' => 'In Dyynere Beobachtigslischt het s $1 {{PLURAL:$1|Syte|Syte}}.',
'iteminvalidname' => 'Probläm mit em Yytrag „$1“, uugiltige Name.',
-'wlnote' => "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}.",
+'wlnote' => "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}. Stand: $3, $4 Uhr.",
'wlshowlast' => 'Zeig di letschte $1 Stunde $2 Tage $3',
'watchlist-options' => 'Aazeigoptione',
'unprotectedarticle' => 'het dr Schutz vu „[[$1]]“ ufghebt',
'movedarticleprotection' => 'het dr Syteschutz vu „[[$2]]“ uf „[[$1]]“ ibertrait',
'protect-title' => 'Schutz vu „$1“ ändere',
+'protect-title-notallowed' => 'Schutz aaluege vu „$1“',
'prot_1movedto2' => '[[$1]] isch uf [[$2]] verschobe worde.',
+'protect-badnamespace-title' => 'Nit-schitzbare Namensruum',
+'protect-badnamespace-text' => 'Syte in däm Namensruum chenne nit gschitzt wäre.',
'protect-legend' => 'Syteschutzstatus ändere',
'protectcomment' => 'Grund:',
'protectexpiry' => 'Gsperrt bis:',
Im [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
'undelete-header' => 'Lueg im [[Special:Log/delete|Lesch-Logbuech]] no Syte, wu in dr letschte Zyt glescht wore sin.',
+'undelete-search-title' => 'Gleschti Syte sueche',
'undelete-search-box' => 'Suech no gleschte Syte',
'undelete-search-prefix' => 'Zeig d Syte aa, wu aafange mit:',
'undelete-search-submit' => 'Sueche',
'undelete-bad-store-key' => 'D Dateiversion mit em Zytstämpfel $1 het nit chenne widerhärgstellt wäre: D Datei isch scho vor em Lesche nimmi vorhande gsi.',
'undelete-cleanup-error' => 'Fähler bim Lesche vu dr nit benutzte Archiv-Version $1.',
'undelete-missing-filearchive' => 'D Datei mit dr Archiv-ID $1 cha nit widerhärgstellt wäre, wel si nit in dr Datebank vorhanden isch. Villicht isch si scho widerhärgstellt wore.',
+'undelete-error' => 'Bim Widerhärstelle vu dr Syte het s e Fähler gee.',
'undelete-error-short' => 'Fähler bim Widerhärstelle vu dr Datei $1',
'undelete-error-long' => 'S sin Fähler bim Widerhärstelle vun ere Datei feschtgstellt wore:
'blocklog-showsuppresslog' => 'Dää Benutzer isch schon emol gsperrt wore un syyni Bearbeitige sin uusblädet wore. S Uusbländigs-Logbuech git s do as Referänz:',
'blocklogentry' => 'sperrt [[$1]] für d Ziit vo: $2 $3',
'reblock-logentry' => 'het d Sperri fir „[[$1]]“ gänderet fir dr Zytruum: $2 $3',
-'blocklogtext' => 'Des isch s Logbuech iber Sperrige un Entsperrige vu Benutzer. Automatisch blockierti IP-Adrässe wäre nit erfasst. Lueg au [[Special:BlockList|IP-Block Lischt]] fir e Lischt vu gsperrte Benutzer.',
+'blocklogtext' => 'Des isch s Logbuech iber Sperrige un Entsperrige vu Benutzer. Automatisch blockierti IP-Adrässe wäre nit erfasst. Lueg au [[Special:BlockList|Block Lischt]] fir e Lischt vu gsperrte Benutzer.',
'unblocklogentry' => 'het d Sperri vu „$1“ ufghobe',
'block-log-flags-anononly' => 'nume Anonymi',
'block-log-flags-nocreate' => 'Aalege vu Benutzerchonte gsperrt',
'export' => 'Sytenen exportiere',
'exporttext' => 'Du chasch dr Text un d Versionsgschicht vu einzelne Syte in ere XML-Datei exportiere. Die Datei cha derno in e ander MediaWiki-Wiki importiert wäre iber [[Special:Import|Importiere]].
Zum Exportiere trag dr Sytetitel in dr Täxtchaschte unter yy, ei Titel pro Zyyle, un wehl us, eb Du di aktuäll Version mitsamt dr eltere Versione (mit dr Versionsgschicht-Zyyle) oder nume di aktuäll Version mit dr Information iber di letscht Bearbeitig. In däm Fall chasch au e Link fir dr Export verwände, z. B. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fir d Syte "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Alli Syte exportiere',
'exportcuronly' => 'Numme d aktuelli Version vo dr Syte exportiere, statt dr ganze Versionsgschicht',
'exportnohistory' => "----
'''Hywys:''' S Exportiere vo ganzi Versionsgschichte durch des Formular isch us Gründ vo dr Leischtig vum Syschtem abgschaltet worde",
+'exportlistauthors' => 'Fir jedi Syte di vollständig Lischt vu dr Bearbeiter derzue tue',
'export-submit' => 'Sytene exportiere',
'export-addcattext' => 'Syte us dere Kategori dezuefüege',
'export-addcat' => 'Dezuefüege',
# Namespace 8 related
'allmessages' => 'Systemnochrichte',
'allmessagesname' => 'Name',
-'allmessagesdefault' => 'Standard-Tekscht',
+'allmessagesdefault' => 'Standardtext',
'allmessagescurrent' => 'jetzige Tekscht',
'allmessagestext' => 'Des isch e Lischt vu allene meglige Syschtemnochrichte us em MediaWiki Namensruum.
Lueg au uf [//www.mediawiki.org/wiki/Localisation MediaWiki Lokalisierig] un [//translatewiki.net translatewiki.net], wänn Du zue dr MediaWiki-Lokalisierig wit byytrage.',
'thumbnail_error' => 'Fähler bir Härstellig vo re Vorschou: $1',
'djvu_page_error' => 'DjVu-Syte isch uusserhalb vum Sytebereich',
'djvu_no_xml' => 'XML-Date chönne für d DjVu-Datei nüt abgruefe werde',
+'thumbnail-temp-create' => 'D Datei fir di temporär Miniaturaasicht het nit chenne aagleit wäre.',
+'thumbnail-dest-create' => 'D Miniaturaasicht het nit chenne an däm Ort gspycheret wäre.',
'thumbnail_invalid_params' => 'Ungültigs Thumbnail-Parameter',
'thumbnail_dest_directory' => 'S Ziilverzeichnis cha nüt erstellt werde',
'thumbnail_image-type' => 'Bildtyp wird nit unterstitzt',
'imported-log-entries' => '$1 {{PLURAL:$1|lLogbuechyytrag|Logbuechyytreg}} importiert.',
'importfailed' => 'Dr Import isch misslunge: $1',
'importunknownsource' => 'Importquell isch unbekannt',
-'importcantopen' => 'D Importdatei het nüt chönne geöffnet werde',
+'importcantopen' => 'D Importdatei het nit chenne ufgmacht wäre.',
'importbadinterwiki' => 'Falscher Interwiki-Link',
'importnotext' => 'Leer oder kei Teggscht',
'importsuccess' => 'Dr Import isch abgschlosse.',
'import-invalid-interwiki' => 'Us däm Wiki wo du aagää hesch isch kei Import mögli.',
'import-error-edit' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z bearbeite.',
'import-error-create' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z erstelle.',
+'import-error-interwiki' => 'D Syte „$1“ isch nit importiert wore, wel dr Name vun ere fir externi Link (Interwiki) reserviert isch.',
+'import-error-special' => 'D Syte „$1“ isch nit importiert wore, wel si zuen eme bsundere Namensruum ghert, wu kei Syte megli sin.',
+'import-error-invalid' => 'Syte „$1“ isch nit importiert wore, wel dr Name vun ere nit giltig isch.',
# Import log
'importlogpage' => 'Import-Logbuech',
'import-logentry-interwiki' => '„$1“ isch importiert worde (Transwiki)',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|Version|Versione}} vo $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript-Tescht',
+'javascripttest-disabled' => 'Die Funktion isch in däm Wiki nit aktiviert wore.',
+'javascripttest-title' => '$1-Tescht wäre durgfiert',
+'javascripttest-pagetext-noframework' => 'Die Syte isch reserviert fir JavaSkript-Tescht.',
+'javascripttest-pagetext-unknownframework' => 'Nit bekannt Framework „$1“.',
+'javascripttest-pagetext-frameworks' => 'Bitte eis vu däne Framework uuswehle: $1',
+'javascripttest-pagetext-skins' => 'Wehl e Benutzeroberflechi uus fir d Durfierig vu dr Tescht:',
+'javascripttest-qunit-intro' => 'Lueg d [$1 Dokumentation zue Tescht] uf mediawiki.org',
+'javascripttest-qunit-heading' => 'MediaWiki-JavaSkript-QUnit-Teschter',
+
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Dyyni Benutzersyte',
'tooltip-pt-anonuserpage' => 'D Benutzersyte vo der IP-Adress wo du mit schaffsch',
'tooltip-diff' => 'Zeigt a, was du am Tekscht hesch veränderet.',
'tooltip-compareselectedversions' => 'Underschide zwüsche zwo usgwählte Versione vo dere Syten azeige.',
'tooltip-watch' => 'Tue die Syten uf dyni Beobachtigslischte.',
+'tooltip-watchlistedit-normal-submit' => 'Yytreg uuseneh',
+'tooltip-watchlistedit-raw-submit' => 'D Beobachtigslischt aktualisiere',
'tooltip-recreate' => 'Die Syte nöi erstelle, trotz dass si emool glöscht worren isch.',
'tooltip-upload' => 'Aafange mit ufelade',
'tooltip-rollback' => 'Mach alli letschti Ändrige uf dere Syte, wo vo däm Benutzer gmacht worre sin, ruggängig.',
'version-software' => 'Installierti Software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
+'version-entrypoints' => 'Yygangspunkt-URL',
+'version-entrypoints-header-entrypoint' => 'Yygangspunkt',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Dateipfad',
'newuserlog-byemail' => 's Passwort isch per E-Mail gschickt wore',
# Feedback
+'feedback-bugornote' => 'Wän Du detailliert e tächnisch Probläm witt bschryybe, no mäld bitte [$1 ne Fähler].
+Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit Dyym Benutzername un dr Version vu Dyym Webbrowser un em Betribssyschtem, uf dr Syte „[$3 $2]“ zuegfiegt.',
'feedback-subject' => 'Beträff:',
'feedback-message' => 'Noochricht:',
'feedback-cancel' => 'Abbräche',
'feedback-error1' => 'Fäälermäldig: Unbekannts Ergebniss vo de API',
'feedback-error2' => 'Fääler: Bearbeitig fehlgschlo',
'feedback-error3' => 'Fäälermäldig: Kei Antwort vo de API',
+'feedback-thanks' => 'Dankschen. Dyy Ruckmäldig isch uf dr Syte „[$2 $1]“ gspycheret wore.',
+'feedback-close' => 'Isch gmacht',
+'feedback-bugcheck' => 'Schen! Bitte iberprief no, eb s sich doderby nit um e scho [$1 bekannte Fähler] handlet.',
+'feedback-bugnew' => 'Ich haa s iberprieft. Dr nej Fähler mälde.',
# API errors
'api-error-badaccess-groups' => 'Du derfsch keini Dateie in des Wiki uffelade.',
'api-error-duplicate-archive-popup-title' => 'Doppelti {{PLURAL:$1|Datei, wo scho worde isch|Dateie, wo scho glöscht worde sin}}',
'api-error-duplicate-popup-title' => 'Dopplet vorhandeni {{PLURAL:$1|Datei|Dateie}}',
'api-error-empty-file' => 'D Datei, wu Du uffeglade hesch, isch läär.',
+'api-error-emptypage' => 'S isch nit erlaubt, neji lääri Syte aazlege.',
'api-error-fetchfileerror' => 'Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.',
'api-error-file-too-large' => 'D Datei, wu Du ibertrait hesch, isch z groß.',
'api-error-filename-tooshort' => 'Dr Dateiname isch z churz.',
'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
'api-error-unknown-error' => 'Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei.',
'api-error-unknown-warning' => 'Unbekannti Warnig: $1',
+'api-error-unknownerror' => 'Nit bekannte Fähler: „$1“',
'api-error-uploaddisabled' => 'S Uffelade isch in däm Wiki deaktiviert.',
'api-error-verification-error' => 'Die Datei isch entwäder fählerhaft oder si het di falsch Dateinameerwyterig.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekund|Sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minut|Minute}}',
+'duration-hours' => '$1 {{PLURAL:$1|Stund|Stunde}}',
+'duration-days' => '$1 {{PLURAL:$1|Tag|Täg}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Wuche|Wuche}}',
+'duration-years' => '$1 {{PLURAL:$1|Johr|Johr}}',
+'duration-decades' => '$1 {{PLURAL:$1|Johrzehnt|Johrzeht}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Johrhundert|Johrhundert}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Jahrtöusert|Jahrtöusert}}',
+
);
'updated' => '(מעודכן)',
'note' => "'''הערה:'''",
'previewnote' => "'''זכרו שזו רק תצוגה מקדימה.'''
-השינויים שלכם טרם נשמרו! [[#editform|← להמשך העריכה]]",
+השינויים שלכם טרם נשמרו!",
+'continue-editing' => 'להמשך העריכה',
'previewconflict' => 'תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.',
'session_fail_preview' => "'''לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.'''
אנא נסו שוב.
'parser-template-loop-warning' => 'נמצאה תבנית הקוראת לעצמה: [[$1]]',
'parser-template-recursion-depth-warning' => 'עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)',
'language-converter-depth-warning' => 'עומק ממיר השפה עבר את המגבלה ($1)',
+'node-count-exceeded-category' => 'דפים שבהם מספר הצמתים גדול מדי',
+'node-count-exceeded-warning' => 'מספר הצמתים בדף גדול מדי',
+'expansion-depth-exceeded-category' => 'דפים שבהם עומק ההרחבה גדול מדי',
+'expansion-depth-exceeded-warning' => 'עומק ההרחבה בדף גדול מדי',
# "Undo" feature
'undo-success' => 'ניתן לבטל את העריכה. אנא בִדקו את השוואת הגרסאות למטה כדי לוודא שזה מה שאתם רוצים לעשות, ואז שמרו את השינויים למטה כדי לבצע את ביטול העריכה.',
ऐसा तब भी हो सकता है यदि आप कोई खराब वेब-आधारित अनामक प्रौक्सी प्रयोग कर रहे हों।",
'edit_form_incomplete' => "'''सम्पादन फ़ॉर्म के कुछ भाग सर्वर तक नहीं पहुँच पाए; जाँच लें कि आपके द्वारा किये बदलाव अक्षुण्ण हैं, और सहेजने का पुनः यत्न करें।'''",
'editing' => '$1 सम्पादन',
+'creating' => '$1 बनाएँ',
'editingsection' => '$1 सम्पादन (अनुभाग)',
'editingcomment' => '$1 सम्पादन (नया अनुभाग)',
'editconflict' => 'संपादन अंतर्विरोध: $1',
यह पहले से मौजूद है।',
# Parser/template warnings
-'expensive-parserfunction-warning' => "'''à¤\9aà¥\87तावनà¥\80:''' à¤\87स पà¥\83षà¥\8dठपर बहà¥\81त à¤\85धिà¤\95 सà¤\82à¤\96à¥\8dया मà¥\87à¤\82 à¤\95à¥\80मतà¥\80 पारà¥\8dसर à¥\9eंक्शनों का प्रयोग किया गया है।
+'expensive-parserfunction-warning' => "'''à¤\9aà¥\87तावनà¥\80:''' à¤\87स पà¥\83षà¥\8dठपर बहà¥\81त à¤\85धिà¤\95 सà¤\82à¤\96à¥\8dया मà¥\87à¤\82 à¤\95à¥\80मतà¥\80 पारà¥\8dसर फ़ंक्शनों का प्रयोग किया गया है।
-इनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार है।",
+इनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार {{PLURAL:$2|है|हैं}}।",
'expensive-parserfunction-category' => 'कीमती पार्सर फ़ंक्शनों का अत्यधिक प्रयोग कर रहे पृष्ठ',
'post-expand-template-inclusion-warning' => "'''चेतावनी:''' साँचे जुड़ने की सीमा पार हो चुकी है।
कुछ साँचे नहीं जुड़ेंगे।",
# Suppression log
'suppressionlog' => 'छुपाने की लॉग',
-'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है। मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|आइ॰पी ब्लॉक सूची]] देखें।',
+'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है।
+मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|ब्लॉक सूची]] देखें।',
# History merging
'mergehistory' => 'पृष्ठ के इतिहास एकत्रित करें',
'watchnologin' => 'लॉग इन नहीं किया है',
'watchnologintext' => 'ध्यानसूची में बदलाव के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है।',
'addwatch' => 'ध्यानसूची में जोड़ें',
-'addedwatchtext' => 'आपकी [[Special:Watchlist|ध्यानसूची]] में "<nowiki>$1</nowiki>" का समावेश कर दिया गया है।
-भविष्य में इस पृष्ठ तथा इस पृष्ठ की वार्ता में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे तथा [[Special:RecentChanges|हाल में हुए बदलावों की सूची]] में यह पृष्ठ बोल्ड दिखेगा ताकि आप आसानी से इसका ध्यान रख सकें।
+'addedwatchtext' => 'आपकी [[Special:Watchlist|ध्यानसूची]] में "[[:$1]]" पृष्ठ का समावेश कर दिया गया है।
+भविष्य में इस पृष्ठ तथा इसके वार्ता पृष्ठ में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे तथा [[Special:RecentChanges|हाल में हुए बदलावों की सूची]] में यह पृष्ठ बोल्ड दिखेगा ताकि आप आसानी से इसका ध्यान रख सकें।
-<p>अगर आपको इस पृष्ठ को अपनी ध्यानसूची से निकालना हो तो "ध्यान हटायें" पर क्लिक करें।',
+अगर आपको इस पृष्ठ को अपनी ध्यानसूची से निकालना हो तो "ध्यान हटायें" पर क्लिक करें।',
'removewatch' => 'ध्यानसूची से हटाएँ',
'removedwatchtext' => '"[[:$1]]" नामक पृष्ठ को आपकी [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।',
'watch' => 'ध्यान रखें',
# Contributions
'contributions' => 'सदस्य योगदान',
-'contributions-title' => '$1 à¤\95à¥\87 लिà¤\8f सदसà¥\8dयà¥\8bà¤\82 à¤\95à¥\87 यà¥\8bà¤\97दान',
+'contributions-title' => '$1 के योगदान',
'mycontris' => 'मेरा योगदान',
'contribsub2' => '$1 के लिये ($2)',
'nocontribs' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
'nolinkshere-ns' => "चुने हुए नामस्थानसे '''[[:$1]]''' को जुडने वाले पृष्ठ नहीं हैं।",
'isredirect' => 'पुनर्निर्देशन पृष्ठ',
'istemplate' => 'मिलाईयें',
-'isimage' => 'सà¤\82à¤\9aिà¤\95ा à¤\95ि à¤\95ड़à¥\80',
+'isimage' => 'फ़ाà¤\87ल पà¥\8dरयà¥\8bà¤\97',
'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछले $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगले $1}}',
'whatlinkshere-links' => '← कड़ियाँ',
पृष्ठों को निर्यात करने के लिए, नीचे विषय वस्तु संदूक में शीर्षक प्रवेश करें, एक शीर्षक प्रति पंक्ति, और चुने कि आप वर्त्तमान अवतरण के साथ पुराने अवतरण भी चाहते हैं कि नहीं, या पिछले संपादन के बारे में जानकारी के साथ केवल वर्त्तमान अवतरण चाहते हैं।
बाद वाली स्थिति के लिए आप एक सम्पर्क भी प्रयोग कर सकते हैं, उदाहरण के लिए, "[[{{MediaWiki:Mainpage}}]]" पृष्ठ के लिए [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।',
+'exportall' => 'सभी पृष्ठ निर्यात करें',
'exportcuronly' => 'पूरा इतिहास नहीं चाहियें, सिर्फ अभी का अवतरण अंतर्भूत करें',
'exportnohistory' => "----
'''सूचना:''' इस फॉर्म का इस्तेमाल कर पृष्ठका पूरा इतिहास निर्यात करना परफॉर्मेन्स के चलते रोक दिया गया हैं।",
'exif-sensingmethod-4' => 'थ्री चीप कलर एरीया सेन्सर',
'exif-sensingmethod-5' => 'कलर सिक्वेण्शीयल एरीया सेंसर',
'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
-'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेन्सर',
+'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेन्सर',
'exif-filesource-3' => 'डिजिटल स्टिल कैमरा',
'version-software' => 'इन्स्टॉल की हुई प्रणाली',
'version-software-product' => 'प्रोडक्ट',
'version-software-version' => 'अवतरण',
+'version-entrypoints-header-url' => 'यू॰आर॰एल',
# Special:FilePath
'filepath' => 'सञ्चिका पथ',
'logentry-newusers-newusers' => '$1 created उपयोगकर्ता के खाता',
'logentry-newusers-create' => '$1 created उपयोगकर्ता के खाता',
'logentry-newusers-create2' => '$1 created a user account $3',
-'logentry-newusers-autocreate' => 'à¤\96ातà¥\87 $1 था created सà¥\8dवà¤\9aालित रà¥\82प सà¥\87',
+'logentry-newusers-autocreate' => 'à¤\96ातà¥\87 $1 सà¥\8dवà¤\9aालित रà¥\82प सà¥\87 बनाया à¤\97या',
'newuserlog-byemail' => 'कूटशब्द इ-मेल द्वारा भेजा गया हैं',
# Feedback
'api-error-uploaddisabled' => 'इस विकि पर अपलोड अक्षम है.',
'api-error-verification-error' => 'यह फ़ाइल दूषित हो सकती है, या गलत एक्सटेंशन है।',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|सॅकेंड}}',
+'duration-minutes' => '$1 {{PLURAL:$1|मिनट}}',
+'duration-hours' => '$1 {{PLURAL:$1|घंटा|घंटे}}',
+'duration-days' => '$1 {{PLURAL:$1|दिन}}',
+'duration-weeks' => '$1 {{PLURAL:$1|सप्ताह}}',
+'duration-years' => '$1 {{PLURAL:$1|वर्ष}}',
+'duration-decades' => '$1 {{PLURAL:$1|दशक}}',
+'duration-centuries' => '$1 {{PLURAL:$1|शताब्दी}}',
+'duration-millennia' => '$1 {{PLURAL:$1|सहस्राब्दी}}',
+
);
To se ponekad događa kad rabite neispravan web-baziran anonimni posrednik (proxy).",
'edit_form_incomplete' => "'''Neki dijelovi obrasca za uređivanja nisu dostigli do poslužitelja; provjerite jesu li izmjene netaknute i pokušajte ponovno.'''",
'editing' => 'Uređujete $1',
+'creating' => 'Stvori $1',
'editingsection' => 'Uređujete $1 (odlomak)',
'editingcomment' => 'Uređujete $1 (novi odlomak)',
'editconflict' => 'Istovremeno uređivanje: $1',
'updated' => '(Zaktualizowany)',
'note' => "'''Kedźbu:'''",
'previewnote' => "'''Wobmysl, zo to je jenož přehlad.'''
-Twoje změny hišće njejsu składowane! [[#editform|→ Dale wobdźěłaś]]",
+Twoje změny hišće njejsu składowane!",
+'continue-editing' => 'Dale wobdźěłać',
'previewconflict' => 'Tutón přehlad zwobraznja tekst w hornim tekstowym polu, kaž so zjewi, jeli jón składuješ.',
'session_fail_preview' => "'''Njemóžachmy twoju změnu předźěłać, dokelž su so posedźenske daty zhubili.'''
Spytaj prošu hišće raz.
'parser-template-loop-warning' => 'Předłohowa sekla wotkryta: [[$1]]',
'parser-template-recursion-depth-warning' => 'Limit za rekursijnu hłubokosć předłohi překročeny ($1)',
'language-converter-depth-warning' => 'Limit hłubokosće rěčneho konwertera překročena ($1)',
+'node-count-exceeded-category' => 'Strony, hdźež ličba sukow je překročena',
+'node-count-exceeded-warning' => 'Strona je ličbu sukow překročiła',
+'expansion-depth-exceeded-category' => 'Strony, hdźež ekspansiska hłubokosć je překročena',
+'expansion-depth-exceeded-warning' => 'Strona je ekspansisku hłubokosć překročił',
# "Undo" feature
'undo-success' => 'Wersija je so wuspěšnje wotstroniła. Prošu přepruwuj deleka w přirunanskim napohledźe, hač twoja změna bu přewzata a klikń potom na „Składować”, zo by změnu składował.',
Ez a probléma akkor fordulhat elő, ha hibás, web-alapú proxyszolgáltatást használsz.'''",
'edit_form_incomplete' => "'''A szerkesztési űrlap egyes részei nem érkeztek meg a szerverre; ellenőrizd újra, hogy a szerkesztés sértetlen-e, majd próbáld újra.'''",
'editing' => '$1 szerkesztése',
+'creating' => '$1 létrehozása',
'editingsection' => '$1 szerkesztése (szakasz)',
'editingcomment' => '$1 szerkesztése (új szakasz)',
'editconflict' => 'Szerkesztési ütközés: $1',
'''Եթե սա բարեխիղճ խմբագրման փորձ է, խնդրում ենք փորձել կրկին։ Սխալի կրկնման դեպքում՝ փորձեք [[Special:UserLogout|դուրս գալ]], ապա կրկին մտնել համակարգ։'''",
'token_suffix_mismatch' => "'''Ձեր խմբագրումը մերժվել է, քանի որ ձեր օգտագործած ծրագիրը աղավաղել է կետադրության նշանները խմբագրման դաշտում։ Խմբագրումը մերժվել է էջի տեքստի խաթարումը կանխելու նպատակով։ Սա երբեմն պայմանավորված է սխալներ պարունակող անանվանեցնող վեբ-փոխարինորդ (proxy) ծառայության օգտագործմամբ։'''",
'editing' => 'Խմբագրում. $1',
+'creating' => 'Ստեղծում $1',
'editingsection' => 'Խմբագրում. $1 (բաժին)',
'editingcomment' => 'Խմբագրում $1 (նոր բաժին)',
'editconflict' => 'Խմբագրման ընդհարում. $1',
'updated' => '(Actualisate)',
'note' => "'''Nota:'''",
'previewnote' => "'''Isto es solmente un previsualisation.'''
-Le modificationes non ha ancora essite publicate! [[#editform|→ Continuar le modification]]",
+Le modificationes non ha ancora essite publicate!",
+'continue-editing' => 'Continuar a modificar',
'previewconflict' => 'Iste previsualisation reflecte le apparentia final del texto in le area de modification superior
si tu opta pro publicar lo.',
'session_fail_preview' => "'''Nos non poteva processar tu modification proque nos perdeva le datos del session.
'parser-template-loop-warning' => 'Recursion infinite detegite in patrono: [[$1]]',
'parser-template-recursion-depth-warning' => 'Limite de recursion del patrono excedite ($1)',
'language-converter-depth-warning' => 'Limite de profunditate del conversor de lingua excedite ($1)',
+'node-count-exceeded-category' => 'Paginas in que le numero de nodos excede le limite',
+'node-count-exceeded-warning' => 'Le numero de nodos in iste pagina excede le limite',
+'expansion-depth-exceeded-category' => 'Paginas in que le profunditate de expansion excede le limite',
+'expansion-depth-exceeded-warning' => 'Le profunditate de expansion in iste pagina excede le limite',
# "Undo" feature
'undo-success' => 'Le modification pote esser disfacite.
Ti naited a rason ket ''$2''.",
'filereadonlyerror' => 'Di nabaliwan ti papales "$1" gapu ket ti repositorio ti papeles "$2" ket basaen laeng a moda.
-Ti rason a naited ket "\'\'$3\'\'".',
+Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'".',
# Virus scanner
'virus-badscanner' => 'Madi di panaka-aramidna: Di am-ammo a birus a panagskan: "$1"',
'invalidemailaddress' => 'Ti e-surat a pagtaengam ket saan a maawat, ket kasla addaan ti saan a napudno a nakabuklan.
Pangngaasi ta ikkam ti nasayaat a nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
'cannotchangeemail' => 'Dagiti pakabilangan nga e-surat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
+'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatuod kadagiti e-surat.',
'accountcreated' => 'Naaramiden ti pakabilangan',
'accountcreatedtext' => 'Naaramiden ti pakabilangan a pagaramat ni $1.',
'createaccount-title' => 'Panagaramid iti pakabilangan para iti {{SITENAME}}',
Annawid a .css ken .js dagiti titulo ket agususar ti napababa a letra, a kas dagiti {{ns:user}}:Foo/vector.css saan ket a {{ns:user}}:Foo/Vector.css.",
'updated' => '(Napabaro)',
'note' => "'''Paammo:'''",
-'previewnote' => "'''Maysa laeng a pagpadas daytoy; dagiti sinukatam ket saan pay a naidulin!'''",
+'previewnote' => "'''Laglagipem a daytoy ket panagipadas laeng.'''
+Dagiti sinukatam ket saan pay a naidulin!",
+'continue-editing' => 'Agtultuloy nga agurnos',
'previewconflict' => 'Daytoy a panagpadas ket agiparang ti testo dita ngato a panagurnos a lugar a kasla agparang no kayatmo nga idulin.',
'session_fail_preview' => "'''Pasensian a! Saan mi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''
Pangngaasi ta padasem manen.
Mapasamak daytoy no agus-usar ka ti saan a nasayaat a naibasta ti sapot a diamammo a proxy a panagserbi.",
'edit_form_incomplete' => "'''Adda dagiti paset ti panag-urnos a kabuklan a saan a nakadanon dita server; kitkitaen nga dagiti pianag-urnos mo ket saan a naikkatan ken padasem manen.'''",
'editing' => 'Ururnosen ti $1',
+'creating' => 'Agparpartuat ti $1',
'editingsection' => 'Ururnosen ti $1 (paset)',
'editingcomment' => 'Ururnosen ti $1 (baro a paset)',
'editconflict' => 'Adda kasinnungat ti panag-urnos: $1',
'edit-no-change' => 'Ti inurnos mo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
Adda met daytoyen.',
+'defaultmessagetext' => 'Naisigud a testo ti mensahe',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser nga opisio a pinagtawtawag.
# Suppression log
'suppressionlog' => 'Listaan ti nadepdepan',
-'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken naserraan nga adda nagyanna a nailemmeng kadagiti administrador.
-Kitaen ti [[Special:BlockList|Listaan ti naserraan nga IP]] iti listaan ti agdama a kadagiti operasional a pinagparit ken panagserra',
+'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken npanagserra a nairaman dagiti linaon a nailemmeng manipud kadagiti administrador.
+Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama nga operasional a pinagparit ken panagserra.',
# History merging
'mergehistory' => 'Pagtiponen dagiti pakasaritaan ti pampanid',
'allpages-bad-ns' => 'Awan ti {{SITENAME}} iti nagan ti lugar a "$1".',
'allpages-hide-redirects' => 'Ilemmeng dagiti baw-ing',
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Kitkitaenm ti naidulin a bersion iti daytoy a panid, nga addan ti kadaanan a $1.',
+'cachedspecial-refresh-now' => 'Kitaen ti kinaudian.',
+
# Special:Categories
'categories' => 'Dagiti kategoria',
'categoriespagetext' => 'Dagiti sumaganad a {{PLURAL:$1|nagyan ti kategoria|dagiti nagyan ti kategoria}} pampanid wenno midia.
'ipb-confirm' => 'Pasingkedan ti serra',
'badipaddress' => 'Imbalido nga IP a pagtaengan',
'blockipsuccesssub' => 'Balligi ti panangserra',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ket naserraan.<br />
-Kitaen ti [[Special:BlockList|listaan ti IP a naserraan]] ta kitaen dagiti serra.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ket naserraanen.<br />
+Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti serra.',
'ipb-blockingself' => 'Mangrugrugi ka nga agserra kenka! Sigurado nga kayatmo nga aramiden daytoy?',
'ipb-confirmhideuser' => 'Mangrugrugi ka ti mangserra ti agar-aramat nga addaan ti napabalin na nga "ilemmeng ti agar-aramat". Iddeppen na ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Sigurado ka a kasta ti kayatmo?',
'ipb-edit-dropdown' => 'Urnosen dagiti rason ti panagserra',
Ti listaan ti napasardeng ket naikabil dita baba tapno mausar a reperensia:',
'blocklogentry' => 'naserraan ni [[$1]] nga addaan ti oras ti panagpaso nga $2 $3',
'reblock-logentry' => 'sinukatan ti panakaserra ni [[$1]] ti agtapos nga oras nga $2 $3',
-'blocklogtext' => 'Daytoy ket listaan ti gar-aramat kadagiti pinagserraken panaglukat ti serra
-Dagiti na-automatiko a panakaserra ti IP a pagtaengan ket saan a nailista.
-Kitaen ti [[Special:BlockList|Listaan ti serra ti IP]] ti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.',
+'blocklogtext' => 'Daytoy ket listaan ti agar-aramat kadagiti pinagserra ken panaglukat ti serra
+Dagiti na-atomatiko a panakaserra ti IP a pagtaengan ket saan a nailista.
+Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.',
'unblocklogentry' => 'lukatan ti serra ni $1',
'block-log-flags-anononly' => 'dagiti di am-ammo nga agar-aramat laeng',
'block-log-flags-nocreate' => 'naisardeng ti pinagaramid iti pakabilangan',
'exif-planarconfiguration-1' => 'chunky format',
'exif-planarconfiguration-2' => 'planar format',
+'exif-colorspace-65535' => 'Di-nakalibrar',
+
'exif-componentsconfiguration-0' => 'awan',
'exif-exposureprogram-0' => 'Saan a naipalpalawag',
'version-software' => 'Naikabil a software',
'version-software-product' => 'Produkto',
'version-software-version' => 'Bersion',
+'version-entrypoints' => 'Paserrekan a puntos dagiti URL',
+'version-entrypoints-header-entrypoint' => 'Pagserrekan a puntos',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Dalanan ti papeles',
'api-error-uploaddisabled' => 'Nabaldado ti mangipapan iti daytoy a wiki.',
'api-error-verification-error' => 'Dakes ngata daytoy a papeles, wenno addaan ti madi a pagpa-atiddog.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|seg-segundo}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|min-minuto}}',
+'duration-hours' => '$1 {{PLURAL:$1|oras|or-oras}}',
+'duration-days' => '$1 {{PLURAL:$1|aldaw|al-aldaw}}',
+'duration-weeks' => '$1 {{PLURAL:$1|lawas|law-lawas}}',
+'duration-years' => '$1 {{PLURAL:$1|tawen|taw-tawen}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekada|dek-dekada}}',
+'duration-centuries' => '$1 {{PLURAL:$1|siglo|sig-siglo}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenio|mil-milenio}}',
+
);
Шун йийшая, кхыдола йоазувнашкахь [[Special:Search/{{PAGENAME}}|дола цӀерий хаттам корае]] е <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} нийсамий тептара йоазувнаш корае].</span>',
'note' => "'''ХӀамоалар:'''",
'previewnote' => "'''Хьалхе б|аргтассам мара бац.'''
-Яздам кха яздаь дац! [[#editform|→ хувцам д|ахьо д|аде]]",
+Яздам кха яздаь дац!",
'editing' => 'ГӀалатнийсдар: $1',
'editingsection' => 'ГIалатнийсдар $1 (оагӀувдакъа)',
'editingcomment' => 'ГӀалатнийсдар $1 (керда декъам)',
Þetta getur gerst þegar þú notar bilaðan vafra eða ónafngreinda vefsels þjónustu.",
'edit_form_incomplete' => "'''Sumir hlutar breytingarinnar bárust ekki til vefþjónsins; athugaðu hvort breytingin þín er óbreytt og reyndu aftur.'''",
'editing' => 'Breyti $1',
+'creating' => 'Skapa $1',
'editingsection' => 'Breyti $1 (hluta)',
'editingcomment' => 'Breyti $1 (nýr hluti)',
'editconflict' => 'Breytingaárekstur: $1',
'confirmemail_success' => 'Netfang þitt hefur verið staðfest. Þú getur nú [[Special:UserLogin|skráð þig inn]] og vafrað um wiki-kerfið.',
'confirmemail_loggedin' => 'Netfang þitt hefur verið staðfest.',
'confirmemail_error' => 'Eitthvað fór úrskeiðis við vistun staðfestingarinnar.',
-'confirmemail_subject' => '{{SITENAME}} netfangs-staðfesting',
+'confirmemail_subject' => 'Staðfesting netfangs á {{SITENAME}}',
'confirmemail_body' => 'Einhver, sennilega þú, með vistfangið $1 hefur skráð sig á {{SITENAME}} undir notandanafninu „$2“ og gefið upp þetta netfang.
Til að staðfesta að það hafi verið þú sem skráðir þig undir þessu nafni, og til þess að virkja póstsendingar í gegnum {{SITENAME}}, skaltu opna þennan tengil í vafranum þínum:
'updated' => '(Aggiornato)',
'note' => "'''NOTA:'''",
'previewnote' => "'''Ricorda che questa è solo un'anteprima.'''
-Le tue modifiche NON sono ancora state salvate! [[#editform|→ Continua a modificare]]",
+Le tue modifiche NON sono ancora state salvate!",
+'continue-editing' => 'Continua a modificare',
'previewconflict' => 'L\'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di premere "Salva la pagina" in questo momento.',
'session_fail_preview' => "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.
Riprovare.
*
* @author Akaniji
* @author Alexsh
+ * @author Ant176
* @author Aotake
* @author Aphaia
* @author Broad-Sky
'category-empty' => "''このカテゴリには、ページまたはメディアがひとつもありません。''",
'hidden-categories' => '{{PLURAL:$1|隠しカテゴリ}}',
'hidden-category-category' => '隠しカテゴリ',
-'category-subcat-count' => '{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには $2 下位カテゴリが含まれており、そのうち以下の{{PLURAL:$1|下位カテゴリ| $1 下位カテゴリ}}を表示しています。}}',
-'category-subcat-count-limited' => 'このカテゴリには以下の{{PLURAL:$1|下位カテゴリ| $1 下位カテゴリ}}が含まれています。',
-'category-article-count' => '{{PLURAL:$2|このカテゴリには以下のページのみ含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の {{PLURAL:$1|$1 ページ}}を表示しています。}}',
-'category-article-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ページ| $1 ページ}}が含まれています。',
+'category-subcat-count' => '{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには $2 下位カテゴリが含まれており、そのうち以下の{{PLURAL:$1|下位カテゴリ| $1 下位カテゴリ}}を表示しています。}}',
+'category-subcat-count-limited' => 'このカテゴリには以下の{{PLURAL:$1|下位カテゴリ| $1 下位カテゴリ}}が含まれています。',
+'category-article-count' => '{{PLURAL:$2|このカテゴリには以下のページのみが含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の {{PLURAL:$1|$1 ページ}}を表示しています。}}',
+'category-article-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ページ| $1 ページ}}が含まれています。',
'category-file-count' => '{{PLURAL:$2|このカテゴリには以下のファイルのみが含まれています。|このカテゴリには $2 ファイルが含まれており、そのうち以下の {{PLURAL:$1|$1 ファイル}}を表示しています。}}',
-'category-file-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ファイル| $1 ファイル}}が含まれています。',
+'category-file-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ファイル| $1 ファイル}}が含まれています。',
'listingcontinuesabbrev' => 'の続き',
'index-category' => '検索エンジンに収集されるページ',
'noindex-category' => '検索エンジンに収集されないページ',
'mainpage' => 'メインページ',
'mainpage-description' => 'メインページ',
'policy-url' => 'Project:方針',
-'portal' => 'コミュニティ ポータル',
-'portal-url' => 'Project:コミュニティ ポータル',
+'portal' => 'コミュニティ・ポータル',
+'portal-url' => 'Project:コミュニティ・ポータル',
'privacy' => 'プライバシー ポリシー',
'privacypage' => 'Project:プライバシー ポリシー',
'collapsible-collapse' => '折り畳む',
'collapsible-expand' => '展開する',
'thisisdeleted' => '$1を閲覧または復帰しますか?',
-'viewdeleted' => '$1を表示しますか?',
+'viewdeleted' => '$1を閲覧しますか?',
'restorelink' => '削除された$1編集',
'feedlinks' => 'フィード:',
'feed-invalid' => 'フィード形式の指定が間違っています。',
最後に実行を試みたクエリは次の通りです:
関数「<tt>$2</tt>」内
<blockquote><tt>$1</tt></blockquote>。
-ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®返したエラー「<tt>$3:$4</tt>」',
+ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81\8c返したエラー「<tt>$3:$4</tt>」',
'dberrortextcl' => 'データベース クエリの構文エラーが発生しました。
最後に実行を試みたクエリは以下の通りです:
関数「$2」内から
'yourname' => '利用者名:',
'yourpassword' => 'パスワード:',
'yourpasswordagain' => 'パスワード再入力:',
-'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長{{PLURAL:$1|日|日間}})',
+'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
'yourdomainname' => 'ドメイン:',
'externaldberror' => '外部の認証データベースでエラーが発生したか、または外部アカウント情報の更新が許可されていません。',
'updated' => '(更新)',
'note' => "'''お知らせ:'''",
'previewnote' => "'''これはプレビューです。'''
-変更箇所はまだ保存されていません! [[#editform|→ 編集を続行]]",
+変更箇所はまだ保存されていません!",
+'continue-editing' => '編集を続行',
'previewconflict' => 'このプレビューは、上の文章編集エリアの文章を保存した場合にどう見えるようになるかを示すものです。',
'session_fail_preview' => "'''申し訳ありません!セッションデータが消失したため編集を処理できませんでした。'''
もう一度やり直してください。
必要であれば文章をカットアンドペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。
データベースをロックした管理者による説明は以下の通りです:$1",
-'protectedpagewarning' => "'''è¦å\91\8aï¼\9aã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè·ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81管ç\90\86è\80\85権é\99\90ã\81®ã\81\82ã\82\8bå\88©ç\94¨è\80\85ã\81\97ã\81\8bç·¨é\9b\86ã\81§ã\81\8dã\81ªã\81\84ã\82\88ã\81\86ã\81«ã\81ªã\81£ã\81¦ã\81\84ます。'''
+'protectedpagewarning' => "'''è¦å\91\8aï¼\9aã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81管ç\90\86è\80\85権é\99\90ã\82\92æ\8c\81ã\81¤å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8cç·¨é\9b\86ã\81§ã\81\8dます。'''
参考として以下に一番最後の記録を表示します:",
-'semiprotectedpagewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81\97ã\81\8bç·¨é\9b\86ã\81§ã\81\8dã\81¾ã\81\9bã\82\93。
+'semiprotectedpagewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8cç·¨é\9b\86ã\81§ã\81\8dã\81¾ã\81\99。
参考として以下に一番最後の記録を表示します:",
'cascadeprotectedwarning' => "'''警告:'''このページはカスケード保護されている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、管理者権限を持つ利用者しか編集できないように保護されています。",
'titleprotectedwarning' => "'''警告:このページは保護されているため、作成には[[Special:ListGroupRights|特定の権限]]が必要です。'''
'sectioneditnotsupported-text' => 'このページでは節単位編集はサポートされません。',
'permissionserrors' => '認証エラー',
'permissionserrorstext' => 'あなたにはこの操作を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
-'permissionserrorstext-withaction' => 'あなたには$2を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:',
+'permissionserrorstext-withaction' => 'あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
'recreate-moveddeleted-warn' => "'''警告:以前削除されたページを再作成しようとしています。'''
このページの編集を続行するのが適切かどうか確認してください。
参考のため以下にこのページの削除と移動の記録を表示します:",
'moveddeleted-notice' => 'このページは削除されています。
参考のため、このページの削除と移動の記録を以下に表示します。',
-'log-fulllog' => '完全な記録を見る',
+'log-fulllog' => '完全な記録を閲覧',
'edit-hook-aborted' => 'フックによって編集が破棄されました。
理由は不明です。',
'edit-gone-missing' => 'ページを更新できませんでした。
これらの値は省略されました。",
'post-expand-template-argument-category' => '省略されたテンプレート引数を含むページ',
'parser-template-loop-warning' => 'テンプレートのループが検出されました:[[$1]]',
-'parser-template-recursion-depth-warning' => 'テンプレートの再帰深さ($1)が上限値を超えました',
-'language-converter-depth-warning' => '言語変換機能が深度制限($1)を超えました',
+'parser-template-recursion-depth-warning' => 'テンプレートの再帰の深さ($1)が上限を超えました',
+'language-converter-depth-warning' => '言語変換機能の深さ($1)が制限を超えました',
+'node-count-exceeded-category' => 'ノード数が制限を超えたページ',
+'node-count-exceeded-warning' => 'ページがノード数の制限を超えました',
+'expansion-depth-exceeded-category' => '展開の深さ制限を超えたページ',
+'expansion-depth-exceeded-warning' => 'ページが展開の深さ制限を超えました',
# "Undo" feature
-'undo-success' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92å\8f\96ã\82\8aæ¶\88ã\81\99ã\81\93ã\81¨ã\81\8cã\81§ã\81\8dます。
+'undo-success' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92å\8f\96ã\82\8aæ¶\88ã\81\9bます。
下記の差分を確認し、本当に取り消すべきだと確認してから、変更を保存して取り消しを完了してください。',
'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
'undo-norev' => '取り消そうとした編集が存在しないか削除済みのため取り消せませんでした。',
$3が示した理由は ''$2'' です。",
# History pages
-'viewpagelogs' => 'このページに関する記録を表示',
+'viewpagelogs' => 'このページに関する記録を閲覧',
'nohistory' => 'このページには編集履歴がありません。',
'currentrev' => '最新版',
'currentrev-asof' => '$1時点における最新版',
'last' => '前',
'page_first' => '先頭',
'page_last' => '末尾',
-'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、エンターキーを押すか、下部のボタンを押します。<br />
+'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、Enterキーを押すか、下部のボタンを押します。<br />
凡例:'''({{int:cur}})'''=最新版との比較、'''({{int:last}})'''=直前の版との比較、'''{{int:minoreditletter}}'''=細部の編集",
'history-fieldset-title' => '履歴の閲覧',
'history-show-deleted' => '削除済みのみ',
'qbsettings-fixedright' => '右端',
'qbsettings-floatingleft' => 'ウィンドウの左上に固定',
'qbsettings-floatingright' => 'ウィンドウの右上に固定',
-'qbsettings-directionality' => 'あなたの言語のスクリプトの方向に応じて固定',
+'qbsettings-directionality' => 'あなたの言語の文字体系の書字方向に応じて固定',
# Preferences page
'preferences' => '個人設定',
'prefs-personal' => '利用者情報',
'prefs-rc' => '最近の更新',
'prefs-watchlist' => 'ウォッチリスト',
-'prefs-watchlist-days' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\99ã\82\8bæ\97¥数:',
+'prefs-watchlist-days' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81®è¡¨ç¤ºä»¶数:',
'prefs-watchlist-days-max' => '最大 $1 {{PLURAL:$1|日間}}',
-'prefs-watchlist-edits' => 'æ\8b¡å¼µã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\99ã\82\8b件数:',
+'prefs-watchlist-edits' => 'æ\8b¡å¼µã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81®è¡¨ç¤º件数:',
'prefs-watchlist-edits-max' => '最大数:1000',
'prefs-watchlist-token' => 'ウォッチリストのトークン:',
'prefs-misc' => 'その他',
'saveusergroups' => '利用者グループを保存',
'userrights-groupsmember' => '所属グループ:',
'userrights-groupsmember-auto' => '自動的に付与される権限:',
-'userrights-groups-help' => 'ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81\8cå±\9eã\81\99ã\82\8bã\82°ã\83«ã\83¼ã\83\97ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82
+'userrights-groups-help' => 'この利用者が属するグループを変更できます。
* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。
* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。
* 「*」はグループに一旦追加した場合に除去(あるいはその逆)ができないことを示しています。',
# Rights
'right-read' => 'ページを閲覧',
'right-edit' => 'ページを編集',
-'right-createpage' => '(議論ページではない)ページを作成',
+'right-createpage' => 'ページ(議論ページ以外)を作成',
'right-createtalk' => '議論ページを作成',
'right-createaccount' => '新しい利用者アカウントを作成',
'right-minoredit' => '細部の編集の印を付ける',
'right-move' => 'ページの移動',
'right-move-subpages' => '下位ページを含めてページを移動',
-'right-move-rootuserpages' => 'å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸æ\9c¬ä½\93ã\81®移動',
+'right-move-rootuserpages' => 'å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸æ\9c¬ä½\93ã\82\92移動',
'right-movefile' => 'ファイルの移動',
'right-suppressredirect' => 'ページの移動の際に元のページ名からのリダイレクトを作成しない',
-'right-upload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
-'right-reupload' => '存在するファイルの上書き',
-'right-reupload-own' => '自らがアップロードした存在するファイルの上書き',
+'right-upload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
+'right-reupload' => '既存のファイルに上書き',
+'right-reupload-own' => '自分がアップロードした既存のファイルに上書き',
'right-reupload-shared' => '共有メディアリポジトリ上のファイルのローカルでの上書き',
-'right-upload_by_url' => 'URLã\81\8bã\82\89ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
+'right-upload_by_url' => 'URLã\81\8bã\82\89ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
'right-purge' => '確認を省略してサイトのキャッシュを破棄',
'right-autoconfirmed' => '半保護されたページを編集',
-'right-bot' => '自動処理として認識',
+'right-bot' => '自動処理と認識させる',
'right-nominornewtalk' => '議論ページへ細部の編集をしたときに、新しいメッセージのお知らせを表示しない',
'right-apihighlimits' => 'API要求でより高い制限値の使用',
'right-writeapi' => '書き込みAPIの使用',
'right-delete' => 'ページの削除',
-'right-bigdelete' => '大ã\81\8dã\81ªå±¥æ´ã\81®ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81®削除',
+'right-bigdelete' => '大ã\81\8dã\81ªå±¥æ´ã\81\8cã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\82\92削除',
'right-deleterevision' => 'ページの特定の版の削除と復帰',
-'right-deletedhistory' => '関連する本文を除く、削除された履歴項目の閲覧',
-'right-deletedtext' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\9c¬æ\96\87ã\81¨å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fç\89\88é\96\93ã\81®å·®å\88\86ã\81®閲覧',
-'right-browsearchive' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\81®検索',
+'right-deletedhistory' => '削除された履歴項目(関連する本文を除く)を閲覧',
+'right-deletedtext' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\9c¬æ\96\87ã\81¨å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fç\89\88é\96\93ã\81®å·®å\88\86ã\82\92閲覧',
+'right-browsearchive' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\82\92検索',
'right-undelete' => 'ページの復帰',
'right-suppressrevision' => '管理者から隠された版の確認と復元',
-'right-suppressionlog' => 'é\9d\9eå\85¬é\96\8bè¨\98é\8c²ã\81®閲覧',
+'right-suppressionlog' => 'é\9d\9eå\85¬é\96\8bè¨\98é\8c²ã\82\92閲覧',
'right-block' => '他の利用者の編集をブロック',
'right-blockemail' => '利用者のメール送信をブロック',
-'right-hideuser' => 'å\88©ç\94¨è\80\85å\90\8dã\83\96ã\83ã\83\83ã\82¯ã\81\97ã\80\81公開記録から隠す',
+'right-hideuser' => 'å\88©ç\94¨è\80\85å\90\8dã\82\92ã\83\96ã\83ã\83\83ã\82¯ã\81\97ã\81¦公開記録から隠す',
'right-ipblock-exempt' => 'IPブロック、自動ブロック、広域ブロックを回避',
'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
'right-unblockself' => '自分自身に対するブロックを解除',
'right-markbotedits' => '巻き戻しをボットの編集として扱う',
'right-noratelimit' => '速度制限を受けない',
'right-import' => '他のウィキからのページ取り込み',
-'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81\8bã\82\89ã\81®ã\83\9aã\83¼ã\82¸ã\81®取り込み',
+'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81«ã\82\88ã\82\8bã\83\9aã\83¼ã\82¸取り込み',
'right-patrol' => '他人の編集を巡回済みにする',
'right-autopatrol' => '自分の編集を自動的に巡回済みにする',
'right-patrolmarks' => '最近の更新で巡回済み印を閲覧',
-'right-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\81®閲覧',
+'right-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\82\92閲覧',
'right-mergehistory' => 'ページ履歴の統合',
'right-userrights' => '全利用者権限を編集',
'right-userrights-interwiki' => '他のウィキの利用者の利用者権限を編集',
'right-siteadmin' => 'データベースのロックおよびロック解除',
'right-override-export-depth' => 'リンク先ページを5階層まで含めて書き出す',
'right-sendemail' => '他の利用者にメールを送信',
-'right-passwordreset' => 'パスワード再設定メールを閲覧する',
+'right-passwordreset' => 'パスワード再設定メールを閲覧',
# User rights log
'rightslog' => '利用者権限変更記録',
'action-move-subpages' => 'このページと下位ページの移動',
'action-move-rootuserpages' => '利用者ページ本体の移動',
'action-movefile' => 'このファイルの移動',
-'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
+'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
'action-reupload' => 'この既存のファイルに上書き',
'action-reupload-shared' => '共有リポジトリにあるこのファイルに上書き',
'action-upload_by_url' => 'URLからこのファイルをアップロード',
'action-deleterevision' => 'この版を削除',
'action-deletedhistory' => 'このページの削除履歴を表示',
'action-browsearchive' => '削除されたページの検索',
-'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®復帰',
+'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92復帰',
'action-suppressrevision' => '隠された版の確認と復元',
'action-suppressionlog' => 'この非公開記録の表示',
'action-block' => 'この利用者の編集をブロック',
'action-protect' => 'このページの保護レベルを変更',
'action-rollback' => '特定ページを最後に編集した利用者の編集を即時巻き戻し',
'action-import' => 'このページを他のウィキから取り込む',
-'action-importupload' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81\8bã\82\89取り込む',
+'action-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81§ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«取り込む',
'action-patrol' => '他の利用者の編集を巡回済みにする',
'action-autopatrol' => '自身の編集を巡回済みにする',
-'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\81®表示',
+'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\82\92表示',
'action-mergehistory' => 'このページの履歴を統合',
'action-userrights' => '全利用者権限の変更',
'action-userrights-interwiki' => '他のウィキ上の利用者の利用者権限変更',
* アップロード中のファイルの名前:'''<tt>[[:$1]]</tt>'''
* 既存ファイルの名前:'''<tt>[[:$2]]</tt>'''
違う名前を選択してください。",
-'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの(サムネイル)のようです。
+'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの''(サムネイル)''のようです。
[[$1|thumb]]
ファイル'''<tt>[[:$1]]</tt>'''を確認してください。
-確認したファイルが同じ画像のもとのサイズの版である場合、サムネイルを個別にアップロードする必要はありません。",
+確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
'file-thumbnail-no' => "ファイル名が'''<tt>$1</tt>'''から始まっています。
-他の画像から縮小されたもの(サムネイル)のようです。
-ã\82\88ã\82\8aé«\98精細ã\81ªç\94»å\83\8fã\82\92ã\81\8aæ\8c\81ã\81¡ã\81®å ´å\90\88ã\81¯ã\80\81ã\81\9dã\81¡ã\82\89ã\82\92ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\9dã\81\86ã\81§ない場合はファイル名を変更してください。",
+他の画像から縮小されたもの''(サムネイル)''のようです。
+ã\82\88ã\82\8aé«\98精細ã\81ªç\94»å\83\8fã\82\92ã\81\8aæ\8c\81ã\81¡ã\81®å ´å\90\88ã\81¯ã\81\9dã\82\8cã\82\92ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\8aæ\8c\81ã\81¡ã\81§ã\81¯ない場合はファイル名を変更してください。",
'fileexists-forbidden' => 'この名前のファイルは既に存在しており、上書きできません。
アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
[[File:$1|thumb|center|$1]]',
'filehist-dimensions' => '解像度',
'filehist-filesize' => 'ファイルサイズ',
'filehist-comment' => 'コメント',
-'filehist-missing' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81¿ã\81¤ã\81\8bりません',
+'filehist-missing' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81\82りません',
'imagelinks' => 'ファイルの使用状況',
'linkstoimage' => 'このファイルへは以下の {{PLURAL:$1|ページ| $1 ページ}}からリンクしています:',
'linkstoimage-more' => 'このファイルへは $1 を超える数のページからリンクがあります。
'filepage-nofile' => 'この名前のファイルは存在しません。',
'filepage-nofile-link' => 'この名前のファイルは存在しませんが、[$1 アップロード]することができます。',
'uploadnewversion-linktext' => 'このファイルの新しい版をアップロードする',
-'shared-repo-from' => '$1より',
+'shared-repo-from' => '$1 より',
'shared-repo' => '共有リポジトリ',
'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
'doubleredirectstext' => 'これは他のリダイレクトページへのリダイレクトの一覧です。
各行には、最初のリダイレクトと、その転送先のリダイレクト、そのまた転送先へのリンクが表示されています。多くの場合、最終の転送先が正しい転送先であり、最初のリダイレクトは直接最後の転送先に向けるべきです。
<del>打ち消し線</del>のはいった項目は既に修正されています。',
-'double-redirect-fixed-move' => '[[$1]]ã\81\8c移å\8b\95ã\81\95ã\82\8cました。
-これからは[[$2]]に転送されます。',
+'double-redirect-fixed-move' => '[[$1]]ã\82\92移å\8b\95ã\81\97ました。
+今後は[[$2]]に転送されます。',
'double-redirect-fixed-maintenance' => '[[$1]]から[[$2]]への二重転送を修正します。',
'double-redirect-fixer' => '転送修正係',
** 複数アカウントの不正利用
** 不適切な利用者名',
'ipb-hardblock' => 'ログインしている利用者によるこのIPアドレスからの編集を不許可',
-'ipbcreateaccount' => 'アカウント作成を禁止する',
+'ipbcreateaccount' => 'アカウント作成を禁止',
'ipbemailban' => 'メール送信を防止',
'ipbenableautoblock' => 'この利用者が最後に使用したIPアドレスと、後に編集しようとしたIPアドレスを自動的にブロック',
'ipbsubmit' => 'この利用者をブロック',
'delete_and_move' => '削除して移動',
'delete_and_move_text' => '== 削除が必要です ==
移動先「[[:$1]]」は既に存在しています。
-移å\8b\95ã\81\99ã\82\8bためにこのページを削除しますか?',
+移å\8b\95ã\81®ためにこのページを削除しますか?',
'delete_and_move_confirm' => 'はい、ページを削除します',
'delete_and_move_reason' => '「[[$1]]」からの移動のために削除',
'selfmove' => '移動元と移動先のページ名が同じです。
'nonfile-cannot-move-to-file' => 'ファイルでないものを、ファイル名前空間に移動することはできません',
'imagetypemismatch' => '新しいファイルの拡張子がファイルのタイプと一致していません。',
'imageinvalidfilename' => '対象ファイル名が不正です',
-'fix-double-redirects' => 'このページへのリダイレクトがあればそのリダイレクトを修正する',
+'fix-double-redirects' => 'このページへのリダイレクトがあればそのリダイレクトを修正',
'move-leave-redirect' => '移動元にリダイレクトを作成する',
-'protectedpagemovewarning' => "'''警告:'''このページは保護されているため、管理者権限をもつ利用者のみが移動できます。
+'protectedpagemovewarning' => "'''警告:'''このページは保護されているため、管理者権限を持つ利用者のみが移動できます。
参考として以下に一番最後の記録を表示します:",
-'semiprotectedpagemovewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81\97ã\81\8b移å\8b\95ã\81§ã\81\8dã\81¾ã\81\9bã\82\93。
+'semiprotectedpagemovewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8c移å\8b\95ã\81§ã\81\8dã\81¾ã\81\99。
参考として以下に一番最後の記録を表示します:",
'move-over-sharedrepo' => '== ファイルが存在します ==
[[:$1]]は共有リポジトリ上に存在します。ファイルをこの名前に移動すると共有ファイルを上書きします。',
'tooltip-pt-login' => 'ログインすることが推奨されます。ただし、必須ではありません。',
'tooltip-pt-anonlogin' => 'ログインすることが推奨されます。ただし、必須ではありません。',
'tooltip-pt-logout' => 'ログアウト',
-'tooltip-ca-talk' => '記事についての議論',
+'tooltip-ca-talk' => '本文ページについての議論',
'tooltip-ca-edit' => 'このページを編集できます。保存する前にプレビューボタンを使用してください。',
-'tooltip-ca-addsection' => '新しい節を開始する',
+'tooltip-ca-addsection' => '新しい節を開始',
'tooltip-ca-viewsource' => 'このページは保護されています。
ページのソースを閲覧できます。',
'tooltip-ca-history' => 'このページの過去の版',
'tooltip-t-specialpages' => '特別ページの一覧',
'tooltip-t-print' => 'このページの印刷用ページ',
'tooltip-t-permalink' => 'このページのこの版への固定リンク',
-'tooltip-ca-nstab-main' => '本文を表示',
+'tooltip-ca-nstab-main' => '本文を閲覧',
'tooltip-ca-nstab-user' => '利用者ページを表示',
'tooltip-ca-nstab-media' => 'メディアページを表示',
'tooltip-ca-nstab-special' => 'これは特別ページです。編集することはできません。',
'tooltip-ca-nstab-mediawiki' => 'システムメッセージを表示',
'tooltip-ca-nstab-template' => 'テンプレートを表示',
'tooltip-ca-nstab-help' => 'ヘルプページを表示',
-'tooltip-ca-nstab-category' => 'カテゴリページを表示',
-'tooltip-minoredit' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92ç´°é\83¨ã\81®å¤\89æ\9b´ã\81¨ã\83\9eã\83¼ã\82¯',
+'tooltip-ca-nstab-category' => 'カテゴリページを閲覧',
+'tooltip-minoredit' => 'ã\81\93ã\81®ç·¨é\9b\86ã\81«ç´°é\83¨ã\81®å¤\89æ\9b´ã\81®å\8d°ã\82\92ä»\98ã\81\91ã\82\8b',
'tooltip-save' => '変更を保存',
'tooltip-preview' => '変更をプレビューで確認できます。保存前に使用してください!',
'tooltip-diff' => '文章への変更を表示',
'colon-separator' => ':',
'pipe-separator' => ' | ',
'word-separator' => '',
-'parentheses' => '($1)',
+'parentheses' => '($1)',
# Multipage image navigation
'imgmultipageprev' => '←前ページ',
'fileduplicatesearch-info' => '$1×$2 ピクセル<br />ファイルサイズ:$3<br />MIMEタイプ:$4',
'fileduplicatesearch-result-1' => 'ファイル「$1」と重複するファイルはありません。',
'fileduplicatesearch-result-n' => 'ファイル「$1」は$2件のファイルと重複しています。',
-'fileduplicatesearch-noresults' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81¿ã\81¤ã\81\8bりません。',
+'fileduplicatesearch-noresults' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯ã\81\82りません。',
# Special:SpecialPages
'specialpages' => '特別ページ',
'updated' => '(განახლდა)',
'note' => "'''შენიშვნა:'''",
'previewnote' => "'''დაიმახსოვრეთ, ეს მხოლოდ წინასწარი გადახედვაა.'''
-თქვენი ცვლილებები ჯერ არ შენახულა! [[#editform|→ რედაქტირების გაგრძელება]]",
+თქვენი ცვლილებები ჯერ არ შენახულა!",
+'continue-editing' => 'რედაქტირების გაგრძელება',
'previewconflict' => 'შავი ნიმუში უჩვენებს ტექსტს ზედა რედაქტირების ფანჯარაში, როგორც ის გამოჩნდება თუ თქვენ მას შეინახავთ.',
'session_fail_preview' => "'''უკაცრავად! ვერ შევძელით თქვენი რედაქტირების შენახვა სესიის მონაცემთა დაკარგვის გამო.
გთხოვთ ისევ სცადოთ.
'previewnote' => "'''Ttagi d azar-timeẓriwt kan, ibeddlen mazal ur ttusmektin ara!'''
'''Cfut, ttagi d azar-timeẓriwt kan.'''
-Ibeddlen mazal ur ttusmektin ara! [[#editform|→ Kemmel abeddel]]",
+Ibeddlen mazal ur ttusmektin ara!",
'previewconflict' => 'Pre-timeẓriwt-agi tesskan aḍris i yellan deg usawen lemmer tebɣiḍ a tt-tesmektiḍ.',
'session_fail_preview' => "'''Suref-aɣ! ur nezmir ara a nesmekti abeddil inek axaṭer yella ugur.
G leɛnayek ɛreḍ tikelt nniḍen. Lukan mazal yella ugur, ffeɣ umbeɛd kcem.'''",
* @file
*
* @author AlefZet
+ * @author Alibek Kisybay
* @author GaiJin
* @author Kaztrans
* @author Urhixidur
'vector-view-view' => 'Оқу',
'vector-view-viewsource' => 'Қайнар көзін қарау',
'actions' => 'Әрекеттер',
-'namespaces' => 'Ð\95Ñ\81Ñ\96м аÑ\8fÑ\81Ñ\8b',
+'namespaces' => 'Ð\95Ñ\81Ñ\96м кеңÑ\96Ñ\81Ñ\82Ñ\96гÑ\96',
'variants' => 'Нұсқалар',
'errorpagetitle' => 'Қате',
'ok' => 'OK',
'pagetitle' => '$1 — {{SITENAME}}',
'retrievedfrom' => '«$1» бетінен алынған',
-'youhavenewmessages' => 'СÑ\96зге $1 бар ($2).',
+'youhavenewmessages' => 'СÑ\96зде $1 бар ($2).',
'newmessageslink' => 'жаңа хабарлар',
'newmessagesdifflink' => 'соңғы өзгерісіне',
'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарлар бар',
Егер бұл орынды болмаса, бағдарламалық жасақтамадағы қатеге тап болуыңыз мүмкін.
Бұл туралы нақты URL жайына аңғартпа жасап, әкімшіге баянаттаңыз.',
-'missingarticle-rev' => '(түзету н-і: $1)',
+'missingarticle-rev' => '(түзету нұсқасы: $1)',
'missingarticle-diff' => '(Айрм.: $1, $2)',
'readonly_lag' => 'Жетек дерекқор серверлер басқысымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
'internalerror' => 'Ішкі қате',
'wrongpasswordempty' => 'Құпия сөз бос болған. Қайта байқап көріңіз.',
'passwordtooshort' => 'Құпия сөзіңіз жарамсыз не тым қысқа.
Бұнда ең кемінде $1 таңба болуы және де қатысушы атыңыздан өзге болуы жөн.',
-'mailmypassword' => 'Ò\9aұпиÑ\8f Ñ\81өзÑ\96мдÑ\96 Ñ\85аÑ\82пен жібер',
+'mailmypassword' => 'Ò\9aұпиÑ\8f Ñ\81өзÑ\96мдÑ\96 Ñ\8dлекÑ\82Ñ\80ондÑ\8b поÑ\88Ñ\82ама жібер',
'passwordremindertitle' => '{{SITENAME}} үшін жаңа уақытша құпия сөз',
'passwordremindertext' => 'Кейбіреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз)
сізге {{SITENAME}} үшін жаңа құпия сөз жөнелетуін бізден сұраған ($4).
'mailerror' => 'Хат жөнелту қатесі: $1',
'acct_creation_throttle_hit' => 'Ғафу етіңіз, сіз алдақашан $1 рет тіркелгі жасапсыз.
Онан артық істей алмайсыз.',
-'emailauthenticated' => 'Е-пошта мекенжайыңыз расталған кезі: $1.',
+'emailauthenticated' => 'Е-пошта мекенжайыңыз расталған кезі: $3, $2.',
'emailnotauthenticated' => 'Е-пошта мекенжайыңыз әлі расталған жоқ.
Келесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.',
'noemailprefs' => 'Осы мүмкіндіктер істеуі үшін е-пошта мекенжайыңызды енгізіңіз.',
'accmailtext' => '$2 жайына «$1» құпия сөзі жөнелтілді.',
'newarticle' => '(Жаңа)',
'newarticletext' => 'Сілтемеге еріп әлі басталмаған бетке келіпсіз.
-Ð\91еÑ\82Ñ\82Ñ\96 баÑ\81Ñ\82аÑ\83 Ò¯Ñ\88Ñ\96н, Ñ\82өмендегÑ\96 кÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 оÑ\80нÑ\8bнда мÓ\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96 Ñ\82еÑ\80Ñ\96Ò£Ñ\96з (көбÑ\96Ñ\80ек аÒ\9bпаÑ\80аÑ\82 Ò¯Ñ\88Ñ\96н [[{{{{ns:mediawiki}}:helppage}}|анықтама бетін]] қараңыз).
-Егер жаңылғаннан осында келген болсаңыз, шолғышыңыздың «Артқа» деген батырмасын нұқыңыз.',
+Ð\91еÑ\82Ñ\82Ñ\96 баÑ\81Ñ\82аÑ\83 Ò¯Ñ\88Ñ\96н, Ñ\82өменгÑ\96 Ñ\82еÑ\80езеде мÓ\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96 Ñ\82еÑ\80Ñ\96Ò£Ñ\96з (көбÑ\96Ñ\80ек аÒ\9bпаÑ\80аÑ\82 Ò¯Ñ\88Ñ\96н [[{{MediaWiki:Helppage}}|анықтама бетін]] қараңыз).
+Егер жаңылғаннан осында келген болсаңыз, браузердің «артқа» деген батырмасын басыңыз.',
'anontalkpagetext' => "----''Бұл тіркелгісіз (немесе тіркелгісін қолданбаған) қатысушы талқылау беті. Осы қатысушыны біз тек сандық IP мекенжайымен теңдестіреміз.
Осындай IP мекенжай бірнеше қатысушыға ортақтастырылған болуы мүмкін.
Егер сіз тіркелгісіз қатысушы болсаңыз және сізге қатыссыз мәндемелер жіберілгенін сезсеңіз, басқа тіркелгісіз қатысушылармен араластырмауы үшін [[{{#special:Userlogin}}|тіркеліңіз не кіріңіз]].''",
-'noarticletext' => 'Бұл бетте ағымда еш мәтін жоқ, дегенмен басқа беттерден [[{{#special:Search}}/{{PAGENAME}}|бұл бет тақырыбы атын іздей]] не [{{fullurl:{{FULLPAGENAME}}|action=edit}} бұл бетті өңдей] аласыз.',
+'noarticletext' => "Ағымда бұл бетте еш мәтін жоқ.
+* Басқа беттерден [[Special:Search/{{PAGENAME}}|бұл бет атауын іздеу]],
+* <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,
+* <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» қатысушы тіркелгісі жазып алынбаған. Бұл бетті бастау/өңдеу талабыңызды тексеріп шығыңыз.',
'clearyourcache' => "'''Аңғартпа:''' Сақтағаннан кейін, өзгерістерді көру үшін шолғыш бүркемесін орағыту ықтимал. '''Mozilla / Firefox / Safari:''' ''Қайта жүктеу'' батырмасын нұқығанда ''Shift'' тұтыңыз, не ''Ctrl-Shift-R'' басыңыз (Apple Mac — ''Cmd-Shift-R''); '''IE:''' ''Жаңарту'' батырмасын нұқығанда ''Ctrl'' тұтыңыз, не ''Ctrl-F5'' басыңыз; '''Konqueror:''': ''Жаңарту'' батырмасын жай нұқыңыз, не ''F5'' басыңыз; '''Opera''' пайданушылары ''Құралдар→Бапталымдар'' дегенге барып бүркемесін толық тазарту жөн.",
'usercssyoucanpreview' => "'''Ақыл-кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
'semiprotectedpagewarning' => "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.",
'cascadeprotectedwarning' => "'''Құлақтандыру''': Бұл бет құлыпталған, енді тек әкімші құқықтары бар қатысушылар бұны өңдей алады.Бұның себебі: бұл бет «баулы қорғауы» бар келесі {{PLURAL:$1|беттің|беттердің}} кірікбеті:",
'titleprotectedwarning' => "'''ҚҰЛАҚТАНДЫРУ: Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
-'templatesused' => 'Бұл бетте қолданылған үлгілер:',
+'templatesused' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
'templatesusedpreview' => 'Бұны қарап шығуға қолданылған үлгілер:',
'templatesusedsection' => 'Бұл бөлімде қолданылған үлгілер:',
'template-protected' => '(қорғалған)',
'permissionserrors' => 'Рұқсаттар қателері',
'permissionserrorstext' => 'Бұны істеуге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
'permissionserrorstext-withaction' => '$2 дегенге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
-'recreate-moveddeleted-warn' => "'''Құлақтандыру: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
+'recreate-moveddeleted-warn' => "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
-Ð\9cÑ\8bна беÑ\82 өңдеÑ\83Ñ\96н жалÒ\93аÑ\81Ñ\82Ñ\8bÑ\80Ñ\83 Ò¯Ñ\88Ñ\96н жаÑ\80аÑ\81Ñ\82Ñ\8bÒ\93Ñ\8bн Ñ\82екÑ\81еÑ\80Ñ\96п Ñ\88Ñ\8bÒ\93Ñ\83Ñ\8bÒ£Ñ\8bз жөн.
-Қолайлы болуы үшін бұл беттің жою журналы келтірілген:",
+Ð\91ұл беÑ\82Ñ\82Ñ\96 жаңадан баÑ\81Ñ\82аÑ\83дÑ\8bÒ£ оÑ\80Ñ\8bндÑ\8b екенÑ\96не көз жеÑ\82кÑ\96зÑ\96Ò£Ñ\96з.
+Төменде бұл бетке қатысты жою (және жылжыту) журналы көрсетілген:",
'log-fulllog' => 'Толық журналды қарау',
# Parser/template warnings
'revdelete-success' => "'''Түзету көрінісі сәтті қойылды.'''",
'logdelete-success' => "'''Журнал көрінісі сәтті қойылды.'''",
'revdel-restore' => 'Көрінісін өзгерту',
+'revdel-restore-deleted' => 'жойылған нұсқалары',
+'revdel-restore-visible' => 'көрінетін нұсқалары',
'pagehist' => 'Бет тарихы',
'deletedhist' => 'Жойылған тарихы',
'revdelete-edit-reasonlist' => 'Жою себептерін өңдеу',
'mergelogpagetext' => 'Төменде бір беттің тарихы өзге бетке біріктіру ең соңғы тізімі келтіріледі.',
# Diffs
-'history-title' => '«$1» — түзету тарихы',
+'history-title' => '«$1» — өңдеу тарихы',
'difference' => '(Түзетулер арасындағы айырмашылық)',
'lineno' => 'Жол нөмірі $1:',
'compareselectedversions' => 'Таңдалған нұсқаларды салыстыру',
'showhideselectedversions' => 'Бөлектенген нұсқаларды көрсет/жасыр',
'editundo' => 'жоққа шығару',
-'diff-multi' => '(Арадағы $1 түзету көрсетілмеген.)',
+'diff-multi' => '($2 қатысушының арадағы $1 түзетуі көрсетілмеген)',
# Search results
'searchresults' => 'Іздеу нәтижелері',
'notextmatches' => 'Еш бет мәтіні сәйкес емес',
'prevn' => 'алдыңғы {{PLURAL:$1|$1}}',
'nextn' => 'келесі {{PLURAL:$1|$1}}',
+'prevn-title' => 'Алдыңғы $1 {{PLURAL:$1|жазба|жазбалар}}',
+'nextn-title' => 'Келесі $1 {{PLURAL:$1|жазба|жазбалар}}',
+'shown-title' => 'Осы бетте {{PLURAL:$1|жазба}} көрсету.',
'viewprevnext' => 'Көрсетілуі: ($1 {{int:pipe-separator}} $2) ($3) жазба',
+'searchmenu-exists' => "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
'searchmenu-new' => "'''\"[[:\$1]]\" осындай атпен бетті бастау'''",
'searchhelp-url' => 'Help:Мазмұны',
+'searchprofile-articles' => 'Негізгі беттер',
+'searchprofile-project' => 'Анықтама және жоба беттері',
+'searchprofile-images' => 'Мультимедиа',
'searchprofile-everything' => 'Барлық жерде',
+'searchprofile-advanced' => 'Кеңейтілген',
'searchprofile-articles-tooltip' => '$1 іздеу',
+'searchprofile-project-tooltip' => '$1 іздеу',
+'searchprofile-images-tooltip' => 'Файлдарды іздеу',
+'searchprofile-everything-tooltip' => 'Барлық беттерден іздеу (талқылау беттерін қоса)',
+'searchprofile-advanced-tooltip' => 'Белгіленген есім кеңістігінен іздеу',
'search-result-size' => '$1 ($2 сөз)',
'search-result-score' => 'Арақатынастылығы: $1 %',
'search-redirect' => '(айдағыш $1)',
'showingresults' => "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
'showingresultsnum' => "Төменде нөмір '''$2''' орнынан бастап '''$3''' нәтиже көрсетіледі.",
'nonefound' => "'''Аңғартпа''': Әдепкіден тек кейбір есім аялардан ізделінеді. Барлық мағлұмат түрін (соның ішінде талқылау беттерді, үлгілерді т.б.) іздеу үшін сұранымыңызды ''барлық:'' деп бастаңыз, немесе қалаған есім аясын бастауыш есебінде қолданыңыз.",
+'search-nonefound' => 'Сұрауға сәйкес нәтижелер табылмады.',
'powersearch' => 'Кеңейтілген іздеу',
'powersearch-legend' => 'Кеңейтілген іздеу',
'powersearch-ns' => 'Мына есім аяларда іздеу:',
'timezoneregion-pacific' => 'Тынық мұхиты',
'allowemail' => 'Басқадан хат қабылдауын қос',
'prefs-searchoptions' => 'Іздеу бапталымдары',
-'prefs-namespaces' => 'Ð\95Ñ\81Ñ\96м аÑ\8fлаÑ\80Ñ\8b',
+'prefs-namespaces' => 'Ð\95Ñ\81Ñ\96м кеңÑ\96Ñ\81Ñ\82Ñ\96кÑ\82еÑ\80Ñ\96',
'defaultns' => 'Мына есім аяларда әдепкіден іздеу:',
'default' => 'әдепкі',
'prefs-files' => 'Файлдар',
'email' => 'Е-поштаңыз',
'prefs-help-realname' => 'Нақты атыңыз міндетті емес.
Егер бұны жетістіруді таңдасаңыз, бұл түзетуіңіздің ауторлығын анықтау үшін қолданылады.',
-'prefs-help-email' => 'Ð\95-поÑ\88Ñ\82а мекенжайÑ\8b мÑ\96ндеÑ\82Ñ\82Ñ\96 емеÑ\81, бÑ\96Ñ\80аÒ\9b жеке баÑ\81Ñ\8bÒ£Ñ\8bздÑ\8b аÑ\88пай «Ò\9aаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b» немеÑ\81е «Ò\9aаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b_Ñ\82алÒ\9bÑ\8bлаÑ\83Ñ\8b» деген беÑ\82Ñ\82еÑ\80Ñ\96Ò£Ñ\96з аÑ\80Ò\9bÑ\8bлÑ\8b баÑ\80Ñ\88а Ñ\81Ñ\96збен байланÑ\8bÑ\81а алады.',
+'prefs-help-email' => 'ÐлекÑ\82Ñ\80ондÑ\8b поÑ\88Ñ\82аңÑ\8bздÑ\8bÒ£ мекенжайÑ\8bн көÑ\80Ñ\81еÑ\82Ñ\83 мÑ\96ндеÑ\82Ñ\82Ñ\96 емеÑ\81, бÑ\96Ñ\80аÒ\9b Ò\9bұпиÑ\8f Ñ\81өзÑ\96Ò£Ñ\96здÑ\96 ұмÑ\8bÑ\82Ò\9bан жаÒ\93дайда кеÑ\80ек болады.',
'prefs-help-email-required' => 'Е-пошта мекенжайы керек.',
'prefs-info' => 'Негізгі мәлімет',
'prefs-i18n' => 'Тіл туралы мәлімет',
'recentchanges-legend' => 'Жуықтағы өзгерістер баптаулары',
'recentchangestext' => 'Бұл бетте осы уикидегі болған жуықтағы өзгерістер байқалады.',
'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.',
+'recentchanges-label-newpage' => 'Бұл өңдеме арқылы жаңа бет басталды',
'recentchanges-label-minor' => 'Бұл шағын өңдеме',
+'recentchanges-label-bot' => 'Бұл өңдемені бот жасады.',
+'recentchanges-label-unpatrolled' => 'Бұл өңдеме әлі тексеруден өтпеді.',
'rcnote' => "$3 кезіне дейін — төменде соңғы {{PLURAL:$2|күндегі|'''$2''' күндегі}}, соңғы '''$1''' өзгеріс көрсетіледі.",
'rcnotefrom' => "'''$2''' кезінен бері — төменде '''$1''' жеткенше дейін өзгерістер көрсетіледі.",
'rclistfrom' => '$1 кезінен бері — жаңа өзгерістерді көрсет.',
'rc_categories' => 'Санаттарға шектеу ("|" белгісімен бөліктеңіз)',
'rc_categories_any' => 'Қайсыбір',
'newsectionsummary' => '/* $1 */ жаңа бөлім',
+'rc-enhanced-expand' => 'Толық ақпаратын көрсету (JavaScript-ті керек етеді)',
+'rc-enhanced-hide' => 'Толық ақпаратын жасыру',
# Recent changes linked
'recentchangeslinked' => 'Қатысты өзгерістер',
'file-exists-duplicate' => 'Бұл файл келесі {{PLURAL:$1|файлдың|файлдарының}} телнұсқасы:',
'uploadwarning' => 'Қотарып беру жөнінде құлақтандыру',
'savefile' => 'Файлды сақтау',
-'uploadedimage' => '«[[$1]]» файлын қотарып берді',
+'uploadedimage' => '«[[$1]]» файлын жүктеді',
'overwroteimage' => '«[[$1]]» файлынның жаңа нұсқасын қотарып берді',
'uploaddisabled' => 'Қотарып беру өшірілген',
'uploaddisabledtext' => '{{SITENAME}} жобасында файл қотарып беруі өшірілген.',
Талабыңызды қол тиген кезінде қайта байқап көруіңіз мүмкін.',
'license' => 'Лицензияландыруы:',
-'license-header' => 'Лицензияландыруы:',
+'license-header' => 'Лицензияландыруы',
'nolicense' => 'Ештеңе бөлектенбеген',
'license-nopreview' => '(Қарап шығу жетімді емес)',
'upload_source_url' => ' (жарамды, баршаға қатынаулы URL)',
'nextpage' => 'Келесі бетке ($1)',
'prevpage' => 'Алдыңғы бетке ($1)',
'allpagesfrom' => 'Мына беттен бастап көрсету:',
-'allarticles' => 'Барлық бет тізімі',
-'allinnamespace' => 'Барлық бет ($1 есім аясы)',
+'allarticles' => 'Барлық беттер тізімі',
+'allinnamespace' => 'Барлық беттер ($1 есім кеңістігі)',
'allnotinnamespace' => 'Барлық бет ($1 есім аясынан тыс)',
'allpagesprev' => 'Алдыңғыға',
'allpagesnext' => 'Келесіге',
# Special:LinkSearch
'linksearch' => 'Сыртқы сілтемелерді іздеу',
'linksearch-pat' => 'Іздеу шарты:',
-'linksearch-ns' => 'Ð\95Ñ\81Ñ\96м аÑ\8fÑ\81Ñ\8b:',
+'linksearch-ns' => 'Ð\95Ñ\81Ñ\96м кеңÑ\96Ñ\81Ñ\82Ñ\96гÑ\96:',
'linksearch-ok' => 'Іздеу',
'linksearch-text' => '«*.wikipedia.org» атауына ұқсасты бәдел нышандарды қолдануға болады.',
'linksearch-line' => '$2 дегеннен $1 сілтеген',
'historywarning' => 'Құлақтандыру: Жоюы көзделген бетте тарихы бар:',
'confirmdeletetext' => 'Бетті бүкіл тарихымен бірге дерекқордан жойғалы жатырсыз.
Бұл әрекетіңіз ниетпен жасалғанын, әрекет салдары есепке алынғанын және әрекетіңіз [[{{{{ns:mediawiki}}:Policy-url}}]]-іне лайықты болғанын тағы бір рет тексеріп шығуыңызды сұраймыз.',
-'actioncomplete' => 'Әрекет бітті',
+'actioncomplete' => 'Әрекет орындалды',
+'actionfailed' => 'Әрекет орындалмады',
'deletedtext' => '«$1» жойылды.
Жуықтағы жоюлар туралы жазбаларын $2 дегеннен қараңыз.',
'dellogpage' => 'Жою_журналы',
'protectlogpage' => 'Қорғау журналы',
'protectlogtext' => 'Төменде беттердің қорғау/қорғамау тізімі берілген.
Ағымдағы қорғау әректтер бар беттер үшін [[{{#special:Protectedpages}}|қорғалған бет тізімін]] қараңыз.',
-'protectedarticle' => '«[[$1]]» қорғалды',
+'protectedarticle' => '«[[$1]]» беті қорғалды',
'modifiedarticleprotection' => '«[[$1]]» қорғалу деңгейі өзгерді',
'unprotectedarticle' => '«[[$1]]» қорғалуы өшірілді',
'protect-title' => '«$1» қорғау деңгейін өзгерту',
Сілтемеңіз жарамсыз, не түзету қалпына келтірілген, немесе мұрағаттан аласталған болуы мүмкін.',
'undelete-nodiff' => 'Еш алдыңғы түзету табылмады.',
'undeletebtn' => 'Қалпына келтір!',
-'undeletelink' => 'қалпына келтіру',
+'undeletelink' => 'қарау/қалпына келтіру',
+'undeleteviewlink' => 'қарау',
'undeletereset' => 'Қайта қой',
'undeletecomment' => 'Мәндемесі:',
'undeletedrevisions' => '$1 түзету қалпына келтірілді',
'undelete-show-file-submit' => 'Иә',
# Namespace form on various pages
-'namespace' => 'Ð\95Ñ\81Ñ\96м аÑ\8fÑ\81Ñ\8b:',
+'namespace' => 'Ð\95Ñ\81Ñ\96м кеңÑ\96Ñ\81Ñ\82Ñ\96гÑ\96:',
'invert' => 'Таңдалғанды жасыру',
'namespace_association' => 'Қатысты есім аясы',
'blanknamespace' => 'Негізгі беттерден',
# Contributions
'contributions' => 'Қатысушы үлесі',
+'contributions-title' => '$1 есімді қатысушының үлесі',
'mycontris' => 'Үлесім',
'contribsub2' => '$1 ($2) үлесі',
'nocontribs' => 'Осы іздеу шартына сәйкес өзгерістер табылған жоқ.',
'sp-contributions-newbies-sub' => 'Жаңадан тіркелгі жасағандар үшін',
'sp-contributions-blocklog' => 'Бұғаттау журналы',
'sp-contributions-deleted' => 'Қатысушының жойылған үлесі',
-'sp-contributions-talk' => 'Талқылауы',
+'sp-contributions-uploads' => 'жүктеулер',
+'sp-contributions-logs' => 'журналдар',
+'sp-contributions-talk' => 'талқылауы',
'sp-contributions-userrights' => 'Қатысушы құқықтарын реттеу',
'sp-contributions-search' => 'Үлес үшін іздеу',
'sp-contributions-username' => 'IP мекенжайы не қатысушы аты:',
'ipusubmit' => 'Осы мекенжайды бұғаттамау',
'unblocked' => '[[User:$1|$1]] бұғаттауы өшірілді',
'unblocked-id' => '$1 бұғаттау аласталды',
-'ipblocklist' => 'Бұғатталған қатысушы / IP мекенжай тізімі',
+'ipblocklist' => 'Бұғатталған қатысушылар',
'ipblocklist-legend' => 'Бұғатталған қатысушыны табу',
'ipblocklist-submit' => 'Ізде',
'infiniteblock' => 'мәнгі',
'ipblocklist-no-results' => 'Сұратылған IP мекенжай не қатысушы аты бұғатталған емес.',
'blocklink' => 'бұғаттау',
'unblocklink' => 'бұғаттамау',
+'change-blocklink' => 'Бұғаттауын өзгерту',
'contribslink' => 'үлесі',
'autoblocker' => 'IP мекенжайыңызды жуықта «[[{{ns:user}}:1|$1]]» пайдаланған, сондықтан өзбұғатталған.
$1 бұғаттауы үшін келтірілген себебі: «$2».',
'import-logentry-interwiki-detail' => '$2 дегеннен $1 түзету',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Жеке бетім',
+'tooltip-pt-userpage' => 'Жеке бетіңіз',
'tooltip-pt-anonuserpage' => 'Бұл IP мекенжайдың жеке беті',
-'tooltip-pt-mytalk' => 'Талқылау бетім',
+'tooltip-pt-mytalk' => 'Талқылау бетіңіз',
'tooltip-pt-anontalk' => 'Бұл IP мекенжай өңдемелерін талқылау',
'tooltip-pt-preferences' => 'Бапталымдарым',
'tooltip-pt-watchlist' => 'Өзгерістерін бақылап тұрған беттер тізімім.',
-'tooltip-pt-mycontris' => 'Үлестерімдің тізімі',
+'tooltip-pt-mycontris' => 'Өңдеулеріңіздің тізімі',
'tooltip-pt-login' => 'Кіруіңізді ұсынамыз, ол міндетті емес.',
'tooltip-pt-anonlogin' => 'Кіруіңізді ұсынамыз, бірақ, ол міндетті емес.',
'tooltip-pt-logout' => 'Шығу',
'tooltip-watch' => 'Бұл бетті бақылау тізіміңізге үстеу',
'tooltip-recreate' => 'Бет жойылғанына қарамастан қайта бастау',
'tooltip-upload' => 'Қотарып беруді бастау',
+'tooltip-rollback' => '"Шегіндіру" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру',
+'tooltip-summary' => 'Қысқаша сипаттамасын жазыңыз',
# Stylesheets
'common.css' => '/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */',
'filedelete-archive-read-only' => '«$1» мұрағат қалтасына веб-сервер жаза алмайды.',
# Browsing diffs
-'previousdiff' => '← Алдыңғы айырм.',
-'nextdiff' => 'Келесі айырм. →',
+'previousdiff' => '← Алдыңғы өңдеме',
+'nextdiff' => 'Келесі өңдеме →',
# Media information
'mediawarning' => "'''Құлақтандыру''': Бұл файл түрінде қаскүнемді коды бар болуы ықтимал; бұны жегіп жүйеңізге зиян келтіруіңіз мүмкін.",
'widthheightpage' => '$1 × $2, $3 бет',
'file-info' => 'Файл мөлшері: $1, MIME түрі: $2',
'file-info-size' => '$1 × $2 нүкте, файл мөлшері: $3, MIME түрі: $4',
-'file-nohires' => 'Ð\96оÒ\93аÑ\80Ñ\8b ажÑ\8bÑ\80аÑ\82Ñ\8bлÑ\8bмдÑ\8bÒ\93Ñ\8b жеÑ\82Ñ\96мÑ\81Ñ\96з.',
+'file-nohires' => 'Ð\96оÒ\93аÑ\80Ñ\8b кеңейÑ\82Ñ\96лÑ\96мдегÑ\96 нұÑ\81Ò\9bалаÑ\80Ñ\8b жоÒ\9b.',
'svg-long-desc' => 'SVG файлы, кесімді $1 × $2 нүкте, файл мөлшері: $3',
'show-big-image' => 'Жоғары ажыратылымды',
# External editor support
'edit-externally' => 'Бұл файлды шеттік қондырма арқылы өңдеу',
-'edit-externally-help' => 'Көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқамаларын] қараңыз.',
+'edit-externally-help' => '(көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқауларын] қараңыз.',
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'барлық',
# Watchlist editing tools
'watchlisttools-view' => 'Қатысты өзгерістерді қарау',
'watchlisttools-edit' => 'Бақылау тізімді қарау және өңдеу',
-'watchlisttools-raw' => 'Қам бақылау тізімді өңдеу',
+'watchlisttools-raw' => 'Бақылау тізімін өңдеу',
# Iranian month names
'iranian-calendar-m1' => 'пыруардин',
.css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
'updated' => '(바뀜)',
'note' => "'''주의:'''",
-'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다! [[#editform|→ 편집 계속하기]]",
+'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다!",
+'continue-editing' => '계속 편집하기',
'previewconflict' => '이 미리 보기는 저장할 때의 모습, 즉 위쪽 편집창의 문서를 반영합니다.',
'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.
다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인해 보십시오.'''",
'allpages-bad-ns' => '{{SITENAME}}에서는 ‘$1’ 이름공간을 사용하지 않습니다.',
'allpages-hide-redirects' => '넘겨주기 숨기기',
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '지금 이 문서의 캐시된 버전을 보고 있습니다. 이 버전은 최대 $1만큼 지난 버전일 가능성이 있습니다.',
+'cachedspecial-refresh-now' => '최신 버전 보기.',
+
# Special:Categories
'categories' => '분류',
'categoriespagetext' => '{{PLURAL:$1}}문서나 자료를 담고 있는 분류 목록입니다.
'ipb-confirm' => '차단 확인',
'badipaddress' => '잘못된 IP 주소',
'blockipsuccesssub' => '차단 완료',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다. 차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다.<br />
+차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
'ipb-blockingself' => '자기 자신을 차단하려고 합니다. 정말로 실행할까요?',
'ipb-confirmhideuser' => '당신은 사용자를 차단하면서 "계정 숨기기" 설정을 선택했습니다. 이로써 모든 기록에서 이 사용자의 계정 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
'ipb-edit-dropdown' => '차단 이유 목록 편집하기',
Себеби: браузеригиз редактор терезеде пунктуация белгилени терс кёргюзеди, аны ючюн статьяны тексти бузулургъа боллукъду.
Бу халатлары болгъан аноним веб-проксилени хайырландырылгъанлары ючюн болургъа боллукъду'''",
'editing' => '«$1» бетни тюрлендириу',
+'creating' => '«$1» бетни къурау',
'editingsection' => '«$1» бетде бёлюмню тюрлендириу',
'editingcomment' => '«$1» бетни тюрлендириу (джангы бёлюм)',
'editconflict' => 'Тюрлендириу конфликт: $1',
'unblocked-id' => '$1 тыйылыу къоратылгъанды',
'ipblocklist' => 'Блок этилиннген IP-адресле эм къошулуучуланы атлары',
'ipblocklist-legend' => 'Тыйылгъан къошулуучуну аты',
+'blocklist-expiry' => 'Бошалыу датасы',
'blocklist-reason' => 'Чурум',
'ipblocklist-submit' => 'Таб',
'ipblocklist-localblock' => 'Локал блокга салыу',
'tooltip-diff' => 'Тюрлендириулеригизни кёрюгюз',
'tooltip-compareselectedversions' => 'Бу бетни сайланнган эки версиясыны араларында башхалыкъларын кёр',
'tooltip-watch' => 'Бу бетни кёзюгюзде тургъан тизмеге къош',
+'tooltip-watchlistedit-normal-submit' => 'Белгиленнген атланы кетер',
+'tooltip-watchlistedit-raw-submit' => 'Кёзде тургъан тизмени джангырт',
'tooltip-recreate' => 'Кетерилгенина къарамай бетни ызына къайтар',
'tooltip-upload' => 'Джюклеуню башла',
'tooltip-rollback' => 'Бир басхан бла ахыр къошулуучуну тюрлендиргенин кетер',
'spam_reverting' => '$1 бла джибериую болмагъан ахыр версиягъа къайтылады',
'spam_blanking' => 'Бютеу версияла $1 бетге джибериу тутадыла, ариуланадыла',
+# Info page
+'pageinfo-title' => '«$1» бетни юсюнден информация',
+'pageinfo-header-edits' => 'Тюрлендириуле',
+'pageinfo-header-watchlist' => 'Кёзде тургъан тизме',
+'pageinfo-header-views' => 'Къараула',
+'pageinfo-subjectpage' => 'Бет',
+'pageinfo-talkpage' => 'Сюзюу бет',
+'pageinfo-watchers' => 'Кёргенлени саны',
+'pageinfo-edits' => 'Тюрлендириулени саны',
+'pageinfo-authors' => 'Авторланы саны',
+
# Skin names
'skinname-standard' => 'Стандарт',
'skinname-nostalgia' => 'Ностальгия',
'file-nohires' => 'Мындан ары ачыкъланнган версиясы джокъду',
'svg-long-desc' => 'SVG файл, шартлы $1 × $2 пиксель, файлны ёлчеми: $3',
'show-big-image' => 'Толу ачыкълау',
+'show-big-image-preview' => 'Ал къарауда уллулугъу: $1.',
+'show-big-image-size' => '$1 × $2 пиксель',
'file-info-gif-looped' => 'тогъайланнганды',
'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм|фрейм}}',
'file-info-png-looped' => 'тогъайланнганды',
'bydate' => 'Хронологиягъа кёре',
'sp-newimages-showfrom' => '$1, $2 замандан башлаб джангы файлланы кёргюз',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 секунд|$1 секунд}}',
+'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
+'hours' => '{{PLURAL:$1|$1 сагъат|$1 сагъат}}',
+'days' => '{{PLURAL:$1|$1 кюн|$1 кюн}}',
+'ago' => '$1 алгъа',
+
# Bad image list
'bad_image_list' => 'Формат былай болургъа керекди:
'metadata-help' => 'Файл, кёбюсюне цифралы камерала бла, неда сканерле бла къошулгъан, къошакъ билгилени тутаргъа болады. Файл къуралгъанындан сора тюрлендирилген эсе, бир-бир параметрлери бусагъатдагъы суратына келишмезге болур.',
'metadata-expand' => 'Дагъыда билгиле кёргюз',
'metadata-collapse' => 'Къошакъ билгилени джашыр',
-'metadata-fields' => 'Ð\91Ñ\83 Ñ\81пиÑ\81окда келÑ\82иÑ\80илинген меÑ\82аданнÑ\8bйлени Ñ\82изгинлеÑ\80и, Ñ\81Ñ\83Ñ\80аÑ\82нÑ\8b беÑ\82инде Ñ\82Ñ\8bнгÑ\8bлаÑ\83 бла кÑ\91Ñ\80гÑ\8eзÑ\82Ñ\8eлÑ\8eнлÑ\8eкдÑ\8eле, кÑ\8aалгÑ\8aанла джашырылыныб боллукъдула.
+'metadata-fields' => 'Ð\91Ñ\83 Ñ\82измеде келÑ\82иÑ\80илген Ñ\81Ñ\83Ñ\80аÑ\82 меÑ\82абилгилеи Ñ\82изгинлеÑ\80и, Ñ\81Ñ\83Ñ\80аÑ\82нÑ\8b беÑ\82инде кÑ\91Ñ\80гÑ\8eзÑ\8eллÑ\8eкдÑ\8eле, кÑ\8aалгÑ\8aанла Ñ\82Ñ\8bнгÑ\8bлаÑ\83 бла джашырылыныб боллукъдула.
* make
* model
* datetimeoriginal
'exif-gpsareainformation' => 'GPS тёгерекни аты',
'exif-gpsdatestamp' => 'GPS заман',
'exif-gpsdifferential' => 'GPS дифференциялы тюзетиу',
+'exif-jpegfilecomment' => 'JPEG-файлны белгиси',
+'exif-keywords' => 'Ачхыч сёзле',
+'exif-countrydest' => 'Суратланнган кърал',
+'exif-provinceorstatedest' => 'Суратланнган провинция, территория неда штат',
+'exif-citydest' => 'Суратланнган шахар',
+'exif-objectname' => 'Къысха аты',
+'exif-specialinstructions' => 'Энчи ангылатыула',
'exif-headline' => 'Башлыкъ',
+'exif-credit' => 'Суратны берген',
+'exif-source' => 'Къайнакъ',
+'exif-editstatus' => 'Суратны редакцион статусу',
'exif-urgency' => 'Бу сагъатха магъаналылыгъы',
+'exif-fixtureidentifier' => 'Колонканы аты',
+'exif-locationdest' => 'Суратланнган джер',
+'exif-objectcycle' => 'Бу сурат ючюн сутканы кёзюую',
+'exif-contact' => 'Контактлы информация',
'exif-writer' => 'Текстни автору',
'exif-languagecode' => 'Тил',
'exif-iimversion' => 'IIM версиясы',
'exif-iimcategory' => 'Категория',
+'exif-iimsupplementalcategory' => 'Къошакъ категорияла',
'exif-datetimeexpires' => 'Бу датадан сора хайырланмагъыз:',
'exif-datetimereleased' => 'Чыкъгъан датасы:',
'exif-identifier' => 'Идентификатор',
'exif-lens' => 'Хайырланнган объектив',
+'exif-serialnumber' => 'Камераны сериялы номери',
'exif-cameraownername' => 'Камераны иеси',
'exif-label' => 'Белги',
+'exif-datetimemetadata' => 'Метабилгилени ахыр тюрлениулерини датасы',
+'exif-nickname' => 'Суратны, формализмли болмагъан аты',
'exif-rating' => 'Багъа (5-ден)',
+'exif-rightscertificate' => 'Хакъланы джюрютюу сертификат',
+'exif-copyrighted' => 'Автор хакъланы статусу:',
+'exif-copyrightowner' => 'Автор хакъланы иеси',
+'exif-usageterms' => 'Хайырланыуну шартлары',
+'exif-pngfilecomment' => 'PNG-файлны белгиси',
'exif-disclaimer' => 'Джууаблылыкъны унамау',
+'exif-contentwarning' => 'Ичиндегисини юсюнден эсгертиу',
+'exif-giffilecomment' => 'GIF-файлны белгиси',
'exif-intellectualgenre' => 'Объектни типи',
+'exif-subjectnewscode' => 'Теманы коду',
+'exif-scenecode' => 'IPTC сахнаны коду',
+'exif-event' => 'Суратланнган болуу',
+'exif-organisationinimage' => 'Суратланнган организация',
+'exif-personinimage' => 'Суратланнган адам',
# EXIF attributes
'exif-compression-1' => 'Къысдырылмагъан',
+'exif-compression-3' => 'CCITT Group 3, факс кодлау',
+'exif-compression-4' => 'CCITT Group 4, факс кодлау',
'exif-copyrighted-true' => 'Автор хакъла бла джакъланыбды',
'exif-copyrighted-false' => 'Джамагъат мюлк',
'exif-gpslongitude-e' => 'Кюнчыгъыш узунлукъ',
'exif-gpslongitude-w' => 'Кюнбатыш узунлукъ',
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|метрге|метрге}} тенгизден мийик',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|метрге|метрге}} тенгизден алаша',
+
'exif-gpsstatus-a' => 'Ёлчелеу бошалмагъанды',
'exif-gpsstatus-v' => 'Ёлчелеу бошалгъанды',
'exif-dc-contributor' => 'Автор нёгерле',
'exif-dc-coverage' => 'Медианы кенгликле чеклери бла заман чеклери',
+'exif-dc-date' => 'Дата(ла)',
+'exif-dc-publisher' => 'Басмагъа чыгъаргъан',
+'exif-dc-relation' => 'Байламлы медиа',
+'exif-dc-rights' => 'Хакъла',
+'exif-dc-source' => 'Къайнакъ медиа',
+'exif-dc-type' => 'Медианы типи',
+'exif-rating-rejected' => 'Къабыл этилмеди',
+
+'exif-isospeedratings-overflow' => '65535-ден уллуду',
+
+'exif-iimcategory-ace' => 'Санат, культура эм кёз ачыу',
+'exif-iimcategory-clj' => 'Аманлыкъчылыкъ эм закон',
+'exif-iimcategory-dis' => 'Катастрофала эм аварияла',
+'exif-iimcategory-fin' => 'Экономика эм бизнес',
'exif-iimcategory-edu' => 'Окъуу',
+'exif-iimcategory-evn' => 'Тёгерекдеги табийгъат',
'exif-iimcategory-hth' => 'Саулукъ',
+'exif-iimcategory-hum' => 'Интересли хапарла',
'exif-iimcategory-lab' => 'Урунуу',
+'exif-iimcategory-lif' => 'Джашау хал эм бош заман',
'exif-iimcategory-pol' => 'Политика',
'exif-iimcategory-rel' => 'Дин бла ийнам',
+'exif-iimcategory-sci' => 'Илму эм техника',
'exif-iimcategory-soi' => 'Социал соруула',
'exif-iimcategory-spo' => 'Спорт',
'exif-iimcategory-war' => 'Къазауатла, конфликтле эмда къозгъалыула',
'confirm-purge-top' => 'Бу бетни кеши кетерилсинми?',
'confirm-purge-bottom' => 'Бетни кеши кетерилгенден сора, андан сора келген версиясы кёргюзюллюкдю.',
+# action=watch/unwatch
+'confirm-watch-button' => 'ОК',
+'confirm-unwatch-button' => 'ОК',
+
# Separators for various lists, etc.
'semicolon-separator' => '; ',
'percent' => '$1%',
'version-software' => 'Салыннган программа баджарыу',
'version-software-product' => 'Продукт',
'version-software-version' => 'Версия',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Файлгъа джол',
'sqlite-no-fts' => '$1 толу текст излеуню хайырландыра билмеген',
# New logging system
+'revdelete-content-hid' => 'ичиндегиси джашырылыбды',
'revdelete-summary-hid' => 'тюрлендириуню ачыкълауу джашырылыбды',
+'revdelete-uname-hid' => 'къошулуучуну аты джашырылыбды',
'revdelete-uname-unhid' => 'къошулуучуну аты ачылды',
'revdelete-restricted' => 'администраторла ючюн этилген чеклениуле',
'revdelete-unrestricted' => 'администратолра ючюн этилген чеклениуле къоратылгъандыла',
+'logentry-move-move' => '$1, $3 бетни атын $4 деб тюрлендирди',
'logentry-patrol-patrol-auto' => '$1, $3 бетни $4 версиясын автомат халда тинтиб чыкъды',
'newuserlog-byemail' => 'пароль электрон почта бла джиберилгенди',
# Feedback
'feedback-subject' => 'Тема:',
'feedback-message' => 'Билдириу:',
+'feedback-cancel' => 'Ызына алыу',
'feedback-submit' => 'Оюмунгу джибер',
+'feedback-error2' => 'Халат. Тюзетиу ётмеди',
+'feedback-close' => 'Тындырылды',
# API errors
'api-error-badtoken' => 'Ич халат: терс токен.',
+'api-error-duplicate-popup-title' => ' {{PLURAL:$1|Файлны|Файлны}} дубликаты',
'api-error-empty-file' => 'Сиз ийген файлны ичи бошду.',
'api-error-emptypage' => 'Ичи бош болгъан джангы бетле къураргъа болмайды.',
'api-error-file-too-large' => 'Сиз ийген файл асыры уллуду.',
'api-error-illegal-filename' => 'Джарамагъан файл ат.',
'api-error-invalid-file-key' => 'Ич халат: болджаллы асыраучу джерде файл табылмады.',
'api-error-mustbeposted' => 'Ич халат: соруу, HTTP POST инструкцияны излейди.',
+'api-error-ok-but-empty' => 'Ич халат: сервер джууаб бермейди.',
+'api-error-unclassified' => 'Белгили болмагъан халат чыкъды',
'api-error-unknown-code' => 'Билинмеген халат: «$1».',
+'api-error-unknown-error' => 'Ич халат: файлны джюклерге излеген сагъатда не эсе да терс болду.',
'api-error-unknown-warning' => 'Билинмеген билдириу: $1',
'api-error-unknownerror' => 'Билинмеген халат: «$1».',
'api-error-uploaddisabled' => 'Бу викиде файлла джюклеу амал джукъланыбды',
'tog-previewonfirst' => 'Li cem guherandinê hertim yekemîn pêşdîtinê nîşan bide',
'tog-nocache' => 'Vegirtina rûpelan bisekinîne',
'tog-enotifwatchlistpages' => 'Heke rûpeleke ez dişopînim hate guhertin ji min re E-nameyekê bişîne',
-'tog-enotifusertalkpages' => 'Dema rûpela min a Guftûgoyê hate guhertin e-nameyekê ji min re bişîne',
+'tog-enotifusertalkpages' => 'Dema rûpela min a Gotûbêjê hate guhertin e-nameyekê ji min re bişîne',
'tog-enotifminoredits' => 'Ji bo guhertinên biçûk jî E-nameyekê ji min re bişîne',
'tog-enotifrevealaddr' => 'Navnîşana e-nameya min di agahdariyên e-nameyan de nîşan bide',
'tog-shownumberswatching' => 'Nîşan bide, çiqas bikarhêner dişopînin',
'moredotdotdot' => 'Bêhtir...',
'mypage' => 'Rûpela min',
'mytalk' => 'Rûpela gotûbêja min',
-'anontalk' => 'Guftûgo ji bo vê IPê',
+'anontalk' => "Gotûbêj ji bo vê IP'ê",
'navigation' => 'Navîgasyon',
'and' => ' û',
'unprotect' => 'Parastinê rake',
'unprotectthispage' => 'Parastina vê rûpelê rake',
'newpage' => 'Rûpela nû',
-'talkpage' => 'Vê rûpelê guftûgo bike',
+'talkpage' => 'Vê rûpelê gotûbêj bike',
'talkpagelinktext' => 'Nîqaş',
'specialpage' => 'Rûpela taybet',
'personaltools' => 'Amûrên kesane',
'postcomment' => 'Beşeke nû',
'articlepage' => 'Li rûpela naverokê binêre',
-'talk' => 'Guftûgo',
+'talk' => 'Gotûbêj',
'views' => 'Dîtin',
'toolbox' => 'Qutiya amûran',
'userpage' => 'Li rûpela vê/vî bikarhênerê/î binêre',
'templatepage' => 'Rûpela şablonê bibîne',
'viewhelppage' => 'Rûpela alîkariyê bibîne',
'categorypage' => 'Li rûpela kategoriyê binêre',
-'viewtalkpage' => 'Li guftûgoyê binêre',
+'viewtalkpage' => 'Li gotûbêjê binêre',
'otherlanguages' => 'Zimanên din',
'redirectedfrom' => '(ji $1 hate beralîkirin)',
'redirectpagesub' => 'Rûpelê beralî bike',
'newarticletext' => "Ev rûpel hîn tune. Eger tu bixwazî vê rûpelê çêkî, dest bi nivîsandinê bike û piştre qeyd bike. '''Wêrek be''', biceribîne!<br />
Ji bo alîkariyê binêre: [[{{MediaWiki:Helppage}}|Alîkarî]].<br />
Heke tu bi şaşîtî hatî, bizîvire rûpela berê.",
-'anontalkpagetext' => "----''Ev rûpela guftûgo ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
+'anontalkpagetext' => "----''Ev rûpela gotûbêjê ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
'noarticletext' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
'noarticletext-nopermission' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].
Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
# "Undo" feature
'undo-success' => 'Ev guherandina kane were şondakirin. Xêra xwe ferqê piştî tomarkirinê bibîne û seke, ku tu ew versîyona dixwazê û tomarbike. Eger te şaşbûnekî kir, xêra xwe derkeve.',
'undo-failure' => 'Ev guherandina nikane were şondakirin ji ber ku guherandinên piştî wê.',
-'undo-summary' => 'Guhertoya $1 ya [[Special:Contributions/$2|$2]] ([[User talk:$2|guftûgo]]) şûnde kir',
+'undo-summary' => 'Guhertoya $1 ya [[Special:Contributions/$2|$2]] ([[User talk:$2|gotûbêj]]) şûnde kir',
# Account creation failure
'cantcreateaccounttitle' => 'Hesab nikarîbû were çêkirin',
'action-read' => 'Vê rûpelê bixwîne',
'action-edit' => 'vê rûpelê biguherîne',
'action-createpage' => 'rûpelan çêke',
-'action-createtalk' => 'rûpelên guftûgoyan çêke',
+'action-createtalk' => 'rûpelên gotûbêjan çêke',
'action-createaccount' => "vê account'ê bikarhênerê çêke",
'action-minoredit' => 'vê weke guhertineke biçûk nîşan bide',
'action-move' => 'vê rûpelê bigerîne',
'watchnologintext' => 'Ji bo xeyrandinê lîsteya te ya şopandinê tu gireke xwe [[Special:UserLogin|qedy kiribe]].',
'addwatch' => 'Tevlî lîsteya şopandinê bike',
'addedwatchtext' => "Rûpela \"<nowiki>\$1</nowiki>\" çû ser [[Special:Watchlist|lîsteya te ya şopandinê]].
-Li dahatû de her guhartoyek li wê rûpelê û rûpela guftûgo ya wê were kirin li vir dêt nîşan dan,
+Li dahatû de her guhartoyek li wê rûpelê û rûpela gotûbêjê wê were kirin li vir dêt nîşan dan,
Li rûpela [[Special:RecentChanges|Guherandinên dawî]] jî ji bo hasan dîtina wê, ew rûpel bi '''Nivîsa estûr''' dê nîşan dayîn.
'unwatchthispage' => 'Êdî neşopîne',
'notanarticle' => 'Ne gotar e',
'watchnochange' => 'Ne rûpelek, yê tu dişopînê, hate xeyrandin di vê wextê da, yê tu dixazê bibînê.',
-'watchlist-details' => '* {{PLURAL:$1|Rûpelek tê|$1 rûpel tên}} şopandin, rûpelên guftûgoyê netên jimartin.',
+'watchlist-details' => '* {{PLURAL:$1|Rûpelek tê|$1 rûpel tên}} şopandin, rûpelên gotûbêjê nayên jimartin.',
'wlheader-enotif' => '* Agahdariya E-nameyê pêk tê.',
'wlheader-showupdated' => "* Ew rûpel yê hatin xeyrandin jilkî te li wan sekir di '''nivîsa estûr''' tên pêşandin.",
'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
'rollbacklink' => 'bizivirîne pêş',
'cantrollback' => "Guharto naye vegerandin; bikarhêrê dawî, '''tenya''' nivîskarê wê rûpelê ye.",
'alreadyrolled' => 'Guherandina dawiya [[$1]]
-bi [[User:$2|$2]] ([[User talk:$2|guftûgo]]) venizivre; keseke din wê rûpelê zivrandiye an guherandiye.
+bi [[User:$2|$2]] ([[User talk:$2|gotûbêj]]) venizivre; keseke din wê rûpelê zivrandiye an guherandiye.
-Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
+Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|gotûbêj]]).',
'editcomment' => "Kurtenivîsê guherandinê ev bû: \"''\$1''\".",
'revertpage' => 'Guherandina $2 hat betal kirin, vegerand guhartoya dawî ya $1',
'rollback-success' => 'Guherandina $1 şondakir; dîsa guharte verzyona $2.',
'ipbotheroption' => 'yên din',
'ipbotherreason' => 'Sedemekî din',
'ipbhidename' => 'Navê bikarhêner / adresê IP ji "pirtûkê" astengkirinê, lîsteya astengkirinên nuh û lîsteya bikarhêneran veşêre',
-'ipbwatchuser' => 'Rûpelên bikarhêner û guftûgoyê bişopîne',
+'ipbwatchuser' => 'Rûpelên bikarhêner û gotûbêjê bişopîne',
'ipb-confirm' => 'Astengkirinê piştrast bike',
'badipaddress' => 'Bikarhêner bi vî navî tune',
'blockipsuccesssub' => 'Astengkirin serkeftî bû',
'noautoblockblock' => 'astengkirina otomatîk hatîye temirandin',
'createaccountblock' => 'çêkirina hesaban hate qedexekirin',
'emailblock' => 'E-Mail hate girtin',
-'blocklist-nousertalk' => 'nikarê rûpela gûftugoya xwe biguherînê',
+'blocklist-nousertalk' => 'nikare rûpela gotûbêja xwe biguherîne',
'ipblocklist-empty' => 'Lîsteya astengkirinê vala ye.',
'ipblocklist-no-results' => "Ew IP'ya ya bikarhênera nehatîye astengkirin.",
'blocklink' => 'asteng bike',
'block-log-flags-nocreate' => 'çêkirina hesaban hate qedexekirin',
'block-log-flags-noautoblock' => 'astengkirina otomatik tune',
'block-log-flags-noemail' => 'Şandina e-nameyan hatîye qedexekirin',
-'block-log-flags-nousertalk' => 'nikare guftûgoyê xwe biguherîne',
+'block-log-flags-nousertalk' => 'nikare gotûbêja xwe biguherîne',
'block-log-flags-hiddenname' => 'navê bikarhêneriyê yê veşartî',
'ipb_expiry_invalid' => 'Dem ne serrast e.',
'ipb_already_blocked' => '"$1" berê hatîye astengkirin',
'articleexists' => 'Rûpela bi vî navî heye, an navê ku te hilbijart derbas nabe. Navekî din hilbijêre.',
'cantmove-titleprotected' => 'Tu nikanê vê rûpelê bervê vê cihê bigerînê ji ber ku sernava nuh tê parastin ji bo çêkirinê',
'movedto' => 'bû',
-'movetalk' => "Rûpela '''guftûgo''' ya wê jî bigerîne, eger gengaz be.",
+'movetalk' => "Rûpela '''gotûbêj'''a wê jî bigerîne, eger gengaz be.",
'movepage-page-exists' => 'Rûpela $1 berê heye û ew nikane otomatîk were jêbirin.',
'movepage-page-moved' => 'Rûpela $1 çû cihê $2.',
'movepage-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Rûpela min',
'tooltip-pt-anonuserpage' => 'The user page for the ip you',
-'tooltip-pt-mytalk' => 'Rûpela guftûgo ya min',
+'tooltip-pt-mytalk' => 'Rûpela min a gotûbêjê',
'tooltip-pt-preferences' => 'Tercîhên min',
'tooltip-pt-watchlist' => 'The list of pages you',
'tooltip-pt-mycontris' => 'Lîsteya beşdariyên min',
'tooltip-pt-logout' => 'Derkeve (Log out)',
-'tooltip-ca-talk' => 'Guftûgo li ser rûpela naverokê',
+'tooltip-ca-talk' => 'Gotûbêj li ser rûpela naverokê',
'tooltip-ca-edit' => 'Vê rûpelê biguherîne! Berê qeydkirinê bişkoka "Pêşdîtin',
'tooltip-ca-addsection' => 'Beşekê zêde bike.',
'tooltip-ca-viewsource' => 'Ev rûpela tê parastin. Tu dikarê bes li çavkanîyê sekê.',
'lag-warn-high' => 'Ji bo westinê sistêmê ew xeyrandin, yê piştî $1 sanîyan hatine çêkirin netên wêşendan.',
# Watchlist editor
-'watchlistedit-numitems' => 'Di lîsteya te ya şopandinê de {{PLURAL:$1|gotarek heye.|$1 gotar hene.}} (ji xeynî rûpela guftûgoyan).',
+'watchlistedit-numitems' => 'Di lîsteya te ya şopandinê de {{PLURAL:$1|gotarek heye.|$1 gotar hene.}} (ji xeynî rûpela gotûbêjan).',
'watchlistedit-noitems' => 'Di lîsteya te ya şopandinê de gotar tune ne.',
'watchlistedit-normal-title' => 'Lîsteya xwe ya şopandinê biguherîne',
'watchlistedit-normal-legend' => 'Gotaran ji lîsteya min ya şopandinê rake',
Сиз башка барактардан [[Special:Search/{{PAGENAME}}|ушул аталыш менен баракты издөө]] салып,
же <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийиштүү жазууларды таба аласыз]</span>.',
'previewnote' => "'''Бул алдын ала көрүнүшү гана болгонун эсиңизге алыңыз.'''
-Өзгөртүүлөрүңүз сактала элек! [[#editform|→ Оңдоону улант]]",
+Өзгөртүүлөрүңүз сактала элек!",
'editing' => 'Оңдоо $1',
'editingsection' => '$1 (бөлүмү) оңдолууда',
'yourtext' => 'Текстиңиз',
'updated' => '(Geännert)',
'note' => "'''Notiz:'''",
'previewnote' => "'''Denkt drun datt dëst nëmmen eng net gespäichert Versioun ass.'''
-Är Ännerunge sinn nach net gespäichert! [[#editform|→ Virufuere mam Änneren]]",
+Är Ännerunge sinn nach net gespäichert!",
+'continue-editing' => 'Weider änneren',
'previewconflict' => 'Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.',
'session_fail_preview' => "'''Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.
Versicht et w.e.g. nach eng Kéier.
'backend-fail-closetemp' => 'Den temporäre Fichier konnt net zougemaach ginn.',
'backend-fail-read' => 'De Fichier $1 konnt net geliest ginn.',
'backend-fail-create' => 'De Fichier $1 konnt net ugeluecht ginn.',
+'backend-fail-maxsize' => 'De Fichier $1 konnt net generéiert gi well e méi grouss ass wéi {{PLURAL:$2|ee Byte|$2 Byten}}.',
'backend-fail-readonly' => 'De Späicher-Backend "$1" kann elo nëmme geliest ginn (read-only). De Grond deen ugi gouf war: "$2"',
# Lock manager
Kuckt w.e.g. d'[$2 Säit mat der Beschreiwung vum Fichier] fir méi Informatiounen.",
'sharedupload-desc-here' => "Dëse Fichier ass vu(n) $1 an däerf vun anere Projete benotzt ginn.
D'Beschreiwung op senger [$2 Beschreiwungssäit] steet hei ënnendrënner.",
+'sharedupload-desc-edit' => 'Dëse Fichier ass vu(n) $1 a ka vun anere Projete benotzt ginn.
+Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
+'sharedupload-desc-create' => 'Dëse Fichier ass vu(n) $1 a ka vun anere Projete benotzt ginn.
+Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
'filepage-nofile' => 'Et gëtt kee Fichier mat deem Numm.',
'filepage-nofile-link' => 'Et gëtt kee Fichier mat deem Numm, awer Dir kënnt [$1 en eroplueden].',
'uploadnewversion-linktext' => 'Eng nei Versioun vun dësem Fichier eroplueden',
'wantedpages' => 'Gewënschte Säiten',
'wantedpages-badtitle' => 'Net valabelen Titel am Resultat: $1',
'wantedfiles' => 'Gewënschte Fichieren',
+'wantedfiletext-cat' => 'Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All esou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.',
'wantedtemplates' => 'Gewënschte Schablounen',
'mostlinked' => 'Dacks verlinkte Säiten',
'mostlinkedcategories' => 'Dacks benotzte Kategorien',
'sp-contributions-userrights' => 'Verwaltung vun de Benotzerrechter',
'sp-contributions-blocked-notice' => 'Dëse Benotzer ass elo gespaart. Déi lescht Entrée am Läsch-Logbuch steet als Referenz hei ënnendrënner:',
'sp-contributions-blocked-notice-anon' => "Dës IP-Adress ass elo gespaart.
-Ënnendrënner steet déi lescht Androung an d'Spärlëscht:",
+Ënnendrënner steet déi lescht Aschreiwung an d'Spärlëscht:",
'sp-contributions-search' => 'No Kontributioune sichen',
'sp-contributions-username' => 'IP-Adress oder Benotzernumm:',
'sp-contributions-toponly' => 'Nëmmen Ännerunge weisen déi déi lescht Versioun sinn',
'version-software' => 'Installéiert Software',
'version-software-product' => 'Produkt',
'version-software-version' => 'Versioun',
+'version-entrypoints' => 'URLe vun Agangspunkten',
+'version-entrypoints-header-entrypoint' => 'Agangspunkt',
'version-entrypoints-header-url' => 'URL',
# Special:FilePath
Квевай [[Special:Search/{{PAGENAME}}| и тlвар алай ччин]] муькуь ччинра жугъуриз ва я
<span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз] жеда.',
'previewnote' => "'''Рикlел хуьх хьи, им анжах сифтедин килигун я.'''
-Куь масакIавилер гьеле хвенвач! [[#editform|→ дуьзар хъувун давамрун]]",
+Куь масакIавилер гьеле хвенвач!",
'editing' => '$1 Дуьзар хъувун',
'editingsection' => 'Дуьзар хъувун $1 (пай)',
'editconflict' => 'Дуьзар хъувунрин акьунар: $1',
De gegaeve ree is ''$2''.",
'filereadonlyerror' => '\'t Waar neet meugelik óm \'t bestandj "$1" aan te passe went de bestandjsrepositoir "$2" steit noe op allein-laeze.
-d\'n Opgegaeve raej waar "\'\'$3\'\'".',
+d\'n Opgegaeve raej vanne sloetendje admin waar "\'\'$3\'\'".',
# Virus scanner
'virus-badscanner' => "Slechte configuratie: onbekenge virusscanner: ''$1''",
'emailconfirmlink' => 'Bevèstig dien e-mailadres',
'invalidemailaddress' => "'t E-mailadres is neet geaccepteerd omdet 't 'n ongeldige opmaak haet. Gaef a.u.b. 'n geldig e-mailadres op of laot 't veld laeg.",
'cannotchangeemail' => 'E-mailadresse kinne neet waere verangerdj óp deze wiki.',
+'emaildisabled' => 'Dees site kin gein mails versjikke.',
'accountcreated' => 'Gebroeker aangemaak',
'accountcreatedtext' => 'De gebroeker $1 is aangemaak.',
'createaccount-title' => 'Gebroekers aanmake veur {{SITENAME}}',
'token_suffix_mismatch' => "'''Dien bewerking is geweigerd omdat dien client de laesteikes in 't bewerkingstoken onjuist haet behandeld. De bewerking is geweigerd om verminking van de paginateks te veurkomme. Dit gebeurt soms es d'r een webgebaseerde proxydienst wurt gebroek die foute bevat.'''",
'edit_form_incomplete' => "'''Sommige ongerdeile van 't bewerkingsformuleer höbbe de server neet bereik. Controleer of dien bewerkinge intak zien en perbeer 't obbenuits.'''",
'editing' => 'Bewirkingspagina: $1',
+'creating' => '$1 aanmakendj',
'editingsection' => 'Bewirke van sectie van $1',
'editingcomment' => 'Bewirke $1 (commentair)',
'editconflict' => 'Bewirkingsconflik: $1',
'edit-no-change' => "Dien bewirking is genegeerd, ómdet d'r gein verangering in de teks is gemaak.",
'edit-already-exists' => 'De pagina is neet aangemaak.
Zie besjteit al.',
+'defaultmessagetext' => 'Obligaten teks',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Waarschuwing:''' dees pagina gebroek te väöl kosbare parserfuncties.
# Suppression log
'suppressionlog' => 'Verbergingslogbook',
'suppressionlogtext' => 'De ongerstaonde lies bevat de verwiederinge en blokkades die veur beheerders verborge zeen.
-In de [[Special:BlockList|IP-blokkeerlies]] zeen de hudige blokkades te bekieke.',
+In de [[Special:BlockList|blokkeerlies]] zeen de hudige blokkades te bekieke.',
# History merging
'mergehistory' => "Gesjiedenis van pagina's samevoege",
Bekiek de [$2 pagina mit de besjtandjsbesjrieving] veur mie infermasie.',
'sharedupload-desc-here' => 'Dit besjtandj kump van $1 en kin ouch in anger projekte gebroek waere.
De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
+'sharedupload-desc-edit' => 'Dit bestandj kump van $1 en kin ouch in anger projekte gebroek waere. De kins de [$2 pagina mit bestandjsbesjrieving] dao bewirke.',
+'sharedupload-desc-create' => 'Dit bestandj kump van $1 en kin ouch in anger projekte gebroek waere. De kins de [$2 pagina mit bestandjsbesjrieving] dao bewirke.',
'filepage-nofile' => 'dr Besteit gei bestandj mit deze naam.',
'filepage-nofile-link' => 'dr Besteit gei bestandj mit deze naam, mer doe kins t [$1 uploade].',
'uploadnewversion-linktext' => "Upload 'n nuuj versie van dit besjtand",
'allpagesprefix' => "Betrach pazjena's mit 't veurvoogsel:",
'allpagesbadtitle' => "De opgegaeve paginanaam is ongeldig of haj 'n intertaal of interwiki veurvoegsel. Meugelik bevatte de naam karakters die neet gebroek moge waere in paginanäöm.",
'allpages-bad-ns' => '{{SITENAME}} haet gein naamruumde mit de naam "$1".',
+'allpages-hide-redirects' => 'Verbèrg redireks',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "De bekieks 'ne paginacache dae maximaal $1 aad is.",
+'cachedspecial-viewing-cached-ts' => "De bekieks 'ne paginacache dae muuegelik neet gans biegewirk is.",
+'cachedspecial-refresh-now' => 'Tuin lèste.',
# Special:Categories
'categories' => 'Categorieë',
'blocklog-showsuppresslog' => "Deze gebroeker is al geblok gewaes en d'r zeen (deil van) bewerkinge van deze gebroeker verbórge. 't Verbèrgingslogbook steit hieónger:",
'blocklogentry' => '"[[$1]]" is geblokkeerd veur d\'n tied van $2 $3',
'reblock-logentry' => 'haet de instellinge veur de blokkaasj veur [[$1]] gewiezig. Deze verlöp noe op $2 om $3',
-'blocklogtext' => "Dit is 'n log van blokkades van gebroekers. Automatisch geblokkeerde IP-adresse sjtoon hie neet bie. Zuug de [[Special:BlockList|Lies van geblokkeerde IP-adresse]] veur de lies van op dit mement wèrkende blokkades.",
+'blocklogtext' => "Dit is 'n log van blokkades van gebroekers. Automatisch geblokkeerde IP-adresse sjtoon hie neet bie. Zuug de [[Special:BlockList|Lies van geblokkeerde adresse]] veur de lies van op dit mement wèrkende blokkades.",
'unblocklogentry' => 'blokkade van $1 opgeheve',
'block-log-flags-anononly' => 'allein anoniem',
'block-log-flags-nocreate' => 'aanmake gebroekers geblokkeerd',
'version-software' => 'Geïnstallieërde sofwaer',
'version-software-product' => 'Perduk',
'version-software-version' => 'Versie',
+'version-entrypoints' => 'Ingang-URLs',
+'version-entrypoints-header-entrypoint' => 'Ingank',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Bestandjspaad',
'api-error-uploaddisabled' => 'Upload steit oet óp deze wiki.',
'api-error-verification-error' => "Dit bestandj is meugelik besjadig of haet 'n ónjuuste extensie.",
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekond|sekond}}',
+'duration-minutes' => '$1 {{PLURAL:$1|menuut|menuut}}',
+'duration-hours' => '$1 {{PLURAL:$1|oer|oer}}',
+'duration-days' => '$1 {{PLURAL:$1|daag|daag}}',
+'duration-weeks' => '$1 {{PLURAL:$1|waek|waek}}',
+'duration-years' => '$1 {{PLURAL:$1|jaor|jaor}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennium|decennia}}',
+'duration-centuries' => '$1 {{PLURAL:$1|ieëf|ieëf}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
);
'token_suffix_mismatch' => "'''Jūsų pakeitimas buvo atmestas, nes jūsų naršyklė iškraipė skyrybos ženklus keitimo žymėje. Keitimas buvo atmestas norint apsaugoti puslapio tekstą nuo sugadinimo. Taip kartais būna, kai jūs naudojate anoniminį tarpinio serverio paslaugą.'''",
'edit_form_incomplete' => "'''Kai redaguoti formos dalys nepasiekė serverio; du kartus patikrinti, kad jūsų pakeitimai yra nesugadintos ir bandykite dar kartą.'''",
'editing' => 'Taisomas $1',
+'creating' => 'Kuriama $1',
'editingsection' => 'Taisomas $1 (skyrelis)',
'editingcomment' => 'Taisomas $1 (komentaras)',
'editconflict' => 'Išpręskite konfliktą: $1',
# Suppression log
'suppressionlog' => 'Trynimo istorija',
'suppressionlogtext' => 'Žemiau yra trynimų ir blokavimų sąrašas, įtraukiant turinį, paslėptą nuo administratorių.
-Žiūrėkite [[Special:BlockList|IP blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.',
+Žiūrėkite [[Special:BlockList|blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.',
# History merging
'mergehistory' => 'Sujungti puslapių istorijas',
'reblock-logentry' => 'pakeisti [[$1]] blokavimo nustatymai, naujas blokavimo laikas – $2 $3',
'blocklogtext' => 'Čia yra naudotojų blokavimo ir atblokavimo sąrašas.
Automatiškai blokuoti IP adresai neišvardinti.
-Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|IP blokavimų sąrašą]].',
+Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|blokavimų sąrašą]].',
'unblocklogentry' => 'atblokavo $1',
'block-log-flags-anononly' => 'tik anoniminiai naudotojai',
'block-log-flags-nocreate' => 'paskyrų kūrimas išjungtas',
'category-article-count' => "{{PLURAL:$2|He pawl hian hemi phêk chauh hi a nei. | Hê'ng phek {{PLURAL:$1||$1-te}} hi he pawlah hian a awm, avaia $2 zingah.}}",
'category-article-count-limited' => '{{PLURAL: $1 |$1He|$1 Heng}} phekte hi hë pawl, i en mékah hian a awm.',
'category-file-count' => '{{PLURAL:$2|He pawl hian hë taksa chauh hi a kengtel.|{{PLURAL:$1|He taksa $1 |Heng taksa $1-te}} hi he pawlah hian a awm, a vaia $2 zingah}}',
-'category-file-count-limited' => '{{PLURAL:$1|He taksa (file)|$1Heng taksate}} hi hemi pawl, i en mékah hian a awm.',
+'category-file-count-limited' => '{{PLURAL:$1|He taksa|$1Heng taksate}} hi hemi pawl, i en mékah hian a awm.',
'listingcontinuesabbrev' => 'chhunz.',
'index-category' => 'Phêk tarlante',
'noindex-category' => 'Phêk tarlan lohte',
'nosuchaction' => 'Hetiang hi a tih theih loh',
'nosuchactiontext' => 'URL-a tihtur lang hi a tihtheih loh.
URL i chhu dik lo a ni mai thei, emaw zawm dik loah i kal a niang.
-{{SITENAME}} software hmanah hian dik tawk lo lai a awm a ni thei bawk.',
+{{SITENAME}} khawlthlûak hmanah hian dik tawk lo lai a awm a ni thei bawk.',
'nosuchspecialpage' => 'Hetiang vohbik phek hi a awm lo',
'nospecialpagetext' => '<strong>Vohbik phek awm lo en i tum.</strong>
'passwordreset' => 'Thurûk ziakţha rawh',
'passwordreset-legend' => 'Thurûk ziakţha rawh',
'passwordreset-username' => 'Hmangtu hming:',
+'passwordreset-domain' => 'Huamchin:',
'passwordreset-email' => 'E-chenhmun:',
'passwordreset-emailtitle' => '{{SITENAME}}-a siangchan chanchin kim',
'passwordreset-emailelement' => 'Hmangtuhming: $1
Phêk dangah [[Special:Search/{{PAGENAME}}| he phêk hming hi i zawng]] thei ang, a nih loh pawhin a laichin
<span class="plainlinks">[{{fullurl:{{#Special:Log}} | page={{FULLPAGENAMEE}}}} log dang i zawng thei ang]; a nih loh chuan [{{fullurl:{{FULLPAGENAME}}|action=edit}} he phêk hi i siamţha thei ang] </span>.',
'noarticletext-nopermission' => 'He phêkah hian thu a la awm hrih lo.
-He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{GULLPAGENAMEE}}}} a laichin chanchin dang] i zawng thei bawk ang. </span>',
+He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}-a a laichin chanchin dang] i zawng thei bawk ang. </span>',
'userpage-userdoesnotexist' => 'Hmangtu siangchan "$1" hi hriat a ni lo.
He phêk hi siam/siamţhat emaw i duh chuan enfiah rawh.',
'userpage-userdoesnotexist-view' => 'Hmangtu siangchan "$1" hi hriat a ni lo.',
'userjsyoucanpreview' => "'''Rawlrûk:''' I JavaScript thar fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
'note' => "'''Hriat tùr:'''",
'previewnote' => "'''Heihi endikna chauh a ni tih hrereng ang che.'''
-I tihdanglamna dahţhat a la ni lo! [[#editform|→ Ziah chhunzawmna]]",
+I tihdanglamna dahţhat a la ni lo!",
+'session_fail_preview_html' => "'''A pawi hlë mai! Ṭhutchhúng chanchin vawnna hloh avangin i siamṭhatna dahṭhat theih a ni lo.'''
+
+''{{SITENAME}}-in HTML hel a tihzalen avangin hë enlâwkna hi JavaScript beihna laka invèn fimkhur nan thup bo a ni.''
+
+'''Hei hi siamṭhat tumna dànzui pangngai a nih chuan khawngaihin dahṭhat tum nawn leh rawh.'''
+I la dahṭhat theih loh cheu chuan [[Special:UserLogout|chhuah phawt ]] a, luh nawn leh hmang tein han bei vêl chhin lä.",
'editing' => '$1 i siam(ţha) mék',
'editingsection' => '$1 (hlawm) i siam(ţha) mék',
'editingcomment' => '$1 (hlawm thar) i siam(ţha) mék',
'yourtext' => 'I thu tah hian:',
'storedversion' => 'Ennawnna vawnţhat',
'yourdiff' => 'Danglamnate',
+'protectedpagewarning' => "'''Vaukhanna: Hë phêk hi roreltute chauhvin an siamṭhat theihna tùrin vènhim a ni.'''
+I rawn atan ziaka chanchin dah hnuhnüng ber kan rawn chhawp chhuak e:",
'semiprotectedpagewarning' => "'''Hriat tùr:''' He phêk hi hmangtu inziaklûtte chauhvin an tihdanglam theihna tùra vènhim a ni.
I rawn tùrin siamm-danglamna chanchin ziaka kan dahţhat thar ber a hnuaiah khuan kan chhawp e:",
'templatesused' => 'He phêka {{PLURAL:$1|siamsa hman|siamsa hmante}}',
'prefs-personal' => 'Hmangtu chanchin tawi',
'prefs-rc' => 'Tihdanglam thar',
'prefs-watchlist' => 'Ralvèn',
-'prefs-watchlist-days' => 'Ralvèna ni tihlang tùr chin:',
+'prefs-watchlist-days' => 'Ralvèna ni tihlan tùr chin:',
'prefs-watchlist-days-max' => 'A rei berah ni $1 {{PLURAL:$1||}}',
'prefs-watchlist-edits' => 'Ralvèn pawhseia tihdanglam zât tihlan tùr tam ber:',
'prefs-watchlist-edits-max' => 'A tam ber: 1000',
'boteditletter' => 'k',
'rc-enhanced-expand' => 'Tilang kim rawh (JavaScript a ngai)',
'rc-enhanced-hide' => 'Thup ţhenna',
+'rc-old-title' => 'Atìra "&1" tih hming pú-a siam.',
# Recent changes linked
'recentchangeslinked' => 'Tihdanglam anpuite',
+'recentchangeslinked-feed' => 'Tihdanglam anpuite',
'recentchangeslinked-toolbox' => 'Tihdanglam anpuite',
'recentchangeslinked-title' => '"$1" kaihhnawih tihdanglamnate',
'recentchangeslinked-noresult' => 'I hun thlan chhungah hian a phek zawmpui tihdanglam pakhat mah a awm lo.',
'upload_directory_missing' => 'Hlankai bawmpui ($1) a awm lo va, Rangserverin a siam thei lo bawl.',
'upload_directory_read_only' => 'Hlankai bawmpui ($1) hi Rangserver in a ziak thei lo.',
'uploaderror' => 'Hlankai sual',
+'upload-recreate-warning' => "'''Vaukhànna: Hemi hming pu taksa hi sawn tawh emaw paih tawh a ni.'''
+
+I ràwnah paihna leh sawnna chhinchhiahna thuziak kan rawn chhawpchhuak e:",
'upload-permitted' => 'Taksa phal chiho: $1.',
'upload-preferred' => 'Taksa duh deuh bîk: $1.',
'upload-prohibited' => 'Taksa khap: $1.',
'listfiles_count' => 'Chhuah',
# File description page
-'file-anchor-link' => 'Taksa (file)',
+'file-anchor-link' => 'Taksa',
'filehist' => 'A chanchin enna',
'filehist-help' => 'A hunlaia a lan dan en tùrin a hun/ni-ah hmet rawh.',
'filehist-deleteall' => 'a vaiin nuaibo rawh',
'sp-deletedcontributions-contribs' => 'kutthawhnate',
# Special:LinkSearch
+'linksearch-ns' => 'Hminghmun:',
'linksearch-ok' => 'Zawng rawh',
'linksearch-line' => '$1 hi $2 aţanga thlunzawm a ni',
'updated' => '(Подновено)',
'note' => "'''Напомена:'''",
'previewnote' => "'''Имајте предвид дека ова е само преглед.'''
-Вашите промени сè уште не се зачувани! [[#editform|→ Продолжете со уредување]]",
+Вашите промени сè уште не се зачувани!",
+'continue-editing' => 'Продолжете со уредување',
'previewconflict' => 'Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.',
'session_fail_preview' => "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''
Обидете се повторно.
'parser-template-loop-warning' => 'Пронајдена е јамка во шаблонот: [[$1]]',
'parser-template-recursion-depth-warning' => 'Ограничувањето на рекурзивната длабочина надмината во шаблонот ($1)',
'language-converter-depth-warning' => 'Надмината е границата на длабочината на јазичниот претворач ($1)',
+'node-count-exceeded-category' => 'Страници каде е надминат бројот на јазли',
+'node-count-exceeded-warning' => 'Страницата го надмина бројот на јазли',
+'expansion-depth-exceeded-category' => 'Страници каде е надмината длабочината на проширувањето',
+'expansion-depth-exceeded-warning' => 'Страницата ја надмина длабочината на проширувањето',
# "Undo" feature
'undo-success' => 'Уредувањето може да се откаже.
Секој што го знае клучот во полево ќе може да го чита вашиот список на набљудувања, па затоа изберете некоја безбедна вредност.
Еве една случајно-создадена вредност што можете да ја користите: $1',
'savedprefs' => 'Вашите нагодувања се зачувани.',
-'timezonelegend' => 'ЧаÑ\81овна зона:',
+'timezonelegend' => 'ЧаÑ\81овен поÑ\98аÑ\81:',
'localtime' => 'Локално време:',
'timezoneuseserverdefault' => 'Од викито ($1)',
'timezoneuseoffset' => 'Друго (посочете отстапување)',
'rcshowhidemine' => '$1 мои уредувања',
'rclinks' => 'Прикажи скорешни $1 промени во последните $2 дена<br />$3',
'diff' => 'разл',
-'hist' => 'ист',
+'hist' => 'истор',
'hide' => 'Скриј',
'show' => 'Прикажи',
'minoreditletter' => 'с',
'badtitle' => 'അസാധുവായ തലക്കെട്ട്',
'badtitletext' => 'താങ്കൾ ആവശ്യപ്പെട്ട തലക്കെട്ടുള്ള ഒരു താൾ നിലവിലില്ല. ഇതു തെറ്റായി അന്തർഭാഷാ/അന്തർവിക്കി കണ്ണി ചെയ്യപ്പെട്ടതു മൂലമോ, തലക്കെട്ടിൽ ഉപയോഗിക്കരുതാത്ത അക്ഷരരൂപങ്ങൾ ഉപയോഗിച്ചതു മൂലമോ സംഭവിച്ചതായിരിക്കാം.',
'perfcached' => 'താഴെ കൊടുത്തിരിക്കുന്ന വിവരം ശേഖരിച്ചു വെച്ചിരിക്കുന്നതാണ്, അതുകൊണ്ട് ചിലപ്പോൾ പുതിയതായിരിക്കണമെന്നില്ല. പരമാവധി {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
-'perfcachedts' => 'താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്. സാധാരണ ഗതിയിൽ $4 ആയിരമായിരിക്കും.',
+'perfcachedts' => 'താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
'querypage-no-updates' => 'ഈ താളിന്റെ പുതുക്കൽ തൽക്കാലം നടക്കുന്നില്ല. ഇവിടുള്ള വിവരങ്ങൾ ഏറ്റവും പുതിയതാവണമെന്നില്ല.',
'wrong_wfQuery_params' => 'wfQuery()എന്നതിലേക്ക് തെറ്റായ പരാമീറ്ററുകൾ<br />
നിർദ്ദേശം: $1<br />
'updated' => '(പുതുക്കിയിരിക്കുന്നു)',
'note' => "'''പ്രത്യേക ശ്രദ്ധയ്ക്ക്:'''",
'previewnote' => "'''ഇതൊരു പ്രിവ്യൂ മാത്രമാണെന്ന് ഓർക്കുക.'''
-താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല! [[#editform|→ തിരുത്തൽ തുടരുക]]",
+താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല!",
+'continue-editing' => 'തിരുത്തൽ തുടരുക',
'previewconflict' => 'ഈ പ്രിവ്യൂവിൽ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്ത് മാത്രമാണ് കാട്ടുന്നത്, സേവ് ചെയ്യാൻ താങ്കൾ തീരുമാനിച്ചാൽ അത് സേവ് ആകുന്നതാണ്.',
'session_fail_preview' => "'''ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.'''
ദയവായി വീണ്ടും ശ്രമിക്കൂ.
'parser-template-loop-warning' => 'ഫലകക്കുരുക്ക് കണ്ടെത്തിയിരിക്കുന്നു: [[$1]]',
'parser-template-recursion-depth-warning' => 'ഫലകത്തിന്റെ പുനരാവർത്തന ആഴത്തിന്റെ പരിധി കഴിഞ്ഞിരിക്കുന്നു ($1)',
'language-converter-depth-warning' => 'ഭാഷ മാറ്റൽ ഉപകരണത്തിന്റെ ആഴത്തിന്റെ പരിധി കവിഞ്ഞിരിക്കുന്നു ($1)',
+'node-count-exceeded-warning' => 'താൾ നോഡ്-എണ്ണം അധികരിച്ചിരിക്കുന്നു',
# "Undo" feature
'undo-success' => 'ഈ തിരുത്തൽ താങ്കൾക്ക് തിരസ്ക്കരിക്കാവുന്നതാണ്. താഴെ കൊടുത്തിരിക്കുന്ന പതിപ്പുകൾ തമ്മിലുള്ള താരതമ്യം ഒന്നുകൂടി പരിശോധിച്ച് ഈ പ്രവൃത്തി ചെയ്യണോ എന്ന് ഒന്നുകൂടി ഉറപ്പാക്കുക. ഉറപ്പാണെങ്കിൽ തിരുത്തൽ തിരസ്ക്കരിക്കുവാൻ താൾ സേവ് ചെയ്യുക.',
'statistics-users-active-desc' => 'കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങൾക്കുള്ളിൽ}} പ്രവർത്തിച്ചിട്ടുള്ള ഉപയോക്താക്കൾ',
'statistics-mostpopular' => 'ഏറ്റവുമധികം സന്ദർശിക്കപ്പെട്ട താളുകൾ',
-'disambiguations' => 'വിവക്ഷിത താളുകളിലേയ്ക്ക് കണ്ണിചേർക്കുന്ന താളുകൾ',
+'disambiguations' => 'വിവà´\95àµ\8dà´·à´¿à´¤ താളàµ\81à´\95ളിലàµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d à´\95à´£àµ\8dണിà´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ താളàµ\81à´\95ൾ',
'disambiguationspage' => 'Template:വിവക്ഷകൾ',
'disambiguations-text' => 'താഴെ കൊടുത്തിരിക്കുന്ന താളുകൾ വിവക്ഷിതങ്ങൾ താളിലേക്കു കണ്ണി ചേർക്കപ്പെട്ടിരിക്കുന്നു. അതിനു പകരം അവ ലേഖനതാളുകളിലേക്കു കണ്ണി ചേക്കേണ്ടതാണ്. <br /> ഒരു താളിനെ വിവക്ഷിത താൾ ആയി പരിഗണിക്കണമെങ്കിൽ അതു [[MediaWiki:Disambiguationspage]] എന്ന താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ട ഒരു ഫലകം ഉപയോഗിക്കണം.',
'notanarticle' => 'ലേഖന താൾ അല്ല',
'notvisiblerev' => 'മറ്റൊരു ഉപയോക്താവ് സൃഷ്ടിച്ച അവസാനത്തെ നാൾപ്പതിപ്പ് മായ്ച്ചിരിക്കുന്നു',
'watchnochange' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ ഒന്നും തന്നെ ഇക്കാലയളവിൽ തിരുത്തപ്പെട്ടിട്ടില്ല.',
-'watchlist-details' => 'à´¸à´\82â\80\8cവാദà´\82 താളàµ\81à´\95ൾ à´\85à´²àµ\8dലാതàµ\8dà´¤ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
+'watchlist-details' => 'à´¸à´\82â\80\8cവാദà´\82 താളàµ\81à´\95ൾ à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതാതàµ\86 {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
'wlheader-enotif' => '* ഇമെയിൽ വിജ്ഞാപനം സാധ്യമാക്കിയിരിക്കുന്നു.',
'wlheader-showupdated' => "* താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം തിരുത്തപ്പെട്ട താളുകൾ '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
'watchmethod-recent' => 'ശ്രദ്ധിക്കുന്ന താളുകൾക്കുവേണ്ടി പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു',
'delete_and_move' => 'മായ്ക്കുകയും മാറ്റുകയും ചെയ്യുക',
'delete_and_move_text' => '==താൾ മായ്ക്കേണ്ടിയിരിക്കുന്നു==
-താà´\99àµ\8dà´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാൻ à´¶àµ\8dരമിà´\9aàµ\8dà´\9a "[[:$1]]" à´\8eà´¨àµ\8dà´¨ താൾ നിലവിലàµ\81à´£àµ\8dà´\9fàµ\8d. à´\86 താൾ മായàµ\8dà´\9aàµ\8dà´\9aàµ\8d à´ªàµ\81തിയ തലà´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\8d നൽകേണ്ടതുണ്ടോ?',
+മാറàµ\8dറാനായി നൽà´\95à´¿à´¯ "[[:$1]]" à´\8eà´¨àµ\8dà´¨ താൾ നിലവിലàµ\81à´£àµ\8dà´\9fàµ\8d. à´\88 മാറàµ\8dà´±à´\82 à´¨à´\9fà´¤àµ\8dà´¤àµ\81à´¨àµ\8dനതിനàµ\81à´µàµ\87à´£àµ\8dà´\9fà´¿ à´\86 താൾ മായàµ\8dà´\95àµ\8dകേണ്ടതുണ്ടോ?',
'delete_and_move_confirm' => 'ശരി, താൾ നീക്കം ചെയ്യുക',
'delete_and_move_reason' => '"[[$1]]" എന്നതിൽ നിന്നും മാറ്റാനുള്ള സൗകര്യത്തിനായി മായ്ച്ചു',
-'selfmove' => 'à´¸àµ\8dà´°àµ\8bതസàµ\8dà´¸àµ\81à´\82 à´²à´\95àµ\8dà´·àµ\8dയവàµ\81à´\82 à´\92à´¨àµ\8dà´¨àµ\81തനàµ\8dà´¨àµ\86യാണàµ\8d; à´\85തിനാൽ തലà´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81മാറàµ\8dറാനാവില്ല.',
+'selfmove' => 'പഴയ തലà´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81 തനàµ\8dà´¨àµ\86യാണàµ\8d മാറàµ\8dറാനായി നൽà´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\8d; à´\85തിനാൽ തലà´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81മാറàµ\8dà´±à´\82 സാദàµ\8dà´§àµ\8dയമല്ല.',
'immobile-source-namespace' => '"$1" നാമമേഖലയിലെ താളുകൾ മാറ്റാൻ കഴിയില്ല',
'immobile-target-namespace' => '"$1" നാമമേഖലയിലേയ്ക്ക് താളുകൾ മാറ്റാൻ കഴിയില്ല',
'immobile-target-namespace-iw' => 'അന്തർവിക്കി കണ്ണി താൾ മാറ്റാനുള്ള സാധുവായ ലക്ഷ്യമല്ല.',
'updated' => '(Шинэчлэгдсэн)',
'note' => "'''Анхааруулга:'''",
'previewnote' => "'''Энэ бол зөвхөн урьдчилж харсан байдал.'''
-Таны хийсэн өөрчлөлтүүдийг одоохондоо хадгалаагүй байгаа! [[#editform|→ үргэлжүүлж засварлах]]",
+Таны хийсэн өөрчлөлтүүдийг одоохондоо хадгалаагүй байгаа!",
'previewconflict' => 'Энэ урьдчилж харсан байдал нь дээд талын засварлах талбарын текстийг хадгалахад харагдах байдлыг харуулна.',
'session_fail_preview' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй. Дахин оролдож үзнэ үү. Ингээд ч болохгүй байвал сайтаас гарч дахин нэвтэрч орж үзнэ үү.'''",
'session_fail_preview_html' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй.'''
'tog-previewontop' => 'झलक संपादन खिडकीच्या आधी दाखवा',
'tog-previewonfirst' => 'पहिल्या संपादनानंतर झलक दाखवा',
'tog-nocache' => 'न्याहाळकाची पान सय (कॅशिंग) अक्षम (निकमी) करा',
-'tog-enotifwatchlistpages' => 'माà¤\9dà¥\8dया पहाऱà¥\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80मधà¥\80ल (नितà¥\8dय पहाणà¥\8dयात à¤\85सलà¥\87लà¥\80 सà¥\82à¤\9aà¥\80) पान बदललà¥\8dयास मला à¤\88-मà¥\87ल पाठवा',
+'tog-enotifwatchlistpages' => 'माà¤\9dà¥\8dया नितà¥\8dय पाहाणà¥\8dयात à¤\85सलà¥\87लà¥\80 सà¥\82à¤\9aà¥\80मधà¥\8dयà¥\87 à¤\85सलà¥\87लà¥\8dया पानामधà¥\8dयà¥\87 बदल à¤\9dालà¥\8dयास मला विपतà¥\8dर (à¤\88-मà¥\87ल) पाठवा.',
'tog-enotifusertalkpages' => 'माझ्या चर्चा पानावर बदल झाल्यास मला विरोप (ई-मेल) पाठवा',
'tog-enotifminoredits' => 'मला छोट्या बदलांकरीता सुद्धा विरोप पाठवा',
'tog-enotifrevealaddr' => 'सूचना विरोपात माझा विरोपाचा (ई-मेल ) पत्ता दाखवा',
'viewsourcetext' => 'तुम्ही या पानाचा स्रोत पाहू शकता व प्रत करू शकता:',
'viewyourtext' => 'तुम्ही या पानाचे स्त्रोत पाहू शकता व प्रत करू शकता',
'protectedinterface' => 'हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.',
-'editinginterface' => "'''सावधान:''' तुम्ही संचेतनाचे(Software) संपर्कमाध्यम मजकुर असलेले पान संपादीत करित आहात.या पानावरील बदल इतर उपयोगकर्त्यांच्या उपयोगकर्ता-संपर्कमाध्यमाचे स्वरूप पालटवू शकते.भाषांतरणांकरिता कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/wiki/Main_Page?setlang=mr बीटाविकि] सुविधेचा उपयोग करण्याबद्दल विचार करा.",
+'editinginterface' => "'''सावधान:''' तुम्ही संचेतनाचे (Software) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते. भाषांतरासाठी कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/wiki/Main_Page?setlang=mr translatewiki.net] सुविधेचा उपयोग करण्याबद्दल विचार करा.",
'sqlhidden' => 'छूपी एस्क्यूएल पृच्छा (SQL query hidden)',
'cascadeprotected' => 'हे पान संपादनांपासून सुरक्षित केले गेलेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे, की जे पान/जी पाने शिडी पर्यायाने सुरक्षित आहेत:
$2',
'namespaceprotected' => "'''$1''' नामविश्वातील पाने बदलण्याची आपणांस परवानगी नाही.",
'customcssprotected' => 'या पानावर इतर सदस्याच्या व्यक्तिगत पसंती असल्यामुळे, तुम्हाला हे सीएसएस पान संपादीत करण्याची परवानगी नाही.',
'customjsprotected' => 'या पानावर इतर सदस्याच्या व्यक्तिगत पसंती असल्यामुळे, तुम्हाला हे JavaScript पान संपादीत करण्याची परवानगी नाही.',
-'ns-specialprotected' => 'विशà¥\87ष पानà¥\87 सà¤\82पादà¥\80त करता येत नाहीत.',
+'ns-specialprotected' => 'विशà¥\87ष पानà¥\87 सà¤\82पादित करता येत नाहीत.',
'titleprotected' => "या शीर्षकाचे पान सदस्य [[User:$1|$1]]ने निर्मीत करण्यापासून सुरक्षित केलेले आहे.
''$2'' हे कारण नमूद केलेले आहे.",
'noarticletext-nopermission' => 'या लेखात सध्या काहीही मजकूर नाही.
तुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}|मथळ्याच्या शोध घेऊ शकता]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर याद्या शोधा],
किंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}} लिहू शकता]</span>.',
-'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" सदसà¥\8dय à¤\96ातà¥\87 नà¥\8bà¤\82दà¥\80à¤\95à¥\84त नाहà¥\80.à¤\95à¥\83पया हà¥\87 पान तà¥\81मà¥\8dहà¥\80 सà¤\82पादà¥\80त किंवा नव्याने तयार करू इच्छिता का या बद्दल विचार करा.',
+'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" सदसà¥\8dय à¤\96ातà¥\8dयाà¤\9aà¥\80 नà¥\8bà¤\82द नाहà¥\80. à¤\95à¥\83पया हà¥\87 पान तà¥\81मà¥\8dहà¥\80 सà¤\82पादित किंवा नव्याने तयार करू इच्छिता का या बद्दल विचार करा.',
'userpage-userdoesnotexist-view' => 'सदस्यखाते "$1" हे नोंदलेले नाही.',
'blocked-notice-logextract' => 'हा सदस्य सध्या प्रतिबंधित आहे.
सर्वांत नवीन प्रतिबंधन यादी खाली संदर्भासाठी दिली आहे:',
'userrights' => 'सदस्य अधिकार व्यवस्थापन',
'userrights-lookup-user' => 'सदस्य गटांचे(ग्रूप्स) व्यवस्थापन करा.',
'userrights-user-editname' => 'सदस्य नाव टाका:',
-'editusergroup' => 'सदस्य गट (ग्रूप्स) संपादीत करा',
+'editusergroup' => 'सदस्याचे गट संपादित करा',
'editinguser' => "सदस्य '''[[User:$1|$1]]''' $2 चे सदस्य अधिकारात बदल केला जात आहे.",
-'userrights-editusergroup' => 'सदस्य मंडळे संपादीत करा',
+'userrights-editusergroup' => 'सदस्याचे गट संपादित करा',
'saveusergroups' => 'सदस्य गट जतन करा',
'userrights-groupsmember' => '(चा) सभासद:',
'userrights-groupsmember-auto' => 'चा निर्विवाद सदस्य:',
'watchnologin' => 'प्रवेश केलेला नाही',
'watchnologintext' => 'तुमची पहाऱ्याची सूची बदलायची असेल तर तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असलाच पाहीजे.',
'addwatch' => 'पहाऱ्याच्या सूचीमध्ये टाका',
-'addedwatchtext' => '"[[:$1]]" हà¥\87 पान तà¥\81मà¤\9aà¥\8dया [[Special:Watchlist|पहाऱà¥\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80मधà¥\8dयà¥\87]] टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील पुढील बदल येथे दाखवले जातील, आणि [[Special:RecentChanges|अलीकडील बदलांमध्ये]] पान ठळक दिसेल.
+'addedwatchtext' => '"[[:$1]]" हà¥\87 पान तà¥\81मà¤\9aà¥\8dया [[Special:Watchlist|नितà¥\8dय पहाणà¥\8dयाà¤\9aà¥\80 सà¥\82à¤\9aà¥\80]]मधà¥\8dयà¥\87 टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील पुढील बदल येथे दाखवले जातील, आणि [[Special:RecentChanges|अलीकडील बदलांमध्ये]] पान ठळक दिसेल.
-पहाऱ्याच्या सूचीतून पान काढायचे असेल तर "पहारा काढा" वर टिचकी द्या.',
+नितà¥\8dय पहाण्याच्या सूचीतून पान काढायचे असेल तर "पहारा काढा" वर टिचकी द्या.',
'removewatch' => 'पहाऱ्याच्या सूचीतून वगळा',
'removedwatchtext' => '"[[:$1]]" पान तुमच्या [[Special:Watchlist|पहाऱ्याच्या सूची]]तून वगळण्यात आले आहे.',
'watch' => 'पहारा',
'unwatchthispage' => 'पहारा काढून टाका',
'notanarticle' => 'मजकुर विरहीत पान',
'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
-'watchnochange' => 'पà¥\8dरदरà¥\8dशित à¤\95ालावाधà¥\80त, तà¥\81मà¥\8dहà¥\80 पहारा ठà¥\87वलà¥\87लà¥\80 à¤\95à¥\8bणतà¥\80हà¥\80 बाब सà¤\82पादà¥\80त झाली नाही.',
+'watchnochange' => 'पà¥\8dरदरà¥\8dशित à¤\95ालावधà¥\80त, तà¥\81मà¥\8dहà¥\80 नितà¥\8dय पहाणà¥\8dयासाठà¥\80 ठà¥\87वलà¥\87लà¥\80 à¤\95à¥\8bणतà¥\80हà¥\80 बाब सà¤\82पादित झाली नाही.',
'watchlist-details' => '{{PLURAL:$1|$1 पान|$1 पाने}} पहाऱ्याच्या सूचीमध्ये, चर्चा पाने मोजलेले नाहीत.',
'wlheader-enotif' => '* विपत्र सूचना सुविधा ऊपलब्ध केली.',
'wlheader-showupdated' => "* तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
'exif-sensingmethod-4' => 'थ्री चीप कलर एरीया सेंसर',
'exif-sensingmethod-5' => 'कलर सिक्वेण्शीयल एरीया सेंसर',
-'exif-sensingmethod-7' => 'à¤\9fà¥\8dरायà¥\8dâ\80\8dà¤\8fलिनà¥\80यर सà¥\87à¤\82सर',
-'exif-sensingmethod-8' => 'à¤\95लर सिà¤\95à¥\8dवà¥\87à¤\82शà¥\80यल लिनà¥\80यर सà¥\87नà¥\8dâ\80\8dसर',
+'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
+'exif-sensingmethod-8' => 'à¤\95लर सिà¤\95à¥\8dवà¥\87à¤\82शà¥\80यल लिनà¥\80यर सà¥\87à¤\82सर',
'exif-filesource-3' => 'स्थिरचित्र अंकीय छाउ (डिजीटल स्टील कॅमेरा)',
'exif-scenecapturetype-2' => 'उभे',
'exif-scenecapturetype-3' => 'रात्रीचे दृश्य',
-'exif-gaincontrol-0' => 'नाही',
-'exif-gaincontrol-1' => 'लà¤\98à¥\81 वà¥\83दà¥\8dधà¥\80 वर',
-'exif-gaincontrol-2' => 'बà¥\83हतà¥\8dâ\80\8c वà¥\83दà¥\8dधà¥\80 वर',
-'exif-gaincontrol-3' => 'लà¤\98à¥\81 वà¥\83दà¥\8dधà¥\80 à¤\96ालà¥\80',
-'exif-gaincontrol-4' => 'बà¥\83हतà¥\8dâ\80\8c वà¥\83दà¥\8dधà¥\80 à¤\96ालà¥\80',
+'exif-gaincontrol-0' => 'à¤\95ाहà¥\80हà¥\80 नाहà¥\80',
+'exif-gaincontrol-1' => 'दà¥\8dयà¥\81ति थà¥\8bडà¥\80 वाढवा',
+'exif-gaincontrol-2' => 'दà¥\8dयà¥\81ति à¤\85धिà¤\95 वाढवा',
+'exif-gaincontrol-3' => 'दà¥\8dयà¥\81ति थà¥\8bडà¥\80 à¤\95मà¥\80 à¤\95रा',
+'exif-gaincontrol-4' => 'दà¥\8dयà¥\81ति à¤\85धिà¤\95 à¤\95मà¥\80 à¤\95रा',
'exif-contrast-0' => 'सामान्य',
'exif-contrast-1' => 'नरम',
'confirm-watch-button' => 'ठीक आहे',
'confirm-watch-top' => 'हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?',
'confirm-unwatch-button' => 'ठीक',
-'confirm-unwatch-top' => 'हà¥\87 पान पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढायà¤\9aà¥\87?',
+'confirm-unwatch-top' => 'हà¥\87 पान तà¥\81मà¤\9aà¥\8dया नितà¥\8dय पहाणà¥\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढायà¤\9aà¥\87?',
# Multipage image navigation
'imgmultipageprev' => '← मागील पान',
# Friendlier slave lag warnings
'lag-warn-normal' => '$1 {{PLURAL:$1|सेकंदाच्या|सेकंदांच्या}} आतले बदल या यादी नसण्याची शक्यता आहे.',
-'lag-warn-high' => 'विदा विदादातà¥\8dयास लाà¤\97णारà¥\8dâ\80\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 मà¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} नवà¥\87 बदल या सà¥\82à¤\9aà¥\80त न दाà¤\96वलà¥\87 à¤\9cाणà¥\8dयाà¤\9aà¥\80 शà¤\95à¥\8dयता à¤\86हà¥\87.',
+'lag-warn-high' => 'विदा विदादातà¥\8dयास लाà¤\97णाऱà¥\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 मà¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} नवà¥\87 बदल या सà¥\82à¤\9aà¥\80त à¤\95दाà¤\9aित दाà¤\96वलà¥\87 नाहà¥\80 à¤\9cाणार.',
# Watchlist editor
'watchlistedit-numitems' => 'चर्चा पाने सोडून, {{PLURAL:$1|1 शीर्षक पान|$1 शीर्षक पाने}} तुमच्या पहाऱ्याच्या सूचीमध्ये आहेत.',
-'watchlistedit-noitems' => 'पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80त à¤\95à¥\8bणतà¥\87हà¥\80 शà¥\80रà¥\8dषà¤\95 पान नà¥\8bà¤\82दलà¥\87लà¥\87 नाहà¥\80.',
+'watchlistedit-noitems' => 'नितà¥\8dय पहाणà¥\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80त à¤\95à¥\8bणतà¥\87हà¥\80 शà¥\80रà¥\8dषà¤\95 पान नà¥\8bà¤\82दलà¥\87लà¥\87 नाहà¥\80.',
'watchlistedit-normal-title' => 'पहाऱ्याची सूचीचे संपादन करा',
-'watchlistedit-normal-legend' => 'शà¥\80रà¥\8dषà¤\95पानà¥\87 पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80तà¥\82न वà¤\97ळा',
+'watchlistedit-normal-legend' => 'शà¥\80रà¥\8dषà¤\95पानà¥\87 नितà¥\8dय पहाणà¥\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढा',
'watchlistedit-normal-explain' => 'तुमच्या पहार्याच्या सूचीतील अंतर्भूत नामावळी खाली निर्देशीत केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.',
'watchlistedit-normal-submit' => 'शिर्षक वगळा',
-'watchlistedit-normal-done' => 'तà¥\81मà¤\9aà¥\8dया पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया सà¥\82à¤\9aà¥\80तà¥\82न वà¤\97ळलà¥\87लà¥\80 {{PLURAL:$1|1 शिरà¥\8dषà¤\95 हà¥\8bतà¥\87 |$1 शिर्षके होती }}:',
-'watchlistedit-raw-title' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 पहाऱà¥\8dयाà¤\9aà¥\80 सà¥\82à¤\9aà¥\80 सà¤\82पादà¥\80त à¤\95रा.',
-'watchlistedit-raw-legend' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 पहाऱà¥\8dयाà¤\9aà¥\80 सà¥\82à¤\9aà¥\80 सà¤\82पादà¥\80त à¤\95रा.',
+'watchlistedit-normal-done' => 'तà¥\81मà¤\9aà¥\8dया नितà¥\8dय पहाणà¥\8dया सà¥\82à¤\9aà¥\80तà¥\82न वà¤\97ळलà¥\87लà¥\80 {{PLURAL:$1|1 शà¥\80रà¥\8dषà¤\95 हà¥\8bतà¥\87 |$1 शà¥\80र्षके होती }}:',
+'watchlistedit-raw-title' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 नितà¥\8dय पहाणà¥\8dयाà¤\9aà¥\80 सà¥\82à¤\9aà¥\80 सà¤\82पादित à¤\95रा',
+'watchlistedit-raw-legend' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 नितà¥\8dय पहाणà¥\8dयाà¤\9aà¥\80 सà¥\82à¤\9aà¥\80 सà¤\82पादित à¤\95रा',
'watchlistedit-raw-explain' => 'तुमच्या पहाऱ्याच्या सूचीतील अंतर्भूत नामावली खाली निर्देशित केली आहे, एका ओळीत एक नाव या पद्धतीने; ह्या यादीतील नावे वगळून किंवा भर घालून संपादित करून नामावली अद्ययावत(परिष्कृत) करता येते.
पहाऱ्याची सूची अद्ययावत करा येथे टिचकी मारा.
तुम्ही [[Special:EditWatchlist|प्रस्थापित संपादकाचा उपयोग]] सुद्धा करू शकता.',
# Watchlist editing tools
'watchlisttools-view' => 'सुयोग्य बदल पहा',
'watchlisttools-edit' => 'पहाऱ्याची सूची पहा आणि संपादित करा',
-'watchlisttools-raw' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 पहाऱà¥\8dयाà¤\9aà¥\80 सà¥\82à¤\9aà¥\80 सà¤\82पादà¥\80त करा',
+'watchlisttools-raw' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 नितà¥\8dय पहाणà¥\8dयाà¤\9aà¥\80 सà¥\82à¤\9aà¥\80 सà¤\82पादित करा',
# Signatures
'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|चर्चा]])',
'updated' => '(Dikemas kini)',
'note' => "'''Catatan:'''",
'previewnote' => "'''Ingatlah bahawa ini hanya pralihat.'''
-Perubahan anda belum disimpan! [[#editform|→ Terus menyunting]]",
+Perubahan anda belum disimpan!",
+'continue-editing' => 'Teruskan menyunting',
'previewconflict' => 'Paparan ini merupakan teks di bahagian atas dalam kotak sunting teks. Teks ini akan disimpan sekiranya anda memilih berbuat demikian.',
'session_fail_preview' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi. Sila cuba lagi. Jika masalah ini berlanjutan, [[Special:UserLogout|log keluar]] dahulu, kemudian log masuk sekali lagi.'''",
'session_fail_preview_html' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi.'''
'parser-template-loop-warning' => 'Gelung templat dikesan: [[$1]]',
'parser-template-recursion-depth-warning' => 'Had pengulangan templat dilebihi ($1)',
'language-converter-depth-warning' => 'Had kedalaman penukar bahasa dilepasi ($1)',
+'node-count-exceeded-category' => 'Laman yang melebihi had kiraan nod',
+'node-count-exceeded-warning' => 'Laman terlebih kiraan nod',
+'expansion-depth-exceeded-category' => 'Laman yang melebihi had kedalaman peluasan',
+'expansion-depth-exceeded-warning' => 'Laman terlebih dalam peluasan',
# "Undo" feature
'undo-success' => 'Suntingan ini boleh dibatalkan. Sila semak perbandingan di bawah untuk mengesahkan bahawa anda betul-betul mahu melakukan tindakan ini, kemudian simpan perubahan tersebut.',
'updated' => '(Aġġornata)',
'note' => "'''Nota:'''",
'previewnote' => "'''Ftakar li din hija biss dehra proviżorja.'''
-It-tibdiliet tiegħek għadhom ma ġewx salvati! [[#editform|→ Kompli immodifika]]",
+It-tibdiliet tiegħek għadhom ma ġewx salvati!",
'previewconflict' => "Din il-previżjoni turi l-kliem li jinsab fiż-żona ta' modifika superjuri u turi kif tidher kieku l-paġna kella tiġi modifikata.",
'session_fail_preview' => "'''Jiddispjaċina imma l-modifika tiegħek ma setgħetx tiġi pproċessata minħabba li ntilfet l-informazzjoni tas-sessjoni.
Jekk jogħġbok, erġa' pprova. Jekk xorta tibqa' ma taħdimx, ipprova [[Special:UserLogout|oħroġ]] u erġa' idħol.'''",
{{FULLPAGENAME}}|action=edit}} витнемс-петнемс те лопанть]</span>.',
'updated' => '(Одолгавтозь)',
'note' => "'''Явт мель:'''",
-'previewnote' => "'''Те - ансяк васнянь невтевкс; полавтоматне зярс апак вансто!'''",
+'previewnote' => "'''Кирдть мельсэ, Те ансяк васнянь невтевкс.'''
+Полавтоматне зярс апак вансто!",
'editing' => 'Витнят-петнят $1',
'editingsection' => 'Витнеме-петнеме $1 (секциянть)',
'editingcomment' => 'Витнят-петнят $1 (од явкс)',
'prefs-personal' => 'Теицядо',
'prefs-rc' => 'Чиень полавтнемат',
'prefs-watchlist' => 'Ванома лемрисьме',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}',
'prefs-watchlist-edits-max' => 'Весемеде покш цётось: 1000',
'prefs-misc' => 'Минеть-сюнот',
'prefs-resetpass' => 'Салава валонь полавтома',
'right-mergehistory' => 'Вейтьсэндямс лопатнень юрост-путовксост',
'right-userrights' => 'Витнемс-петнемс совицянь весе видечитнень',
'right-siteadmin' => 'Датабазань сёлгомо ды панжомо',
-'right-passwordreset' => 'Ð\9bиÑ\8fлгавÑ\82омÑ\81 Ñ\82еиÑ\86Ñ\8fнÑ\8c Ñ\81овамо вал ([[Special:PasswordReset|баÑ\88ка лопа]])',
+'right-passwordreset' => 'Ð\92аномÑ\81 Ñ\82еиÑ\86Ñ\8fнÑ\8c Ñ\81алава валонÑ\8c полавÑ\82ома е-Ñ\81Ñ\91Ñ\80маÑ\82',
# User rights log
'rightslog' => 'Уськетеицянть видечинть кемекстома',
'action-deleterevision' => 'нардамс те лиякстомтоманть',
'action-browsearchive' => 'вешнемс нардань лопатнестэ',
'action-undelete' => 'вельмевтемс мекев те лопанть',
+'action-suppressionlog' => 'ваномс те теицянть тевнеде сёрмадовкс',
+'action-block' => 'кардамс те совицянть витнемадо-петнемадо',
'action-import' => 'совавтомс те лопанть лия Викистэ',
'action-importupload' => 'совавтомс те лопанть файлань йовкстамо юртсто',
'action-mergehistory' => 'вейтьсэндямс те лопанть юронзо-путовксонзо',
+'action-userrights' => 'витнемс-петнемс совицянь весе видечитнень',
+'action-userrights-interwiki' => 'витнемс-петнемс лия викитнесэ теицянь видечитнень',
+'action-sendemail' => 'кучомс е-сёрмат',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|полавтнема|полавтнемат}}',
'uploadnologin' => 'Эзить сова',
'uploaderror' => 'Йовкстамсто манявома',
'upload-permitted' => 'Файлань форматт, конат меревить: $1.',
+'upload-preferred' => 'Файлань типт, конатне паро мельсэ учовить: $1.',
+'upload-prohibited' => 'Файлань типт, конатне кардазь: $1.',
'uploadlog' => 'Файлань йовкстамодо журнал',
'uploadlogpage' => 'Файлань йовкстамодо журнал',
'filename' => 'Файлань лем',
'upload-options' => 'Йовкстамонь параметрат',
'watchthisupload' => 'Ваномс те лопанть мельга',
'upload-success-subj' => 'Совавтовсь кода эряви',
+'upload-failure-subj' => 'Ёвкстамосо стакачи',
+'upload-warning-subj' => 'Ёвкстамодо кардамонь пачтямо',
'upload-proto-error' => 'Аволь истямо протокол',
'upload-file-error' => 'Потмонь ильведькс',
'upload-misc-error' => 'Файлань ёвкстамонь апак содань ильведевкс',
'upload-too-many-redirects' => 'URL адрессэнть пек ламо печтевтемат',
'upload-unknown-size' => 'Апак содань покшолмазо',
+'upload-http-error' => 'Лиссь HTTP ильведевкс: $1',
+
+# File backend
+'backend-fail-backup' => '$1 файланть эйстэ тееве ванстовкс копия',
+'backend-fail-delete' => '"$1" файлась эзь нардаво.',
+'backend-fail-store' => '$1 файлась эзь ванстово $2 янонтень.',
+'backend-fail-move' => '$1 файлась эзь печтевтеве $2 файлакс.',
+'backend-fail-read' => '"$1" файлась эзь ловново.',
+'backend-fail-create' => '"$1" файлась эзь шкаво.',
# img_auth script messages
'img-auth-accessdenied' => 'Совамось кардазь',
'statistics-users-active' => 'Чистэ лисийть-совийть',
'statistics-mostpopular' => 'Весемеде сеедьстэ ванозь лопат',
-'disambiguations' => 'Лопат, конат сёрмадстовтовить ламосмустев терминтт',
+'disambiguations' => 'Лопат, конатне сюлмазь чарькодевтемань ламо терминэнь лопас',
'disambiguationspage' => 'Template:смустень коряс явома',
'doubleredirects' => 'Кавксть ютавтозь',
'booksources-go' => 'Адя',
# Special:Log
-'specialloguserlabel' => 'Теицясь:',
-'speciallogtitlelabel' => 'Ð\9aонÑ\8fкÑ\81озо:',
+'specialloguserlabel' => 'ТопавÑ\82Ñ\8bцясь:',
+'speciallogtitlelabel' => 'Ð\9dоÑ\80авомаÑ\82аÑ\80ка (конÑ\8fкÑ\81озо Ñ\8dли Ñ\82еиÑ\86Ñ\8fзо):',
'log' => 'Совамо-лисема тевть (регистрациясь)',
'all-logs-page' => 'Весемень туртов весе совамодо-кемекстамодо журналт',
'logempty' => 'Сови-лиси журналсто а муевить тень марто вейкеть тевть',
'sp-deletedcontributions-contribs' => 'путовксонзо',
# Special:LinkSearch
-'linksearch' => 'Ушонь сюлмавомапенеть',
+'linksearch' => 'Ушо ёндонь сюлмавомапенень вешнема',
'linksearch-pat' => 'Вешнемкс парцун:',
'linksearch-ns' => 'Лем потмозо:',
'linksearch-ok' => 'Вешнэмс',
'mailnologin' => 'Кучомс сёрма парго арась',
'emailuser' => 'Кучомс е-сёрма те теицянтень',
'emailpage' => 'Кучт э-сёрма теицянтень',
-'defemailsubject' => '{{SITENAME}} е-сёрма',
+'defemailsubject' => '{{SITENAME}} е-сёрма "$1"-нь пельде',
+'usermaildisabled' => 'Теицянь е-сёрмась пекстазь',
'noemailtitle' => 'Е-сёрма парго арась',
+'emailusername' => 'Теицянь леметь:',
'emailusernamesubmit' => 'Максомс',
'emailfrom' => 'Кинь пельде:',
'emailto' => 'Кинень:',
'watchlist' => 'Мезе мельга мон ванстнян',
'mywatchlist' => 'Мезе мельга мон ванстнян',
'watchlistfor2' => '$1-нь туртов $2',
+'nowatchlist' => 'Ванома керьксэзэть мезеяк апак путо.',
'watchnologin' => 'Апак сова',
'addedwatchtext' => 'Лопась «[[:$1]]» совавтозь [[Special:Watchlist|ванома потмозот]].
Седе тов те лопасонть ды мартонзо сюлмавозь кортнема лопасонть теезь витьнематне тешкставтовить те потмонтень, истяжо кармить кикстазь те лопасонть[[Special:RecentChanges|потмо од витнематне]], истя седе шождасто сынь неявить.',
# Namespace form on various pages
'namespace' => 'Лем потмозо:',
'invert' => 'Кочказень таркас апаконь кочкамо',
+'namespace_association' => 'Мартонзо сюлмазь лемпотмо',
'blanknamespace' => '(Прявкс)',
# Contributions
'ipboptions' => '2 част:2 hours,1 чи:1 day,3 чить:3 days,1 тарго:1 week,2 таргот:2 weeks,1 ков:1 month,3 ковт:3 months,6 ковт:6 months,1 ие:1 year,певтеме:infinite',
'ipbotheroption' => 'лия',
'ipbotherreason' => 'Лия/поладкс тувтал:',
+'ipb-confirm' => 'Кемекстамс саймес саеманть',
'badipaddress' => 'Амаштовикс IP адрес',
'blockipsuccesssub' => 'Саймес озавтовсь',
'ipb-edit-dropdown' => 'Витнемс-петнемс саймес озавтомань тувталтнэнь',
'ipb-blocklist-contribs' => '$1 лопас путовкст',
'unblockip' => 'Нолдамс теицянть сайместэ',
'ipusubmit' => 'Нардамс те саймас аравтоманть',
+'blocklist' => 'Саймес саень теицят',
'ipblocklist' => 'Саймес саень теицят',
'ipblocklist-legend' => 'Вешнемс саймас саезь теиця',
'blocklist-target' => 'Норовамо тарка',
'revertmove' => 'велявтодо',
'delete_and_move' => 'Нардык ды печтевтик',
'delete_and_move_confirm' => 'Нардыка те лопанть',
-'delete_and_move_reason' => 'Печтевтемга нардазь',
+'delete_and_move_reason' => '«[[$1]]» нардазель од таркань теемга',
'immobile-source-namespace' => '"$1" лемпотмосонть лопатне а печтевтевить',
'immobile-target-namespace' => '"$1" лемпотмонтень лопатне а печтевтевить',
'immobile-source-page' => 'Те лопась одокс а лемдеви.',
'exif-orientation-1' => 'Свалшкань',
'exif-orientation-3' => 'Велявтомс 180°',
'exif-orientation-5' => 'Чаравтозь 90° чинь каршо, мейле велявтозь прянзо лангс',
-'exif-orientation-6' => 'ЧаÑ\80авÑ\82озÑ\8c 90° Ñ\87и мелÑ\8cга',
-'exif-orientation-8' => 'Чаравтозь 90° чинь каршо',
+'exif-orientation-6' => 'ЧаÑ\80авÑ\82озÑ\8c 90° Ñ\87и каÑ\80Ñ\88о',
+'exif-orientation-8' => 'Чаравтозь 90° чи мельга',
'exif-componentsconfiguration-0' => 'арась',
# New logging system
'newuserlog-byemail' => 'салава валот кучозь е-сёрмасо',
+# Feedback
+'feedback-subject' => 'Мезде:',
+'feedback-message' => 'Пачтямнэсь:',
+'feedback-cancel' => 'А теемс',
+'feedback-close' => 'Анок',
+
+# API errors
+'api-error-unknownerror' => 'Апак содань ильведевкс: «$1».',
+
);
'updated' => '(改過矣)',
'note' => "'''Chù-ì:'''",
'previewnote' => "'''Thê-chhéⁿ lí, che chí-sī hō͘ lí sian khoàⁿ chi̍t-ē.'''
-Lí kái--ê iáu-bōe pó-chûn--khí-lâi ![[#editform|→kè-sio̍k pian-chi̍p]]",
+Lí kái--ê iáu-bōe pó-chûn--khí-lâi !",
'previewconflict' => '這个先看覓會反應你文字編輯區的內容,顯示佇面頂。佇你保存了就會公開。',
'session_fail_preview' => "'''Pháiⁿ-sè! Gún chiām-sî bô hoat-tō͘ chhú-lí lí ê pian-chi̍p (goân-in: \"phàng-kiàn sú-iōng kî-kan ê chu-liāu\"). Lô-hoân têng chhì khoàⁿ-māi. Ká-sú iû-goân bô-hāu, ē-sái teng-chhut koh-chài teng-ji̍p hoān-sè tō ē-tit kái-koat.'''",
'session_fail_preview_html' => "'''歹勢!因為phàng見資料,阮無法度處理你的編輯。'''
'updated' => '(Bijgewerkt)',
'note' => "'''Opmerking:'''",
'previewnote' => "'''Let op: dit is een controlepagina.'''
-Uw tekst is niet opgeslagen! [[#editform|→ Doorgaan met bewerken]]",
+Uw tekst is niet opgeslagen!",
+'continue-editing' => 'Doorgaan met bewerken',
'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als u deze opslaat.',
'session_fail_preview' => "'''Uw bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
Probeer het opnieuw.
'parser-template-loop-warning' => 'Er is een kringloop in sjablonen geconstateerd: [[$1]]',
'parser-template-recursion-depth-warning' => 'De recursiediepte voor sjablonen is overschreden ($1)',
'language-converter-depth-warning' => 'De dieptelimiet voor de taalconvertor is overschreden ($1)',
+'node-count-exceeded-category' => "Pagina's waar het maximaal aantal nodes is overschreden",
+'node-count-exceeded-warning' => 'Op de pagina is het maximale aantal nodes overschreden',
+'expansion-depth-exceeded-category' => "Pagina's waar de expansiediepte is overschreden",
+'expansion-depth-exceeded-warning' => 'De pagina bevat te veel sjablonen',
# "Undo" feature
'undo-success' => 'Deze bewerking kan ongedaan gemaakt worden.
'updated' => '(Oppdatert)',
'note' => "'''Merk:'''",
'previewnote' => "'''Hugsa at dette berre er ei førehandsvising.'''
-Endringane dine er ikkje lagra enno! [[#editform|→ Haldt fram med å endra]]",
+Endringane dine er ikkje lagra enno!",
'previewconflict' => 'Dette er ei førehandsvising av teksten i endringsboksen over, slik han vil sjå ut om du lagrar han',
'session_fail_preview' => "'''Orsak! Endringa di kunne ikkje lagrast. Ver venleg og prøv ein gong til. Dersom det framleis ikkje går, prøv å logge deg ut og inn att.'''",
'session_fail_preview_html' => "'''Beklagar! Endringa di kunne ikkje lagrast.'''
Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flytting?',
'delete_and_move_confirm' => 'Ja, slett sida',
-'delete_and_move_reason' => 'Sletta for å gi rom for flytting frå "[[$1]]"',
+'delete_and_move_reason' => 'Sletta for å gje rom for flytting frå «[[$1]]»',
'selfmove' => 'Kjelde- og måltitlane er like; kan ikkje flytte sida over seg sjølv.',
'immobile-source-namespace' => 'Kan ikkje flytte sider i namnerommet «$1»',
'immobile-target-namespace' => 'Kan ikkje flytte sider til namnerommet «$1»',
'badarticleerror' => 'Aquesta accion pòt pas èsser efectuada sus aquesta pagina.',
'cannotdelete' => 'Impossible de suprimir la pagina o lo fichièr « $1 ».
Benlèu la supression ja es estada efectuada per qualqu’un mai.',
+'cannotdelete-title' => 'Impossible de suprimir la pagina "$1"',
'badtitle' => 'Títol marrit',
'badtitletext' => 'Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.',
'perfcached' => 'Aquò es una version en amagatal e es benlèu pas a jorn. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
Foncion : $1<br />
Requèsta : $2',
'viewsource' => 'Vejatz lo tèxte font',
+'viewsource-title' => 'Veire la font de $1',
'actionthrottled' => 'Accion limitada',
'actionthrottledtext' => "Per luchar contra lo spam, l’utilizacion d'aquesta accion es limitada a un cèrt nombre de còps dins una sosta pro corta. S'avèra qu'avètz depassat aqueste limit. Ensajatz tornamai dins qualques minutas.",
'protectedpagetext' => 'Aquesta pagina es estada protegida per empachar sa modificacion.',
'updated' => '(Mes a jorn)',
'note' => "'''Nòta :'''",
'previewnote' => "'''Atencion, aqueste tèxte es sonque una previsualizacion e es pas encara estat salvat !'''",
+'continue-editing' => "Contunhar l'edicion",
'previewconflict' => 'Aquesta previsualizacion fa veire lo tèxte de la bóstia de modificacion superiora coma apareisserà se causissètz de lo salvar.',
'session_fail_preview' => "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions concernent vòstra sesilha.
Ensajatz tornarmai.
S'aquò capita pas un còp de mai, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.'''",
'token_suffix_mismatch' => "'''Vòstra modificacion es pas estada acceptada perque vòstre navigador a mesclat los caractèrs de ponctuacion dins l’identificant d’edicion. La modificacion es estada regetada per empachar la corrupcion del tèxte de l’article. Aqueste problèma se produtz quand utilizatz un mandatari (proxy) anonim problematic.'''",
'editing' => 'Modificacion de $1',
+'creating' => 'Creacion de $1',
'editingsection' => 'Modificacion de $1 (seccion)',
'editingcomment' => 'Modificacion de $1 (seccion novèla)',
'editconflict' => 'Conflicte de modificacion : $1',
'edit-no-change' => 'Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fach dins lo tèxte.',
'edit-already-exists' => 'La pagina novèla a pogut èsser creada .
Existís ja.',
+'defaultmessagetext' => 'Messatge per defaut',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.
'action-userrights' => 'modificar totes los dreches d’utilizaire',
'action-userrights-interwiki' => 'modificar los dreches d’utilizaire e los sus d’autres wikis',
'action-siteadmin' => 'varrolhar o desvarrolhar la banca de donadas',
+'action-sendemail' => 'mandar corrièrs electronics',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
Una [[Special:WhatLinksHere/$2|tièra completa]] es disponibla.',
'nolinkstoimage' => 'Cap de pagina compòrta pas de ligam cap a aqueste imatge.',
'morelinkstoimage' => 'Vejatz [[Special:WhatLinksHere/$1|mai de ligams]] cap a aqueste imatge.',
+'linkstoimage-redirect' => '$1 (redireccion de fichièr) $2',
'duplicatesoffile' => "{{PLURAL:$1|Lo fichièr seguent es un duplicata|Los fichièrs seguents son de duplicatas}} d'aqueste fichièr ([[Special:FileDuplicateSearch/$2|mai de detalhs]]):",
'sharedupload' => 'Aqueste fichièr proven de $1 e pòt èsser utilizat per d’autres projèctes.',
'sharedupload-desc-there' => "Aqueste fichièr proven de $1 e pòt èsser utilizat per d'autres projèctes. Vejatz [$2 sa pagina de descripcion] per mai d'entresenhas.",
Cada entrada conten de ligams cap a la primièra e la segonda redireccions, e mai la primièra linha de tèxte de la segonda pagina, çò que provesís, de costuma, la « vertadièra » pagina cibla, cap a la quala la primièra redireccion deuriá redirigir.
Las entradas <del>barradas</del> son estadas resolgudas.',
'double-redirect-fixed-move' => '[[$1]] es estat renomenat, aquò es ara una redireccion cap a [[$2]]',
+'double-redirect-fixed-maintenance' => 'Correccion de la doble redireccion de [[$1]] a [[$2]]',
'double-redirect-fixer' => 'Corrector de redireccion',
'brokenredirects' => 'Redireccions copadas',
'watchnologin' => 'Vos sètz pas identificat(ada)',
'watchnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
per modificar vòstra lista de seguiment.',
+'addwatch' => 'Ajustar a la lista de seguiment',
'addedwatchtext' => 'La pagina "[[:$1]]" es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]].
Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associada seràn repertoriadas aicí, e la pagina apareisserà <b>en gras</b> dins la [[Special:RecentChanges|tièra dels darrièrs cambiaments]] per èsser localizada mai aisidament.',
+'removewatch' => 'Suprimir de la lista de seguiment',
'removedwatchtext' => 'La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].',
'watch' => 'Seguir',
'watchthispage' => 'Seguir aquesta pagina',
a partir d'una adreça IP precedentament blocada.",
'ipusubmit' => 'Suprimir aqueste blocatge',
'unblocked' => '[[User:$1|$1]] es estat desblocat',
+'unblocked-range' => '$1 es estat desblocat',
'unblocked-id' => 'Lo blocatge $1 es estat levat',
'blocklist' => 'Utilizaires o adreças IP blocats',
'ipblocklist' => 'Utilizaires o adreças IP blocats',
'spam_reverting' => 'Restabliment de la darrièra version que conten pas de ligam cap a $1',
'spam_blanking' => 'Totas las versions que contenon de ligams cap a $1 son blanquidas',
+# Info page
+'pageinfo-subjectpage' => 'Pagina',
+'pageinfo-edits' => "Nombre d'edicions",
+'pageinfo-authors' => "Nombre d'autors distints",
+'pageinfo-views' => 'Nombre de vistas',
+'pageinfo-viewsperedit' => 'Visitas per modificacions',
+
# Skin names
'skinname-standard' => 'Estandard',
'skinname-nostalgia' => 'Nostalgia',
'exif-gpsdirection-m' => 'Nòrd magnetic',
'exif-iimcategory-edu' => 'Educacion',
+'exif-iimcategory-evn' => 'Environament',
'exif-iimcategory-hth' => 'Santat',
'exif-iimcategory-lab' => 'Tribailh',
'exif-iimcategory-pol' => 'Politic',
'table_pager_first' => 'Primièra pagina',
'table_pager_last' => 'Darrièra pagina',
'table_pager_limit' => 'Far veire $1 elements per pagina',
+'table_pager_limit_label' => 'Elements per pagina:',
'table_pager_limit_submit' => 'Accedir',
'table_pager_empty' => 'Cap de resultat',
# Special:ComparePages
'compare-page1' => 'Pagina 1',
'compare-page2' => 'Pagina 2',
+'compare-submit' => 'Comparar',
# Database error messages
'dberr-header' => 'Aqueste wiki a un problèma',
'january' => 'ଜାନୁଆରୀ',
'february' => 'ଫେବୃଆରୀ',
'march' => 'ମାର୍ଚ୍ଚ',
-'april' => 'à¬\8fପà\8dରିଲ',
+'april' => 'à¬\85ପà\8dରà\87ଲ',
'may_long' => 'ମେ',
'june' => 'ଜୁନ',
'july' => 'ଜୁଲାଇ',
'january-gen' => 'ଜାନୁଆରୀ',
'february-gen' => 'ଫେବୃଆରୀ',
'march-gen' => 'ମାର୍ଚ୍ଚ',
-'april-gen' => 'à¬\8fପà\8dରିଲ',
+'april-gen' => 'à¬\85ପà\8dରà\87ଲ',
'may-gen' => 'ମେ',
'june-gen' => 'ଜୁନ',
'july-gen' => 'ଜୁଲାଇ',
'jan' => 'ଜାନୁଆରୀ',
'feb' => 'ଫେବୃଆରୀ',
'mar' => 'ମାର୍ଚ୍ଚ',
-'apr' => 'à¬\8fପà\8dରିଲ',
+'apr' => 'à¬\85ପà\8dରà\87ଲ',
'may' => 'ମେ',
'jun' => 'ଜୁନ',
'jul' => 'ଜୁଲାଇ',
кæнæ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} агурын йæ кой логты]</span>.',
'note' => "'''Бафиппай:'''",
'previewnote' => "'''Зон æй, æмæ ай у æрмæстдæр разбакаст.'''
-Дæ ивдтытæ нырмæ æвæрд не рцыдысты! [[#editform|→ Дарддæр ивын]]",
+Дæ ивдтытæ нырмæ æвæрд не рцыдысты!",
'editing' => 'Ивд цæуы $1',
'editingsection' => 'Ивыс $1 (фарсы хай)',
'editconflict' => 'Ивыны конфликт: $1',
'uploaderror' => 'Файл сæвæрыны рæдыд',
'uploadlogpage' => 'Æвгæндты лог',
'filename' => 'Файлы ном',
-'filedesc' => 'Ð\98вдÑ\82Ñ\8bÑ\82Ñ\8b афыст:',
+'filedesc' => 'Ð\90фыст:',
'minlength1' => 'Файлы номы хъуамæ æппынкъаддæр иу дамгъæ уа.',
'badfilename' => 'Нывы ном ивд æрцыдис. Ныр хуины «$1».',
'savefile' => 'Бавæр æй',
'category-subcat-count' => '{{ਕੁਲ $2 ਸ਼੍ਰੇਣੀਆਂ ਵਿਚੌਂ , PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਹੇਠ ਲਿਖੀ ਸ਼੍ਰੇਣੀ ਹੈ|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਨਿਮਿਨਲਿਖਿਤ {{PLURAL:$1|ਉਪ ਸ਼੍ਰੇਣੀ ਹੈ|$1ਉਪਸ਼੍ਰੇਣੀਆਂ ਹਨ}} }}',
'category-article-count' => '{{ ਕੁਲ $2 ਲੇਖਾਂ ਵਿਚੌਂ , PLURAL:$2| ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਨਿਮਨਲਿਖਿਤ {{PLURAL:$1|ਲੇਖ ਹੈ|$1 ਲੇਖ ਹਨ}}, }}',
'listingcontinuesabbrev' => 'ਅਗੇ.',
+'noindex-category' => 'ਕ੍ਰਮਸੂਚੀ ਰਹਿਤ ਸਫ਼ੇ',
'about' => 'ਇਸ ਬਾਰੇ',
'article' => 'ਸਮੱਗਰੀ ਪੇਜ',
'internalerror' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
'internalerror_info' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ: $1',
'badtitle' => 'ਗਲਤ ਟਾਇਟਲ',
+'badtitletext' => 'ਤੁਹਾਡਾ ਅਰਜ਼ਿਤ ਸਿਰਲੇਖ ਅਪ੍ਰਮਾਣਿਕ,ਖਾਲੀ ਯਾ ਗਲਤ ਜੁੜਿਆ ਹੋਇਆ ਅੰਤਰ-ਭਾਸ਼ਾ ਯਾ ਅੰਤਰ-ਵਿਕਿ ਸਿਰਲੇਖ ਹੈ।ਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਵਿਚ ਇਕ ਦੋ ਅੱਖਰ ਐਸੇ ਹੋਣ ਜੋ ਸਿਰਲੇਖ ਵਿਚ ਵਰਤੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
'protectedpagetext' => 'ਇਸ ਪੰਨੇ ਨੂੰ ਐਡਿਟ ਕਰਨ ਦੀ ਮਨਾਹੀ ਹੈ।',
'viewsourcetext' => 'ਤੁਸੀਂ ਇਸ ਪੰਨੇ ਦਾ ਸੋਮਾ ਦੇਖ ਸਕਦੇ ਹੋ ਤੇ ਉਸ ਦਾ ਉਤਾਰਾ ਵੀ ਲੈ ਸਕਦੇ ਹੋ।',
'yourtext' => 'ਤੁਹਾਡਾ ਟੈਕਸਟ',
'storedversion' => 'ਸੰਭਾਲਿਆ ਵਰਜਨ',
'yourdiff' => 'ਅੰਤਰ',
-'templatesused' => 'à¨\87ਸ ਪà©\87à¨\9c à¨\89ੱਤà©\87 à¨\9fà©\88ਪਲà©\87à¨\9f ਵਰਤਿà¨\86 à¨\9cਾà¨\82ਦਾ ਹà©\88:',
+'templatesused' => 'à¨\87ਸ ਸਫà©\87 ਤà©\87 ਪà©\8dਰà©\8dਯà©\8bà¨\97ਿਤ {{PLURAL:$1|ਫਰਮਾ|ਫਰਮà©\87}}:',
'templatesusedpreview' => "{{PLURAL:$1|ਟੈਪਲੇਟ|ਟੈਪਲੇਟ}} ਇਹ ਝਲਕ 'ਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ:",
'templatesusedsection' => 'ਇਹ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਟੈਪਲੇਟ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ:',
'template-protected' => '(ਸੁਰੱਖਿਅਤ)',
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''ਖ਼ਬਰਦਾਰ: ਸੰਚੇ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਕੁਝ ਸੰਚੇ ਛੁਟ ਜਾਣਗੇ।",
'post-expand-template-inclusion-category' => 'ਉਹ ਪੰਨੇ ਜਿਥੇ ਸੰਚਿਆਂ ਦਾ ਅਕਾਰ ਨਿਣਮਿਤ ਹੱਦ ਤੌਂ ਵੱਧ ਹੈ।',
+'post-expand-template-argument-warning' => "'''ਖ਼ਬਰਦਾਰ'''ਇਸ ਸਫ਼ੇ ਤੇ ਕਿਸੇ ਫ਼ਰਮੇ ਵਿਚ ਘੱਟੋ ਘੱਟ ਇਕ ਸਁਘਟਕ ਐਸਾ ਹੈ ਜਿਸ ਦਾ ਵਿਸਤ੍ਰਿਤ ਰੂਪ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਐਸੇ ਸਁਘਟਕਾਂ ਨੂਁ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
+'post-expand-template-argument-category' => 'ਐਸੇ ਸਫ਼ੇ ਜਿਨ੍ਹਾਂ ਵਿਚ ਫ਼ਰਮੇ ਦੇ ਸਁਘਟਕ ਛੁੱਟ ਗਏ ਹਨ ।',
# Account creation failure
'cantcreateaccounttitle' => 'ਅਕਾਊਂਟ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
'last' => 'ਆਖਰੀ',
'page_first' => 'ਪਹਿਲਾਂ',
'page_last' => 'ਆਖਰੀ',
+'history-fieldset-title' => 'ਇਤਿਹਾਸ ਤੇ ਇਕ ਨਜ਼ਰ ਮਾਰੋ ।',
+'history-show-deleted' => 'ਕੇਵਲ ਮਿਟਾਏ ਗਏ',
'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ',
'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
'historysize' => '($1 ਬਾਈਟ)',
'revertmerge' => 'ਬਿਨ-ਮਿਲਾਨ',
# Diffs
+'history-title' => '"$1" ਦੀ ਸ਼ੋਧ ਤਵਾਰੀਖ',
'difference' => '(ਰੀਵਿਜ਼ਨ ਵਿੱਚ ਅੰਤਰ)',
'lineno' => 'ਲਾਈਨ $1:',
'compareselectedversions' => 'ਚੁਣੇ ਵਰਜਨਾਂ ਦੀ ਤੁਲਨਾ',
ਅਗਲਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
'shown-title' => 'ਪ੍ਰਤੀ ਪੇਜ਼ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}} ਵੇਖਾਓ',
'viewprevnext' => 'ਵੇਖੋ ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''ਇਸ ਵਿਕਿ ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਇਕ ਸਫ਼ਾ ਹੈ'''",
'searchmenu-new' => "'''ਇਸ ਵਿਕਿ ਪਰ \"[[:\$1]]\" ਨਾਮ ਨਾਲ ਪੰਨਾ ਬਣਾਓ!'''",
'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
'searchprofile-articles' => 'ਸਮੱਗਰੀ ਪੇਜ',
# User rights log
'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'ਇਹ ਪੰਨਾ ਸੋਧੋ',
+
# Recent changes
'recentchanges' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
'recentchanges-legend' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ ਚੋਣਾਂ',
'recentchangeslinked-feed' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
'recentchangeslinked-title' => '"$1" ਨਾਲ ਸੰਬੰਧਿਤ ਬਦਲਾਅ',
+'recentchangeslinked-noresult' => 'ਜੁੜੇ ਹੋਏ ਸਫਿਆਂ ਤੇ ,ਦਿੱਤੇ ਸਮੇਂ ਵਿਚ ਕੁਝ ਨਹੀਂ ਬਦਲਿਆ ।',
'recentchangeslinked-summary' => 'ਇਹ ਸੂਚੀ ਊਨ੍ਹਾਂ ਪੰਨਿਆਂ ,ਜੋ ਇਕ ਖਾਸ ਪੰਨੇ ਨਾਲ ਸੰਬੰਧਿਤ ਹਨ, (ਯਾ ਕਿਸੇ ਖਾਸ ਸ਼੍ਰੇਣੀ ਦੇ ਮੈਂਬਰਾਂ) ਦੇ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਵਾਂ ਨੂੰ ਦਰਸ਼ਾਂਦੀ ਹੈ [[Special:Watchlist|ਤੁਹਾਡੀ ਦ੍ਰਿਸ਼ਟੀ ਗੋਚਰ ਸੂਚੀ]] ਵਿਚ ਮੌਜੂਦ ਪੰਨੇ ਮੋਟੇ ਅਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
'recentchangeslinked-page' => 'ਸਫ਼ਾ ਨਾਂ:',
'recentchangeslinked-to' => 'ਇਸ ਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
'upload-curl-error28' => 'ਅੱਪਲੋਡ ਟਾਈਮ-ਆਉਟ',
'license' => 'ਲਾਈਸੈਂਸਿੰਗ:',
-'license-header' => 'ਲਾà¨\88ਸà©\88à¨\82ਸਿੰà¨\97:',
+'license-header' => 'ਵਰਤਣ ਲà¨\88 ਮੰà¨\9c਼à©\82ਰà©\80 ਦà©\87ਣਾ',
'nolicense' => 'ਕੁਝ ਵੀ ਚੁਣਿਆ',
'license-nopreview' => '(ਝਲਕ ਉਪਲੱਬਧ ਨਹੀਂ)',
'upload_source_file' => ' (ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਇੱਕ ਫਾਇਲ)',
'filehist-comment' => 'ਟਿੱਪਣੀ',
'imagelinks' => 'ਫ਼ਾਈਲ ਦੀ ਵਰਤੌਂ',
'linkstoimage' => 'ਹੇਠ ਲਿਖਿਤ {{PLURAL:$1|ਪੰਨੇ ਦਾ ਹਵਾਲਾ ਹੈ|$1 ਪੰਨੇ ਦੇ ਹਵਾਲੇ ਹਨ}} to this file:',
+'nolinkstoimage' => 'ਇਸ ਮਿਸਲ ਨਾਲ ਕੋਈ ਵਿ ਸਫ਼ੇ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ ।',
'sharedupload-desc-here' => 'ਇਹ ਮਿਸਲ $1 ਦੀ ਹੈ ਅਤੇ ਹੋਰ ਪ੍ਰਾਜੈਕਟਾਂ ਵਿਚ ਵੀ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ । ਇਸ ਦੇ [$2 ਮਿਸਲ ਵਾਲੇ ਬ੍ਰਿਤਾਂਤ ਪੰਨੇ] ਵਿਚ ਮੌਜੂਦ ਵਰਨਣ ਨਿਮਨ ਲਿਖਿਤ ਹੈ।',
'uploadnewversion-linktext' => 'ਇਸ ਫਾਇਲ ਦਾ ਇੱਕ ਨਵਾਂ ਵਰਜਨ ਅੱਪਲੋਡ ਕਰੋ',
# Special:LinkSearch
'linksearch' => 'ਬਾਹਰੀ ਲਿੰਕ',
+'linksearch-line' => '$2 ਵਿਚ $1 ਬਾਹਰੀ ਸਿਰਨਾਵਾਂ ਹੈ',
# Special:ListUsers
'listusers-submit' => 'ਵੇਖੋ',
# Watchlist
'watchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
'mywatchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
+'watchlistfor2' => '$1 $2 ਲਈ',
'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
'watch' => 'ਵਾਚ',
'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
'delete-confirm' => '"$1" ਹਟਾਓ',
'delete-legend' => 'ਹਟਾਓ',
'actioncomplete' => 'ਐਕਸ਼ਨ ਪੂਰਾ ਹੋਇਆ',
+'actionfailed' => 'ਹਰਕਤ ਨਿਸ਼ਫ਼ਲ',
'dellogpage' => 'ਹਟਾਉਣ ਲਾਗ',
'deletecomment' => 'ਕਾਰਨ:',
'deleteotherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
'mycontris' => 'ਮੇਰਾ ਯੋਗਦਾਨ',
'contribsub2' => '$1 ($2) ਲਈ',
'uctop' => '(ਉੱਤੇ)',
+'month' => 'ਇਸ(ਯਾ ਹੋਰ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੌਂ',
+'year' => 'ਇਸ(ਜਾਂ ਹੋਰ ਪਿਛਲੇ) ਸਾਲ ਤੌਂ',
'sp-contributions-newbies-sub' => 'ਨਵੇਂ ਅਕਾਊਂਟਾਂ ਲਈ',
'sp-contributions-blocklog' => 'ਪਾਬੰਦੀ ਲਾਗ',
+'sp-contributions-uploads' => 'ਅਪਲੋਡ',
'sp-contributions-logs' => 'ਲਾਗ',
'sp-contributions-talk' => 'ਗੱਲਬਾਤ',
'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
'whatlinkshere-next' => '{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ $1}}',
'whatlinkshere-links' => '← ਲਿੰਕ',
'whatlinkshere-hideredirs' => '$1 ਗੈਰਸਿਧਾ',
+'whatlinkshere-hidetrans' => '$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।',
'whatlinkshere-hidelinks' => '$1 ਲਿੰਕ',
'whatlinkshere-hideimages' => '$1 ਸੰਬੰਧਿਤ ਚਿਤਰ',
'whatlinkshere-filters' => 'ਫਿਲਟਰ',
# Thumbnails
'thumbnail-more' => 'ਫੈਲਾਓ',
'filemissing' => 'ਫਾਇਲ ਗੁੰਮ ਹੈ',
+'thumbnail_error' => 'ਅਁਗੂਠਾ ਝਲਕ ਬਨਾਉਣ ਵਿਚ ਗਲਤੀ ਹੋਈ ਹੈ : $1',
# Special:Import
'import' => 'ਪੇਜ ਇੰਪੋਰਟ ਕਰੋ',
'tooltip-ca-nstab-template' => 'ਟੈਪਲੇਟ ਵੇਖੋ',
'tooltip-ca-nstab-help' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
'tooltip-ca-nstab-category' => 'ਕੈਟਾਗਰੀ ਪੇਜ ਵੇਖੋ',
+'tooltip-minoredit' => 'ਇਸ ਤੇ ਛੋਟੇ ਬਦਲਾਅ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
'tooltip-save' => 'ਆਪਣੇ ਬਦਲਾਅ ਸੰਭਾਲੋ',
'tooltip-preview' => 'ਆਪਣੇ ਬਦਲਾਅ ਦੀ ਝਲਕ ਵੇਖੋ, ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ ਜੀ!',
'tooltip-diff' => 'ਇਸ ਪਾਠ ਵਿਚ ਆਪਣੇ ਕੀਤੇ ਹੋਏ ਬਦਲਾਅ ਦੇਖੋ',
'tooltip-compareselectedversions' => 'ਇਸ ਪੰਨੇ ਦੇ ਚੁਣੇ ਹੋਏ ਸ਼ੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਦੇਖੋ',
+'tooltip-watch' => 'ਇਹ ਸਫ਼ੇ ਨੂੰ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
'tooltip-upload' => 'ਅੱਪਲੋਡ ਸਟਾਰਟ ਕਰੋ',
'tooltip-rollback' => "'' ਵਾਪਸ ਲੈ ਜਾਓ '' ਇਕ ਝਟਕੇ ਵਿਚ ਹੀ ਪਿਛਲੇ ਯੂਜ਼ਰ ਦੇ ਬਦਲਾਵਾਂ ਨੂੰ ਗਾਇਬ ਕਰ ਦੇਂਦਾ ਹੈ।",
'tooltip-undo' => '" ਪੁਰਾਣੀ ਹਾਲਤ ਵਿਚ ਪਰਤੋ " ਇਸ ਬਦਲਾਅ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੰਪਾਦਨ ਫਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਖਾਂਦਾ ਹੈ।
# Metadata
'metadata' => 'ਮੇਟਾ ਡੈਟਾ',
'metadata-help' => 'ਇਸ ਮਿਸਲ ਵਿਚ ਵਾਧੂ ਜਾਨਕਾਰੀਆਂ ਹਨ , ਜੋ ਸ਼ਾਇਦ ਉਸ ਕੈਮਰੇ ਯਾ ਸਕੈਨਰ ਦੀ ਦੇਣ ਹਨ ਜੋਕਿ ਇਸ ਮਿਸਲ ਨੂੰ ਬਨਾਉਣ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।ਅਗ਼ਰ ਇਹ ਮਿਸਲ ਬਦਲਾਈ ਗਈ ਹੈ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕੁਝ ਵੇਰਵੇ ਬਦਲੀ ਮਿਸਲ ਦਾ ਸਹੀ ਰੂਪਮਾਨ ਨਾ ਹੋਣ।',
+'metadata-fields' => 'ਮੈਟਾਡੈਟਾ ਸੂਚੀ ਪਟ ਨੂੰ ਛੋਟਾ ਕਰਣ ਨਾਲ ਇਸ ਸੁਨੇਹੇ ਵਿਚ ਸੂਚੀਬੱਧ ਫ਼ੀਲਡ ਮੂਰਤ ਦੇ ਦ੍ਰਿਸ਼ ਵਿਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ।ਬਾਕੀ ਫ਼ੀਲਡਾਂ ਨੂੰ ਛਿਪਾਇਆ ਜਾਏਗਾ।',
# EXIF tags
'exif-imagewidth' => 'ਚੌੜਾਈ',
'updated' => '(Zmodyfikowano)',
'note' => "'''Uwaga:'''",
'previewnote' => "'''To jest tylko podgląd'''
-Zmiany nie zostały jeszcze zapisane! [[#editform|→ Kontynuuj edycję]]",
+Zmiany nie zostały jeszcze zapisane!",
'previewconflict' => 'Podgląd odnosi się do tekstu z górnego pola edycji. Tak będzie wyglądać strona, jeśli zdecydujesz się ją zapisać.',
'session_fail_preview' => "'''Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.
Spróbuj jeszcze raz.
'updated' => '(Agiornà)',
'note' => "'''NÒTA:'''",
'previewnote' => "'''Che a ten-a present che costa-sì a l'é mach na preuva.'''
-Ij sò cambi a son anco' pa stàit salvà! [[#editform|→ Continué la modìfica]]",
+Ij sò cambi a son anco' pa stàit salvà!",
'previewconflict' => "Costa preuva a-j mostra ël test dl'artìcol ambelessì dzora. Se a sërn dë salvelo, a l'é parèj che a lo s-ciairëran ëdcò tuti j'àutri Utent.",
'session_fail_preview' => "'''Darmagi! I l'oma pa podù processé soa modìfica per via che a son përdusse për la stra ij dat ëd session.
Për piasì che a preuva n'àutra vira. Se a dovèissa mai torna riveje sossì, che a preuva a seurte dal sistema e peuj torna a rintré.'''",
# Suppression log
'suppressionlog' => 'Registr ëd le scancelassion',
'suppressionlogtext' => "Sì-sota a-i é na lista djë scancelament e dij blocagi che a rësguardo dij contnù stërmà a j'aministrator.
-Beiché la [[Special:BlockList|lista dij blòch]] për la lista dj'esclusion operassionaj e dij blocagi ativ.",
+Beiché la [[Special:BlockList|lista dij blocagi]] për la lista dj'esclusion operassionaj e dij blocagi ativ.",
# History merging
'mergehistory' => 'Buté ansema je stòrie',
'badipaddress' => "L'adrëssa IP che a l'ha dane a l'é nen giusta.",
'blockipsuccesssub' => 'Blocagi fàit',
'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] a l'é stàit blocà.<br />
-Ch'a consulta la [[Special:BlockList|lista dij blòch]] për rivëdde ij blocagi.",
+Ch'a consulta la [[Special:BlockList|lista dij blocagi]] për rivëdde ij blocagi.",
'ipb-blockingself' => "A l'é an camin ch'as blòca chiel-midem! É-lo sigur ëd vorèj fé lòn?",
'ipb-confirmhideuser' => "A l'é an camin ch'a blòca n'utent con «stërmé l'utent» abilità. Sòn a gaverà lë stranòm ëd l'utent da tute le liste e le vos ëd registr. É-lo sigur ëd vorèj fé lòn?",
'ipb-edit-dropdown' => 'Modifiché le rason dël blocagi',
'reblock-logentry' => "a l'ha cambià j'ampostassion dël blocagi për [[$1]] con na scadensa ai $2 $3",
'blocklogtext' => "Sossì a l'é ël registr dij blocagi e dësblocagi dj'Utent. J'adrësse che
a son ëstàite blocà n'automàtich ambelessì a së s-ciàiro nen.
-Che a varda la [[Special:BlockList|lista dij blòch]] për vëdde
+Che a varda la [[Special:BlockList|lista dij blocagi]] për vëdde
coj che sio ij blocagi ativ al dì d'ancheuj.",
'unblocklogentry' => "a l'ha dësblocà $1",
'block-log-flags-anononly' => 'mach utent anònim',
'movepagebtn' => 'Tramudé la pàgina',
'pagemovedsub' => 'San Martin bele finì!',
'movepage-moved' => "'''«$1» a l'é stàit tramudà a «$2»'''",
-'movepage-moved-redirect' => "A l'é stàita creà na rediression.",
+'movepage-moved-redirect' => "A l'é stàita creà na ridiression.",
'movepage-moved-noredirect' => "La creassion ëd na ridiression a l'é stàita scancelà.",
'articleexists' => "Na pàgina che as ciama parej a-i é già, ò pura ël nòm che a l'ha sërnù a va nen bin.<br />
-Che as sërna, për piasì, un nòm diferent për st'articol.",
-'cantmove-titleprotected' => "As peul pa fesse San Martin ambelelì, për via che col tìtol-lì a l'é stàit proibì e a peul pa ess-ie na pàgina ciamà parej",
+Che as sërna, për piasì, un nòm diferent për st'artìcol.",
+'cantmove-titleprotected' => "As peul pa fesse San Martin ambelelì, për via che col tìtol-lì a l'é stàit proibì e a peul pa ess-ie na pàgina ciamà parèj",
'talkexists' => "La pàgina a l'é staita bin tramudà, ma a l'é pa podusse tramudé soa pàgina ëd discussion, përchè a-i në j'é già n'àutra ant la pàgina con ël tìtol neuv. Për piasì, che a modìfica a man ij contnù dle doe pàgine ëd discussion, an manera che as perdo nen dij pensé anteressant.",
'movedto' => 'tramudà a',
-'movetalk' => "Podend, tramuda ëdcò la pàgina ëd discussion che a l'ha tacà.",
+'movetalk' => "Tramudé ëdcò la pàgina ëd discussion che a l'ha tacà",
'move-subpages' => 'Tramuda le sotpàgine (fin a $1)',
'move-talk-subpages' => 'Tramuda le sotpàgine ëd na pàgina ëd discussion (fin a $1)',
'movepage-page-exists' => 'La pàgina $1 a esist già e a peul pa esse coatà automaticament.',
'''تر اوسه پورې دا نه دی خوندي شوی!'''",
'updated' => '(تازه)',
'note' => "'''يادونه:'''",
-'previewnote' => "'''دا يواځې مخليدنه ده، تاسې چې کوم بدلونونه ترسره کړي، لا تر اوسه پورې نه دي خوندي شوي!'''",
+'previewnote' => "'''هېر مو نه شي چې دا يواځې يوه مخليدنه ده.'''
+ستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
'editing' => 'د $1 سمونه',
'editingsection' => 'سمونه $1 (برخه)',
'editingcomment' => 'د $1 سمون (نوې برخه)',
'upload-http-error' => 'د HTTP يوه ستونزه رامېنځ ته شوې: $1',
# File backend
+'backend-fail-delete' => 'د "$1" دوتنه ړنګه نه شوه.',
'backend-fail-alreadyexists' => 'د $1 دوتنه له پخوا نه شته.',
+'backend-fail-read' => 'د "$1" دوتنه نه شي لوستل کېدای.',
+'backend-fail-create' => 'د "$1" دوتنه نه شي جوړېدای.',
# ZipDirectoryReader
'zip-wrong-format' => 'ځانګړې شوې دوتنه يوه ZIP دوتنه نه وه.',
'ipb-confirm' => 'د بنديز تاييد',
'badipaddress' => 'ناسمه IP پته',
'blockipsuccesssub' => 'بنديز په برياليتوب سره ولګېده',
-'blockipsuccesstext' => 'د [[Special:Contributions/$1|$1]] مخه نيول شوې.
-<br />د مخنيول شويو خلکو د کتنې لپاره، د [[Special:BlockList|مخنيول شويو IP لړليک]] وګورۍ.',
+'blockipsuccesstext' => 'په [[Special:Contributions/$1|$1]] بنديز لګېدلی.<br />
+د بنديزونو د څارلو لپاره [[Special:BlockList|بنديز لړليک]] وګورۍ.',
'ipb-edit-dropdown' => 'د بنديز سببونه سمول',
'ipb-unblock-addr' => 'له $1 بنديز ليرې کول',
'ipb-unblock' => 'له يوه کارن-نوم يا IP پتې بنديز ليري کول',
# Import log
'importlogpage' => 'د واردولو يادښت',
+# JavaScriptTest
+'javascripttest' => 'د جاوا سکرېپټ آزمېښت',
+
# Tooltip help for the actions
'tooltip-pt-userpage' => 'ستاسې کارن مخ',
'tooltip-pt-mytalk' => 'ستاسې د خبرواترو مخ',
'tooltip-diff' => 'دا هغه بدلونونه چې تاسې په متن کې ترسره کړي، ښکاره کوي. [alt-v]',
'tooltip-compareselectedversions' => 'د همدې مخ د دوو ټاکل شويو بڼو تر مېنځ توپيرونه وګورۍ.',
'tooltip-watch' => 'دا مخ ستاسې کتنلړ کې ورګډوي [alt-w]',
+'tooltip-upload' => 'د پورته کولو پيل',
'tooltip-rollback' => 'په همدې مخ کې "په شابېول" د وروستني ونډوال سمون (سمونونه) په يوه کلېک په څټ ورګرځوي.',
'tooltip-undo' => '"ناکړ" همدا سمون پر شا ګرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.
دا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورګډولو آسانتيا برابروي.',
'svg-long-desc' => 'SVG دوتنه، نومېنلي $1 × $2 پېکسل، د دوتنې کچه: $3',
'show-big-image' => 'بشپړ بېلن نښې',
'file-info-gif-frames' => '$1 {{PLURAL:$1|چوکاټ|چوکاټونه}}',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|ځل|ځله}} وغږېده',
'file-info-png-frames' => '$1 {{PLURAL:$1|چوکاټ|چوکاټونه}}',
# Special:NewFiles
'exif-model' => 'د کامرې ماډل',
'exif-software' => 'کارېدلې ساوترۍ',
'exif-artist' => 'ليکوال',
+'exif-copyright' => 'د رښتو خاوند',
'exif-colorspace' => 'رنګ تشيال',
'exif-pixelydimension' => 'د انځور سور',
'exif-pixelxdimension' => 'د انځور جګوالی',
'exif-objectname' => 'لنډ سرليک',
'exif-headline' => 'سرليک',
'exif-source' => 'سرچينه',
-'exif-contact' => 'د اړيکې مالومات',
+'exif-contact' => 'د اړيکو مالومات',
'exif-writer' => 'ليکوال',
'exif-languagecode' => 'ژبه',
'exif-iimcategory' => 'وېشنيزه',
'exif-datetimeexpires' => 'مه يې کاروۍ وروسته له',
+'exif-datetimereleased' => 'خپرېدلی په',
'exif-identifier' => 'پېژندنه',
'exif-lens' => 'کارېدلې لېنز',
'exif-serialnumber' => 'د کامرې پرله پسې شمېره',
'exif-cameraownername' => 'د کامرې خاوند',
'exif-label' => 'نښکه',
+'exif-copyrighted' => 'د رښتو دريځ',
+'exif-copyrightowner' => 'د رښتو خاوند',
+'exif-usageterms' => 'د کارولو شرايط',
'exif-pngfilecomment' => 'د PNG دوتنې تبصره',
'exif-disclaimer' => 'ردادعاليک',
'exif-giffilecomment' => 'د GIF دوتنې تبصره',
+'exif-copyrighted-true' => 'په رښتو سمبال',
+'exif-copyrighted-false' => 'ټولګړی شپول',
+
'exif-unknowndate' => 'نامالومه نېټه',
'exif-orientation-1' => 'نورمال',
'exif-lightsource-1' => 'د ورځې رڼا',
'exif-lightsource-4' => 'فلش',
'exif-lightsource-9' => 'ښه هوا',
+'exif-lightsource-10' => 'ورېځ پوښلې هوا',
'exif-lightsource-11' => 'سيوری',
'exif-lightsource-255' => 'د رڼا بله سرچينه',
'iranian-calendar-m11' => 'سلواغه',
'iranian-calendar-m12' => 'کب',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|خبرې اترې]])',
+
# Special:Version
'version' => 'بڼه',
'version-extensions' => 'لګېدلي شاتاړي',
'feedback-close' => 'ترسره شو',
# API errors
+'api-error-duplicate-popup-title' => 'غبرګونې {{PLURAL:$1|دوتنه|دوتنې}}.',
'api-error-empty-file' => 'کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.',
'api-error-file-too-large' => 'کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.',
'api-error-filename-tooshort' => 'د دوتنې نوم ډېر لنډ دی.',
'api-error-unknown-warning' => 'ناڅرګنده ګواښنه: "$1".',
'api-error-unknownerror' => 'ناڅرګنده تېروتنه: "$1".',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|ثانيه|ثانيې}}',
+'duration-minutes' => '$1 {{PLURAL:$1|دقيقه|دقيقې}}',
+'duration-hours' => '$1 {{PLURAL:$1|ساعت|ساعتونه}}',
+'duration-days' => '$1 {{PLURAL:$1|ورځ|ورځې}}',
+'duration-weeks' => '$1 {{PLURAL:$1|اونۍ|اونۍ}}',
+'duration-years' => '$1 {{PLURAL:$1|کال|کالونه}}',
+'duration-decades' => '$1 {{PLURAL:$1|لسيزه|لسيزې}}',
+'duration-centuries' => '$1 {{PLURAL:$1|پېړۍ|پېړۍ}}',
+'duration-millennia' => '$1 {{PLURAL:$1|زرمه|زرمې}}',
+
);
'ns-specialprotected' => 'Não é possível editar páginas especiais',
'titleprotected' => 'Este título foi protegido contra criação por [[User:$1|$1]].
A justificação foi "\'\'$2\'\'".',
+'filereadonlyerror' => 'Não é possível modificar o ficheiro "$1" porque o repositório de ficheiros "$2" está em modo de leitura.
+
+O administrador que efetuou o bloqueio deu a seguinte explicação: "$3".',
# Virus scanner
'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
'updated' => '(Actualizado)',
'note' => "'''Nota:'''",
'previewnote' => "'''Lembre-se que esta é apenas uma antevisão do resultado.'''
-As modificações ainda não foram gravadas! [[#editform|→ Continuar a editar]]",
+As modificações ainda não foram gravadas!",
+'continue-editing' => 'Continuar a editar',
'previewconflict' => 'Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.',
'session_fail_preview' => "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.
Tente novamente, por favor.
'parser-template-loop-warning' => 'Ciclo de predefinições detectado: [[$1]]',
'parser-template-recursion-depth-warning' => 'Foi excedido o limite da profundidade de recursividade nas predefinições ($1)',
'language-converter-depth-warning' => 'O limite de profundidade do conversor de línguas excedeu a ($1)',
+'node-count-exceeded-category' => 'Páginas em que o total de nós é excedido',
+'node-count-exceeded-warning' => 'A página excedeu o total de nós',
+'expansion-depth-exceeded-category' => 'Páginas em que a profundidade de expansão é excedida',
+'expansion-depth-exceeded-warning' => 'A página excedeu a profundidade de expansão',
# "Undo" feature
'undo-success' => 'É possível desfazer a edição.
'backend-fail-internal' => 'Ocorreu um erro desconhecido no servidor de armazenamento "$1".',
'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do ficheiro para armazenar em " $1 ".',
+# File journal errors
+'filejournal-fail-dbconnect' => 'Não foi possível ligar à base de dados de registos no "backend" de armazenamento "$1".',
+'filejournal-fail-dbquery' => 'Não foi possível atualizar a base de dados de registos do "backend" de armazenamento "$1".',
+
# Lock manager
'lockmanager-notlocked' => 'Não foi possível desbloquear " $1 "; não se encontra bloqueado.',
'lockmanager-fail-closelock' => 'Não foi possível encerrar a referência de bloqueio para "$1".',
'lockmanager-fail-deletelock' => 'Não foi possível eliminar a referência de bloqueio para "$1".',
+'lockmanager-fail-acquirelock' => 'Não foi possível adquirir bloqueio para "$1".',
+'lockmanager-fail-openlock' => 'Não foi possível abrir ficheiro de bloqueio para "$1".',
+'lockmanager-fail-releaselock' => 'Não foi possível libertar bloqueio para "$1".',
+'lockmanager-fail-db-bucket' => 'Não foi possível contactar bases de dados de bloqueio suficientes no "bucket" $1.',
+'lockmanager-fail-db-release' => 'Não foi possível libertar bloqueios na base de dados $1.',
+'lockmanager-fail-svr-release' => 'Não foi possível libertar bloqueios no servidor $1.',
# ZipDirectoryReader
'zip-file-open-error' => 'Foi encontrado um erro ao abrir o ficheiro ZIP para verificação.',
'uploadstash-badtoken' => 'Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.',
'uploadstash-errclear' => 'Não foi possível apagar os ficheiros.',
'uploadstash-refresh' => 'Actualizar a lista de ficheiros',
+'invalid-chunk-offset' => 'Deslocamento de fragmento inválido',
# img_auth script messages
'img-auth-accessdenied' => 'Acesso negado',
Consulte a [$2 página de descrição do ficheiro] para mais informações, por favor.',
'sharedupload-desc-here' => 'Este ficheiro provém de $1 e pode ser usado por outros projectos.
A descrição na [$2 página de descrição] é mostrada abaixo.',
+'sharedupload-desc-edit' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
+Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
+'sharedupload-desc-create' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
+Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
'filepage-nofile' => 'Não existe nenhum ficheiro com este nome.',
'filepage-nofile-link' => 'Não existe nenhum ficheiro com este nome, mas pode [$1 carregá-lo].',
'uploadnewversion-linktext' => 'Carregar uma nova versão deste ficheiro',
'allpages-bad-ns' => 'A {{SITENAME}} não possui o espaço nominal "$1".',
'allpages-hide-redirects' => 'Ocultar redirecionamentos',
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Ver mais recente.',
+
# Special:Categories
'categories' => 'Categorias',
'categoriespagetext' => '{{PLURAL:$1|A seguinte categoria contém páginas ou ficheiros multimédia|As seguintes categorias contêm páginas ou ficheiros multimédia}}.
'version-software' => 'Software instalado',
'version-software-product' => 'Produto',
'version-software-version' => 'Versão',
+'version-entrypoints' => 'URLs de ponto de entrada',
+'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Endereço de ficheiro',
'newuserlog-byemail' => 'palavra-chave enviada por correio-electrónico',
# Feedback
+'feedback-bugornote' => 'Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 denuncie um defeito].
+Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página "[$3 $2]", junto com o seu nome de utilizador e o navegador que está a usar.',
'feedback-subject' => 'Assunto:',
'feedback-message' => 'Mensagem:',
'feedback-cancel' => 'Cancelar',
'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
'feedback-error2' => 'Erro: A edição falhou',
'feedback-error3' => 'Erro: A API não responde',
+'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2 $1 ]".',
'feedback-close' => 'Feito',
'feedback-bugcheck' => 'Perfeito! Verifique apenas que não é já um dos [$1 defeitos conhecidos].',
-'feedback-bugnew' => 'Eu verifiquei. Reportar um novo bug.',
+'feedback-bugnew' => 'Eu verifiquei. Denunciar um novo defeito.',
# API errors
'api-error-badaccess-groups' => 'Não tem permissão para enviar ficheiros para esta wiki.',
Certifique-se de que tem os cookies ativados, recarregue esta página e tente novamente.',
'noname' => 'Você não colocou um nome de usuário válido.',
'loginsuccesstitle' => 'Login bem sucedido',
-'loginsuccess' => "'''Agora você está autenticado ao wiki {{SITENAME}} como \"\$1\"'''.",
+'loginsuccess' => "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"\$1\"'''.",
'nosuchuser' => 'Não existe nenhum usuário com o nome "$1".
Os nomes de usuário são sensíveis à capitalização.
Verifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].',
'updated' => '(Atualizado)',
'note' => "'''Nota:'''",
'previewnote' => "'''Lembre-se de que isto é apenas uma previsão.'''
-Suas alterações ainda não foram salvas! [[#editform|→ Continuar editando]]",
+Suas alterações ainda não foram salvas!",
+'continue-editing' => 'Continuar editando',
'previewconflict' => 'Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.',
'session_fail_preview' => "'''Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.
Por favor tente novamente.
'backend-fail-maxsize' => 'Não foi possível criar o arquivo $1 por ele ser maior que {{PLURAL:$2|1 byte|$2 bytes}}.',
'backend-fail-readonly' => 'O servidor de armazenamento "$1" está atualmente no modo "somente leitura". A razão dada foi: "$2"',
'backend-fail-synced' => 'O arquivo "$1" está em um estado inconsistente dentro do sistema de armazenamento interno',
-'backend-fail-connect' => 'Não foi possível ligar ao servidor de armazenamento "$1".',
+'backend-fail-connect' => 'Não foi possível se conectar com o servidor de armazenamento "$1".',
'backend-fail-internal' => 'Ocorreu um erro desconhecido no servidor de armazenamento "$1".',
'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do arquivo para armazenar em "$1".',
'backend-fail-batchsize' => 'O servidor de armazenamento retornou um conjunto de $1 {{PLURAL:$1|operação|operações}} de arquivo, enquanto seu limite é de $2 {{PLURAL:$1|operação|operações}}.',
Por favor veja a [$2 página de descrição do arquivo] para mais informações.',
'sharedupload-desc-here' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
+'sharedupload-desc-edit' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
+Talvez você deseje editar a descrição na sua [$2 página de descrição de arquivo] por lá.',
+'sharedupload-desc-create' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
+Talvez você deseje editar a descrição na sua [$2 página de descrição de arquivo] por lá.',
'filepage-nofile' => 'Não existe nenhum arquivo com esse nome.',
'filepage-nofile-link' => 'Não existe nenhum arquivo com este nome, mas você pode [$1 carregá-lo].',
'uploadnewversion-linktext' => 'Enviar uma nova versão deste arquivo',
'wantedpages' => 'Páginas pedidas',
'wantedpages-badtitle' => 'Título inválido no conjunto de resultados: $1',
'wantedfiles' => 'Arquivos pedidos',
+'wantedfiletext-cat' => 'Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].',
+'wantedfiletext-nocat' => 'Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>.',
'wantedtemplates' => 'Predefinições pedidas',
'mostlinked' => 'Páginas com mais afluentes',
'mostlinkedcategories' => 'Categorias com mais membros',
'mostimages' => 'Imagens com mais afluentes',
'mostrevisions' => 'Páginas de conteúdo com mais revisões',
'prefixindex' => 'Todas as páginas com prefixo',
+'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
'shortpages' => 'Páginas curtas',
'longpages' => 'Páginas longas',
'deadendpages' => 'Páginas sem saída',
'allpages-bad-ns' => '{{SITENAME}} não possui o espaço nominal "$1".',
'allpages-hide-redirects' => 'Ocultar redirecionamentos',
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Você está visualizando uma versão de cache desta página que pode ser de $1 atrás.',
+'cachedspecial-viewing-cached-ts' => 'Você está visualizando uma versão de cache desta página que pode estar desatualizada.',
+'cachedspecial-refresh-now' => 'Ver a mais recente.',
+
# Special:Categories
'categories' => 'Categorias',
'categoriespagetext' => '{{PLURAL:$1|A seguinte categoria contém|As seguintes contém}} páginas ou mídia.
'ipb-confirm' => 'Confirmar bloqueio',
'badipaddress' => 'Endereço de IP inválido',
'blockipsuccesssub' => 'Bloqueio bem sucedido',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi bloqueado.<br />
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
+Consulte a [[Special:BlockList|lista de bloqueios]].',
'ipb-blockingself' => 'Você está prestes a bloquear-se a si próprio. Você tem a certeza de que pretende fazê-lo?',
'ipb-confirmhideuser' => 'Você está prestes a bloquear um utilizador com "Ocultar nome de utilizador/IP" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?',
'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] $3. O bloqueio expira em $2.',
'blocklogtext' => 'Este é um registro de ações de bloqueio e desbloqueio.
Endereços IP sujeitos a bloqueio automático não são listados.
-Consulte a [[Special:BlockList|lista de IPs bloqueados]] para obter a lista de bloqueios e banimentos atualmente válidos.',
+Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloqueios e banimentos em efeito neste momento.',
'unblocklogentry' => 'desbloqueou $1',
'block-log-flags-anononly' => 'apenas usuários anônimos',
'block-log-flags-nocreate' => 'criação de contas desabilitada',
'thumbnail_error' => 'Erro ao criar miniatura: $1',
'djvu_page_error' => 'página DjVu inacessível',
'djvu_no_xml' => 'Não foi possível acessar o XML do arquivo DjVU',
+'thumbnail-temp-create' => 'Não foi possível criar o arquivo temporário de miniatura',
+'thumbnail-dest-create' => 'Não foi possível salvar a miniatura no destino',
'thumbnail_invalid_params' => 'Parâmetros de miniatura inválidos',
'thumbnail_dest_directory' => 'Não foi possível criar o diretório de destino',
'thumbnail_image-type' => 'Tipo de imagem não suportado',
'import-invalid-interwiki' => 'Não é possível importar do wiki especificado.',
'import-error-edit' => 'A página "$1" não foi importada porque você não tem permissão para editá-la.',
'import-error-create' => 'A página "$1" não foi importada porque você não tem permissão para criá-la.',
+'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
+'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
+'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
# Import log
'importlogpage' => 'Registro de importações',
# JavaScriptTest
'javascripttest' => 'Teste de JavaScript',
+'javascripttest-disabled' => 'Essa função não foi habilitada neste wiki.',
+'javascripttest-title' => 'Executando testes para $1',
'javascripttest-pagetext-noframework' => 'Esta página é exclusiva para testes de JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'A estrutura de testes "$1" é desconhecida.',
+'javascripttest-pagetext-frameworks' => 'Escolha uma das seguintes estruturas de teste: $1',
+'javascripttest-pagetext-skins' => 'Escolha o tema para executar os testes:',
+'javascripttest-qunit-intro' => 'Veja a [$1 documentação de testes] no mediawiki.org.',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Sua página de usuário',
'version-software' => 'Software instalado',
'version-software-product' => 'Produto',
'version-software-version' => 'Versão',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Diretório do arquivo',
'newuserlog-byemail' => 'senha enviada por correio-eletrônico',
# Feedback
+'feedback-bugornote' => 'Se você está preparado para descrever detalhadamente um problema técnico, [$1 relate um bug].
+Caso contrário, você poderá usar o formulário simplificado a seguir. Seu comentário será adicionado à página "[$3 $2]", junto com o seu nome de usuário e o navegador que estiver usando neste momento.',
'feedback-subject' => 'Assunto:',
'feedback-message' => 'Mensagem:',
'feedback-cancel' => 'Cancelar',
'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
'feedback-error2' => 'Erro: A edição falhou',
'feedback-error3' => 'Erro: A API não responde',
+'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2 $1 ]".',
'feedback-close' => 'Feito',
+'feedback-bugcheck' => 'Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].',
+'feedback-bugnew' => 'Eu verifiquei. Relatar um bug novo',
# API errors
'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para este wiki.',
'api-error-uploaddisabled' => 'Este wiki está com o upload de arquivos desabilitado.',
'api-error-verification-error' => 'Este arquivo pode estar corrompido ou ter a extensão errada.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minutos}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|dia|dias}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|semanas}}',
+'duration-years' => '$1 {{PLURAL:$1|ano|anos}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milênio|milênios}}',
+
);
* @author Sborsody
* @author Seb35
* @author Sherbrooke
+ * @author Shirayuki
* @author Shushruth
* @author Siebrand
* @author Singularity
'nocookieslogin' => "This message is displayed when someone tried to login, but the browser doesn't accept cookies.",
'nocookiesfornew' => "This message is displayed when the user tried to create a new account, but it failed the cross-site request forgery (CSRF) check. It could be blocking an attack, but most likely, the browser isn't accepting cookies.",
'nocookiesforlogin' => "{{optional}}
-This message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies). Defaults to nocookieslogin",
+This message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies).
+
+Defaults to '''nocookieslogin''' ({{int:nocookieslogin}})",
'loginsuccesstitle' => 'The title of the page saying that you are logged in. The content of the page is the message "[[MediaWiki:Loginsuccess/{{SUBPAGENAME}}]]".',
'loginsuccess' => 'The content of the page saying that you are logged in. The title of the page is "[[MediaWiki:Loginsuccesstitle/{{SUBPAGENAME}}|{{int:loginsuccesstitle}}]]". $1 is the name of the logged in user.
'sitejspreview' => 'Text displayed on preview of .js pages in MediaWiki namespace',
'updated' => '{{Identical|Updated}}',
'previewnote' => 'Note displayed when clicking on Show preview',
+'continue-editing' => 'A link to the beginning of the editing textarea on the same page. Displayed after {{msg-mw|previewnote}}.',
'editing' => "Shown as page title when editing a page. \$1 is the name of the page that is being edited. Example: \"''Editing Main Page''\".",
'creating' => "Shown as page title when creating a page. Parameters:
* \$1 is the name of the page that is being created. Example: \"''Creating Main Page''\".",
'language-converter-depth-warning' => 'Error message shown when a page uses too deeply nested language conversion syntax
* <tt>$1</tt> is the value of the depth limit',
+'node-count-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.',
+'node-count-exceeded-warning' => 'Error message shown when a page exceeded the node-count limit of the preprocessor
+
+* <tt>$1</tt> is the value of the node-count limit
+* <tt>$2</tt> is the value of the max node-count limit',
+'expansion-depth-exceeded-category' => 'This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the expansion depth of the preprocessor exceeds the limit.',
+'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the expansion depth limit of the preprocessor
+
+* <tt>$1</tt> is the value of the depth limit
+* <tt>$2</tt> is the value of the max depth limit',
# "Undo" feature
'undo-success' => 'Text on special page to confirm edit revert. You arrive on this page by clicking on the "undo" link on a revision history special page.
'customjsprotected' => "Manam saqillasunkichu kay JavaScript p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
'ns-specialprotected' => "{{ns:special}} suti k'itipi p'anqakunaqa manam llamk'apunallachu.",
'titleprotected' => "Kay p'anqa sutitaqa [[User:$1|$1]] sutiyuq ruraq kamariymanta hark'arqanmi, kayraykum nispa: ''$2''.",
+'filereadonlyerror' => 'Manam atinichu "$1" sutiyuq willañiqita hukchayta, "$2" sutiyuq willañiqi churamuna ñawirillanapaq kachkaptinmi.
+
+Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
# Virus scanner
'virus-badscanner' => "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
'emailconfirmlink' => 'E-chaski imamaytaykita takyachiy',
'invalidemailaddress' => "E-chaski imamaytaykiqa manam allinchu, manachá allinta qillqasqa. Ama hina kaspa, musuq allin sananchayuq imamaytaykita qillqamuy icha k'itichata ch'usaqchay.",
'cannotchangeemail' => 'Ruraqpa rakiqunanpi e-chaski imamaytakunaqa kay wikipi manam hukchanallachu.',
+'emaildisabled' => 'Kay tiyayqa e-chaskita manam kachayta atinchu.',
'accountcreated' => 'Rakiqunaqa kichasqañam',
'accountcreatedtext' => '$1 sutiyuq ruraqpa rakiqunanqa kichasqañam.',
'createaccount-title' => '{{SITENAME}}paq musuq rakiqunata kichariy',
'userinvalidcssjstitle' => "'''Paqtataq:''' Manam kanchu \"\$1\" qara. Yuyariy, kikinpa .css, .js p'anqankunaqa uchuy sanampa umalliyuqmi, ahinataq {{ns:user}}:Foo/vector.css manataq {{ns:user}}:Foo/Vector.css nisqachu.",
'updated' => '(Musuqchasqa)',
'note' => "'''Musyay:'''",
-'previewnote' => "'''Yuyaykuy: Kayqa manaraq waqaychaspa qhawariymi!'''",
+'previewnote' => "'''Yuyaykuy: Kayqa qhawariyllam.'''
+Llamk'apusqaykiqa manaraqmi waqaychasqachu!",
+'continue-editing' => "Llamk'apuyta qatiykuy",
'previewconflict' => "Rikuchkanki kay p'anqataqa, ima hinachus waqaychasqa kanqa.",
'session_fail_preview' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi. Ama hina kaspa, musuqmanta ruraykachay. Mana atispaykiqa, [[Special:UserLogout|lluqsispa]] musuqmanta yaykuy.'''",
'session_fail_preview_html' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi.'''
Kayqa maykunapi tukukun, mana allin wakichisqa proxy sirwiytam llamk'achiptiyki.'''",
'edit_form_incomplete' => "'''Llamk'apuna hunt'ana p'anqamanta huk willasqakunaqa sirwiqman manam chayarqanchu; llamk'apusqaykikuna allinlla kachkaymanta iskaylla llanchispa musuqmanta ruraykachay.'''",
'editing' => "Llamk'apuspa: $1",
+'creating' => 'Kamarispa: $1',
'editingsection' => "Llamk'apuspa: $1 (raki)",
'editingcomment' => "Llamk'apuspa: $1 (musuq raki)",
'editconflict' => 'Ruray taripanakuy: $1',
'edit-no-change' => "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
Kachkañam.",
+'defaultmessagetext' => 'Ñawpaq qillqa',
# Parser/template warnings
'expensive-parserfunction-warning' => "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq t'ikrana rurana qayayniyuqmi.
'parser-template-loop-warning' => 'Muyurikuq pusapunam tarisqa: [[$1]]',
'parser-template-recursion-depth-warning' => 'Pusapunap muyurikuy saywanmi yallisqa ($1)',
'language-converter-depth-warning' => "Rimay t'ikranap ukhu kayninpa saywanqa yallisqam ($1)",
+'node-count-exceeded-category' => "Watasqakunata nisyu yupayniyuq p'anqakuna",
+'node-count-exceeded-warning' => "P'anqaqa watasqakunata nisyu yupayniyuqmi",
+'expansion-depth-exceeded-category' => "Nisyu mast'ariy ukhu kaqniyuq p'anqakuna",
+'expansion-depth-exceeded-warning' => "P'anqaqa nisyu mast'ariy ukhu kaqniyuqmi",
# "Undo" feature
'undo-success' => 'Rurasqata kutichiyta atinkim. Manaraq kutichispaykiqa, kay qatiq wakichayta qhawariy rikunaykipaq chiqapta munasqaykichu manallachu, chaymantataq waqaychay kutichinapaq.',
# Suppression log
'suppressionlog' => "Ñit'ipay hallch'asqa",
-'suppressionlogtext' => "Kay qatiq sutisuyupiqa ñaqha qullusqakunatam hark'asqakunatapas rikunki, kamachiqkunamanta pakasqa samiqniyuq. [[Special:BlockList|IP hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
+'suppressionlogtext' => "Kay qatiq sutisuyupiqa ñaqha qullusqakunatam hark'asqakunatapas rikunki, kamachiqkunamanta pakasqa samiqniyuq. [[Special:BlockList|Hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
# History merging
'mergehistory' => "P'anqa wiñay kawsaykunata huñuy",
'newsectionsummary' => 'Musuq raki: /* $1 */',
'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)',
'rc-enhanced-hide' => 'Imaymanachakunata pakay',
+'rc-old-title' => 'ñawpaqta "$1" sutiwan kamarisqa',
# Recent changes linked
'recentchangeslinked' => "Hukchasqa t'inkimuq",
'backend-fail-closetemp' => "Manam atinichu mit'alla willañiqita wichq'ayta.",
'backend-fail-read' => 'Manam atinichu $1 sutiyuq willañiqita ñawiriyta.',
'backend-fail-create' => 'Manam atinichu $1 sutiyuq willañiqita kamariyta.',
+'backend-fail-maxsize' => 'Manam atinichu $1 sutiyuq willañiqita kamariyta, {{PLURAL:$2|huk bytemanta|$2 bytemanta}} aswan hatun kaptinmi.',
'backend-fail-readonly' => '"$1" sutiyuq willañiqi hallch\'ana sirwiqqa ñawirinallapaqmi kachkan, kayrayku: "$2"',
'backend-fail-synced' => '"$1" sutiyuq willañiqiqa manam sinchichu kachkan ukhupi willañiqi hallch\'ana sirwiqkunapi',
'backend-fail-connect' => 'Manam atinichu "$1" sutiyuq willañiqi hallch\'ana sirwiqwan t\'inkinakuyta.',
'backend-fail-contenttype' => 'Manam atinichu "$1" nisqapi hallch\'ana willañiqip samiqninpa layanta yuqanchayta.',
'backend-fail-batchsize' => "Willañiqi hallch'ana sirwiqmanqa $1 willañiqi {{PLURAL:$1|ruranayuq|ruranayuq}} tawqam qusqa; saywataq $2 {{PLURAL:$1|ruranam|ruranam}}.",
+# File journal errors
+'filejournal-fail-dbconnect' => "Manam atinichu \"\$1\" sutiyuq willañiqi hallch'ana sirwiqpaq p'unchawnintin hallch'awan t'inkiyta.",
+'filejournal-fail-dbquery' => 'Manam atinichu "$1" sutiyuq willañiqi hallch\'ana sirwiqpaq p\'unchawnintin hallch\'ata musuqchayta.',
+
# Lock manager
'lockmanager-notlocked' => 'Manam atinichu "$1" nisqata paskayta; manam hark\'asqachu.',
'lockmanager-fail-closelock' => 'Manam atinichu "$1" nisqapaq hark\'ana willañiqita wichq\'ayta.',
Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikunaykipaq.",
'sharedupload-desc-here' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
[$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchaytaqa kay qatiqpim rikunki.",
+'sharedupload-desc-edit' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
+[$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchayta llamk'apuytachá munaykiman.",
+'sharedupload-desc-create' => "Kay p'anqaqa $1 nisqamantam. Huk ruraykamaykunapipas llamk'achinapaq kanman.
+[$2 Willañiqi ch'uyanchana p'anqanpi] ch'uyanchayta llamk'apuytachá munaykiman.",
'filepage-nofile' => 'Manam kanchu kay sutiyuq willañiqi.',
'filepage-nofile-link' => 'Manam kanchu kay sutiyuq willañiqi, ichataq [$1 churkuytam] atinki.',
'uploadnewversion-linktext' => 'Kay willañiqi ñaqha musuqchasqata churkuy',
'allpagesprefix' => "Rikuchiy kay k'askaqwan qallariq p'anqakunata:",
'allpagesbadtitle' => "Qusqa p'anqap sutinqa manam allinchu icha rimaypura, interwiki ñawpa k'askaqniyuq. P'anqa sutipaq mana saqillasqa sananchayuqchá.",
'allpages-bad-ns' => '{{SITENAME}} tiyaypiqa "$1" suti k\'iti manam kanchu.',
+'allpages-hide-redirects' => 'Pusapunakunata pakay',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Kay p'anqapaq hallch'asqa musuqchasqatam rikuchkanki, $1 pachakamam ñaqha kanman.",
+'cachedspecial-viewing-cached-ts' => "Kay p'anqapaq hallch'asqa musuqchasqatam rikuchkanki, manachá kunallan musuqchasqachu kanman.",
+'cachedspecial-refresh-now' => 'Qhipaq kaqta qhaway.',
# Special:Categories
'categories' => 'Katiguriyakuna',
'ipb-confirm' => "Hark'ayta takyachiy",
'badipaddress' => 'IP huchhaqa manam allinchu.',
'blockipsuccesssub' => "Ruraqqa hark'asqañam",
-'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] huchhayuq tiyayqa hark'asqañam. <br />[[Special:BlockList|Hark'asqakunamanta p'anqata]] qhaway hark'akunata hukchanaykipaq.",
+'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] nisqaqa hark'asqam. <br />[[Special:BlockList|Hark'ay sutisuyuta]] qhaway hark'akunata hukchanaykipaq.",
'ipb-blockingself' => "Kikiykitam hark'aykachachkanki! Chiqapta kayta rurayta munankichu?",
'ipb-confirmhideuser' => 'Ruraqta hark\'aykachachkanki, payman "Ruraqta pakay" nisqam. Chaywanqa manam pipas chay ruraqpa sutinta ima sutisuyupipas hallch\'apipas rikunqachu. Chiqapta kayta rurayta munankichu?',
'ipb-edit-dropdown' => "Hark'aypa hamunta llamk'apuy",
'blocklog-showsuppresslog' => "Kay ruraqqa ñawpaqta hark'asqam pakasqapas. Ñit'ipay hallch'ataqa kaypim rikunki willasunaykipaq:",
'blocklogentry' => "hark'an [[$1]]-ta kay pachakama: $2 $3",
'reblock-logentry' => "hukchan [[$1]]-paq hark'ana allinchanakunata kay pachakama hark'aspa: $2 $3",
-'blocklogtext' => "Kayqa ruraqta hark'asqakunap qispichisqakunappas hallch'anmi. Kikinmanta hark'asqa tiyaykunataqa manam kaypi rikunkichu. [[Special:BlockList|Hark'asqakunamanta p'anqata]] qhaway kunan hark'asqakunata rikunaykipaq.",
+'blocklogtext' => "Kayqa ruraqta hark'asqakunap qispichisqakunappas hallch'anmi. Kikinmanta hark'asqa tiyaykunataqa manam kaypi rikunkichu. [[Special:BlockList|Hark'ay sutisuyuta]] qhaway kunan hark'asqakunata rikunaykipaq.",
'unblocklogentry' => 'paskan "$1"-ta hark\'asqa kaymanta',
'block-log-flags-anononly' => 'sutinnaqlla',
'block-log-flags-nocreate' => 'rakiquna kichariyman ama nisqa',
# JavaScriptTest
'javascripttest' => 'JavaScript llanchiy',
-'javascripttest-disabled' => 'Kay ruranamanqa ama nisqam.',
+'javascripttest-disabled' => 'Kay ruranaqa kay wikipi manam atichisqachu.',
'javascripttest-title' => '$1 llanchiykunam richkan',
'javascripttest-pagetext-noframework' => "Kay p'anqaqa JavaScript llanchina purichinallapaqmi kachun.",
'javascripttest-pagetext-unknownframework' => 'Mana riqsisqa "$1" nisqa llanchina inchu ruray',
'version-software' => "Tiyachisqa llamp'u kaq",
'version-software-product' => 'Ruruchisqa',
'version-software-version' => 'Musuqchasqa',
+'version-entrypoints' => "Yaykuna t'uksi URL",
+'version-entrypoints-header-entrypoint' => "Yaykuna t'uksi",
+'version-entrypoints-header-url' => 'URL tiyay',
# Special:FilePath
'filepath' => 'Willañiqi ñan',
'api-error-uploaddisabled' => 'Kay wikipiqa manam churkuyta atinkichu.',
'api-error-verification-error' => "Kay willañiqiqa waqllisqachá, icha pantasqa k'askaqniyuqchá.",
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sikundu|sikundukuna}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutu|minutukuna}}',
+'duration-hours' => '$1 {{PLURAL:$1|ura|urakuna}}',
+'duration-days' => "{{PLURAL:$1|p'unchaw|p'unchawkuna}}",
+'duration-weeks' => '{{PLURAL:$1|simana|simanakuna}}',
+'duration-years' => '{{PLURAL:$1|wata|watakuna}}',
+'duration-decades' => '{{PLURAL:$1|chunkawata|chunkawatakuna}}',
+'duration-centuries' => '{{PLURAL:$1|pachakwata|pachakwatakuna}}',
+'duration-millennia' => '{{PLURAL:$1|waranqawata|waranqawatakuna}}',
+
);
'updated' => '(Actualizat)',
'note' => "'''Notă:'''",
'previewnote' => "'''Țineți cont că aceasta este doar o previzualizare.'''
-Modificările dumneavoastră nu au fost încă salvate! [[#editform|→ Continuă editarea]]",
+Modificările dumneavoastră nu au fost încă salvate!",
+'continue-editing' => 'Continuare editare',
'previewconflict' => 'Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.',
'session_fail_preview' => "'''Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.
Vă rugăm să încercați din nou.
Acest fapt se poate întâmpla atunci când folosești un serviciu proxy anonim.'''",
'edit_form_incomplete' => "'''Unele părți ale formularului de modificare nu au ajuns la server; verificați dacă modificările dumneavoastră sunt intacte și reîncercați.'''",
'editing' => 'modificare $1',
-'creating' => 'Se creează $1',
+'creating' => 'Crearea paginii $1',
'editingsection' => 'modificare $1 (secțiune)',
'editingcomment' => 'Modificare $1 (secțiune nouă)',
'editconflict' => 'Conflict de modificare: $1',
'parser-template-loop-warning' => 'Buclă de formate detectată: [[$1]]',
'parser-template-recursion-depth-warning' => 'Limită de adâncime a recursiei depășită ($1)',
'language-converter-depth-warning' => 'Limita adâncimii convertorului de limbă a fost depășită ($1)',
+'node-count-exceeded-category' => 'Pagini unde numărul de noduri este depășit',
+'node-count-exceeded-warning' => 'Pagina a depășit numărul de noduri',
# "Undo" feature
'undo-success' => 'Modificarea poate fi anulată. Verificați diferența de dedesupt și apoi salvați pentru a termina anularea modificării.',
'updated' => '(Cangiete)',
'note' => "'''Vide Bbuene:'''",
'previewnote' => "'''Arrecuerdete queste è sole 'n'andeprime.'''
-le cangiaminde non g'onne state angore reggistrate! [[#editform|→ Condinue cu 'u cangiamende]]",
+le cangiaminde non g'onne state angore reggistrate!",
+'continue-editing' => "Condinue 'u cangiamende",
'previewconflict' => "Sta andeprime fece vedè 'u teste ca ste jndr'à 'u teste de l'area de sus cumme avène fore ce tu decide cu reggistre.",
'session_fail_preview' => "'''Ne dispiace! Non ge putime processà 'u cangiamende tue purcè s'a perse 'a sessione de le date.
Pe piacere pruève 'n'otra vote.
'backend-fail-closetemp' => 'Non ge pozze achiudere file temboranèe.',
'backend-fail-read' => "Non ge pozze leggere 'u file $1.",
'backend-fail-create' => "Non ge pozze ccrejà 'u file $1.",
+'backend-fail-readonly' => 'L\'archivije de rete "$1" jè pe stu mumende in sole letture. \'U mutive ha state: "$2"',
'backend-fail-connect' => 'Non ge pozze connettere \'a memorie de rrete "$1".',
# Lock manager
'javascripttest-disabled' => "Sta funzione non g'à state abbilitate sus a sta Uicchi.",
'javascripttest-title' => 'Stoche a esegue $1 test',
'javascripttest-pagetext-noframework' => 'Sta pàgene jè riservate pe le esecuziune de le test de Javascript.',
+'javascripttest-pagetext-unknownframework' => 'Ambiende de teste scanusciute "$1".',
'javascripttest-pagetext-frameworks' => 'Pe piacere scacchie une de le seguende ambiende de test: $1',
# Tooltip help for the actions
# API errors
'api-error-badaccess-groups' => 'Tu non ge puè carecà file sus a sta Uicchi.',
'api-error-badtoken' => 'Errore inderne: Gettone errate.',
+'api-error-copyuploaddisabled' => "'U carecamende da URL jè disabbilitate sus a stu server.",
'api-error-duplicate-popup-title' => 'Dupleche {{PLURAL:$1|file|file}}',
'api-error-empty-file' => "'U file ca tu è confermate ere vacande.",
'api-error-emptypage' => 'Quanne se ne ccreje une, le pàggene vacande non ge sò permesse.',
'api-error-filename-tooshort' => "'U nome d'u file jè troppe curte.",
'api-error-filetype-banned' => 'Stu tipe de file jè vietate.',
'api-error-filetype-missing' => "'U file jè senze 'n'estenzione.",
+'api-error-hookaborted' => "'U cangiamende ca tu stè pruève a ffà ha state inderrotte da 'n'estenzione.",
'api-error-http' => "Errore inderne: Non ge se riesce a collegà a 'u server",
'api-error-illegal-filename' => "'U nome d'u file non g'è permesse.",
'api-error-invalid-file-key' => "Errore inderne: 'U file non ge se iacchie jndr'à memorie temboranèe.",
'duration-seconds' => '{{PLURAL:$1|seconde|seconde}}',
'duration-minutes' => '{{PLURAL:$1|minute|minute}}',
'duration-hours' => '{{PLURAL: $1|ore|ore}}',
+'duration-days' => '$1 {{PLURAL:$1|sciurne|sciurne}}',
'duration-weeks' => '{{PLURAL: $1|sumàne|sumàne}}',
'duration-years' => '{{PLURAL: $1|anne|anne}}',
'duration-decades' => '$1 {{PLURAL:$1|decade|decade}}',
'cancel' => 'Отменить',
'moredotdotdot' => 'Далее…',
'mypage' => 'Личная страница',
-'mytalk' => 'моя страница обсуждения',
+'mytalk' => 'Ð\9cоя страница обсуждения',
'anontalk' => 'Обсуждение для этого IP-адреса',
'navigation' => 'Навигация',
'and' => ' и',
'loginprompt' => 'Вы должны разрешить «cookies», чтобы представиться системе.',
'userlogin' => 'Представиться или зарегистрироваться',
'userloginnocreate' => 'Представиться',
-'logout' => 'завершение сеанса',
+'logout' => 'Ð\97авершение сеанса',
'userlogout' => 'Завершение сеанса',
'notloggedin' => 'Вы не представились системе',
'nologin' => "Нет учётной записи? '''$1'''.",
'updated' => '(Обновлена)',
'note' => "'''Примечание:'''",
'previewnote' => "'''Помните, что это только предварительный просмотр.'''
-Ваши изменения ещё не были сохранены! [[#editform|→ продолжить редактирование]]",
+Ваши изменения ещё не были сохранены!",
+'continue-editing' => 'Продолжить редактирование',
'previewconflict' => 'Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.',
'session_fail_preview' => "'''К сожалению, сервер не смог обработать вашу правку из-за потери идентификатора сессии.
Пожалуйста, попробуйте ещё раз.
'qbsettings-directionality' => 'Закреплённая, в зависимости от направления письменности вашего языка',
# Preferences page
-'preferences' => 'настройки',
+'preferences' => 'Ð\9dастройки',
'mypreferences' => 'Настройки',
'prefs-edits' => 'Количество правок:',
'prefsnologin' => 'Вы не представились системе',
'usermessage-editor' => 'Системная доставка',
# Watchlist
-'watchlist' => 'список наблюдения',
+'watchlist' => 'Список наблюдения',
'mywatchlist' => 'Список наблюдения',
'watchlistfor2' => 'Для $1 $2',
'nowatchlist' => 'Ваш список наблюдения пуст.',
# Contributions
'contributions' => 'Вклад участника',
'contributions-title' => 'Вклад {{GENDER:$1|участника|участницы}} $1',
-'mycontris' => 'мой вклад',
+'mycontris' => 'Ð\9cой вклад',
'contribsub2' => 'Вклад $1 ($2)',
'nocontribs' => 'Изменений, соответствующих заданным условиям, найдено не было.',
'uctop' => ' (последняя)',
* @author Mahitgar
* @author Naveen Sankar
* @author Omnipaedista
+ * @author Shantanoo
* @author Shijualex
* @author Shubha
* @author Vibhijain
'notitlematches' => 'न कस्यापि पृष्ठस्य शीर्षकम् अस्य समम्।',
'notextmatches' => 'न कस्यापि पृष्ठस्य पाठः अस्य सममस्ति',
'prevn' => 'प्राक्तनानि {{PLURAL:$1|$1}}',
-'nextn' => 'अग्रिमाणि{{PLURAL:$1|$1}}',
+'nextn' => 'अग्रिमाणि {{PLURAL:$1|$1}}',
'prevn-title' => 'प्राक्तन-{{PLURAL:$1|फलितम्| फलितानि}}',
'nextn-title' => 'प्राक्तन-{{PLURAL:$1|फलितम्| फलितानि}}',
'shown-title' => 'प्रत्येकस्मिन् पृष्ठे $1 {{PLURAL:$1|फलितम्|फलितानि}} दर्श्यताम्',
'''Siddu chistu è nu tintativu liggìttimu di canciamentu, arriprova. Siddu lu prubbrema pirsisti, si pò pruvari a [[Special:UserLogout|sculligàrisi]] e effittuari n'accessu novu.'''",
'token_suffix_mismatch' => "'''Lu canciamentu nun fu sarvatu pirchì lu client ammustrau di gèstiri 'n modu sbagghiatu li caràttiri di puntiggiatura nta lu token assuciatu a iddu. P'evitari na curruzzioni pussìbbili dô testu dâ pàggina, fu rifiutatu tuttu lu canciamentu. Sta situazzioni pò virificàrisi, certi voti, quannu s'adòpiranu arcuni sirvizza di proxy anònimi via web chi prisèntanu bug.'''",
'editing' => 'Canciu di la vuci "$1"',
+'creating' => 'Stai criannu $1',
'editingsection' => 'Canciamentu di $1 (sezzioni)',
'editingcomment' => 'Canciu di $1 (nova sizzioni)',
'editconflict' => "Cunflittu d'edizzioni supra $1",
''Kadaogi šėtom pruojekte grīnasės HTML īr ijongts, parveiza īr pasliepta kāp atsargoma prėimonė priš JavaScript atakas.''
'''Jei tā teisiets keitėma bandīms, prašuom pamiegint viel. Jei šėtā napaded, pamieginkėt atsėjongtė ėr prėsėjongtė atgal.'''",
'editing' => 'Taisuoms straipsnis - $1',
+'creating' => 'Dėrbama $1',
'editingsection' => 'Taisuoms $1 (skėrsnelis)',
'editingcomment' => 'Taisuoms $1 (naus skīrius)',
'editconflict' => 'Ėšpreskėt kuonflėkta: $1',
'ns-specialprotected' => 'Posebne stranice se ne mogu uređivati.',
'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
Kao razlog je naveden "\'\'$2\'\'".',
+'filereadonlyerror' => 'Ne mogu da izmenim datoteku „$1“ jer je riznica „$2“ u režimu za čitanje.
+
+Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.',
# Virus scanner
'virus-badscanner' => "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
'invalidemailaddress' => 'Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.
Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
'cannotchangeemail' => 'Na ovom wikiju ne možete promeniti e-mail adresu računa.',
+'emaildisabled' => 'Ova web-stranica ne može da šalje e-poruke.',
'accountcreated' => 'Korisnički račun je napravljen',
'accountcreatedtext' => 'Korisnički račun za $1 je napravljen.',
'createaccount-title' => 'Pravljenje korisničkog računa za {{SITENAME}}',
Ne zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
'updated' => '(Osvježeno)',
'note' => "'''Napomena:'''",
-'previewnote' => "'''Upamtite da je ovo samo pretpregled.'''
-Vaše izmjene još uvijek nisu snimljene!",
+'previewnote' => "'''Ne zaboravite da je ovo samo pregled'''
+Izmjene stranice nisu još sačuvane!",
+'continue-editing' => 'Nastavak uređivanja',
'previewconflict' => 'Ovaj pretpregled reflektuje tekst u gornjem polju
kako će izgledati ako pritisnete "Snimi stranicu".',
'session_fail_preview' => "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
To se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.",
'edit_form_incomplete' => "'''Neki dijelovi uređivačkog obrasca nisu došli do servera; dvaput provjerite da su vaše izmjene nepromjenjene i pokušajte ponovno.'''",
'editing' => 'Uređujete $1',
+'creating' => 'Stvaranje $1',
'editingsection' => 'Uređujete $1 (sekciju)',
'editingcomment' => 'Uređujete $1 (nova sekcija)',
'editconflict' => 'Sukobljenje izmjene: $1',
'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
'edit-already-exists' => 'Stranica nije mogla biti kreirana.
Izgleda da već postoji.',
+'defaultmessagetext' => 'Uobičajeni tekst poruke',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.
# Suppression log
'suppressionlog' => 'Registri sakrivanja',
-'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. Vidi [[Special:IPBlockList|spisak IP blokiranja]] za pregled trenutno važećih blokada.',
+'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora.
+Vidi [[Special:BlockList|spisak blokiranja]] za pregled trenutno važećih blokada.',
# History merging
'mergehistory' => 'Spoji historije stranice',
'newsectionsummary' => '/* $1 */ nova sekcija',
'rc-enhanced-expand' => 'Pokaži detalje (neophodan JavaScript)',
'rc-enhanced-hide' => 'Sakrij detalje',
+'rc-old-title' => 'prvobitno kreirano kao "$1"',
# Recent changes linked
'recentchangeslinked' => 'Srodne izmjene',
'backend-fail-closetemp' => 'Ne mogu da zatvorim privremenu datoteku.',
'backend-fail-read' => 'Ne mogu da pročitam datoteku $1.',
'backend-fail-create' => 'Ne mogu da napravim datoteku $1.',
+'backend-fail-maxsize' => 'Ne mogu da napravim datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.',
'backend-fail-readonly' => 'Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“',
'backend-fail-synced' => 'Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova',
'backend-fail-connect' => 'Ne mogu da se povežem sa skladišnom osnovom „$1“.',
Molimo pogledajte [$2 stranicu opisa datoteke] za ostale informacije.',
'sharedupload-desc-here' => 'Ova datoteka je sa $1 i može se koristiti i na drugim projektima.
Opis sa njene [$2 stranice opisa datoteke] je prikazan ispod.',
+'sharedupload-desc-edit' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
+'sharedupload-desc-create' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
'filepage-nofile' => 'Ne postoji datoteka s ovim nazivom.',
'filepage-nofile-link' => 'Ne postoji datoteka s ovim imenom, ali je možete [$1 postaviti].',
'uploadnewversion-linktext' => 'Postavite novu verziju ove datoteke/fajla',
'allpagesbadtitle' => 'Dati naziv stranice je nepravilan ili ima međujezički ili interwiki prefiks.
Možda sadrži jedan ili više znakova koji se ne mogu koristiti u naslovima.',
'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor "$1".',
+'allpages-hide-redirects' => 'Sakrij preusmerenja',
# Special:Categories
'categories' => 'Kategorije',
'blocklogentry' => 'blokiran [[$1]] s rokom: $2 $3',
'reblock-logentry' => 'promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3',
'blocklogtext' => 'Ovo je historija akcija blokiranja i deblokiranja korisnika.
-Automatsko blokirane IP adrese nisu uspisane ovde.
-Pogledajte [[Special:BlockList|blokirane IP adrese]] za spisak trenutnih zabrana i blokiranja.',
+Automatski blokirane IP adrese nisu navedene ovdje.
+Pogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.',
'unblocklogentry' => 'deblokiran $1',
'block-log-flags-anononly' => 'samo anonimni korisnici',
'block-log-flags-nocreate' => 'pravljenje računa onemogućeno',
# JavaScriptTest
'javascripttest' => 'Javaskript test',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena.',
+'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
'javascripttest-title' => 'Izvršavanje testova za $1',
'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
'version-software' => 'Instalirani softver',
'version-software-product' => 'Proizvod',
'version-software-version' => 'Verzija',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Putanja datoteke',
'api-error-uploaddisabled' => 'Postavljanje je onemogućeno na ovoj wiki.',
'api-error-verification-error' => 'Ova datoteka je možda oštećenja ili ima pogrešan nastavak.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuta}}',
+'duration-hours' => '$1 {{PLURAL:$1|sat|sati}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dana}}',
+'duration-weeks' => '$1 {{PLURAL:$1|sedmica|sedmica}}',
+'duration-years' => '$1 {{PLURAL:$1|godina|godina}}',
+'duration-decades' => '$1 {{PLURAL:$1|decenija|decenija}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijekova}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenijum|milenijuma}}',
+
);
'mainpage' => 'මුල් පිටුව',
'mainpage-description' => 'මුල් පිටුව',
'policy-url' => 'Project:ප්රතිපත්තිය',
-'portal' => 'පà·\8aâ\80\8dරජà·\8f දà·\8aà·\80à·\8fරය',
-'portal-url' => 'Project:පà·\8aâ\80\8dරජà·\8f දà·\8aà·\80à·\8fරය',
+'portal' => 'පà·\8aâ\80\8dරජà·\8f පà·\92à·\80à·\92à·\83à·\94ම',
+'portal-url' => 'Project:පà·\8aâ\80\8dරජà·\8f පà·\92à·\80à·\92à·\83à·\94ම',
'privacy' => 'පුද්ගලිකත්ව ප්රතිපත්තිය',
'privacypage' => 'Project:පුද්ගලිකත්ව ප්රතිපත්තිය',
'editinginterface' => "'''අවවාදයයි:''' මෘදුකාංගයට අතුරුමුව පෙළ සැපයීමට භාවිතා වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.
මෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිශීලකයන්ගේ පරිශීලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.
පරිවර්තන සඳහා, මීඩියාවිකි ප්රාදේශීයකරන ව්යාපෘතිය, [//translatewiki.net/wiki/Main_Page?setlang=si translatewiki.net], භාවිතා කිරීම සලකා බැලීමට කාරුණික වන්න.",
-'sqlhidden' => '(එස්කිවුඑල් විපරම සඟවා ඇත)',
+'sqlhidden' => '(SQL query සඟවා ඇත)',
'cascadeprotected' => '"තීරු දර්ශන" විකල්පය සක්රීයනය කොට එමගින් ආරක්ෂණය කල පහත දැක්වෙන {{PLURAL:$1|පිටුව|පිටු}} අඩංගු කර ඇති බැවින්, මෙම පිටුව සංස්කරණය කිරීමෙන් වලකා ඇත:
$2',
'namespaceprotected' => "'''$1''' නාමඅවකාශයෙහි පිටු සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
ඔබගේ බ්රවුසරයෙහි පූර්වාපේක්ෂී සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.",
'welcomecreation' => '== ආයුබෝවන්, $1! ==
-à¶\94බâ\80\8dà¶\9cà·\9a à¶\9cà·\92ණà·\94ම à¶à·\90නà·\93 à¶\87à¶.
+à¶\94බâ\80\8dà¶\9cà·\9a à¶\9cà·\92ණà·\94ම à¶à¶±à¶± ලදà·\93.
ඔබගේ [[Special:Preferences|{{SITENAME}} අභිරුචි ]] වෙනස් කිරීම අමතක නොකරන්න.',
'yourname' => 'පරිශීලක නාමය:',
'yourpassword' => 'මුරපදය:',
රීති ප්රකාරව .css හා .js පිටු විසින් ඉංග්රීසි කුඩා-අකුරු ශීර්ෂ භාවිතා කෙරෙන බව සිහි තබා ගන්න, නිදසුන. {{ns:user}}:Foo/vector.css මිස {{ns:user}}:Foo/Vector.css නොවන බව.",
'updated' => '(යාවත්කාලීන)',
'note' => "'''සටහන:'''",
-'previewnote' => "'''මà·\99ය පà·\99රදà·\83à·\94නà¶\9aà·\8a පමණà·\92.'''
-à¶\94බà¶\9cà·\9a à·\80à·\99නà·\83à·\8aà¶\9aà·\92රà·\93මà·\8a à¶à·\80මà¶à·\8a à·\83à·\94රà¶\9aà·\8aà·\82à·\92à¶Â කොට නොමැත!",
+'previewnote' => "'''මà·\99ය පà·\99රදà·\83à·\94නà¶\9aà·\8a පමණà¶\9aà·\8a බà·\80 à·\83à·\92à·\84à·\92à¶à¶¶à·\8fà¶\9cනà·\8aන.'''
+à¶\94බà¶\9cà·\9a à·\80à·\99නà·\83à·\8aà¶\9aà·\92රà·\93මà·\8a à¶à·\80මà¶à·\8a à·\83à·\94රà·\90à¶\9aà·\93මට ලà¶\9aà·\8a කොට නොමැත!",
'previewconflict' => 'ඔබ විසින් සුරැකීම තෝරාගත්තොත්, ඉහළ පෙළ සංස්කරණ සරියෙහි, පෙළ දර්ශනය විය හැකි අයුර මෙම පෙර-දසුනෙන් ආවර්ජනය වේ.',
'session_fail_preview' => "'''කණගාටුයි! සැසි දත්ත හානියක් හේතුවෙන් අප විසින් ඔබගේ සංස්කරණය ක්රියායයනය කිරීමට නොහැකි වී ඇත.
කරුණාකර නැවත උත්සාහ කරන්න.
සංස්කරණය නිෂ්ප්රභා කරන ලද්දේ පිටු පෙළ දූෂණය වීම වැලැක්වීමටය.
දෝෂ-සපිරි වෙබ්-පාදක නිර්නාමික නියුතු සේවාවක් ඔබ විසින් භාවිත කිරීම නිසා මෙය සමහරවිට සිදුවිය හැක.'''",
'editing' => '$1 සංස්කරණය කරමින් පවතියි',
+'creating' => '$1 තනමින්',
'editingsection' => '$1 (ඡේදය) සංස්කරණය කරමින් පවතියි',
'editingcomment' => '$1 සංස්කරණය කරමින් පවතියි (නව ඡේදයක්)',
'editconflict' => 'සංස්කරණ ගැටුම: $1',
එය දැනටමත් පවතියි.',
# Parser/template warnings
-'expensive-parserfunction-warning' => 'අවවාදයයි: මෙම පිටුවෙහි අධිවැය ව්යාකරණ විග්රහ ශ්රිත කැඳවුම් පමණට වඩා ඇත.
+'expensive-parserfunction-warning' => 'අවවාදයයි: මෙම පිටුවෙහි අධිවැය ව්යාකරණ විග්රහ ශ්රිත කැඳවුම් (expensive parser function calls) පමණට වඩා ඇත.
එහි තිබිය යුතු වූයේ {{PLURAL:$2|එක් කැඳවුමකට |කැඳවුම් $2 ට }} අඩුවෙන් වුවද, මෙහි දැනට {{PLURAL:$1|එක් කැඳවුමක්|කැඳවුම් $1 ක්}} අඩංගුව ඇත.',
'expensive-parserfunction-category' => 'අධිවැය ව්යාකරණ විග්රහ ශ්රිත කැඳවුම් පමණට වඩා ඇති පිටු',
'revdelete-modify-no-access' => '$1 දින, $2 වේලාවෙහි, අයිතමය වෙනස්කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: මෙම අයිතමය "පරිසීමිත" ලෙසින් සලකුණු කර ඇත.
ඔබට ඒ සඳහා ප්රවේශයන් නොමැත.',
'revdelete-modify-missing' => 'අනන්යාංක $1 දරණ අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය දත්ත ගබඩාවෙන් අස්ථානගතවී ඇත!',
-'revdelete-no-change' => "'''à¶\85à·\80à·\80à·\8fදයයà·\92:''' $1 දà·\92න, $2 à·\80à·\9aලà·\8fà·\80à·\99à·\84à·\92, à¶\85යà·\92à¶à¶¸à¶º දà·\90නටමà¶à·\8a දà·\98à·\81à·\8aâ\80\8dයà¶à·\8f පරà·\92à·\83à·\8aථà·\92à¶à·\93නà·\8a à¶\89ලà·\8aලà·\8f à·\83à·\92ට ඇත.",
+'revdelete-no-change' => "'''à¶\85à·\80à·\80à·\8fදයයà·\92:''' $1 දà·\92න, $2 à·\80à·\9aලà·\8fà·\80à·\99à·\84à·\92, à¶\85යà·\92à¶à¶¸à¶º දà·\90නටමà¶à·\8a දà·\98à·\81à·\8aâ\80\8dයà¶à·\8f à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶\89ලà·\8aලà·\8f ඇත.",
'revdelete-concurrent-change' => '$1 දින, $2 වේලාවෙහි, අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය වෙනස්කිරීමට ඔබ උත්සාහ ගන්නා අතරතුරදී තවත් අයෙකු විසින් එහි ස්තිතිය වෙනස් කර ඇති බවක් පෙනෙන්නට ඇත.
කරුණාකර ලඝු-සටහන් පරික්ෂාකර බලන්න.',
'revdelete-only-restricted' => '$2 දිනැති අයිතමය සැඟවීමේ දෝෂය , $1:අනෙකුත් සැඟවීම් විකල්පයන් අතුරින් එකක් තෝරාගන්නේ නැතිව, පරිපාලකයන්ගේ දර්ශනයෙන් අයිතමයන් සැඟවීම ඔබහට සිදුකල නොහැක.',
'mergehistory-empty' => 'සංශෝධනයන් කිසිවක් ඒකාබද්ධ කල නොහැක.',
'mergehistory-success' => ' [[:$1]] හි {{PLURAL:$3|සංශෝධනයක්|සංශෝධන $3 ක්}}සාර්ථක ලෙස [[:$2]] හා සමග ඒකාබද්ධ කරන ලදි.',
'mergehistory-fail' => 'ඉතිහාස ඒකාබද්ධය සිදු කල නොහැක, පිටු හා වේලා පරාමිතීන් නැවත පිරික්සා බලන්න.',
-'mergehistory-no-source' => 'මූල පිටුව $1 කොපවතී.',
+'mergehistory-no-source' => 'මූලාශ පිටුව $1 නොපවතී.',
'mergehistory-no-destination' => 'අන්ත පිටුව $1 නොපවතී.',
'mergehistory-invalid-source' => 'මූල පිටුව නීතික ශීර්ෂයක් සහිත විය යුතුය.',
'mergehistory-invalid-destination' => 'අන්ත පිටුව නීතික ශීර්ෂයක් සහිත විය යුතුය.',
'timezoneuseserverdefault' => 'විකියෙහි සාමාන්ය විදිහ භාවිත කරන්න ($1)',
'timezoneuseoffset' => 'වෙනත් (හිලව්ව නියමාකාරයෙන් දක්වන්න)',
'timezoneoffset' => 'Offset¹:',
-'servertime' => 'සර්වරයේ වේලාව:',
+'servertime' => "ස'වරයේ වේලාව:",
'guesstimezone' => 'බ්රවුසරයෙන් පුරවන්න',
'timezoneregion-africa' => 'අප්රිකාව',
-'timezoneregion-america' => 'à¶\87මරිකාව',
+'timezoneregion-america' => 'à¶\85මà·\99රිකාව',
'timezoneregion-antarctica' => 'ඇන්ටාටිකාව',
'timezoneregion-arctic' => 'අත්ලාන්තික්',
'timezoneregion-asia' => 'ආසියාව',
'prefs-dateformat' => 'දින ආකෘතිය',
'prefs-timeoffset' => 'වේලා හිලව්ව',
'prefs-advancedediting' => 'වැඩිදුර තෝරාගැනීම් සැකසුම්',
-'prefs-advancedrc' => 'පà·\8aâ\80\8dරà¶\9cචà·\80à·\92à¶\9aලà·\8aපයනà·\8a',
-'prefs-advancedrendering' => 'පà·\8aâ\80\8dරà¶\9cචà·\80à·\92à¶\9aලà·\8aපයනà·\8a',
+'prefs-advancedrc' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
+'prefs-advancedrendering' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
'prefs-advancedsearchoptions' => 'ප්රගත විකල්පයන්',
-'prefs-advancedwatchlist' => 'පà·\8aâ\80\8dරà¶\9cචà·\80à·\92à¶\9aලà·\8aපයනà·\8a',
-'prefs-displayrc' => 'දරà·\8aà·\81න à·\80à·\92à¶\9aලà·\8aපයනà·\8a',
+'prefs-advancedwatchlist' => 'à·\80à·\90ඩà·\92දà·\94ර à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
+'prefs-displayrc' => 'දරà·\8aà·\81න à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶à·\9dරà·\8fà¶\9cà·\90නà·\93ම',
'prefs-displaysearchoptions' => 'විකල්ප පෙන්වන්න',
'prefs-displaywatchlist' => 'විකල්ප පෙන්වන්න',
'prefs-diffs' => 'වෙනස',
# User preference: e-mail validation using jQuery
'email-address-validity-valid' => 'විද්යුත්-තැපැල් ලිපිනය අනීතික බවක් පෙනෙයි.',
-'email-address-validity-invalid' => 'නà·\93à¶à·\92à¶\9a à·\80à·\92දà·\8aâ\80\8dයà·\94à¶à·\8a-à¶à·\90පà·\90ල් ලිපිනයක් ඇතුලත් කරන්න',
+'email-address-validity-invalid' => 'à·\80ලà¶\82à¶\9cà·\94 à·\80à·\92දà·\8aâ\80\8dයà·\94à¶් ලිපිනයක් ඇතුලත් කරන්න',
# User rights
'userrights' => 'පරිශීලක හිමිකම් කළමනාකරණය',
'upload-file-error' => 'අභ්යන්තර දෝෂය',
'upload-file-error-text' => 'සේවාදායකයෙහි තාවකාලික ගොනුවක් තැනීමට උත්සාහ දැරීමෙහිදී අභ්යන්තර දෝෂයක් හට ගැනිණි.
කරුණාකර [[Special:ListUsers/sysop|පරිපාලකවරයෙක්]] වෙත යොමුවන්න.',
-'upload-misc-error' => 'à¶\85ඥà·\8fචඋඩුගත කිරීම් දෝෂය',
+'upload-misc-error' => 'à·\84ඳà·\94නà·\8f නà·\9cà¶\9cà¶à·\8a උඩුගත කිරීම් දෝෂය',
'upload-misc-error-text' => 'උඩුගත කිරීමේදී හඳුනාගත නොහැකි දෝෂයක් සිදුවිය.
URLහි නීතික බව හා ප්රවේශ්ය බව තහවුරුකරගෙන නැවත උත්සාහ කරන්න.
ගැටළුව තවදුරටත් පවතී නම්, [[Special:ListUsers/sysop|පරිපාලකවරයෙකු]] අමතන්න.',
'usercreated' => '$1 දින $2 වේලාවේදී {{GENDER:$3|තනන ලදි}}',
'newpages' => 'අළුත් පිටු',
'newpages-username' => 'පරිශීලක-නාමය:',
-'ancientpages' => 'පà·\94රà·\8fණà¶ම පිටු',
+'ancientpages' => 'පà·\90රණà·\92ම පිටු',
'move' => 'ගෙනයන්න',
'movethispage' => 'මෙම පිටුව ගෙන යන්න',
'unusedimagestext' => 'පහත ගොනු පවතින නමුත් ඒවා කිසිදු පිටුවකට කාවද්දා නොමැත.
'block-log-flags-angry-autoblock' => 'ආවර්ධිත ස්වයංක්රීය වාරණය සක්රීය කරන ලදි',
'block-log-flags-hiddenname' => 'පරිශීලක-නාමය සඟවා ඇත',
'range_block_disabled' => 'පරාස වාරණයන් සිදුකිරීමට පරිපාලක වරුන්ට ඇති හැකියාව අක්රීය කරන ලදි.',
-'ipb_expiry_invalid' => 'à¶\89à¶\9aà·\94à¶à·\8aà·\80à·\93මà·\9a à¶\9aà·\8fලය à¶\85නà·\93à¶à·\92à¶\9aය.',
+'ipb_expiry_invalid' => 'à¶\9aලà·\8aà¶\89à¶\9aà·\94à¶à·\8aà·\80à·\93මà·\9a à·\80à·\9aලà·\8fà·\80 à·\80ලà¶\82à¶\9cà·\94 නà·\90à¶.',
'ipb_expiry_temp' => 'සැඟවුනු පරිශීලක-නාම වාරණයන් ස්ථීර ඒවා විය යුතුය.',
'ipb_hide_invalid' => 'මෙම ගිණුම යටපත්කිරීම කල නොහැකියි; පමණට වඩා සංස්කරණ සිදු කර ඇතිවා විය හැක.',
'ipb_already_blocked' => '"$1" දැනටමත් වාරණයට ලක් කර ඇත',
අන්ත පිටුව "[[:$1]]" දැනටමත් පවතියි.
එය මකාදමා ගෙනයාම සඳහා පෙත එළි කිරීමට ඔබ හට ඇවැසිද?',
'delete_and_move_confirm' => 'ඔව්, පිටුව මකා දමන්න',
-'delete_and_move_reason' => '"[[$1]]" ගෙනයෑම සඳහා ඉඩ ලබාගැනීම සඳහා මකාදමන ලදී',
+'delete_and_move_reason' => '"[[$1]]" ගෙනයෑමට ඉඩ ලබාගැනීම සඳහා මකාදමන ලදී',
'selfmove' => 'මූල හා අන්ත ශීර්ෂ දෙකම එකමය;
පිටුවක් එය වෙතම ගෙන යා නොහැක.',
'immobile-source-namespace' => '"$1" නාමඅවකාශයෙහි පිටු ගෙනයාම සිදුකල නොහැක',
'immobile-target-namespace' => '"$1" නාමඅවකාශය වෙත පිටු ගෙනයාම සිදුකල නොහැක',
-'immobile-target-namespace-iw' => 'à¶\85නà·\8aà¶à¶»à·\8aà·\80à·\92à¶\9aà·\93 à·\83බà·\90ඳà·\92ය, පà·\92ටà·\94 à¶\9cà·\99නයà·\91ම à·\83ඳà·\84à·\8f නà·\93à¶à·\92à¶\9a à¶\91ලà·\8aලයක් නොවේ.',
+'immobile-target-namespace-iw' => 'à¶\85නà·\8aà¶à¶»à·\8aà·\80à·\92à¶\9aà·\93 à·\83බà·\90ඳà·\92ය, පà·\92ටà·\94 à¶\9cà·\99නයà·\91ම à·\83ඳà·\84à·\8f à·\80ලà¶\82à¶\9cà·\94 à¶\89ලà¶\9aà·\8aà¶\9aයක් නොවේ.',
'immobile-source-page' => 'මෙම පිටුව ගෙනයාහැක්කක් නොවේ.',
'immobile-target-page' => 'එම අන්ත ශීර්ෂයට ගෙන යෑම කල නොහැක.',
'imagenocrossnamespace' => 'ගොනුවක්, ගොනුවක්-නොවන නාමඅවකාශයකට ගෙනයෑම කල නොහැක',
'nonfile-cannot-move-to-file' => 'ගොනුවක්-නොවන්න ගොනු නාමඅවකාශයට ගෙනයෑම කල නොහැක',
-'imagetypemismatch' => 'නව ගොනු ප්රසර්ජනය එහි වර්ගය හා නොගැලපේ',
-'imageinvalidfilename' => 'ඉලක්කගත ගොනු නාමය අනීතිකයි',
-'fix-double-redirects' => 'මà·\94ලà·\8a à·\81à·\93රà·\8aà·\82යට à¶\91ලà·\8aලà·\80න à¶\9aà·\92à·\83à·\92යමà·\8a යà·\85à·\92-යà·\9cමà·\94à·\80à·\93මà·\8a à¶\8bඩà·\94à¶\9cචකරන්න',
-'move-leave-redirect' => 'යà·\85à·\92-යà·\9cමà·\94à·\80à¶\9aà·\8a à·\84à·\90ර දමන්න',
+'imagetypemismatch' => 'නව ගොනු ප්රසර්ජනය(extension) එහි වර්ගය හා නොගැලපේ',
+'imageinvalidfilename' => 'ඉලක්ක ගොනු නාමය වලංගුනැත',
+'fix-double-redirects' => 'මà·\94ලà·\8a මà·\8fà¶à·\98à¶\9aà·\8fà·\80ට à¶\91ලà·\8aලà·\80න යà·\85à·\92-යà·\9cමà·\94 à¶\85පà·\8aඩà·\9aටà·\8a කරන්න',
+'move-leave-redirect' => 'යà·\85à·\92-යà·\9cමà·\94à·\80à¶\9aà·\8a à·\83à¶\9aà·\83à·\8f à¶\9cà·\99නයන්න',
'protectedpagemovewarning' => "'''අවවාදයයි:''' පරිපාලක වරප්රසාද සතු පරිශීලකයන්ට පමණක් ගෙන යෑ හැකි පරිදී මෙම පිටුව අවුරා ඇත.
ආසන්නතම ලඝු සටහන යොමුවන් සඳහා පහතින් සපයනු ලැබේ:",
'semiprotectedpagemovewarning' => "'''සටහන:''' ලේඛනගත පරිශීලකයන්ට පමණක් ගෙන යෑ හැකි පරිදි මෙම පිටුව අවුරා ඇත.
'filedelete-archive-read-only' => 'වෙබ්සේවාදායකය විසින් "$1"සංරක්ෂික විරෙක්ටරියට ලිවීම සිදුකල නොහැක.',
# Browsing diffs
-'previousdiff' => 'â\86\90 පà·\90රà·\90ණà·\92 à·\83à¶\82à·\83à·\8aà¶\9aරණය',
-'nextdiff' => 'නවීන සංස්කරණය →',
+'previousdiff' => 'â\86\90 පà·\90රණà·\92 à·\83à¶\82à·\83à·\8aà¶\9aරණ',
+'nextdiff' => 'නව සංස්කරණ →',
# Media information
'mediawarning' => "'''අවවාදයයි''': අනිෂ්ට කේතයන් මෙම ගොනුවෙහි අඩංගු විය හැක.
'exif-countrycreated' => 'රූපය ගන්නා ලද රට',
'exif-countrycodecreated' => 'රූපය ගන්නා ලද රටෙහි කේතය',
'exif-provinceorstatecreated' => 'රූපය ගන්නා ලද පළාත හෝ ප්රාන්තය',
-'exif-citycreated' => 'රà·\96පය à¶\9cනà·\8aනà·\8f ලද නà¶\9cරය',
+'exif-citycreated' => 'රà·\96පය à¶\9cනà·\8aනà·\8f ලද පà·\94රà·\80රය',
'exif-sublocationcreated' => 'රූපය ගන්නා ලද නගර උප-ස්ථානය',
'exif-worldregiondest' => 'ලෝක ප්රදේශය දක්වා ඇත',
'exif-countrydest' => 'පෙන්වනලද රට',
'exif-sublocationdest' => 'පුරවරයේ උප-ස්ථානය දක්වා ඇත',
'exif-objectname' => 'කෙටි මාතෘකාව',
'exif-specialinstructions' => 'විශේෂ උපදෙස්',
-'exif-headline' => 'à·\81ිරස්තලය',
+'exif-headline' => 'à·\83ිරස්තලය',
'exif-credit' => 'විශ්වාසය/ප්රතිපාදකයා',
'exif-source' => ' මූලාශ්රය',
'exif-editstatus' => 'රූපයේ සංස්කරණ තත්ත්වය',
'exif-event' => 'විස්තර දක්වන ලද සිද්ධිය',
'exif-organisationinimage' => 'විස්තර දක්වන ලද සංවිධානය',
'exif-personinimage' => 'පුද්ගලික වචනයෙන් විස්තර කරන ලද',
-'exif-originalimageheight' => 'à¶\9aà·\90පà·\94මට පෙර රූපයෙහි උස',
+'exif-originalimageheight' => 'à¶\9aපà·\8aපà·\8fදà·\94à·\80ට පෙර රූපයෙහි උස',
# EXIF attributes
'exif-compression-1' => 'අසංක්ෂිප්ත',
'exif-photometricinterpretation-2' => 'RGB',
'exif-photometricinterpretation-6' => 'YCbCr',
-'exif-unknowndate' => 'à¶\85ඥà·\8fචදිනයකි',
+'exif-unknowndate' => 'නà·\9cදනà·\8aනà·\8f දිනයකි',
'exif-orientation-1' => 'සාමාන්ය',
'exif-orientation-2' => 'තිරස වටා පෙරලා',
'exif-exposuremode-1' => 'හස්තීය නිරාවරණය',
'exif-exposuremode-2' => 'ස්වයං සමුච්චය',
-'exif-whitebalance-0' => 'à·\83à·\8aà·\80යà¶\82à¶\9aà·\8aâ\80\8dරà·\93ය à·\81à·\8aà·\80à·\9aචතුලනය',
-'exif-whitebalance-1' => 'à·\84à·\83à·\8aà¶à·\93ය à·\81à·\8aà·\80à·\9aචà¶à·\94ලනය',
+'exif-whitebalance-0' => 'à·\83à·\94දà·\94 පà·\8fට à·\83à·\8aà·\80යà¶\82à¶\9aà·\8aâ\80\8dරà·\93යà·\80 තුලනය',
+'exif-whitebalance-1' => 'à¶\94බà·\80à·\92à·\83à·\92නà·\8a à·\83à·\94දà·\94 පà·\8fට à¶à·\94ලනයà¶\9aà·\92රà·\93ම',
'exif-scenecapturetype-0' => 'සම්මත',
'exif-scenecapturetype-1' => 'භූතල තලීය',
'exif-dc-source' => 'මූලාශ්ර මාධ්ය',
'exif-dc-type' => 'මාධ්ය වර්ගය',
-'exif-rating-rejected' => 'ප්රතික්ෂිප්ත',
+'exif-rating-rejected' => 'ප්රතික්ෂේපිත',
'exif-isospeedratings-overflow' => '65535 ට වඩා විශාලතර',
# Friendlier slave lag warnings
'lag-warn-normal' => '{{PLURAL:$1|තත්පරයකට|තත්පර $1 කට}} වඩා නැවුම් වෙනස්වීම්, ලැයිස්තුවෙහි පෙන්නුම් නොවීමට ඉඩ ඇත.',
-'lag-warn-high' => 'දත්ත-ගබඩා සේවාදායකයෙහි අධික විලම්බය නිසා, වෙනස්වීමට පසු ගතවූයේ {{PLURAL:$1|එක් තත්පරයක්|තත්පර $1 ක්}} පමණක් නම්, ලැයිස්තුවෙහි අන්තර්ගතවී නොතිබිය හැක.',
+'lag-warn-high' => "දත්තසංචිත ස'වරයේ අධි විලම්බය නිසා, වෙනස්වීමට පසු ගතවූයේ {{PLURAL:$1|එක් තත්පරයක්|තත්පර $1 ක්}} පමණක් නම්, ලැයිස්තුවෙහි අන්තර්ගතවී නොතිබිය හැක.",
# Watchlist editor
'watchlistedit-numitems' => 'සාකච්ඡා පිටු ගණනය නොකල විට, ඔබගේ මුර-ලැයිස්තුවෙහි {{PLURAL:$1|ශීර්ෂ එකක්|ශීර්ෂ $1 ක්}} අඩංගු වේ.',
'version-hook-name' => 'හසුරු නම',
'version-hook-subscribedby' => 'දායකවී ඇත්තේ',
'version-version' => '(අනුවාදය $1)',
-'version-license' => 'බලපà¶à·\8aâ\80\8dරය',
+'version-license' => 'à·\80රපà¶',
'version-poweredby-credits' => "මෙම විකිය '''[//www.mediawiki.org/ MediaWiki]''' මගින් බලගන්වා ඇත, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'අනෙකුත්',
'version-license-info' => 'MediaWiki යනු නිදහස් මෘදුකාංගයකි; නිදහස් මෘදුකාංග පදනමේ (Free Software Foundation) හි GNU General Public License නම් බලපත්රයේ වගන්තිවලට අනුව ඔබට එය නැවත බෙදාහැරීම සහ/හෝ සංස්කරණය කළ හැක; ඒ, එම බලපත්රයේ 2වන හෝ (ඔබට කැමති නම්) ඉන්පසු එන සංස්කරණයකට අනුවය.
* <span class="mw-specialpagecached">කෑෂිත විශේෂ පිටු (යල් පැන ගිය විය හැක).</span>',
'specialpages-group-maintenance' => 'නඩත්තු වාර්තා',
'specialpages-group-other' => 'අනෙකුත් විශේෂ පිටු',
-'specialpages-group-login' => 'පà·\8aâ\80\8dරà·\80à·\92à·\82à·\8aට à·\80න්න / ගිණුමක් තනන්න',
+'specialpages-group-login' => 'පà·\92à·\80à·\92à·\83à·\99න්න / ගිණුමක් තනන්න',
'specialpages-group-changes' => 'මෑත වෙනස්වීම් හා ලඝු-සටහන්',
'specialpages-group-media' => 'මාධ්ය වාර්තා හා උඩුගත කිරීම්',
'specialpages-group-users' => 'පරිශීලකයන් හා හිමිකම්',
'specialpages-group-pagetools' => 'පිටු මෙවලම්',
'specialpages-group-wiki' => 'විකි දත්ත හා මෙවලම්',
'specialpages-group-redirects' => 'විශේෂ පිටු යළි-යොමුකිරීම',
-'specialpages-group-spam' => 'à¶\85යà·\8fචà·\92à¶-à¶à·\90පà·\91ල මෙවලම්',
+'specialpages-group-spam' => 'à·\83à·\8aපà·\91මà·\8a මෙවලම්',
# Special:BlankPage
'blankpage' => 'හිස් පිටුව',
-'intentionallyblankpage' => 'මà·\99ම පà·\92ටà·\94à·\80 à¶\85භà·\92පà·\8aâ\80\8dරà·\9aà¶à·\80 à·\84à·\92à·\83à·\8aà·\80 à¶à¶¶à¶± ලදà·\92',
+'intentionallyblankpage' => 'මà·\99ම පà·\92ටà·\94à·\80 à·\83à·\92à¶à·\8fමà¶à·\8fම à·\84à·\92à·\83à·\8aà·\80 à¶à¶¶à·\8f à¶\87à¶.',
# External image whitelist
'external_image_whitelist' => '#මෙම පේළිය මෙම අයුරින්ම තිබීමට ඉඩ හරින්න <pre>
'api-error-ok-but-empty' => 'අභ්යන්තර දෝෂය: සර්වරයෙන් ප්රතිචාරයක් නොමැත.',
'api-error-overwrite' => 'දැනටමත් තිබෙන ගොනුවක් යටපත් කෙරුමට ඉඩදෙනු නොලැබේ.',
'api-error-stashfailed' => 'අභ්යන්තර දෝෂය: තාවකාලික ගොනුව සුරක්ෂිත කිරීමට සර්වරයට නොහැකි වුනි.',
-'api-error-timeout' => 'බලාපොරොත්තු වූ කාලය තුල සර්වරය ප්රතිචාර නොදක්වන ලදී.',
+'api-error-timeout' => 'බලාපොරොත්තු වූ කාලය තුල ස"වරය ප්රතිචාර නොදක්වන ලදී.',
'api-error-unclassified' => 'හඳුනා නොගත් දෝෂයක් ඇතිවිය.',
'api-error-unknown-code' => 'නොදත් දෝෂය: "$1"',
'api-error-unknown-error' => 'අභ්යන්තර දෝෂය: ඔබ මෙම ගොනුව උඩුගත කිරීමට තැත් කිරීමේදී කුමක්දෝ වැරදුණා.',
'api-error-unknown-warning' => 'නොදත් අවවාදය: $1',
'api-error-unknownerror' => 'හඳුනාගත නොහැකි දෝෂය: "$1".',
'api-error-uploaddisabled' => 'මෙම විකියෙහි උඩුගතකිරීම අක්රිය කොට ඇත.',
-'api-error-verification-error' => 'මà·\99ම à¶\9cà·\9cනà·\94à·\80 à·\83මà·\84රà·\80à·\92ට දà·\96à·\82à·\92චà·\80à·\93 à¶\87à¶, à·\84à·\9d à¶\91යට à·\80à·\90රදà·\92 à·\80à·\92à·\83à·\8aà¶à·\92රà·\8aණයà¶\9aà·\8a à¶\87à¶.',
+'api-error-verification-error' => 'මà·\99ම à¶\9cà·\9cනà·\94à·\80 පà·\85à·\94දà·\94à·\80à·\93 à·\84à·\9d à¶\91යට à·\80à·\90රදà·\92 à·\80à·\92à·\83à·\8aà¶à·\92රà·\8aණයà¶\9aà·\8a (extension) à¶\87à¶à·\94à·\80à·\8f à·\80à·\92යà·\84à·\90à¶\9a.',
);
'updated' => '(Aktualizovaný)',
'note' => "'''Poznámka: '''",
'previewnote' => "'''Nezabudnite, toto je iba náhľad stránky, ktorú upravujete.
-Zmeny ešte nie sú uložené!''' [[#editform|→ Pokračujte v úpravách]]",
+Zmeny ešte nie sú uložené!'''",
'previewconflict' => 'Tento náhľad upravenej stránky zobrazuje text z horného poľa s textom tak, ako sa zobrazí potom, keď ju uložíte.',
'session_fail_preview' => "'''Prepáčte, nemohli sme spracovať váš príspevok kvôli strate údajov relácie.
Skúste to prosím ešte raz.
'tog-watchlisthideown' => 'Na spisku nadzorov skrij moja urejanja',
'tog-watchlisthidebots' => 'Na spisku nadzorov skrij urejanja botov',
'tog-watchlisthideminor' => 'Skrij manjša urejanja na spisku nadzorov',
-'tog-watchlisthideliu' => 'Skrij urejanja prijavljenih uporabnikov v spisku nadzorov',
-'tog-watchlisthideanons' => 'Skrij urejanja anonimnih uporabnikov v spisku nadzorov',
+'tog-watchlisthideliu' => 'Skrij urejanja prijavljenih uporabnikov na spisku nadzorov',
+'tog-watchlisthideanons' => 'Skrij urejanja anonimnih uporabnikov na spisku nadzorov',
'tog-watchlisthidepatrolled' => 'Skrij pregledana urejanja s spiska nadzorov',
'tog-ccmeonemails' => 'Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom',
'tog-diffonly' => 'Ne prikaži vsebine strani pod primerjavo',
'createaccount' => 'Ustvari račun',
'gotaccount' => 'Račun že imate? $1.',
'gotaccountlink' => 'Prijavite se',
-'userlogin-resetlink' => 'Ste pozabili svoje podatke za prijavo?',
+'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
'createaccountmail' => 'Po e-pošti',
'createaccountreason' => 'Razlog:',
'badretype' => 'Gesli, ki ste ju vnesli, se ne ujemata.',
'changeemail-oldemail' => 'Trenutni e-poštni naslov:',
'changeemail-newemail' => 'Novi e-poštni naslov:',
'changeemail-none' => '(noben)',
-'changeemail-submit' => 'Spremeni e-pošto',
+'changeemail-submit' => 'Spremeni e-naslov',
'changeemail-cancel' => 'Prekliči',
# Edit page toolbar
Vedite, da .css in .js strani po meri uporabljajo naslov z malo začetnico, npr. {{ns:user}}:Blabla/vector.css namesto {{ns:user}}:Blabla/Vector.css.",
'updated' => '(Posodobljeno)',
'note' => "'''Opomba:'''",
-'previewnote' => "'''Pomnite, da je to le predogled strani.'''
-Vaših sprememb še nismo shranili! [[#editform|→ Nadaljujte z urejanjem]]",
+'previewnote' => "'''Pomnite, da stran le predogledujete.'''
+Vaših sprememb še nismo shranili!",
+'continue-editing' => 'Nadaljujte z urejanjem',
'previewconflict' => 'V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.',
'session_fail_preview' => "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.'''
Prosimo, poskusite znova.
'parser-template-loop-warning' => 'V predlogi je bila odkrita zanka: [[$1]]',
'parser-template-recursion-depth-warning' => 'Prekoračena globina rekurzije predlog ($1)',
'language-converter-depth-warning' => 'Prekoračena globina pretvorbe jezikov ($1)',
+'node-count-exceeded-category' => 'Strani s prekoračenim številom vozlišč',
+'node-count-exceeded-warning' => 'Stran je prekoračila število vozlišč',
+'expansion-depth-exceeded-category' => 'Strani s prekoračeno globino razširitve',
+'expansion-depth-exceeded-warning' => 'Stran je prekoračila globino razširitve',
# "Undo" feature
'undo-success' => 'Urejanje ste razveljavili. Prosim, potrdite in nato shranite spodnje spremembe.',
'prefs-watchlist-token' => 'Ključ spiska nadzorov:',
'prefs-misc' => 'Druge nastavitve',
'prefs-resetpass' => 'Spremeni geslo',
-'prefs-changeemail' => 'Spremeni e-pošto',
+'prefs-changeemail' => 'Spremeni e-poštni naslov',
'prefs-setemail' => 'Nastavi e-poštni naslov',
'prefs-email' => 'Možnosti e-pošte',
'prefs-rendering' => 'Videz',
'resultsperpage' => 'Prikazanih zadetkov na stran:',
'stub-threshold' => 'Prag označevanja <a href="#" class="stub">škrbin</a> (v bajtih):',
'stub-threshold-disabled' => 'Onemogočeno',
-'recentchangesdays' => 'Število dni prikazanih v zadnjih spremembah:',
+'recentchangesdays' => 'Število dni, prikazanih v zadnjih spremembah:',
'recentchangesdays-max' => 'Največ $1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
'recentchangescount' => 'Privzeto število prikazanih urejanj:',
-'prefs-help-recentchangescount' => 'To vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.',
+'prefs-help-recentchangescount' => 'Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.',
'prefs-help-watchlist-token' => 'Izpolnjevanje tega polja s skrivnim ključem bo ustvarilo vir RSS za vaš spisek nadzorov.
Kdorkoli pozna ta ključ bo lahko bral vaš spisek nadzorov, zato izbrite varen in čim daljši ključ.
Tukaj je naključno ustvarjena vrednost, ki jo lahko uporabite: $1',
'email' => 'E-pošta',
'prefs-help-realname' => 'Pravo ime je neobvezno.
Če se ga odločite navesti, bo uporabljeno za priznavanje vašega dela.',
-'prefs-help-email' => 'E-poštni naslov ni obvezen, vendar vam omogoča, da vam v primeru pozabljenega gesla pošljemo novo.',
-'prefs-help-email-others' => 'Poleg tega vpisan e-poštni naslov omogoča drugim, da vam lahko pošiljajo elektronsko pošto brez razkritja vaše istovetnosti.',
+'prefs-help-email' => 'E-poštni naslov ni obvezen, vendar omogoča, da vam v primeru pozabljenega gesla pošljemo novo.',
+'prefs-help-email-others' => 'Omogočite lahko tudi možnost, da vam lahko ostali uporabniki pošiljajo e-pošto prek vaše uporabniške ali pogovorne strani.
+Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo razkrili.',
'prefs-help-email-required' => 'E-poštni naslov je obvezen.',
'prefs-info' => 'Osnovni podatki',
'prefs-i18n' => 'Internacionalizacija',
'prefs-signature' => 'Podpis',
'prefs-dateformat' => 'Zapis datuma',
-'prefs-timeoffset' => 'Čas za izravnavo',
+'prefs-timeoffset' => 'Časovni odmik',
'prefs-advancedediting' => 'Napredne možnosti',
'prefs-advancedrc' => 'Napredne možnosti',
'prefs-advancedrendering' => 'Napredne možnosti',
'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
'recentchanges-label-minor' => 'Manjše urejanje',
'recentchanges-label-bot' => 'To urejanje je bilo izvedeno z botom',
-'recentchanges-label-unpatrolled' => 'To urejanje še ni bilo pregledano',
+'recentchanges-label-unpatrolled' => 'Urejanje še ni bilo pregledano',
'rcnote' => "Prikazujem {{PLURAL:$1|zadnjo spremembo|zadnji '''$1''' spremembi|zadnje '''$1''' spremembe|zadnjih '''$1''' sprememb|zadnjih '''$1''' sprememb}} v {{PLURAL:$2|zadnjem|zadnjih|zadnjih|zadnjih|zadnjih}} '''$2''' {{PLURAL:$2|dnevu|dneh|dneh|dneh|dneh}}, od $5, $4.",
'rcnotefrom' => "Navedene so spremembe od '''$2''' dalje (prikazujem jih do '''$1''').",
'rclistfrom' => 'Prikaži spremembe od $1 naprej',
'diff' => 'prim',
'hist' => 'zgod',
'hide' => 'skrij',
-'show' => 'prikaži',
+'show' => 'Prikaži',
'minoreditletter' => 'm',
'newpageletter' => 'N',
'boteditletter' => 'b',
Dnevnik brisanja in prestavitev za to stran sta navedena tukaj:",
'uploadtext' => "Spodnji obrazec lahko uporabite za nalaganje datotek.
-Za ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]], ponovne naložitve so zapisane tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].
+Za ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]]; ponovna nalaganja so zabeležena tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].
-Datoteko lahko na želeno stran vključite z naslednjo skladnjo
+Datoteko lahko na želeno stran vključite na naslednje načine:
* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></tt>''' (polna velikost)
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></tt>''' (slika pomanjšana na velikost 200px, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></tt>''' (slika pomanjšana na 200 slikovnih pik širine, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' (neposredna povezava z datoteko)",
'upload-permitted' => 'Dovoljene vrste datotek: $1.',
'upload-preferred' => 'Priporočene vrste datotek: $1.',
'morelinkstoimage' => 'Preglejte [[Special:WhatLinksHere/$1|več povezav]] na to datoteko.',
'linkstoimage-redirect' => '$1 (preusmeritev datoteke) $2',
'duplicatesoffile' => '{{PLURAL:$1|Sledeča datoteka je dvojnik|Sledeči datoteki sta dvojnika|Sledeče $1 datoteke so dvojniki|Sledečih $1 datotek so dvojniki}} te datoteke ([[Special:FileDuplicateSearch/$2|več podrobnosti]]):',
-'sharedupload' => 'Datoteka je del $1 in se lahko uporabi v drugih projektih.',
-'sharedupload-desc-there' => 'Ta datoteka je iz $1 in se lahko uporablja v drugih projektih.
+'sharedupload' => 'Datoteka je del projekta $1 in se lahko uporabi v drugih projektih.',
+'sharedupload-desc-there' => 'Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.
Prosimo, oglejte si [$2 opisno stran datoteke] za dodatne informacije.',
-'sharedupload-desc-here' => 'Ta datoteka je iz $1 in se lahko uporablja v drugih projektih.
+'sharedupload-desc-here' => 'Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.
Povzetek na njeni [$2 opisni strani datoteke] je prikazan spodaj.',
'sharedupload-desc-edit' => 'Datoteka je z $1 in jo morda uporabljajo drugi projekti.
Morda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datoteke].',
'unwatchthispage' => 'Prenehaj opazovati stran',
'notanarticle' => 'Ni članek',
'notvisiblerev' => 'Redakcija je bila izbrisana',
-'watchnochange' => 'V prikazanem časovnem obdobju se ni spremenila nobena med nadzorovanimi stranmi.',
+'watchnochange' => 'V prikazanem časovnem obdobju ni nihče spremenil nadzorovanih strani.',
'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
'wlheader-enotif' => '* Obveščanje po elektronski pošti je omogočeno.',
'wlheader-showupdated' => "* Od vašega zadnjega ogleda spremenjene strani so prikazanje '''krepko'''.",
'tooltip-ca-delete' => 'Brišite stran',
'tooltip-ca-undelete' => 'Obnovite pred izbrisom napravljena urejanja strani.',
'tooltip-ca-move' => 'Preimenujte stran',
-'tooltip-ca-watch' => 'Dodajte stran na seznam nadzorov',
-'tooltip-ca-unwatch' => 'Odstranite stran s seznama nadzorov',
+'tooltip-ca-watch' => 'Dodajte stran na spisek nadzorov',
+'tooltip-ca-unwatch' => 'Odstranite stran s spiska nadzorov',
'tooltip-search' => 'Preiščite wiki',
'tooltip-search-go' => 'Pojdi na strani z natanko takim imenom, če obstaja',
'tooltip-search-fulltext' => 'Najde vneseno besedilo po straneh',
'updated' => '(waa la opdate gareeyay)',
'note' => "'''fiiro gaar ah:'''",
'previewnote' => "'''Ogaaw kan waa horfiirin oo kaliya.'''
-Bedelyadaada wali lama keydin! [[#editform|→ Wax ka sii badal]]",
+Bedelyadaada wali lama keydin!",
'session_fail_preview' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.
Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudagal.'''",
'session_fail_preview_html' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.'''
'updated' => '(E ndryshuar)',
'note' => "'''Shënim:'''",
'previewnote' => "'''Vini re! Kjo faqe është vetëm për shqyrtim.'''
-Ndryshimet tuaja nuk janë ruajtur ende! [[#editform|→ Vazhdo redaktimin]]",
+Ndryshimet tuaja nuk janë ruajtur ende!",
'previewconflict' => 'Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.',
'session_fail_preview' => "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''
Ju lutemi, provojeni përsëri.
'updated' => '(Ажурирано)',
'note' => "'''Напомена:'''",
'previewnote' => "'''Имајте у виду да је ово само преглед.'''
-Ваше измене још нису сачуване! [[#editform|→ Настави с уређивањем]]",
+Ваше измене још нису сачуване!",
+'continue-editing' => 'Настави уређивање',
'previewconflict' => 'Овај преглед осликава како ће текст у текстуалном оквиру изгледати.',
'session_fail_preview' => "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''
Покушајте поново.
'updated' => '(Ažurirano)',
'note' => "'''Napomena:'''",
'previewnote' => "'''Imajte u vidu da je ovo samo pregled.'''
-Vaše izmene još nisu sačuvane! [[#editform|→ Nastavi s uređivanjem]]",
+Vaše izmene još nisu sačuvane!",
'previewconflict' => 'Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.',
'session_fail_preview' => "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''
Pokušajte ponovo.
'tog-shownumberswatching' => 'Antaal fon do beooboachtjende Benutsere anwiese',
'tog-oldsig' => 'Foarbekiek fon ju aktuälle Signatuur:',
'tog-fancysig' => 'Unnerskrift as Wikitext behonnelje (sunner automatiske Ferlinkenge)',
-'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
-[//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
+'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide. [//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
'tog-externaldiff' => 'Extern Diff-Program as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
[//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatione hiertou.])',
'tog-showjumplinks' => '"Wikselje tou"-Links muugelk moakje',
'updated' => '(Uppdaterad)',
'note' => "'''Obs!'''",
'previewnote' => "'''Kom ihåg att detta bara är en förhandsvisning.'''
-Dina ändringar har ännu inte sparats! [[#editform|→ Fortsätt redigera]]",
+Dina ändringar har ännu inte sparats!",
+'continue-editing' => 'Fortsätt redigera',
'previewconflict' => 'Den här förhandsvisningen är resultatet av den
redigerbara texten ovanför,
så som det kommer att se ut om du väljer att spara.',
'parser-template-loop-warning' => 'Mall-loop upptäckt: [[$1]]',
'parser-template-recursion-depth-warning' => 'Gräns för mallrekursionsdjup överskriden ($1)',
'language-converter-depth-warning' => 'Gräns för språkkonverteringsdjup överskriden ($1)',
+'node-count-exceeded-category' => 'Sidor där antal nodar har överskrids',
+'node-count-exceeded-warning' => 'Sidan har överskridit antalet nodar',
+'expansion-depth-exceeded-category' => 'Sidor där expansionsdjupet överskrids',
+'expansion-depth-exceeded-warning' => 'Sidan överskrider expansionsdjupet',
# "Undo" feature
'undo-success' => 'Redigeringen kan göras ogjord.
'version-software' => 'Installerad programvara',
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
+'version-entrypoints' => 'StartpunktsURLer',
'version-entrypoints-header-entrypoint' => 'Ingångspunkt',
'version-entrypoints-header-url' => 'URL',
'updated' => '(Imesasishwa)',
'note' => "'''Taarifa:'''",
'previewnote' => "'''Hii ni hakikisho tu.'''
-Mabadiliko hayajahifadhiwa bado! [[#editform|→ Endelea kuhariri]]",
+Mabadiliko hayajahifadhiwa bado!",
'previewconflict' => 'Hakikisho hii inaonyesha maandiko yaliyopo sanduku la juu yataonekayo ukiyahifadhi.',
'session_fail_preview' => "'''Pole! Hatukuweza kuhifadhi sahihisho lako kwa sababu data za kipindi zilipotelewa.'''
Tafadhali jaribu tena.
'mytalk' => 'என் பேச்சு',
'anontalk' => 'இந்த ஐ.பி. முகவரிக்கான பேச்சு',
'navigation' => 'வழிசெலுத்தல்',
-'and' => ' மற்றும்',
+'and' => ' மற்றும்',
# Cologne Blue skin
'qbfind' => 'கண்டுபிடி',
'userinvalidcssjstitle' => "'''எச்சரிக்கை:''' \"\$1\" என்றப் பெயரில் தோல்லொறுக் கிடையாது. சி.எஸ்.எஸ் மற்றும் ஜெ.எஸ். பக்கங்கள் ஆங்கில கீழ் வரிசைப் பெயர்களைக் கொண்டிருக்க வேண்டும் என்பதைக் கவனிக்கவும். எ+கா: {{ns:user}}:Foo/vector.css என்பது சரியான வடிவம் {{ns:user}}:Foo/Vector.css என்பது பிழையான வடிவம்.",
'updated' => '(இற்றைப்படுத்தப்பட்டது)',
'note' => "'''குறிப்பு:'''",
-'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே''', உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை! [[#editform|→ Continue editing]]",
+'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே''', உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!",
'previewconflict' => 'இந்த முன்தோற்றம் உரை தொகுப்புப் பகுதியின் மேற்பகுதியிலுள்ள உரையைப் பிரதிபலிக்கின்றது. நீங்கள் இப்பொழுது சேமித்தால் மேற்படி தோற்றமே கிடைக்கும்.',
'session_fail_preview' => "'''உங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் உங்கள் தொகுப்பை செயற்படுத்த முடியவில்லை. அருள் கூர்ந்து மீண்டும் முயலவும். அதுவும் பலனளிக்காவிட்டால் விடுபதிகைச் செய்து மீண்டும் புகுபதிகைச் செய்யவும்'''",
'session_fail_preview_html' => "'''மன்னிக்கவும்! தங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் தொகுப்பைச் செயற்படுத்த முடியவில்லை.'''
'allpagesbadtitle' => 'கொடுக்கப்பட்ட தலைப்பு செல்லுபடியற்றது அல்லது பிழையான விக்கியிடை அல்லது மொழி முன்னொட்டைக் கொண்டுள்ளது. இது தலைப்புக்களில் பயன்படுத்த முடியாத எழுத்துக்களையும் கொண்டிருக்கலாம்.',
'allpages-bad-ns' => '{{SITENAME}} தளத்தில் "$1" பெயர்வெளி கிடையாது.',
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'அண்மையான பதிப்பை காண்க',
+
# Special:Categories
'categories' => 'பகுப்புகள்',
'categoriespagetext' => 'கீழே கொடுத்துள்ள பக்கங்கள் அல்லது ஊடகங்கள் இந்த {{PLURAL:$1|பகுப்பை|பகுப்புக்களை}} கொண்டுள்ளது.
'metadata-help' => 'இந்தக் கோப்பு கூடுதலான தகவல்களைக் கொண்டுளது, இவை பெரும்பாலும் இக்கோப்பை உருவாக்கப் பயன்படுத்திய எண்ணிம ஒளிப்படக்கருவி அல்லது ஒளிவருடியால் சேர்க்கப்பட்டிருக்கலாம். இக்கோப்பு ஏதாவது வகையில் மாற்றியமைக்கப்பட்டிருந்தால் இத்தகவல்கள் அவற்றைச் சரிவர தராமல் இருக்கலாம்.',
'metadata-expand' => 'மேலதிகத் தகவல்களைக் காட்டு',
'metadata-collapse' => 'மேலதிகத் தகவல்களை மறை',
-'metadata-fields' => 'இங்கே காட்டப்பட்டுள்ள எக்சிப் மேல்நிலைத் தரவுகள் படிமவிளக்கப்பக்கத்தில் காட்டப்படும். ஏனைய தரவுகள் இயல்பிருப்பாக மறைக்கப்பட்டிருக்கும்.
+'metadata-fields' => 'இங்கே காட்டப்பட்டுள்ள எக்சிப் மேல்நிலைத் தரவுகள் படிமவிளக்கப்பக்கத்தில் மேல்நிலைத் தரவுகள் அட்டவணை மறைக்கப்பட்டிருக்கும் பொழுது
+ காட்டப்படும்.
* make
* model
* datetimeoriginal
'version-variables' => 'மாறிகள்',
'version-antispam' => ' குப்பை (spam) தடுப்பு',
'version-skins' => 'தோல்கள்',
-'version-other' => 'மறà¯\8dறவà¯\88',
+'version-other' => 'பிறரà¯\8d',
'version-mediahandlers' => 'ஊடக கையாளிகள்',
'version-hooks' => 'கொக்கிகள்',
'version-extension-functions' => 'நீட்சி செயற்பாடுகள்',
'version-version' => '(பதிப்பு $1)',
'version-license' => 'அனுமதி',
'version-poweredby-credits' => "இந்த் விக்கி '''[//www.mediawiki.org/ MediaWiki]''' இதன் மூலம் வழங்கப்படுகிறது, காப்புரிமை © 2001-$1 $2.",
-'version-poweredby-others' => 'மறà¯\8dறவà¯\88à®\95ள்',
+'version-poweredby-others' => 'பிறர்',
'version-license-info' => 'மீடியாவிக்கியானது இலவச மென்பொருள்.இதை நீங்கள் மற்றவர்களுக்கு கொடுப்பது அல்லது திருத்தம் செய்வது இலவச மென்பொருள் அறக்கட்டளை வழங்கிய GNUவின் பொது உரிம விதிகளுக்குட்பட்டது;உரிமத்தின் இரண்டாவது பதிப்பு அல்லது அதற்கு மேற்பட்ட பதிப்பு (உங்கள் விருப்பத்திற்க்கேற்றவாறு).
மீடியா உபயோகப்படக்கூடியது என்ற நம்பிக்கையில் வெளியிடப்பட்டுள்ளது, ஆனால் இதற்க்கு உத்தரவாதம் கிடையாது.மேலும் வணிகத்தன்மைக்கான அல்லது ஒரு குறிப்பிட்ட செயலுக்காகவும் உத்தரவாதம் கிடையாது.மேலும் விவரங்களுக்கு GNU பொது உரிமத்தை பார்க்கவும்.
நீங்கள் இந்த மென்பொருளுடன் [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] பெற்றீருப்பிர்கள்;இல்லையெனில் , Free Software Foundation, Inc.,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA க்கு எழுதவும்.அல்லது [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
'version-software' => 'நிறுவப்பட்ட மென்பொருள்',
'version-software-product' => 'உற்பத்திப்பொருள்',
'version-software-version' => 'பதிப்பு',
+'version-entrypoints-header-url' => 'உரலி (URL)',
# Special:FilePath
'filepath' => 'கோப்பு வழி',
'updated' => '(నవీకరించబడింది)',
'note' => "'''గమనిక:'''",
'previewnote' => "'''ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.'''
-మీ మార్పులు ఇంకా భద్రమవ్వలేదు! [[#editform|→ సవరణను కొనసాగించండి]]",
+మీ మార్పులు ఇంకా భద్రమవ్వలేదు!",
'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
దయచేసి మళ్ళీ ప్రయత్నించండి.
'api-error-uploaddisabled' => 'ఈ వికీలో ఎక్కింపులని అచేతనం చేసారు.',
'api-error-verification-error' => 'ఈ ఫైల్ పాడైవుండవచ్చు, లేదా తప్పుడు పొడిగింతను కలిగివుండవచ్చు.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|క్షణం|క్షణాలు}}',
+'duration-minutes' => '$1 {{PLURAL:$1|నిమిషం|నిమిషాలు}}',
+'duration-hours' => '$1 {{PLURAL:$1|గంట|గంటలు}}',
+'duration-days' => '$1 {{PLURAL:$1|రోజు|రోజులు}}',
+'duration-weeks' => '$1 {{PLURAL: $1|వారం|వారాలు}}',
+'duration-years' => '$1 {{PLURAL:$1|సంవత్సరం|సంవత్సరాలు}}',
+'duration-decades' => '$1 {{PLURAL:$1|దశాబ్దం|దశాబ్దాలు}}',
+'duration-centuries' => '$1 {{PLURAL:$1|శతాబ్దం|శతాబ్దాలు}}',
+'duration-millennia' => '$1 {{PLURAL:$1|సహస్రాబ్దం|సహస్రాబ్దాలు}}',
+
);
'newarticle' => '(Foun)',
'noarticletext' => "Iha momentu lá'os testu iha pájina ne'e, bele [[Special:Search/{{PAGENAME}}|buka naran pájina nian]] iha pájina seluk, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], ka [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita pájina ne'e]</span>.",
'previewnote' => "'''Ne'e de'it pájina ba kontrola.'''
-Ita-nia mudansa la armazenadu seidauk! [[#editform|→ Nafatin edita]]",
+Ita-nia mudansa la armazenadu seidauk!",
'editing' => 'Edita $1',
'editingsection' => 'Edita $1 (seksaun)',
'editingcomment' => 'Edita $1 (seksaun foun)',
ในบางครั้งปัญหานี้จะเกิดขึ้นถ้าคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
'edit_form_incomplete' => "'''บางส่วนของแบบฟอร์มแก้ไขไม่ได้ติดต่อเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังคงอยู่และลองใหม่อีกครั้ง'''",
'editing' => 'กำลังแก้ไข $1',
+'creating' => 'สร้างหน้า $1',
'editingsection' => 'กำลังแก้ไข $1 (เฉพาะส่วน)',
'editingcomment' => 'กำลังแก้ไข $1 (หัวข้อใหม่)',
'editconflict' => 'แก้ไขชนกัน: $1',
[[Special:Search|ค้นหาในวิกินี้]] สำหรับหน้าอื่นที่อาจเกี่ยวข้อง',
# Revision deletion
-'rev-deleted-comment' => '(à¸\84วามà¹\80หà¹\87à¸\99ถูกลบออก)',
+'rev-deleted-comment' => '(à¸\84ำà¸à¸\98ิà¸\9aายà¸à¸¢à¹\88าà¸\87ยà¹\88à¸ถูกลบออก)',
'rev-deleted-user' => '(ชื่อผู้ใช้ถูกลบออก)',
'rev-deleted-event' => '(หน้าที่ใส่เข้ามาถูกลบออก)',
'rev-deleted-user-contribs' => '[ชื่อผู้ใช้หรือหมายเลขไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
Hususy .css we .js sahypalarynyň setir harp bilen ýazylýandygyny ýatda saklaň, ýagny {{ns:user}}:Ulanyjy/Vector.css däl-de, eýsem {{ns:user}}:Ulanyjy/vector.css.",
'updated' => '(Täzelenen)',
'note' => "'''Bellik:'''",
-'previewnote' => "'''Ýatda saklaň, bu bir ýöne deslapky syn.''' Üýtgeşmeleriňiz heniz ýazdyrylan däldir! [[#editform|→ Redaktirläberiň]]",
+'previewnote' => "'''Ýatda saklaň, bu bir ýöne deslapky syn.''' Üýtgeşmeleriňiz heniz ýazdyrylan däldir!",
'previewconflict' => 'Bu deslapky syn redaktirleme penjiresiniň üstünde ýerleşip, ol ýazdyran mahalyňyz sahypanyň nähili görünjekdigini görkezýär.',
'session_fail_preview' => "'''Bagyşlaň! Sessiýa maglumatynyň ýitirilmegi zerarly serwer özgerdişiňizi işläp bilenok.'''
Gaýtadan synanyşmagyňyzy haýyş edýäris.
'tog-watchlisthideminor' => 'Нијо кардеј гәдә дәгишон ноғо доә сијоһиәдә',
# Dates
-'sunday' => 'Ð\92Ñ\8bжоÑ\80',
+'sunday' => 'Ð\98Ñ\88амбÓ\99',
'monday' => 'Дышанбә',
'tuesday' => 'Сешанбә',
'wednesday' => 'Чошанбә',
Шымә бәзынејон [[Special:Search/{{PAGENAME}}|пәјдо кардеј конҹо ым ном һесте]] бә ҹо мәғолонәдә,
јаанки <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналон ујғунә нывыштәјон пәјдо кардеј].</span>',
'previewnote' => "'''Јодәдә огәтән ки ым һәлә сыфтәнә нишо доје.'''
-Шымә дәгишон һәлә огәтә быәнин! [[#editform|→ дәвом кардеј сәрост карде]]",
+Шымә дәгишон һәлә огәтә быәнин!",
'editing' => 'Редәктә кардеј $1',
'editingsection' => 'Редактә кардеј $1 (ғысм)',
'yourtext' => 'Шымә мәтн',
'rcnote' => "Бә жиј нишо доә быә {{PLURAL:$1|'''1''' дәгиши|'''$1''' дәгиши}}, бә охонә {{PLURAL:$2|ружәдә|'''$2''' ружәдә}}, саат $5, $4.",
'rcnotefrom' => "Бә жиј доә быән дәгишон че вахтику '''$2''' (тосә '''$1''').",
'rclistfrom' => '$1 вахтику дәгишон нишо быдә',
-'rcshowhideminor' => '$1 гәдәлиә дәгишон',
+'rcshowhideminor' => '$1 гәдәлијә дәгишон',
'rcshowhidebots' => '$1 ботон',
'rcshowhideliu' => '$1 ыштәни едаштә иштирокәкон',
'rcshowhideanons' => '$1 әнәномә иштирокәкон',
'mycontris' => 'Чымы гәнҹ',
'contribsub2' => 'Гәнҹ $1 ($2)',
'uctop' => '(охонәни)',
-'month' => 'Чы мангику (һәнијән рә):',
-'year' => 'Чы сорику (һәнијән рә):',
+'month' => 'Че мангику (һәнијән рә):',
+'year' => 'Че сорику (һәнијән рә):',
'sp-contributions-newbies' => 'Әнҹәх нујә иштирокәкон гәнҹи нишо дој',
'sp-contributions-blocklog' => 'бастә быә чијон',
'tooltip-feed-atom' => 'Транслјасијә кардеј бә Atom бо ым сәһифә',
'tooltip-t-contributions' => 'Чы иштирок кардәкәси дагиш кардә быә сәһифон сијоһи',
'tooltip-t-emailuser' => 'Бы иштироәкә номә вығәнде',
-'tooltip-t-upload' => 'Шикилон јаанки мултимедиә фајлон бо жај',
+'tooltip-t-upload' => 'Шикилон јаанки мултимедијә фајлон бо жај',
'tooltip-t-specialpages' => 'Хыдмәтә сәһифон сијоһи',
'tooltip-t-print' => 'Ым сәһифә рәвојәт бо чап кардеј',
'tooltip-t-permalink' => 'Бә ым сәһифә рәвојәти еғрорә сәбон',
'file-info-size' => '$1 × $2 пиксел, фајли памјә: $3, MIME тип: $4',
'file-nohires' => 'Ән барзә рәвојәт ни.',
'svg-long-desc' => 'SVG фајл, номинәләдә $1 × $2 пиксел, фајли памјә: $3',
-'show-big-image' => 'Тикиән јолә кејфијјәтинә шикил',
+'show-big-image' => 'Тикәјән јолә кејфијјәтинә шикил',
# Bad image list
'bad_image_list' => 'Формат бәпе быбу жыго:
'updated' => '(Güncellendi)',
'note' => "'''Not: '''",
'previewnote' => "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''
-Yaptığınız değişiklikler henüz kaydedilmedi! [[#editform|→ Düzenlemeye devam edin]]",
+Yaptığınız değişiklikler henüz kaydedilmedi!",
'previewconflict' => 'Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.',
'session_fail_preview' => 'Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik. Lütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.',
'session_fail_preview_html' => "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''
'allpagesprefix' => 'Buraya yazdığınız harflerle başlayan sayfaları listeleyin:',
'allpagesbadtitle' => 'Girilen sayfa ismi diller arası bağlantı ya da vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.',
'allpages-bad-ns' => '{{SITENAME}} sitesinde "$1" ad alanı yok.',
+'allpages-hide-redirects' => 'Yönlendirmeleri gizle',
# Special:Categories
'categories' => 'Kategoriler',
'newarticle' => '(Чаа)',
'note' => "'''Тайылбыр:'''",
'previewnote' => "'''Бо чүгле шенеп көөрү-дүр.'''
- Бижик ам-даа шыгжатынмаан! [[#editform|→ Continue editing]]",
+ Бижик ам-даа шыгжатынмаан!",
'editing' => '«$1» деп арынны өскертип турар',
'editingsection' => '«$1» деп арынның салбырын өскертип турар',
'editingcomment' => '«$1» деп арынны өскертип турар (чаа салбыр)',
'currentrev' => 'Амгы үе үндүрери',
'currentrev-asof' => 'Амгы $1 үениң бижээни',
'revisionasof' => '$1 версиязы',
+'revision-info' => '$2 киржикчиниң $1 хүнүнде киирилдези',
'previousrevision' => '←Артык эрги үндүрери',
'nextrevision' => 'Артык чаа үндүрери→',
'currentrevisionlink' => 'Амгы үе үндүрери',
'searchprofile-advanced-tooltip' => 'Айыткан аттар делгемнеринден дилээри',
'search-result-size' => '$1 ({{PLURAL:$2|$2 сөс}})',
'search-section' => '(«$1» деп салбыр)',
+'search-suggest' => 'Силер «$1» деп бодадыңар чадавас',
'search-interwiki-more' => '(артык)',
'search-mwsuggest-enabled' => 'саналдар',
'search-mwsuggest-disabled' => 'саналдар чок',
'statistics' => 'Статистика',
'statistics-pages' => 'Арыннар',
+'disambiguationspage' => 'Майык: уш-бажы билдинмес',
+
'brokenredirects-edit' => 'өскертири',
'brokenredirects-delete' => 'ырадыры',
'whatlinkshere-next' => '{{PLURAL:$1|дараазында|дараазында $1}}',
'whatlinkshere-links' => '← холбаалар',
'whatlinkshere-hideredirs' => '$1-че шиглиглер',
+'whatlinkshere-hidetrans' => '$1 даңзылааннар',
'whatlinkshere-hidelinks' => 'холбааларны $1',
'whatlinkshere-hideimages' => 'Чурумалдың холбааларын $1',
'whatlinkshere-filters' => 'Шүүрлер',
'ipblocklist-submit' => 'Дилээр',
'infiniteblock' => 'кезээ-мөңгеде',
'blocklink' => 'кызыгаарлаары',
+'unblocklink' => 'ажыдып хостаар',
'change-blocklink' => 'кызыгаарлаашкынны өскертири',
'contribslink' => 'немелделер',
'blocklogpage' => 'Кызыгаарлаашкынның журналы',
# Media information
'widthheightpage' => '$1x$2, $3 {{PLURAL:$3|арын}}',
'file-info-size' => '$1 × $2 пиксел, Файл хемчээли: $3, MIME янзызы: $4',
+'file-nohires' => 'Оон улуг хевири чок',
'svg-long-desc' => 'SVG файл, $1 x $2 пиксел, файл хемчээли: $3',
'show-big-image' => 'Улуг чурук',
'show-big-image-size' => '$1 × $2 пиксел',
'updated' => '(Оновлена)',
'note' => "'''Зауваження:'''",
'previewnote' => "'''Пам'ятайте, що це лише попередній перегляд.'''
-Ваші зміни ще не були збережені! [[#editform|→ Продовжити редагування]]",
+Ваші зміни ще не були збережені!",
'previewconflict' => 'Цей попередній перегляд відображає текст з верхнього вікна редагування так, як він буде виглядіти, якщо ви вирішите зберегти його.',
'session_fail_preview' => "'''Система не може зберегти ваші редагування, оскільки втрачені дані сеансу. Будь ласка, повторіть вашу спробу.
Якщо помилка буде повторюватись, спробуйте [[Special:UserLogout|вийти з системи]] і зайти знову.'''",
Подібні проблеми можуть виникати при використанні анонімізуючих веб-проксі, що містять помилки.'''",
'edit_form_incomplete' => "'''Частина даних із форми редагування не досягла сервера. Уважно перевірте чи не пошкоджено ваших правок і спробуйте ще раз.'''",
'editing' => 'Редагування $1',
+'creating' => 'Створення $1',
'editingsection' => 'Редагування $1 (розділ)',
'editingcomment' => 'Редагування $1 (новий розділ)',
'editconflict' => 'Конфлікт редагування: $1',
* @ingroup Language
* @file
*
+ * @author Alunardon90
* @author BrokenArrow
* @author Candalua
* @author Frigotoni
'tog-enotifminoredits' => 'Avìseme par e-mail anca par i canbiamenti picenini',
'tog-enotifrevealaddr' => 'Fà védar el me indirisso e-mail in tei messagi de aviso',
'tog-shownumberswatching' => 'Mostra el numaro de utenti che i ga ła pajina en oservasion',
-'tog-oldsig' => 'Anteprima de la firma:',
+'tog-oldsig' => 'Anteprima de ła firma:',
'tog-fancysig' => 'Interpreta i comandi wiki in te la firma (sensa colegamento automatego)',
-'tog-externaleditor' => "Dopara par default on editor de testo esterno (soło par utenti esperti, el richiede l'uso de impostasion particołari sol proprio computer)",
-'tog-externaldiff' => "Dopara par default on programa de diff esterno (soło par utenti esperti, el richiede l'uso de impostasion particołari sol proprio computer)",
+'tog-externaleditor' => "Dopara par default un editor de testo esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
+'tog-externaldiff' => "Dopara par default un programa de diff esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
'tog-showjumplinks' => 'Ativa i cołegamenti acesibiłi "va a"',
'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el richiede JavaScript; sperimentałe)',
'tog-forceeditsummary' => "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
'vector-action-move' => 'Sposta',
'vector-action-protect' => 'Protezi',
'vector-action-undelete' => 'Recupera',
-'vector-action-unprotect' => 'Sbloca',
+'vector-action-unprotect' => 'Canbia ła protesion',
'vector-simplesearch-preference' => "Intaca i sugerimenti di ricerca avansadi (solo par l'interfacia Vector)",
'vector-view-create' => 'Crea',
'vector-view-edit' => 'Canbia',
'delete' => 'Scansela',
'deletethispage' => 'Scansela sta pagina',
'undelete_short' => 'Recupera {{PLURAL:$1|na revision|$1 revision}}',
+'viewdeleted_short' => 'Vedi {{PLURAL:$1|na modifega cancełà|$1 modifeghe cancełade}}',
'protect' => 'Protezi',
'protect_change' => 'canbia',
'protectthispage' => 'Protezi sta pagina',
-'unprotect' => 'Sbloca',
-'unprotectthispage' => 'Cava ła protesion a sta pajina',
+'unprotect' => 'Canbia ła protesion',
+'unprotectthispage' => 'Canbia ła protesion de sta pajina',
'newpage' => 'Pagina nova',
'talkpage' => 'Pagina de discussion',
'talkpagelinktext' => 'Discussion',
'toc' => 'Indice',
'showtoc' => 'mostra',
'hidetoc' => 'scondi',
+'collapsible-collapse' => 'Conprimi',
+'collapsible-expand' => 'Espandi',
'thisisdeleted' => 'Varda o ripristina $1?',
'viewdeleted' => 'Varda $1?',
'restorelink' => '{{PLURAL:$1|un canbiamento scanselà|$1 canbiamenti scanselà}}',
'page-rss-feed' => 'Feed RSS par "$1"',
'page-atom-feed' => 'Feed Atom par "$1"',
'red-link-title' => '$1 (sta pagina no la ghe xe)',
+'sort-descending' => 'Ordinamento decresente',
+'sort-ascending' => 'Ordinamento cresente',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Voxe',
'badarticleerror' => 'Operasion no consentia par sta pajina.',
'cannotdelete' => 'No xè sta posibiłe scansełare el file "$1".
Podaria esare sta zà scansełà da qualcun altro.',
+'cannotdelete-title' => 'Inposibiłe ełiminare ła pajina "$1"',
'badtitle' => 'Titoło mia justo',
'badtitletext' => "El titoło de ła pajina richiesta xè vodo, erà o con carateri no amesi opure el deriva da n'erore ne i cołegamenti tra siti wiki diversi o version en łengue diverse de ło steso sito.",
-'perfcached' => 'Sti dati qua no i vien mia azornà in tenpo reale, ma solo na olta ogni tanto. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => "Sti dati qua i xe stà azornà l'ultima olta el $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+'perfcached' => 'Sti dati vien tiradi fora da na copia "cache" del database e łi podarìa no esare ajornadi. Inte ła cache xe {{PLURAL:$1|disponibiłe un rixultado|xe disponibiłi $1 rixultadi}}.',
+'perfcachedts' => "Sti dati cua xe stà ajornadi l'ultima volta el $1. Inte ła cache xe disponibiłe al masimo {{PLURAL:$4|on rexultado|$4 rexultadi}}.",
'querypage-no-updates' => "L'azornamento periodico de sta pagina el xe sospeso.
I dati che ghè qua drento no i xe azornà.",
'wrong_wfQuery_params' => 'Erore ne i parametri invià a ła funsion wfQuery()<br />
'ns-specialprotected' => 'No xè posibiłe modifegare łe pajine spesałi.',
'titleprotected' => 'Ła creasion de na pajina con sto titoło xè sta blocà da [[User:$1|$1]].
Ła modivasion xè ła seguente: "$2".',
+'filereadonlyerror' => 'No xe stà posibiłe modifegare el file "$1" parché el repository de file "$2" xe in modałità de soła letura.
+
+L\'aministradore che ło ga blocà ga fornìo sta spiegasion: "$3".',
# Virus scanner
'virus-badscanner' => 'Erore de configurasion: antivirus sconossuo: "$1"',
'createaccountmail' => 'Par e-mail',
'createaccountreason' => 'Motivassion:',
'badretype' => 'Le do password le xe difarenti.',
-'userexists' => 'Sto nome utente se lo gà zà tolto qualchedun altro.
-Tòtene uno difarente.',
+'userexists' => 'El nome utente inserido vien xa doparà da cualchedun altro.
+Prova co un nome utente difarente.',
'loginerror' => "Erore ne l'aceso",
'createaccounterror' => "No se pole crear l'utente: $1",
'nocookiesnew' => "Ła rejistrasion xè sta conpletà, ma no xè sta posibiłe asedare a {{SITENAME}} parché i cookie i xè disativai. Riprovare l'aceso con el nome utente e ła password pena creai dopo aver ativà i cookie nel proprio browser.",
'emailconfirmlink' => 'Conferma el to indirizo de e-mail',
'invalidemailaddress' => "L'indirisso email no'l pode èssar acetà parché el gà un formato mìa valido.
Inserissi un indirisso valido o svoda la casèła.",
+'cannotchangeemail' => "I indirisi de posta ełetronega de l'account no połe esare canbiadi inte sto projeto wiki.",
+'emaildisabled' => 'Sto sito no połe spedire mesaji de posta ełetronega.',
'accountcreated' => 'Acesso creà',
'accountcreatedtext' => "Xè stà creà un acesso par l'utente $1.",
'createaccount-title' => 'Creazion de un acesso a {{SITENAME}}',
'usernamehasherror' => "El nome utente no'l pode contegner caràteri hash",
'login-throttled' => 'Te ghè fato massa tentativi de autenticarte.
Spèta un tocheto prima de proàr da novo.',
+'login-abort-generic' => 'El to login no xe riusido - Anułà.',
'loginlanguagelabel' => 'Lengua: $1',
'suspicious-userlogout' => 'Ła to richiesta de disconesion xè sta negà parché e a senbra invià da on browser non funsionante o on proxy de caching.',
+# E-mail sending
+'php-mail-error-unknown' => "Erore sconosudo nte'l funsionamento deła posta ełetronega PHP",
+'user-mail-no-addy' => 'Te ghe provà spedire un mesajo de posta ełetronega sensa un indiriso.',
+
# Change password dialog
'resetpass' => 'Cànbia la password',
'resetpass_announce' => "L'acesso el xe stà efetuà con un codice tenporaneo, mandà par e-mail. Par conpletar l'acesso bisogna inpostar na password nova:",
Forse te ghè zà canbià la to password o te ghè domandà na password tenporanea nova.',
'resetpass-temp-password' => 'Password tenporanea:',
+# Special:PasswordReset
+'passwordreset' => 'Rinposta ła password',
+'passwordreset-text' => 'Conpleta sto moduło par riçevare i detaji del to account via posta ełetronega.',
+'passwordreset-legend' => 'Rinposta ła password',
+'passwordreset-disabled' => 'Ła rinpostasion deła password xe stà dixabiłità so sto projeto wiki.',
+'passwordreset-pretext' => '{{PLURAL:$1|| Inserisi una dełe porsion de dati cua soto}}',
+'passwordreset-username' => 'Nome utente:',
+'passwordreset-domain' => 'Dominio',
+'passwordreset-capture' => 'Vixuałixare el contenuto del mesajo de posta ełetronega?',
+'passwordreset-capture-help' => "Se se sełesiona sta caxeła, l'indiriso de posta ełetronega (co' ła password tenporanea) ve vegnarà mostrà anca a voialtri oltre che esare invià a 'l utente.",
+'passwordreset-email' => 'Indiriso de posta ełetronega',
+'passwordreset-emailtitle' => "Detaji de l'account so {{SITENAME}}",
+'passwordreset-emailtext-ip' => "Cualcheduni (probabilmente ti, co indiriso IP $1) ga richiesto l'invio de na nova password par l'aceso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente asocià|I utenti asociadi}} a sto indiriso de posta ełetronega łi xe:
+
+$2
+
+{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.
+Sarìa mejo acedare e deçidare na nova password sùito.
+
+Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
+
# Edit page toolbar
'bold_sample' => 'Testo in grosso',
'bold_tip' => 'Testo in grosso',
'userinvalidcssjstitle' => "'''Ocio:''' No ghe xe nissuna skin con nome \"\$1\". Nota che le pagine par i .css e .js personalizà le gà l'iniziale del titolo minuscola, par esenpio {{ns:user}}:Esenpio/vector.css e no {{ns:user}}:Esenpio/Vector.css.",
'updated' => '(Agiornà)',
'note' => "'''Nota:'''",
-'previewnote' => "'''Sta qua la xe solo n'anteprima; i canbiamenti a la pagina NO i xe gnancora stà salvà!'''",
+'previewnote' => "Sta cua ła xe soło n'anteprima; i canbiamenti a ła pajina NO i xe gnancora stà salvài!",
'previewconflict' => 'Sta anteprima la corisponde al testo ne la casèla de edizion de sora, e la fa védar come vegnarà fora la pagina se te machi "Salva la pagina" in sto momento.',
'session_fail_preview' => "No xè stà possibiłe salvar le to modifiche parché i dati de la session i xè andai persi.
Par piaser, riproa da novo.
'updated' => '(Udištadud)',
'note' => "'''Homaičend:'''",
'previewnote' => "'''Muštkat, miše nece om vaiše ezikacund.'''
-Teiden toižetused ei olgoi völ kirjutadud! [[#editform|→ jatkta redakrtiruind]]",
+Teiden toižetused ei olgoi völ kirjutadud!",
'previewconflict' => "Tekst redaktiruindan üläiknas kuvazub neche ezikacundha muga, kut se nägub lopkirjutamižen jäl'ghe.",
'editing' => '$1-lehtpolen redaktiruind',
'creating' => 'Sätas $1',
'category-article-count-limited' => '{{PLURAL:$1|Trang|$1 trang}} sau nằm trong thể loại hiện hành.',
'category-file-count' => '{{PLURAL:$2|Thể loại này có tập tin sau.|{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại này, trong tổng số $2 tập tin.}}',
'category-file-count-limited' => '{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại hiện hành.',
-'listingcontinuesabbrev' => 'tiếp',
+'listingcontinuesabbrev' => '(tiếp theo)',
'index-category' => 'Trang được ghi chỉ mục',
'noindex-category' => 'Trang không hiển thị trong bộ máy tìm kiếm',
'broken-file-category' => 'Trang nhúng tập tin không tồn tại',
'updated' => '(Cập nhật)',
'note' => "'''Ghi chú:'''",
'previewnote' => "'''Đây chỉ mới là xem thử.'''
-Các thay đổi của bạn vẫn chưa được lưu! [[#editform|→ Sửa tiếp]]",
+Các thay đổi của bạn vẫn chưa được lưu!",
+'continue-editing' => 'Sửa tiếp',
'previewconflict' => 'Phần xem thử này là kết quả của văn bản trong vùng soạn thảo phía trên và nó sẽ xuất hiện như vậy nếu bạn chọn lưu trang.',
'session_fail_preview' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.
Xin hãy thử lần nữa.
'parser-template-loop-warning' => 'Phát hiện bản mẫu lặp vòng: [[$1]]',
'parser-template-recursion-depth-warning' => 'Bản mẫu đã vượt quá giới hạn về độ sâu đệ quy ($1)',
'language-converter-depth-warning' => 'Đã vượt quá giới hạn độ sâu của bộ chuyển đổi ngôn ngữ ($1)',
+'node-count-exceeded-category' => 'Những trang có số nốt vượt quá giới hạn cho phép',
+'node-count-exceeded-warning' => 'Trang có nhiều nốt quá',
+'expansion-depth-exceeded-category' => 'Những trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép',
+'expansion-depth-exceeded-warning' => 'Trang bung bản mẫu sâu quá',
# "Undo" feature
'undo-success' => 'Các sửa đổi có thể được lùi lại. Xin hãy kiểm tra phần so sánh bên dưới để xác nhận lại những gì bạn muốn làm, sau đó lưu thay đổi ở dưới để hoàn tất việc lùi lại sửa đổi.',
'ns-specialprotected' => 'מען קען נישט רעדאגירן ספעציעלע בלעטער.',
'titleprotected' => 'דער טיטל איז געשיצט פון ווערן געשאפֿן דורך [[User:$1|$1]].
די אורזאך איז \'\'$2".',
+'filereadonlyerror' => 'נישט מעגלעך צו ענדערן די טעקע "$1" ווייל די טעקע רעפאזיטאריום "$2" איז אין נאר־ליינען מצב.
+דער סיסאפ וואס האט זי פארשפארט האט געגעבן דעם הסבר: "$3"',
# Virus scanner
'virus-badscanner' => "שלעכטע קאנפֿיגוראציע: אומבאוואוסטער ווירוס איבערקוקער: ''$1''",
'nologin' => "איר האט נישט קיין קאנטע? '''$1'''.",
'nologinlink' => 'באשאפֿט א קאנטע',
'createaccount' => 'באשאפֿט א נייע קאנטע',
-'gotaccount' => "האסט שוין א קאנטע? '''$1'''.",
-'gotaccountlink' => 'אריינלאגירן',
+'gotaccount' => "האסטו שוין א קאנטע? '''$1'''.",
+'gotaccountlink' => 'אַרײַנלאגירן',
'userlogin-resetlink' => 'פארגעסן אײַערע אַרײַנלאָגירן פרטים?',
'createaccountmail' => 'דורך ע-פאסט',
'createaccountreason' => 'אורזאַך:',
'updated' => '(דערהיינטיגט)',
'note' => "'''באמערקונג:'''",
'previewnote' => "'''געדענקט אז דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג.'''
-אייערע ענדערונגען זענען נאָך נישט געהיט! [[#editform|→ ווייטער רעדאקטירן]]",
+אייערע ענדערונגען זענען נאָך נישט געהיט!",
'previewconflict' => 'די פֿאראויסיגע ווייזונג רעפלעקטירט דעם טעקסט און דער אויבערשטע טעקסט ענדערונג אָפטיילונג וויאזוי דאס וועט אויסזען אויב וועט איר דאס אָפהיטן.',
'session_fail_preview' => "'''אנטשולדיגט! מען האט נישט געקענט פראצעסירן אייער ענדערונג צוליב א פארלוסט פון סעסיע דאטע. ביטע פרובירט נאכאמאל. אויב ס'ארבעט נאך אלס ניט, פרובירט [[Special:UserLogout|ארויסלאגירן]] און זיך צוריק אריינלאגירן.",
'session_fail_preview_html' => "''''''אַנטשולדיקט! מיר קענען נישט פּראָצעסירן אײַער ענדערונג צוליב א פֿאַרלוסט פֿון סעסיע דאַטע.''''''
# "Undo" feature
'undo-success' => 'די ענדערונג קען ווערן מבוטל. ביטע נאכקוקן די פארגלייך פון אונטן צו זיין זיכער אז דאס איז וואס איר ווילט טאן, און דערנאך היט-אפ די ענדערונגן פון אונטן צו ענדיגן דאס בטל מאכן די ענדערונג.',
-'undo-failure' => '×\93×\99 ×¢× ×\93ער×\95× ×\92 קע×\9f × ×\99ש×\98 ×\95×\95ער×\9f ×\90×\95×\9e-×\92×¢×\98×\90×\9f צ×\95×\9c×\99×\91 ק×\90× ×¤×\9c×\99ק×\98×\99× ×\92 ×\90×\99× ×\98ער×\9e×\99×\93×\99×¢×\98 ×¢× ×\93ער×\95× ×\92ן.',
+'undo-failure' => '×\93×\99 ×¢× ×\93ער×\95× ×\92 קע×\9f × ×\99ש×\98 ×\9e×\91×\95×\98×\9c ×\95×\95ער×\9f צ×\95×\9c×\99×\91 סת×\99ר×\95ת ×\9e×\99×\98 צ×\95×\95×\99×©× ×¦×\99×\99×\98×\9c×¢×\9b×¢ ×¢× ×\93ער×\95× ×\92×¢ן.',
'undo-norev' => "ס'איז נישט מעגלעך צוריקקערן די רעדאַקטירונג ווײַל זי עקסיסטירט נישט אדער איז אויסגעמעקט.",
'undo-summary' => 'זיי מבטל רי-ווערסיע $1 פון [[Special:Contributions/$2|$2]] ([[User talk:$2|רעדן]])',
'blockipsuccesstext' => 'באַניצער [[Special:Contributions/$1|$1]] <br />איז פֿאַרשפאַרט.
זעט די [[Special:BlockList|ליסטע פון בלאקירטע באַניצער]] כדי צו זען די בלאקירונגען.',
'ipb-blockingself' => 'איר האַלט בײַ בלאקירן זיך אַליין! איר ווילט דאָס טאַקע טון?',
+'ipb-confirmhideuser' => 'איר האלט ביי בלאקירן א באניצער וואס האט "באהאלטן באניצער" סטאטוס. דאס וועט פארשטעקן דעם באניצערס נאמען אין אלע ליסטעס און לאגביכער. צי זענט איר זיכער אז איר ווילט דאס טאקע טון?',
'ipb-edit-dropdown' => 'רעדאקטיר בלאקירונג סיבות',
'ipb-unblock-addr' => 'אויפֿבלאקירן $1',
'ipb-unblock' => 'אויפֿבלאקירן א באַניצער נאמען אדער IP אדרעס',
'ipb-blocklist' => 'זעט עקזיסטירנדע בלאקירונגען',
'ipb-blocklist-contribs' => 'בײַשטײַערונגען פֿון $1',
'unblockip' => 'אויפֿבלאקירן באניצער',
+'unblockiptext' => 'מיט דעם פארמולאר קענט איר צוריקשטעלן שרייבן ערלויבניש צו אן IP אדרעס אדער באניצער נאמען וואס איז געווען בלאקירט.',
'ipusubmit' => 'אוועקנעמען דעם בלאק',
'unblocked' => '[[User:$1|$1]] איז געווארן באַפֿרייט פון זײַן בלאק',
+'unblocked-range' => '$1 איז באפרייט פון בלאקירן',
'unblocked-id' => 'בלאק $1 איז געווארן אַראָפגענומען.',
'blocklist' => 'בלאקירטע באַניצער',
'ipblocklist' => 'בלאקירטע באַניצער',
דער פֿאַרשטיקונג לאג איז צוגעשטעלט אונטן:',
'blocklogentry' => 'בלאקירט "[[$1]]" אויף אַ תקופה פון $2 $3',
'reblock-logentry' => 'גענדערט די בלאקירונג דעפיניציעס פון [[$1]] מיטן צייט אפלויף פון $2 $3',
-'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצערס. איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
-זעט די איצטיגע [[Special:BlockList|ליסטע פון בלאקירטע באניצערס]].',
+'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצער.
+איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
+זעט די איצטיקע [[Special:BlockList|ליסטע פון בלאקירטע באניצער]].',
'unblocklogentry' => 'אומבלאקירט $1',
'block-log-flags-anononly' => 'בלויז אַנאנימע באַניצער',
'block-log-flags-nocreate' => 'קאָנטע שאַפֿן איז פֿאַרשפּאַרט',
'unlockbtn' => 'אויפֿשליסן די דאַטנבאַזע',
'locknoconfirm' => 'איר האט נישט אָנגעצייכנט דאָס באַשטעטיקונג קעסטל.',
'lockdbsuccesssub' => 'דאַטנבאַזע פֿאַרשפאַרט מיט הצלחה',
+'unlockdbsuccesssub' => 'דאטנבאזע שלאס אראפגענומען',
'unlockdbsuccesstext' => 'די דאַטנבאַזע איז געווארן אויפֿגעשלאסן',
'databasenotlocked' => 'די דאַטנבאַזע איז נישט פֿאַרשלאסן.',
'lockedbyandtime' => '(דורך $1 אום $2 בײַ $3)',
אין די פֿעלער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
'movearticle' => 'באוועג בלאט:',
+'moveuserpage-warning' => "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
'movenologin' => 'איר זענט נישט אַריינלאָגירט',
'movenologintext' => 'איר דארפֿט זיך אײַנשרײַבן און זײַן [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.',
'movenotallowed' => 'איר זענט נישט דערלויבט צו באוועגן בלעטער.',
'thumbnail_invalid_params' => 'אומגילטיגע קליינבילד פאראמעטערס',
'thumbnail_dest_directory' => "מ'קען נישט שאפֿן דעם ציל קארטאטעק",
'thumbnail_image-type' => 'בילד טיפ נישט געשטיצט',
+'thumbnail_gd-library' => 'אומפולשטענדיקע קאנפיגוראציע פאר דער GD-ביבליאטעק: פונקציע $1 פעלט',
'thumbnail_image-missing' => 'טעקע פֿעלט אייגנטלעך: $1',
# Special:Import
'importbadinterwiki' => 'שלעכטע אינטערוויקי לינק',
'importnotext' => 'ליידיג אדער נישט קיין טעקסט',
'importsuccess' => '!אימפארט אדורכגעפירט מיט דערפאלג!',
-'importhistoryconflict' => 'ק×\90× ×¤×\9c×\99ק×\98×\99× ×\92 ×\94×\99ס×\98×\90ר×\99×¢ רע×\95×\95×\99×\96×\99×¢ עק×\96עס×\98×\99ר×\98 (×\9e×¢×\92×\9c×\99×\9a ×\90×\96 ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ש×\95×\99×\9f פ×\95ן פריער)',
+'importhistoryconflict' => 'פ×\90ר×\90×\9f ×\90 ק×\90× ×¤×\9c×\99ק×\98 ×\9e×\99×\98 ×\93ער עק×\96×\99ס×\98×\99×¨× ×\93×¢ ×\94×\99ס×\98×\90ר×\99×¢ רע×\95×\95×\99×\96×\99×¢ (×\9e×¢×\92×\9c×\99×\9a ×\90×\96 ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ש×\95×\99ן פריער)',
'importnosources' => 'קיין מקורות פֿאַר צווישן־וויקי אימפארט, און דירעקט היסטאריע אַרויפֿלאָדן איז נישט דערמעגלעכט אַצינד.',
'importnofile' => 'קיין אימפארט טעקע איז נישט ארויפֿגעלאדן.',
'importuploaderrorsize' => 'אַרויפֿלאָדן פֿון אימפארט טעקע דורכגעפֿאלן.
'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן.
ביטע פרובירט נאכאמאל.',
'import-invalid-interwiki' => 'נישט מעגלעך צו אימפארטירן פון ספעציפֿירטער וויקי.',
+'import-error-edit' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט אים צו רעדאקטירן.',
+'import-error-create' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט צו שאפן אים.',
+'import-error-interwiki' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל זיין נאמען איז רעזערווירט פאר דרויסנדיקער פארבינדונג (אינטערוויקי).',
+'import-error-special' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל ער געהערט צו א באזונדערן נאמענטייל וואס אנטהאלט נישט קיין בלעטער.',
+'import-error-invalid' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל זיין נאמען איז אומגילטיק.',
# Import log
-'importlogpage' => 'אימפארט לאג',
+'importlogpage' => 'אימפארט לאגבוך',
'importlogpagetext' => 'אַדמיניסטראַטיווער אימפארט פון בלעטער מיט רעדאַגירן היסטאריע פֿון אַנדערע וויקיס.',
'import-logentry-upload' => 'האט אימפארטירט [[$1]] דורך טעקע אַרויפֿלאָדן',
'import-logentry-upload-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} פֿון $2',
# JavaScriptTest
-'javascripttest-disabled' => 'די פֿונקציע איז אומאַקטיווירט.',
+'javascripttest' => 'JavaScript טעסט',
+'javascripttest-disabled' => 'די פֿונקציע איז אומאַקטיווירט אין דער דאזיקער וויקי.',
'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
'siteusers' => '{{PLURAL:$2|באַניצער| באַניצערס}} {{SITENAME}} $1',
'anonusers' => '{{SITENAME}} {{PLURAL:$2| אַנאנימער באַניצער|אַנאנימע באַניצער}} $1',
'creditspage' => 'בלאט קרעדיטס',
+'nocredits' => 'נישט פאראן קיין אינפארמאציע פאר דעם בלאט.',
# Spam protection
'spamprotectiontitle' => 'ספעם באשיצונג פילטער',
'nextdiff' => 'קומענדיקע ווערסיע ←',
# Media information
+'thumbsize' => 'קליינבילד גרייס:',
'widthheightpage' => '$1 × $2, {{PLURAL:$3|איין בלאט|$3 בלעטער}}',
'file-info' => 'טעקע גרייס: $1, MIME טיפ: $2',
'file-info-size' => '$1 × $2 פיקסעל, טעקע גרייס: $3, טיפ MIME: $4',
-'file-nohires' => 'נישטא מיט א העכערע רעזאלוציע.',
+'file-info-size-pages' => '$1 × $2 פיקסעלן, טעקע גרייס: $3, MIME טיפ: $4, $5 {{PLURAL:$5|בלאט|בלעטער}}',
+'file-nohires' => 'נישטא מיט א העכערער רעזאלוציע.',
'svg-long-desc' => 'טעקע SVG, נאמינעל: $1 × $2 פיקסעלן, טעקע גרייס: $3',
'show-big-image' => 'בילד מיט דער גרעסטער רעזאלוציע',
+'show-big-image-preview' => 'גרייס פון דעם פארויסקוק: $1.',
+'show-big-image-other' => '{{PLURAL:$2|אנדער רעזאלוציע|אנדערע רעזאלוציעס}}: $1.',
'show-big-image-size' => '$1 × $2 פיקצעלן',
'file-info-gif-looped' => 'אין א פעטליע',
'file-info-gif-frames' => '$1 {{PLURAL:$1| ראַם | ראָמען}}',
'api-error-uploaddisabled' => 'ארויפֿלאָדן איז אומאַקטיווירט אויף דער וויקי',
'api-error-verification-error' => 'די טעקע איז מעגלעך פֿארדארבן, אדער האט א פֿאַלשע ענדונג.',
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'duration-minutes' => '$1 {{PLURAL:$1|מינוט|מינוט}}',
+'duration-hours' => "$1 {{PLURAL:$1|שעה|שעה'ן}}",
+'duration-days' => '$1 {{PLURAL:$1|טאג|טעג}}',
+'duration-weeks' => '$1 {{PLURAL:$1|וואך|וואכן}}',
+'duration-years' => '$1 {{PLURAL:$1|יאר|יאר}}',
+'duration-decades' => '$1 {{PLURAL:$1|צענדליקער|צענדליקערס}}',
+'duration-centuries' => '$1 {{PLURAL:$1|יארהונדערט|יארהונדערטער}}',
+
);
'updated' => '(Sísọdọ̀tun)',
'note' => "'''Àkíyèsí:'''",
'previewnote' => "'''Ẹ rántí pé àyẹ̀wò lásán nì yí.'''
-Àwọn àtúnṣe yín kò tíì jẹ́ kìkópamọ́! [[#editform|→ Ẹ tẹ̀síwájú ìṣàtúnṣe]]",
+Àwọn àtúnṣe yín kò tíì jẹ́ kìkópamọ́!",
'previewconflict' => 'Àkọ́wò yìí jẹ́ bí ìkọ̀rọ̀ inú àlà ìtúnṣe ìkọ̀rọ̀ òkè yíò ṣe hàn tí ẹ bá yàn láti ṣàmúpamọ́.',
'session_fail_preview' => "'''Àforíjìn! A kò le gbésẹ̀ àtúnṣe yín nítorí ìpòfo data ìsinsìyí.
Ẹ jọ̀wọ́ ẹ gbìyànjú lẹ́ẹ̀kan si.
# Export
'export' => 'Ìkójáde àwọn ojúewé',
+'exportall' => 'Ìkójáde gbogbo àwọn ojúewé',
'export-submit' => 'Kósíta',
'export-addcattext' => 'Àfikún àwọn ojúewé láti inú ẹ̀ka:',
'export-addcat' => 'Ìròpọ̀',
* @author Kaganer
* @author KaiesTse
* @author Mark85296341
+ * @author Simon Shek
* @author Waihorace
* @author William915
* @author Wong128hk
'createaccount' => '開戶口',
'gotaccount' => '已經有戶口? $1。',
'gotaccountlink' => '登入',
+'userlogin-resetlink' => '唔記得簽到資料?',
'createaccountmail' => '用電郵',
'createaccountreason' => '原因:',
'badretype' => '你入嘅密碼唔一致。',
'filehist-filesize' => '檔案大細',
'filehist-comment' => '註解',
'filehist-missing' => '檔案遺失',
-'imagelinks' => '檔案連結',
+'imagelinks' => '檔案用途',
'linkstoimage' => '以下嘅$1個頁面連結到呢個檔案:',
'linkstoimage-more' => '多過$1版連過去呢個檔案。
下面嘅表只係列示咗連去呢個檔案嘅最頭$1版。
* @author PhiLiP
* @author Shinjiman
* @author Shizhao
+ * @author Simon Shek
* @author Supaiku
* @author Tommyang
* @author Waihorace
'protectthispage' => '保护本页',
'unprotect' => '更改保护',
'unprotectthispage' => '更改本页面的保护',
-'newpage' => 'æ\9c\80æ\96°é¡µé\9d¢',
+'newpage' => '新页面',
'talkpage' => '讨论本页',
'talkpagelinktext' => '讨论',
'specialpage' => '特殊页面',
'userinvalidcssjstitle' => "'''警告:''' 不存在皮肤\"\$1\"。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
'updated' => '(已更新)',
'note' => "'''注意:'''",
-'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存![[#editform|→ 继续编辑]]",
+'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存!",
+'continue-editing' => '继续编辑',
'previewconflict' => '这个预览显示了上面文字编辑区中的内容。它将在你选择保存后出现。',
'session_fail_preview' => "'''抱歉!由于会话数据丢失,我们不能处理你的编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|退出]]后重新登录。",
'session_fail_preview_html' => "'''抱歉!我们不能处理你在进程数据丢失时的编辑。'''
'notextmatches' => '没有页面内容匹配',
'prevn' => '前$1个',
'nextn' => '后$1个',
-'prevn-title' => '前$1项结果',
-'nextn-title' => '后$1项结果',
+'prevn-title' => '前$1个结果',
+'nextn-title' => '后$1个结果',
'shown-title' => '每页显示$1项结果',
'viewprevnext' => '查看($1{{int:pipe-separator}}$2)($3)',
'searchmenu-legend' => '搜索选项',
'prefs-rc' => '最近更改',
'prefs-watchlist' => '监视列表',
'prefs-watchlist-days' => '监视列表中显示的天数:',
-'prefs-watchlist-days-max' => '最多$1{{PLURAL:$1|天}}',
+'prefs-watchlist-days-max' => '最多$1天',
'prefs-watchlist-edits' => '扩展监视列表中显示的最大更改数:',
'prefs-watchlist-edits-max' => '最大数量:1000',
'prefs-watchlist-token' => '监视列表权标:',
'right-editusercss' => '编辑其他用户的CSS文件',
'right-edituserjs' => '编辑其他用户的JavaScript文件',
'right-rollback' => '快速回退最后对特定页面作出的编辑的用户的所有编辑',
-'right-markbotedits' => '标示复原编辑作机械人编辑',
+'right-markbotedits' => '将回退编辑标记为机器人编辑动作',
'right-noratelimit' => '没有使用频率限制',
'right-import' => '由其它wiki中导入页面',
'right-importupload' => '由文件上传中导入页面',
'upload-too-many-redirects' => '在网址中有太多重新定向',
'upload-unknown-size' => '未知大小',
'upload-http-error' => '发生HTTP错误:$1',
-'upload-copy-upload-invalid-domain' => 'ä¸\8dè\83½ä»\8e该å\9f\9få\90\8dä¸\8bè½½æ\96\87件。',
+'upload-copy-upload-invalid-domain' => 'ä¸\8dè\83½ä»\8e该å\9f\9få\90\8dä¸\8aè½½æ\96\87件å\89¯æ\9c¬。',
# File backend
'backend-fail-stream' => '无法流传送文件$1。',
请参阅在[$2 文件描述页面]以了解其相关信息。',
'sharedupload-desc-here' => '该文件来自于$1,它可能在其它计划项目中被应用。
它在[$2 文件描述页面]那边上的描述于下面显示。',
-'sharedupload-desc-edit' => '此文件是从 $1 和可能由其他维基项目使用。 !N !也许您想在其[ $2 文件描述页面]编辑说明。',
+'sharedupload-desc-edit' => '该文件来自$1,它可能在其它计划项目中被使用。
+或许您可以在其[$2 文件描述页面]上编辑说明。',
'sharedupload-desc-create' => '此文件是从 $1 和可能由其他维基项目使用。 !N !也许您想在其[ $2 文件描述页面]编辑说明。',
'filepage-nofile' => '不存在此名称的文件。',
'filepage-nofile-link' => '不存在此名称的文件,但您可以[$1 上传它]。',
'listusers-creationsort' => '按建立日期排序',
'usereditcount' => '$1次编辑',
'usercreated' => '$1 $2{{GENDER:$3|创建}}',
-'newpages' => 'æ\9c\80æ\96°é¡µé\9d¢',
+'newpages' => '新页面',
'newpages-username' => '用户名:',
'ancientpages' => '最早页面',
'move' => '移动',
'allpages-hide-redirects' => '隐藏重定向页',
# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '你正在浏览本页的缓存版本,至多可能存在 $1 的延迟。',
'cachedspecial-refresh-now' => '查看最新的。',
# Special:Categories
'version-software' => '已安装的软件',
'version-software-product' => '产品',
'version-software-version' => '版本',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => '文件路径',
* @author Philip
* @author Shinjiman
* @author Shizhao
+ * @author Simon Shek
* @author Skjackey tse
* @author Waihorace
* @author Wmr89502270
'customjsprotected' => '你並無權限去編輯此JavaScript頁面,因為他包含了另一位用戶的個人設定。',
'ns-specialprotected' => '特殊頁面是不可以編輯的。',
'titleprotected' => "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
+'filereadonlyerror' => '無法修改文件" $1 "因為文件庫" $2 "處於唯讀模式。 !
+管理員鎖定它的解釋是:" $3 "。',
# Virus scanner
'virus-badscanner' => "損壞設定: 未知的病毒掃瞄器: ''$1''",
'emailconfirmlink' => '確認您的郵箱地址',
'invalidemailaddress' => '郵箱地址格式不正確,請輸入正確的郵箱位址或清空該輸入框。',
'cannotchangeemail' => '本wiki不允許對賬戶的電郵地址進行更改。',
+'emaildisabled' => '此網站不能發送電子郵件。',
'accountcreated' => '已建立賬戶',
'accountcreatedtext' => '$1的賬戶已經被建立。',
'createaccount-title' => '在{{SITENAME}}中建立新賬戶',
'userinvalidcssjstitle' => "'''警告:''' 不存在面板\"\$1\"。注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
'updated' => '(已更新)',
'note' => "'''注意:'''",
-'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''
-[[#editform|→ 繼續修改]]",
+'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''",
+'continue-editing' => '繼續編輯',
'previewconflict' => '這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。',
'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
請再試一次。
'upload-too-many-redirects' => '在網址中有太多重新定向',
'upload-unknown-size' => '未知的大小',
'upload-http-error' => '已發生一個HTTP錯誤:$1',
+'upload-copy-upload-invalid-domain' => '不能從該域名上載檔𣗈副本。',
# File backend
'backend-fail-stream' => '無法流傳送文件$1。',
'backend-fail-closetemp' => '無法創建臨時文件。',
'backend-fail-read' => '找不到文件“$1”。',
'backend-fail-create' => '找不到「$1」檔案。',
+'backend-fail-maxsize' => '無法創建檔𣗈$1,因為它大於$2字節。',
'backend-fail-readonly' => '「$1」儲存後端目前是唯讀模式,因為:「$2」',
-'backend-fail-synced' => '文件"$1"在內部後端是不一致的區域。',
-'backend-fail-connect' => '無法連結至檔案後方“$1”。',
-'backend-fail-internal' => '檔案後方“$1”發生了一個未知錯誤。',
+'backend-fail-synced' => 'æ\96\87件"$1"å\9c¨å\85§é\83¨å\98å\84²å¾\8c端æ\98¯ä¸\8dä¸\80è\87´ç\9a\84å\8d\80å\9f\9fã\80\82',
+'backend-fail-connect' => '無法連結至存儲後方“$1”。',
+'backend-fail-internal' => '存儲後方“$1”發生了一個未知錯誤。',
'backend-fail-contenttype' => '無法確定檔案的內容類型以存儲於“$1”。',
-'backend-fail-batchsize' => '鑒於一批後端 $1 檔 {{PLURAL:$1| operation|operations}} ;限制是 $2 {{PLURAL:$2| operation|operations}}。',
+'backend-fail-batchsize' => '存儲後端被給予了$1次檔𣗈 {{PLURAL:$1|操作|操作}} ;限制是$2次{{PLURAL:$2|操作|操作}}。',
+
+# File journal errors
+'filejournal-fail-dbconnect' => '無法連接到後端存儲的日誌資料庫" $1 "。',
+'filejournal-fail-dbquery' => '無法更新後端存儲的日誌資料庫" $1 "。',
# Lock manager
'lockmanager-notlocked' => '無法解鎖「$1」;它沒有被鎖定。',
# img_auth script messages
'img-auth-accessdenied' => '拒絕存取',
-'img-auth-nopathinfo' => 'PATH_INFO缺失。您的服務器尚未設置傳送該信息。它可能是基於CGI的,因而不支持img_auth。[https://www.mediawiki.org/wiki/Manual:Image_Authorization 參見圖片認證。]',
+'img-auth-nopathinfo' => 'PATH_INFO缺失。
+您的服務器尚未設置傳送該信息。
+它可能是基於CGI的,因而不支持img_auth。
+請參見 https://www.mediawiki.org/wiki/Manual:Image_Authorization',
'img-auth-notindir' => '所請求的路徑不在已經設定的上載目錄。',
'img-auth-badtitle' => '不能夠由"$1"建立一個有效標題。',
'img-auth-nologinnWL' => '您而家並未登入,"$1"不在白名單上。',
請參閱在[$2 檔案描述頁面]以了解其相關資訊。',
'sharedupload-desc-here' => '該檔案來自於$1,它可能在其它計劃項目中被應用。
它在[$2 檔案描述頁面]那邊上的描述於下面顯示。',
+'sharedupload-desc-edit' => '該檔案來自$1,它可能在其它計劃項目中被使用。
+或許您可以在其[$2 檔𣗈描述頁面]上編輯說明。',
+'sharedupload-desc-create' => '該檔案來自$1,它可能在其它計劃項目中被使用。
+或許您可以在那邊的[$2 檔𣗈描述頁面]上編輯其說明。',
'filepage-nofile' => '不存在此名稱的檔案。',
'filepage-nofile-link' => '不存在此名稱的檔案,但您可以[$1 上傳它]。',
'uploadnewversion-linktext' => '上傳該檔案的新版本',
'allpagesprefix' => '顯示具有此前綴(名字空間)的頁面:',
'allpagesbadtitle' => '給定的頁面標題是非法的,或者具有一個內部語言或內部 wiki 的前綴。它可能包含一個或更多的不能用於標題的字元。',
'allpages-bad-ns' => '在{{SITENAME}}中沒有一個叫做"$1"的名字空間。',
+'allpages-hide-redirects' => '隱藏重定向頁',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => '你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。',
+'cachedspecial-viewing-cached-ts' => '您正在閱讀此頁的緩存版本,這可能不是完整的版本。',
+'cachedspecial-refresh-now' => '查看最新。',
# Special:Categories
'categories' => '頁面分類',
'ipb-confirm' => '確認封禁',
'badipaddress' => '無效IP地址',
'blockipsuccesssub' => '查封成功',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被查封。
-<br />參看[[Special:BlockList|被封IP地址列表]]以覆審查封。',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被查封。<br />
+參看[[Special:BlockList|被封IP地址列表]]以覆審查封。',
'ipb-blockingself' => '你要封禁自己!確認要這樣做嗎?',
'ipb-confirmhideuser' => '你要封禁用戶並隱藏其用戶名,這會隱藏在所有列表及日誌中涉及此用戶之用戶名。你確定要這樣做嗎?',
'ipb-edit-dropdown' => '編輯查封原因',
'vector.css' => '/* 此處的 CSS 將影響使用 Vector 面板的用戶 */',
'print.css' => '/* 此處的 CSS 將影響打印輸出 */',
'handheld.css' => '/* 此處的 CSS 將影響在 $wgHandheldStyle 設定手提裝置面板 */',
+'noscript.css' => '/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */',
+'group-autoconfirmed.css' => '/* 此處的 CSS 將只會影響自動確認用戶 */',
+'group-bot.css' => '/* 此處的 CSS 將只會影響機器人 */',
+'group-sysop.css' => '/* 此處的 CSS 將只會影響管理員 */',
+'group-bureaucrat.css' => '/* 此處的 CSS 將只會影響行政員 */',
# Scripts
'common.js' => '/* 此處的JavaScript將載入於所有用戶每一個頁面。 */',
'variantname-zh-sg' => 'disable',
Variants for Chinese language
*/
-'variantname-zh-hans' => '簡體',
-'variantname-zh-hant' => '繁體',
+'variantname-zh-hans' => '中文(简体)',
+'variantname-zh-hant' => '中文(繁體)',
'variantname-zh-cn' => '大陸簡體',
'variantname-zh-tw' => '台灣正體',
'variantname-zh-hk' => '香港繁體',
+'variantname-zh-mo' => '澳門繁體',
'variantname-zh-sg' => '新加坡簡體',
+'variantname-zh-my' => '马来西亚简体',
'variantname-zh' => '不轉換',
+# Variants for Gan language
+'variantname-gan-hans' => '中文(简体)',
+'variantname-gan-hant' => '中文(繁體)',
+
# Metadata
'metadata' => '元數據',
'metadata-help' => '此檔案中包含有擴展的訊息。這些訊息可能是由數位相機或掃描儀在創建或數字化過程中所添加的。
'version-software' => '已經安裝的軟件',
'version-software-product' => '產品',
'version-software-version' => '版本',
+'version-entrypoints' => '入口點URL',
+'version-entrypoints-header-entrypoint' => '入口點',
'version-entrypoints-header-url' => 'URL',
# Special:FilePath
}
if ( $channel === null ) {
$this->cleanupChanneled();
- if( php_sapi_name() == 'cli' ) {
- fwrite( STDOUT, $out );
- } else {
- print( $out );
- }
+ print( $out );
} else {
$out = preg_replace( '/\n\z/', '', $out );
$this->outputChanneled( $out, $channel );
*/
public function cleanupChanneled() {
if ( !$this->atLineStart ) {
- if( php_sapi_name() == 'cli' ) {
- fwrite( STDOUT, "\n" );
- } else {
- print "\n";
- }
+ print "\n";
$this->atLineStart = true;
}
}
return;
}
- $cli = php_sapi_name() == 'cli';
-
// End the current line if necessary
if ( !$this->atLineStart && $channel !== $this->lastChannel ) {
- if( $cli ) {
- fwrite( STDOUT, "\n" );
- } else {
- print "\n";
- }
+ print "\n";
}
- if( $cli ) {
- fwrite( STDOUT, $msg );
- } else {
- print $msg;
- }
+ print $msg;
$this->atLineStart = false;
if ( $channel === null ) {
// For unchanneled messages, output trailing newline immediately
- if( $cli ) {
- fwrite( STDOUT, "\n" );
- } else {
- print "\n";
- }
+ print "\n";
$this->atLineStart = true;
}
$this->lastChannel = $channel;
} else {
$text = $this->getTextDb( $id );
}
+
+ // No more checks for texts from DB for now.
+ // If we received something that is not false,
+ // We treat it as good text, regardless of whether it actually is or is not
+ if ( $text !== false ) {
+ return $text;
+ }
}
if ( $text === false ) {
// Something went wrong; we did not a text that was plausible :(
$failures++;
-
- // After backing off for some time, we try to reboot the whole process as
- // much as possible to not carry over failures from one part to the other
- // parts
- sleep( $this->failureTimeout );
- try {
- $this->rotateDb();
- if ( $this->spawn ) {
- $this->closeSpawn();
- $this->openSpawn();
+ // A failure in a prefetch hit does not warrant resetting db connection etc.
+ if ( ! $tryIsPrefetch ) {
+ // After backing off for some time, we try to reboot the whole process as
+ // much as possible to not carry over failures from one part to the other
+ // parts
+ sleep( $this->failureTimeout );
+ try {
+ $this->rotateDb();
+ if ( $this->spawn ) {
+ $this->closeSpawn();
+ $this->openSpawn();
+ }
+ } catch ( Exception $e ) {
+ $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
+ " Trying to continue anyways" );
}
- } catch ( Exception $e ) {
- $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
- " Trying to continue anyways" );
}
}
--- /dev/null
+<?php
+/**
+ * Copy all files in one container of one backend to another.
+ *
+ * This can also be used to re-shard the files for one backend using the
+ * config of second backend. The second backend should have the same config
+ * as the first, except for it having a different name and different sharding
+ * configuration. The backend should be made read-only while this runs.
+ * After this script finishes, the old files in the containers can be deleted.
+ *
+ * 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
+ *
+ * @ingroup Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class CopyFileBackend extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Copy all the files in one backend to another.";
+ $this->addOption( 'src', 'Backend containing the source files', true, true );
+ $this->addOption( 'dst', 'Backend where files should be copied to', true, true );
+ $this->addOption( 'containers', 'Pipe separated list of containers', true, true );
+ $this->addOption( 'fast', 'Skip SHA-1 checks on pre-existing files' );
+ }
+
+ public function execute() {
+ $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
+ $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
+
+ $containers = explode( '|', $this->getOption( 'containers' ) );
+ foreach ( $containers as $container ) {
+ $this->output( "Doing container $container...\n" );
+
+ $srcPathsRel = $src->getFileList(
+ array( 'dir' => $src->getRootStoragePath() . "/$container" ) );
+ if ( $srcPathsRel === null ) {
+ $this->error( "Could not list files in $container.", 1 ); // die
+ }
+ foreach ( $srcPathsRel as $srcPathRel ) {
+ $srcPath = $src->getRootStoragePath() . "/$container/$srcPathRel";
+ $dstPath = $dst->getRootStoragePath() . "/$container/$srcPathRel";
+
+ if ( $dst->fileExists( array( 'src' => $dstPath, 'latest' => 1 ) ) ) {
+ if ( $this->hasOption( 'fast' ) ) {
+ $this->output( "Already have $dstPath.\n" );
+ continue; // assume already copied...
+ }
+ $srcSha1 = $src->getFileSha1Base36( array( 'src' => $srcPath ) );
+ $dstSha1 = $dst->getFileSha1Base36( array( 'src' => $dstPath ) );
+ if ( $srcSha1 && $srcSha1 === $dstSha1 ) {
+ $this->output( "Already have $dstPath.\n" );
+ continue; // already copied...
+ }
+ }
+
+ $fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
+ if ( !$fsFile ) {
+ $this->error( "Could not get local copy of $srcPath.", 1 ); // die
+ }
+
+ $status = $dst->prepare( array( 'dir' => dirname( $dstPath ) ) );
+ $status->merge( $dst->store(
+ array( 'src' => $fsFile->getPath(), 'dst' => $dstPath ),
+ array( 'nonLocking' => 1, 'nonJournaled' => 1 )
+ ) );
+ if ( !$status->isOK() ) {
+ print_r( $status->getErrorsArray() );
+ $this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+ }
+
+ $this->output( "Copied $srcPath to $dstPath.\n" );
+ }
+ }
+ }
+}
+
+$maintClass = 'CopyFileBackend';
+require_once( RUN_MAINTENANCE_IF_MAIN );
'updated',
'note',
'previewnote',
+ 'continue-editing',
'previewconflict',
'session_fail_preview',
'session_fail_preview_html',
'parser-template-loop-warning',
'parser-template-recursion-depth-warning',
'language-converter-depth-warning',
+ 'node-count-exceeded-category',
+ 'node-count-exceeded-warning',
+ 'expansion-depth-exceeded-category',
+ 'expansion-depth-exceeded-warning',
),
'undo' => array(
'undo-success',
}
public function execute() {
- global $wgMemCachedServers;
+ global $wgMemCachedServers, $wgMemCachedTimeout;
$iterations = $this->getOption( 'i', 100 );
if ( $this->hasArg() ) {
foreach ( $wgMemCachedServers as $server ) {
$this->output( $server . " ", $server );
- $mcc = new MemCachedClientforWiki( array( 'persistant' => true ) );
+ $mcc = new MemCachedClientforWiki( array(
+ 'persistant' => true,
+ 'timeout' => $wgMemCachedTimeout
+ ) );
$mcc->set_servers( array( $server ) );
$set = 0;
$incr = 0;
$cond = "rev_id BETWEEN $blockStart AND $blockEnd";
$res = $db->select( 'revision',
array( 'rev_id', 'rev_page', 'rev_timestamp', 'rev_parent_id' ),
- $cond, __METHOD__ );
+ array( $cond, 'rev_parent_id' => null ), __METHOD__ );
# Go through and update rev_parent_id from these rows.
# Assume that the previous revision of the title was
# the original previous revision of the title when the
* @param $id int The page_id of the redirect
*/
private function fixRedirect( $id ) {
- $title = Title::newFromID( $id );
+ $page = WikiPage::newFromID( $id );
$dbw = wfGetDB( DB_MASTER );
- if ( is_null( $title ) ) {
+ if ( $page === null ) {
// This page doesn't exist (any more)
// Delete any redirect table entry for it
$dbw->delete( 'redirect', array( 'rd_from' => $id ),
return;
}
- $page = WikiPage::factory( $title );
$rt = $page->getRedirectTarget();
if ( $rt === null ) {
- // $title is not a redirect
+ // The page is not a redirect
// Delete any redirect table entry for it
$dbw->delete( 'redirect', array( 'rd_from' => $id ),
__METHOD__ );
* @param $id int The page_id
*/
public static function fixLinksFromArticle( $id ) {
- global $wgParser;
+ global $wgParser, $wgContLang;
- $title = Title::newFromID( $id );
- $dbw = wfGetDB( DB_MASTER );
+ $page = WikiPage::newFromID( $id );
LinkCache::singleton()->clear();
- if ( is_null( $title ) ) {
+ if ( $page === null ) {
return;
}
- $revision = Revision::newFromTitle( $title );
- if ( !$revision ) {
+ $text = $page->getRawText();
+ if ( $text === false ) {
return;
}
+ $dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
- $options = new ParserOptions;
- $parserOutput = $wgParser->parse( $revision->getText(), $title, $options, true, true, $revision->getId() );
- $update = new LinksUpdate( $title, $parserOutput, false );
+ $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+ $parserOutput = $wgParser->parse( $text, $page->getTitle(), $options, true, true, $page->getLatest() );
+ $update = new LinksUpdate( $page->getTitle(), $parserOutput, false );
$update->doUpdate();
+
$dbw->commit( __METHOD__ );
}
'common/commonContent.css' => array( 'media' => 'screen' ),
'common/commonInterface.css' => array( 'media' => 'screen' ),
'vector/screen.css' => array( 'media' => 'screen' ),
+ 'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 900px)' ),
),
'scripts' => 'vector/vector.js',
'remoteBasePath' => $GLOBALS['wgStylePath'],
-/*
- * jQuery UI Effects Blind 1.8.18
+/*!
+ * jQuery UI Effects Blind 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Bounce 1.8.18
+/*!
+ * jQuery UI Effects Bounce 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Clip 1.8.18
+/*!
+ * jQuery UI Effects Clip 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects 1.8.18
+/*!
+ * jQuery UI Effects 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
originalStyleAttr = that.attr('style') || ' ',
originalStyle = filterStyles(getElementStyles.call(this)),
newStyle,
- className = that.attr('class');
+ className = that.attr('class') || "";
$.each(classAnimationActions, function(i, action) {
if (value[action]) {
/******************************************************************************/
$.extend($.effects, {
- version: "1.8.18",
+ version: "@VERSION",
// Saves a set of properties in a data storage
save: function(element, set) {
setTransition: function(element, list, factor, value) {
value = value || {};
$.each(list, function(i, x){
- unit = element.cssUnit(x);
+ var unit = element.cssUnit(x);
if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
});
return value;
-/*
- * jQuery UI Effects Drop 1.8.18
+/*!
+ * jQuery UI Effects Drop 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Explode 1.8.18
+/*!
+ * jQuery UI Effects Explode 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Fade 1.8.18
+/*!
+ * jQuery UI Effects Fade 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Fold 1.8.18
+/*!
+ * jQuery UI Effects Fold 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Highlight 1.8.18
+/*!
+ * jQuery UI Effects Highlight 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Pulsate 1.8.18
+/*!
+ * jQuery UI Effects Pulsate 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
$.effects.pulsate = function(o) {
return this.queue(function() {
var elem = $(this),
- mode = $.effects.setMode(elem, o.options.mode || 'show');
- times = ((o.options.times || 5) * 2) - 1;
+ mode = $.effects.setMode(elem, o.options.mode || 'show'),
+ times = ((o.options.times || 5) * 2) - 1,
duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
isVisible = elem.is(':visible'),
animateTo = 0;
-/*
- * jQuery UI Effects Scale 1.8.18
+/*!
+ * jQuery UI Effects Scale 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
props2 = props.concat(vProps).concat(hProps); // Concat
el.find("*[width]").each(function(){
- child = $(this);
+ var child = $(this);
if (restore) $.effects.save(child, props2);
var c_original = {height: child.height(), width: child.width()}; // Save original
child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
-/*
- * jQuery UI Effects Shake 1.8.18
+/*!
+ * jQuery UI Effects Shake 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Slide 1.8.18
+/*!
+ * jQuery UI Effects Slide 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Effects Transfer 1.8.18
+/*!
+ * jQuery UI Effects Transfer 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
- weekHeader: 'Wo',
+ weekHeader: 'KW',
dateFormat: 'dd.mm.yy',
firstDay: 1,
isRTL: false,
dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
dayNamesMin: ['P','E','T','K','N','R','L'],
- weekHeader: 'Sm',
+ weekHeader: 'näd',
dateFormat: 'dd.mm.yy',
firstDay: 1,
isRTL: false,
jQuery(function($) {
$.datepicker.regional['fa'] = {
closeText: 'بستن',
- prevText: '<قبلي',
- nextText: 'بعدي>',
+ prevText: '<قبلی',
+ nextText: 'بعدی>',
currentText: 'امروز',
- monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
- 'مهر','آبان','آذر','دي','بهمن','اسفند'],
+ monthNames: [
+ 'فروردين',
+ 'ارديبهشت',
+ 'خرداد',
+ 'تير',
+ 'مرداد',
+ 'شهريور',
+ 'مهر',
+ 'آبان',
+ 'آذر',
+ 'دی',
+ 'بهمن',
+ 'اسفند'
+ ],
monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
- dayNames: ['يکشنبه','دوشنبه','سهشنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
- dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
- dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+ dayNames: [
+ 'يکشنبه',
+ 'دوشنبه',
+ 'سهشنبه',
+ 'چهارشنبه',
+ 'پنجشنبه',
+ 'جمعه',
+ 'شنبه'
+ ],
+ dayNamesShort: [
+ 'ی',
+ 'د',
+ 'س',
+ 'چ',
+ 'پ',
+ 'ج',
+ 'ش'
+ ],
+ dayNamesMin: [
+ 'ی',
+ 'د',
+ 'س',
+ 'چ',
+ 'پ',
+ 'ج',
+ 'ش'
+ ],
weekHeader: 'هف',
dateFormat: 'yy/mm/dd',
firstDay: 6,
/* Finnish initialisation for the jQuery UI date picker plugin. */
-/* Written by Harri Kilpi� (harrikilpio@gmail.com). */
+/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
jQuery(function($){
- $.datepicker.regional['fi'] = {
+ $.datepicker.regional['fi'] = {
closeText: 'Sulje',
- prevText: '«Edellinen',
- nextText: 'Seuraava»',
- currentText: 'Tänään',
- monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
- 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
- monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
- 'Heinä','Elo','Syys','Loka','Marras','Joulu'],
- dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+ prevText: '«Edellinen',
+ nextText: 'Seuraava»',
+ currentText: 'Tänään',
+ monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
+ 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+ monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
+ 'Heinä','Elo','Syys','Loka','Marras','Joulu'],
+ dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
weekHeader: 'Vk',
- dateFormat: 'dd.mm.yy',
+ dateFormat: 'dd.mm.yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
- $.datepicker.setDefaults($.datepicker.regional['fi']);
+ $.datepicker.setDefaults($.datepicker.regional['fi']);
});
prevText: '<',
nextText: '>',
currentText: 'Денес',
- monthNames: ['Ð\88анÑ\83аÑ\80и','Фебруари','Март','Април','Мај','Јуни',
+ monthNames: ['Ð\88анÑ\83аÑ\80и','Февруари','Март','Април','Мај','Јуни',
'Јули','Август','Септември','Октомври','Ноември','Декември'],
- monthNamesShort: ['Ð\88ан','Феб','Мар','Апр','Мај','Јун',
+ monthNamesShort: ['Ð\88ан','Фев','Мар','Апр','Мај','Јун',
'Јул','Авг','Сеп','Окт','Ное','Дек'],
dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
-/*
- * jQuery UI Accordion 1.8.18
+/*!
+ * jQuery UI Accordion 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend( $.ui.accordion, {
- version: "1.8.18",
+ version: "@VERSION",
animations: {
slide: function( options, additions ) {
options = $.extend({
-/*
- * jQuery UI Autocomplete 1.8.18
+/*!
+ * jQuery UI Autocomplete 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
var self = this,
doc = this.element[ 0 ].ownerDocument,
suppressKeyPress;
+ this.isMultiLine = this.element.is( "textarea" );
this.element
.addClass( "ui-autocomplete-input" )
self._move( "nextPage", event );
break;
case keyCode.UP:
- self._move( "previous", event );
- // prevent moving cursor to beginning of text field in some browsers
- event.preventDefault();
+ self._keyEvent( "previous", event );
break;
case keyCode.DOWN:
- self._move( "next", event );
- // prevent moving cursor to end of text field in some browsers
- event.preventDefault();
+ self._keyEvent( "next", event );
break;
case keyCode.ENTER:
case keyCode.NUMPAD_ENTER:
}, 150 );
});
this._initSource();
- this.response = function() {
- return self._response.apply( self, arguments );
- };
this.menu = $( "<ul></ul>" )
.addClass( "ui-autocomplete" )
.appendTo( $( this.options.appendTo || "body", doc )[0] )
url: url,
data: request,
dataType: "json",
- context: {
- autocompleteRequest: ++requestIndex
- },
success: function( data, status ) {
- if ( this.autocompleteRequest === requestIndex ) {
- response( data );
- }
+ response( data );
},
error: function() {
- if ( this.autocompleteRequest === requestIndex ) {
- response( [] );
- }
+ response( [] );
}
});
};
this.pending++;
this.element.addClass( "ui-autocomplete-loading" );
- this.source( { term: value }, this.response );
+ this.source( { term: value }, this._response() );
},
- _response: function( content ) {
+ _response: function() {
+ var that = this,
+ index = ++requestIndex;
+
+ return function( content ) {
+ if ( index === requestIndex ) {
+ that.__response( content );
+ }
+
+ that.pending--;
+ if ( !that.pending ) {
+ that.element.removeClass( "ui-autocomplete-loading" );
+ }
+ };
+ },
+
+ __response: function( content ) {
if ( !this.options.disabled && content && content.length ) {
content = this._normalize( content );
this._suggest( content );
} else {
this.close();
}
- this.pending--;
- if ( !this.pending ) {
- this.element.removeClass( "ui-autocomplete-loading" );
- }
},
close: function( event ) {
widget: function() {
return this.menu.element;
+ },
+ _keyEvent: function( keyEvent, event ) {
+ if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+ this._move( keyEvent, event );
+
+ // prevents moving cursor to beginning/end of the text field in some browsers
+ event.preventDefault();
+ }
}
});
}
var base = this.active.offset().top,
- height = this.element.height();
+ height = this.element.height(),
result = this.element.children(".ui-menu-item").filter(function() {
var close = $(this).offset().top - base + height - $(this).height();
// TODO improve approximation
-/*
- * jQuery UI Button 1.8.18
+/*!
+ * jQuery UI Button 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
/*!
- * jQuery UI 1.8.18
+ * jQuery UI 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
}
$.extend( $.ui, {
- version: "1.8.18",
+ version: "@VERSION",
keyCode: {
ALT: 18,
-/*
- * jQuery UI Datepicker 1.8.18
+/*!
+ * jQuery UI Datepicker 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
*/
(function( $, undefined ) {
-$.extend($.ui, { datepicker: { version: "1.8.18" } });
+$.extend($.ui, { datepicker: { version: "@VERSION" } });
var PROP_NAME = 'datepicker';
var dpuuid = new Date().getTime();
$.datepicker._updateDatepicker(inst);
}
}
- catch (event) {
- $.datepicker.log(event);
+ catch (err) {
+ $.datepicker.log(err);
}
}
return true;
if (this._datepickerShowing) {
var showAnim = this._get(inst, 'showAnim');
var duration = this._get(inst, 'duration');
- var self = this;
var postProcess = function() {
$.datepicker._tidyDialog(inst);
- self._curInst = null;
};
if ($.effects && $.effects[showAnim])
inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
$.datepicker = new Datepicker(); // singleton instance
$.datepicker.initialized = false;
$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.18";
+$.datepicker.version = "@VERSION";
// Workaround for #4055
// Add another global to avoid noConflict issues with inline event handlers
-/*
- * jQuery UI Dialog 1.8.18
+/*!
+ * jQuery UI Dialog 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend($.ui.dialog, {
- version: "1.8.18",
+ version: "@VERSION",
uuid: 0,
maxZ: 0,
-/*
- * jQuery UI Draggable 1.8.18
+/*!
+ * jQuery UI Draggable 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend($.ui.draggable, {
- version: "1.8.18"
+ version: "@VERSION"
});
$.ui.plugin.add("draggable", "connectToSortable", {
-/*
- * jQuery UI Droppable 1.8.18
+/*!
+ * jQuery UI Droppable 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend($.ui.droppable, {
- version: "1.8.18"
+ version: "@VERSION"
});
$.ui.intersect = function(draggable, droppable, toleranceMode) {
/*!
- * jQuery UI Mouse 1.8.18
+ * jQuery UI Mouse 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
// other instances of mouse
_mouseDestroy: function() {
this.element.unbind('.'+this.widgetName);
+ $(document)
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
},
_mouseDown: function(event) {
-/*
- * jQuery UI Position 1.8.18
+/*!
+ * jQuery UI Position 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Progressbar 1.8.18
+/*!
+ * jQuery UI Progressbar 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend( $.ui.progressbar, {
- version: "1.8.18"
+ version: "@VERSION"
});
})( jQuery );
-/*
- * jQuery UI Resizable 1.8.18
+/*!
+ * jQuery UI Resizable 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend($.ui.resizable, {
- version: "1.8.18"
+ version: "@VERSION"
});
/*
if (cp.left < (self._helper ? co.left : 0)) {
self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
- if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+ if (pRatio) self.size.height = self.size.width / self.aspectRatio;
self.position.left = o.helper ? co.left : 0;
}
if (cp.top < (self._helper ? co.top : 0)) {
self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
- if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+ if (pRatio) self.size.width = self.size.height * self.aspectRatio;
self.position.top = self._helper ? co.top : 0;
}
-/*
- * jQuery UI Selectable 1.8.18
+/*!
+ * jQuery UI Selectable 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend($.ui.selectable, {
- version: "1.8.18"
+ version: "@VERSION"
});
})(jQuery);
-/*
- * jQuery UI Slider 1.8.18
+/*!
+ * jQuery UI Slider 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
});
$.extend( $.ui.slider, {
- version: "1.8.18"
+ version: "@VERSION"
});
}(jQuery));
-/*
- * jQuery UI Sortable 1.8.18
+/*!
+ * jQuery UI Sortable 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
var el = $(document.createElement(self.currentItem[0].nodeName))
.addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
- .removeClass("ui-sortable-helper")[0];
+ .removeClass("ui-sortable-helper").html(" ")[0];
if(!className)
el.style.visibility = "hidden";
});
$.extend($.ui.sortable, {
- version: "1.8.18"
+ version: "@VERSION"
});
})(jQuery);
-/*
- * jQuery UI Tabs 1.8.18
+/*!
+ * jQuery UI Tabs 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
// meta-function to give users option to provide a href string instead of a numerical index.
// also sanitizes numerical indexes to valid values.
if ( typeof index == "string" ) {
- index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+ index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
}
return index;
});
$.extend( $.ui.tabs, {
- version: "1.8.18"
+ version: "@VERSION"
});
/*
}
}
: function( e ) {
- t = o.selected;
rotate();
});
/*!
- * jQuery UI Widget 1.8.18
+ * jQuery UI Widget 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Accordion 1.8.18
+/*!
+ * jQuery UI Accordion 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Autocomplete 1.8.18
+/*!
+ * jQuery UI Autocomplete 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
/*
- * jQuery UI Menu 1.8.18
+ * jQuery UI Menu @VERSION
*
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
-/*
- * jQuery UI Button 1.8.18
+/*!
+ * jQuery UI Button 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Button#theming
*/
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: hidden; *overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
.ui-button-icons-only { width: 3.4em; }
-/*
- * jQuery UI CSS Framework 1.8.18
+/*!
+ * jQuery UI CSS Framework 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Datepicker 1.8.18
+/*!
+ * jQuery UI Datepicker 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Dialog 1.8.18
+/*!
+ * jQuery UI Dialog 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Progressbar 1.8.18
+/*!
+ * jQuery UI Progressbar 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Resizable 1.8.18
+/*!
+ * jQuery UI Resizable 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Selectable 1.8.18
+/*!
+ * jQuery UI Selectable 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Slider 1.8.18
+/*!
+ * jQuery UI Slider 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI Tabs 1.8.18
+/*!
+ * jQuery UI Tabs 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
-/*
- * jQuery UI CSS Framework 1.8.18
+/*!
+ * jQuery UI CSS Framework 1.8.19
*
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
/**
* Simple message parser, does $N replacement and nothing else.
* This may be overridden to provide a more complex message parser.
- *
+ *
* This function will not be called for nonexistent messages.
*/
parser: function() {
return parameters[index] !== undefined ? parameters[index] : '$' + match;
} );
},
-
+
/**
* Appends (does not replace) parameters for replacement to the .parameters property.
*
text = this.parser();
text = mw.html.escape( text );
}
-
+
if ( this.format === 'parse' ) {
text = this.parser();
}
* emulates console.log in console-less environments.
*/
log: function() { },
-
+
/**
* @var constructor Make the Map constructor publicly available.
*/
* @var constructor Make the Message constructor publicly available.
*/
Message: Message,
-
+
/**
* List of configuration values
*
* in the global window object.
*/
config: null,
-
+
/**
* @var object
*
* Empty object that plugins can be installed in.
*/
libs: {},
-
+
/* Extension points */
-
+
legacy: {},
-
+
/**
* Localization system
*/
messages: new Map(),
-
+
/* Public Methods */
-
+
/**
* Gets a message object, similar to wfMessage()
*
}
return new Message( mw.messages, key, parameters );
},
-
+
/**
* Gets a message string, similar to wfMsg()
*
msg: function ( /* key, parameter_1, parameter_2, .. */ ) {
return mw.message.apply( mw.message, arguments ).toString();
},
-
+
/**
* Client-side module loader which integrates with the MediaWiki ResourceLoader
*/
loader: ( function () {
-
+
/* Private Members */
-
+
/**
* Mapping of registered modules
*
ready = false,
// Selector cache for the marker element. Use getMarker() to get/use the marker!
$marker = null;
-
+
/* Cache document ready status */
-
+
$(document).ready( function () {
ready = true;
} );
-
+
/* Private methods */
-
+
function getMarker() {
// Cached ?
if ( $marker ) {
}
return true;
}
-
+
/**
* Generates an ISO8601 "basic" string from a UNIX timestamp
*/
pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
].join( '' );
}
-
+
/**
* Recursively resolves dependencies and detects circular references
*/
function recurse( module, resolved, unresolved ) {
var n, deps, len;
-
+
if ( registry[module] === undefined ) {
throw new Error( 'Unknown dependency: ' + module );
}
}
resolved[resolved.length] = module;
}
-
+
/**
* Gets a list of module names that a module depends on in their proper dependency order
*
*/
function resolve( module ) {
var modules, m, deps, n, resolved;
-
+
// Allow calling with an array of module names
if ( $.isArray( module ) ) {
modules = [];
throw new Error( 'Invalid module argument: ' + module );
}
-
+
/**
* Narrows a list of module names down to those matching a specific
* state (see comment on top of this scope for a list of valid states).
*/
function filter( states, modules ) {
var list, module, s, m;
-
+
// Allow states to be given as a string
if ( typeof states === 'string' ) {
states = [states];
}
return list;
}
-
+
/**
* Automatically executes jobs and modules which are pending with satistifed dependencies.
*
*/
function handlePending( module ) {
var j, r;
-
+
try {
// Run jobs whose dependencies have just been met
for ( j = 0; j < jobs.length; j += 1 ) {
throw e;
}
}
-
+
/**
* Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
* depending on whether document-ready has occured yet and whether we are in async mode.
if ( $.isFunction( callback ) ) {
// Attach handlers for all browsers (based on jQuery.ajax)
script.onload = script.onreadystatechange = function() {
-
+
if (
!done
&& (
|| /loaded|complete/.test( script.readyState )
)
) {
-
+
done = true;
-
+
callback();
-
+
// Handle memory leak in IE. This seems to fail in
// IE7 sometimes (Permission Denied error when
// accessing script.parentNode) so wrap it in
if ( script.parentNode ) {
script.parentNode.removeChild( script );
}
-
+
// Dereference the script
script = undefined;
} catch ( e ) { }
}
};
}
-
+
if ( window.opera ) {
// Appending to the <head> blocks rendering completely in Opera,
// so append to the <body> after document ready. This means the
}
}
}
-
+
/**
* Executes a loaded module, making it ready to use
*
*/
function execute( module, callback ) {
var style, media, i, script, markModuleReady, nestedAddScript;
-
+
if ( registry[module] === undefined ) {
throw new Error( 'Module has not been registered yet: ' + module );
} else if ( registry[module].state === 'registered' ) {
} else if ( registry[module].state === 'ready' ) {
throw new Error( 'Module has already been loaded: ' + module );
}
-
+
// Add styles
if ( $.isPlainObject( registry[module].style ) ) {
// 'media' type ignored, see documentation of mw.loader.implement
callback();
return;
}
-
+
addScript( arr[i], function() {
nestedAddScript( arr, callback, async, i + 1 );
}, async );
};
-
+
if ( $.isArray( script ) ) {
registry[module].state = 'loading';
nestedAddScript( script, markModuleReady, registry[module].async, 0 );
} else if ( $.isFunction( script ) ) {
- script();
+ script( $ );
markModuleReady();
}
} catch ( e ) {
registry[module].state = 'error';
}
}
-
+
/**
* Adds a dependencies to the queue with optional callbacks to be run
* when the dependencies are ready or fail
*/
function request( dependencies, ready, error, async ) {
var regItemDeps, regItemDepLen, n;
-
+
// Allow calling by single module name
if ( typeof dependencies === 'string' ) {
dependencies = [dependencies];
// Work the queue
mw.loader.work();
}
-
+
function sortQuery(o) {
var sorted = {}, key, a = [];
for ( key in o ) {
}
return sorted;
}
-
+
/**
* Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
* to a query string of the form foo.bar,baz|bar.baz,quux
}
return arr.join( '|' );
}
-
+
/**
* Asynchronously append a script tag to the end of the body
* that invokes load.php
// Append &* to avoid triggering the IE6 extension check
addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
}
-
+
/* Public Methods */
return {
addStyleTag: addStyleTag,
source, group, g, i, modules, maxVersion, sourceLoadScript,
currReqBase, currReqBaseLength, moduleMap, l,
lastDotIndex, prefix, suffix, bytesAdded, async;
-
+
// Build a list of request parameters common to all requests.
reqBase = {
skin: mw.config.get( 'skin' ),
// Split module batch by source and by group.
splits = {};
maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
-
+
// Appends a list of modules from the queue to the batch
for ( q = 0; q < queue.length; q += 1 ) {
// Only request modules which are registered
if ( !batch.length ) {
return;
}
-
+
// The queue has been processed into the batch, clear up the queue.
queue = [];
-
+
// Always order modules alphabetically to help reduce cache
// misses for otherwise identical content.
batch.sort();
-
+
// Split batch by source and by group.
for ( b = 0; b < batch.length; b += 1 ) {
bSource = registry[batch[b]].source;
bSourceGroup = splits[bSource][bGroup];
bSourceGroup[bSourceGroup.length] = batch[b];
}
-
+
// Clear the batch - this MUST happen before we append any
// script elements to the body or it's possible that a script
// will be locally cached, instantly load, and work the batch
// again, all before we've cleared it causing each request to
// include modules which are already loaded.
batch = [];
-
+
for ( source in splits ) {
-
+
sourceLoadScript = sources[source].loadScript;
-
+
for ( group in splits[source] ) {
-
+
// Cache access to currently selected list of
// modules for this group from this source.
modules = splits[source][group];
-
+
// Calculate the highest timestamp
maxVersion = 0;
for ( g = 0; g < modules.length; g += 1 ) {
maxVersion = registry[modules[g]].version;
}
}
-
+
currReqBase = $.extend( { 'version': formatVersionNumber( maxVersion ) }, reqBase );
currReqBaseLength = $.param( currReqBase ).length;
async = true;
// We may need to split up the request to honor the query string length limit,
// so build it piece by piece.
l = currReqBaseLength + 9; // '&modules='.length == 9
-
+
moduleMap = {}; // { prefix: [ suffixes ] }
-
+
for ( i = 0; i < modules.length; i += 1 ) {
// Determine how many bytes this module would add to the query string
lastDotIndex = modules[i].lastIndexOf( '.' );
bytesAdded = moduleMap[prefix] !== undefined
? suffix.length + 3 // '%2C'.length == 3
: modules[i].length + 3; // '%7C'.length == 3
-
+
// If the request would become too long, create a new one,
// but don't create empty requests
if ( maxQueryLength > 0 && !$.isEmptyObject( moduleMap ) && l + bytesAdded > maxQueryLength ) {
}
}
},
-
+
/**
* Register a source.
*
}
return true;
}
-
+
if ( sources[id] !== undefined ) {
throw new Error( 'source already registered: ' + id );
}
-
+
sources[id] = props;
-
+
return true;
},
-
+
/**
* Registers a module, letting the system know about it and its
* properties. Startup modules contain calls to this function.
registry[module].dependencies = dependencies;
}
},
-
+
/**
* Implements a module, giving the system a course of action to take
* upon loading. Results of a request for one or more modules contain
execute( module );
}
},
-
+
/**
* Executes a function as soon as one or more required modules are ready
*
request( dependencies, ready, error );
}
},
-
+
/**
* Loads an external script or one or more modules for future use
*
request( filtered, null, null, async );
return;
},
-
+
/**
* Changes the state of a module
*
*/
state: function ( module, state ) {
var m;
+
if ( typeof module === 'object' ) {
for ( m in module ) {
mw.loader.state( m, module[m] );
if ( registry[module] === undefined ) {
mw.loader.register( module );
}
- registry[module].state = state;
+ if ( state === 'ready' && registry[module].state !== state) {
+ // Make sure pending modules depending on this one get executed if their
+ // dependencies are now fulfilled!
+ registry[module].state = state;
+ handlePending( module );
+ } else {
+ registry[module].state = state;
+ }
},
-
+
/**
* Gets the version of a module
*
}
return null;
},
-
+
/**
* @deprecated since 1.18 use mw.loader.getVersion() instead
*/
version: function () {
return mw.loader.getVersion.apply( mw.loader, arguments );
},
-
+
/**
* Gets the state of a module
*
}
return null;
},
-
+
/**
* Get names of all registered modules.
*
return key;
} );
},
-
+
/**
* For backwards-compatibility with Squid-cached pages. Loads mw.user
*/
}
};
}() ),
-
+
/** HTML construction helper functions */
html: ( function () {
function escapeCallback( s ) {
escape: function ( s ) {
return s.replace( /['"<>&]/g, escapeCallback );
},
-
+
/**
* Wrapper object for raw HTML passed to mw.html.element().
* @constructor
Raw: function ( value ) {
this.value = value;
},
-
+
/**
* Wrapper object for CDATA element contents passed to mw.html.element()
* @constructor
Cdata: function ( value ) {
this.value = value;
},
-
+
/**
* Create an HTML element string, with safe escaping.
*
*/
element: function ( name, attrs, contents ) {
var v, attrName, s = '<' + name;
-
+
for ( attrName in attrs ) {
v = attrs[attrName];
// Convert name=true, to name=name
tokens: new Map()
}
};
-
+
}( jQuery ) );
// Alias $j to jQuery for backwards compatibility
<!-- /sitenotice -->
<?php endif; ?>
<!-- firstHeading -->
- <h1 id="firstHeading" class="firstHeading">
- <span dir="auto"><?php $this->html( 'title' ) ?></span>
- </h1>
+ <h1 id="firstHeading" class="firstHeading"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
<!-- /firstHeading -->
<!-- bodyContent -->
<div id="bodyContent">
--- /dev/null
+/* Vector screen styles for high definition displays */
+
+div#content {
+ margin-left: 11em;
+ padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+ left: 0.5em;
+}
+div#footer {
+ margin-left: 11em;
+ padding: 1.25em;
+}
+#mw-panel {
+ padding-left: 0.5em;
+}
+#p-search {
+ margin-right: 1em;
+}
+#left-navigation {
+ left: 11em;
+}
+#p-personal {
+ right: 1em;
+}
+#mw-head-base {
+ margin-left: 11em;
+}
/* Personal */
#p-personal {
position: absolute;
- top: 0;
+ top: 0.33em;
right: 0.75em;
}
#p-personal h5 {
.tipsy {
font-size: 0.8em;
}
+
+/* Animate between standard and high definition layouts */
+
+div#content,
+div#footer {
+ transition: margin-left 250ms, padding 250ms;
+ -moz-transition: margin-left 250ms, padding 250ms;
+ -webkit-transition: margin-left 250ms, padding 250ms;
+ -o-transition: margin-left 250ms, padding 250ms;
+}
+#p-logo,
+#left-navigation {
+ transition: left 250ms;
+ -moz-transition: left 250ms;
+ -webkit-transition: left 250ms;
+ -o-transition: left 250ms;
+}
+#mw-panel {
+ transition: padding-left 250ms;
+ -moz-transition: padding-left 250ms;
+ -webkit-transition: padding-left 250ms;
+ -o-transition: padding-left 250ms;
+}
+#p-search {
+ transition: margin-right 250ms;
+ -moz-transition: margin-right 250ms;
+ -webkit-transition: margin-right 250ms;
+ -o-transition: margin-right 250ms;
+}
+#p-personal {
+ transition: right 250ms;
+ -moz-transition: right 250ms;
+ -webkit-transition: right 250ms;
+ -o-transition: right 250ms;
+}
+#mw-head-base {
+ transition: margin-left 250ms;
+ -moz-transition: margin-left 250ms;
+ -webkit-transition: margin-left 250ms;
+ -o-transition: margin-left 250ms;
+}
}
// Output a notice when running with older versions of PHPUnit
-if ( !version_compare( PHPUnit_Runner_Version::id(), "3.4.1", ">" ) ) {
+if ( version_compare( PHPUnit_Runner_Version::id(), "3.6.7", "<" ) ) {
echo <<<EOF
********************************************************************************
-These tests run best with version PHPUnit 3.4.2 or better. Earlier versions may
+These tests run best with version PHPUnit 3.6.7 or better. Earlier versions may
show failures because earlier versions of PHPUnit do not properly implement
dependencies.
public function setUp() {
if ( !CdbReader::haveExtension() ) {
- $this->markTestIncomplete( 'This test requires native CDB support to be present.' );
+ $this->markTestSkipped( 'Native CDB support is not available' );
}
}
function __construct() {
parent::__construct();
+ global $wgEnableEmail;
$this->users['noemail'] = new User;
$this->context = new RequestContext;
$this->context->setTitle( Title::newFromText('PreferencesTest') );
+
+ //some tests depends on email setting
+ $wgEnableEmail = true;
}
/**
*/
public function testInNamespace( $title, $ns, $expectedBool ) {
$title = Title::newFromText( $title );
- $this->assertEquals( $title->inNamespace( $ns ), $expectedBool );
+ $this->assertEquals( $expectedBool, $title->inNamespace( $ns ) );
}
public function testInNamespaces() {
$this->assertEquals( $expectedBool, $title->hasSubjectNamespace( $ns ) );
}
+ public function dataIsCssOrJsPage() {
+ return array(
+ array( 'Foo', false ),
+ array( 'Foo.js', false ),
+ array( 'Foo/bar.js', false ),
+ array( 'User:Foo', false ),
+ array( 'User:Foo.js', false ),
+ array( 'User:Foo/bar.js', false ),
+ array( 'User:Foo/bar.css', false ),
+ array( 'User talk:Foo/bar.css', false ),
+ array( 'User:Foo/bar.js.xxx', false ),
+ array( 'User:Foo/bar.xxx', false ),
+ array( 'MediaWiki:Foo.js', true ),
+ array( 'MediaWiki:Foo.css', true ),
+ array( 'MediaWiki:Foo.JS', false ),
+ array( 'MediaWiki:Foo.CSS', false ),
+ array( 'MediaWiki:Foo.css.xxx', false ),
+ );
+ }
+
+ /**
+ * @dataProvider dataIsCssOrJsPage
+ */
+ public function testIsCssOrJsPage( $title, $expectedBool ) {
+ $title = Title::newFromText( $title );
+ $this->assertEquals( $expectedBool, $title->isCssOrJsPage() );
+ }
+
+
+ public function dataIsCssJsSubpage() {
+ return array(
+ array( 'Foo', false ),
+ array( 'Foo.js', false ),
+ array( 'Foo/bar.js', false ),
+ array( 'User:Foo', false ),
+ array( 'User:Foo.js', false ),
+ array( 'User:Foo/bar.js', true ),
+ array( 'User:Foo/bar.css', true ),
+ array( 'User talk:Foo/bar.css', false ),
+ array( 'User:Foo/bar.js.xxx', false ),
+ array( 'User:Foo/bar.xxx', false ),
+ array( 'MediaWiki:Foo.js', false ),
+ array( 'User:Foo/bar.JS', false ),
+ array( 'User:Foo/bar.CSS', false ),
+ );
+ }
+
+ /**
+ * @dataProvider dataIsCssJsSubpage
+ */
+ public function testIsCssJsSubpage( $title, $expectedBool ) {
+ $title = Title::newFromText( $title );
+ $this->assertEquals( $expectedBool, $title->isCssJsSubpage() );
+ }
+
+ public function dataIsCssSubpage() {
+ return array(
+ array( 'Foo', false ),
+ array( 'Foo.css', false ),
+ array( 'User:Foo', false ),
+ array( 'User:Foo.js', false ),
+ array( 'User:Foo.css', false ),
+ array( 'User:Foo/bar.js', false ),
+ array( 'User:Foo/bar.css', true ),
+ );
+ }
+
+ /**
+ * @dataProvider dataIsCssSubpage
+ */
+ public function testIsCssSubpage( $title, $expectedBool ) {
+ $title = Title::newFromText( $title );
+ $this->assertEquals( $expectedBool, $title->isCssSubpage() );
+ }
+
+ public function dataIsJsSubpage() {
+ return array(
+ array( 'Foo', false ),
+ array( 'Foo.css', false ),
+ array( 'User:Foo', false ),
+ array( 'User:Foo.js', false ),
+ array( 'User:Foo.css', false ),
+ array( 'User:Foo/bar.js', true ),
+ array( 'User:Foo/bar.css', false ),
+ );
+ }
+
+ /**
+ * @dataProvider dataIsJsSubpage
+ */
+ public function testIsJsSubpage( $title, $expectedBool ) {
+ $title = Title::newFromText( $title );
+ $this->assertEquals( $expectedBool, $title->isJsSubpage() );
+ }
+
+ public function dataIsWikitextPage() {
+ return array(
+ array( 'Foo', true ),
+ array( 'Foo.js', true ),
+ array( 'Foo/bar.js', true ),
+ array( 'User:Foo', true ),
+ array( 'User:Foo.js', true ),
+ array( 'User:Foo/bar.js', false ),
+ array( 'User:Foo/bar.css', false ),
+ array( 'User talk:Foo/bar.css', true ),
+ array( 'User:Foo/bar.js.xxx', true ),
+ array( 'User:Foo/bar.xxx', true ),
+ array( 'MediaWiki:Foo.js', false ),
+ array( 'MediaWiki:Foo.css', false ),
+ array( 'MediaWiki:Foo/bar.css', false ),
+ array( 'User:Foo/bar.JS', true ),
+ array( 'User:Foo/bar.CSS', true ),
+ );
+ }
+
+ /**
+ * @dataProvider dataIsWikitextPage
+ */
+ public function testIsWikitextPage( $title, $expectedBool ) {
+ $title = Title::newFromText( $title );
+ $this->assertEquals( $expectedBool, $title->isWikitextPage() );
+ }
+
}
--- /dev/null
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ */
+class GenderCacheTest extends MediaWikiLangTestCase {
+
+ function setUp() {
+ global $wgDefaultUserOptions;
+ parent::setUp();
+ //ensure the correct default gender
+ $wgDefaultUserOptions['gender'] = 'unknown';
+ }
+
+ function addDBData() {
+ $user = User::newFromName( 'UTMale' );
+ if( $user->getID() == 0 ) {
+ $user->addToDatabase();
+ $user->setPassword( 'UTMalePassword' );
+ }
+ //ensure the right gender
+ $user->setOption( 'gender', 'male' );
+ $user->saveSettings();
+
+ $user = User::newFromName( 'UTFemale' );
+ if( $user->getID() == 0 ) {
+ $user->addToDatabase();
+ $user->setPassword( 'UTFemalePassword' );
+ }
+ //ensure the right gender
+ $user->setOption( 'gender', 'female' );
+ $user->saveSettings();
+
+ $user = User::newFromName( 'UTDefaultGender' );
+ if( $user->getID() == 0 ) {
+ $user->addToDatabase();
+ $user->setPassword( 'UTDefaultGenderPassword' );
+ }
+ //ensure the default gender
+ $user->setOption( 'gender', null );
+ $user->saveSettings();
+ }
+
+ /**
+ * test usernames
+ *
+ * @dataProvider dataUserName
+ */
+ function testUserName( $username, $expectedGender ) {
+ $genderCache = GenderCache::singleton();
+ $gender = $genderCache->getGenderOf( $username );
+ $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
+ }
+
+ /**
+ * genderCache should work with user objects, too
+ *
+ * @dataProvider dataUserName
+ */
+ function testUserObjects( $username, $expectedGender ) {
+ $genderCache = GenderCache::singleton();
+ $user = User::newFromName( $username );
+ $gender = $genderCache->getGenderOf( $user );
+ $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
+ }
+
+ function dataUserName() {
+ return array(
+ array( 'UTMale', 'male' ),
+ array( 'UTFemale', 'female' ),
+ array( 'UTDefaultGender', 'unknown' ),
+ array( 'UTNotExist', 'unknown' ),
+ //some not valid user
+ array( '127.0.0.1', 'unknown' ),
+ array( 'user@test', 'unknown' ),
+ );
+ }
+
+ /**
+ * test strip of subpages to avoid unnecessary queries
+ * against the never existing username
+ *
+ * @dataProvider dataStripSubpages
+ */
+ function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+ $genderCache = GenderCache::singleton();
+ $gender = $genderCache->getGenderOf( $pageWithSubpage );
+ $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
+ }
+
+ function dataStripSubpages() {
+ return array(
+ array( 'UTMale/subpage', 'male' ),
+ array( 'UTFemale/subpage', 'female' ),
+ array( 'UTDefaultGender/subpage', 'unknown' ),
+ array( 'UTNotExist/subpage', 'unknown' ),
+ array( '127.0.0.1/subpage', 'unknown' ),
+ );
+ }
+}
}
}
+ public function testRecursiveClean() {
+ $this->backend = $this->singleBackend;
+ $this->doTestRecursiveClean();
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->doTestRecursiveClean();
+ $this->tearDownFiles();
+ }
+
+ function doTestRecursiveClean() {
+ $backendName = $this->backendClass();
+
+ $base = $this->baseStorePath();
+ $dirs = array(
+ "$base/unittest-cont1/a",
+ "$base/unittest-cont1/a/b",
+ "$base/unittest-cont1/a/b/c",
+ "$base/unittest-cont1/a/b/c/d0",
+ "$base/unittest-cont1/a/b/c/d1",
+ "$base/unittest-cont1/a/b/c/d2",
+ "$base/unittest-cont1/a/b/c/d0/1",
+ "$base/unittest-cont1/a/b/c/d0/2",
+ "$base/unittest-cont1/a/b/c/d1/3",
+ "$base/unittest-cont1/a/b/c/d1/4",
+ "$base/unittest-cont1/a/b/c/d2/5",
+ "$base/unittest-cont1/a/b/c/d2/6"
+ );
+ foreach ( $dirs as $dir ) {
+ $status = $this->prepare( array( 'dir' => $dir ) );
+ $this->assertEquals( array(), $status->errors,
+ "Preparing dir $dir succeeded without warnings ($backendName)." );
+ }
+
+ if ( $this->backend instanceof FSFileBackend ) {
+ foreach ( $dirs as $dir ) {
+ $this->assertEquals( true, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+ "Dir $dir exists ($backendName)." );
+ }
+ }
+
+ $status = $this->backend->clean(
+ array( 'dir' => "$base/unittest-cont1", 'recursive' => 1 ) );
+ $this->assertEquals( array(), $status->errors,
+ "Recursive cleaning of dir $dir succeeded without warnings ($backendName)." );
+
+ foreach ( $dirs as $dir ) {
+ $this->assertEquals( false, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+ "Dir $dir no longer exists ($backendName)." );
+ }
+ }
+
// @TODO: testSecure
public function testDoOperations() {
$this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
+ // Expected listing (top files only)
+ $expected = array(
+ "test1.txt",
+ "test2.txt",
+ "test3.txt",
+ "test4.txt",
+ "test5.txt"
+ );
+ sort( $expected );
+
+ // Actual listing (top files only)
+ $list = array();
+ $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
+
foreach ( $files as $file ) { // clean up
$this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
}
foreach ( $iter as $iter ) {} // no errors
}
+ public function testGetDirectoryList() {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestGetDirectoryList();
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestGetDirectoryList();
+ $this->tearDownFiles();
+ }
+
+ private function doTestGetDirectoryList() {
+ $backendName = $this->backendClass();
+
+ $base = $this->baseStorePath();
+ $files = array(
+ "$base/unittest-cont1/test1.txt",
+ "$base/unittest-cont1/test2.txt",
+ "$base/unittest-cont1/test3.txt",
+ "$base/unittest-cont1/subdir1/test1.txt",
+ "$base/unittest-cont1/subdir1/test2.txt",
+ "$base/unittest-cont1/subdir2/test3.txt",
+ "$base/unittest-cont1/subdir2/test4.txt",
+ "$base/unittest-cont1/subdir2/subdir/test1.txt",
+ "$base/unittest-cont1/subdir3/subdir/test2.txt",
+ "$base/unittest-cont1/subdir4/subdir/test3.txt",
+ "$base/unittest-cont1/subdir4/subdir/test4.txt",
+ "$base/unittest-cont1/subdir4/subdir/test5.txt",
+ "$base/unittest-cont1/subdir4/subdir/sub/test0.txt",
+ "$base/unittest-cont1/subdir4/subdir/sub/120-px-file.txt",
+ );
+
+ // Add the files
+ $ops = array();
+ foreach ( $files as $file ) {
+ $this->prepare( array( 'dir' => dirname( $file ) ) );
+ $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
+ }
+ $status = $this->backend->doOperations( $ops );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of files succeeded ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Creation of files succeeded with OK status ($backendName)." );
+
+ // Expected listing
+ $expected = array(
+ "subdir1",
+ "subdir2",
+ "subdir3",
+ "subdir4",
+ );
+ sort( $expected );
+
+ $this->assertEquals( true,
+ $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir1" ) ),
+ "Directory exists in ($backendName)." );
+ $this->assertEquals( true,
+ $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) ),
+ "Directory exists in ($backendName)." );
+ $this->assertEquals( false,
+ $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/test1.txt" ) ),
+ "Directory does not exists in ($backendName)." );
+
+ // Actual listing (no trailing slash)
+ $list = array();
+ $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+ // Actual listing (with trailing slash)
+ $list = array();
+ $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+ // Expected listing
+ $expected = array(
+ "subdir",
+ );
+ sort( $expected );
+
+ // Actual listing (no trailing slash)
+ $list = array();
+ $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+ // Actual listing (with trailing slash)
+ $list = array();
+ $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2/" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+ // Actual listing (using iterator second time)
+ $list = array();
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
+
+ // Expected listing (recursive)
+ $expected = array(
+ "subdir1",
+ "subdir2",
+ "subdir3",
+ "subdir4",
+ "subdir2/subdir",
+ "subdir3/subdir",
+ "subdir4/subdir",
+ "subdir4/subdir/sub",
+ );
+ sort( $expected );
+
+ // Actual listing (recursive)
+ $list = array();
+ $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+ // Expected listing (recursive)
+ $expected = array(
+ "subdir",
+ "subdir/sub",
+ );
+ sort( $expected );
+
+ // Actual listing (recursive)
+ $list = array();
+ $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir4" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+ // Actual listing (recursive, second time)
+ $list = array();
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+ foreach ( $files as $file ) { // clean up
+ $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
+ }
+
+ $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
+ foreach ( $iter as $iter ) {} // no errors
+ }
+
// test helper wrapper for backend prepare() function
private function prepare( array $params ) {
$this->dirsToPrune[] = $params['dir'];
--- /dev/null
+<?php
+
+// It would be great if we were able to use PHPUnit's getMockForAbstractClass
+// instead of the MaintenanceFixup hack below. However, we cannot do
+// without changing the visibility and without working around hacks in
+// Maintenance.php
+//
+// For the same reason, we cannot just use FakeMaintenance.
+
+/**
+ * makes parts of the API of Maintenance that is hidden by protected visibily
+ * visible for testing, and makes up for a stream closing hack in Maintenance.php.
+ *
+ * This class is solely used for being able to test Maintenance right now
+ * without having to apply major refactorings to fix some design issues in
+ * Maintenance.php. Before adding more functions here, please consider whether
+ * this approach is correct, or a refactoring Maintenance to separate concers
+ * is more appropriate.
+ *
+ * Upon refactoring, keep in mind that besides the maintenance scrits themselves
+ * and tests right here, also at least Extension:Maintenance make use of
+ * Maintenance.
+ *
+ * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
+ * finally call simulateShutdown on MaintenanceFixup instance before a test
+ * ends.
+ *
+ */
+class MaintenanceFixup extends Maintenance {
+
+ // --- Making up for the register_shutdown_function hack in Maintenance.php
+
+ /**
+ * The test case that generated this instance.
+ *
+ * This member is motivated by allowing the destructor to check whether or not
+ * the test failed, in order to avoid unnecessary nags about omitted shutdown
+ * simulation.
+ * But as it is already available, we also usi it to flagging tests as failed
+ *
+ * @var MediaWikiTestCase
+ */
+ private $testCase;
+
+ /**
+ * shutdownSimulated === true iff simulateShutdown has done it's work
+ *
+ * @var bool
+ */
+ private $shutdownSimulated = false;
+
+ /**
+ * Simulates what Maintenance wants to happen at script's end.
+ */
+ public function simulateShutdown() {
+
+ if ( $this->shutdownSimulated ) {
+ $this->testCase->fail( __METHOD__ . " called more than once" );
+ }
+
+ // The cleanup action.
+ $this->outputChanneled( false );
+
+ // Bookkeeping that we simulated the clean up.
+ $this->shutdownSimulated = true;
+ }
+
+ // Note that the "public" here does not change visibility
+ public function outputChanneled( $msg, $channel = null ) {
+ if ( $this->shutdownSimulated ) {
+ if ( $msg !== false ) {
+ $this->testCase->fail( "Already past simulated shutdown, but msg is "
+ . "not false. Did the hack in Maintenance.php change? Please "
+ . "adapt the test case or Maintenance.php" );
+ }
+
+ // The current call is the one registered via register_shutdown_function.
+ // We can safely ignore it, as we simulated this one via simulateShutdown
+ // before (if we did not, the destructor of this instance will warn about
+ // it)
+ return;
+ }
+
+ return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
+ }
+
+ /**
+ * Safety net around register_shutdown_function of Maintenance.php
+ */
+ public function __destruct() {
+ if ( ( ! $this->shutdownSimulated ) && ( ! $this->testCase->hasFailed() ) ) {
+ // Someone generated a MaintenanceFixup instance without calling
+ // simulateShutdown. We'd have to raise a PHPUnit exception to correctly
+ // flag this illegal usage. However, we are already in a destruktor, which
+ // would trigger undefined behaviour. Hence, we can only report to the
+ // error output :( Hopefully people read the PHPUnit output.
+ fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " destructed without "
+ . "calling simulateShutdown method. Call simulateShutdown on the "
+ . "instance before it gets destructed." );
+ }
+
+ // The following guard is required, as PHP does not offer default destructors :(
+ if ( is_callable( "parent::__destruct" ) ) {
+ parent::__destruct();
+ }
+ }
+
+ public function __construct( MediaWikiTestCase $testCase ) {
+ parent::__construct();
+ $this->testCase = $testCase;
+ }
+
+
+
+ // --- Making protected functions visible for test
+
+ public function output( $out, $channel = null ) {
+ // Just to make PHP not nag about signature mismatches, we copied
+ // Maintenance::output signature. However, we do not use (or rely on)
+ // those variables. Instead we pass to Maintenance::output whatever we
+ // receive at runtime.
+ return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
+ }
+
+
+
+ // --- Requirements for getting instance of abstract class
+
+ public function execute() {
+ $this->testCase->fail( __METHOD__ . " called unexpectedly" );
+ }
+
+}
+
+class MaintenanceTest extends MediaWikiTestCase {
+
+
+ /**
+ * The main Maintenance instance that is used for testing.
+ *
+ * @var MaintenanceFixup
+ */
+ private $m;
+
+
+ protected function setUp() {
+ parent::setUp();
+ $this->m = new MaintenanceFixup( $this );
+ }
+
+
+ /**
+ * asserts the output before and after simulating shutdown
+ *
+ * This function simulates shutdown of self::m.
+ *
+ * @param $preShutdownOutput string: expected output before simulating shutdown
+ * @param $expectNLAppending bool: Whether or not shutdown simulation is expected
+ * to add a newline to the output. If false, $preShutdownOutput is the
+ * expected output after shutdown simulation. Otherwise,
+ * $preShutdownOutput with an appended newline is the expected output
+ * after shutdown simulation.
+ */
+ private function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
+
+ $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
+ "Output before shutdown simulation" );
+
+ $this->m->simulateShutdown();
+
+ $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
+ $this->expectOutputString( $postShutdownOutput );
+ }
+
+
+ // Although the following tests do not seem to be too consistent (compare for
+ // example the newlines within the test.*StringString tests, or the
+ // test.*Intermittent.* tests), the objective of these tests is not to describe
+ // consistent behaviour, but rather currently existing behaviour.
+
+
+ function testOutputEmpty() {
+ $this->m->output( "" );
+ $this->assertOutputPrePostShutdown( "", False );
+ }
+
+ function testOutputString() {
+ $this->m->output( "foo" );
+ $this->assertOutputPrePostShutdown( "foo", False );
+ }
+
+ function testOutputStringString() {
+ $this->m->output( "foo" );
+ $this->m->output( "bar" );
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testOutputStringNL() {
+ $this->m->output( "foo\n" );
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testOutputStringNLNL() {
+ $this->m->output( "foo\n\n" );
+ $this->assertOutputPrePostShutdown( "foo\n\n", False );
+ }
+
+ function testOutputStringNLString() {
+ $this->m->output( "foo\nbar" );
+ $this->assertOutputPrePostShutdown( "foo\nbar", False );
+ }
+
+ function testOutputStringNLStringNL() {
+ $this->m->output( "foo\nbar\n" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputStringNLStringNLLinewise() {
+ $this->m->output( "foo\n" );
+ $this->m->output( "bar\n" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputStringNLStringNLArbitrary() {
+ $this->m->output( "" );
+ $this->m->output( "foo" );
+ $this->m->output( "" );
+ $this->m->output( "\n" );
+ $this->m->output( "ba" );
+ $this->m->output( "" );
+ $this->m->output( "r\n" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputStringNLStringNLArbitraryAgain() {
+ $this->m->output( "" );
+ $this->m->output( "foo" );
+ $this->m->output( "" );
+ $this->m->output( "\nb" );
+ $this->m->output( "a" );
+ $this->m->output( "" );
+ $this->m->output( "r\n" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputWNullChannelEmpty() {
+ $this->m->output( "", null );
+ $this->assertOutputPrePostShutdown( "", False );
+ }
+
+ function testOutputWNullChannelString() {
+ $this->m->output( "foo", null );
+ $this->assertOutputPrePostShutdown( "foo", False );
+ }
+
+ function testOutputWNullChannelStringString() {
+ $this->m->output( "foo", null );
+ $this->m->output( "bar", null );
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testOutputWNullChannelStringNL() {
+ $this->m->output( "foo\n", null );
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testOutputWNullChannelStringNLNL() {
+ $this->m->output( "foo\n\n", null );
+ $this->assertOutputPrePostShutdown( "foo\n\n", False );
+ }
+
+ function testOutputWNullChannelStringNLString() {
+ $this->m->output( "foo\nbar", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar", False );
+ }
+
+ function testOutputWNullChannelStringNLStringNL() {
+ $this->m->output( "foo\nbar\n", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputWNullChannelStringNLStringNLLinewise() {
+ $this->m->output( "foo\n", null );
+ $this->m->output( "bar\n", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputWNullChannelStringNLStringNLArbitrary() {
+ $this->m->output( "", null );
+ $this->m->output( "foo", null );
+ $this->m->output( "", null );
+ $this->m->output( "\n", null );
+ $this->m->output( "ba", null );
+ $this->m->output( "", null );
+ $this->m->output( "r\n", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputWNullChannelStringNLStringNLArbitraryAgain() {
+ $this->m->output( "", null );
+ $this->m->output( "foo", null );
+ $this->m->output( "", null );
+ $this->m->output( "\nb", null );
+ $this->m->output( "a", null );
+ $this->m->output( "", null );
+ $this->m->output( "r\n", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputWChannelString() {
+ $this->m->output( "foo", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo", True );
+ }
+
+ function testOutputWChannelStringNL() {
+ $this->m->output( "foo\n", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo", True );
+ }
+
+ function testOutputWChannelStringNLNL() {
+ // If this test fails, note that output takes strings with double line
+ // endings (although output's implementation in this situation calls
+ // outputChanneled with a string ending in a nl ... which is not allowed
+ // according to the documentation of outputChanneled)
+ $this->m->output( "foo\n\n", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\n", True );
+ }
+
+ function testOutputWChannelStringNLString() {
+ $this->m->output( "foo\nbar", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testOutputWChannelStringNLStringNL() {
+ $this->m->output( "foo\nbar\n", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testOutputWChannelStringNLStringNLLinewise() {
+ $this->m->output( "foo\n", "bazChannel" );
+ $this->m->output( "bar\n", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar", True );
+ }
+
+ function testOutputWChannelStringNLStringNLArbitrary() {
+ $this->m->output( "", "bazChannel" );
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->output( "", "bazChannel" );
+ $this->m->output( "\n", "bazChannel" );
+ $this->m->output( "ba", "bazChannel" );
+ $this->m->output( "", "bazChannel" );
+ $this->m->output( "r\n", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar", True );
+ }
+
+ function testOutputWChannelStringNLStringNLArbitraryAgain() {
+ $this->m->output( "", "bazChannel" );
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->output( "", "bazChannel" );
+ $this->m->output( "\nb", "bazChannel" );
+ $this->m->output( "a", "bazChannel" );
+ $this->m->output( "", "bazChannel" );
+ $this->m->output( "r\n", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testOutputWMultipleChannelsChannelChange() {
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->output( "bar", "bazChannel" );
+ $this->m->output( "qux", "quuxChannel" );
+ $this->m->output( "corge", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+ }
+
+ function testOutputWMultipleChannelsChannelChangeNL() {
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->output( "bar\n", "bazChannel" );
+ $this->m->output( "qux\n", "quuxChannel" );
+ $this->m->output( "corge", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+ }
+
+ function testOutputWAndWOChannelStringStartWO() {
+ $this->m->output( "foo" );
+ $this->m->output( "bar", "bazChannel" );
+ $this->m->output( "qux" );
+ $this->m->output( "quux", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar\nquxquux", True );
+ }
+
+ function testOutputWAndWOChannelStringStartW() {
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->output( "bar" );
+ $this->m->output( "qux", "bazChannel" );
+ $this->m->output( "quux" );
+ $this->assertOutputPrePostShutdown( "foo\nbarqux\nquux", False );
+ }
+
+ function testOutputWChannelTypeSwitch() {
+ $this->m->output( "foo", 1 );
+ $this->m->output( "bar", 1.0 );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testOutputIntermittentEmpty() {
+ $this->m->output( "foo" );
+ $this->m->output( "" );
+ $this->m->output( "bar" );
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testOutputIntermittentFalse() {
+ $this->m->output( "foo" );
+ $this->m->output( false );
+ $this->m->output( "bar" );
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testOutputIntermittentFalseAfterOtherChannel() {
+ $this->m->output( "qux", "quuxChannel" );
+ $this->m->output( "foo" );
+ $this->m->output( false );
+ $this->m->output( "bar" );
+ $this->assertOutputPrePostShutdown( "qux\nfoobar", False );
+ }
+
+ function testOutputWNullChannelIntermittentEmpty() {
+ $this->m->output( "foo", null );
+ $this->m->output( "", null );
+ $this->m->output( "bar", null );
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testOutputWNullChannelIntermittentFalse() {
+ $this->m->output( "foo", null );
+ $this->m->output( false, null );
+ $this->m->output( "bar", null );
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testOutputWChannelIntermittentEmpty() {
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->output( "", "bazChannel" );
+ $this->m->output( "bar", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar", True );
+ }
+
+ function testOutputWChannelIntermittentFalse() {
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->output( false, "bazChannel" );
+ $this->m->output( "bar", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar", True );
+ }
+
+ // Note that (per documentation) outputChanneled does take strings that end
+ // in \n, hence we do not test such strings.
+
+ function testOutputChanneledEmpty() {
+ $this->m->outputChanneled( "" );
+ $this->assertOutputPrePostShutdown( "\n", False );
+ }
+
+ function testOutputChanneledString() {
+ $this->m->outputChanneled( "foo" );
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testOutputChanneledStringString() {
+ $this->m->outputChanneled( "foo" );
+ $this->m->outputChanneled( "bar" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputChanneledStringNLString() {
+ $this->m->outputChanneled( "foo\nbar" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputChanneledStringNLStringNLArbitraryAgain() {
+ $this->m->outputChanneled( "" );
+ $this->m->outputChanneled( "foo" );
+ $this->m->outputChanneled( "" );
+ $this->m->outputChanneled( "\nb" );
+ $this->m->outputChanneled( "a" );
+ $this->m->outputChanneled( "" );
+ $this->m->outputChanneled( "r" );
+ $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
+ }
+
+ function testOutputChanneledWNullChannelEmpty() {
+ $this->m->outputChanneled( "", null );
+ $this->assertOutputPrePostShutdown( "\n", False );
+ }
+
+ function testOutputChanneledWNullChannelString() {
+ $this->m->outputChanneled( "foo", null );
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testOutputChanneledWNullChannelStringString() {
+ $this->m->outputChanneled( "foo", null );
+ $this->m->outputChanneled( "bar", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputChanneledWNullChannelStringNLString() {
+ $this->m->outputChanneled( "foo\nbar", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputChanneledWNullChannelStringNLStringNLArbitraryAgain() {
+ $this->m->outputChanneled( "", null );
+ $this->m->outputChanneled( "foo", null );
+ $this->m->outputChanneled( "", null );
+ $this->m->outputChanneled( "\nb", null );
+ $this->m->outputChanneled( "a", null );
+ $this->m->outputChanneled( "", null );
+ $this->m->outputChanneled( "r", null );
+ $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
+ }
+
+ function testOutputChanneledWChannelString() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo", True );
+ }
+
+ function testOutputChanneledWChannelStringNLString() {
+ $this->m->outputChanneled( "foo\nbar", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testOutputChanneledWChannelStringString() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( "bar", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar", True );
+ }
+
+ function testOutputChanneledWChannelStringNLStringNLArbitraryAgain() {
+ $this->m->outputChanneled( "", "bazChannel" );
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( "", "bazChannel" );
+ $this->m->outputChanneled( "\nb", "bazChannel" );
+ $this->m->outputChanneled( "a", "bazChannel" );
+ $this->m->outputChanneled( "", "bazChannel" );
+ $this->m->outputChanneled( "r", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testOutputChanneledWMultipleChannelsChannelChange() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( "bar", "bazChannel" );
+ $this->m->outputChanneled( "qux", "quuxChannel" );
+ $this->m->outputChanneled( "corge", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+ }
+
+ function testOutputChanneledWMultipleChannelsChannelChangeEnclosedNull() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( "bar", null );
+ $this->m->outputChanneled( "qux", null );
+ $this->m->outputChanneled( "corge", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
+ }
+
+ function testOutputChanneledWMultipleChannelsChannelAfterNullChange() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( "bar", null );
+ $this->m->outputChanneled( "qux", null );
+ $this->m->outputChanneled( "corge", "quuxChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
+ }
+
+ function testOutputChanneledWAndWOChannelStringStartWO() {
+ $this->m->outputChanneled( "foo" );
+ $this->m->outputChanneled( "bar", "bazChannel" );
+ $this->m->outputChanneled( "qux" );
+ $this->m->outputChanneled( "quux", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux", True );
+ }
+
+ function testOutputChanneledWAndWOChannelStringStartW() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( "bar" );
+ $this->m->outputChanneled( "qux", "bazChannel" );
+ $this->m->outputChanneled( "quux" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux\n", False );
+ }
+
+ function testOutputChanneledWChannelTypeSwitch() {
+ $this->m->outputChanneled( "foo", 1 );
+ $this->m->outputChanneled( "bar", 1.0 );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testOutputChanneledWOChannelIntermittentEmpty() {
+ $this->m->outputChanneled( "foo" );
+ $this->m->outputChanneled( "" );
+ $this->m->outputChanneled( "bar" );
+ $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
+ }
+
+ function testOutputChanneledWOChannelIntermittentFalse() {
+ $this->m->outputChanneled( "foo" );
+ $this->m->outputChanneled( false );
+ $this->m->outputChanneled( "bar" );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputChanneledWNullChannelIntermittentEmpty() {
+ $this->m->outputChanneled( "foo", null );
+ $this->m->outputChanneled( "", null );
+ $this->m->outputChanneled( "bar", null );
+ $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
+ }
+
+ function testOutputChanneledWNullChannelIntermittentFalse() {
+ $this->m->outputChanneled( "foo", null );
+ $this->m->outputChanneled( false, null );
+ $this->m->outputChanneled( "bar", null );
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testOutputChanneledWChannelIntermittentEmpty() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( "", "bazChannel" );
+ $this->m->outputChanneled( "bar", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foobar", True );
+ }
+
+ function testOutputChanneledWChannelIntermittentFalse() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->outputChanneled( false, "bazChannel" );
+ $this->m->outputChanneled( "bar", "bazChannel" );
+ $this->assertOutputPrePostShutdown( "foo\nbar", True );
+ }
+
+ function testCleanupChanneledClean() {
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "", False );
+ }
+
+ function testCleanupChanneledAfterOutput() {
+ $this->m->output( "foo" );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo", False );
+ }
+
+ function testCleanupChanneledAfterOutputWNullChannel() {
+ $this->m->output( "foo", null );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo", False );
+ }
+
+ function testCleanupChanneledAfterOutputWChannel() {
+ $this->m->output( "foo", "bazChannel" );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testCleanupChanneledAfterNLOutput() {
+ $this->m->output( "foo\n" );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testCleanupChanneledAfterNLOutputWNullChannel() {
+ $this->m->output( "foo\n", null );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testCleanupChanneledAfterNLOutputWChannel() {
+ $this->m->output( "foo\n", "bazChannel" );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testCleanupChanneledAfterOutputChanneledWOChannel() {
+ $this->m->outputChanneled( "foo" );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testCleanupChanneledAfterOutputChanneledWNullChannel() {
+ $this->m->outputChanneled( "foo", null );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testCleanupChanneledAfterOutputChanneledWChannel() {
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $this->m->cleanupChanneled();
+ $this->assertOutputPrePostShutdown( "foo\n", False );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutput() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->output( "foo" );
+ $m2->output( "bar" );
+
+ $this->assertEquals( "foobar", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutputWNullChannel() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->output( "foo", null );
+ $m2->output( "bar", null );
+
+ $this->assertEquals( "foobar", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foobar", False );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutputWChannel() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->output( "foo", "bazChannel" );
+ $m2->output( "bar", "bazChannel" );
+
+ $this->assertEquals( "foobar", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foobar\n", True );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutputWNullChannelNL() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->output( "foo\n", null );
+ $m2->output( "bar\n", null );
+
+ $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutputWChannelNL() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->output( "foo\n", "bazChannel" );
+ $m2->output( "bar\n", "bazChannel" );
+
+ $this->assertEquals( "foobar", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foobar\n", True );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutputChanneled() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->outputChanneled( "foo" );
+ $m2->outputChanneled( "bar" );
+
+ $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutputChanneledWNullChannel() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->outputChanneled( "foo", null );
+ $m2->outputChanneled( "bar", null );
+
+ $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionOutputChanneledWChannel() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $m2->outputChanneled( "bar", "bazChannel" );
+
+ $this->assertEquals( "foobar", $this->getActualOutput(),
+ "Output before shutdown simulation (m2)" );
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foobar\n", True );
+ }
+
+ function testMultipleMaintenanceObjectsInteractionCleanupChanneledWChannel() {
+ $m2 = new MaintenanceFixup( $this );
+
+ $this->m->outputChanneled( "foo", "bazChannel" );
+ $m2->outputChanneled( "bar", "bazChannel" );
+
+ $this->assertEquals( "foobar", $this->getActualOutput(),
+ "Output before first cleanup" );
+ $this->m->cleanupChanneled();
+ $this->assertEquals( "foobar\n", $this->getActualOutput(),
+ "Output after first cleanup" );
+ $m2->cleanupChanneled();
+ $this->assertEquals( "foobar\n\n", $this->getActualOutput(),
+ "Output after second cleanup" );
+
+ $m2->simulateShutdown();
+ $this->assertOutputPrePostShutdown( "foobar\n\n", False );
+ }
+
+
+}
\ No newline at end of file
require_once( "$IP/maintenance/Maintenance.php" );
class PHPUnitMaintClass extends Maintenance {
+
+ function __construct() {
+ parent::__construct();
+ $this->addOption( 'with-phpunitdir'
+ , 'Directory to include PHPUnit from, for example when using a git fetchout from upstream. Path will be prepended to PHP `include_path`.'
+ , false # not required
+ , true # need arg
+ );
+ }
+
public function finalSetup() {
parent::finalSetup();
$wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
}
- public function execute() { }
+
+ public function execute() {
+ global $IP;
+
+ # Make sure we have --configuration or PHPUnit might complain
+ if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
+ //Hack to eliminate the need to use the Makefile (which sucks ATM)
+ array_splice( $_SERVER['argv'], 1, 0,
+ array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
+ }
+
+ # --with-phpunitdir let us override the default PHPUnit version
+ if( $phpunitDir = $this->getOption( 'with-phpunitdir' ) ) {
+ # Sanity checks
+ if( !is_dir($phpunitDir) ) {
+ $this->error( "--with-phpunitdir should be set to an existing directory", 1 );
+ }
+ if( !is_readable( $phpunitDir."/PHPUnit/Runner/Version.php" ) ) {
+ $this->error( "No usable PHPUnit installation in $phpunitDir.\nAborting.\n", 1 );
+ }
+
+ # Now prepends provided PHPUnit directory
+ $this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
+ set_include_path( $phpunitDir
+ . PATH_SEPARATOR . get_include_path() );
+
+ # Cleanup $args array so the option and its value do not
+ # pollute PHPUnit
+ $key = array_search( '--with-phpunitdir', $_SERVER['argv'] );
+ unset( $_SERVER['argv'][$key] ); // the option
+ unset( $_SERVER['argv'][$key+1] ); // its value
+ $_SERVER['argv'] = array_values( $_SERVER['argv'] );
+
+ }
+ }
+
public function getDbType() {
return Maintenance::DB_ADMIN;
}
$maintClass = 'PHPUnitMaintClass';
require( RUN_MAINTENANCE_IF_MAIN );
-if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
- //Hack to eliminate the need to use the Makefile (which sucks ATM)
- array_splice( $_SERVER['argv'], 1, 0,
- array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
-}
-
require_once( 'PHPUnit/Runner/Version.php' );
-if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '<' ) ) {
- die( 'PHPUnit 3.5 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+
+if( PHPUnit_Runner_Version::id() !== '@package_version@'
+ && version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' ) ) {
+ die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
}
require_once( 'PHPUnit/Autoload.php' );
require_once( "$IP/tests/TestsAutoLoader.php" );
MediaWikiPHPUnitCommand::main();
-