* Manuel Menal
* Marcin Cieślak
* Marcus Buck
+* Mark A. Pelletier
* Marooned
* Mathias Ertl
* Matthew Britton
"in-place", as long as you have the necessary prerequisites available.
Required software:
-* Web server with PHP 5.2.3 or higher.
+* Web server with PHP 5.3.2 or higher.
* A SQL server, the following types are supported
** MySQL 5.0.2 or higher
** PostgreSQL 8.3 or higher
MediaWiki 1.20 is an alpha-quality branch and is not recommended for use in
production.
+=== PHP 5.3 now required ===
+Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
+upgrade PHP if you have not done so prior to upgrading MediaWiki.
+
=== Configuration changes in 1.20 ===
+* $wgGitRepositoryViewers defines a mapping from Git remote repository to the
+ Gitweb instance URL used in Special:Version
* `$wgUsePathInfo = true;` is no longer needed to make $wgArticlePath work on servers
using like nginx, lighttpd, and apache over fastcgi. MediaWiki now always extracts
path info from REQUEST_URI if it's available.
* 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 5445) Now remove autoblocks when a user is unblocked.
=== Bug fixes in 1.20 ===
* (bug 30245) Use the correct way to construct a log page 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.
+* (bug 32604) Some messages needs escaping of wikitext inside username
+* (bug 36537) Rename wfArrayToCGI to wfArrayToCgi for consistency with wfCgiToArray.
=== API changes in 1.20 ===
* (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
* (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
+* (bug 34927) Output media_type for list=filearchive
+* (bug 28814) add properties to output of action=parse
+* (bug 33224) add variants of content language to meta=siteinfo
=== Languages updated in 1.20 ===
regularly. Below only new and removed languages are listed, as well as
changes to languages because of Bugzilla reports.
+* Mizo (lus) added.
+* Santali (sat) added.
* (bug 34192) Namespace gender aliases for Albanian languages (sq & aln).
* (bug 35541) Namespace gender aliases for Croatian (hr).
-* Mizo (lus) added.
* (bug 36012) Space in $separatorTransformTable should be non-breaking in
Portuguese, Esperanto and Udmurt.
== Compatibility ==
-MediaWiki 1.20 requires PHP 5.2.3. PHP 4 is no longer supported.
+MediaWiki 1.20 requires PHP 5.3.2. PHP 4 is no longer supported.
MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
support for them is somewhat less mature. There is experimental support for IBM
define( 'MW_API', true );
// Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
wfPHPVersionError( 'api.php' );
}
* @return string Return the text of this revision
*/
public function getContent() {
- global $wgUser;
-
wfProfileIn( __METHOD__ );
if ( $this->mPage->getID() === 0 ) {
$text = '';
}
} else {
- $text = wfMsgExt( $wgUser->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
+ $text = wfMsgExt( $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
}
wfProfileOut( __METHOD__ );
* @return int The old id for the request
*/
public function getOldIDFromRequest() {
- global $wgRequest;
-
$this->mRedirectUrl = false;
- $oldid = $wgRequest->getIntOrNull( 'oldid' );
+ $request = $this->getContext()->getRequest();
+ $oldid = $request->getIntOrNull( 'oldid' );
if ( $oldid === null ) {
return 0;
}
}
- if ( $wgRequest->getVal( 'direction' ) == 'next' ) {
+ if ( $request->getVal( 'direction' ) == 'next' ) {
$nextid = $this->getTitle()->getNextRevisionID( $oldid );
if ( $nextid ) {
$oldid = $nextid;
} else {
$this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
}
- } elseif ( $wgRequest->getVal( 'direction' ) == 'prev' ) {
+ } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
$previd = $this->getTitle()->getPreviousRevisionID( $oldid );
if ( $previd ) {
$oldid = $previd;
* page of the given title.
*/
public function view() {
- global $wgUser, $wgOut, $wgRequest, $wgParser;
- global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+ global $wgParser, $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
wfProfileIn( __METHOD__ );
# the first call of this method even if $oldid is used way below.
$oldid = $this->getOldID();
+ $user = $this->getContext()->getUser();
# Another whitelist check in case getOldID() is altering the title
- $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $wgUser );
+ $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
if ( count( $permErrors ) ) {
wfDebug( __METHOD__ . ": denied on secondary read check\n" );
wfProfileOut( __METHOD__ );
throw new PermissionsError( 'read', $permErrors );
}
+ $outputPage = $this->getContext()->getOutput();
# getOldID() may as well want us to redirect somewhere else
if ( $this->mRedirectUrl ) {
- $wgOut->redirect( $this->mRedirectUrl );
+ $outputPage->redirect( $this->mRedirectUrl );
wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
wfProfileOut( __METHOD__ );
}
# If we got diff in the query, we want to see a diff page instead of the article.
- if ( $wgRequest->getCheck( 'diff' ) ) {
+ if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
wfDebug( __METHOD__ . ": showing diff page\n" );
$this->showDiffPage();
wfProfileOut( __METHOD__ );
}
# Set page title (may be overridden by DISPLAYTITLE)
- $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
+ $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
- $wgOut->setArticleFlag( true );
+ $outputPage->setArticleFlag( true );
# Allow frames by default
- $wgOut->allowClickjacking();
+ $outputPage->allowClickjacking();
$parserCache = ParserCache::singleton();
$parserOptions = $this->getParserOptions();
# Render printable version, use printable version cache
- if ( $wgOut->isPrintable() ) {
+ if ( $outputPage->isPrintable() ) {
$parserOptions->setIsPrintable( true );
$parserOptions->setEditSection( false );
} elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit' ) ) {
# Try client and file cache
if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
if ( $wgUseETag ) {
- $wgOut->setETag( $parserCache->getETag( $this, $parserOptions ) );
+ $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
}
# Is it client cached?
- if ( $wgOut->checkLastModified( $this->mPage->getTouched() ) ) {
+ if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
wfDebug( __METHOD__ . ": done 304\n" );
wfProfileOut( __METHOD__ );
} elseif ( $wgUseFileCache && $this->tryFileCache() ) {
wfDebug( __METHOD__ . ": done file cache\n" );
# tell wgOut that output is taken care of
- $wgOut->disable();
- $this->mPage->doViewUpdates( $wgUser );
+ $outputPage->disable();
+ $this->mPage->doViewUpdates( $user );
wfProfileOut( __METHOD__ );
return;
# Should the parser cache be used?
$useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
- if ( $wgUser->getStubThreshold() ) {
+ if ( $user->getStubThreshold() ) {
wfIncrStats( 'pcache_miss_stub' );
}
} else {
wfDebug( __METHOD__ . ": showing parser cache contents\n" );
}
- $wgOut->addParserOutput( $this->mParserOutput );
+ $outputPage->addParserOutput( $this->mParserOutput );
# Ensure that UI elements requiring revision ID have
# the correct version information.
- $wgOut->setRevisionId( $this->mPage->getLatest() );
+ $outputPage->setRevisionId( $this->mPage->getLatest() );
# Preload timestamp to avoid a DB hit
$cachedTimestamp = $this->mParserOutput->getTimestamp();
if ( $cachedTimestamp !== null ) {
- $wgOut->setRevisionTimestamp( $cachedTimestamp );
+ $outputPage->setRevisionTimestamp( $cachedTimestamp );
$this->mPage->setTimestamp( $cachedTimestamp );
}
$outputDone = true;
# Ensure that UI elements requiring revision ID have
# the correct version information.
- $wgOut->setRevisionId( $this->getRevIdFetched() );
+ $outputPage->setRevisionId( $this->getRevIdFetched() );
# Preload timestamp to avoid a DB hit
- $wgOut->setRevisionTimestamp( $this->getTimestamp() );
+ $outputPage->setRevisionTimestamp( $this->getTimestamp() );
# Pages containing custom CSS or JavaScript get special treatment
if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
$this->showCssOrJsPage();
$outputDone = true;
- } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $wgOut ) ) ) {
+ } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
# Allow extensions do their own custom view for certain pages
$outputDone = true;
} else {
if ( $rt ) {
wfDebug( __METHOD__ . ": showing redirect=no page\n" );
# Viewing a redirect page (e.g. with parameter redirect=no)
- $wgOut->addHTML( $this->viewRedirect( $rt ) );
+ $outputPage->addHTML( $this->viewRedirect( $rt ) );
# Parse just to get categories, displaytitle, etc.
$this->mParserOutput = $wgParser->parse( $text, $this->getTitle(), $parserOptions );
- $wgOut->addParserOutputNoText( $this->mParserOutput );
+ $outputPage->addParserOutputNoText( $this->mParserOutput );
$outputDone = true;
}
}
if ( !$poolArticleView->execute() ) {
$error = $poolArticleView->getError();
if ( $error ) {
- $wgOut->clearHTML(); // for release() errors
- $wgOut->enableClientCache( false );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
+ $outputPage->clearHTML(); // for release() errors
+ $outputPage->enableClientCache( false );
+ $outputPage->setRobotPolicy( 'noindex,nofollow' );
$errortext = $error->getWikiText( false, 'view-pool-error' );
- $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+ $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
}
# Connection or timeout error
wfProfileOut( __METHOD__ );
}
$this->mParserOutput = $poolArticleView->getParserOutput();
- $wgOut->addParserOutput( $this->mParserOutput );
+ $outputPage->addParserOutput( $this->mParserOutput );
# Don't cache a dirty ParserOutput object
if ( $poolArticleView->getIsDirty() ) {
- $wgOut->setSquidMaxage( 0 );
- $wgOut->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
+ $outputPage->setSquidMaxage( 0 );
+ $outputPage->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
}
$outputDone = true;
if ( $this->getTitle()->isMainPage() ) {
$msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
if ( !$msg->isDisabled() ) {
- $wgOut->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
+ $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
}
}
# Check for any __NOINDEX__ tags on the page using $pOutput
$policy = $this->getRobotPolicy( 'view', $pOutput );
- $wgOut->setIndexPolicy( $policy['index'] );
- $wgOut->setFollowPolicy( $policy['follow'] );
+ $outputPage->setIndexPolicy( $policy['index'] );
+ $outputPage->setFollowPolicy( $policy['follow'] );
$this->showViewFooter();
- $this->mPage->doViewUpdates( $wgUser );
+ $this->mPage->doViewUpdates( $user );
wfProfileOut( __METHOD__ );
}
* @param $pOutput ParserOutput
*/
public function adjustDisplayTitle( ParserOutput $pOutput ) {
- global $wgOut;
# Adjust the title if it was set by displaytitle, -{T|}- or language conversion
$titleText = $pOutput->getTitleText();
if ( strval( $titleText ) !== '' ) {
- $wgOut->setPageTitle( $titleText );
+ $this->getContext()->getOutput()->setPageTitle( $titleText );
}
}
* Article::view() only, other callers should use the DifferenceEngine class.
*/
public function showDiffPage() {
- global $wgRequest, $wgUser;
-
- $diff = $wgRequest->getVal( 'diff' );
- $rcid = $wgRequest->getVal( 'rcid' );
- $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
- $purge = $wgRequest->getVal( 'action' ) == 'purge';
- $unhide = $wgRequest->getInt( 'unhide' ) == 1;
+ $request = $this->getContext()->getRequest();
+ $user = $this->getContext()->getUser();
+ $diff = $request->getVal( 'diff' );
+ $rcid = $request->getVal( 'rcid' );
+ $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
+ $purge = $request->getVal( 'action' ) == 'purge';
+ $unhide = $request->getInt( 'unhide' ) == 1;
$oldid = $this->getOldID();
$de = new DifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
if ( $diff == 0 || $diff == $this->mPage->getLatest() ) {
# Run view updates for current revision only
- $this->mPage->doViewUpdates( $wgUser );
+ $this->mPage->doViewUpdates( $user );
}
}
* page views.
*/
protected function showCssOrJsPage() {
- global $wgOut;
-
$dir = $this->getContext()->getLanguage()->getDir();
$lang = $this->getContext()->getLanguage()->getCode();
- $wgOut->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
'clearyourcache' );
// Give hooks a chance to customise the output
- if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $wgOut ) ) ) {
+ if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
// Wrap the whole lot in a <pre> and don't parse
$m = array();
preg_match( '!\.(css|js)$!u', $this->getTitle()->getText(), $m );
- $wgOut->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
- $wgOut->addHTML( htmlspecialchars( $this->mContent ) );
- $wgOut->addHTML( "\n</pre>\n" );
+ $outputPage->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
+ $outputPage->addHTML( htmlspecialchars( $this->mContent ) );
+ $outputPage->addHTML( "\n</pre>\n" );
}
}
* TODO: actions other than 'view'
*/
public function getRobotPolicy( $action, $pOutput ) {
- global $wgOut, $wgArticleRobotPolicies, $wgNamespaceRobotPolicies;
- global $wgDefaultRobotPolicy, $wgRequest;
+ global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
$ns = $this->getTitle()->getNamespace();
'index' => 'noindex',
'follow' => 'nofollow'
);
- } elseif ( $wgOut->isPrintable() ) {
+ } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
# Discourage indexing of printable versions, but encourage following
return array(
'index' => 'noindex',
'follow' => 'follow'
);
- } elseif ( $wgRequest->getInt( 'curid' ) ) {
+ } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
# For ?curid=x urls, disallow indexing
return array(
'index' => 'noindex',
/**
* If this request is a redirect view, send "redirected from" subtitle to
- * $wgOut. Returns true if the header was needed, false if this is not a
- * redirect view. Handles both local and remote redirects.
+ * the output. Returns true if the header was needed, false if this is not
+ * a redirect view. Handles both local and remote redirects.
*
* @return boolean
*/
public function showRedirectedFromHeader() {
- global $wgOut, $wgRequest, $wgRedirectSources;
+ global $wgRedirectSources;
+ $outputPage = $this->getContext()->getOutput();
- $rdfrom = $wgRequest->getVal( 'rdfrom' );
+ $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
if ( isset( $this->mRedirectedFrom ) ) {
// This is an internally redirected page view.
array( 'redirect' => 'no' )
);
- $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+ $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
// Set the fragment if one was specified in the redirect
if ( strval( $this->getTitle()->getFragment() ) != '' ) {
$fragment = Xml::escapeJsString( $this->getTitle()->getFragmentForURL() );
- $wgOut->addInlineScript( "redirectToFragment(\"$fragment\");" );
+ $outputPage->addInlineScript( "redirectToFragment(\"$fragment\");" );
}
// Add a <link rel="canonical"> tag
- $wgOut->addLink( array( 'rel' => 'canonical',
+ $outputPage->addLink( array( 'rel' => 'canonical',
'href' => $this->getTitle()->getLocalURL() )
);
- // Tell $wgOut the user arrived at this article through a redirect
- $wgOut->setRedirectedFrom( $this->mRedirectedFrom );
+ // Tell the output object that the user arrived at this article through a redirect
+ $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
return true;
}
// If it was reported from a trusted site, supply a backlink.
if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
$redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
- $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+ $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
return true;
}
* [[MediaWiki:Talkpagetext]]. For Article::view().
*/
public function showNamespaceHeader() {
- global $wgOut;
-
if ( $this->getTitle()->isTalkPage() ) {
if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
- $wgOut->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1\n</div>", array( 'talkpageheader' ) );
+ $this->getContext()->getOutput()->wrapWikiMsg( "<div class=\"mw-talkpageheader\">\n$1\n</div>", array( 'talkpageheader' ) );
}
}
}
* Show the footer section of an ordinary page view
*/
public function showViewFooter() {
- global $wgOut;
-
# check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
if ( $this->getTitle()->getNamespace() == NS_USER_TALK && IP::isValid( $this->getTitle()->getText() ) ) {
- $wgOut->addWikiMsg( 'anontalkpagetext' );
+ $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
}
# If we have been passed an &rcid= parameter, we want to give the user a
* desired, does nothing.
*/
public function showPatrolFooter() {
- global $wgOut, $wgRequest, $wgUser;
-
- $rcid = $wgRequest->getVal( 'rcid' );
+ $request = $this->getContext()->getRequest();
+ $outputPage = $this->getContext()->getOutput();
+ $rcid = $request->getVal( 'rcid' );
if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol' ) ) {
return;
}
- $token = $wgUser->getEditToken( $rcid );
- $wgOut->preventClickjacking();
+ $token = $request->getUser()->getEditToken( $rcid );
+ $outputPage->preventClickjacking();
- $wgOut->addHTML(
+ $outputPage->addHTML(
"<div class='patrollink'>" .
wfMsgHtml(
'markaspatrolledlink',
* namespace, show the default message text. To be called from Article::view().
*/
public function showMissingArticle() {
- global $wgOut, $wgRequest, $wgUser, $wgSend404Code;
+ global $wgSend404Code;
+ $outputPage = $this->getContext()->getOutput();
# Show info in user (talk) namespace. Does the user exist? Is he blocked?
if ( $this->getTitle()->getNamespace() == NS_USER || $this->getTitle()->getNamespace() == NS_USER_TALK ) {
$ip = User::isIP( $rootPart );
if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
- $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
+ $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
} elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
LogEventsList::showLogExtract(
- $wgOut,
+ $outputPage,
'block',
$user->getUserPage()->getPrefixedText(),
'',
wfRunHooks( 'ShowMissingArticle', array( $this ) );
# Show delete and move logs
- LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->getTitle()->getPrefixedText(), '',
+ LogEventsList::showLogExtract( $outputPage, array( 'delete', 'move' ), $this->getTitle()->getPrefixedText(), '',
array( 'lim' => 10,
'conds' => array( "log_action != 'revision'" ),
'showIfEmpty' => false,
if ( !$this->mPage->hasViewableContent() && $wgSend404Code ) {
// If there's no backing content, send a 404 Not Found
// for better machine handling of broken links.
- $wgRequest->response()->header( "HTTP/1.1 404 Not Found" );
+ $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
}
$hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
// Use the default message text
$text = $this->getTitle()->getDefaultMessageText();
} else {
- $createErrors = $this->getTitle()->getUserPermissionsErrors( 'create', $wgUser );
- $editErrors = $this->getTitle()->getUserPermissionsErrors( 'edit', $wgUser );
+ $createErrors = $this->getTitle()->getUserPermissionsErrors( 'create', $this->getContext()->getUser() );
+ $editErrors = $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getContext()->getUser() );
$errors = array_merge( $createErrors, $editErrors );
if ( !count( $errors ) ) {
}
$text = "<div class='noarticletext'>\n$text\n</div>";
- $wgOut->addWikiText( $text );
+ $outputPage->addWikiText( $text );
}
/**
* If the revision requested for view is deleted, check permissions.
- * Send either an error message or a warning header to $wgOut.
+ * Send either an error message or a warning header to the output.
*
* @return boolean true if the view is allowed, false if not.
*/
public function showDeletedRevisionHeader() {
- global $wgOut, $wgRequest;
-
if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
// Not deleted
return true;
}
+ $outputPage = $this->getContext()->getOutput();
// If the user is not allowed to see it...
if ( !$this->mRevision->userCan( Revision::DELETED_TEXT ) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
'rev-deleted-text-permission' );
return false;
// If the user needs to confirm that they want to see it...
- } elseif ( $wgRequest->getInt( 'unhide' ) != 1 ) {
+ } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
# Give explanation and add a link to view the revision...
$oldid = intval( $this->getOldID() );
$link = $this->getTitle()->getFullUrl( "oldid={$oldid}&unhide=1" );
$msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
array( $msg, $link ) );
return false;
} else {
$msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
'rev-suppressed-text-view' : 'rev-deleted-text-view';
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
+ $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
return true;
}
* Revision as of \<date\>; view current revision
* \<- Previous version | Next Version -\>
*
- * @param $oldid String: revision ID of this article revision
+ * @param $oldid int: revision ID of this article revision
*/
public function setOldSubtitle( $oldid = 0 ) {
- global $wgLang, $wgOut, $wgUser, $wgRequest;
-
if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
return;
}
- $unhide = $wgRequest->getInt( 'unhide' ) == 1;
+ $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
# Cascade unhide param in links for easy deletion browsing
$extraParams = array();
$timestamp = $revision->getTimestamp();
$current = ( $oldid == $this->mPage->getLatest() );
- $td = $wgLang->timeanddate( $timestamp, true );
- $tddate = $wgLang->date( $timestamp, true );
- $tdtime = $wgLang->time( $timestamp, true );
+ $language = $this->getContext()->getLanguage();
+ $td = $language->timeanddate( $timestamp, true );
+ $tddate = $language->date( $timestamp, true );
+ $tdtime = $language->time( $timestamp, true );
# Show user links if allowed to see them. If hidden, then show them only if requested...
$userlinks = Linker::revUserTools( $revision, !$unhide );
? 'revision-info-current'
: 'revision-info';
- $wgOut->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
$td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
$tdtime, $revision->getUser() )->parse() . "</div>" );
array( 'known', 'noclasses' )
);
- $cdel = Linker::getRevDeleteLink( $wgUser, $revision, $this->getTitle() );
+ $cdel = Linker::getRevDeleteLink( $this->getContext()->getUser(), $revision, $this->getTitle() );
if ( $cdel !== '' ) {
$cdel .= ' ';
}
- $wgOut->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+ $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
wfMsgExt( 'revision-nav', array( 'escapenoentities', 'parsemag', 'replaceafter' ),
$prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>" );
}
* @return string containing HMTL with redirect link
*/
public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
- global $wgOut, $wgStylePath;
+ global $wgStylePath;
if ( !is_array( $target ) ) {
$target = array( $target );
$imageDir = $lang->getDir();
if ( $appendSubtitle ) {
- $wgOut->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
+ $this->getContext()->getOutput()->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
}
// the loop prepends the arrow image before the link, so the first case needs to be outside
* Handle action=render
*/
public function render() {
- global $wgOut;
-
- $wgOut->setArticleBodyOnly( true );
+ $this->getContext()->getOutput()->setArticleBodyOnly( true );
$this->view();
}
* UI entry point for page deletion
*/
public function delete() {
- global $wgOut, $wgRequest, $wgLang;
-
# This code desperately needs to be totally rewritten
$title = $this->getTitle();
$conds = $title->pageCond();
$latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
if ( $latest === false ) {
- $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
- $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+ $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
);
- $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+ $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
LogEventsList::showLogExtract(
- $wgOut,
+ $outputPage,
'delete',
$title->getPrefixedText()
);
return;
}
- $deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList', 'other' );
- $deleteReason = $wgRequest->getText( 'wpReason' );
+ $request = $this->getContext()->getRequest();
+ $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
+ $deleteReason = $request->getText( 'wpReason' );
if ( $deleteReasonList == 'other' ) {
$reason = $deleteReason;
$reason = $deleteReasonList;
}
- if ( $wgRequest->wasPosted() && $user->matchEditToken( $wgRequest->getVal( 'wpEditToken' ),
+ if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
array( 'delete', $this->getTitle()->getPrefixedText() ) ) )
{
# Flag to hide all contents of the archived revisions
- $suppress = $wgRequest->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+ $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
$this->doDelete( $reason, $suppress );
- if ( $wgRequest->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
+ if ( $request->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
$this->doWatch();
} elseif ( $title->userIsWatching() ) {
$this->doUnwatch();
if ( $hasHistory ) {
$revisions = $this->mTitle->estimateRevisionCount();
// @todo FIXME: i18n issue/patchwork message
- $wgOut->addHTML( '<strong class="mw-delete-warning-revisions">' .
- wfMsgExt( 'historywarning', array( 'parseinline' ), $wgLang->formatNum( $revisions ) ) .
+ $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
+ wfMsgExt( 'historywarning', array( 'parseinline' ), $this->getContext()->getLanguage()->formatNum( $revisions ) ) .
wfMsgHtml( 'word-separator' ) . Linker::link( $title,
wfMsgHtml( 'history' ),
array( 'rel' => 'archives' ),
if ( $this->mTitle->isBigDeletion() ) {
global $wgDeleteRevisionsLimit;
- $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
- array( 'delete-warning-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
+ $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+ array( 'delete-warning-toobig', $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit ) ) );
}
}
* @param $reason String: prefilled reason
*/
public function confirmDelete( $reason ) {
- global $wgOut;
-
wfDebug( "Article::confirmDelete\n" );
- $wgOut->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
- $wgOut->addBacklinkSubtitle( $this->getTitle() );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->addWikiMsg( 'confirmdeletetext' );
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
+ $outputPage->addBacklinkSubtitle( $this->getTitle() );
+ $outputPage->setRobotPolicy( 'noindex,nofollow' );
+ $outputPage->addWikiMsg( 'confirmdeletetext' );
- wfRunHooks( 'ArticleConfirmDelete', array( $this, $wgOut, &$reason ) );
+ wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
$user = $this->getContext()->getUser();
$form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
}
- $wgOut->addHTML( $form );
- $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
- LogEventsList::showLogExtract( $wgOut, 'delete',
+ $outputPage->addHTML( $form );
+ $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+ LogEventsList::showLogExtract( $outputPage, 'delete',
$this->getTitle()->getPrefixedText()
);
}
* @param $suppress bool
*/
public function doDelete( $reason, $suppress = false ) {
- global $wgOut;
-
$error = '';
+ $outputPage = $this->getContext()->getOutput();
if ( $this->mPage->doDeleteArticle( $reason, $suppress, 0, true, $error ) ) {
$deleted = $this->getTitle()->getPrefixedText();
- $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
+ $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
+ $outputPage->setRobotPolicy( 'noindex,nofollow' );
$loglink = '[[Special:Log/delete|' . wfMsgNoTrans( 'deletionlog' ) . ']]';
- $wgOut->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
- $wgOut->returnToMain( false );
+ $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
+ $outputPage->returnToMain( false );
} else {
- $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
+ $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
if ( $error == '' ) {
- $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+ $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
array( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) )
);
- $wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+ $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
LogEventsList::showLogExtract(
- $wgOut,
+ $outputPage,
'delete',
$this->getTitle()->getPrefixedText()
);
} else {
- $wgOut->addHTML( $error );
+ $outputPage->addHTML( $error );
}
}
}
* @return ParserOutput or false if the given revsion ID is not found
*/
public function getParserOutput( $oldid = null, User $user = null ) {
- global $wgUser;
-
- $user = is_null( $user ) ? $wgUser : $user;
+ $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
$parserOptions = $this->mPage->makeParserOptions( $user );
return $this->mPage->getParserOutput( $parserOptions, $oldid );
* @return ParserOptions
*/
public function getParserOptions() {
- global $wgUser;
if ( !$this->mParserOptions ) {
- $this->mParserOptions = $this->mPage->makeParserOptions( $wgUser );
+ $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext()->getUser() );
}
// Clone to allow modifications of the return value without affecting cache
return clone $this->mParserOptions;
}
/**
- * Add this page to $wgUser's watchlist
+ * Add this page to the current user's watchlist
*
* This is safe to be called multiple times
*
* @deprecated since 1.18
*/
public function doWatch() {
- global $wgUser;
wfDeprecated( __METHOD__, '1.18' );
- return WatchAction::doWatch( $this->getTitle(), $wgUser );
+ return WatchAction::doWatch( $this->getTitle(), $this->getContext()->getUser() );
}
/**
* @deprecated since 1.18
*/
public function doUnwatch() {
- global $wgUser;
wfDeprecated( __METHOD__, '1.18' );
- return WatchAction::doUnwatch( $this->getTitle(), $wgUser );
+ return WatchAction::doUnwatch( $this->getTitle(), $this->getContext()->getUser() );
}
/**
* Output a redirect back to the article.
* This is typically used after an edit.
*
- * @deprecated in 1.18; call $wgOut->redirect() directly
+ * @deprecated in 1.18; call OutputPage::redirect() directly
* @param $noRedir Boolean: add redirect=no
* @param $sectionAnchor String: section to redirect to, including "#"
* @param $extraQuery String: extra query params
*/
public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
wfDeprecated( __METHOD__, '1.18' );
- global $wgOut;
-
if ( $noRedir ) {
$query = 'redirect=no';
if ( $extraQuery )
$query = $extraQuery;
}
- $wgOut->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
+ $this->getContext()->getOutput()->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
}
/**
* @return array
*/
public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
- global $wgUser;
- $user = is_null( $user ) ? $wgUser : $user;
+ $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
}
* @return array
*/
public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
- global $wgUser;
- $guser = is_null( $guser ) ? $wgUser : $guser;
+ $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
}
'ApiMain' => 'includes/api/ApiMain.php',
'ApiMove' => 'includes/api/ApiMove.php',
'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
+ 'ApiOptions' => 'includes/api/ApiOptions.php',
'ApiPageSet' => 'includes/api/ApiPageSet.php',
'ApiParamInfo' => 'includes/api/ApiParamInfo.php',
'ApiParse' => 'includes/api/ApiParse.php',
$mBlockEmail,
$mDisableUsertalk,
- $mCreateAccount;
+ $mCreateAccount,
+ $mParentBlockId;
/// @var User|String
protected $target;
$this->mAuto = $row->ipb_auto;
$this->mHideName = $row->ipb_deleted;
$this->mId = $row->ipb_id;
+ $this->mParentBlockId = $row->ipb_parent_block_id;
// I wish I didn't have to do this
$db = wfGetDB( DB_SLAVE );
}
$dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'ipblocks', array( 'ipb_parent_block_id' => $this->getId() ), __METHOD__ );
$dbw->delete( 'ipblocks', array( 'ipb_id' => $this->getId() ), __METHOD__ );
return $dbw->affectedRows() > 0;
'ipb_range_end' => $this->getRangeEnd(),
'ipb_deleted' => intval( $this->mHideName ), // typecast required for SQLite
'ipb_block_email' => $this->prevents( 'sendemail' ),
- 'ipb_allow_usertalk' => !$this->prevents( 'editownusertalk' )
+ 'ipb_allow_usertalk' => !$this->prevents( 'editownusertalk' ),
+ 'ipb_parent_block_id' => $this->mParentBlockId
);
return $a;
# Continue suppressing the name if needed
$autoblock->mHideName = $this->mHideName;
$autoblock->prevents( 'editownusertalk', $this->prevents( 'editownusertalk' ) );
+ $autoblock->mParentBlockId = $this->mId;
if ( $this->mExpiry == 'infinity' ) {
# Original block was indefinite, start an autoblock now
* @return array( User|String, Block::TYPE_ constant )
*/
public static function parseTarget( $target ) {
- $target = trim( $target );
-
# We may have been through this before
if( $target instanceof User ){
if( IP::isValid( $target->getName() ) ){
return array( null, null );
}
+ $target = trim( $target );
+
if ( IP::isValid( $target ) ) {
# We can still create a User if it's an IP address, but we need to turn
# off validation checking (which would exclude IP addresses)
*/
$wgUpgradeKey = false;
+/**
+ * Map GIT repository URLs to viewer URLs to provide links in Special:Version
+ *
+ * Key is a pattern passed to preg_match() and preg_replace(),
+ * without the delimiters (which are #) and must match the whole URL.
+ * The value is the replacement for the key (it can contain $1, etc.)
+ * %h will be replaced by the short SHA-1 (7 first chars) and %H by the
+ * full SHA-1 of the HEAD revision.
+ */
+$wgGitRepositoryViewers = array(
+ 'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+ 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+);
+
/** @} */ # End of maintenance }
/************************************************************************//**
wfProfileOut( __METHOD__ . '-checks' );
- # If article is new, insert it.
- $aid = $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
- $new = ( $aid == 0 );
+ // Use SELECT FOR UPDATE here to avoid transaction collision in
+ // WikiPage::updateRevisionOn() and ending in the self::AS_END case.
+ $this->mArticle->loadPageData( 'forupdate' );
+ $new = !$this->mArticle->exists();
if ( $new ) {
// Late check for create permission, just in case *PARANOIA*
} else {
# Article exists. Check for edit conflict.
-
- $this->mArticle->clear(); # Force reload of dates, etc.
$timestamp = $this->mArticle->getTimestamp();
-
wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
if ( $timestamp != $this->edittime ) {
/**
* @var DumpOutput
+ * FIXME will need to be made protected whenever legacy code
+ * is updated.
*/
- protected $sink;
+ public $sink;
/**
* @var bool
* @return array
*/
protected static function getViewers() {
- if( self::$viewers === false ) {
-
- // Map of repo URLs to viewer URLs.
- //
- // Key is a pattern passed to preg_match() and preg_replace(),
- // without the delimiters (which are #) and must match the whole URL.
- // The value is the replacement for the key (it can contain $1, etc.)
- // %h will be replaced by the short SHA-1 (7 first chars) and %H by the
- // full SHA-1 of the HEAD revision.
- self::$viewers = array(
- 'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
- 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
- );
+ global $wgGitRepositoryViewers;
+ if( self::$viewers === false ) {
+ self::$viewers = $wgGitRepositoryViewers;
wfRunHooks( 'GitViewers', array( &self::$viewers ) );
}
* @param $prefix String
* @return String
*/
-function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
+function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
if ( !is_null( $array2 ) ) {
$array1 = $array1 + $array2;
}
foreach ( $value as $k => $v ) {
$cgi .= $firstTime ? '' : '&';
if ( is_array( $v ) ) {
- $cgi .= wfArrayToCGI( $v, null, $key . "[$k]" );
+ $cgi .= wfArrayToCgi( $v, null, $key . "[$k]" );
} else {
$cgi .= urlencode( $key . "[$k]" ) . '=' . urlencode( $v );
}
}
/**
- * This is the logical opposite of wfArrayToCGI(): it accepts a query string as
+ * This is the logical opposite of wfArrayToCgi(): it accepts a query string as
* its argument and returns the same string in array form. This allows compa-
* tibility with legacy functions that accept raw query strings instead of nice
* arrays. Of course, keys and values are urldecode()d.
*/
function wfAppendQuery( $url, $query ) {
if ( is_array( $query ) ) {
- $query = wfArrayToCGI( $query );
+ $query = wfArrayToCgi( $query );
}
if( $query != '' ) {
if( false === strpos( $url, '?' ) ) {
$canDl = false;
$sapi = php_sapi_name();
- if( version_compare( PHP_VERSION, '5.3.0', '<' ) ||
- $sapi == 'cli' || $sapi == 'cgi' || $sapi == 'embed' )
- {
+ if( $sapi == 'cli' || $sapi == 'cgi' || $sapi == 'embed' ) {
$canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
&& wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
}
}
$cmd = $envcmd . $cmd;
- if ( wfIsWindows() ) {
- if ( version_compare( PHP_VERSION, '5.3.0', '<' ) && /* Fixed in 5.3.0 :) */
- ( version_compare( PHP_VERSION, '5.2.1', '>=' ) || php_uname( 's' ) == 'Windows NT' ) )
- {
- # Hack to work around PHP's flawed invocation of cmd.exe
- # http://news.php.net/php.internals/21796
- # Windows 9x doesn't accept any kind of quotes
- $cmd = '"' . $cmd . '"';
- }
- } elseif ( php_uname( 's' ) == 'Linux' ) {
+ if ( php_uname( 's' ) == 'Linux' ) {
$time = intval( $wgMaxShellTime );
$mem = intval( $wgMaxShellMemory );
$filesize = intval( $wgMaxShellFileSize );
/**
* Constructor from a page id
* @param $id Int article ID to load
- * @returnImagePage|null
+ * @return ImagePage|null
*/
public static function newFromID( $id ) {
$t = Title::newFromID( $id );
protected function loadFile() {
if ( $this->fileLoaded ) {
- return true;
+ return;
}
$this->fileLoaded = true;
* Include body text only; none of the image extras
*/
public function render() {
- global $wgOut;
- $wgOut->setArticleBodyOnly( true );
+ $this->getContext()->setArticleBodyOnly( true );
parent::view();
}
public function view() {
- global $wgOut, $wgShowEXIF, $wgRequest, $wgUser;
+ global $wgShowEXIF;
- $diff = $wgRequest->getVal( 'diff' );
- $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
+ $out = $this->getContext()->getOutput();
+ $request = $this->getContext()->getRequest();
+ $diff = $request->getVal( 'diff' );
+ $diffOnly = $request->getBool( 'diffonly', $this->getContext()->getUser()->getOption( 'diffonly' ) );
if ( $this->getTitle()->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) {
parent::view();
if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || isset( $diff ) ) {
// mTitle is the same as the redirect target so ask Article
// to perform the redirect for us.
- $wgRequest->setVal( 'diffonly', 'true' );
+ $request->setVal( 'diffonly', 'true' );
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
- $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
- $wgOut->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+ $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+ $out->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
/* $appendSubtitle */ true, /* $forceKnown */ true ) );
$this->mPage->doViewUpdates( $this->getContext()->getUser() );
return;
}
if ( !$diff && $this->displayImg->exists() ) {
- $wgOut->addHTML( $this->showTOC( $showmeta ) );
+ $out->addHTML( $this->showTOC( $showmeta ) );
}
if ( !$diff ) {
# NS_FILE is in the user language, but this section (the actual wikitext)
# should be in page content language
$pageLang = $this->getTitle()->getPageLanguage();
- $wgOut->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
+ $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
'class' => 'mw-content-'.$pageLang->getDir() ) ) );
parent::view();
- $wgOut->addHTML( Xml::closeElement( 'div' ) );
+ $out->addHTML( Xml::closeElement( 'div' ) );
} else {
# Just need to set the right headers
- $wgOut->setArticleFlag( true );
- $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
+ $out->setArticleFlag( true );
+ $out->setPageTitle( $this->getTitle()->getPrefixedText() );
$this->mPage->doViewUpdates( $this->getContext()->getUser() );
}
if ( $this->mExtraDescription ) {
$fol = wfMessage( 'shareddescriptionfollows' );
if ( !$fol->isDisabled() ) {
- $wgOut->addWikiText( $fol->plain() );
+ $out->addWikiText( $fol->plain() );
}
- $wgOut->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+ $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
}
$this->closeShowImage();
$this->imageHistory();
// TODO: Cleanup the following
- $wgOut->addHTML( Xml::element( 'h2',
+ $out->addHTML( Xml::element( 'h2',
array( 'id' => 'filelinks' ),
wfMsg( 'imagelinks' ) ) . "\n" );
$this->imageDupes();
$html = '';
wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
if ( $html ) {
- $wgOut->addHTML( $html );
+ $out->addHTML( $html );
}
if ( $showmeta ) {
- $wgOut->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
- $wgOut->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
- $wgOut->addModules( array( 'mediawiki.action.view.metadata' ) );
+ $out->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
+ $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
+ $out->addModules( array( 'mediawiki.action.view.metadata' ) );
}
// Add remote Filepage.css
if( !$this->repo->isLocal() ) {
$css = $this->repo->getDescriptionStylesheetUrl();
if ( $css ) {
- $wgOut->addStyle( $css );
+ $out->addStyle( $css );
}
}
// always show the local local Filepage.css, bug 29277
- $wgOut->addModuleStyles( 'filepage' );
+ $out->addModuleStyles( 'filepage' );
}
/**
}
protected function openShowImage() {
- global $wgOut, $wgUser, $wgImageLimits, $wgRequest,
- $wgLang, $wgEnableUploads, $wgSend404Code;
+ global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
$this->loadFile();
+ $out = $this->getContext()->getOutput();
+ $user = $this->getContext()->getUser();
+ $lang = $this->getContext()->getLanguage();
+ $dirmark = $lang->getDirMarkEntity();
+ $request = $this->getContext()->getRequest();
- $sizeSel = intval( $wgUser->getOption( 'imagesize' ) );
+ $sizeSel = intval( $user->getOption( 'imagesize' ) );
if ( !isset( $wgImageLimits[$sizeSel] ) ) {
$sizeSel = User::getDefaultOption( 'imagesize' );
$max = $wgImageLimits[$sizeSel];
$maxWidth = $max[0];
$maxHeight = $max[1];
- $dirmark = $wgLang->getDirMarkEntity();
if ( $this->displayImg->exists() ) {
# image
- $page = $wgRequest->getIntOrNull( 'page' );
+ $page = $request->getIntOrNull( 'page' );
if ( is_null( $page ) ) {
$params = array();
$page = 1;
$longDesc = wfMsg( 'parentheses', $this->displayImg->getLongDesc() );
- wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$wgOut ) );
+ wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
if ( $this->displayImg->allowInlineDisplay() ) {
# image
if ( count( $otherSizes ) && $this->displayImg->getRepo()->canTransformVia404() ) {
$msgsmall .= ' ' .
Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
- wfMessage( 'show-big-image-other' )->rawParams( $wgLang->pipeList( $otherSizes ) )->
+ wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
params( count( $otherSizes ) )->parse()
);
}
$isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
if ( $isMulti ) {
- $wgOut->addHTML( '<table class="multipageimage"><tr><td>' );
+ $out->addHTML( '<table class="multipageimage"><tr><td>' );
}
if ( $thumbnail ) {
'alt' => $this->displayImg->getTitle()->getPrefixedText(),
'file-link' => true,
);
- $wgOut->addHTML( '<div class="fullImageLink" id="file">' .
+ $out->addHTML( '<div class="fullImageLink" id="file">' .
$thumbnail->toHtml( $options ) .
$anchorclose . "</div>\n" );
}
$count = $this->displayImg->pageCount();
if ( $page > 1 ) {
- $label = $wgOut->parse( wfMsg( 'imgmultipageprev' ), false );
+ $label = $out->parse( wfMsg( 'imgmultipageprev' ), false );
$link = Linker::link(
$this->getTitle(),
$label,
);
$options = array();
for ( $i = 1; $i <= $count; $i++ ) {
- $options[] = Xml::option( $wgLang->formatNum( $i ), $i, $i == $page );
+ $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
}
$select = Xml::tags( 'select',
array( 'id' => 'pageselector', 'name' => 'page' ),
implode( "\n", $options ) );
- $wgOut->addHTML(
+ $out->addHTML(
'</td><td><div class="multipageimagenavbox">' .
Xml::openElement( 'form', $formParams ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
if ( $this->displayImg->isSafeFile() ) {
$icon = $this->displayImg->iconThumb();
- $wgOut->addHTML( '<div class="fullImageLink" id="file">' .
+ $out->addHTML( '<div class="fullImageLink" id="file">' .
$icon->toHtml( array( 'file-link' => true ) ) .
"</div>\n" );
}
// The dirmark, however, must not be immediately adjacent
// to the filename, because it can get copied with it.
// See bug 25277.
- $wgOut->addWikiText( <<<EOT
+ $out->addWikiText( <<<EOT
<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
<div class="mediaWarning">$warning</div>
EOT
);
} else {
- $wgOut->addWikiText( <<<EOT
+ $out->addWikiText( <<<EOT
<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
</div>
EOT
# No article exists either
# Show deletion log to be consistent with normal articles
LogEventsList::showLogExtract(
- $wgOut,
+ $out,
array( 'delete', 'move' ),
$this->getTitle()->getPrefixedText(),
'',
);
}
- if ( $wgEnableUploads && $wgUser->isAllowed( 'upload' ) ) {
+ if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
// Only show an upload link if the user can upload
$uploadTitle = SpecialPage::getTitleFor( 'Upload' );
$nofile = array(
// Note, if there is an image description page, but
// no image, then this setRobotPolicy is overriden
// by Article::View().
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
+ $out->setRobotPolicy( 'noindex,nofollow' );
+ $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
if ( !$this->getID() && $wgSend404Code ) {
// If there is no image, no shared image, and no description page,
// output a 404, to be consistent with articles.
- $wgRequest->response()->header( 'HTTP/1.1 404 Not Found' );
+ $request->response()->header( 'HTTP/1.1 404 Not Found' );
}
}
- $wgOut->setFileVersion( $this->displayImg );
+ $out->setFileVersion( $this->displayImg );
}
/**
* Show a notice that the file is from a shared repository
*/
protected function printSharedImageText() {
- global $wgOut;
-
+ $out = $this->getContext()->getOutput();
$this->loadFile();
$descUrl = $this->mPage->getFile()->getDescriptionUrl();
/* Add canonical to head if there is no local page for this shared file */
if( $descUrl && $this->mPage->getID() == 0 ) {
- $wgOut->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
+ $out->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
}
$wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
$repo = $this->mPage->getFile()->getRepo()->getDisplayName();
if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-' ) {
- $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
+ $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
} elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
- $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
+ $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
} else {
- $wgOut->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
+ $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
}
if ( $descText ) {
* external editing (and instructions link) etc.
*/
protected function uploadLinksBox() {
- global $wgUser, $wgOut, $wgEnableUploads, $wgUseExternalEditor;
+ global $wgEnableUploads, $wgUseExternalEditor;
if ( !$wgEnableUploads ) {
return;
return;
}
- $wgOut->addHTML( "<br /><ul>\n" );
+ $out = $this->getContext()->getOutput();
+ $out->addHTML( "<br /><ul>\n" );
# "Upload a new version of this file" link
- if ( UploadBase::userCanReUpload( $wgUser, $this->mPage->getFile()->name ) ) {
+ if ( UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
$ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
- $wgOut->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+ $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
}
# External editing link
),
array( 'known', 'noclasses' )
);
- $wgOut->addHTML(
+ $out->addHTML(
'<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) .
"</small></li>\n"
);
}
- $wgOut->addHTML( "</ul>\n" );
+ $out->addHTML( "</ul>\n" );
}
protected function closeShowImage() { } # For overloading
* we follow it with an upload history of the image and its usage.
*/
protected function imageHistory() {
- global $wgOut;
-
$this->loadFile();
+ $out = $this->getContext()->getOutput();
$pager = new ImageHistoryPseudoPager( $this );
- $wgOut->addHTML( $pager->getBody() );
- $wgOut->preventClickjacking( $pager->getPreventClickjacking() );
+ $out->addHTML( $pager->getBody() );
+ $out->preventClickjacking( $pager->getPreventClickjacking() );
$this->mPage->getFile()->resetHistory(); // free db resources
}
protected function imageLinks() {
- global $wgOut, $wgLang;
-
$limit = 100;
+ $out = $this->getContext()->getOutput();
$res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
$rows = array();
$redirects = array();
}
if ( $count == 0 ) {
- $wgOut->wrapWikiMsg(
+ $out->wrapWikiMsg(
Html::rawElement( 'div',
array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
'nolinkstoimage'
return;
}
- $wgOut->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
+ $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
if ( !$hasMore ) {
- $wgOut->addWikiMsg( 'linkstoimage', $count );
+ $out->addWikiMsg( 'linkstoimage', $count );
} else {
// More links than the limit. Add a link to [[Special:Whatlinkshere]]
- $wgOut->addWikiMsg( 'linkstoimage-more',
- $wgLang->formatNum( $limit ),
+ $out->addWikiMsg( 'linkstoimage-more',
+ $this->getContext()->getLanguage()->formatNum( $limit ),
$this->getTitle()->getPrefixedDBkey()
);
}
- $wgOut->addHTML(
+ $out->addHTML(
Html::openElement( 'ul',
array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
);
$liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
$link, $ul )->parse();
}
- $wgOut->addHTML( Html::rawElement(
+ $out->addHTML( Html::rawElement(
'li',
array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
$liContents
);
};
- $wgOut->addHTML( Html::closeElement( 'ul' ) . "\n" );
+ $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
$res->free();
// Add a links to [[Special:Whatlinkshere]]
if ( $count > $limit ) {
- $wgOut->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
+ $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
}
- $wgOut->addHTML( Html::closeElement( 'div' ) . "\n" );
+ $out->addHTML( Html::closeElement( 'div' ) . "\n" );
}
protected function imageDupes() {
- global $wgOut, $wgLang;
-
$this->loadFile();
+ $out = $this->getContext()->getOutput();
$dupes = $this->mPage->getDuplicates();
if ( count( $dupes ) == 0 ) {
return;
}
- $wgOut->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
- $wgOut->addWikiMsg( 'duplicatesoffile',
- $wgLang->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
+ $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
+ $out->addWikiMsg( 'duplicatesoffile',
+ $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
);
- $wgOut->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
+ $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
/**
* @var $file File
$file->getTitle()->getPrefixedText() );
$fromSrc = wfMsg( 'shared-repo-from', $file->getRepo()->getDisplayName() );
}
- $wgOut->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
+ $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
}
- $wgOut->addHTML( "</ul></div>\n" );
+ $out->addHTML( "</ul></div>\n" );
}
/**
* @param $description String
*/
function showError( $description ) {
- global $wgOut;
- $wgOut->setPageTitle( wfMessage( 'internalerror' ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setArticleRelated( false );
- $wgOut->enableClientCache( false );
- $wgOut->addWikiText( $description );
+ $out = $this->getContext()->getOutput();
+ $out->setPageTitle( wfMessage( 'internalerror' ) );
+ $out->setRobotPolicy( 'noindex,nofollow' );
+ $out->setArticleRelated( false );
+ $out->enableClientCache( false );
+ $out->addWikiText( $description );
}
/**
*
* @ingroup Media
*/
-class ImageHistoryList {
+class ImageHistoryList extends ContextSource {
/**
* @var Title
$this->title = $imagePage->getTitle();
$this->imagePage = $imagePage;
$this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
+ $this->setContext( $imagePage->getContext() );
}
/**
* @return string
*/
public function beginImageHistoryList( $navLinks = '' ) {
- global $wgOut, $wgUser;
return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) ) . "\n"
. "<div id=\"mw-imagepage-section-filehistory\">\n"
- . $wgOut->parse( wfMsgNoTrans( 'filehist-help' ) )
+ . $this->getOutput()->parse( wfMsgNoTrans( 'filehist-help' ) )
. $navLinks . "\n"
. Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
. '<tr><td></td>'
- . ( $this->current->isLocal() && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+ . ( $this->current->isLocal() && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
. '<th>' . wfMsgHtml( 'filehist-datetime' ) . '</th>'
. ( $this->showThumb ? '<th>' . wfMsgHtml( 'filehist-thumb' ) . '</th>' : '' )
. '<th>' . wfMsgHtml( 'filehist-dimensions' ) . '</th>'
* @return string
*/
public function imageHistoryLine( $iscur, $file ) {
- global $wgUser, $wgLang, $wgContLang;
+ global $wgContLang;
+ $user = $this->getUser();
+ $lang = $this->getLanguage();
$timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
$img = $iscur ? $file->getName() : $file->getArchiveName();
- $user = $file->getUser( 'id' );
- $usertext = $file->getUser( 'text' );
+ $userId = $file->getUser( 'id' );
+ $userText = $file->getUser( 'text' );
$description = $file->getDescription();
$local = $this->current->isLocal();
$row = $selected = '';
// Deletion link
- if ( $local && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
+ if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
$row .= '<td>';
# Link to remove from history
- if ( $wgUser->isAllowed( 'delete' ) ) {
+ if ( $user->isAllowed( 'delete' ) ) {
$q = array( 'action' => 'delete' );
if ( !$iscur ) {
$q['oldimage'] = $img;
);
}
# Link to hide content. Don't show useless link to people who cannot hide revisions.
- $canHide = $wgUser->isAllowed( 'deleterevision' );
- if ( $canHide || ( $wgUser->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
- if ( $wgUser->isAllowed( 'delete' ) ) {
+ $canHide = $user->isAllowed( 'deleterevision' );
+ if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+ if ( $user->isAllowed( 'delete' ) ) {
$row .= '<br />';
}
// If file is top revision or locked from this user, don't link
if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED ) ) {
$del = Linker::revDeleteLinkDisabled( $canHide );
} else {
- list( $ts, $name ) = explode( '!', $img, 2 );
+ list( $ts, ) = explode( '!', $img, 2 );
$query = array(
'type' => 'oldimage',
'target' => $this->title->getPrefixedText(),
$row .= '<td>';
if ( $iscur ) {
$row .= wfMsgHtml( 'filehist-current' );
- } elseif ( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
+ } elseif ( $local && $user->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
if ( $file->isDeleted( File::DELETED_FILE ) ) {
$row .= wfMsgHtml( 'filehist-revert' );
} else {
array(
'action' => 'revert',
'oldimage' => $img,
- 'wpEditToken' => $wgUser->getEditToken( $img )
+ 'wpEditToken' => $user->getEditToken( $img )
),
array( 'known', 'noclasses' )
);
$row .= "<td $selected style='white-space: nowrap;'>";
if ( !$file->userCan( File::DELETED_FILE ) ) {
# Don't link to unviewable files
- $row .= '<span class="history-deleted">' . $wgLang->timeanddate( $timestamp, true ) . '</span>';
+ $row .= '<span class="history-deleted">' . $lang->timeanddate( $timestamp, true ) . '</span>';
} elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
if ( $local ) {
$this->preventClickjacking();
# Make a link to review the image
$url = Linker::link(
$revdel,
- $wgLang->timeanddate( $timestamp, true ),
+ $lang->timeanddate( $timestamp, true ),
array(),
array(
'target' => $this->title->getPrefixedText(),
'file' => $img,
- 'token' => $wgUser->getEditToken( $img )
+ 'token' => $user->getEditToken( $img )
),
array( 'known', 'noclasses' )
);
} else {
- $url = $wgLang->timeanddate( $timestamp, true );
+ $url = $lang->timeanddate( $timestamp, true );
}
$row .= '<span class="history-deleted">' . $url . '</span>';
} else {
$url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
- $row .= Xml::element( 'a', array( 'href' => $url ), $wgLang->timeanddate( $timestamp, true ) );
+ $row .= Xml::element( 'a', array( 'href' => $url ), $lang->timeanddate( $timestamp, true ) );
}
$row .= "</td>";
$row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
} else {
if ( $local ) {
- $row .= Linker::userLink( $user, $usertext ) . ' <span style="white-space: nowrap;">' .
- Linker::userToolLinks( $user, $usertext ) . '</span>';
+ $row .= Linker::userLink( $userId, $userText ) . ' <span style="white-space: nowrap;">' .
+ Linker::userToolLinks( $userId, $userText ) . '</span>';
} else {
- $row .= htmlspecialchars( $usertext );
+ $row .= htmlspecialchars( $userText );
}
}
$row .= '</td>';
* @return string
*/
protected function getThumbForLine( $file ) {
- global $wgLang;
-
+ $lang = $this->getLanguage();
if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
$params = array(
'width' => '120',
$thumbnail = $file->transform( $params );
$options = array(
'alt' => wfMsg( 'filehist-thumbtext',
- $wgLang->timeanddate( $timestamp, true ),
- $wgLang->date( $timestamp, true ),
- $wgLang->time( $timestamp, true ) ),
+ $lang->timeanddate( $timestamp, true ),
+ $lang->date( $timestamp, true ),
+ $lang->time( $timestamp, true ) ),
'file-link' => true,
);
}
/**
+ * @param $row object
* @return string
*/
function formatRow( $row ) {
return $index == NS_USER || $index == NS_USER_TALK;
}
+ /**
+ * It is not possible to use pages from this namespace as template?
+ *
+ * @since 1.20
+ * @param $index int Index to check
+ * @return bool
+ */
+ public static function isNonincludableNamespace( $index ) {
+ global $wgNonincludableNamespaces;
+ return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces );
+ }
+
}
* version are hardcoded here
*/
function wfPHPVersionError( $type ){
- $mwVersion = '1.19';
+ $mwVersion = '1.20';
$phpVersion = PHP_VERSION;
- $message = "MediaWiki $mwVersion requires at least PHP version 5.2.3, you are using PHP $phpVersion.";
+ $message = "MediaWiki $mwVersion requires at least PHP version 5.3.2, you are using PHP $phpVersion.";
if( $type == 'index.php' ) {
$encLogo = htmlspecialchars(
str_replace( '//', '/', pathinfo( $_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME ) . '/'
if ( !isset( $row->title ) ) {
return null;
}
- $title = Title::MakeTitle( intval( $row->namespace ), $row->title );
+ $title = Title::makeTitle( intval( $row->namespace ), $row->title );
if ( $title ) {
$date = isset( $row->timestamp ) ? $row->timestamp : '';
$comments = '';
* @return Title the new object, or NULL on an error
*/
public static function newFromURL( $url ) {
- global $wgLegalTitleChars;
$t = new Title();
# For compatibility with old buggy URLs. "+" is usually not valid in titles,
# but some URLs used it as a space replacement and they still come
# from some external search tools.
- if ( strpos( $wgLegalTitleChars, '+' ) === false ) {
+ if ( strpos( self::legalChars(), '+' ) === false ) {
$url = str_replace( '+', ' ', $url );
}
*/
public function getPreviousRevisionID( $revId, $flags = 0 ) {
$db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
- return $db->selectField( 'revision', 'rev_id',
+ $revId = $db->selectField( 'revision', 'rev_id',
array(
'rev_page' => $this->getArticleID( $flags ),
'rev_id < ' . intval( $revId )
__METHOD__,
array( 'ORDER BY' => 'rev_id DESC' )
);
+
+ if ( $revId === false ) {
+ return false;
+ } else {
+ return intval( $revId );
+ }
}
/**
*/
public function getNextRevisionID( $revId, $flags = 0 ) {
$db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
- return $db->selectField( 'revision', 'rev_id',
+ $revId = $db->selectField( 'revision', 'rev_id',
array(
'rev_page' => $this->getArticleID( $flags ),
'rev_id > ' . intval( $revId )
__METHOD__,
array( 'ORDER BY' => 'rev_id' )
);
+
+ if ( $revId === false ) {
+ return false;
+ } else {
+ return intval( $revId );
+ }
}
/**
$dbr = wfGetDB( DB_SLAVE );
$this->mNotificationTimestamp[$uid] = $dbr->selectField( 'watchlist',
'wl_notificationtimestamp',
- array( 'wl_namespace' => $this->getNamespace(),
+ array(
+ 'wl_user' => $user->getId(),
+ 'wl_namespace' => $this->getNamespace(),
'wl_title' => $this->getDBkey(),
- 'wl_user' => $user->getId()
),
__METHOD__
);
}
# User/IP blocking
- $block = Block::newFromTarget( $this->getName(), $ip, !$bFromSlave );
+ $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
# Proxy blocking
if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
* Reset all options to the site defaults
*/
public function resetOptions() {
+ $this->load();
+
$this->mOptions = self::getDefaultOptions();
+ $this->mOptionsLoaded = true;
}
/**
$res = $dbw->select( array( 'watchlist' ),
array( 'wl_user' ),
array(
- 'wl_title' => $title->getDBkey(),
- 'wl_namespace' => $title->getNamespace(),
'wl_user != ' . intval( $editor->getID() ),
+ 'wl_namespace' => $title->getNamespace(),
+ 'wl_title' => $title->getDBkey(),
'wl_notificationtimestamp IS NULL',
), __METHOD__
);
array( /* SET */
'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
), array( /* WHERE */
- 'wl_title' => $title->getDBkey(),
+ 'wl_user' => $watchers,
'wl_namespace' => $title->getNamespace(),
- 'wl_user' => $watchers
+ 'wl_title' => $title->getDBkey(),
), __METHOD__
);
$dbw->commit( __METHOD__ );
*/
const DELETE_NO_REVISIONS = 2;
+ // Constants for $mDataLoadedFrom and related
+
+ /**
+ * Data has not been loaded yet (or the object was cleared)
+ */
+ const DATA_NOT_LOADED = 0;
+
+ /**
+ * Data has been loaded from a slave database
+ */
+ const DATA_FROM_SLAVE = 1;
+
+ /**
+ * Data has been loaded from the master database
+ */
+ const DATA_FROM_MASTER = 2;
+
+ /**
+ * Data has been loaded from the master database using FOR UPDATE
+ */
+ const DATA_FOR_UPDATE = 3;
+
/**
* @var Title
*/
public $mPreparedEdit = false; // !< Array
/**@}}*/
+ /**
+ * @var int; one of the DATA_* constants
+ */
+ protected $mDataLoadedFrom = self::DATA_NOT_LOADED;
+
/**
* @var Title
*/
* Constructor from a page id
*
* @param $id Int article ID to load
+ * @param $from string|int one of the following values:
+ * - "fromdb" or self::DATA_FROM_SLAVE to select from a slave database
+ * - "fromdbmaster" or self::DATA_FROM_MASTER to select from the master database
*
* @return WikiPage|null
*/
- public static function newFromID( $id ) {
- $dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+ public static function newFromID( $id, $from = 'fromdb' ) {
+ $from = self::convertSelectType( $from );
+ $db = wfGetDB( $from === self::DATA_FROM_MASTER ? DB_MASTER : DB_SLAVE );
+ $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
if ( !$row ) {
return null;
}
- return self::newFromRow( $row );
+ return self::newFromRow( $row, $from );
}
/**
* @since 1.20
* @param $row object: database row containing at least fields returned
* by selectFields().
+ * @param $from string|int: source of $data:
+ * - "fromdb" or self::DATA_FROM_SLAVE: from a slave DB
+ * - "fromdbmaster" or self::DATA_FROM_MASTER: from the master DB
+ * - "forupdate" or self::DATA_FOR_UPDATE: from the master DB using SELECT FOR UPDATE
* @return WikiPage
*/
- public static function newFromRow( $row ) {
+ public static function newFromRow( $row, $from = 'fromdb' ) {
$page = self::factory( Title::newFromRow( $row ) );
- $page->loadFromRow( $row );
+ $page->loadFromRow( $row, $from );
return $page;
}
+ /**
+ * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to DATA_* constants.
+ *
+ * @param $type object|string|int
+ * @return mixed
+ */
+ private static function convertSelectType( $type ) {
+ switch ( $type ) {
+ case 'fromdb':
+ return self::DATA_FROM_SLAVE;
+ case 'fromdbmaster':
+ return self::DATA_FROM_MASTER;
+ case 'forupdate':
+ return self::DATA_FOR_UPDATE;
+ default:
+ // It may already be an integer or whatever else
+ return $type;
+ }
+ }
+
/**
* Returns overrides for action handlers.
* Classes listed here will be used instead of the default one when
*/
public function clear() {
$this->mDataLoaded = false;
+ $this->mDataLoadedFrom = self::DATA_NOT_LOADED;
$this->mCounter = null;
$this->mRedirectTarget = null; # Title object if set
* Fetch a page record with the given conditions
* @param $dbr DatabaseBase object
* @param $conditions Array
+ * @param $options Array
* @return mixed Database result resource, or false on failure
*/
- protected function pageData( $dbr, $conditions ) {
+ protected function pageData( $dbr, $conditions, $options = array() ) {
$fields = self::selectFields();
wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
- $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__ );
+ $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
*
* @param $dbr DatabaseBase object
* @param $title Title object
+ * @param $options Array
* @return mixed Database result resource, or false on failure
*/
- public function pageDataFromTitle( $dbr, $title ) {
+ public function pageDataFromTitle( $dbr, $title, $options = array() ) {
return $this->pageData( $dbr, array(
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() ) );
+ 'page_title' => $title->getDBkey() ), $options );
}
/**
*
* @param $dbr DatabaseBase
* @param $id Integer
+ * @param $options Array
* @return mixed Database result resource, or false on failure
*/
- public function pageDataFromId( $dbr, $id ) {
- return $this->pageData( $dbr, array( 'page_id' => $id ) );
+ public function pageDataFromId( $dbr, $id, $options = array() ) {
+ return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
}
/**
* Set the general counter, title etc data loaded from
* some source.
*
- * @param $data Object|String One of the following:
- * A DB query result object or...
- * "fromdb" to get from a slave DB or...
- * "fromdbmaster" to get from the master DB
+ * @param $from object|string|int One of the following:
+ * - A DB query result object
+ * - "fromdb" or self::DATA_FROM_SLAVE to get from a slave DB
+ * - "fromdbmaster" or self::DATA_FROM_MASTER to get from the master DB
+ * - "forupdate" or self::DATA_FOR_UPDATE to get from the master DB using SELECT FOR UPDATE
+ *
* @return void
*/
- public function loadPageData( $data = 'fromdb' ) {
- if ( $data === 'fromdbmaster' ) {
+ public function loadPageData( $from = 'fromdb' ) {
+ $from = self::convertSelectType( $from );
+ if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
+ // We already have the data from the correct location, no need to load it twice.
+ return;
+ }
+
+ if ( $from === self::DATA_FOR_UPDATE ) {
+ $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
+ } elseif ( $from === self::DATA_FROM_MASTER ) {
$data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
- } elseif ( $data === 'fromdb' ) { // slave
+ } elseif ( $from === self::DATA_FROM_SLAVE ) {
$data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
# Use a "last rev inserted" timestamp key to dimish the issue of slave lag.
# Note that DB also stores the master position in the session and checks it.
$touched = $this->getCachedLastEditTime();
if ( $touched ) { // key set
if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
+ $from = self::DATA_FROM_MASTER;
$data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
}
}
+ } else {
+ // No idea from where the caller got this data, assume slave database.
+ $data = $from;
+ $from = self::DATA_FROM_SLAVE;
}
- $this->loadFromRow( $data );
+ $this->loadFromRow( $data, $from );
}
/**
* @since 1.20
* @param $data object: database row containing at least fields returned
* by selectFields()
+ * @param $from string|int One of the following:
+ * - "fromdb" or self::DATA_FROM_SLAVE if the data comes from a slave DB
+ * - "fromdbmaster" or self::DATA_FROM_MASTER if the data comes from the master DB
+ * - "forupdate" or self::DATA_FOR_UPDATE if the data comes from from
+ * the master DB using SELECT FOR UPDATE
*/
- public function loadFromRow( $data ) {
+ public function loadFromRow( $data, $from ) {
$lc = LinkCache::singleton();
if ( $data ) {
}
$this->mDataLoaded = true;
+ $this->mDataLoadedFrom = self::convertSelectType( $from );
}
/**
$user = is_null( $user ) ? $wgUser : $user;
$status = Status::newGood( array() );
- # Load $this->mTitle->getArticleID() and $this->mLatest if it's not already
+ // Load the data from the master database if needed.
+ // The caller may already loaded it from the master or even loaded it using
+ // SELECT FOR UPDATE, so do not override that using clear().
$this->loadPageData( 'fromdbmaster' );
$flags = $this->checkFlags( $flags );
$reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
) {
global $wgUser;
- $user = is_null( $user ) ? $wgUser : $user;
wfDebug( __METHOD__ . "\n" );
+ if ( $this->mTitle->getDBkey() === '' ) {
+ return WikiPage::DELETE_NO_PAGE;
+ }
+
+ $user = is_null( $user ) ? $wgUser : $user;
if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error ) ) ) {
return WikiPage::DELETE_HOOK_ABORTED;
}
- $dbw = wfGetDB( DB_MASTER );
- $t = $this->mTitle->getDBkey();
- $id = $id ? $id : $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
- if ( $t === '' || $id == 0 ) {
- return WikiPage::DELETE_NO_PAGE;
+ if ( $id == 0 ) {
+ $this->loadPageData( 'forupdate' );
+ $id = $this->getID();
+ if ( $id == 0 ) {
+ return WikiPage::DELETE_NO_PAGE;
+ }
}
// Bitfields to further suppress the content
$bitfield = 'rev_deleted';
}
+ $dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
// For now, shunt the revision data into the archive table.
// Text is *not* removed from the text table; bulk storage
}
protected function feedItem( $row ) {
- $title = Title::MakeTitle( intval( $row->page_namespace ), $row->page_title );
+ $title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
if( $title ) {
$date = $row->rev_timestamp;
$comments = $title->getTalkPage()->getFullURL();
'patrol' => 'ApiPatrol',
'import' => 'ApiImport',
'userrights' => 'ApiUserrights',
+ 'options' => 'ApiOptions',
);
/**
--- /dev/null
+<?php
+/**
+ *
+ *
+ * Created on Apr 15, 2012
+ *
+ * Copyright © 2012 Szymon Świerkosz beau@adres.pl
+ *
+ * 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
+ */
+
+/**
+* API module that facilitates the changing of user's preferences.
+* Requires API write mode to be enabled.
+*
+ * @ingroup API
+ */
+class ApiOptions extends ApiBase {
+
+ public function __construct( $main, $action ) {
+ parent::__construct( $main, $action );
+ }
+
+ /**
+ * Changes preferences of the current user.
+ */
+ public function execute() {
+ $user = $this->getUser();
+
+ if ( $user->isAnon() ) {
+ $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
+ }
+
+ $params = $this->extractRequestParams();
+ $changes = 0;
+
+ if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
+ $this->dieUsageMsg( array( 'missingparam', 'optionname' ) );
+ }
+
+ if ( $params['reset'] ) {
+ $user->resetOptions();
+ $changes++;
+ }
+ if ( count( $params['change'] ) ) {
+ foreach ( $params['change'] as $entry ) {
+ $array = explode( '=', $entry, 2 );
+ $user->setOption( $array[0], isset( $array[1] ) ? $array[1] : null );
+ $changes++;
+ }
+ }
+ if ( isset( $params['optionname'] ) ) {
+ $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
+ $user->setOption( $params['optionname'], $newValue );
+ $changes++;
+ }
+
+ if ( $changes ) {
+ // Commit changes
+ $user->saveSettings();
+ } else {
+ $this->dieUsage( 'No changes were requested', 'nochanges' );
+ }
+
+ $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
+ }
+
+ public function mustBePosted() {
+ return true;
+ }
+
+ public function isWriteMode() {
+ return true;
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'token' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ 'reset' => false,
+ 'change' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ 'optionname' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ),
+ 'optionvalue' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'token' => 'An options token previously obtained through the action=tokens',
+ 'reset' => 'Resets all preferences to the site defaults',
+ 'change' => 'Pipe-separated list of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters',
+ 'optionname' => 'A name of a option which should have an optionvalue set',
+ 'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters',
+ );
+ }
+
+ public function getDescription() {
+ return 'Change preferences of the current user';
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'notloggedin' ),
+ array( 'nochanges' ),
+ ) );
+ }
+
+ public function needsToken() {
+ return true;
+ }
+
+ public function getTokenSalt() {
+ return '';
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Options';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=options&reset=&token=123ABC',
+ 'api.php?action=options&change=skin=vector|hideminor=1&token=123ABC',
+ 'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC',
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id$';
+ }
+}
// The parser needs $wgTitle to be set, apparently the
// $title parameter in Parser::parse isn't enough *sigh*
// TODO: Does this still need $wgTitle?
- global $wgParser, $wgTitle, $wgLang;
+ global $wgParser, $wgTitle;
// Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang breaks
$oldLang = null;
- if ( isset( $params['uselang'] ) && $params['uselang'] != $wgLang->getCode() ) {
- $oldLang = $wgLang; // Backup wgLang
- $wgLang = Language::factory( $params['uselang'] );
+ if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
+ $oldLang = $this->getContext()->getLanguage(); // Backup language
+ $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
}
$popts = ParserOptions::newFromContext( $this->getContext() );
$result->setContent( $result_array['psttext'], $this->pstText );
}
}
+ if ( isset( $prop['properties'] ) ) {
+ $result_array['properties'] = $this->formatProperties( $p_result->getProperties() );
+ }
$result_mapping = array(
'redirects' => 'r',
'iwlinks' => 'iw',
'sections' => 's',
'headitems' => 'hi',
+ 'properties' => 'pp',
);
$this->setIndexedTagNames( $result_array, $result_mapping );
$result->addValue( null, $this->getModuleName(), $result_array );
if ( !is_null( $oldLang ) ) {
- $wgLang = $oldLang; // Reset $wgLang to $oldLang
+ $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
}
}
return $result;
}
+ private function formatProperties( $properties ) {
+ $result = array();
+ foreach ( $properties as $name => $value ) {
+ $entry = array();
+ $entry['name'] = $name;
+ $this->getResult()->setContent( $entry, $value );
+ $result[] = $entry;
+ }
+ return $result;
+ }
+
private function formatCss( $css ) {
$result = array();
foreach ( $css as $file => $link ) {
ApiBase::PARAM_TYPE => 'integer',
),
'prop' => array(
- ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle',
+ ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties',
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_TYPE => array(
'text',
'headhtml',
'iwlinks',
'wikitext',
+ 'properties',
)
),
'pst' => false,
' headhtml - Gives parsed <head> of the page',
' iwlinks - Gives interwiki links in the parsed wikitext',
' wikitext - Gives the original wikitext that was parsed',
+ ' properties - Gives various properties defined in the parsed wikitext',
),
'pst' => array(
'Do a pre-save transform on the input before parsing it',
}
public function getDescription() {
- return 'Parses wikitext and returns parser output';
+ return array(
+ 'Parses wikitext and returns parser output',
+ 'See the various prop-Modules of action=query to get information from the current version of a page',
+ );
}
public function getPossibleErrors() {
$fld_dimensions = isset( $prop['dimensions'] );
$fld_description = isset( $prop['description'] ) || isset( $prop['parseddescription'] );
$fld_mime = isset( $prop['mime'] );
+ $fld_mediatype = isset( $prop['mediatype'] );
$fld_metadata = isset( $prop['metadata'] );
$fld_bitdepth = isset( $prop['bitdepth'] );
$this->addFieldsIf( array( 'fa_height', 'fa_width', 'fa_size' ), $fld_dimensions || $fld_size );
$this->addFieldsIf( 'fa_description', $fld_description );
$this->addFieldsIf( array( 'fa_major_mime', 'fa_minor_mime' ), $fld_mime );
+ $this->addFieldsIf( 'fa_media_type', $fld_mediatype );
$this->addFieldsIf( 'fa_metadata', $fld_metadata );
$this->addFieldsIf( 'fa_bits', $fld_bitdepth );
$row->fa_description, $title );
}
}
+ if ( $fld_mediatype ) {
+ $file['mediatype'] = $row->fa_media_type;
+ }
if ( $fld_metadata ) {
$file['metadata'] = $row->fa_metadata
? ApiQueryImageInfo::processMetaData( unserialize( $row->fa_metadata ), $result )
'description',
'parseddescription',
'mime',
+ 'mediatype',
'metadata',
'bitdepth'
),
' description - Adds description the image version',
' parseddescription - Parse the description on the version',
' mime - Adds MIME of the image',
+ ' mediatype - Adds the media type of the image',
' metadata - Lists EXIF metadata for the version of the image',
' bitdepth - Adds the bit depth of the version',
),
return $cachedWatchToken;
}
+ public static function getOptionsToken( $pageid, $title ) {
+ global $wgUser;
+ if ( !$wgUser->isLoggedIn() ) {
+ return false;
+ }
+
+ static $cachedOptionsToken = null;
+ if ( !is_null( $cachedOptionsToken ) ) {
+ return $cachedOptionsToken;
+ }
+
+ $cachedOptionsToken = $wgUser->getEditToken();
+ return $cachedOptionsToken;
+ }
+
public function execute() {
$this->params = $this->extractRequestParams();
if ( !is_null( $this->params['prop'] ) ) {
$data['fallback'] = $fallbacks;
$this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
+ if( $wgContLang->hasVariants() ) {
+ $variants = array();
+ foreach( $wgContLang->getVariants() as $code ) {
+ $variants[] = array( 'code' => $code );
+ }
+ $data['variants'] = $variants;
+ $this->getResult()->setIndexedTagName( $data['variants'], 'lang' );
+ }
+
if ( $wgContLang->isRTL() ) {
$data['rtl'] = '';
}
if ( MWNamespace::isContent( $ns ) ) {
$data[$ns]['content'] = '';
}
+
+ if ( MWNamespace::isNonincludableNamespace( $ns ) ) {
+ $data[$ns]['nonincludable'] = '';
+ }
}
$this->getResult()->setIndexedTagName( $data, 'ns' );
}
protected function getCurrentUserInfo() {
- global $wgRequest, $wgHiddenPrefs;
+ global $wgHiddenPrefs;
$user = $this->getUser();
$result = $this->getResult();
$vals = array();
}
if ( isset( $this->prop['acceptlang'] ) ) {
- $langs = $wgRequest->getAcceptLang();
+ $langs = $this->getRequest()->getAcceptLang();
$acceptLang = array();
foreach ( $langs as $lang => $val ) {
$r = array( 'q' => $val );
wfProfileIn( __METHOD__ );
$types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
$names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
- 'email', 'import', 'watch' );
+ 'email', 'import', 'watch', 'options' );
foreach ( $names as $name ) {
- $types[$name] = 'ApiQUeryInfo::get' . ucfirst( $name ) . 'Token';
+ $types[$name] = 'ApiQueryInfo::get' . ucfirst( $name ) . 'Token';
}
wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
ksort( $types );
* @return bool
*/
function isWriteQuery( $sql ) {
- return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|\(SELECT)\b/i', $sql );
+ return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
}
/**
/**
* A repository for files accessible via the local filesystem.
*
+ * 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 FileRepo
*/
/**
* Base code for file repositories.
*
+ * 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 FileRepo
*/
<?php
/**
- * Generic operation result for FileRepo-related operations
+ * Generic operation result for FileRepo-related operations.
+ *
+ * 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 FileRepo
/**
* Foreign repository accessible through api.php requests.
*
+ * 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 FileRepo
*/
# same repo.
$results[$k] = false;
unset( $files[$k] );
+ } elseif ( FileBackend::isStoragePath( $f ) ) {
+ $results[$k] = false;
+ unset( $files[$k] );
+ wfWarn( "Got mwstore:// path '$f'." );
}
}
*/
function getThumbUrlFromCache( $name, $width, $height, $params="" ) {
global $wgMemc;
+ // We can't check the local cache using FileRepo functions because
+ // we override fileExistsBatch(). We have to use the FileBackend directly.
+ $backend = $this->getBackend(); // convenience
if ( !$this->canCacheThumbs() ) {
$result = null; // can't pass "null" by reference, but it's ok as default value
$localFilename = $localPath . "/" . $fileName;
$localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
- if( $this->fileExists( $localFilename ) && isset( $metadata['timestamp'] ) ) {
+ if( $backend->fileExists( array( 'src' => $localFilename ) )
+ && isset( $metadata['timestamp'] ) )
+ {
wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
- $modified = $this->getFileTimestamp( $localFilename );
+ $modified = $backend->getFileTimestamp( array( 'src' => $localFilename ) );
$remoteModified = strtotime( $metadata['timestamp'] );
$current = time();
$diff = abs( $modified - $current );
}
# @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
- wfSuppressWarnings();
- $backend = $this->getBackend();
+ $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
$op = array( 'op' => 'create', 'dst' => $localFilename, 'content' => $thumb );
if( !$backend->doOperation( $op )->isOK() ) {
wfRestoreWarnings();
wfDebug( __METHOD__ . " could not write to thumb path\n" );
return $foreignUrl;
}
- wfRestoreWarnings();
$knownThumbUrls[$sizekey] = $localUrl;
$wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
<?php
/**
- * A foreign repository with an accessible MediaWiki database
+ * A foreign repository with an accessible MediaWiki 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 FileRepo
<?php
/**
- * A foreign repository with a MediaWiki database accessible via the configured LBFactory
+ * A foreign repository with a MediaWiki database accessible via the configured LBFactory.
+ *
+ * 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 FileRepo
* Local repository that stores files in the local filesystem and registers them
* in the wiki's own 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 FileRepo
*/
/**
* File repository with no 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
+ * (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 FileRepo
*/
<?php
/**
- * Prioritized list of file repositories
+ * Prioritized list of file repositories.
+ *
+ * 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 FileRepo
<?php
/**
+ * Non-directory file on the file 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
+ * (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 FileBackend
*/
<?php
/**
+ * File system based 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 FileBackend
* @author Aaron Schulz
}
$ok = copy( $params['src'], $dest );
- if ( !$ok ) {
+ // In some cases (at least over NFS), copy() returns true when it fails.
+ if ( !$ok || ( filesize( $params['src'] ) !== filesize( $dest ) ) ) {
+ if ( $ok ) { // PHP bug
+ unlink( $dest ); // remove broken file
+ trigger_error( __METHOD__ . ": copy() failed but returned true." );
+ }
$status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
return $status;
}
}
$ok = copy( $source, $dest );
- if ( !$ok ) {
+ // In some cases (at least over NFS), copy() returns true when it fails.
+ if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
+ if ( $ok ) { // PHP bug
+ unlink( $dest ); // remove broken file
+ trigger_error( __METHOD__ . ": copy() failed but returned true." );
+ }
$status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
return $status;
}
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_SELF | FilesystemIterator::SKIP_DOTS;
- return new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator( $dir, $flags ),
- RecursiveIteratorIterator::CHILD_FIRST // include dirs
- );
- } else { // PHP < 5.3
- # RecursiveDirectoryIterator extends DirectoryIterator
- return new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator( $dir ),
- RecursiveIteratorIterator::CHILD_FIRST // include dirs
- );
- }
+ # RecursiveDirectoryIterator extends FilesystemIterator.
+ # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
+ $flags = FilesystemIterator::CURRENT_AS_SELF | FilesystemIterator::SKIP_DOTS;
+ return new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator( $dir, $flags ),
+ RecursiveIteratorIterator::CHILD_FIRST // include dirs
+ );
}
}
*/
/**
+ * Base class for all file backends.
+ *
+ * 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 FileBackend
* @author Aaron Schulz
<?php
/**
+ * File backend registration handling.
+ *
+ * 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 FileBackend
* @author Aaron Schulz
/**
* Destroy the singleton instance
- *
+ *
* @return void
*/
public static function destroySingleton() {
/**
* Register file backends from the global variables
- *
+ *
* @return void
*/
protected function initFromGlobals() {
<?php
/**
+ * Proxy backend that mirrors writes to several internal backends.
+ *
+ * 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 FileBackend
* @author Aaron Schulz
<?php
/**
+ * Base class for all backends using particular storage medium.
+ *
+ * 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 FileBackend
* @author Aaron Schulz
<?php
/**
+ * Helper class for representing operations with transaction support.
+ *
+ * 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 FileBackend
* @author Aaron Schulz
<?php
/**
+ * OpenStack Swift based file 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 FileBackend
* @author Russ Nelson
<?php
/**
+ * Location holder of files stored temporarily
+ *
+ * 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 FileBackend
*/
<?php
/**
+ * Version of FileJournal that logs to a DB 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
+ *
* @file
* @ingroup FileJournal
* @author Aaron Schulz
*/
/**
+ * File operation journaling.
+ *
+ * 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 FileJournal
* @author Aaron Schulz
<?php
+/**
+ * Version of LockManager based on using DB table locks.
+ *
+ * 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 LockManager
+ */
/**
* Version of LockManager based on using DB table locks.
<?php
+/**
+ * Simple version of LockManager based on using FS lock 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
+ * (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 LockManager
+ */
/**
* Simple version of LockManager based on using FS lock files.
<?php
+/**
+ * Version of LockManager based on using lock daemon servers.
+ *
+ * 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 LockManager
+ */
/**
* Manage locks using a lock daemon server.
*/
/**
+ * Resource locking handling.
+ *
+ * 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 LockManager
* @author Aaron Schulz
<?php
+/**
+ * Lock manager registration handling.
+ *
+ * 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 LockManager
+ */
+
/**
* Class to handle file lock manager registration
*
<?php
/**
- * Deleted file in the 'filearchive' table
+ * Deleted file in the 'filearchive' 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
*
* @file
* @ingroup FileAbstraction
/**
* Base code for 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
+ * (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 FileAbstraction
*/
/**
* Foreign file accessible through api.php requests.
*
+ * 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 FileAbstraction
*/
<?php
/**
- * Foreign file with an accessible MediaWiki database
+ * Foreign file with an accessible MediaWiki 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 FileAbstraction
<?php
/**
- * Local file in the wiki's own database
+ * Local file in the wiki's own 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 FileAbstraction
<?php
/**
- * Old file in the oldimage table
+ * Old file in the oldimage 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
*
* @file
* @ingroup FileAbstraction
<?php
/**
- * File without associated database record
+ * File without associated database record.
+ *
+ * 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 FileAbstraction
/**
* Core installer command line interface.
*
+ * 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 Deployment
*/
/**
* DBMS-specific installation helper.
*
+ * 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 Deployment
*/
/**
* DBMS-specific updater helper.
*
+ * 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 Deployment
*/
/**
* IBM_DB2-specific installer.
*
+ * 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 Deployment
*/
/**
* IBM_DB2-specific updater.
*
+ * 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 Deployment
*/
<?php
+/**
+ * Installer-specific wikitext formating.
+ *
+ * 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
+ */
class InstallDocFormatter {
static function format( $text ) {
/**
* Base code for MediaWiki installer.
*
+ * 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 Deployment
*/
abstract class Installer {
// This is the absolute minimum PHP version we can support
- const MINIMUM_PHP_VERSION = '5.2.3';
+ const MINIMUM_PHP_VERSION = '5.3.2';
/**
* @var array
/**
* Generator for LocalSettings.php file.
*
+ * 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 Deployment
*/
/**
* MySQL-specific installer.
*
+ * 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 Deployment
*/
/**
* MySQL-specific updater.
*
+ * 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 Deployment
*/
// 1.20
array( 'addTable', 'config', 'patch-config.sql' ),
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
+ array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
);
}
/**
* Oracle-specific installer.
*
+ * 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 Deployment
*/
/**
* Oracle-specific updater.
*
+ * 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 Deployment
*/
/**
* PostgreSQL-specific installer.
*
+ * 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 Deployment
*/
/**
* PostgreSQL-specific updater.
*
+ * 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 Deployment
*/
array( 'addPgField', 'ipblocks', 'ipb_create_account', 'SMALLINT NOT NULL DEFAULT 1' ),
array( 'addPgField', 'ipblocks', 'ipb_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'ipblocks', 'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
+ array( 'addPgField', 'ipblocks', 'ipb_parent_block_id', 'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'logging', 'log_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'logging', 'log_id', "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
# New indexes
array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ),
array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ),
+ array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ),
array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
array( 'changeFkeyDeferrable', 'imagelinks', 'il_from', 'page(page_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_by', 'mwuser(user_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_parent_block_id', 'ipblocks(ipb_id) ON DELETE SET NULL' ),
array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ),
array( 'changeFkeyDeferrable', 'oldimage', 'oi_name', 'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
/**
* Sqlite-specific installer.
*
+ * 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 Deployment
*/
/**
* Sqlite-specific updater.
*
+ * 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 Deployment
*/
// 1.20
array( 'addTable', 'config', 'patch-config.sql' ),
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
+ array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
);
}
/**
* Core installer web interface.
*
+ * 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 Deployment
*/
/**
* Output handler for the web installer.
*
+ * 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 Deployment
*/
/**
* Base code for web installer 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
+ * (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 Deployment
*/
<?php
/**
+ * Interwiki table entry.
+ *
+ * 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
- * Interwiki table entry
*/
/**
<?php
/**
- * Job to fix double redirects after moving a page
+ * Job to fix double redirects after moving a page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup JobQueue
/**
* Old job for notification emails.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup JobQueue
*/
/**
* Job for notification emails.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup JobQueue
*/
<?php
/**
- * Job queue base code
+ * Job queue base 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
* @defgroup JobQueue JobQueue
/**
* Job to update links for a given title.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup JobQueue
*/
/**
* Job for asynchronous upload-by-url.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup JobQueue
*/
<?php
/**
- * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class
+ * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class.
+ *
+ * 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
*/
<?php
/**
+ * PHP port of CSSJanus.
+ *
* 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
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
*/
/**
<?php
/**
+ * Minification of CSS stylesheets.
+ *
* Copyright 2010 Wikimedia Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
* OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
- */
-
-/**
- * Transforms CSS data
- *
- * This class provides minification, URL remapping, URL extracting, and data-URL embedding.
*
* @file
* @version 0.1.1 -- 2010-09-11
* @copyright Copyright 2010 Wikimedia Foundation
* @license http://www.apache.org/licenses/LICENSE-2.0
*/
+
+/**
+ * Transforms CSS data
+ *
+ * This class provides minification, URL remapping, URL extracting, and data-URL embedding.
+ */
class CSSMin {
/* Constants */
<?php
+/**
+ * List of HTTP status codes.
+ *
+ * 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
+ */
+
/**
* @todo document
*/
<?php
+/**
+ * Simulation of Microsoft Internet Explorer's MIME type detection algorithm.
+ *
+ * @file
+ * @todo Define the exact license of this file.
+ */
/**
* This class simulates Microsoft Internet Explorer's terribly broken and
<?php
+/**
+ * Checks for validity of requested URL's 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
+ */
/**
* Internet Explorer derives a cache filename from a URL, and then in certain
/**
* JavaScript Minifier
*
+ * @file
+ * @author Paul Copperman <paul.copperman@gmail.com>
+ * @license Choose any of Apache, MIT, GPL, LGPL
+ */
+
+/**
* This class is meant to safely minify javascript code, while leaving syntactically correct
* programs intact. Other libraries, such as JSMin require a certain coding style to work
* correctly. OTOH, libraries like jsminplus, that do parse the code correctly are rather
* slow, because they construct a complete parse tree before outputting the code minified.
* So this class is meant to allow arbitrary (but syntactically correct) input, while being
* fast enough to be used for on-the-fly minifying.
- *
- * Author: Paul Copperman <paul.copperman@gmail.com>
- * License: choose any of Apache, MIT, GPL, LGPL
*/
-
class JavaScriptMinifier {
/* Class constants */
<?php
-
/**
* JSMinPlus version 1.4
*
*
* Latest version of this script: http://files.tweakers.net/jsminplus/jsminplus.zip
*
+ * @file
*/
/* ***** BEGIN LICENSE BLOCK *****
<?php
/**
- * Handler for Microsoft's bitmap format
+ * Handler for Microsoft's bitmap format.
+ *
+ * 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 Media
<?php
/**
- * Generic handler for bitmap images
+ * Generic handler for bitmap images.
+ *
+ * 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 Media
<?php
/**
-Class to deal with reconciling and extracting metadata from bitmap images.
-This is meant to comply with http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+ * Extraction of metadata from different bitmap image types.
+ *
+ * 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 Media
+ */
-This sort of acts as an intermediary between MediaHandler::getMetadata
-and the various metadata extractors.
-
-@todo other image formats.
-*/
+/**
+ * Class to deal with reconciling and extracting metadata from bitmap images.
+ * This is meant to comply with http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+ *
+ * This sort of acts as an intermediary between MediaHandler::getMetadata
+ * and the various metadata extractors.
+ *
+ * @todo other image formats.
+ * @ingroup Media
+ */
class BitmapMetadataHandler {
private $metadata = array();
<?php
/**
- * Handler for bitmap images that will be resized by clients
+ * Handler for bitmap images that will be resized by clients.
+ *
+ * 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 Media
<?php
/**
- * Handler for DjVu images
+ * Handler for DjVu images.
+ *
+ * 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 Media
<?php
/**
- * DjVu image handler
+ * DjVu image handler.
*
* Copyright © 2006 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
* http://www.gnu.org/copyleft/gpl.html
*
* @file
+ * @ingroup Media
*/
/**
<?php
/**
+ * Extraction and validation of image metadata.
+ *
* 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
/**
+ * Handler for bitmap images with exif metadata.
+ *
+ * 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 Media
*/
<?php
/**
+ * Formating of image metadata values into human readable form.
+ *
* 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
/**
* Handler for GIF images.
*
+ * 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 Media
*/
* Deliberately not using MWExceptions to avoid external dependencies, encouraging
* redistribution.
*
+ * 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 Media
*/
<?php
/**
- * Media-handling base classes and generic functionality
+ * Media-handling base classes and generic functionality.
+ *
+ * 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 Media
<?php
/**
-*Class for some IPTC functions.
+ * Class for some IPTC 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 Media
+ */
-*/
+/**
+ * Class for some IPTC functions.
+ *
+ * @ingroup Media
+ */
class IPTC {
/**
<?php
/**
+ * Handler for JPEG images.
+ *
+ * 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 Media
*/
<?php
/**
-* Class for reading jpegs and extracting metadata.
-* see also BitmapMetadataHandler.
-*
-* Based somewhat on GIFMetadataExtrator.
-*/
+ * Extraction of JPEG image metadata.
+ *
+ * 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 Media
+ */
+
+/**
+ * Class for reading jpegs and extracting metadata.
+ * see also BitmapMetadataHandler.
+ *
+ * Based somewhat on GIFMetadataExtrator.
+ *
+ * @ingroup Media
+ */
class JpegMetadataExtractor {
const MAX_JPEG_SEGMENTS = 200;
/**
* Base class for the output of file transformation methods.
*
+ * 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 Media
*/
/**
* Handler for PNG images.
*
+ * 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 Media
*/
<?php
/**
* PNG frame counter and metadata extractor.
+ *
* Slightly derived from GIFMetadataExtractor.php
* Deliberately not using MWExceptions to avoid external dependencies, encouraging
* redistribution.
*
+ * 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 Media
*/
/**
* Handler for SVG images.
*
+ * 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 Media
*/
<?php
/**
- * SVGMetadataExtractor.php
+ * Extraction of SVG image metadata.
*
* 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
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
*/
+/**
+ * @ingroup Media
+ */
class SVGMetadataExtractor {
static function getMetadata( $filename ) {
$svg = new SVGReader( $filename );
}
}
+/**
+ * @ingroup Media
+ */
class SVGReader {
const DEFAULT_WIDTH = 512;
const DEFAULT_HEIGHT = 512;
/**
* Handler for Tiff images.
*
+ * 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 Media
*/
* Specification in Gnome repository:
* http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=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 Media
*/
<?php
+/**
+ * Reader for XMP data containing properties relevant to images.
+ *
+ * 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 Media
+ */
+
/**
* Class for reading xmp data containing properties relevant to
* images, and spitting out an array that FormatExif accepts.
<?php
+/**
+ * Definitions for XMPReader class.
+ *
+ * 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 Media
+ */
+
/**
* This class is just a container for a big array
* used by XMPReader to determine which XMP items to
<?php
+/**
+ * Methods for validating XMP properties.
+ *
+ * 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 Media
+ */
+
/**
* This contains some static methods for
* validating XMP properties. See XMPInfo and XMPReader classes.
var $mLinkHolders;
var $mLinkID;
- var $mIncludeSizes, $mPPNodeCount, $mDefaultSort;
+ var $mIncludeSizes, $mPPNodeCount, $mHighestExpansionDepth, $mDefaultSort;
var $mTplExpandCache; # empty-frame expansion cache
var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
var $mExpensiveFunctionCount; # number of expensive parser function calls
'arg' => 0,
);
$this->mPPNodeCount = 0;
+ $this->mHighestExpansionDepth = 0;
$this->mDefaultSort = false;
$this->mHeadings = array();
$this->mDoubleUnderscores = array();
array_values( $tidyregs ),
$text );
}
- global $wgExpensiveParserFunctionLimit;
- if ( $this->mExpensiveFunctionCount > $wgExpensiveParserFunctionLimit ) {
- $this->limitationWarn( 'expensive-parserfunction', $this->mExpensiveFunctionCount, $wgExpensiveParserFunctionLimit );
+
+ if ( $this->mExpensiveFunctionCount > $this->mOptions->getExpensiveParserFunctionLimit() ) {
+ $this->limitationWarn( 'expensive-parserfunction',
+ $this->mExpensiveFunctionCount,
+ $this->mOptions->getExpensiveParserFunctionLimit()
+ );
}
wfRunHooks( 'ParserAfterTidy', array( &$this, &$text ) );
# Information on include size limits, for the benefit of users who try to skirt them
if ( $this->mOptions->getEnableLimitReport() ) {
$max = $this->mOptions->getMaxIncludeSize();
- $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/$wgExpensiveParserFunctionLimit\n";
+ $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/{$this->mOptions->getExpensiveParserFunctionLimit()}\n";
$limitReport =
"NewPP limit report\n" .
"Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
"Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
"Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n".
+ "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n".
$PFreport;
wfRunHooks( 'ParserLimitReport', array( $this, &$limitReport ) );
$text .= "\n<!-- \n$limitReport-->\n";
}
/**
- * Get the target language for the content being parsed. This is usually the
- * language that the content is in.
+ * Get the target language for the content being parsed. This is usually the
+ * language that the content is in.
*/
function getTargetLanguage() {
$target = $this->mOptions->getTargetLanguage();
$text = $this->maybeMakeExternalImage( $url );
if ( $text === false ) {
# Not an image, make a link
- $text = Linker::makeExternalLink( $url,
+ $text = Linker::makeExternalLink( $url,
$this->getConverterLanguage()->markNoConversion($url), true, 'free',
$this->getExternalLinkAttribs( $url ) );
# Register it in the output object...
}
if ( $this->getConverterLanguage()->hasVariants() ) {
- $selflink = $this->getConverterLanguage()->autoConvertToAllVariants(
+ $selflink = $this->getConverterLanguage()->autoConvertToAllVariants(
$this->mTitle->getPrefixedText() );
} else {
$selflink = array( $this->mTitle->getPrefixedText() );
* @private
*/
function braceSubstitution( $piece, $frame ) {
- global $wgNonincludableNamespaces, $wgContLang;
+ global $wgContLang;
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__.'-setup' );
# Load from database
if ( !$found && $title ) {
- $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
- wfProfileIn( $titleProfileIn ); // template in
+ if ( !Profiler::instance()->isPersistent() ) {
+ # Too many unique items can kill profiling DBs/collectors
+ $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+ wfProfileIn( $titleProfileIn ); // template in
+ }
wfProfileIn( __METHOD__ . '-loadtpl' );
if ( !$title->isExternal() ) {
if ( $title->isSpecialPage()
$isHTML = true;
$this->disableCache();
}
- } elseif ( $wgNonincludableNamespaces && in_array( $title->getNamespace(), $wgNonincludableNamespaces ) ) {
+ } elseif ( MWNamespace::isNonincludableNamespace( $title->getNamespace() ) ) {
$found = false; # access denied
wfDebug( __METHOD__.": template inclusion denied for " . $title->getPrefixedDBkey() );
} else {
* @return Boolean: false if the limit has been exceeded
*/
function incrementExpensiveFunctionCount() {
- global $wgExpensiveParserFunctionLimit;
$this->mExpensiveFunctionCount++;
- if ( $this->mExpensiveFunctionCount <= $wgExpensiveParserFunctionLimit ) {
- return true;
- }
- return false;
+ return $this->mExpensiveFunctionCount <= $this->mOptions->getExpensiveParserFunctionLimit();
}
/**
) );
# Context links: [[|name]] and [[name (context)|]]
- global $wgLegalTitleChars;
- $tc = "[$wgLegalTitleChars]";
+ $tc = '[' . Title::legalChars() . ']';
$nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
$p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/"; # [[ns:page (context)|]]
*/
var $mMaxTemplateDepth;
+ /**
+ * Maximum number of calls per parse to expensive parser functions
+ */
+ var $mExpensiveParserFunctionLimit;
+
/**
* Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
*/
function getMaxPPNodeCount() { return $this->mMaxPPNodeCount; }
function getMaxPPExpandDepth() { return $this->mMaxPPExpandDepth; }
function getMaxTemplateDepth() { return $this->mMaxTemplateDepth; }
+ /* @since 1.20 */
+ function getExpensiveParserFunctionLimit() { return $this->mExpensiveParserFunctionLimit; }
function getRemoveComments() { return $this->mRemoveComments; }
function getTemplateCallback() { return $this->mTemplateCallback; }
function getEnableLimitReport() { return $this->mEnableLimitReport; }
function setMaxIncludeSize( $x ) { return wfSetVar( $this->mMaxIncludeSize, $x ); }
function setMaxPPNodeCount( $x ) { return wfSetVar( $this->mMaxPPNodeCount, $x ); }
function setMaxTemplateDepth( $x ) { return wfSetVar( $this->mMaxTemplateDepth, $x ); }
+ /* @since 1.20 */
+ function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); }
function setRemoveComments( $x ) { return wfSetVar( $this->mRemoveComments, $x ); }
function setTemplateCallback( $x ) { return wfSetVar( $this->mTemplateCallback, $x ); }
function enableLimitReport( $x = true ) { return wfSetVar( $this->mEnableLimitReport, $x ); }
global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages,
$wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion,
$wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth,
- $wgCleanSignatures, $wgExternalLinkTarget;
+ $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit;
wfProfileIn( __METHOD__ );
$this->mMaxPPNodeCount = $wgMaxPPNodeCount;
$this->mMaxPPExpandDepth = $wgMaxPPExpandDepth;
$this->mMaxTemplateDepth = $wgMaxTemplateDepth;
+ $this->mExpensiveParserFunctionLimit = $wgExpensiveParserFunctionLimit;
$this->mCleanSignatures = $wgCleanSignatures;
$this->mExternalLinkTarget = $wgExternalLinkTarget;
}
wfProfileIn( __METHOD__ );
++$expansionDepth;
+ if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+ $this->parser->mHighestExpansionDepth = $expansionDepth;
+ }
if ( $root instanceof PPNode_DOM ) {
$root = $root->node;
return '<span class="error">Expansion depth limit exceeded</span>';
}
++$expansionDepth;
+ if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+ $this->parser->mHighestExpansionDepth = $expansionDepth;
+ }
$outStack = array( '', '' );
$iteratorStack = array( false, $root );
return '<span class="error">Expansion depth limit exceeded</span>';
}
++$expansionDepth;
+ if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+ $this->parser->mHighestExpansionDepth = $expansionDepth;
+ }
$outStack = array( '', '' );
$iteratorStack = array( false, $root );
return false;
}
+ /**
+ * Return whether this profiler stores data
+ *
+ * @see Profiler::logData()
+ * @return Boolean
+ */
+ public function isPersistent() {
+ return true;
+ }
+
public function setProfileID( $id ) {
$this->mProfileID = $id;
}
}
wfProfileOut( '-overhead-total' );
}
-
+
/**
* Counts the number of profiled function calls sitting under
* the given point in the call graph. Not the most efficient algo.
$rc = $dbw->affectedRows();
if ( $rc == 0 ) {
$dbw->insert('profiling', array ('pf_name' => $name, 'pf_count' => $eventCount,
- 'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
+ 'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
__METHOD__, array ('IGNORE'));
}
// When we upgrade to mysql 4.1, the insert+update
var $zeroEntry = array('cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0);
var $errorEntry;
+ public function isPersistent() {
+ /* Implement in output subclasses */
+ return false;
+ }
+
protected function addInitialStack() {
$this->errorEntry = $this->zeroEntry;
$this->errorEntry['count'] = 1;
str_repeat(" ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
}
}
-
+
function memoryDiff() {
$diff = memory_get_usage() - $this->memory;
$this->memory = memory_get_usage();
* @ingroup Profiler
*/
class ProfilerSimpleUDP extends ProfilerSimple {
+ public function isPersistent() {
+ return true;
+ }
+
public function logData() {
global $wgUDPProfilerHost, $wgUDPProfilerPort;
public function isStub() {
return true;
}
+ public function isPersistent() {
+ return false;
+ }
public function profileIn( $fn ) {}
public function profileOut( $fn ) {}
public function getOutput() {}
if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
# $s is the first link of the next chunk
- $t = Title::MakeTitle($namespace, $s->page_title);
+ $t = Title::makeTitle($namespace, $s->page_title);
$query = array( 'from' => $t->getText() );
if( $namespace )
}
$this->alreadyBlocked = true;
- $this->preErrors[] = array( 'ipb-needreblock', (string)$block->getTarget() );
+ $this->preErrors[] = array( 'ipb-needreblock', wfEscapeWikiText( (string)$block->getTarget() ) );
}
# We always need confirmation to do HideUser
# Link to unblock the specified user, or to a blank unblock form
if( $this->target instanceof User ) {
- $message = $this->msg( 'ipb-unblock-addr', $this->target->getName() )->parse();
+ $message = $this->msg( 'ipb-unblock-addr', wfEscapeWikiText( $this->target->getName() ) )->parse();
$list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() );
} else {
$message = $this->msg( 'ipb-unblock' )->parse();
public function onSuccess() {
$out = $this->getOutput();
$out->setPageTitle( $this->msg( 'blockipsuccesssub' ) );
- $out->addWikiMsg( 'blockipsuccesstext', $this->target );
+ $out->addWikiMsg( 'blockipsuccesstext', wfEscapeWikiText( $this->target ) );
}
}
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'";
}
protected function feedItem( $row ) {
- $title = Title::MakeTitle( intval( $row->rc_namespace ), $row->rc_title );
+ $title = Title::makeTitle( intval( $row->rc_namespace ), $row->rc_title );
if( $title ) {
$date = $row->rc_timestamp;
$comments = $title->getTalkPage()->getFullURL();
$links = array();
$links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log' ),
- wfMsgHtml( 'viewpagelogs' ),
+ $this->msg( 'viewpagelogs' )->escaped(),
array(),
array( 'page' => $this->targetObj->getPrefixedText() )
);
# Give a link to the page history
$links[] = Linker::linkKnown(
$this->targetObj,
- wfMsgHtml( 'pagehist' ),
+ $this->msg( 'pagehist' )->escaped(),
array(),
array( 'action' => 'history' )
);
$undelete = SpecialPage::getTitleFor( 'Undelete' );
$links[] = Linker::linkKnown(
$undelete,
- wfMsgHtml( 'deletedhist' ),
+ $this->msg( 'deletedhist' )->escaped(),
array(),
array( 'target' => $this->targetObj->getPrefixedDBkey() )
);
$this->getOutput()->addWikiMsg( 'revdelete-no-file' );
return;
}
- if( !$oimage->userCan( File::DELETED_FILE, $this->getUser() ) ) {
+ $user = $this->getUser();
+ if( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
$this->getOutput()->permissionRequired( 'suppressrevision' );
} else {
}
return;
}
- if ( !$this->getUser()->matchEditToken( $this->token, $archiveName ) ) {
+ if ( !$user->matchEditToken( $this->token, $archiveName ) ) {
+ $lang = $this->getLanguage();
$this->getOutput()->addWikiMsg( 'revdelete-show-file-confirm',
$this->targetObj->getText(),
- $this->getLanguage()->date( $oimage->getTimestamp() ),
- $this->getLanguage()->time( $oimage->getTimestamp() ) );
+ $lang->userDate( $oimage->getTimestamp(), $user ),
+ $lang->userTime( $oimage->getTimestamp(), $user ) );
$this->getOutput()->addHTML(
Xml::openElement( 'form', array(
'method' => 'POST',
'action' => $this->getTitle()->getLocalUrl(
'target=' . urlencode( $oimage->getName() ) .
'&file=' . urlencode( $archiveName ) .
- '&token=' . urlencode( $this->getUser()->getEditToken( $archiveName ) ) )
+ '&token=' . urlencode( $user->getEditToken( $archiveName ) ) )
)
) .
- Xml::submitButton( wfMsg( 'revdelete-show-file-submit' ) ) .
+ Xml::submitButton( $this->msg( 'revdelete-show-file-submit' )->text() ) .
'</form>'
);
return;
$out = Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) ),
'id' => 'mw-revdel-form-revisions' ) ) .
- Xml::fieldset( wfMsg( 'revdelete-legend' ) ) .
+ Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
$this->buildCheckBoxes() .
Xml::openElement( 'table' ) .
"<tr>\n" .
'<td class="mw-label">' .
- Xml::label( wfMsg( 'revdelete-log' ), 'wpRevDeleteReasonList' ) .
+ Xml::label( $this->msg( 'revdelete-log' )->text(), 'wpRevDeleteReasonList' ) .
'</td>' .
'<td class="mw-input">' .
Xml::listDropDown( 'wpRevDeleteReasonList',
- wfMsgForContent( 'revdelete-reason-dropdown' ),
- wfMsgForContent( 'revdelete-reasonotherlist' ), '', 'wpReasonDropDown', 1
+ $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->text(),
+ $this->msg( 'revdelete-reasonotherlist' )->inContentLanguage()->text(),
+ '', 'wpReasonDropDown', 1
) .
'</td>' .
"</tr><tr>\n" .
'<td class="mw-label">' .
- Xml::label( wfMsg( 'revdelete-otherreason' ), 'wpReason' ) .
+ Xml::label( $this->msg( 'revdelete-otherreason' )->text(), 'wpReason' ) .
'</td>' .
'<td class="mw-input">' .
Xml::input( 'wpReason', 60, $this->otherReason, array( 'id' => 'wpReason', 'maxlength' => 100 ) ) .
"</tr><tr>\n" .
'<td></td>' .
'<td class="mw-submit">' .
- Xml::submitButton( wfMsgExt('revdelete-submit','parsemag',$numRevisions),
+ Xml::submitButton( $this->msg( 'revdelete-submit', $numRevisions )->text(),
array( 'name' => 'wpSubmit' ) ) .
'</td>' .
"</tr>\n" .
$title = Title::makeTitle( NS_MEDIAWIKI, 'revdelete-reason-dropdown' );
$link = Linker::link(
$title,
- wfMsgHtml( 'revdelete-edit-reasonlist' ),
+ $this->msg( 'revdelete-edit-reasonlist' )->escaped(),
array(),
array( 'action' => 'edit' )
);
}
foreach( $this->checks as $item ) {
list( $message, $name, $field ) = $item;
- $innerHTML = Xml::checkLabel( wfMsg($message), $name, $name, $bitfield & $field );
+ $innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
if( $field == Revision::DELETED_RESTRICTED )
$innerHTML = "<b>$innerHTML</b>";
$line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
// Otherwise, use tri-state radios
} else {
$html .= '<tr>';
- $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-same').'</th>';
- $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-unset').'</th>';
- $html .= '<th class="mw-revdel-checkbox">'.wfMsgHtml('revdelete-radio-set').'</th>';
+ $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
+ $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
+ $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
$html .= "<th></th></tr>\n";
foreach( $this->checks as $item ) {
list( $message, $name, $field ) = $item;
$line = '<td class="mw-revdel-checkbox">' . Xml::radio( $name, -1, $selected == -1 ) . '</td>';
$line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 0, $selected == 0 ) . '</td>';
$line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 1, $selected == 1 ) . '</td>';
- $label = wfMsgHtml($message);
+ $label = $this->msg( $message )->escaped();
if( $field == Revision::DELETED_RESTRICTED ) {
$label = "<b>$label</b>";
}
$comment = $listReason;
if( $comment != 'other' && $this->otherReason != '' ) {
// Entry from drop down menu + additional comment
- $comment .= wfMsgForContent( 'colon-separator' ) . $this->otherReason;
+ $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
} elseif( $comment == 'other' ) {
$comment = $this->otherReason;
}
switch( $this->type ){
case Block::TYPE_USER:
case Block::TYPE_IP:
- $out->addWikiMsg( 'unblocked', $this->target );
+ $out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
break;
case Block::TYPE_RANGE:
- $out->addWikiMsg( 'unblocked-range', $this->target );
+ $out->addWikiMsg( 'unblocked-range', wfEscapeWikiText( $this->target ) );
break;
case Block::TYPE_ID:
case Block::TYPE_AUTO:
- $out->addWikiMsg( 'unblocked-id', $this->target );
+ $out->addWikiMsg( 'unblocked-id', wfEscapeWikiText( $this->target ) );
break;
}
}
}
$out->wrapWikiMsg(
"<div class='mw-undelete-pagetitle'>\n$1\n</div>\n",
- array( 'undeletepagetitle', $this->mTargetObj->getPrefixedText() )
+ array( 'undeletepagetitle', wfEscapeWikiText( $this->mTargetObj->getPrefixedText() ) )
);
$archive = new PageArchive( $this->mTargetObj );
* @return bool
*/
public function checkSvgScriptCallback( $element, $attribs ) {
- $stripped = $this->stripXmlNamespace( $element );
+ $strippedElement = $this->stripXmlNamespace( $element );
- if( $stripped == 'script' ) {
+ /*
+ * check for elements that can contain javascript
+ */
+ if( $strippedElement == 'script' ) {
wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
return true;
}
+ # e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
+ if( $strippedElement == 'handler' ) {
+ wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+ return true;
+ }
+
+ # SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
+ if( $strippedElement == 'stylesheet' ) {
+ wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+ return true;
+ }
+
foreach( $attribs as $attrib => $value ) {
$stripped = $this->stripXmlNamespace( $attrib );
+ $value = strtolower($value);
+
if( substr( $stripped, 0, 2 ) == 'on' ) {
- wfDebug( __METHOD__ . ": Found script attribute '$attrib'='value' in uploaded file.\n" );
+ wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
return true;
}
+
+ # href with javascript target
if( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
- wfDebug( __METHOD__ . ": Found script href attribute '$attrib'='$value' in uploaded file.\n" );
+ wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+ return true;
+ }
+
+ # href with embeded svg as target
+ if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
+ wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+ return true;
+ }
+
+ # href with embeded (text/xml) svg as target
+ if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
+ wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+ return true;
+ }
+
+ # use set/animate to add event-handler attribute to parent
+ if( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
+ wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
return true;
}
+
+ # use set to add href attribute to parent element
+ if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+ wfDebug( __METHOD__ . ": Found svg setting href attibute '$value' in uploaded file.\n" );
+ return true;
+ }
+
+ # use set to add a remote / data / script target to an element
+ if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ wfDebug( __METHOD__ . ": Found svg setting attibute to '$value' in uploaded file.\n" );
+ return true;
+ }
+
+
+ # use handler attribute with remote / data / script
+ if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
+ return true;
+ }
+
+ # use CSS styles to bring in remote code
+ # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
+ if( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+ foreach ($matches[1] as $match) {
+ if (!preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
+ wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
+ return true;
+ }
+ }
+ }
+
+ # image filters can pull in url, which could be svg that executes scripts
+ if( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
+ wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+ return true;
+ }
+
}
+
+ return false; //No scripts detected
}
private function stripXmlNamespace( $name ) {
# has structures (try/catch, foo()->bar(), etc etc) which throw parse errors in
# PHP 4. Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and
# 5.1, respectively.
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
wfPHPVersionError( 'index.php' );
}
'rw' => 'Kinyarwanda', # Kinyarwanda, should possibly be Kinyarwandi
'sa' => 'संस्कृतम्', # Sanskrit
'sah' => 'Саха тыла', # Sakha
+ 'sat' => 'Santali', # Santali
'sc' => 'Sardu', # Sardinian
'scn' => 'Sicilianu', # Sicilian
'sco' => 'Scots', # Scots
'resetpass-temp-password' => 'كلمة سر مؤقتة:',
# Special:PasswordReset
-'passwordreset' => 'تÙ\85ت إعادة ضبط Ù\83Ù\84Ù\85Ø© اÙ\84سر',
+'passwordreset' => 'إعادة ضبط كلمة السر',
'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
'passwordreset-legend' => 'إعادة تعيين كلمة السر',
'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
'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' => 'رفض الوصول',
'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' => 'نوع الصورة غير مدعوم',
'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' => 'яңы хәбәр',
'note' => "'''Иҫкәрмә:'''",
'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''
Һеҙҙең үҙгәртеүҙәр әле яҙылмаған!",
+'continue-editing' => 'Мөхәррирләүҙе дауам итергә',
'previewconflict' => 'Әлеге алдан ҡарау, мөхәррирләү тәҙрәһенең өҫтөндә, һаҡланғандан һуң текстың нисек күренәсәген күрһәтә.',
'session_fail_preview' => "'''Ҡыҙғанысҡа ҡаршы, һеҙҙең ултырыш идентификаторығыҙ юғалды. Һөҙөмтәлә үҙгәртеүҙәрегеҙ ҡабул ителмәйәсәк.
Зинһар, тағы бер тапҡыр ҡабатлағыҙ.
'edit-no-change' => 'Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.',
'edit-already-exists' => 'Яңы бит яһап булмай.
Ул былай ҙа бар.',
+'defaultmessagetext' => 'Алдан билдәләнгән яҙма',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Иғтибар:''' был биттә хәтерҙе күп ҡулланыусы функциялар ныҡ күп.
'backend-fail-internal' => '$1 һаҡлағысында билдәһеҙ хата килеп сыҡты',
'backend-fail-contenttype' => 'Файлды $1 адресына һаҡлар өсөн уның эстәлеге төрөн билдәләп булманы.',
+# File journal errors
+'filejournal-fail-dbconnect' => '"$1" мәғлүмәт базаһы журналына тоташып булманы.',
+'filejournal-fail-dbquery' => '«$1» мәғлүмәт базаһын һаҡлағын журналды яңыртып булманы.',
+
# Lock manager
'lockmanager-notlocked' => '" $1 " асҡысының биген сисеп булмай; ул бикле түгел.',
'lockmanager-fail-closelock' => '"$1" асҡысының бикләү файлын ябып булманы.',
'allpages-bad-ns' => '{{SITENAME}} проектында "$1" исемдәр арауығы юҡ.',
'allpages-hide-redirects' => 'Йүнәлтеүҙәрҙе йәшерергә',
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Һуңғы версияны ҡарарға',
+
# Special:Categories
'categories' => 'Категориялар',
'categoriespagetext' => 'Түбәндәге {{PLURAL:$1|категорияла|категорияларҙа}} биттәр йәки файлдар бар.
'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
'javascripttest-pagetext-noframework' => 'Был бит JavaScript тикшеренеүҙәре үткәреү өсөн резервланған.',
'javascripttest-pagetext-unknownframework' => 'Билдәһеҙ тикшеренеүҙәр мөхитнамәһе "$1".',
'javascripttest-pagetext-frameworks' => 'Зинһар өсөн киләһе тикшеренеүҙәр мөхитнамәһенең береһен һайлап алығыҙ: $1',
+'javascripttest-pagetext-skins' => 'Һынауҙы башлау өсөн тышса һыйлағыҙ.',
'javascripttest-qunit-intro' => 'mediawiki.org адресы буйынса ҡарағыҙ [$1 тест үткәреү документацияһы].',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit өсөн һынауҙар йыйлмаһы.',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Ҡулланыусы битегеҙ',
'tooltip-diff' => 'Сығанаҡ текстҡа ҡарата эшләгән үҙгәртеүҙәрҙе күрһәтергә.',
'tooltip-compareselectedversions' => 'Был биттең һайланған ике өлгөһө араһындағы айырманы ҡарарға',
'tooltip-watch' => 'Битте күҙәтеү исемлегемә өҫтәргә',
+'tooltip-watchlistedit-normal-submit' => 'Биттәрҙе юйырға',
'tooltip-watchlistedit-raw-submit' => 'Күҙәтеү исемлеген яңыртырға',
'tooltip-recreate' => 'Битте юйылған булыуына ҡарамаҫтан тергеҙергә',
'tooltip-upload' => 'Күсерә башларға',
'version-software' => 'Ҡуйылған программалар',
'version-software-product' => 'Продукт',
'version-software-version' => 'Өлгөһө',
+'version-entrypoints' => 'Инеш өсөн URL адрестар',
+'version-entrypoints-header-entrypoint' => 'Инеш урыны',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Файлға юл',
'feedback-bugnew' => 'Тикшерҙем. Яңы хата тураһында белдерергә',
# API errors
+'api-error-badaccess-groups' => 'Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй',
+'api-error-badtoken' => 'Эске хата: дөрөҫ булмаған токен',
+'api-error-copyuploaddisabled' => 'Был серверҙа URL адрес буйынса йөкләү өҙөлгән',
+'api-error-duplicate' => 'Бындай эстәлекле {{PLURAL:$1|[$2 файл]}} бар.',
+'api-error-duplicate-archive' => 'Сайтта бындай эстәлекле {{PLURAL:$1|[$2 башҡа файл]}} бар ине инде, ләкин {{PLURAL:$1|ул юйылды|улар юйылды}}',
+'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-filetype-banned' => 'Был файл төрө тыйылған.',
+'api-error-filetype-missing' => 'Был файлдың ҡушымтаһы юҡ',
+'api-error-hookaborted' => 'Һеҙ эшләргә теләгән үҙгәртеүҙәр ҡушымтаны тикшереүсе тарафынан өҙөлдө',
'api-error-http' => 'Эске хата: серверға бәйләнеп булмай.',
'api-error-illegal-filename' => 'Рөхсәт ителмәгән файл исеме.',
+'api-error-internal-error' => 'Эске хата: һеҙ викиға йөкләгәнде тикшергән ваҡытта хата китте',
+'api-error-invalid-file-key' => 'Эске хата: ваҡытлыса һаҡлағыста файл табылманы',
+'api-error-missingparam' => 'Эске хата: мөрәжәғеттең параматрҙары юҡ.',
+'api-error-missingresult' => 'Эске хата: күсереү уңышлы булыуын билдәләп булманы.',
'api-error-mustbeloggedin' => 'Файлдарҙы йөкмәтеү өсөн һеҙ сисемаға танышырға тейешһегеҙ.',
+'api-error-mustbeposted' => 'Эске хата: мөрәжәғәт HTTP POST адресын талап итә.',
+'api-error-noimageinfo' => 'Йөкләү уңышлы тамамланды, әммә сервер файл тураһында бер ниндәйҙә мәғлүмәт бирмәне.',
'api-error-nomodule' => 'Эске хата: тейәү модуле көйләнмәгән.',
'api-error-ok-but-empty' => 'Эске хата: серверҙан яуап юҡ.',
'api-error-overwrite' => 'Булған файлды алыштырыу рөхсәт ителмәй.',
+'api-error-stashfailed' => 'Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.',
'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' => 'Был файл боҙолған, йәки дөрөҫ булмаған ҡушымтаһы бар.',
+
+# Durations
+'duration-seconds' => 'секунд',
+'duration-minutes' => 'минут',
+'duration-hours' => 'сәғәт',
+'duration-days' => 'көн',
+'duration-weeks' => 'аҙна',
+'duration-years' => 'йыл',
+'duration-decades' => 'декада',
+'duration-centuries' => 'быуат',
+'duration-millennia' => 'меңйыллыҡ',
);
'category-empty' => '"Kada tadapat artikal maupun média dalam tumbung ini."',
'hidden-categories' => '{{PLURAL:$1|Tumbung tasungkup|Tutumbung tasungkup}}',
'hidden-category-category' => 'Tumbung tasungkup',
-'category-subcat-count' => '{{PLURAL:$2|Tumbung ini baisi asa sub-tumbung barikut.|Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut, matan sabarataan $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Tumbung ngini baisi asa sub-tumbung barikut.|Tumbung ngini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut, matan sabarataan $2.}}',
'category-subcat-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut.',
-'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
+'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ngini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
'category-article-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|asa tungkaran|$1 tutungkaran}} barikut.',
-'category-file-count' => '{{PLURAL:$2|Tumbung ini hanya baisi asa barakas barikut.|Tumbung ini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
+'category-file-count' => '{{PLURAL:$2|Tumbung ngini hanya baisi asa barakas barikut.|Tumbung ngini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
'category-file-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
'listingcontinuesabbrev' => 'samb.',
'index-category' => 'Tungkaran tasusun bapadalakan kata',
'otherlanguages' => 'Dalam bahasa lain',
'redirectedfrom' => '(Diugahakan matan $1)',
'redirectpagesub' => 'Tungkaran paugahan',
-'lastmodifiedat' => 'Tungkaran ini tauncit diubah pada $1, $2.',
+'lastmodifiedat' => 'Tungkaran ngini tauncit diubah pada $1, $2.',
'viewcount' => 'Tungkaran ini sudah diungkai {{PLURAL:$1|kali|$1 kali}}.',
'protectedpage' => 'Tungkaran nang dilindungi',
'jumpto' => 'Malacung ka',
'nosuchaction' => 'Kadada palakuan nangkaitu',
'nosuchactiontext' => 'Palakuan nang diminta URL kada sah.
Pian pinanya salah katik URL, atawa maumpati sabuah tautan nang kada bujur.
-Ini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
+Ngini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
'nosuchspecialpage' => 'Kadada tungkaran istimiwa nangitu',
'nospecialpagetext' => '<strong>Pian maminta tungkaran istimiwa nang kada sah.</strong>
Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:specialpages}}]].',
'error' => 'Kasalahan',
'databaseerror' => 'Kasalahan Basisdata',
'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Kasalahan ini pina manandai adanya sabuah bug dalam parangkat lunak.
+Kasalahan ngini pina manandai adanya sabuah bug dalam parangkat lunak.
Parmintaan basisdata yang tadudi adalah:
<blockquote><tt>$1</tt></blockquote>
matan dalam pungsi "<tt>$2</tt>".
"$1"
matan dalam pungsi "$2".
Basisdata kasalahan babulik "$3: $4".',
-'laggedslavemode' => "'''Paringatan:''' Tungkaran ini pinanya kada baisi parubahan tahanyar.",
+'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini pinanya kada baisi parubahan tahanyar.",
'readonly' => 'Basisdata tasunduk',
'enterlockreason' => 'Buati sabuah alasan manyunduk, tamasuk jua wayah apa handak dibuka pulang sundukannya.',
'readonlytext' => 'Basisdata lagi basunduk hagan masukan hanyar wan parubahan lain, pinanya pang lagi ada jadwal paharaguan basis data, imbah ini akan babulik nangkaya biasa.
Nangkaini biasanya dimargakan tautan lawas ka sabuah tungkaran nang halamnya sudah dihapus.
-Munnya lainan ini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
-Silakan lapurakan ini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
+Munnya lainan ngini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
+Silakan lapurakan ngini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
'missingarticle-rev' => '(ralatan#: $1)',
'missingarticle-diff' => '(Lain: $1, $2)',
'readonly_lag' => 'Basisdata sudah utumatis tasunduk pas server basisdata dua lagi marungkuti basisdata tatambaian',
'fileexistserror' => 'Kada kawa manulis ka barakas "$1": barakas sudah ada',
'unexpected' => 'Nilai kada sasuai harapan: "$1"="$2".',
'formerror' => 'Kasalahan: kada kawa mangirim purmulir',
-'badarticleerror' => 'Palakuan ini kada kawa dicungulakan pada tungkaran ini.',
+'badarticleerror' => 'Palakuan ngini kada kawa dicungulakan pada tungkaran ngini.',
'cannotdelete' => "Tungkaran atawa barakas ''$1'' kada kawa dihapus. Pinanya sudah dihapus urang lain badahulu.",
'cannotdelete-title' => 'Kada kawa mahapus tungkaran "$1"',
'badtitle' => 'Judul buruk',
'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-bahasa atawa antar-wiki.
Nangini bisa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
'perfcached' => 'Data barikut adalah timbuluk wan pina kada mutakhir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Data nang dudi ini adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'querypage-no-updates' => 'Pamugaan matan tungkaran ini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
+'perfcachedts' => 'Data nang dudi ni adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'querypage-no-updates' => 'Pamugaan matan tungkaran ngini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
'wrong_wfQuery_params' => 'Kada bujur ukuran ka wfQuery ()<br />
Pungsi: $1<br />
Parmintaan: $2',
'viewsource' => 'Tiringi asal mulanya',
'viewsource-title' => 'Tiringi asalmula matan $1',
'actionthrottled' => 'Kalakuan dikiripi',
-'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ini.
+'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ngini.
Muhun cubai pulang dalam babarapa minit.',
-'protectedpagetext' => 'Tungkaran ini sudah dilindungi hagan mancagah babakan.',
-'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ini:',
+'protectedpagetext' => 'Tungkaran ngini sudah dilindungi hagan mancagah babakan.',
+'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ngini:',
'viewyourtext' => "Pian kawa maniringi wan salain asalmula matan '''babakan pian''' ka tungkaran ngini:",
'protectedinterface' => 'Tungkaran ini manyadiakan naskah antarmuha gasan parangkat lunak, wan dilindungi hagan mancagah tasalah puruk.',
'editinginterface' => "'''Paringatan:''' Pian mambabak sabuah tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
-Parubahan ka tungkaran ini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
+Parubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
Gasan tarjamahan, muhun puruk [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
'sqlhidden' => '(Parmintaan SQL disungkupakan)',
'cascadeprotected' => 'Tungkaran ini sudah dilindungi matan pambabakan, marga nangini tamasuk dalam {{PLURAL:$1|tungkaran|tutungkaran}} dudi nang dilindungi "barénténg": $2',
'customcssprotected' => 'Pian kada baisi ijin mambabak tungkaran CSS ngini, karana ngini baisi setelan paribadi pamakai lain.',
'customjsprotected' => 'Pian kada baisi ijin mambabak tungkaran JavaScript ngini, karana ngini baisi setelan paribadi pamakai lain.',
'ns-specialprotected' => 'Tungkaran istimiwa kada kawa dibabak.',
-'titleprotected' => "Judul ini dilindungi matan paulahan ulih [[User:$1|$1]].
+'titleprotected' => "Judul ngini dilindungi matan paulahan ulih [[User:$1|$1]].
Alasan nang dibariakan adalah ''$2''.",
# Virus scanner
'virus-unknownscanner' => 'Antivirus kada dipinandui:',
# Login and logout pages
-'logouttext' => "'''Pian parhatan ini sudah kaluar log.'''
+'logouttext' => "'''Pian parhatan ni sudah kaluar log.'''
Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa [[Special:UserLogin|babuat log pulang]] sawagai pamakai nang sama atawa sawagai pamakai balain.
Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
Yakinakan Pian hudah mangkawa-akan cookies, muat pulang tungkaran naya wan cubai ja lagi.",
'noname' => 'Ngaran pamakai nang Pian ajuakan kada sah.',
'loginsuccesstitle' => 'Kulihan babuat log',
-'loginsuccess' => "'''Pian parhatan ini babuat log dalam {{SITENAME}} sawagai \"\$1\".'''",
+'loginsuccess' => "'''Pian parhatan ni babuat log dalam {{SITENAME}} sawagai \"\$1\".'''",
'nosuchuser' => 'Kadada pamakai bangaran "$1".
Ngaran pamakai adalah kasus marinci.
Lihati pulang ijaan Pian, atawa [[Special:UserLogin/signup|ulah sabuting akun hanyar]]',
'password-login-forbidden' => 'Mamakai ngaran wan katasunduk nangini hudah ditangati.',
'mailmypassword' => 'Kirimi kata sunduk hanyar',
'passwordremindertitle' => 'Kata sunduk pahadangan gasan {{SITENAME}}',
-'passwordremindertext' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting katasunduk hanyar gasan {{SITENAME}} ($4). Sabuting katasunduk pahadangan gasan pamakai "$2" hudah diulah wan disetel ka "$3". Amun bujur Pian nang maminta, Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Katasunduk pahadangan Pian akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
+'passwordremindertext' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting katasunduk hanyar gasan {{SITENAME}} ($4). Sabuting katasunduk pahadangan gasan pamakai "$2" hudah diulah wan disetel ka "$3". Amun bujur Pian nang maminta, Pian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Katasunduk pahadangan Pian akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
-Amun urang lain nang maminta ini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamakai katasunduk lawas Pian.',
+Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamakai katasunduk lawas Pian.',
'noemail' => 'Kadada alamat suril tarakam gasan pamakai "$1".',
'noemailcreate' => 'Pian parlu manyadiakan sabuah alamat suril nang sah',
'passwordsent' => 'Sabuting kata sunduk hanyar sudah dikirim ka suril tadaptar gasan "$1".
'accountcreated' => 'Akun diulah',
'accountcreatedtext' => 'Akun pamakai gasan $1 sudah diulah.',
'createaccount-title' => 'Paulahan akun gasan {{SITENAME}}',
-'createaccount-text' => 'Ada urang nang maulah akun gasan alam suril Pian pada {{SITENAME}} ($4) bangaran "$2", awan kata sunduk "$3".
-Pian dianjurakan babuat log wan maubah kata sunduk Pian parhatan ini.
+'createaccount-text' => 'Ada urang nang maulah akun gasan alamat suril Pian pada {{SITENAME}} ($4) bangaran "$2", awan kata sunduk "$3".
+Pian dianjurakan babuat log wan maubah kata sunduk Pian parhatan ni.
-Pian kawa kada mahual pasan ini, amun paulahan akun ini adalah kasalahan.',
+Pian kawa kada mahual pasan ngini, amun paulahan akun ini adalah kasalahan.',
'usernamehasherror' => 'Ngaran pamakai kada kawa mangandung tanda kurung',
'login-throttled' => 'Pian sudah kabanyakan mancuba babuat log.
Muhun hadangi dahulu sapandang hanyar cubai pulang.',
'retypenew' => 'Katik pulang katasunduk hanyar:',
'resetpass_submit' => 'Setel katasunduk wan babuat log',
'resetpass_success' => 'Katasunduk Pian bahasil diubah!
-Wayah ini Pian sudah babuat log...',
+Wayah ni Pian sudah babuat log...',
'resetpass_forbidden' => 'Katasunduk kada kawa diubah',
'resetpass-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
'resetpass-submit-loggedin' => 'Ubah katasunduk',
'resetpass-submit-cancel' => 'Walangi',
-'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ini kada sah.
+'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ni kada sah.
Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasunduk samantara hanyar.',
'resetpass-temp-password' => 'Katasunduk samantara:',
'passwordreset' => 'Bulikakan setelan katasunduk',
'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuah suril pangingat rarincian akun Pian.',
'passwordreset-legend' => 'Bulikakan setelan katasunduk',
-'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ini.',
+'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.',
'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
'passwordreset-username' => 'Ngaran pamakai:',
'passwordreset-domain' => 'Dumain:',
$2
{{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
-Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
+Pian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.',
'passwordreset-emailtext-user' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}
tarait awan suril:
$2
{{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.
-Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
+Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.',
'passwordreset-emailelement' => 'Ngaran pamakai: $1
Katasunduk pahadangan: $2',
'passwordreset-emailsent' => 'Sabuah suril pangingat sudah takirim.',
'changeemail' => 'Ganti alamat suril',
'changeemail-header' => 'Ganti akun alamat suril',
'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan parubahan ngini.',
-'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
-'changeemail-oldemail' => 'Alamat suril wayah ini:',
+'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ngini langsung.',
+'changeemail-oldemail' => 'Alamat suril wayah ni:',
'changeemail-newemail' => 'Alamat suril puga:',
'changeemail-none' => '(kadada)',
'changeemail-submit' => 'Ganti suril',
# Edit pages
'summary' => 'Kasimpulan:',
'subject' => 'Subyek/judul:',
-'minoredit' => 'Ini adalah babakan sapalih',
-'watchthis' => 'Itihi tungkaran ini',
+'minoredit' => 'Ngini adalah babakan sapalih',
+'watchthis' => 'Itihi tungkaran ngini',
'savearticle' => 'Simpan tungkaran',
'preview' => 'Tilik',
'showpreview' => 'Tampaiakan titilikan',
'showdiff' => 'Tampaiakan parubahan',
'anoneditwarning' => "'''Paringatan:''' Pian baluman babuat log.
Alamat IP Pian akan dirakam dalam tungkaran babakan halam",
-'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ini.''",
+'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ngini.''",
'missingsummary' => "'''Pangingat:''' Pian kada manyadiakan sabuah kasimpulan babakan.
Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada bakasimpulan.",
-'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ini.',
-'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ini.
+'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ngini.',
+'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ngini.
Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
'summary-preview' => 'Tilikan kasimpulan:',
'subject-preview' => 'Titilikan subyek/judul:',
'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,
+'noarticletext' => 'Parhatan ni kadada naskah di tungkaran ngini.
+Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>,
-atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ini]</span>.',
-'noarticletext-nopermission' => 'Parhatan ini kadada naskah di tungkaran ini.
-Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ini]] pintang tungkaran lain,
+atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ngini]</span>.',
+'noarticletext-nopermission' => 'Parhatan ni kadada naskah di tungkaran ngini.
+Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>.',
'userpage-userdoesnotexist' => 'Akun pamuruk "<nowiki>$1</nowiki>" kada tadaptar.
Muhun pariksa amun Pian handak maulah/mambabak tungkaran ini.',
'compareselectedversions' => 'Tandingakan ralatan nang dipilih',
'showhideselectedversions' => 'Tampaiakan/sungkupakan ralatan-ralatan',
'editundo' => 'walangi',
-'diff-multi' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih {{PLURAL:$2|asa pamuruk|$2 papamuruk}} kada ditampaiakan)',
+'diff-multi' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih {{PLURAL:$2|asa pamakai|$2 papamakai}} kada ditampaiakan)',
'diff-multi-manyusers' => '({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih labih pada $2 {{PLURAL:$2|pamuruk|papamuruk}} kada ditampaiakan)',
# Search results
'viewprevnext' => 'Tiringi ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Papilihan manggagai',
'searchmenu-exists' => "'''Ada tungkaran bangaran \"[[:\$1]]\" dalam wiki ini.'''",
-'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ini!'''",
+'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ngini!'''",
'searchhelp-url' => 'Help:Isi',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Janaki daptar tungkaran lawan awalan ngini]]',
'searchprofile-articles' => 'Tungkaran isi',
'search-result-score' => 'Kacucukan: $1%',
'search-redirect' => '(Paugahan $1)',
'search-section' => '(hagian $1)',
-'search-suggest' => 'Inikah maksud Pian: $1',
+'search-suggest' => 'Nginikah maksud Pian: $1',
'search-interwiki-caption' => 'Dingsanak rangka gawian',
'search-interwiki-default' => 'Kulihan $1',
'search-interwiki-more' => '(lagi)',
'prefs-help-realname' => 'Ngaran bujur adalah pilihan haja.
Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan gawian Pian.',
'prefs-help-email' => 'Alamat suril adalah opsional, tagal pun parlu gasan mambulikakan setelan katasunduk, amunai Pian kada ingatan.',
-'prefs-help-email-others' => 'Pian kawa jua maijinakan urang mangiau Pian lung tungkaran pamuruk atawa pamandiran Pian kada parlu manampaiakan identitas Pian.',
+'prefs-help-email-others' => 'Pian kawa jua maijinakan urang mangiau Pian lung tungkaran pamakai atawa pamandiran Pian kada parlu manampaiakan identitas Pian.',
'prefs-help-email-required' => 'Alamat suril diparluakan.',
'prefs-info' => 'Panjalasan pandal',
'prefs-i18n' => 'Intarnasionalisasi',
'recentchanges-legend' => 'Pilihan parubahan tahanyar',
'recentchangestext' => 'Jajak parubahan wiki pahanyarnya pada tungkaran ngini',
'recentchanges-feed-description' => 'Susuri parubahan pahanyarnya dalam wiki di kitihan ini',
-'recentchanges-label-newpage' => 'Babakan ini maulah sabuah tungkaran hanyar',
-'recentchanges-label-minor' => 'Ini adalah sabuah babakan sapalih',
-'recentchanges-label-bot' => 'Babakan ini digawi ulih saikung bot',
-'recentchanges-label-unpatrolled' => "Babakan ini baluman ta'awasi",
+'recentchanges-label-newpage' => 'Babakan ngini maulah sabuah tungkaran hanyar',
+'recentchanges-label-minor' => 'Ngini adalah sabuah babakan sapalih',
+'recentchanges-label-bot' => 'Babakan ngini digawi ulih saikung bot',
+'recentchanges-label-unpatrolled' => "Babakan ngini baluman ta'awasi",
'rcnote' => "Di bawah ni {{PLURAL:$1|'''1'''|'''$1'''}} parubahan tahanyar dalam {{PLURAL:$2|'''1''' hari|'''$2''' hari}} tauncit, sampai $4 pukul $5.",
'rcnotefrom' => "Di bawah ngini parubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' parubahan)",
'rclistfrom' => 'Tampaiakan parubahan tahanyar matan $1',
'rcshowhideminor' => '$1 pambabakan sapalih',
'rcshowhidebots' => '$1 bot',
-'rcshowhideliu' => '$1 pamuruk nang babuat di log',
-'rcshowhideanons' => '$1 pamuruk kada bangaran',
+'rcshowhideliu' => '$1 pamakai nang babuat di log',
+'rcshowhideanons' => '$1 pamakai kada bangaran',
'rcshowhidepatr' => "$1 babakan ta'awasi",
'rcshowhidemine' => '$1 babakan ulun',
'rclinks' => 'Tampaiakan $1 parubahan tahanyar dalam $2 hari tauncit<br />$3',
'recentchangeslinked-toolbox' => 'Parubahan tarait',
'recentchangeslinked-title' => 'Parubahan nang tarait lawan "$1"',
'recentchangeslinked-noresult' => 'Kadada parubahan pada tautan tutungkaran salawas wayah ditantuakan',
-'recentchangeslinked-summary' => "Ini adalah sabuah daptar parubahan nang diulah hahanyar ini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
+'recentchangeslinked-summary' => "Ngini adalah sabuah daptar parubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
Tutungkaran dalam [[Special:Watchlist|daptar itihan Pian]] ditandai '''kandal'''.",
'recentchangeslinked-page' => 'Ngaran tungkaran:',
'recentchangeslinked-to' => 'Tampaiakan parubahan matan tungkaran-tungkaran nang tataut lawan tungkaran nang disurungakan',
# File description page
'file-anchor-link' => 'Barakas',
'filehist' => 'Barakas halam',
-'filehist-help' => 'Klik pada tanggal/waktu gasan maniringi barakas ini pada wayah itu.',
+'filehist-help' => 'Klik pada tanggal/waktu gasan maniringi barakas ngini pada wayah itu.',
'filehist-deleteall' => 'hapus samunyaan',
'filehist-deleteone' => 'hapus',
'filehist-revert' => 'bulikakan',
'filehist-thumb' => 'Pahalusan',
'filehist-thumbtext' => 'Pahalusan gasan bantuk per $1',
'filehist-nothumb' => 'Kadada thumbnail',
-'filehist-user' => 'Pamuruk',
+'filehist-user' => 'Pamakai',
'filehist-dimensions' => 'Matra',
'filehist-filesize' => 'Ukuran barakas',
'filehist-comment' => 'Ulasan',
'filehist-missing' => 'Barakas hilang',
'imagelinks' => 'Tautan barakas',
-'linkstoimage' => '{{PLURAL:$1|tautan tungkaran|$1 tautan tungkaran}} dudi ka barakas ini:',
+'linkstoimage' => '{{PLURAL:$1|tautan tungkaran|$1 tautan tungkaran}} dudi ka barakas ngini:',
'linkstoimage-more' => 'Labihan pada $1 {{PLURAL:$1|tatautan tungkaran|tautan tutungkaran}} ka barakas ngini.
Daptar barikut manampaiakan {{PLURAL:$1|tautan panambaian tungkaran|$1 panambaian tatautan tungkaran}} ka barakas ngini haja.
Sabuah [[Special:WhatLinksHere/$2|daptar hibak]] tasadia.',
'activeusers-noresult' => 'Kadada papamuruk tatamu.',
# Special:Log/newusers
-'newuserlogpage' => 'Log pamuruk hanyar',
+'newuserlogpage' => 'Log pamakai hanyar',
'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
# Special:ListGroupRights
'blanknamespace' => '(Tatambaian)',
# Contributions
-'contributions' => 'Sumbangan pamuruk',
-'contributions-title' => 'Sumbangan pamuruk gasan $1',
+'contributions' => 'Sumbangan pamakai',
+'contributions-title' => 'Sumbangan pamakai gasan $1',
'mycontris' => 'Sumbangan ulun',
'contribsub2' => 'Gasan $1 ($2)',
'nocontribs' => 'Kadada parubahan taugai parsis awan karitaria ngini.',
'month' => 'Matan bulan (wan sabalumnya):',
'year' => 'Matan tahun (wan sabalumnya):',
-'sp-contributions-newbies' => 'Tampaiakan sumbangan pamuruk-pamuruk hanyar haja',
+'sp-contributions-newbies' => 'Tampaiakan sumbangan papamakai hanyar haja',
'sp-contributions-newbies-sub' => 'Gasan akun hanyar',
'sp-contributions-newbies-title' => 'Sumbangan pamuruk gasan akun hanyar',
'sp-contributions-blocklog' => 'Log blukir',
'sp-contributions-blocked-notice-anon' => 'Alamat IP ngini parhatan ini diblukir.
Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
'sp-contributions-search' => 'Gagai gasan sumbangan',
-'sp-contributions-username' => 'Alamat IP atawa ngaran pamuruk:',
+'sp-contributions-username' => 'Alamat IP atawa ngaran-pamakai:',
'sp-contributions-toponly' => 'Tampaiakan hanya ralatan tauncit',
'sp-contributions-submit' => 'Gagai',
'unblocked-range' => '$1 sudah dilapas blukirnya',
'unblocked-id' => 'Blukir $1 sudah dibuang',
'blocklist' => 'Pamuruk tablukir',
-'ipblocklist' => 'Pamuruk tablukir',
+'ipblocklist' => 'Pamakai tablukir',
'ipblocklist-legend' => 'Ugai saurang pamuruk tablukir',
'blocklist-userblocks' => 'Sungkupakan pamblukiran akun',
'blocklist-tempblocks' => 'Sungkupakan pamblukiran samantara',
'tooltip-pt-preferences' => 'Nang Pian katuju',
'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi parubahannya',
'tooltip-pt-mycontris' => 'Daptar sumbangan Pian',
-'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
+'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ngini kada kawajiban pang',
'tooltip-pt-anonlogin' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
'tooltip-pt-logout' => 'Kaluar',
'tooltip-ca-talk' => 'Pamandiran pasal isi tungkaran',
-'tooltip-ca-edit' => 'Pian kawa mambabak tungkaran ini. Tabéngkéng amun mamuruk picikan titilikan sabalum manyimpan',
+'tooltip-ca-edit' => 'Pian kawa mambabak tungkaran ngini. Tabéngkéng amun mamakai picikan titilikan sabalum manyimpan',
'tooltip-ca-addsection' => 'Mulai hagian hanyar',
-'tooltip-ca-viewsource' => 'Tungkaran ini dilindungi. Pian kawa maniring asal mulanya.',
-'tooltip-ca-history' => 'Raralatan bahari tungkaran ini',
+'tooltip-ca-viewsource' => 'Tungkaran ngini dilindungi. Pian kawa maniring asal mulanya.',
+'tooltip-ca-history' => 'Raralatan bahari tungkaran ngini',
'tooltip-ca-protect' => 'Lindungi tungkaran ini',
'tooltip-ca-unprotect' => 'Ganti parlindungan tungkaran ngini',
'tooltip-ca-delete' => 'Hapus tungkaran ini',
'tooltip-ca-undelete' => 'Bulikakan babakan ka tungkaran ini sabalum tungkaran ini dihapus',
-'tooltip-ca-move' => 'Pindahakan tungkaran ini',
-'tooltip-ca-watch' => 'Tambahi tungkaran ini ka daptar itihan Pian',
-'tooltip-ca-unwatch' => 'Buang tungkaran ini matan daptar itihan Pian',
+'tooltip-ca-move' => 'Pindahakan tungkaran ngini',
+'tooltip-ca-watch' => 'Tambahi tungkaran ngini ka daptar itihan Pian',
+'tooltip-ca-unwatch' => 'Buang tungkaran ngini matan daptar itihan Pian',
'tooltip-search' => 'Gagai {{SITENAME}}',
'tooltip-search-go' => 'Tulak ka sabuah tungkaran bangaran sama munnya sudah ada',
-'tooltip-search-fulltext' => 'Gagai tungkaran nang baisi naskah nangkaya ini',
+'tooltip-search-fulltext' => 'Gagai tungkaran nang baisi naskah nangkaya ngini',
'tooltip-p-logo' => 'Ilangi tungkaran tatambaian',
'tooltip-n-mainpage' => 'Ilangi tungkaran tatambaian',
'tooltip-n-mainpage-description' => 'Ilangi Tungkaran Tatambaian',
'tooltip-n-randompage' => 'Tampaiakan sabuah babarang tungkaran',
'tooltip-n-help' => 'Wadah maugai patulung',
'tooltip-t-whatlinkshere' => 'Daptar samunyaan tungkaran wiki nang ada tautan ka sia',
-'tooltip-t-recentchangeslinked' => 'Parubahan tahanyar dalam tutungkaran tataut matan tungkaran ini',
+'tooltip-t-recentchangeslinked' => 'Parubahan tahanyar dalam tutungkaran tataut matan tungkaran ngini',
'tooltip-feed-rss' => 'Kitihan RSS gasan tungkaran ini',
-'tooltip-feed-atom' => 'Kitihan Atum gasan tungkaran ini',
-'tooltip-t-contributions' => 'Tiringi daptar sumbangan pamuruk ini',
-'tooltip-t-emailuser' => 'Kirimi surel ka pamuruk ini',
+'tooltip-feed-atom' => 'Kitihan Atum gasan tungkaran ngini',
+'tooltip-t-contributions' => 'Sabuah daptar sumbangan pamakai ngini',
+'tooltip-t-emailuser' => 'Kirimi surel ka pamakai ini',
'tooltip-t-upload' => 'Hunggahakan babarakas',
'tooltip-t-specialpages' => 'Daptar samunyaan tungkaran istimiwa',
-'tooltip-t-print' => 'Nang kawa dicitaknya tungkaran ini',
-'tooltip-t-permalink' => 'Tautan tatap ka raralatan tungkaran ini',
+'tooltip-t-print' => 'Nang kawa dicitaknya tungkaran ngini',
+'tooltip-t-permalink' => 'Tautan tatap ka raralatan tungkaran ngini',
'tooltip-ca-nstab-main' => 'Tiringi tungkaran isi',
-'tooltip-ca-nstab-user' => 'Tiring tungkaran pamuruk',
+'tooltip-ca-nstab-user' => 'Tiring tungkaran pamakai',
'tooltip-ca-nstab-media' => 'Tiringi tungkaran media',
'tooltip-ca-nstab-special' => 'Nangini sabuah tungkaran istimiwa nang kada kawa dibabak.',
'tooltip-ca-nstab-project' => 'Tiringi tungkaran rangka gawian',
'tooltip-ca-nstab-category' => 'Lihati tungkaran tumbung',
'tooltip-minoredit' => 'Tandai ini sabagai sabuah pambabakan sapalih',
'tooltip-save' => 'Simpan parubahan Pian',
-'tooltip-preview' => 'Tilik parubahan Pian, muhun puruk ini sabalum manyimpan!',
+'tooltip-preview' => 'Tilik parubahan Pian, muhun pakai ngini sabalum manyimpan!',
'tooltip-diff' => 'Tampaiakan nang apa parubahan nang Pian ulah',
-'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ini',
+'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ngini',
'tooltip-watch' => 'Tambahakan tungkaran ini ka daptar itihan Pian',
'tooltip-recreate' => 'Ulah pulang tungkaran biar gin suah dihapus',
'tooltip-upload' => 'Mulai pangunggahan',
-'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ini matan panyumbang tauncit dalam sakali klik.',
-'tooltip-undo' => 'Mamantukakan ralatan ini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.',
+'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ngini matan panyumbang tauncit dalam sakali klik.',
+'tooltip-undo' => 'Mamantukakan ralatan ngini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.',
'tooltip-preferences-save' => 'Simpan kakatujuan',
'tooltip-summary' => 'Buati sabuah kasimpulan handap',
# Metadata
'metadata' => 'Metadata',
-'metadata-help' => 'Barakas ini mangandung panjalasan tambahan, mungkin ditambahakan ulih kudakan atawa paundai nang dipurukakan gasan maulah atawa digitalisasi barakas. Amun barakas ini sudah diubah, parincian nang ada mungkin kada sapanuhnya sasuai lawan barakas nang diubah.',
+'metadata-help' => 'Barakas ngini mangandung panjalasan tambahan, mungkin ditambahakan ulih kudakan atawa paundai nang dipurukakan gasan maulah atawa digitalisasi barakas. Amun barakas ngini sudah diubah, parincian nang ada mungkin kada sapanuhnya sasuai lawan barakas nang diubah.',
'metadata-expand' => 'Tampaiakan tambahan rincian',
'metadata-collapse' => 'Sungkupakan tambahan rincian',
'metadata-fields' => 'Pancitraan metadata tadaptar dalam pasan ngini akan masuk dalam tungkaran pancitraan wayah tabel metadata tasungkup. Nang lainnya cagaran babaku tasungkup.
'exif-urgency-other' => 'Ganti-suai utamaan ($1)',
# External editor support
-'edit-externally' => 'Babak barakas ini puruk sabuah aplikasi luar',
+'edit-externally' => 'Babak barakas ngini puruk sabuah aplikasi luar',
'edit-externally-help' => '(Lihati [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] untuk panjalasan labih)',
# 'all' in various places, this might be different for inflected languages
'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.',
$messages = array(
# Dates
-'sunday' => 'нєдѣлꙗ',
-'monday' => 'понедѣл҄ьникъ',
-'tuesday' => 'въторьникъ',
-'wednesday' => 'срѣда',
-'thursday' => 'чєтврьтъкъ',
-'friday' => 'пѧтъкъ',
-'saturday' => 'сѫбота',
-'sun' => 'н҃д',
-'mon' => 'п҃н',
-'tue' => 'в҃т',
-'wed' => 'с҃р',
-'thu' => 'ч҃т',
-'fri' => 'п҃т',
-'sat' => 'с҃б',
-'january' => 'їаноуарїи',
-'february' => 'фєвроуарїи',
-'march' => 'мартїи',
-'april' => 'апрїлїи',
-'may_long' => 'маїи',
-'june' => 'їоунїи',
-'july' => 'їоулїи',
-'august' => 'аѷгоустъ',
-'september' => 'сєптємврїи',
-'october' => 'октѡврїи',
-'november' => 'ноємврїи',
-'december' => 'дєкємврїи',
-'january-gen' => 'їаноуарїꙗ',
-'february-gen' => 'фєвроуарїꙗ',
-'march-gen' => 'мартїꙗ',
-'april-gen' => 'апрїлїꙗ',
-'may-gen' => 'маїꙗ',
-'june-gen' => 'їоунїꙗ',
-'july-gen' => 'їоулїꙗ',
-'august-gen' => 'аѷгоуста',
+'sunday' => 'нєдѣлꙗ',
+'monday' => 'понедѣл҄ьникъ',
+'tuesday' => 'въторьникъ',
+'wednesday' => 'срѣда',
+'thursday' => 'чєтврьтъкъ',
+'friday' => 'пѧтъкъ',
+'saturday' => 'сѫбота',
+'sun' => 'н҃д',
+'mon' => 'п҃н',
+'tue' => 'в҃т',
+'wed' => 'с҃р',
+'thu' => 'ч҃т',
+'fri' => 'п҃т',
+'sat' => 'с҃б',
+'january' => 'їаноуарїи',
+'february' => 'фєвроуарїи',
+'march' => 'мартїи',
+'april' => 'апрїлїи',
+'may_long' => 'маїи',
+'june' => 'їоунїи',
+'july' => 'їоулїи',
+'august' => 'аѷгоустъ',
+'september' => 'сєптємврїи',
+'october' => 'октѡврїи',
+'november' => 'ноємврїи',
+'december' => 'дєкємврїи',
+'january-gen' => 'їаноуарїꙗ',
+'february-gen' => 'фєвроуарїꙗ',
+'march-gen' => 'мартїꙗ',
+'april-gen' => 'апрїлїꙗ',
+'may-gen' => 'маїꙗ',
+'june-gen' => 'їоунїꙗ',
+'july-gen' => 'їоулїꙗ',
+'august-gen' => 'аѷгоуста',
'september-gen' => 'сєптємврїꙗ',
-'october-gen' => 'октѡврїꙗ',
-'november-gen' => 'ноємврїꙗ',
-'december-gen' => 'дєкємврїꙗ',
-'jan' => 'ꙗ҃н',
-'feb' => 'фє҃в',
-'mar' => 'ма҃р',
-'apr' => 'ап҃р',
-'may' => 'маїи',
-'jun' => 'їо҃ун',
-'jul' => 'їо҃ул',
-'aug' => 'аѵ҃г',
-'sep' => 'сє҃п',
-'oct' => 'ок҃т',
-'nov' => 'но҃є',
-'dec' => 'дє҃к',
+'october-gen' => 'октѡврїꙗ',
+'november-gen' => 'ноємврїꙗ',
+'december-gen' => 'дєкємврїꙗ',
+'jan' => 'ꙗ҃н',
+'feb' => 'фє҃в',
+'mar' => 'ма҃р',
+'apr' => 'ап҃р',
+'may' => 'маїи',
+'jun' => 'їо҃ун',
+'jul' => 'їо҃ул',
+'aug' => 'аѵ҃г',
+'sep' => 'сє҃п',
+'oct' => 'ок҃т',
+'nov' => 'но҃є',
+'dec' => 'дє҃к',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
-'category_header' => 'катигорїѩ ⁖ $1 ⁖ страницѧ',
-'subcategories' => 'подъкатигорїѩ',
-'hidden-categories' => '{{PLURAL:$1|съкрꙑта катигорїꙗ|съкрꙑти катигорїи|съкрꙑтꙑ катигорїѩ}}',
-'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
+'pagecategories' => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
+'category_header' => 'катигорїѩ ⁖ $1 ⁖ страницѧ',
+'subcategories' => 'подъкатигорїѩ',
+'hidden-categories' => '{{PLURAL:$1|съкрꙑта катигорїꙗ|съкрꙑти катигорїи|съкрꙑтꙑ катигорїѩ}}',
+'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
'listingcontinuesabbrev' => '· вѧщє',
'linkprefix' => '/^(.*?)(„|«)$/sD',
-'about' => 'опьсаниѥ',
-'article' => 'члѣнъ',
-'newwindow' => '(иномь окънѣ)',
+'about' => 'опьсаниѥ',
+'article' => 'члѣнъ',
+'newwindow' => '(иномь окънѣ)',
'moredotdotdot' => 'вѧщє ···',
-'mypage' => 'моꙗ страница',
-'mytalk' => 'моꙗ бєсѣда',
-'navigation' => 'плаваниѥ',
-'and' => ' и',
+'mypage' => 'моꙗ страница',
+'mytalk' => 'моꙗ бєсѣда',
+'navigation' => 'плаваниѥ',
+'and' => ' и',
# Cologne Blue skin
-'qbedit' => 'исправи',
-'qbpageoptions' => 'си страни́ца',
-'qbmyoptions' => 'моꙗ страницѧ',
+'qbedit' => 'исправи',
+'qbpageoptions' => 'си страни́ца',
+'qbmyoptions' => 'моꙗ страницѧ',
'qbspecialpages' => 'нарочьнꙑ страницѧ',
-'faq' => 'чѧстꙑ въпросꙑ',
+'faq' => 'чѧстꙑ въпросꙑ',
# Vector skin
'vector-action-addsection' => 'новꙑ бєсѣдꙑ чѧсти сътворѥниѥ',
-'vector-action-delete' => 'поничьжєниѥ',
-'vector-action-move' => 'прѣимєнованиѥ',
-'vector-action-protect' => 'ꙁабранѥниѥ',
-'vector-action-unprotect' => 'поущєниѥ',
-'vector-view-create' => 'сътворѥниѥ',
-'vector-view-edit' => 'исправи',
-'vector-view-history' => 'їсторїꙗ',
-'vector-view-view' => 'чьтѥниѥ',
-'vector-view-viewsource' => 'страницѧ источьнъ обраꙁъ',
-'actions' => 'дѣиства',
-'namespaces' => 'имєнъ просторꙑ',
-
-'errorpagetitle' => 'блаꙁна',
-'tagline' => '{{grammar:genitive|{{SITENAME}}}} страница',
-'help' => 'помощь',
-'search' => 'исканиѥ',
-'searchbutton' => 'ищи',
-'go' => 'прѣиди',
-'searcharticle' => 'прѣиди',
-'history' => 'страницѧ їсторїꙗ',
-'history_short' => 'їсторїꙗ',
-'printableversion' => 'пєчатьнъ обраꙁъ',
-'permalink' => 'въиньна съвѧꙁь',
-'print' => 'пєчатаниѥ',
-'edit' => 'исправи',
-'create' => 'сътворѥниѥ',
-'editthispage' => 'си страницѧ исправлѥниѥ',
-'create-this-page' => 'си страницѧ сътворѥниѥ',
-'delete' => 'поничьжєниѥ',
-'deletethispage' => 'си страницѧ поничьжєниѥ',
-'protect' => 'ꙁабранѥниѥ',
-'protect_change' => 'иꙁмѣнѥниѥ',
-'protectthispage' => 'си страницѧ ꙁабранєниѥ',
-'unprotect' => 'поущєниѥ',
-'newpage' => 'нова страница',
-'talkpage' => 'си страницѧ бєсѣда',
-'talkpagelinktext' => 'бєсѣда',
-'specialpage' => 'нарочьна страница',
-'personaltools' => 'моꙗ орѫдиꙗ',
-'postcomment' => 'нова чѧсть',
-'talk' => 'бєсѣда',
-'toolbox' => 'орѫдиꙗ',
-'otherlanguages' => 'дроугꙑ ѩꙁꙑкꙑ',
-'redirectedfrom' => '(прѣнаправлѥниѥ отъ ⁖ $1 ⁖)',
-'redirectpagesub' => 'прѣнаправлѥниѥ',
-'lastmodifiedat' => 'страницѧ послѣдьнꙗ мѣна сътворѥна $2 · $1 бѣ ⁙',
-'jumpto' => 'прѣиди къ :',
-'jumptonavigation' => 'плаваниѥ',
-'jumptosearch' => 'исканиѥ',
+'vector-action-delete' => 'поничьжєниѥ',
+'vector-action-move' => 'прѣимєнованиѥ',
+'vector-action-protect' => 'ꙁабранѥниѥ',
+'vector-action-unprotect' => 'иꙁмѣни ꙁабранѥниꙗ обраꙁъ',
+'vector-view-create' => 'сътворѥниѥ',
+'vector-view-edit' => 'исправи',
+'vector-view-history' => 'їсторїꙗ',
+'vector-view-view' => 'чьтѥниѥ',
+'vector-view-viewsource' => 'страницѧ источьнъ обраꙁъ',
+'actions' => 'дѣиства',
+'namespaces' => 'имєнъ просторꙑ',
+
+'errorpagetitle' => 'блаꙁна',
+'tagline' => '{{grammar:genitive|{{SITENAME}}}} страница',
+'help' => 'помощь',
+'search' => 'исканиѥ',
+'searchbutton' => 'ищи',
+'go' => 'прѣиди',
+'searcharticle' => 'прѣиди',
+'history' => 'страницѧ їсторїꙗ',
+'history_short' => 'їсторїꙗ',
+'printableversion' => 'пєчатьнъ обраꙁъ',
+'permalink' => 'въиньна съвѧꙁь',
+'print' => 'пєчатаниѥ',
+'edit' => 'исправи',
+'create' => 'сътворѥниѥ',
+'editthispage' => 'си страницѧ исправлѥниѥ',
+'create-this-page' => 'си страницѧ сътворѥниѥ',
+'delete' => 'поничьжєниѥ',
+'deletethispage' => 'си страницѧ поничьжєниѥ',
+'protect' => 'ꙁабранѥниѥ',
+'protect_change' => 'иꙁмѣнѥниѥ',
+'protectthispage' => 'си страницѧ ꙁабранєниѥ',
+'unprotect' => 'поущєниѥ',
+'newpage' => 'нова страница',
+'talkpage' => 'си страницѧ бєсѣда',
+'talkpagelinktext' => 'бєсѣда',
+'specialpage' => 'нарочьна страница',
+'personaltools' => 'моꙗ орѫдиꙗ',
+'postcomment' => 'нова чѧсть',
+'talk' => 'бєсѣда',
+'toolbox' => 'орѫдиꙗ',
+'otherlanguages' => 'дроугꙑ ѩꙁꙑкꙑ',
+'redirectedfrom' => '(прѣнаправлѥниѥ отъ ⁖ $1 ⁖)',
+'redirectpagesub' => 'прѣнаправлѥниѥ',
+'lastmodifiedat' => 'страницѧ послѣдьнꙗ мѣна сътворѥна $2 · $1 бѣ ⁙',
+'jumpto' => 'прѣиди къ :',
+'jumptonavigation' => 'плаваниѥ',
+'jumptosearch' => 'исканиѥ',
'pool-errorunknown' => 'нєвѣдома блаꙁна',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'О {{grammar:instrumental|{{SITENAME}}}}',
-'aboutpage' => 'Project:О сѥмь опꙑтьствовании',
-'copyright' => 'подъ прощєниѥмь $1 пьсано ѥстъ',
-'copyrightpage' => '{{ns:project}}:Творьцъ права',
-'currentevents' => 'сѫщѧѩ вѣщи',
-'currentevents-url' => 'Project:Сѫщѧѩ вѣщи',
-'edithelp' => 'помощь по исправлѥниѭ',
-'edithelppage' => 'Help:Исправлѥниѥ страницѧ',
-'helppage' => 'Help:Каталогъ',
-'mainpage' => 'главьна страница',
+'aboutsite' => 'О {{grammar:instrumental|{{SITENAME}}}}',
+'aboutpage' => 'Project:О сѥмь опꙑтьствовании',
+'copyright' => 'подъ прощєниѥмь $1 пьсано ѥстъ',
+'copyrightpage' => '{{ns:project}}:Творьцъ права',
+'currentevents' => 'сѫщѧѩ вѣщи',
+'currentevents-url' => 'Project:Сѫщѧѩ вѣщи',
+'edithelp' => 'помощь по исправлѥниѭ',
+'edithelppage' => 'Help:Исправлѥниѥ страницѧ',
+'helppage' => 'Help:Каталогъ',
+'mainpage' => 'главьна страница',
'mainpage-description' => 'главьна страница',
-'policy-url' => 'Project:Полїтїка',
-'portal' => 'обьщєниꙗ съвѣтъ',
-'portal-url' => 'Project:Обьщєниꙗ съвѣтъ',
-
-'pagetitle' => '$1 · {{SITENAME}}',
-'retrievedfrom' => 'поѩто иꙁ ⁖ $1 ⁖',
-'youhavenewmessages' => '$1 тєбѣ напьсанꙑ сѫтъ ($2)',
-'newmessageslink' => 'нови напьсаниꙗ',
+'policy-url' => 'Project:Полїтїка',
+'portal' => 'обьщєниꙗ съвѣтъ',
+'portal-url' => 'Project:Обьщєниꙗ съвѣтъ',
+
+'pagetitle' => '$1 · {{SITENAME}}',
+'retrievedfrom' => 'поѩто иꙁ ⁖ $1 ⁖',
+'youhavenewmessages' => '$1 тєбѣ напьсанꙑ сѫтъ ($2)',
+'newmessageslink' => 'нови напьсаниꙗ',
'newmessagesdifflink' => 'послѣдьнꙗ мѣна',
-'editsection' => 'исправи',
-'editold' => 'исправи',
-'viewsourceold' => 'страницѧ источьнъ обраꙁъ',
-'editlink' => 'исправи',
-'viewsourcelink' => 'страницѧ источьнъ обраꙁъ',
-'editsectionhint' => 'исправлѥниѥ чѧсти : $1',
-'toc' => 'каталогъ',
-'showtoc' => 'виждь',
-'hidetoc' => 'съкрꙑи',
-'viewdeleted' => '$1 видєти хощєши ;',
-'red-link-title' => '$1 (си страницѧ нѣстъ)',
+'editsection' => 'исправи',
+'editold' => 'исправи',
+'viewsourceold' => 'страницѧ источьнъ обраꙁъ',
+'editlink' => 'исправи',
+'viewsourcelink' => 'страницѧ источьнъ обраꙁъ',
+'editsectionhint' => 'исправлѥниѥ чѧсти : $1',
+'toc' => 'каталогъ',
+'showtoc' => 'виждь',
+'hidetoc' => 'съкрꙑи',
+'viewdeleted' => '$1 видєти хощєши ;',
+'red-link-title' => '$1 (си страницѧ нѣстъ)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'члѣнъ',
-'nstab-user' => 'польꙃєватєл҄ь',
-'nstab-media' => 'срѣдьства',
-'nstab-special' => 'нарочьна',
-'nstab-project' => 'съвѣтъ',
-'nstab-image' => 'дѣло',
+'nstab-main' => 'члѣнъ',
+'nstab-user' => 'польꙃєватєл҄ь',
+'nstab-media' => 'срѣдьства',
+'nstab-special' => 'нарочьна',
+'nstab-project' => 'съвѣтъ',
+'nstab-image' => 'дѣло',
'nstab-mediawiki' => 'напьсаниѥ',
-'nstab-template' => 'обраꙁьць',
-'nstab-help' => 'страница помощи',
-'nstab-category' => 'катигорїꙗ',
+'nstab-template' => 'обраꙁьць',
+'nstab-help' => 'страница помощи',
+'nstab-category' => 'катигорїꙗ',
# General errors
-'error' => 'блаꙁна',
+'error' => 'блаꙁна',
'viewsource' => 'страницѧ источьнъ обраꙁъ',
# Login and logout pages
-'yourname' => 'твоѥ имѧ',
-'yourpassword' => 'таино слово напиши',
-'yourpasswordagain' => 'опакꙑ таиноѥ слово напиши',
-'login' => 'въниди',
+'yourname' => 'твоѥ имѧ',
+'yourpassword' => 'таино слово напиши',
+'yourpasswordagain' => 'опакꙑ таиноѥ слово напиши',
+'login' => 'въниди',
'nav-login-createaccount' => 'въниди / съꙁижди си мѣсто',
-'userlogin' => 'въниди / съꙁижди си мѣсто',
-'userloginnocreate' => 'въниди',
-'logout' => 'ис̾ходъ',
-'userlogout' => 'ис̾ходъ',
-'nologin' => 'мѣсто ти нѣстъ ли ? $1',
-'nologinlink' => 'съꙁижди си мѣсто',
-'createaccount' => 'съꙁижди си мѣсто',
-'gotaccount' => 'мѣсто ти ѥстъ ли? $1',
-'gotaccountlink' => 'въниди',
-'createaccountreason' => 'какъ съмꙑслъ :',
-'userexists' => 'сѫщє польꙃєватєлꙗ имѧ пьса ⁙ ино иꙁобрѧщи',
-'loginerror' => 'въхода блаꙁна',
-'accountcreated' => 'мѣсто сътворєно ѥстъ',
-'loginlanguagelabel' => 'ѩꙁꙑкъ : $1',
+'userlogin' => 'въниди / съꙁижди си мѣсто',
+'userloginnocreate' => 'въниди',
+'logout' => 'ис̾ходъ',
+'userlogout' => 'ис̾ходъ',
+'nologin' => 'мѣсто ти нѣстъ ли ? $1',
+'nologinlink' => 'съꙁижди си мѣсто',
+'createaccount' => 'съꙁижди си мѣсто',
+'gotaccount' => 'мѣсто ти ѥстъ ли? $1',
+'gotaccountlink' => 'въниди',
+'createaccountreason' => 'какъ съмꙑслъ :',
+'userexists' => 'сѫщє польꙃєватєлꙗ имѧ пьса ⁙ ино иꙁобрѧщи',
+'loginerror' => 'въхода блаꙁна',
+'accountcreated' => 'мѣсто сътворєно ѥстъ',
+'loginlanguagelabel' => 'ѩꙁꙑкъ : $1',
# Change password dialog
-'resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
-'oldpassword' => 'старо таино слово :',
-'newpassword' => 'ново таино слово :',
+'resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
+'oldpassword' => 'старо таино слово :',
+'newpassword' => 'ново таино слово :',
'resetpass-submit-loggedin' => 'таина словєсє иꙁмѣнѥниѥ',
# Special:PasswordReset
'passwordreset-username' => 'польꙃєватєлꙗ имѧ :',
# Edit page toolbar
-'link_sample' => 'съвѧꙁи имѧ',
-'link_tip' => 'вънѫтрьнꙗ съвѧꙁь',
+'link_sample' => 'съвѧꙁи имѧ',
+'link_tip' => 'вънѫтрьнꙗ съвѧꙁь',
'extlink_sample' => 'http://www.example.com съвѧꙁи имѧ',
-'extlink_tip' => 'вънѣщьнꙗ съвѧꙁь (помьни о http://)',
-'media_tip' => 'дѣла съвѧꙁь',
-'sig_tip' => 'твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь',
+'extlink_tip' => 'вънѣщьнꙗ съвѧꙁь (помьни о http://)',
+'media_tip' => 'дѣла съвѧꙁь',
+'sig_tip' => 'твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь',
# Edit pages
-'summary' => 'опьсаниѥ :',
-'minoredit' => 'малаꙗ мѣна',
-'watchthis' => 'си страницѧ блюдєниѥ',
-'savearticle' => 'съхранѥниѥ',
-'showpreview' => 'мѣнꙑ поꙁьрѣниѥ (бєꙁ съхранѥниꙗ)',
-'blockedtitle' => 'польꙃєватєл҄ь ꙁаграждєнъ ѥстъ',
-'loginreqlink' => 'въниди',
-'newarticle' => '(новъ)',
-'noarticletext' => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
+'summary' => 'опьсаниѥ :',
+'minoredit' => 'малаꙗ мѣна',
+'watchthis' => 'си страницѧ блюдєниѥ',
+'savearticle' => 'съхранѥниѥ',
+'showpreview' => 'мѣнꙑ поꙁьрѣниѥ (бєꙁ съхранѥниꙗ)',
+'blockedtitle' => 'польꙃєватєл҄ь ꙁаграждєнъ ѥстъ',
+'loginreqlink' => 'въниди',
+'newarticle' => '(новъ)',
+'noarticletext' => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
[[Special:Search/{{PAGENAME}}|си страницѧ имѧ искати]] дроугꙑ страницѧ ·
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} съвѧꙁанꙑ їсторїѩ видѣти] ·
или [{{fullurl:{{FULLPAGENAME}}|action=edit}} ѭжє исправити]</span> можєши',
'noarticletext-nopermission' => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
[[Special:Search/{{PAGENAME}}|си страницѧ имѧ искати]] дроугꙑ страницѧ или
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} съвѧꙁанꙑ їсторїѩ видѣти]</span> можєши',
-'userpage-userdoesnotexist' => 'польꙃєватєльска мѣста ⁖ $1 ⁖ нꙑнѣ нѣстъ ⁙
+'userpage-userdoesnotexist' => 'польꙃєватєльска мѣста ⁖ $1 ⁖ нꙑнѣ нѣстъ ⁙
прѣдъ сътворѥниѥмь или исправлѥниѥмь си страницѧ помꙑсли жє ащє исто тъ дѣиство ноуждьно ли',
-'clearyourcache' => 'НАРОЧИТО: По съхранѥнии можєши обити своѥго съмотрила съхранъ да видѣлъ би мѣнꙑ ⁙ Mozilla ли Firefox ли Safari ли жьмꙑи Shift а мꙑшиѭ жьми Reload или жьми Ctrl-Shift-R (Cmd-Shift-R вън Apple Mac) ⁙ Konqueror ли жьми кромѣ Reload или F5 ⁙ Опєрꙑ польꙃєватєльмъ можєть бꙑти ноужда пльнѣ поничьжити ихъ съмотрила съхранъ въ Tools > Preferences ⁙ IE ли жьмꙑи Ctrl а мꙑшиѭ жьми Refresh или жьми Ctrl-F5',
-'note' => "'''НАРОЧИТО:'''",
-'editing' => 'исправлѥниѥ: $1',
-'editingsection' => 'исправлѥниѥ ⁖ $1 ⁖ (чѧсть)',
-'editingcomment' => 'исправлѥниѥ ⁖ $1 ⁖ (нова чѧсть)',
-'templatesused' => 'сѥѩ страницѧ {{PLURAL:$1|сь обраꙁьць польꙃоуѥтъ сѧ ѥстъ|с҄и обраꙁьца польꙃоуѭтъ сѧ ѥстє|с҄и обраꙁьци польꙃоуѭтъ сѧ сѫтъ}} :',
-'template-protected' => '(ꙁабранєно ѥстъ)',
-'template-semiprotected' => '(чѧстьно ꙁабранѥно)',
+'clearyourcache' => "'''НАРОЧИТО''': По съхранѥнии можєши обити своѥго съмотрила съхранъ да видѣлъ би мѣнꙑ
+* '''Mozilla ли Firefox ли Safari''' ли жьмꙑи Shift а мꙑшиѭ жьми Reload или жьми Ctrl-Shift-R (⌘-R вън Apple Mac)
+* '''Google Chrome:''' ли жьмꙑи Ctrl-Shift-R (⌘-Shift-R въ Mac)
+* '''Internet Explorer''' ли жьмꙑи Ctrl а мꙑшиѭ жьми Refresh или жьми Ctrl-F5
+* '''Konqueror''' ли жьми кромѣ Reload или F5
+* '''Опєрꙑ''' польꙃєватєльмъ можєть бꙑти ноужда пльнѣ поничьжити ихъ съмотрила съхранъ въ Tools → Preferences ⁙",
+'note' => "'''НАРОЧИТО:'''",
+'editing' => 'исправлѥниѥ: $1',
+'editingsection' => 'исправлѥниѥ ⁖ $1 ⁖ (чѧсть)',
+'editingcomment' => 'исправлѥниѥ ⁖ $1 ⁖ (нова чѧсть)',
+'templatesused' => 'сѥѩ страницѧ {{PLURAL:$1|сь обраꙁьць польꙃоуѥтъ сѧ ѥстъ|с҄и обраꙁьца польꙃоуѭтъ сѧ ѥстє|с҄и обраꙁьци польꙃоуѭтъ сѧ сѫтъ}} :',
+'template-protected' => '(ꙁабранєно ѥстъ)',
+'template-semiprotected' => '(чѧстьно ꙁабранѥно)',
# History pages
-'viewpagelogs' => 'си страницѧ їсторїѩ',
-'cur' => 'нꙑ҃н',
-'last' => 'пс҃лд',
-'page_first' => 'прьва страница',
-'page_last' => 'послѣдьнꙗ страница',
+'viewpagelogs' => 'си страницѧ їсторїѩ',
+'cur' => 'нꙑ҃н',
+'last' => 'пс҃лд',
+'page_first' => 'прьва страница',
+'page_last' => 'послѣдьнꙗ страница',
'history-fieldset-title' => 'виждь мѣнъ їсторїѭ',
-'history-show-deleted' => 'тъкъмо поничьжєнꙑ мѣнꙑ',
-'histfirst' => 'прьвꙑ',
-'histlast' => 'послѣдьнꙗ',
-'historysize' => '{{PLURAL:$1|1 баитъ|$1 баита|$1 баитъ}}',
-'historyempty' => '(поусто)',
+'history-show-deleted' => 'тъкъмо поничьжєнꙑ мѣнꙑ',
+'histfirst' => 'прьвꙑ',
+'histlast' => 'послѣдьнꙗ',
+'historysize' => '{{PLURAL:$1|1 баитъ|$1 баита|$1 баитъ}}',
+'historyempty' => '(поусто)',
# Revision feed
-'history-feed-title' => 'мѣнъ їсторїꙗ',
+'history-feed-title' => 'мѣнъ їсторїꙗ',
'history-feed-item-nocomment' => '$1 при $2',
# Revision deletion
-'rev-delundel' => 'каꙁаниѥ / съкрꙑтиѥ',
-'rev-showdeleted' => 'виждь',
+'rev-delundel' => 'каꙁаниѥ / съкрꙑтиѥ',
+'rev-showdeleted' => 'виждь',
'revdelete-show-file-submit' => 'да',
-'revdelete-radio-set' => 'да',
-'revdelete-radio-unset' => 'нѣтъ',
-'revdelete-log' => 'какъ съмꙑслъ :',
-'pagehist' => 'страницѧ їсторїꙗ',
-'deletedhist' => 'поничьжєна їсторїꙗ',
-'revdelete-otherreason' => 'инъ или допльнитєл҄ьнъ съмꙑслъ :',
-'revdelete-reasonotherlist' => 'инъ съмꙑслъ',
+'revdelete-radio-set' => 'да',
+'revdelete-radio-unset' => 'нѣтъ',
+'revdelete-log' => 'какъ съмꙑслъ :',
+'pagehist' => 'страницѧ їсторїꙗ',
+'deletedhist' => 'поничьжєна їсторїꙗ',
+'revdelete-otherreason' => 'инъ или допльнитєл҄ьнъ съмꙑслъ :',
+'revdelete-reasonotherlist' => 'инъ съмꙑслъ',
# History merging
'mergehistory-reason' => 'какъ съмꙑслъ :',
# Search results
-'searchresults' => 'исканиꙗ слѣдьствиѥ',
-'searchresults-title' => 'исканиꙗ ⁖ $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' => 'вьсѩ страницѧ',
+'searchresults' => 'исканиꙗ слѣдьствиѥ',
+'searchresults-title' => 'исканиꙗ ⁖ $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-articles-tooltip' => 'ищи въ $1',
-'search-result-size' => '$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 словєсъ}})',
-'search-redirect' => '(прѣнаправлєниѥ $1)',
-'search-section' => '(чѧсть $1)',
-'search-interwiki-caption' => 'родьствьна опꙑтьствованиꙗ',
-'search-interwiki-more' => '(вѧщє)',
-'searchall' => 'вьсꙗ',
-'powersearch' => 'ищи',
-'powersearch-redir' => 'прѣнаправлѥниꙗ',
+'search-result-size' => '$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 словєсъ}})',
+'search-redirect' => '(прѣнаправлєниѥ $1)',
+'search-section' => '(чѧсть $1)',
+'search-interwiki-caption' => 'родьствьна опꙑтьствованиꙗ',
+'search-interwiki-more' => '(вѧщє)',
+'searchall' => 'вьсꙗ',
+'powersearch' => 'ищи',
+'powersearch-redir' => 'прѣнаправлѥниꙗ',
# Preferences page
-'preferences' => 'строи',
-'mypreferences' => 'мои строи',
-'changepassword' => 'таина словєсє иꙁмѣнѥниѥ',
-'prefs-rc' => 'послѣдьнѩ мѣнꙑ',
-'prefs-watchlist' => 'блюдєниꙗ',
-'prefs-resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
-'saveprefs' => 'съхранѥниѥ',
-'prefs-editing' => 'исправлѥниѥ',
-'rows' => 'рѧдꙑ :',
-'searchresultshead' => 'исканиѥ',
-'timezoneregion-africa' => 'Афрїка',
-'timezoneregion-america' => 'Амєрїка',
+'preferences' => 'строи',
+'mypreferences' => 'мои строи',
+'changepassword' => 'таина словєсє иꙁмѣнѥниѥ',
+'prefs-rc' => 'послѣдьнѩ мѣнꙑ',
+'prefs-watchlist' => 'блюдєниꙗ',
+'prefs-resetpass' => 'таина словєсє иꙁмѣнѥниѥ',
+'saveprefs' => 'съхранѥниѥ',
+'prefs-editing' => 'исправлѥниѥ',
+'rows' => 'рѧдꙑ :',
+'searchresultshead' => 'исканиѥ',
+'timezoneregion-africa' => 'Афрїка',
+'timezoneregion-america' => 'Амєрїка',
'timezoneregion-antarctica' => 'Антарктїка',
-'timezoneregion-arctic' => 'Арктїка',
-'timezoneregion-asia' => 'Асїꙗ',
-'timezoneregion-atlantic' => 'Атлантїчьскъ ѡкєанъ',
-'timezoneregion-australia' => 'Аѵстралїꙗ',
-'timezoneregion-europe' => 'Єѵрѡпа',
-'timezoneregion-indian' => 'Їндїискъ ѡкєанъ',
-'timezoneregion-pacific' => 'Тихꙑи ѡкєанъ',
-'prefs-searchoptions' => 'исканиꙗ строи',
-'prefs-namespaces' => 'имєнъ просторꙑ',
-'prefs-files' => 'дѣла',
-'username' => 'польꙃєватєлꙗ имѧ :',
-'uid' => 'польꙃєватєлꙗ число :',
-'yourrealname' => 'истиньно имѧ :',
-'yourlanguage' => 'ѩꙁꙑкъ :',
-'yournick' => 'аѵтографъ :',
-'yourgender' => 'полъ :',
-'gender-male' => 'мѫжъ',
-'gender-female' => 'жєна',
-'prefs-signature' => 'аѵтографъ',
+'timezoneregion-arctic' => 'Арктїка',
+'timezoneregion-asia' => 'Асїꙗ',
+'timezoneregion-atlantic' => 'Атлантїчьскъ ѡкєанъ',
+'timezoneregion-australia' => 'Аѵстралїꙗ',
+'timezoneregion-europe' => 'Єѵрѡпа',
+'timezoneregion-indian' => 'Їндїискъ ѡкєанъ',
+'timezoneregion-pacific' => 'Тихꙑи ѡкєанъ',
+'prefs-searchoptions' => 'исканиꙗ строи',
+'prefs-namespaces' => 'имєнъ просторꙑ',
+'prefs-files' => 'дѣла',
+'username' => 'польꙃєватєлꙗ имѧ :',
+'uid' => 'польꙃєватєлꙗ число :',
+'yourrealname' => 'истиньно имѧ :',
+'yourlanguage' => 'ѩꙁꙑкъ :',
+'yournick' => 'аѵтографъ :',
+'yourgender' => 'полъ :',
+'gender-male' => 'мѫжъ',
+'gender-female' => 'жєна',
+'prefs-signature' => 'аѵтографъ',
# User rights
'userrights-reason' => 'какъ съмꙑслъ :',
# Groups
-'group' => 'чинъ :',
-'group-user' => 'польꙃєватєлє',
-'group-bot' => 'аѵтомати',
-'group-sysop' => 'съмотритєлє',
+'group' => 'чинъ :',
+'group-user' => 'польꙃєватєлє',
+'group-bot' => 'аѵтомати',
+'group-sysop' => 'съмотритєлє',
'group-bureaucrat' => 'чинодатєлє',
-'group-user-member' => '{{GENDER:$1|польꙃєватєл҄ь|польꙃєватєл҄ьница}}',
-'group-bot-member' => 'аѵтоматъ',
-'group-sysop-member' => 'съмотритєл҄ь',
-'group-bureaucrat-member' => 'чинодатєл҄ь',
+'group-user-member' => '{{GENDER:$1|польꙃєватєл҄ь|польꙃєватєл҄ьница}}',
+'group-bot-member' => '{{GENDER:$1|аѵтоматъ}}',
+'group-sysop-member' => '{{GENDER:$1|съмотритєл҄ь}}',
+'group-bureaucrat-member' => '{{GENDER:$1|чинодатєл҄ь}}',
-'grouppage-user' => '{{ns:project}}:Польꙃєватєлє',
-'grouppage-bot' => '{{ns:project}}:Аѵтомати',
-'grouppage-sysop' => '{{ns:project}}:Съмотритєлє',
+'grouppage-user' => '{{ns:project}}:Польꙃєватєлє',
+'grouppage-bot' => '{{ns:project}}:Аѵтомати',
+'grouppage-sysop' => '{{ns:project}}:Съмотритєлє',
'grouppage-bureaucrat' => '{{ns:project}}:Чинодатєлє',
# User rights log
'action-edit' => 'си страницѧ исправлєниѥ',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
-'recentchanges' => 'послѣдьнѩ мѣнꙑ',
-'recentchanges-legend' => 'послѣдьн҄ь мѣнъ строи',
-'recentchangestext' => 'с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши',
+'nchanges' => '$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
+'recentchanges' => 'послѣдьнѩ мѣнꙑ',
+'recentchanges-legend' => 'послѣдьн҄ь мѣнъ строи',
+'recentchangestext' => 'с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши',
'recentchanges-label-newpage' => 'по сѥи мѣнꙑ нова страница сътворѥна ѥстъ',
-'recentchanges-label-minor' => 'малаꙗ мѣна',
-'recentchanges-label-bot' => 'сѭ мѣноу аѵтоматъ сътворихъ',
-'rcnote' => "нижѣ {{PLURAL:$1|'''1''' послѣдьнѭ мѣнѫ|'''$1''' послѣдьни мѣнꙑ|'''$1''' послѣдьнъ мѣнъ|'''$1''' послѣдьнъ мѣнъ}} ꙁа {{PLURAL:$2|дьнь|'''$2''' дьнꙗ|'''$2''' дьнъ|'''$2''' дьнъ}} · ꙗко нꙑнѣ $5 · $4 лѣта",
-'rcshowhideminor' => '$1 малꙑ мѣнꙑ',
-'rcshowhidebots' => '$1 аѵтоматъ',
-'rcshowhideliu' => '$1 польꙃєватєлъ · ѩжє съꙁижьдє сѥ мѣсто · мѣнꙑ',
-'rcshowhideanons' => '$1 анѡнѷмьнъ польꙃєватєлъ мѣнꙑ',
-'rcshowhidemine' => '$1 моꙗ мѣнꙑ',
-'rclinks' => '$1 послѣдьн҄ь мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3',
-'diff' => 'ра҃ꙁн',
-'hist' => 'їс҃т',
-'hide' => 'съкрꙑи',
-'show' => 'виждь',
-'minoreditletter' => 'м҃л',
-'newpageletter' => 'н҃в',
-'boteditletter' => 'а҃ѵ',
+'recentchanges-label-minor' => 'малаꙗ мѣна',
+'recentchanges-label-bot' => 'сѭ мѣноу аѵтоматъ сътворихъ',
+'rcnote' => "нижѣ {{PLURAL:$1|'''1''' послѣдьнѭ мѣнѫ|'''$1''' послѣдьни мѣнꙑ|'''$1''' послѣдьнъ мѣнъ|'''$1''' послѣдьнъ мѣнъ}} ꙁа {{PLURAL:$2|дьнь|'''$2''' дьнꙗ|'''$2''' дьнъ|'''$2''' дьнъ}} · ꙗко нꙑнѣ $5 · $4 лѣта",
+'rcshowhideminor' => '$1 малꙑ мѣнꙑ',
+'rcshowhidebots' => '$1 аѵтоматъ',
+'rcshowhideliu' => '$1 польꙃєватєлъ · ѩжє съꙁижьдє сѥ мѣсто · мѣнꙑ',
+'rcshowhideanons' => '$1 анѡнѷмьнъ польꙃєватєлъ мѣнꙑ',
+'rcshowhidemine' => '$1 моꙗ мѣнꙑ',
+'rclinks' => '$1 послѣдьн҄ь мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3',
+'diff' => 'ра҃ꙁн',
+'hist' => 'їс҃т',
+'hide' => 'съкрꙑи',
+'show' => 'виждь',
+'minoreditletter' => 'м҃л',
+'newpageletter' => 'н҃в',
+'boteditletter' => 'а҃ѵ',
# Recent changes linked
-'recentchangeslinked' => 'съвѧꙁанꙑ страницѧ',
-'recentchangeslinked-feed' => 'съвѧꙁанꙑ страницѧ',
+'recentchangeslinked' => 'съвѧꙁанꙑ страницѧ',
+'recentchangeslinked-feed' => 'съвѧꙁанꙑ страницѧ',
'recentchangeslinked-toolbox' => 'съвѧꙁанꙑ страницѧ',
-'recentchangeslinked-page' => 'страницѧ имѧ :',
+'recentchangeslinked-page' => 'страницѧ имѧ :',
# Upload
-'upload' => 'положєниѥ дѣла',
-'uploadbtn' => 'положєниѥ дѣла',
-'uploadlog' => 'дѣлъ положєниꙗ їсторїꙗ',
-'uploadlogpage' => 'дѣлъ положєниꙗ їсторїꙗ',
-'filename' => 'дѣла имѧ',
-'filedesc' => 'опьсаниѥ',
-'fileuploadsummary' => 'опьсаниѥ:',
-'uploadedimage' => '⁖ [[$1]] ⁖ положєнъ ѥстъ',
-'watchthisupload' => 'си дѣла блюдєниѥ',
+'upload' => 'положєниѥ дѣла',
+'uploadbtn' => 'положєниѥ дѣла',
+'uploadlog' => 'дѣлъ положєниꙗ їсторїꙗ',
+'uploadlogpage' => 'дѣлъ положєниꙗ їсторїꙗ',
+'filename' => 'дѣла имѧ',
+'filedesc' => 'опьсаниѥ',
+'fileuploadsummary' => 'опьсаниѥ:',
+'uploadedimage' => '⁖ [[$1]] ⁖ положєнъ ѥстъ',
+'watchthisupload' => 'си дѣла блюдєниѥ',
'upload-success-subj' => 'дѣло положєно ѥстъ',
-'license' => 'прощєниѥ :',
+'license' => 'прощєниѥ :',
'license-header' => 'прощєниѥ',
# Special:ListFiles
-'imgfile' => 'дѣло',
-'listfiles' => 'дѣлъ каталогъ',
+'imgfile' => 'дѣло',
+'listfiles' => 'дѣлъ каталогъ',
'listfiles_name' => 'и́мѧ',
'listfiles_user' => 'польꙃєватєл҄ь',
'listfiles_size' => 'мѣра',
# File description page
-'file-anchor-link' => 'дѣло',
-'filehist' => 'дѣла їсторїꙗ',
+'file-anchor-link' => 'дѣло',
+'filehist' => 'дѣла їсторїꙗ',
'filehist-deleteone' => 'поничьжєниѥ',
-'filehist-current' => 'нꙑнѣщьн҄ь обраꙁъ',
-'filehist-datetime' => 'дьнь / врѣмѧ',
-'filehist-user' => 'польꙃєватєл҄ь',
-'filehist-filesize' => 'дѣла мѣра',
-'filehist-comment' => 'опьсаниѥ',
-'imagelinks' => 'дѣла польꙃєваниѥ',
-'sharedupload' => 'сѥ дѣло въ $1 съхранѥно ѥстъ дѣла · ѥгожє дроугꙑ опꙑтьствованиѩ польꙃєвати могѫтъ',
+'filehist-current' => 'нꙑнѣщьн҄ь обраꙁъ',
+'filehist-datetime' => 'дьнь / врѣмѧ',
+'filehist-user' => 'польꙃєватєл҄ь',
+'filehist-filesize' => 'дѣла мѣра',
+'filehist-comment' => 'опьсаниѥ',
+'imagelinks' => 'дѣла польꙃєваниѥ',
+'sharedupload' => 'сѥ дѣло въ $1 съхранѥно ѥстъ дѣла · ѥгожє дроугꙑ опꙑтьствованиѩ польꙃєвати могѫтъ',
# File reversion
'filerevert-comment' => 'какъ съмꙑслъ :',
# File deletion
-'filedelete' => 'поничьжєниѥ $1',
-'filedelete-legend' => 'дѣла поничьжєниѥ',
+'filedelete' => 'поничьжєниѥ $1',
+'filedelete-legend' => 'дѣла поничьжєниѥ',
'filedelete-comment' => 'какъ съмꙑслъ :',
-'filedelete-submit' => 'поничьжєниѥ',
+'filedelete-submit' => 'поничьжєниѥ',
# MIME search
'mimetype' => 'MIME тѷпъ :',
'randomredirect' => 'прѣнаправлѥниє въ нєꙁаапѫ',
# Statistics
-'statistics' => 'статїстїка',
+'statistics' => 'статїстїка',
'statistics-header-pages' => 'страницѧ статїстїка',
'statistics-header-edits' => 'мѣнъ статїстїка',
'statistics-header-users' => 'польꙃєватєлъ статїстїка',
-'statistics-articles' => 'истиньнꙑ члѣни',
-'statistics-pages' => 'страницѧ',
-'statistics-files' => 'положєнꙑ дѣла',
+'statistics-articles' => 'истиньнꙑ члѣни',
+'statistics-pages' => 'страницѧ',
+'statistics-files' => 'положєнꙑ дѣла',
-'disambiguations' => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
+'disambiguations' => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
'disambiguationspage' => 'Template:мъногосъмꙑслиѥ',
-'brokenredirects-edit' => 'исправи',
+'brokenredirects-edit' => 'исправи',
'brokenredirects-delete' => 'поничьжєниѥ',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|баитъ|баита|баитъ}}',
-'nlinks' => '$1 {{PLURAL:$1|съвѧꙁь|съвѧꙁи|съвѧꙁии}}',
-'nmembers' => '$1 {{PLURAL:$1|члѣнъ|члѣна|члѣни|члѣнъ}}',
-'shortpages' => 'кратъкꙑ страницѧ',
-'listusers' => 'польꙃєватєлъ каталогъ',
-'usercreated' => '{{GENDER:$3|сътворилъ|сътворила}} мѣсто $1 въ $2',
-'newpages' => 'нови члѣни',
+'nbytes' => '$1 {{PLURAL:$1|баитъ|баита|баитъ}}',
+'nlinks' => '$1 {{PLURAL:$1|съвѧꙁь|съвѧꙁи|съвѧꙁии}}',
+'nmembers' => '$1 {{PLURAL:$1|члѣнъ|члѣна|члѣни|члѣнъ}}',
+'shortpages' => 'кратъкꙑ страницѧ',
+'listusers' => 'польꙃєватєлъ каталогъ',
+'usercreated' => '{{GENDER:$3|сътворилъ|сътворила}} мѣсто $1 въ $2',
+'newpages' => 'нови члѣни',
'newpages-username' => 'польꙃєватєлꙗ имѧ :',
-'move' => 'прѣимєнованиѥ',
-'movethispage' => 'си страницѧ прѣимєнованиѥ',
+'move' => 'прѣимєнованиѥ',
+'movethispage' => 'си страницѧ прѣимєнованиѥ',
# Book sources
'booksources-go' => 'прѣиди',
# Special:Log
-'specialloguserlabel' => 'польꙃєватєл҄ь:',
+'specialloguserlabel' => 'польꙃєватєл҄ь:',
'speciallogtitlelabel' => 'страницѧ имѧ :',
-'log' => 'їсторїѩ',
-'all-logs-page' => 'вьсѩ обьщѧ їсторїѩ',
+'log' => 'їсторїѩ',
+'all-logs-page' => 'вьсѩ обьщѧ їсторїѩ',
# Special:AllPages
-'allpages' => 'вьсѩ страницѧ',
+'allpages' => 'вьсѩ страницѧ',
'alphaindexline' => 'отъ $1 до $2',
-'allpagesfrom' => 'страницѧ видѣти хощѫ съ начѧльнами боукъвами :',
-'allarticles' => 'вьсѩ страницѧ',
+'allpagesfrom' => 'страницѧ видѣти хощѫ съ начѧльнами боукъвами :',
+'allarticles' => 'вьсѩ страницѧ',
'allpagessubmit' => 'прѣиди',
# Special:Categories
'categories' => 'катигорїѩ',
# Special:DeletedContributions
-'deletedcontributions' => 'поничьжєнꙑ добродѣꙗниꙗ',
+'deletedcontributions' => 'поничьжєнꙑ добродѣꙗниꙗ',
'deletedcontributions-title' => 'поничьжєнꙑ добродѣꙗниꙗ',
# Special:LinkSearch
-'linksearch' => 'вънѣщьн҄ь съвѧꙁь исканиѥ',
+'linksearch' => 'вънѣщьн҄ь съвѧꙁь исканиѥ',
'linksearch-ok' => 'ищи',
# Special:ListUsers
'emailuser' => 'посъли єпїстолѫ',
# Watchlist
-'watchlist' => 'моꙗ блюдєниꙗ',
-'mywatchlist' => 'моꙗ блюдєниꙗ',
-'addedwatchtext' => "страница ⁖ [[:$1]] ⁖ нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] ѥстъ ⁙
+'watchlist' => 'моꙗ блюдєниꙗ',
+'mywatchlist' => 'моꙗ блюдєниꙗ',
+'addedwatchtext' => "страница ⁖ [[:$1]] ⁖ нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] ѥстъ ⁙
всꙗ ѥѩ и ѥѩжє бєсѣдꙑ мѣнꙑ страницѧ ⁖ [[Special:Watchlist|моꙗ блюдєниꙗ]] ⁖ покаꙁанꙑ сѫтъ и [[Special:RecentChanges|послѣдьнъ мѣнъ]] каталоꙃѣ '''чрьнꙑимъ''' сѧ авлꙗѭтъ",
'removedwatchtext' => 'страница ⁖ [[:$1]] ⁖ нꙑнѣ твоѥго [[Special:Watchlist|блюдєниꙗ]] иꙁнєсєна ѥстъ',
-'watch' => 'блюдєниѥ',
-'watchthispage' => 'си страницѧ блюдєниѥ',
-'unwatch' => 'остави блюдєниѥ',
+'watch' => 'блюдєниѥ',
+'watchthispage' => 'си страницѧ блюдєниѥ',
+'unwatch' => 'остави блюдєниѥ',
# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'блюдєниѥ ...',
+'watching' => 'блюдєниѥ ...',
'unwatching' => 'оставьлєниѥ блюдєниꙗ ...',
'created' => 'сътворѥнъ ѥстъ',
# Delete
-'deletepage' => 'поничьжєниѥ',
-'excontent' => "вънѫтри бѣ: '$1'",
+'deletepage' => 'поничьжєниѥ',
+'excontent' => "вънѫтри бѣ: '$1'",
'excontentauthor' => "вънѫтри бѣ : '$1' (и послѣдьн҄ии дѣтєл҄ь бѣ '[[Special:Contributions/$2|$2]]')",
-'delete-legend' => 'поничьжєниѥ',
-'actioncomplete' => 'дѣиство сътворєно ѥстъ',
-'deletedtext' => 'страница ⁖ $1 ⁖ поничьжєна ѥстъ ⁙
+'delete-legend' => 'поничьжєниѥ',
+'actioncomplete' => 'дѣиство сътворєно ѥстъ',
+'deletedtext' => 'страница ⁖ $1 ⁖ поничьжєна ѥстъ ⁙
виждь ⁖ $2 ⁖ послѣдьнъ поничьжєниѩ дѣлꙗ',
-'dellogpage' => 'поничьжєниꙗ їсторїꙗ',
-'deletionlog' => 'поничьжєниꙗ їсторїꙗ',
-'deletecomment' => 'какъ съмꙑслъ :',
+'dellogpage' => 'поничьжєниꙗ їсторїꙗ',
+'deletionlog' => 'поничьжєниꙗ їсторїꙗ',
+'deletecomment' => 'какъ съмꙑслъ :',
# Protect
-'protectlogpage' => 'ꙁабранѥниꙗ їсторїꙗ',
-'protectedarticle' => '⁖ [[$1]] ⁖ ꙁабранѥна ѥстъ',
-'prot_1movedto2' => '⁖ [[$1]] ⁖ нарєчєнъ ⁖ [[$2]] ⁖ ѥстъ',
-'protectcomment' => 'какъ съмꙑслъ :',
-'protect-level-sysop' => 'толико съмотритєлє',
-'protect-expiry-options' => '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',
+'protectlogpage' => 'ꙁабранѥниꙗ їсторїꙗ',
+'protectedarticle' => '⁖ [[$1]] ⁖ ꙁабранѥна ѥстъ',
+'prot_1movedto2' => '⁖ [[$1]] ⁖ нарєчєнъ ⁖ [[$2]] ⁖ ѥстъ',
+'protectcomment' => 'какъ съмꙑслъ :',
+'protect-level-sysop' => 'толико съмотритєлє',
+'protect-expiry-options' => '1 часъ:1 hour,1 дьнь:1 day,1 сєдмица:1 week,2 сєдмици:2 weeks,1 мѣсѧць:1 month,3 мѣсѧць:3 months,6 мѣсѧць:6 months,1 лѣто:1 year,вѣчьно:infinite',
+'pagesize' => '(баитъ)',
# Restrictions (nouns)
-'restriction-edit' => 'исправи',
-'restriction-move' => 'прѣимєнованиѥ',
+'restriction-edit' => 'исправи',
+'restriction-move' => 'прѣимєнованиѥ',
'restriction-upload' => 'положєниѥ',
# Undelete
-'undeletecomment' => 'какъ съмꙑслъ :',
+'undeletecomment' => 'какъ съмꙑслъ :',
'undelete-search-submit' => 'ищи',
# Namespace form on various pages
-'namespace' => 'имєнъ просторъ:',
+'namespace' => 'имєнъ просторъ:',
'blanknamespace' => '(главьно)',
# Contributions
-'contributions' => 'польꙃєватєлꙗ добродѣꙗниꙗ',
+'contributions' => 'польꙃєватєлꙗ добродѣꙗниꙗ',
'contributions-title' => 'польꙃєватєлꙗ ⁖ $1 ⁖ добродѣꙗниꙗ',
-'mycontris' => 'моꙗ добродѣꙗниꙗ',
-'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
-'uctop' => '(послѣдьнꙗ мѣна)',
+'mycontris' => 'моꙗ добродѣꙗниꙗ',
+'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
+'uctop' => '(послѣдьнꙗ мѣна)',
'sp-contributions-blocklog' => 'ꙁаграждєниꙗ їсторїꙗ',
-'sp-contributions-deleted' => 'поничьжєнꙑ добродѣꙗниꙗ',
-'sp-contributions-uploads' => 'положєнꙑ дѣла',
-'sp-contributions-logs' => 'їсторїѩ',
-'sp-contributions-talk' => 'бєсѣда',
+'sp-contributions-deleted' => 'поничьжєнꙑ добродѣꙗниꙗ',
+'sp-contributions-uploads' => 'положєнꙑ дѣла',
+'sp-contributions-logs' => 'їсторїѩ',
+'sp-contributions-talk' => 'бєсѣда',
'sp-contributions-username' => 'IP число или польꙃєватєлꙗ имѧ :',
-'sp-contributions-submit' => 'ищи',
+'sp-contributions-submit' => 'ищи',
# What links here
-'whatlinkshere' => 'дос̑ьдєщьнѩ съвѧꙁи',
-'whatlinkshere-title' => 'страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ',
-'whatlinkshere-page' => 'страница :',
-'isredirect' => 'прѣнаправлѥниѥ',
-'istemplate' => 'внѫтри страницѧ',
-'isimage' => 'дѣла съвѧꙁь',
-'whatlinkshere-links' => '← съвѧꙁи',
+'whatlinkshere' => 'дос̑ьдєщьнѩ съвѧꙁи',
+'whatlinkshere-title' => 'страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ',
+'whatlinkshere-page' => 'страница :',
+'isredirect' => 'прѣнаправлѥниѥ',
+'istemplate' => 'внѫтри страницѧ',
+'isimage' => 'дѣла съвѧꙁь',
+'whatlinkshere-links' => '← съвѧꙁи',
'whatlinkshere-hideredirs' => '$1 прѣнаправлѥниꙗ',
-'whatlinkshere-hidelinks' => '$1 съвѧꙁи',
+'whatlinkshere-hidelinks' => '$1 съвѧꙁи',
# Block/unblock
-'blockip' => 'ꙁагради польꙃєватєл҄ь',
+'blockip' => 'ꙁагради польꙃєватєл҄ь',
'ipadressorusername' => 'IP число или польꙃєватєлꙗ имѧ :',
-'ipbreason' => 'какъ съмꙑслъ :',
-'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',
-'ipblocklist' => 'ꙁаграждєнꙑ польꙃєватєлє',
-'blocklist-reason' => 'какъ съмꙑслъ',
+'ipbreason' => 'какъ съмꙑслъ :',
+'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',
+'ipblocklist' => 'ꙁаграждєнꙑ польꙃєватєлє',
+'blocklist-reason' => 'какъ съмꙑслъ',
'ipblocklist-submit' => 'исканиѥ',
-'infiniteblock' => 'вѣчьно',
-'blocklink' => 'ꙁагради',
-'contribslink' => 'добродѣꙗниꙗ',
-'blocklogpage' => 'ꙁаграждєниꙗ їсторїꙗ',
+'infiniteblock' => 'вѣчьно',
+'blocklink' => 'ꙁагради',
+'contribslink' => 'добродѣꙗниꙗ',
+'blocklogpage' => 'ꙁаграждєниꙗ їсторїꙗ',
# Move page
-'move-page' => 'прѣимєнованиѥ ⁖ $1 ⁖',
-'move-page-legend' => 'страницѧ прѣимєнованиѥ',
-'movearticle' => 'страница :',
-'newtitle' => 'ново имѧ :',
-'move-watch' => 'си страницѧ блюдєниѥ',
-'movepagebtn' => 'прѣимєнованиѥ',
-'pagemovedsub' => 'прѣимєнованиѥ сътворѥно ѥстъ',
-'movepage-moved' => "'''⁖ $1 ⁖ нарєчєнъ ⁖ $2⁖ ѥстъ'''",
+'move-page' => 'прѣимєнованиѥ ⁖ $1 ⁖',
+'move-page-legend' => 'страницѧ прѣимєнованиѥ',
+'movearticle' => 'страница :',
+'newtitle' => 'ново имѧ :',
+'move-watch' => 'си страницѧ блюдєниѥ',
+'movepagebtn' => 'прѣимєнованиѥ',
+'pagemovedsub' => 'прѣимєнованиѥ сътворѥно ѥстъ',
+'movepage-moved' => "'''⁖ $1 ⁖ нарєчєнъ ⁖ $2⁖ ѥстъ'''",
'movepage-moved-redirect' => 'прѣнаправлѥниѥ сътворѥно бѣ',
-'movedto' => 'прѣимєновано въ',
-'movetalk' => 'си страницѧ бєсѣдꙑ прѣимєнованиѥ',
-'movelogpage' => 'прѣимєнованиꙗ їсторїꙗ',
-'movereason' => 'какъ съмꙑслъ :',
-'move-leave-redirect' => 'прѣнаправлѥниꙗ сътворѥниѥ',
+'movedto' => 'прѣимєновано въ',
+'movetalk' => 'си страницѧ бєсѣдꙑ прѣимєнованиѥ',
+'movelogpage' => 'прѣимєнованиꙗ їсторїꙗ',
+'movereason' => 'какъ съмꙑслъ :',
+'move-leave-redirect' => 'прѣнаправлѥниꙗ сътворѥниѥ',
# Namespace 8 related
-'allmessages' => 'сѷстимьнꙑ напьсаниꙗ',
+'allmessages' => 'сѷстимьнꙑ напьсаниꙗ',
'allmessagesname' => 'имѧ',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'твоꙗ польꙃєватєл҄ьска страница',
-'tooltip-pt-mytalk' => 'твоꙗ бєсѣдꙑ страница',
-'tooltip-pt-preferences' => 'твои строи',
-'tooltip-pt-mycontris' => 'твоѩ добродѣꙗнии каталогъ',
-'tooltip-pt-logout' => 'ис̾ходъ',
-'tooltip-ca-talk' => 'си страницѧ бєсѣда',
-'tooltip-ca-viewsource' => 'си страница ꙁабранєна ѥстъ ⁙
+'tooltip-pt-userpage' => 'твоꙗ польꙃєватєл҄ьска страница',
+'tooltip-pt-mytalk' => 'твоꙗ бєсѣдꙑ страница',
+'tooltip-pt-preferences' => 'твои строи',
+'tooltip-pt-mycontris' => 'твоѩ добродѣꙗнии каталогъ',
+'tooltip-pt-logout' => 'ис̾ходъ',
+'tooltip-ca-talk' => 'си страницѧ бєсѣда',
+'tooltip-ca-viewsource' => 'си страница ꙁабранєна ѥстъ ⁙
ѥѩ источьнъ обраꙁъ видєти можєши',
-'tooltip-ca-protect' => 'си страницѧ ꙁабранєниѥ',
-'tooltip-ca-delete' => 'си страницѧ поничьжєниѥ',
-'tooltip-ca-move' => 'си страницѧ прѣимєнованиѥ',
-'tooltip-ca-watch' => 'си страницѧ блюдєниѥ',
-'tooltip-search' => 'ищи {{{grammar:genitive|{{SITENAME}}}}} страницѧ',
-'tooltip-p-logo' => 'главьна страница',
-'tooltip-n-mainpage' => 'виждь главьноу страницѫ',
+'tooltip-ca-protect' => 'си страницѧ ꙁабранєниѥ',
+'tooltip-ca-delete' => 'си страницѧ поничьжєниѥ',
+'tooltip-ca-move' => 'си страницѧ прѣимєнованиѥ',
+'tooltip-ca-watch' => 'си страницѧ блюдєниѥ',
+'tooltip-search' => 'ищи {{{grammar:genitive|{{SITENAME}}}}} страницѧ',
+'tooltip-p-logo' => 'главьна страница',
+'tooltip-n-mainpage' => 'виждь главьноу страницѫ',
'tooltip-n-mainpage-description' => 'виждь главьноу страницѫ',
-'tooltip-n-recentchanges' => 'послѣдьн҄ь мѣнъ каталогъ',
-'tooltip-t-contributions' => 'виждь польꙃєватєлꙗ добродѣꙗнии каталогъ',
-'tooltip-t-upload' => 'положєниѥ дѣлъ',
-'tooltip-t-specialpages' => 'вьсѣѩ нарочьнъ страницѧ каталогъ',
-'tooltip-t-print' => 'сѥѩ страницѧ пєчатьнъ обраꙁъ',
-'tooltip-ca-nstab-special' => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
-'tooltip-watch' => 'си страницѧ блюдєниѥ',
+'tooltip-n-recentchanges' => 'послѣдьн҄ь мѣнъ каталогъ',
+'tooltip-t-contributions' => 'виждь польꙃєватєлꙗ добродѣꙗнии каталогъ',
+'tooltip-t-upload' => 'положєниѥ дѣлъ',
+'tooltip-t-specialpages' => 'вьсѣѩ нарочьнъ страницѧ каталогъ',
+'tooltip-t-print' => 'сѥѩ страницѧ пєчатьнъ обраꙁъ',
+'tooltip-ca-nstab-special' => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
+'tooltip-watch' => 'си страницѧ блюдєниѥ',
+
+# Info page
+'pageinfo-header-watchlist' => 'блюдєниꙗ',
+'pageinfo-subjectpage' => 'страница',
+'pageinfo-talkpage' => 'бєсѣда',
# Media information
'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
-'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
+'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
'show-big-image' => 'пльнъ вида обраꙁъ',
# Special:NewFiles
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'вьсꙗ',
'namespacesall' => 'вьсꙗ',
-'monthsall' => 'вьсѩ',
+'monthsall' => 'вьсѩ',
'unit-pixel' => 'п҃ѯ',
'autosumm-new' => 'нова страница ⁖ $1 ⁖ сътворєна ѥстъ',
# Size units
-'size-bytes' => '$1 Б҃',
+'size-bytes' => '$1 Б҃',
'size-kilobytes' => '$1 Х҃Б',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|бєсѣда]])',
+
# Special:Version
-'version' => 'MediaWiki обраꙁъ',
-'version-version' => '(обраꙁъ $1)',
-'version-license' => 'прощєниѥ',
+'version' => 'MediaWiki обраꙁъ',
+'version-version' => '(обраꙁъ $1)',
+'version-license' => 'прощєниѥ',
'version-software-version' => 'обраꙁъ',
# Special:FilePath
# Special:Tags
'tags-edit' => 'исправи',
+# Database error messages
+'dberr-header' => 'Вики тєхнїчьнꙑ отѧжєниꙗ имѣтъ',
+
# New logging system
-'logentry-delete-delete' => '$1 поничьжихъ страницѫ ⁖ $3 ⁖',
-'logentry-move-move' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
+'logentry-delete-delete' => '$1 поничьжихъ страницѫ ⁖ $3 ⁖',
+'logentry-move-move' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
'logentry-move-move-noredirect' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ',
-'logentry-newusers-create' => '$1 сътворихъ польꙃєватєльско мѣсто',
+'logentry-newusers-create' => '$1 сътворихъ польꙃєватєльско мѣсто',
+
+# API errors
+'api-error-unknownerror' => 'нєвѣдома блаꙁна : ⁖ $1 ⁖',
);
'vector-view-edit' => 'Тӳрлет',
'vector-view-history' => 'Кун-çул',
'vector-view-view' => 'Вула',
+'vector-view-viewsource' => 'пуçламăш текста пăх',
'errorpagetitle' => 'Йăнăш',
'returnto' => '$1 страницăна таврăн.',
'deletethispage' => 'Хурат ăна',
'undelete_short' => '$1 тӳрлетӳсене каялла тавăр',
'protect' => 'хӳтĕле',
-'protect_change' => 'Ñ\85Ó³Ñ\82Ä\95лÄ\95ве Ñ\83лÄ\83Ñ\88Ñ\82аÑ\80',
+'protect_change' => 'улăштар',
'protectthispage' => 'Хӳтĕле',
'unprotect' => 'Хӳтĕлеве пăрахăçла',
'unprotectthispage' => 'Хӳтĕлеве пăрахăçла',
'searchhelp-url' => 'Help:Пулăшу',
'search-result-size' => '$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})',
'showingresults' => 'Аяларах эсир <b>#$2</b> пуçласа кăтартнă <b>$1</b> йĕркене куратăр.',
+'showingresultsheader' => "{{PLURAL:$5|Результат '''$1''' '''$3''' хушшинчен|Результатсем'''$1 - $2''' '''$3''' хушшинчен}} '''$4''' валли",
'powersearch' => 'Анлă шырав',
'powersearch-legend' => 'Анлă шырав',
'file-anchor-link' => 'Файл',
'filehist' => 'Файл историйĕ',
'filehist-current' => 'хальхи',
+'filehist-datetime' => 'Дата/Вăхăт',
+'filehist-thumb' => 'Миниатюра',
+'filehist-thumbtext' => '$1 версийĕн миниатюра ӳкерчĕкĕ',
'filehist-user' => 'Хутшăнакан',
+'filehist-dimensions' => 'Пысăкăш',
'filehist-comment' => 'Асăрхав',
-'imagelinks' => 'Файл çине каçасем',
+'imagelinks' => 'Файла усă курни',
'linkstoimage' => 'Çак страницăсем ку файл çине кăтартаççĕ:',
'nolinkstoimage' => 'Ку файл çине кăтартакан страницăсем çук.',
'uploadnewversion-linktext' => 'Ку файлăн çĕнĕ версине кĕрт',
'viewdeletedpage' => 'Кăларса пăрахнă страницăсене пăх',
'undeleterevisions' => 'Архивра пурĕ $1 верси',
'undeletebtn' => 'Каялла тавăр!',
+'undeleteviewlink' => 'пăх',
'undeletereset' => 'Тасат',
'undeletedrevisions' => '$1 кăларса пăрахнă тӳрлетӳсене каялла тавăрнă',
'undelete-search-box' => 'Кăларса пăрахнă страницăсен хушшинчи шырав',
'import-logentry-upload' => '«[[$1]]» — файлтан импортла',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ð\9fолÑ\8cзоваÑ\82елÑ\8c страници',
-'tooltip-pt-mytalk' => 'Ð\9cан канашлу страници',
+'tooltip-pt-userpage' => 'СиÑ\80Ä\95н Ñ\85Ñ\83Ñ\82Ñ\88Ä\83накан страници',
+'tooltip-pt-mytalk' => 'СиÑ\80Ä\95н канашлу страници',
'tooltip-pt-preferences' => 'Сирĕн ĕнерлевсем',
+'tooltip-pt-watchlist' => 'Эсир пăхакан страницисем',
+'tooltip-pt-logout' => 'Сайтран тух',
'tooltip-ca-talk' => 'Статьяна сӳтсе явасси',
'tooltip-ca-edit' => 'Эсир ку страницӑна тӳрлетме пултаратӑр. Тархасшӑн ҫырса хӑваричен страницӑ мӗнле пулассине пӑхӑр.',
-'tooltip-ca-addsection' => 'Кӗске ӑнлантару хушма пултаратӑр.',
+'tooltip-ca-addsection' => 'Çĕнĕ пай ту',
'tooltip-ca-viewsource' => 'Ку страницӑна эсир улӑштарма пултараймастӑр. Ӑна мӗнле ҫырнине кӑна пӑхма пултаратӑр.',
'tooltip-ca-protect' => 'Улӑшратусенчен сыхласси',
'tooltip-ca-delete' => 'Страницӑна кӑларса пӑрахмалли',
'tooltip-ca-unwatch' => 'Ку страницӑ хыҫҫӑн урӑх сӑнамалла мар',
'tooltip-search' => 'Шырав',
'tooltip-p-logo' => 'Тӗп страницӑ',
+'tooltip-feed-atom' => 'Ку страницăн Atom куçару',
+'tooltip-ca-nstab-image' => 'Файлăн страници',
+'tooltip-ca-nstab-template' => 'Шаблонăн страници',
+'tooltip-ca-nstab-category' => 'Категори страницине уç',
'tooltip-save' => 'Тӳрлетӳсене астуса хăвармалла',
'tooltip-watch' => 'Çак страницăна пăхса тăмаллисем шутне хуш',
+'tooltip-summary' => 'Кĕскĕн ăнлантарса парăр',
# Attribution
'anonymous' => '{{GRAMMAR:genitive|{{SITENAME}}}} анонимлă хутшăнакансем',
'ilsubmit' => 'Шырамалла',
'bydate' => 'дата тăрăх',
+# Metadata
+'metadata' => 'Метаданнăйсем:',
+
# EXIF tags
'exif-exifversion' => 'Exif версийĕ',
'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix версийĕ',
'updated' => '(Diweddariad)',
'note' => "'''Dalier sylw:'''",
'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.'''",
'parser-template-loop-warning' => 'Daethpwyd o hyd i ddolen yn y nodyn: [[$1]]',
'parser-template-recursion-depth-warning' => 'Wedi mynd dros ben y terfyn ar ddyfnder dychweliad nodiadau ($1)',
'language-converter-depth-warning' => "Wedi mynd tu hwnt i'r terfyn dyfnder ($1) ar y cyfnewidydd iaith.",
+'node-count-exceeded-category' => 'Tudalennau lle mae nifer y nodau yn ormod',
+'node-count-exceeded-warning' => 'Mae nifer y nodau yn y dudalen yn ormod',
+'expansion-depth-exceeded-category' => "Tudalennau â dyfnder ehangu tu hwnt i'r terfyn",
+'expansion-depth-exceeded-warning' => "Mae dyfnder ehangu'r dudalen y tu hwnt i'r terfyn",
# "Undo" feature
'undo-success' => "Gellir dadwneud y golygiad. Byddwch gystal â gwirio'r gymhariaeth isod i sicrhau mai dyma sydd arnoch eisiau gwneud, ac yna rhowch y newidiadau ar gadw i gwblhau'r gwaith o ddadwneud y golygiad.",
'allpages-bad-ns' => 'Nid oes gan {{SITENAME}} barth o\'r enw "$1".',
'allpages-hide-redirects' => 'Cuddio tudalennau ailgyfeirio',
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Rydych yn edrych ar fersiwn o'r dudalen a roddwyd ar gadw mewn celc hyd at $1 yn ôl.",
+'cachedspecial-viewing-cached-ts' => "Rydych yn edrych ar fersiwn o'r dudalen a roddwyd ar gadw mewn celc. Gall fod yn wahanol i'r fersiwn cyfoes.",
+'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.
'version-software' => 'Meddalwedd gosodedig',
'version-software-product' => 'Cynnyrch',
'version-software-version' => 'Fersiwn',
+'version-entrypoints' => 'URLs y mannau cyflwyno',
+'version-entrypoints-header-entrypoint' => 'Man cyflwyno',
'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'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}}',
);
'protectedpagetext' => 'No pel qey nêvuriyayiş hao (nao) pawyeno.',
'viewsourcetext' => 'To şikinay çımey na pele bıvêne u kopya kerê:',
'protectedinterface' => 'No pel qey software nuştey hezır keno u ın semed ra şuxulyayişê no pel qedexe biyo.',
-'editinginterface' => "'''DİQET:''' Şıma pelê software vurneni.[//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net] bıxebıtne, proceyê MediaWiki bigere diqet.",
+'editinginterface' => "'''DİQET:''' Şıma pelê software vurneni.[//translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net] bıxebıtne, proceyê MediaWiki bigere diqet.",
'sqlhidden' => '(SQL pers kerdışê nımıte)',
'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',
'userpage-userdoesnotexist-view' => 'Hesabê karberi "$1" qeyd nêbiyo.',
'blocked-notice-logextract' => 'No karber/na karbere emanet blokekerdeyo/blokekediya.
Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
-'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo: '''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');, '''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
+'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo.
+*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,
+*'''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
'usercssyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
'userjsyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
'usercsspreview' => "'''şıma tena verqaydê dosyayê CSS vineni.''' '''Dosyayê Karberi CSS hema qayd nebiyo!'''",
'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' => 'Detayan bımocne',
-'metadata-collapse' => 'extended details bınım',
+'metadata-collapse' => 'melumati bınımne',
'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ê.
* make
'htmlform-selectorother-other' => 'Bin',
# New logging system
-'logentry-delete-delete' => "$1'i Pelaya $3'i besternê",
-'logentry-delete-restore' => "$1'i pelaya $3'i peyd grot",
+'logentry-delete-delete' => "Karber $1' pelay $3' besternê",
+'logentry-delete-restore' => "Karber $1' pelay $3' peyser grot",
'logentry-suppress-delete' => '$1 $3 rê pıloxneyê',
'revdelete-content-hid' => 'nusno nımte',
'revdelete-summary-hid' => 'Vurnayışi nımtey niyê',
'revdelete-uname-unhid' => 'Namey karberi ne nımteyo',
'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
-'logentry-move-move' => "$1'i pelaya $3'i berd $4",
+'logentry-move-move' => "Karber $1' pelay $3' berd $4",
'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
'logentry-newusers-newusers' => '$1 deye namey karberi vıraziya',
'logentry-newusers-create' => '$1 deye namey karberi vıraziya',
'api-error-unknown-warning' => "$1'dı ikazo xırab:",
'api-error-unknownerror' => "$1'dı jew xeta vıciye",
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
+'duration-minutes' => '$1 {{PLURAL:$1|dakika|dakikayan}} vernî de',
+'duration-hours' => '($1 {{PLURAL:$1|seet|seetan}})',
+'duration-days' => '($1 {{PLURAL:$1|roc|rocan}})',
+'duration-weeks' => '$1 {{PLURAL: $1|hefte|heftey}}',
+'duration-years' => '$1 {{PLURAL:$1|serre|serran}} vernî de',
+'duration-centuries' => '$1 {{PLURAL:$1|seserre|seserri}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenyum|milenyumi}}',
+
);
* @ingroup Language
* @file
*
+ * @author Dbc334
* @author Derbeth
* @author Dunak
* @author Dundak
'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)',
* @author MF-Warburg
* @author Malafaya
* @author Omnipaedista
+ * @author Protnet
* @author Reedy
* @author Remember the dot
* @author Sinopeus
'upload-too-many-redirects' => 'Το URL περιείχε πάρα πολλές ανακατευθύνσεις',
'upload-unknown-size' => 'Άγνωστο μέγεθος',
'upload-http-error' => 'Εμφανίστηκε κάποιο σφάλμα HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'Δεν υπάρχουν διαθέσιμα ανεβάσματα αντιγράφων από αυτό τον τομέα.',
# File backend
'backend-fail-stream' => 'Αδύνατη η μετάδοση του αρχείου $1.',
'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' => 'Αδιέξοδες σελίδες',
# Book sources
'booksources' => 'Πηγές βιβλίων',
'booksources-search-legend' => 'Αναζήτηση για πηγές βιβλίων',
+'booksources-isbn' => 'ISBN:',
'booksources-go' => 'Πήγαινε',
'booksources-text' => 'Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:',
'booksources-invalid-isbn' => 'Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.',
'allpages-hide-redirects' => 'Απόκρυψη ανακατευθύνσεων',
# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Βλέπετε μια προσωρινά αποθηκευμένη έκδοση αυτής της σελίδας, που μπορεί να είναι μέχρι και $1 παλιά.',
+'cachedspecial-viewing-cached-ts' => 'Βλέπετε μια προσωρινά αποθηκευμένη έκδοση αυτής της σελίδας, που μπορεί να μην είναι εντελώς πραγματική.',
'cachedspecial-refresh-now' => 'Προβολή τελευταίας.',
# Special:Categories
# JavaScriptTest
'javascripttest' => 'Δοκιμή JavaScript',
'javascripttest-disabled' => 'Αυτή η λειτουργία έχει απενεργοποιηθεί.',
+'javascripttest-title' => 'Εκτελούνται $1 δοκιμές',
+'javascripttest-pagetext-noframework' => 'Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Άγνωστο πλαίσιο δοκιμών " $1 ".',
+'javascripttest-pagetext-frameworks' => 'Παρακαλώ επιλέξτε ένα από τα ακόλουθα πλαίσια δοκιμών: $1',
+'javascripttest-pagetext-skins' => 'Επιλέξτε ένα skin για να εκτελέσετε δοκιμές με αυτό:',
+'javascripttest-qunit-intro' => 'Ανατρέξτε στην ενότητα [ $1 τεκμηρίωση δοκιμών] στο mediawiki.org.',
+'javascripttest-qunit-heading' => 'Σουίτα δοκιμών JavaScript QUnit του MediaWiki',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Η σελίδα χρήστη σας',
'version-hook-subscribedby' => 'Υπογεγραμμένο από',
'version-version' => '(Έκδοση $1)',
'version-license' => 'Άδεια χρήσης',
-'version-poweredby-credits' => "Αυτό το βίκι τροφοδοτείται από '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
+'version-poweredby-credits' => "Αυτό το βίκι λειτουργεί χάρις στο '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
'version-poweredby-others' => 'άλλοι',
-'version-license-info' => "To Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανέμετε ή / και να το τροποποιήσετε υπό τους όρους της GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation.Είτε η δεύτερη έκδοση της άδειας, είτε (κατ' επιλογή σας) οποιδήποτε επόμενη έκδοση.
-Ο
-Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ.Ούτε καν την σιωπηρή εγγύση της ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή της ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕΝΑ PARTICULAR ΣΚΟΠΟ.Όπως δείτε την GNU General Public License για περισσότερες λεπτομέρειες.
+'version-license-info' => "Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό τους όρους της άδειας GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation· είτε της δεύτερης έκδοσης της άδειας, είτε (κατ' επιλογή σας) οποιασδήποτε επόμενης έκδοσης.
- Θα πρέπει να έχετε λάβει [((SERVER)) ((SCRIPTPATH)) / COPYING ένα αντίγραφο της GNU General Public License] μαζί με αυτό το πρόγραμμα.Αν όχι, γράψτε προς το Free Software Foundation, Inc, 51 Franklin Street, πέμπτο όροφο , Boston, MA 02110-1301, USA ή [//www.gnu.org/licenses/old-licenses/gpl-2.0.html διαβάστε το online].",
+Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ· ούτε καν την σιωπηρή εγγύηση ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕΝΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Βλ. GNU General Public License για περισσότερες λεπτομέρειες.
+
+Θα πρέπει να έχετε λάβει [{{SERVER}}{{SCRIPTPATH}}/COPYING ένα αντίγραφο της GNU General Public License] μαζί με αυτό το πρόγραμμα· αν όχι, στείλτε ένα γράμμα στο Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ή [//www.gnu.org/licenses/old-licenses/gpl-2.0.html διαβάστε το διαδικτυακά].",
'version-software' => 'Εγκατεστημένο λογισμικό',
'version-software-product' => 'Προϊόν',
'version-software-version' => 'Έκδοση',
'revdelete-content-hid' => 'το περιεχόμενο αποκρύφθηκε',
'revdelete-summary-hid' => 'Η σύνοψη επεξεργασίας αποκρύφθηκε',
'revdelete-uname-hid' => 'Το όνομα χρήστη αποκρύφθηκε',
+'revdelete-content-unhid' => 'το περιεχόμενο έπαψε να είναι κρυφό',
+'revdelete-summary-unhid' => 'η σύνοψη επεξεργασίας έπαψε να είναι κρυφή',
+'revdelete-uname-unhid' => 'το όνομα χρήστη έπαψε να είναι κρυφό',
'revdelete-restricted' => 'εφάρμοσε περιορισμούς στους sysops',
'revdelete-unrestricted' => 'αφαίρεσε περιορισμούς στους sysops',
'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτρονικού μηνύματος',
# Feedback
+'feedback-bugornote' => 'Εάν είστε έτοιμοι να περιγράψετε ένα τεχνικό πρόβλημα λεπτομερώς παρακαλώ [ $1 κάντε μια αναφορά σφάλματος].
+Διαφορετικά, μπορείτε να χρησιμοποιήσετε την παρακάτω απλή φόρμα. Το σχόλιό σας θα προστεθεί στη σελίδα "[ $3 $2 ]", μαζί με το όνομα χρήστη σας και ποιο πρόγραμμα περιήγησης χρησιμοποιείτε.',
'feedback-subject' => 'Θέμα:',
'feedback-message' => 'Μήνυμα:',
'feedback-cancel' => 'Ακύρωση',
'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
'feedback-thanks' => 'Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα "[$2 $1]".',
'feedback-close' => 'Ολοκληρώθηκε',
+'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1 γνωστά σφάλματα].',
'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
# API errors
'jumpto' => 'Iri al:',
'jumptonavigation' => 'navigado',
'jumptosearch' => 'serĉi',
-'view-pool-error' => 'Bedaŭrinde la serviloj estas tro uzata ĉi-momente.
+'view-pool-error' => 'Bedaŭrinde la serviloj estas tro uzataj ĉi-momente.
Tro da uzantoj provas vidi ĉi tiun paĝon.
-Bonvolu atendi iom antaŭ vi provas atingi ĝin denove.
+Bonvolu atendi iom antaŭ provi atingi ĝin denove.
$1',
'pool-timeout' => 'Tempolimo atingis atendante ŝlosadon',
'exif-flash-return-0' => 'ei ole välgu peegeldumist tuvastavat funktsiooni',
'exif-flash-return-2' => 'välgu peegeldust ei tuvastatud',
'exif-flash-return-3' => 'tuvastati välgu peegeldus',
-'exif-flash-mode-1' => 'sund välk',
+'exif-flash-mode-1' => 'sundvälk',
'exif-flash-mode-2' => 'välk keelatud',
'exif-flash-mode-3' => 'automaatne töörežiim',
'exif-flash-function-1' => 'Välgu funktsiooni ei ole',
-'exif-flash-redeye-1' => 'Punasilmsust vähendav reziim',
+'exif-flash-redeye-1' => 'punasilmsust vähendav režiim',
'exif-focalplaneresolutionunit-2' => 'toll',
'exif-gpsdirection-t' => 'Tegelik suund',
'exif-gpsdirection-m' => 'Magneetiline suund',
+'exif-ycbcrpositioning-1' => 'Keskele asetatud',
+'exif-ycbcrpositioning-2' => 'Kõrvuti asetatud',
+
'exif-dc-contributor' => 'Asjaosalised',
'exif-dc-coverage' => 'Teabevahendi ruumiline või ajaline ulatus',
'exif-dc-date' => 'Kuupäevad',
'tog-previewontop' => 'پیشنمایش قبل از جعبهٔ ویرایش نمایش یابد',
'tog-previewonfirst' => 'پیشنمایش هنگام اولین ویرایش نمایش یابد',
'tog-nocache' => 'حافظهٔ نهانی مرورگر از کار انداخته شود',
-'tog-enotifwatchlistpages' => 'اگر صفحهای از فهرست پیگیریهایم ویرایش شد به من نامه الکترونیکی فرستاده شود',
-'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربریام تغییری صورت میگیرد به من نامه الکترونیکی فرستاده شود',
-'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحهها هم به من نامه الکترونیکی فرستاده شود',
-'tog-enotifrevealaddr' => 'نشانی پست الکترونیکی من را در نامههای اطلاعرسانی نمایش یابد',
+'tog-enotifwatchlistpages' => 'اگر صفحهای از فهرست پیگیریهایم ویرایش شد برای من نامهای فرستاده شود',
+'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربریام تغییری صورت میگیرد به من نامهای فرستاده شود',
+'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحهها هم به من نامهای فرستاده شود',
+'tog-enotifrevealaddr' => 'نشانی رایانامهٔ من را در نامههای اطلاعرسانی نمایش یابد',
'tog-shownumberswatching' => 'شمار کاربران پیگیریکننده نمایش یابد',
'tog-oldsig' => 'امضای کنونی:',
'tog-fancysig' => 'امضا به صورت ویکیمتن در نظر گرفته شود (بدون درج خودکار پیوند)',
'tog-watchlisthideanons' => 'ویرایشهای کاربران ناشناس در فهرست پیگیریهای من پنهان شود',
'tog-watchlisthidepatrolled' => 'ویرایشهای گشتخورده در فهرست پیگیریها پنهان شود',
'tog-nolangconversion' => 'تبدیل گویشها غیرفعال شود',
-'tog-ccmeonemails' => 'رونوشتی از نامههای الکترونیکی که به دیگران ارسال میکنم برای خودم هم فرستاده شود',
+'tog-ccmeonemails' => 'رونوشتی از نامهای که به دیگران ارسال میکنم برای خودم هم فرستاده شود',
'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
'tog-showhiddencats' => 'ردههای پنهان نمایش داده شود',
'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
'gotaccount' => "حساب کاربری دارید؟ '''$1'''.",
'gotaccountlink' => 'وارد شوید',
'userlogin-resetlink' => 'جزئیات ورود را فراموش کردهاید؟',
-'createaccountmail' => 'با پست الکترونیکی',
+'createaccountmail' => 'با رایانامه',
'createaccountreason' => 'دلیل:',
'badretype' => 'گذرواژههایی که وارد کردهاید یکسان نیستند.',
'userexists' => 'نام کاربریای که وارد کردید قبلاً استفاده شدهاست.
'passwordtooshort' => 'گذرواژه باید دستکم {{PLURAL:$1|$1 حرف|$1 حرف}} داشته باشد.',
'password-name-match' => 'گذرواژهٔ شما باید با نام کاربری شما تفاوت داشته باشد.',
'password-login-forbidden' => 'استفاده از این نام کاربری و گذرواژه ممنوع است.',
-'mailmypassword' => 'گذرواژهٔ جدید با پست الکترونیکی فرستاده شود',
+'mailmypassword' => 'گذرواژهٔ جدید با رایانامه فرستاده شود',
'passwordremindertitle' => 'یادآور گذرواژهٔ {{SITENAME}}',
'passwordremindertext' => 'یک نفر (احتمالاً خود شما، با نشانی آیپی $1) گذرواژهٔ جدیدی برای حساب کاربری شما در {{SITENAME}} درخواست کردهاست ($4).
یک گذرواژهٔ موقت برای کاربر «$2» ساخته شده و برابر با «$3» قرار داده شدهاست.
گذرواژهٔ موقت شما ظرف {{PLURAL:$5|یک روز|$5 روز}} باطل میشود.
اگر کس دیگری این درخواست را کردهاست یا اینکه شما گذرواژهٔ پیشین خود را به یاد آوردهاید و دیگر تمایلی به تغییر آن ندارید، میتوانید این پیغام را نادیده بگیرید و همان گذرواژهٔ پیشین را به کار برید.',
-'noemail' => 'هیچ نشانی پست الکترونیکیای برای کاربر «$1» ثبت نشدهاست.',
-'noemailcreate' => 'باید یک نشانی پست الکترونیک معتبر وارد کنید',
-'passwordsent' => 'گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c جدÛ\8cد بÙ\87 Ù\86شاÙ\86Û\8c اÙ\84کترÙ\88Ù\86Û\8cÚ©Û\8c ثبتشده برای «$1» فرستاده شد.
+'noemail' => 'هیچ نشانی رایانامهای برای کاربر «$1» ثبت نشدهاست.',
+'noemailcreate' => 'باید یک نشانی رایانامه معتبر وارد کنید',
+'passwordsent' => 'گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c جدÛ\8cد بÙ\87 Ù\86شاÙ\86Û\8c راÛ\8cاÙ\86اÙ\85Ù\87 ثبتشده برای «$1» فرستاده شد.
لطفاً پس از دریافت آن دوباره به سامانه وارد شوید.',
'blocked-mailpassword' => 'نشانی آیپی شما از ویرایش بازداشته شدهاست و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهرهگیری از قابلیت بازیابی گذرواژه را ندارد.',
-'eauthentsent' => 'یک نامهٔ الکترونیکی برای تأیید نشانی پست الکترونیکی به نشانی موردنظر ارسال شد.
+'eauthentsent' => 'یک نامه برای تأیید نشانی رایانامه به نشانی موردنظر ارسال شد.
قبل از اینکه نامهٔ دیگری قابل ارسال به این نشانی باشد، باید دستورهایی که در آن نامه آمده است را جهت تأیید این مساله که این نشانی متعلق به شماست، اجرا کنید.',
'throttled-mailpassword' => 'یک یادآور گذرواژه در $1 {{PLURAL:$1|ساعت|ساعت}} گذشته برای شما فرستاده شدهاست.
برای جلوگیری از سوءاستفاده هر $1 ساعت تنها یک یادآوری فرستاده میشود.',
-'mailerror' => 'خطا در فرستادن پست الکترونیکی: $1',
+'mailerror' => 'خطا در فرستادن رایانامه: $1',
'acct_creation_throttle_hit' => 'بازدیدکنندگان این ویکی که از نشانی آیپی شما استفاده میکنند در روز گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساختهاند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.
به همین خاطر، بازدیدکنندگانی که از این نشانی آیپی استفاده میکنند نمیتوانند در حال حاضر حساب جدیدی بسازند.',
-'emailauthenticated' => 'نشانی پست الکترونیکی شما در $2 ساعت $3 تصدیق شد.',
-'emailnotauthenticated' => 'نشانی پست الکترونیکی شما هنوز تصدیق نشدهاست.
-برای هیچیک از ویژگیهای زیر نامهٔ الکترونیکی ارسال نخواهد شد.',
-'noemailprefs' => 'برای راهاندازی این قابلیتها یک نشانی پست الکترونیکی مشخص کنید.',
-'emailconfirmlink' => 'تأیید نشانی پست الکترونیکی',
-'invalidemailaddress' => 'نشانی واردشدهٔ پست الکترونیک قابلقبول نیست، چرا که دارای ساختار نامعتبری است.
+'emailauthenticated' => 'نشانی رایانامه شما در $2 ساعت $3 تصدیق شد.',
+'emailnotauthenticated' => 'نشانی رایانامه شما هنوز تصدیق نشدهاست.
+برای هیچیک از ویژگیهای زیر رایانامه ارسال نخواهد شد.',
+'noemailprefs' => 'برای راهاندازی این قابلیتها یک نشانی رایانامه مشخص کنید.',
+'emailconfirmlink' => 'تأیید نشانی رایانامه',
+'invalidemailaddress' => 'نشانی واردشدهٔ رایانامه قابلقبول نیست، چرا که دارای ساختار نامعتبری است.
لطفاً نشانیای با ساختار صحیح وارد کنید و یا بخش مربوط را خالی بگذارید.',
-'cannotchangeemail' => 'نشانیهای پست الکترونیکی حساب کاربری در این ویکی قابل تغییر نیست.',
+'cannotchangeemail' => 'نشانیهای رایانامهٔ حساب کاربری در این ویکی قابل تغییر نیست.',
'emaildisabled' => 'این وبگاه قادر به ارسال رایانامه نیست.',
'accountcreated' => 'حساب کاربری ایجاد شد',
'accountcreatedtext' => 'حساب کاربری $1 ایجاد شدهاست.',
'createaccount-title' => 'ایجاد حساب کاربری در {{SITENAME}}',
-'createaccount-text' => 'یک نفر برای پست الکترونیک شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کردهاست ($4)، که گذرواژهٔ آن چنین است: $3
+'createaccount-text' => 'یک نفر برای رایانامه شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کردهاست ($4)، که گذرواژهٔ آن چنین است: $3
شما باید به سامانه وارد شوید تا گذرواژهٔ خود را تغییر بدهید.
اگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.',
# E-mail sending
'php-mail-error-unknown' => 'خطای ناشناخته در تابع mail() پیاچپی',
-'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس پست الکترونیک.',
+'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
# Change password dialog
'resetpass' => 'تغییر گذرواژه',
'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعههای داده را در زیر وارد کنید}}',
'passwordreset-username' => 'نام کاربری:',
'passwordreset-domain' => 'دامنه:',
-'passwordreset-capture' => 'پست الکترونیکی نهایی نشان داده شود؟',
-'passwordreset-capture-help' => 'اگر این گزینه را علامت بزنید پست الکترونیکی (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.',
-'passwordreset-email' => 'نشانی پست الکترونیک:',
+'passwordreset-capture' => 'رایانامهٔ نهایی نشان داده شود؟',
+'passwordreset-capture-help' => 'اگر این گزینه را علامت بزنید رایانامهٔ (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.',
+'passwordreset-email' => 'نشانی رایانامه:',
'passwordreset-emailtitle' => 'جزئیات حساب در {{SITENAME}}',
'passwordreset-emailtext-ip' => 'شخصی (احتمالاً شما، با نشانی آیپی $1) درخواست یادآوری جزئیات حساب کاربریتان در {{SITENAME}} ($4) را کردهاست. {{PLURAL:$3|حساب|حسابهای}} کاربری زیر با این رایانشانی مرتبط هستند:
'passwordreset-emailelement' => 'نام کاربری: $1
گذرواژهٔ موقت: $2',
'passwordreset-emailsent' => 'یک نامهٔ یادآور فرستاده شده است.',
-'passwordreset-emailsent-capture' => 'پست الکترونیکی یادآور فرستاده شد، که به شرح زیر است.',
-'passwordreset-emailerror-capture' => 'پست الکترونیکی یادآور همانطور که در زیر مشاهده میفرمایید ایجاد شد ولی ارسال آن به کاربر موفقیتآمیز نبود: $1',
+'passwordreset-emailsent-capture' => 'رایانامهٔ یادآور فرستاده شد، که به شرح زیر است.',
+'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور که در زیر مشاهده میفرمایید ایجاد شد ولی ارسال آن به کاربر موفقیتآمیز نبود: $1',
# Special:ChangeEmail
-'changeemail' => 'تغÛ\8cÛ\8cر آدرس پست اÙ\84کترÙ\88Ù\86Û\8cÚ©',
+'changeemail' => 'تغÛ\8cÛ\8cر آدرس پست راÛ\8cاÙ\86اÙ\85Ù\87',
'changeemail-header' => 'تغییر آدرس ایمیل حساب کاربری',
-'changeemail-text' => 'این فرم را تکمیل کنید تا آدرس پست الکترونیکیتان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
+'changeemail-text' => 'این فرم را تکمیل کنید تا آدرس رایانامهتان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
'changeemail-no-info' => 'برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.',
-'changeemail-oldemail' => 'نشانی پست الکترونیکی کنونی:',
-'changeemail-newemail' => 'نشانی پست الکترونیکی جدید:',
+'changeemail-oldemail' => 'نشانی رایانامهٔ کنونی:',
+'changeemail-newemail' => 'نشانی رایانامهٔ جدید:',
'changeemail-none' => '(هیچ)',
-'changeemail-submit' => 'تغییر پست الکترونیکی',
+'changeemail-submit' => 'تغییر رایانامه',
'changeemail-cancel' => 'انصراف',
# Edit page toolbar
* کاربری که قطع دسترسیاش مد نظر بودهاست: $7
شما میتوانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
-توجه کنید که شما نمیتوانید از ویژگی «فرستادن پست الکترونیکی به این کاربر» استفاده کنید مگر آنکه نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات کاربری]]تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+توجه کنید که شما نمیتوانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]]تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
نشانی آیپی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
لطفاً تمامی جزئیات فوق را در کلیهٔ درخواستهایی که در این باره مطرح میکنید ذکر کنید.",
'autoblockedtext' => "دسترسی نشانی آیپی شما قطع شدهاست، زیرا این نشانی آیپی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شدهاست.
شما میتوانید با $1 یا یکی دیگر از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرید، تا پیرامون این قطع دسترسی صحبت کنید.
-توجه کنید که برای ارسال پست الکترونیکی در ویکی، باید پست الکترونیکی خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
+توجه کنید که برای ارسال رایانامه در ویکی، باید رایانامهٔ خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
نشانی آیپی فعلی شما $3 است و شمارهٔ قطع دسترسی $5 است.
لطفاً این شماره را در هر درخواستی که در این باره مطرح میکنید ذکر کنید.",
'blockednoreason' => 'دلیلی مشخص نشدهاست',
'whitelistedittext' => 'برای ویرایش مقالهها باید $1.',
-'confirmedittext' => 'شما باید، پیش از ویرایش صفحهها، نشانی پست الکترونیکی خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
+'confirmedittext' => 'شما باید، پیش از ویرایش صفحهها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
'nosuchsectiontitle' => 'چنین بخشی پیدا نشد',
'nosuchsectiontext' => 'شما تلاش کردهاید یک بخش در صفحه را ویرایش کنید که وجود ندارد.
ممکن است در مدتی که شما صفحه را مشاهده میکردید این بخش جا به جا یا حذف شده باشد.',
'prefs-watchlist-token' => 'رمز فهرست پیگیری:',
'prefs-misc' => 'تنظیمات متفرقه',
'prefs-resetpass' => 'تغییر گذرواژه',
-'prefs-changeemail' => 'تغییر پست الکترونیکی',
-'prefs-setemail' => 'تغیین آدرس پست الکترونیکی',
-'prefs-email' => 'گزینههای پست الکترونیک',
+'prefs-changeemail' => 'تغییر رایانامه',
+'prefs-setemail' => 'تغیین آدرس رایانامه',
+'prefs-email' => 'گزینههای رایانامه',
'prefs-rendering' => 'نمایش صفحه',
'saveprefs' => 'ذخیره',
'resetprefs' => 'صفرکردن ترجیحات',
'timezoneregion-europe' => 'اروپا',
'timezoneregion-indian' => 'اقیانوس هند',
'timezoneregion-pacific' => 'اقیانوس آرام',
-'allowemail' => 'امکان دریافت پست الکترونیکی از دیگر کاربران',
+'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
'prefs-searchoptions' => 'گزینههای جستجو',
'prefs-namespaces' => 'فضاهای نام',
'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
'prefs-common-css-js' => 'سیاساس/جاوااسکریپت مشترک برای تمام پوستهها:',
'prefs-reset-intro' => 'شما میتوانید از این صفحه برای بازگرداندن تنظیمات خود به پیشفرض تارنما استفاده کنید.
این کار بازگشتناپذیر است.',
-'prefs-emailconfirm-label' => 'تأیید پست الکترونیکی:',
+'prefs-emailconfirm-label' => 'تأیید رایانامه:',
'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
-'youremail' => 'پست الکترونیکی:',
+'youremail' => 'رایانامه:',
'username' => 'نام کاربری:',
'uid' => 'شمارهٔ کاربری:',
'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروهها}}:',
'gender-female' => 'زن',
'prefs-help-gender' => 'اختیاری: برای خطابشدن با جنسیت درست توسط نرمافزار به کار میرود.
این اطلاعات عمومی خواهد بود.',
-'email' => 'پست الکترونیکی',
+'email' => 'رایانامه',
'prefs-help-realname' => 'نام واقعی اختیاری است
اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آنها به شما از نام واقعیتان استفاده خواهد شد.',
-'prefs-help-email' => 'نشانی پست الکترونیکی اختیاریاست، اما فرستادن گذرواژهای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن میکند.',
-'prefs-help-email-others' => 'شما همچنین میتوانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربریتان به شما پست الکترونیکی بفرستند.
-نشانی پست الکترونیکی شما زمانی که دیگران با شما تماس بگیرند فاش نمیشود.',
-'prefs-help-email-required' => 'نشانی پست الکترونیکی الزامیاست.',
+'prefs-help-email' => 'نشانی رایانامه اختیاریاست، اما فرستادن گذرواژهای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن میکند.',
+'prefs-help-email-others' => 'شما همچنین میتوانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربریتان به شما رایانامه بفرستند.
+نشانی رایانامه شما زمانی که دیگران با شما تماس بگیرند فاش نمیشود.',
+'prefs-help-email-required' => 'نشانی رایانامه الزامیاست.',
'prefs-info' => 'اطلاعات اولیه',
'prefs-i18n' => 'بینالمللیسازی',
'prefs-signature' => 'امضا',
'prefs-diffs' => 'تفاوتها',
# User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'نشانی پست الکترونیکی معتبر به نظر می رسد',
-'email-address-validity-invalid' => 'نشانی پست الکترونیکی معتبر وارد کنید',
+'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می رسد',
+'email-address-validity-invalid' => 'نشانی رایانامهٔ معتبر وارد کنید',
# User rights
'userrights' => 'مدیریت اختیارات کاربر',
'right-suppressrevision' => 'بازبینی و احیای ویرایشهایی که از مدیران پنهان شدهاند',
'right-suppressionlog' => 'مشاهدهٔ سیاهههای خصوصی',
'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
-'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال پست الکترونیکی',
+'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال رایانامه',
'right-hideuser' => 'قطع دسترسی کاربر و پنهان کردن آن از دید عموم',
'right-ipblock-exempt' => 'تاثیر نپذیرفتن از قطع دسترسیهای آیپی، خودکار یا فاصلهای',
'right-proxyunbannable' => 'تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسیها',
'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکیهای دیگر',
'right-siteadmin' => 'قفل کردن و باز کردن پایگاه داده',
'right-override-export-depth' => 'برونبری صفحهها شامل صفحههای پیوند شده تا عمق ۵',
-'right-sendemail' => 'ارسال نامه الکترونیکی به دیگر کاربران',
+'right-sendemail' => 'ارسال رایانامه به دیگر کاربران',
'right-passwordreset' => 'مشاهدهٔ نامههای تنظیم مجدد گذرواژه',
# User rights log
# E-mail user
'mailnologin' => 'نشانیای از فرستنده موجود نیست',
-'mailnologintext' => 'برای فرستادن پست الکترونیکی به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
+'mailnologintext' => 'برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
'emailuser' => 'فرستادن نامه به این کاربر',
-'emailpage' => 'پست الکترونیکی به کاربر',
-'emailpagetext' => 'شما میتوانید از فرم زیر برای ارسال یک نامه الکترونیکی به این کاربر استفاده کنید.
-نشانی پست الکترونیکیای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کردهاید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
-'usermailererror' => 'پست الکترونیکی دچار خطا شد:',
-'defemailsubject' => 'پست الکترونیکی {{SITENAME}} از طرف کاربر «$1»',
-'usermaildisabled' => 'پست الکترونیکی کاربر غیرقعال است',
-'usermaildisabledtext' => 'شما در این ویکی نمیتوانید به دیگر کاربران پست الکترونیکی بفرستید',
-'noemailtitle' => 'نشانی پست الکترونیکی موجود نیست',
-'noemailtext' => 'این کاربر نشانی پست الکترونیکی معتبری مشخص نکرده است،',
-'nowikiemailtitle' => 'اجازهٔ ارسال نامهٔ الکترونیکی داده نشدهاست',
-'nowikiemailtext' => 'این کاربر انتخاب کرده که از دیگر کاربران نامهٔ الکترونیکی دریافت نکند.',
+'emailpage' => 'رایانامه به کاربر',
+'emailpagetext' => 'شما میتوانید از فرم زیر برای ارسال یک رایانامه به این کاربر استفاده کنید.
+نشانی رایانامهای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کردهاید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
+'usermailererror' => 'رایانامه دچار خطا شد:',
+'defemailsubject' => 'رایانامه {{SITENAME}} از طرف کاربر «$1»',
+'usermaildisabled' => 'رایانامهٔ کاربر غیرقعال است',
+'usermaildisabledtext' => 'شما در این ویکی نمیتوانید به دیگر کاربران رایانامه بفرستید',
+'noemailtitle' => 'نشانی رایانامه موجود نیست',
+'noemailtext' => 'این کاربر نشانی رایانامهٔ معتبری مشخص نکرده است،',
+'nowikiemailtitle' => 'اجازهٔ ارسال رایانامه داده نشدهاست',
+'nowikiemailtext' => 'این کاربر انتخاب کرده که از دیگر کاربران رایانامه دریافت نکند.',
'emailnotarget' => 'نام کاربری ناموجود یا نامعتبر برای گیرنده.',
'emailtarget' => 'نام کاربری دریافتکننده را وارد کنید',
'emailusername' => 'نام کاربری:',
'emailusernamesubmit' => 'ارسال',
-'email-legend' => 'ارسال نامه الکترونیکی به یک کاربر دیگر {{SITENAME}}',
+'email-legend' => 'ارسال یک نامه به کاربر دیگر {{SITENAME}}',
'emailfrom' => 'از:',
'emailto' => 'به:',
'emailsubject' => 'عنوان:',
'emailsend' => 'بفرست',
'emailccme' => 'رونوشت پیغام را برایم بفرست.',
'emailccsubject' => 'رونوشت پیغام شما به $1: $2',
-'emailsent' => 'پست الکترونیکی فرستاده شد',
-'emailsenttext' => 'پیغام پست الکترونیکی شما فرستاده شد.',
-'emailuserfooter' => 'این نامهٔ الکترونیکی با استفاده از ویژگی «پست الکترونیکی به کاربر» {{SITENAME}} توسط $1 به $2 فرستاده شد.',
+'emailsent' => 'رایانامه فرستاده شد',
+'emailsenttext' => 'پیغام رایانامه شما فرستاده شد.',
+'emailuserfooter' => 'این رایانامه با استفاده از ویژگی «فرستادن نامه به این کاربر» {{SITENAME}} توسط $1 به $2 فرستاده شد.',
# User Messenger
'usermessage-summary' => 'گذاشتن پیغام سامانه.',
'notvisiblerev' => 'آخرین نسخه توسط کاربری دیگر حذف شدهاست',
'watchnochange' => 'هیچ یک از موارد در حال پیگیری شما در دورهٔ زمانی نمایشیافته ویرایش نشده است.',
'watchlist-details' => 'بدون احتساب صفحههای بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پیگیریهای شما قرار {{PLURAL:$1|دارد|دارند}}.',
-'wlheader-enotif' => '*اطلاعرسانی از طریق پست الکترونیکی امکانپذیر است.',
+'wlheader-enotif' => '*اطلاعرسانی از طریق رایانامه امکانپذیر است.',
'wlheader-showupdated' => "*صفحههایی که پس از آخرین سرزدنتان به آنها تغییر کردهاند '''پررنگ''' نشان داده شدهاند.",
'watchmethod-recent' => 'بررسی ویرایشهای اخیر برای صفحههای مورد پیگیری',
'watchmethod-list' => 'بررسی صفحههای مورد پیگیری برای ویرایشهای اخیر',
'unwatching' => 'توقف پیگیری...',
'watcherrortext' => 'ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.',
-'enotif_mailer' => 'پست الکترونیکی اطلاعرسانی {{SITENAME}}',
+'enotif_mailer' => 'رایانامهٔ اطلاعرسانی {{SITENAME}}',
'enotif_reset' => 'علامتگذاری همهٔ صفحهها به عنوان بازدید شده',
'enotif_newpagetext' => 'این یک صفحهٔ تازهاست.',
'enotif_impersonal_salutation' => 'کاربر {{SITENAME}}',
**نام کاربری نامناسب',
'ipb-hardblock' => 'جلوگیری از ویرایش کردن کاربران ثبت نام کرده از طریق این نشانی آیپی',
'ipbcreateaccount' => 'جلوگیری از ایجاد حساب',
-'ipbemailban' => 'جلوگیری از ارسال پست الکترونیکی',
+'ipbemailban' => 'جلوگیری از ارسال رایانامه',
'ipbenableautoblock' => 'بستن خودکار آخرین نشانی آیپی استفاده شده توسط کاربر و نشانیهای دیگری که از آنها برای ویرایش تلاش میکند',
'ipbsubmit' => 'این کاربر بسته شود',
'ipbother' => 'زمانی دیگر',
'anononlyblock' => 'فقط کاربران گمنام',
'noautoblockblock' => 'بستن خودکار غیرفعال است',
'createaccountblock' => 'امکان ایجاد حساب مسدود است',
-'emailblock' => 'پست الکترونیکی مسدود شد',
+'emailblock' => 'رایانامه مسدود شد',
'blocklist-nousertalk' => 'نمی تواند صفحهٔ بحث خود را ویرایش کند',
'ipblocklist-empty' => 'فهرست بستهشدنها خالیاست.',
'ipblocklist-no-results' => 'دسترسی حساب کاربری یا نشانی آیپی مورد نظر قطع نیست.',
'unblocklink' => 'باز شود',
'change-blocklink' => 'تغییر قطع دسترسی',
'contribslink' => 'مشارکتها',
-'emaillink' => 'ارسال پست الکترونیکی',
+'emaillink' => 'ارسال رایانامه',
'autoblocker' => 'به طور خودکار بسته شد چون آیپی شما به تازگی توسط کاربر «[[User:$1|$1]]» استفاده شدهاست.
دلیل قطع دسترسی $1 چنین است: «$2»',
'blocklogpage' => 'سیاههٔ بستهشدنها',
'block-log-flags-anononly' => 'فقط کاربران گمنام',
'block-log-flags-nocreate' => 'قابلیت ایجاد حساب غیرفعال شد',
'block-log-flags-noautoblock' => 'قطع دسترسی خودکار غیرفعال شد',
-'block-log-flags-noemail' => 'پست الکترونیکی مسدود شد',
+'block-log-flags-noemail' => 'رایانامه مسدود شد',
'block-log-flags-nousertalk' => 'صفحهٔ بحث خود را نمیتواند ویرایش کند',
'block-log-flags-angry-autoblock' => 'قطع دسترسی خودکار پیشرفته فعال شد',
'block-log-flags-hiddenname' => 'نام کاربری پنهان',
'tooltip-feed-rss' => 'خبرنامه آراساس برای این صفحه',
'tooltip-feed-atom' => 'خبرنامهٔ اتم برای این صفحه',
'tooltip-t-contributions' => 'فهرست مشارکتهای این کاربر',
-'tooltip-t-emailuser' => 'فرستادن پست الکترونیکی به این کاربر',
+'tooltip-t-emailuser' => 'فرستادن رایانامه به این کاربر',
'tooltip-t-upload' => 'بارگذاری تصاویر و پروندههای دیگر',
'tooltip-t-specialpages' => 'فهرستی از همهٔ صفحههای ویژه',
'tooltip-t-print' => 'نسخهٔ قابل چاپ این صفحه',
'limitall' => 'همه',
# E-mail address confirmation
-'confirmemail' => 'تأیید نشانی پست الکترونیکی',
-'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی پست الکترونیکی معتبری وارد نکردهاید.',
-'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار پست الکترونیکی خود، پیش از استفاده از خدمات پست الکترونیکی در اینجا میکند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی پست الکترونیکی شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی پست الکترونیکی شما مسجل شود.',
-'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت الکترونیکی فرستاده شدهاست. اگر همین اواخر حساب خود را باز کردهاید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
+'confirmemail' => 'تأیید نشانی رایانامه',
+'confirmemail_noemail' => 'شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود نشانی رایانامه معتبری وارد نکردهاید.',
+'confirmemail_text' => 'این ویکی شما را ملزم به تأیید اعتبار رایانامه خود، پیش از استفاده از خدمات رایانامه در اینجا میکند. دکمهٔ زیرین را فعال کنید تا نامهٔ تأییدی به نشانی رایانامهٔ شما فرستاده شود. این نامه دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید (اجرا) کنید تا اعتبار نشانی رایانامهٔ شما تایید شود.',
+'confirmemail_pending' => 'یک کد تأییدی پیشتر برای شما به صورت نامه فرستاده شدهاست. اگر همین اواخر حساب خود را باز کردهاید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید نامهٔ قبلی برسد.',
'confirmemail_send' => 'پُستکردن یک کد تأیید',
-'confirmemail_sent' => 'نامهٔ الکترونیکی تأییدی فرستاده شد.',
-'confirmemail_oncreate' => 'یک کد تأییدی به نشانی پست الکترونیکی شما فرستاده شد.
-برای واردشدن به سامانه نیازی به این کد نیست، ولی برای راهاندازی امکانات وابسته به پست الکترونیکی در این ویکی به آن نیاز خواهید داشت.',
-'confirmemail_sendfailed' => 'فرستادن پست الکترونیکی تأییدی ممکن نشد.
-نشانی پست الکترونیکی را از نظر وجود نویسههای نامعتبر بررسی کنید.
+'confirmemail_sent' => 'یک نامهٔ تأییدی فرستاده شد.',
+'confirmemail_oncreate' => 'یک کد تأییدی به نشانی رایانامهٔ شما فرستاده شد.
+برای واردشدن به سامانه نیازی به این کد نیست، ولی برای راهاندازی امکانات وابسته به رایانامه در این ویکی به آن نیاز خواهید داشت.',
+'confirmemail_sendfailed' => 'فرستادن رایانامهٔ تأییدی ممکن نشد.
+نشانی رایانامه را از نظر وجود نویسههای نامعتبر بررسی کنید.
-پاسخ سامانه ارسال پست الکترونیکی: $1',
+پاسخ سامانه ارسال رایانامه: $1',
'confirmemail_invalid' => 'کد تأیید نامعتبر است. ممکن است که منقضی شده باشد.',
-'confirmemail_needlogin' => 'برای تأیید نشانی پست الکترونیکیتان نیاز به $1 دارید.',
-'confirmemail_success' => 'نشانی پست الکترونیکی شما تأیید شدهاست.
+'confirmemail_needlogin' => 'برای تأیید نشانی رایانامهتان نیاز به $1 دارید.',
+'confirmemail_success' => 'نشانی رایانامهٔ شما تأیید شدهاست.
-اینک میتوانید [[Special:UserLogin|به سامانه وارد شوید]] و از ویکی لذت ببرید.',
-'confirmemail_loggedin' => 'نشانی پست الکترونیکی شما تأیید شد.',
+هماینک میتوانید [[Special:UserLogin|به سامانه وارد شوید]] و از ویکی لذت ببرید.',
+'confirmemail_loggedin' => 'نشانی رایانامهٔ شما تأیید شد.',
'confirmemail_error' => 'هنگام ذخیرهٔ تأیید شما به مشکلی برخورده شد.',
-'confirmemail_subject' => 'تأیید نشانی پست الکترونیکی شما {{SITENAME}}',
-'confirmemail_body' => 'یک نفر، احتمالاً خود شما، از نشانی آیپی $1 حساب کاربریای با نام «$2» و این نشانی پست الکترونیکی در {{SITENAME}} ایجاد کردهاست.
+'confirmemail_subject' => 'تأیید نشانی رایانامهٔ شما {{SITENAME}}',
+'confirmemail_body' => 'یک نفر، احتمالاً خود شما، از نشانی آیپی $1 حساب کاربریای با نام «$2» و این نشانی رایانامه در {{SITENAME}} ایجاد کردهاست.
-برای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعالسازی امکانات پست الکترونیک {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:
+برای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعالسازی امکانات رایانامه {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:
$3
اگر شما این حساب کاربری را ثبت *نکردهاید*، لطفاً پیوند زیر را
-دنبال کنید تا تأیید نشانی پست الکترونیکی لغو شود:
+دنبال کنید تا تأیید نشانی رایانامه لغو شود:
$5
این کدِ تأیید در تاریخ $4 منقضی خواهد شد.
</div>',
-'confirmemail_body_changed' => 'یک نفر، احتمالاً خود شما، از نشانی آیپی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را تغییر دادهاست.
+'confirmemail_body_changed' => 'یک نفر، احتمالاً خود شما، از نشانی آیپی $1 نشانی رایانامه حساب «$2» در {{SITENAME}} را تغییر دادهاست.
-برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
+برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی رایانامه در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
$3
-اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر رایانامه را لغو کنید:
$5
این تأییدیه در $4 منقضی میگردد.',
-'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آیپی $1 نشانی پست الکترونیکی حساب «$2» در {{SITENAME}} را به این نشانی تغییر دادهاست.
+'confirmemail_body_set' => 'یک نفر، احتمالاً خود شما، از نشانی آیپی $1 نشانی رایانامه حساب «$2» در {{SITENAME}} را به این نشانی تغییر دادهاست.
-برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی پست الکترونیک در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
+برای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ ویژگی رایانامه در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:
$3
-اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر پست الکترونیکی را لغو کنید:
+اگر این حساب متعلق به شما نیست، پیوند زیر را دنبال کنید تا تغییر رایانامه را لغو کنید:
$5
این تأییدیه در $4 منقضی میگردد.',
-'confirmemail_invalidated' => 'تأیید نشانی پست الکترونیکی لغو شد',
-'invalidateemail' => 'لغو کردن تأیید نشانی پست الکترونیکی',
+'confirmemail_invalidated' => 'تأیید نشانی رایانامه لغو شد',
+'invalidateemail' => 'لغو کردن تأیید نشانی رایانامه',
# Scary transclusion
'scarytranscludedisabled' => '[تراگنجانش بینویکیانه فعال نیست]',
'version-software' => 'نسخهٔ نصبشده',
'version-software-product' => 'محصول',
'version-software-version' => 'نسخه',
+'version-entrypoints' => 'نشانی اینترنتی محل ورود',
+'version-entrypoints-header-entrypoint' => 'نقطه ورود',
+'version-entrypoints-header-url' => 'نشانی اینترنتی',
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسیر مقاله]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسیر اسکریپت]',
'logentry-newusers-create' => '$1 یک حساب کاربری ایجاد کرد',
'logentry-newusers-create2' => '$1 یک حساب کاربری ایجاد کرد $3',
'logentry-newusers-autocreate' => 'حساب $1 به شکل خودکار ساخته شد',
-'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
+'newuserlog-byemail' => 'گذرواژه بوسیله رایانامه ارسال شد',
# Feedback
'feedback-bugornote' => 'اگر آمادهاید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت میتوانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$2 $3]» افزوده خواهد شد.',
'watcherrortext' => 'Sivun ”$1” tarkkailulista-asetusten muutoksissa tapahtui virhe.',
'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} sivu on muuttunut -ilmoitus',
-'enotif_reset' => 'Merkitse kaikki sivut katsotuiksi',
+'enotif_reset' => 'Merkitse kaikki sivut kerralla nähdyiksi',
'enotif_newpagetext' => 'Tämä on uusi sivu.',
'enotif_impersonal_salutation' => '{{SITENAME}}-käyttäjä',
'changed' => 'muuttanut sivua',
'searchhelp-url' => 'Help:Accueil',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechercher les pages commençant par ce préfixe]]',
'searchprofile-articles' => 'Pages de contenu',
-'searchprofile-project' => 'Pages d’aide et du projet',
+'searchprofile-project' => 'Pages d’aide et de projet',
'searchprofile-images' => 'Multimédia',
'searchprofile-everything' => 'Tout',
'searchprofile-advanced' => 'Recherche avancée',
'parser-template-loop-warning' => 'Detectouse un modelo en bucle: [[$1]]',
'parser-template-recursion-depth-warning' => 'Excedeuse o límite da profundidade do recurso do modelo ($1)',
'language-converter-depth-warning' => 'Excedeuse o límite de profundidade do convertedor de lingua ($1)',
+'node-count-exceeded-category' => 'Páxinas nas que se supera o número de nodos',
+'node-count-exceeded-warning' => 'Páxina que supera o número de nodos',
+'expansion-depth-exceeded-category' => 'Páxinas nas que se supera a profundidade de expansión',
+'expansion-depth-exceeded-warning' => 'Páxina que supera a profundidade de expansión',
# "Undo" feature
'undo-success' => 'A edición pódese desfacer.
'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइट}}',
'ncategories' => '{{PLURAL:$1|एक श्रेणी|$1 श्रेणियाँ}}',
'nlinks' => '$1 {{PLURAL:$1|कड़ी|कड़ियाँ}}',
-'nmembers' => '{{PLURAL:$1|एक सदस्य|$1 सदस्य}}',
+'nmembers' => '$1 {{PLURAL:$1|सदस्य}}',
'nrevisions' => '$1 {{PLURAL:$1|अवतरण}}',
'nviews' => '{{PLURAL:$1|एक|$1}} बार देखा गया है',
'nimagelinks' => '$1 {{PLURAL:$1|पृष्ठ|पृष्ठों}} पर प्रयुक्त',
'emailauthenticated' => 'Vaša e-mail adresa je ovjerena $2 u $3.',
'emailnotauthenticated' => 'Vaša e-mail adresa još nije ovjerena.
Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.',
-'noemailprefs' => 'Nije navedena e-mail adresa, stoga sljedeće naredbe neće raditi.',
+'noemailprefs' => 'Nije navedena adresa elektroničke pošte, stoga sljedeće naredbe ne će raditi.',
'emailconfirmlink' => 'Potvrdite svoju e-mail adresu',
'invalidemailaddress' => 'Ne mogu prihvatiti e-mail adresu jer nije valjano oblikovana.
Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
# Move page
'move-page' => 'Premjesti $1',
'move-page-legend' => 'Premjesti stranicu',
-'movepagetext' => "Korištenjem ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.
+'movepagetext' => "Uporabom ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.
Stari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi naslov.
-Možete odabrati automatsko ažuriranje preusmjeravanja na originalni naslov.
+Možete odabrati automatsko ažuriranje preusmjeravanja na izvorni naslov.
Ako se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].
Dužni ste provjeriti da sve poveznice i dalje nastave voditi na prave stranice.
-Stranica se '''neće''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
+Stranica se '''ne će''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
To znači: 1. ako pogriješite, možete opet preimenovati stranicu na stari naslov, 2. ne može se dogoditi da izbrišete neku postojeću stranicu.
'''Upozorenje!'''
Budite sigurni da ste provjerili [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nevaljana preusmjeravanja]].
Vi ste odgovorni za to da poveznice i dalje povezuju tamo gdje treba.
-Imajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
-To znači da stranicu možete preimenovati u prethodno ime ukoliko ste pogriješili te ne možete pisati preko postojeće stranice.
+Imajte na umu da stranica '''ne će''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.
+To znači da stranicu možete preimenovati u prethodno ime ako ste pogriješili te ne možete pisati preko postojeće stranice.
'''Upozorenje!'''
Ovo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;
budite sigurni da razumijete posljedice ove akcije prije nastavka.",
-'movepagetalktext' => "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica za razgovor neće se premjestiti ako:'''
+'movepagetalktext' => "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica se za razgovor ne će premjestiti ako:'''
*premještate stranicu iz jednog prostora u drugi,
*pod novim imenom već postoji stranica za razgovor s nekim sadržajem, ili
*maknete kvačicu u kućici na dnu ove stranice.
-U tim slučajevima ćete morati sami premjestiti ili iskopirati stranicu za razgovor,
+U tim ćete slučajevima morati sami premjestiti ili iskopirati stranicu za razgovor,
ako to želite.",
'movearticle' => 'Premjesti stranicu',
-'moveuserpage-warning' => "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''neće'' biti preimenovan.",
+'moveuserpage-warning' => "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''ne će'' biti preimenovan.",
'movenologin' => 'Niste prijavljeni',
'movenologintext' => 'Ako želite premjestiti stranicu morate biti [[Special:UserLogin|prijavljeni]].',
'movenotallowed' => 'Nemate pravo premještanja stranica.',
'allpagesprefix' => 'Lapok listázása, amik ezzel az előtaggal kezdődnek:',
'allpagesbadtitle' => 'A megadott lapnév nyelvközi vagy wikiközi előtagot tartalmazott, vagy érvénytelen volt. Talán olyan karakter van benne, amit nem lehet lapnevekben használni.',
'allpages-bad-ns' => 'A(z) {{SITENAME}} webhelyen nincs "$1" névtér.',
+'allpages-hide-redirects' => 'Átirányítások elrejtése',
# Special:Categories
'categories' => 'Kategóriák',
'difference' => '(Խմբագրումների միջև եղած տարբերությունները)',
'lineno' => 'Տող $1.',
'compareselectedversions' => 'Համեմատել ընտրած տարբերակները',
+'showhideselectedversions' => 'Ցուցադրել/թաքցնել ընտրված խմբագրումները',
'editundo' => 'հետ շրջել',
'diff-multi' => '({{PLURAL:$1|$1 միջանկյալ տարբերակ|$1 միջանկյալ տարբերակ}} ցուցադրված չէ։)',
'parser-template-loop-warning' => 'Rilevato loop del template: [[$1]]',
'parser-template-recursion-depth-warning' => 'È stato raggiunto il limite di ricorsione nel template ($1)',
'language-converter-depth-warning' => 'Limite di profondità del convertitore di lingua superato ($1)',
+'node-count-exceeded-category' => 'Pagine dove viene superato il numero di nodi',
+'node-count-exceeded-warning' => 'Questa pagina ha superato il numero di nodi',
+'expansion-depth-exceeded-category' => 'Pagine dove viene superata la profondità di espansione',
+'expansion-depth-exceeded-warning' => 'Questa pagina ha superato la profondità di espansione',
# "Undo" feature
'undo-success' => 'Questa modifica può essere annullata. Verificare il confronto presentato di seguito per accertarsi che il contenuto corrisponda a quanto desiderato e quindi salvare le modifiche per completare la procedura di annullamento.',
'version-software' => 'Software installato',
'version-software-product' => 'Prodotto',
'version-software-version' => 'Versione',
+'version-entrypoints' => 'URL di accesso',
+'version-entrypoints-header-entrypoint' => 'Punti di accesso',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Percorso di un file',
'prefs-personal' => '利用者情報',
'prefs-rc' => '最近の更新',
'prefs-watchlist' => 'ウォッチリスト',
-'prefs-watchlist-days' => 'ウォッチリストの表示件数:',
+'prefs-watchlist-days' => 'ウォッチリストの表示日数:',
'prefs-watchlist-days-max' => '最大 $1 {{PLURAL:$1|日間}}',
'prefs-watchlist-edits' => '拡張ウォッチリストの表示件数:',
'prefs-watchlist-edits-max' => '最大数:1000',
'export-addnstext' => '名前空間からページを追加:',
'export-addns' => '追加',
'export-download' => 'ファイルとして保存',
-'export-templates' => 'ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\82含める',
+'export-templates' => 'ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\92含める',
'export-pagelinks' => '以下の階層までのリンク先ページを含める:',
# Namespace 8 related
'token_suffix_mismatch' => "'''თქვენი შესწორება გაუქმდა რადგანაც პროგრამა არასწორედ აღიქვამს პუნქტუაციის ნიშნებს რედაქტირების ფანჯარაში. შესწრება გაუქმდა სტატიის არ გაფუჭების მიზნით. შესაძლოა ეს გამოწვეულია გაფუჭებული ვებ პროქსის გამოყენებით.'''",
'edit_form_incomplete' => "'''რედაქტირებების ნაწილმა სერვერამდე ვერ მიაღწია; გთხოვთ, შეამოწმეთ თქვენი რედაქტირებების სრულყოფილება და სცადეთ განმეორებით.'''",
'editing' => 'რედაქტირება: $1',
-'creating' => 'იქმნება $1',
+'creating' => 'იქმნება: „$1“',
'editingsection' => 'რედაქტირება - $1 (სექცია)',
'editingcomment' => 'რედაქტირება: $1 (ახალი სექცია)',
'editconflict' => 'რედაქტირების კონფლიქტი: $1',
*
* @author AlefZet
* @author Alibek Kisybay
+ * @author Daniyar
* @author GaiJin
* @author Kaztrans
* @author Urhixidur
'tog-newpageshidepatrolled' => 'Тексерілген беттерді жаңа беттер тізімінде көрсетпеу',
'tog-extendwatchlist' => 'Бақылау тізімді ұлғайту (барлық жарамды өзгерістерді көрсету)',
'tog-usenewrc' => 'Кеңейтілген жуықтағы өзгерістер (JavaScript)',
-'tog-numberheadings' => 'Бас жолдарды өздіктік номірле',
-'tog-showtoolbar' => 'Өңдеу қуралдар жолағын көрсет (JavaScript)',
+'tog-numberheadings' => 'Бас жолдарды дағдылы нөмірле',
+'tog-showtoolbar' => 'Өңдеу құралдары жолағын көрсет (JavaScript)',
'tog-editondblclick' => 'Қос шерту арқылы бетті өңдеу (JavaScript)',
'tog-editsection' => 'Бөлімдерді [өңдеу] сілтемесімен өңдеуін қос',
'tog-editsectiononrightclick' => 'Бөлім тақырыбын оң нұқумен өңдеуін қос (JavaScript)',
-'tog-showtoc' => 'Мазмұнын көрсет (3-тен арта бөлімі барыларға)',
-'tog-rememberpassword' => 'Ð\9aÑ\96Ñ\80генÑ\96мдÑ\96 оÑ\81Ñ\8b компÑ\8cÑ\8eÑ\82ерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
-'tog-watchcreations' => 'Ð\9cен баÑ\81Ñ\82аÒ\93ан беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchdefault' => 'Ð\9cен өңдеген беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchmoves' => 'Ð\9cен жÑ\8bлжÑ\8bÑ\82Ò\9bан беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
-'tog-watchdeletion' => 'Ð\9cен жойÒ\93ан беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ме Ò¯Ñ\81Ñ\82е',
+'tog-showtoc' => 'Мазмұнын көрсет (3-тен арта бөлімі барларға)',
+'tog-rememberpassword' => 'ТÑ\96Ñ\80келгÑ\96мдÑ\96 оÑ\81Ñ\8b бÑ\80аÑ\83зерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
+'tog-watchcreations' => 'Ð\9cен баÑ\81Ñ\82аÒ\93ан беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchdefault' => 'Ð\9cен өңдеген беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchmoves' => 'Ð\9cен жÑ\8bлжÑ\8bÑ\82Ò\9bан беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
+'tog-watchdeletion' => 'Ð\9cен жойÒ\93ан беÑ\82Ñ\82еÑ\80дÑ\96 баÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81',
'tog-minordefault' => 'Әдепкіден барлық өңдемелерді шағын деп белгіле',
-'tog-previewontop' => 'Қарап шығу аумағы кірістіру орны алдында',
+'tog-previewontop' => 'Қарап шығу аумағын кірістіру орнының алдында',
'tog-previewonfirst' => 'Бірінші өңдегенде қарап шығу',
'tog-nocache' => 'Бет бүркемелеуін өшір',
-'tog-enotifwatchlistpages' => 'Ð\91аÒ\9bÑ\8bлаÑ\83Ñ\8bÒ£Ñ\8bздаÒ\93Ñ\8b беÑ\82 өзгеÑ\80генде е-паштаға хабарлама жіберу',
+'tog-enotifwatchlistpages' => 'Ð\91аÒ\9bÑ\8bлаÑ\83Ñ\8bÒ£Ñ\8bздаÒ\93Ñ\8b беÑ\82 өзгеÑ\80генде е-поштаға хабарлама жіберу',
'tog-enotifusertalkpages' => 'Талқылауым өзгергенде маған хат жібер',
'tog-enotifminoredits' => 'Шағын өңдеме туралы да маған хат жібер',
'tog-enotifrevealaddr' => 'Е-поштамның мекенжайын ескерту хаттарда аш',
'tog-shownumberswatching' => 'Бақылап тұрған қатысушылардың санын көрсет',
'tog-oldsig' => 'Ағымдағы қолтаңбаңыз:',
-'tog-fancysig' => 'Қам қолтаңба (өздіктік сілтемесіз)',
+'tog-fancysig' => 'Қам қолтаңба (дағдылы сілтемесіз)',
'tog-externaleditor' => 'Шеттік өңдеуішті әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
'tog-externaldiff' => 'Шеттік айырмағышты әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
'tog-showjumplinks' => '«Өтіп кету» қатынау сілтемелерін қос',
'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақтама)',
'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
-'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімнен жасыр',
-'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімнен жасыр',
+'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыр',
+'tog-watchlisthidebots' => 'Бот өңдемелерін бақылау тізімінен жасыр',
'tog-watchlisthideminor' => 'Шағын өңдемелерді бақылау тізімінде көрсетпеу',
'tog-watchlisthideliu' => 'Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу',
'tog-watchlisthideanons' => 'Бақылау тізіміндегі жасырын қатысушылардың өңдеулерін көрсетпеу',
# Font style option in Special:Preferences
'editfont-style' => 'Өңдеу жолындағы қаріптің түрі',
'editfont-default' => 'Негізгі браузер',
-'editfont-monospace' => 'Ð\9cоноенді қаріп',
+'editfont-monospace' => 'Ð\91Ñ\96Ñ\80енді қаріп',
'editfont-sansserif' => 'Ноқатсыз қаріп',
'editfont-serif' => 'Ноқатты қаріп',
'mypage' => 'Жеке бетім',
'mytalk' => 'Талқылауым',
'anontalk' => 'IP талқылауы',
-'navigation' => 'Ð\9dавигаÑ\86иÑ\8f',
+'navigation' => 'Ð\91аÒ\93Ñ\8bÑ\82Ñ\82аÑ\83',
'and' => ' және',
# Cologne Blue skin
'vector-view-edit' => 'Өңдеу',
'vector-view-history' => 'Тарихы',
'vector-view-view' => 'Оқу',
-'vector-view-viewsource' => 'Қайнар көзін қарау',
+'vector-view-viewsource' => 'Қайнарын қарау',
'actions' => 'Әрекеттер',
'namespaces' => 'Есім кеңістігі',
'variants' => 'Нұсқалар',
'tagline' => '{{SITENAME}} жобасынан',
'help' => 'Анықтама',
'search' => 'Іздеу',
-'searchbutton' => 'Іздеу',
+'searchbutton' => 'Іздеу...',
'go' => 'Өту',
'searcharticle' => 'Өту',
'history' => 'Бет тарихы',
'specialpage' => 'Арнайы бет',
'personaltools' => 'Жеке құралдар',
'postcomment' => 'Жаңа бөлім',
-'articlepage' => 'Мағлұмат бетін қарау',
+'articlepage' => 'Мәлімет бетін қарау',
'talk' => 'Талқылау',
'views' => 'Көрініс',
'toolbox' => 'Құралдар',
'viewcount' => 'Бұл бет $1 рет қатыналған.',
'protectedpage' => 'Қорғалған бет',
'jumpto' => 'Мында өту:',
-'jumptonavigation' => 'шарлау',
+'jumptonavigation' => 'Бағыттау',
'jumptosearch' => 'іздеу',
-'view-pool-error' => 'Кешіріңіз, қазір серверлер шектен тыс жүктеулі.
+'view-pool-error' => 'Кешіріңіз, қазір серверлер шектен тыс жүктелуде.
Осы бетті қарауға өте көп сұраныс жасалды.
-Өтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.
+Өтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.
$1',
'pool-timeout' => 'Бұғатталу уақытын күту мерзімі өтті',
-'pool-queuefull' => 'Сұранымдар жинақтауышы толы',
+'pool-queuefull' => 'Сұранымдар жинақтауышысы толық',
'pool-errorunknown' => 'Белгісіз қате',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'aboutsite' => '{{SITENAME}} туралы',
'aboutpage' => 'Project:Жоба туралы',
-'copyright' => 'Мағлұмат $1 шартымен жетімді.',
-'copyrightpage' => '{{ns:project}}:Авторлық құқықтар',
+'copyright' => 'Мәлімет $1 шартымен жетімді.',
+'copyrightpage' => '{{ns:project}}:Ауторлық құқықтар',
'currentevents' => 'Ағымдағы оқиғалар',
'currentevents-url' => 'Project:Ағымдағы оқиғалар',
'disclaimers' => 'Жауапкершіліктен бас тарту',
'privacypage' => 'Project:Жеке құпиясын сақтау',
'badaccess' => 'Рұқсат беру қатесі',
-'badaccess-group0' => 'СұÑ\80аÑ\82Ñ\8bлÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\96Ò£Ñ\96здÑ\96 жегÑ\83Ñ\96Ò£Ñ\96зге рұқсат етілмейді.',
+'badaccess-group0' => 'СұÑ\80аÑ\82Ñ\8bлÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\96Ò£Ñ\96здÑ\96 оÑ\80Ñ\8bндаÑ\83Ò\93а рұқсат етілмейді.',
'badaccess-groups' => 'Аталған әрекетті тек {{PLURAL:$2|топтардың|топтың}} $1 қатысушылары ғана атқара алады.',
'versionrequired' => 'MediaWiki $1 нұсқасы керек',
'versionrequiredtext' => 'Бұл бетті қолдану үшін MediaWiki $1 нұсқасы керек. [[Special:Version|Жүйе нұсқасы бетін]] қараңыз.',
-'ok' => 'OK',
+'ok' => 'Жарайды',
'pagetitle' => '$1 — {{SITENAME}}',
'retrievedfrom' => '«$1» бетінен алынған',
'youhavenewmessages' => 'Сізде $1 бар ($2).',
-'newmessageslink' => 'жаңа хабарлар',
-'newmessagesdifflink' => 'соңғы өзгерісіне',
-'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарлар бар',
+'newmessageslink' => 'жаңа хабарламалар',
+'newmessagesdifflink' => 'соңғы өзгерiс',
+'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарламалар бар',
'editsection' => 'өңдеу',
'editold' => 'өңдеу',
-'viewsourceold' => 'қайнар көзін қарау',
+'viewsourceold' => 'қайнарын қарау',
'editlink' => 'өңдеу',
-'viewsourcelink' => 'қайнар көзін қарау',
-'editsectionhint' => 'Ð\9cÑ\8bна бөлімді өңдеу: $1',
+'viewsourcelink' => 'қайнарын қарау',
+'editsectionhint' => 'Ð\91өлімді өңдеу: $1',
'toc' => 'Мазмұны',
-'showtoc' => 'көрсет',
-'hidetoc' => 'жасыр',
+'showtoc' => 'көрсету',
+'hidetoc' => 'жасыру',
'collapsible-collapse' => 'Түру',
'collapsible-expand' => 'Жазу',
-'thisisdeleted' => '$1 қарайсыз ба, не қалпына келтіресіз бе?',
+'thisisdeleted' => '$1 қарайсыз ба, немесе қалпына келтіресіз бе?',
'viewdeleted' => '$1 қарайсыз ба?',
'restorelink' => 'Жойылған $1 өңдемені',
'feedlinks' => 'Арна:',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Мақала',
'nstab-user' => 'Жеке бет',
-'nstab-media' => 'ТаÑ\81па беті',
+'nstab-media' => 'Ð\9cедиа беті',
'nstab-special' => 'Арнайы бет',
'nstab-project' => 'Жоба беті',
'nstab-image' => 'Файл беті',
-'nstab-mediawiki' => 'Хабар',
+'nstab-mediawiki' => 'Хабарлама',
'nstab-template' => 'Үлгі',
'nstab-help' => 'Анықтама',
'nstab-category' => 'Санат',
# Main script and global functions
-'nosuchaction' => 'Мынадай еш әрекет жоқ',
+'nosuchaction' => 'Мұндай әрекет жоқ',
'nosuchactiontext' => 'URL-дегі көрсетілген әрекет қате.
-Бәлкім, сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.
+Бәлкім, Сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.
Бұл сондай-ақ {{SITENAME}} жобасында қателікті көрсетуі мүмкін.',
-'nosuchspecialpage' => 'Мынадай еш арнайы бет жоқ',
+'nosuchspecialpage' => 'Мұндай арнайы бет жоқ',
'nospecialpagetext' => '<strong>Сіздің сұраған арнайы бетіңіз жоқ.</strong>
Бар арнайы беттер тізімі: [[Special:SpecialPages|{{int:specialpages}}]].',
«$1»
мына «$2» функциясынан болды .
Дерекқор "$3: $4" қатесін қайтарды.',
-'laggedslavemode' => 'Құлақтандыру: Бетте жуықтағы жаңалаулар болмауы мүмкін.',
+'laggedslavemode' => "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
'readonly' => 'Дерекқоры құлыпталған',
-'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз',
+'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.',
'readonlytext' => 'Бұл дерекқор жаңадан жазу және басқа өзгерістер жасаудан ағымда құлыпталынған, мүмкін күнде-күн дерекқорды баптау үшін, бұны бітіргеннен соң қалыпты іске қайтарылады.
Құлыптаған әкімші бұны былай түсіндіреді: $1',
Бұл ескірген айырма сілтемесіне немесе жойылған бет тарихы сілтемесіне ергеннен бола береді.
Егер бұл орынды болмаса, бағдарламалық жасақтамадағы қатеге тап болуыңыз мүмкін.
-Бұл туралы нақты URL жайына аңғартпа жасап, әкімшіге баянаттаңыз.',
+Бұл туралы нақты URL жайына аңғартпа жасап, [[Special:ListUsers/sysop|әкімшіге]] баяндаңыз.',
'missingarticle-rev' => '(түзету нұсқасы: $1)',
-'missingarticle-diff' => '(Ð\90йÑ\80м.: $1, $2)',
-'readonly_lag' => 'Жетек дерекқор серверлер басқысымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
+'missingarticle-diff' => '(Ð\90йÑ\8bÑ\80Ñ\8bм: $1, $2)',
+'readonly_lag' => 'Жетек дерекқор серверлер басқасымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
'internalerror' => 'Ішкі қате',
'internalerror_info' => 'Ішкі қатесі: $1',
-'fileappenderrorread' => 'Толықтыру кезінде «$1» оқылмады',
+'fileappenderrorread' => 'Толықтыру кезінде «$1» оқылмады.',
'fileappenderror' => '«$2» -ге "$1" -ді қосу мүмкін болмады.',
'filecopyerror' => '«$1» файлы «$2» файлына көшірілмеді.',
'filerenameerror' => '«$1» файл атауы «$2» атауына өзгертілмеді.',
'wrong_wfQuery_params' => 'wfQuery() функциясы үшін бұрыс бапталымдары бар<br />
Жете: $1<br />
Сұраным: $2',
-'viewsource' => 'Қайнар көзін қарау',
+'viewsource' => 'Қайнарын қарау',
'viewsource-title' => '$1 бетінің бастапқы мәтінін қарау',
'actionthrottled' => 'Әрекет бәсеңдетілді',
'actionthrottledtext' => 'Спамға қарсы күрес есебінде, осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамасынан асып кеткенсіз.
Бірнеше минуттан қайта байқап көріңіз.',
'protectedpagetext' => 'Өңдеуді қақпайлау үшін бұл бет құлыпталынған.',
-'viewsourcetext' => 'Бұл беттің қайнар көзін қарауыңызға және көшіріп алуыңызға болады:',
+'viewsourcetext' => 'Бұл беттің қайнарын қарауыңызға және көшіріп алуыңызға болады:',
'viewyourtext' => 'Осы бет арқылы "өзіңіз жасаған өңдеулердің" бастапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.',
'protectedinterface' => 'Бұл бет бағдарламалық жасақтаманың тілдесу мәтінін жетістіреді, сондықтан қиянатты қақпайлау үшін өзгертуі құлыпталған.',
'editinginterface' => "'''Құлақтандыру:''' Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.
'ns-specialprotected' => '{{ns:special}} есім аясындағы беттер өңделінбейді',
'titleprotected' => "Бұл тақырып аты бастаудан [[{{ns:user}}:$1|$1]] қорғады.
Келтірілген себебі: ''$2''.",
+'filereadonlyerror' => "«$2» сақтамасы «тек қана оқу» тәртіптемесінде тұрғасын, «$1» файлын өзгерту мүмкін емес.
+Бұл тәртіптемені қондырған әкімші келесі түсіндірмені қалдырды: «''$3''»",
# Virus scanner
'virus-badscanner' => 'Баптау қателігі. Белгісіз вирус сканері: $1',
# Login and logout pages
'logouttext' => "'''Жүйеден шықтыңыз.'''
-Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз; немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
-Аңғартпа: Кейбір беттер шолғышыңыздың кешін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
+Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз, немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
+Аңғартпа: Кейбір беттер шолғышыңыздың кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
'welcomecreation' => '== Қош келдіңіз, $1! ==
Жаңа тіркелгіңіз жасалды.
Өзіңіздің [[Special:Preferences|жеке баптауларыңызды]] өзгертуді ұмытпаңыз.',
-'yourname' => 'Қатысушы атыңыз:',
-'yourpassword' => 'Құпия сөзіңіз:',
+'yourname' => 'Қатысушы аты:',
+'yourpassword' => 'Құпия сөз:',
'yourpasswordagain' => 'Құпия сөзді қайталаңыз:',
-'remembermypassword' => 'Ð\9cенÑ\96Ò£ кÑ\96Ñ\80генÑ\96мдÑ\96 бұл компÑ\8cÑ\8eÑ\82ерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
+'remembermypassword' => 'ТÑ\96Ñ\80келгÑ\96мдÑ\96 оÑ\81Ñ\8b бÑ\80аÑ\83зерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
'securelogin-stick-https' => 'Кіргеннен кейін HTTPS бойынша байланысты жалғастыру',
'yourdomainname' => 'Желі үйшігіңіз:',
'externaldberror' => 'Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.',
'logout' => 'Шығу',
'userlogout' => 'Шығу',
'notloggedin' => 'Кірмегенсіз',
-'nologin' => "Ð\90ккаÑ\83нÑ\82Ñ\8bÒ£Ñ\8bз бар ма? '''$1'''.",
+'nologin' => "ТÑ\96Ñ\80келгÑ\96Ò£Ñ\96з бар ма? '''$1'''.",
'nologinlink' => 'Тіркеліңіз',
'createaccount' => 'Жаңа тіркелгі',
'gotaccount' => "Бұған дейін тіркеліп пе едіңіз бе? '''$1'''.",
'gotaccountlink' => 'Кіріңіз',
'userlogin-resetlink' => 'Қатысушы атын не құпия сөзді ұмыттыңыз ба?',
-'createaccountmail' => 'е-поштамен',
+'createaccountmail' => 'Ð\95-поштамен',
'createaccountreason' => 'Себебі:',
-'badretype' => 'Енгізген құпия сөздеріңіз бір біріне сәйкес емес.',
+'badretype' => 'Енгізген құпия сөздеріңіз бір-біріне сәйкес емес.',
'userexists' => 'Енгізген қатысушы атыңыз әлдеқашан пайдалануда.
Өзге атауды таңдаңыз.',
'loginerror' => 'Кіру қатесі',
+'createaccounterror' => 'Тіркелгіні жасау мүмкін емес: $1',
'nocookiesnew' => 'Жаңа қатысушы тіркелгісі жасалды, бірақ кірмегенсіз.
Қатысушы кіру үшін {{SITENAME}} торабында «cookie» файлдары қолданылады.
Сізде «cookies» өшірілген.
'nocookieslogin' => 'Қатысушы кіру үшін {{SITENAME}} торабында «cookies» деген қолданылады.
Сізде «cookies» өшірілген.
Соны қосыңыз да кіруді қайта байқап көріңіз.',
+'nocookiesfornew' => 'Оның қайнарын растай алмағандықтан қатысушының аккаунты тіркелмеді. «Cookies» қосылып тұрғанына көз жеткізіңіз, бетті қайта жаңартыңыз және тағы байқап көріңіз.',
'noname' => 'Жарамды қатысушы атын енгізбедіңіз.',
'loginsuccesstitle' => 'Кіруіңіз сәтті өтті',
'loginsuccess' => "'''Сіз енді {{SITENAME}} жобасына «$1» ретінде кіріп отырсыз.'''",
-'nosuchuser' => 'Мында «$1» деп аталған қатысушы жоқ.
-Емлеңізді тексеріңіз, не жаңа тіркелгі жасаңыз.',
+'nosuchuser' => '«$1» деген қатысушы тіркелмеген.
+Емлеңізді тексеріңіз, немесе жаңа тіркелгі жасаңыз.',
'nosuchusershort' => 'Мында «$1» деп аталған қатысушы жоқ.
Емлеңізді тексеріңіз.',
'nouserspecified' => 'Қатысушы атын келтіруіңіз жөн.',
+'login-userblocked' => 'Бұл қатысушы бұғатталған. Жүйеге кiру рұқсат етiлмеген.',
'wrongpassword' => 'Бұрыс құпия сөз енгізілген. Қайта байқап көріңіз.',
'wrongpasswordempty' => 'Құпия сөз бос болған. Қайта байқап көріңіз.',
-'passwordtooshort' => 'Құпия сөзіңіз жарамсыз не тым қысқа.
+'passwordtooshort' => 'Құпия сөзіңіз жарамсыз немесе тым қысқа.
Бұнда ең кемінде $1 таңба болуы және де қатысушы атыңыздан өзге болуы жөн.',
+'password-name-match' => 'Енгізген құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.',
+'password-login-forbidden' => 'Бұл қатысушы аты мен құпия сөзін пайдалануға тыйым салынған.',
'mailmypassword' => 'Құпия сөзімді электронды поштама жібер',
'passwordremindertitle' => '{{SITENAME}} үшін жаңа уақытша құпия сөз',
-'passwordremindertext' => 'Кейбіреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз)
-сізге {{SITENAME}} үшін жаңа құпия сөз жөнелетуін бізден сұраған ($4).
-«$2» қатысушының құпия сөзі «$3» болды енді.
-Қазір кіруіңіз және құпия сөзді өзгертуіңіз керек.
+'passwordremindertext' => 'Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} үшін жаңа құпия сөз жөнелету сұранымын жасаған ($4).
+Қатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл Сіздің сұранымыңыз болса, жүйеге кіріп құпия сөзді өзгертуіңіз керек. Сіздің уақытша құпия сөзіңіз $5 дейін белсенді болады.
-Ð\95геÑ\80 бұл Ñ\81Ò±Ñ\80анÑ\8bмдÑ\8b баÑ\81Ò\9bа бÑ\96Ñ\80еÑ\83 Ñ\96Ñ\81Ñ\82еÑ\81е, не Ò\9bұпиÑ\8f Ñ\81өздÑ\96 еÑ\81ке Ñ\82Ò¯Ñ\81Ñ\96Ñ\80Ñ\81Ñ\96п ендÑ\96 өзгеÑ\80Ñ\82кÑ\96Ò£Ñ\96з келмеÑ\81е, еÑ\81кÑ\96 Ò\9bұпиÑ\8f Ñ\81өз Ò\9bолданÑ\83Ñ\8bн жағастырып осы хатқа аңғармауыңызға да болады.',
+Ð\95геÑ\80 бұл Ñ\81Ò±Ñ\80анÑ\8bмдÑ\8b СÑ\96з жаÑ\81амаÑ\81Ñ\8bÒ£Ñ\8bз, не Ò\9bұпиÑ\8f Ñ\81өздÑ\96 еÑ\81ке Ñ\82Ò¯Ñ\81Ñ\96Ñ\80Ñ\96п ендÑ\96 өзгеÑ\80Ñ\82кÑ\96Ò£Ñ\96з келмеÑ\81е, еÑ\81кÑ\96 Ò\9bұпиÑ\8f Ñ\81өздÑ\96 Ò\9bолданÑ\83дÑ\8b жалғастырып осы хатқа аңғармауыңызға да болады.',
'noemail' => 'Осы арада «$1» қатысушының е-пошта мекенжайы жоқ.',
+'noemailcreate' => 'Сізге нақты электрондық пошта есімін көрсету керек.',
'passwordsent' => 'Жаңа құпия сөз «$1» үшін тіркелген е-пошта мекенжайына жөнелтілді.
Қабылдағаннан кейін кіргенде соны енгізіңіз.',
'blocked-mailpassword' => 'IP мекенжайыңыздан өңдеу бұғатталған, сондықтан қиянатты қақпайлау үшін құпия сөзді қалпына келтіру жетесін қолдануына рұқсат етілмейді.',
'throttled-mailpassword' => 'Соңғы {{PLURAL:$1|сағатта|$1 сағатта}} құпия сөз ескерту хаты алдақашан жөнелтілді.
Қиянатты қақпайлау үшін, {{PLURAL:$1|сағат|$1 сағат}} сайын тек бір ғана құпия сөз ескерту хаты жөнелтіледі.',
'mailerror' => 'Хат жөнелту қатесі: $1',
-'acct_creation_throttle_hit' => 'Ғафу етіңіз, сіз алдақашан $1 рет тіркелгі жасапсыз.
-Ð\9eнан аÑ\80Ñ\82Ñ\8bÒ\9b Ñ\96Ñ\81Ñ\82ей алмайÑ\81Ñ\8bз.',
+'acct_creation_throttle_hit' => 'Ғафу етіңіз, сіз алдақашан $1 рет тіркелгі жасапсыз. Онан артық жасай алмайсыз.
+Ð\9dÓ\99Ñ\82ижеÑ\81Ñ\96нде, оÑ\81Ñ\8b IP-мекенжаймен кÑ\96Ñ\80Ñ\83Ñ\88Ñ\96леÑ\80 дÓ\99л Ò\9bазÑ\96Ñ\80гÑ\96 Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а бÑ\96Ñ\80неÑ\88е Ñ\82Ñ\96Ñ\80келгÑ\96 жаÑ\81ай алмайдÑ\8b.',
'emailauthenticated' => 'Е-пошта мекенжайыңыз расталған кезі: $3, $2.',
'emailnotauthenticated' => 'Е-пошта мекенжайыңыз әлі расталған жоқ.
Келесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.',
'noemailprefs' => 'Осы мүмкіндіктер істеуі үшін е-пошта мекенжайыңызды енгізіңіз.',
'emailconfirmlink' => 'Е-пошта мекенжайыңызды құптаңыз',
-'invalidemailaddress' => 'Осы е-пошта мекенжайында жарамсыз пішім болған, қабыл етілмейді.
-Дұрыс пішімделген мекенжайды енгізіңіз, не аумақты бос қалдырыңыз.',
+'invalidemailaddress' => 'Бұл е-пошта есімі пішімге сәйкес келмегендіктен қабылданбайды.
+Дұрыс пішімделген е-пошта есімін енгізіңіз, немесе аумақты бос қалдырыңыз.',
+'cannotchangeemail' => 'Тіркелгінің е-поштасының мекен-жайы бұл уикиде өзгертілмейді.',
+'emaildisabled' => 'Бұл сайт е-поштаның хабарламасын жібере алмайды.',
'accountcreated' => 'Жаңа тіркелгі жасалды',
'accountcreatedtext' => '$1 үшін жаңа қатысушы тіркелгісі жасалды.',
'createaccount-title' => '{{SITENAME}} үшін тіркелу',
Жобаға кіріуіңіз және құпия сөзіңізді өзгертуіңіз тиісті.
Егер бұл тіркелгі қателікпен жасалса, осы хабарға елемеуіңіз мүмкін.',
+'usernamehasherror' => 'Қатысушы есіміне тор белгі нышаны енгізілмейді.',
+'login-throttled' => 'Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын кішкене күте тұрыңыз.',
+'login-abort-generic' => 'Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.',
'loginlanguagelabel' => 'Тіл: $1',
+'suspicious-userlogout' => 'Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені, бұл жарамсыз браузер немесе кэштеуші проксидің сұранымына ұқсайды.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Mail() PHP-функциясындағы белгісіз қате.',
+'user-mail-no-addy' => 'Е-пошта есімінсіз хабарлама жіберуге талпынды.',
# Change password dialog
'resetpass' => 'Тіркелгінің құпия сөзін өзгерту',
'retypenew' => 'Жаңа құпия сөзіңізді қайталаңыз:',
'resetpass_submit' => 'Құпия сөзді қойыңыз да кіріңіз',
'resetpass_success' => 'Құпия сөзіңіз сәтті өзгертілді! Енді кіріңіз…',
-'resetpass_forbidden' => '{{SITENAME}} жобасында құпия сөздер өзгертілмейді',
+'resetpass_forbidden' => 'Құпия сөз өзгертілмейді',
+'resetpass-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
'resetpass-submit-loggedin' => 'Құпия сөзді өзгерту',
+'resetpass-submit-cancel' => 'Болдырмау',
+'resetpass-wrong-oldpass' => 'Уақытша немесе ағымдағы құпия сөзіңіз дұрыс емес.
+Мүмкін Сіз құпия сөзді сәтті өзгерткенсіз, немесе жаңа уақытша құпия сөзге сұраным жасағансыз.',
+'resetpass-temp-password' => 'Уақытша құпия сөз:',
# Special:PasswordReset
+'passwordreset' => 'Құпия сөзді қайтару',
+'passwordreset-text' => 'Сіздің тіркелгіңіздің баптаулары туралы хабарламаларды алу үшін мына пішінді толтырыңыз.',
+'passwordreset-legend' => 'Құпия сөзді қайтару',
+'passwordreset-disabled' => 'Бұл уикиде құпия сөзді қайтару ажыратылған.',
+'passwordreset-pretext' => '{{PLURAL:$1||Төменде көрсетілгендердің ішіндегі біреуін жазыңыз}}',
'passwordreset-username' => 'Қатысушы аты:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Келген хатты қарау керек пе?',
+'passwordreset-capture-help' => 'Егер Сіз берілген белгішені қондырсаңыз, қатысушыға жіберілетін уақытша құпия сөз жазылған хат көрсетіледі.',
+'passwordreset-email' => 'Е-поштаның мекен-жайы:',
+'passwordreset-emailtitle' => '{{SITENAME}} тіркелгісі туралы анықтама',
+'passwordreset-emailelement' => 'Қатысушы есімі: $1
+Уақытша құпия сөз: $2',
+'passwordreset-emailsent' => 'Электронды пошта арқылы ескертпе жөнелтілді.',
+'passwordreset-emailsent-capture' => 'Жөнелтілген ескертпе-хат төменде көрсетілген.',
+'passwordreset-emailerror-capture' => 'Жазылған ескертпе-хат төменде көрсетілген, оның жөнелтілмеу себебі: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Е-пошта мекен-жайын өзгерту',
+'changeemail-header' => 'Е-пошта мекен-жайының өзгертілуі',
+'changeemail-text' => 'Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін Сізге құпия сөзді енгізу керек.',
+'changeemail-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
+'changeemail-oldemail' => 'Е-поштаның ағымдағы мекен-жайы:',
+'changeemail-newemail' => 'Е-поштаның жаңа мекен жайы:',
+'changeemail-none' => '(ешкім)',
+'changeemail-submit' => 'Е-поштаны өзгерту',
+'changeemail-cancel' => 'Болдырмау',
# Edit page toolbar
'bold_sample' => 'Жуан мәтін',
'italic_tip' => 'Қиғаш мәтін',
'link_sample' => 'Сілтеме тақырыбының аты',
'link_tip' => 'Ішкі сілтеме',
-'extlink_sample' => 'http://www.example.com сілтеме тақырыбын аты',
+'extlink_sample' => 'http://www.example.com сілтеме тақырыбының аты',
'extlink_tip' => 'Шеттік сілтеме (алдынан http:// енгізуін ұмытпаңыз)',
'headline_sample' => 'Бас жол мәтіні',
'headline_tip' => '2-ші деңгейлі бас жол',
'hr_tip' => 'Дерелей сызық (үнемді қолданыңыз)',
# Edit pages
-'summary' => 'Түйіндемесі:',
+'summary' => 'Өзгертпе мазмұны:',
'subject' => 'Тақырыбы/бас жолы:',
-'minoredit' => 'Ð\91ұл Ñ\88ағын өңдеме',
+'minoredit' => 'Шағын өңдеме',
'watchthis' => 'Бетті бақылау',
-'savearticle' => 'Бетті сақта!',
+'savearticle' => 'Бетті сақтау',
'preview' => 'Қарап шығу',
-'showpreview' => 'Қарап шық',
-'showlivepreview' => 'ТÑ\83Ñ\80а Ò\9bаÑ\80ап Ñ\88Ñ\8bÒ\9b',
+'showpreview' => 'Алдын ала қарау',
+'showlivepreview' => 'Ð\96Ñ\8bлдам Ò\9bаÑ\80аÑ\83',
'showdiff' => 'Өзгерістерді көрсет',
-'anoneditwarning' => "'''Құлақтандыру:''' Сіз жүйеге кірмегенсіз.
-IP мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
+'anoneditwarning' => "'''Ескертпе:''' Сіз жүйеге кірмегенсіз.
+IP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
+'anonpreviewwarning' => '"Сіз жүйеге кірмегенсіз. IP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады."',
'missingsummary' => "'''Ескертпе:''' Өңдеменің қысқаша мазмұндамасын енгізбепсіз.
«Сақтау» түймесін тағы бассаңыз, өңденмеңіз мәндемесіз сақталады.",
'missingcommenttext' => 'Мәндемеңізді төменде енгізіңіз.',
-'missingcommentheader' => "'''Ескертпе:''' Бұл мәндемеге тақырып/басжол жетістірмепсіз.
-Егер тағы да Сақтау түймесін нұқысаңыз, өңдемеңіз солсыз сақталады.",
+'missingcommentheader' => "'''Ескертпе:''' Өңдеменің қысқаша мазмұндамасын енгізбепсіз.
+«Сақтау» түймесін тағы бассаңыз, өңденмеңіз мәндемесіз сақталады.",
'summary-preview' => 'Қысқаша мазмұндамасын қарап шығу:',
'subject-preview' => 'Тақырыбын/бас жолын қарап шығу:',
'blockedtitle' => 'Қатысушы бұғатталған',
[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.
Ағымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.
Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
-'autoblockedtext' => "$1 деген бұрын өзге қатысушы пайдаланған болғасын осы IP мекенжайыңыз өздіктік бұғатталған.
-Келтірілген себебі:
-
-:''$2''
+'autoblockedtext' => "'''Қатысушы атыңыз не IP-мекенжайыңыз бұғатталған.'''
-* Бұғаттау басталғаны: $8
-* Бұғаттау бітетіні: $6
-
-Осы бұғаттауды талқылау үшін $1 дегенмен, не басқа [[{{{{ns:mediawiki}}:grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.
+Осы бұғаттауды $1 істеген. Келтірілген себебі: ''$2''.
-Аңғартпа: [[{{#special:Preferences}}|Пайдаланушылық бапталымдарыңызды]] қолданып жарамды е-пошта мекенжайын енгізгенше дейін және бұны пайдалануы бұғатталмағанша дейін «Қатысушыға хат жазу» мүмкіндігін қолдана алмайсыз.
+* Бұғаттаудың басталғаны: $8
+* Бұғаттаудың бітетіні: $6
+* Бұғаттау нысанасы: $7
-Бұғатау нөміріңіз: $5.
-Бұл нөмірді әрбір сұранымыңыздарға кірістіріңіз.",
+Осы бұғаттауды талқылау үшін $1, не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.
+[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.
+Ағымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.
+Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
'blockednoreason' => 'еш себебі келтірілмеген',
'whitelistedittext' => 'Беттерді өңдеу үшін $1 жөн.',
'confirmedittext' => 'Беттерді өңдеу үшін алдын ала Е-пошта мекенжайыңызды құптауыңыз жөн.
Е-пошта мекенжайыңызды [[{{#special:Preferences}}|пайдаланушылық бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.',
-'nosuchsectiontitle' => 'Осындай еш бөлім жоқ',
-'nosuchsectiontext' => 'Жоқ бөлімді өңдеуді талап етіпсіз.',
+'nosuchsectiontitle' => 'Бұл бөлімді табу мүмкін емес',
+'nosuchsectiontext' => 'Сіз бұрын болмаған бөлімді өзгертпекшісіз.
+Мүмкін бұл бетті жылжытылған немесе жойылған.',
'loginreqtitle' => 'Кіруіңіз керек',
'loginreqlink' => 'кіру',
'loginreqpagetext' => 'Басқа беттерді көру үшін сіз $1 болуыңыз жөн.',
* <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 файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
+'userpage-userdoesnotexist-view' => '«$1» қатысушы есімі тіркелмеген.',
+'blocked-notice-logextract' => 'Бұл қатысушы қазіргі уақытта бұғатталған.
+Төменде бұғаттау журналындағы соңғы жазбалар көрсетілген.',
+'clearyourcache' => "'''Ескертпе:''' Сақтағаннан кейін, өзгерістерді көру үшін шолғыш бүркемесін орағыту ықтимал. '''Mozilla / Firefox / Safari:''' ''Қайта жүктеу'' батырмасын нұқығанда ''Shift'' тұтыңыз, не ''Ctrl-Shift-R'' басыңыз (Apple Mac — ''Cmd-Shift-R''); '''IE:''' ''Жаңарту'' батырмасын нұқығанда ''Ctrl'' тұтыңыз, не ''Ctrl-F5'' басыңыз; '''Konqueror:''': ''Жаңарту'' батырмасын жай нұқыңыз, не ''F5'' басыңыз; '''Opera''' пайданушылары ''Құралдар→Бапталымдар'' дегенге барып бүркемесін толық тазарту жөн.",
+'usercssyoucanpreview' => "'''Кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
'userjsyoucanpreview' => "'''Ақыл-кеңес:''' Жаңа JS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
'usercsspreview' => "'''Мынау CSS мәтінін тек қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
'userjspreview' => "'''Мынау JavaScript қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
'updated' => '(Жаңартылған)',
'note' => "'''Аңғартпа:'''",
'previewnote' => "Бұл тек '''қарап шығу''' екенін ұмытпаңыз, өзгерістер әлі сақталған жоқ!",
+'continue-editing' => 'Өңдемені жалғастыру',
'previewconflict' => 'Бұл қарап шығу беті жоғарғы кірістіру орнындағы мәтінді қамтиды да және сақталғандағы өңді көрсетпек.',
'session_fail_preview' => "'''Ғафу етіңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.
Қайта байқап көріңіз. Егер бұл әлі істелмесе, шығуды және қайта кіруді байқап көріңіз.'''",
Бет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.
Бұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.'''",
'editing' => 'Өңделуде: $1',
+'creating' => 'Бастау: $1',
'editingsection' => 'Өңделуде: $1 (бөлімі)',
'editingcomment' => 'Өңделуде: $1 (мәндемесі)',
-'editconflict' => 'Өңдеме қақтығысы: $1',
+'editconflict' => 'Өңдемелер қақтығысы: $1',
'explainconflict' => "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.
Жоғарғы кірістіру орнында беттің ағымдық мәтіні бар.
Төменгі кірістіру орнында сіз өзгерткен мәтіні көрсетіледі.
Бұл сақтай алынбайды.'''",
'readonlywarning' => "'''ҚҰЛАҚТАНДЫРУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.
Кейін қолдану үшін мәтәнді қйып алып және қойып, мәтін файлына сақтауңызға болады.'''",
-'protectedpagewarning' => "'''ҚҰЛАҚТАНДЫРУ: Бұл бет қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''",
+'protectedpagewarning' => "'''Ескертпе: Бұл бет қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''",
'semiprotectedpagewarning' => "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.",
'cascadeprotectedwarning' => "'''Құлақтандыру''': Бұл бет құлыпталған, енді тек әкімші құқықтары бар қатысушылар бұны өңдей алады.Бұның себебі: бұл бет «баулы қорғауы» бар келесі {{PLURAL:$1|беттің|беттердің}} кірікбеті:",
-'titleprotectedwarning' => "'''ҚҰЛАҚТАНДЫРУ: Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
+'titleprotectedwarning' => "'''Ескертпе: Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
'templatesused' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
-'templatesusedpreview' => 'Ð\91ұнÑ\8b Ò\9bаÑ\80ап Ñ\88Ñ\8bÒ\93Ñ\83Ò\93а Ò\9bолданÑ\8bлÒ\93ан үлгÑ\96леÑ\80:',
-'templatesusedsection' => 'Бұл бөлімде қолданылған үлгілер:',
+'templatesusedpreview' => 'Ð\91ұл беÑ\82Ñ\82е Ò\9bолданÑ\8bлÒ\93ан {{PLURAL:$1|үлгÑ\96|үлгÑ\96леÑ\80}}:',
+'templatesusedsection' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
'template-protected' => '(қорғалған)',
'template-semiprotected' => '(жартылай қорғалған)',
'hiddencategories' => 'Бұл бет $1 жасырын санаттың мүшесі:',
'nocreatetitle' => 'Бетті бастау шектелген',
'nocreatetext' => '{{SITENAME}} жобасында жаңа бет бастауы шектелген.
Кері қайтып бар бетті өңдеуіңізге болады, немесе [[Special:UserLogin|кіруіңізге не тіркелуіңізге]] болады.',
-'nocreate-loggedin' => '{{SITENAME}} жобасында жаңа бет бастау рұқсатыңыз жоқ.',
+'nocreate-loggedin' => 'Жаңа бет бастауға рұқсатыңыз жоқ.',
+'sectioneditnotsupported-title' => 'Бөлімдерді өңдеу қолданылмайды',
+'sectioneditnotsupported-text' => 'Бұл бетте бөлімдерді өңдеу қолданылмайды.',
'permissionserrors' => 'Рұқсаттар қателері',
'permissionserrorstext' => 'Бұны істеуге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
'permissionserrorstext-withaction' => '$2 дегенге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:',
'recreate-moveddeleted-warn' => "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
Бұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.
-Төменде бұл бетке қатысты жою (және жылжыту) журналы көрсетілген:",
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
+'moveddeleted-notice' => 'Бұл бет жойылған.
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:',
'log-fulllog' => 'Толық журналды қарау',
+'edit-hook-aborted' => 'Түзету ілмек арқылы болдырмады.
+Қосымша түсіндірмелер көрсетілмеген.',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Құлақтандыру: Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.
'revdelete-nooldid-title' => 'Нысана түзету жарамсыз',
'revdelete-nooldid-text' => 'Бұл жетені орындау үшін нысана түзетуін/түзетулерін келтірілмепсіз,
келтірілген түзету жоқ, не ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.',
+'revdelete-nologtype-title' => 'Журнал түрі көрсетілмеген',
'revdelete-show-file-submit' => 'Иә',
'revdelete-selected' => "'''[[:$1]] дегеннің бөлектенген {{PLURAL:$2|түзетуі|түзетулері}}:'''",
'logdelete-selected' => "'''Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:'''",
'action-read' => 'Осы бетті оқу',
'action-edit' => 'осы бетті өңдеу',
'action-delete' => 'Осы бетті жою',
+'action-mergehistory' => 'Бұл беттің өзгеріс тарихын қосу',
+'action-userrights' => 'Қатысушылардың барлық құқықтарын өзгерту',
+'action-userrights-interwiki' => 'Басқа уикилердегі қатысушылардың құқықтарын өзгерту',
+'action-siteadmin' => 'Дерекқорды бұғаттау немесе бұғаттан шығару',
+'action-sendemail' => 'электронды хаттарды жіберу',
# Recent changes
'nchanges' => '$1 өзгеріс',
-'recentchanges' => 'Ð\96Ñ\83Ñ\8bÒ\9bÑ\82ағы өзгерістер',
+'recentchanges' => 'Соңғы өзгерістер',
'recentchanges-legend' => 'Жуықтағы өзгерістер баптаулары',
'recentchangestext' => 'Бұл бетте осы уикидегі болған жуықтағы өзгерістер байқалады.',
'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.',
'rcshowhidepatr' => 'Зерттелген өңдемелерді $1',
'rcshowhidemine' => 'Өңдемелерімді $1',
'rclinks' => 'Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3',
-'diff' => 'айырм.',
-'hist' => 'тар.',
-'hide' => 'жаÑ\81Ñ\8bÑ\80',
-'show' => 'көÑ\80Ñ\81еÑ\82',
+'diff' => 'айырым',
+'hist' => 'тарихы',
+'hide' => 'Ð\96аÑ\81Ñ\8bÑ\80Ñ\83',
+'show' => 'Ð\9aÓ©Ñ\80Ñ\81еÑ\82Ñ\83',
'minoreditletter' => 'ш',
'newpageletter' => 'Ж',
'boteditletter' => 'б',
'number_of_watching_users_pageview' => '[бақылаған $1 қатысушы]',
'rc_categories' => 'Санаттарға шектеу ("|" белгісімен бөліктеңіз)',
-'rc_categories_any' => 'Қайсыбір',
+'rc_categories_any' => 'Кез келген',
+'rc-change-size-new' => 'Өңдеуден кейінгі көлемі: {{PLURAL:$1|байт|байттар}}',
'newsectionsummary' => '/* $1 */ жаңа бөлім',
-'rc-enhanced-expand' => 'Толық ақпаратын көрсету (JavaScript-ті керек етеді)',
-'rc-enhanced-hide' => 'Толық ақпаратын жасыру',
+'rc-enhanced-expand' => 'Толық ақпаратты көрсету (JavaScript-ті керек етеді)',
+'rc-enhanced-hide' => 'Толық ақпаратты жасыру',
+'rc-old-title' => 'Бастапқы «$1» сияқты жасалған',
# Recent changes linked
'recentchangeslinked' => 'Қатысты өзгерістер',
'sp-contributions-talk' => 'талқылауы',
'sp-contributions-userrights' => 'Қатысушы құқықтарын реттеу',
'sp-contributions-search' => 'Үлес үшін іздеу',
-'sp-contributions-username' => 'IP мекенжайы не қатысушы аты:',
+'sp-contributions-username' => 'IP мекенжайы немесе қатысушы аты:',
'sp-contributions-submit' => 'Ізде',
# What links here
'blockiptext' => 'Төмендегі пішін қатысушының жазу рұқсатын белгілі IP мекенжайымен не атымен бұғаттау үшін қолданылады.
Бұны тек бұзақылықты қақпайлау үшін және де [[{{{{ns:mediawiki}}:Policy-url}}|ережелер]] бойынша атқаруыңыз жөн.
Төменде тиісті себебін толтырып көрсетіңіз (мысалы, дәйекке бұзақылықпен өзгерткен беттерді келтіріп).',
-'ipadressorusername' => 'IP мекенжайы не қатысушы аты:',
+'ipadressorusername' => 'IP мекенжайы немесе қатысушы аты:',
'ipbexpiry' => 'Мерзімі бітпек:',
'ipbreason' => 'Себебі:',
'ipbreasonotherlist' => 'Басқа себеп',
'ipbcreateaccount' => 'Тіркелуді қақпайлау',
'ipbemailban' => 'Қатысушы е-поштамен хат жөнелтуін қақпайлау',
'ipbenableautoblock' => 'Бұл қатысушы соңғы қолданған IP мекенжайын, және кейін өңдеуге байқап көрген әр IP мекенжайларын өзбұғаттауы',
-'ipbsubmit' => 'Қатысушыны бұғатта',
+'ipbsubmit' => 'Қатысушыны бұғаттау',
'ipbother' => 'Басқа мерзімі:',
'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' => 'Басқа/қосымша себеп:',
'ipbhidename' => 'Қатысушы атын бұғаттау журналыннан, белсенді бұғаттау тізімінен, қатысушы тізімінен жасыру',
'ipbwatchuser' => 'Бұл қатысушының жеке және талқылау беттерін бақылау',
-'badipaddress' => 'Жарамсыз IP мекенжайы',
+'ipb-confirm' => 'Бұғаттауды растау',
+'badipaddress' => 'IP мекенжайы қате жазылған.',
'blockipsuccesssub' => 'Бұғаттау сәтті өтті',
'blockipsuccesstext' => '[[{{#special:Contributions}}/$1|$1]] деген бұғатталған.<br />
Бұғаттарды шолып шығу үшін [[{{#special:Ipblocklist}}|IP бұғаттау тізімін]] қараңыз.',
Осы мақсатыңызды, және баптау біткенде дерекқорды ашатыңызды құптаңыз.',
'unlockdbtext' => 'Дерекқодын ашылуы барлық қатысушылардың бет өңдеу, баптауын қалау, бақылау тізімін, тағы басқа дерекқорды өзгертетін мүмкіндіктерін қалпына келтіреді.
Осы мақсатыңызды құптаңыз.',
-'lockconfirm' => 'Ð\98Ó\99, деÑ\80екÒ\9bоÑ\80 Ò\9bұлÑ\8bпÑ\82аÑ\83Ñ\8bн наÒ\9bÑ\82Ñ\8b тілеймін.',
-'unlockconfirm' => 'Ð\98Ó\99, деÑ\80екÒ\9bоÑ\80 Ò\9bұлÑ\8bпÑ\82амаÑ\83Ñ\8bн наÒ\9bÑ\82Ñ\8b Ñ\82Ñ\96леймÑ\96н.',
+'lockconfirm' => 'Ð\98Ó\99, мен Ñ\88Ñ\8bнÑ\8bменде деÑ\80екÒ\9bоÑ\80дÑ\8bÒ£ Ò\9bұлÑ\8bпÑ\82алÑ\83Ñ\8bн тілеймін.',
+'unlockconfirm' => 'Ð\98Ó\99, мен Ñ\88Ñ\8bнÑ\8bменде деÑ\80екÒ\9bоÑ\80дÑ\8bÒ£ Ò\9bұлÑ\8bпÑ\82алÑ\83Ñ\8bн Ó©Ñ\88Ñ\96Ñ\80гÑ\96м келедÑ\96.',
'lockbtn' => 'Дерекқорды құлыпта',
'unlockbtn' => 'Дерекқорды құлыптама',
'locknoconfirm' => 'Құптау көзіне құсбелгі салмағансыз.',
Ал мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
'movearticle' => 'Ағымдағы бет атауы:',
-'movenologin' => 'Ð\96үйеге кірмегенсіз',
+'movenologin' => 'СÑ\96з жүйеге кірмегенсіз',
'movenologintext' => 'Бетті жылжыту үшін тіркелген болуыңыз және [[{{#special:UserLogin}}|кіруіңіз]] жөн.',
'movenotallowed' => '{{SITENAME}} жобасында беттерді жылжыту руқсатыңыз жоқ.',
'newtitle' => 'Жаңа бет атауы:',
'move-watch' => 'Бұл бетті бақылау',
-'movepagebtn' => 'Бетті жылжыт',
+'movepagebtn' => 'Бетті жылжыту',
'pagemovedsub' => 'Жылжыту сәтті аяқталды',
'movepage-moved' => '\'\'\'"$1" беті "$2" бетіне жылжытылды\'\'\'',
'articleexists' => 'Осылай аталған бет алдақашан бар, не таңдаған атауыңыз жарамды емес.
'allmessagestext' => 'Мында {{ns:mediawiki}} есім аясында жетімді жүйе хабар тізімі беріледі.
Егер әмбебап MediaWiki жерсіндіруге үлес қосқыңыз келсе [//www.mediawiki.org/wiki/Localisation MediaWiki жерсіндіру бетіне] және [//translatewiki.net translatewiki.net жобасына] барып шығыңыз.',
'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' өшірілген себебінен '''{{#special:AllMessages}}''' беті қолданылмайды.",
+'allmessages-filter-legend' => 'Фильтр',
+'allmessages-filter-unmodified' => 'Өзгертілмегендер',
+'allmessages-filter-all' => 'Барлығы',
+'allmessages-filter-modified' => 'Өзгертілгендер',
+'allmessages-language' => 'Тілі:',
+'allmessages-filter-submit' => 'Өту',
# Thumbnails
'thumbnail-more' => 'Үлкейту',
* @file
*
* @author Albamhandae
+ * @author Altostratus
* @author Chanhee
* @author Chulki Lee
* @author Cwt96
'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' => '이 편집을 되돌리려면 아래의 변경되는 사항을 확인한 후 저장해주세요.',
# SpecialCachedPage
'cachedspecial-viewing-cached-ttl' => '지금 이 문서의 캐시된 버전을 보고 있습니다. 이 버전은 최대 $1만큼 지난 버전일 가능성이 있습니다.',
+'cachedspecial-viewing-cached-ts' => '현재 이 페이지는 캐시 처리된 버전으로 현재 문서 상태를 반영하지 않을 수도 있습니다.',
'cachedspecial-refresh-now' => '최신 버전 보기.',
# Special:Categories
'blocklog-showsuppresslog' => '이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다. 해당 사용자의 차단 기록은 다음과 같습니다.',
'blocklogentry' => '[[$1]] 사용자를 $2 차단함 $3',
'reblock-logentry' => '[[$1]] 사용자의 차단 기간을 $2(으)로 변경 $3',
-'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다. 자동으로 차단된 IP 주소는 여기에 나오지 않습니다. [[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
+'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
+자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
+[[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
'unblocklogentry' => '$1을 차단 해제했습니다.',
'block-log-flags-anononly' => 'IP만 막음',
'block-log-flags-nocreate' => '계정 생성 막음',
'version-software' => '설치된 프로그램',
'version-software-product' => '제품',
'version-software-version' => '버전',
+'version-entrypoints' => 'URL 진입점',
+'version-entrypoints-header-entrypoint' => '진입점',
'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'page-rss-feed' => '«$1» — RSS-лентасы',
'page-atom-feed' => '«$1» — Atom-лентасы',
'red-link-title' => '$1 (быллай бет джокъду)',
+'sort-descending' => 'Кем болуугъа кёре тиз',
+'sort-ascending' => 'Ёсюуге кёре тиз',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Статья',
'badarticleerror' => 'Бу бетде этилирге болмайды быллай амал.',
'cannotdelete' => '«$1» файлны неда бетни кетерирге болмайды.
Башха къошулуучу кетерген болургъа боллукъду аны.',
+'cannotdelete-title' => '«$1» бетни кетерирге болмайды',
'badtitle' => 'Джарамагъан ат',
'badtitletext' => 'Сорулгъан бетни аты терсди, бошду, неда интервики аты терс джазылгъанды. Келишмеген (хайырланыргъа болмагъан) символла хайырланыргъада боллукъдула атында.',
'perfcached' => 'Бу информация кэшден алыннганды, ахыр тюрлениулени кёргюзмезге боллукъду. Кэшде максимум {{PLURAL:$1|джазыу}} сакъланады.',
Функция: $1<br />
Соруу: $2',
'viewsource' => 'Къарау',
+'viewsource-title' => '$1 бетни чыкъгъан текстине къарау',
'actionthrottled' => 'Терклик чекленнгенди',
'actionthrottledtext' => 'Спамгъа къаршчы кюрешиуню себебинден, аз заманны ичинде бу амал бла кёб кере хайырланыу тыйылыбды. Кечирек джангыдан кёрюгюз.',
'protectedpagetext' => 'Бу бет тюрлендириуге джабылыбды.',
'emailconfirmlink' => 'Электрон почта адресигизни бегитигиз.',
'invalidemailaddress' => 'Электрон почта адресигизи къабыл этилинирге болмайды, форматха келишмегени ючюн.
Тюз адрес джазыгъыз неда тизгинни бош къоюгъуз.',
+'emaildisabled' => 'Бу сайт, электрон потча бла билдириуле иймейди.',
'accountcreated' => 'Тергеу джазыу (аккаунт) къуралды',
'accountcreatedtext' => '$1 къошулуучугъа тергеу джазыу (аккаунт) къуралды.',
'createaccount-title' => '{{SITENAME}}: тергеу джазыу (аккаунт) къурау',
'resetpass-temp-password' => 'Болджаллы пароль:',
# Special:PasswordReset
+'passwordreset' => 'Паролну атыу',
+'passwordreset-text' => 'Электрон джазма бла тергеу джазыуугъузну (аккаунтугъузну) параметрлерини юсюнден билдириу алыр ючюн бу форманы толтуругъуз.',
+'passwordreset-legend' => 'Паролну ий',
+'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
+'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
'passwordreset-username' => 'Къошулуучуну аты:',
'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Джазылгъан билдириуню эсебине къара?',
+'passwordreset-capture-help' => 'Бу белгини салсагъыз, къошулуучугъа ийилген болджаллы пароль бла билдириу сизге кёргюзюллюкдю.',
+'passwordreset-email' => 'Электрон почтаны адреси:',
# Special:ChangeEmail
'changeemail-no-info' => 'Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.',
'userinvalidcssjstitle' => "'''Эс бёлюгюз:''' «$1» атлы тема джокъду. Эсде тутугъуз, .css эм .js бетле атлары ажымсыз къуру гитче харифледен болургъа керекди, сёз ючюн: {{ns:user}}:Foo/vector.css, былай {{ns:user}}:Foo/Vector.css тюйюл!",
'updated' => '(Джангыртылды)',
'note' => "'''Белги:'''",
-'previewnote' => "'''Бу къуру ал къарауду, текст алкъын сакъланмагъанды!'''",
+'previewnote' => "'''Бу къуру ал къарауду.'''
+Сиз этген тюрлениуле алкъын сакъланмагъандыла!",
'previewconflict' => 'Бу ал къарау, башындагъы тюрлендириу терезеде текстни сакъланнганча кёргюзеди.',
'session_fail_preview' => "'''Джарсыугъа, сессияны идентификаторуну тас этгени себебли, сервер сизни тюрлендириуюгюзни сакълаталмагъанды.
Энтдада кёрюгюз.
Себеби: браузеригиз редактор терезеде пунктуация белгилени терс кёргюзеди, аны ючюн статьяны тексти бузулургъа боллукъду.
Бу халатлары болгъан аноним веб-проксилени хайырландырылгъанлары ючюн болургъа боллукъду'''",
'editing' => '«$1» бетни тюрлендириу',
+'creating' => '«$1» бетни къурау',
'editingsection' => '«$1» бетде бёлюмню тюрлендириу',
'editingcomment' => '«$1» бетни тюрлендириу (джангы бёлюм)',
'editconflict' => 'Тюрлендириу конфликт: $1',
Башхала сизни текстлеригизни тюрлендиргенлерин излемей эсегиз, былайгъа салмагъыз.<br />
Сиз дагъыда этген къошакъларыгъызны автору болгъаныгъызны неда информацияны чыкъгъан джери эркин джаяргъа эм тюрлендирирге къойгъанын аны бегитесиз (къарагъыз: $1).
'''ЭРКИНЛИКСИЗ АВТОР ХАКЪ БЛА ДЖАКЪЛАННГАН МАТЕРИАЛЛА САЛМАГЪЫЗ БЫЛАЙГЪА!'''",
-'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни {{PLURAL:$1|$1 килобайт|$1 килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|$2 килобайт|$2 килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
+'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни {{PLURAL:$1|бир килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|бир килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
'readonlywarning' => "'''Эс бёлюгюз: Билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда сакълаб, кечирек къошаргъа боллукъсуз'''
Киритлеген администратор бу билдириуню къойгъанды: $1",
Темасы аннга ушагъан бетлени табар ючюн [[Special:Search|викиде излеб]] кёрюгюз.',
# Revision deletion
-'rev-deleted-comment' => '(комментарий кетерилгенди)',
+'rev-deleted-comment' => '(тюрлендириуню суратлауу кетерилгенди)',
'rev-deleted-user' => '(къошулуучуну аты кетерилгенди)',
'rev-deleted-event' => '(джазыу кетерилгенди)',
'rev-deleted-user-contribs' => '[къошулуучуну аты неда IP-адреси кетерилгенди — тюрлендириу къошакъны бетинде кёргюзюлмейди]',
'listusers-editsonly' => 'Къуру тюрлендириу этген къошлуучуланы кёргюз',
'listusers-creationsort' => 'Къуралгъан заманына кёре сафла',
'usereditcount' => '$1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
-'usercreated' => 'Къуралгъанды: $1 $2',
+'usercreated' => '$1 $2 заманда {{GENDER:$3|регистрацияны ётгенди}}',
'newpages' => 'Джангы бетле',
'newpages-username' => 'Къошулуучуну аты:',
'ancientpages' => 'Ахыр тюрлендириуге кёре эм эски болгъан статьяла',
'booksources-invalid-isbn' => 'Берилген ISBN джараусуз кибик кёрюнеди; оригинал къайнакъдан кёчюрюлген заманда халатланы контроль этигиз.',
# Special:Log
-'specialloguserlabel' => 'Ð\9aÑ\8aоÑ\88Ñ\83луучу:',
-'speciallogtitlelabel' => 'Ð\91аÑ\88лÑ\8bкÑ\8a:',
+'specialloguserlabel' => 'ТолÑ\82Ñ\83Ñ\80уучу:',
+'speciallogtitlelabel' => 'ЫÑ\88ан (баÑ\88лÑ\8bкÑ\8a неда кÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83):',
'log' => 'Журналла',
'all-logs-page' => 'Бютеу ачыкъ журналла',
'alllogstext' => '{{SITENAME}} ючюн бютеу бар болгъан журналланы бирлешген списогу.
'sp-deletedcontributions-contribs' => 'къошхан юлюш',
# Special:LinkSearch
-'linksearch' => 'Тыш джибериуле',
+'linksearch' => 'Тыш джибериулени излеу',
'linksearch-pat' => 'Излеуге шаблон:',
'linksearch-ns' => 'Ат алам:',
'linksearch-ok' => 'Таб',
-'linksearch-text' => '<code>*.wikipedia.org</code> кибик джокерле хайырландырыргъа боллукъду.<br />
-Дагъан болгъан протоколла: <tt>$1</tt>',
+'linksearch-text' => '<code>*.wikipedia.org</code> кибик символлла хайырландырыргъа боллукъдула.
+Эм азы бла огъары дараджаны домени керекди, юлгюге: <code>*.org</code><br />
+Дагъан болгъан протоколла: <tt>$1</tt> (быладан къайсысында излеуюгюзге къошмагъыз)',
'linksearch-line' => '$1-ге $2-ден джибериу берилгенди',
'linksearch-error' => 'Джокерле къуру адреслени аллында хайырланыргъа боллукъдула.',
'emailpagetext' => 'Бу къошулуучуну почтасына письмо джиберир ючюн бу форманы толтурургъа боллукъсуз.
Ызына адрес болуб, сиз [[Special:Preferences|джарашдырыуларыгъызда]] джазгъан адрес белгиленникди, ол себебден сизни письмогъузну аллыкъ сизге тюз джууаб берирге мадарлы боллукъду.',
'usermailererror' => 'Халат ючюн элетктрон письмо ызына къайтды:',
-'defemailsubject' => '{{SITENAME}} письмо',
+'defemailsubject' => '{{SITENAME}} — $1 къошулуучудан билдириу',
'usermaildisabled' => 'Къошулуучуну электрон почтасы джукъланыбды',
'usermaildisabledtext' => 'Сиз бу викини башха къошулуучуларына электрон письмола джиберелмейсиз',
'noemailtitle' => 'Электрон почтаны адреси джокъду',
'noemailtext' => 'Бу къошулуучу керти электрон адресин бермегенди.',
'nowikiemailtitle' => 'Электрон письмо джиберирге эркинлик джокъду',
'nowikiemailtext' => 'Бу къошулуучу, башха къошулуучуладан электрон писмо алыргъа излемегенин билдиргенди.',
+'emailtarget' => 'Аллыкъ къошулуучуну атын джазыгъыз',
+'emailusername' => 'Къошулуучуну аты:',
+'emailusernamesubmit' => 'Джибер',
'email-legend' => 'Башха {{SITENAME}} къошулуучугъа электрон письмо джибер',
'emailfrom' => 'Кимден:',
'emailto' => 'Кимге:',
'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни статьяланы кёрюр неда тюрлендирир ючюн $1.',
'watchnologin' => 'Системагъа кирирге керекди.',
'watchnologintext' => 'Кёзюгюзде тургъан тизмегизни тюрлендирир ючюн [[Special:UserLogin|системагъа кирирге керексиз]].',
+'addwatch' => 'Кёзде тургъан тизмеге къош',
'addedwatchtext' => '«[[:$1]]» бет [[Special:Watchlist|кёзюгюзде тургъан тизмегизге]] къошулду.
Бу бетни эмда муну бла байламлы сюзюу бетни тюрлениулери ол тизмеде белгиленникдиле, [[Special:RecentChanges|джангы тюрлениулени тизмесини]] бетинде уа къалын шрифт бла чертилинникдиле, кёрюрге тынчыракъ болурча.',
+'removewatch' => 'Кёзде тургъан тизмеден кетер',
'removedwatchtext' => '«[[:$1]]» бет сизни [[Special:Watchlist|кёзюгюзде тургъан тизмегизден]] кетерилгенди.',
'watch' => 'Кёзде тут',
'watchthispage' => 'Бу бетни кёзде тут',
'unblocked-id' => '$1 тыйылыу къоратылгъанды',
'ipblocklist' => 'Блок этилиннген IP-адресле эм къошулуучуланы атлары',
'ipblocklist-legend' => 'Тыйылгъан къошулуучуну аты',
+'blocklist-expiry' => 'Бошалыу датасы',
'blocklist-reason' => 'Чурум',
'ipblocklist-submit' => 'Таб',
'ipblocklist-localblock' => 'Локал блокга салыу',
'tooltip-pt-mytalk' => 'Сизни сюзюу бетигиз',
'tooltip-pt-anontalk' => 'Бу IP-адресден этилген тюрлендириулени сюзюу бет',
'tooltip-pt-preferences' => 'Джарашдырыуларыгъыз',
-'tooltip-pt-watchlist' => 'Ð\9cен кÑ\91зÑ\8eмде тутхан бетлени тизмеси',
-'tooltip-pt-mycontris' => 'Сизни Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83леÑ\80игизни Ñ\81пиÑ\81огÑ\83',
+'tooltip-pt-watchlist' => 'Сиз кÑ\91зÑ\8eгÑ\8eзде тутхан бетлени тизмеси',
+'tooltip-pt-mycontris' => 'Сизни Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83леÑ\80игизни Ñ\82измеÑ\81и',
'tooltip-pt-login' => 'Былайда системада регистрация этерге боллукъду, алай а ол ажымсыз керекли тюйюлдю',
'tooltip-pt-anonlogin' => 'Былайда сисетмагъа регистрация этерге боллукъду, алай а бу зорунлу тюлдю.',
'tooltip-pt-logout' => 'Чыгъыу',
'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-content-unhid' => 'ичиндегиси кёргюзюлдю',
'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-filename-tooshort' => 'Файлны аты асыры къысхады.',
'api-error-filetype-banned' => 'Быллай типли файлла джасакъланыбдыла.',
+'api-error-filetype-missing' => 'Файлны кенгериую джокъду.',
'api-error-hookaborted' => 'Сиз теджеген тюрлендириуню кенгертиуню сюзюучю джасакълагъанды.',
'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' => 'Бу викиде файлла джюклеу амал джукъланыбды',
'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' => 'ഈ തിരുത്തൽ താങ്കൾക്ക് തിരസ്ക്കരിക്കാവുന്നതാണ്. താഴെ കൊടുത്തിരിക്കുന്ന പതിപ്പുകൾ തമ്മിലുള്ള താരതമ്യം ഒന്നുകൂടി പരിശോധിച്ച് ഈ പ്രവൃത്തി ചെയ്യണോ എന്ന് ഒന്നുകൂടി ഉറപ്പാക്കുക. ഉറപ്പാണെങ്കിൽ തിരുത്തൽ തിരസ്ക്കരിക്കുവാൻ താൾ സേവ് ചെയ്യുക.',
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} percurar ls registros que téngan a ber],
ó [{{fullurl:{{FULLPAGENAME}}|action=edit}} eiditar esta páigina]</span>.',
'note' => "'''Abiso:'''",
-'previewnote' => "'''Esto ye solo ua amostra; las altaraçones inda nun fúrun grabadas!'''",
+'previewnote' => "'''Lhembra-te qu'esto ye solo ua amostra.'''
+Las altaraçones inda nun fúrun grabadas!",
'editing' => 'A eiditar $1',
'editingsection' => 'A eiditar $1 (cacho)',
'yourtext' => 'L tou testo',
'tog-underline' => 'Liân-kiat oē té-sûn:',
'tog-justify' => 'pâi-chê tōaⁿ-lo̍h',
'tog-hideminor' => 'Am chòe-kīn ê sió kái-piàn',
-'tog-hidepatrolled' => 'Am chòe-kīn sûn koè--ê kái-piàn',
+'tog-hidepatrolled' => '最近改的,若巡過就掩掉',
'tog-newpageshidepatrolled' => 'Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê',
'tog-extendwatchlist' => 'Tián-khui kàm-sī-toaⁿ khoàⁿ só͘-ū ê kái-piàn, m̄-chí sī choè-kīn--ê',
'tog-usenewrc' => 'Ēng ka-kiông pán khoàⁿ chòe-kīn ê kái-piàn (su-iàu JavaScript)',
'article' => 'Loē-iông ia̍h',
'newwindow' => '(ē khui sin thang-á hián-sī)',
'cancel' => 'Chhú-siau',
-'moredotdotdot' => 'Iáu-ū',
+'moredotdotdot' => '猶有',
'mypage' => 'Góa ê ia̍h',
'mytalk' => 'Góa ê thó-lūn',
'anontalk' => 'Chit ê IP ê thó-lūn-ia̍h',
Nā m̄-sī hit chióng chêng-hêng, lí khó-lêng tú tio̍h nńg-thé ê chhò-ngō͘. Chhiáⁿ pò hō͘ chi̍t ūi [[Special:ListUsers/sysop|koán-lí-goân]], ūi liân-kiat hiâ khì lâu thong-ti .',
'missingarticle-rev' => '(修訂本#: $1)',
'missingarticle-diff' => '(精差:$1, $2)',
-'readonly_lag' => '資料庫已經自動鎖牢咧,從屬資料庫伺服器當咧更新綴到主伺服器',
+'readonly_lag' => '佇附屬資料庫伺服器對主伺服器來更新的時陣,資料庫就已經自動鎖牢咧。',
'internalerror' => 'Loē-pō͘ ê chhò-ngō͘',
'internalerror_info' => 'Loē-pō͘ ê chhò-ngō͘: $1',
'fileappenderrorread' => 'Ka-ji̍p(append) ê sî bô-hoat-tō͘ thak "$1".',
'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 !",
+'continue-editing' => '繼續編輯',
'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見資料,阮無法度處理你的編輯。'''
'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische verwijzing)',
'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-showjumplinks' => '“ga naar”-toegankelijkheidsverwijzingen inschakelen',
-'tog-uselivepreview' => '“live voorvertoning” gebruiken (vereist JavaScript – experimenteel)',
+'tog-showjumplinks' => '"ga naar"-toegankelijkheidsverwijzingen inschakelen',
+'tog-uselivepreview' => '"live voorvertoning" gebruiken (vereist JavaScript – experimenteel)',
'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
'tog-watchlisthidebots' => 'Botbewerkingen op mijn volglijst verbergen',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
-'category_header' => 'Pagina’s in categorie “$1”',
+'category_header' => 'Pagina’s in categorie "$1"',
'subcategories' => 'Ondercategorieën',
-'category-media-header' => 'Media in categorie “$1”',
+'category-media-header' => 'Media in categorie "$1"',
'category-empty' => "''Deze categorie bevat geen pagina’s of media.''",
'hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}}',
'hidden-category-category' => 'Verborgen categorieën',
'feed-unavailable' => 'Syndicatiefeeds zijn niet beschikbaar',
'site-rss-feed' => '$1 RSS-feed',
'site-atom-feed' => '$1 Atom-feed',
-'page-rss-feed' => '“$1” RSS-feed',
-'page-atom-feed' => '“$1” Atom-feed',
+'page-rss-feed' => '"$1" RSS-feed',
+'page-atom-feed' => '"$1" Atom-feed',
'red-link-title' => '$1 (de pagina bestaat niet)',
'sort-descending' => 'Aflopend sorteren',
'sort-ascending' => 'Oplopend sorteren',
Mogelijk zit er een fout in de software.
Het laatste verzoek aan de database was:
<blockquote><tt>$1</tt></blockquote>
-vanuit de functie “<tt>$2</tt>”.
-De database gaf de volgende foutmelding “<tt>$3: $4</tt>”.',
+vanuit de functie "<tt>$2</tt>".
+De database gaf de volgende foutmelding "<tt>$3: $4</tt>".',
'dberrortextcl' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
Het laatste verzoek aan de database was:
-“$1”
-vanuit de functie “$2”.
-De database gaf de volgende foutmelding: “$3: $4”',
+"$1"
+vanuit de functie "$2".
+De database gaf de volgende foutmelding: "$3: $4"',
'laggedslavemode' => "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
'readonly' => 'Database geblokkeerd',
'enterlockreason' => 'Geef een reden op voor de blokkade en geef op wanneer die waarschijnlijk wordt opgeheven',
'filecopyerror' => 'Bestand "$1" kon niet naar "$2" gekopieerd worden.',
'filerenameerror' => '"$1" kon niet hernoemd worden naar "$2".',
'filedeleteerror' => 'Bestand "$1" kon niet verwijderd worden.',
-'directorycreateerror' => 'Map “$1” kon niet aangemaakt worden.',
+'directorycreateerror' => 'De map "$1" kon niet aangemaakt worden.',
'filenotfound' => 'Bestand "$1" kon niet gevonden worden.',
'fileexistserror' => 'Schrijven naar bestand "$1" onmogelijk: het bestand bestaat al.',
'unexpected' => 'Onverwachte waarde: "$1"="$2".',
'filetype-banned' => 'Het bestand dat u probeerde te uploaden was van een niet toegelaten bestandstype.',
'verification-error' => 'De verificatie van het bestand dat u probeerde te uploaden is mislukt.',
'hookaborted' => 'De wijziging die u probeerde te maken is afgebroken door een uitbreidingshook.',
-'illegal-filename' => 'Deze bestandsnaam is niet toegelaten.',
+'illegal-filename' => 'Deze bestandsnaam is niet toegestaan.',
'overwrite' => 'Het overschrijven van een bestand bestand is niet toegestaan.',
'unknown-error' => 'Er is een onbekende fout opgetreden.',
'tmp-create-error' => 'Het was niet mogelijk een tijdelijk bestand aan te maken.',
'livepreview-ready' => 'Bezig met laden… Klaar!',
'livepreview-failed' => 'Live voorvertoning mislukt!
Probeer de normale voorvertoning.',
-'livepreview-error' => 'Verbinden mislukt: $1 “$2”.
-Probeer normale voorvertoning.',
+'livepreview-error' => 'Verbinden mislukt: $1 "$2".
+Probeer normale voorvertoning te gebruiken.',
# Friendlier slave lag warnings
'lag-warn-normal' => 'Wijzigingen in de afgelopen {{PLURAL:$1|seconde|$1 seconden}} worden misschien niet weergegeven in deze lijst.',
'note' => "'''Merk:'''",
'previewnote' => "'''Hugsa at dette berre er ei førehandsvising.'''
Endringane dine er ikkje lagra enno!",
+'continue-editing' => 'Endra vidare',
'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.'''
# Special:AllPages
'allpages' => 'Alle sider',
'alphaindexline' => '$1 til $2',
-'nextpage' => 'Neste side ($1)',
-'prevpage' => 'Førre side ($1)',
+'nextpage' => 'Neste sida ($1)',
+'prevpage' => 'Førre sida ($1)',
'allpagesfrom' => 'Vis sider frå:',
'allpagesto' => 'Vis sider til og med:',
'allarticles' => 'Alle sider',
'confirm-unwatch-top' => 'Fjern denne sida frå overvakingslista di?',
# Multipage image navigation
-'imgmultipageprev' => '← førre side',
-'imgmultipagenext' => 'neste side →',
+'imgmultipageprev' => '← førre sida',
+'imgmultipagenext' => 'neste sida →',
'imgmultigo' => 'Gå!',
'imgmultigoto' => 'Gå til sida $1',
# Table pager
'ascending_abbrev' => 'stigande',
'descending_abbrev' => 'synkande',
-'table_pager_next' => 'Neste side',
-'table_pager_prev' => 'Førre side',
+'table_pager_next' => 'Neste sida',
+'table_pager_prev' => 'Førre sida',
'table_pager_first' => 'Fyrste side',
'table_pager_last' => 'Siste side',
'table_pager_limit' => 'Vis $1 element per side',
'newmessageslink' => 'ନୂଆ ମେସେଜ',
'newmessagesdifflink' => 'ଶେଷ ବଦଳ',
'youhavenewmessagesmulti' => '$1 ତାରିଖରେ ନୂଆ ଚିଠିଟିଏ ଆସିଛି',
-'editsection' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
-'editold' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editsection' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
+'editold' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
'viewsourceold' => 'ମୂଳାଧାର ଦେଖିବେ',
-'editlink' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editlink' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
'toc' => 'ଭିତର ଚିଜ',
'brokenredirects' => 'ଭଙ୍ଗା ପୁନପ୍ରେରଣ',
'brokenredirectstext' => 'ତଳଲିଖିତ ପୁନପ୍ରେରଣ ସବୁ ସ୍ଥିତିହିନ ପୃଷ୍ଠାମାନଙ୍କୁ ପୁନପ୍ରେରିତ ହୋଇଥାଏ :',
-'brokenredirects-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'brokenredirects-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
'brokenredirects-delete' => 'ଲିଭାଇବେ',
'withoutinterwiki' => 'ଭାଷାର ଲିଙ୍କ ନଥିବା ପୃଷ୍ଠାମାନ',
'pagesize' => '(ବାଇଟ)',
# Restrictions (nouns)
-'restriction-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'restriction-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
'restriction-move' => 'ଘୁଞ୍ଚାଇବେ',
'restriction-create' => 'ଗଢ଼ନ୍ତୁ',
'restriction-upload' => 'ଅପଲୋଡ଼ କରନ୍ତୁ',
'tags-display-header' => 'ବଦଳ ତାଲିକାରେ ଦେଖଣା',
'tags-description-header' => 'ଅର୍ଥର ପୁରା ବିବରଣୀ',
'tags-hitcount-header' => 'ଚିହ୍ନିତ ବଦଳ',
-'tags-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'tags-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
'tags-hitcount' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}',
# Special:ComparePages
# Watchlist
'watchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
'mywatchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
+'watchlistfor2' => '$1 $2 ਲਈ',
'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
'watch' => 'ਵਾਚ',
'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
*
* @author Als-Holder
* @author M-sch
+ * @author Manuae
* @author SPS
* @author Xqt
*/
# User preference toggles
'tog-showtoolbar' => "Werkzaich zum Bearwaide zaische (dodezu braucht's JavaScript)",
-'underline-always' => 'Immer',
-'underline-never' => 'Garnet',
+'underline-always' => 'Immer',
+'underline-never' => 'Garnet',
'underline-default' => 'Des nemme, was em Broweser gsaacht hoscht.',
# Dates
-'january' => 'Jänner',
-'february' => 'Fewwer',
-'march' => 'März',
-'april' => 'Abril',
-'may_long' => 'Mai',
-'june' => 'Juni',
-'july' => 'Juli',
-'august' => 'Auguscht',
-'september' => 'Sebdember',
-'october' => 'Ogdower',
-'november' => 'November',
-'december' => 'Dezember',
-'january-gen' => 'Jänner',
-'february-gen' => 'Fewwer',
-'march-gen' => 'März',
-'april-gen' => 'Abril',
-'may-gen' => 'Mai',
-'june-gen' => 'Juni',
-'july-gen' => 'Juli',
-'august-gen' => 'Auguscht',
+'january' => 'Jänner',
+'february' => 'Fewwer',
+'march' => 'März',
+'april' => 'Abril',
+'may_long' => 'Mai',
+'june' => 'Juni',
+'july' => 'Juli',
+'august' => 'Auguscht',
+'september' => 'Sebdember',
+'october' => 'Ogdower',
+'november' => 'November',
+'december' => 'Dezember',
+'january-gen' => 'Jänner',
+'february-gen' => 'Fewwer',
+'march-gen' => 'März',
+'april-gen' => 'Abril',
+'may-gen' => 'Mai',
+'june-gen' => 'Juni',
+'july-gen' => 'Juli',
+'august-gen' => 'Auguscht',
'september-gen' => 'Sebdember',
-'october-gen' => 'Ogdower',
-'november-gen' => 'November',
-'december-gen' => 'Dezember',
-'jan' => 'Jän',
-'feb' => 'Few',
-'mar' => 'Mär',
-'apr' => 'Abr',
-'may' => 'Mai',
-'jun' => 'Jun',
-'jul' => 'Jul',
-'aug' => 'Aug',
-'sep' => 'Seb',
-'oct' => 'Ogd',
-'nov' => 'Nov',
-'dec' => 'Dez',
+'october-gen' => 'Ogdower',
+'november-gen' => 'November',
+'december-gen' => 'Dezember',
+'jan' => 'Jän',
+'feb' => 'Few',
+'mar' => 'Mär',
+'apr' => 'Abr',
+'may' => 'Mai',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Aug',
+'sep' => 'Seb',
+'oct' => 'Ogd',
+'nov' => 'Nov',
+'dec' => 'Dez',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kadegorie|Kadegorie}}',
-'category_header' => 'Saide in de Kadegorie „$1“',
-'subcategories' => 'Unnerkadegorie',
-'category-media-header' => 'Medie in de Kadegorie „$1“',
-'hidden-categories' => '{{PLURAL:$1|Versteckelte Kadegorie|Versteckelte Kadegorie}}',
-'category-subcat-count' => '{{PLURAL:$2|Die Kategorie hot die Unnerkategorie:|{{PLURAL:$1|Die Unnerkategori isch eni vun insgsamt $2 Unnerkategorie in derre Kategorie:|S werre $1 vun insgsamt $2 Unnerkategorie in derre Kategorie aagezeicht:}}}}',
+'pagecategories' => '{{PLURAL:$1|Kadegorie|Kadegorie}}',
+'category_header' => 'Saide in de Kadegorie „$1“',
+'subcategories' => 'Unnerkadegorie',
+'category-media-header' => 'Medie in de Kadegorie „$1“',
+'hidden-categories' => '{{PLURAL:$1|Versteckelte Kadegorie|Versteckelte Kadegorie}}',
+'category-subcat-count' => '{{PLURAL:$2|Die Kategorie hot die Unnerkategorie:|{{PLURAL:$1|Die Unnerkategori isch eni vun insgsamt $2 Unnerkategorie in derre Kategorie:|S werre $1 vun insgsamt $2 Unnerkategorie in derre Kategorie aagezeicht:}}}}',
'category-article-count' => "{{PLURAL:$2|In derre Kadegorie hot's numme die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gebbt's in derre Kadegorie, vun insgsamt $2.}}",
'listingcontinuesabbrev' => '(Forts.)',
-'about' => 'Iwwer',
-'newwindow' => '(werd im e naie Fenschter uffgmacht)',
-'cancel' => 'Abbreche',
-'mytalk' => 'Gebabbel mit dir',
+'about' => 'Iwwer',
+'newwindow' => '(werd im e naie Fenschter uffgmacht)',
+'cancel' => 'Abbreche',
+'mytalk' => 'Gebabbel mit dir',
'navigation' => 'Navigation',
# Cologne Blue skin
-'qbfind' => 'Finne',
-'qbedit' => 'Bearwaide',
+'qbfind' => 'Finne',
+'qbedit' => 'Bearwaide',
'qbmyoptions' => 'Mai Saide',
# Vector skin
'vector-action-move' => 'Verschiewe',
-'vector-view-edit' => 'Bearwaide',
-
-'errorpagetitle' => 'Fehler',
-'returnto' => 'Zrick zu $1.',
-'tagline' => 'Vun {{SITENAME}}',
-'help' => 'Hilfe',
-'search' => 'Suche',
-'searchbutton' => 'Suche',
-'go' => 'Adiggel',
-'searcharticle' => 'Suche',
-'history' => 'Gschicht vun de Said',
-'history_short' => 'Versione',
+'vector-view-edit' => 'Bearwaide',
+
+'errorpagetitle' => 'Fehler',
+'returnto' => 'Zrick zu $1.',
+'tagline' => 'Vun {{SITENAME}}',
+'help' => 'Hilfe',
+'search' => 'Suche',
+'searchbutton' => 'Suche',
+'go' => 'Adiggel',
+'searcharticle' => 'Suche',
+'history' => 'Gschicht vun de Said',
+'history_short' => 'Versione',
'printableversion' => 'Druck-Aasicht',
-'permalink' => 'Permanentlink',
-'print' => 'Ausdrugge',
-'edit' => 'Bearwaide',
-'create' => 'Aaleche',
-'editthispage' => 'Die Said bearwaide',
-'delete' => 'Lesche',
-'undelete_short' => '{{PLURAL:$1|ä Ännerung|$1 Ännerunge}} widderherschdelle',
-'protect' => 'schitze',
-'protect_change' => 'ännere',
-'unprotect' => 'Widder freigewwe',
-'newpage' => 'Naie Said',
-'talkpage' => 'Iwwer die Said dischbediere',
+'permalink' => 'Permanentlink',
+'print' => 'Ausdrugge',
+'edit' => 'Bearwaide',
+'create' => 'Aaleche',
+'editthispage' => 'Die Said bearwaide',
+'delete' => 'Lesche',
+'undelete_short' => '{{PLURAL:$1|ä Ännerung|$1 Ännerunge}} widderherschdelle',
+'protect' => 'schitze',
+'protect_change' => 'ännere',
+'unprotect' => 'Widder freigewwe',
+'newpage' => 'Naie Said',
+'talkpage' => 'Iwwer die Said dischbediere',
'talkpagelinktext' => 'Dischbediere',
-'personaltools' => 'Perseenliche Werkzeische',
-'talk' => 'Dischbediere',
-'views' => 'Wievielmol aageguckt',
-'toolbox' => 'Werkzaich',
-'otherlanguages' => 'In annere Sproche',
-'redirectedfrom' => '(Wairrerglaidet vun $1)',
-'redirectpagesub' => 'Wairerlaidungssaid',
-'lastmodifiedat' => 'Die Said isch zum ledschde Mol gänneret woore am $1, am $2.',
-'viewcount' => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
-'jumpto' => 'Spring zu:',
+'personaltools' => 'Perseenliche Werkzeische',
+'talk' => 'Dischbediere',
+'views' => 'Wievielmol aageguckt',
+'toolbox' => 'Werkzaich',
+'otherlanguages' => 'In annere Sproche',
+'redirectedfrom' => '(Wairrerglaidet vun $1)',
+'redirectpagesub' => 'Wairerlaidungssaid',
+'lastmodifiedat' => 'Die Said isch zum ledschde Mol gänneret woore am $1, am $2.',
+'viewcount' => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
+'jumpto' => 'Spring zu:',
'jumptonavigation' => 'Navigation',
-'jumptosearch' => 'Suche',
+'jumptosearch' => 'Suche',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Iwwer {{SITENAME}}',
-'aboutpage' => 'Project:Iwwer',
-'copyright' => 'Was do drin schdeht isch unner $1 verfiechbar.',
-'copyrightpage' => '{{ns:project}}:Urhewerrecht',
-'currentevents' => 'Was grad so bassiert isch',
-'disclaimers' => 'Hafdungsausschluß',
-'disclaimerpage' => 'Project:Impressum',
-'edithelp' => 'Hilf fer s Bearwaide',
-'edithelppage' => 'Help:Ännere',
-'helppage' => 'Help:Inhalt',
-'mainpage' => 'Hääptsaid',
+'aboutsite' => 'Iwwer {{SITENAME}}',
+'aboutpage' => 'Project:Iwwer',
+'copyright' => 'Was do drin schdeht isch unner $1 verfiechbar.',
+'copyrightpage' => '{{ns:project}}:Urhewerrecht',
+'currentevents' => 'Was grad so bassiert isch',
+'disclaimers' => 'Hafdungsausschluß',
+'disclaimerpage' => 'Project:Impressum',
+'edithelp' => 'Hilf fer s Bearwaide',
+'edithelppage' => 'Help:Ännere',
+'helppage' => 'Help:Inhalt',
+'mainpage' => 'Hääptsaid',
'mainpage-description' => 'Startseid',
-'portal' => '{{SITENAME}}-Pordal',
-'privacy' => 'Dadeschutz',
-'privacypage' => 'Project:Daadeschutz',
+'portal' => '{{SITENAME}}-Pordal',
+'privacy' => 'Dadeschutz',
+'privacypage' => 'Project:Daadeschutz',
'badaccess' => 'Kää ausraichende Recht',
-'retrievedfrom' => 'Vun "$1"',
-'youhavenewmessages' => 'Du hoscht $1 ($2).',
-'newmessageslink' => 'naie Nochrichte',
+'retrievedfrom' => 'Vun "$1"',
+'youhavenewmessages' => 'Du hoscht $1 ($2).',
+'newmessageslink' => 'naie Nochrichte',
'newmessagesdifflink' => 'letschte Ännerung',
-'editsection' => 'bearwaide',
-'editold' => 'bearwaide',
-'editlink' => 'bearwaide',
-'viewsourcelink' => 'Quell aagucke',
-'editsectionhint' => 'Abschnitt ännere: $1',
-'toc' => 'Inhald',
-'showtoc' => 'zaiche',
-'hidetoc' => 'versteggeln',
-'site-rss-feed' => '$1 RSS Feed',
-'site-atom-feed' => '$1 Atom Feed',
-'page-rss-feed' => '"$1" RSS Feed',
-'page-atom-feed' => '"$1" Atom Feed',
-'red-link-title' => '$1 (Said gebbt s nid)',
+'editsection' => 'bearwaide',
+'editold' => 'bearwaide',
+'editlink' => 'bearwaide',
+'viewsourcelink' => 'Quell aagucke',
+'editsectionhint' => 'Abschnitt ännere: $1',
+'toc' => 'Inhald',
+'showtoc' => 'zaiche',
+'hidetoc' => 'versteggeln',
+'site-rss-feed' => '$1 RSS Feed',
+'site-atom-feed' => '$1 Atom Feed',
+'page-rss-feed' => '"$1" RSS Feed',
+'page-atom-feed' => '"$1" Atom Feed',
+'red-link-title' => '$1 (Said gebbt s nid)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Said',
-'nstab-user' => 'Benutzersaid',
-'nstab-media' => 'Media',
-'nstab-special' => 'Spezialsaid',
-'nstab-project' => 'Pordal',
-'nstab-image' => 'Datei',
+'nstab-main' => 'Said',
+'nstab-user' => 'Benutzersaid',
+'nstab-media' => 'Media',
+'nstab-special' => 'Spezialsaid',
+'nstab-project' => 'Pordal',
+'nstab-image' => 'Datei',
'nstab-mediawiki' => 'Mitdeelung',
-'nstab-template' => 'Vorlaach',
-'nstab-help' => 'Hilfe',
-'nstab-category' => 'Kadegorie',
+'nstab-template' => 'Vorlaach',
+'nstab-help' => 'Hilfe',
+'nstab-category' => 'Kadegorie',
# General errors
-'missing-article' => 'De Text fer „$1“ $2 isch in de Datebank nit gfunne worre.
+'missing-article' => 'De Text fer „$1“ $2 isch in de Datebank nit gfunne worre.
Normalerwais hääßt des, dass die Said glescht woore isch.
Wenn s des nit isch, hoscht villaicht en Fehler in de Datebank gfunne.
Bitte meld des an e [[Special:ListUsers/sysop|Adminischtrator]], un gebb d URL dezu aa.',
'missingarticle-rev' => '(Versionsnummer#: $1)',
-'badtitletext' => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
+'badtitletext' => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
S kann sai, dass es ää odder meh Zaiche drin hot, wu im Titel vun de Said nid gebraucht werre därfe.',
-'viewsource' => 'Quelltekschd betrachde',
+'viewsource' => 'Quelltekschd betrachde',
# Login and logout pages
-'yourname' => 'Benutzername:',
-'yourpassword' => 'Passwort:',
-'remembermypassword' => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
-'login' => 'Omelde',
+'yourname' => 'Benutzername:',
+'yourpassword' => 'Passwort:',
+'remembermypassword' => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
+'login' => 'Omelde',
'nav-login-createaccount' => 'Aamelde / Benutzerkonto aaleche',
-'userlogin' => 'Omelde / Benutzerkonto anleche',
-'logout' => 'Abmelde',
-'userlogout' => 'Abmelde',
-'nologinlink' => 'E Benutzerkonto aaleche',
-'mailmypassword' => 'Nais Passwort per E-Mail schicke',
+'userlogin' => 'Omelde / Benutzerkonto anleche',
+'logout' => 'Abmelde',
+'userlogout' => 'Abmelde',
+'nologinlink' => 'E Benutzerkonto aaleche',
+'mailmypassword' => 'Nais Passwort per E-Mail schicke',
# Edit page toolbar
-'bold_sample' => 'Fette Schrift',
-'bold_tip' => 'Fette Schrift',
-'italic_sample' => 'Kursive Schrift',
-'italic_tip' => 'Kursive Schrift',
-'link_sample' => 'Stichwort',
-'link_tip' => 'Interner Link',
-'extlink_sample' => 'http://www.example.com Linktext',
-'extlink_tip' => 'Externer Link (uff http:// Acht gewwe)',
+'bold_sample' => 'Fette Schrift',
+'bold_tip' => 'Fette Schrift',
+'italic_sample' => 'Kursive Schrift',
+'italic_tip' => 'Kursive Schrift',
+'link_sample' => 'Stichwort',
+'link_tip' => 'Interner Link',
+'extlink_sample' => 'http://www.example.com Linktext',
+'extlink_tip' => 'Externer Link (uff http:// Acht gewwe)',
'headline_sample' => 'Abschnitts-Iwwerschrift',
-'headline_tip' => 'Iwwerschrift Ewene 2',
-'nowiki_sample' => 'Gebb do en Text ai, wu nit formatiert wird',
-'nowiki_tip' => 'Wiki-Formatierunge ignoriere',
-'image_tip' => 'Bildverwais',
-'media_tip' => 'Dateilink',
-'sig_tip' => 'Dai Unnerschrift mit ener Zaitaagab',
-'hr_tip' => 'Horizontale Linie (sparsam verwenne)',
+'headline_tip' => 'Iwwerschrift Ewene 2',
+'nowiki_sample' => 'Gebb do en Text ai, wu nit formatiert wird',
+'nowiki_tip' => 'Wiki-Formatierunge ignoriere',
+'image_tip' => 'Bildverwais',
+'media_tip' => 'Dateilink',
+'sig_tip' => 'Dai Unnerschrift mit ener Zaitaagab',
+'hr_tip' => 'Horizontale Linie (sparsam verwenne)',
# Edit pages
-'summary' => 'Zammefassung:',
-'subject' => 'Betreff:',
-'minoredit' => 'Des ischt e klänni Bearwaidung',
-'watchthis' => 'Die Said beowachde',
-'savearticle' => 'Said schbeichere',
-'preview' => 'Vorschau',
-'showpreview' => 'Vorschau zaische',
-'showlivepreview' => 'Live-Vorschau',
-'showdiff' => 'Ännerunge zaische',
-'anoneditwarning' => "'''Warnung:''' Du bischt nit aagemeldt. Dai IP-Adress werd in de Gschicht vun dem Artikel gspaichert.",
-'summary-preview' => 'Zammefassung:',
-'newarticle' => '(Nai)',
-'newarticletext' => "Du bisch eme Link nogange zu re Said, wu s no gar nit gebbt.
+'summary' => 'Zammefassung:',
+'subject' => 'Betreff:',
+'minoredit' => 'Des ischt e klänni Bearwaidung',
+'watchthis' => 'Die Said beowachde',
+'savearticle' => 'Said schbeichere',
+'preview' => 'Voaschau',
+'showpreview' => 'Vorschau zaische',
+'showlivepreview' => 'Live-Vorschau',
+'showdiff' => 'Ännerunge zaische',
+'anoneditwarning' => "'''Warnung:''' Du bischt nit aagemeldt. Dai IP-Adress werd in de Gschicht vun dem Artikel gspaichert.",
+'summary-preview' => 'Zammefassung:',
+'newarticle' => '(Nai)',
+'newarticletext' => "Du bisch eme Link nogange zu re Said, wu s no gar nit gebbt.
Zum die Said aaleche, kannscht do in dem Käschtel unne aafange mid schraiwe (guck[[{{MediaWiki:Helppage}}|Hilfe]] fer meh Informatione).
Wenn do nid hin hoscht welle, no druck in Daim Browser uff '''Zrick'''.",
-'noarticletext' => 'Uff derre Said gebbt\'s noch kää Text. Du kannscht uff annere Saide [[Special:Search/{{PAGENAME}}|den Aitrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
+'noarticletext' => 'Uff derre Said gebbt\'s noch kää Text. Du kannscht uff annere Saide [[Special:Search/{{PAGENAME}}|den Aitrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
orrer [{{fullurl:{{FULLPAGENAME}}|action=edit}} die Said bearwaide]</span>.',
-'previewnote' => "'''Denk dran, dass des numme e Vorschau isch.'''
+'previewnote' => "'''Denk dran, dass des numme e Vorschau isch.'''
Dai Ännerunge sinn no nid gspaichert worre!",
-'editing' => 'Am $1 bearwaide',
-'editingsection' => '$1 bearwaide (Abschnitt)',
-'copyrightwarning' => "Bitte gebb acht, dass alle Baidräch zu {{SITENAME}} unner $2 vereffentlicht werre (guck $1 fer mehr Details).
+'editing' => 'Am $1 bearwaide',
+'editingsection' => '$1 bearwaide (Abschnitt)',
+'yourtext' => 'Doin Tegschd',
+'yourdiff' => 'Unaschied',
+'copyrightwarning' => "Bitte gebb acht, dass alle Baidräch zu {{SITENAME}} unner $2 vereffentlicht werre (guck $1 fer mehr Details).
Wenn du nit willhsct, dass deswu du gschriwwe hoscht, gänneret un kopiert werre kann, dann duu s do nit naischraiwe.<br />
du gebbscht do au zu, dass Du des selwerscht gschriwwe hoscht orrer vun ere effentliche, fraie Quell ('''public domain''')orrer vun ere ähnliche fraie Quell her hoscht.
'''SCHRAIB DO NIX NAI, WAS URHEWERRECHTKLICH GSCHITZT ISCH!'''",
-'templatesused' => '{{PLURAL:$1|Vorlach wu uff derre Said gebraucht werd|Vorlache wu uff derre Said gebraucht werre}}:',
-'templatesusedpreview' => '{{PLURAL:$1|Vorlach wu in derre Vorschau gebraucht werd|Vorlache wu in derre Vorschau gebraucht werre}}:',
-'template-protected' => '(gschitzt)',
-'template-semiprotected' => '(halb-gschitzt)',
-'hiddencategories' => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
+'templatesused' => '{{PLURAL:$1|Vorlach wu uff derre Said gebraucht werd|Vorlache wu uff derre Said gebraucht werre}}:',
+'templatesusedpreview' => '{{PLURAL:$1|Vorlach wu in derre Vorschau gebraucht werd|Vorlache wu in derre Vorschau gebraucht werre}}:',
+'template-protected' => '(gschitzt)',
+'template-semiprotected' => '(halb-gschitzt)',
+'hiddencategories' => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
'permissionserrorstext-withaction' => 'Du därfscht nid $2, aus {{PLURAL:$1|dem Grund|denne Grind}}:',
-'moveddeleted-notice' => 'Die Said isch glescht worre.
+'moveddeleted-notice' => 'Die Said isch glescht worre.
De Leschaidrach fer die Said isch do unne aagewwe als Quell.',
# History pages
-'viewpagelogs' => 'D Lochbiecher fer die Said aagucke',
-'currentrev-asof' => 'Aktuelle Version vun $1',
-'revisionasof' => 'Version vun $1',
-'previousrevision' => '← Ältere Versione',
-'nextrevision' => 'Naier Version →',
-'currentrevisionlink' => 'Aktuell Version',
-'cur' => 'jetzert',
-'next' => 'Negschte',
-'last' => 'vorich',
-'histlegend' => "Du kannscht zwää Versione auswähle un verglaiche.<br />
+'viewpagelogs' => 'D Lochbiecher fer die Said aagucke',
+'currentrev-asof' => 'Aktuelle Version vun $1',
+'revisionasof' => 'Version vun $1',
+'previousrevision' => '← Ältere Versione',
+'nextrevision' => 'Naier Version →',
+'currentrevisionlink' => 'Aktuell Version',
+'cur' => 'jetzert',
+'next' => 'Negschte',
+'last' => 'vorich',
+'histlegend' => "Du kannscht zwää Versione auswähle un verglaiche.<br />
Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
'''({{int:last}})''' = Unnerschied zu de voriche Version, '''{{int:minoreditletter}}''' = klenni Ännerung.",
'history-fieldset-title' => 'In de Versionsgschicht suche',
-'histfirst' => 'Ältschte',
-'histlast' => 'Naischte',
+'histfirst' => 'Ältschte',
+'histlast' => 'Naischte',
# Revision deletion
-'rev-delundel' => 'zaich/versteckel',
+'rev-delundel' => 'zaich/versteckel',
+'revdelete-show-file-submit' => 'Ja',
+'revdelete-radio-set' => 'Ja',
+'revdelete-radio-unset' => 'Nä',
'revdelete-submit' => 'Uff die aussgewählt {{PLURAL:$1|Version|Versione}} owende',
-'revdel-restore' => 'Sichtbarkeit ännere',
+'revdel-restore' => 'Sichtbarkeit ännere',
# Merge log
'revertmerge' => 'Zammefiehrung rickgängich mache',
# Diffs
-'history-title' => 'Versionsgschicht vun "$1"',
-'difference' => '(Unnerschied zwische de Versione)',
-'lineno' => 'Zail $1:',
+'history-title' => 'Versionsgschicht vun "$1"',
+'difference' => '(Unnerschied zwische de Versione)',
+'lineno' => 'Zail $1:',
'compareselectedversions' => 'Die Versione mitenonner vergleiche',
-'editundo' => 'zerick',
+'editundo' => 'zerick',
# Search results
-'searchresults' => 'Ergebnis suche',
-'searchresults-title' => 'Ergebnis suche fer "$1"',
-'searchresulttext' => 'Fer mehr Informatione iwwer d Such in {{SITENAME}}, guck emol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Du hoscht no \'\'\'[[:$1]]\'\'\' gesucht ([[Special:Prefixindex/$1|alle Saide wo mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide wo uf "$1" verlinkt sin]])',
-'searchsubtitleinvalid' => "Du hoscht '''$1''' gsucht",
-'notitlematches' => 'Kää Saidetitel gfunne',
-'notextmatches' => 'Kää Iwwerainstimmunge mit Inhalde',
-'prevn' => 'voriche {{PLURAL:$1|$1}}',
-'nextn' => 'negschte {{PLURAL:$1|$1}}',
-'viewprevnext' => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
-'search-redirect' => '(Wairerlaitung $1)',
-'search-section' => '(Abschnitt $1)',
-'search-suggest' => 'Hoscht gemäänt: $1',
-'search-interwiki-caption' => 'Schweschterprojekt',
-'search-interwiki-default' => '$1 Ergebnis:',
-'search-interwiki-more' => '(meh)',
-'search-mwsuggest-enabled' => 'mid Vorschläch',
+'searchresults' => 'Ergebnis suche',
+'searchresults-title' => 'Ergebnis suche fer "$1"',
+'searchresulttext' => 'Fer mehr Informatione iwwer d Such in {{SITENAME}}, guck emol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Du hoscht no \'\'\'[[:$1]]\'\'\' gesucht ([[Special:Prefixindex/$1|alle Saide wo mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide wo uf "$1" verlinkt sin]])',
+'searchsubtitleinvalid' => "Du hoscht '''$1''' gsucht",
+'notitlematches' => 'Kää Saidetitel gfunne',
+'notextmatches' => 'Kää Iwwerainstimmunge mit Inhalde',
+'prevn' => 'voriche {{PLURAL:$1|$1}}',
+'nextn' => 'negschte {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-everything' => 'Alles',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
+'search-redirect' => '(Wairerlaitung $1)',
+'search-section' => '(Abschnitt $1)',
+'search-suggest' => 'Hoscht gemäänt: $1',
+'search-interwiki-caption' => 'Schweschterprojekt',
+'search-interwiki-default' => '$1 Ergebnis:',
+'search-interwiki-more' => '(meh)',
+'search-mwsuggest-enabled' => 'mid Vorschläch',
'search-mwsuggest-disabled' => 'kää Vorschläch',
-'nonefound' => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
-'powersearch' => 'Erwaiterte Such',
-'powersearch-legend' => 'Erwaiterte Such',
-'powersearch-ns' => 'In de Namensraim suche:',
-'powersearch-redir' => 'Wairerlaitunge aazaiche',
-'powersearch-field' => 'Suche noch',
-'powersearch-togglenone' => 'Kään',
+'nonefound' => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
+'powersearch' => 'Erwaiterte Such',
+'powersearch-legend' => 'Erwaiterte Such',
+'powersearch-ns' => 'In de Namensraim suche:',
+'powersearch-redir' => 'Wairerlaitunge aazaiche',
+'powersearch-field' => 'Suche noch',
+'powersearch-togglenone' => 'Kään',
# Quickbar
'qbsettings-none' => 'Kään',
# Preferences page
-'preferences' => 'Optione',
+'preferences' => 'Optione',
'mypreferences' => 'Mai Aistellunge',
-'saveprefs' => 'Oischdellunge schbeichere',
-'resetprefs' => 'Oischdellunge verwerfe',
+'saveprefs' => 'Oischdellunge schbeichere',
+'resetprefs' => 'Oischdellunge verwerfe',
'guesstimezone' => 'Aus em Browser iwwernemme',
+'gender-unknown' => 'Ghoim gkalde',
# Groups
-'group' => 'Grubb:',
-'group-bot' => 'Bots',
-'group-sysop' => 'Adminischdradore',
+'group' => 'Grubb:',
+'group-bot' => 'Bots',
+'group-sysop' => 'Adminischdradore',
'group-bureaucrat' => 'Birokrade',
-'group-all' => '(alle)',
+'group-all' => '(alle)',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Adminischdrador',
+'group-bot-member' => 'Bot',
+'group-sysop-member' => 'Adminischdrador',
'group-bureaucrat-member' => 'Birokrad',
'grouppage-sysop' => '{{ns:project}}:Adminischtratore',
# User rights log
-'rightslog' => 'Benutzerrecht-Logbuch',
+'rightslog' => 'Benutzerrecht-Logbuch',
'rightsnone' => '(-)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'die Said bearwaide',
# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
-'recentchanges' => 'Was zuletschd gemacht worre isch',
-'recentchanges-legend' => 'Optione vun de Aazaich',
+'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
+'recentchanges' => 'Was zuletschd gemacht worre isch',
+'recentchanges-legend' => 'Optione vun de Aazaich',
'recentchanges-feed-description' => 'Di letschte Ännerunge vun {{SITENAME}} in des Feed aigewwe.',
-'rcnote' => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
-'rclistfrom' => 'Zeich die letschte Ännerunge ab $1',
-'rcshowhideminor' => 'Klenne Ännerunge $1',
-'rcshowhidebots' => 'Bots $1',
-'rcshowhideliu' => 'Aagemeldte Benutzer $1',
-'rcshowhideanons' => 'Nit aagemeldte Benutzer $1',
-'rcshowhidemine' => 'Mai Bearwaidunge $1',
-'rclinks' => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
-'diff' => 'Unnerschied',
-'hist' => 'Gschicht',
-'hide' => 'versteggeln',
-'show' => 'zaiche',
-'minoreditletter' => 'k',
-'newpageletter' => 'N',
-'boteditletter' => 'B',
-'rc-enhanced-expand' => "Details zaische (dodezu braucht's JavaScript)",
-'rc-enhanced-hide' => 'Details versteckeln',
+'rcnote' => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
+'rclistfrom' => 'Zeich die letschte Ännerunge ab $1',
+'rcshowhideminor' => 'Klenne Ännerunge $1',
+'rcshowhidebots' => 'Bots $1',
+'rcshowhideliu' => 'Aagemeldte Benutzer $1',
+'rcshowhideanons' => 'Nit aagemeldte Benutzer $1',
+'rcshowhidemine' => 'Mai Bearwaidunge $1',
+'rclinks' => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
+'diff' => 'Unnerschied',
+'hist' => 'Gschicht',
+'hide' => 'versteggeln',
+'show' => 'zaiche',
+'minoreditletter' => 'k',
+'newpageletter' => 'N',
+'boteditletter' => 'B',
+'rc-enhanced-expand' => "Details zaische (dodezu braucht's JavaScript)",
+'rc-enhanced-hide' => 'Details versteckeln',
# Recent changes linked
-'recentchangeslinked' => 'Was on verlinkde Saide gemacht worre isch',
-'recentchangeslinked-feed' => 'Was on verlinkde Seide gemacht worre isch',
+'recentchangeslinked' => 'Was on verlinkde Saide gemacht worre isch',
+'recentchangeslinked-feed' => 'Was on verlinkde Seide gemacht worre isch',
'recentchangeslinked-toolbox' => 'Was on verlinkde Seide gemacht worre isch',
-'recentchangeslinked-title' => 'Ännerunge an Saide, wu „$1“ druf verlinkt',
+'recentchangeslinked-title' => 'Ännerunge an Saide, wu „$1“ druf verlinkt',
'recentchangeslinked-summary' => "Des isch e Lischt vun Ännerunge, wu erscht gmacht worre sin an Saide, die wu vun ere bstimmte Said verlinkt sin (odder die wu zu ere bstimmte Kadegorie ghere).
Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
-'recentchangeslinked-page' => 'Saide:',
-'recentchangeslinked-to' => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
+'recentchangeslinked-page' => 'Saide:',
+'recentchangeslinked-to' => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
# Upload
-'upload' => 'Hochlade',
-'uploadbtn' => 'Datei hochlade',
+'upload' => 'Hochlade',
+'uploadbtn' => 'Datei hochlade',
'uploadlogpage' => 'Dateie-Logbuch',
-'savefile' => 'Datei schbeichere',
+'savefile' => 'Datei schbeichere',
'uploadedimage' => 'hot „[[$1]]“ hochglade',
+# Lock manager
+'lockmanager-notlocked' => '„$1“ hod ned uffgmachd were kenne, die isch ganed gschberd gwesd.',
+'lockmanager-fail-closelock' => 'Die gbscherd Dadai „$1“ hod ned gschlosse were kenne.',
+'lockmanager-fail-deletelock' => 'Die gbscherd Dadai „$1“ hod ned gleschd were kenne.',
+'lockmanager-fail-acquirelock' => '„$1“ komma ned schberre.',
+'lockmanager-fail-openlock' => 'Die gschberd Dadai „$1“ komma ned uffmache.',
+'lockmanager-fail-releaselock' => '„$1“ konn ned fraigewe werre.',
+
# File description page
-'file-anchor-link' => 'Datei',
-'filehist' => 'Dateigschicht',
-'filehist-help' => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
-'filehist-current' => 'aktuell',
-'filehist-datetime' => 'Zaidpunkt',
-'filehist-thumb' => 'Vorschaubild',
-'filehist-thumbtext' => 'Vorschaubild fer Version vum $1',
-'filehist-user' => 'Benutzer',
-'filehist-dimensions' => 'Moß',
-'filehist-comment' => 'Kommentar',
-'imagelinks' => 'Dateilinks',
-'linkstoimage' => 'Die {{PLURAL:$1|Said verwaist|$1 Saire verwaise}} uff die Datei:',
-'sharedupload' => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
+'file-anchor-link' => 'Datei',
+'filehist' => 'Dateigschicht',
+'filehist-help' => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
+'filehist-current' => 'aktuell',
+'filehist-datetime' => 'Zaidpunkt',
+'filehist-thumb' => 'Vorschaubild',
+'filehist-thumbtext' => 'Vorschaubild fer Version vum $1',
+'filehist-user' => 'Benutzer',
+'filehist-dimensions' => 'Moß',
+'filehist-comment' => 'Kommentar',
+'imagelinks' => 'Dateilinks',
+'linkstoimage' => 'Die {{PLURAL:$1|Said verwaist|$1 Saire verwaise}} uff die Datei:',
+'sharedupload' => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
'uploadnewversion-linktext' => 'E naiere Version vun derre Datei hochlade',
# File deletion
# Statistics
'statistics' => 'Statischtike',
-'brokenredirects-edit' => 'bearwaide',
+'brokenredirects-edit' => 'bearwaide',
'brokenredirects-delete' => 'lesche',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'nmembers' => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
-'prefixindex' => 'Alle Saide (mid Präfix)',
-'newpages' => 'Naie Saide',
-'move' => 'Verschiewe',
-'movethispage' => 'Die Said verschiewe',
+'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
+'prefixindex' => 'Alle Saide (mid Präfix)',
+'newpages' => 'Naie Saide',
+'move' => 'Verschiewe',
+'movethispage' => 'Die Said verschiewe',
'pager-newer-n' => '{{PLURAL:$1|negschte 1|negschte $1}}',
'pager-older-n' => '{{PLURAL:$1|vorich 1|voriche $1}}',
# Book sources
-'booksources' => 'Buchquelle',
+'booksources' => 'Buchquelle',
'booksources-search-legend' => 'No Buchquelle suche',
-'booksources-go' => 'Geh',
+'booksources-go' => 'Geh',
# Special:Log
'log' => 'Logbiecher',
# Special:AllPages
-'allpages' => 'Alle Saide',
+'allpages' => 'Alle Saide',
'alphaindexline' => 'vun $1 bis $2',
-'prevpage' => 'Voriche Said ($1)',
-'allpagesfrom' => 'Saide aazaische wu aafange mid:',
-'allpagesto' => 'Saide aazaische wu ufhere mid:',
-'allarticles' => 'Alle Saide',
-'allpagesprev' => 'Voriche',
-'allpagesnext' => 'Negschte',
+'prevpage' => 'Voriche Said ($1)',
+'allpagesfrom' => 'Saide aazaische wu aafange mid:',
+'allpagesto' => 'Saide aazaische wu ufhere mid:',
+'allarticles' => 'Alle Saide',
+'allpagesprev' => 'Voriche',
+'allpagesnext' => 'Negschte',
'allpagessubmit' => 'Zaische',
# Special:LinkSearch
'emailsend' => 'Abschigge',
# Watchlist
-'watchlist' => 'Beowachdungslischd',
-'mywatchlist' => 'Mai Beowachdungslischd',
-'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
+'watchlist' => 'Beowachdungslischd',
+'mywatchlist' => 'Mai Beowachdungslischd',
+'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre doo aagezaicht, un d Said werd '''fett''' aagezaicht in de [[Special:RecentChanges|Letschte Ännerunge]] fer dass es ääfacher isch zum finne.",
-'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
-'watch' => 'Beowachde',
-'watchthispage' => 'Die Said beowachde',
-'unwatch' => 'Nimmi beowachde',
+'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
+'watch' => 'Beowachde',
+'watchthispage' => 'Die Said beowachde',
+'unwatch' => 'Nimmi beowachde',
'watchlist-details' => 'S hot {{PLURAL:$1|$1 Said|$1 Saide}} uff Dainer Beowachdungslischt, Dischbediersaide zelle nid.',
-'wlshowlast' => 'Die letschte $1 Stunne $2 Dache $3 zaiche',
+'wlshowlast' => 'Die letschte $1 Stunne $2 Dache $3 zaiche',
'watchlist-options' => 'Optione vun de Beowachdungslischt',
# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Beowachde ...',
+'watching' => 'Beowachde ...',
'unwatching' => 'Nimmi beowachde ...',
'enotif_reset' => 'Alle Seide als bsuchd margiere',
# Delete
-'deletepage' => 'Said lesche',
-'confirm' => 'Bestädiche',
-'delete-legend' => 'Lesche',
-'confirmdeletetext' => 'Du bisch debai e Said z lesche mid alle Versione.
+'deletepage' => 'Said lesche',
+'confirm' => 'Bestädiche',
+'delete-legend' => 'Lesche',
+'confirmdeletetext' => 'Du bisch debai e Said z lesche mid alle Versione.
Bitte du bstätiche, dass Du des wllscht du, dass Du verstehsch, was des hääßt, un dass Du des machscht in Iwweraistimmung mit de [[{{MediaWiki:Policy-url}}|Richtline]].',
-'actioncomplete' => 'Aktion fertich',
-'deletedtext' => '"$1" isch gelescht worre.
+'actioncomplete' => 'Aktion fertich',
+'deletedtext' => '"$1" isch gelescht worre.
Guck $2 fer e Lischt vun de letschte Leschunge.',
-'dellogpage' => 'Leschlogbuch',
-'deletecomment' => 'Grund:',
-'deleteotherreason' => 'Annere/zusätzliche Grund:',
+'dellogpage' => 'Leschlogbuch',
+'deletecomment' => 'Grund:',
+'deleteotherreason' => 'Annere/zusätzliche Grund:',
'deletereasonotherlist' => 'Annere Grund',
# Rollback
'rollbacklink' => 'Zericksetze',
# Protect
-'protectlogpage' => 'Saideschutz-Logbuch',
-'protectedarticle' => 'hot "[[$1]]" gschitzt',
-'modifiedarticleprotection' => 'hot de Schutzstatus vun "[[$1]]" gännert',
-'protectcomment' => 'Grund:',
-'protectexpiry' => 'Bis:',
-'protect_expiry_invalid' => 'Zaidraum isch nid gildich.',
-'protect_expiry_old' => 'Zaidraum licht in de Vergangehääd.',
-'protect-text' => "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
-'protect-locked-access' => "Dai Benutzerkonto hot ken Recht zum de Schutzstatus vun ener Said ze ännere.
+'protectlogpage' => 'Saideschutz-Logbuch',
+'protectedarticle' => 'hot "[[$1]]" gschitzt',
+'modifiedarticleprotection' => 'hot de Schutzstatus vun "[[$1]]" gännert',
+'protectcomment' => 'Grund:',
+'protectexpiry' => 'Bis:',
+'protect_expiry_invalid' => 'Zaidraum isch nid gildich.',
+'protect_expiry_old' => 'Zaidraum licht in de Vergangehääd.',
+'protect-text' => "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
+'protect-locked-access' => "Dai Benutzerkonto hot ken Recht zum de Schutzstatus vun ener Said ze ännere.
Do hot s di aktuelle Aistellunge vun de Said '''$1''':",
-'protect-cascadeon' => 'Die Said isch gschitzt, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.
+'protect-cascadeon' => 'Die Said isch gschitzt, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.
Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uff d Kaskadesperrung.',
-'protect-default' => 'Alle Benutzer erlääwe',
-'protect-fallback' => '«$1»-Berechdichung nedich',
+'protect-default' => 'Alle Benutzer erlääwe',
+'protect-fallback' => '«$1»-Berechdichung nedich',
'protect-level-autoconfirmed' => 'Naie un nid aagemeldte Benutzer sperre',
-'protect-level-sysop' => 'Numme Adminischtratore',
-'protect-summary-cascade' => 'Kaskade',
-'protect-expiring' => 'bis $1 (UTC)',
-'protect-cascade' => 'Kaskadesperrung – alle aigebunnene Vorlache sinn midgsperrt.',
-'protect-cantedit' => 'Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.',
-'restriction-type' => 'Berechdichung:',
-'restriction-level' => 'Schutzewene:',
+'protect-level-sysop' => 'Numme Adminischtratore',
+'protect-summary-cascade' => 'Kaskade',
+'protect-expiring' => 'bis $1 (UTC)',
+'protect-cascade' => 'Kaskadesperrung – alle aigebunnene Vorlache sinn midgsperrt.',
+'protect-cantedit' => 'Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.',
+'restriction-type' => 'Berechdichung:',
+'restriction-level' => 'Schutzewene:',
# Restrictions (nouns)
'restriction-edit' => 'Bearwaide',
'restriction-move' => 'Verschiewe',
# Undelete
-'undelete' => 'Widderherschdelle',
-'undeletebtn' => 'Widderherschdelle',
-'undeletelink' => 'aagucke/wirrer herstelle',
+'undelete' => 'Widderherschdelle',
+'undeletebtn' => 'Widderherschdelle',
+'undeletelink' => 'aagucke/wirrer herstelle',
'undeletereset' => 'Zuricksetze',
+'undelete-show-file-submit' => 'Ja',
# Namespace form on various pages
-'namespace' => 'Nomensraum',
-'invert' => 'Auswahl umkehre',
+'namespace' => 'Nomensraum',
+'invert' => 'Auswahl umkehre',
'blanknamespace' => '(Haaptsaid)',
# Contributions
-'contributions' => 'Was der gemacht hot',
+'contributions' => 'Was der gemacht hot',
'contributions-title' => 'Benutzerbaidräch vun $1',
-'mycontris' => 'Was isch gemacht hab',
-'contribsub2' => 'Fer $1 ($2)',
-'uctop' => '(aktuell)',
-'month' => 'un Monet (un frieher):',
-'year' => 'Ab em Johr (un frieher):',
+'mycontris' => 'Was isch gemacht hab',
+'contribsub2' => 'Fer $1 ($2)',
+'uctop' => '(aktuell)',
+'month' => 'un Monet (un frieher):',
+'year' => 'Ab em Johr (un frieher):',
-'sp-contributions-newbies' => 'Zaich numme Baidräch vun naie Benutzerkonte',
+'sp-contributions-newbies' => 'Zaich numme Baidräch vun naie Benutzerkonte',
'sp-contributions-blocklog' => 'Sperrlogbuch',
-'sp-contributions-talk' => 'Dischbediere',
-'sp-contributions-search' => 'No Baidräch suche',
+'sp-contributions-talk' => 'Dischbediere',
+'sp-contributions-search' => 'No Baidräch suche',
'sp-contributions-username' => 'IP-Adress orrer Benutzername:',
-'sp-contributions-submit' => 'Suche',
+'sp-contributions-submit' => 'Suche',
# What links here
-'whatlinkshere' => 'Was doher zeischt',
-'whatlinkshere-title' => 'Saide wu uff "$1" verlinke',
-'whatlinkshere-page' => 'Said:',
-'linkshere' => "Die Saide verlinke zu '''[[:$1]]''':",
-'isredirect' => 'Wairerlaitungsaid',
-'istemplate' => 'Vorlacheaibindung',
-'isimage' => 'Bildlink',
-'whatlinkshere-prev' => '{{PLURAL:$1|vorich|voriche $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|negscht|negschte $1}}',
-'whatlinkshere-links' => '← Links',
+'whatlinkshere' => 'Was doher zeischt',
+'whatlinkshere-title' => 'Saide wu uff "$1" verlinke',
+'whatlinkshere-page' => 'Said:',
+'linkshere' => "Die Saide verlinke zu '''[[:$1]]''':",
+'isredirect' => 'Wairerlaitungsaid',
+'istemplate' => 'Vorlacheaibindung',
+'isimage' => 'Bildlink',
+'whatlinkshere-prev' => '{{PLURAL:$1|vorich|voriche $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|negscht|negschte $1}}',
+'whatlinkshere-links' => '← Links',
'whatlinkshere-hideredirs' => '$1 Wairerlaitunge',
-'whatlinkshere-hidetrans' => '$1 Vorlacheaibindunge',
-'whatlinkshere-hidelinks' => '$1 Links',
-'whatlinkshere-filters' => 'Filter',
+'whatlinkshere-hidetrans' => '$1 Vorlacheaibindunge',
+'whatlinkshere-hidelinks' => '$1 Links',
+'whatlinkshere-filters' => 'Filter',
# Block/unblock
-'blockip' => 'Benutzer bloggiere',
-'ipbsubmit' => 'Benutzer bloggiere',
-'ipboptions' => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
-'ipusubmit' => 'Die Adreß freigewwe',
-'ipblocklist' => 'Gsperrte IP-Adresse un Benutzername',
-'blocklink' => 'sperre',
-'unblocklink' => 'Sperr uffhewwe',
-'change-blocklink' => 'Sperr ännere',
-'contribslink' => 'Baidräch',
-'blocklogpage' => 'Sperrlogbuch',
-'blocklogentry' => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
-'unblocklogentry' => 'hot d Sperr vun $1 uffghowwe',
+'blockip' => 'Benutzer bloggiere',
+'ipbsubmit' => 'Benutzer bloggiere',
+'ipboptions' => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
+'ipusubmit' => 'Die Adreß freigewwe',
+'ipblocklist' => 'Gsperrte IP-Adresse un Benutzername',
+'blocklink' => 'sperre',
+'unblocklink' => 'Sperr uffhewwe',
+'change-blocklink' => 'Sperr ännere',
+'contribslink' => 'Baidräch',
+'blocklogpage' => 'Sperrlogbuch',
+'blocklogentry' => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
+'unblocklogentry' => 'hot d Sperr vun $1 uffghowwe',
'block-log-flags-nocreate' => 'Aaleche vun Benutzerkonte isch gsperrt',
# Developer tools
-'lockbtn' => 'Dadebonk schberre',
+'lockbtn' => 'Dadebonk schberre',
'unlockbtn' => 'Dadebonk freigewwe',
# Move page
'move-page-legend' => 'Said verschiewe',
-'movepagetext' => "Mid dem Format kannscht ener Said e naie Name gewwe, debai werre alle alde Versione uff de nai Name verschowe.
+'movepagetext' => "Mid dem Format kannscht ener Said e naie Name gewwe, debai werre alle alde Versione uff de nai Name verschowe.
Aus em Alde Name werd e Wairerlaidungssaid´zum naie Name.
Wairerlaidungssaide, wu uff de ald Name umlaire, kannscht automatisch aktualisiere.
Wenn De des nid willsch, no guck uff [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|kaputte Wairerlaidunge]].
* Du wählsch unne d Option, se nid z verschiewe.
In denne Fäll misst mer d Dischbediersaid vun Hand kopiere.",
-'movearticle' => 'Said verschiewe:',
-'newtitle' => 'Zum naie Titel:',
-'move-watch' => 'Die Said beowachde',
-'movepagebtn' => 'Said verschiewe',
-'pagemovedsub' => 'Verschiewung hot geklappt',
-'movepage-moved' => '\'\'\'"$1" isch verschowe worre uff "$2"\'\'\'',
-'articleexists' => 'E Said mid dem Name gebbt s schun, orrer de Name, wu du gewählt hoscht, isch nid gildich.
+'movearticle' => 'Said verschiewe:',
+'newtitle' => 'Zum naie Titel:',
+'move-watch' => 'Die Said beowachde',
+'movepagebtn' => 'Said verschiewe',
+'pagemovedsub' => 'Verschiewung hot geklappt',
+'movepage-moved' => '\'\'\'"$1" isch verschowe worre uff "$2"\'\'\'',
+'articleexists' => 'E Said mid dem Name gebbt s schun, orrer de Name, wu du gewählt hoscht, isch nid gildich.
Bitte nemm e annere Name.',
-'talkexists' => "'''Die Said selwerschd, isch verschowe worre, awwer d Dischbediersaid hot nid kenne verschowe werre, wail s schun enni gebbt mid dem Name.
+'talkexists' => "'''Die Said selwerschd, isch verschowe worre, awwer d Dischbediersaid hot nid kenne verschowe werre, wail s schun enni gebbt mid dem Name.
Bitte duu se vun Hand zammefiehre.'''",
-'movedto' => 'verschowe uff',
-'movetalk' => 'Dischbediersaid, wu dezu ghert, verschiewe',
-'movelogpage' => 'Verschiewungs-Logbuch',
-'movereason' => 'Grund:',
-'revertmove' => 'Zerick verschiewe',
-'delete_and_move' => 'Lesche un Verschiewe',
+'movedto' => 'verschowe uff',
+'movetalk' => 'Dischbediersaid, wu dezu ghert, verschiewe',
+'movelogpage' => 'Verschiewungs-Logbuch',
+'movereason' => 'Grund:',
+'revertmove' => 'Zerick verschiewe',
+'delete_and_move' => 'Lesche un Verschiewe',
+'delete_and_move_confirm' => 'Ja, Said lesche',
# Export
-'export' => 'Saide exportiere',
+'export' => 'Saide exportiere',
'export-submit' => 'Seide exbordiere',
# Thumbnails
'import-interwiki-submit' => 'Impordiere',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Dai Benutzersaid',
-'tooltip-pt-mytalk' => 'Dai Dischbedier-Said',
-'tooltip-pt-preferences' => 'Dai Aistellunge',
-'tooltip-pt-watchlist' => 'D Lischt vun Saide, die wu du beowachde dusch',
-'tooltip-pt-mycontris' => 'Lischt vun Daine Baidräch',
-'tooltip-pt-login' => 'Du kannscht Dich aamelde, awwer du muscht s nit',
-'tooltip-pt-logout' => 'Abmelde',
-'tooltip-ca-talk' => 'Iwwer d Inhaltssaid dischbediere',
-'tooltip-ca-edit' => 'Du kannscht die Said bearwaide.
+'tooltip-pt-userpage' => 'Dai Benutzersaid',
+'tooltip-pt-mytalk' => 'Dai Dischbedier-Said',
+'tooltip-pt-preferences' => 'Dai Aistellunge',
+'tooltip-pt-watchlist' => 'D Lischt vun Saide, die wu du beowachde dusch',
+'tooltip-pt-mycontris' => 'Lischt vun Daine Baidräch',
+'tooltip-pt-login' => 'Du kannscht Dich aamelde, awwer du muscht s nit',
+'tooltip-pt-logout' => 'Abmelde',
+'tooltip-ca-talk' => 'Iwwer d Inhaltssaid dischbediere',
+'tooltip-ca-edit' => 'Du kannscht die Said bearwaide.
Bitte brauch de Vorschau-Knopp vor em Schbaichere',
-'tooltip-ca-addsection' => 'E naie Abschnitt aaleche',
-'tooltip-ca-viewsource' => 'Die Said isch gschitzt.
+'tooltip-ca-addsection' => 'E naie Abschnitt aaleche',
+'tooltip-ca-viewsource' => 'Die Said isch gschitzt.
Du kannscht awwer de Quelltext aagucke',
-'tooltip-ca-history' => 'Ledschde Versione vun derre Said',
-'tooltip-ca-protect' => 'Die Said schitze',
-'tooltip-ca-delete' => 'Die Said lesche',
-'tooltip-ca-move' => 'Die Said verschiewe',
-'tooltip-ca-watch' => 'Die Said zu Dainere Beowachdungslischt zufieche',
-'tooltip-ca-unwatch' => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
-'tooltip-search' => 'Durchsuch {{SITENAME}}',
-'tooltip-search-go' => 'Geh zu ere Said mit genää dem Namme, wenn s se gebbt',
-'tooltip-search-fulltext' => 'Such in de Said noch dem Text',
-'tooltip-p-logo' => 'Haubdsaid',
-'tooltip-n-mainpage' => 'Uff d Hääptsaid geh',
-'tooltip-n-mainpage-description' => 'Haubdsaid aagucke',
-'tooltip-n-portal' => 'Iwwer s Projekt, was de duu kannscht, wo de ebbes finnscht',
-'tooltip-n-currentevents' => 'hinnergundsinformatione finne iwwer naie Eraichnis',
-'tooltip-n-recentchanges' => 'D Lischt vun de letschte Ännerunge in dem Wiki',
-'tooltip-n-randompage' => 'E zufälliche Said lade',
-'tooltip-n-help' => 'De Ort zum rausfinne',
-'tooltip-t-whatlinkshere' => 'Lischt vun alle Wikisaide, wo do her verlinkt sin',
-'tooltip-t-recentchangeslinked' => 'Letschte Ännerunge in Saide, wu vun do verlinkt sin',
-'tooltip-feed-rss' => 'RSS feed fer die Said',
-'tooltip-feed-atom' => 'Atom feed fer die Said',
-'tooltip-t-contributions' => 'Die letschte Baidräch vun däm Benutzer aagucke',
-'tooltip-t-emailuser' => 'Dem Benutzer e E-Mail schicke',
-'tooltip-t-upload' => 'Dateie nuflade',
-'tooltip-t-specialpages' => 'Lischt vun alle Spezialsaide',
-'tooltip-t-print' => 'Druckversion vun derre Said',
-'tooltip-t-permalink' => 'E dauerhafte Link zu derre Version vun de Said',
-'tooltip-ca-nstab-main' => 'D Inhaldssaid aagucke',
-'tooltip-ca-nstab-user' => 'D Benutzersaid aagucke',
-'tooltip-ca-nstab-special' => 'Des isch e Spezialsaid, du kannscht d Said sälwerscht nit ännere',
-'tooltip-ca-nstab-project' => 'D Projektsaid aagucke',
-'tooltip-ca-nstab-image' => 'D Dateisaid aaugucke',
-'tooltip-ca-nstab-template' => 'Vorlach aagucke',
-'tooltip-ca-nstab-category' => 'D Kategoriesaid aagucke',
-'tooltip-minoredit' => 'Des als klenne Ännerung markiere',
-'tooltip-save' => 'Dai Ännerunge spaichere',
-'tooltip-preview' => 'Guck Daine Ännerunge in de Vorschau aa, vor Du uff Spaichere driksch!',
-'tooltip-diff' => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
+'tooltip-ca-history' => 'Ledschde Versione vun derre Said',
+'tooltip-ca-protect' => 'Die Said schitze',
+'tooltip-ca-delete' => 'Die Said lesche',
+'tooltip-ca-move' => 'Die Said verschiewe',
+'tooltip-ca-watch' => 'Die Said zu Dainere Beowachdungslischt zufieche',
+'tooltip-ca-unwatch' => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
+'tooltip-search' => 'Durchsuch {{SITENAME}}',
+'tooltip-search-go' => 'Geh zu ere Said mit genää dem Namme, wenn s se gebbt',
+'tooltip-search-fulltext' => 'Such in de Said noch dem Text',
+'tooltip-p-logo' => 'Haubdsaid',
+'tooltip-n-mainpage' => 'Uff d Hääptsaid geh',
+'tooltip-n-mainpage-description' => 'Haubdsaid aagucke',
+'tooltip-n-portal' => 'Iwwer s Projekt, was de duu kannscht, wo de ebbes finnscht',
+'tooltip-n-currentevents' => 'hinnergundsinformatione finne iwwer naie Eraichnis',
+'tooltip-n-recentchanges' => 'D Lischt vun de letschte Ännerunge in dem Wiki',
+'tooltip-n-randompage' => 'E zufälliche Said lade',
+'tooltip-n-help' => 'De Ort zum rausfinne',
+'tooltip-t-whatlinkshere' => 'Lischt vun alle Wikisaide, wo do her verlinkt sin',
+'tooltip-t-recentchangeslinked' => 'Letschte Ännerunge in Saide, wu vun do verlinkt sin',
+'tooltip-feed-rss' => 'RSS feed fer die Said',
+'tooltip-feed-atom' => 'Atom feed fer die Said',
+'tooltip-t-contributions' => 'Die letschte Baidräch vun däm Benutzer aagucke',
+'tooltip-t-emailuser' => 'Dem Benutzer e E-Mail schicke',
+'tooltip-t-upload' => 'Dateie nuflade',
+'tooltip-t-specialpages' => 'Lischt vun alle Spezialsaide',
+'tooltip-t-print' => 'Druckversion vun derre Said',
+'tooltip-t-permalink' => 'E dauerhafte Link zu derre Version vun de Said',
+'tooltip-ca-nstab-main' => 'D Inhaldssaid aagucke',
+'tooltip-ca-nstab-user' => 'D Benutzersaid aagucke',
+'tooltip-ca-nstab-special' => 'Des isch e Spezialsaid, du kannscht d Said sälwerscht nit ännere',
+'tooltip-ca-nstab-project' => 'D Projektsaid aagucke',
+'tooltip-ca-nstab-image' => 'D Dateisaid aaugucke',
+'tooltip-ca-nstab-template' => 'Vorlach aagucke',
+'tooltip-ca-nstab-category' => 'D Kategoriesaid aagucke',
+'tooltip-minoredit' => 'Des als klenne Ännerung markiere',
+'tooltip-save' => 'Dai Ännerunge spaichere',
+'tooltip-preview' => 'Guck Daine Ännerunge in de Vorschau aa, vor Du uff Spaichere driksch!',
+'tooltip-diff' => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
'tooltip-compareselectedversions' => 'D Unnerschied zwische denne zwai ausgwehlte Versione aagucke',
-'tooltip-watch' => 'Die Said zu Dainer Beowachdunglischd zufieche',
-'tooltip-rollback' => '„Zericksetze“ maxcht alle Bearwaidunge vum letschte Bearwaider rickgängich',
-'tooltip-undo' => '„Zerick“ macht numme die Ännerung rickgängich un zaicht d Vorschau aa.
+'tooltip-watch' => 'Die Said zu Dainer Beowachdunglischd zufieche',
+'tooltip-rollback' => '„Zericksetze“ maxcht alle Bearwaidunge vum letschte Bearwaider rickgängich',
+'tooltip-undo' => '„Zerick“ macht numme die Ännerung rickgängich un zaicht d Vorschau aa.
Du kannscht e Grund in dr Zammfassung aagewwe',
# Browsing diffs
'previousdiff' => '← Ältere Bearwaidung',
-'nextdiff' => 'Naiere Bearwaidung →',
+'nextdiff' => 'Naiere Bearwaidung →',
# Media information
'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
-'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
-'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
+'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
+'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
'show-big-image' => 'Gsamte Ergebnis',
# Special:NewFiles
'showhidebots' => '(Bots $1)',
-'ilsubmit' => 'Such',
+'ilsubmit' => 'Such',
# Bad image list
'bad_image_list' => 'Format:
Annere Links in der glaiche Zail werre als Ausnahme behannelt, d. h. Saide, wu d Datei drin vorkumme därft.',
# Metadata
-'metadata' => 'Metadata',
-'metadata-help' => 'Die Datei hot waitere Informatione, wahrschainlich vun de Digitalkamera oder vum Scanner, mit dem wu sie gmacht worre sinn.
+'metadata' => 'Metadata',
+'metadata-help' => 'Die Datei hot waitere Informatione, wahrschainlich vun de Digitalkamera oder vum Scanner, mit dem wu sie gmacht worre sinn.
Wenn die Datei verännert worre isch, dann kann s sai, dass die zusätzlich Information fer die verännert Datei nimmi richtich isch.',
-'metadata-expand' => 'Erwaiterte Details aazaiche',
+'metadata-expand' => 'Erwaiterte Details aazaiche',
'metadata-collapse' => 'Erwaiterte Details versteckeln',
-'metadata-fields' => 'Die EXIF-Metadate werre in de Bild-Bschraiwung ach aagezeicht, wenn d Metadate-Tabelle versteckelt isch.
+'metadata-fields' => 'Die EXIF-Metadate werre in de Bild-Bschraiwung ach aagezeicht, wenn d Metadate-Tabelle versteckelt isch.
Annere Metadate sinn standardmäßig versteckelt.
* make
* model
'exif-gaincontrol-0' => 'Kään',
# External editor support
-'edit-externally' => 'Die Datei bearwaide mit ener externe Aawendung',
+'edit-externally' => 'Die Datei bearwaide mit ener externe Aawendung',
'edit-externally-help' => '(Guck uff [//www.mediawiki.org/wiki/Manual:External_editors Installationsaawisige] fer meh Informatione)',
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'alle',
'namespacesall' => 'alle',
-'monthsall' => 'alle',
+'monthsall' => 'alle',
# Watchlist editing tools
'watchlisttools-view' => 'Die wichdiche Ännerunge aagucke',
'watchlisttools-edit' => 'D Beowachdunglischt aagucke un bearwaide',
-'watchlisttools-raw' => 'ime große Textfeld bearwaide',
+'watchlisttools-raw' => 'ime große Textfeld bearwaide',
# Special:SpecialPages
'specialpages' => 'Spezialsaide',
# Special:Tags
'tags-edit' => 'bearwaide',
+# Feedback
+'feedback-close' => 'Erledischd',
+
);
'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'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à parej",
+'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.',
'tooltip-pt-preferences' => 'میریاں تانگاں',
'tooltip-pt-watchlist' => 'او صفحے جنہاں وچ تبدیلیاں تسی ویکھ رہے او',
'tooltip-pt-mycontris' => 'میرے کم',
-'tooltip-pt-login' => 'جÛ\8c صدÙ\82Û\92 اÙ\86در آؤØ\8c پر اÛ\92 Ù\84ازÙ\85Û\8c Ù\86Û\81یں۔',
+'tooltip-pt-login' => 'اÛ\92 بÛ\81تر اÛ\92 Ú©Û\81 Ù\84اگ اÙ\86 Û\81Ù\88 جاؤØ\8c Ù\84Û\8cÚ©Ù\86 Ù\81Û\8cر Ù\88Û\8c اÛ\92 Ù\84ازÙ\85Û\8c Ù\86ئیں۔',
'tooltip-pt-anonlogin' => 'اے بہتر اے کہ لاگ ان ہو جاؤ، لیکن فیر وی اے لازمی نئیں۔',
'tooltip-pt-logout' => 'باہر آؤ',
'tooltip-ca-talk' => 'اس صفحے دے بار وچ گل بات',
'ascending_abbrev' => 'اے ایس سی',
'descending_abbrev' => 'ڈی ایایس سی',
'table_pager_next' => 'اگلا صفہ',
-'table_pager_prev' => 'پچھلا صفحہ',
+'table_pager_prev' => 'پچھلا صفہ',
'table_pager_first' => 'پہلا صفہ',
'table_pager_last' => 'آخری صفہ',
'table_pager_limit' => '$1 وکھاؤ ہر صفے تے',
# Special:Version
'version' => 'ورژن',
'version-extensions' => 'انسٹالڈ کیتیاں گیاں ایکسٹنشن',
-'version-specialpages' => 'خاص صفحے',
+'version-specialpages' => 'خاص صفے',
'version-parserhooks' => 'پارسر ہکز',
'version-variables' => 'ویریایبلز',
'version-antispam' => 'سپام بچاؤ',
'backend-fail-connect' => 'Não foi possível estabelecer ligação 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 ficheiro para armazenar em " $1 ".',
+'backend-fail-batchsize' => 'Foi fornecido um bloco de $1 {{PLURAL:$1|operação|operações}} sobre ficheiros ao servidor backend de armazenamento; o limite é de $2 {{PLURAL:$2|operação|operações}}.',
# File journal errors
'filejournal-fail-dbconnect' => 'Não foi possível ligar à base de dados de registos no "backend" de armazenamento "$1".',
'wantedpages' => 'Páginas desejadas',
'wantedpages-badtitle' => 'Título inválido no conjunto de resultados: $1',
'wantedfiles' => 'Ficheiros desejados',
+'wantedfiletext-cat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>. Adicionalmente, páginas que incorporam ficheiros que não existem estão listadas em [[:$1]].',
+'wantedfiletext-nocat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>.',
'wantedtemplates' => 'Predefinições desejadas',
'mostlinked' => 'Páginas com mais afluentes',
'mostlinkedcategories' => 'Categorias com mais membros',
'allpages-hide-redirects' => 'Ocultar redirecionamentos',
# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Você está a visualizar uma versão desta página em cache que tem uma antiguidade máxima de $1.',
+'cachedspecial-viewing-cached-ts' => 'Você está a visualizar uma versão desta página em cache que pode não refletir totalmente a situação atual.',
'cachedspecial-refresh-now' => 'Ver mais recente.',
# Special:Categories
'javascripttest-pagetext-frameworks' => 'Escolha, por favor, uma das seguintes estruturas de teste: $1',
'javascripttest-pagetext-skins' => 'Escolher um tema para executar os testes com:',
'javascripttest-qunit-intro' => 'Consulte a [ $1 documentação de testes] no mediawiki.org.',
+'javascripttest-qunit-heading' => 'Pacote de ferramentas de teste de JavaScript QUnit do MediaWiki',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'A sua página de utilizador',
'tog-previewontop' => 'Mostrar previsão antes da caixa de edição',
'tog-previewonfirst' => 'Mostrar previsão na primeira edição',
'tog-nocache' => 'Desativar o cache de páginas do navegador',
-'tog-enotifwatchlistpages' => 'Enviar-me um email quando uma página da minha lista de páginas vigiadas for alterada',
-'tog-enotifusertalkpages' => 'Enviar-me um email quando a minha página de discussão for editada',
+'tog-enotifwatchlistpages' => 'Receber e-mail quando uma página da minha lista de páginas vigiadas for alterada',
+'tog-enotifusertalkpages' => 'Receber e-mail quando a minha página de discussão for editada',
'tog-enotifminoredits' => 'Enviar-me um email também quando forem edições menores',
'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
'tog-watchlisthideanons' => 'Ocultar edições de usuários anônimos da lista de páginas vigiadas',
'tog-watchlisthidepatrolled' => 'Esconder edições patrulhadas na lista de páginas vigiadas',
'tog-nolangconversion' => 'Desabilitar conversão de variantes de idioma',
-'tog-ccmeonemails' => 'Enviar para mim cópias de e-mails que eu enviar a outros usuários',
+'tog-ccmeonemails' => 'Receber cópias de e-mails que eu enviar a outros usuários',
'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
'tog-showhiddencats' => 'Exibir categorias ocultas',
'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
'tagline' => 'De {{SITENAME}}',
'help' => 'Ajuda',
'search' => 'Pesquisar',
-'searchbutton' => 'Pesquisa',
+'searchbutton' => 'Pesquisar',
'go' => 'Ir',
'searcharticle' => 'Ir',
'history' => 'Histórico da página',
'copyrightpage' => '{{ns:project}}:Direitos_de_autor',
'currentevents' => 'Eventos atuais',
'currentevents-url' => 'Project:Eventos atuais',
-'disclaimers' => 'Alerta de conteúdo',
+'disclaimers' => 'Exoneração de responsabilidade',
'disclaimerpage' => 'Project:Aviso_geral',
'edithelp' => 'Ajuda de edição',
'edithelppage' => 'Help:Editar',
Veja a [[Special:Version|página sobre a versão do sistema]].',
'ok' => 'OK',
-'retrievedfrom' => 'Obtida de "$1"',
+'retrievedfrom' => 'Disponível em "$1"',
'youhavenewmessages' => 'Você tem $1 ($2).',
'newmessageslink' => 'novas mensagens',
'newmessagesdifflink' => 'última alteração',
'yourdomainname' => 'Seu domínio:',
'externaldberror' => 'Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
'login' => 'Autenticar-se',
-'nav-login-createaccount' => 'Criar uma conta ou entrar',
+'nav-login-createaccount' => 'Entrar / criar conta',
'loginprompt' => 'É necessário estar com cookies ativados para poder autenticar-se no wiki {{SITENAME}}.',
'userlogin' => 'Criar uma conta ou entrar',
'userloginnocreate' => 'Entrar',
'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuário}} não {{PLURAL:$1|apresentada|apresentadas}})',
# Search results
-'searchresults' => 'Resultados de pesquisa',
+'searchresults' => 'Resultados da pesquisa',
'searchresults-title' => 'Resultados da pesquisa por "$1"',
'searchresulttext' => 'Para mais informações de como pesquisar na {{SITENAME}}, consulte [[{{MediaWiki:Helppage}}|{{int:help}}]].',
'searchsubtitle' => 'Você pesquisou por \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|páginas iniciadas por "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|páginas que apontam para "$1"]])',
'timezoneregion-europe' => 'Europa',
'timezoneregion-indian' => 'Oceano Índico',
'timezoneregion-pacific' => 'Oceano Pacífico',
-'allowemail' => 'Permitir email de outros usuários',
+'allowemail' => 'Permitir que outros usuários me enviem e-mails',
'prefs-searchoptions' => 'Opções de busca',
'prefs-namespaces' => 'Espaços nominais',
'defaultns' => 'Caso contrário pesquisar nestes espaços nominais:',
'tooltip-pt-anonlogin' => 'Você é encorajado a autenticar-se, apesar disso não ser obrigatório.',
'tooltip-pt-logout' => 'Sair',
'tooltip-ca-talk' => 'Discussão sobre o conteúdo da página',
-'tooltip-ca-edit' => 'Você pode editar esta página. Por favor, utilize o botão Mostrar Previsão antes de salvar.',
+'tooltip-ca-edit' => 'Você pode editar esta página. Use o botão "Mostrar previsão" antes de salvar.',
'tooltip-ca-addsection' => 'Iniciar uma nova seção',
'tooltip-ca-viewsource' => 'Esta página está protegida; você pode exibir seu código, no entanto.',
'tooltip-ca-history' => 'Edições anteriores desta página.',
'tooltip-ca-unwatch' => 'Remover esta página da lista de páginas vigiadas',
'tooltip-search' => 'Pesquisar em {{SITENAME}}',
'tooltip-search-go' => 'Ir a uma página com este exato nome, caso exista',
-'tooltip-search-fulltext' => 'Procurar por páginas contendo este texto',
-'tooltip-p-logo' => 'Página principal',
-'tooltip-n-mainpage' => 'Visitar a página principal',
-'tooltip-n-mainpage-description' => 'Visitar a página principal',
-'tooltip-n-portal' => 'Sobre o projeto',
-'tooltip-n-currentevents' => 'Informação temática sobre eventos atuais',
-'tooltip-n-recentchanges' => 'Uma lista de mudanças recentes no wiki',
-'tooltip-n-randompage' => 'Abrir uma página aleatoriamente',
-'tooltip-n-help' => 'Um local reservado para auxílio.',
-'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que ligam-se a esta',
-'tooltip-t-recentchangeslinked' => 'Mudanças recentes em páginas relacionadas a esta',
+'tooltip-search-fulltext' => 'Procurar páginas que contenham este texto',
+'tooltip-p-logo' => 'Acessar a página principal',
+'tooltip-n-mainpage' => 'Acessar a página principal',
+'tooltip-n-mainpage-description' => 'Acessar a página principal',
+'tooltip-n-portal' => 'Sobre o projeto, o que se pode fazer e onde achar as coisas',
+'tooltip-n-currentevents' => 'Encontre informações sobre acontecimentos atuais',
+'tooltip-n-recentchanges' => 'A lista de mudanças recentes desta wiki.',
+'tooltip-n-randompage' => 'Acessar uma página de forma aleatória',
+'tooltip-n-help' => 'Lugar específico para obter ajuda quanto ao ambiente.',
+'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que possuem links para esta',
+'tooltip-t-recentchangeslinked' => 'Mudanças recentes nas páginas para as quais esta possui links',
'tooltip-feed-rss' => 'Feed RSS desta página',
'tooltip-feed-atom' => 'Feed Atom desta página',
'tooltip-t-contributions' => 'Ver as contribuições deste usuário',
'tooltip-t-emailuser' => 'Enviar um e-mail a este usuário',
-'tooltip-t-upload' => 'Carregar arquivos',
+'tooltip-t-upload' => 'Enviar arquivos',
'tooltip-t-specialpages' => 'Lista de páginas especiais',
'tooltip-t-print' => 'Versão para impressão desta página',
'tooltip-t-permalink' => 'Link permanente para esta versão desta página',
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
-Só itens da lista (linhas começando com *) são considerados.
-A primeira ligação em uma linha deve ser uma ligação para um arquivo ruim.
-Qualquer ligação posterior na mesma linha são consideradas como exceções, ou seja, páginas nas quais o arquivo pode aparecer na linha.',
+Só são reconhecidos elementos na forma de lista (linhas começadas por *).
+O primeiro link em cada linha deve direcionar para o arquivo que se pretende bloquear.
+Quaisquer outros links nessa mesma linha são considerados exceções (ou seja, páginas onde o arquivo pode estar presente).',
# Metadata
'metadata' => 'Metadados',
* <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
+'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 [http://meta.wikimedia.org/wiki/Help:Expansion_depth expansion depth] of the preprocessor exceeds the limit.',
+'expansion-depth-exceeded-warning' => 'Error message shown when a page exceeded the [http://meta.wikimedia.org/wiki/Help:Expansion_depth 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',
'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
'version-software-product' => 'Shown in [[Special:Version]]',
'version-software-version' => '{{Identical|Version}}',
-'version-entrypoints' => 'Header on [[Special:Version]] above a table that lists the URLs of various entry points in this MediaWiki installation.',
-'version-entrypoints-header-entrypoint' => 'Header for the first column in the entry points table on [[Special:Version]].',
+'version-entrypoints' => 'Header on [[Special:Version]] above a table that lists the URLs of various entry points in this MediaWiki installation. Entry points are the "places" where the wiki\'s content and information can be accessed in various ways, for instance the standard index.php which shows normal pages, histories etc.',
+'version-entrypoints-header-entrypoint' => 'Header for the first column in the entry points table on [[Special:Version]].
+See also {{msg-mw|Version-entrypoints}}',
'version-entrypoints-header-url' => 'Header for the second column in the entry points table on [[Special:Version]].',
'version-entrypoints-articlepath' => 'A short description of the article path entry point. Links to the mediawiki.org documentation page for $wgArticlePath.',
'version-entrypoints-scriptpath' => 'A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
'parser-template-loop-warning' => "Amme acchiete 'nu cicle de template: [[$1]]",
'parser-template-recursion-depth-warning' => "Ha state supranete 'u limite di ricorsione de le template ($1)",
'language-converter-depth-warning' => "'U convertitore de lènghe ha subranate 'u limite de profonnetà ($1)",
+'expansion-depth-exceeded-category' => "Pàggene addò 'a profonnetà de l'espanzione jè supranate",
# "Undo" feature
'undo-success' => "'U cangiamende pò essere annullate.
'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".',
+'backend-fail-internal' => "'N'errore scanusciute s'à verificate jndr'à l'archivije de rrete \"\$1\".",
# Lock manager
'lockmanager-notlocked' => 'Non ge pozze sbloccà "$1"; jidde non g\'è bloccate.',
'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',
+'javascripttest-qunit-heading' => 'Ambiende de test MediaUicchi JavaScript QUnit',
# Tooltip help for the actions
'tooltip-pt-userpage' => "'A pàgene utende meje",
'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-fetchfileerror' => "Errore inderne: Quacchecose ha sciute stuèrte quanne ste analizzave 'u file.",
'api-error-file-too-large' => "'U file ca tu è confermate jè troppe granne.",
'api-error-filename-tooshort' => "'U nome d'u file jè troppe curte.",
'api-error-filetype-banned' => 'Stu tipe de file jè vietate.',
* @author Claymore
* @author Comp1089
* @author DCamer
+ * @author Daniyar
* @author Dim Grits
* @author Don Alessandro
* @author Eleferen
* @author Putnik
* @author Rave
* @author Rubin
+ * @author Sagan
* @author Sk
* @author TarzanASG
* @author Temuri rajavi
'invalidemailaddress' => 'Адрес электронной почты не может быть принят, так как он не соответствует формату.
Пожалуйста, введите корректный адрес или оставьте поле пустым.',
'cannotchangeemail' => 'Адреса электронной почты этой учётной записи не могут быть изменены в этой вики.',
-'emaildisabled' => 'ÐÑ\82оÑ\82 Ñ\81айÑ\82 не можеÑ\82 оÑ\82пÑ\80авлÑ\8fÑ\82Ñ\8c Ñ\81ообÑ\89ениÑ\8f Ñ\8dлекÑ\82Ñ\80онной поÑ\87Ñ\82ы.',
+'emaildisabled' => 'Ð\91ұл Ñ\81айÑ\82 Ñ\8d-поÑ\88Ñ\82анÑ\8bÒ£ Ñ\85абаÑ\80ламаÑ\81Ñ\8bн жÑ\96беÑ\80е алмайды.',
'accountcreated' => 'Учётная запись создана',
'accountcreatedtext' => 'Создана учётная запись участника $1.',
'createaccount-title' => '{{SITENAME}}: создание учётной записи',
* @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|फलितम्|फलितानि}} दर्श्यताम्',
--- /dev/null
+<?php
+/** Santali (Santali)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Albinus
+ * @author Ghonokuashabaskey
+ * @author Nipon087
+ * @author Salvator
+ * @author Samar88
+ * @author Srabony90
+ */
+
+$messages = array(
+# User preference toggles
+'tog-hideminor' => 'Nitaḱ bodolaḱre huḍiṅ kạmi danaṅme',
+'tog-showtoc' => 'Ṭibilre menaḱako ńel ( sakamkore 3 khon jạti hedlayenko)',
+'tog-watchcreations' => 'Sakamko songe Ińaḱ ńelok tạlikare benao',
+'tog-enotifwatchlistpages' => 'E-mailạńme one tinre in̕aḱ n̕eloḱ tạlika do bodolok',
+'tog-enotifusertalkpages' => 'E-mailạn̕me one tinre in̕aḱ roṛaḱ laṛcaṛ sakam do bodoloḱa',
+'tog-enotifminoredits' => 'E-mailạn̕me arhõ one tinre in̕aḱ sakamre huḍiń kạmi hoyoḱ',
+'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
+'tog-oldsig' => 'Menaḱ signạtar',
+'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
+'tog-watchlisthideown' => 'Ńeloḱ talikare ińaḱ joṛao kamiko danaṅme',
+'tog-watchlisthideminor' => 'Ńeloḱ tạlikare ińak huḍiṅ joṛao kạmiko danaṅme',
+'tog-ccmeonemails' => 'E-mail reaḱ kopy kulạńme Eṭaḱ laṛcaṛko kulakome',
+
+'underline-always' => 'Sanam okte',
+'underline-never' => 'Tis hõ ban̕',
+
+# Dates
+'sunday' => 'Aṭhowar',
+'monday' => 'Som',
+'tuesday' => 'Mońgol',
+'wednesday' => 'Budh',
+'thursday' => 'Lukhibar',
+'friday' => 'Sokolbar',
+'saturday' => 'Sạnicar',
+'sun' => 'Aṭhwar',
+'mon' => 'Som',
+'tue' => 'Mongolbar',
+'wed' => 'Budhbar',
+'thu' => 'Lukhibar',
+'fri' => 'Sokolbar',
+'sat' => 'Sạnicar',
+'january' => 'Jạnuạri',
+'february' => 'Februạri',
+'march' => 'Marc',
+'april' => 'Epril',
+'may_long' => 'Me̠',
+'june' => 'Jun',
+'july' => 'Julại',
+'august' => 'A̠go̠sṭ',
+'september' => 'Se̠ṕṭembạ̣r',
+'october' => 'O̠ḱ́ṭo̠bo̠r',
+'november' => 'Nove̠mbo̠r',
+'december' => 'Ḍisembo̠r',
+'january-gen' => 'Jạnuạri',
+'february-gen' => 'Februạri',
+'march-gen' => 'Marc',
+'april-gen' => 'Epril',
+'may-gen' => 'Me',
+'june-gen' => 'Jun',
+'july-gen' => 'Julại',
+'august-gen' => 'Ago̠sṭ',
+'september-gen' => 'Se̠ṕṭembo̠r',
+'october-gen' => 'O̠ḱ́ṭo̠bo̠r',
+'november-gen' => 'Nove̠mbo̠r',
+'december-gen' => 'December',
+'jan' => 'Jạn',
+'feb' => 'Febr',
+'mar' => 'Ma̠r',
+'apr' => 'Epr',
+'may' => 'Me',
+'jun' => 'Ju̠n',
+'jul' => 'Ju̠l',
+'aug' => 'Ago̠',
+'sep' => 'Seṕ',
+'oct' => 'Okṭ',
+'nov' => 'No̠v',
+'dec' => 'Dis',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Bivag|Bivagko}}',
+'category_header' => 'Sakam korenaḱ rokom sokom "$1"',
+'subcategories' => 'Huḍiń rokom sokomko',
+'hidden-categories' => '{{PLURAL:$1|Dãnań renaḱ|Dãnań renaḱ ko}}',
+'category-subcat-count' => '{{PLURAL:$2| keṭagorire eken tayom hudińkeṭagori menaḱa. |Noa keṭagorire tayom menaḱa {{PLURAL:$1 hudińkeṭagoriko}}, jotokote $2}}',
+'category-article-count' => '{{PLURAL:$2| Noa keṭagoriredo eken tayomtenaḱ sakam menaḱa.| Tayom {{PLURAL:$2| sakam do |$1 sakamko kana}} nia keṭagorire, sanamkote hoyoḱkana $2 .}}',
+'listingcontinuesabbrev' => 'Calaḱa',
+'noindex-category' => 'Unuduḱ sakamkodo bạnuḱa',
+
+'about' => 'Lạgitte, Lạgti',
+'newwindow' => 'Nãwã khiṛki jhijme',
+'cancel' => 'Badme',
+'moredotdotdot' => 'Aema',
+'mypage' => 'In̕aḱ sakam',
+'mytalk' => 'Iñaḱ́ ro̠ṛ',
+'navigation' => 'Ñamme',
+
+# Cologne Blue skin
+'qbfind' => 'N̕am',
+'qbbrowse' => 'Sendra',
+'qbedit' => 'Tońge',
+'qbpageoptions' => 'Noa sakam',
+'qbmyoptions' => 'In̕anḱ sakamko',
+'qbspecialpages' => 'Asokay teaḱ sakamko',
+'faq' => 'Baḍae kupuliko',
+
+# Vector skin
+'vector-action-addsection' => 'Asol katha joṛaome',
+'vector-action-delete' => 'Giḍi',
+'vector-action-move' => 'Ocok',
+'vector-action-protect' => 'Bańcao',
+'vector-action-undelete' => 'Bań getgiḍi',
+'vector-action-unprotect' => 'Bodol rukhiyạ',
+'vector-view-create' => 'Tearme',
+'vector-view-edit' => 'So̠mpado̠n',
+'vector-view-history' => 'Jạṛ ńelme',
+'vector-view-view' => 'Paṛhaḱme',
+'vector-view-viewsource' => 'Ńamoḱaḱ ńelme',
+'actions' => 'Kạmi',
+'namespaces' => 'Ñutum jaiga',
+'variants' => 'Etaḱko',
+
+'errorpagetitle' => 'vul',
+'returnto' => "$1 te ruar-rok' me",
+'tagline' => 'Oka khoć',
+'help' => 'Go̠ṛo̠',
+'search' => 'Se̠ndra',
+'searchbutton' => 'Se̠ndra',
+'go' => 'Calaḱme',
+'searcharticle' => 'Calaḱme',
+'history' => 'Sakam reaḱ jạṛ',
+'history_short' => 'Jạṛ',
+'printableversion' => 'Chapai lekan version',
+'permalink' => 'Terejuge joṛao',
+'print' => 'Chapa',
+'view' => 'Udukme',
+'edit' => 'So̠mpado̠n',
+'create' => 'Tearme',
+'editthispage' => 'Noa sakam joṛaome',
+'create-this-page' => 'Noa sakam benao me',
+'delete' => 'muchau me',
+'deletethispage' => 'Noa sakam do get giḍikam',
+'undelete_short' => 'Bań get giḍika',
+'protect' => "banchao'",
+'protect_change' => 'Judạ',
+'protectthispage' => 'Noa sakam ban̕caome',
+'unprotect' => 'Bodol ban̕cao',
+'newpage' => 'Nãwã sakam',
+'talkpage' => 'Noa sakam galmaraome',
+'talkpagelinktext' => 'Ro̠ṛme',
+'specialpage' => 'Osokayteaḱ sakam',
+'personaltools' => 'Nijaḱ jontropạti',
+'postcomment' => 'Nãwã pahaṭa',
+'articlepage' => 'Menaḱ sakam uduḱme',
+'talk' => 'Galmarao',
+'views' => 'Ñel koyoḱ',
+'toolbox' => 'Jontopạti baḱso',
+'userpage' => 'Laṛcaṛićaḱ sakam uduḱme',
+'projectpage' => 'Porjakṭ sakam uduḱme',
+'imagepage' => 'Rẽt sakam uduḱme',
+'mediawikipage' => 'Mesag sakam uduḱme',
+'viewhelppage' => 'Goṛoaḱ sakam n̕elme',
+'viewtalkpage' => 'Galmarao ńelme',
+'otherlanguages' => 'Eṭagak pạrsi',
+'redirectedfrom' => '$1 khon ạcur heć akana',
+'redirectpagesub' => 'Bań sojhe sakam',
+'lastmodifiedat' => 'Noa sakam do sạjao hoena $1, $2 te',
+'protectedpage' => 'Rukhíạ sakamko',
+'jumpto' => 'Calaḱme :',
+'jumptonavigation' => 'Ñamme',
+'jumptosearch' => 'Sendra',
+'pool-timeout' => 'Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana',
+'pool-errorunknown' => 'Bań baḍayaḱ bhul',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite' => 'babo̠tre',
+'aboutpage' => 'Project: Babo̠t',
+'copyrightpage' => '{{ns:project}}: Eḱteạr',
+'currentevents' => 'Cạlit ghoṭnako',
+'currentevents-url' => 'Project: Nitaḱ evenṭ ko',
+'disclaimers' => 'Dạbi bạnuḱko',
+'disclaimerpage' => 'Project: Sadharon ḍiskleimarko(General disclaimer)',
+'edithelp' => 'Tońge goṛo',
+'edithelppage' => 'Help:So̠mpado̠n',
+'helppage' => 'Help: Bhitri renaḱ',
+'mainpage' => 'Mukhiạ Sakam',
+'mainpage-description' => 'Mukhiạ sakam',
+'policy-url' => 'Project:Ritiniti',
+'portal' => 'Khũṭ boloḱ ho̠r',
+'portal-url' => 'Project: Khũṭ bolokt họr',
+'privacy' => 'Nijaḱ eḱtear',
+'privacypage' => 'Project: Nijaḱ eḱteạr',
+
+'ok' => 'Ṭhik gea',
+'retrievedfrom' => '"$1" khon ñam ạgui',
+'youhavenewmessages' => 'Amaḱ do $1 ($2) menaḱa',
+'newmessageslink' => 'Nãwã sombat',
+'newmessagesdifflink' => 'Mucạt bodol',
+'youhavenewmessagesmulti' => 'Amaḱ nãwã mesag kodo',
+'editsection' => 'So̠mpado̠n',
+'editold' => 'So̠mpado̠n',
+'viewsourceold' => 'Ńamoḱ jayga',
+'editlink' => 'Tońge',
+'viewsourcelink' => '̕Ńel renaḱ ḍahar',
+'editsectionhint' => 'Sapṛao dhara: $1',
+'toc' => 'Menaḱaḱko',
+'showtoc' => 'Uduḱme',
+'hidetoc' => 'uku, Danaṅ',
+'collapsible-collapse' => 'Murchạo caba',
+'collapsible-expand' => 'Phaylao',
+'thisisdeleted' => 'N̕el se doho ruạṛ',
+'viewdeleted' => 'Ńelme',
+'feedlinks' => 'Jom oco',
+'site-atom-feed' => ' $1 Jom oco',
+'page-atom-feed' => '"$1" khon khudri jom',
+'red-link-title' => '$1 (niạ sakamdo bạnuḱa)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Sakam',
+'nstab-user' => 'Laṛcaṛicaḱ sakam',
+'nstab-media' => 'Midiạ sakam',
+'nstab-special' => 'Jạruṛ pata',
+'nstab-project' => 'Porject reaḱ sakam',
+'nstab-image' => 'Fail',
+'nstab-mediawiki' => 'Mesag',
+'nstab-template' => 'Sajao sakam',
+'nstab-help' => 'Goṛo sakam',
+'nstab-category' => 'Juṛu ko',
+
+# Main script and global functions
+'nosuchaction' => 'Noṅkanaḱ kạmi bạnuḱa',
+'nosuchspecialpage' => 'Noṅkanaḱ asokay sakam do banuḱa',
+
+# General errors
+'error' => 'bhul',
+'laggedslavemode' => "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
+'missing-article' => '"$1" $2 noa ńutumanaḱ sakhiyaxt sakamre olakanaḱ do bań ṅamoka.
+Noa hoy renaḱ karon do hoyoḱkana cabak tạrik pharak se noare joṛao sakam do get giḍi akana.
+Judi noa do karon bań hoylen khan, noa do am sopṭoyer re kạtictem ńam daṛeyaḱa.
+Daya katet́ noa do nonde [[Special:ListUsers/sysop|administrator]], ṭhen lạime, URL hotete.',
+'missingarticle-rev' => '(Nãwã aro#: $1)',
+'missingarticle-diff' => 'pharak',
+'internalerror' => 'Bhitri reaḱ bhul',
+'internalerror_info' => 'Bhitri reaḱ bhul:',
+'badarticleerror' => 'Noa sakamre kạmiko do baṅ puraolena.',
+'cannotdelete' => 'Nao sakam se rẽt do baṅ get giḍilena.
+Noa do pasec eṭaḱ hoṛ hotete lahare get giḍi akana.',
+'cannotdelete-title' => 'Sakam do baṅ get giḍiḱkana',
+'badtitle' => "barich' bishó́́́́y",
+'badtitletext' => 'Amaḱ nehorakaḱ sakam ńutum do bań puraoa, bạnuka, se be sudhrạo joṛao bhitri katha se bhitri wiki ńutum.
+Noa re do mit se aema bisó menaḱa oka do ńutumre bań beoharok.',
+'viewsource' => 'Ńamoḱaḱ ńelme',
+'protectedpagetext' => 'Noa sakam do ol toṅge lạgit́te do bańcao gea.',
+'namespaceprotected' => "Amaḱ do sakamko joṛao lạgit́te ạidạri banuḱ tama '''$1''' ńutumjayga.",
+'ns-specialprotected' => 'Asokay teaḱ sakamkodo baṅ oltoṅgea.',
+
+# Virus scanner
+'virus-scanfailed' => 'Skan do baṇ hoylena',
+'virus-unknownscanner' => 'Baṅ urum anṭvayras:',
+
+# Login and logout pages
+'yourname' => 'Beoboharicaḱ ńutum',
+'yourpassword' => 'Uku namber',
+'yourpasswordagain' => 'Arhõ oku namber olme',
+'remembermypassword' => 'In̕aḱ boloḱaḱ disạyme',
+'securelogin-stick-https' => 'Bhitri bolo kate HTTPS re soṅge tãhenme',
+'login' => "bolok' duar",
+'nav-login-createaccount' => 'Boloḱ́ duạr / ekaunt tearme',
+'userlogin' => 'Bhitri bolon / ekaunṭ tear',
+'userloginnocreate' => 'Bhitri bolo',
+'logout' => 'Bahre oḍoń',
+'userlogout' => 'Bahre oḍoń',
+'notloggedin' => 'Bhitri baṅ bolokana',
+'nologin' => 'Ekaunṭ do menaḱgea?',
+'nologinlink' => 'account tear me',
+'createaccount' => 'Ṭhai benaome',
+'gotaccount' => 'Ekaunṭ menaḱgeya?',
+'gotaccountlink' => 'Bhitri bolon',
+'userlogin-resetlink' => 'Amaḱ boloḱ talam cạbi sanamem hiṛińkeda?',
+'createaccountmail' => 'E-mail hotete',
+'createaccountreason' => 'Karon',
+'badretype' => 'Am do okaṭaḱ oku nambarkom em keda ona do baṅ milạolena.',
+'userexists' => 'Laṛcaṛicaḱ ńutum em hoyena ona do beohar hoyakana.
+Dayakatet́ eṭagaḱ ńutum bachaome.',
+'loginerror' => 'Bhitri bolok do vulgea',
+'createaccounterror' => 'Ekaunṭ do baṅ benao lena:',
+'loginsuccesstitle' => 'Bhitri boloḱ do moctege puraoena',
+'loginsuccess' => "'''Am do nitoḱ bolo menama {{SITENAME}} re",
+'nouserspecified' => 'Am do pusṭaote laṛcaṛićaḱ ńutum em hoyoḱtama.',
+'login-userblocked' => 'Nui laṛcaṛic doe esetgea. bhitri boloḱ ạidạri bań emoḱ kana.',
+'wrongpassword' => 'Bań milaoaḱ oku nambar em hoyakana.
+Daya kate arhõ mitdhom kurumuṭuyme.',
+'wrongpasswordempty' => 'Em hoyen oku nambar do cetge banuḱa.
+Daya katet́ arhõ kurumuṭuyme.',
+'passwordtooshort' => 'Oku nambar do kom katet́ hoyoḱ jạruṛa 6 olko mudre',
+'password-name-match' => 'Amaḱ oku nambar do amaḱ ńutum khon eṭaḱ hoyoḱ jạruṛtama.',
+'password-login-forbidden' => 'Noa laṛcaṛicaḱ ńutum ar oku nambar do ạnlekate baṅkana.',
+'mailmypassword' => 'E-mail reaḱ nãwã uko katha',
+'passwordremindertitle' => 'Nãwã nitlạgit oku nambar {{SITENAME}} lạgit́te',
+'noemail' => 'Nonḍe do laṛcaṛlạgit́te jahan oku nambar sap doho bạnuḱa.',
+'noemailcreate' => 'Am do mitṭen jewet e-mail ṭhikạna em jaruṛ menaḱtama.',
+'passwordsent' => '"$1" ṭhikạnate resṭariyen e-mail lạgit́te mitṭen oku nambar em hoyena.
+Daya kate ńam porte arhõ bhitri boloḱme.',
+'mailerror' => 'Vul mail em:',
+'emailconfirmlink' => 'Amaḱ e-mail ṭhikana do sạriyme.',
+'cannotchangeemail' => 'Ekaunṭ e-mail ṭhikạnakodo noa wiki re baṅ bodoloḱ kana.',
+'accountcreated' => 'Ekaunṭ do teyarena',
+'accountcreatedtext' => '$1 lạgit́te ekaunṭ do benaoena.',
+'createaccount-title' => '{{SITENAME}} lạgit́te ekaunṭ benao',
+'createaccount-text' => 'Okoe co am lạgit́te mitṭen ekaunṭko amaḱ e-mail ṭhikạna lạgit {{SITENAME}} re ($4) ńutum "$2", oku nambar "$3".
+Am do mesagem baṅ daṛeyaḱa, judi noa ekaunṭ do vulge benaolen khan.',
+'login-abort-generic' => 'Amaḱ bhitri boloḱ do baṅ hoylena - batena.',
+'loginlanguagelabel' => 'katha: $1',
+
+# Change password dialog
+'resetpass' => 'Oku nambar bodol',
+'resetpass_header' => 'Ekaunṭ oku namber bodol',
+'oldpassword' => 'Mare uku nombor',
+'newpassword' => 'Nãwã oku nomber',
+'retypenew' => 'Doṛhate oku namber olme',
+'resetpass_submit' => 'Oku namber joṛao ar bhitri bolok',
+'resetpass_success' => 'Amaḱ oku namber do napayte bodolena!
+Nitoḱ do am bhitritem boloḱkana...',
+'resetpass_forbidden' => 'Oku namber do baṅ bodoloklena',
+'resetpass-no-info' => 'Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.',
+'resetpass-submit-loggedin' => 'Oku namber bodol',
+'resetpass-submit-cancel' => 'Bạgi',
+
+# Special:PasswordReset
+'passwordreset' => 'Nãwãte oku nambar emme',
+'passwordreset-legend' => 'Nãwãte oku nambar emme',
+'passwordreset-username' => 'Beoharicaḱ ńutum:',
+'passwordreset-email' => 'E-mail ṭhikạna:',
+'passwordreset-emailelement' => 'Beoharicaḱ ńutum:
+Nit lạgit oku nambar:',
+'passwordreset-emailsent' => 'Mitṭen disạ ruaṛ e-mail do kulena.',
+'passwordreset-emailsent-capture' => 'Mit́ṭen disạ ruaṛaḱ e-mail dokulena, oka do latarre ńeloḱ kana.',
+'passwordreset-emailerror-capture' => 'Mit́ṭen disạ ruạṛ e-mail do hatoena, oka do latarre ńelok kana, menkhan beoharic ṭhen do baṇ seṭerlena.',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mail ṭhikạna do bodolme',
+'changeemail-header' => 'Ekaunṭ e-mail ṭhikạna do bodolme',
+'changeemail-text' => 'Amaḱ e-mail ṭhikạna bodol lạgit́te noa forom purao me. Am do noa sariyaḱ lạgit́te amaḱ oku nambar em jạruṛtama.',
+'changeemail-no-info' => 'Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.',
+'changeemail-oldemail' => 'Nitaḱ e-mail ṭhikạna:',
+'changeemail-newemail' => 'Nãwã e-mail ṭhikạna:',
+'changeemail-none' => '(Okaṭaḱ hõ baṅ)',
+'changeemail-submit' => 'E-mail bodolme',
+'changeemail-cancel' => 'Badme',
+
+# Edit page toolbar
+'bold_sample' => 'Moṭa onol',
+'bold_tip' => 'Moṭa onol',
+'italic_sample' => 'Beka onol',
+'italic_tip' => 'Beka onol',
+'link_sample' => 'Joṛaotet́ reaḱ bohoḱ',
+'link_tip' => 'Bhitri reak joṛaotet́',
+'extlink_sample' => 'http://www.nạmuna.makaṛgạṭi ạmạli',
+'extlink_tip' => 'Baherenaḱ jońṛao (disạyme htt://prefix)',
+'headline_sample' => 'Bohok katha',
+'headline_tip' => 'level 2 guḍkatha',
+'nowiki_sample' => 'Begor format olko bhoraome',
+'nowiki_tip' => 'wiki formatting bạgiyaḱme',
+'image_tip' => 'Tol Fael',
+'media_tip' => 'file reaḱ jońṛao',
+'sig_tip' => 'Amaḱ suhi sãote okte',
+'hr_tip' => 'Barabạri dag',
+
+# Edit pages
+'summary' => 'Guṭ katha',
+'subject' => 'Bisoy/Bohoḱ katha:',
+'minoredit' => 'Noa do hudiń joṛao kami',
+'watchthis' => 'Noa sakam ńelme',
+'savearticle' => 'Sakam sebhme',
+'preview' => 'Ńel, Unuduḱ',
+'showpreview' => 'Unuduḱ',
+'showlivepreview' => 'Jewet uduk',
+'showdiff' => 'Bodolko ńeloḱma',
+'anoneditwarning' => "'''Sabdhan:''' amdo begor logkatem bolowakana.
+Amaḱ IP ṭhikana do noa sakam sompadon jạṛre rekorḍoḱa.",
+'anonpreviewwarning' => '"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa."',
+'newarticle' => '(Nãwa)',
+'newarticletext' => 'Am do okaṭaḱ somporko sakamem pańjayetkan ona do nito hạbic banuka.
+Sakam benao lạgitte, noa latar baksore ol ehoṕme
+Am do judim vul lekahan, amaḱ sendray jaygare "ruạṛ" baṭon linme.',
+'noarticletext' => 'Nitoḱ noa sakamre do ol bạnuḱa.
+
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
+or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
+'noarticletext-nopermission' => 'Noa sakamre do nitoḱ o̠l banuḱa.
+
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
+'previewnote' => "'''Disạyme noa do eken ńeln̕am lạgit.'''
+Amaḱ bodolaḱ kodo nit habićte bań ban̕cao akana!",
+'editing' => 'Sampadon; joṛao',
+'creating' => 'Benao',
+'editingsection' => 'Joṛao $1 (hạṭiń)',
+'editingcomment' => 'Joṛao',
+'yourtext' => 'Amaḱ ol',
+'templatesused' => 'Noa sakamre beoharen phormat se phormatko',
+'template-protected' => 'Rukhiạ',
+'template-semiprotected' => '(Kạṭic-rukhiyạ)',
+'hiddencategories' => 'Noa sakam do mitṭen hoṛkanay',
+'permissionserrorstext-withaction' => 'Amaḱ do aydạri bạnuḱtama, Noa karon pan̕jay lạgitte',
+'recreate-moveddeleted-warn' => "'''Sontorokme: am do arhõ doṛhate sakamem teyareda oka do sedayre get giḍiyen.
+Am do gunạnme cet́ noa joṛao kạmi am lạgit́te ganoḱ ase bań.
+Noa get ar tala ocok sakam nonḍe em hoyena dhok lagit́te.",
+'moveddeleted-notice' => 'Noa sakam do get giḍiyakana.
+Get ar ocoḱ giḍi sakam do latarre emakan reference lạgit em hoena.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '"Sontoroḱme" Noa format do lạṭu geya.
+Thoṛa format do noare banuḱana.',
+'post-expand-template-inclusion-category' => 'Sakamko oka borḍre noa tahẽna ona doe paromkeda',
+
+# History pages
+'viewpagelogs' => 'Noa sakam reaḱ cạbi udukme',
+'currentrev-asof' => 'Mucạt nãwã aroy',
+'revisionasof' => 'Nãwã aro sakam 1',
+'revision-info' => 'Ńel/pańja ruạṛ $1 khon $2',
+'previousrevision' => 'Pạhilaḱ paṛhao ruạṛ',
+'nextrevision' => "nãwate n'el ruar",
+'currentrevisionlink' => 'Nitoḱaḱ nãwa aroy',
+'cur' => 'Boge',
+'next' => 'Laha seć',
+'last' => 'Laha renaḱ',
+'page_first' => 'Pahilaḱ',
+'page_last' => 'Mucạt́aḱ',
+'history-fieldset-title' => 'Sendray jaṛ',
+'history-show-deleted' => 'khạli get giḍiyaḱ koge',
+'histfirst' => "adi laha-ak'",
+'histlast' => 'Nahak',
+
+# Revision feed
+'history-feed-title' => 'Jạṛ nãwã aroy',
+'history-feed-item-nocomment' => 're',
+
+# Revision deletion
+'rev-delundel' => 'ńeloḱ/danaṅ',
+'revdel-restore' => 'Judạ lekate ńel',
+'revdel-restore-deleted' => 'giḍikaḱ ńel ruạṛ',
+'revdel-restore-visible' => 'Ńeloḱ leka paṛhao ruạṛ',
+
+# Merge log
+'revertmerge' => 'bań mit́',
+
+# Diffs
+'history-title' => '"$1" noa jạṛ nãwã aroy',
+'lineno' => 'Sạr $1:',
+'compareselectedversions' => 'Noa barea nãwã bachawanaḱ talare tolonayme',
+'editundo' => 'ruạṛ',
+
+# Search results
+'searchresults' => 'Se̠ndra fo̠l',
+'searchresults-title' => '"$1" renaḱ Sẽndra phol',
+'prevn' => 'Laha reaḱ {{PLURAL:$1|$1}}',
+'nextn' => 'Táyom teaḱ {{PLURAL:$1|$1}}',
+'prevn-title' => 'Laha renaḱ sakam $1 {{PLURAL:$1|result|results}}',
+'nextn-title' => 'Tayom $1 {{PLURAL:$1|result|results}}',
+'shown-title' => 'Mit́ ṭen kateć sakam $1 {{PLURAL:$1|result|results}} nelmẽ',
+'viewprevnext' => 'Ńelme ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Noa wiki re do \"[[:\$1]] ńutum sakam menaḱa",
+'searchmenu-new' => 'wiki re [[:$1]]nãwã sakam tear',
+'searchprofile-articles' => 'Menaḱaḱ sakamko',
+'searchprofile-project' => 'Go̠ṛo ar Project sakam',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Sanamak koge',
+'searchprofile-advanced' => 'Sompadon',
+'searchprofile-articles-tooltip' => '$1 re ñelme',
+'searchprofile-project-tooltip' => '$1 re sẽndraeme',
+'searchprofile-images-tooltip' => 'File sendra',
+'searchprofile-everything-tooltip' => 'Sanam ko modre sẽndra ( roṛ sakam modre hõ)',
+'searchprofile-advanced-tooltip' => 'Judạ ńutum re sẽndra',
+'search-result-size' => 'bạyiṭ aema bạyiṭ',
+'search-redirect' => '($1 te sujhi doṛha )',
+'search-section' => '(Pahaṭa $1)',
+'search-suggest' => 'Am do cet́ $1 em menocoyet tãhẽkana',
+'searchrelated' => 'songenko',
+'searchall' => 'Sanam',
+'showingresultsheader' => "'''$4''' lạgit́ {{PLURAL:$5|Pho̠l ńamoḱ́akan - '''$1''' of '''$3'''|Pho̠l ńamoḱ́akan '''$1 - $2''' of '''$3'''}}",
+'search-nonefound' => 'Kupuli leka roṛruạṛ bạnuḱa',
+
+# Preferences page
+'mypreferences' => 'Iñaḱ pạsindko',
+'youremail' => 'E-mail:',
+'yourrealname' => 'Sạ̣ri ńutum',
+'prefs-help-email' => 'E-mail ṭhikana do bạṛtitege, menkhan uku namber nãwãte benao jạruṛa, am do amaḱ uku nomborem hiṛiń keda.',
+'prefs-help-email-others' => 'Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.
+Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'noa sakam joṛao',
+
+# Recent changes
+'recentchanges' => 'Nãwã bo̠do̠lko',
+'recentchanges-legend' => 'Nahaḱ bodol teaḱko',
+'recentchanges-label-newpage' => 'Noa sompadon do nãwã mint́ṭen sakame tearkeda',
+'recentchanges-label-minor' => 'Noado hudiń mạchi sompadonkana',
+'recentchanges-label-bot' => 'Noa sompadon do bot darate purauena',
+'recentchanges-label-unpatrolled' => 'Noa sompadon do ńit́ hạbić baṅ ńel ńamakana',
+'rcnotefrom' => '$2 habić bodolak ko do latare ńeloḱkana',
+'rclistfrom' => 'Nãwã bodolko uduḱme $1 khon ehoṕkate',
+'rcshowhideminor' => '$1 kaṭic culuń tońge',
+'rcshowhidebots' => ' boṭko $1',
+'rcshowhideliu' => 'Beoharićaḱ boloḱ $1',
+'rcshowhideanons' => '$1 Nũtum bańa bebohariḱ',
+'rcshowhidemine' => '$1 ińaḱ tońge',
+'rclinks' => '$2 din lahare $1 bodol unuduḱme <br />$3',
+'diff' => 'Judạ',
+'hist' => 'Jạr',
+'hide' => 'Danaṅ',
+'show' => 'Udugme',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Purạote uduḱ',
+'rc-enhanced-hide' => 'Purạo cuku',
+
+# Recent changes linked
+'recentchangeslinked' => 'Sãotenaḱ bodolko',
+'recentchangeslinked-toolbox' => 'Noṛjoṛ palaṭko',
+'recentchangeslinked-title' => 'Bodolaḱko do "$1" sãote joṛao geya',
+'recentchangeslinked-noresult' => 'Joṛao sakam re emoḱ oktere jahanaḱ bodolko bạnuḱa.',
+'recentchangeslinked-summary' => "Noa do ona tạlika kana oka do nebetarge bodol hoyakan oka do asokayte hatao akan sakam khon.
+
+[[Special:Watchlist|your watchlist]] renaḱ sakamko do '''bold''' .",
+'recentchangeslinked-page' => 'sakạm ńutum',
+'recentchangeslinked-to' => 'Joṛaoaḱ sakamre ńel ocoyme emaḱ sakam bạgi katet',
+
+# Upload
+'upload' => 'Fael aploḍme',
+'uploadlogpage' => 'Chạbi do uthạome',
+'filedesc' => 'Guṭ katha',
+'uploadedimage' => 'Rakaṕ hoyena',
+
+'license' => 'Laisence benao',
+'license-header' => 'Laisense benao',
+
+# File description page
+'file-anchor-link' => 'Re̕t',
+'filehist' => 'Fael renaḱ Jạṛ',
+'filehist-help' => 'date re click me/somóy re click me fail reak obostha nel lagit',
+'filehist-revert' => 'Lahaleka',
+'filehist-current' => 'Nitaḱ',
+'filehist-datetime' => '̣Tạrikh/So̠mo̠y',
+'filehist-thumb' => 'Ṭip',
+'filehist-thumbtext' => '$1 lekan thambnail varson',
+'filehist-user' => 'Laṛcaṛić',
+'filehist-dimensions' => 'Maṕ',
+'filehist-comment' => 'Roṛ',
+'imagelinks' => 'Fael bebohar',
+'linkstoimage' => 'Noa sakam do niạ rẽtre/fayel joṛao menaḱa',
+'nolinkstoimage' => 'Nonḍe do noa são joṛao sakam banuka',
+'sharedupload-desc-here' => 'Noa rẽt do nonḍe khon- $1 ar paseć eṭaḱaḱ porjekṭko beoharakana.
+Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
+
+# Random page
+'randompage' => 'Joṛao sakam',
+
+# Statistics
+'statistics' => 'Halot',
+
+'disambiguationspage' => 'sujhi',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|baiṭ|baiṭ}}',
+'nmembers' => 'Sãoten/ Sãotenko',
+'prefixindex' => 'Sanam sakam re joṛao menaḱ',
+'usercreated' => 'Ayo baba: tạrikh okte',
+'newpages' => 'Nãwa Patako',
+'move' => 'Ocoḱme, Kulme',
+
+# Book sources
+'booksources' => 'Puthi ńamoḱ ṭhại/jayga',
+'booksources-search-legend' => 'Puthi reak ṭhai sendrayme',
+'booksources-go' => 'Calaḱme',
+
+# Special:Log
+'log' => 'Cạbiko',
+
+# Special:AllPages
+'allpages' => 'joto sakam',
+'alphaindexline' => '$1 hạbić $2',
+'allarticles' => 'Sanam sakam',
+'allpagessubmit' => 'Calaḱme',
+
+# Special:Categories
+'categories' => 'rokom sokom',
+
+# Special:LinkSearch
+'linksearch-line' => '$2 joṛao menaḱa $2re',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Laṛcaṛićaḱ tear cạbi',
+
+# Special:ListGroupRights
+'listgrouprights-members' => 'Saõtenkoaḱ tạlika',
+
+# E-mail user
+'emailuser' => 'Nui beoharić e-mail emayme',
+
+# Watchlist
+'watchlist' => "Inak' n'el ko",
+'mywatchlist' => 'Iñak jagarna tạlikạ',
+'watchlistfor2' => 'Lạgit',
+'watch' => 'Ńelme',
+'unwatch' => "bang nelok' a",
+'wlshowlast' => 'Mucạt 1 ghonta mucạt 2 maha uduḱme',
+'watchlist-options' => 'Ńelok tạlika reak sonketko',
+
+# Delete
+'actioncomplete' => 'kami Chabae-ena',
+'actionfailed' => 'Kami bang hoe-lena',
+'dellogpage' => 'Mãrao log',
+
+# Rollback
+'rollbacklink' => 'Ghurlạo ạcur',
+
+# Protect
+'protectlogpage' => 'Rukhiyạy tala cạbi',
+'protectedarticle' => 'Rukhiyạre menaḱa',
+'protectcomment' => 'karon',
+'protectexpiry' => 'Cabaḱ',
+
+# Undelete
+'undeletelink' => 'Ńel/doho ruạṛ',
+'undeleteviewlink' => 'Ńel',
+
+# Namespace form on various pages
+'namespace' => 'Ńutum reaḱ ṭhai',
+'invert' => 'Seć bachao',
+'blanknamespace' => 'Mukhiạ̣',
+
+# Contributions
+'contributions' => 'Beharićaḱ Kạmiko',
+'contributions-title' => 'Laṛcaṛicaḱ kạmiko lạgit',
+'mycontris' => 'Ińaḱ kạmiko',
+'contribsub2' => '$1 ($2) lạgitte',
+'uctop' => '(coṭ utạr)',
+'month' => 'Cando khon (ar etohopreaḱ)',
+'year' => "Nia serma reak' pahil khoch'",
+
+'sp-contributions-newbies' => 'Nãwã ekaunṭ lạgit kạmiko uduḱme',
+'sp-contributions-blocklog' => 'Tala eset',
+'sp-contributions-uploads' => 'Rakaṕme',
+'sp-contributions-logs' => 'Tala',
+'sp-contributions-talk' => 'Roṛ',
+'sp-contributions-search' => 'Kạmiko emoḱ lạgitte sendrayme',
+'sp-contributions-username' => 'IP ṭhikạna se laṛcaṛićaḱ n̕utum',
+'sp-contributions-toponly' => 'Khạli nahaḱ nãwã aroyen joṛao kamiko udukme',
+'sp-contributions-submit' => 'Sendra',
+
+# What links here
+'whatlinkshere' => 'Cet́ link ko no̠nḍe do',
+'whatlinkshere-title' => 'Noa sakam do 1 sakam tuluc joṛao menaḱa',
+'whatlinkshere-page' => 'Sakam',
+'linkshere' => 'Noa sakam do joṛao menaka:',
+'nolinkshere' => 'Sakamko joṛao bạnuḱa',
+'isredirect' => 'Bań sojhe sakam',
+'istemplate' => 'Ar mit́ teć sãote joṛao',
+'isimage' => 'Ret joṛao',
+'whatlinkshere-prev' => 'Tayom renaḱ Táoy renaḱko',
+'whatlinkshere-next' => 'Laha renaḱ Laha renaḱko',
+'whatlinkshere-links' => 'Joṛaoko',
+'whatlinkshere-hideredirs' => '$1 acurgeya',
+'whatlinkshere-hidetrans' => 'Bodolaḱ danaṅ',
+'whatlinkshere-hidelinks' => 'Joṛao danaṅ se uduḱme',
+'whatlinkshere-hideimages' => 'phoṭo em',
+'whatlinkshere-filters' => 'Sapha',
+
+# Block/unblock
+'ipboptions' => '2 Ghonṭa : 2 hours, 1 maha:1 day, 3 maha : 3 days,1 hapta :1 week, 2 hapta : 2 weeks, 1 cando :1 month, 3 cando : 3 months,6 cando :6 months, 1 serma :1 year, Aemamaha : infinite',
+'ipblocklist' => 'Beoharic esetgeyay',
+'blocklink' => 'Eset',
+'unblocklink' => 'bań block',
+'change-blocklink' => 'block judạ',
+'contribslink' => 'em daṛeaḱ',
+'blocklogpage' => 'Tala eset',
+'blocklogentry' => 'Eset [[$1]] sãote cabaḱ okte oka do $2 $3',
+'block-log-flags-nocreate' => 'Ekaunṭ benao do bondogeya',
+
+# Move page
+'movelogpage' => 'Tala cạbi ocoḱme',
+'revertmove' => 'ruạr agu',
+
+# Export
+'export' => 'Aguyen sakamko',
+
+# Namespace 8 related
+'allmessagesname' => 'Ńutum',
+'allmessagesdefault' => 'Bań bhul mesag ol',
+
+# Thumbnails
+'thumbnail-more' => 'Lạṭui mẽ',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Amak bebohar sakam',
+'tooltip-pt-mytalk' => 'Amaḱ katha ro̠ṛrenaḱ́ pata',
+'tooltip-pt-preferences' => 'Amaḱ Kusíyaḱ',
+'tooltip-pt-watchlist' => 'Mit́ṭen tạlika okaṭak am do nãwã aroy lạgitem ńeleḱkan',
+'tooltip-pt-mycontris' => 'Amaḱ kạmi reaḱ tạlika',
+'tooltip-pt-login' => 'Am do log in lagit́ metao am kana; menkhan noa do jarur bań kana',
+'tooltip-pt-logout' => 'Onḍńme',
+'tooltip-ca-talk' => 'Galmãrao bhitri renaḱ sakam lạgit́',
+'tooltip-ca-edit' => 'Noa sakam em edit daṛeaḱ. Daya kateć save laha re preview batton bebohar me.',
+'tooltip-ca-addsection' => 'Nãwã sekson sạrdi',
+'tooltip-ca-viewsource' => 'Noa sakam do poṭom gea
+Ona te source em ńel daṛeaḱ',
+'tooltip-ca-history' => 'Noa sakam renaḱ calao parom ńel ruạṛ',
+'tooltip-ca-protect' => 'ñia sakam bachaome',
+'tooltip-ca-delete' => 'nia sakam muchau me',
+'tooltip-ca-move' => 'Noa sakam kulme',
+'tooltip-ca-watch' => 'Noa sakam do amaḱ ńelok tạlikare joṛaome',
+'tooltip-ca-unwatch' => 'Amaḱ ńeloḱ tạlika khon noa sakam bagiyam',
+'tooltip-search' => 'Sendra {{Saiṭñitum}}',
+'tooltip-search-go' => 'Mitṭen sakamre calaḱme one okare noa ńutum menaḱa',
+'tooltip-search-fulltext' => 'Noa ol ńam lạgit sakamko ńelme',
+'tooltip-p-logo' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-mainpage' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-mainpage-description' => 'Mukhiạ sakamre calaḱme',
+'tooltip-n-portal' => 'Niạ pro̠je̠ḱ́ṭreaḱ Biso̠yko, Cet́́em ceka daṛia,Okare̠ sendra ñamoḱ́a',
+'tooltip-n-currentevents' => 'Nitaḱ events re jos hudis ńãm me',
+'tooltip-n-recentchanges' => 'Uiki nãhaḱ palaṭrenaḱ́ tạlikạ',
+'tooltip-n-randompage' => 'Ãr hõ sakam ko agui mẽ',
+'tooltip-n-help' => 'Sendra ñamreaḱ jayga',
+'tooltip-t-whatlinkshere' => 'Sanam wiki sakam renaḱ list ar link do nonde',
+'tooltip-t-recentchangeslinked' => 'Noa sakam re nitaḱ bodol akan sakam renaḱ linked',
+'tooltip-feed-atom' => 'Noa sakam lạgit́ atom jomaḱ',
+'tooltip-t-contributions' => 'Beoharićak kami reaḱ tạ̣lika',
+'tooltip-t-emailuser' => 'Nui beoharić mitṭen e-mail kulayme',
+'tooltip-t-upload' => 'Failko aploḍ̣me',
+'tooltip-t-specialpages' => 'Jạruṛ patakureaḱ tạlikạ',
+'tooltip-t-print' => 'Printoḱ lekan sakam',
+'tooltip-t-permalink' => 'Terejuge joṛaokam ñel sakam',
+'tooltip-ca-nstab-main' => 'Bahal sakam ńel me',
+'tooltip-ca-nstab-user' => 'Beoharićaḱ sakam uduḱme',
+'tooltip-ca-nstab-special' => 'Noa do nij/bises sakam kana, amem menle rehõ bam joṛao dareaḱa',
+'tooltip-ca-nstab-project' => "project page nel' me",
+'tooltip-ca-nstab-image' => 'Fael sakam ńel',
+'tooltip-ca-nstab-template' => 'Forom uduḱme',
+'tooltip-ca-nstab-category' => 'Rokom sokom sakamko udukme',
+'tooltip-minoredit' => 'Noa do huḍiń joṛao lekate lekhay me',
+'tooltip-save' => 'Bodolaḱko rukhiyayme',
+'tooltip-preview' => 'Amaḱ bodolaḱ uduḱme, noa beoharme ạuri rukhiyayre',
+'tooltip-diff' => 'Uduḱme okaṭaḱ onolem bodolakada',
+'tooltip-compareselectedversions' => 'Noa barea sakam talareaḱ bepaneyaḱ nãwã aróme',
+'tooltip-watch' => 'Amaḱ ńeloḱ sakamre noa do dohoyme',
+'tooltip-rollback' => '"Ghurlạ ạcur" noa sakam taṛam ruạṛ ńel sapha ona do amaḱ mũcạt́ mit́ dhom click re',
+'tooltip-undo' => 'Noa joṛao kạmire ulṭao "bạgiyaḱme" ar ńeloḱ lekate noa joṛao jhicme. Noa do am guḍ karon joṛaoe ektiyariye emama.',
+'tooltip-summary' => 'Khaṭote guṭ katha bhoraome',
+
+# Info page
+'pageinfo-header-watchlist' => 'Ńeloḱ tạlika',
+'pageinfo-header-views' => 'Ńelme',
+'pageinfo-subjectpage' => 'Sakam',
+'pageinfo-talkpage' => 'Galmarao sakam',
+'pageinfo-watchers' => 'Ńeńelkoaḱ nombor',
+
+# Browsing diffs
+'previousdiff' => "mareak' kamiko",
+'nextdiff' => 'Nãwã joṛao',
+
+# Media information
+'file-info-size' => '$1 x $2 pixels, file size: $3, MIME type: $4',
+'file-nohires' => 'Aema resulation nondḍe banuḱa',
+'show-big-image' => 'Purạo resulation',
+
+# Bad image list
+'bad_image_list' => 'Format do latar re leka',
+
+# Metadata
+'metadata' => 'Meṭa khobor',
+'metadata-help' => 'Noa rẹt redo bạṛti kathako menaḱa, paseć noa do ḍejiṭal kemera se skenar bebohar hoy kate ḍijiṭal benao. Judi noa ret noa reaḱ asolak khon nãwã aro lenkhan, paseć sanamaḱko thoṛa bań sodoroḱa noa retredo.',
+'metadata-fields' => 'Noa ciṭhire menaḱ photo reaḱ metadata jayga ṭalika do photo reaḱ sakamreye uduga, tinre ona metadata tibil do cabaḱa.
+Eṭagaḱ sanamko do ońkage eset tahẽna.
+Benao, Teyar
+Moḍel
+tạrik okte asolak
+hire okte
+f nombor
+isospeeddratings
+jeleń',
+
+# External editor support
+'edit-externally' => 'Noa rẽt tońge joṛao lạ̣gitte bahre reaḱ koejoń beoharme',
+'edit-externally-help' => '(Nonḍe ńelme [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] bạṛtite baḍay lạgit)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'Sanam, sanamak, sanamko',
+'namespacesall' => 'sanam',
+'monthsall' => 'Sanamak',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Jońgṛao bodolaḱko ńel',
+'watchlisttools-edit' => 'Ńelok tạlika ńel ar joṛao',
+
+# Special:SpecialPages
+'specialpages' => 'Jạruṛ patako',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Tag]] saphay:',
+
+);
'listingcontinuesabbrev' => 'pokrač.',
'index-category' => 'Indexované stránky',
'noindex-category' => 'neindexované stránky',
-'broken-file-category' => 'Stránky s poškodenými odkazmi súbor',
+'broken-file-category' => 'Stránky s odkazom na neexistujúci súbor',
'about' => 'Projekt',
'article' => 'Stránka s obsahom',
'note' => "'''Poznámka: '''",
'previewnote' => "'''Nezabudnite, toto je iba náhľad stránky, ktorú upravujete.
Zmeny ešte nie sú uložené!'''",
+'continue-editing' => 'Pokračovať v úpravách',
'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.
'parser-template-loop-warning' => 'Zistená slučka v šablónach: [[$1]]',
'parser-template-recursion-depth-warning' => 'Bol prekročený limit rekurzie šablón ($1)',
'language-converter-depth-warning' => 'Bolo prekročené obmedzenie hĺbky ($1) jazykového konvertora',
+'node-count-exceeded-category' => 'Stránky s priveľkým počtom uzlov',
+'node-count-exceeded-warning' => 'Stránka prekročila povolený počet uzlov',
+'expansion-depth-exceeded-category' => 'Stránky s priveľkou hĺbkou expanzie',
+'expansion-depth-exceeded-warning' => 'Stránka prekročila povolenú hĺbku expanzie',
# "Undo" feature
'undo-success' => 'Úpravu je možné vrátiť. Prosím skontrolujte tento rozdiel, čím overíte, že táto úprava je tá, ktorú chcete, a následne uložte zmeny, čím ukončíte vrátenie.',
'version-software' => 'Nainštalovaný softvér',
'version-software-product' => 'Produkt',
'version-software-version' => 'Verzia',
+'version-entrypoints' => 'URL vstupných bodov',
+'version-entrypoints-header-entrypoint' => 'Vstupný bod',
+'version-entrypoints-header-url' => 'URL',
# Special:FilePath
'filepath' => 'Cesta k súboru',
'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.'''
+'previewnote' => "'''Pomnite, da stran le predogledujete.'''
Vaših sprememb še nismo shranili!",
-'continue-editing' => 'Nadaljuj z urejanjem',
+'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.
'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',
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',
'minoredit' => 'мања измена',
'watchthis' => 'надгледај ову страницу',
'savearticle' => 'Сачувај страницу',
-'preview' => 'Преглед',
+'preview' => 'Претпреглед',
'showpreview' => 'Прикажи претпреглед',
'showlivepreview' => 'Тренутни преглед',
'showdiff' => 'Прикажи измене',
Погледајте ''$2'' за више детаља.",
'dellogpage' => 'Дневник брисања',
'dellogpagetext' => 'Испод је списак последњих брисања.',
-'deletionlog' => 'иÑ\81Ñ\82оÑ\80иÑ\98а брисања',
+'deletionlog' => 'Ð\94невник брисања',
'reverted' => 'Враћено на ранију измену',
'deletecomment' => 'Разлог:',
'deleteotherreason' => 'Други/додатни разлог:',
# Delete conflict
'deletedwhileediting' => "'''Упозорење''': ова страница је обрисана након што сте почели с уређивањем!",
-'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|је обрисао}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
+'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете, са следећим разлогом:
: ''$2''
Потврдите да стварно желите да направите страницу.",
'confirmrecreate-noreason' => 'Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.',
Pogledajte ''$2'' za više detalja.",
'dellogpage' => 'Dnevnik brisanja',
'dellogpagetext' => 'Ispod je spisak poslednjih brisanja.',
-'deletionlog' => 'istorija brisanja',
+'deletionlog' => 'Dnevnik brisanja',
'reverted' => 'Vraćeno na raniju izmenu',
'deletecomment' => 'Razlog:',
'deleteotherreason' => 'Drugi/dodatni razlog:',
'monday' => 'Дышанбә',
'tuesday' => 'Сешанбә',
'wednesday' => 'Чошанбә',
-'thursday' => 'Әјнә шәв',
+'thursday' => 'Ҹымә шәв',
'friday' => 'Әjнә',
'saturday' => 'Шанбә',
'sun' => 'Иша',
'category-empty' => "''Ын категоријә бы дәғиғәдә тәјлије.''",
'hidden-categories' => '{{PLURAL:$1|Нијони категоријә|Нијони категоријон}}',
'hidden-category-category' => 'Нијони категоријон',
-'category-subcat-count' => '{{PLURAL:$2|Ым катеријә әнчәх жинтонә жинә категоријонку ибарәте.|Ҹәми $2 категоријонку {{PLURAL:$1|жинә категоријә|$1 жинә категоријә}} нишо доә быә.}}',
+'category-subcat-count' => '{{PLURAL:$2|Ым категоријә әнчәх жинтонә жинә категоријонку ибарәте.|Ҹәми $2 категоријонку {{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 фајл}} бы категоријәдә.}}',
'edithelp' => 'Арајиш бо редактә кардеј',
'edithelppage' => 'Help:Арајиш бо сәрост кардеј',
'helppage' => 'Help:Мындәриҹот',
-'mainpage' => 'Јолә сәһифә',
-'mainpage-description' => 'Јолә сәһифә',
+'mainpage' => 'Әсосә сәһифә',
+'mainpage-description' => 'Әсосә сәһифә',
'policy-url' => 'Project:Ғајдон',
'portal' => 'Ҹәмјәт',
'portal-url' => 'Project:Ҹәмјәти портал',
'tooltip-search' => 'Нәве {{SITENAME}}',
'tooltip-search-go' => 'Гирәм һесте дырыст бәнә бы номи сәһифә бәврә дәвардеј',
'tooltip-search-fulltext' => 'Сәһифон пәјдо кардеј де ын мәтни',
-'tooltip-p-logo' => 'Дәвардеј бә јолә сәһифә',
-'tooltip-n-mainpage' => 'Дәвардеј бә јолә сәһифә',
-'tooltip-n-mainpage-description' => 'Дәвардеј бә јолә сәһифә',
+'tooltip-p-logo' => 'Дәвардеј бә әсосә сәһифә',
+'tooltip-n-mainpage' => 'Дәвардеј бә әсосә сәһифә',
+'tooltip-n-mainpage-description' => 'Дәвардеј бә әсосә сәһифә',
'tooltip-n-portal' => 'Нахшә барәдә, чич шымә базнејон ыјо кардеј, конҹо чич һесте',
'tooltip-n-currentevents' => 'Есәтнә һодисон сијоһи',
'tooltip-n-recentchanges' => 'Охонә дәгишон сијоһи',
* @author Goktr001
* @author Hanberke
* @author Hcagri
+ * @author Ijon
* @author Incelemeelemani
* @author Joseph
* @author Kaganer
'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',
Değişikliği yapan kullanıcının açıklaması: $PAGESUMMARY $PAGEMINOREDIT
Sayfayı değiştiren kullanıcıya erişim bilgileri:
-e-posta: $PAGEEDITOR_EMAIL
-viki: $PAGEEDITOR_WIKI
+E-posta: $PAGEEDITOR_EMAIL
+Viki: $PAGEEDITOR_WIKI
Bahsi geçen sayfayı ziyaret edinceye kadar sayfayla ilgili başka değişiklik bildirimi gönderilmeyecektir. İzleme listenizdeki tüm sayfalar bildirim durumlarını sıfırlayabilirsiniz.
'site-atom-feed' => '$1 Atom Медээ Агымы',
'page-rss-feed' => '«$1» RSS Медээ Агымы',
'page-atom-feed' => '«$1» Atom Медээ Агымы',
-'red-link-title' => '$1 (арынны чок)',
+'red-link-title' => '$1 (арны чок)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Арын',
* @author Rachitrali
* @author Reedy
* @author Wisesabre
+ * @author ZxxZxxZ
* @author לערי ריינהארט
* @author سمرقندی
* @author محبوب عالم
'userrights' => 'حقوقِ صارف کی نظامت',
'userrights-lookup-user' => 'گروہائے صارف کا انتظام',
'userrights-user-editname' => 'کوئی اسمصارف داخل کیجئے:',
-'editinguser' => "تبدیلئ حقوق برائے صارف '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "تبدیلئ حقوق برائے صارف '''[[صارف:$1|$1]]''' $2",
'userrights-groupsmember' => 'رکنِ:',
'userrights-reason' => 'وجہ:',
'userrights-no-interwiki' => 'دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.',
<?php
-/** Uzbek (O'zbek)
+/** Uzbek (Oʻzbek)
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
*
* @author Abdulla
* @author Behzod Saidov <behzodsaidov@gmail.com>
+ * @author Casual
+ * @author Lyncos
* @author Urhixidur
*/
$linkTrail = '/^([a-zʻʼ“»]+)(.*)$/sDu';
$messages = array(
+'underline-always' => 'Har doim',
+'underline-never' => 'Hech qachon',
+
# Dates
-'sunday' => 'Yakshanba',
-'monday' => 'Dushanba',
-'tuesday' => 'Seshanba',
-'wednesday' => 'Chorshanba',
-'thursday' => 'Payshanba',
-'friday' => 'Juma',
-'saturday' => 'Shanba',
-'sun' => 'Yak',
-'mon' => 'Dsh',
-'tue' => 'Ssh',
-'wed' => 'Chr',
-'thu' => 'Pay',
-'fri' => 'Jum',
-'sat' => 'Shn',
-'january' => 'yanvar',
-'february' => 'fevral',
-'march' => 'mart',
-'april' => 'aprel',
-'may_long' => 'may',
-'june' => 'iyun',
-'july' => 'iyul',
-'august' => 'avgust',
-'september' => 'sentabr',
-'october' => 'oktabr',
-'november' => 'noyabr',
-'december' => 'dekabr',
-'january-gen' => 'yanvarning',
-'february-gen' => 'fevralning',
-'march-gen' => 'martning',
-'april-gen' => 'aprelning',
-'may-gen' => 'mayning',
-'june-gen' => 'iyunning',
-'july-gen' => 'iyulning',
-'august-gen' => 'avgustning',
+'sunday' => 'Yakshanba',
+'monday' => 'Dushanba',
+'tuesday' => 'Seshanba',
+'wednesday' => 'Chorshanba',
+'thursday' => 'Payshanba',
+'friday' => 'Juma',
+'saturday' => 'Shanba',
+'sun' => 'Yak',
+'mon' => 'Dsh',
+'tue' => 'Ssh',
+'wed' => 'Chr',
+'thu' => 'Pay',
+'fri' => 'Jum',
+'sat' => 'Shn',
+'january' => 'yanvar',
+'february' => 'fevral',
+'march' => 'mart',
+'april' => 'aprel',
+'may_long' => 'may',
+'june' => 'iyun',
+'july' => 'iyul',
+'august' => 'avgust',
+'september' => 'sentabr',
+'october' => 'oktabr',
+'november' => 'noyabr',
+'december' => 'dekabr',
+'january-gen' => 'yanvarning',
+'february-gen' => 'fevralning',
+'march-gen' => 'martning',
+'april-gen' => 'aprelning',
+'may-gen' => 'mayning',
+'june-gen' => 'iyunning',
+'july-gen' => 'iyulning',
+'august-gen' => 'avgustning',
'september-gen' => 'sentabrning',
-'october-gen' => 'oktabrning',
-'november-gen' => 'noyabrning',
-'december-gen' => 'dekabrning',
-'jan' => 'yan',
-'feb' => 'fev',
-'mar' => 'mar',
-'apr' => 'apr',
-'may' => 'may',
-'jun' => 'iyn',
-'jul' => 'iyl',
-'aug' => 'avg',
-'sep' => 'sen',
-'oct' => 'okt',
-'nov' => 'noy',
-'dec' => 'dek',
+'october-gen' => 'oktabrning',
+'november-gen' => 'noyabrning',
+'december-gen' => 'dekabrning',
+'jan' => 'yan',
+'feb' => 'fev',
+'mar' => 'mar',
+'apr' => 'apr',
+'may' => 'may',
+'jun' => 'iyn',
+'jul' => 'iyl',
+'aug' => 'avg',
+'sep' => 'sen',
+'oct' => 'okt',
+'nov' => 'noy',
+'dec' => 'dek',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Turkum|Turkumlar}}',
-'category_header' => '"$1" turkumidagi maqolalar.',
-'subcategories' => 'Ostturkumlar',
-'category-empty' => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
-'hidden-categories' => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
-'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
+'pagecategories' => '{{PLURAL:$1|Turkum|Turkumlar}}',
+'category_header' => '"$1" turkumidagi maqolalar.',
+'subcategories' => 'Ostturkumlar',
+'category-empty' => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
+'hidden-categories' => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
+'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}}, hammasi boʻlib $2 ta sahifa mavjud.}}',
'listingcontinuesabbrev' => 'davomi',
'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
-'about' => 'Haqida',
-'newwindow' => '(yangi oynada ochiladi)',
-'cancel' => 'Voz kechish',
-'mytalk' => 'Suhbatim',
-'anontalk' => 'Bu IP uchun suhbat',
+'about' => 'Haqida',
+'newwindow' => '(yangi oynada ochiladi)',
+'cancel' => 'Voz kechish',
+'moredotdotdot' => 'Batafsil...',
+'mytalk' => 'Suhbatim',
+'anontalk' => 'Bu IP uchun suhbat',
'navigation' => 'Saytda harakatlanish',
-'and' => ' va',
+'and' => ' va',
# Cologne Blue skin
-'qbedit' => 'Tahrirlash',
+'qbedit' => 'Tahrirlash',
'qbspecialpages' => 'Maxsus sahifalar',
# Vector skin
-'vector-view-create' => 'Yarat',
-'vector-view-edit' => 'Tahrirla',
-'vector-view-history' => 'Tarix',
-'vector-view-view' => 'Mutolaa',
+'vector-action-delete' => 'O‘chirish',
+'vector-action-move' => 'Ko‘chirish',
+'vector-view-create' => 'Yarat',
+'vector-view-edit' => 'Tahrirla',
+'vector-view-history' => 'Tarix',
+'vector-view-view' => 'Mutolaa',
'vector-view-viewsource' => 'Manbasini koʻrsat',
-'actions' => 'Amallar',
-'namespaces' => 'Nomfazolar',
-'variants' => 'Variantlar',
-
-'errorpagetitle' => 'Xato',
-'returnto' => '$1 sahifasiga qaytish.',
-'tagline' => '{{SITENAME}} dan',
-'help' => 'Yordam',
-'search' => 'Qidirish',
-'searchbutton' => 'Qidirish',
-'go' => "O'tish",
-'searcharticle' => "O'tish",
-'history' => 'Sahifa tarixi',
-'history_short' => 'Tarix',
+'actions' => 'Amallar',
+'namespaces' => 'Nomfazolar',
+'variants' => 'Variantlar',
+
+'errorpagetitle' => 'Xato',
+'returnto' => '$1 sahifasiga qaytish.',
+'tagline' => '{{SITENAME}} dan',
+'help' => 'Yordam',
+'search' => 'Qidirish',
+'searchbutton' => 'Qidirish',
+'go' => "O'tish",
+'searcharticle' => 'O‘tish',
+'history' => 'Sahifa tarixi',
+'history_short' => 'Tarix',
'printableversion' => 'Bosma uchun versiya',
-'permalink' => 'Doimiy ishorat',
-'print' => 'Chop et',
-'view' => 'Koʻrish',
-'edit' => 'Tahrirlash',
-'create' => 'Yarat',
-'editthispage' => 'Sahifani tahrirla',
+'permalink' => 'Doimiy ishorat',
+'print' => 'Chop et',
+'view' => 'Koʻrish',
+'edit' => 'Tahrirlash',
+'create' => 'Yaratish',
+'editthispage' => 'Sahifani tahrirlash',
'create-this-page' => 'Bu sahifani yarat',
-'delete' => "O'chirish",
-'protect' => 'Himoyalash',
-'protectthispage' => 'Bu sahifani himoyala',
-'unprotect' => 'Himoyadan chiqarish',
-'newpage' => 'Yangi sahifa',
-'talkpage' => 'Bu sahifa haqida munozara',
+'delete' => 'O‘chirish',
+'protect' => 'Himoyalash',
+'protect_change' => 'o‘zgartirish',
+'protectthispage' => 'Ushbu sahifani himoyalash',
+'unprotect' => 'Himoyadan chiqarish',
+'newpage' => 'Yangi sahifa',
+'talkpage' => 'Bu sahifa haqida munozara',
'talkpagelinktext' => 'Munozara',
-'specialpage' => 'Maxsus sahifa',
-'personaltools' => 'Shaxsiy uskunalar',
-'postcomment' => 'Yangi boʻlim',
-'talk' => 'Munozara',
-'views' => "Ko'rinishlar",
-'toolbox' => 'Asboblar',
-'categorypage' => 'Turkum sahifasi',
-'viewtalkpage' => 'Munozara',
-'otherlanguages' => 'Boshqa tillarda',
-'redirectedfrom' => '($1dan yoʻnaltirildi)',
-'redirectpagesub' => 'Yoʻnaltiruvchi sahifa',
-'lastmodifiedat' => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
-'viewcount' => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
-'protectedpage' => 'Himoyalangan sahifa',
-'jumpto' => 'Oʻtish:',
+'specialpage' => 'Maxsus sahifa',
+'personaltools' => 'Shaxsiy uskunalar',
+'postcomment' => 'Yangi boʻlim',
+'talk' => 'Munozara',
+'views' => 'Ko‘rinishlar',
+'toolbox' => 'Asboblar',
+'categorypage' => 'Turkum sahifasi',
+'viewtalkpage' => 'Munozara',
+'otherlanguages' => 'Boshqa tillarda',
+'redirectedfrom' => '($1dan yoʻnaltirildi)',
+'redirectpagesub' => 'Yoʻnaltiruvchi sahifa',
+'lastmodifiedat' => 'Bu sahifa oxirgi marta $2, $1 sanasida tahrirlangan.',
+'viewcount' => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
+'protectedpage' => 'Himoyalangan sahifa',
+'jumpto' => 'Oʻtish:',
'jumptonavigation' => 'foydalanish',
-'jumptosearch' => 'Qidir',
+'jumptosearch' => 'Qidir',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => '{{SITENAME}} haqida',
-'aboutpage' => 'Project:Haqida',
-'copyright' => 'Kontent $1 ostidadir.',
-'currentevents' => 'Joriy hodisalar',
-'currentevents-url' => 'Project:Joriy hodisalar',
-'disclaimers' => 'Ogohlantirishlar',
-'disclaimerpage' => 'Project:Umumiy ogohlatirish',
-'edithelp' => 'Tahrirlash yordami',
-'edithelppage' => 'Help:Tahrirlash',
-'helppage' => 'Help:Mundarija',
-'mainpage' => 'Bosh sahifa',
+'aboutsite' => '{{SITENAME}} haqida',
+'aboutpage' => 'Project:Haqida',
+'copyright' => 'Kontent $1 ostidadir.',
+'currentevents' => 'Joriy hodisalar',
+'currentevents-url' => 'Project:Joriy hodisalar',
+'disclaimers' => 'Ogohlantirishlar',
+'disclaimerpage' => 'Project:Umumiy ogohlantirish',
+'edithelp' => 'Tahrirlash yordami',
+'edithelppage' => 'Help:Tahrirlash',
+'helppage' => 'Help:Mundarija',
+'mainpage' => 'Bosh sahifa',
'mainpage-description' => 'Bosh sahifa',
-'portal' => 'Jamoa portali',
-'portal-url' => 'Project:Jamoa portali',
-'privacy' => 'Konfidensiallik siyosati',
-'privacypage' => 'Project:Konfidensiallik siyosati',
-
-'retrievedfrom' => ' "$1" dan olindi',
-'youhavenewmessages' => 'Sizga $1 keldi ($2).',
-'newmessageslink' => 'yangi xabarlar',
-'newmessagesdifflink' => 'soʻnggi oʻzgarish',
-'editsection' => 'tahrirlash',
-'editold' => 'tahrir',
-'editlink' => 'tahrirla',
-'viewsourcelink' => 'manbasini koʻr',
-'editsectionhint' => 'Boʻlimni tahrirlash: $1',
-'toc' => 'Mundarija',
-'showtoc' => "Ko'rsatish",
-'hidetoc' => 'yashirish',
+'portal' => 'Jamoa portali',
+'portal-url' => 'Project:Jamoa portali',
+'privacy' => 'Konfidensiallik siyosati',
+'privacypage' => 'Project:Konfidensiallik siyosati',
+
+'retrievedfrom' => ' "$1" dan olindi',
+'youhavenewmessages' => 'Sizga $1 keldi ($2).',
+'newmessageslink' => 'yangi xabarlar',
+'newmessagesdifflink' => 'soʻnggi oʻzgarish',
+'editsection' => 'tahrirlash',
+'editold' => 'tahrir',
+'editlink' => 'tahrirla',
+'viewsourcelink' => 'manbasini koʻr',
+'editsectionhint' => 'Boʻlimni tahrirlash: $1',
+'toc' => 'Mundarija',
+'showtoc' => "Ko'rsatish",
+'hidetoc' => 'yashirish',
'collapsible-collapse' => 'Yashir',
-'collapsible-expand' => 'Koʻrsat',
-'red-link-title' => '$1 (sahifa yaratilmagan)',
+'collapsible-expand' => 'Koʻrsat',
+'page-atom-feed' => '«$1» — Atom-lenta',
+'red-link-title' => '$1 (sahifa yaratilmagan)',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Maqola',
-'nstab-user' => 'Foydalanuvchi sahifasi',
-'nstab-special' => 'Maxsus sahifa',
-'nstab-project' => 'Loyiha sahifasi',
-'nstab-image' => 'Fayl',
+'nstab-main' => 'Maqola',
+'nstab-user' => 'Foydalanuvchi sahifasi',
+'nstab-special' => 'Maxsus sahifa',
+'nstab-project' => 'Loyiha sahifasi',
+'nstab-image' => 'Fayl',
'nstab-template' => 'Andoza',
-'nstab-help' => 'Yordam sahifasi',
+'nstab-help' => 'Yordam sahifasi',
'nstab-category' => 'Turkum',
# General errors
-'error' => 'Xato',
-'badtitle' => 'Notoʻgʻri sarlavha',
-'viewsource' => 'Manbasini koʻrish',
+'error' => 'Xato',
+'badtitle' => 'Notoʻgʻri sarlavha',
+'viewsource' => 'Manbasini koʻrish',
'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
-'viewsourcetext' => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
+'viewsourcetext' => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
# Login and logout pages
-'logouttext' => "'''Siz saytdan muvaffaqiyatli chiqdingiz.'''
+'logouttext' => "'''Siz saytdan muvaffaqiyatli chiqdingiz.'''
{{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
-'yourname' => 'Foydalanuvchi nomi',
-'yourpassword' => "Maxfiy so'z",
-'yourpasswordagain' => "Maxfiy so'zni qayta kiriting",
-'remembermypassword' => "Hisob ma'lumotlarini shu kompyuterda eslab qolish (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'login' => 'Kirish',
+'yourname' => 'Foydalanuvchi nomi',
+'yourpassword' => 'Maxfiy soʻz',
+'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
+'remembermypassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kun|kun}} uchun)',
+'login' => 'Kirish',
'nav-login-createaccount' => 'Kirish / Hisob yaratish',
-'loginprompt' => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
-'userlogin' => 'Kirish / Hisob yaratish',
-'logout' => 'Chiqish',
-'userlogout' => 'Chiqish',
-'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
-'nologinlink' => 'Hisob yaratish',
-'createaccount' => 'Hisob yaratish',
-'gotaccount' => "Hisobingiz bormi? '''$1'''.",
-'gotaccountlink' => 'Kirish',
-'loginsuccesstitle' => 'Kirish muvaffaqiyatli amalga oshdi',
-'loginsuccess' => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
-'wrongpassword' => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
+'loginprompt' => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
+'userlogin' => 'Kirish / Hisob yaratish',
+'logout' => 'Chiqish',
+'userlogout' => 'Chiqish',
+'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
+'nologinlink' => 'Hisob yaratish',
+'createaccount' => 'Hisob yaratish',
+'gotaccount' => "Hisobingiz bormi? '''$1'''.",
+'gotaccountlink' => 'Kirish',
+'loginsuccesstitle' => 'Kirish muvaffaqiyatli amalga oshdi',
+'loginsuccess' => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
+'wrongpassword' => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
+'loginlanguagelabel' => 'Til: $1',
# Change password dialog
'retypenew' => 'Yangi mahfiy soʻzni qayta tering:',
# Edit page toolbar
-'bold_sample' => 'Qalin matn',
-'bold_tip' => 'Qalin matn',
-'italic_sample' => 'Kursiv',
-'italic_tip' => 'Kursiv',
-'link_sample' => 'Ishorat nomi',
-'link_tip' => 'Ichki ishorat',
-'extlink_sample' => 'http://www.example.com ishorat nomi',
-'extlink_tip' => 'Tashqi ishorat (http:// prefiksini unutmang)',
+'bold_sample' => 'Qalin matn',
+'bold_tip' => 'Qalin matn',
+'italic_sample' => 'Kursiv',
+'italic_tip' => 'Kursiv',
+'link_sample' => 'Ishorat nomi',
+'link_tip' => 'Ichki ishorat',
+'extlink_sample' => 'http://www.example.com ishorat nomi',
+'extlink_tip' => 'Tashqi ishorat (http:// prefiksini unutmang)',
'headline_sample' => 'Sarlavha',
-'image_tip' => 'Qoʻshilgan tasvir',
-'media_tip' => 'Faylga ishorat',
-'sig_tip' => 'Imzoingiz va sana',
+'image_tip' => 'Qoʻshilgan tasvir',
+'media_tip' => 'Faylga ishorat',
+'sig_tip' => 'Imzoingiz va sana',
# Edit pages
-'summary' => 'Qisqa izoh:',
-'minoredit' => 'Bu kichik tahrir',
-'watchthis' => 'Sahifani kuzatish',
-'savearticle' => 'Saqlash',
-'preview' => "Ko'rib chiqish",
-'showpreview' => "Ko'rib chiqish",
-'showdiff' => "O'zgarishlarni ko'rsatish",
-'anoneditwarning' => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
-'blockedtext' => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
+'summary' => 'Qisqa izoh:',
+'minoredit' => 'Bu kichik tahrir',
+'watchthis' => 'Sahifani kuzatish',
+'savearticle' => 'Saqlash',
+'preview' => 'Ko‘rib chiqish',
+'showpreview' => 'Ko‘rib chiqish',
+'showdiff' => 'O‘zgarishlarni ko‘rsatish',
+'anoneditwarning' => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
+'blockedtext' => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
Siz $1 yoki boshqa [[{{MediaWiki:Grouppage-sysop}}|administrator]] bilan bogʻlanib, arz qilishingiz mumkin.
You cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
Sizning hozirgi IP manzilingiz - $3, chetlashtirish raqamingiz - #$5. Arizaga bularni ilova qilishingiz mumkin.",
-'newarticle' => '(Yangi)',
-'newarticletext' => "Bu sahifa hali mavjud emas.
+'newarticle' => '(Yangi)',
+'newarticletext' => "Bu sahifa hali mavjud emas.
Sahifani yaratish uchun quyida matn kiritishingiz mumkin (qo'shimcha axborot uchun [[{{MediaWiki:Helppage}}|yordam sahifasini]] ko'ring).
Agar bu sahifaga xatolik sabab kelgan bo'lsangiz brauzeringizning '''orqaga''' tugmasini bosing.",
-'noarticletext' => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli loglarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
-'clearyourcache' => "'''Etibor bering:''' O'zgartirishlaringiz ko'rish uchun, yangi moslamalaringizning saqlashdan keyin, brauser keshini tozalash kerak:<br />
+'noarticletext' => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli loglarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
+'clearyourcache' => "'''Etibor bering:''' O'zgartirishlaringiz ko'rish uchun, yangi moslamalaringizning saqlashdan keyin, brauser keshini tozalash kerak:<br />
'''Mozilla / Firefox:''' ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari:''' ''Cmd+Shift+R'', '''Konqueror:''' ''F5'', '''Opera:''' ''Tools → Preferences'' orqali keshni tozalang.",
-'previewnote' => "'''Bu shunchaki ko'rib chiqish. O'zgarishlar hali saqlangani yo'q!'''",
-'editing' => '$1 tahrirlanmoqda',
-'editingsection' => '$1 (boʻlim) tahrirlanmoqda',
-'copyrightwarning' => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
+'previewnote' => "'''Bu shunchaki ko‘rib chiqish. O‘zgartirishlar hali saqlangani yo‘q!'''",
+'editing' => '$1 tahrirlanmoqda',
+'editingsection' => '$1 (boʻlim) tahrirlanmoqda',
+'copyrightwarning' => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
Agar yozganlaringiz keyinchalik tahrir qilinishi va qayta tarqatilishiga rozi bo'lmasangiz, u holda bu yerga yozmang.<br />
Siz shuningdek bu yozganlaringiz sizniki yoki erkin litsenziya ostida ekanligini va'da qilmoqdasiz.
'''MUALLIFLIK HUQUQLARI BILAN HIMOYALANGAN ISHLARNI ZINHOR BERUXSAT YUBORMANG!'''",
-'copyrightwarning2' => "Iltimos, shuni esda tutingki, {{SITENAME}} sahifalaridagi barcha matnlar boshqa foydalanuvchilar tomonidan tahrirlanishi, almashtirilishi yoki o'chirilishi mumkin. Agar siz yozgan ma'lumotlaringizni bunday tartibda tahrirlanishiga rozi bo'lmasangiz, unda uni bu yerga joylashtirmang.<br />
+'copyrightwarning2' => "Iltimos, shuni esda tutingki, {{SITENAME}} sahifalaridagi barcha matnlar boshqa foydalanuvchilar tomonidan tahrirlanishi, almashtirilishi yoki o'chirilishi mumkin. Agar siz yozgan ma'lumotlaringizni bunday tartibda tahrirlanishiga rozi bo'lmasangiz, unda uni bu yerga joylashtirmang.<br />
Bundan tashqari, siz ushbu ma'lumotlarni o'zingiz yozgan bo'lishingiz yoki ruxsat berilgan internet manzilidan yoki shu kabi erkin resursdan nusxa olgan bo'lishingiz lozim (Qo'shimcha ma'lumotlar ushun $1 sahifasiga murojaat qiling).
'''MUALLIFLIK HUQUQI QO'YILGAN ISHLARNI RUXSATSIZ BU YERGA JOYLASHTIRMANG!'''",
-'templatesused' => '{{PLURAL:$1|Template|Templates}} used on this page:',
-'template-protected' => '(himoyalangan)',
-'template-semiprotected' => '(yarim-himoyalangan)',
-'nocreatetext' => 'Ushbu sayt yangi sahifa yaratishni taqiqlagan.
+'templatesused' => 'Ushbu sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:',
+'template-protected' => '(himoyalangan)',
+'template-semiprotected' => '(yarim-himoyalangan)',
+'nocreatetext' => 'Ushbu sayt yangi sahifa yaratishni taqiqlagan.
Ortga qaytib, mavjud sahifani tahrirlashingiz yoki [[Special:UserLogin|tizimga kirishingiz]] mumkin.',
'recreate-moveddeleted-warn' => "'''Diqqat: Siz avval yoʻqotilgan sahifani yana yaratmoqchisiz.'''
Qulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
# History pages
-'viewpagelogs' => 'Ushbu sahifaga doir qaydlarni koʻrsat',
-'currentrev' => 'Hozirgi koʻrinishi',
-'currentrev-asof' => '$1dagi, joriy koʻrinishi',
-'revisionasof' => '$1 paytdagi koʻrinishi',
-'previousrevision' => '←Avvalgi koʻrinishi',
-'nextrevision' => 'Yangiroq koʻrinishi→',
+'viewpagelogs' => 'Ushbu sahifaga doir qaydlarni koʻrsat',
+'currentrev' => 'Hozirgi koʻrinishi',
+'currentrev-asof' => '$1dagi, joriy koʻrinishi',
+'revisionasof' => '$1 paytdagi koʻrinishi',
+'previousrevision' => '←Avvalgi koʻrinishi',
+'nextrevision' => 'Yangiroq koʻrinishi→',
'currentrevisionlink' => 'Hozirgi koʻrinishi',
-'cur' => 'joriy',
-'next' => 'keyingi',
-'last' => 'oxirgi',
-'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
+'cur' => 'joriy',
+'next' => 'keyingi',
+'last' => 'oxirgi',
+'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
(oxirgi) = avvalgi koʻrinish bilan farq, k = kichkina tahrir.',
-'histfirst' => 'Eng avvalgi',
-'histlast' => 'Eng soʻnggi',
+'history-show-deleted' => 'Faqat o‘chirilganlari',
+'histfirst' => 'Eng avvalgi',
+'histlast' => 'Eng soʻnggi',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 $2 da',
# Revision deletion
'rev-delundel' => 'koʻrsat/yashir',
# Diffs
-'history-title' => '"$1"ning tarixi',
-'difference' => '(Koʻrinishlar orasidagi farq)',
-'lineno' => 'Qator $1:',
+'history-title' => '"$1"ning tarixi',
+'difference' => '(Koʻrinishlar orasidagi farq)',
+'lineno' => 'Qator $1:',
'compareselectedversions' => 'Tanlangan versiyalarni solishtir',
-'editundo' => 'qaytar',
+'editundo' => 'qaytar',
# Search results
-'searchresults' => 'Qidiruv natijalari',
-'searchresults-title' => '"$1" uchun qidiruv natijalari',
-'searchresulttext' => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
-'searchsubtitle' => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
-'searchsubtitleinvalid' => "'''$1'''ni qidirdingiz",
-'notitlematches' => 'Bunday sarlavha topilmadi',
-'notextmatches' => 'Bunday matn topilmadi',
-'prevn' => 'oldingi $1',
-'nextn' => 'keyingi {{PLURAL:$1|$1}}',
-'prevn-title' => 'Avvalgi $1 {{PLURAL:$1|natija|natijalar}}',
-'nextn-title' => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
-'shown-title' => 'Har sahifada $1 natija koʻrsat',
-'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifani yarat!'''",
-'searchhelp-url' => 'Help:Mundarija',
-'searchprofile-everything' => 'Har yerda',
+'searchresults' => 'Qidiruv natijalari',
+'searchresults-title' => '"$1" uchun qidiruv natijalari',
+'searchresulttext' => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
+'searchsubtitleinvalid' => "'''$1'''ni qidirdingiz",
+'notitlematches' => 'Bunday sarlavha topilmadi',
+'notextmatches' => 'Bunday matn topilmadi',
+'prevn' => 'oldingi $1',
+'nextn' => 'keyingi {{PLURAL:$1|$1}}',
+'prevn-title' => 'Avvalgi $1 {{PLURAL:$1|natija|natijalar}}',
+'nextn-title' => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
+'shown-title' => 'Har sahifada $1 natija koʻrsat',
+'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifani yarat!'''",
+'searchhelp-url' => 'Help:Mundarija',
+'searchprofile-articles' => 'Asosiy sahifalar',
+'searchprofile-images' => 'Multimediya',
+'searchprofile-everything' => 'Har yerda',
+'searchprofile-advanced' => 'Kengaytirilgan',
'searchprofile-articles-tooltip' => '$1da qidir',
-'searchprofile-project-tooltip' => '$1da qidir',
-'searchprofile-images-tooltip' => 'Fayllarni qidir',
-'search-result-size' => '$1 ({{PLURAL:$2|1 soʻz|$2 soʻz}})',
-'search-redirect' => '(yoʻnaltirish $1)',
-'search-section' => '($1 boʻlimi)',
-'search-suggest' => 'Balki buni nazarda tutgandirsiz: $1',
-'search-interwiki-default' => '$1 natijalar:',
-'searchall' => 'barchasi',
-'showingresults' => "#<b>$2</b> boshlanayotgan <b>$1</b> natijalar ko'rsatilyapti.",
-'showingresultsheader' => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
-'powersearch' => 'Qidiruv',
-'powersearch-ns' => 'Bu nom-fazolarda izla:',
-'powersearch-redir' => 'Yoʻnaltirishlarni koʻrsat',
-'powersearch-field' => 'Qidir',
+'searchprofile-project-tooltip' => '$1da qidir',
+'searchprofile-images-tooltip' => 'Fayllarni qidir',
+'search-result-size' => '$1 ({{PLURAL:$2|1 soʻz|$2 soʻz}})',
+'search-redirect' => '(yoʻnaltirish $1)',
+'search-section' => '($1 boʻlimi)',
+'search-suggest' => 'Balki buni nazarda tutgandirsiz: $1',
+'search-interwiki-default' => '$1 natijalar:',
+'searchall' => 'barchasi',
+'showingresults' => "#<b>$2</b> boshlanayotgan <b>$1</b> natijalar ko'rsatilyapti.",
+'showingresultsheader' => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
+'powersearch' => 'Qidiruv',
+'powersearch-ns' => 'Bu nom-fazolarda izla:',
+'powersearch-redir' => 'Yoʻnaltirishlarni koʻrsat',
+'powersearch-field' => 'Qidir',
# Preferences page
-'preferences' => 'Moslamalar',
-'mypreferences' => 'Moslamalarim',
-'prefs-skin' => "Tashqi ko'rinish",
-'prefs-datetime' => 'Sana va vaqt',
-'prefs-personal' => "Shaxsiy ma'lumotlar",
-'prefs-rc' => "Yangi o'zgartirishlar",
-'prefs-watchlist' => "Kuzatuv ro'yxati",
-'prefs-misc' => 'Boshqa moslamalar',
-'saveprefs' => 'Saqlash',
-'resetprefs' => 'Bekor qilish',
-'prefs-editing' => 'Tahrirlash',
+'preferences' => 'Moslamalar',
+'mypreferences' => 'Moslamalarim',
+'prefs-skin' => 'Tashqi ko‘rinish',
+'prefs-datetime' => 'Sana va vaqt',
+'prefs-personal' => 'Shaxsiy ma’lumotlar',
+'prefs-rc' => 'Yangi o‘zgartirishlar',
+'prefs-watchlist' => "Kuzatuv ro'yxati",
+'prefs-misc' => 'Boshqa moslamalar',
+'saveprefs' => 'Saqlash',
+'resetprefs' => 'Bekor qilish',
+'prefs-editing' => 'Tahrirlash',
'searchresultshead' => 'Qidiruv natijalari',
-'prefs-files' => 'Fayllar',
-'yourrealname' => 'Haqiqiy ism *:',
+'prefs-files' => 'Fayllar',
+'youremail' => 'E-mail:',
+'yourrealname' => 'Haqiqiy ism *:',
# Groups
'group-sysop' => 'Administratorlar',
'grouppage-sysop' => '{{ns:project}}:Administratorlar',
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'ushbu sahifani tahrirlash',
+
# Recent changes
-'recentchanges' => "Yangi o'zgartirishlar",
-'recentchangestext' => "Bu sahifada siz oxirgi o'zgartirishlarni ko'rishingiz mumkin.",
-'rcnote' => "Quyida $5, $4ga koʻra oxirgi {{PLURAL:$2|kun|'''$2''' kun}} davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgartirish|'''$1''' oʻzgartirishlar}} koʻrsatilgan.",
-'rclistfrom' => "$1dan boshlab yangi o'zgartirishlarni ko'rsat.",
-'rcshowhideminor' => 'Kichik tahrirlarni $1',
-'rcshowhidebots' => 'Botlarni $1',
-'rcshowhideliu' => "Ro'yxatdan o'tgan foydalanuvchilarni $1",
-'rcshowhideanons' => 'Anonim foydalanuvchilarni $1',
-'rcshowhidepatr' => 'Tekshirilgan tahrirlarni $1',
-'rcshowhidemine' => "O'z tahrirlarimni $1",
-'rclinks' => "Oxirgi $2 kun davomida sodir bo'lgan $1 o'zgartirishlarni ko'rsat.<br />$3",
-'diff' => 'farq',
-'hist' => 'tarix',
-'hide' => 'yashirish',
-'show' => 'koʻrsat',
-'minoreditletter' => 'k',
-'newpageletter' => 'Y',
+'recentchanges' => 'Yangi o‘zgartirishlar',
+'recentchangestext' => 'Ushbu sahifada siz eng so‘nggi o‘zgartirishlarni ko‘rishingiz mumkin.',
+'rcnote' => "Quyida $5, $4ga koʻra oxirgi {{PLURAL:$2|kun|'''$2''' kun}} davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgartirish|'''$1''' oʻzgartirishlar}} koʻrsatilgan.",
+'rclistfrom' => "$1dan boshlab yangi o'zgartirishlarni ko'rsat.",
+'rcshowhideminor' => 'Kichik tahrirlarni $1',
+'rcshowhidebots' => '$1 ta bot',
+'rcshowhideliu' => 'Ro‘yxatdan o‘tgan foydalanuvchilar: $1 ta',
+'rcshowhideanons' => 'Anonim foydalanuvchilar: $1 ta',
+'rcshowhidepatr' => 'Tekshirilgan tahrirlarni $1',
+'rcshowhidemine' => "O'z tahrirlarimni $1",
+'rclinks' => "Oxirgi $2 kun davomida sodir bo'lgan $1 o'zgartirishlarni ko'rsat.<br />$3",
+'diff' => 'farq',
+'hist' => 'tarix',
+'hide' => 'yashirish',
+'show' => 'koʻrsat',
+'minoreditletter' => 'k',
+'newpageletter' => 'Y',
# Recent changes linked
-'recentchangeslinked' => "Bog'langan o'zgarishlar",
-'recentchangeslinked-toolbox' => 'Bogʻliq oʻzgarishlar',
-'recentchangeslinked-title' => '"$1"ga aloqador oʻzgarishlar',
+'recentchangeslinked' => "Bog'langan o'zgarishlar",
+'recentchangeslinked-toolbox' => 'Bogʻliq oʻzgarishlar',
+'recentchangeslinked-title' => '"$1"ga aloqador oʻzgarishlar',
'recentchangeslinked-noresult' => 'Berilgan davrda bogʻlangan sahifalarda oʻzgarishlar boʻlmagan.',
-'recentchangeslinked-summary' => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
+'recentchangeslinked-summary' => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
+'recentchangeslinked-page' => 'Sahifa nomi:',
# Upload
-'upload' => 'Fayl yuklash',
-'uploadbtn' => 'Fayl yukla',
+'upload' => 'Fayl yuklash',
+'uploadbtn' => 'Fayl yukla',
'uploadlogpage' => 'Yuklash qaydlari',
+'filedesc' => 'Qisqa izoh',
'uploadedimage' => '"[[$1]]" yuklandi',
# Special:ListFiles
'listfiles' => 'Fayllar roʻyxati',
# File description page
-'file-anchor-link' => 'Fayl',
-'filehist' => 'Fayl tarixi',
-'filehist-help' => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
-'filehist-current' => 'joriy',
-'filehist-datetime' => 'Sana/Vaqt',
-'filehist-user' => 'Foydalanuvchi',
-'filehist-dimensions' => 'Oʻlchamlari',
-'filehist-filesize' => 'Fayl hajmi',
-'filehist-comment' => 'Izoh',
-'imagelinks' => 'Fayllarga ishoratlar',
-'linkstoimage' => 'Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:',
-'nolinkstoimage' => 'Bu faylga bogʻlangan sahifalar yoʻq.',
-'sharedupload' => 'This file is from $1 and may be used by other projects.',
-'sharedupload-desc-here' => 'Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.
+'file-anchor-link' => 'Fayl',
+'filehist' => 'Fayl tarixi',
+'filehist-help' => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
+'filehist-current' => 'joriy',
+'filehist-datetime' => 'Sana/Vaqt',
+'filehist-thumb' => 'Miniatyura',
+'filehist-user' => 'Foydalanuvchi',
+'filehist-dimensions' => 'Oʻlchamlari',
+'filehist-filesize' => 'Fayl hajmi',
+'filehist-comment' => 'Izoh',
+'imagelinks' => 'Fayllarga ishoratlar',
+'linkstoimage' => 'Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:',
+'nolinkstoimage' => 'Bu faylga bogʻlangan sahifalar yoʻq.',
+'sharedupload' => 'This file is from $1 and may be used by other projects.',
+'sharedupload-desc-here' => 'Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.
Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
'uploadnewversion-linktext' => 'Bu faylning yangi versiyasini yukla',
'randompage' => 'Tasodifiy sahifa',
# Statistics
-'statistics' => 'Statistika',
+'statistics' => 'Statistika',
'statistics-header-users' => 'Foydalanuvchilar statistikasi',
'disambiguationspage' => '{{ns:template}}:Disambig',
# Miscellaneous special pages
-'nbytes' => '$1 bayt',
-'ncategories' => '$1 {{PLURAL:$1|turkum|turkumlar}}',
-'lonelypages' => 'Yetim sahifalar',
-'uncategorizedpages' => 'Turkumlashtirilmagan sahifalar',
+'nbytes' => '$1 bayt',
+'ncategories' => '$1 {{PLURAL:$1|turkum|turkumlar}}',
+'lonelypages' => 'Yetim sahifalar',
+'uncategorizedpages' => 'Turkumlashtirilmagan sahifalar',
'uncategorizedcategories' => 'Turkumlashtirilmagan turkumlar',
-'uncategorizedimages' => 'Kategoriyasiz tasvirlar',
-'uncategorizedtemplates' => 'Turkumlashtirilmagan andozalar',
-'unusedcategories' => 'Ishlatilinmagan turkumlar',
-'unusedimages' => 'Ishlatilinmagan fayllar',
-'wantedcategories' => 'Talab qilinayotgan turkumlar',
-'mostcategories' => 'Eng koʻp turkumli sahifalar',
-'protectedpages' => 'Himoyalangan sahifalar',
-'listusers' => 'Foydalanuvchilar roʻyxati',
-'newpages' => 'Yangi sahifalar',
-'move' => "Ko'chirish",
-'movethispage' => 'Bu sahifani koʻchir',
-'pager-newer-n' => '{{PLURAL:$1|yangiroq 1|yangiroq $1}}',
-'pager-older-n' => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
+'uncategorizedimages' => 'Kategoriyasiz tasvirlar',
+'uncategorizedtemplates' => 'Turkumlashtirilmagan andozalar',
+'unusedcategories' => 'Ishlatilinmagan turkumlar',
+'unusedimages' => 'Ishlatilinmagan fayllar',
+'wantedcategories' => 'Talab qilinayotgan turkumlar',
+'mostcategories' => 'Eng koʻp turkumli sahifalar',
+'protectedpages' => 'Himoyalangan sahifalar',
+'listusers' => 'Foydalanuvchilar roʻyxati',
+'newpages' => 'Yangi sahifalar',
+'move' => 'Ko‘chirish',
+'movethispage' => 'Bu sahifani koʻchir',
+'pager-newer-n' => '{{PLURAL:$1|yangiroq 1|yangiroq $1}}',
+'pager-older-n' => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
+
+# Book sources
+'booksources-go' => 'O‘tish',
# Special:Log
-'log' => 'Qaydlar',
+'log' => 'Qaydlar',
'all-logs-page' => 'Barcha qaydlar',
# Special:AllPages
-'allpages' => 'Barcha sahifalar',
+'allpages' => 'Barcha sahifalar',
'alphaindexline' => '$1 dan $2 ga',
-'nextpage' => 'Keyingi sahifa ($1)',
-'prevpage' => 'Avvalgi sahifa ($1)',
-'allpagesfrom' => 'Sahifalarni koʻrsat:',
-'allarticles' => 'Barcha sahifalar',
-'allpagesnext' => 'Keyingi',
+'nextpage' => 'Keyingi sahifa ($1)',
+'prevpage' => 'Avvalgi sahifa ($1)',
+'allpagesfrom' => 'Sahifalarni koʻrsat:',
+'allarticles' => 'Barcha sahifalar',
+'allpagesnext' => 'Keyingi',
'allpagessubmit' => 'Oʻt',
'allpagesprefix' => 'Bunday prefiksli sahifalarni koʻrsat:',
# Special:Categories
-'categories' => 'Turkumlar',
+'categories' => 'Turkumlar',
'categoriespagetext' => 'The following {{PLURAL:$1|category contains|categories contain}} pages or media.
[[Special:UnusedCategories|Unused categories]] are not shown here.
Also see [[Special:WantedCategories|wanted categories]].',
+# Special:ListGroupRights
+'listgrouprights-members' => '(a’zolar ro‘yxati)',
+
# E-mail user
'emailuser' => 'Bu foydalanuvchiga e-maktub joʻnat',
# Watchlist
-'watchlist' => 'Kuzatuv roʻyxatim',
-'mywatchlist' => 'Kuzatuv roʻyxatim',
-'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
-'addedwatchtext' => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
+'watchlist' => 'Kuzatuv roʻyxatim',
+'mywatchlist' => 'Kuzatuv roʻyxatim',
+'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
+'addedwatchtext' => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmaslik\" yozuvini bosing.",
'removedwatchtext' => '"[[:$1]]" sahifasi kuzatuv ro\'yxatingizdan o\'chirildi.',
-'watch' => 'kuzatish',
-'watchthispage' => 'Sahifani kuzatish',
-'unwatch' => 'kuzatmaslik',
-'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
-'wlshowlast' => "Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko'rsatish. $3 tahrirlarni ko'rsatish",
+'watch' => 'kuzatish',
+'watchthispage' => 'Sahifani kuzatish',
+'unwatch' => 'kuzatmaslik',
+'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
+'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
# Delete
-'actioncomplete' => 'Bajarildi',
-'deletedtext' => '"$1" yoʻqotildi.
+'actioncomplete' => 'Bajarildi',
+'actionfailed' => 'Jarayon amalga oshmadi',
+'deletedtext' => '"$1" yoʻqotildi.
Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
-'dellogpage' => 'Yoʻqotish qaydlari',
-'deletecomment' => 'Sabab:',
-'deleteotherreason' => 'Boshqa/qoʻshimcha sabab:',
+'dellogpage' => 'Yoʻqotish qaydlari',
+'deletecomment' => 'Sabab:',
+'deleteotherreason' => 'Boshqa/qoʻshimcha sabab:',
'deletereasonotherlist' => 'Boshqa sabab',
# Rollback
'rollbacklink' => 'eski holiga keltir',
# Protect
-'protectlogpage' => 'Himoyalash qaydlari',
-'protect-level-sysop' => 'Faqat administratorlar uchun',
+'protectlogpage' => 'Himoyalash qaydlari',
+'protect-level-sysop' => 'Faqat administratorlar uchun',
'protect-expiry-options' => '2 soat:2 hours,1 kun:1 day,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
# Restrictions (nouns)
'restriction-edit' => 'Tahrirlash',
# Undelete
-'undeletebtn' => 'Qayta tikla',
-'undeletelink' => 'tikla',
+'undeletebtn' => 'Qayta tikla',
+'undeletelink' => 'ko‘rib chiqish/tiklash',
+'undeleteviewlink' => "ko'rib chiqish",
# Namespace form on various pages
'namespace' => 'Soha:',
-'invert' => 'Tanlash tartibini almashtirish',
+'invert' => 'Tanlash tartibini almashtirish',
+'blanknamespace' => '(asosiy)',
# Contributions
'contributions' => 'Foydalanuvchining hissasi',
-'mycontris' => 'Hissam',
-'contribsub2' => '$1 uchun ($2)',
+'mycontris' => 'Hissam',
+'contribsub2' => '$1 uchun ($2)',
-'sp-contributions-newbies' => 'Faqatgina yangi foydalanuvchilarning hissalarini koʻrsat',
+'sp-contributions-newbies' => 'Faqatgina yangi foydalanuvchilarning hissalarini koʻrsat',
'sp-contributions-blocklog' => 'Chetlashtirish qaydlari',
-'sp-contributions-talk' => 'Munozara',
-'sp-contributions-search' => 'Hissalarni qidir',
+'sp-contributions-talk' => 'munozara',
+'sp-contributions-search' => 'Hissalarni qidir',
'sp-contributions-username' => 'IP manzil yoki foydalanuvchi ismi:',
-'sp-contributions-submit' => 'Qidir',
+'sp-contributions-submit' => 'Qidir',
# What links here
-'whatlinkshere' => "Bu sahifaga bog'langan sahifalar",
+'whatlinkshere' => "Bu sahifaga bog'langan sahifalar",
'whatlinkshere-title' => '"$1"ga bogʻlangan sahifalar',
-'linkshere' => "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bog'langan:",
-'nolinkshere' => "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog'lanmagan.",
-'isredirect' => 'yoʻnaltiruvchi sahifa',
-'istemplate' => 'qoʻshimcha',
+'whatlinkshere-page' => 'Sahifa:',
+'linkshere' => "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bog'langan:",
+'nolinkshere' => "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
+'isredirect' => 'yoʻnaltiruvchi sahifa',
+'istemplate' => 'qoʻshimcha',
'whatlinkshere-links' => '← ishoratlar',
+'whatlinkshere-filters' => 'Filtrlar',
# Block/unblock
-'blockip' => 'Foydalanuvchini chetlashtir',
-'ipboptions' => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
-'ipblocklist' => 'Chetlashtirilgan IP manzillari va foydalanuvchilar',
-'blocklink' => 'chetlashtir',
+'blockip' => 'Foydalanuvchini chetlashtir',
+'ipboptions' => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
+'ipblocklist' => 'Chetlashtirilgan IP manzillari va foydalanuvchilar',
+'blocklink' => 'chetlashtir',
'contribslink' => 'hissasi',
'blocklogpage' => 'Chetlashtirish qaydlari',
# Move page
-'movearticle' => "Sahifani ko'chirish",
-'movepagebtn' => 'Sahifani koʻchir',
-'pagemovedsub' => 'Koʻchirildi',
+'movearticle' => "Sahifani ko'chirish",
+'movepagebtn' => 'Sahifani koʻchir',
+'pagemovedsub' => 'Koʻchirildi',
'movepage-moved' => '\'\'\'"$1" nomli sahifa "$2" nomli sahifaga koʻchirildi\'\'\'',
-'movelogpage' => 'Koʻchirish qaydlari',
-'movereason' => 'Sabab:',
-'revertmove' => 'qaytar',
+'movelogpage' => 'Koʻchirish qaydlari',
+'movereason' => 'Sabab:',
+'revertmove' => 'qaytar',
+
+# Export
+'export' => 'Sahifalar eksporti',
+
+# Namespace 8 related
+'allmessagesname' => 'Ism',
# Thumbnails
'thumbnail-more' => 'Kattalashtir',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Foydalanuvchi sahifangiz',
-'tooltip-pt-anonuserpage' => 'Siznig ip manzilingiz foydalanuvchi sahifasi',
-'tooltip-pt-mytalk' => 'Suhbat sahifangiz',
-'tooltip-pt-anontalk' => 'Bu ip manzildan amalga oshirilgan tahrirlar munozarasi',
-'tooltip-pt-preferences' => 'Moslamalaringiz',
-'tooltip-pt-watchlist' => "Siz kuzatib borayotgan sahifalar ro'yxati.",
-'tooltip-pt-mycontris' => 'Hissalaringiz roʻyxati',
-'tooltip-pt-login' => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
-'tooltip-pt-anonlogin' => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
-'tooltip-pt-logout' => 'Chiqish',
-'tooltip-ca-talk' => 'Sahifa matni borasida munozara',
-'tooltip-ca-edit' => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
-'tooltip-ca-addsection' => 'Yangi boʻlim och',
-'tooltip-ca-viewsource' => "Bu sahifa himoyalangan. Siz uning manbasini ko'rishingiz mumkin.",
-'tooltip-ca-history' => 'Bu sahifaning oldingi versiyalari.',
-'tooltip-ca-protect' => 'Bu sahifani himoyalash',
-'tooltip-ca-delete' => "Bu sahifani o'chirish",
-'tooltip-ca-undelete' => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
-'tooltip-ca-move' => 'Bu sahifani koʻchir',
-'tooltip-ca-watch' => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
-'tooltip-ca-unwatch' => "Bu sahifani kuzatuv ro'yxatingizga o'chirish",
-'tooltip-search' => '{{SITENAME}}da qidirish',
-'tooltip-search-go' => 'Xuddi shu nomli sahifa bor boʻlsa, uni och',
-'tooltip-search-fulltext' => 'Sahifalarda shu matnni izla',
-'tooltip-p-logo' => 'Bosh sahifa',
-'tooltip-n-mainpage' => 'Bosh sahifaga oʻtish',
-'tooltip-n-portal' => 'Loyiha haqida, nimalar qilishingiz mumkin, nimalarni qayerdan topish mumkin',
-'tooltip-n-currentevents' => "Joriy hodisalar haqida ma'lumot olish",
-'tooltip-n-recentchanges' => "Yangi o'zgarishlar ro'yxati.",
-'tooltip-n-randompage' => 'Tasodifiy sahifani yuklash',
-'tooltip-n-help' => "O'rganish uchun manzil.",
-'tooltip-t-whatlinkshere' => "Bu sahifaga bog'langan sahifalar ro'yxati",
-'tooltip-t-recentchangeslinked' => "Bu sahifa bog'langan sahifalardagi yangi o'zgarishlar",
-'tooltip-feed-rss' => "Bu sahifa uchun RSS ta'minot",
-'tooltip-feed-atom' => "Bu sahifa uchun Atom ta'minot",
-'tooltip-t-contributions' => "Bu foydalanuvchinig qo'shgan hissasini ko'rish",
-'tooltip-t-emailuser' => "Bu foydalanuvchiga xat jo'natish",
-'tooltip-t-upload' => 'Rasmlar yoki media fayllar yuklash',
-'tooltip-t-specialpages' => "Maxsus sahifalar ro'yxati",
-'tooltip-t-print' => 'Ushbu sahifaning bosma uchun versiyasi',
-'tooltip-t-permalink' => 'Sahifaning ushbu versiyasiga doimiy ishorat',
-'tooltip-ca-nstab-main' => "Sahifani ko'rish",
-'tooltip-ca-nstab-user' => "Foydalanuvchi sahifasini ko'rish",
-'tooltip-ca-nstab-media' => "Media sahifasini ko'rish",
-'tooltip-ca-nstab-special' => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
-'tooltip-ca-nstab-project' => "Loyiha sahifasini ko'rish",
-'tooltip-ca-nstab-image' => "Rasm sahifasini ko'rish",
-'tooltip-ca-nstab-mediawiki' => "Tizim xabarini ko'rish",
-'tooltip-ca-nstab-template' => 'Andozani koʻrish',
-'tooltip-ca-nstab-help' => "Yordam sahifasini ko'rish",
-'tooltip-ca-nstab-category' => 'Turkum sahifasini koʻrish',
-'tooltip-minoredit' => "Kichik o'zgarish sifatida belgilash",
-'tooltip-save' => "O'zgarishlarni saqlash",
-'tooltip-preview' => "O'zgarishlarni saqlash. Iltimos saqlashdan oldin uni ishlating!",
-'tooltip-diff' => "Matnga qanday o'zgarishlar kiritganligingizni ko'rish.",
+'tooltip-pt-userpage' => 'Foydalanuvchi sahifangiz',
+'tooltip-pt-anonuserpage' => 'Siznig ip manzilingiz foydalanuvchi sahifasi',
+'tooltip-pt-mytalk' => 'Suhbat sahifangiz',
+'tooltip-pt-anontalk' => 'Bu ip manzildan amalga oshirilgan tahrirlar munozarasi',
+'tooltip-pt-preferences' => 'Moslamalaringiz',
+'tooltip-pt-watchlist' => "Siz kuzatib borayotgan sahifalar ro'yxati.",
+'tooltip-pt-mycontris' => 'Hissalaringiz roʻyxati',
+'tooltip-pt-login' => 'Bu majburiyat mavjud bo‘lmasa-da, kirishingiz taklif qilinadi.',
+'tooltip-pt-anonlogin' => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
+'tooltip-pt-logout' => 'Chiqish',
+'tooltip-ca-talk' => 'Sahifa matni borasida munozara',
+'tooltip-ca-edit' => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
+'tooltip-ca-addsection' => 'Yangi boʻlim och',
+'tooltip-ca-viewsource' => "Bu sahifa himoyalangan. Siz uning manbasini ko'rishingiz mumkin.",
+'tooltip-ca-history' => 'Bu sahifaning oldingi versiyalari.',
+'tooltip-ca-protect' => 'Bu sahifani himoyalash',
+'tooltip-ca-delete' => 'Ushbu sahifani o‘chirib tashlash',
+'tooltip-ca-undelete' => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
+'tooltip-ca-move' => 'Bu sahifani koʻchir',
+'tooltip-ca-watch' => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
+'tooltip-ca-unwatch' => "Bu sahifani kuzatuv ro'yxatingizga o'chirish",
+'tooltip-search' => '{{SITENAME}}da qidirish',
+'tooltip-search-go' => 'Xuddi shu nomli sahifa bor boʻlsa, uni och',
+'tooltip-search-fulltext' => 'Sahifalarda ushbu matnni izlash',
+'tooltip-p-logo' => 'Bosh sahifaga o‘tish',
+'tooltip-n-mainpage' => 'Bosh sahifaga oʻtish',
+'tooltip-n-mainpage-description' => 'Bosh sahifaga o‘tish',
+'tooltip-n-portal' => 'Loyiha haqida, nimalar qilishingiz mumkin, nimalarni qayerdan topish mumkin',
+'tooltip-n-currentevents' => 'Joriy hodisalar haqida ma’lumot olish',
+'tooltip-n-recentchanges' => 'Wikidagi eng so‘nggi o‘zgartirishlar ro‘yxati',
+'tooltip-n-randompage' => 'Tasodifiy sahifani yuklash',
+'tooltip-n-help' => 'O‘rganish uchun manzil',
+'tooltip-t-whatlinkshere' => "Bu sahifaga bog'langan sahifalar ro'yxati",
+'tooltip-t-recentchangeslinked' => "Bu sahifa bog'langan sahifalardagi yangi o'zgarishlar",
+'tooltip-feed-rss' => "Bu sahifa uchun RSS ta'minot",
+'tooltip-feed-atom' => "Bu sahifa uchun Atom ta'minot",
+'tooltip-t-contributions' => "Bu foydalanuvchinig qo'shgan hissasini ko'rish",
+'tooltip-t-emailuser' => 'Ushbu foydalanuvchiga xat jo‘natish',
+'tooltip-t-upload' => 'Rasmlar yoki media fayllar yuklash',
+'tooltip-t-specialpages' => 'Maxsus sahifalar ro‘yxati',
+'tooltip-t-print' => 'Ushbu sahifaning bosma uchun versiyasi',
+'tooltip-t-permalink' => 'Sahifaning ushbu versiyasiga doimiy ishorat',
+'tooltip-ca-nstab-main' => 'Sahifani ko‘rish',
+'tooltip-ca-nstab-user' => "Foydalanuvchi sahifasini ko'rish",
+'tooltip-ca-nstab-media' => "Media sahifasini ko'rish",
+'tooltip-ca-nstab-special' => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
+'tooltip-ca-nstab-project' => "Loyiha sahifasini ko'rish",
+'tooltip-ca-nstab-image' => "Rasm sahifasini ko'rish",
+'tooltip-ca-nstab-mediawiki' => "Tizim xabarini ko'rish",
+'tooltip-ca-nstab-template' => 'Andozani koʻrish',
+'tooltip-ca-nstab-help' => "Yordam sahifasini ko'rish",
+'tooltip-ca-nstab-category' => 'Turkum sahifasini koʻrish',
+'tooltip-minoredit' => 'Kichik o‘zgartirish sifatida belgilash',
+'tooltip-save' => "O'zgarishlarni saqlash",
+'tooltip-preview' => "O'zgarishlarni saqlash. Iltimos saqlashdan oldin uni ishlating!",
+'tooltip-diff' => "Matnga qanday o'zgarishlar kiritganligingizni ko'rish.",
'tooltip-compareselectedversions' => "Bu sahifaning ikki tanlangan versiyalari o'rtasidagi farqni ko'rish.",
-'tooltip-watch' => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
-'tooltip-recreate' => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
-'tooltip-summary' => 'Qisqa mazmun kiriting',
+'tooltip-watch' => 'Ushbu sahifani kuzatuv ro‘yxatingizga qo‘shish',
+'tooltip-recreate' => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
+'tooltip-summary' => 'Qisqa mazmun kiriting',
# Browsing diffs
'previousdiff' => '← Avvalgi tahrir',
-'nextdiff' => 'Keyingi tahrir →',
+'nextdiff' => 'Keyingi tahrir →',
# Media information
-'imagemaxsize' => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
-'thumbsize' => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
+'imagemaxsize' => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
+'thumbsize' => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
'file-info-size' => '$1 × $2 piksel, fayl hajmi: $3, MIME tipi: $4',
-'file-nohires' => 'Bundan kattaroq tasvir yoʻq.',
-'svg-long-desc' => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
+'file-nohires' => 'Bundan kattaroq tasvir yoʻq.',
+'svg-long-desc' => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
'show-big-image' => 'Asl hajmdagi tasvir',
# Special:NewFiles
'ilsubmit' => 'Qidirish',
# Metadata
-'metadata' => "Metama'lumot",
-'metadata-expand' => 'Batafsil axborot koʻrsat',
+'metadata' => 'Metama’lumot',
+'metadata-expand' => 'Batafsil axborot koʻrsat',
'metadata-collapse' => 'Batafsil axborotni yashir',
# External editor support
-'edit-externally' => 'Bu faylni tashqi dasturiy ilovalar yordamida tahrirla',
+'edit-externally' => 'Bu faylni tashqi dasturiy ilovalar yordamida tahrirla',
'edit-externally-help' => "(Batafsil ma'lumotlar uchun [//www.mediawiki.org/wiki/Manual:External_editors bu yerga] qarang)",
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'Barcha',
'namespacesall' => 'Barchasi',
+'monthsall' => 'barchasi',
'unit-pixel' => 'piksel',
* @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.",
+'passwordreset-emailtext-user' => "El utente $1 da {{SITENAME}} (probabilmente ti steso) ga richiesto l'invio dei to detaji del profiło par {{SITENAME}} ($4). {{PLURAL:$3|El profiło utente asocià|I profił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.",
+'passwordreset-emailelement' => 'Nome utente: $1
+Password tenporanea: $2',
+'passwordreset-emailsent' => 'Xe stà invià on promemoria via posta eletronega.',
+'passwordreset-emailsent-capture' => 'Xe stà invià un promemoria via posta eletronega: el contegù xe riportà cuà de seguito.',
+'passwordreset-emailerror-capture' => "Xe stà generà el promemoria riportà cuà de seguito. L'invio al utente no xe riusido: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Canbia indiriso de posta ełetronega',
+'changeemail-header' => 'Canbia el indiriso de posta ełetronega del account',
+'changeemail-text' => 'Conpleta sto moduło par canbiare el to indiriso de posta ełetronega. Sarà necesario inserire ła password par confermare ła modifega.',
+'changeemail-no-info' => "Te ghe da aver efetuà l'aceso par acedare a sta pajina diretamente.",
+'changeemail-oldemail' => 'Indiriso de posta ełetronega atuałe:',
+'changeemail-newemail' => 'Novo indiriso de posta ełetronega:',
+'changeemail-none' => '(nisun)',
+'changeemail-submit' => 'Canbia indiriso de posta ełetronega',
+'changeemail-cancel' => 'Anuła',
+
# Edit page toolbar
'bold_sample' => 'Testo in grosso',
'bold_tip' => 'Testo in grosso',
'userpage-userdoesnotexist-view' => 'L\'utensa "$1" no la xe gnancora registrà.',
'blocked-notice-logextract' => "Sto utente xè atualmente blocà.
L'ultimo ełemento del rejistro de i blochi xè riportà de seguito par informasion:",
-'clearyourcache' => "'''Ocio: dopo aver salvà, te ghè da netar la cache del to browser par védar i canbiamenti.''' Par '''Mozilla / Firefox / Safari:''' tien macà el boton de le majuscole e schiza \"Ricarica\", o senò maca ''Ctrl-F5'' o ''Ctrl-R'' (''Command-R'' se te ghè el Mac); par '''Konqueror:''' schiza \"Ricarica\" o maca ''F5;'' par '''Opera:''' néta la cache in ''Strumenti → Preferenze;'' par '''Internet Explorer:''' tien macà ''Ctrl'' fin che te schizi ''Ricarica'', o maca ''Ctrl-F5.''",
+'clearyourcache' => "Ocio: dopo aver salvà, połe darse che te gabi da netare ła cache del to browser par védar i canbiamenti.
+*Par '''Firefox / Safari:''' tien macà el boton de łe majuscołe e schicia \"Recarga\", o senò maca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' se te ghè el Mac)
+*Par '''Google Chrome''':schicia ''Ctrl-Shift-R'' (''⌘-Shift-R'' co' un Mac)
+*Par '''Internet Explorer''': tien schicià el boton \"Ctrl\" fin che te schici '''Recarga''', senò schicia '''Ctrl+F5'''
+*Par '''Konqueror''': schicia \"Recarga\" o maca ''F5'';
+*Par '''Opera:''' néta la cache in ''Strumenti → Preferense;''",
'usercssyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}} par proàr i novi CSS prima de salvarli.",
'userjsyoucanpreview' => "'''Sugerimento:''' se consiglia de doparar el boton \"{{int:showpreview}}\" par proàr i novi JavaScript prima de salvarli.",
'usercsspreview' => "'''Sta qua la xe solo n'anteprima del proprio CSS personal.
'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!",
+'continue-editing' => 'Continua modifegare',
'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.
'''Se te stè fasendo na modifica legìtima, par piaser próa de novo.
Se no funsiona gnancora, te pol proár a [[Special:UserLogout|scolegarte]] e efetuar da novo l'acesso.'''",
'token_suffix_mismatch' => "'''La modifica no la xe mìa stà salvà parché el client el gà mostrà de gestir in maniera sbaglià i caràteri de puntegiatura nel token associà a la stessa. Par evitar na possibile coruzion del testo de la pagina, xe stà rifiutà l'intera modifica. Sta situazion la pode verificarse, a olte, quando vien doparà serti servizi de proxy anonimi via web che presenta dei bug.'''",
+'edit_form_incomplete' => "' ' Alcune parte del moduło de modifega no łe xe rivade al server; controłare che łe modifeghe sìe intate e riprovare. ' '",
'editing' => 'Canbia $1',
+'creating' => 'Te si drio creare $1',
'editingsection' => 'Canbia $1 (sezion)',
'editingcomment' => 'Modifica de $1 (sezion nova)',
'editconflict' => 'Conflito de edizion: $1',
Se no te voli che i to scriti i vegna modificà sensa pietà, alora no sta inserirli qua.<br />
Sapi che te stè prometendo che te stè inserendo un testo scrito de to pugno, o copià da na fonte de publico dominio o similarmente lìbara (varda $1 par i detagli).
'''NO STA INSERIR OPERE PROTETE DA COPYRIGHT SENSA PERMESSO!'''",
-'longpageerror' => "'''ERROR: The text you have submitted is $1 kilobytes
-long, which is longer than the maximum of $2 kilobytes. It cannot be saved.'''",
+'longpageerror' => "'''Erore: el testo invià xe grando {{PLURAL:$1|1|$1}} kilobyte, che xe de pì deła dimension masima consentìa de {{PLURAL:$2|1|$2}} kilobyte.'''
+El testo no połe esare salvà.",
'readonlywarning' => "'''OCIO: El database el xe stà blocà par manutenzion, quindi no se pol salvar le modifiche in sto momento.
Par no pèrdarle, te pol copiar tuto quel che te ghè inserìo fin desso ne la casela de modifica, incolarlo in un programa de elaborazion de testi e salvarlo, intanto che te speti che i sbloca el database.'''
'edit-no-change' => 'La to modifica la xe stà ignorà, parché no ti gà canbià gnente nel testo.',
'edit-already-exists' => 'No se pol crear na pagina nova.
La esiste de zà.',
+'defaultmessagetext' => 'Testo predefinìo',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Ocio: Sta pagina la contien dele chiamate de funzion al parser massa onerose.
'parser-template-loop-warning' => 'Xe stà catà un ciclo in tel modèl: [[$1]]',
'parser-template-recursion-depth-warning' => 'Xe stà rajunto el limite màssimo de ricorsion in tel modèl ($1)',
'language-converter-depth-warning' => 'Limite de profondità del convertidor de lengua superà ($1)',
+'node-count-exceeded-category' => 'Pajine ndove che el node-count supera el limite',
# "Undo" feature
'undo-success' => 'Sta modifica la pode èssar anulà. Verifica el confronto presentà de seguito par èssar sicuro che el contenuto el sia come te lo voli e quindi salva le modifiche par conpletar la procedura de anulamento.',
'rev-deleted-user-contribs' => '[nome utente o indirisso IP cavà - modifica sconta dai contributi]',
'rev-deleted-text-permission' => "Sta version de la pagina la xe stà '''scancelà'''.
Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelazion] par ulteriori detagli.",
-'rev-deleted-text-unhide' => "Sta version de la pàxena la xe sta '''scancelà'''.
-Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.
-Ai aministradori xe ancora consentìo [$1 vardar sta version] se i vole.",
-'rev-suppressed-text-unhide' => "Sta version de la pagina la xe stà '''cavà'''.
-Varda el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de rimozion] par ulteriori detagli.
-I aministratori i pode ancora [$1 vardar sta versione] se i vole.",
+'rev-deleted-text-unhide' => "Sta version de la pajina ła xe stà '''scancełà'''.
+Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.
+Ai aministradori ghe xe uncora consentìo [$1 vardar sta version] se i vołe.",
+'rev-suppressed-text-unhide' => "Sta version de ła pagina la xe stà ''rimosa'''.
+Controłare el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe rimosion] par ulteriori detaji.
+I aministradori połe uncora [$1 vardar sta version] se i vołe.",
'rev-deleted-text-view' => "Sta version de la pagina la xe stà '''scancelà'''.
-El testo el pode èssar visualizà soltanto dai aministradori del sito.
-Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelazion] par ulteriori detagli.",
-'rev-suppressed-text-view' => "Sta version de la pagina la xe stà '''cavà'''.
-Solo i aministratori i pole ancora védarla.
-Varda el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de rimozion] par ulteriori detagli.",
+I aministradori połe uncora vixuałixarla. Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.",
+'rev-suppressed-text-view' => "Sta version de ła pajina xe stà '''rimosa'''.
+I aministradori i połe uncora vedarla; controłare el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe rimosion] par ulteriori detaji.",
'rev-deleted-no-diff' => "No te pode vardar sta difarensa parché una de le revision la xe stà '''scancelà'''.
Varda el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par savérghene piessè.",
'rev-suppressed-no-diff' => "No te pol védar sta difarensa, parché una de le revision la xe stà '''scancelà'''.",
-'rev-deleted-unhide-diff' => "Una dele revision de sta difarensa la xe stà '''scancelà'''.
-Consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.
-I aministradori i pode ancora [$1 vardar sta difarensa] se i vole.",
-'rev-suppressed-unhide-diff' => "Una dele revision de sta difarensa la xe stà '''sopressa'''.
-Consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de sopression] par ulteriori detagli.
-I aministradori i pode ancora [$1 vardar sta difarensa] se i vole.",
-'rev-deleted-diff-view' => "Una dele revision de sta difarensa la xe stà '''scancelà'''.
-Come aministrador, te pol vardar el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scancelassion] par ulteriori detagli.",
+'rev-deleted-unhide-diff' => "Una dełe revixion de sto confronto fra version xe stà '''scancełà'''.
+Controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.
+Ai aministradori ghe xe uncora consentìo [$1 vixualixare el confronto] se i vołe.",
+'rev-suppressed-unhide-diff' => "Una dełe revixion de sto confronto de version xe stà '''sopresa'''.
+Controła el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe sopresion] par ulteriori detaji.
+I aministradori i połe uncora [$1 vixualixare el confronto] se i vołe.",
+'rev-deleted-diff-view' => "Una dełe revixion de sto confronto de version ła xe stà '''scancelà'''.
+Te połi uncora vixuałixare sto confronto; controłare el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistro dełe scancełasion] par ulteriori detaji.",
'rev-suppressed-diff-view' => "Una dele revision de sta difarensa la xe stà '''sopressa'''.
Come aminitrador, te pol vardar el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de sopression] par ulteriori detagli.",
'rev-delundel' => 'mostra/scondi',
'exif-languagecode' => 'שפראַך',
'exif-iimversion' => 'IIM ווערסיע',
'exif-iimcategory' => 'קאַטעגאָריע',
+'exif-iimsupplementalcategory' => 'אונטער־קאטעגאריעס',
'exif-datetimeexpires' => 'נישט צו ניצן נאָך',
'exif-datetimereleased' => 'באַפֿרייט אום',
+'exif-originaltransmissionref' => 'ארגינעלער טראנסמיסיע פלאצירונג קאד',
+'exif-identifier' => 'אידענטיפֿיצירער',
+'exif-lens' => 'געניצטער לינז',
+'exif-serialnumber' => 'סעריע־נומער פון קאמערע',
'exif-cameraownername' => 'אייגנטימער פון קאמערע',
+'exif-label' => 'צעטל',
'exif-datetimemetadata' => 'דאטע ווען מעטאדאטן זענען געווען לעצט געענדערט',
'exif-rating' => 'שאצונג (פֿון 5)',
+'exif-rightscertificate' => 'רעכטן פארוואלטונג צערטיפיקאט',
'exif-copyrighted' => 'קאפירעכט סטאַטוס',
'exif-copyrightowner' => 'קאפירעכטן האלטער',
'exif-usageterms' => 'ניץ באַדינגונג',
'exif-morepermissionsurl' => 'אלטערנאטיווע ליצענצירן אינפארמאציע',
'exif-pngfilecomment' => 'PNG טעקע הערה',
'exif-giffilecomment' => 'GIF טעקע הערה',
+'exif-intellectualgenre' => 'ארט איינהייט',
'exif-subjectnewscode' => 'טעמע קאד',
# EXIF attributes
'watchlistedit-normal-title' => 'רעדאַקטירן די אויפֿפאַסונג ליסטע',
'watchlistedit-normal-legend' => 'אַראָפנעמען בלעטער פון דער אויפֿפאסן ליסטע',
'watchlistedit-normal-submit' => 'אַראָפנעמען בלעטער',
+'watchlistedit-normal-done' => '{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווארן אראפגענומען פון אייער אויפפאסונג־ליסטע:',
'watchlistedit-raw-title' => 'רעדאַקטירן די רויע אויפֿפאַסונג ליסטע',
'watchlistedit-raw-legend' => 'רעדאַקטירן די רויע אויפֿפאַסונג ליסטע',
'watchlistedit-raw-titles' => 'טיטלען:',
'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' => '該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。',
*/
// Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
wfPHPVersionError( 'load.php' );
}
$maintClass = false;
// Make sure we're on PHP5 or better
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.2.3' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
wfPHPVersionError( 'cli' );
}
--- /dev/null
+-- index for ipblocks.ipb_parent_block_id
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
--- /dev/null
+-- Adding ipb_parent_block_id to track the block that caused an autoblock
+ALTER TABLE /*$wgDBprefix*/ipblocks
+ ADD ipb_parent_block_id int DEFAULT NULL;
if ( $text === false && isset( $this->prefetch ) && $prefetchNotTried ) {
$prefetchNotTried = false;
$tryIsPrefetch = true;
- $text = $this->prefetch->prefetch( $this->thisPage, $this->thisRev );
+ $text = $this->prefetch->prefetch( intval( $this->thisPage ),
+ intval( $this->thisRev ) );
if ( $text === null ) {
$text = false;
}
}
private function buildSafeTitle( $name ) {
- global $wgLegalTitleChars;
$x = preg_replace_callback(
- "/([^$wgLegalTitleChars]|~)/",
+ '/([^' . Title::legalChars() . ']|~)/',
array( $this, 'hexChar' ),
$name );
ipb_range_end VARCHAR(1024),
ipb_deleted SMALLINT NOT NULL DEFAULT 0,
ipb_block_email SMALLINT NOT NULL DEFAULT 0,
- ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0
+ ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0,
+ ipb_parent_block_id INTEGER DEFAULT NULL
+ -- REFERENCES ipblocks(ipb_id) ON DELETE SET NULL
);
CREATE INDEX ipb_address
* @see wfWaitForSlaves()
*/
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.2.3' ) < 0 ) ) {
- echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.2.3 or higher. ABORTING.\n" .
+if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+ echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
"Check if you have a newer php executable with a different name, such as php5.\n";
die( 1 );
}
ipb_deleted BIT NOT NULL DEFAULT 0,
ipb_block_email BIT NOT NULL DEFAULT 0,
ipb_allow_usertalk BIT NOT NULL DEFAULT 0,
+ ipb_parent_block_id INT DEFAULT NULL,
);
-- Unique index to support "user already blocked" messages
-- Any new options which prevent collisions should be included
ipb_range_end VARCHAR2(255),
ipb_deleted CHAR(1) DEFAULT '0' NOT NULL,
ipb_block_email CHAR(1) DEFAULT '0' NOT NULL,
- ipb_allow_usertalk CHAR(1) DEFAULT '0' NOT NULL
+ ipb_allow_usertalk CHAR(1) DEFAULT '0' NOT NULL,
+ ipb_parent_block_id NUMBER DEFAULT NULL
);
ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_pk PRIMARY KEY (ipb_id);
ALTER TABLE &mw_prefix.ipblocks ADD CONSTRAINT &mw_prefix.ipblocks_fk1 FOREIGN KEY (ipb_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
ipb_range_end TEXT,
ipb_deleted SMALLINT NOT NULL DEFAULT 0,
ipb_block_email SMALLINT NOT NULL DEFAULT 0,
- ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0
+ ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0,
+ ipb_parent_block_id INTEGER NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED
);
CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only);
CREATE INDEX ipb_user ON ipblocks (ipb_user);
CREATE INDEX ipb_range ON ipblocks (ipb_range_start,ipb_range_end);
+CREATE INDEX ipb_parent_block_id ON ipblocks (ipb_parent_block_id);
CREATE TABLE image (
ipb_block_email bool NOT NULL default 0,
-- Block allows user to edit their own talk page
- ipb_allow_usertalk bool NOT NULL default 0
+ ipb_allow_usertalk bool NOT NULL default 0,
+
+ -- ID of the block that caused this block to exist
+ -- Autoblocks set this to the original block
+ -- so that the original block being deleted also
+ -- deletes the autoblocks
+ ipb_parent_block_id int default NULL
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
--
* @ingroup Maintenance
*/
-if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.2.3' ) < 0 ) ) {
- echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.2.3 or higher. ABORTING.\n" .
+if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
+ echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
"Check if you have a newer php executable with a different name, such as php5.\n";
die( 1 );
}
// Wait for the browser to update the value
setTimeout( function() {
// Render special
- $special = context.data.$container.find( '.suggestions-special' );
+ var $special = context.data.$container.find( '.suggestions-special' );
context.config.special.render.call( $special, context.data.$textbox.val() );
}, 1 );
}
case 13:
context.data.$container.hide();
preventDefault = wasVisible;
- selected = context.data.$container.find( '.suggestions-result-current' );
+ var selected = context.data.$container.find( '.suggestions-result-current' );
if ( selected.length === 0 || context.data.selectedWithMouse ) {
// if nothing is selected OR if something was selected with the mouse,
// cancel any current requests and submit the form
<!-- /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">
!! end
+!!test
+Language parser function
+!! input
+{{#language:ar}}
+!! result
+<p>العربية
+</p>
+!! end
+
TODO:
more images
more tables
}
function needsDB() {
+ # if the test says it uses database tables, it needs the database
+ if ( $this->tablesUsed ) {
+ return true;
+ }
+
+ # if the test says it belongs to the Database group, it needs the database
$rc = new ReflectionClass( $this );
- return strpos( $rc->getDocComment(), '@group Database' ) !== false;
+ if ( preg_match( '/@group +Database/im', $rc->getDocComment() ) ) {
+ return true;
+ }
+
+ return false;
}
/**
}
// 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.
--- /dev/null
+<?php
+
+/**
+ * Test class for Revision storage.
+ *
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class RevisionStorageTest extends MediaWikiTestCase {
+
+ var $the_page;
+
+ function __construct( $name = null, array $data = array(), $dataName = '' ) {
+ parent::__construct( $name, $data, $dataName );
+
+ $this->tablesUsed = array_merge( $this->tablesUsed,
+ array( 'page',
+ 'revision',
+ 'text',
+
+ 'recentchanges',
+ 'logging',
+
+ 'page_props',
+ 'pagelinks',
+ 'categorylinks',
+ 'langlinks',
+ 'externallinks',
+ 'imagelinks',
+ 'templatelinks',
+ 'iwlinks' ) );
+ }
+
+ public function setUp() {
+ if ( !$this->the_page ) {
+ $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page" );
+ }
+ }
+
+ protected function makeRevision( $props = null ) {
+ if ( $props === null ) $props = array();
+
+ if ( !isset( $props['content'] ) && !isset( $props['text'] ) ) $props['text'] = 'Lorem Ipsum';
+ if ( !isset( $props['comment'] ) ) $props['comment'] = 'just a test';
+ if ( !isset( $props['page'] ) ) $props['page'] = $this->the_page->getId();
+
+ $rev = new Revision( $props );
+
+ $dbw = wfgetDB( DB_MASTER );
+ $rev->insertOn( $dbw );
+
+ return $rev;
+ }
+
+ protected function createPage( $page, $text, $model = null ) {
+ if ( is_string( $page ) ) $page = Title::newFromText( $page );
+ if ( $page instanceof Title ) $page = new WikiPage( $page );
+
+ if ( $page->exists() ) {
+ $page->doDeleteArticle( "done" );
+ }
+
+ $page->doEdit( $text, "testing", EDIT_NEW );
+
+ return $page;
+ }
+
+ protected function assertRevEquals( Revision $orig, Revision $rev = null ) {
+ $this->assertNotNull( $rev, 'missing revision' );
+
+ $this->assertEquals( $orig->getId(), $rev->getId() );
+ $this->assertEquals( $orig->getPage(), $rev->getPage() );
+ $this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
+ $this->assertEquals( $orig->getUser(), $rev->getUser() );
+ $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
+ }
+
+ /**
+ * @covers Revision::__construct
+ */
+ public function testConstructFromRow()
+ {
+ $orig = $this->makeRevision();
+
+ $dbr = wfgetDB( DB_SLAVE );
+ $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
+ $this->assertTrue( is_object( $res ), 'query failed' );
+
+ $row = $res->fetchObject();
+ $res->free();
+
+ $rev = new Revision( $row );
+
+ $this->assertRevEquals( $orig, $rev );
+ }
+
+ /**
+ * @covers Revision::newFromRow
+ */
+ public function testNewFromRow()
+ {
+ $orig = $this->makeRevision();
+
+ $dbr = wfgetDB( DB_SLAVE );
+ $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
+ $this->assertTrue( is_object( $res ), 'query failed' );
+
+ $row = $res->fetchObject();
+ $res->free();
+
+ $rev = Revision::newFromRow( $row );
+
+ $this->assertRevEquals( $orig, $rev );
+ }
+
+
+ /**
+ * @covers Revision::newFromArchiveRow
+ */
+ public function testNewFromArchiveRow()
+ {
+ $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum' );
+ $orig = $page->getRevision();
+ $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
+
+ $dbr = wfgetDB( DB_SLAVE );
+ $res = $dbr->select( 'archive', '*', array( 'ar_rev_id' => $orig->getId() ) );
+ $this->assertTrue( is_object( $res ), 'query failed' );
+
+ $row = $res->fetchObject();
+ $res->free();
+
+ $rev = Revision::newFromArchiveRow( $row );
+
+ $this->assertRevEquals( $orig, $rev );
+ }
+
+ /**
+ * @covers Revision::newFromId
+ */
+ public function testNewFromId()
+ {
+ $orig = $this->makeRevision();
+
+ $rev = Revision::newFromId( $orig->getId() );
+
+ $this->assertRevEquals( $orig, $rev );
+ }
+
+ /**
+ * @covers Revision::fetchRevision
+ */
+ public function testFetchRevision()
+ {
+ $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one' );
+ $id1 = $page->getRevision()->getId();
+
+ $page->doEdit( 'two', 'second rev' );
+ $id2 = $page->getRevision()->getId();
+
+ $res = Revision::fetchRevision( $page->getTitle() );
+
+ #note: order is unspecified
+ $rows = array();
+ while ( ( $row = $res->fetchObject() ) ) {
+ $rows[ $row->rev_id ]= $row;
+ }
+
+ $row = $res->fetchObject();
+ $this->assertEquals( 1, count($rows), 'expected exactly one revision' );
+ $this->assertArrayHasKey( $id2, $rows, 'missing revision with id ' . $id2 );
+ }
+
+ /**
+ * @covers Revision::selectFields
+ */
+ public function testSelectFields()
+ {
+ $fields = Revision::selectFields();
+
+ $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
+ $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields');
+ $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields');
+ $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields');
+ }
+
+ /**
+ * @covers Revision::getPage
+ */
+ public function testGetPage()
+ {
+ $page = $this->the_page;
+
+ $orig = $this->makeRevision( array( 'page' => $page->getId() ) );
+ $rev = Revision::newFromId( $orig->getId() );
+
+ $this->assertEquals( $page->getId(), $rev->getPage() );
+ }
+
+ /**
+ * @covers Revision::getText
+ */
+ public function testGetText()
+ {
+ $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
+ $rev = Revision::newFromId( $orig->getId() );
+
+ $this->assertEquals( 'hello hello.', $rev->getText() );
+ }
+
+ /**
+ * @covers Revision::revText
+ */
+ public function testRevText()
+ {
+ $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
+ $rev = Revision::newFromId( $orig->getId() );
+
+ $this->assertEquals( 'hello hello rev.', $rev->revText() );
+ }
+
+ /**
+ * @covers Revision::getRawText
+ */
+ public function testGetRawText()
+ {
+ $orig = $this->makeRevision( array( 'text' => 'hello hello raw.' ) );
+ $rev = Revision::newFromId( $orig->getId() );
+
+ $this->assertEquals( 'hello hello raw.', $rev->getRawText() );
+ }
+ /**
+ * @covers Revision::isCurrent
+ */
+ public function testIsCurrent()
+ {
+ $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum' );
+ $rev1 = $page->getRevision();
+
+ # @todo: find out if this should be true
+ # $this->assertTrue( $rev1->isCurrent() );
+
+ $rev1x = Revision::newFromId( $rev1->getId() );
+ $this->assertTrue( $rev1x->isCurrent() );
+
+ $page->doEdit( 'Bla bla', 'second rev' );
+ $rev2 = $page->getRevision();
+
+ # @todo: find out if this should be true
+ # $this->assertTrue( $rev2->isCurrent() );
+
+ $rev1x = Revision::newFromId( $rev1->getId() );
+ $this->assertFalse( $rev1x->isCurrent() );
+
+ $rev2x = Revision::newFromId( $rev2->getId() );
+ $this->assertTrue( $rev2x->isCurrent() );
+ }
+
+ /**
+ * @covers Revision::getPrevious
+ */
+ public function testGetPrevious()
+ {
+ $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious' );
+ $rev1 = $page->getRevision();
+
+ $this->assertNull( $rev1->getPrevious() );
+
+ $page->doEdit( 'Bla bla', 'second rev testGetPrevious' );
+ $rev2 = $page->getRevision();
+
+ $this->assertNotNull( $rev2->getPrevious() );
+ $this->assertEquals( $rev1->getId(), $rev2->getPrevious()->getId() );
+ }
+
+ /**
+ * @covers Revision::getNext
+ */
+ public function testGetNext()
+ {
+ $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext' );
+ $rev1 = $page->getRevision();
+
+ $this->assertNull( $rev1->getNext() );
+
+ $page->doEdit( 'Bla bla', 'second rev testGetNext' );
+ $rev2 = $page->getRevision();
+
+ $this->assertNotNull( $rev1->getNext() );
+ $this->assertEquals( $rev2->getId(), $rev1->getNext()->getId() );
+ }
+
+ /**
+ * @covers Revision::newNullRevision
+ */
+ public function testNewNullRevision()
+ {
+ $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text' );
+ $orig = $page->getRevision();
+
+ $dbw = wfGetDB( DB_MASTER );
+ $rev = Revision::newNullRevision( $dbw, $page->getId(), 'a null revision', false );
+
+ $this->assertNotEquals( $orig->getId(), $rev->getId(), 'new null revision shold have a different id from the original revision' );
+ $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
+ $this->assertEquals( 'some testing text', $rev->getText() );
+ }
+}
*/
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
+* ^--- important, causes temporary tables to be used instead of the real database
+**/
+
+class WikiPageTest extends MediaWikiTestCase {
+
+ var $pages_to_delete;
+
+ function __construct( $name = null, array $data = array(), $dataName = '' ) {
+ parent::__construct( $name, $data, $dataName );
+
+ $this->tablesUsed = array_merge ( $this->tablesUsed,
+ array( 'page',
+ 'revision',
+ 'text',
+
+ 'recentchanges',
+ 'logging',
+
+ 'page_props',
+ 'pagelinks',
+ 'categorylinks',
+ 'langlinks',
+ 'externallinks',
+ 'imagelinks',
+ 'templatelinks',
+ 'iwlinks' ) );
+ }
+
+ public function setUp() {
+ $this->pages_to_delete = array();
+ }
+
+ public function tearDown() {
+ foreach ( $this->pages_to_delete as $p ) {
+ /* @var $p WikiPage */
+
+ try {
+ if ( $p->exists() ) {
+ $p->doDeleteArticle( "testing done." );
+ }
+ } catch ( MWException $ex ) {
+ // fail silently
+ }
+ }
+ }
+
+ protected function newPage( $title ) {
+ if ( is_string( $title ) ) $title = Title::newFromText( $title );
+
+ $p = new WikiPage( $title );
+
+ $this->pages_to_delete[] = $p;
+
+ return $p;
+ }
+
+ protected function createPage( $page, $text, $model = null ) {
+ if ( is_string( $page ) ) $page = Title::newFromText( $page );
+ if ( $page instanceof Title ) $page = $this->newPage( $page );
+
+ $page->doEdit( $text, "testing", EDIT_NEW );
+
+ return $page;
+ }
+
+ public function testDoEdit() {
+ $title = Title::newFromText( "WikiPageTest_testDoEdit" );
+
+ $page = $this->newPage( $title );
+
+ $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+ . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
+
+ $page->doEdit( $text, "testing 1" );
+
+ $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+ $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+ $id = $page->getId();
+
+ # ------------------------
+ $page = new WikiPage( $title );
+
+ $retrieved = $page->getText();
+ $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+ # ------------------------
+ $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+ . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
+
+ $page->doEdit( $text, "testing 2" );
+
+ # ------------------------
+ $page = new WikiPage( $title );
+
+ $retrieved = $page->getText();
+ $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+ # ------------------------
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+ $n = $res->numRows();
+ $res->free();
+
+ $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+ }
+
+ public function testDoQuickEdit() {
+ global $wgUser;
+
+ $page = $this->createPage( "WikiPageTest_testDoQuickEdit", "original text" );
+
+ $text = "quick text";
+ $page->doQuickEdit( $text, $wgUser, "testing q" );
+
+ # ---------------------
+ $page = new WikiPage( $page->getTitle() );
+ $this->assertEquals( $text, $page->getText() );
+ }
+
+ public function testDoDeleteArticle() {
+ $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
+ $id = $page->getId();
+
+ $page->doDeleteArticle( "testing deletion" );
+
+ $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
+ $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
+
+ $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
+ $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" );
+
+ # ------------------------
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+ $n = $res->numRows();
+ $res->free();
+
+ $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+ }
+
+ public function testGetRevision() {
+ $page = $this->newPage( "WikiPageTest_testGetRevision" );
+
+ $rev = $page->getRevision();
+ $this->assertNull( $rev );
+
+ # -----------------
+ $this->createPage( $page, "some text" );
+
+ $rev = $page->getRevision();
+
+ $this->assertEquals( $page->getLatest(), $rev->getId() );
+ $this->assertEquals( "some text", $rev->getText() );
+ }
+
+ public function testGetText() {
+ $page = $this->newPage( "WikiPageTest_testGetText" );
+
+ $text = $page->getText();
+ $this->assertFalse( $text );
+
+ # -----------------
+ $this->createPage( $page, "some text" );
+
+ $text = $page->getText();
+ $this->assertEquals( "some text", $text );
+ }
+
+ public function testGetRawText() {
+ $page = $this->newPage( "WikiPageTest_testGetRawText" );
+
+ $text = $page->getRawText();
+ $this->assertFalse( $text );
+
+ # -----------------
+ $this->createPage( $page, "some text" );
+
+ $text = $page->getRawText();
+ $this->assertEquals( "some text", $text );
+ }
+
+
+ public function testExists() {
+ $page = $this->newPage( "WikiPageTest_testExists" );
+ $this->assertFalse( $page->exists() );
+
+ # -----------------
+ $this->createPage( $page, "some text" );
+ $this->assertTrue( $page->exists() );
+
+ $page = new WikiPage( $page->getTitle() );
+ $this->assertTrue( $page->exists() );
+
+ # -----------------
+ $page->doDeleteArticle( "done testing" );
+ $this->assertFalse( $page->exists() );
+
+ $page = new WikiPage( $page->getTitle() );
+ $this->assertFalse( $page->exists() );
+ }
+
+ public function dataHasViewableContent() {
+ return array(
+ array( 'WikiPageTest_testHasViewableContent', false, true ),
+ array( 'Special:WikiPageTest_testHasViewableContent', false ),
+ array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
+ array( 'Special:Userlogin', true ),
+ array( 'MediaWiki:help', true ),
+ );
+ }
+
+ /**
+ * @dataProvider dataHasViewableContent
+ */
+ public function testHasViewableContent( $title, $viewable, $create = false ) {
+ $page = $this->newPage( $title );
+ $this->assertEquals( $viewable, $page->hasViewableContent() );
+
+ if ( $create ) {
+ $this->createPage( $page, "some text" );
+ $this->assertTrue( $page->hasViewableContent() );
+
+ $page = new WikiPage( $page->getTitle() );
+ $this->assertTrue( $page->hasViewableContent() );
+ }
+ }
+
+ public function dataGetRedirectTarget() {
+ return array(
+ array( 'WikiPageTest_testGetRedirectTarget_1', "hello world", null ),
+ array( 'WikiPageTest_testGetRedirectTarget_2', "#REDIRECT [[hello world]]", "Hello world" ),
+ );
+ }
+
+ /**
+ * @dataProvider dataGetRedirectTarget
+ */
+ public function testGetRedirectTarget( $title, $text, $target ) {
+ $page = $this->createPage( $title, $text );
+
+ # now, test the actual redirect
+ $t = $page->getRedirectTarget();
+ $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
+ }
+
+ /**
+ * @dataProvider dataGetRedirectTarget
+ */
+ public function testIsRedirect( $title, $text, $target ) {
+ $page = $this->createPage( $title, $text );
+ $this->assertEquals( !is_null( $target ), $page->isRedirect() );
+ }
+
+ public function dataIsCountable() {
+ return array(
+
+ // any
+ array( 'WikiPageTest_testIsCountable',
+ '',
+ 'any',
+ true
+ ),
+ array( 'WikiPageTest_testIsCountable',
+ 'Foo',
+ 'any',
+ true
+ ),
+
+ // comma
+ array( 'WikiPageTest_testIsCountable',
+ 'Foo',
+ 'comma',
+ false
+ ),
+ array( 'WikiPageTest_testIsCountable',
+ 'Foo, bar',
+ 'comma',
+ true
+ ),
+
+ // link
+ array( 'WikiPageTest_testIsCountable',
+ 'Foo',
+ 'link',
+ false
+ ),
+ array( 'WikiPageTest_testIsCountable',
+ 'Foo [[bar]]',
+ 'link',
+ true
+ ),
+
+ // redirects
+ array( 'WikiPageTest_testIsCountable',
+ '#REDIRECT [[bar]]',
+ 'any',
+ false
+ ),
+ array( 'WikiPageTest_testIsCountable',
+ '#REDIRECT [[bar]]',
+ 'comma',
+ false
+ ),
+ array( 'WikiPageTest_testIsCountable',
+ '#REDIRECT [[bar]]',
+ 'link',
+ false
+ ),
+
+ // not a content namespace
+ array( 'Talk:WikiPageTest_testIsCountable',
+ 'Foo',
+ 'any',
+ false
+ ),
+ array( 'Talk:WikiPageTest_testIsCountable',
+ 'Foo, bar',
+ 'comma',
+ false
+ ),
+ array( 'Talk:WikiPageTest_testIsCountable',
+ 'Foo [[bar]]',
+ 'link',
+ false
+ ),
+
+ // not a content namespace, different model
+ array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+ 'Foo',
+ 'any',
+ false
+ ),
+ array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+ 'Foo, bar',
+ 'comma',
+ false
+ ),
+ array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+ 'Foo [[bar]]',
+ 'link',
+ false
+ ),
+ );
+ }
+
+
+ /**
+ * @dataProvider dataIsCountable
+ */
+ public function testIsCountable( $title, $text, $mode, $expected ) {
+ global $wgArticleCountMethod;
+
+ $old = $wgArticleCountMethod;
+ $wgArticleCountMethod = $mode;
+
+ $page = $this->createPage( $title, $text );
+ $editInfo = $page->prepareTextForEdit( $page->getText() );
+
+ $v = $page->isCountable();
+ $w = $page->isCountable( $editInfo );
+ $wgArticleCountMethod = $old;
+
+ $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
+ . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+
+ $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
+ . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+ }
+
+ public function dataGetParserOutput() {
+ return array(
+ array("hello ''world''\n", "<p>hello <i>world</i></p>"),
+ // @todo: more...?
+ );
+ }
+
+ /**
+ * @dataProvider dataGetParserOutput
+ */
+ public function testGetParserOutput( $text, $expectedHtml ) {
+ $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text );
+
+ $opt = new ParserOptions();
+ $po = $page->getParserOutput( $opt );
+ $text = $po->getText();
+
+ $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
+ $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
+
+ $this->assertEquals( $expectedHtml, $text );
+ return $po;
+ }
+
+ static $sections =
+
+ "Intro
+
+== stuff ==
+hello world
+
+== test ==
+just a test
+
+== foo ==
+more stuff
+";
+
+
+ public function dataReplaceSection() {
+ return array(
+ array( 'WikiPageTest_testReplaceSection',
+ WikiPageTest::$sections,
+ "0",
+ "No more",
+ null,
+ trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
+ ),
+ array( 'WikiPageTest_testReplaceSection',
+ WikiPageTest::$sections,
+ "",
+ "No more",
+ null,
+ "No more"
+ ),
+ array( 'WikiPageTest_testReplaceSection',
+ WikiPageTest::$sections,
+ "2",
+ "== TEST ==\nmore fun",
+ null,
+ trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikiPageTest::$sections ) )
+ ),
+ array( 'WikiPageTest_testReplaceSection',
+ WikiPageTest::$sections,
+ "8",
+ "No more",
+ null,
+ trim( WikiPageTest::$sections )
+ ),
+ array( 'WikiPageTest_testReplaceSection',
+ WikiPageTest::$sections,
+ "new",
+ "No more",
+ "New",
+ trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider dataReplaceSection
+ */
+ public function testReplaceSection( $title, $text, $section, $with, $sectionTitle, $expected ) {
+ $page = $this->createPage( $title, $text );
+ $text = $page->replaceSection( $section, $with, $sectionTitle );
+ $text = trim( $text );
+
+ $this->assertEquals( $expected, $text );
+ }
+
+ /* @FIXME: fix this!
+ public function testGetUndoText() {
+ global $wgDiff3;
+
+ wfSuppressWarnings();
+ $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
+ wfRestoreWarnings();
+
+ if( !$haveDiff3 ) {
+ $this->markTestSkipped( "diff3 not installed or not found" );
+ return;
+ }
+
+ $text = "one";
+ $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
+ $rev1 = $page->getRevision();
+
+ $text .= "\n\ntwo";
+ $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
+ $rev2 = $page->getRevision();
+
+ $text .= "\n\nthree";
+ $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
+ $rev3 = $page->getRevision();
+
+ $text .= "\n\nfour";
+ $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
+ $rev4 = $page->getRevision();
+
+ $text .= "\n\nfive";
+ $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
+ $rev5 = $page->getRevision();
+
+ $text .= "\n\nsix";
+ $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
+ $rev6 = $page->getRevision();
+
+ $undo6 = $page->getUndoText( $rev6 );
+ if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
+ $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
+
+ $undo3 = $page->getUndoText( $rev4, $rev2 );
+ if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
+ $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
+
+ $undo2 = $page->getUndoText( $rev2 );
+ if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
+ $this->assertEquals( "one\n\nfive", $undo2 );
+ }
+ */
+
+ /**
+ * @todo FIXME: this is a better rollback test than the one below, but it keeps failing in jenkins for some reason.
+ */
+ public function broken_testDoRollback() {
+ $admin = new User();
+ $admin->setName("Admin");
+
+ $text = "one";
+ $page = $this->newPage( "WikiPageTest_testDoRollback" );
+ $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+
+ $user1 = new User();
+ $user1->setName( "127.0.1.11" );
+ $text .= "\n\ntwo";
+ $page = new WikiPage( $page->getTitle() );
+ $page->doEdit( $text, "adding section two", 0, false, $user1 );
+
+ $user2 = new User();
+ $user2->setName( "127.0.2.13" );
+ $text .= "\n\nthree";
+ $page = new WikiPage( $page->getTitle() );
+ $page->doEdit( $text, "adding section three", 0, false, $user2 );
+
+ # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
+ # or not committed under some circumstances. so, make sure the last revision has the right user name.
+ $dbr = wfGetDB( DB_SLAVE );
+ $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
+
+ $page = new WikiPage( $page->getTitle() );
+ $rev3 = $page->getRevision();
+ $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
+
+ $rev2 = $rev3->getPrevious();
+ $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
+
+ $rev1 = $rev2->getPrevious();
+ $this->assertEquals( 'Admin', $rev1->getUserText() );
+
+ # now, try the actual rollback
+ $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+ $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
+ $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
+
+ if ( $errors ) {
+ $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+ }
+
+ $page = new WikiPage( $page->getTitle() );
+ $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
+ $this->assertEquals( "one\n\ntwo", $page->getText() );
+ }
+
+ /**
+ * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+ */
+ public function testDoRollback() {
+ $admin = new User();
+ $admin->setName("Admin");
+
+ $text = "one";
+ $page = $this->newPage( "WikiPageTest_testDoRollback" );
+ $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+ $rev1 = $page->getRevision();
+
+ $user1 = new User();
+ $user1->setName( "127.0.1.11" );
+ $text .= "\n\ntwo";
+ $page = new WikiPage( $page->getTitle() );
+ $page->doEdit( $text, "adding section two", 0, false, $user1 );
+
+ # now, try the rollback
+ $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+ $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
+ $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin );
+
+ if ( $errors ) {
+ $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+ }
+
+ $page = new WikiPage( $page->getTitle() );
+ $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
+ $this->assertEquals( "one", $page->getText() );
+ }
+
+ public function dataGetAutosummary( ) {
+ return array(
+ array(
+ 'Hello there, world!',
+ '#REDIRECT [[Foo]]',
+ 0,
+ '/^Redirected page .*Foo/'
+ ),
+
+ array(
+ null,
+ 'Hello world!',
+ EDIT_NEW,
+ '/^Created page .*Hello/'
+ ),
+
+ array(
+ 'Hello there, world!',
+ '',
+ 0,
+ '/^Blanked/'
+ ),
+
+ array(
+ 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
+ labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
+ ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+ 'Hello world!',
+ 0,
+ '/^Replaced .*Hello/'
+ ),
+
+ array(
+ 'foo',
+ 'bar',
+ 0,
+ '/^$/'
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider dataGetAutoSummary
+ */
+ public function testGetAutosummary( $old, $new, $flags, $expected ) {
+ $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
+
+ $summary = $page->getAutosummary( $old, $new, $flags );
+
+ $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
+ }
+
+ public function dataGetAutoDeleteReason( ) {
+ return array(
+ array(
+ array(),
+ false,
+ false
+ ),
+
+ array(
+ array(
+ array( "first edit", null ),
+ ),
+ "/first edit.*only contributor/",
+ false
+ ),
+
+ array(
+ array(
+ array( "first edit", null ),
+ array( "second edit", null ),
+ ),
+ "/second edit.*only contributor/",
+ true
+ ),
+
+ array(
+ array(
+ array( "first edit", "127.0.2.22" ),
+ array( "second edit", "127.0.3.33" ),
+ ),
+ "/second edit/",
+ true
+ ),
+
+ array(
+ array(
+ array( "first edit: "
+ . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+ . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
+ . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
+ . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
+ ),
+ '/first edit:.*\.\.\."/',
+ false
+ ),
+
+ array(
+ array(
+ array( "first edit", "127.0.2.22" ),
+ array( "", "127.0.3.33" ),
+ ),
+ "/before blanking.*first edit/",
+ true
+ ),
+
+ );
+ }
+
+ /**
+ * @dataProvider dataGetAutoDeleteReason
+ */
+ public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
+ global $wgUser;
+
+ $page = $this->newPage( "WikiPageTest_testGetAutoDeleteReason" );
+
+ $c = 1;
+
+ foreach ( $edits as $edit ) {
+ $user = new User();
+
+ if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
+ else $user = $wgUser;
+
+ $page->doEdit( $edit[0], "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
+
+ $c += 1;
+ }
+
+ $reason = $page->getAutoDeleteReason( $hasHistory );
+
+ if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) $this->assertEquals( $expectedResult, $reason );
+ else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), "Autosummary didn't match expected pattern $expectedResult: $reason" );
+
+ $this->assertEquals( $expectedHistory, $hasHistory, "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
+
+ $page->doDeleteArticle( "done" );
+ }
+
+ public function dataPreSaveTransform() {
+ return array(
+ array( 'hello this is ~~~',
+ "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
+ ),
+ array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+ 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider dataPreSaveTransform
+ */
+ public function testPreSaveTransform( $text, $expected ) {
+ $user = new User();
+ $user->setName("127.0.0.1");
+
+ $page = $this->newPage( "WikiPageTest_testPreloadTransform" );
+ $text = $page->preSaveTransform( $text, $user );
+
+ $this->assertEquals( $expected, $text );
+ }
+
+}
+
--- /dev/null
+<?php
+
+/**
+ * @group API
+ */
+class ApiOptionsTest extends MediaWikiLangTestCase {
+
+ private $mTested, $mApiMainMock, $mUserMock, $mContext, $mSession;
+
+ private static $Success = array( 'options' => 'success' );
+
+ function setUp() {
+ parent::setUp();
+
+ $this->mUserMock = $this->getMockBuilder( 'User' )
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->mApiMainMock = $this->getMockBuilder( 'ApiBase' )
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ // Create a new context
+ $this->mContext = new DerivativeContext( new RequestContext() );
+ $this->mContext->setUser( $this->mUserMock );
+
+ $this->mApiMainMock->expects( $this->any() )
+ ->method( 'getContext' )
+ ->will( $this->returnValue( $this->mContext ) );
+
+ $this->mApiMainMock->expects( $this->any() )
+ ->method( 'getResult' )
+ ->will( $this->returnValue( new ApiResult( $this->mApiMainMock ) ) );
+
+
+ // Empty session
+ $this->mSession = array();
+
+ $this->mTested = new ApiOptions( $this->mApiMainMock, 'options' );
+ }
+
+ private function getSampleRequest( $custom = array() ) {
+ $request = array(
+ 'token' => '123ABC',
+ 'change' => null,
+ 'optionname' => null,
+ 'optionvalue' => null,
+ );
+ return array_merge( $request, $custom );
+ }
+
+ private function executeQuery( $request ) {
+ $this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
+ $this->mTested->execute();
+ return $this->mTested->getResult()->getData();
+ }
+
+ /**
+ * @expectedException UsageException
+ */
+ public function testNoToken() {
+ $request = $this->getSampleRequest( array( 'token' => null ) );
+
+ $this->executeQuery( $request );
+ }
+
+ public function testAnon() {
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'isAnon' )
+ ->will( $this->returnValue( true ) );
+
+ try {
+ $request = $this->getSampleRequest();
+
+ $this->executeQuery( $request );
+ } catch ( UsageException $e ) {
+ $this->assertEquals( 'notloggedin', $e->getCodeString() );
+ $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
+ return;
+ }
+ $this->fail( "UsageException was not thrown" );
+ }
+
+ public function testNoOptionname() {
+ try {
+ $request = $this->getSampleRequest( array( 'optionvalue' => '1' ) );
+
+ $this->executeQuery( $request );
+ } catch ( UsageException $e ) {
+ $this->assertEquals( 'nooptionname', $e->getCodeString() );
+ $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
+ return;
+ }
+ $this->fail( "UsageException was not thrown" );
+ }
+
+ public function testNoChanges() {
+ $this->mUserMock->expects( $this->never() )
+ ->method( 'resetOptions' );
+
+ $this->mUserMock->expects( $this->never() )
+ ->method( 'setOption' );
+
+ $this->mUserMock->expects( $this->never() )
+ ->method( 'saveSettings' );
+
+ try {
+ $request = $this->getSampleRequest();
+
+ $this->executeQuery( $request );
+ } catch ( UsageException $e ) {
+ $this->assertEquals( 'nochanges', $e->getCodeString() );
+ $this->assertEquals( 'No changes were requested', $e->getMessage() );
+ return;
+ }
+ $this->fail( "UsageException was not thrown" );
+ }
+
+ public function testReset() {
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'resetOptions' );
+
+ $this->mUserMock->expects( $this->never() )
+ ->method( 'setOption' );
+
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'saveSettings' );
+
+ $request = $this->getSampleRequest( array( 'reset' => '' ) );
+
+ $response = $this->executeQuery( $request );
+
+ $this->assertEquals( self::$Success, $response );
+ }
+
+ public function testOptionWithValue() {
+ $this->mUserMock->expects( $this->never() )
+ ->method( 'resetOptions' );
+
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'setOption' )
+ ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
+
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'saveSettings' );
+
+ $request = $this->getSampleRequest( array( 'optionname' => 'name', 'optionvalue' => 'value' ) );
+
+ $response = $this->executeQuery( $request );
+
+ $this->assertEquals( self::$Success, $response );
+ }
+
+ public function testOptionResetValue() {
+ $this->mUserMock->expects( $this->never() )
+ ->method( 'resetOptions' );
+
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'setOption' )
+ ->with( $this->equalTo( 'name' ), $this->equalTo( null ) );
+
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'saveSettings' );
+
+ $request = $this->getSampleRequest( array( 'optionname' => 'name' ) );
+ $response = $this->executeQuery( $request );
+
+ $this->assertEquals( self::$Success, $response );
+ }
+
+ public function testChange() {
+ $this->mUserMock->expects( $this->never() )
+ ->method( 'resetOptions' );
+
+ $this->mUserMock->expects( $this->at( 1 ) )
+ ->method( 'setOption' )
+ ->with( $this->equalTo( 'willBeNull' ), $this->equalTo( null ) );
+
+ $this->mUserMock->expects( $this->at( 2 ) )
+ ->method( 'setOption' )
+ ->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
+
+ $this->mUserMock->expects( $this->at( 3 ) )
+ ->method( 'setOption' )
+ ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
+
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'saveSettings' );
+
+ $request = $this->getSampleRequest( array( 'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy' ) );
+
+ $response = $this->executeQuery( $request );
+
+ $this->assertEquals( self::$Success, $response );
+ }
+
+ public function testResetChangeOption() {
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'resetOptions' );
+
+ $this->mUserMock->expects( $this->at( 2 ) )
+ ->method( 'setOption' )
+ ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
+
+ $this->mUserMock->expects( $this->at( 3 ) )
+ ->method( 'setOption' )
+ ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
+
+ $this->mUserMock->expects( $this->once() )
+ ->method( 'saveSettings' );
+
+ $args = array(
+ 'reset' => '',
+ 'change' => 'willBeHappy=Happy',
+ 'optionname' => 'name',
+ 'optionvalue' => 'value'
+ );
+
+ $response = $this->executeQuery( $this->getSampleRequest( $args ) );
+
+ $this->assertEquals( self::$Success, $response );
+ }
+}
*
* Clears $wgUser, and reports errors from addDBData to PHPUnit
*/
- function setUp() {
+ protected function setUp() {
global $wgUser;
parent::setUp();
$wgUser = new User();
}
+ /**
+ * Checks for test output consisting only of lines containing ETA announcements
+ */
+ function expectETAOutput() {
+ // Newer PHPUnits require assertion about the output using PHPUnit's own
+ // expectOutput[...] functions. However, the PHPUnit shipped prediactes
+ // do not allow to check /each/ line of the output using /readable/ REs.
+ // So we ...
+ //
+ // 1. ... add a dummy output checking to make PHPUnit not complain
+ // about unchecked test output
+ $this->expectOutputRegex( '//' );
+
+ // 2. Do the real output checking on our own.
+ $lines = explode( "\n", $this->getActualOutput() );
+ $this->assertGreaterThan( 1, count( $lines ), "Minimal lines of produced output" );
+ $this->assertEquals( '', array_pop( $lines ), "Output ends in LF" );
+ $timestamp_re = "[0-9]{4}-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9]";
+ foreach ( $lines as $line ) {
+ $this->assertRegExp( "/$timestamp_re: .* \(ID [0-9]+\) [0-9]* pages .*, [0-9]* revs .*, ETA/", $line );
+ }
+ }
+
+
/**
* Step the current XML reader until node end of given name is found.
*
--- /dev/null
+<?php
+global $IP;
+require_once( "$IP/maintenance/backupPrefetch.inc" );
+
+/**
+ * Tests for BaseDump
+ *
+ * @group Dump
+ */
+class BaseDumpTest extends MediaWikiTestCase {
+
+ /**
+ * @var BaseDump the BaseDump instance used within a test.
+ *
+ * If set, this BaseDump gets automatically closed in tearDown.
+ */
+ private $dump = null;
+
+ protected function tearDown() {
+ parent::tearDown();
+
+ if ( $this->dump !== null ) {
+ $this->dump->close();
+ }
+ }
+
+ /**
+ * asserts that a prefetch yields an expected string
+ *
+ * @param $expected string|null: the exepcted result of the prefetch
+ * @param $page int: the page number to prefetch the text for
+ * @param $revision int: the revision number to prefetch the text for
+ */
+ private function assertPrefetchEquals( $expected, $page, $revision ) {
+ $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
+ "Prefetch of page $page revision $revision" );
+
+ }
+
+ function testSequential() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+ $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+ }
+
+ function testSynchronizeRevisionMissToRevision() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ $this->assertPrefetchEquals( null, 2, 3 );
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+ }
+
+ function testSynchronizeRevisionMissToPage() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ $this->assertPrefetchEquals( null, 2, 40 );
+ $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+ }
+
+ function testSynchronizePageMiss() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ $this->assertPrefetchEquals( null, 3, 40 );
+ $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+ }
+
+ function testPageMissAtEnd() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ $this->assertPrefetchEquals( null, 6, 40 );
+ }
+
+ function testRevisionMissAtEnd() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ $this->assertPrefetchEquals( null, 4, 40 );
+ }
+
+ function testSynchronizePageMissAtStart() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( null, 0, 2 );
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ }
+
+ function testSynchronizeRevisionMissAtStart() {
+ $fname = $this->setUpPrefetch();
+ $this->dump = new BaseDump( $fname );
+
+ $this->assertPrefetchEquals( null, 1, -2 );
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ }
+
+ function testSequentialAcrossFiles() {
+ $fname1 = $this->setUpPrefetch( array( 1 ) );
+ $fname2 = $this->setUpPrefetch( array( 2, 4 ) );
+ $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
+ $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+ }
+
+ function testSynchronizeSkipAcrossFile() {
+ $fname1 = $this->setUpPrefetch( array( 1 ) );
+ $fname2 = $this->setUpPrefetch( array( 2 ) );
+ $fname3 = $this->setUpPrefetch( array( 4 ) );
+ $this->dump = new BaseDump( $fname1 . ";" . $fname2 . ";" . $fname3 );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
+ $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
+ }
+
+ function testSynchronizeMissInWholeFirstFile() {
+ $fname1 = $this->setUpPrefetch( array( 1 ) );
+ $fname2 = $this->setUpPrefetch( array( 2 ) );
+ $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
+
+ $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
+ }
+
+
+ /**
+ * Constructs a temporary file that can be used for prefetching
+ *
+ * The temporary file is removed by DumpBackup upon tearDown.
+ *
+ * @param $requested_pages Array The indices of the page parts that should
+ * go into the prefetch file. 1,2,4 are available.
+ * @return String The file name of the created temporary file
+ */
+ private function setUpPrefetch( $requested_pages = array( 1, 2, 4 ) ) {
+ // The file name, where we store the prepared prefetch file
+ $fname = $this->getNewTempFile();
+
+ // The header of every prefetch file
+ $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.6/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.6/ http://www.mediawiki.org/xml/export-0.6.xsd" version="0.6" xml:lang="en">
+ <siteinfo>
+ <sitename>wikisvn</sitename>
+ <base>http://localhost/wiki-svn/index.php/Main_Page</base>
+ <generator>MediaWiki 1.20alpha</generator>
+ <case>first-letter</case>
+ <namespaces>
+ <namespace key="-2" case="first-letter">Media</namespace>
+ <namespace key="-1" case="first-letter">Special</namespace>
+ <namespace key="0" case="first-letter" />
+ <namespace key="1" case="first-letter">Talk</namespace>
+ <namespace key="2" case="first-letter">User</namespace>
+ <namespace key="3" case="first-letter">User talk</namespace>
+ <namespace key="4" case="first-letter">Wikisvn</namespace>
+ <namespace key="5" case="first-letter">Wikisvn talk</namespace>
+ <namespace key="6" case="first-letter">File</namespace>
+ <namespace key="7" case="first-letter">File talk</namespace>
+ <namespace key="8" case="first-letter">MediaWiki</namespace>
+ <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+ <namespace key="10" case="first-letter">Template</namespace>
+ <namespace key="11" case="first-letter">Template talk</namespace>
+ <namespace key="12" case="first-letter">Help</namespace>
+ <namespace key="13" case="first-letter">Help talk</namespace>
+ <namespace key="14" case="first-letter">Category</namespace>
+ <namespace key="15" case="first-letter">Category talk</namespace>
+ </namespaces>
+ </siteinfo>
+';
+
+
+ // An array holding the pages that are available for prefetch
+ $available_pages = array();
+
+ // Simple plain page
+ $available_pages[1] = ' <page>
+ <title>BackupDumperTestP1</title>
+ <ns>0</ns>
+ <id>1</id>
+ <revision>
+ <id>1</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP1Summary1</comment>
+ <text xml:space="preserve">BackupDumperTestP1Text1</text>
+ <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+ </revision>
+ </page>
+';
+ // Page with more than one revisions. Hole in rev ids.
+ $available_pages[2] = ' <page>
+ <title>BackupDumperTestP2</title>
+ <ns>0</ns>
+ <id>2</id>
+ <revision>
+ <id>2</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP2Summary1</comment>
+ <text xml:space="preserve">BackupDumperTestP2Text1</text>
+ <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+ </revision>
+ <revision>
+ <id>5</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP2Summary4 extra</comment>
+ <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text>
+ <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+ </revision>
+ </page>
+';
+ // Page with id higher than previous id + 1
+ $available_pages[4] = ' <page>
+ <title>Talk:BackupDumperTestP1</title>
+ <ns>1</ns>
+ <id>4</id>
+ <revision>
+ <id>8</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>Talk BackupDumperTestP1 Summary1</comment>
+ <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text>
+ <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+ </revision>
+ </page>
+';
+
+ // The common ending for all files
+ $tail = '</mediawiki>
+';
+
+ // Putting together the content of the prefetch files
+ $content = $header;
+ foreach ( $requested_pages as $i ) {
+ $this->assertTrue( array_key_exists( $i, $available_pages ),
+ "Check for availability of requested page " . $i );
+ $content .= $available_pages[ $i ];
+ }
+ $content .= $tail;
+
+ $this->assertEquals( strlen( $content ), file_put_contents(
+ $fname, $content ), "Length of prepared prefetch" );
+
+ return $fname;
+ }
+
+}
--- /dev/null
+<?php
+global $IP;
+require_once( "$IP/maintenance/backup.inc" );
+require_once( "$IP/maintenance/backupTextPass.inc" );
+
+/**
+ * Tests for page dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class TextPassDumperTest extends DumpTestCase {
+
+ // We'll add several pages, revision and texts. The following variables hold the
+ // corresponding ids.
+ private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+ private $revId1_1, $textId1_1;
+ private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
+ private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
+ private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
+ private $revId4_1, $textId4_1;
+
+ function addDBData() {
+ $this->tablesUsed[] = 'page';
+ $this->tablesUsed[] = 'revision';
+ $this->tablesUsed[] = 'text';
+
+ try {
+ // Simple page
+ $title = Title::newFromText( 'BackupDumperTestP1' );
+ $page = WikiPage::factory( $title );
+ list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
+ "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
+ $this->pageId1 = $page->getId();
+
+ // Page with more than one revision
+ $title = Title::newFromText( 'BackupDumperTestP2' );
+ $page = WikiPage::factory( $title );
+ list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
+ list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
+ list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
+ list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text4 some additional Text ",
+ "BackupDumperTestP2Summary4 extra " );
+ $this->pageId2 = $page->getId();
+
+ // Deleted page.
+ $title = Title::newFromText( 'BackupDumperTestP3' );
+ $page = WikiPage::factory( $title );
+ list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
+ "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
+ list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
+ "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
+ $this->pageId3 = $page->getId();
+ $page->doDeleteArticle( "Testing ;)" );
+
+ // Page from non-default namespace
+ $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
+ $page = WikiPage::factory( $title );
+ list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
+ "Talk about BackupDumperTestP1 Text1",
+ "Talk BackupDumperTestP1 Summary1" );
+ $this->pageId4 = $page->getId();
+ } catch ( Exception $e ) {
+ // We'd love to pass $e directly. However, ... see
+ // documentation of exceptionFromAddDBData in
+ // DumpTestCase
+ $this->exceptionFromAddDBData = $e;
+ }
+
+ }
+
+ protected function setUp() {
+ parent::setUp();
+
+ // Since we will restrict dumping by page ranges (to allow
+ // working tests, even if the db gets prepopulated by a base
+ // class), we have to assert, that the page id are consecutively
+ // increasing
+ $this->assertEquals(
+ array( $this->pageId2, $this->pageId3, $this->pageId4 ),
+ array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
+ "Page ids increasing without holes" );
+
+ }
+
+ function testPlain() {
+ // Setting up the dump
+ $nameStub = $this->setUpStub();
+ $nameFull = $this->getNewTempFile();
+ $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
+ "--output=file:" . $nameFull ) );
+ $dumper->reporting = false;
+ $dumper->setDb( $this->db );
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+ // Checking for correctness of the dumped data
+ $this->assertDumpStart( $nameFull );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+ "BackupDumperTestP1Text1" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+ $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+ "BackupDumperTestP2Text1" );
+ $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+ $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+ "BackupDumperTestP2Text2" );
+ $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+ $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+ "BackupDumperTestP2Text3" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+ "BackupDumperTestP2Text4 some additional Text" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+ "Talk about BackupDumperTestP1 Text1" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+ }
+
+ function testPrefetchPlain() {
+ // The mapping between ids and text, for the hits of the prefetch mock
+ $prefetchMap = array(
+ array( $this->pageId1, $this->revId1_1, "Prefetch_________1Text1" ),
+ array( $this->pageId2, $this->revId2_3, "Prefetch_________2Text3" )
+ );
+
+ // The mock itself
+ $prefetchMock = $this->getMock( 'BaseDump', array( 'prefetch' ), array(), '', FALSE );
+ $prefetchMock->expects( $this->exactly( 6 ) )
+ ->method( 'prefetch' )
+ ->will( $this->returnValueMap( $prefetchMap ) );
+
+ // Setting up of the dump
+ $nameStub = $this->setUpStub();
+ $nameFull = $this->getNewTempFile();
+ $dumper = new TextPassDumper( array ( "--stub=file:"
+ . $nameStub, "--output=file:" . $nameFull ) );
+ $dumper->prefetch = $prefetchMock;
+ $dumper->reporting = false;
+ $dumper->setDb( $this->db );
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+ // Checking for correctness of the dumped data
+ $this->assertDumpStart( $nameFull );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ // Prefetch kicks in. This is still the SHA-1 of the original text,
+ // But the actual text (with different SHA-1) comes from prefetch.
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+ "Prefetch_________1Text1" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+ $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+ "BackupDumperTestP2Text1" );
+ $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+ $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+ "BackupDumperTestP2Text2" );
+ // Prefetch kicks in. This is still the SHA-1 of the original text,
+ // But the actual text (with different SHA-1) comes from prefetch.
+ $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+ $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+ "Prefetch_________2Text3" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+ "BackupDumperTestP2Text4 some additional Text" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+ "Talk about BackupDumperTestP1 Text1" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+
+ }
+
+ /**
+ * Ensures that checkpoint dumps are used and written, by successively increasing the
+ * stub size and dumping until the duration crosses a threshold.
+ *
+ * @param $checkpointFormat string: Either "file" for plain text or "gzip" for gzipped
+ * checkpoint files.
+ */
+ private function checkpointHelper( $checkpointFormat = "file" ) {
+ // Getting temporary names
+ $nameStub = $this->getNewTempFile();
+ $nameOutputDir = $this->getNewTempDirectory();
+
+ $stderr = fopen( 'php://output', 'a' );
+ if ( $stderr === FALSE ) {
+ $this->fail( "Could not open stream for stderr" );
+ }
+
+ $iterations = 32; // We'll start with that many iterations of revisions in stub
+ $lastDuration = 0;
+ $minDuration = 2; // We want the dump to take at least this many seconds
+ $checkpointAfter = 0.5; // Generate checkpoint after this many seconds
+
+
+ // Until a dump takes at least $minDuration seconds, perform a dump and check
+ // duration. If the dump did not take long enough increase the iteration
+ // count, to generate a bigger stub file next time.
+ while ( $lastDuration < $minDuration ) {
+
+ // Setting up the dump
+ wfRecursiveRemoveDir( $nameOutputDir );
+ $this->assertTrue( wfMkdirParents( $nameOutputDir ),
+ "Creating temporary output directory " );
+ $this->setUpStub( $nameStub, $iterations );
+ $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
+ "--output=" . $checkpointFormat . ":" . $nameOutputDir . "/full",
+ "--maxtime=1" /*This is in minutes. Fixup is below*/,
+ "--checkpointfile=checkpoint-%s-%s.xml.gz" ) );
+ $dumper->setDb( $this->db );
+ $dumper->maxTimeAllowed = $checkpointAfter; // Patching maxTime from 1 minute
+ $dumper->stderr = $stderr;
+
+ // The actual dump and taking time
+ $ts_before = wfTime();
+ $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+ $ts_after = wfTime();
+ $lastDuration = $ts_after - $ts_before;
+
+ // Handling increasing the iteration count for the stubs
+ if ( $lastDuration < $minDuration ) {
+ $old_iterations = $iterations;
+ if ( $lastDuration > 0.2 ) {
+ // lastDuration is big enough, to allow an educated guess
+ $factor = ( $minDuration + 0.5 ) / $lastDuration;
+ if ( ( $factor > 1.1 ) && ( $factor < 100 ) ) {
+ // educated guess is reasonable
+ $iterations = (int)( $iterations * $factor );
+ }
+ }
+
+ if ( $old_iterations == $iterations ) {
+ // Heuristics were not applied, so we just *2.
+ $iterations *= 2;
+ }
+
+ $this->assertLessThan( 50000, $iterations,
+ "Emergency stop against infinitely increasing iteration "
+ . "count ( last duration: $lastDuration )" );
+ }
+ }
+
+ // The dump (hopefully) did take long enough to produce more than one
+ // checkpoint file.
+ //
+ // We now check all the checkpoint files for validity.
+
+ $files = scandir( $nameOutputDir );
+ $this->assertTrue( asort( $files ), "Sorting files in temporary directory" );
+ $fileOpened = false;
+ $lookingForPage = 1;
+ $checkpointFiles = 0;
+
+ // Each run of the following loop body tries to handle exactly 1 /page/ (not
+ // iteration of stub content). $i is only increased after having treated page 4.
+ for ( $i = 0 ; $i < $iterations ; ) {
+
+ // 1. Assuring a file is opened and ready. Skipping across header if
+ // necessary.
+ if ( ! $fileOpened ) {
+ $this->assertNotEmpty( $files, "No more existing dump files, "
+ . "but not yet all pages found" );
+ $fname = array_shift( $files );
+ while ( $fname == "." || $fname == ".." ) {
+ $this->assertNotEmpty( $files, "No more existing dump"
+ . " files, but not yet all pages found" );
+ $fname = array_shift( $files );
+ }
+ if ( $checkpointFormat == "gzip" ) {
+ $this->gunzip( $nameOutputDir . "/" . $fname );
+ }
+ $this->assertDumpStart( $nameOutputDir . "/" . $fname );
+ $fileOpened = true;
+ $checkpointFiles++;
+ }
+
+ // 2. Performing a single page check
+ switch ( $lookingForPage ) {
+ case 1:
+ // Page 1
+ $this->assertPageStart( $this->pageId1 + $i * 4, NS_MAIN,
+ "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+ "BackupDumperTestP1Text1" );
+ $this->assertPageEnd();
+
+ $lookingForPage = 2;
+ break;
+
+ case 2:
+ // Page 2
+ $this->assertPageStart( $this->pageId2 + $i * 4, NS_MAIN,
+ "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+ $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+ "BackupDumperTestP2Text1" );
+ $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+ $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+ "BackupDumperTestP2Text2" );
+ $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+ $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+ "BackupDumperTestP2Text3" );
+ $this->assertRevision( $this->revId2_4,
+ "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+ "BackupDumperTestP2Text4 some additional Text" );
+ $this->assertPageEnd();
+
+ $lookingForPage = 4;
+ break;
+
+ case 4:
+ // Page 4
+ $this->assertPageStart( $this->pageId4 + $i * 4, NS_TALK,
+ "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1,
+ "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+ "Talk about BackupDumperTestP1 Text1" );
+ $this->assertPageEnd();
+
+ $lookingForPage = 1;
+
+ // We dealt with the whole iteration.
+ $i++;
+ break;
+
+ default:
+ $this->fail( "Bad setting for lookingForPage ($lookingForPage)" );
+ }
+
+ // 3. Checking for the end of the current checkpoint file
+ if ( $this->xml->nodeType == XMLReader::END_ELEMENT
+ && $this->xml->name == "mediawiki" ) {
+
+ $this->assertDumpEnd();
+ $fileOpened = false;
+ }
+ }
+
+ // Assuring we completely read all files ...
+ $this->assertFalse( $fileOpened, "Currently read file still open?" );
+ $this->assertEmpty( $files, "Remaining unchecked files" );
+
+ // ... and have dealt with more than one checkpoint file
+ $this->assertGreaterThan( 1, $checkpointFiles, "# of checkpoint files" );
+
+ $this->expectETAOutput();
+ }
+
+ /**
+ * @group large
+ */
+ function testCheckpointPlain() {
+ $this->checkpointHelper();
+ }
+
+ /**
+ * tests for working checkpoint generation in gzip format work.
+ *
+ * We keep this test in addition to the simpler self::testCheckpointPlain, as there
+ * were once problems when the used sinks were DumpPipeOutputs.
+ *
+ * xmldumps-backup typically uses bzip2 instead of gzip. However, as bzip2 requires
+ * PHP extensions, we go for gzip instead, which triggers the same relevant code
+ * paths while still being testable on more systems.
+ *
+ * @group large
+ */
+ function testCheckpointGzip() {
+ $this->checkpointHelper( "gzip" );
+ }
+
+
+ /**
+ * Creates a stub file that is used for testing the text pass of dumps
+ *
+ * @param $fname string: (Optional) Absolute name of the file to write
+ * the stub into. If this parameter is null, a new temporary
+ * file is generated that is automatically removed upon
+ * tearDown.
+ * @param $iterations integer: (Optional) specifies how often the block
+ * of 3 pages should go into the stub file. The page id
+ * increase further and further, while the revision and text
+ * ids of the first iteration are reused. The pages of
+ * iteration > 1 have no corresponding representation in the
+ * database.
+ * @return string absolute filename of the stub
+ */
+ private function setUpStub( $fname = null, $iterations = 1 ) {
+ if ( $fname === null ) {
+ $fname = $this->getNewTempFile();
+ }
+ $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.6/" '
+ . 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
+ . 'xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.6/ '
+ . 'http://www.mediawiki.org/xml/export-0.6.xsd" version="0.6" xml:lang="en">
+ <siteinfo>
+ <sitename>wikisvn</sitename>
+ <base>http://localhost/wiki-svn/index.php/Main_Page</base>
+ <generator>MediaWiki 1.20alpha</generator>
+ <case>first-letter</case>
+ <namespaces>
+ <namespace key="-2" case="first-letter">Media</namespace>
+ <namespace key="-1" case="first-letter">Special</namespace>
+ <namespace key="0" case="first-letter" />
+ <namespace key="1" case="first-letter">Talk</namespace>
+ <namespace key="2" case="first-letter">User</namespace>
+ <namespace key="3" case="first-letter">User talk</namespace>
+ <namespace key="4" case="first-letter">Wikisvn</namespace>
+ <namespace key="5" case="first-letter">Wikisvn talk</namespace>
+ <namespace key="6" case="first-letter">File</namespace>
+ <namespace key="7" case="first-letter">File talk</namespace>
+ <namespace key="8" case="first-letter">MediaWiki</namespace>
+ <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+ <namespace key="10" case="first-letter">Template</namespace>
+ <namespace key="11" case="first-letter">Template talk</namespace>
+ <namespace key="12" case="first-letter">Help</namespace>
+ <namespace key="13" case="first-letter">Help talk</namespace>
+ <namespace key="14" case="first-letter">Category</namespace>
+ <namespace key="15" case="first-letter">Category talk</namespace>
+ </namespaces>
+ </siteinfo>
+';
+ $tail = '</mediawiki>
+';
+
+ $content = $header;
+ $iterations = intval( $iterations );
+ for ( $i = 0; $i < $iterations; $i++ ) {
+
+ $page1 = ' <page>
+ <title>BackupDumperTestP1</title>
+ <ns>0</ns>
+ <id>' . ( $this->pageId1 + $i * 4 ) . '</id>
+ <revision>
+ <id>' . $this->revId1_1 . '</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP1Summary1</comment>
+ <text id="' . $this->textId1_1 . '" bytes="23" />
+ <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+ </revision>
+ </page>
+';
+ $page2 = ' <page>
+ <title>BackupDumperTestP2</title>
+ <ns>0</ns>
+ <id>' . ( $this->pageId2 + $i * 4 ) . '</id>
+ <revision>
+ <id>' . $this->revId2_1 . '</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP2Summary1</comment>
+ <text id="' . $this->textId2_1 . '" bytes="23" />
+ <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+ </revision>
+ <revision>
+ <id>' . $this->revId2_2 . '</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP2Summary2</comment>
+ <text id="' . $this->textId2_2 . '" bytes="23" />
+ <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
+ </revision>
+ <revision>
+ <id>' . $this->revId2_3 . '</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP2Summary3</comment>
+ <text id="' . $this->textId2_3 . '" bytes="23" />
+ <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
+ </revision>
+ <revision>
+ <id>' . $this->revId2_4 . '</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>BackupDumperTestP2Summary4 extra</comment>
+ <text id="' . $this->textId2_4 . '" bytes="44" />
+ <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+ </revision>
+ </page>
+';
+ // page 3 not in stub
+
+ $page4 = ' <page>
+ <title>Talk:BackupDumperTestP1</title>
+ <ns>1</ns>
+ <id>' . ( $this->pageId4 + $i * 4 ) . '</id>
+ <revision>
+ <id>' . $this->revId4_1 . '</id>
+ <timestamp>2012-04-01T16:46:05Z</timestamp>
+ <contributor>
+ <ip>127.0.0.1</ip>
+ </contributor>
+ <comment>Talk BackupDumperTestP1 Summary1</comment>
+ <text id="' . $this->textId4_1 . '" bytes="35" />
+ <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+ </revision>
+ </page>
+';
+ $content .= $page1 . $page2 . $page4;
+ }
+ $content .= $tail;
+ $this->assertEquals( strlen( $content ), file_put_contents(
+ $fname, $content ), "Length of prepared stub" );
+ return $fname;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Tests for log dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class BackupDumperLoggerTest extends DumpTestCase {
+
+
+ // We'll add several log entries and users for this test. The following
+ // variables hold the corresponding ids.
+ private $userId1, $userId2;
+ private $logId1, $logId2, $logId3;
+
+ /**
+ * adds a log entry to the database.
+ *
+ * @param $type string: type of the log entry
+ * @param $subtype string: subtype of the log entry
+ * @param $user User: user that performs the logged operation
+ * @param $ns int: number of the namespace for the entry's target's title
+ * @param $title string: title of the entry's target
+ * @param $comment string: comment of the log entry
+ * @param $parameters Array: (optional) accompanying data that is attached
+ * to the entry
+ *
+ * @return int id of the added log entry
+ */
+ private function addLogEntry( $type, $subtype, User $user, $ns, $title,
+ $comment = null, $parameters = null ) {
+
+ $logEntry = new ManualLogEntry( $type, $subtype );
+ $logEntry->setPerformer( $user );
+ $logEntry->setTarget( Title::newFromText( $title, $ns ) );
+ if ( $comment !== null ) {
+ $logEntry->setComment( $comment );
+ }
+ if ( $parameters !== null ) {
+ $logEntry->setParameters( $parameters );
+ }
+ return $logEntry->insert();
+ }
+
+ function addDBData() {
+ $this->tablesUsed[] = 'logging';
+ $this->tablesUsed[] = 'user';
+
+ try {
+ $user1 = User::newFromName( 'BackupDumperLogUserA' );
+ $this->userId1 = $user1->getId();
+ if ( $this->userId1 === 0 ) {
+ $user1->addToDatabase();
+ $this->userId1 = $user1->getId();
+ }
+ $this->assertGreaterThan( 0, $this->userId1 );
+
+ $user2 = User::newFromName( 'BackupDumperLogUserB' );
+ $this->userId2 = $user2->getId();
+ if ( $this->userId2 === 0 ) {
+ $user2->addToDatabase();
+ $this->userId2 = $user2->getId();
+ }
+ $this->assertGreaterThan( 0, $this->userId2 );
+
+ $this->logId1 = $this->addLogEntry( 'type', 'subtype',
+ $user1, NS_MAIN, "PageA" );
+ $this->assertGreaterThan( 0, $this->logId1 );
+
+ $this->logId2 = $this->addLogEntry( 'supress', 'delete',
+ $user2, NS_TALK, "PageB", "SomeComment" );
+ $this->assertGreaterThan( 0, $this->logId2 );
+
+ $this->logId3 = $this->addLogEntry( 'move', 'delete',
+ $user2, NS_MAIN, "PageA", "SomeOtherComment",
+ array( 'key1' => 1, 3 => 'value3' ) );
+ $this->assertGreaterThan( 0, $this->logId3 );
+
+ } catch ( Exception $e ) {
+ // We'd love to pass $e directly. However, ... see
+ // documentation of exceptionFromAddDBData in
+ // DumpTestCase
+ $this->exceptionFromAddDBData = $e;
+ }
+
+ }
+
+
+ /**
+ * asserts that the xml reader is at the beginning of a log entry and skips over
+ * it while analyzing it.
+ *
+ * @param $id int: id of the log entry
+ * @param $user_name string: user name of the log entry's performer
+ * @param $user_id int: user id of the log entry 's performer
+ * @param $comment string|null: comment of the log entry. If null, the comment
+ * text is ignored.
+ * @param $type string: type of the log entry
+ * @param $subtype string: subtype of the log entry
+ * @param $title string: title of the log entry's target
+ * @param $parameters array: (optional) unserialized data accompanying the log entry
+ */
+ private function assertLogItem( $id, $user_name, $user_id, $comment, $type,
+ $subtype, $title, $parameters = array() ) {
+
+ $this->assertNodeStart( "logitem" );
+ $this->skipWhitespace();
+
+ $this->assertTextNode( "id", $id );
+ $this->assertTextNode( "timestamp", false );
+
+ $this->assertNodeStart( "contributor" );
+ $this->skipWhitespace();
+ $this->assertTextNode( "username", $user_name );
+ $this->assertTextNode( "id", $user_id );
+ $this->assertNodeEnd( "contributor" );
+ $this->skipWhitespace();
+
+ if ( $comment !== null ) {
+ $this->assertTextNode( "comment", $comment );
+ }
+ $this->assertTextNode( "type", $type );
+ $this->assertTextNode( "action", $subtype );
+ $this->assertTextNode( "logtitle", $title );
+
+ $this->assertNodeStart( "params" );
+ $parameters_xml = unserialize( $this->xml->value );
+ $this->assertEquals( $parameters, $parameters_xml );
+ $this->assertTrue( $this->xml->read(), "Skipping past processed text of params" );
+ $this->assertNodeEnd( "params" );
+ $this->skipWhitespace();
+
+ $this->assertNodeEnd( "logitem" );
+ $this->skipWhitespace();
+ }
+
+ function testPlain () {
+ global $wgContLang;
+
+ // Preparing the dump
+ $fname = $this->getNewTempFile();
+ $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+ $dumper->startId = $this->logId1;
+ $dumper->endId = $this->logId3 + 1;
+ $dumper->reporting = false;
+ $dumper->setDb( $this->db );
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
+
+ // Analyzing the dumped data
+ $this->assertDumpStart( $fname );
+
+ $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
+ $this->userId1, null, "type", "subtype", "PageA" );
+
+ $this->assertNotNull( $wgContLang, "Content language object validation" );
+ $namespace = $wgContLang->getNsText( NS_TALK );
+ $this->assertInternalType( 'string', $namespace );
+ $this->assertGreaterThan( 0, strlen( $namespace ) );
+ $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
+ $this->userId2, "SomeComment", "supress", "delete",
+ $namespace . ":PageB" );
+
+ $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
+ $this->userId2, "SomeOtherComment", "move", "delete",
+ "PageA", array( 'key1' => 1, 3 => 'value3' ) );
+
+ $this->assertDumpEnd();
+ }
+
+ function testXmlDumpsBackupUseCaseLogging() {
+ global $wgContLang;
+
+ // Preparing the dump
+ $fname = $this->getNewTempFile();
+ $dumper = new BackupDumper( array ( "--output=gzip:" . $fname,
+ "--reporting=2" ) );
+ $dumper->startId = $this->logId1;
+ $dumper->endId = $this->logId3 + 1;
+ $dumper->setDb( $this->db );
+
+ // xmldumps-backup demands reporting, although this is currently not
+ // implemented in BackupDumper, when dumping logging data. We
+ // nevertheless capture the output of the dump process already now,
+ // to be able to alert (once dumping produces reports) that this test
+ // needs updates.
+ $dumper->stderr = fopen( 'php://output', 'a' );
+ if ( $dumper->stderr === FALSE ) {
+ $this->fail( "Could not open stream for stderr" );
+ }
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
+
+ $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
+
+ // Analyzing the dumped data
+ $this->gunzip( $fname );
+
+ $this->assertDumpStart( $fname );
+
+ $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
+ $this->userId1, null, "type", "subtype", "PageA" );
+
+ $this->assertNotNull( $wgContLang, "Content language object validation" );
+ $namespace = $wgContLang->getNsText( NS_TALK );
+ $this->assertInternalType( 'string', $namespace );
+ $this->assertGreaterThan( 0, strlen( $namespace ) );
+ $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
+ $this->userId2, "SomeComment", "supress", "delete",
+ $namespace . ":PageB" );
+
+ $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
+ $this->userId2, "SomeOtherComment", "move", "delete",
+ "PageA", array( 'key1' => 1, 3 => 'value3' ) );
+
+ $this->assertDumpEnd();
+
+ // Currently, no reporting is implemented. Alert via failure, once
+ // this changes.
+ // If reporting for log dumps has been implemented, please update
+ // the following statement to catch good output
+ $this->expectOutputString( '' );
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Tests for page dumps of BackupDumper
+ *
+ * @group Database
+ * @group Dump
+ */
+class BackupDumperPageTest extends DumpTestCase {
+
+ // We'll add several pages, revision and texts. The following variables hold the
+ // corresponding ids.
+ private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+ private $revId1_1, $textId1_1;
+ private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
+ private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
+ private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
+ private $revId4_1, $textId4_1;
+
+ function addDBData() {
+ $this->tablesUsed[] = 'page';
+ $this->tablesUsed[] = 'revision';
+ $this->tablesUsed[] = 'text';
+
+ try {
+ $title = Title::newFromText( 'BackupDumperTestP1' );
+ $page = WikiPage::factory( $title );
+ list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
+ "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
+ $this->pageId1 = $page->getId();
+
+ $title = Title::newFromText( 'BackupDumperTestP2' );
+ $page = WikiPage::factory( $title );
+ list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
+ list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
+ list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
+ list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
+ "BackupDumperTestP2Text4 some additional Text ",
+ "BackupDumperTestP2Summary4 extra " );
+ $this->pageId2 = $page->getId();
+
+ $title = Title::newFromText( 'BackupDumperTestP3' );
+ $page = WikiPage::factory( $title );
+ list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
+ "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
+ list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
+ "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
+ $this->pageId3 = $page->getId();
+ $page->doDeleteArticle( "Testing ;)" );
+
+ $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
+ $page = WikiPage::factory( $title );
+ list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
+ "Talk about BackupDumperTestP1 Text1",
+ "Talk BackupDumperTestP1 Summary1" );
+ $this->pageId4 = $page->getId();
+ } catch ( Exception $e ) {
+ // We'd love to pass $e directly. However, ... see
+ // documentation of exceptionFromAddDBData in
+ // DumpTestCase
+ $this->exceptionFromAddDBData = $e;
+ }
+
+ }
+
+ protected function setUp() {
+ parent::setUp();
+
+ // Since we will restrict dumping by page ranges (to allow
+ // working tests, even if the db gets prepopulated by a base
+ // class), we have to assert, that the page id are consecutively
+ // increasing
+ $this->assertEquals(
+ array( $this->pageId2, $this->pageId3, $this->pageId4 ),
+ array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
+ "Page ids increasing without holes" );
+
+ }
+
+ function testFullTextPlain () {
+ // Preparing the dump
+ $fname = $this->getNewTempFile();
+ $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+ $dumper->startId = $this->pageId1;
+ $dumper->endId = $this->pageId4 + 1;
+ $dumper->reporting = false;
+ $dumper->setDb( $this->db );
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
+
+ // Checking the dumped data
+ $this->assertDumpStart( $fname );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+ "BackupDumperTestP1Text1" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+ $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
+ "BackupDumperTestP2Text1" );
+ $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+ $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+ "BackupDumperTestP2Text2" );
+ $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+ $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+ "BackupDumperTestP2Text3" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+ "BackupDumperTestP2Text4 some additional Text" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
+ "Talk about BackupDumperTestP1 Text1" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+ }
+
+ function testFullStubPlain () {
+ // Preparing the dump
+ $fname = $this->getNewTempFile();
+ $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+ $dumper->startId = $this->pageId1;
+ $dumper->endId = $this->pageId4 + 1;
+ $dumper->reporting = false;
+ $dumper->setDb( $this->db );
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
+
+ // Checking the dumped data
+ $this->assertDumpStart( $fname );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+ $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
+ $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+ $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95" );
+ $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+ $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+ }
+
+ function testCurrentStubPlain () {
+ // Preparing the dump
+ $fname = $this->getNewTempFile();
+ $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
+ $dumper->startId = $this->pageId1;
+ $dumper->endId = $this->pageId4 + 1;
+ $dumper->reporting = false;
+ $dumper->setDb( $this->db );
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
+
+ // Checking the dumped data
+ $this->assertDumpStart( $fname );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+ }
+
+ function testCurrentStubGzip () {
+ // Preparing the dump
+ $fname = $this->getNewTempFile();
+ $dumper = new BackupDumper( array ( "--output=gzip:" . $fname ) );
+ $dumper->startId = $this->pageId1;
+ $dumper->endId = $this->pageId4 + 1;
+ $dumper->reporting = false;
+ $dumper->setDb( $this->db );
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
+
+ // Checking the dumped data
+ $this->gunzip( $fname );
+ $this->assertDumpStart( $fname );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+ }
+
+
+
+ function testXmlDumpsBackupUseCase () {
+ // xmldumps-backup typically performs a single dump that that writes
+ // out three files
+ // * gzipped stubs of everything (meta-history)
+ // * gzipped stubs of latest revisions of all pages (meta-current)
+ // * gzipped stubs of latest revisions of all pages of namespage 0
+ // (articles)
+ //
+ // We reproduce such a setup with our mini fixture, although we omit
+ // chunks, and all the other gimmicks of xmldumps-backup.
+ //
+ $fnameMetaHistory = $this->getNewTempFile();
+ $fnameMetaCurrent = $this->getNewTempFile();
+ $fnameArticles = $this->getNewTempFile();
+
+ $dumper = new BackupDumper( array ( "--output=gzip:" . $fnameMetaHistory,
+ "--output=gzip:" . $fnameMetaCurrent, "--filter=latest",
+ "--output=gzip:" . $fnameArticles, "--filter=latest",
+ "--filter=notalk", "--filter=namespace:!NS_USER",
+ "--reporting=1000" ) );
+ $dumper->startId = $this->pageId1;
+ $dumper->endId = $this->pageId4 + 1;
+ $dumper->setDb( $this->db );
+
+ // xmldumps-backup uses reporting. We will not check the exact reported
+ // message, as they are dependent on the processing power of the used
+ // computer. We only check that reporting does not crash the dumping
+ // and that something is reported
+ $dumper->stderr = fopen( 'php://output', 'a' );
+ if ( $dumper->stderr === FALSE ) {
+ $this->fail( "Could not open stream for stderr" );
+ }
+
+ // Performing the dump
+ $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
+
+ $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
+
+ // Checking meta-history -------------------------------------------------
+
+ $this->gunzip( $fnameMetaHistory );
+ $this->assertDumpStart( $fnameMetaHistory );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
+ $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
+ $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
+ $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95" );
+ $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+ $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+
+ // Checking meta-current -------------------------------------------------
+
+ $this->gunzip( $fnameMetaCurrent );
+ $this->assertDumpStart( $fnameMetaCurrent );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
+ $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
+ $this->assertPageEnd();
+
+ $this->assertDumpEnd();
+
+ // Checking articles -------------------------------------------------
+
+ $this->gunzip( $fnameArticles );
+ $this->assertDumpStart( $fnameArticles );
+
+ // Page 1
+ $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
+ $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
+ $this->assertPageEnd();
+
+ // Page 2
+ $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+ $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv" );
+ $this->assertPageEnd();
+
+ // Page 3
+ // -> Page is marked deleted. Hence not visible
+
+ // Page 4
+ // -> Page is not in NS_MAIN. Hence not visible
+
+ $this->assertDumpEnd();
+
+ $this->expectETAOutput();
+ }
+
+
+
+}
--- /dev/null
+<?php
+global $IP;
+require_once( "$IP/maintenance/fetchText.php" );
+
+
+/**
+ * Mock for the input/output of FetchText
+ *
+ * FetchText internally tries to access stdin and stdout. We mock those aspects
+ * for testing.
+ */
+class SemiMockedFetchText extends FetchText {
+
+ /**
+ * @var String|null Text to pass as stdin
+ */
+ private $mockStdinText = null;
+
+ /**
+ * @var bool Whether or not a text for stdin has been provided
+ */
+ private $mockSetUp = False;
+
+ /**
+ * @var Array Invocation counters for the mocked aspects
+ */
+ private $mockInvocations = array( 'getStdin' => 0 );
+
+
+
+ /**
+ * Data for the fake stdin
+ *
+ * @param $stdin String The string to be used instead of stdin
+ */
+ function mockStdin( $stdin )
+ {
+ $this->mockStdinText = $stdin;
+ $this->mockSetUp = True;
+ }
+
+ /**
+ * Gets invocation counters for mocked methods.
+ *
+ * @return Array An array, whose keys are function names. The corresponding values
+ * denote the number of times the function has been invoked.
+ */
+ function mockGetInvocations()
+ {
+ return $this->mockInvocations;
+ }
+
+ // -----------------------------------------------------------------
+ // Mocked functions from FetchText follow.
+
+ function getStdin( $len = null )
+ {
+ $this->mockInvocations['getStdin']++;
+ if ( $len !== null ) {
+ throw new PHPUnit_Framework_ExpectationFailedException(
+ "Tried to get stdin with non null parameter" );
+ }
+
+ if ( ! $this->mockSetUp ) {
+ throw new PHPUnit_Framework_ExpectationFailedException(
+ "Tried to get stdin before setting up rerouting" );
+ }
+
+ return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
+ }
+
+}
+
+/**
+ * TestCase for FetchText
+ *
+ * @group Database
+ * @group Dump
+ */
+class FetchTextTest extends MediaWikiTestCase {
+
+ // We add 5 Revisions for this test. Their corresponding text id's
+ // are stored in the following 5 variables.
+ private $textId1;
+ private $textId2;
+ private $textId3;
+ private $textId4;
+ private $textId5;
+
+
+ /**
+ * @var Exception|null As the current MediaWikiTestCase::run is not
+ * robust enough to recover from thrown exceptions directly, we cannot
+ * throw frow within addDBData, although it would be appropriate. Hence,
+ * we catch the exception and store it until we are in setUp and may
+ * finally rethrow the exception without crashing the test suite.
+ */
+ private $exceptionFromAddDBData;
+
+ /**
+ * @var FetchText the (mocked) FetchText that is to test
+ */
+ private $fetchText;
+
+ /**
+ * Adds a revision to a page, while returning the resuting text's id
+ *
+ * @param $page WikiPage The page to add the revision to
+ * @param $text String The revisions text
+ * @param $text String The revisions summare
+ *
+ * @throws MWExcepion
+ */
+ private function addRevision( $page, $text, $summary ) {
+ $status = $page->doEdit( $text, $summary );
+ if ( $status->isGood() ) {
+ $value = $status->getValue();
+ $revision = $value['revision'];
+ $id = $revision->getTextId();
+ if ( $id > 0 ) {
+ return $id;
+ }
+ }
+ throw new MWException( "Could not determine text id" );
+ }
+
+
+ function addDBData() {
+ $this->tablesUsed[] = 'page';
+ $this->tablesUsed[] = 'revision';
+ $this->tablesUsed[] = 'text';
+
+ try {
+ $title = Title::newFromText( 'FetchTextTestPage1' );
+ $page = WikiPage::factory( $title );
+ $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
+
+ $title = Title::newFromText( 'FetchTextTestPage2' );
+ $page = WikiPage::factory( $title );
+ $this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
+ $this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
+ $this->textId4 = $this->addRevision( $page, "FetchTextTestPage2Text3", "FetchTextTestPage2Summary3" );
+ $this->textId5 = $this->addRevision( $page, "FetchTextTestPage2Text4 some additional Text ", "FetchTextTestPage2Summary4 extra " );
+ } catch ( Exception $e ) {
+ // We'd love to pass $e directly. However, ... see
+ // documentation of exceptionFromAddDBData
+ $this->exceptionFromAddDBData = $e;
+ }
+ }
+
+
+ protected function setUp() {
+ parent::setUp();
+
+ // Check if any Exception is stored for rethrowing from addDBData
+ if ( $this->exceptionFromAddDBData !== null ) {
+ throw $this->exceptionFromAddDBData;
+ }
+
+ $this->fetchText = new SemiMockedFetchText();
+ }
+
+
+ /**
+ * Helper to relate FetchText's input and output
+ */
+ private function assertFilter( $input, $expectedOutput ) {
+ $this->fetchText->mockStdin( $input );
+ $this->fetchText->execute();
+ $invocations = $this->fetchText->mockGetInvocations();
+ $this->assertEquals( 1, $invocations['getStdin'],
+ "getStdin invocation counter" );
+ $this->expectOutputString( $expectedOutput );
+ }
+
+
+
+ // Instead of the following functions, a data provider would be great.
+ // However, as data providers are evaluated /before/ addDBData, a data
+ // provider would not know the required ids.
+
+ function testExistingSimple() {
+ $this->assertFilter( $this->textId2,
+ $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+ }
+
+ function testExistingSimpleWithNewline() {
+ $this->assertFilter( $this->textId2 . "\n",
+ $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+ }
+
+ function testExistingSeveral() {
+ $this->assertFilter( "$this->textId1\n$this->textId5\n"
+ . "$this->textId3\n$this->textId3",
+ implode( "", array(
+ $this->textId1 . "\n23\nFetchTextTestPage1Text1",
+ $this->textId5 . "\n44\nFetchTextTestPage2Text4 "
+ . "some additional Text",
+ $this->textId3 . "\n23\nFetchTextTestPage2Text2",
+ $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+ ) ) );
+ }
+
+ function testEmpty() {
+ $this->assertFilter( "", null );
+ }
+
+ function testNonExisting() {
+ $this->assertFilter( $this->textId5 + 10, ( $this->textId5 + 10 ) . "\n-1\n" );
+ }
+
+ function testNegativeInteger() {
+ $this->assertFilter( "-42", "-42\n-1\n" );
+ }
+
+ function testFloatingPointNumberExisting() {
+ // float -> int -> revision
+ $this->assertFilter( $this->textId3 + 0.14159,
+ $this->textId3 . "\n23\nFetchTextTestPage2Text2" );
+ }
+
+ function testFloatingPointNumberNonExisting() {
+ $this->assertFilter( $this->textId5 + 3.14159,
+ ( $this->textId5 + 3 ) . "\n-1\n" );
+ }
+
+ function testCharacters() {
+ $this->assertFilter( "abc", "0\n-1\n" );
+ }
+
+ function testMix() {
+ $this->assertFilter( "ab\n" . $this->textId4 . ".5cd\n\nefg\n" . $this->textId2
+ . "\n" . $this->textId3,
+ implode( "", array(
+ "0\n-1\n",
+ $this->textId4 . "\n23\nFetchTextTestPage2Text3",
+ "0\n-1\n",
+ "0\n-1\n",
+ $this->textId2 . "\n23\nFetchTextTestPage2Text1",
+ $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+ ) ) );
+ }
+
+}
--- /dev/null
+<?php
+global $IP;
+require_once( "$IP/maintenance/getSlaveServer.php" );
+
+/**
+ * Tests for getSlaveServer
+ *
+ * @group Database
+ */
+class GetSlaveServerTest extends MediaWikiTestCase {
+
+ /**
+ * Yields a regular expression that matches a good DB server name
+ *
+ * It matches IPs or hostnames, both optionally followed by a
+ * port specification
+ *
+ * @return String the regular expression
+ */
+ private function getServerRE() {
+ if ( $this->db->getType() === 'sqlite' ) {
+ // for SQLite, only the empty string is a good server name
+ return '';
+ }
+
+ $octet = '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])';
+ $ip = "(($octet\.){3}$octet)";
+
+ $label = '([a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)';
+ $hostname = "($label(\.$label)*)";
+
+ return "($ip|$hostname)(:[0-9]{1,5})?";
+ }
+
+ function testPlain() {
+ $gss = new GetSlaveServer();
+ $gss->execute();
+
+ $this->expectOutputRegex( "/^" . self::getServerRE() . "\n$/D" );
+ }
+
+ function testXmlDumpsBackupUseCase() {
+ global $wgDBprefix;
+
+ global $argv;
+ $argv = array( null, "--globals" );
+
+ $gss = new GetSlaveServer();
+ $gss->loadParamsAndArgs();
+ $gss->execute();
+ $gss->globals();
+
+ // The main answer
+ $output = $this->getActualOutput();
+ $firstLineEndPos = strpos( $output,"\n");
+ if ( $firstLineEndPos === FALSE ) {
+ $this->fail( "Could not find end of first line of output" );
+ }
+ $firstLine = substr( $output, 0 , $firstLineEndPos );
+ $this->assertRegExp( "/^" . self::getServerRE() . "$/D",
+ $firstLine, "DB Server" );
+
+ // xmldumps-backup relies on the wgDBprefix in the output.
+ $this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
+ . $wgDBprefix . "$/m" );
+ }
+
+
+}
require_once( 'PHPUnit/Runner/Version.php' );
if( PHPUnit_Runner_Version::id() !== '@package_version@'
- && version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '<' ) ) {
- die( 'PHPUnit 3.5 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+ && 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' );
throw new MWException( "Unable to read local Selenium Settings from " . $seleniumConfigFile . "\n" );
}
- if ( !defined( 'PHP_VERSION_ID' ) ||
- ( PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 3 ) ) {
- $configArray = self::parse_5_2_ini_file( $seleniumConfigFile );
- } else {
- $configArray = parse_ini_file( $seleniumConfigFile, true );
- }
+ $configArray = parse_ini_file( $seleniumConfigFile, true );
if ( $configArray === false ) {
throw new MWException( "Error parsing " . $seleniumConfigFile . "\n" );
}
return true;
}
- /**
- * PHP 5.2 parse_ini_file() doesn't have support for array keys.
- * This function parses simple ini files with such syntax using just
- * 5.2 functions.
- */
- private static function parse_5_2_ini_file( $ConfigFile ) {
- $file = fopen( $ConfigFile, "rt" );
- if ( !$file ) {
- return false;
- }
- $header = '';
-
- $configArray = array();
-
- while ( ( $line = fgets( $file ) ) !== false ) {
- $line = strtok( $line, "\r\n" );
-
- if ( !$line || $line[0] == ';' ) continue;
-
- if ( $line[0] == '[' && substr( $line, -1 ) == ']' ) {
- $header = substr( $line, 1, -1 );
- $configArray[$header] = array();
- } else {
- $configArray[$header] = array_merge_recursive( $configArray[$header], self::parse_ini_line( $line ) );
- }
- }
- return $configArray;
- }
-
private static function parse_ini_line( $iniLine ) {
static $specialValues = array( 'false' => false, 'true' => true, 'null' => null );
list( $key, $value ) = explode( '=', $iniLine, 2 );