If your PHP is configured as a CGI plug-in rather than an Apache module you may
experience problems, as this configuration is not well tested. safe_mode is also
-not tested and unlikely to work.
+not tested and unlikely to work.
If you want math support see the instructions in math/README
******************* WARNING *******************
-REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE
+REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE
ATTEMPTING TO INSTALL OR UPGRADE!!!
******************* WARNING *******************
-For system requirements, installation and upgrade details, see the files
+For system requirements, installation and upgrade details, see the files
RELEASE-NOTES, INSTALL, and UPGRADE.
== MediaWiki ==
released into the public domain, which does not impair the obligations of users
under the GPL for use of the whole code or other sections thereof.
-MediaWiki makes use of the Sajax Toolkit by modernmethod,
+MediaWiki makes use of the Sajax Toolkit by modernmethod,
http://www.modernmethod.com/sajax/ which has the following license:
'This work is licensed under the Creative Commons Attribution
* jQuery UI upgraded from 1.8.23 to 1.8.24.
* Added separate fa_sha1 field to filearchive table. This allows sha1
searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for queues
+ as well as cross-wiki access to queues, among other things. The schema for the
+ DB queue was changed to support better concurrency and reduce deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+ tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
=== Bug fixes in 1.21 ===
* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
* } else {
* $wgProfiler['class'] = 'ProfilerStub';
* }
- *
+ *
* Configuration of the profiler output can be done in LocalSettings.php
*/
==== From the web ====
-If you browse to the web-based installation script (usually at
-/mw-config/index.php) from your wiki installation you can follow the script and
+If you browse to the web-based installation script (usually at
+/mw-config/index.php) from your wiki installation you can follow the script and
upgrade your database in place.
==== From the command line ====
If you absolutely cannot make the UTF-8 upgrade work, you can try
doing it by hand: dump your old database, convert the dump file
-using iconv as described here:
+using iconv as described here:
http://portal.suse.com/sdb/en/2004/05/jbartsh_utf-8.html
and then reimport it. You can also convert filenames using convmv,
but note that the old directory hashes will no longer be valid,
appropriate serialization and deserialization is handled by the Revision class.
Each revision's content model and serialization format is stored in the revision table (resp. in the archive table, if
-the revision was deleted). The page's (current) content model (that is, the conent model of the latest revision) is also
+the revision was deleted). The page's (current) content model (that is, the content model of the latest revision) is also
stored in the page table.
Note however that the content model and format is only stored if it differs from the page's default, as determined by
$flags: Flags passed to WikiPage::doEditContent()
$revision: New Revision of the article
-'PageContentInsertComplete': After a new article is created
-$article: WikiPage created
-$user: User creating the article
-$content: New content as a Content object
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-
'ArticleMergeComplete': after merging to article using Special:Mergehistory
$targetTitle: target title (object)
$destTitle: destination title (object)
$iswatch: watch flag
$section: section #
-'PageContentSave': before an article is saved.
-$article: the WikiPage (object) being saved
-$user: the user (object) saving the article
-$content: the new article content, as a Content object
-$summary: the article summary (comment)
-$isminor: minor flag
-$iswatch: watch flag
-$section: section #
-
'ArticleSaveComplete': After an article has been updated. DEPRECATED, use PageContentSaveComplete instead.
$article: WikiPage modified
$user: User performing the modification
$status: Status object about to be returned by doEditContent()
$baseRevId: the rev ID (or false) this edit was based on
-'PageContentSaveComplete': After an article has been updated
-$article: WikiPage modified
-$user: User performing the modification
-$content: New content, as a Content object
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-$status: Status object about to be returned by doEditContent()
-$baseRevId: the rev ID (or false) this edit was based on
-
'ArticleUndelete': When one or more revisions of an article are restored
$title: Title corresponding to the article restored
$create: Whether or not the restoration caused the page to be created
$links: array, intended to hold the result. Must be an associative array with
category types as keys and arrays of HTML links as values.
+'PageContentInsertComplete': After a new article is created
+$article: WikiPage created
+$user: User creating the article
+$content: New content as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+
'PageContentLanguage': allows changing the language in which the content of
a page is written. Defaults to the wiki content language ($wgContLang).
$title: Title object
&$pageLang: the page content language (either an object or a language code)
$wgLang: the user language
+'PageContentSave': before an article is saved.
+$article: the WikiPage (object) being saved
+$user: the user (object) saving the article
+$content: the new article content, as a Content object
+$summary: the article summary (comment)
+$isminor: minor flag
+$iswatch: watch flag
+$section: section #
+
+'PageContentSaveComplete': After an article has been updated
+$article: WikiPage modified
+$user: User performing the modification
+$content: New content, as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+$status: Status object about to be returned by doEditContent()
+$baseRevId: the rev ID (or false) this edit was based on
+
'PageHistoryBeforeList': When a history page list is about to be constructed.
$article: the article that the history is loading for
'AbstractContent' => 'includes/content/AbstractContent.php',
'ContentHandler' => 'includes/content/ContentHandler.php',
'Content' => 'includes/content/Content.php',
- 'CssContentHandler' => 'includes/content/ContentHandler.php',
+ 'CssContentHandler' => 'includes/content/CssContentHandler.php',
'CssContent' => 'includes/content/CssContent.php',
- 'JavaScriptContentHandler' => 'includes/content/ContentHandler.php',
+ 'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
'JavaScriptContent' => 'includes/content/JavaScriptContent.php',
'MessageContent' => 'includes/content/MessageContent.php',
- 'TextContentHandler' => 'includes/content/ContentHandler.php',
+ 'TextContentHandler' => 'includes/content/TextContentHandler.php',
'TextContent' => 'includes/content/TextContent.php',
- 'WikitextContentHandler' => 'includes/content/ContentHandler.php',
+ 'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
'WikitextContent' => 'includes/content/WikitextContent.php',
# includes/actions
'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
+ 'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
'EmaillingJob' => 'includes/job/EmaillingJob.php',
'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
'Job' => 'includes/job/Job.php',
+ 'JobQueue' => 'includes/job/JobQueue.php',
+ 'JobQueueDB' => 'includes/job/JobQueueDB.php',
+ 'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
* sorts before all items.
*/
function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+ if ( $valueCount === 0 ) {
+ return false;
+ }
+
$min = 0;
- $max = $valueCount - 1;
+ $max = $valueCount;
do {
$mid = $min + ( ( $max - $min ) >> 1 );
$item = call_user_func( $valueCallback, $mid );
}
} while ( $min < $max - 1 );
- if ( $min == 0 && $max == 0 && $comparison > 0 ) {
- // Before the first item
- return false;
- } else {
- return $min;
+ if ( $min == 0 ) {
+ $item = call_user_func( $valueCallback, $min );
+ $comparison = call_user_func( $comparisonCallback, $target, $item );
+ if ( $comparison < 0 ) {
+ // Before the first item
+ return false;
+ }
}
+ return $min;
}
static function isCjk( $codepoint ) {
*/
$wgCopyUploadsDomains = array();
+/**
+ * Enable copy uploads from Special:Upload. $wgAllowCopyUploads must also be
+ * true. If $wgAllowCopyUploads is true, but this is false, you will only be
+ * able to perform copy uploads from the API or extensions (e.g. UploadWizard).
+ */
+$wgCopyUploadsFromSpecialUpload = false;
+
/**
* Proxy to use for copy upload requests.
* @since 1.20
* $wgSharedPrefix is the table prefix for the shared database. It defaults to
* $wgDBprefix.
*
- * @deprecated In new code, use the $wiki parameter to wfGetLB() to access
- * remote databases. Using wfGetLB() allows the shared database to reside on
- * separate servers to the wiki's own database, with suitable configuration
+ * @deprecated In new code, use the $wiki parameter to wfGetLB() to access
+ * remote databases. Using wfGetLB() allows the shared database to reside on
+ * separate servers to the wiki's own database, with suitable configuration
* of $wgLBFactoryConf.
*/
$wgSharedDB = null;
/**
* Whether to use a Host header in purge requests sent to the proxy servers
- * configured in $wgSquidServers. Set this to false to support Squid
+ * configured in $wgSquidServers. Set this to false to support Squid
* configured in forward-proxy mode.
*
* If this is set to true, a Host header will be sent, and only the path
* component of the URL will appear on the request line, as if the request
- * were a non-proxy HTTP 1.1 request. Varnish only supports this style of
+ * were a non-proxy HTTP 1.1 request. Varnish only supports this style of
* request. Squid supports this style of request only if reverse-proxy mode
* (http_port ... accel) is enabled.
*
* will be sent in the request line, as is the standard for an HTTP proxy
* request in both HTTP 1.0 and 1.1. This style of request is not supported
* by Varnish, but is supported by Squid in either configuration (forward or
- * reverse).
+ * reverse).
*
* @since 1.21
*/
*/
$wgJobTypesExcludedFromDefaultQueue = array();
+/**
+ * Map of job types to configuration arrays.
+ * These settings should be global to all wikis.
+ */
+$wgJobTypeConf = array(
+ 'default' => array( 'class' => 'JobQueueDB' ),
+);
+
/**
* Additional functions to be performed with updateSpecialPages.
* Expensive Querypages are already updated.
*
* @since 1.21
*/
-$wgContentHandlerUseDB = true;
+$wgContentHandlerUseDB = false;
+
+/**
+ * Determines which types of text are parsed as wikitext. This does not imply that these kinds
+ * of texts are also rendered as wikitext, it only means that links, magic words, etc will have
+ * the effect on the database they would have on a wikitext page.
+ *
+ * @todo: On the long run, it would be nice to put categories etc into a separate structure,
+ * or at least parse only the contents of comments in the scripts.
+ *
+ * @since 1.21
+ */
+$wgTextModelsToParse = array(
+ CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
+ CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
+ CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
+);
/**
* Whether the user must enter their password to change their e-mail address
/**@{
* RecentChange type identifiers
*/
-define( 'RC_EDIT', 0);
-define( 'RC_NEW', 1);
-define( 'RC_MOVE', 2); // obsolete
-define( 'RC_LOG', 3);
-define( 'RC_MOVE_OVER_REDIRECT', 4); // obsolete
+define( 'RC_EDIT', 0 );
+define( 'RC_NEW', 1 );
+define( 'RC_MOVE', 2 ); // obsolete
+define( 'RC_LOG', 3 );
+define( 'RC_MOVE_OVER_REDIRECT', 4 ); // obsolete
+define( 'RC_EXTERNAL', 5 );
/**@}*/
/**@{
$content = $this->getContentObject();
# Use the normal message if there's nothing to display
- if ( $this->firsttime && $content->isEmpty() ) {
+ if ( $this->firsttime && ( !$content || $content->isEmpty() ) ) {
$action = $this->mTitle->exists() ? 'edit' :
( $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage' );
throw new PermissionsError( $action, $permErrors );
$this->edittime = $this->mArticle->getTimestamp();
$content = $this->getContentObject( false ); #TODO: track content object?!
+ if ( $content === false ) {
+ return false;
+ }
$this->textbox1 = $this->toEditText( $content );
// activate checkboxes if user wants them to be always active
/**
* Fetch initial editing page content.
*
- * @param $def_text string
+ * @param $def_text string|bool
* @return mixed string on success, $def_text for invalid sections
* @private
* @deprecated since 1.21, get WikiPage::getContent() instead.
}
/**
- * @param Content|false $def_content The default value to return
+ * @param Content|null $def_content The default value to return
*
* @return mixed Content on success, $def_content for invalid sections
*
* to the original text of the edit.
*
* This difers from Article::getContent() that when a missing revision is
- * encountered the result will be an empty string and not the
+ * encountered the result will be null and not the
* 'missing-revision' message.
*
* @since 1.19
- * @return string
+ * @return Content|null
*/
private function getOriginalContent() {
if ( $this->section == 'new' ) {
$parserOptions = ParserOptions::newFromUser( $wgUser );
$content = $page->getContent( Revision::RAW );
+ if ( !$content ) {
+ return $handler->makeEmptyContent();
+ }
+
return $content->preloadTransform( $title, $parserOptions );
}
if ( $ok ) {
$editText = $this->toEditText( $editContent );
return true;
- } else {
- return false;
}
+ return false;
}
/**
* @private
* @todo document
*
- * @parma $editText string
- *
+ * @param $editContent
* @return bool
* @since since 1.WD
*/
// This is the revision the editor started from
$baseRevision = $this->getBaseRevision();
- if ( is_null( $baseRevision ) ) {
+ $baseContent = $baseRevision ? $baseRevision->getContent() : null;
+
+ if ( is_null( $baseContent ) ) {
wfProfileOut( __METHOD__ );
return false;
}
- $baseContent = $baseRevision->getContent();
// The current state, we want to merge updates into it
$currentRevision = Revision::loadFromTitle( $db, $this->mTitle );
- if ( is_null( $currentRevision ) ) {
+ $currentContent = $currentRevision ? $currentRevision->getContent() : null;
+
+ if ( is_null( $currentContent ) ) {
wfProfileOut( __METHOD__ );
return false;
}
- $currentContent = $currentRevision->getContent();
$handler = ContentHandler::getForModelID( $baseContent->getModel() );
# Give a notice if the user is editing a deleted/moved page...
if ( !$this->mTitle->exists() ) {
LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->mTitle,
- '', array( 'lim' => 10,
- 'conds' => array( "log_action != 'revision'" ),
- 'showIfEmpty' => false,
- 'msgKey' => array( 'recreate-moveddeleted-warn' ) )
+ '',
+ array(
+ 'lim' => 10,
+ 'conds' => array( "log_action != 'revision'" ),
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'recreate-moveddeleted-warn' )
+ )
);
}
}
// Added using template syntax, to take <noinclude>'s into account.
$wgOut->addWikiTextTitleTidy( '{{:' . $title->getFullText() . '}}', $this->mTitle );
return true;
- } else {
- return false;
}
- } else {
- return false;
}
+ return false;
}
/**
- * Gets an editable textual representation of the given Content object.
+ * Gets an editable textual representation of $content.
* The textual representation can be turned by into a Content object by the
* toEditContent() method.
*
+ * If $content is null or false or a string, $content is returned unchanged.
+ *
* If the given Content object is not of a type that can be edited using the text base EditPage,
* an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
* content.
*
- * @param Content $content
+ * @param Content|null|false|string $content
* @return String the editable text form of the content.
*
* @throws MWException if $content is not an instance of TextContent and $this->allowNonTextContent is not true.
*/
- protected function toEditText( Content $content ) {
+ protected function toEditText( $content ) {
+ if ( $content === null || $content === false ) {
+ return $content;
+ }
+
+ if ( is_string( $content ) ) {
+ return $content;
+ }
+
if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
throw new MWException( "This content model can not be edited as text: "
. ContentHandler::getLocalizedName( $content->getModel() ) );
* an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
* content.
*
- * @param String|null|false $text Text to unserialize
+ * @param String|null|bool $text Text to unserialize
* @return Content The content object created from $text. If $text was false or null, false resp. null will be
* returned instead.
*
/**
* Send the edit form and related headers to $wgOut
- * @param $formCallback Callback that takes an OutputPage parameter; will be called
+ * @param $formCallback Callback|null that takes an OutputPage parameter; will be called
* during form output near the top, for captchas and the like.
*/
function showEditForm( $formCallback = null ) {
protected function displayPreviewArea( $previewOutput, $isOnTop = false ) {
global $wgOut;
$classes = array();
- if ( $isOnTop )
+ if ( $isOnTop ) {
$classes[] = 'ontop';
+ }
$attribs = array( 'id' => 'wikiPreview', 'class' => implode( ' ', $classes ) );
* save and then make a comparison.
*/
function showDiff() {
- global $wgUser, $wgContLang, $wgParser, $wgOut;
+ global $wgUser, $wgContLang, $wgOut;
$oldtitlemsg = 'currentrev';
# if message does not exist, show diff against the preloaded default
$this->section, $textboxContent,
$this->summary, $this->edittime );
- ContentHandler::runLegacyHooks( 'EditPageGetDiffText', array( $this, &$newContent ) );
- wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
+ if ( $newContent ) {
+ ContentHandler::runLegacyHooks( 'EditPageGetDiffText', array( $this, &$newContent ) );
+ wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
- $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
- $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts );
+ $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
+ $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts );
+ }
if ( ( $oldContent && !$oldContent->isEmpty() ) || ( $newContent && !$newContent->isEmpty() ) ) {
$oldtitle = wfMessage( $oldtitlemsg )->parse();
$newtitle = wfMessage( 'yourtext' )->parse();
+ if ( !$oldContent ) {
+ $oldContent = $newContent->getContentHandler()->makeEmptyContent();
+ }
+
+ if ( !$newContent ) {
+ $newContent = $oldContent->getContentHandler()->makeEmptyContent();
+ }
+
$de = $oldContent->getContentHandler()->createDifferenceEngine( $this->mArticle->getContext() );
$de->setContent( $oldContent, $newContent );
* @return string
*/
function getPreviewText() {
- global $wgOut, $wgUser, $wgParser, $wgRawHtml, $wgLang;
+ global $wgOut, $wgUser, $wgRawHtml, $wgLang;
wfProfileIn( __METHOD__ );
/**
* Produce the stock "your edit contains spam" page
*
- * @param $match string Text which triggered one or more filters
+ * @param $match string|bool Text which triggered one or more filters
* @deprecated since 1.17 Use method spamPageWithContent() instead
*/
static function spamPage( $match = false ) {
*
* @file
*/
-
+
/**
- * Base class for general text storage via the "object" flag in old_flags, or
- * two-part external storage URLs. Used for represent efficient concatenated
+ * Base class for general text storage via the "object" flag in old_flags, or
+ * two-part external storage URLs. Used for represent efficient concatenated
* storage, and migration-related pointer objects.
*/
interface HistoryBlob
* @return bool
*/
public function isHappy() {
- return $this->mSize < $this->mMaxSize
+ return $this->mSize < $this->mMaxSize
&& count( $this->mItems ) < $this->mMaxCount;
}
}
/** Total uncompressed size */
var $mSize = 0;
- /**
- * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is
+ /**
+ * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is
* an empty string:
*
* { item[map[i]] - item[map[i-1]] where i > 0
- * diff[i] = {
+ * diff[i] = {
* { item[map[i]] - Z where i = 0
*/
var $mDiffs;
* The maximum number of text items before the object becomes sad
*/
var $mMaxCount = 100;
-
+
/** Constants from xdiff.h */
const XDL_BDOP_INS = 1;
const XDL_BDOP_CPY = 2;
* @throws MWException
*/
function compress() {
- if ( !function_exists( 'xdiff_string_rabdiff' ) ){
+ if ( !function_exists( 'xdiff_string_rabdiff' ) ){
throw new MWException( "Need xdiff 1.5+ support to write DiffHistoryBlob\n" );
}
if ( isset( $this->mDiffs ) ) {
# Pure PHP implementation
$header = unpack( 'Vofp/Vcsize', substr( $diff, 0, 8 ) );
-
+
# Check the checksum if hash/mhash is available
$ofp = $this->xdiffAdler32( $base );
if ( $ofp !== false && $ofp !== substr( $diff, 0, 4 ) ) {
wfDebug( __METHOD__. ": incorrect base length\n" );
return false;
}
-
+
$p = 8;
$out = '';
while ( $p < strlen( $diff ) ) {
}
/**
- * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
+ * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
* the bytes backwards and initialised with 0 instead of 1. See bug 34428.
*
* Returns false if no hashing library is available
if ( $init === null ) {
$init = str_repeat( "\xf0", 205 ) . "\xee" . str_repeat( "\xf0", 67 ) . "\x02";
}
- // The real Adler-32 checksum of $init is zero, so it initialises the
- // state to zero, as it is at the start of LibXDiff's checksum
+ // The real Adler-32 checksum of $init is zero, so it initialises the
+ // state to zero, as it is at the start of LibXDiff's checksum
// algorithm. Appending the subject string then simulates LibXDiff.
if ( function_exists( 'hash' ) ) {
$hash = hash( 'adler32', $init . $s, true );
if ( isset( $info['base'] ) ) {
// Old format
$this->mDiffMap = range( 0, count( $this->mDiffs ) - 1 );
- array_unshift( $this->mDiffs,
+ array_unshift( $this->mDiffs,
pack( 'VVCV', 0, 0, self::XDL_BDOP_INSB, strlen( $info['base'] ) ) .
$info['base'] );
} else {
* @return bool
*/
function isHappy() {
- return $this->mSize < $this->mMaxSize
+ return $this->mSize < $this->mMaxSize
&& count( $this->mItems ) < $this->mMaxCount;
}
'class', // html4, html5
'accesskey', // as of html5, multiple space-separated values allowed
// html4-spec doesn't document rel= as space-separated
- // but has been used like that and is now documented as such
+ // but has been used like that and is now documented as such
// in the html5-spec.
'rel',
);
// values. Implode/explode to get those into the main array as well.
if ( is_array( $value ) ) {
// If input wasn't an array, we can skip this step
-
$newValue = array();
foreach ( $value as $k => $v ) {
if ( is_string( $v ) ) {
# @todo FIXME: Is this really true?
$map['<'] = '<';
}
-
$ret .= " $key=$quote" . strtr( $value, $map ) . $quote;
}
}
if ( isset( $revisionInfo['model'] ) ) {
$revision->setModel( $revisionInfo['model'] );
}
- if ( isset( $revisionInfo['text'] ) ) {
+ if ( isset( $revisionInfo['format'] ) ) {
$revision->setFormat( $revisionInfo['format'] );
}
$revision->setTitle( $pageInfo['_title'] );
/**
* Some functions to help implement an external link filter for spam control.
- *
+ *
* @todo implement the filter. Currently these are just some functions to help
* maintenance/cleanupSpam.php remove links to a single specified domain. The
* next thing is to implement functions for checking a given page against a big
// Reverse the labels in the hostname, convert to lower case
// For emails reverse domainpart only
if ( $prot == 'mailto:' && strpos($host, '@') ) {
- // complete email adress
+ // complete email adress
$mailparts = explode( '@', $host );
$domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) );
$host = $domainpart . '@' . $mailparts[0];
$like = array( "$prot$host", $db->anyString() );
} elseif ( $prot == 'mailto:' ) {
// domainpart of email adress only. do not add '.'
- $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
- $like = array( "$prot$host", $db->anyString() );
+ $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
+ $like = array( "$prot$host", $db->anyString() );
} else {
- $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
+ $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
if ( substr( $host, -1, 1 ) !== '.' ) {
$host .= '.';
}
// check if the user has an edit
$attribs = array();
if ( $redContribsWhenNoEdits ) {
- $count = !is_null( $edits ) ? $edits : User::edits( $userId );
- if ( $count == 0 ) {
+ if ( intval( $edits ) === 0 && $edits !== 0 ) {
+ $user = User::newFromId( $userId );
+ $edits = $user->getEditCount();
+ }
+ if ( $edits === 0 ) {
$attribs['class'] = 'new';
}
}
*/
public static function buildRollbackLink( $rev, IContextSource $context = null ) {
global $wgShowRollbackEditCount, $wgMiserMode;
-
+
// To config which pages are effected by miser mode
$disableRollbackEditCountSpecialPage = array( 'Recentchanges', 'Watchlist' );
*/
static function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
wfDeprecated( __METHOD__, '1.16' );
-
+
$nt = Title::newFromText( $title );
if ( $nt instanceof Title ) {
return self::makeBrokenLinkObj( $nt, $text, $query, $trail );
*/
static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
# wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-
+
wfProfileIn( __METHOD__ );
$query = wfCgiToArray( $query );
list( $inside, $trail ) = self::splitTrail( $trail );
$title, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '', $style = ''
) {
# wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-
+
wfProfileIn( __METHOD__ );
if ( $text == '' ) {
*/
static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
wfDeprecated( __METHOD__, '1.16' );
-
+
wfProfileIn( __METHOD__ );
list( $inside, $trail ) = self::splitTrail( $trail );
*/
static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
wfDeprecated( __METHOD__, '1.16' );
-
+
if ( $colour != '' ) {
$style = self::getInternalLinkAttributesObj( $nt, $text, $colour );
} else {
* This is used as a fallback to mime.types files.
* An extensive list of well known mime types is provided by
* the file mime.types in the includes directory.
- *
+ *
* This list concatenated with mime.types is used to create a mime <-> ext
* map. Each line contains a mime type followed by a space separated list of
- * extensions. If multiple extensions for a single mime type exist or if
+ * extensions. If multiple extensions for a single mime type exist or if
* multiple mime types exist for a single extension then in most cases
* MediaWiki assumes that the first extension following the mime type is the
* canonical extension, and the first time a mime type appears for a certain
* extension is considered the canonical mime type.
- *
+ *
* (Note that appending $wgMimeTypeFile to the end of MM_WELL_KNOWN_MIME_TYPES
- * sucks because you can't redefine canonical types. This could be fixed by
+ * sucks because you can't redefine canonical types. This could be fixed by
* appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
* what will break? In practice this probably isn't a problem anyway -- Bryan)
*/
image/gif gif
image/jpeg jpeg jpg jpe
image/png png
-image/svg+xml svg
+image/svg+xml svg
image/svg svg
image/tiff tiff tif
image/vnd.djvu djvu
return self::$instance;
}
- /**
- * Returns a list of file extensions for a given mime type as a space
+ /**
+ * Returns a list of file extensions for a given mime type as a space
* separated string or null if the mime type was unrecognized. Resolves
* mime type aliases.
- *
+ *
* @param $mime string
* @return string|null
*/
return null;
}
- /**
- * Returns a list of mime types for a given file extension as a space
+ /**
+ * Returns a list of mime types for a given file extension as a space
* separated string or null if the extension was unrecognized.
- *
+ *
* @param $ext string
* @return string|null
*/
return $r;
}
- /**
+ /**
* Returns a single mime type for a given file extension or null if unknown.
* This is always the first type from the list returned by getTypesForExtension($ext).
- *
+ *
* @param $ext string
* @return string|null
*/
}
- /**
- * Tests if the extension matches the given mime type. Returns true if a
- * match was found, null if the mime type is unknown, and false if the
+ /**
+ * Tests if the extension matches the given mime type. Returns true if a
+ * match was found, null if the mime type is unknown, and false if the
* mime type is known but no matches where found.
- *
+ *
* @param $extension string
* @param $mime string
* @return bool|null
return in_array( $extension, $ext );
}
- /**
- * Returns true if the mime type is known to represent an image format
+ /**
+ * Returns true if the mime type is known to represent an image format
* supported by the PHP GD library.
*
* @param $mime string
- *
+ *
* @return bool
*/
public function isPHPImageType( $mime ) {
return in_array( strtolower( $extension ), $types );
}
- /**
+ /**
* Improves a mime type using the file extension. Some file formats are very generic,
- * so their mime type is not very meaningful. A more useful mime type can be derived
- * by looking at the file extension. Typically, this method would be called on the
+ * so their mime type is not very meaningful. A more useful mime type can be derived
+ * by looking at the file extension. Typically, this method would be called on the
* result of guessMimeType().
- *
+ *
* Currently, this method does the following:
*
* If $mime is "unknown/unknown" and isRecognizableExtension( $ext ) returns false,
- * return the result of guessTypesForExtension($ext).
+ * return the result of guessTypesForExtension($ext).
*
* If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
- * gives true, return the result of guessTypesForExtension($ext).
+ * gives true, return the result of guessTypesForExtension($ext).
*
* @param $mime String: the mime type, typically guessed from a file's content.
* @param $ext String: the file extension, as taken from the file name
public function improveTypeFromExtension( $mime, $ext ) {
if ( $mime === 'unknown/unknown' ) {
if ( $this->isRecognizableExtension( $ext ) ) {
- wfDebug( __METHOD__. ': refusing to guess mime type for .' .
+ wfDebug( __METHOD__. ': refusing to guess mime type for .' .
"$ext file, we should have recognized it\n" );
} else {
- // Not something we can detect, so simply
+ // Not something we can detect, so simply
// trust the file extension
$mime = $this->guessTypesForExtension( $ext );
}
// find the proper mime type for that file extension
$mime = $this->guessTypesForExtension( $ext );
} else {
- wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " .
+ wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " .
".$ext is not a known OPC extension.\n" );
$mime = 'application/zip';
}
return $mime;
}
- /**
- * Mime type detection. This uses detectMimeType to detect the mime type
- * of the file, but applies additional checks to determine some well known
- * file formats that may be missed or misinterpreter by the default mime
- * detection (namely XML based formats like XHTML or SVG, as well as ZIP
+ /**
+ * Mime type detection. This uses detectMimeType to detect the mime type
+ * of the file, but applies additional checks to determine some well known
+ * file formats that may be missed or misinterpreter by the default mime
+ * detection (namely XML based formats like XHTML or SVG, as well as ZIP
* based formats like OPC/ODF files).
*
* @param $file String: the file to check
* @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
- * Set it to false to ignore the extension. DEPRECATED! Set to false, use
+ * Set it to false to ignore the extension. DEPRECATED! Set to false, use
* improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string the mime type of $file
// @todo FIXME: Shouldn't this be rb?
$f = fopen( $file, 'rt' );
wfRestoreWarnings();
-
+
if( !$f ) {
return 'unknown/unknown';
}
return false;
}
-
+
/**
* Detect application-specific file type of a given ZIP file from its
* header data. Currently works for OpenDocument and OpenXML types...
* @param $header String: some reasonably-sized chunk of file header
* @param $tail String: the tail of the file
* @param $ext Mixed: the file extension, or true to extract it from the filename.
- * Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
+ * Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
* use improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string
wfDebug( __METHOD__.": detected $mime from ZIP archive\n" );
} elseif ( preg_match( $openxmlRegex, substr( $header, 30 ) ) ) {
$mime = "application/x-opc+zip";
- # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
- if ( $ext !== true && $ext !== false ) {
+ # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
+ if ( $ext !== true && $ext !== false ) {
/** This is the mode used by getPropsFromPath
* These mime's are stored in the database, where we don't really want
* x-opc+zip, because we use it only for internal purposes
}
}
wfDebug( __METHOD__.": detected an Open Packaging Conventions archive: $mime\n" );
- } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
+ } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
if ( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
$mime = "application/msword";
- }
+ }
switch( substr( $header, 512, 6) ) {
case "\xEC\xA5\xC1\x00\x0E\x00":
case "\xEC\xA5\xC1\x00\x1C\x00":
return $mime;
}
- /**
- * Internal mime type detection. Detection is done using an external
- * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
- * extension and mime_content_type are tried (in this order), if they
- * are available. If the dections fails and $ext is not false, the mime
+ /**
+ * Internal mime type detection. Detection is done using an external
+ * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
+ * extension and mime_content_type are tried (in this order), if they
+ * are available. If the dections fails and $ext is not false, the mime
* type is guessed from the file extension, using guessTypesForExtension.
- *
- * If the mime type is still unknown, getimagesize is used to detect the
- * mime type if the file is an image. If no mime type can be determined,
+ *
+ * If the mime type is still unknown, getimagesize is used to detect the
+ * mime type if the file is an image. If no mime type can be determined,
* this function returns 'unknown/unknown'.
*
* @param $file String: the file to check
* @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
- * Set it to false to ignore the extension. DEPRECATED! Set to false, use
+ * Set it to false to ignore the extension. DEPRECATED! Set to false, use
* improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string the mime type of $file
return $type;
}
- /**
+ /**
* Returns a media code matching the given mime type or file extension.
* File extensions are represented by a string starting with a dot (.) to
* distinguish them from mime types.
* @return int|string
*/
function findMediaType( $extMime ) {
- if ( strpos( $extMime, '.' ) === 0 ) {
+ if ( strpos( $extMime, '.' ) === 0 ) {
// If it's an extension, look up the mime types
$m = $this->getTypesForExtension( substr( $extMime, 1 ) );
if ( !$m ) {
}
/**
- * Get the MIME types that various versions of Internet Explorer would
+ * Get the MIME types that various versions of Internet Explorer would
* detect from a chunk of the content.
*
* @param $fileName String: the file name (unused at present)
*/
class Revision implements IDBAccessObject {
protected $mId;
+
+ /**
+ * @var int|null
+ */
protected $mPage;
protected $mUserText;
protected $mOrigUserText;
protected $mComment;
protected $mText;
protected $mTextRow;
+
+ /**
+ * @var null|Title
+ */
protected $mTitle;
protected $mCurrent;
protected $mContentModel;
protected $mContentFormat;
+
+ /**
+ * @var Content
+ */
protected $mContent;
+
+ /**
+ * @var null|ContentHandler
+ */
protected $mContentHandler;
// Revision deletion constants
* @param $flags Integer Bitfield (optional)
* @return Revision or null
*/
- public static function newFromTitle( $title, $id = 0, $flags = null ) {
+ public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
$conds = array(
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey()
} else {
// Use a join to get the latest revision
$conds[] = 'rev_id=page_latest';
- // Callers assume this will be up-to-date
- $flags = is_int( $flags ) ? $flags : self::READ_LATEST; // b/c
}
return self::newFromConds( $conds, (int)$flags );
}
* @param $user User object to check for, only if FOR_THIS_USER is passed
* to the $audience parameter
* @since 1.21
- * @return Content
+ * @return Content|null
*/
public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
*/
public function getRawText() {
ContentHandler::deprecated( __METHOD__, "1.21" );
-
return $this->getText( self::RAW );
}
$handler = $this->getContentHandler();
$format = $this->getContentFormat();
- $title = $this->getTitle();
if( is_null( $this->mText ) ) {
// Load text on demand:
/**
* Returns the content handler appropriate for this revision's content model.
*
+ * @throws MWException
* @return ContentHandler
*/
public function getContentHandler() {
// this is a fallback SQL file
$testSqlFile = false;
$testImageZip = false;
-
+
// if we find a request parameter containing the test name, set a cookie with the test name
if ( isset( $_GET['setupTestSuite'] ) ) {
$setupTestSuiteName = $_GET['setupTestSuite'];
true
);
}
-
+
$testIncludes = array(); // array containing all the includes needed for this test
$testGlobalConfigs = array(); // an array containg all the global configs needed for this test
$testResourceFiles = array(); // an array containing all the resource files needed for this test
if ( isset( $testResourceFiles['images'] ) ) {
$testImageZip = $testResourceFiles['images'];
}
-
+
if ( isset( $testResourceFiles['db'] ) ) {
$testSqlFile = $testResourceFiles['db'];
$testResourceName = getTestResourceNameFromTestSuiteName( $setupTestSuiteName );
-
+
switchToTestResources( $testResourceName, false ); // false means do not switch database yet
setupTestResources( $testResourceName, $testSqlFile, $testImageZip );
}
if ( isset( $_GET['clearTestSuite'] ) ) {
$testSuiteName = getTestSuiteNameFromCookie( $cookieName );
- $expire = time() - 600;
+ $expire = time() - 600;
setcookie(
$cookieName,
'',
$wgCookieSecure,
true
);
-
+
$testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
teardownTestResources( $testResourceName );
}
// if a cookie is found, run the appropriate callback to get the config params.
-if ( isset( $_COOKIE[$cookieName] ) ) {
+if ( isset( $_COOKIE[$cookieName] ) ) {
$testSuiteName = getTestSuiteNameFromCookie( $cookieName );
if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
return;
}
-
+
$testIncludes = array(); // array containing all the includes needed for this test
$testGlobalConfigs = array(); // an array containg all the global configs needed for this test
$testResourceFiles = array(); // an array containing all the resource files needed for this test
- $callback = $wgSeleniumTestConfigs[$testSuiteName];
+ $callback = $wgSeleniumTestConfigs[$testSuiteName];
call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
if ( isset( $testResourceFiles['db'] ) ) {
require_once( $file );
}
foreach ( $testGlobalConfigs as $key => $value ) {
- if ( is_array( $value ) ) {
+ if ( is_array( $value ) ) {
$GLOBALS[$key] = array_merge( $GLOBALS[$key], $value );
-
} else {
$GLOBALS[$key] = $value;
}
if ( $testResourceName == '' ) {
die( 'Cannot identify a test the resources should be installed for.' );
}
-
+
// create tables
$dbw = wfGetDB( DB_MASTER );
$dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
}
if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) {
$toolbox['info'] = $this->data['nav_urls']['info'];
+ $toolbox['info']['id'] = 't-info';
}
wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) );
foreach ( array( 'id', 'class', 'active', 'tag' ) as $k ) {
unset( $link[$k] );
}
- if ( isset( $item['id'] ) ) {
+ if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
// The id goes on the <li> not on the <a> for single links
// but makeSidebarLink still needs to know what id to use when
// generating tooltips and accesskeys.
* @param $dbkeys Array
*/
protected function invalidatePages( $namespace, array $dbkeys ) {
- if ( !count( $dbkeys ) ) {
+ if ( $dbkeys === array() ) {
return;
}
'page_touched < ' . $this->mDb->addQuotes( $now )
), __METHOD__
);
+
foreach ( $res as $row ) {
$ids[] = $row->page_id;
}
- if ( !count( $ids ) ) {
+
+ if ( $ids === array() ) {
return;
}
}
/**
- * Get the error message as HTML. This is done by parsing the wikitext error
+ * Get the error message as HTML. This is done by parsing the wikitext error
* message.
*/
public function getHTML( $shortContext = false, $longContext = false ) {
$linkCache = LinkCache::singleton();
$cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
- if ( $cached === null ) {
+ if ( $cached === null ) {
// TODO: check the assumption that the cache actually knows about this title
// and handle this, such as get the title from the database.
// See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
/**
* Count the number of edits of a user
- * @todo It should not be static and some day should be merged as proper member function / deprecated -- domas
*
* @param $uid Int User ID to check
* @return Int the user's edit count
+ *
+ * @deprecated since 1.21 in favour of User::getEditCount
*/
public static function edits( $uid ) {
- wfProfileIn( __METHOD__ );
- $dbr = wfGetDB( DB_SLAVE );
- // check if the user_editcount field has been initialized
- $field = $dbr->selectField(
- 'user', 'user_editcount',
- array( 'user_id' => $uid ),
- __METHOD__
- );
-
- if( $field === null ) { // it has not been initialized. do so.
- $dbw = wfGetDB( DB_MASTER );
- $count = $dbr->selectField(
- 'revision', 'count(*)',
- array( 'rev_user' => $uid ),
- __METHOD__
- );
- $dbw->update(
- 'user',
- array( 'user_editcount' => $count ),
- array( 'user_id' => $uid ),
- __METHOD__
- );
- } else {
- $count = $field;
- }
- wfProfileOut( __METHOD__ );
- return $count;
+ wfDeprecated( __METHOD__, '1.21' );
+ $user = self::newFromId( $uid );
+ return $user->getEditCount();
}
/**
}
/**
- * Clear various cached data stored in this object.
+ * Clear various cached data stored in this object. The cache of the user table
+ * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
+ *
* @param $reloadFrom bool|String Reload user and user_groups table data from a
* given source. May be "name", "id", "defaults", "session", or false for
* no reload.
$this->mEffectiveGroups = null;
$this->mImplicitGroups = null;
$this->mOptions = null;
+ $this->mOptionsLoaded = false;
$this->mEditCount = null;
if ( $reloadFrom ) {
if( $this->getId() ) {
if ( !isset( $this->mEditCount ) ) {
/* Populate the count, if it has not been populated yet */
- $this->mEditCount = User::edits( $this->mId );
+ wfProfileIn( __METHOD__ );
+ $dbr = wfGetDB( DB_SLAVE );
+ // check if the user_editcount field has been initialized
+ $count = $dbr->selectField(
+ 'user', 'user_editcount',
+ array( 'user_id' => $this->mId ),
+ __METHOD__
+ );
+
+ if( $count === null ) {
+ // it has not been initialized. do so.
+ $count = $this->initEditCount();
+ }
+ wfProfileOut( __METHOD__ );
+ $this->mEditCount = $count;
}
return $this->mEditCount;
} else {
}
/**
- * Add this existing user object to the database. If the user already
- * exists, a fatal status object is returned, and the user object is
+ * Add this existing user object to the database. If the user already
+ * exists, a fatal status object is returned, and the user object is
* initialised with the data from the database.
*
* Previously, this function generated a DB error due to a key conflict
* }
* // do something with $user...
*
- * However, this was vulnerable to a race condition (bug 16020). By
+ * However, this was vulnerable to a race condition (bug 16020). By
* initialising the user object if the user exists, we aim to support this
* calling sequence as far as possible.
*
* Note that if the user exists, this function will acquire a write lock,
- * so it is still advisable to make the call conditional on isLoggedIn(),
+ * so it is still advisable to make the call conditional on isLoggedIn(),
* and to commit the transaction after calling.
*
* @return Status
array( 'IGNORE' )
);
if ( !$dbw->affectedRows() ) {
- $this->mId = $dbw->selectField( 'user', 'user_id',
+ $this->mId = $dbw->selectField( 'user', 'user_id',
array( 'user_name' => $this->mName ), __METHOD__ );
$loaded = false;
if ( $this->mId ) {
public function incEditCount() {
if( !$this->isAnon() ) {
$dbw = wfGetDB( DB_MASTER );
- $dbw->update( 'user',
+ $dbw->update(
+ 'user',
array( 'user_editcount=user_editcount+1' ),
array( 'user_id' => $this->getId() ),
- __METHOD__ );
+ __METHOD__
+ );
// Lazy initialization check...
if( $dbw->affectedRows() == 0 ) {
- // Pull from a slave to be less cruel to servers
- // Accuracy isn't the point anyway here
- $dbr = wfGetDB( DB_SLAVE );
- $count = $dbr->selectField( 'revision',
- 'COUNT(rev_user)',
- array( 'rev_user' => $this->getId() ),
- __METHOD__ );
-
// Now here's a goddamn hack...
+ $dbr = wfGetDB( DB_SLAVE );
if( $dbr !== $dbw ) {
// If we actually have a slave server, the count is
// at least one behind because the current transaction
// has not been committed and replicated.
- $count++;
+ $this->initEditCount( 1 );
} else {
// But if DB_SLAVE is selecting the master, then the
// count we just read includes the revision that was
// just added in the working transaction.
+ $this->initEditCount();
}
-
- $dbw->update( 'user',
- array( 'user_editcount' => $count ),
- array( 'user_id' => $this->getId() ),
- __METHOD__ );
}
}
// edit count in user cache too
$this->invalidateCache();
}
+ /**
+ * Initialize user_editcount from data out of the revision table
+ *
+ * @param $add Integer Edits to add to the count from the revision table
+ * @return Integer Number of edits
+ */
+ protected function initEditCount( $add = 0 ) {
+ // Pull from a slave to be less cruel to servers
+ // Accuracy isn't the point anyway here
+ $dbr = wfGetDB( DB_SLAVE );
+ $count = $dbr->selectField(
+ 'revision',
+ 'COUNT(rev_user)',
+ array( 'rev_user' => $this->getId() ),
+ __METHOD__
+ );
+ $count = $count + $add;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update(
+ 'user',
+ array( 'user_editcount' => $count ),
+ array( 'user_id' => $this->getId() ),
+ __METHOD__
+ );
+
+ return $count;
+ }
+
/**
* Get the description of a given right
*
wfProfileIn( __METHOD__ );
$request = $this->context->getRequest();
- $title = $this->context->getTitle();
+ $requestTitle = $title = $this->context->getTitle();
$output = $this->context->getOutput();
$user = $this->context->getUser();
global $wgArticle;
$wgArticle = new DeprecatedGlobal( 'wgArticle', $article, '1.18' );
- $this->performAction( $article );
+ $this->performAction( $article, $requestTitle );
} elseif ( is_string( $article ) ) {
$output->redirect( $article );
} else {
* Perform one of the "standard" actions
*
* @param $page Page
+ * @param $requestTitle The original title, before any redirects were applied
*/
- private function performAction( Page $page ) {
+ private function performAction( Page $page, Title $requestTitle ) {
global $wgUseSquid, $wgSquidMaxage;
wfProfileIn( __METHOD__ );
if ( $action instanceof Action ) {
# Let Squid cache things if we can purge them.
if ( $wgUseSquid &&
- in_array( $request->getFullRequestURL(), $title->getSquidURLs() )
+ in_array( $request->getFullRequestURL(), $requestTitle->getSquidURLs() )
) {
$output->setSquidMaxage( $wgSquidMaxage );
}
if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
return;
}
+
if ( $wgJobRunRate < 1 ) {
$max = mt_getrandmax();
if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) {
- return;
+ return; // the higher $wgJobRunRate, the less likely we return here
}
$n = 1;
} else {
$n = intval( $wgJobRunRate );
}
- while ( $n-- && false != ( $job = Job::pop() ) ) {
- $output = $job->toString() . "\n";
- $t = - microtime( true );
- $success = $job->run();
- $t += microtime( true );
- $t = round( $t * 1000 );
- if ( !$success ) {
- $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
- } else {
- $output .= "Success, Time: $t ms\n";
+ $group = JobQueueGroup::singleton();
+ $types = $group->getDefaultQueueTypes();
+ shuffle( $types ); // avoid starvation
+
+ // Scan the queues for a job N times...
+ do {
+ $jobFound = false; // found a job in any queue?
+ // Find a queue with a job on it and run it...
+ foreach ( $types as $i => $type ) {
+ $queue = $group->get( $type );
+ if ( $queue->isEmpty() ) {
+ unset( $types[$i] ); // don't keep checking this queue
+ continue;
+ }
+ $job = $queue->pop();
+ if ( $job ) {
+ $jobFound = true;
+ $output = $job->toString() . "\n";
+ $t = - microtime( true );
+ $success = $job->run();
+ $queue->ack( $job ); // done
+ $t += microtime( true );
+ $t = round( $t * 1000 );
+ if ( !$success ) {
+ $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+ } else {
+ $output .= "Success, Time: $t ms\n";
+ }
+ wfDebugLog( 'jobqueue', $output );
+ break;
+ } else {
+ unset( $types[$i] ); // don't keep checking this queue
+ }
}
- wfDebugLog( 'jobqueue', $output );
- }
+ } while ( --$n && $jobFound );
}
}
$content = $this->page->getContent( Revision::RAW );
} else {
$rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
+
if ( $rev === null ) {
- return false;
+ $content = null;
+ } else {
+ #XXX: why use PUBLIC audience here (default), and RAW above?
+ $content = $rev->getContent();
}
+ }
- #XXX: why use PUBLIC audience here (default), and RAW above?
- $content = $rev->getContent();
+ if ( $content === null ) {
+ return false;
}
$time = - microtime( true );
$this->msg( 'pageinfo-display-title' ), $displayTitle
);
+ // Is it a redirect? If so, where to?
+ if ( $title->isRedirect() ) {
+ $pageInfo['header-basic'][] = array(
+ $this->msg( 'pageinfo-redirectsto' ),
+ Linker::link( $this->page->getRedirectTarget() ) .
+ $this->msg( 'word-separator' )->text() .
+ $this->msg( 'parentheses', Linker::link(
+ $this->page->getRedirectTarget(),
+ $this->msg( 'pageinfo-redirectsto-info' )->escaped(),
+ array(),
+ array( 'action' => 'info' )
+ ) )->text()
+ );
+ }
+
// Default sort key
$sortKey = $title->getCategorySortKey();
if ( !empty( $pageProperties['defaultsort'] ) ) {
->numParams( count( $title->getRedirectsHere() ) )
);
+ // Is it counted as a content page?
+ if ( $this->page->isCountable() ) {
+ $pageInfo['header-basic'][] = array(
+ $this->msg( 'pageinfo-contentpage' ),
+ $this->msg( 'pageinfo-contentpage-yes' )
+ );
+ }
+
// Subpages of this page, if subpages are enabled for the current NS
if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
$prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
// Page protection
$pageInfo['header-restrictions'] = array();
+ // Is this page effected by the cascading protection of something which includes it?
+ if ( $title->isCascadeProtected() ) {
+ $cascadingFrom = '';
+ $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
+
+ foreach ( $sources[0] as $sourceTitle ) {
+ $cascadingFrom .= Html::rawElement( 'li', array(), Linker::linkKnown( $sourceTitle ) );
+ }
+
+ $cascadingFrom = Html::rawElement( 'ul', array(), $cascadingFrom );
+ $pageInfo['header-restrictions'][] = array(
+ $this->msg( 'pageinfo-protect-cascading-from' ),
+ $cascadingFrom
+ );
+ }
+
+ // Is out protection set to cascade to other pages?
+ if ( $title->areRestrictionsCascading() ) {
+ $pageInfo['header-restrictions'][] = array(
+ $this->msg( 'pageinfo-protect-cascading' ),
+ $this->msg( 'pageinfo-protect-cascading-yes' )
+ );
+ }
+
// Page protection
foreach ( $title->getRestrictionTypes() as $restrictionType ) {
$protectionLevel = implode( ', ', $title->getRestrictions( $restrictionType ) );
// Public-only due to cache headers
$content = $rev->getContent();
- if ( !$content instanceof TextContent ) {
+ if ( $content === null ) {
+ // revision not found (or suppressed)
+ $text = false;
+ } elseif ( !$content instanceof TextContent ) {
+ // non-text content
wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
. $content->getModel() . "` which is not supported via this interface." );
die();
+ } else {
+ // want a section?
+ $section = $request->getIntOrNull( 'section' );
+ if ( $section !== null ) {
+ $content = $content->getSection( $section );
+ }
+
+ if ( $content === null || $content === false ) {
+ // section not found (or section not supported, e.g. for JS and CSS)
+ $text = false;
+ } else {
+ $text = $content->getNativeData();
+ }
}
-
- $section = $request->getIntOrNull( 'section' );
- if ( $section !== null ) {
- $content = $content->getSection( $section );
- }
-
- $text = $content->getNativeData();
}
}
{
$content = $pageObj->getContent();
- // @todo: Add support for appending/prepending to the Content interface
-
- if ( !( $content instanceof TextContent ) ) {
- $mode = $contentHandler->getModelID();
- $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
- }
-
if ( !$content ) {
- # If this is a MediaWiki:x message, then load the messages
- # and return the message value for x.
if ( $titleObj->getNamespace() == NS_MEDIAWIKI ) {
+ # If this is a MediaWiki:x message, then load the messages
+ # and return the message value for x.
$text = $titleObj->getDefaultMessageText();
if ( $text === false ) {
$text = '';
$this->dieUsage( $ex->getMessage(), 'parseerror' );
return;
}
+ } else {
+ # Otherwise, make a new empty content.
+ $content = $contentHandler->makeEmptyContent();
}
}
+ // @todo: Add support for appending/prepending to the Content interface
+
+ if ( !( $content instanceof TextContent ) ) {
+ $mode = $contentHandler->getModelID();
+ $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
+ }
+
if ( !is_null( $params['section'] ) ) {
if ( !$contentHandler->supportsSections() ) {
$modelName = $contentHandler->getModelID();
}
// Should we save old revision parses to the parser cache?
- $p_result = $this->content->getParserOutput( $titleObj, $popts );
+ $p_result = $this->content->getParserOutput( $titleObj, $rev->getId(), $popts );
}
} else { // Not $oldid, but $pageid or $page
if ( $params['redirects'] ) {
$oldid = $pageObj->getLatest();
}
-
$popts = $pageObj->makeParserOptions( $this->getContext() );
$popts->enableLimitReport( !$params['disablepp'] );
// Not cached (save or load)
if ( $params['pst'] ) {
- $p_result = $this->pstContent->getParserOutput( $titleObj, $popts );
+ $p_result = $this->pstContent->getParserOutput( $titleObj, null, $popts );
} else {
- $p_result = $this->content->getParserOutput( $titleObj, $popts );
+ $p_result = $this->content->getParserOutput( $titleObj, null, $popts );
}
}
!is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getText() );
// Not cached (save or load)
- return $this->content->getParserOutput( $page->getTitle(), $popts );
+ return $this->content->getParserOutput( $page->getTitle(), null, $popts );
} else {
// Try the parser cache first
// getParserOutput will save to Parser cache if able
$data = $this->getResultData();
foreach ( $data['query']['pages'] as $pageid => $arr ) {
- if ( !isset( $arr['imagerepository'] ) ) {
+ if ( is_array( $arr ) && !isset( $arr['imagerepository'] ) ) {
$result->addValue(
array( 'query', 'pages', $pageid ),
'imagerepository', ''
--- /dev/null
+<?php
+
+/**
+ * Base query module for querying results from ORMTables.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup API
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class ApiQueryORM extends ApiQueryBase {
+
+ /**
+ * Returns an instance of the IORMTable table being queried.
+ *
+ * @since 1.21
+ *
+ * @return IORMTable
+ */
+ protected abstract function getTable();
+
+ /**
+ * Returns the name of the individual rows.
+ * For example: page, user, contest, campaign, etc.
+ * This is used to appropriately name elements in XML.
+ * Deriving classes typically override this method.
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ protected function getRowName() {
+ return 'item';
+ }
+
+ /**
+ * Returns the name of the list of rows.
+ * For example: pages, users, contests, campaigns, etc.
+ * This is used to appropriately name nodes in the output.
+ * Deriving classes typically override this method.
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ protected function getListName() {
+ return 'items';
+ }
+
+ /**
+ * Returns the path to where the items results should be added in the result.
+ *
+ * @since 1.21
+ *
+ * @return null|string|array
+ */
+ protected function getResultPath() {
+ return null;
+ }
+
+ /**
+ * Get the parameters, find out what the conditions for the query are,
+ * run it, and add the results.
+ *
+ * @since 1.21
+ */
+ public function execute() {
+ $params = $this->getParams();
+
+ if ( !in_array( 'id', $params['props'] ) ) {
+ $params['props'][] = 'id';
+ }
+
+ $results = $this->getResults( $params, $this->getConditions( $params ) );
+ $this->addResults( $params, $results );
+ }
+
+ /**
+ * Get the request parameters, handle the * value for the props param
+ * and remove all params set to null (ie those that are not actually provided).
+ *
+ * @since 1.21
+ *
+ * @return array
+ */
+ protected function getParams() {
+ return array_filter(
+ $this->extractRequestParams(),
+ function( $prop ) {
+ return isset( $prop );
+ }
+ );
+ }
+
+ /**
+ * Get the conditions for the query. These will be provided as
+ * regular parameters, together with limit, props, continue,
+ * and possibly others which we need to get rid off.
+ *
+ * @since 1.21
+ *
+ * @param array $params
+ *
+ * @return array
+ */
+ protected function getConditions( array $params ) {
+ $conditions = array();
+ $fields = $this->getTable()->getFields();
+
+ foreach ( $params as $name => $value ) {
+ if ( array_key_exists( $name, $fields ) ) {
+ $conditions[$name] = $value;
+ }
+ }
+
+ return $conditions;
+ }
+
+ /**
+ * Get the actual results.
+ *
+ * @since 1.21
+ *
+ * @param array $params
+ * @param array $conditions
+ *
+ * @return ORMResult
+ */
+ protected function getResults( array $params, array $conditions ) {
+ return $this->getTable()->select(
+ $params['props'],
+ $conditions,
+ array(
+ 'LIMIT' => $params['limit'] + 1,
+ 'ORDER BY' => $this->getTable()->getPrefixedField( 'id' ) . ' ASC',
+ ),
+ __METHOD__
+ );
+ }
+
+ /**
+ * Serialize the results and add them to the result object.
+ *
+ * @since 1.21
+ *
+ * @param array $params
+ * @param ORMResult $results
+ */
+ protected function addResults( array $params, ORMResult $results ) {
+ $serializedResults = array();
+ $count = 0;
+
+ foreach ( $results as /* IORMRow */ $result ) {
+ if ( ++$count > $params['limit'] ) {
+ // We've reached the one extra which shows that
+ // there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', $result->getId() );
+ break;
+ }
+
+ $serializedResults[] = $this->formatRow( $result, $params );
+ }
+
+ $this->setIndexedTagNames( $serializedResults );
+ $this->addSerializedResults( $serializedResults );
+ }
+
+ /**
+ * Formats a row to it's desired output format.
+ *
+ * @since 1.21
+ *
+ * @param IORMRow $result
+ * @param array $params
+ *
+ * @return mixed
+ */
+ protected function formatRow( IORMRow $result, array $params ) {
+ return $result->toArray( $params['props'] );
+ }
+
+ /**
+ * Set the tag names for formats such as XML.
+ *
+ * @since 1.21
+ *
+ * @param array $serializedResults
+ */
+ protected function setIndexedTagNames( array &$serializedResults ) {
+ $this->getResult()->setIndexedTagName( $serializedResults, $this->getRowName() );
+ }
+
+ /**
+ * Add the serialized results to the result object.
+ *
+ * @since 1.21
+ *
+ * @param array $serializedResults
+ */
+ protected function addSerializedResults( array $serializedResults ) {
+ $this->getResult()->addValue(
+ $this->getResultPath(),
+ $this->getListName(),
+ $serializedResults
+ );
+ }
+
+ /**
+ * @see ApiBase::getAllowedParams()
+ * @return array
+ */
+ public function getAllowedParams() {
+ $params = array (
+ 'props' => array(
+ ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_REQUIRED => true,
+ ),
+ 'limit' => array(
+ ApiBase::PARAM_DFLT => 20,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+ ),
+ 'continue' => null,
+ );
+
+ return array_merge( $this->getTable()->getAPIParams(), $params );
+ }
+
+ /**
+ * @see ApiBase::getParamDescription()
+ * @return array
+ */
+ public function getParamDescription() {
+ $descriptions = array (
+ 'props' => 'Fields to query',
+ 'continue' => 'Offset number from where to continue the query',
+ 'limit' => 'Max amount of rows to return',
+ );
+
+ return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions );
+ }
+
+}
}
}
if ( $this->parseContent ) {
- $po = $content->getParserOutput( $title, ParserOptions::newFromContext( $this->getContext() ) );
+ $po = $content->getParserOutput( $title, $revision->getId(), ParserOptions::newFromContext( $this->getContext() ) );
$text = $po->getText();
}
return;
}
+ wfDebug( "Squid purge: " . implode( ' ', $urlArr ) . "\n" );
+
if ( $wgHTCPMulticastRouting ) {
SquidUpdate::HTCPPurge( $urlArr );
}
* A content object represents page content, e.g. the text to show on a page.
* Content objects have no knowledge about how they relate to Wiki pages.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
abstract class AbstractContent implements Content {
* Name of the content model this Content object represents.
* Use with CONTENT_MODEL_XXX constants
*
+ * @since 1.21
+ *
* @var string $model_id
*/
protected $model_id;
/**
- * @param String $model_id
+ * @param string|null $modelId
+ *
+ * @since 1.21
*/
- public function __construct( $model_id = null ) {
- $this->model_id = $model_id;
+ public function __construct( $modelId = null ) {
+ $this->model_id = $modelId;
}
/**
- * @see Content::getModel()
+ * @see Content::getModel
+ *
+ * @since 1.21
*/
public function getModel() {
return $this->model_id;
* Throws an MWException if $model_id is not the id of the content model
* supported by this Content object.
*
- * @param $model_id int the model to check
+ * @since 1.21
+ *
+ * @param string $modelId The model to check
*
* @throws MWException
*/
- protected function checkModelID( $model_id ) {
- if ( $model_id !== $this->model_id ) {
- throw new MWException( "Bad content model: " .
+ protected function checkModelID( $modelId ) {
+ if ( $modelId !== $this->model_id ) {
+ throw new MWException(
+ "Bad content model: " .
"expected {$this->model_id} " .
- "but got $model_id." );
+ "but got $modelId."
+ );
}
}
/**
- * @see Content::getContentHandler()
+ * @see Content::getContentHandler
+ *
+ * @since 1.21
*/
public function getContentHandler() {
return ContentHandler::getForContent( $this );
}
/**
- * @see Content::getDefaultFormat()
+ * @see Content::getDefaultFormat
+ *
+ * @since 1.21
*/
public function getDefaultFormat() {
return $this->getContentHandler()->getDefaultFormat();
}
/**
- * @see Content::getSupportedFormats()
+ * @see Content::getSupportedFormats
+ *
+ * @since 1.21
*/
public function getSupportedFormats() {
return $this->getContentHandler()->getSupportedFormats();
}
/**
- * @see Content::isSupportedFormat()
+ * @see Content::isSupportedFormat
+ *
+ * @param string $format
+ *
+ * @since 1.21
+ *
+ * @return boolean
*/
public function isSupportedFormat( $format ) {
if ( !$format ) {
}
/**
- * Throws an MWException if $this->isSupportedFormat( $format ) doesn't
+ * Throws an MWException if $this->isSupportedFormat( $format ) does not
* return true.
*
- * @param $format
+ * @since 1.21
+ *
+ * @param string $format
* @throws MWException
*/
protected function checkFormat( $format ) {
if ( !$this->isSupportedFormat( $format ) ) {
- throw new MWException( "Format $format is not supported for content model " .
- $this->getModel() );
+ throw new MWException(
+ "Format $format is not supported for content model " .
+ $this->getModel()
+ );
}
}
/**
* @see Content::serialize
+ *
+ * @param string|null $format
+ *
+ * @since 1.21
+ *
+ * @return string
*/
public function serialize( $format = null ) {
return $this->getContentHandler()->serializeContent( $this, $format );
}
/**
- * @see Content::isEmpty()
+ * @see Content::isEmpty
+ *
+ * @since 1.21
+ *
+ * @return boolean
*/
public function isEmpty() {
return $this->getSize() === 0;
}
/**
- * @see Content::isValid()
+ * @see Content::isValid
+ *
+ * @since 1.21
+ *
+ * @return boolean
*/
public function isValid() {
return true;
}
/**
- * @see Content::equals()
+ * @see Content::equals
+ *
+ * @since 1.21
+ *
+ * @param Content|null $that
+ *
+ * @return boolean
*/
public function equals( Content $that = null ) {
if ( is_null( $that ) ) {
/**
- * @see Content::getRedirectChain()
+ * @see Content::getRedirectChain
+ *
+ * @since 1.21
*/
public function getRedirectChain() {
global $wgMaxRedirects;
}
/**
- * @see Content::getRedirectTarget()
+ * @see Content::getRedirectTarget
+ *
+ * @since 1.21
*/
public function getRedirectTarget() {
return null;
}
/**
- * @see Content::getUltimateRedirectTarget()
+ * @see Content::getUltimateRedirectTarget
* @note: migrated here from Title::newFromRedirectRecurse
+ *
+ * @since 1.21
*/
public function getUltimateRedirectTarget() {
$titles = $this->getRedirectChain();
}
/**
- * @see Content::isRedirect()
+ * @see Content::isRedirect
*
* @since 1.21
*
}
/**
- * @see Content::updateRedirect()
+ * @see Content::updateRedirect
*
* This default implementation always returns $this.
*
+ * @param Title $target
+ *
* @since 1.21
*
* @return Content $this
}
/**
- * @see Content::getSection()
+ * @see Content::getSection
+ *
+ * @since 1.21
*/
public function getSection( $sectionId ) {
return null;
}
/**
- * @see Content::replaceSection()
+ * @see Content::replaceSection
+ *
+ * @since 1.21
*/
public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
return null;
}
/**
- * @see Content::preSaveTransform()
+ * @see Content::preSaveTransform
+ *
+ * @since 1.21
*/
public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
return $this;
}
/**
- * @see Content::addSectionHeader()
+ * @see Content::addSectionHeader
+ *
+ * @since 1.21
*/
public function addSectionHeader( $header ) {
return $this;
}
/**
- * @see Content::preloadTransform()
+ * @see Content::preloadTransform
+ *
+ * @since 1.21
*/
public function preloadTransform( Title $title, ParserOptions $popts ) {
return $this;
}
/**
- * @see Content::prepareSave()
+ * @see Content::prepareSave
+ *
+ * @since 1.21
*/
public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user ) {
if ( $this->isValid() ) {
}
/**
- * @see Content::getDeletionUpdates()
+ * @see Content::getDeletionUpdates
*
* @since 1.21
*
}
/**
- * @see Content::matchMagicWord()
- *
* This default implementation always returns false. Subclasses may override this to supply matching logic.
*
+ * @see Content::matchMagicWord
+ *
+ * @since 1.21
+ *
* @param MagicWord $word
*
* @return bool
public function matchMagicWord( MagicWord $word ) {
return false;
}
-}
\ No newline at end of file
+}
* A content object represents page content, e.g. the text to show on a page.
* Content objects have no knowledge about how they relate to wiki pages.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
interface Content {
* @todo: test that this actually works
* @todo: make sure this also works with LuceneSearch / WikiSearch
*/
- public function getTextForSearchIndex( );
+ public function getTextForSearchIndex();
/**
* @since 1.21
* @TODO: used in WikiPage and MessageCache to get message text. Not so
* nice. What should we use instead?!
*/
- public function getWikitextForTransclusion( );
+ public function getWikitextForTransclusion();
/**
* Returns a textual representation of the content suitable for use in edit
*
* @since 1.21
*
- * @param $maxlength int Maximum length of the summary text
- * @return The summary text
+ * @param $maxLength int Maximum length of the summary text
+ * @return string The summary text
*/
- public function getTextForSummary( $maxlength = 250 );
+ public function getTextForSummary( $maxLength = 250 );
/**
* Returns native representation of the data. Interpretation depends on
*
* @NOTE: Caller must be aware of content model!
*/
- public function getNativeData( );
+ public function getNativeData();
/**
* Returns the content's nominal size in bogo-bytes.
*
* @return int
*/
- public function getSize( );
+ public function getSize();
/**
* Returns the ID of the content model used by this Content object.
* Note that this method is called before any update to the page table is performed. This means that
* $page may not yet know a page ID.
*
+ * @since 1.21
+ *
* @param WikiPage $page The page to be saved.
* @param int $flags bitfield for use with EDIT_XXX constants, see WikiPage::doEditContent()
* @param int $baseRevId the ID of the current revision
/**
* Returns true if this Content object matches the given magic word.
*
+ * @since 1.21
+ *
* @param MagicWord $word the magic word to match
*
* @return bool whether this Content object matches the given magic word.
# [11:59] <vvv> Hooks are ugly; make CodeHighlighter interface and a
# config to set the class which handles syntax highlighting
# [12:00] <vvv> And default it to a DummyHighlighter
-}
\ No newline at end of file
+}
* type), but wikitext content may be represented by a DOM or AST structure in
* the future.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
abstract class ContentHandler {
return $content->getNativeData();
}
+ wfDebugLog( 'ContentHandler', 'Accessing ' . $content->getModel() . ' content as text!' );
+
if ( $wgContentHandlerTextFallback == 'fail' ) {
throw new MWException(
"Attempt to get text from Content with model " .
}
}
+ wfDebugLog( 'ContentHandler', 'Created handler for ' . $modelId
+ . ': ' . get_class( $handler ) );
+
ContentHandler::$handlers[$modelId] = $handler;
return ContentHandler::$handlers[$modelId];
}
}
}
-/**
- * @since 1.21
- */
-class TextContentHandler extends ContentHandler {
-
- public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = array( CONTENT_FORMAT_TEXT ) ) {
- parent::__construct( $modelId, $formats );
- }
-
- /**
- * Returns the content's text as-is.
- *
- * @param $content Content
- * @param $format string|null
- * @return mixed
- */
- public function serializeContent( Content $content, $format = null ) {
- $this->checkFormat( $format );
- return $content->getNativeData();
- }
-
- /**
- * Attempts to merge differences between three versions. Returns a new
- * Content object for a clean merge and false for failure or a conflict.
- *
- * All three Content objects passed as parameters must have the same
- * content model.
- *
- * This text-based implementation uses wfMerge().
- *
- * @param $oldContent \Content|string String
- * @param $myContent \Content|string String
- * @param $yourContent \Content|string String
- *
- * @return Content|Bool
- */
- public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
- $this->checkModelID( $oldContent->getModel() );
- $this->checkModelID( $myContent->getModel() );
- $this->checkModelID( $yourContent->getModel() );
-
- $format = $this->getDefaultFormat();
-
- $old = $this->serializeContent( $oldContent, $format );
- $mine = $this->serializeContent( $myContent, $format );
- $yours = $this->serializeContent( $yourContent, $format );
-
- $ok = wfMerge( $old, $mine, $yours, $result );
-
- if ( !$ok ) {
- return false;
- }
-
- if ( !$result ) {
- return $this->makeEmptyContent();
- }
-
- $mergedContent = $this->unserializeContent( $result, $format );
- return $mergedContent;
- }
-
- /**
- * Unserializes a Content object of the type supported by this ContentHandler.
- *
- * @since 1.21
- *
- * @param $text string serialized form of the content
- * @param $format null|String the format used for serialization
- *
- * @return Content the TextContent object wrapping $text
- */
- public function unserializeContent( $text, $format = null ) {
- $this->checkFormat( $format );
-
- return new TextContent( $text );
- }
-
- /**
- * Creates an empty TextContent object.
- *
- * @since 1.21
- *
- * @return Content
- */
- public function makeEmptyContent() {
- return new TextContent( '' );
- }
-}
-
-/**
- * @since 1.21
- */
-class WikitextContentHandler extends TextContentHandler {
-
- public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
- parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
- }
-
- public function unserializeContent( $text, $format = null ) {
- $this->checkFormat( $format );
-
- return new WikitextContent( $text );
- }
-
- /**
- * @see ContentHandler::makeEmptyContent
- *
- * @return Content
- */
- public function makeEmptyContent() {
- return new WikitextContent( '' );
- }
-
-
- /**
- * Returns a WikitextContent object representing a redirect to the given destination page.
- *
- * @see ContentHandler::makeRedirectContent
- *
- * @param Title $destination the page to redirect to.
- *
- * @return Content
- */
- public function makeRedirectContent( Title $destination ) {
- $mwRedir = MagicWord::get( 'redirect' );
- $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . "]]\n";
-
- return new WikitextContent( $redirectText );
- }
-
- /**
- * Returns true because wikitext supports sections.
- *
- * @return boolean whether sections are supported.
- */
- public function supportsSections() {
- return true;
- }
-
- /**
- * Returns true, because wikitext supports caching using the
- * ParserCache mechanism.
- *
- * @since 1.21
- * @return bool
- */
- public function isParserCacheSupported() {
- return true;
- }
-}
-
-# XXX: make ScriptContentHandler base class, do highlighting stuff there?
-
-/**
- * @since 1.21
- */
-class JavaScriptContentHandler extends TextContentHandler {
-
- public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) {
- parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
- }
-
- public function unserializeContent( $text, $format = null ) {
- $this->checkFormat( $format );
-
- return new JavaScriptContent( $text );
- }
-
- public function makeEmptyContent() {
- return new JavaScriptContent( '' );
- }
-
- /**
- * Returns the english language, because JS is english, and should be handled as such.
- *
- * @return Language wfGetLangObj( 'en' )
- *
- * @see ContentHandler::getPageLanguage()
- */
- public function getPageLanguage( Title $title, Content $content = null ) {
- return wfGetLangObj( 'en' );
- }
-
- /**
- * Returns the english language, because CSS is english, and should be handled as such.
- *
- * @return Language wfGetLangObj( 'en' )
- *
- * @see ContentHandler::getPageViewLanguage()
- */
- public function getPageViewLanguage( Title $title, Content $content = null ) {
- return wfGetLangObj( 'en' );
- }
-}
-
-/**
- * @since 1.21
- */
-class CssContentHandler extends TextContentHandler {
-
- public function __construct( $modelId = CONTENT_MODEL_CSS ) {
- parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
- }
-
- public function unserializeContent( $text, $format = null ) {
- $this->checkFormat( $format );
-
- return new CssContent( $text );
- }
-
- public function makeEmptyContent() {
- return new CssContent( '' );
- }
-
- /**
- * Returns the english language, because CSS is english, and should be handled as such.
- *
- * @return Language wfGetLangObj( 'en' )
- *
- * @see ContentHandler::getPageLanguage()
- */
- public function getPageLanguage( Title $title, Content $content = null ) {
- return wfGetLangObj( 'en' );
- }
-
- /**
- * Returns the english language, because CSS is english, and should be handled as such.
- *
- * @return Language wfGetLangObj( 'en' )
- *
- * @see ContentHandler::getPageViewLanguage()
- */
- public function getPageViewLanguage( Title $title, Content $content = null ) {
- return wfGetLangObj( 'en' );
- }
-}
<?php
/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
class CssContent extends TextContent {
public function __construct( $text ) {
--- /dev/null
+<?php
+
+/**
+ * @since 1.21
+ */
+class CssContentHandler extends TextContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_CSS ) {
+ parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
+ }
+
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new CssContent( $text );
+ }
+
+ public function makeEmptyContent() {
+ return new CssContent( '' );
+ }
+
+ /**
+ * Returns the english language, because CSS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageLanguage()
+ */
+ public function getPageLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+
+ /**
+ * Returns the english language, because CSS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageViewLanguage()
+ */
+ public function getPageViewLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+}
\ No newline at end of file
<?php
/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
class JavaScriptContent extends TextContent {
public function __construct( $text ) {
--- /dev/null
+<?php
+
+# XXX: make ScriptContentHandler base class, do highlighting stuff there?
+
+/**
+ * @since 1.21
+ */
+class JavaScriptContentHandler extends TextContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) {
+ parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
+ }
+
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new JavaScriptContent( $text );
+ }
+
+ public function makeEmptyContent() {
+ return new JavaScriptContent( '' );
+ }
+
+ /**
+ * Returns the english language, because JS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageLanguage()
+ */
+ public function getPageLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+
+ /**
+ * Returns the english language, because CSS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageViewLanguage()
+ */
+ public function getPageViewLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+}
\ No newline at end of file
* to represent content from the MediaWiki namespace, and that there is no MessageContentHandler. MessageContent
* is just intended as glue for wrapping a message programatically.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
class MessageContent extends AbstractContent {
*
* TextContent instances are immutable
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
class TextContent extends AbstractContent {
return $this->getNativeData();
}
+ /**
+ * Returns a Content object with pre-save transformations applied.
+ * This implementation just trims trailing whitespace.
+ *
+ * @param $title Title
+ * @param $user User
+ * @param $popts ParserOptions
+ * @return Content
+ */
+ public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+ $text = $this->getNativeData();
+ $pst = rtrim( $text );
+
+ return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+ }
+
/**
* Diff this content object with another content object..
*
$revId = null,
ParserOptions $options = null, $generateHtml = true
) {
- # Generic implementation, relying on $this->getHtml()
+ global $wgParser, $wgTextModelsToParse;
+
+ if ( !$options ) {
+ //NOTE: use canonical options per default to produce cacheable output
+ $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+ }
+
+ if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
+ // parse just to get links etc into the database
+ $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
+ } else {
+ $po = new ParserOutput();
+ }
if ( $generateHtml ) {
$html = $this->getHtml();
$html = '';
}
- $po = new ParserOutput( $html );
+ $po->setText( $html );
return $po;
}
--- /dev/null
+<?php
+
+/**
+ * @since 1.21
+ */
+class TextContentHandler extends ContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = array( CONTENT_FORMAT_TEXT ) ) {
+ parent::__construct( $modelId, $formats );
+ }
+
+ /**
+ * Returns the content's text as-is.
+ *
+ * @param $content Content
+ * @param $format string|null
+ * @return mixed
+ */
+ public function serializeContent( Content $content, $format = null ) {
+ $this->checkFormat( $format );
+ return $content->getNativeData();
+ }
+
+ /**
+ * Attempts to merge differences between three versions. Returns a new
+ * Content object for a clean merge and false for failure or a conflict.
+ *
+ * All three Content objects passed as parameters must have the same
+ * content model.
+ *
+ * This text-based implementation uses wfMerge().
+ *
+ * @param $oldContent \Content|string String
+ * @param $myContent \Content|string String
+ * @param $yourContent \Content|string String
+ *
+ * @return Content|Bool
+ */
+ public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+ $this->checkModelID( $oldContent->getModel() );
+ $this->checkModelID( $myContent->getModel() );
+ $this->checkModelID( $yourContent->getModel() );
+
+ $format = $this->getDefaultFormat();
+
+ $old = $this->serializeContent( $oldContent, $format );
+ $mine = $this->serializeContent( $myContent, $format );
+ $yours = $this->serializeContent( $yourContent, $format );
+
+ $ok = wfMerge( $old, $mine, $yours, $result );
+
+ if ( !$ok ) {
+ return false;
+ }
+
+ if ( !$result ) {
+ return $this->makeEmptyContent();
+ }
+
+ $mergedContent = $this->unserializeContent( $result, $format );
+ return $mergedContent;
+ }
+
+ /**
+ * Unserializes a Content object of the type supported by this ContentHandler.
+ *
+ * @since 1.21
+ *
+ * @param $text string serialized form of the content
+ * @param $format null|String the format used for serialization
+ *
+ * @return Content the TextContent object wrapping $text
+ */
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new TextContent( $text );
+ }
+
+ /**
+ * Creates an empty TextContent object.
+ *
+ * @since 1.21
+ *
+ * @return Content
+ */
+ public function makeEmptyContent() {
+ return new TextContent( '' );
+ }
+}
\ No newline at end of file
<?php
/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
*/
class WikitextContent extends TextContent {
$text = $this->getNativeData();
$pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+ rtrim( $pst );
- return new WikitextContent( $pst );
+ return ( $text === $pst ) ? $this : new WikitextContent( $pst );
}
/**
--- /dev/null
+<?php
+
+/**
+ * @since 1.21
+ */
+class WikitextContentHandler extends TextContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
+ parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
+ }
+
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new WikitextContent( $text );
+ }
+
+ /**
+ * @see ContentHandler::makeEmptyContent
+ *
+ * @return Content
+ */
+ public function makeEmptyContent() {
+ return new WikitextContent( '' );
+ }
+
+
+ /**
+ * Returns a WikitextContent object representing a redirect to the given destination page.
+ *
+ * @see ContentHandler::makeRedirectContent
+ *
+ * @param Title $destination the page to redirect to.
+ *
+ * @return Content
+ */
+ public function makeRedirectContent( Title $destination ) {
+ $mwRedir = MagicWord::get( 'redirect' );
+ $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . "]]\n";
+
+ return new WikitextContent( $redirectText );
+ }
+
+ /**
+ * Returns true because wikitext supports sections.
+ *
+ * @return boolean whether sections are supported.
+ */
+ public function supportsSections() {
+ return true;
+ }
+
+ /**
+ * Returns true, because wikitext supports caching using the
+ * ParserCache mechanism.
+ *
+ * @since 1.21
+ * @return bool
+ */
+ public function isParserCacheSupported() {
+ return true;
+ }
+}
\ No newline at end of file
} elseif( $this->mTrxAutomatic ) {
wfWarn( "$fname: Explicit commit of implicit transaction. Something may be out of sync!" );
}
+ } else {
+ if ( !$this->mTrxLevel ) {
+ return; // nothing to do
+ } elseif( !$this->mTrxAutomatic ) {
+ wfWarn( "$fname: Flushing an explicit transaction, getting out of sync!" );
+ }
}
$this->doCommit( $fname );
/**
* Generate a diff, no caching.
*
- * Subclasses may override this to provide a
+ * This implementation uses generateTextDiffBody() to generate a diff based on the default
+ * serialization of the given Content objects. This will fail if $old or $new are not
+ * instances of TextContent.
+ *
+ * Subclasses may override this to provide a different rendering for the diff,
+ * perhaps taking advantage of the content's native form. This is required for all content
+ * models that are not text based.
*
* @param $old Content: old content
* @param $new Content: new content
*
* @since 1.21
+ * @throws MWException if $old or $new are not instances of TextContent.
*/
function generateContentDiffBody( Content $old, Content $new ) {
if ( !( $old instanceof TextContent ) ) {
* 'DBprefix' => '',
* );
*
- * All fields must be present. These mean the same things as $wgDBtype,
- * $wgDBserver, etc. This implementation is quite crude; it could easily
- * support multiple database servers, for instance, and memcached, and it
- * probably has bugs. Kind of hard to reuse code when things might rely on who
+ * All fields must be present. These mean the same things as $wgDBtype,
+ * $wgDBserver, etc. This implementation is quite crude; it could easily
+ * support multiple database servers, for instance, and memcached, and it
+ * probably has bugs. Kind of hard to reuse code when things might rely on who
* knows what configuration globals.
*
- * If either wiki uses the UserComparePasswords hook, password authentication
- * might fail unexpectedly unless they both do the exact same validation.
- * There may be other corner cases like this where this will fail, but it
+ * If either wiki uses the UserComparePasswords hook, password authentication
+ * might fail unexpectedly unless they both do the exact same validation.
+ * There may be other corner cases like this where this will fail, but it
* should be unlikely.
*
* @ingroup ExternalUser
* @return bool
*/
protected function initFromName( $name ) {
- # We might not need the 'usable' bit, but let's be safe. Theoretically
- # this might return wrong results for old versions, but it's probably
+ # We might not need the 'usable' bit, but let's be safe. Theoretically
+ # this might return wrong results for old versions, but it's probably
# good enough.
$name = User::getCanonicalName( $name, 'usable' );
}
public function authenticate( $password ) {
- # This might be wrong if anyone actually uses the UserComparePasswords hook
+ # This might be wrong if anyone actually uses the UserComparePasswords hook
# (on either end), so don't use this if you those are incompatible.
return User::comparePasswords( $this->mRow->user_password, $password,
- $this->mRow->user_id );
+ $this->mRow->user_id );
}
public function getPref( $pref ) {
- # @todo FIXME: Return other prefs too. Lots of global-riddled code that does
+ # @todo FIXME: Return other prefs too. Lots of global-riddled code that does
# this normally.
if ( $pref === 'emailaddress'
&& $this->row->user_email_authenticated !== null ) {
/**
* Guess the MIME type from the file contents alone
- *
- * @return string
+ *
+ * @return string
*/
public function getMimeType() {
return MimeMagic::singleton()->guessMimeType( $this->path, false );
/**
* Get the final file extension from a file system path
- *
+ *
* @param $path string
* @return string
*/
foreach ( $params['srcs'] as $src ) {
$source = $this->resolveToFSPath( $src );
- if ( $source === null ) {
- $fsFiles[$src] = null; // invalid path
+ if ( $source === null || !is_file( $source ) ) {
+ $fsFiles[$src] = null; // invalid path or file does not exist
} else {
$fsFiles[$src] = new FSFile( $source );
}
} else {
$tmpPath = $tmpFile->getPath();
// Copy the source file over the temp file
+ wfSuppressWarnings();
$ok = copy( $source, $tmpPath );
+ wfRestoreWarnings();
if ( !$ok ) {
$tmpFiles[$src] = null;
} else {
return "mwstore://{$this->name}";
}
+ /**
+ * Get the storage path for the given container for this backend
+ *
+ * @param $container string Container name
+ * @return string Storage path
+ * @since 1.21
+ */
+ final public function getContainerStoragePath( $container ) {
+ return $this->getRootStoragePath() . "/{$container}";
+ }
+
/**
* Get the file journal object for this backend
*
$status = $this->doStreamFile( $params );
wfProfileOut( __METHOD__ . '-send-' . $this->name );
wfProfileOut( __METHOD__ . '-send' );
+ if ( !$status->isOK() ) {
+ // Per bug 41113, nasty things can happen if bad cache entries get
+ // stuck in cache. It's also possible that this error can come up
+ // with simple race conditions. Clear out the stat cache to be safe.
+ $this->clearCache( array( $params['src'] ) );
+ $this->deleteFileCache( $params['src'] );
+ trigger_error( "Bad stat cache or race condition for file {$params['src']}." );
+ }
} else {
$status->fatal( 'backend-fail-stream', $params['src'] );
}
* Get a list of storage paths to lock for a list of operations
* Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
* each corresponding to a list of storage paths to be locked.
+ * All returned paths are normalized.
*
* @param $performOps Array List of FileOp objects
* @return Array ('sh' => list of paths, 'ex' => list of paths)
/**
* Do a batch lookup from cache for container stats for all containers
* used in a list of container names, storage paths, or FileOp objects.
+ * This loads the persistent cache values into the process cache.
*
* @param $items Array
* @return void
/**
* Get the cache key for a file path
*
- * @param $path string Storage path
+ * @param $path string Normalized storage path
* @return string
*/
private function fileCacheKey( $path ) {
* @param $val mixed Information to cache
*/
final protected function setFileCache( $path, $val ) {
+ $path = FileBackend::normalizeStoragePath( $path );
+ if ( $path === null ) {
+ return; // invalid storage path
+ }
$this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
}
* @param $path string Storage path
*/
final protected function deleteFileCache( $path ) {
+ $path = FileBackend::normalizeStoragePath( $path );
+ if ( $path === null ) {
+ return; // invalid storage path
+ }
if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) {
trigger_error( "Unable to delete stat cache for file $path." );
}
/**
* Do a batch lookup from cache for file stats for all paths
* used in a list of storage paths or FileOp objects.
+ * This loads the persistent cache values into the process cache.
*
* @param $items Array List of storage paths or FileOps
* @return void
$paths = array_merge( $paths, $item->storagePathsRead() );
$paths = array_merge( $paths, $item->storagePathsChanged() );
} elseif ( self::isStoragePath( $item ) ) {
- $paths[] = $item;
+ $paths[] = FileBackend::normalizeStoragePath( $item );
}
}
+ // Get rid of any paths that failed normalization...
+ $paths = array_filter( $paths, 'strlen' ); // remove nulls
// Get all the corresponding cache keys for paths...
foreach ( $paths as $path ) {
list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
* Clean up the temporary file only after an object goes out of scope
*
* @param $object Object
- * @return void
+ * @return TempFSFile This object
*/
public function bind( $object ) {
if ( is_object( $object ) ) {
}
$object->tempFSFileReferences[] = $this;
}
+ return $this;
}
/**
* Set flag to not clean up after the temporary file
*
- * @return void
+ * @return TempFSFile This object
*/
public function preserve() {
$this->canDelete = false;
+ return $this;
}
/**
* Set flag clean up after the temporary file
*
- * @return void
+ * @return TempFSFile This object
*/
public function autocollect() {
$this->canDelete = true;
+ return $this;
}
/**
/**
* A repository for files accessible via the local filesystem.
* Does not support database access or registration.
- *
+ *
* This is a mostly a legacy class. New uses should not be added.
- *
+ *
* @ingroup FileRepo
* @deprecated since 1.19
*/
/**
* Get a key on the primary cache for this repository.
- * Returns false if the repository's cache is not accessible at this site.
+ * Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
* @return bool|mixed
*/
/**
* Get a key on the primary cache for this repository.
- * Returns false if the repository's cache is not accessible at this site.
+ * Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
* @return bool|string
*/
__METHOD__,
array( 'ORDER BY' => 'img_name' )
);
-
+
$result = array();
foreach ( $res as $row ) {
$result[] = $this->newFileFromRow( $row );
/**
* Get a key on the primary cache for this repository.
- * Returns false if the repository's cache is not accessible at this site.
+ * Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
*
* @return string
database access and higher-level functions such as cache management.
Tim Starling, June 2007
-
-Structure:
-
-File defines an abstract class File.
- ForeignAPIFile extends File.
- LocalFile extends File.
- ForeignDBFile extends LocalFile
- Image extends LocalFile
- UnregisteredLocalFile extends File.
- UploadStashFile extends UnregisteredLocalFile.
-FileRepo defines an abstract class FileRepo.
- ForeignAPIRepo extends FileRepo
- FSRepo extends FileRepo
- LocalRepo extends FSRepo
- ForeignDBRepo extends LocalRepo
- ForeignDBViaLBRepo extends LocalRepo
- NullRepo extends FileRepo
-
-Russ Nelson, March 2011
* @author Kghbln
* @author McDutchie
* @author Mormegil
+ * @author Nemo bis
* @author Nike
* @author Platonides
* @author Purodha
* @author Raymond
* @author SPQRobin
+ * @author Shirayuki
* @author Siebrand
* @author Umherirrender
*/
'config-sidebar' => 'Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.',
'config-env-php' => 'Parameters:
* $1 is the version of PHP that has been installed.',
+ 'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
+ 'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
'config-no-db' => 'Do not translate: <code>./configure --with-mysql</code>.
<br />
Do not translate: <code>php5-mysql</code>.
Parameters:
* $1 is comma separated list of database types supported by MediaWiki.',
'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+ 'config-pcre' => 'PCRE is an initialism for "Perl-compatible regular expression". Perl is programming language whose [[:w:regular expression|regular expression]] syntax is popular and used in other languages using a library called PCRE.',
+ 'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.",
'config-memory-raised' => 'Parameters:
* $1 is the configured <code>memory_limit</code>.
* $2 is the value to which <code>memory_limit</code> was raised.',
'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
+ 'config-invalid-schema' => '*$1 - schema name',
'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
'config-can-upgrade' => 'Parameters:
* $1 - Version or Revision indicator.',
'config-show-table-status' => '{{doc-important|"SHOW TABLE STATUS" is a MySQL command. Do not translate this.}}',
+ 'config-db-web-account-same' => 'checkbox label',
+ 'config-db-web-create' => 'checkbox label',
'config-ns-generic' => '{{Identical|Project}}',
'config-admin-name' => '{{Identical|Your name}}',
'config-admin-password' => '{{Identical|Password}}',
This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to klick "proceed" so as to return to the MediaWiki installer page.',
'config-extensions' => '{{Identical|Extension}}',
'config-install-step-done' => '{{Identical|Done}}',
+ 'config-install-database' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-schema' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
'config-install-pg-schema-failed' => 'Parameters:
* $1 = database user name (usernames in the database are unrelated to wiki user names)
* $2 =',
- 'config-install-user' => 'Message indicates that the user is being created',
+ 'config-install-user' => 'Message indicates that the user is being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
'config-install-user-grant-failed' => 'Parameters:
* $1 is the database username for which granting rights failed
* $2 is the error message',
- 'config-install-tables' => 'Message indicates that the tables are being created',
- 'config-install-interwiki' => 'Message indicates that the interwikitables are being populated',
+ 'config-install-tables' => 'Message indicates that the tables are being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-interwiki' => 'Message indicates that the interwikitables are being populated
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-stats' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-keys' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
'config-insecure-keys' => 'Parameters:
* $1 - A list of names of the secret keys that were generated.
* $2 - the number of items in the list $1, to be used with PLURAL.',
- 'config-install-sysop' => 'Message indicates that the administrator user account is being created',
+ 'config-install-sysop' => 'Message indicates that the administrator user account is being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
'config-install-subscribe-fail' => '{{doc-important|"mediawiki-announce" is the name of a mailing list and should not be translated.}}',
+ 'config-install-mainpage' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
'config-install-done' => 'Parameters:
* $1 is the URL to LocalSettings download
* $2 is a link to the wiki.
* @author 青子守歌
*/
$messages['ja'] = array(
- 'config-desc' => 'MediaWikiのインストーラー',
- 'config-title' => 'MediaWiki $1のインストール',
+ 'config-desc' => 'MediaWiki のインストーラー',
+ 'config-title' => 'MediaWiki $1 のインストール',
'config-information' => '情報',
- 'config-localsettings-upgrade' => '<code>LocalSettings.php</code>ファイルが検出されました。
-アップグレードするため、ボックス中の<code>$wgUpgradeKey</code>の値を入力してください。
-LocalSettings.phpの中にそれはあるでしょう。',
- 'config-localsettings-key' => 'アップグレードキー:',
+ 'config-localsettings-upgrade' => 'ファイル <code>LocalSettings.php</code> を検出しました。
+インストールされているものをアップグレードするには、<code>$wgUpgradeKey</code> の値を以下の欄に入力してください。
+この値は LocalSettings.php 内にあります。',
+ 'config-localsettings-cli-upgrade' => 'ファイル LocalSettings.php を検出しました。
+インストールされているものをアップグレードするには、update.php を実行してください',
+ 'config-localsettings-key' => 'アップグレード キー:',
'config-localsettings-badkey' => '与えられたキーが間違っています',
'config-upgrade-key-missing' => 'MediaWikiの既存インストールを検出しました。
インストールをアップグレードするために、次の行をLocalSettings.phpの末尾に挿入してください:
$1',
- 'config-localsettings-incomplete' => '現在のLocalSettings.phpは不完全であるようです。
-変数$1が設定されていません。
-LocalSettings.phpを変更してこの変数を設定して、『{{int:Config-continue}}』を押してください。',
- 'config-session-error' => 'セッションの開始エラー:$1',
+ 'config-localsettings-incomplete' => '既存の LocalSettings.php の内容は不完全のようです。
+変数 $1 が設定されていません。
+LocalSettings.php 内でこの変数を設定して、「{{int:Config-continue}}」をクリックしてください。',
+ 'config-session-error' => 'セッションの開始エラー: $1',
'config-session-expired' => 'セッションの有効期限が切れたようです。
セッションの有効期間は$1に設定されています。
php.iniの<code>session.gc_maxlifetime</code>を設定することで、この問題を改善できます。
インストール作業を再起動させてください。',
'config-no-session' => 'セッションのデータが消失しました!
php.iniを確認し、<code>session.save_path</code>が適切なディレクトリに設定されていることを確認してください。',
- 'config-your-language' => 'あなたの言語:',
+ 'config-your-language' => 'あなたの言語:',
'config-your-language-help' => 'インストール作業に使用する言語を選択してください。',
- 'config-wiki-language' => 'ウィキの言語:',
+ 'config-wiki-language' => 'ウィキの言語:',
'config-wiki-language-help' => 'ウィキで主に書き込まれる言語を選択してください。',
- 'config-back' => '←戻る',
+ 'config-back' => '← 戻る',
'config-continue' => '続行 →',
'config-page-language' => '言語',
- 'config-page-welcome' => 'MediaWikiへようこそ!',
+ 'config-page-welcome' => 'MediaWiki へようこそ!',
'config-page-dbconnect' => 'データベースに接続',
'config-page-upgrade' => '既存のインストールを更新',
'config-page-dbsettings' => 'データベースの設定',
'config-page-name' => '名前',
'config-page-options' => 'オプション',
'config-page-install' => 'インストール',
- 'config-page-complete' => '完了!',
+ 'config-page-complete' => '完了!',
'config-page-restart' => 'インストールを再起動',
'config-page-readme' => 'お読みください',
'config-page-releasenotes' => 'リリースノート',
高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正規化に関するページ]をお読みください。",
'config-unicode-update-warning' => "'''警告''':インストールされているバージョンのUnicode正規化ラッパーは、[http://site.icu-project.org/ ICUプロジェクト]のライブラリの古いバージョンを使用しています。
Unicodeを少しでも利用する可能性があるなら、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]する必要があります。",
- 'config-no-db' => '適切なデータベースドライバが見つかりませんでした!PHPにデータベースドライバをインストールする必要があります。
-次の種類のデータベースが使用できます: $1
+ 'config-no-db' => '適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。
+以下の種類のデータベースに対応しています: $1
-å\85±æ\9c\89ã\82µã\83¼ã\83\90ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\82µã\83¼ã\83\90ã\81®ç®¡ç\90\86è\80\85ã\81«é\81©å\88\87ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\83\89ã\83©ã\82¤ã\83\90ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\92依頼してください。
-PHPを自分でコンパイルした場合は、たとえば<code>./configure --with-mysql</code>を実行して、データベースクライアントを使用可能に再設定してください。
-DebianまたはUbuntuのパッケージからPHPをインストールした場合は、php5-mysqlモジュールもインストールする必要があります。',
+å\85±æ\9c\89ã\82µã\83¼ã\83\90ã\83¼ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81é\81©å\88\87ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ ã\83\89ã\83©ã\82¤ã\83\90ã\83¼ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\92ã\80\81ã\82µã\83¼ã\83\90ã\83¼ã\81®ç®¡ç\90\86è\80\85ã\81«依頼してください。
+PHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。
+Debian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。',
'config-no-fts3' => "'''警告''':SQLiteは[//sqlite.org/fts3.html FTS3]モジュールなしでコンパイルされており、検索機能はこのバックエンドで利用不可能になります。",
'config-register-globals' => "'''警告:PHPの<code>[http://php.net/register_globals register_globals]</code>オプションが有効になっています。'''
'''可能なら無効化してください。'''
Mandrakeを実行している場合、php-xmlパッケージをインストールしてください。',
'config-pcre' => 'PCREをサポートしているモジュールが不足しているようです。
MediaWikiは、Perl互換の正規表現関数の動作が必要です。',
- 'config-pcre-no-utf8' => "'''致命的エラー''': PHPのPCREがPCRE_UTF8サポート無しでコンパイルされています。
-MediaWikiにはUTF-8サポートの関数が必要です。",
+ 'config-pcre-no-utf8' => "'''致命的エラー''': PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。
+MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
'config-memory-raised' => 'PHPの<code>memory_limit</code>は$1で、$2に引き上げられました。',
'config-memory-bad' => "'''警告:'''PHPの<code>memory_limit</code>は$1です。
これは、非常に遅い可能性があります。
インストールが失敗するかもしれません!",
- 'config-xcache' => '[http://xcache.lighttpd.net/ XCache]がインストール済み',
- 'config-apc' => '[http://www.php.net/apc APC]がインストール済み',
- 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]がインストール済み',
- 'config-no-cache' => "'''è¦å\91\8aï¼\9a'''[http://www.php.net/apc APC]ã\80\81[http://xcache.lighttpd.net/ XCache]ã\81\82ã\82\8bã\81\84ã\81¯[http://www.iis.net/download/WinCacheForPhp WinCache]のいずれも見つかりませんでした。
+ 'config-xcache' => '[http://xcache.lighttpd.net/ XCache] がインストール済み',
+ 'config-apc' => '[http://www.php.net/apc APC] がインストール済み',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] がインストール済み',
+ 'config-no-cache' => "'''è¦å\91\8aï¼\9a'''[http://www.php.net/apc APC]ã\80\81[http://xcache.lighttpd.net/ XCache]ã\80\81[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。
オブジェクトのキャッシュは有効化されません。",
- 'config-diff3-bad' => 'GNU diff3が見つかりません。',
+ 'config-diff3-bad' => 'GNU diff3 が見つかりません。',
'config-imagemagick' => 'ImageMagickが見つかりました:<code>$1</code>。
アップロードが有効なら、画像のサムネイルが利用できます。',
'config-gd' => 'GD画像ライブラリが内蔵されていることが確認されました。
'config-no-uri' => "'''エラー:'''現在のURIを決定できませんでした。
インストールは中止されました。",
'config-using-server' => 'サーバー名「<nowiki>$1</nowiki>」を使用しています。',
- 'config-using-uri' => 'サーバーURL「<nowiki>$1$2</nowiki>」を使用しています。',
- 'config-uploads-not-safe' => "'''警告:'''アップロードの既定ディレクトリ<code>$1</code>が、任意のスクリプト実行に関して脆弱性があります。
-MediaWikiはアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化するまえに、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を閉じる]ことが強く推奨されます。",
+ 'config-using-uri' => 'サーバー URL「<nowiki>$1$2</nowiki>」を使用しています。',
+ 'config-uploads-not-safe' => "'''警告:'''アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。
+MediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。",
'config-brokenlibxml' => 'このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。
PHPを5.2.9かそれ以降のバージョンに、libxml2を2.7.3かそれ以降のバージョンにアップグレードしてください([//bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。
インストールを終了します。',
PHP5.3.2以降に更新するか、この([//bugs.php.net/bug.php?id=50394 PHPに提出されたバグ])を修正するためにPHP5.3.0へ戻してください。
インストールは中止されました。',
'config-suhosin-max-value-length' => 'Suhosin がインストールされており、GETパラメータの長さを $1 バイトに制限しています。MediaWiki の ResourceLoader コンポーネントはこの制限を回避しますが、パフォーマンスは低下します。可能な限り、php.ini で suhosin.get.max_value_length を 1024 以上に設定し、同じ値を LocalSettings.php 中で $wgResourceLoaderMaxQueryLength に設定してください。',
- 'config-db-type' => 'データベースの種類:',
- 'config-db-host' => 'データベースのホスト:',
+ 'config-db-type' => 'データベースの種類:',
+ 'config-db-host' => 'データベースのホスト:',
'config-db-host-help' => '異なるサーバー上にデータベースサーバーがある場合、ホスト名またはIPアドレスをここに入力してください。
もし、共有されたウェブホスティングを使用している場合、ホスティングプロバイダーは正確なホスト名を解説しているはずです。
WindowsでMySQLを使用している場合に、「localhost」は、サーバー名としてはうまく働かないでしょう。もしそのような場合は、ローカルIPアドレスとして「127.0.0.1」を試してみてください。
PostgreSQLを使用している場合、UNIXソケットで接続するにはこの欄を空欄のままにしてください。',
- 'config-db-host-oracle' => 'データベースTNS:',
+ 'config-db-host-oracle' => 'データベース TNS:',
'config-db-host-oracle-help' => '有効な[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続名]を入力してください。tnsnames.oraファイルは、このインストールに対して表示されてなければなりません、<br />もしクライアントライブラリ10gもしくはそれ以上を使用している場合、メソッドの名前を[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡易接続]で利用できます。',
- 'config-db-wiki-settings' => 'ã\81\93ã\81®ã\82¦ã\82£ã\82ã\82\92è\98å\88¥',
- 'config-db-name' => 'データベース名:',
+ 'config-db-wiki-settings' => 'ã\81\93ã\81®ã\82¦ã\82£ã\82ã\81®è\98å\88¥æ\83\85å ±',
+ 'config-db-name' => 'データベース名:',
'config-db-name-help' => 'このウィキを識別する名前を入力してください。
空白を含めることはできません。
共有ウェブホストを利用している場合、ホスティングプロバイダーが特定の使用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。',
- 'config-db-name-oracle' => 'データベースのスキーマ:',
- 'config-db-install-account' => 'ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81®ã\81\9fã\82\81ã\81®利用者アカウント',
- 'config-db-username' => 'データベースの利用者名:',
- 'config-db-password' => 'データベースのパスワード:',
+ 'config-db-name-oracle' => 'データベースのスキーマ:',
+ 'config-db-install-account' => 'ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81§ä½¿ç\94¨ã\81\99ã\82\8b利用者アカウント',
+ 'config-db-username' => 'データベースのユーザー名:',
+ 'config-db-password' => 'データベースのパスワード:',
'config-db-password-empty' => '新しいデータベースの利用者名 $1 のパスワードを入力してください。
パスワードを設定しないでユーザを作ることもできるかもしれませんが、安全ではありません。',
'config-db-install-username' => 'インストール中にデータベースに接続するために使うユーザ名を入力してください。これは MediaWiki アカウントのユーザ名 (利用者名) のことではありません。あなたのデータベースでのユーザ名です。',
'config-db-wiki-account' => 'インストール作業終了後の利用者アカウント',
'config-db-wiki-help' => '通常のウィキ操作中にデータベースへの接続する時に利用する利用者名とパスワードを入力してください。
アカウントが存在せず、インストールのアカウントに十分な権限がある場合は、この利用者アカウントは、ウィキを操作する上で最小限の権限を持った状態で作成されます。',
- 'config-db-prefix' => 'データベーステーブルの接頭辞:',
+ 'config-db-prefix' => 'データベース テーブルの接頭辞:',
'config-db-prefix-help' => 'データベースを複数のウィキ間、あるいはMediaWikiと他のウェブアプリケーションで共有する必要がある場合、衝突を避けるために、すべてのテーブル名に接頭辞を付ける必要があります。
空白は使用できません。
このフィールドは、通常は空のままです。',
'config-db-charset' => 'データベースの文字セット',
- 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0バイナリ',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 バイナリ',
'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
- 'config-charset-mysql4' => 'MySQL 4.0 下位互換UTF-8',
- 'config-charset-help' => "'''警告:'''MySQL 4.1+で'''下位互換UTF-8'''を使用し、その後<code>mysqldump</code>でデータベースをバックアップすると、すべての非ASCII文字が破壊され、不可逆的にバップアップが壊れるかもしれません。
-
-'''バイナリー形式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
-これは、MySQLのUTF-8形式より効率的で、Unicode文字の全範囲を利用できるようになります。
-'''UTF-8形式'''では、MySQLは、データ内でどの文字集合を使用しているかを知っていて、それに対して適切な提示と変換をするでしょうが、
-[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できるようにはなりません。",
- 'config-mysql-old' => 'MySQLの$1以降が要求されています。あなたの所有のものは$2です。',
- 'config-db-port' => 'データベースポート:',
- 'config-db-schema' => 'メディアウィキの図式',
- 'config-db-schema-help' => '上の図式は常に正確です。
-必要である場合のみ、変更してください。',
- 'config-sqlite-dir' => 'SQLiteのデータディレクトリ:',
- 'config-sqlite-dir-help' => "SQLiteは単一のファイル内にすべてのデータを保持しています。
-
-指定したディレクトリは、インストール時にウェブサーバーが書き込める必要があります。
-
-このディレクトリはウェブからアクセス'''不可能'''である必要があります。これがPHPファイルがある場所に配置できない理由です。
-
-インストーラーは同時に<code>.htaccess</code>ファイルに書き込みます。しかし、これが失敗しても誰かがあなたの生のデータベースにアクセスすることが可能となるでしょう。データベースは生のデータ(メールアドレス、パスワードのハッシュ値)の他、削除された版、その他、ウィキ上の制限されているデータを含んでいます。
-
-例えば<code>/var/lib/mediawiki/yourwiki</code>のように、別の場所にデータベースを配置することを検討してください。",
- 'config-oracle-def-ts' => '既定のテーブル領域:',
- 'config-oracle-temp-ts' => '一時的なテーブル領域:',
+ 'config-charset-mysql4' => 'MySQL 4.0 後方互換 UTF-8',
+ 'config-charset-help' => "'''警告:''' MySQL 4.1+ で'''後方互換 UTF-8''' を使用している状態で、<code>mysqldump</code> でデータベースをバックアップすると、すべての非 ASCII 文字が破壊されてしまい、バックアップが不可逆的に破損してしまいます!
+
+'''バイナリ モード'''では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。
+これは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。
+'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、
+[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
+ 'config-mysql-old' => 'MySQL $1 以降が必要です。ご使用中の MySQL は $2 です。',
+ 'config-db-port' => 'データベースのポート:',
+ 'config-db-schema' => 'MediaWiki のスキーマ:',
+ 'config-db-schema-help' => '通常はこのスキーマで問題ありません。
+必要な場合のみ変更してください。',
+ 'config-sqlite-dir' => 'SQLite データ ディレクトリ:',
+ 'config-sqlite-dir-help' => "SQLite は単一のファイル内にすべてのデータを格納しています。
+
+指定したディレクトリは、インストール時にウェブ サーバーが書き込めるようにしておく必要があります。
+
+このディレクトリはウェブからアクセス'''不可能'''である必要があります。PHP ファイルがある場所には配置できないのはこのためです。
+
+インストーラーは <code>.htaccess</code> ファイルにも書き込みます。しかし、これが失敗した場合は、誰かが生のデータベースにアクセスできてしまいます。
+データベースは、生のデータ (メールアドレス、パスワードのハッシュ値) の他、削除された版、その他ウィキ上の制限されているデータを含んでいます。
+
+例えば <code>/var/lib/mediawiki/yourwiki</code> のように、別の場所にデータベースを配置することを検討してください。",
+ 'config-oracle-def-ts' => '既定のテーブル領域:',
+ 'config-oracle-temp-ts' => '一時的なテーブル領域:',
'config-type-mysql' => 'MySQL',
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
'config-type-ibm_db2' => 'IBM DB2',
- 'config-support-info' => 'メディアウィキは次のようなデータベースシステムをサポートする:
+ 'config-support-info' => 'MediaWiki は以下のデータベース システムに対応しています:
$1
-もし、データベースシステムが不可視であるならば、以下のようにリスト化されたものを使用してみてください。可能なサポートの指示に従ってください。',
+使用しようとしているデータベース システムが下記の一覧にない場合は、上記リンク先の手順に従ってインストールしてください。',
'config-support-mysql' => '* $1はMediaWikiの主要な対象で、もっともサポートされています([http://www.php.net/manual/en/mysql.installation.php MySQLのサポート下でPHPをコンパイルする方法])',
'config-support-postgres' => '* $1は、MySQLの代替として、人気のあるオープンソースデータベースシステムです([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLのサポート下でPHPをコンパイルする方法])',
'config-support-sqlite' => '* $1は、良くサポートされている、軽量データベースシステムです。([http://www.php.net/manual/en/pdo.installation.php SQLiteのサポート下でPHPをコンパイルする方法]、PDOを使用)',
'config-support-oracle' => '* $1は商業企業のデータベースです。([http://www.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])',
'config-support-ibm_db2' => '* $1 は商業企業のデータベースです。',
- 'config-header-mysql' => 'MySQLの設定',
- 'config-header-postgres' => 'PostgreSQLの設定',
- 'config-header-sqlite' => 'SQLiteの設定',
- 'config-header-oracle' => 'Oracleの設定',
- 'config-header-ibm_db2' => 'IBM DB2の設定',
+ 'config-header-mysql' => 'MySQL の設定',
+ 'config-header-postgres' => 'PostgreSQL の設定',
+ 'config-header-sqlite' => 'SQLite の設定',
+ 'config-header-oracle' => 'Oracle の設定',
+ 'config-header-ibm_db2' => 'IBM DB2 の設定',
'config-invalid-db-type' => '無効なデータベースの種類',
- 'config-missing-db-name' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8dã\80\8dã\82\92å\85¥å\8a\9bã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99',
- 'config-missing-db-host' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83\9bã\82¹ã\83\88ã\80\8dã\82\92å\85¥å\8a\9bã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99',
- 'config-missing-db-server-oracle' => '「データベースTNS」に値を入力する必要があります',
+ 'config-missing-db-name' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8dã\80\8dã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84',
+ 'config-missing-db-host' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83\9bã\82¹ã\83\88ã\80\8dã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84',
+ 'config-missing-db-server-oracle' => '「データベース TNS」の値を入力してください',
'config-invalid-db-server-oracle' => '「$1」は無効なデータベース TNS です。
アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ドット(.)のみを使用してください。',
'config-invalid-db-name' => '「$1」は無効なデータベース名です。
'config-connection-error' => '$1。
以下のホスト名、ユーザ名、パスワードをチェックして、再度試してみてください。',
- 'config-invalid-schema' => 'ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82ã\80\8c$1ã\80\8dã\81«ã\81\8aã\81\91ã\82\8bç\84¡å\8a¹ã\81ªå\9b³å¼\8fです。
-アスキー英字(a-z、A-Z)、数字(0-9)、下線(_)のみを使用してください。',
- 'config-postgres-old' => 'PostgreSQLの$1あるいはそれ以降が必要で、いまのバージョンは$2です。',
+ 'config-invalid-schema' => 'ã\80\8c$1ã\80\8dã\81¯ MediaWiki ã\81®ã\82¹ã\82ã\83¼ã\83\9eã\81¨ã\81\97ã\81¦ç\84¡å\8a¹です。
+ASCII の英数字 (a-z、A-Z、0-9)、下線 (_) のみを使用してください。',
+ 'config-postgres-old' => 'PostgreSQL $1 以降が必要です。ご使用中の PostgreSQL は $2 です。',
'config-sqlite-name-help' => 'あなたのウェキと同一性のある名前を選んでください。
空白およびハイフンは使用しないでください。
SQLiteのデータファイル名として使用されます。',
- 'config-sqlite-parent-unwritable-group' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作成できません。親ディレクトリ<code><nowiki>$2</nowiki></code>は、ウェブサーバーから書き込みできませんでした。
+ 'config-sqlite-parent-unwritable-group' => 'データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。
-ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«æ©\9fè\83½ã\81¯ã\80\81å®\9fè¡\8cã\81\97ã\81¦ã\81\84ã\82\8bã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81®ユーザーを特定しました。
-続行するには、<code><nowiki>$3</nowiki></code>ディレクトリを書き込み可能にしてください。
-UnixあるいはLinux上では、以下を実行してください:
+ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯ã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81®å®\9fè¡\8cユーザーを特定しました。
+続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に書き込めるようにしてください。
+Unix または Linux であれば、以下を実行してください:
<pre>cd $2
mkdir $3
chgrp $4 $3
chmod g+w $3</pre>',
- 'config-sqlite-parent-unwritable-nogroup' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作成できません。親ディレクトリ<code><nowiki>$2</nowiki></code>は、ウェブサーバから書き込みできませんでした。
+ 'config-sqlite-parent-unwritable-nogroup' => 'データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは、親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。
-ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«æ©\9fè\83½ã\81¯ã\80\81å®\9fè¡\8cã\81\97ã\81¦ã\81\84ã\82\8bã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\81®ユーザーを特定できませんでした。
-続行するには、<code><nowiki>$3</nowiki></code>ディレクトリを、ウェブサーバ(と他のユーザ!)からグローバルに書き込めるようにしてください。
-UnixあるいはLinux上では、以下を実行してください:
+ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯ã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81®å®\9fè¡\8cユーザーを特定できませんでした。
+続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に、ウェブ サーバー (と、あらゆる人々!) がグローバルに書き込めるようにしてください。
+Unix または Linux では、以下を実行してください:
<pre>cd $2
mkdir $3
chmod a+w $3</pre>',
- 'config-sqlite-mkdir-error' => 'データディレクトリ「$1」の作成中にエラーが発生しました。
+ 'config-sqlite-mkdir-error' => 'データ ディレクトリ「$1」を作成する際にエラーが発生しました。
場所を確認してから、再度試してください。',
'config-sqlite-dir-unwritable' => 'ディレクトリ「$1」に書き込めません。
-ウェブサーバーが書き込めるようにパーミッションを変更してから、度試してください。',
+ウェブ サーバーが書き込めるようにパーミッションを変更してから、再度試してください。',
'config-sqlite-connection-error' => '$1。
-下記のデータディレクトリとデータベース名を確認してから、再度試してみてください。',
- 'config-sqlite-readonly' => 'ファイル<code>$1</code>は書き込み不能です。',
- 'config-sqlite-cant-create-db' => 'データベースファイル<code>$1</code>を作成できませんでした。',
- 'config-sqlite-fts3-downgrade' => 'PHPはFTS3のサポート、テーブルのダウングレードが無効です。',
- 'config-can-upgrade' => 'ã\81\93ã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\81¯ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cå\98å\9c¨ã\81\97ます。
-ã\81\9dã\82\8cã\82\89ã\82\92ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82$1ã\81«ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81\9fã\82\81ã\81«「続行」をクリックしてください。',
+データ ディレクトリおよびデータベース名を確認してから、再度試してください。',
+ 'config-sqlite-readonly' => 'ファイル <code>$1</code> に書き込めません。',
+ 'config-sqlite-cant-create-db' => 'データベース ファイル <code>$1</code> を作成できませんでした。',
+ 'config-sqlite-fts3-downgrade' => 'PHP が FTS3 に対応していないため、テーブルをダウングレードしています',
+ 'config-can-upgrade' => 'ã\81\93ã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\81¯ã\80\80MediaWiki ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cã\81\82ã\82\8aます。
+ã\81\93ã\82\8cã\82\89ã\81®ã\83\86ã\83¼ã\83\96ã\83«ã\82\92 MediaWiki $1 ã\81«ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81«ã\81¯ã\80\81「続行」をクリックしてください。',
'config-upgrade-done' => "更新は完了しました。
[$1 ウィキを使い始める]ことができます。
'config-show-table-status' => 'SHOW TABLE STATUSクエリーが失敗しました!',
'config-unknown-collation' => "'''警告:''' データベースは認識されない照合を使用しています。",
'config-db-web-account' => 'ウェブアクセスのためのデータベースアカウント',
- 'config-db-web-help' => 'ウィキの元来の操作中、ウェブサーバーがデーターベースサーバーに接続できるように、ユーザ名とパスワードを選択してください。',
- 'config-db-web-account-same' => 'インストールのために同じアカウントを使用してください',
- 'config-db-web-create' => '既に存在していないのであれば、アカウントを作成してください',
+ 'config-db-web-help' => 'ウィキの通常の操作の際に、ウェブ サーバーがデータベース サーバーに接続できるように、ユーザー名とパスワードを指定してください。',
+ 'config-db-web-account-same' => 'インストール作業と同じアカウントを使用する',
+ 'config-db-web-create' => 'アカウントが存在しない場合は作成する',
'config-db-web-no-create-privs' => 'あなたがインストールのために定義したアカウントは、アカウント作成のための特権としては不充分です。
あなたがここで指定したアカウントは既に存在している必要があります。',
- 'config-mysql-engine' => 'ストレージエンジン:',
+ 'config-mysql-engine' => 'ストレージ エンジン:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
'config-mysql-engine-help' => "'''InnoDB'''は、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。
'config-mysql-charset' => 'データベースの文字セット:',
'config-mysql-binary' => 'バイナリ',
'config-mysql-utf8' => 'UTF-8',
- 'config-mysql-charset-help' => "'''バイナリー形式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
-これは、MySQLのUTF-8形式より効率的で、Unicode文字の全範囲を利用できるようになります。
+ 'config-mysql-charset-help' => "'''バイナリ モード'''では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。
+これは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。
-'''UTF-8形式'''では、MySQLは、データ内でどの文字集合を使用しているかを知っていて、それに対して適切な提示と変換をするでしょうが、
-[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 å\9fºæ\9c¬å¤\9aè¨\80èª\9eé\9d¢]ã\81®å¤\96ã\81«ã\81\82ã\82\8bæ\96\87å\97ã\82\92æ ¼ç´\8dã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ã\81¯ã\81ªã\82\8aã\81¾ã\81\9bã\82\93ã\80\82",
- 'config-site-name' => 'ウィキの名前:',
+'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、
+[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
+ 'config-site-name' => 'ウィキ名:',
'config-site-name-help' => 'この事象はブラウザーのタイトルバーと他のさまざまな場所に現れる。',
'config-site-name-blank' => 'サイト名を入力してください。',
- 'config-project-namespace' => 'プロジェクト名前空間:',
+ 'config-project-namespace' => 'プロジェクト名前空間:',
'config-ns-generic' => 'プロジェクト',
- 'config-ns-site-name' => 'ウィキ名と同じ:$1',
- 'config-ns-other' => 'その他(指定してください)',
+ 'config-ns-site-name' => 'ウィキ名と同じ: $1',
+ 'config-ns-other' => 'その他 (指定してください)',
'config-ns-other-default' => 'マイウィキ',
'config-project-namespace-help' => "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。
この名前空間のページのタイトルはすべて、ある接頭辞で始まります。それをここで指定することができます。
-この接頭辞はウィキの名前に由来するのが伝統的ですが、「#」や「:」のような区切り記号を含めることはできません。",
+この接頭辞はウィキの名前に由来するのが伝統的ですが、「#」や「:」のような区切り文字を含めることはできません。",
'config-ns-invalid' => '"<nowiki>$1</nowiki>"のように指定された名前空間は無効です。
違うプロジェクト名前空間を指定してください。',
'config-admin-box' => '管理アカウント',
- 'config-admin-name' => '名前:',
- 'config-admin-password' => 'パスワード:',
- 'config-admin-password-confirm' => 'パスワードの再入力:',
- 'config-admin-help' => 'ここにあなたの希望するユーザ名を入力してください(例えば"Joe Bloggs"など)。
+ 'config-admin-name' => '名前:',
+ 'config-admin-password' => 'パスワード:',
+ 'config-admin-password-confirm' => 'パスワードの再入力:',
+ 'config-admin-help' => '希望するユーザー名をここに入力してください (例: "Joe Bloggs")。
この名前でこのウィキにログインすることになります。',
'config-admin-name-blank' => '管理者のユーザ名を入力してください。',
'config-admin-name-invalid' => '指定されたユーザ名 "<nowiki>$1</nowiki>" は無効です。
'config-admin-password-blank' => '管理者アカウントのパスワードを入力してください。',
'config-admin-password-same' => 'ユーザ名と同じパスワードは使えません。',
'config-admin-password-mismatch' => '入力された2つのパスワードが一致しません。',
- 'config-admin-email' => 'メールアドレス:',
+ 'config-admin-email' => 'メールアドレス:',
'config-admin-email-help' => 'メールアドレスを入力してください。他の利用者からのメールの受け取り、パスワードのリセット、ウォッチリストに登録したページの更新通知に使用します。空欄のままにすることもできます。',
'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
残りの設定を飛ばして、今すぐにウィキをインストールできます。',
'config-optional-continue' => '私にもっと質問してください。',
'config-optional-skip' => 'もう飽きてしまったので、とにかくウィキをインストールしてください。',
- 'config-profile' => '正しいプロフィールのユーザ:',
+ 'config-profile' => '利用者権限のプロファイル:',
'config-profile-wiki' => '伝統的なウィキ',
'config-profile-no-anon' => 'アカウントの作成が必要',
'config-profile-fishbowl' => '承認された編集者のみ',
'config-license-cc-by-sa' => 'クリエイティブ・コモンズ 表示-継承',
'config-license-cc-by' => 'クリエイティブ・コモンズ 表示',
'config-license-cc-by-nc-sa' => 'クリエイティブ・コモンズ 表示-非営利-継承',
- 'config-license-gfdl' => 'GNUフリー文書利用許諾契約書1.3以降',
+ 'config-license-gfdl' => 'GNU フリー文書利用許諾契約書 1.3 以降',
'config-license-pd' => 'パブリック・ドメイン',
'config-license-cc-choose' => 'その他のクリエイティブ・コモンズ・ライセンスを選択する',
'config-license-help' => "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]の元に置かれています。
'config-email-auth-help' => "この選択肢を有効にすると、利用者がメールアドレスを設定あるいは変更したときに送信されるリンクにより、そのアドレスを確認しなければならなくなります。
認証済みのアドレスだけが、他の利用者からのメールや、変更通知のメールを受け取ることができます。
公開ウィキでは、メール機能による潜在的な不正利用の防止のため、この選択肢を設定することが'''推奨'''されます。",
- 'config-email-sender' => '返信メールアドレス:',
+ 'config-email-sender' => '返信先メールアドレス:',
'config-email-sender-help' => '送信メールで返信先として使用するメールアドレスを入力してください。
このアドレスは、宛先不明の場合の通知の宛先になります。
多くのメールサーバーでは、少なくともドメイン名部分は有効である必要があります。',
'config-upload-settings' => '画像およびファイルのアップロード',
'config-upload-enable' => 'ファイルのアップロードを有効にする',
- 'config-upload-help' => 'ファイルのアップロードは潜在的にあなたのサーバにセキュリティ上の危険をさらします。
-更なる情報のために、マニュアルの[//www.mediawiki.org/wiki/Manual:Security security section] を読むことをすすめます。
+ 'config-upload-help' => 'ファイルのアップロードは、あなたのサーバーをセキュリティ上の潜在的な危険に晒します。
+この詳細は、マニュアルの [//www.mediawiki.org/wiki/Manual:Security security section] をお読みください。
-ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82ã\81®ã\83«ã\83¼ã\83\88ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªä¸\8bã\81®<code>images</code>ã\82µã\83\96ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81®ã\83¢ã\83¼ã\83\89ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9dã\81\86ã\81\99ã\82\8bã\81\93ã\81¨ã\81§ã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81¯そこに書き込めるようになります。
+ã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\82\92æ\9c\89å\8a¹ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81MediaWiki ã\81®ã\83«ã\83¼ã\83\88 ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªå\86\85ã\81® <code>images</code> ã\82µã\83\96 ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81®ã\83¢ã\83¼ã\83\89ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81«ã\82\88ã\82\8aã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81\8cそこに書き込めるようになります。
そして、このオプションを有効にしてください。',
'config-upload-deleted' => '削除されたファイルのためのディレクトリ:',
'config-upload-deleted-help' => '削除されるファイルを保存するためのディレクトリを選択してください。
これがウェブからアクセスできないことが理想です。',
- 'config-logo' => 'ロゴのURL:',
+ 'config-logo' => 'ロゴ のURL:',
'config-logo-help' => 'MediaWikiの既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
適切なサイズの画像をアップロードして、そのURLをここに入力してください。
ロゴが不要の場合は、このボックスを空白のままにしてください。',
- 'config-instantcommons' => 'InstantCommons機能を有効にする',
+ 'config-instantcommons' => 'Instant Commons 機能を有効にする',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトで見つかった画像や音声、その他のメディアをウィキ上で利用することができるようになる機能です。
これを有効化するには、MediaWikiはインターネットに接続できなければなりません。
-ウィキメディアコモンズ以外のウィキを同じように設定する方法など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。',
+ã\82¦ã\82£ã\82ã\83¡ã\83\87ã\82£ã\82¢ã\83»ã\82³ã\83¢ã\83³ã\82ºä»¥å¤\96ã\81®ã\82¦ã\82£ã\82ã\82\92å\90\8cã\81\98ã\82\88ã\81\86ã\81«è¨å®\9aã\81\99ã\82\8bæ\96¹æ³\95ã\81ªã\81©ã\80\81ã\81\93ã\81®æ©\9fè\83½ã\81«é\96¢ã\81\99ã\82\8b詳細ã\81ªæ\83\85å ±ã\81¯ã\80\81[//mediawiki.org/wiki/Manual:$wgForeignFileRepos ã\83\9eã\83\8bã\83¥ã\82¢ã\83«]ã\82\92ã\81\94覧ã\81\8fã\81 ã\81\95ã\81\84ã\80\82',
'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスの選択器から結果が得られませんでした。
ライセンスの名前を手動で入力してください。',
'config-cc-again' => 'もう一度選択してください...',
- 'config-cc-not-chosen' => 'あなたの求めるクリエイティブコモンズのライセンスを選んで、"続行"をクリックしてください。',
+ 'config-cc-not-chosen' => '希望するクリエイティブ・コモンズのライセンスを選択して、「続行」をクリックしてください。',
'config-advanced-settings' => '高度な設定',
'config-cache-options' => 'オブジェクトのキャッシュの設定:',
- 'config-cache-help' => 'ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ã\82ã\83£ã\83\83ã\82·ã\83¥ã\81¯ã\80\81使ç\94¨ã\81\97ã\81\9fã\83\87ã\83¼ã\82¿ã\82\92é »ç¹\81ã\81«ã\82ã\83£ã\83\83ã\82·ã\83³ã\82°ã\81\99ã\82\8bã\81\93ã\81¨ã\81«ã\82\88ã\81£ã\81¦ã\80\81ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82ã\81®ã\82¹ã\83\94ã\83¼ã\83\89æ\94¹å\96\84ã\81«ä½¿ç\94¨ã\81\95ã\82\8cます。
-中〜大サイトにおいては、これを有効にするために大変望ましいことです。また小さなサイトにおいても同様な利点をもたらすと考えられます。',
+ 'config-cache-help' => 'ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ã\82ã\83£ã\83\83ã\82·ã\83¥ã\82\92使ç\94¨ã\81\99ã\82\8bã\81¨ã\80\81é »ç¹\81ã\81«ä½¿ç\94¨ã\81\99ã\82\8bã\83\87ã\83¼ã\82¿ã\82\92ã\82ã\83£ã\83\83ã\82·ã\83¥ã\81\99ã\82\8bã\81\9fã\82\81 MediaWiki ã\81®å\8b\95ä½\9cé\80\9f度ã\82\92æ\94¹å\96\84ã\81§ã\81\8dます。
+中〜大規模サイトではこれを有効にすることを強くお勧めします。小規模サイトでも同様に効果があります。',
'config-cache-none' => 'キャッシングしない(機能は取り払われます、しかもより大きなウィキサイト上でスピードの問題が発生します)',
- 'config-cache-accel' => 'PHPオブジェクトキャッシング(APC、XCacheあるいはWinCache)',
+ 'config-cache-accel' => 'PHP オブジェクト キャッシュ (APC、XCache、WinCache のいずれか)',
'config-cache-memcached' => 'Memcachedを使用(追加の設定が必要です)',
'config-memcached-servers' => 'メモリをキャッシュされたサーバ:',
'config-memcached-help' => 'Memcachedを使用するIPアドレスの一覧。
これらは更に多くの設定を要求するかもしれませんが、今これらを有効にすることができます。',
'config-install-alreadydone' => "'''警告:''' 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。
次のページへ進んでください。",
- 'config-install-begin' => '「{{int:config-continue}}」を押すと、MediaWikiのインストールを開始することができます。
-å¤\89æ\9b´ã\81\97ã\81\9fã\81\84è¨å®\9aã\81\8cã\81\82ã\82\8cã\81°、「{{int:Config-back}}」を押してください。',
+ 'config-install-begin' => '「{{int:config-continue}}」を押すと、MediaWiki のインストールを開始できます。
+å¤\89æ\9b´ã\81\97ã\81\9fã\81\84è¨å®\9aã\81\8cã\81\82ã\82\8bå ´å\90\88ã\81¯、「{{int:Config-back}}」を押してください。',
'config-install-step-done' => '実行',
'config-install-step-failed' => '失敗した',
'config-install-extensions' => '拡張機能を含む',
'config-install-database' => 'データベースの構築',
'config-install-schema' => 'スキーマの作成',
'config-install-pg-schema-not-exist' => 'PostgreSQL スキーマがありません。',
- 'config-install-pg-schema-failed' => 'テーブルの作成に失敗した。
-ユーザ"$1"が図式"$2"に書き込みができるようにしてください。',
+ 'config-install-pg-schema-failed' => 'ã\83\86ã\83¼ã\83\96ã\83«ã\81®ä½\9cæ\88\90ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
+利用者「$1」がスキーマ「$2」に書き込めるようにしてください。',
'config-install-pg-commit' => '変更を送信',
- 'config-install-user' => 'データベースユーザを作成する',
- 'config-install-user-grant-failed' => 'ユーザー「$1」に許可を与えることに失敗しました。:$2',
+ 'config-install-user' => 'データベースユーザーの作成',
+ 'config-install-user-alreadyexists' => 'ユーザー「$1」は既に存在します',
+ 'config-install-user-create-failed' => 'ユーザー「$1」の作成に失敗しました: $2',
+ 'config-install-user-grant-failed' => 'ユーザー「$1」に許可を与えることに失敗しました: $2',
+ 'config-install-user-missing' => '指定したユーザー「$1」は存在しません。',
+ 'config-install-user-missing-create' => '指定したユーザー「$1」は存在しません。
+アカウントを作成する場合は、下の「アカウント作成」をクリックしてください。',
'config-install-tables' => 'テーブルの作成',
'config-install-tables-exist' => "'''警告''':MediaWikiテーブルは既に存在するようです。
作成を飛ばします。",
- 'config-install-tables-failed' => "'''エラー''':テーブルの作成が、次のエラーにより失敗しました:$1",
- 'config-install-interwiki' => 'æ\97¢å®\9aã\81®ã\82¦ã\82£ã\82é\96\93ã\83\86ã\83¼ã\83\96ã\83«ã\82\92å°\8eå\85¥ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99',
- 'config-install-interwiki-list' => 'ファイル<code>interwiki.list</code>を見つけることができませんでした。',
+ 'config-install-tables-failed' => "'''エラー''': テーブルの作成が、以下のエラーにより失敗しました: $1",
+ 'config-install-interwiki' => 'æ\97¢å®\9aã\81®ã\82¦ã\82£ã\82é\96\93ã\83\86ã\83¼ã\83\96ã\83«ã\81®å°\8eå\85¥',
+ 'config-install-interwiki-list' => 'ファイル <code>interwiki.list</code> から読み取れませんでした。',
'config-install-interwiki-exists' => "'''警告''':ウィキ間テーブルは既に登録されているようです。
既定のテーブルを無視します。",
- 'config-install-keys' => '秘密鍵を生成する',
- 'config-install-sysop' => '管理者のユーザーアカウントを作成する',
- 'config-install-mainpage' => '既定の接続でメインページを作成',
- 'config-install-mainpage-failed' => 'メインページを挿入できませんでした:$1',
+ 'config-install-stats' => '統計情報の初期化',
+ 'config-install-keys' => '秘密鍵の生成',
+ 'config-install-sysop' => '管理者のアカウントの作成',
+ 'config-install-mainpage' => 'メインページを既定の内容で作成',
+ 'config-install-mainpage-failed' => 'メインページを挿入できませんでした: $1',
'config-install-done' => "'''おめでとうございます!'''
MediaWikiのインストールに成功しました。
'''注意''': もし、これを今しなければ、つまり、このファイルをダウンロードせずインストールを終了した場合、この生成された設定ファイルは利用されません。
それを完了すれば、'''[$2 ウィキに入る]'''ことができます。",
- 'config-download-localsettings' => 'LocalSettings.phpをダウンロード',
+ 'config-download-localsettings' => 'LocalSettings.php をダウンロード',
'config-help' => 'ヘルプ',
'mainpagetext' => "'''MediaWiki のインストールに成功しました。'''",
'mainpagedocfooter' => 'ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。
/** Slovenian (slovenščina)
* @author Dbc334
+ * @author Eleassar
*/
$messages['sl'] = array(
'config-desc' => 'Namestitveni program za MediaWiki',
'config-profile-no-anon' => 'Zahtevano je ustvarjanje računa',
'config-profile-fishbowl' => 'Samo pooblaščeni urejevalci',
'config-profile-private' => 'Zasebni wiki',
- 'config-license' => 'Avtorske pravice in dovoljenje:',
+ 'config-license' => 'Avtorske pravice in licenca:',
'config-license-none' => 'Brez noge dovoljenja',
'config-license-cc-by-sa' => 'Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji',
'config-license-cc-by' => 'Creative Commons Priznanje avtorstva',
'config-cc-error' => 'Izbirnik dovoljenja Creative Commons ni vrnil nobenih rezultatov.
Vnesite ime dovoljenja ročno.',
'config-cc-again' => 'Izberi ponovno ...',
- 'config-cc-not-chosen' => 'Izberite dovoljenje Creative Commons, ki ga želite dodati, in kliknite »proceed«.',
+ 'config-cc-not-chosen' => 'Izberite licenco Creative Commons, ki jo želite uporabiti, in kliknite »proceed«.',
'config-advanced-settings' => 'Napredna konfiguracija',
'config-cache-accel' => 'Predpomnjenje predmetov PHP (APC, XCache ali WinCache)',
'config-cache-memcached' => 'Uporabi Memcached (zahteva dodatno namestitev in konfiguracijo)',
array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
array( 'addTable', 'sites', 'patch-sites.sql' ),
array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
);
}
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', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ),
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')" ),
array( 'addPgField', 'logging', 'log_params', 'TEXT' ),
array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ),
array( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ),
+ array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
array( 'checkIndex', 'pagelink_unique', array(
array('pl_from', 'int4_ops', 'btree', 0),
array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
array( 'addTable', 'sites', 'patch-sites.sql' ),
array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
);
}
/**
* Class to both describe a background job and handle jobs.
+ * The queue aspects of this class are now deprecated.
*
* @ingroup JobQueue
*/
abstract class Job {
-
/**
* @var Title
*/
* Run the job
* @return boolean success
*/
- abstract function run();
+ abstract public function run();
/*-------------------------------------------------------------------------
* Static functions
*------------------------------------------------------------------------*/
- /**
- * Pop a job of a certain type. This tries less hard than pop() to
- * actually find a job; it may be adversely affected by concurrent job
- * runners.
- *
- * @param $type string
- *
- * @return Job
- */
- static function pop_type( $type ) {
- wfProfilein( __METHOD__ );
-
- $dbw = wfGetDB( DB_MASTER );
-
- $dbw->begin( __METHOD__ );
-
- $row = $dbw->selectRow(
- 'job',
- '*',
- array( 'job_cmd' => $type ),
- __METHOD__,
- array( 'LIMIT' => 1, 'FOR UPDATE' )
- );
-
- if ( $row === false ) {
- $dbw->commit( __METHOD__ );
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- /* Ensure we "own" this row */
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- $affected = $dbw->affectedRows();
- $dbw->commit( __METHOD__ );
-
- if ( $affected == 0 ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- wfIncrStats( 'job-pop' );
- $namespace = $row->job_namespace;
- $dbkey = $row->job_title;
- $title = Title::makeTitleSafe( $namespace, $dbkey );
- $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
- $row->job_id );
-
- $job->removeDuplicates();
-
- wfProfileOut( __METHOD__ );
- return $job;
- }
-
- /**
- * Pop a job off the front of the queue
- *
- * @param $offset Integer: Number of jobs to skip
- * @return Job or false if there's no jobs
- */
- static function pop( $offset = 0 ) {
- wfProfileIn( __METHOD__ );
-
- $dbr = wfGetDB( DB_SLAVE );
-
- /* Get a job from the slave, start with an offset,
- scan full set afterwards, avoid hitting purged rows
-
- NB: If random fetch previously was used, offset
- will always be ahead of few entries
- */
-
- $conditions = self::defaultQueueConditions();
-
- $offset = intval( $offset );
- $options = array( 'ORDER BY' => 'job_id', 'USE INDEX' => 'PRIMARY' );
-
- $row = $dbr->selectRow( 'job', '*',
- array_merge( $conditions, array( "job_id >= $offset" ) ),
- __METHOD__,
- $options
- );
-
- // Refetching without offset is needed as some of job IDs could have had delayed commits
- // and have lower IDs than jobs already executed, blame concurrency :)
- //
- if ( $row === false ) {
- if ( $offset != 0 ) {
- $row = $dbr->selectRow( 'job', '*', $conditions, __METHOD__, $options );
- }
-
- if ( $row === false ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- }
-
- // Try to delete it from the master
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- $affected = $dbw->affectedRows();
- $dbw->commit( __METHOD__ );
-
- if ( !$affected ) {
- $dbw->begin( __METHOD__ );
-
- // Failed, someone else beat us to it
- // Try getting a random row
- $row = $dbw->selectRow( 'job', array( 'minjob' => 'MIN(job_id)',
- 'maxjob' => 'MAX(job_id)' ), '1=1', __METHOD__ );
- if ( $row === false || is_null( $row->minjob ) || is_null( $row->maxjob ) ) {
- // No jobs to get
- $dbw->rollback( __METHOD__ );
- wfProfileOut( __METHOD__ );
- return false;
- }
- // Get the random row
- $row = $dbw->selectRow( 'job', '*',
- 'job_id >= ' . mt_rand( $row->minjob, $row->maxjob ), __METHOD__ );
- if ( $row === false ) {
- // Random job gone before we got the chance to select it
- // Give up
- $dbw->rollback( __METHOD__ );
- wfProfileOut( __METHOD__ );
- return false;
- }
- // Delete the random row
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- $affected = $dbw->affectedRows();
- $dbw->commit( __METHOD__ );
-
- if ( !$affected ) {
- // Random job gone before we exclusively deleted it
- // Give up
- wfProfileOut( __METHOD__ );
- return false;
- }
- }
-
- // If execution got to here, there's a row in $row that has been deleted from the database
- // by this thread. Hence the concurrent pop was successful.
- wfIncrStats( 'job-pop' );
- $namespace = $row->job_namespace;
- $dbkey = $row->job_title;
- $title = Title::makeTitleSafe( $namespace, $dbkey );
-
- if ( is_null( $title ) ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
-
- // Remove any duplicates it may have later in the queue
- $job->removeDuplicates();
-
- wfProfileOut( __METHOD__ );
- return $job;
- }
-
/**
* Create the appropriate object to handle a specific job
*
* @throws MWException
* @return Job
*/
- static function factory( $command, Title $title, $params = false, $id = 0 ) {
+ public static function factory( $command, Title $title, $params = false, $id = 0 ) {
global $wgJobClasses;
if( isset( $wgJobClasses[$command] ) ) {
$class = $wgJobClasses[$command];
throw new MWException( "Invalid job command `{$command}`" );
}
- /**
- * @param $params
- * @return string
- */
- static function makeBlob( $params ) {
- if ( $params !== false ) {
- return serialize( $params );
- } else {
- return '';
- }
- }
-
- /**
- * @param $blob
- * @return bool|mixed
- */
- static function extractBlob( $blob ) {
- if ( (string)$blob !== '' ) {
- return unserialize( $blob );
- } else {
- return false;
- }
- }
-
/**
* Batch-insert a group of jobs into the queue.
* This will be wrapped in a transaction with a forced commit.
* removed later on, when the first one is popped.
*
* @param $jobs array of Job objects
+ * @deprecated 1.21
*/
- static function batchInsert( $jobs ) {
- if ( !count( $jobs ) ) {
- return;
- }
- $dbw = wfGetDB( DB_MASTER );
- $rows = array();
-
- /**
- * @var $job Job
- */
- foreach ( $jobs as $job ) {
- $rows[] = $job->insertFields();
- if ( count( $rows ) >= 50 ) {
- # Do a small transaction to avoid slave lag
- $dbw->begin( __METHOD__ );
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- $dbw->commit( __METHOD__ );
- $rows = array();
- }
- }
- if ( $rows ) { // last chunk
- $dbw->begin( __METHOD__ );
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- $dbw->commit( __METHOD__ );
- }
- wfIncrStats( 'job-insert', count( $jobs ) );
+ public static function batchInsert( $jobs ) {
+ return JobQueueGroup::singleton()->push( $jobs );
}
/**
* large batches of jobs can cause slave lag.
*
* @param $jobs array of Job objects
+ * @deprecated 1.21
*/
- static function safeBatchInsert( $jobs ) {
- if ( !count( $jobs ) ) {
- return;
- }
- $dbw = wfGetDB( DB_MASTER );
- $rows = array();
- foreach ( $jobs as $job ) {
- $rows[] = $job->insertFields();
- if ( count( $rows ) >= 500 ) {
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- $rows = array();
- }
- }
- if ( $rows ) { // last chunk
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- }
- wfIncrStats( 'job-insert', count( $jobs ) );
+ public static function safeBatchInsert( $jobs ) {
+ return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
}
-
/**
- * SQL conditions to apply on most JobQueue queries
+ * Pop a job of a certain type. This tries less hard than pop() to
+ * actually find a job; it may be adversely affected by concurrent job
+ * runners.
*
- * Whenever we exclude jobs types from the default queue, we want to make
- * sure that queries to the job queue actually ignore them.
+ * @param $type string
+ * @return Job
+ * @deprecated 1.21
+ */
+ public static function pop_type( $type ) {
+ return JobQueueGroup::singleton()->get( $type )->pop();
+ }
+
+ /**
+ * Pop a job off the front of the queue.
+ * This is subject to $wgJobTypesExcludedFromDefaultQueue.
*
- * @return array SQL conditions suitable for Database:: methods
+ * @return Job or false if there's no jobs
+ * @deprecated 1.21
*/
- static function defaultQueueConditions( ) {
- global $wgJobTypesExcludedFromDefaultQueue;
- $conditions = array();
- if ( count( $wgJobTypesExcludedFromDefaultQueue ) > 0 ) {
- $dbr = wfGetDB( DB_SLAVE );
- foreach ( $wgJobTypesExcludedFromDefaultQueue as $cmdType ) {
- $conditions[] = "job_cmd != " . $dbr->addQuotes( $cmdType );
- }
- }
- return $conditions;
+ public static function pop() {
+ return JobQueueGroup::singleton()->pop();
}
/*-------------------------------------------------------------------------
* @param $params array|bool
* @param $id int
*/
- function __construct( $command, $title, $params = false, $id = 0 ) {
+ public function __construct( $command, $title, $params = false, $id = 0 ) {
$this->command = $command;
$this->title = $title;
$this->params = $params;
$this->id = $id;
- // A bit of premature generalisation
- // Oh well, the whole class is premature generalisation really
- $this->removeDuplicates = true;
+ $this->removeDuplicates = false; // expensive jobs may set this to true
}
/**
- * Insert a single job into the queue.
- * @return bool true on success
+ * @return integer May be 0 for jobs stored outside the DB
*/
- function insert() {
- $fields = $this->insertFields();
+ public function getId() {
+ return $this->id;
+ }
- $dbw = wfGetDB( DB_MASTER );
+ /**
+ * @return string
+ */
+ public function getType() {
+ return $this->command;
+ }
- if ( $this->removeDuplicates ) {
- $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
- if ( $dbw->numRows( $res ) ) {
- return true;
- }
- }
- wfIncrStats( 'job-insert' );
- return $dbw->insert( 'job', $fields, __METHOD__ );
+ /**
+ * @return Title
+ */
+ public function getTitle() {
+ return $this->title;
}
/**
* @return array
*/
- protected function insertFields() {
- $dbw = wfGetDB( DB_MASTER );
- return array(
- 'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
- 'job_cmd' => $this->command,
- 'job_namespace' => $this->title->getNamespace(),
- 'job_title' => $this->title->getDBkey(),
- 'job_timestamp' => $dbw->timestamp(),
- 'job_params' => Job::makeBlob( $this->params )
- );
+ public function getParams() {
+ return $this->params;
}
/**
- * Remove jobs in the job queue which are duplicates of this job.
- * This is deadlock-prone and so starts its own transaction.
+ * @return bool
*/
- function removeDuplicates() {
- if ( !$this->removeDuplicates ) {
- return;
- }
+ public function ignoreDuplicates() {
+ return $this->removeDuplicates;
+ }
- $fields = $this->insertFields();
- unset( $fields['job_id'] );
- unset( $fields['job_timestamp'] );
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
- $dbw->delete( 'job', $fields, __METHOD__ );
- $affected = $dbw->affectedRows();
- $dbw->commit( __METHOD__ );
- if ( $affected ) {
- wfIncrStats( 'job-dup-delete', $affected );
- }
+ /**
+ * Insert a single job into the queue.
+ * @return bool true on success
+ * @deprecated 1.21
+ */
+ public function insert() {
+ return JobQueueGroup::singleton()->push( $this );
}
/**
* @return string
*/
- function toString() {
+ public function toString() {
$paramString = '';
if ( $this->params ) {
foreach ( $this->params as $key => $value ) {
$this->error = $error;
}
- function getLastError() {
+ public function getLastError() {
return $this->error;
}
}
--- /dev/null
+<?php
+/**
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.20
+ */
+abstract class JobQueue {
+ protected $wiki; // string; wiki ID
+ protected $type; // string; job type
+
+ const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+
+ /**
+ * @param $params array
+ */
+ protected function __construct( array $params ) {
+ $this->wiki = $params['wiki'];
+ $this->type = $params['type'];
+ }
+
+ /**
+ * Get a job queue object of the specified type.
+ * $params includes:
+ * class : what job class to use (determines job type)
+ * wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
+ * type : The name of the job types this queue handles
+ *
+ * @param $params array
+ * @return JobQueue
+ * @throws MWException
+ */
+ final public static function factory( array $params ) {
+ $class = $params['class'];
+ if ( !MWInit::classExists( $class ) ) {
+ throw new MWException( "Invalid job queue class '$class'." );
+ }
+ $obj = new $class( $params );
+ if ( !( $obj instanceof self ) ) {
+ throw new MWException( "Class '$class' is not a " . __CLASS__ . " class." );
+ }
+ return $obj;
+ }
+
+ /**
+ * @return string Wiki ID
+ */
+ final public function getWiki() {
+ return $this->wiki;
+ }
+
+ /**
+ * @return string Job type that this queue handles
+ */
+ final public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * @return bool Quickly check if the queue is empty
+ */
+ final public function isEmpty() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doIsEmpty();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::isEmpty()
+ * @return bool
+ */
+ abstract protected function doIsEmpty();
+
+ /**
+ * Push a batch of jobs into the queue
+ *
+ * @param $jobs array List of Jobs
+ * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+ * @return bool
+ */
+ final public function batchPush( array $jobs, $flags = 0 ) {
+ foreach ( $jobs as $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ }
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doBatchPush( $jobs, $flags );
+ if ( $ok ) {
+ wfIncrStats( 'job-insert', count( $jobs ) );
+ }
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::batchPush()
+ * @return bool
+ */
+ abstract protected function doBatchPush( array $jobs, $flags );
+
+ /**
+ * Pop a job off of the queue
+ *
+ * @return Job|bool Returns false on failure
+ */
+ final public function pop() {
+ wfProfileIn( __METHOD__ );
+ $job = $this->doPop();
+ if ( $job ) {
+ wfIncrStats( 'job-pop' );
+ }
+ wfProfileOut( __METHOD__ );
+ return $job;
+ }
+
+ /**
+ * @see JobQueue::pop()
+ * @return Job
+ */
+ abstract protected function doPop();
+
+ /**
+ * Acknowledge that a job was completed
+ *
+ * @param $job Job
+ * @return bool
+ */
+ final public function ack( Job $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doAck( $job );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::ack()
+ * @return bool
+ */
+ abstract protected function doAck( Job $job );
+
+ /**
+ * Wait for any slaves or backup servers to catch up
+ *
+ * @return void
+ */
+ final public function waitForBackups() {
+ wfProfileIn( __METHOD__ );
+ $this->doWaitForBackups();
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * @see JobQueue::waitForBackups()
+ * @return void
+ */
+ protected function doWaitForBackups() {}
+}
--- /dev/null
+<?php
+/**
+ * Database-backed job queue 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in the DB
+ *
+ * @ingroup JobQueue
+ * @since 1.20
+ */
+class JobQueueDB extends JobQueue {
+ const CACHE_TTL = 30; // integer; seconds
+ const MAX_JOB_RANDOM = 2147483647; // 2^31 - 1; used for job_random
+
+ /**
+ * @see JobQueue::doIsEmpty()
+ * @return bool
+ */
+ protected function doIsEmpty() {
+ global $wgMemc;
+
+ $key = $this->getEmptinessCacheKey();
+
+ $isEmpty = $wgMemc->get( $key );
+ if ( $isEmpty === 'true' ) {
+ return true;
+ } elseif ( $isEmpty === 'false' ) {
+ return false;
+ }
+
+ $found = $this->getSlaveDB()->selectField(
+ 'job', '1', array( 'job_cmd' => $this->type ), __METHOD__
+ );
+
+ $wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL );
+ }
+
+ /**
+ * @see JobQueue::doBatchPush()
+ * @return bool
+ */
+ protected function doBatchPush( array $jobs, $flags ) {
+ if ( count( $jobs ) ) {
+ $dbw = $this->getMasterDB();
+
+ $rows = array();
+ foreach ( $jobs as $job ) {
+ $rows[] = $this->insertFields( $job );
+ }
+ $atomic = ( $flags & self::QoS_Atomic );
+ $key = $this->getEmptinessCacheKey();
+ $ttl = self::CACHE_TTL;
+
+ $dbw->onTransactionIdle( function() use ( $dbw, $rows, $atomic, $key, $ttl ) {
+ global $wgMemc;
+
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+ if ( $atomic ) {
+ $dbw->begin(); // wrap all the job additions in one transaction
+ } else {
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ }
+ try {
+ foreach ( array_chunk( $rows, 50 ) as $rowBatch ) { // avoid slave lag
+ $dbw->insert( 'job', $rowBatch, __METHOD__ );
+ }
+ } catch ( DBError $e ) {
+ if ( $atomic ) {
+ $dbw->rollback();
+ } else {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+ }
+ throw $e;
+ }
+ if ( $atomic ) {
+ $dbw->commit();
+ } else {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+ }
+
+ $wgMemc->set( $key, 'false', $ttl );
+ } );
+ }
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doPop()
+ * @return Job|bool
+ */
+ protected function doPop() {
+ global $wgMemc;
+
+ $uuid = wfRandomString( 32 ); // pop attempt
+
+ $dbw = $this->getMasterDB();
+ $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+
+ $job = false; // job popped off
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ try {
+ do { // retry when our row is invalid or deleted as a duplicate
+ $row = false; // row claimed
+ $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+ $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+ // Try to reserve a DB row...
+ if ( $this->claim( $uuid, $rand, $gte ) || $this->claim( $uuid, $rand, !$gte ) ) {
+ // Fetch any row that we just reserved...
+ $row = $dbw->selectRow( 'job', '*',
+ array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__ );
+ // Check if another process deleted it as a duplicate
+ if ( !$row ) {
+ wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+ continue; // try again
+ }
+ // Get the job object from the row...
+ $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
+ if ( !$title ) {
+ $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+ wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
+ continue; // try again
+ }
+ $job = Job::factory( $row->job_cmd, $title,
+ self::extractBlob( $row->job_params ), $row->job_id );
+ // Delete any *other* duplicate jobs in the queue...
+ if ( $job->ignoreDuplicates() && strlen( $row->job_sha1 ) ) {
+ $dbw->delete( 'job',
+ array( 'job_sha1' => $row->job_sha1,
+ "job_id != {$dbw->addQuotes( $row->job_id )}" ),
+ __METHOD__
+ );
+ }
+ } else {
+ $wgMemc->set( $this->getEmptinessCacheKey(), 'true', self::CACHE_TTL );
+ }
+ break; // done
+ } while( true );
+ } catch ( DBError $e ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+ throw $e;
+ }
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+
+ return $job;
+ }
+
+ /**
+ * Reserve a row with a single UPDATE without holding row locks over RTTs...
+ * @param $uuid string 32 char hex string
+ * @param $rand integer Random unsigned integer (31 bits)
+ * @param $gte bool Search for job_random >= $random (otherwise job_random <= $random)
+ * @return integer Number of affected rows
+ */
+ protected function claim( $uuid, $rand, $gte ) {
+ $dbw = $this->getMasterDB();
+ $dir = $gte ? 'ASC' : 'DESC';
+ $ineq = $gte ? '>=' : '<=';
+ if ( $dbw->getType() === 'mysql' ) {
+ // Per http://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
+ // same table being changed in an UPDATE query in MySQL (gives Error: 1093).
+ // Oracle and Postgre have no such limitation. However, MySQL offers an
+ // alternative here by supporting ORDER BY + LIMIT for UPDATE queries.
+ // The DB wrapper functions do not support this, so it's done manually.
+ $dbw->query( "UPDATE {$dbw->tableName( 'job' )}
+ SET
+ job_token = {$dbw->addQuotes( $uuid ) },
+ job_token_timestamp = {$dbw->addQuotes( $dbw->timestamp() )}
+ WHERE (
+ job_cmd = {$dbw->addQuotes( $this->type )}
+ AND job_token = {$dbw->addQuotes( '' )}
+ AND job_random {$ineq} {$dbw->addQuotes( $rand )}
+ ) ORDER BY job_random {$dir} LIMIT 1",
+ __METHOD__
+ );
+ } else {
+ // Use a subquery to find the job, within an UPDATE to claim it.
+ // This uses as much of the DB wrapper functions as possible.
+ $dbw->update( 'job',
+ array( 'job_token' => $uuid, 'job_token_timestamp' => $dbw->timestamp() ),
+ array( 'job_id = (' .
+ $dbw->selectSQLText( 'job', 'job_id',
+ array(
+ 'job_cmd' => $this->type,
+ 'job_token' => '',
+ "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
+ __METHOD__,
+ array( 'ORDER BY' => "job_random {$dir}", 'LIMIT' => 1 ) ) .
+ ')'
+ ),
+ __METHOD__
+ );
+ }
+ return $dbw->affectedRows();
+ }
+
+ /**
+ * @see JobQueue::doAck()
+ * @return Job|bool
+ */
+ protected function doAck( Job $job ) {
+ $dbw = $this->getMasterDB();
+ if ( $dbw->trxLevel() ) {
+ wfWarn( "Attempted to ack a job in a transaction; committing first." );
+ $dbw->commit(); // push existing transaction
+ }
+
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ try {
+ // Delete a row with a single DELETE without holding row locks over RTTs...
+ $dbw->delete( 'job', array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ) );
+ } catch ( Exception $e ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+ throw $e;
+ }
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doWaitForBackups()
+ * @return void
+ */
+ protected function doWaitForBackups() {
+ wfWaitForSlaves();
+ }
+
+ /**
+ * @return DatabaseBase
+ */
+ protected function getSlaveDB() {
+ return wfGetDB( DB_SLAVE, array(), $this->wiki );
+ }
+
+ /**
+ * @return DatabaseBase
+ */
+ protected function getMasterDB() {
+ return wfGetDB( DB_MASTER, array(), $this->wiki );
+ }
+
+ /**
+ * @param $job Job
+ * @return array
+ */
+ protected function insertFields( Job $job ) {
+ // Rows that describe the nature of the job
+ $descFields = array(
+ 'job_cmd' => $job->getType(),
+ 'job_namespace' => $job->getTitle()->getNamespace(),
+ 'job_title' => $job->getTitle()->getDBkey(),
+ 'job_params' => self::makeBlob( $job->getParams() ),
+ );
+ // Additional job metadata
+ $dbw = $this->getMasterDB();
+ $metaFields = array(
+ 'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+ 'job_timestamp' => $dbw->timestamp(),
+ 'job_sha1' => wfBaseConvert( sha1( serialize( $descFields ) ), 16, 36, 32 ),
+ 'job_random' => mt_rand( 0, self::MAX_JOB_RANDOM )
+ );
+ return ( $descFields + $metaFields );
+ }
+
+ /**
+ * @return string
+ */
+ private function getEmptinessCacheKey() {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'isempty' );
+ }
+
+ /**
+ * @param $params
+ * @return string
+ */
+ protected static function makeBlob( $params ) {
+ if ( $params !== false ) {
+ return serialize( $params );
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * @param $blob
+ * @return bool|mixed
+ */
+ protected static function extractBlob( $blob ) {
+ if ( (string)$blob !== '' ) {
+ return unserialize( $blob );
+ } else {
+ return false;
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.20
+ */
+class JobQueueGroup {
+ /** @var Array */
+ protected static $instances = array();
+
+ protected $wiki; // string; wiki ID
+
+ const TYPE_DEFAULT = 1; // integer; job not in $wgJobTypesExcludedFromDefaultQueue
+ const TYPE_ANY = 2; // integer; any job
+
+ /**
+ * @param $wiki string Wiki ID
+ */
+ protected function __construct( $wiki ) {
+ $this->wiki = $wiki;
+ }
+
+ /**
+ * @param $wiki string Wiki ID
+ * @return JobQueueGroup
+ */
+ public static function singleton( $wiki = false ) {
+ $wiki = ( $wiki === false ) ? wfWikiID() : $wiki;
+ if ( !isset( self::$instances[$wiki] ) ) {
+ self::$instances[$wiki] = new self( $wiki );
+ }
+ return self::$instances[$wiki];
+ }
+
+ /**
+ * @param $type string
+ * @return JobQueue Job queue object for a given queue type
+ */
+ public function get( $type ) {
+ global $wgJobTypeConf;
+
+ $conf = false;
+ if ( isset( $wgJobTypeConf[$type] ) ) {
+ $conf = $wgJobTypeConf[$type];
+ } else {
+ $conf = $wgJobTypeConf['default'];
+ }
+
+ return JobQueue::factory( array(
+ 'class' => $conf['class'],
+ 'wiki' => $this->wiki,
+ 'type' => $type,
+ ) );
+ }
+
+ /**
+ * Insert jobs into the respective queues of with the belong
+ *
+ * @param $jobs Job|array A single Job or a list of Jobs
+ * @return bool
+ */
+ public function push( $jobs ) {
+ $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
+
+ $jobsByType = array(); // (job type => list of jobs)
+ foreach ( $jobs as $job ) {
+ if ( $job instanceof Job ) {
+ $jobsByType[$job->getType()][] = $job;
+ } else {
+ throw new MWException( "Attempted to push a non-Job object into a queue." );
+ }
+ }
+
+ $ok = true;
+ foreach ( $jobsByType as $type => $jobs ) {
+ if ( !$this->get( $type )->batchPush( $jobs ) ) {
+ $ok = false;
+ }
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Pop a job off one of the job queues
+ *
+ * @param $type integer JobQueueGroup::TYPE_* constant
+ * @return Job|bool Returns false on failure
+ */
+ public function pop( $type = self::TYPE_DEFAULT ) {
+ $types = ( $type == self::TYPE_DEFAULT )
+ ? $this->getDefaultQueueTypes()
+ : $this->getQueueTypes();
+ shuffle( $types ); // avoid starvation
+
+ foreach ( $types as $type ) { // for each queue...
+ $job = $this->get( $type )->pop();
+ if ( $job ) {
+ return $job; // found
+ }
+ }
+
+ return false; // no jobs found
+ }
+
+ /**
+ * Acknowledge that a job was completed
+ *
+ * @param $job Job
+ * @return bool
+ */
+ public function ack( Job $job ) {
+ return $this->get( $job->getType() )->ack( $job );
+ }
+
+ /**
+ * Get the list of queue types
+ *
+ * @return array List of strings
+ */
+ public function getQueueTypes() {
+ global $wgJobClasses;
+
+ return array_keys( $wgJobClasses );
+ }
+
+ /**
+ * Get the list of default queue types
+ *
+ * @return array List of strings
+ */
+ public function getDefaultQueueTypes() {
+ global $wgJobTypesExcludedFromDefaultQueue;
+
+ return array_diff( $this->getQueueTypes(), $wgJobTypesExcludedFromDefaultQueue );
+ }
+}
* @ingroup JobQueue
*/
class RefreshLinksJob extends Job {
-
function __construct( $title, $params = '', $id = 0 ) {
parent::__construct( 'refreshLinks', $title, $params, $id );
+ $this->removeDuplicates = true; // job is expensive
}
/**
const TYPE_DO = 15; // keywords: case, var, finally, else, do, try
const TYPE_FUNC = 16; // keywords: function
const TYPE_LITERAL = 17; // all literals, identifiers and unrecognised tokens
-
+
// Sanity limit to avoid excessive memory usage
const STACK_LIMIT = 1000;
self::TYPE_LITERAL => true
)
);
-
+
// Rules for when newlines should be inserted if
// $statementsOnOwnLine is enabled.
// $newlineBefore is checked before switching state,
return self::parseError($s, $end, 'Number with several E' );
}
$end++;
-
+
// + sign is optional; - sign is required.
$end += strspn( $s, '-+', $end );
$len = strspn( $s, '0123456789', $end );
$out .= ' ';
$lineLength++;
}
-
+
$out .= $token;
$lineLength += $end - $pos; // += strlen( $token )
$last = $s[$end - 1];
$pos = $end;
$newlineFound = false;
-
+
// Output a newline after the token if required
// This is checked before AND after switching state
$newlineAdded = false;
} elseif( isset( $goto[$state][$type] ) ) {
$state = $goto[$state][$type];
}
-
+
// Check for newline insertion again
if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineAfter[$state][$type] ) ) {
$out .= "\n";
}
return $out;
}
-
+
static function parseError($fullJavascript, $position, $errorMsg) {
// TODO: Handle the error: trigger_error, throw exception, return false...
return false;
unset( $baseArray['comment'] );
unset( $baseArray['xmp'] );
-
+
$baseArray['metadata'] = $meta->getMetadataArray();
$baseArray['metadata']['_MW_GIF_VERSION'] = GIFMetadataExtractor::VERSION;
return $baseArray;
function retrieveMetaData() {
global $wgDjvuToXML, $wgDjvuDump, $wgDjvuTxt;
wfProfileIn( __METHOD__ );
-
+
if ( isset( $wgDjvuDump ) ) {
# djvudump is faster as of version 3.5
# http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
$xml = null;
}
# Text layer
- if ( isset( $wgDjvuTxt ) ) {
+ if ( isset( $wgDjvuTxt ) ) {
wfProfileIn( 'djvutxt' );
$cmd = wfEscapeShellArg( $wgDjvuTxt ) . ' --detail=page ' . wfEscapeShellArg( $this->mFilename ) ;
wfDebug( __METHOD__.": $cmd\n" );
$reg = <<<EOR
/\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
((?> # Text to match is composed of atoms of either:
- \\\\. # - any escaped character
+ \\\\. # - any escaped character
| # - any character different from " and \
[^"\\\\]+
)*?)
$this->charCodeString( 'UserComment' );
$this->charCodeString( 'GPSProcessingMethod');
$this->charCodeString( 'GPSAreaInformation' );
-
+
//ComponentsConfiguration should really be an array instead of a string...
//This turns a string of binary numbers into an array of numbers.
$ccVals['_type'] = 'ol'; //this is for formatting later.
$this->mFilteredExifData['ComponentsConfiguration'] = $ccVals;
}
-
+
//GPSVersion(ID) is treated as the wrong type by php exif support.
//Go through each byte turning it into a version string.
//For example: "\x02\x02\x00\x00" -> "2.2.0.0"
}
$charCode = substr( $this->mFilteredExifData[$prop], 0, 8);
$val = substr( $this->mFilteredExifData[$prop], 8);
-
-
+
switch ($charCode) {
case "\x4A\x49\x53\x00\x00\x00\x00\x00":
//JIS
wfRestoreWarnings();
}
}
-
+
//trim and check to make sure not only whitespace.
$val = trim($val);
if ( strlen( $val ) === 0 ) {
return false;
}
if( $count > 1 ) {
- foreach( $val as $v ) {
+ foreach( $val as $v ) {
if( !$this->validate( $section, $tag, $v, true ) ) {
- return false;
- }
+ return false;
+ }
}
return true;
}
class GIFHandler extends BitmapHandler {
const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
-
+
function getMetadata( $image, $filename ) {
try {
$parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
wfSuppressWarnings();
$metadata = unserialize($image->getMetadata());
wfRestoreWarnings();
-
+
if (!$metadata || $metadata['frameCount'] <= 1) {
return $original;
}
/* Preserve original image info string, but strip the last char ')' so we can add even more */
$info = array();
$info[] = $original;
-
+
if ( $metadata['looped'] ) {
$info[] = wfMessage( 'file-info-gif-looped' )->parse();
}
-
+
if ( $metadata['frameCount'] > 1 ) {
$info[] = wfMessage( 'file-info-gif-frames' )->numParams( $metadata['frameCount'] )->parse();
}
-
+
if ( $metadata['duration'] ) {
$info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
}
-
+
return $wgLang->commaList( $info );
}
}
$isLooped = false;
$xmp = "";
$comment = array();
-
+
if ( !$filename ) {
throw new Exception( "No file name specified" );
} elseif ( !file_exists( $filename ) || is_dir( $filename ) ) {
## Read GCT
self::readGCT( $fh, $bpp );
fread( $fh, 1 );
- self::skipBlock( $fh );
+ self::skipBlock( $fh );
} elseif ( $buf == self::$gif_extension_sep ) {
$buf = fread( $fh, 1 );
if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
// NETSCAPE2.0 (application name for animated gif)
if ( $data == 'NETSCAPE2.0' ) {
-
$data = fread( $fh, 2 ); // Block length and introduction, should be 03 01
if ($data != "\x03\x01") {
throw new Exception( "Expected \x03\x01, got $data" );
}
-
+
// Unsigned little-endian integer, loop count or zero for "forever"
$loopData = fread( $fh, 2 );
if ( strlen( $loopData ) < 2 ) throw new Exception( "Ran out of input" );
$loopData = unpack( 'v', $loopData );
$loopCount = $loopData[1];
-
+
if ($loopCount != 1) {
$isLooped = true;
}
-
+
// Read out terminator byte
fread( $fh, 1 );
} elseif ( $data == 'XMP DataXMP' ) {
// whatever...
$segments["XMP"] = substr( $temp, 29 );
wfDebug( __METHOD__ . ' Found XMP section with wrong app identifier '
- . "Using anyways.\n" );
+ . "Using anyways.\n" );
} elseif ( substr( $temp, 0, 6 ) === "Exif\0\0" ) {
// Just need to find out what the byte order is.
// because php's exif plugin sucks...
* @return array
*/
public function getDescLinkAttribs( $title = null, $params = '' ) {
- $query = $this->page ? ( 'page=' . urlencode( $this->page ) ) : '';
+ $query = '';
+ if ( $this->page && $this->page !== 1 ) {
+ $query = 'page=' . urlencode( $this->page );
+ }
if( $params ) {
$query .= $query ? '&'.$params : $params;
}
function canAnimateThumbnail( $image ) {
return false;
}
-
+
function getMetadataType( $image ) {
return 'parsed-png';
}
-
+
function isMetadataValid( $image, $metadata ) {
if ( $metadata === self::BROKEN_FILE ) {
$info = array();
$info[] = $original;
-
+
if ( $metadata['loopCount'] == 0 ) {
$info[] = wfMessage( 'file-info-png-looped' )->parse();
} elseif ( $metadata['loopCount'] > 1 ) {
$info[] = wfMessage( 'file-info-png-repeat' )->numParams( $metadata['loopCount'] )->parse();
}
-
+
if ( $metadata['frameCount'] > 0 ) {
$info[] = wfMessage( 'file-info-png-frames' )->numParams( $metadata['frameCount'] )->parse();
}
-
+
if ( $metadata['duration'] ) {
$info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
}
-
+
return $wgLang->commaList( $info );
}
case 0:
$colorType = 'greyscale';
break;
- case 2:
+ case 2:
$colorType = 'truecolour';
break;
case 3:
$this->reader->open( $source, null, LIBXML_NOERROR | LIBXML_NOWARNING );
}
- // Expand entities, since Adobe Illustrator uses them for xmlns
- // attributes (bug 31719). Note that libxml2 has some protection
- // against large recursive entity expansions so this is not as
+ // Expand entities, since Adobe Illustrator uses them for xmlns
+ // attributes (bug 31719). Note that libxml2 has some protection
+ // against large recursive entity expansions so this is not as
// insecure as it might appear to be.
$this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
* 'validate' => 'validateClosed',
* 'choices' => array( '1' => true, '2' => true ),
* ),
- */
+ */
),
'http://ns.adobe.com/exif/1.0/aux/' => array(
'Lens' => array(
//check if its in a numeric range
$inRange = false;
- if ( isset( $info['rangeLow'] )
+ if ( isset( $info['rangeLow'] )
&& isset( $info['rangeHigh'] )
&& is_numeric( $val )
&& ( intval( $val ) <= $info['rangeHigh'] )
}
$m = array();
- if ( preg_match(
+ if ( preg_match(
'/(\d{1,3}),(\d{1,2}),(\d{1,2})([NWSE])/D',
$val, $m )
) {
}
$val = $coord;
return;
- } elseif ( preg_match(
+ } elseif ( preg_match(
'/(\d{1,3}),(\d{1,2}(?:.\d*)?)([NWSE])/D',
$val, $m )
) {
return;
} else {
- wfDebugLog( 'XMP', __METHOD__
+ wfDebugLog( 'XMP', __METHOD__
. " Expected GPSCoordinate, but got $val." );
$val = null;
return;
$name = $columns[1];
$simpleUpper = $columns[12];
$simpleLower = $columns[13];
-
+
$source = codepointToUtf8( hexdec( $codepoint ) );
if( $simpleUpper ) {
$wikiUpperChars[$source] = codepointToUtf8( hexdec( $simpleUpper ) );
* @param $string String The string
* @return String String with the character codes replaced.
*/
- private static function replaceForNativeNormalize( $string ) {
+ private static function replaceForNativeNormalize( $string ) {
$string = preg_replace(
'/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
UTF8_REPLACEMENT,
* 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 UtfNormal
*/
/**
* Some constant definitions for the unicode normalization module.
*
- * Note: these constants must all be resolvable at compile time by HipHop,
+ * Note: these constants must all be resolvable at compile time by HipHop,
* since this file will not be executed during request startup for a compiled
* MediaWiki.
*
*
* @file
*/
-
+
UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
UtfNormal::\$utfCanonicalDecomp = unserialize( '$serCanon' );
* @ingroup Cache
*/
class EhcacheBagOStuff extends BagOStuff {
- var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
+ var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
$requestData, $requestDataPos;
-
+
var $curls = array();
/**
}
$this->servers = $params['servers'];
$this->cacheName = isset( $params['cache'] ) ? $params['cache'] : 'mw';
- $this->connectTimeout = isset( $params['connectTimeout'] )
+ $this->connectTimeout = isset( $params['connectTimeout'] )
? $params['connectTimeout'] : 1;
$this->timeout = isset( $params['timeout'] ) ? $params['timeout'] : 1;
$this->curlOptions = array(
if ( $response['http_code'] >= 300 ) {
wfDebug( __METHOD__.": GET failure, got HTTP {$response['http_code']}\n" );
wfProfileOut( __METHOD__ );
- return false;
+ return false;
}
$body = $response['body'];
$type = $response['content_type'];
* @return int
*/
protected function attemptPut( $key, $data, $type, $ttl ) {
- // In initial benchmarking, it was 30 times faster to use CURLOPT_POST
+ // In initial benchmarking, it was 30 times faster to use CURLOPT_POST
// than CURLOPT_UPLOAD with CURLOPT_READFUNCTION. This was because
- // CURLOPT_UPLOAD was pushing the request headers first, then waiting
+ // CURLOPT_UPLOAD was pushing the request headers first, then waiting
// for an ACK packet, then sending the data, whereas CURLOPT_POST just
// sends the headers and the data in a single send().
$response = $this->doItemRequest( $key,
*/
protected function createCache( $key ) {
wfDebug( __METHOD__.": creating cache for $key\n" );
- $response = $this->doCacheRequest( $key,
+ $response = $this->doCacheRequest( $key,
array(
CURLOPT_POST => 1,
CURLOPT_CUSTOMREQUEST => 'PUT',
if ( array_diff_key( $curlOptions, $this->curlOptions ) ) {
// var_dump( array_diff_key( $curlOptions, $this->curlOptions ) );
throw new MWException( __METHOD__.": to prevent options set in one doRequest() " .
- "call from affecting subsequent doRequest() calls, only options listed " .
+ "call from affecting subsequent doRequest() calls, only options listed " .
"in \$this->curlOptions may be specified in the \$curlOptions parameter." );
}
$curlOptions += $this->curlOptions;
* @return Mixed
*/
public function replace( $key, $value, $exptime = 0 ) {
- return $this->client->replace( $this->encodeKey( $key ), $value,
+ return $this->client->replace( $this->encodeKey( $key ), $value,
$this->fixExpiry( $exptime ) );
}
return false;
}
if ( substr( $data, -2 ) !== "\r\n" ) {
- $this->_handle_error( $sock,
+ $this->_handle_error( $sock,
'line ending missing from data block from $1' );
return false;
}
}
/**
- * Read the specified number of bytes from a stream. If there is an error,
+ * Read the specified number of bytes from a stream. If there is an error,
* mark the socket dead.
*
* @param $sock The socket
function _fgets( $sock ) {
$result = fgets( $sock );
// fgets() may return a partial line if there is a select timeout after
- // a successful recv(), so we have to check for a timeout even if we
+ // a successful recv(), so we have to check for a timeout even if we
// got a string response.
$data = stream_get_meta_data( $sock );
if ( $data['timed_out'] ) {
public function unlock( $key ) {
return $this->client->unlock( $this->encodeKey( $key ) );
}
-
+
/**
* @param $key string
* @param $value int
*/
/**
- * A cache class that replicates all writes to multiple child caches. Reads
- * are implemented by reading from the caches in the order they are given in
+ * A cache class that replicates all writes to multiple child caches. Reads
+ * are implemented by reading from the caches in the order they are given in
* the configuration until a cache gives a positive result.
*
* @ingroup Cache
/**
* Factory function that creates a memcached client object.
*
- * This always uses the PHP client, since the PECL client has a different
- * hashing scheme and a different interpretation of the flags bitfield, so
+ * This always uses the PHP client, since the PECL client has a different
+ * hashing scheme and a different interpretation of the flags bitfield, so
* switching between the two clients randomly would be disasterous.
*
* @param $params array
/** Associative array mapping module name to info associative array */
protected $moduleInfos = array();
-
+
/** Associative array mapping framework ids to a list of names of test suite modules */
/** like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. ) */
protected $testModuleNames = array();
public function getModuleNames() {
return array_keys( $this->moduleInfos );
}
-
+
/**
* Get a list of test module names for one (or all) frameworks.
* If the given framework id is unknkown, or if the in-object variable is not an array,
protected $debugRaw = true;
/** Boolean: Whether mw.loader.state() call should be omitted */
protected $raw = false;
+ protected $targets = array( 'desktop' );
+
/**
* Array: Cache for mtime
* @par Usage:
// Lists of strings
case 'dependencies':
case 'messages':
+ case 'targets':
$this->{$member} = (array) $option;
break;
// Single strings
protected function readStyleFile( $path, $flip ) {
$localPath = $this->getLocalPath( $path );
if ( !file_exists( $localPath ) ) {
- throw new MWException( __METHOD__.": style file not found: \"$localPath\"" );
+ $msg = __METHOD__.": style file not found: \"$localPath\"";
+ wfDebugLog( 'resourceloader', $msg );
+ throw new MWException( $msg );
}
$style = file_get_contents( $localPath );
if ( $flip ) {
public function getFlip( $context ) {
return $context->getDirection() === 'rtl';
}
+
+ /**
+ * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+ *
+ * @return array of strings
+ */
+ public function getTargets() {
+ return $this->targets;
+ }
+
}
* NOTE: The mtime of the module's messages is NOT automatically included.
* If you want this to happen, you'll need to call getMsgBlobMtime()
* yourself and take its result into consideration.
- *
+ *
* @param $context ResourceLoaderContext: Context object
* @return Integer: UNIX timestamp
*/
return self::$jsParser;
}
+ /**
+ * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+ * Default implementation hardcodes 'desktop'.
+ *
+ * @return array of strings
+ */
+ public function getTargets() {
+ return array( 'desktop' );
+ }
}
/**
* Gets group name
- *
+ *
* @return String: Name of group
*/
public function getGroup() {
'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
);
if ( $wgHandheldStyle ) {
- $pages['MediaWiki:Handheld.css'] = array(
- 'type' => 'style',
+ $pages['MediaWiki:Handheld.css'] = array(
+ 'type' => 'style',
'media' => 'handheld' );
}
return $pages;
/**
* Gets group name
- *
+ *
* @return String: Name of group
*/
public function getGroup() {
$out = '';
$registrations = array();
$resourceLoader = $context->getResourceLoader();
+ $target = $context->getRequest()->getVal( 'target', 'desktop' );
// Register sources
$out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
// Register modules
foreach ( $resourceLoader->getModuleNames() as $name ) {
$module = $resourceLoader->getModule( $name );
+ $moduleTargets = $module->getTargets();
+ if ( !in_array( $target, $moduleTargets ) ) {
+ continue;
+ }
$deps = $module->getDependencies();
$group = $module->getGroup();
$source = $module->getSource();
$version = wfTimestamp( TS_ISO_8601_BASIC,
$module->getModifiedTime( $context ) );
$out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
+ continue;
}
+
// Automatically register module
+ // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
+ // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
+ $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
+ $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
+ // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
+ // mw.loader.register()
+ if ( !count( $deps ) && $group === null && $source === 'local' ) {
+ $registrations[] = array( $name, $mtime );
+ }
+ // Modules with dependencies but no group or foreign source pass three arguments
+ // (name, timestamp, dependencies) to mw.loader.register()
+ elseif ( $group === null && $source === 'local' ) {
+ $registrations[] = array( $name, $mtime, $deps );
+ }
+ // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
+ // to mw.loader.register()
+ elseif ( $source === 'local' ) {
+ $registrations[] = array( $name, $mtime, $deps, $group );
+ }
+ // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+ // to mw.loader.register()
else {
- // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
- // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
- $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
- $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
- // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
- // mw.loader.register()
- if ( !count( $deps ) && $group === null && $source === 'local' ) {
- $registrations[] = array( $name, $mtime );
- }
- // Modules with dependencies but no group or foreign source pass three arguments
- // (name, timestamp, dependencies) to mw.loader.register()
- elseif ( $group === null && $source === 'local' ) {
- $registrations[] = array( $name, $mtime, $deps );
- }
- // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
- // to mw.loader.register()
- elseif ( $source === 'local' ) {
- $registrations[] = array( $name, $mtime, $deps, $group );
- }
- // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
- // to mw.loader.register()
- else {
- $registrations[] = array( $name, $mtime, $deps, $group, $source );
- }
+ $registrations[] = array( $name, $mtime, $deps, $group, $source );
}
}
$out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
global $wgUser;
return $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $wgUser->getTouched() );
}
-
+
/**
* @param $context ResourceLoaderContext
* @return array
$searchon = $this->db->strencode(join(',', $q));
$field = $this->getIndexField($fulltext);
-
+
// requires Net Search Extender or equivalent
//return " CONTAINS($field, '$searchon') > 0 ";
-
+
return " lcase($field) LIKE lcase('%$searchon%')";
}
* Return a partial WHERE clause to limit the search to the given namespaces
*
* @return String
- * @private
+ * @private
*/
function queryNamespaces() {
$namespaces = implode( ',', $this->namespaces );
$match = $this->parseQuery( $filteredTerm, $fulltext );
$page = $this->db->tableName( 'page' );
$searchindex = $this->db->tableName( 'searchindex' );
-
+
return 'SELECT page_id, page_namespace, page_title, ftindex.[RANK]' .
"FROM $page,FREETEXTTABLE($searchindex , $match, LANGUAGE 'English') as ftindex " .
'WHERE page_id=ftindex.[KEY] ';
*/
function update( $id, $title, $text ) {
// We store the column data as UTF-8 byte order marked binary stream
- // because we are invoking the plain text IFilter on it so that, and we want it
+ // because we are invoking the plain text IFilter on it so that, and we want it
// to properly decode the stream as UTF-8. SQL doesn't support UTF8 as a data type
// but the indexer will correctly handle it by this method. Since all we are doing
// is passing this data to the indexer and never retrieving it via PHP, this will save space
* @ingroup Search
*/
class SearchOracle extends SearchEngine {
-
- private $reservedWords = array ('ABOUT' => 1,
- 'ACCUM' => 1,
- 'AND' => 1,
- 'BT' => 1,
- 'BTG' => 1,
- 'BTI' => 1,
+
+ private $reservedWords = array ('ABOUT' => 1,
+ 'ACCUM' => 1,
+ 'AND' => 1,
+ 'BT' => 1,
+ 'BTG' => 1,
+ 'BTI' => 1,
'BTP' => 1,
- 'FUZZY' => 1,
- 'HASPATH' => 1,
- 'INPATH' => 1,
- 'MINUS' => 1,
- 'NEAR' => 1,
+ 'FUZZY' => 1,
+ 'HASPATH' => 1,
+ 'INPATH' => 1,
+ 'MINUS' => 1,
+ 'NEAR' => 1,
'NOT' => 1,
- 'NT' => 1,
- 'NTG' => 1,
- 'NTI' => 1,
- 'NTP' => 1,
- 'OR' => 1,
- 'PT' => 1,
- 'RT' => 1,
+ 'NT' => 1,
+ 'NTG' => 1,
+ 'NTI' => 1,
+ 'NTP' => 1,
+ 'OR' => 1,
+ 'PT' => 1,
+ 'RT' => 1,
'SQE' => 1,
- 'SYN' => 1,
- 'TR' => 1,
- 'TRSYN' => 1,
- 'TT' => 1,
+ 'SYN' => 1,
+ 'TR' => 1,
+ 'TRSYN' => 1,
+ 'TT' => 1,
'WITHIN' => 1);
/**
), 'SearchOracle::update' );
// Sync the index
- // We need to specify the DB name (i.e. user/schema) here so that
+ // We need to specify the DB name (i.e. user/schema) here so that
// it can work from the installer, where
// ALTER SESSION SET CURRENT_SCHEMA = ...
// was used.
- $dbw->query( "CALL ctx_ddl.sync_index(" .
+ $dbw->query( "CALL ctx_ddl.sync_index(" .
$dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_text_idx', 'raw' ) ) . ")" );
- $dbw->query( "CALL ctx_ddl.sync_index(" .
+ $dbw->query( "CALL ctx_ddl.sync_index(" .
$dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_title_idx', 'raw' ) ) . ")" );
}
$page = static::extractPageRecord( $data, $pageName );
if ( isset( $page['missing'] ) ) {
- wfDebugLog( "MediaWikiSite", "call to <$url> returned a missing page title! " . $ret );
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! " . $ret );
+ return false;
+ }
+
+ if ( isset( $page['invalid'] ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! " . $ret );
return false;
}
* @return ResultWrapper
*/
function listRevisions() {
- global $wgContentHandlerNoDB;
+ global $wgContentHandlerUseDB;
$dbr = wfGetDB( DB_SLAVE );
'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
);
- if ( !$wgContentHandlerNoDB ) {
+ if ( $wgContentHandlerUseDB ) {
$fields[] = 'ar_content_format';
$fields[] = 'ar_content_model';
}
* @return Revision
*/
function getRevision( $timestamp ) {
- global $wgContentHandlerNoDB;
+ global $wgContentHandlerUseDB;
$dbr = wfGetDB( DB_SLAVE );
'ar_sha1',
);
- if ( !$wgContentHandlerNoDB ) {
+ if ( $wgContentHandlerUseDB ) {
$fields[] = 'ar_content_format';
$fields[] = 'ar_content_model';
}
* @return Status, containing the number of revisions restored on success
*/
private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
- global $wgContentHandlerNoDB;
+ global $wgContentHandlerUseDB;
if ( wfReadOnly() ) {
throw new ReadOnlyError();
'ar_len',
'ar_sha1');
- if ( !$wgContentHandlerNoDB ) {
+ if ( $wgContentHandlerUseDB ) {
$fields[] = 'ar_content_format';
$fields[] = 'ar_content_model';
}
* @return Array: descriptor array
*/
protected function getSourceSection() {
+ global $wgCopyUploadsFromSpecialUpload;
+
if ( $this->mSessionKey ) {
return array(
'SessionKey' => array(
);
}
- $canUploadByUrl = UploadFromUrl::isEnabled() && UploadFromUrl::isAllowed( $this->getUser() );
+ $canUploadByUrl = UploadFromUrl::isEnabled()
+ && UploadFromUrl::isAllowed( $this->getUser() )
+ && $wgCopyUploadsFromSpecialUpload;
$radio = $canUploadByUrl;
$selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
'helptext' => $helptext,
);
}
-
+
function execute() {
if( $this->data['message'] ) {
?>
if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
foreach ( $this->data['extraInput'] as $inputItem ) { ?>
<tr>
- <?php
+ <?php
if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
- ?><td class="mw-label"><label for="<?php
+ ?><td class="mw-label"><label for="<?php
echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
$this->msgWiki( $inputItem['msg'] ) ?></label><?php
} else {
<input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
echo htmlspecialchars( $inputItem['name'] ); ?>"
tabindex="<?php echo $tabIndex++; ?>"
- value="<?php
+ value="<?php
if ( $inputItem['type'] != 'checkbox' ) {
echo htmlspecialchars( $inputItem['value'] );
} else {
echo '1';
- }
+ }
?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
- <?php
+ <?php
if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
- echo 'checked="checked"';
- ?> /> <?php
+ echo 'checked="checked"';
+ ?> /> <?php
if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
?>
<label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
<?php } ?>
</td>
</tr>
-<?php
-
+<?php
}
}
?>
'qbbrowse' => 'Snuffel',
'qbedit' => 'Wysig',
'qbpageoptions' => 'Bladsyopsies',
-'qbpageinfo' => 'Bladsyinligting',
'qbmyoptions' => 'My bladsye',
'qbspecialpages' => 'Spesiale bladsye',
'faq' => 'Gewilde vrae',
'qbbrowse' => 'ቃኝ',
'qbedit' => 'አርም',
'qbpageoptions' => 'ይህ ገጽ',
-'qbpageinfo' => 'አግባብ',
'qbmyoptions' => 'የኔ ገጾች',
'qbspecialpages' => 'ልዩ ገጾች',
'faq' => 'ብጊየጥ (ብዙ ጊዜ የሚጠየቁ ጥያቀዎች)',
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Ista pachina',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Pachinas propias',
'qbspecialpages' => 'Pachinas especials',
'faq' => 'Preguntas freqüents (FAQ)',
* @author Riadismet
* @author Samer
* @author Sami Lab
+ * @author TTMTT
* @author Tarawneh
* @author TheEgyptian
* @author Uwe a
'qbbrowse' => 'تصفح',
'qbedit' => 'تعديل',
'qbpageoptions' => 'هذه الصفحة',
-'qbpageinfo' => 'سياق النص',
'qbmyoptions' => 'صفحاتي',
'qbspecialpages' => 'الصفحات الخاصة',
'faq' => 'الأسئلة المتكررة',
'vector-action-protect' => 'احم',
'vector-action-undelete' => 'استرجع الحذف',
'vector-action-unprotect' => 'غير الحماية',
-'vector-simplesearch-preference' => 'مكّن مقترحات البحث المُحسّنة (لواجهة فكتور فقط)',
+'vector-simplesearch-preference' => 'مكّن شريط البحث المبسط (لواجهة فكتور فقط)',
'vector-view-create' => 'أنشئ',
'vector-view-edit' => 'تعديل',
'vector-view-history' => 'اعرض التاريخ',
'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
هي موجودة بالفعل.',
'defaultmessagetext' => 'نص الرسالة الافتراضي',
+'content-failed-to-parse' => 'فشل في تحليل $2 محتوى لـ $1 نموذج: $3',
+'invalid-content-data' => 'بيانات المحتوى غير صالحة',
+'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.
'shared-repo' => 'مستودع مشترك',
'shared-repo-name-wikimediacommons' => 'ويكيميديا كومنز',
'filepage.css' => '/* CSS المعروض هنا سيضمن في صفحات وصف الملفات، أيضا على الويكيات الأجنبية */',
-'upload-disallowed-here' => 'لأسف لا يمكنك تعديل هذه الصورة.',
+'upload-disallowed-here' => 'للأسف لا يمكنك تعديل هذه الصورة.',
# File reversion
'filerevert' => 'استرجع $1',
'immobile-target-namespace-iw' => 'وصلة الإنترويكي ليست هدفاً صالحاً لنقل صفحة.',
'immobile-source-page' => 'هذه الصفحة غير قابلة للنقل.',
'immobile-target-page' => 'غير قادر على النقل إلى العنوان الوجهة هذا.',
+'bad-target-model' => 'الوجهة المطلوبة تستخدم نموذج محتوى مختلف. لا يمكن تحويل من $1 إلى $2.',
'imagenocrossnamespace' => 'لا يمكن نقل الملف إلى نطاق غير نطاق الملفات',
'nonfile-cannot-move-to-file' => 'لا يمكن نقل غير الملفات إلى نطاق الملفات',
'imagetypemismatch' => 'امتداد الملف الجديد لا يطابق نوعه',
'spam_deleting' => 'جميع النسخ تحوي رابطا إلى $1، يتم الحذف',
# Info page
-'pageinfo-title' => 'المعلومات ل"$1"',
+'pageinfo-title' => 'المعلومات عن «$1»',
+'pageinfo-not-current' => 'لا يمكن إظهار المعلومات إلا عن المراجعة الأخيرة للصفحة',
'pageinfo-header-basic' => 'المعلومات الأساسية',
'pageinfo-header-edits' => 'التعديلات',
'pageinfo-header-restrictions' => 'حماية الصفحة',
'pageinfo-robot-noindex' => 'غير قابلة للفهرسة',
'pageinfo-views' => 'عدد المشاهدات',
'pageinfo-watchers' => 'عدد المراقبين',
-'pageinfo-redirects-name' => 'التوجيهات نحو هذه الصفحة',
+'pageinfo-redirects-name' => 'التحويلات إلى هذه الصفحة',
'pageinfo-subpages-name' => 'الصفحات الفرعية لهذه الصفحة',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|إعادة تÙ\88جÙ\8aÙ\87|إعادة تÙ\88جÙ\8aÙ\87ات}}; $3 {{PLURAL:$3|غÙ\8aر إعادة تÙ\88جÙ\8aÙ\87|غÙ\8aر إعادة اÙ\84توجيهات}})',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|إعادة تÙ\88جÙ\8aÙ\87|إعادة تÙ\88جÙ\8aÙ\87ات}}; $3 {{PLURAL:$3|غÙ\8aر إعادة تÙ\88جÙ\87|غÙ\8aر إعادة توجيهات}})',
'pageinfo-firstuser' => 'منشئ الصفحة',
'pageinfo-firsttime' => 'تاريخ إنشاء الصفحة',
'pageinfo-lastuser' => 'آخر محرر',
'pageinfo-lasttime' => 'تاريخ آخر تعديل',
'pageinfo-edits' => 'عدد التعديلات',
'pageinfo-authors' => 'عدد المؤلفين المختلفين',
-'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال $1 يوم/أيام)',
+'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يوماً|$1 يوم}})',
'pageinfo-recent-authors' => 'عدد المؤلفين المختلفين الأخيرين',
-'pageinfo-magic-words' => 'السحرية {{PLURAL:$1|الكلمة|الكلمات}} ($1)',
-'pageinfo-hidden-categories' => 'مخفية {{PLURAL:$1|فئة|فئات}} ($1)',
-'pageinfo-templates' => 'متضمنة {{PLURAL:$1|قالب|قوالب}} ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|لا كلمات سحرية|الكلمة|الكلمات}} السحرية ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|التصنيف المخفي|التصنيفان المخفيان|التصانيف المخفية ($1)}}',
+'pageinfo-templates' => '{{PLURAL:$1|لا قوالب مضمنة|القالب المضمنن|القالبان المضمنان|القوالب المضمنة ($1)}}',
+'pageinfo-toolboxlink' => 'معلومات عن هذه الصفحة',
+'pageinfo-redirectsto' => 'تحويلة إلى',
+'pageinfo-redirectsto-info' => 'معلومات',
+'pageinfo-contentpage' => 'محسوبة كصفحة محتوى',
+'pageinfo-contentpage-yes' => 'نعم',
+'pageinfo-protect-cascading' => 'مصدر توريث الحماية للصفحات المدمجة',
+'pageinfo-protect-cascading-yes' => 'نعم',
+'pageinfo-protect-cascading-from' => 'حماية الصفحات المدمجة موروثة من',
# Skin names
'skinname-standard' => 'كلاسيك',
# Scary transclusion
'scarytranscludedisabled' => '[التضمين بالإنترويكي معطل]',
'scarytranscludefailed' => '[البحث عن القالب فشل ل$1]',
+'scarytranscludefailed-httpstatus' => '[فشل جلب القالب لـ $1: HTTP $2]',
'scarytranscludetoolong' => '[المسار طويل للغاية]',
# Delete conflict
'qbbrowse' => 'تصفح',
'qbedit' => 'عدل',
'qbpageoptions' => ' الصفحه دى',
-'qbpageinfo' => 'السياق',
'qbmyoptions' => 'صفحاتى',
'qbspecialpages' => 'الصفحات الخاصة',
'faq' => 'اسئله بتتسئل كتير',
'qbbrowse' => 'ব্ৰাওজ',
'qbedit' => 'সম্পাদনা',
'qbpageoptions' => 'এই পৃষ্ঠা',
-'qbpageinfo' => 'প্ৰসংগ',
'qbmyoptions' => 'মোৰ পৃষ্ঠাসমূহ',
'qbspecialpages' => 'বিশেষ পৃষ্ঠাসমূহ',
'faq' => 'সততে উদিত প্ৰশ্নসমূহ (FAQ)',
'qbbrowse' => 'Restolar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contestu',
'qbmyoptions' => 'Les mios páxines',
'qbspecialpages' => 'Páxines especiales',
'faq' => 'EMF (entrugues más frecuentes)',
'qbbrowse' => 'Farura',
'qbedit' => 'Betara',
'qbpageoptions' => 'Ikatcuksbu',
-'qbpageinfo' => 'Givabu',
'qbmyoptions' => 'Jinaf ikatcukseem',
'qbspecialpages' => 'Aptaf bueem',
'faq' => 'NEB',
'qbbrowse' => 'Gözdən keçir',
'qbedit' => 'Redaktə',
'qbpageoptions' => 'Bu səhifə',
-'qbpageinfo' => 'Məzmun',
'qbmyoptions' => 'Mənim səhifələrim',
'qbspecialpages' => 'Xüsusi səhifələr',
'faq' => 'TSS',
'qbbrowse' => 'Байҡарға',
'qbedit' => 'Үҙгәртергә',
'qbpageoptions' => 'Был бит',
-'qbpageinfo' => 'Бит тураһында мәғлүмәттәр',
'qbmyoptions' => 'Биттәрем',
'qbspecialpages' => 'Махсус биттәр',
'faq' => 'ЙБҺ',
'currentrev' => 'Ағымдағы версия',
'currentrev-asof' => '$1, ағымдағы версия',
'revisionasof' => '$1 версияһы',
-'revision-info' => 'Версия: $1; $2',
+'revision-info' => '<div id="viewingold-warning" style="background: #FFBDBD; border: 1px solid #BB7979; color: #000000; margin: 1em 0 .5em; padding: .5em 1em; vertical-align: middle; font-weight: bold; font-family: Palatino Linotype, Microsoft Sans Serif, Arial Unicode MS, Droid Sans; clear: both;">Хәҙер һеҙ был биттең иҫке, <span id="mw-revision-name">$2</span> тарафынан <span id="mw-revision-date">$1</span> һаҡланған версияһын ҡарайһығыҙ. Уның <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}}} ағымдағы версиянан] айырмаһы булыуы мөмкин</span>.</div>',
'previousrevision' => '← Алдағы',
'nextrevision' => 'Киләһе →',
'currentrevisionlink' => 'Ағымдағы версия',
'qbbrowse' => 'بروز',
'qbedit' => 'اصلاح',
'qbpageoptions' => 'صفحه',
-'qbpageinfo' => 'متن',
'qbmyoptions' => 'منی صفحات',
'qbspecialpages' => 'حاصین صفحات',
'faq' => 'ب.ج.س',
'qbbrowse' => 'Halungkáta',
'qbedit' => 'Liwata',
'qbpageoptions' => 'Ining pahina',
-'qbpageinfo' => 'Konteksto',
'qbmyoptions' => 'Sakong mga pahina',
'qbspecialpages' => 'Espesyal na mga pahina',
'faq' => 'PPK (Pirmihang Pighahapot na mga kahaputan)',
'qbbrowse' => 'Выбраць',
'qbedit' => 'Правіць',
'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Кантэкст',
'qbmyoptions' => 'Свае старонкі',
'qbspecialpages' => 'Адмысловыя старонкі',
'faq' => 'ЧАПЫ',
'qbbrowse' => 'Праглядзець',
'qbedit' => 'Рэдагаваць',
'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Інфармацыя пра старонку',
'qbmyoptions' => 'Мае старонкі',
'qbspecialpages' => 'Спэцыяльныя старонкі',
'faq' => 'Частыя пытаньні',
'edit-already-exists' => 'Немагчыма стварыць новую старонку.
Яна ўжо існуе.',
'defaultmessagetext' => 'Перадвызначаны тэкст паведамленьня',
+'content-failed-to-parse' => 'Зьмест «$2» не адпавядае тыпу $1: $3.',
+'invalid-content-data' => 'Няслушныя зьвесткі',
+'content-not-allowed-here' => 'Зьмест тыпу «$1» на старонцы [[$2]] не дазволены',
+
+# Content models
+'content-model-wikitext' => 'вікі-тэкст',
+'content-model-text' => 'просты тэкст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.
'shared-repo-from' => '$1',
'shared-repo' => 'агульнага сховішча',
'shared-repo-name-wikimediacommons' => 'Вікісховішча',
-'upload-disallowed-here' => 'Ð\9dа жалÑ\8c Ð\92Ñ\8b нÑ\8f можаÑ\86е пеÑ\80азапÑ\96Ñ\81аÑ\86Ñ\8c гÑ\8dÑ\82Ñ\83Ñ\8e вÑ\8bÑ\8fвÑ\83.',
+'upload-disallowed-here' => 'Ð\92Ñ\8b нÑ\8f можаÑ\86е пеÑ\80азапÑ\96Ñ\81аÑ\86Ñ\8c гÑ\8dÑ\82Ñ\8b Ñ\84айл.',
# File reversion
'filerevert' => 'Вярнуць $1',
'emailpagetext' => 'Вы можаце выкарыстоўваць форму ніжэй, каб даслаць гэтаму ўдзельніку ліст па электроннай пошце.
Адрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і ўдзельнік зможа даслаць на гэты адрас адказ.',
'usermailererror' => 'Пры адсыланьні пошты адбылася памылка:',
-'defemailsubject' => 'ÐлекÑ\82Ñ\80оннаÑ\8f поÑ\88Ñ\82а {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»',
+'defemailsubject' => 'Ð\9bÑ\96Ñ\81Ñ\82 з {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»',
'usermaildisabled' => 'Электронная пошта ўдзельніка адключаная',
'usermaildisabledtext' => 'Вы ня можаце дасылаць электронныя лісты іншым удзельнікам {{GRAMMAR:родны|{{SITENAME}}}}',
'noemailtitle' => 'Адрас электроннай пошты адсутнічае',
'watchnochange' => 'Нічога з Вашага сьпісу назіраньня не зьмянілася за паказаны пэрыяд.',
'watchlist-details' => 'У Вашым сьпісе назіраньня $1 {{PLURAL:$1|старонка|старонкі|старонак}} за выключэньнем старонак абмеркаваньня.',
'wlheader-enotif' => '* Дасылка паведамленьняў па электроннай пошце ўключаная.',
-'wlheader-showupdated' => "* СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f бÑ\8bлÑ\96 зÑ\8cмененÑ\8bÑ\8f паÑ\81Ñ\8cлÑ\8f Ð\92аÑ\88ага апоÑ\88нÑ\8fга вÑ\96зÑ\8bÑ\82Ñ\83, вÑ\8bлÑ\83Ñ\87анÑ\8bÑ\8f '''Ñ\82лÑ\83стым''' шрыфтам",
+'wlheader-showupdated' => "* СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f бÑ\8bлÑ\96 зÑ\8cмененÑ\8bÑ\8f паÑ\81Ñ\8cлÑ\8f Ð\92аÑ\88ага апоÑ\88нÑ\8fга вÑ\96зÑ\8bÑ\82Ñ\83, вÑ\8bлÑ\83Ñ\87анÑ\8bÑ\8f '''Ñ\82оÑ\9eстым''' шрыфтам",
'watchmethod-recent' => 'прагляд апошніх зьменаў у старонках са сьпісу назіраньня',
'watchmethod-list' => 'прагляд старонак са сьпісу назіраньня дзеля апошніх зьменах',
'watchlistcontains' => 'Ваш сьпіс назіраньня зьмяшчае $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
'actioncomplete' => 'Дзеяньне выкананае',
'actionfailed' => 'Дзеяньне ня выкананае',
'deletedtext' => '«$1» была выдаленая.
-Ð\93лÑ\8fдзÑ\96Ñ\86е жÑ\83Ñ\80нал вÑ\8bдаленÑ\8cнÑ\8fÑ\9e Ñ\83 $2.',
+Ð\97апÑ\96Ñ\81Ñ\8b пÑ\80а вÑ\8bдаленÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 зÑ\8cмÑ\8fÑ\88Ñ\87аÑ\8eÑ\86Ñ\86а Ñ\9e $2.',
'dellogpage' => 'Журнал выдаленьняў',
'dellogpagetext' => 'Сьпіс апошніх выдаленьняў.',
'deletionlog' => 'журнал выдаленьняў',
'undeletedrevisions' => '{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}',
'undeletedrevisions-files' => 'адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}',
'undeletedfiles' => '{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}',
-'cannotundelete' => 'Аднаўленьне не адбылося; нехта іншы мог пасьпець аднавіць старонку раней.',
+'cannotundelete' => 'Памылка аднаўленьня:
+$1',
'undeletedpage' => "'''Старонка $1 была адноўленая'''
Глядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.",
'immobile-target-namespace-iw' => 'Інтэрвікі-спасылка — няслушная назва для пераносу старонкі.',
'immobile-source-page' => 'Гэтую старонку нельга пераносіць.',
'immobile-target-page' => 'Немагчыма перанесьці старонку пад гэтую назву.',
+'bad-target-model' => 'Выніковая старонка выкарыстоўвае іншы тып зьместу. Немагчыма пераўтварыць $1 у $2.',
'imagenocrossnamespace' => 'Нельга перанесьці файл у ня-файлавую прастору назваў',
'nonfile-cannot-move-to-file' => 'Нельга перанесьці ня файл у прастору назваў файлаў',
'imagetypemismatch' => 'Новае пашырэньне файла не адпавядае яго тыпу',
# Info page
'pageinfo-title' => 'Інфармацыя пра «$1»',
+'pageinfo-not-current' => 'Інфармацыя паказываецца толькі для бягучай вэрсіі.',
'pageinfo-header-basic' => 'Асноўныя зьвесткі',
'pageinfo-header-edits' => 'Рэдагаваньні',
'pageinfo-header-restrictions' => 'Абарона старонкі',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Схаваная катэгорыя|Схаваныя катэгорыі}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Шаблён|Шаблёны}} ($1)',
'pageinfo-toolboxlink' => 'Зьвесткі пра старонку',
+'pageinfo-redirectsto' => 'Перанакіроўвае на',
+'pageinfo-redirectsto-info' => 'інфармацыя',
+'pageinfo-contentpage' => 'Лічыцца артыкулам',
+'pageinfo-contentpage-yes' => 'Так',
+'pageinfo-protect-cascading' => 'Адсюль пачынаецца каскадная абарона',
+'pageinfo-protect-cascading-yes' => 'Так',
+'pageinfo-protect-cascading-from' => 'Каскадная абароная пачынаецца з',
# Skin names
'skinname-standard' => 'Клясычнае',
'version-entrypoints' => 'Уваходныя адрасы',
'version-entrypoints-header-entrypoint' => 'Пункт уваходу',
'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях да артыкула]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Пуць да скрыпту]',
# Special:FilePath
'filepath' => 'Шлях да файла',
'qbbrowse' => 'Избор',
'qbedit' => 'Редактиране',
'qbpageoptions' => 'Тази страница',
-'qbpageinfo' => 'Информация за страницата',
'qbmyoptions' => 'Моите страници',
'qbspecialpages' => 'Специални страници',
'faq' => 'ЧЗВ',
'qbbrowse' => 'Tangadahi',
'qbedit' => 'Babak',
'qbpageoptions' => 'Tungkaran ini',
-'qbpageinfo' => 'Naskah aluran',
'qbmyoptions' => 'Tungkaran ulun',
'qbspecialpages' => 'Tungkaran istimiwa',
'faq' => 'FAQ',
'qbbrowse' => 'ব্রাউজ',
'qbedit' => 'সম্পাদনা',
'qbpageoptions' => 'এ পাতার বিকল্পসমূহ',
-'qbpageinfo' => 'পাতা-সংক্রান্ত তথ্য',
'qbmyoptions' => 'আমার পছন্দ',
'qbspecialpages' => 'বিশেষ পাতাসমূহ',
'faq' => 'সম্ভাব্য প্রশ্নসমূহ',
'vector-action-protect' => 'সুরক্ষা',
'vector-action-undelete' => 'পুনরুদ্ধার',
'vector-action-unprotect' => 'সুরক্ষা পরিবর্তন',
-'vector-simplesearch-preference' => 'à¦\86রà¦\93 সমà§\83দà§\8dধ à¦\85নà§\81সনà§\8dধান পরামরà§\8dশ সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
+'vector-simplesearch-preference' => 'সরল à¦\85নà§\81সনà§\8dধান সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
'vector-view-create' => 'তৈরি করুন',
'vector-view-edit' => 'সম্পাদনা',
'vector-view-history' => 'ইতিহাস',
'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
পাতাটি ইতিমধ্যেই বিদ্যমান।',
'defaultmessagetext' => 'আদি টেক্সট',
+'content-failed-to-parse' => '$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3',
+'invalid-content-data' => 'ভুল কন্টেন্ট ডাটা',
+'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
+
+# Content models
+'content-model-wikitext' => 'উইকিটেক্সট',
+'content-model-text' => 'সাধারণ লেখা',
+'content-model-javascript' => 'জাভাস্ক্রিপ্ট',
+'content-model-css' => 'সিএসএস',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
'uploadnewversion-linktext' => 'এই ফাইলটির একটি নতুন সংস্করণ আপলোড করুন',
'shared-repo-from' => '$1 থেকে',
'shared-repo' => 'শেয়ার্ড রিপোজিটরী',
-'upload-disallowed-here' => 'দà§\81à¦\83à¦\96িত à¦\86পনি à¦\8fà¦\87 à¦\9bবিটি প্রতিস্থাপন করতে পারবেন না।',
+'upload-disallowed-here' => 'à¦\86পনি à¦\8fà¦\87 ফাà¦\87লটি প্রতিস্থাপন করতে পারবেন না।',
# File reversion
'filerevert' => '$1 পূর্বাবস্থায় ফেরত নিন',
'qbbrowse' => 'Furchal',
'qbedit' => 'Kemmañ',
'qbpageoptions' => 'Pajenn an dibaboù',
-'qbpageinfo' => 'Pajenn gelaouiñ',
'qbmyoptions' => 'Ma dibaboù',
'qbspecialpages' => 'Pajennoù dibar',
'faq' => 'FAG',
'qbbrowse' => 'Prelistajte',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
'qbmyoptions' => 'Moje opcije',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'ČPP',
'qbbrowse' => 'Navega',
'qbedit' => 'Modifica',
'qbpageoptions' => 'Opcions de pàgina',
-'qbpageinfo' => 'Informació de pàgina',
'qbmyoptions' => 'Pàgines pròpies',
'qbspecialpages' => 'Pàgines especials',
'faq' => 'PMF',
'timezoneregion-indian' => 'Oceà Índic',
'timezoneregion-pacific' => 'Oceà Pacífic',
'allowemail' => 'Permet que altres usuaris puguin enviar-me correus electrònics',
-'prefs-searchoptions' => 'Preferències de la cerca',
+'prefs-searchoptions' => 'Cerca',
'prefs-namespaces' => 'Espais de noms',
'defaultns' => 'Cerca per defecte en els següents espais de noms:',
'default' => 'per defecte',
'qbbrowse' => 'بگهڕێ',
'qbedit' => 'دەستکاری',
'qbpageoptions' => 'ئەم پەڕەیە',
-'qbpageinfo' => 'زانیاریی پهڕه',
'qbmyoptions' => 'پەڕەکانم',
'qbspecialpages' => 'پەڕە تایبەتەکان',
'faq' => 'پرسیار و وەڵام (FAQ)',
'qbbrowse' => 'Listování',
'qbedit' => 'Editování',
'qbpageoptions' => 'Tato stránka',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Moje volby',
'qbspecialpages' => 'Speciální stránky',
'faq' => 'Často kladené otázky',
'shared-repo-from' => 'z {{grammar:2sg|$1}}',
'shared-repo' => 'sdíleného úložiště',
'filepage.css' => '/* Zde uvedené CSS se vkládá na stránky s popisem souboru, včetně cizích klientských wiki */',
-'upload-disallowed-here' => 'Tento soubor bohužel nemůžete přepsat.',
+'upload-disallowed-here' => 'Tento soubor nemůžete přepsat.',
# File reversion
'filerevert' => 'Vrátit zpět $1',
# Info page
'pageinfo-title' => 'Informace o stránce „$1“',
+'pageinfo-not-current' => 'Informace lze zobrazit jen pro aktuální verzi.',
'pageinfo-header-basic' => 'Základní údaje',
'pageinfo-header-edits' => 'Historie editací',
'pageinfo-header-restrictions' => 'Zámek stránky',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrytá|Skryté}} kategorie ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Použitá šablona|Použité šablony}} ($1)',
'pageinfo-toolboxlink' => 'Informace o stránce',
+'pageinfo-redirectsto' => 'Přesměrovává na',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Stránka se počítá do obsahu',
+'pageinfo-contentpage-yes' => 'Ano',
+'pageinfo-protect-cascading' => 'Kaskádový zámek',
+'pageinfo-protect-cascading-yes' => 'Ano',
+'pageinfo-protect-cascading-from' => 'Zámky pocházejí z kaskádových zámků na',
# Skin names
'skinname-standard' => 'Klasický',
'qbbrowse' => 'Pori',
'qbedit' => 'Golygu',
'qbpageoptions' => 'Y dudalen hon',
-'qbpageinfo' => 'Cyd-destun',
'qbmyoptions' => 'Fy nhudalennau',
'qbspecialpages' => 'Tudalennau arbennig',
'faq' => 'Cwestiynau cyffredin',
'qbbrowse' => 'Gennemse',
'qbedit' => 'Redigér',
'qbpageoptions' => 'Indstillinger for side',
-'qbpageinfo' => 'Information om side',
'qbmyoptions' => 'Mine indstillinger',
'qbspecialpages' => 'Specielle sider',
'faq' => 'OSS',
'edit-no-change' => 'Din ændring ignoreredes, fordi der ikke var ændring af teksten.',
'edit-already-exists' => 'En ny side kunne ikke oprettes, fordi den allerede findes.',
'defaultmessagetext' => 'Standardtekst',
-'content-failed-to-parse' => 'Kunne ikke parse $2 indhold for $1 model: $3',
+'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
'invalid-content-data' => 'Ugyldig indholdsdata',
'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
'uploadnewversion-linktext' => 'Læg en ny version af denne fil op',
'shared-repo-from' => 'fra $1',
'shared-repo' => 'et delt filarkiv',
-'upload-disallowed-here' => 'Desværre kan du ikke overskrive dette billede.',
+'upload-disallowed-here' => 'Du kan ikke overskrive denne fil.',
# File reversion
'filerevert' => 'Gendan $1',
'tooltip-t-contributions' => 'Se denne brugers bidrag',
'tooltip-t-emailuser' => 'Send en e-mail til denne bruger',
'tooltip-t-upload' => 'Upload et billede eller anden mediafil',
-'tooltip-t-specialpages' => 'Liste med alle specielle sider',
+'tooltip-t-specialpages' => 'Liste over alle specialsider',
'tooltip-t-print' => 'Printervenlig udgave af denne side',
'tooltip-t-permalink' => 'Permanent henvisning til denne version af denne side',
'tooltip-ca-nstab-main' => 'Se indholdet',
# Info page
'pageinfo-title' => 'Information om "$1"',
+'pageinfo-not-current' => 'Oplysninger vises kun for den aktuelle version.',
'pageinfo-header-basic' => 'Grundlæggende oplysninger',
'pageinfo-header-edits' => 'Redigeringshistorik',
'pageinfo-header-restrictions' => 'Sidebeskyttelse',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Transkluderet skabelon|Transkluderede skabeloner}} ($1)',
'pageinfo-toolboxlink' => 'Oplysninger om siden',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som en indholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Kaskadebeskyttelser begynder her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Kaskadebeskyttelser begynder fra',
# Skin names
'skinname-standard' => 'Klassik',
'qbbrowse' => 'Durchsuchen',
'qbedit' => 'Bearbeiten',
'qbpageoptions' => 'Seitenoptionen',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Meine Seiten',
'qbspecialpages' => 'Spezialseiten',
'faq' => 'Häufig gestellte Fragen',
'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
-'sqlhidden' => "''Die SQL-Datenbankabfrage ist verborgen.''",
+'sqlhidden' => '(Die SQL-Datenbankabfrage ist verborgen.)',
'cascadeprotected' => 'Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:
$2',
'namespaceprotected' => "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
'shared-repo-from' => 'aus $1',
'shared-repo' => 'einem gemeinsam genutzten Medienarchiv',
'filepage.css' => '/* Das folgende CSS wird auf Dateibeschreibungsseiten, auch auf fremden Client-Wikis, geladen. */',
-'upload-disallowed-here' => 'Leider kannst du dieses Bild nicht überschreiben.',
+'upload-disallowed-here' => 'Du kannst diese Datei nicht überschreiben.',
# File reversion
'filerevert' => 'Zurücksetzen von „$1“',
'movepagebtn' => 'Seite verschieben',
'pagemovedsub' => 'Verschiebung erfolgreich',
'movepage-moved' => "'''Die Seite „$1“ wurde nach „$2“ verschoben.'''",
-'movepage-moved-redirect' => 'Es wurde eine Weiterleitung erstellt.',
+'movepage-moved-redirect' => 'Eine Weiterleitung wurde erstellt.',
'movepage-moved-noredirect' => 'Die Erstellung einer Weiterleitung wurde unterdrückt.',
'articleexists' => 'Unter diesem Namen existiert bereits eine Seite. Bitte wähle einen anderen Namen.',
'cantmove-titleprotected' => 'Die Verschiebung kann nicht durchgeführt werden, da der Zieltitel zur Erstellung gesperrt ist.',
# Info page
'pageinfo-title' => 'Informationen zu „$1“',
-'pageinfo-not-current' => 'Die Information könnte nur für die aktuelle Version angezeigt werden.',
+'pageinfo-not-current' => 'Diese Informationen können nur für die aktuelle Version angezeigt werden.',
'pageinfo-header-basic' => 'Basisinformationen',
'pageinfo-header-edits' => 'Bearbeitungsgeschichte',
'pageinfo-header-restrictions' => 'Seitenschutz',
'pageinfo-hidden-categories' => 'Versteckte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
'pageinfo-templates' => 'Eingebundene {{PLURAL:$1|Vorlage|Vorlagen}} ($1)',
'pageinfo-toolboxlink' => 'Informationen zur Seite',
+'pageinfo-redirectsto' => 'Weiterleitungen nach',
+'pageinfo-redirectsto-info' => 'Information',
+'pageinfo-contentpage' => 'Gezählt als eine Inhaltsseite',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Seiten mit Kaskadenschutz von hier',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Seiten mit Kaskadenschutz von',
# Skin names
'skinname-standard' => 'Klassik',
# Auto-summaries
'autosumm-blank' => 'Die Seite wurde geleert.',
'autosumm-replace' => 'Der Seiteninhalt wurde durch einen anderen Text ersetzt: „$1“',
-'autoredircomment' => 'Weiterleitung auf [[$1]] erstellt',
+'autoredircomment' => 'Weiterleitung nach [[$1]] erstellt',
'autosumm-new' => 'Die Seite wurde neu angelegt: „$1“',
# Size units
# Font style option in Special:Preferences
'editfont-style' => 'Cayê vurnayışi de tipê nuştışi:',
-'editfont-default' => 'Hesıbyayiya rovıteri',
-'editfont-monospace' => 'Tipê nustey sabıtcagırewtoği',
-'editfont-sansserif' => 'Tipê nustey Sans-serifi',
-'editfont-serif' => 'Tipê nustey Serifi',
+'editfont-default' => 'Qerar cıgeyraoği dest dero',
+'editfont-monospace' => 'Tipê nusteyê sabıtcagırewtoği',
+'editfont-sansserif' => 'Babetê Sans-serifi',
+'editfont-serif' => 'Tipê nusteyê serifi',
# Dates
-'sunday' => 'Bazar',
+'sunday' => 'Kırê',
'monday' => 'Berarek',
'tuesday' => 'Telete',
'wednesday' => 'Çeharşeme',
'thursday' => 'Pancşeme',
'friday' => 'Êne',
'saturday' => 'Bahdê êni',
-'sun' => 'Baz',
-'mon' => 'Ber',
-'tue' => 'Tlt',
+'sun' => 'Krê',
+'mon' => 'Dış',
+'tue' => 'Sêş',
'wed' => 'Çrş',
-'thu' => 'Pnş',
+'thu' => 'Pşm',
'fri' => 'Êne',
-'sat' => 'Bah',
+'sat' => 'Şem',
'january' => 'Çele',
-'february' => 'Zemherı',
+'february' => 'Şıbate',
'march' => 'Mert',
-'april' => 'Lisane',
-'may_long' => 'Gulan',
+'april' => 'Lizan',
+'may_long' => 'Gulane',
'june' => 'Heziran',
-'july' => 'Paliyan',
+'july' => 'Temuze',
'august' => 'Tebaxe',
-'september' => 'Kergan',
-'october' => 'Cıtan',
-'november' => 'Kelverdan',
-'december' => 'Vewran',
+'september' => 'Keşkelun',
+'october' => 'Tışrino Verên',
+'november' => 'Tışrino Peyên',
+'december' => 'Kanun',
'january-gen' => 'Çele',
-'february-gen' => 'Zemherı',
-'march-gen' => 'Mert',
-'april-gen' => 'Lisan',
-'may-gen' => 'Gulan',
+'february-gen' => 'Şıbate',
+'march-gen' => 'Adar',
+'april-gen' => 'Nisane',
+'may-gen' => 'Gulane',
'june-gen' => 'Heziran',
-'july-gen' => 'Paliyan',
+'july-gen' => 'Temuze',
'august-gen' => 'Tebaxe',
-'september-gen' => 'Kergan',
-'october-gen' => 'Cıtan',
-'november-gen' => 'Kelverdan',
-'december-gen' => 'Vewran',
+'september-gen' => 'Keşkelun',
+'october-gen' => 'Tışrino Verên',
+'november-gen' => 'Tışrino Peyên',
+'december-gen' => 'Kanun',
'jan' => 'Çel',
'feb' => 'Şbt',
'mar' => 'Adr',
'about' => 'Heqa',
'article' => 'Wesiqe',
-'newwindow' => '(zerreyê teqeyê newey de beno a)',
+'newwindow' => '(zerreyê pençereyê newey de beno a)',
'cancel' => 'Bıtexelne',
'moredotdotdot' => 'Vêşêri...',
'mypage' => 'Pela mı',
-'mytalk' => 'Verênayışê mı',
+'mytalk' => 'Werênayışê mı',
'anontalk' => 'Pela werênayışê nê IPy',
'navigation' => 'Geyrayış',
'and' => ' u',
'qbbrowse' => 'Rovete',
'qbedit' => 'Bıvurne',
'qbpageoptions' => 'Ena pele',
-'qbpageinfo' => 'Gıre',
'qbmyoptions' => 'Pelê mı',
'qbspecialpages' => 'Peley xısusi',
'faq' => 'PZP (Persê ke zehf persiyenê)',
'history' => 'Verora perer',
'history_short' => 'Vurnayışê verêni',
'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
-'printableversion' => 'Asayışo çapkerden',
-'permalink' => 'Gıreyo daimi',
+'printableversion' => 'Bınusnayen versiyon',
+'permalink' => 'Gıreyo manayen',
'print' => 'Çap ke',
'view' => 'Bıvin',
'edit' => 'Bıvurnên',
'personaltools' => 'Haletê şexsi',
'postcomment' => 'Qısımo newe',
'articlepage' => 'Pela zerreki bıvêne',
-'talk' => 'Werênayış',
+'talk' => 'Behse',
'views' => 'Asayışi',
'toolbox' => 'Haceti',
'userpage' => 'Pela karberi bıvêne',
'policy-url' => 'Project:Terzê hereketi',
'portal' => 'Portalê şêlıgi',
'portal-url' => 'Project:Portalê şêlıgi',
-'privacy' => 'Xısusiyeta nımıtin',
+'privacy' => 'Madeyê dızdiye',
'privacypage' => 'Project:Xısusiyetê nımtışi',
'badaccess' => 'Xeta mısadey',
'hr_tip' => 'Çıxiza dimdayi (hend akar mefiye)',
# Edit pages
-'summary' => 'Xelese:',
-'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Vurnayışo qıcek',
-'watchthis' => 'Ena perer teqib ke',
+'summary' => 'Xulasa:',
+'subject' => 'Mersel/Sernuşte:',
+'minoredit' => 'Eno vurnayışo de qıckeko',
+'watchthis' => 'Ena pele seyr ke',
'savearticle' => 'Pele qeyd ke',
'preview' => 'Verqayt',
'showpreview' => 'Verqayti bımocne',
'showlivepreview' => 'Verqayto cıwın',
-'showdiff' => 'Vurnayışa bıvin',
+'showdiff' => 'Vurnayışan bımocne',
'anoneditwarning' => 'Teme!: Şıma bı hesabê xo nıkewtê cı. Hurêndiya namey şıma dı IP-adresa şıma qeyd bena u asena.',
'anonpreviewwarning' => "''Ti hama nicikewte. Qeyd kerdiş zerre tarixê pele de adresê IP yê tu keyd keno.''",
'missingsummary' => "'''DİQET:''' Şıma kılmnuşte nıkerd.
'rc-old-title' => '"$1"i orcinalê cı vıraşt',
# Recent changes linked
-'recentchangeslinked' => 'Ney sero vurnayışi',
-'recentchangeslinked-feed' => 'Ney sero vurnayışi',
-'recentchangeslinked-toolbox' => 'Ney sero vurnayışi',
+'recentchangeslinked' => 'Elekeyın vurnayışi',
+'recentchangeslinked-feed' => 'Elekeyın vurnayışi',
+'recentchangeslinked-toolbox' => 'Elekeyın vurnayışi',
'recentchangeslinked-title' => 'vurnayışan ser "$1"',
'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdaoğan de lista de vurnayışê peyênana.
'shared-repo' => 'yew embarê repositoryî',
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
'filepage.css' => '/* CSS placed here is included on the file description page, also included on foreign client wikis */',
-'upload-disallowed-here' => 'Nê asengi sero theba nênusneyêno.',
+'upload-disallowed-here' => 'Şıma nêşenê serê na dosya ra bınusên.',
# File reversion
'filerevert' => '$1 reyna biyere',
'usermessage-template' => 'MediaWiki:UserMessage',
# Watchlist
-'watchlist' => 'lista mına seyr-kerdışi',
-'mywatchlist' => 'Listey taqiban',
+'watchlist' => 'Lista mına seyrkerdışi',
+'mywatchlist' => 'Lista mına seyrkerdışi',
'watchlistfor2' => 'Qandê $1 ($2)',
'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
# Contributions
'contributions' => 'İştiraqê karberi',
'contributions-title' => 'Dekerdenê karber de $1',
-'mycontris' => 'Dekerdeni',
+'mycontris' => 'Dekerdenê mı',
'contribsub2' => 'Qandê $1 ($2)',
'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
'uctop' => '(top)',
'sp-contributions-submit' => 'Cı geyre',
# What links here
-'whatlinkshere' => 'Çı tiyay rê gırê beno',
+'whatlinkshere' => 'Gıreyê perer',
'whatlinkshere-title' => 'Per da "$1" rê perê ke gre danê',
'whatlinkshere-page' => 'Per:',
'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
# Info page
'pageinfo-title' => 'Heq tê "$1"\'i',
+'pageinfo-not-current' => 'Melumat tenya qandê çımraviyarnayışê rocaney mocniyeno.',
'pageinfo-header-basic' => 'Seron zanayış',
'pageinfo-header-edits' => 'Vurnayışi verêni',
'pageinfo-header-restrictions' => 'Xısusiyetê pela',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
'pageinfo-toolboxlink' => 'Malumatê perer',
+'pageinfo-redirectsto' => 'Beno hetê',
+'pageinfo-redirectsto-info' => 'melumat',
+'pageinfo-contentpage' => 'Zey jû pela zerreki hesebiyena',
+'pageinfo-contentpage-yes' => 'E',
+'pageinfo-protect-cascading' => 'Sıtarkerdey tiya cı ra yenê war',
+'pageinfo-protect-cascading-yes' => 'E',
+'pageinfo-protect-cascading-from' => 'Sıtarkerdey cı ra yenê war',
# Skin names
'skinname-standard' => 'Klasik',
# Watchlist editing tools
'watchlisttools-view' => 'vurnayışanê eleqadari bıvin',
-'watchlisttools-edit' => 'listey taqiban bıvinê u bıvurnê',
+'watchlisttools-edit' => 'Lista seyrkerdışi bıvênên u bıvurnên',
'watchlisttools-raw' => 'Listeyê seyr-kerdışi bıvin',
# Iranian month names
'qbbrowse' => 'Pśeběraś',
'qbedit' => 'Pśeměniś',
'qbpageoptions' => 'Toś ten bok',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Móje boki',
'qbspecialpages' => 'Specialne boki',
'faq' => 'FAQ (pšašanja a wótegrona)',
'uploadnewversion-linktext' => 'Nowu wersiju toś teje dataje nagraś',
'shared-repo-from' => 'z $1',
'shared-repo' => 'zgromadny repozitorium',
-'upload-disallowed-here' => 'Bóžko njamóžoš toś ten wobraz pśepisaś.',
+'upload-disallowed-here' => 'Njamóžoš toś tu dataju pśepisaś.',
# File reversion
'filerevert' => 'Slědk wześ $1',
# Info page
'pageinfo-title' => 'Informacije za bok "$1"',
+'pageinfo-not-current' => 'Informacije daju se jano za aktualnu wersiju zwobrazniś.',
'pageinfo-header-basic' => 'Zakładne informacije',
'pageinfo-header-edits' => 'Historiju wobźěłaś',
'pageinfo-header-restrictions' => 'Šćit boka',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Zapśěgnjona pśedłoga|Zapśěgnjonej pśedłoze|Zapśěgnjone pśedłogi|Zapśěgnjone pśedłogi}} ($1)',
'pageinfo-toolboxlink' => 'Informacije wó boku',
+'pageinfo-redirectsto' => 'Pósrědnja dalej k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'Licy se ako wopśimjeśowy bok',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading' => 'Kaskadowy šćit wót how',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-protect-cascading-from' => 'Kaskadowy šćit wót',
# Skin names
'skinname-standard' => 'Klasiski',
'qbbrowse' => 'Περιήγηση',
'qbedit' => 'Επεξεργασία',
'qbpageoptions' => 'Αυτή η σελίδα',
-'qbpageinfo' => 'Συμφραζόμενα',
'qbmyoptions' => 'Οι σελίδες μου',
'qbspecialpages' => 'Σελίδες λειτουργιών',
'faq' => 'Συχνές ερωτήσεις (FAQ)',
'qbbrowse' => 'Browse',
'qbedit' => 'Edit',
'qbpageoptions' => 'This page',
-'qbpageinfo' => 'Context',
'qbmyoptions' => 'My pages',
'qbspecialpages' => 'Special pages',
'faq' => 'FAQ',
'shared-repo' => 'a shared repository',
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons', # only translate this message to other languages if you have to change it
'filepage.css' => '/* CSS placed here is included on the file description page, also included on foreign client wikis */', # only translate this message to other languages if you have to change it
-'upload-disallowed-here' => 'Unfortunately you cannot overwrite this image.',
+'upload-disallowed-here' => 'You cannot overwrite this file.',
# File reversion
'filerevert' => 'Revert $1',
'pageinfo-templates' => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
'pageinfo-footer' => '-', # do not translate or duplicate this message to other languages
'pageinfo-toolboxlink' => 'Page information',
+'pageinfo-redirectsto' => 'Redirects to',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Counted as a content page',
+'pageinfo-contentpage-yes' => 'Yes',
+'pageinfo-protect-cascading' => 'Protections are cascading from here',
+'pageinfo-protect-cascading-yes' => 'Yes',
+'pageinfo-protect-cascading-from' => 'Protections are cascading from',
# Skin names
'skinname-standard' => 'Classic', # only translate this message to other languages if you have to change it
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3', # only translate this message to other languages if you have to change it
-'seconds-abbrev' => '$1s', # only translate this message to other languages if you have to change it
-'minutes-abbrev' => '$1m', # only translate this message to other languages if you have to change it
-'hours-abbrev' => '$1h', # only translate this message to other languages if you have to change it
-'days-abbrev' => '$1d', # only translate this message to other languages if you have to change it
+'seconds-abbrev' => '$1 s', # only translate this message to other languages if you have to change it
+'minutes-abbrev' => '$1 min', # only translate this message to other languages if you have to change it
+'hours-abbrev' => '$1 h', # only translate this message to other languages if you have to change it
+'days-abbrev' => '$1 d', # only translate this message to other languages if you have to change it
'seconds' => '{{PLURAL:$1|$1 second|$1 seconds}}',
'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
'qbbrowse' => 'Foliumi',
'qbedit' => 'Redakti',
'qbpageoptions' => 'Paĝagado',
-'qbpageinfo' => 'Paĝinformoj',
'qbmyoptions' => 'Personaĵoj',
'qbspecialpages' => 'Specialaj paĝoj',
'faq' => 'Oftaj demandoj',
* @author Clerc
* @author Crazymadlover
* @author Cvmontuy
+ * @author Dalton2
* @author Danke7
* @author David0811
* @author Dferg
* @author Locos epraix
* @author Mahadeva
* @author Manuelt15
+ * @author Maor X
* @author McDutchie
* @author Muro de Aguas
* @author Omnipaedista
$messages = array(
# User preference toggles
'tog-underline' => 'Subrayar enlaces:',
-'tog-justify' => 'Justificar párrafos',
-'tog-hideminor' => 'Ocultar ediciones menores en cambios recientes',
-'tog-hidepatrolled' => 'Ocultar ediciones patrulladas en los cambios recientes',
-'tog-newpageshidepatrolled' => 'Ocultar páginas patrulladas de la lista de páginas nuevas',
-'tog-extendwatchlist' => 'Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes.',
-'tog-usenewrc' => 'Agrupar los cambios por página en los cambios recientes y en la lista de vigilancia (requiere JavaScript)',
+'tog-justify' => 'Justificar los párrafos',
+'tog-hideminor' => 'Ocultar las ediciones menores en los cambios recientes',
+'tog-hidepatrolled' => 'Ocultar las ediciones patrulladas en los cambios recientes',
+'tog-newpageshidepatrolled' => 'Ocultar las páginas patrulladas de la lista de páginas nuevas',
+'tog-extendwatchlist' => 'Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes',
+'tog-usenewrc' => 'Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento (requiere JavaScript)',
'tog-numberheadings' => 'Numerar automáticamente los encabezados',
'tog-showtoolbar' => 'Mostrar la barra de edición (requiere JavaScript)',
-'tog-editondblclick' => 'Editar páginas con doble clic (requiere JavaScript)',
-'tog-editsection' => 'Habilitar la edición de secciones usando el enlace [editar]',
-'tog-editsectiononrightclick' => 'Habilitar la edición de secciones presionando el botón de la derecha en los títulos de secciones (requiere JavaScript)',
+'tog-editondblclick' => 'Editar las páginas con doble clic (requiere JavaScript)',
+'tog-editsection' => 'Habilitar la edición de secciones mediante el enlace [editar]',
+'tog-editsectiononrightclick' => 'Habilitar la edición de secciones pulsando el botón derecho en los títulos de secciones (requiere JavaScript)',
'tog-showtoc' => 'Mostrar el índice (para páginas con más de 3 encabezados)',
'tog-rememberpassword' => 'Recordar mi nombre de usuario y contraseña entre sesiones en este navegador (por un máximo de $1 {{PLURAL:$1|día|días}})',
-'tog-watchcreations' => 'Añadir las páginas que cree y los archivos que cargue a mi lista de vigilancia',
-'tog-watchdefault' => 'Añadir la páginas y archivos que edite a mi lista de vigilancia',
-'tog-watchmoves' => 'Añadir las páginas y archivos que mueva a mi lista de vigilancia',
-'tog-watchdeletion' => 'Añadir la páginas y archivos que borre a mi lista de vigilancia',
+'tog-watchcreations' => 'Añadir las páginas que cree y los archivos que suba a mi lista de seguimento',
+'tog-watchdefault' => 'Añadir las páginas y archivos que edite a mi lista de seguimiento',
+'tog-watchmoves' => 'Añadir las páginas y archivos que mueva a mi lista de seguimiento',
+'tog-watchdeletion' => 'Añadir las páginas y archivos que borre a mi lista de seguimiento',
'tog-minordefault' => 'Marcar todas las ediciones como menores de manera predeterminada',
'tog-previewontop' => 'Mostrar previsualización antes del cuadro de edición',
'tog-previewonfirst' => 'Mostrar previsualización en la primera edición',
'tog-enotifrevealaddr' => 'Revelar mi dirección de correo electrónico en los correos de notificación',
'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
'tog-oldsig' => 'Firma actual:',
-'tog-fancysig' => 'Tratar firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
-'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
-'tog-showjumplinks' => 'Habilitar enlaces de accesibilidad «saltar a»',
-'tog-uselivepreview' => 'Usar live preview (JavaScript) (Experimental)',
-'tog-forceeditsummary' => 'Avisar cuando grabe la página sin introducir un resumen de edición',
+'tog-fancysig' => 'Tratar la firma como wikitexto (sin un enlace automático)',
+'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
+'tog-externaldiff' => "Utilizar ''diferencia'' externa por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])",
+'tog-showjumplinks' => 'Habilitar los enlaces de accesibilidad «saltar a»',
+'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript) (experimental)',
+'tog-forceeditsummary' => 'Avisarme cuando grabe la página sin introducir un resumen de edición',
'tog-watchlisthideown' => 'Ocultar mis ediciones en la lista de seguimiento',
-'tog-watchlisthidebots' => 'Ocultar ediciones de bots en la lista de seguimiento',
-'tog-watchlisthideminor' => 'Ocultar ediciones menores en la lista de seguimiento',
-'tog-watchlisthideliu' => 'Ocultar ediciones de usuarios registrados en la lista de seguimiento',
-'tog-watchlisthideanons' => 'Ocultar ediciones de usuarios anónimos en la lista de seguimiento',
+'tog-watchlisthidebots' => 'Ocultar las ediciones de bots en la lista de seguimiento',
+'tog-watchlisthideminor' => 'Ocultar las ediciones menores en la lista de seguimiento',
+'tog-watchlisthideliu' => 'Ocultar las ediciones de los usuarios registrados en la lista de seguimiento',
+'tog-watchlisthideanons' => 'Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento',
'tog-watchlisthidepatrolled' => 'Ocultar las ediciones patrulladas en la lista de seguimiento',
'tog-ccmeonemails' => 'Recibir copias de los correos que envío a otros usuarios',
-'tog-diffonly' => 'No mostrar el contenido de la página bajo las diferencias',
-'tog-showhiddencats' => 'Mostrar categorías escondidas',
+'tog-diffonly' => "No mostrar bajo las ''diferencias'' el contenido de la página",
+'tog-showhiddencats' => 'Mostrar las categorías escondidas',
'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
-'tog-norollbackdiff' => "Omitir el ''diff'' después de revertir",
+'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
'underline-always' => 'Siempre',
'underline-never' => 'Nunca',
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Opciones de página',
-'qbpageinfo' => 'Información de página',
'qbmyoptions' => 'Mis páginas',
'qbspecialpages' => 'Páginas especiales',
'faq' => 'Preguntas más frecuentes',
'shared-repo-from' => 'de $1',
'shared-repo' => 'un repositorio compartido',
'filepage.css' => '/* Los estilos CSS colocados aquí se incluirán en las páginas de descripción de archivos, incluso en los wikis externos que incluyan estas páginas */',
-'upload-disallowed-here' => 'Lamentablemente no puedes sobrescribir esta imagen.',
+'upload-disallowed-here' => 'No puedes sobrescribir este archivo.',
# File reversion
'filerevert' => 'Revertir $1',
# Info page
'pageinfo-title' => 'Información para «$1»',
+'pageinfo-not-current' => 'Únicamente se puede mostrar la información para la revisión actual.',
'pageinfo-header-basic' => 'Información básica',
'pageinfo-header-edits' => 'Historial de ediciones',
'pageinfo-header-restrictions' => 'Protección de página',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría oculta|Categorías ocultas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|plantilla incluida|plantillas incluidas}} ($1)',
'pageinfo-toolboxlink' => 'Información de la página',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'Información',
+'pageinfo-contentpage' => 'Contado como página de contenido',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => 'Protecciones en serie activadas',
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => 'Protecciones en serie activadas',
# Skin names
'skinname-standard' => 'Estándar',
'qbbrowse' => 'Sirvi',
'qbedit' => 'Redigeeri',
'qbpageoptions' => 'Lehekülje suvandid',
-'qbpageinfo' => 'Lehekülje andmed',
'qbmyoptions' => 'Minu suvandid',
'qbspecialpages' => 'Erileheküljed',
'faq' => 'KKK',
'qbbrowse' => 'Arakatu',
'qbedit' => 'Aldatu',
'qbpageoptions' => 'Orrialde hau',
-'qbpageinfo' => 'Testuingurua',
'qbmyoptions' => 'Nire orrialdeak',
'qbspecialpages' => 'Aparteko orrialdeak',
'faq' => 'Maiz egindako galderak',
'move-subpages' => 'Azpiorrialde guztiak ($1-tik gora) mugitu',
'move-talk-subpages' => 'Azpiorrialdeen eztabaida orrialde guztiak ($1-tik gora) mugitu',
'movepage-page-exists' => '$1 orrialdea jada badago eta ezin da automatikoki gainetik idatzi.',
-'movepage-page-moved' => '$1 orrialdea $2(e)ra mugitu da.',
+'movepage-page-moved' => '$1 orria $2 izenera aldatu da.',
'movepage-page-unmoved' => '$1 orrialdea ezin da $2(e)ra mugitu.',
'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} maximoa mugitu da eta jada ez dira gehiago mugituko modu automatikoan.',
'movelogpage' => 'Mugimendu erregistroa',
# New logging system
'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
+'logentry-move-move' => '$1 wikilariak «$3» orria «$4» izenera aldatu du',
+'logentry-move-move_redir-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
'newuserlog-byemail' => 'pasahitza e-postaz bidali da',
# Feedback
'qbbrowse' => 'Escrucal',
'qbedit' => 'Eital',
'qbpageoptions' => 'Esta páhina',
-'qbpageinfo' => 'Contestu',
'qbmyoptions' => 'Las mis páhinas',
'qbspecialpages' => 'Páhinas especialis',
'faq' => 'FAQ',
'qbbrowse' => 'مرور',
'qbedit' => 'ویرایش',
'qbpageoptions' => 'این صفحه',
-'qbpageinfo' => 'محتوا',
'qbmyoptions' => 'صفحههای من',
'qbspecialpages' => 'صفحههای ویژه',
'faq' => 'پرسشهای متداول',
'blockedtitle' => 'کاربر بسته شدهاست',
'blockedtext' => "'''دسترسی حساب کاربری یا نشانی آیپی شما بسته شدهاست.'''
-این کار توسط $1 انجام شدهاست.
+این قطع دسترسی توسط $1 انجام شدهاست.
دلیل ارائهشده چنین است: $2''
* شروع قطع دسترسی: $8
* پایان قطع دسترسی: $6
-* کاربری که قطع دسترسیاش مد نظر بودهاست: $7
+* کاربری هدف قطع دسترسی: $7
شما میتوانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
-توجه کنید که شما نمیتوانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]]تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+توجه کنید که شما نمیتوانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
نشانی آیپی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
لطفاً تمامی جزئیات فوق را در کلیهٔ درخواستهایی که در این باره مطرح میکنید ذکر کنید.",
'autoblockedtext' => "دسترسی نشانی آیپی شما قطع شدهاست، زیرا این نشانی آیپی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شدهاست.
-دلیل ارائه شده چنین است:
+دلیل ارائهشده چنین است:
:''$2''
* شروع قطع دسترسی: $8
* پایان قطع دسترسی: $6
-* کاربری که قطع دسترسیاش مد نظر بودهاست: $7
+* کاربری هدف قطع دسترسی: $7
-شما میتوانید با $1 یا یکی دیگر از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرید، تا پیرامون این قطع دسترسی صحبت کنید.
-
-توجه کنید که برای ارسال رایانامه در ویکی، باید رایانامهٔ خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
-
-نشانی آیپی فعلی شما $3 است و شمارهٔ قطع دسترسی $5 است.
-لطفاً این شماره را در هر درخواستی که در این باره مطرح میکنید ذکر کنید.",
+شما میتوانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
+توجه کنید که شما نمیتوانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+نشانی آیپی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
+لطفاً تمامی جزئیات فوق را در کلیهٔ درخواستهایی که در این باره مطرح میکنید ذکر کنید.",
'blockednoreason' => 'دلیلی مشخص نشدهاست',
'whitelistedittext' => 'برای ویرایش مقالهها باید $1.',
'confirmedittext' => 'شما باید، پیش از ویرایش صفحهها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
*'''گوگل کروم:'''کلیدهای ''Ctrl+Shift+R'' را با هم فشار دهید. (در رایانههای اپل مکینتاش کلیدهای ''⌘-Shift-R'')
*'''اینترنت اکسپلورر:''' کلید ''Ctrl'' را نگهدارید و روی دکمهٔ ''Refresh'' کلیک کنید، یا کلیدهای ''Ctrl-F5'' را با هم فشار دهید
*'''اپرا:''' حافظهٔ نهانی مرورگر را از طریق منوی ''Tools → Preferences'' پاک کنید",
-'usercssyoucanpreview' => "'''نکته:''' پیش از ذخیهکردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
-'userjsyoucanpreview' => "'''نکته:''' پیش از ذخیرهکردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'usercssyoucanpreview' => "'''نکته:''' پیش از ذخیرهکردن فایل سیاساس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'userjsyoucanpreview' => "''نکته:''' پیش از ذخیرهکردن فایل جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
'usercsspreview' => "'''فراموش مکنید که شما فقط دارید پیشنمایش سیاساس کاربریتان را میبینید.'''
'''این سیاساس هنوز ذخیره نشدهاست!'''",
'userjspreview' => "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربریتان را امتحان میکنید/پیشنمایش آن را میبینید.'''
'edit-already-exists' => 'امکان ساختن صفحهٔ جدید وجود ندارد.
این صفحه از قبل وجود داشتهاست.',
'defaultmessagetext' => 'متن پیشفرض پیغام',
+'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
+'invalid-content-data' => 'داده محتوای نامعتبر',
+'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
+
+# Content models
+'content-model-wikitext' => 'ویکیمتن',
+'content-model-text' => 'متنی ساده',
+'content-model-javascript' => 'جاوااسکریپت',
+'content-model-css' => 'سیاساس',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''هشدار:''' این صفحه حاوی تعدادی زیادی فراخوانی دستورهای تجزیهگر است.
'prevn-title' => '$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} قبلی',
'nextn-title' => '$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} بعدی',
'shown-title' => 'نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه',
-'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'گزینههای جستجو',
'searchmenu-exists' => "'''صفحهای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
'searchmenu-new' => "'''صفحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
'powersearch' => 'جستجوی پیشرفته',
'powersearch-legend' => 'جستجوی پیشرفته',
'powersearch-ns' => 'جستجو در فضاهای نام:',
-'powersearch-redir' => 'تغییرمسیرها فهرست شوند',
+'powersearch-redir' => 'فهرستکردن تغییرمسیرها',
'powersearch-field' => 'جستجو برای',
'powersearch-togglelabel' => 'بررسی:',
'powersearch-toggleall' => 'همه',
'prefs-skin' => 'پوسته',
'skin-preview' => 'پیشنمایش',
'datedefault' => 'بدون ترجیح',
-'prefs-beta' => 'ابزارهای کارآمد',
+'prefs-beta' => 'ویژگی های بتا',
'prefs-datetime' => 'تاریخ و زمان',
-'prefs-labs' => 'قسمتهای آزمایشی',
+'prefs-labs' => 'گزینههای آزمایشی',
'prefs-user-pages' => 'صفحههای کاربری',
'prefs-personal' => 'دادههای کاربر',
'prefs-rc' => 'تغییرات اخیر',
'prefs-watchlist' => 'فهرست پیگیریها',
'prefs-watchlist-days' => 'تعداد روزهایی که باید در فهرست پیگیریها نمایش داده شود:',
-'prefs-watchlist-days-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
+'prefs-watchlist-days-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
'prefs-watchlist-edits' => 'تعداد ویرایشهای نشاندادهشده در فهرست پیگیریهای گسترشیافته:',
'prefs-watchlist-edits-max' => 'حداکثر تعداد: ۱۰۰۰',
'prefs-watchlist-token' => 'رمز فهرست پیگیری:',
-'prefs-misc' => 'تنظیمات متفرقه',
+'prefs-misc' => 'متفرقه',
'prefs-resetpass' => 'تغییر گذرواژه',
'prefs-changeemail' => 'تغییر رایانامه',
-'prefs-setemail' => 'تغیین آدرس رایانامه',
+'prefs-setemail' => 'تنظیم نشانی رایانامه',
'prefs-email' => 'گزینههای رایانامه',
'prefs-rendering' => 'نمایش صفحه',
'saveprefs' => 'ذخیره',
'stub-threshold' => 'آستانهٔ ویرایش پیوندهای <a href="#" class="stub">ناقص</a> (بایت):',
'stub-threshold-disabled' => 'غیرفعال',
'recentchangesdays' => 'تعداد روزهای نمایش دادهشده در تغییرات اخیر:',
-'recentchangesdays-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
+'recentchangesdays-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
'recentchangescount' => 'تعداد پیشفرض ویرایشهای نمایش یافته:',
'prefs-help-recentchangescount' => 'این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحهها و سیاههها میشود.',
'prefs-help-watchlist-token' => 'پرکردن این بخش با یک کلید رمز سبب ایجاد یک خوراک آراساس برای فهرست پیگیری شما میشود.
'timezoneregion-indian' => 'اقیانوس هند',
'timezoneregion-pacific' => 'اقیانوس آرام',
'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
-'prefs-searchoptions' => 'گزینههای جستجو',
+'prefs-searchoptions' => 'جستجو',
'prefs-namespaces' => 'فضاهای نام',
'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
'default' => 'پیشفرض',
'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
'youremail' => 'رایانامه:',
'username' => 'نام کاربری:',
-'uid' => 'Ø´Ù\85ارÙ\87Ù\94 کاربرÛ\8c:',
+'uid' => 'Ø´Ù\86اسÙ\87Ù\94 کاربر:',
'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروهها}}:',
'prefs-registration' => 'زمان ثبتنام:',
'yourrealname' => 'نام واقعی:',
'badsig' => 'امضای خام غیرمجاز.
لطفاً برچسبهای اچتیامال را بررسی کنید.',
'badsiglength' => 'امضای شما بیش از اندازه طولانی است.
-امضا باید کمتر از $1 نویسه طول داشته باشد.',
+امضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.',
'yourgender' => 'جنسیت:',
'gender-unknown' => 'مشخصنشده',
'gender-male' => 'مرد',
'prefs-help-gender' => 'اختیاری: برای خطابشدن با جنسیت درست توسط نرمافزار به کار میرود.
این اطلاعات عمومی خواهد بود.',
'email' => 'رایانامه',
-'prefs-help-realname' => 'نام واقعی اختیاری است
+'prefs-help-realname' => 'نام واقعی اختیاری است.
اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آنها به شما از نام واقعیتان استفاده خواهد شد.',
'prefs-help-email' => 'نشانی رایانامه اختیاریاست، اما فرستادن گذرواژهای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن میکند.',
'prefs-help-email-others' => 'شما همچنین میتوانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربریتان به شما رایانامه بفرستند.
'right-read' => 'خواندن صفحه',
'right-edit' => 'ویرایش صفحه',
'right-createpage' => 'ایجاد صفحه (در مورد صفحههای غیر بحث)',
-'right-createtalk' => 'ایجاد صفحهٔ بحث',
-'right-createaccount' => 'ایجاد حساب کاربری',
+'right-createtalk' => 'ایجاد صفحههای بحث',
+'right-createaccount' => 'ایجاد حسابهای کاربری',
'right-minoredit' => 'علامتزدن ویرایشها به عنوان جزئی',
'right-move' => 'انتقال صفحه',
'right-move-subpages' => 'انتقال صفحهها به همراه زیرصفحههایشان',
'right-deletedhistory' => 'مشاهدهٔ موارد حذفشده از تاریخچه، بدون دیدن متن آنها',
'right-deletedtext' => 'مشاهدهٔ متن حذفشده و تغییرات بین نسخههای حذفشده',
'right-browsearchive' => 'جستجوی صفحههای حذفشده',
-'right-undelete' => 'احیای صفحهای حذفشده',
+'right-undelete' => 'احیای صفحهها',
'right-suppressrevision' => 'بازبینی و احیای ویرایشهایی که از مدیران پنهان شدهاند',
'right-suppressionlog' => 'مشاهدهٔ سیاهههای خصوصی',
'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
'shared-repo-from' => 'از $1',
'shared-repo' => 'یک مخزن مشترک',
'shared-repo-name-wikimediacommons' => 'ویکیانبار',
-'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c تÙ\88اÙ\86Û\8cد اÛ\8cÙ\86 Ù\86گاره را بازنویس کنید.',
+'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c تÙ\88اÙ\86Û\8cد اÛ\8cÙ\86 پرÙ\88Ù\86ده را بازنویس کنید.',
# File reversion
'filerevert' => 'واگردانی $1',
'undeletedrevisions' => '$1 نسخه احیا {{PLURAL:$1|شد|شدند}}',
'undeletedrevisions-files' => '$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
'undeletedfiles' => '$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
-'cannotundelete' => 'احیا ناموفق بود؛
-ممکن است کس دیگری پیشتر این صفحه را احیا کرده باشد.',
+'cannotundelete' => 'احیا ناموفق بود:
+$1',
'undeletedpage' => "'''$1 احیا شد'''
برای دیدن سیاههٔ حذفها و احیاهای اخیر به [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
'immobile-target-namespace-iw' => 'پیوند میانویکی هدفی مجاز برای انتقال صفحه نیست.',
'immobile-source-page' => 'این صفحه قابل انتقال نیست.',
'immobile-target-page' => 'امکان انتقال به این عنوان مقصد وجود ندارد.',
+'bad-target-model' => 'مقصد مورد نظر از مدل محتوایی متفاوتی استفاده میکند. تبدیل $1 به $2 ممکن نیست.',
'imagenocrossnamespace' => 'امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد',
'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد',
'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست',
# Info page
'pageinfo-title' => 'اطلاعات در مورد «$1»',
+'pageinfo-not-current' => 'اطلاعات ممکن است تنها برای نسخهٔ فعلی نمایش داده شود.',
'pageinfo-header-basic' => 'اطلاعات اولیه',
'pageinfo-header-edits' => 'ویرایش تاریخچه',
'pageinfo-header-restrictions' => 'حفاظت از صفحه',
'pageinfo-hidden-categories' => '{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )',
'pageinfo-templates' => '{{PLURAL:$1|الگو|الگو}} استفادهشده ($1)',
'pageinfo-toolboxlink' => 'اطلاعات صفحه',
+'pageinfo-redirectsto' => 'تغییرمسیر به',
+'pageinfo-redirectsto-info' => 'اطلاعات',
+'pageinfo-contentpage' => 'شمرده شده به عنوان صفحهٔ محتویی',
+'pageinfo-contentpage-yes' => 'بله',
+'pageinfo-protect-cascading' => 'محافظت آبشاری از اینجا',
+'pageinfo-protect-cascading-yes' => 'بله',
+'pageinfo-protect-cascading-from' => 'محافظت آبشاری از',
# Skin names
'skinname-standard' => 'کلاسیک',
* @author Crt
* @author ElmA
* @author Harriv
+ * @author Hyperborean
* @author Jaakonam
* @author Jack Phoenix
* @author Jafeluv
'qbbrowse' => 'Selaa',
'qbedit' => 'Muokkaa',
'qbpageoptions' => 'Sivuasetukset',
-'qbpageinfo' => 'Sivun tiedot',
'qbmyoptions' => 'Asetukset',
'qbspecialpages' => 'Toimintosivut',
'faq' => 'Usein kysytyt kysymykset',
'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
'shared-repo-from' => 'kohteesta $1',
'shared-repo' => 'jaettu mediavarasto',
+'upload-disallowed-here' => 'Et voi korvata tätä tiedostoa.',
# File reversion
'filerevert' => 'Tiedoston $1 palautus',
'pageinfo-header-edits' => 'Muutoshistoria',
'pageinfo-header-restrictions' => 'Sivun suojaus',
'pageinfo-header-properties' => 'Sivun ominaisuudet',
+'pageinfo-display-title' => 'Sivun otsikko',
'pageinfo-default-sort' => 'Oletuslajitteluavain',
'pageinfo-length' => 'Sivun pituus (tavuina)',
'pageinfo-article-id' => 'Sivun tunniste',
+'pageinfo-robot-index' => 'Indeksoitava',
+'pageinfo-robot-noindex' => 'Ei indeksoitava',
'pageinfo-views' => 'Katselukertojen määrä',
'pageinfo-watchers' => 'Sivun tarkkailijoiden lukumäärä',
'pageinfo-redirects-name' => 'Sivulle johtavat ohjaukset',
'pageinfo-subpages-name' => 'Sivun alasivut',
'pageinfo-firstuser' => 'Sivun luonut',
+'pageinfo-firsttime' => 'Sivun luontipäivämäärä',
'pageinfo-lastuser' => 'Viimeisin muokkaaja',
+'pageinfo-lasttime' => 'Viimeisimmän muokkausksen päivämäärä',
'pageinfo-edits' => 'Muokkausten kokonaismäärä',
'pageinfo-authors' => 'Sivun eri muokkaajien kokonaismäärä',
'pageinfo-magic-words' => '{{PLURAL:$1|Taikasana|Taikasanat}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Piilotettu luokka|Piilotetut luokat}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Sisällytetty malline|Sisällytetyt mallineet}} ($1)',
'pageinfo-toolboxlink' => 'Sivun tiedot',
+'pageinfo-redirectsto-info' => 'tiedot',
+'pageinfo-contentpage-yes' => 'Kyllä',
+'pageinfo-protect-cascading-yes' => 'Kyllä',
# Skin names
'skinname-standard' => 'Perus',
'file-info-png-looped' => 'toistuva',
'file-info-png-repeat' => 'toistettu $1 {{PLURAL:$1|kertaa|kertaa}}',
'file-info-png-frames' => '$1 {{PLURAL:$1|kehys|kehystä}}',
+'file-no-thumb-animation' => "'''Huomautus: Teknisten rajoitusten vuoksi tämän tiedoston pienoiskuvat eivät ole animoituja.'''",
+'file-no-thumb-animation-gif' => "'''Huomautus: Teknisten rajoitusten vuoksi korkearesoluutioisten GIF-kuvien pienoiskuvat eivät ole animoituja.'''",
# Special:NewFiles
'newimages' => 'Uudet tiedostot',
'tog-shownumberswatching' => 'Näytä kuinka moni käyttäjä valvoo sivua',
'tog-oldsig' => 'Nykynen allekirjotus',
'tog-fancysig' => 'Mookkaamaton allekirjotus ilman auttomaattista linkkiä',
-'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
+'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. ([//www.mediawiki.org/wiki/Manual:External_editors Ohje])',
# Dates
'sunday' => 'pyhä',
# Cologne Blue skin
'qbedit' => 'Mookkaa',
'qbpageoptions' => 'Tämä sivu',
-'qbpageinfo' => 'Sisältö',
'qbmyoptions' => 'Minun inställninkit',
'qbspecialpages' => 'Spesiaali sivut',
'faq' => 'Useasti kysytyt kysymykset',
'qbbrowse' => 'Kaga',
'qbedit' => 'Rætta',
'qbpageoptions' => 'Henda síðan',
-'qbpageinfo' => 'Samanhangur',
'qbmyoptions' => 'Mínar síður',
'qbspecialpages' => 'Serstakar síður',
'faq' => 'OSS',
'editinginterface' => "↓ '''Ávaring:''' Tú rættar eina síðu sum verður brúkt til at geva markamóts tekst til ritbúnaðin (software).
Broytingar á hesi síðu fara at ávirka útsjóndina á brúkara markamótinum (interface) fyri aðrir brúkarar.
Fyri at gera týðingar verður tú vinarliga biðin um at umhugsa at brúka [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], sum er verkætlan fyri týðingum av MediaWiki.",
-'sqlhidden' => '↓ (SQL fyrispurningur fjaldur)',
+'sqlhidden' => '(SQL fyrispurningur fjaldur)',
'cascadeprotected' => 'Henda síðan er vard fyri rættingum, tí hon er í fylgjandi {{PLURAL:$1|síðu, sum er|síðum, sum eru}}
vardar við "arvaðari síðuverjing"
$2',
'qbbrowse' => 'Parcourir',
'qbedit' => 'Modifier',
'qbpageoptions' => 'Cette page',
-'qbpageinfo' => 'Contexte',
'qbmyoptions' => 'Mes pages',
'qbspecialpages' => 'Pages spéciales',
'faq' => 'FAQ',
'vector-simplesearch-preference' => "Activer la barre de recherche simplifiée (seulement pour l'habillage Vector)",
'vector-view-create' => 'Créer',
'vector-view-edit' => 'Modifier',
-'vector-view-history' => 'Afficher l’historique',
+'vector-view-history' => "Afficher l'historique",
'vector-view-view' => 'Lire',
'vector-view-viewsource' => 'Voir la source',
'actions' => 'Actions',
Votre compte a été créé.
N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].',
-'yourname' => 'Nom d’utilisateur :',
+'yourname' => 'Nom d’utilisateur :',
'yourpassword' => 'Mot de passe :',
'yourpasswordagain' => 'Confirmez le mot de passe :',
'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
'noemail' => "Aucune adresse de courriel n’a été enregistrée pour l'utilisateur « $1 ».",
'noemailcreate' => 'Vous devez fournir une adresse de courriel valide',
-'passwordsent' => 'Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisateur « $1 ». Veuillez vous reconnecter après l’avoir reçu.',
+'passwordsent' => "Un nouveau mot de passe a été envoyé à l'adresse de courriel de l'utilisateur « $1 ». Veuillez vous reconnecter après l'avoir reçu.",
'blocked-mailpassword' => 'Votre adresse IP est bloquée en écriture, la fonction de rappel du mot de passe est donc désactivée pour éviter les abus.',
'eauthentsent' => 'Un courriel de confirmation a été envoyé à l’adresse indiquée.
Avant qu’un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.',
Si vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
'summary-preview' => 'Aperçu du résumé :',
'subject-preview' => 'Prévisualisation du sujet/titre :',
-'blockedtitle' => 'L’utilisateur est bloqué.',
+'blockedtitle' => "L'utilisateur est bloqué.",
'blockedtext' => "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''
Le blocage a été effectué par $1.
'page_first' => 'première',
'page_last' => 'dernière',
'histlegend' => 'Légende : ({{int:cur}}) = différence avec la version actuelle, ({{int:last}}) = différence avec la version précédente, <b>{{int:minoreditletter}}</b> = modification mineure',
-'history-fieldset-title' => 'Naviguer dans l’historique',
+'history-fieldset-title' => "Naviguer dans l'historique",
'history-show-deleted' => 'Masqués seulement',
'histfirst' => 'première page',
'histlast' => 'dernière page',
'timezoneregion-indian' => 'Océan indien',
'timezoneregion-pacific' => 'Océan pacifique',
'allowemail' => 'Autoriser l’envoi de courriels venant d’autres utilisateurs',
-'prefs-searchoptions' => 'Options de recherche',
+'prefs-searchoptions' => 'Recherche',
'prefs-namespaces' => 'Espaces de noms',
'defaultns' => 'Rechercher par défaut dans ces espaces de noms :',
'default' => 'défaut',
'userrights-user-editname' => 'Entrez un nom d’utilisateur :',
'editusergroup' => 'Modification des groupes d’utilisateurs',
'editinguser' => "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} '''[[User:$1|$1]]''' $2",
-'userrights-editusergroup' => 'Modifier les groupes de l’utilisateur',
+'userrights-editusergroup' => "Modifier les groupes de l'utilisateur",
'saveusergroups' => 'Enregistrer les groupes de l’utilisateur',
'userrights-groupsmember' => 'Membre de :',
'userrights-groupsmember-auto' => 'Membre implicite de :',
# User rights log
'rightslog' => 'Journal des modifications de droits d’utilisateurs',
'rightslogtext' => 'Voici l’historique des modifications des droits des utilisateurs.',
-'rightslogentry' => 'a modifié les droits de l’utilisateur « $1 » de $2 à $3',
+'rightslogentry' => "a modifié les droits de l'utilisateur « $1 » de $2 à $3",
'rightslogentry-autopromote' => 'a été automatiquement promu de $2 à $3',
'rightsnone' => '(aucun)',
'shared-repo' => 'un dépôt partagé',
'shared-repo-name-wikimediacommons' => 'Wikimédia Commons',
'filepage.css' => '/* Les styles CSS placés ici sont inclus dans la page de description du fichier, également incluse sur les clients wikis étrangers */',
-'upload-disallowed-here' => 'Malheureusement, vous ne peut pas remplacer cette image.',
+'upload-disallowed-here' => 'Vous ne pouvez pas remplacer ce fichier.',
# File reversion
'filerevert' => 'Rétablir $1',
'mailnologintext' => 'Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d’autres utilisateurs.',
'emailuser' => 'Lui envoyer un courriel',
'emailuser-title-target' => 'Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}',
-'emailuser-title-notarget' => 'Envoyer un courriel à l’utilisateur',
-'emailpage' => 'Envoyer un courriel à l’utilisateur',
+'emailuser-title-notarget' => "Envoyer un courriel à l'utilisateur",
+'emailpage' => "Envoyer un courriel à l'utilisateur",
'emailpagetext' => 'Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à cet utilisateur.
L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.',
'usermailererror' => 'Erreur dans l’objet du courriel :',
-'defemailsubject' => '{{SITENAME}} Courriel de l’utilisateur « $1 »',
+'defemailsubject' => "{{SITENAME}} Courriel de l'utilisateur « $1 »",
'usermaildisabled' => 'L’envoi de courriels entre utilisateurs est désactivé',
'usermaildisabledtext' => 'Vous ne pouvez pas envoyer de courriels à d’autres utilisateurs sur ce wiki',
'noemailtitle' => 'Aucune adresse de courriel',
'nowikiemailtext' => 'Cet utilisateur a choisi de ne pas recevoir de courriel de la part d’autres utilisateurs.',
'emailnotarget' => "Nom d'utilisateur du destinataire inexistant ou invalide.",
'emailtarget' => "Entrez le nom d'utilisateur du destinataire",
-'emailusername' => "Nom de l'utilisateur :",
+'emailusername' => 'Nom d’utilisateur :',
'emailusernamesubmit' => 'Soumettre',
'email-legend' => 'Envoyer un courriel à un autre utilisateur de {{SITENAME}}',
'emailfrom' => 'De :',
'emailccsubject' => 'Copie de votre message à $1 : $2',
'emailsent' => 'Courriel envoyé',
'emailsenttext' => 'Votre message a été envoyé par courriel.',
-'emailuserfooter' => 'Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l’utilisateur » de {{SITENAME}}.',
+'emailuserfooter' => "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l'utilisateur » de {{SITENAME}}.",
# User Messenger
'usermessage-summary' => 'A laissé un message système.',
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Contributions de l’utilisateur',
+'contributions' => "Contributions de l'utilisateur",
'contributions-title' => 'Liste des contributions de l’utilisateur $1',
'mycontris' => 'Contributions',
'contribsub2' => 'Pour $1 ($2)',
'nocontribs' => 'Aucune modification correspondant à ces critères n’a été trouvée.',
'uctop' => '(dernière)',
'month' => 'À partir du mois (et précédents) :',
-'year' => 'À partir de l’année (et précédentes) :',
+'year' => "À partir de l'année (et précédentes) :",
'sp-contributions-newbies' => 'Ne montrer que les contributions des nouveaux utilisateurs',
'sp-contributions-newbies-sub' => 'Parmi les nouveaux comptes',
# Block/unblock
'autoblockid' => 'Blocage automatique #$1',
-'block' => 'Bloquer l’utilisateur',
-'unblock' => 'Débloquer l’utilisateur',
-'blockip' => 'Bloquer l’utilisateur',
-'blockip-title' => 'Bloquer l’utilisateur',
-'blockip-legend' => 'Bloquer l’utilisateur',
+'block' => "Bloquer l'utilisateur",
+'unblock' => "Débloquer l'utilisateur",
+'blockip' => "Bloquer l'utilisateur",
+'blockip-title' => "Bloquer l'utilisateur",
+'blockip-legend' => "Bloquer l'utilisateur",
'blockiptext' => 'Utilisez le formulaire ci-dessous pour bloquer l’accès aux modifications faites à partir d’une adresse IP spécifique ou d’un nom d’utilisateur.
Une telle mesure ne devrait être prise que pour prévenir le vandalisme et en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].
Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont été vandalisées).',
-'ipadressorusername' => 'Adresse IP ou nom d’utilisateur :',
+'ipadressorusername' => "Adresse IP ou nom d'utilisateur :",
'ipbexpiry' => 'Durée avant expiration :',
'ipbreason' => 'Motif :',
'ipbreasonotherlist' => 'Autre motif',
'emailblock' => 'courriel bloqué',
'blocklist-nousertalk' => 'ne peut modifier sa propre page de discussion',
'ipblocklist-empty' => 'La liste des adresses IP bloquées est actuellement vide.',
-'ipblocklist-no-results' => 'L’adresse IP ou l’utilisateur demandé n’est pas bloqué.',
+'ipblocklist-no-results' => "L'adresse IP ou l'utilisateur demandé n'est pas bloqué.",
'blocklink' => 'bloquer',
'unblocklink' => 'débloquer',
'change-blocklink' => 'modifier le blocage',
# Attribution
'anonymous' => '{{PLURAL:$1|Utilisateur non enregistré|Utilisateurs non enregistrés}} sur {{SITENAME}}',
-'siteuser' => '{{GENDER:$2|l’utilisateur|l’utilisatrice|l’utilisateur}} $1 de {{SITENAME}}',
-'anonuser' => 'l’utilisateur anonyme $1 de {{SITENAME}}',
+'siteuser' => "{{GENDER:$2|l'utilisateur|l'utilisatrice|l'utilisateur}} $1 de {{SITENAME}}",
+'anonuser' => "l'utilisateur anonyme $1 de {{SITENAME}}",
'lastmodifiedatby' => 'Cette page a été modifiée pour la dernière fois le $1 à $2 par $3.',
'othercontribs' => 'Basé sur le travail de $1.',
'others' => 'autres',
# Info page
'pageinfo-title' => 'Informations pour « $1 »',
+'pageinfo-not-current' => 'Les informations peuvent uniquement être affichées pour la révision en cours.',
'pageinfo-header-basic' => 'Informations de base',
'pageinfo-header-edits' => 'Historique des modifications',
'pageinfo-header-restrictions' => 'Protection de la page',
* <span class="mw-specialpagecached">Pages spéciales seulement en cache (pourraient être désuètes).</span>',
'specialpages-group-maintenance' => 'Rapports de maintenance',
'specialpages-group-other' => 'Autres pages spéciales',
-'specialpages-group-login' => 'S’identifier / s’inscrire',
+'specialpages-group-login' => "S'identifier / s'inscrire",
'specialpages-group-changes' => 'Modifications récentes et journaux',
'specialpages-group-media' => 'Rapports et import de fichiers médias',
'specialpages-group-users' => 'Utilisateurs et droits rattachés',
'qbbrowse' => 'Fâre dèfelar',
'qbedit' => 'Changiér',
'qbpageoptions' => 'Ceta pâge',
-'qbpageinfo' => 'Contèxto',
'qbmyoptions' => 'Mes pâges',
'qbspecialpages' => 'Pâges spèciâles',
'faq' => 'Quèstions sovent posâyes',
'qbbrowse' => 'Bleese',
'qbedit' => 'Änre',
'qbpageoptions' => 'Jüdeer sid',
-'qbpageinfo' => 'Sidedoote',
'qbmyoptions' => 'Min side',
'qbspecialpages' => 'Spetsjåålside',
'faq' => 'FAQ',
'qbbrowse' => '查看',
'qbedit' => '编写',
'qbpageoptions' => '个页',
-'qbpageinfo' => '个页信息',
'qbmyoptions' => '偶𠮶选项',
'qbspecialpages' => '特殊页',
'faq' => 'FAQ',
'qbbrowse' => '查看',
'qbedit' => '編寫',
'qbpageoptions' => '箇頁',
-'qbpageinfo' => '箇頁信息',
'qbmyoptions' => '我嗰頁面',
'qbspecialpages' => '特殊頁',
'faq' => 'FAQ',
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'As miñas páxinas',
'qbspecialpages' => 'Páxinas especiais',
'faq' => 'Preguntas máis frecuentes',
'shared-repo-from' => 'de $1',
'shared-repo' => 'repositorio compartido',
'filepage.css' => '/** O CSS que se coloque aquí será incluído na páxina de descrición do ficheiro, así como nos wikis de clientes estranxeiros */',
-'upload-disallowed-here' => 'Por desgraza, non pode sobrescribir esta imaxe.',
+'upload-disallowed-here' => 'Non pode sobrescribir este ficheiro.',
# File reversion
'filerevert' => 'Reverter $1',
# Info page
'pageinfo-title' => 'Información sobre "$1"',
+'pageinfo-not-current' => 'Unicamente se pode mostrar a información sobre a revisión actual.',
'pageinfo-header-basic' => 'Información básica',
'pageinfo-header-edits' => 'Historial de edicións',
'pageinfo-header-restrictions' => 'Protección da páxina',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría agochada|Categorías agochadas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Modelo incluído|Modelos incluídos}} ($1)',
'pageinfo-toolboxlink' => 'Información da páxina',
+'pageinfo-redirectsto' => 'Redirixe cara a',
+'pageinfo-redirectsto-info' => 'información',
+'pageinfo-contentpage' => 'Cóntase como páxina de contido',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protección en serie activada',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protección en serie activada',
# Skin names
'skinname-standard' => 'Clásica',
'qbbrowse' => 'Ἀλάου',
'qbedit' => 'Μεταγράφειν',
'qbpageoptions' => 'Ἥδε ἡ δέλτος',
-'qbpageinfo' => 'Συγκείμενον',
'qbmyoptions' => 'Οἱ δέλτοι μου',
'qbspecialpages' => 'Εἰδικαὶ δέλτοι',
'faq' => 'Τὰ πολλάκις αἰτηθέντα',
'qbbrowse' => 'Blättre',
'qbedit' => 'Ändere',
'qbpageoptions' => 'Sytenoptione',
-'qbpageinfo' => 'Sytedate',
'qbmyoptions' => 'Ystellige',
'qbspecialpages' => 'Spezialsytene',
'faq' => 'Froge, wo vilmol gstellt wäre',
'qbbrowse' => 'બ્રાઉઝ',
'qbedit' => 'ફેરફાર કરો',
'qbpageoptions' => 'આ પાનું',
-'qbpageinfo' => 'સંદર્ભ',
'qbmyoptions' => 'મારાં પાનાં',
'qbspecialpages' => 'ખાસ પાનાં',
'faq' => 'FAQ
'youhavenewmessages' => 'તમારા માટે $1 ($2).',
'newmessageslink' => 'નવીન સંદેશ',
'newmessagesdifflink' => 'છેલ્લો ફેરફાર',
+'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્યના|$3 અન્ય સભ્યોના}} $1 છે. ($2).',
+'youhavenewmessagesmanyusers' => 'આપને માટે $1 છે. ($2)',
'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશ|નવાં સંદેશાઓ}}',
'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
'protectedpagetext' => 'ફેરફારો થતાં રોકવા માટે આ પાનું સુરક્ષિત કરવામાં આવ્યું છે.',
'viewsourcetext' => 'આપ આ પાનાનો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:',
'viewyourtext' => "આપ આ પાનાનાં '''આપનાં સંપાદનો'''નો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:",
-'protectedinterface' => 'આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.',
+'protectedinterface' => 'આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.
+બધાંજ વિકિ માટે ભાષાંતર ઉમેરવા કે બદલવા માટે, કૃપા કરી [//translatewiki.net/ translatewiki.net], મિડિયાવિકિ સ્થાનિયકરણ પ્રકલ્પ, વાપરો.',
'editinginterface' => "'''ચેતવણી:''' તમે જે પાનામાં ફેરફાર કરી રહ્યા છો તે પાનું સોફ્ટવેર માટે ઇન્ટરફેસ ટેક્સટ પુરી પાડે છે.
-àª\85હà«\80àª\82નà«\8b બદલાવ બà«\80àª\9cા સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
-àªàª¾àª·àª¾àª\82તર àª\95રવા માàª\9fà«\87 àª\95à«\83પા àª\95રà«\80 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] -- મિડિયાવિàª\95à«\80 લà«\8bàª\95લાàª\87àª\9dà«\87શન પà«\8dરàª\95લà«\8dપ વાપરો.",
+àª\85હà«\80àª\82નà«\8b બદલાવ àª\86 વિàª\95િ પર àª\89પસà«\8dથિત àª\85નà«\8dય સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
+બધાàª\82àª\9c વિàª\95િ માàª\9fà«\87 àªàª¾àª·àª¾àª\82તર àª\89મà«\87રવા àª\95à«\87 બદલવા માàª\9fà«\87 àª\95à«\83પા àª\95રà«\80 [//translatewiki.net/ translatewiki.net], મિડિયાવિàª\95à«\80 સà«\8dથાનિયàª\95રણ પà«\8dરàª\95લà«\8dપ, વાપરો.",
'sqlhidden' => '(છુપી SQL ક્વેરી)',
'cascadeprotected' => 'આ પાના પર ફેરફાર પ્રતિબંધિત છે કેમ કે આ પાનું {{PLURAL:$1|એવું પાનું|એવા પાના}} માં શામિલ છે જેમાં અનુવર્તી (પગથિયામય)સંરક્ષણ સક્રીય છે :
$2',
તે પહેલેથી હાજર છે.',
'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
+# Content models
+'content-model-wikitext' => 'વિકિલખાણ',
+'content-model-text' => 'સાદું લખાણ',
+'content-model-javascript' => 'જાવાસ્ક્રિપ્ટ',
+
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ચેતવણી:''' આ પાનું ખૂબ ખર્ચાળ પદચ્છેદ સૂત્ર ધરાવે છે.
'timezoneregion-indian' => 'હિંદ મહાસાગર',
'timezoneregion-pacific' => 'પ્રશાંત મહાસાગર',
'allowemail' => 'અન્ય સભ્યો તરફથી આવતા ઇ-મેલને પરવાનગી આપો',
-'prefs-searchoptions' => 'શોધ વિકલ્પો',
+'prefs-searchoptions' => 'શોધો',
'prefs-namespaces' => 'નામ અવકાશો',
'defaultns' => 'અન્યથા આ નામ અવકાશ માં શોધો',
'default' => 'મૂળ વિકલ્પ',
'undeletedrevisions' => '{{PLURAL:$1|૧ સંપાદન|$1 સંપાદનો}} પુન સ્થાપિત કરાયા',
'undeletedrevisions-files' => '{{PLURAL:$1|1 ફેરફાર|$1 ફેરફારો}} અને {{PLURAL:$2|1 ફાઈલા|$2 ફાઈલો}} પુનઃસ્થાપિત',
'undeletedfiles' => '{{PLURAL:$1|1 ફાઇલ|$1 ફાઇલો}} પુનઃસ્થાપિત',
-'cannotundelete' => 'પુનર્જીવિત કરવાનું કાર્ય અસફળ;
-કોઇકે આ પાનાને પહેલેથી પુનર્જીવિત કર્યું હોઈ શકે.',
+'cannotundelete' => 'પુનર્જીવિત કરવાનું કાર્ય અસફળ:
+$1',
'undeletedpage' => "'''$1 પુનઃસ્થાપિત કરાયા'''
તાજેતરમાં હટાવેલા કે પુનઃસ્થાપિત થયેલા ફેરફારની નોંધ નો સંદર્ભ અહીં ઉપ્લબ્ધ [[Special:Log/delete|deletion log]].",
'qbbrowse' => 'Chhà-khon',
'qbedit' => 'Phiên-siá',
'qbpageoptions' => 'Vùn-chông sién-hong',
-'qbpageinfo' => 'Vùn-chông chṳ̂-liau',
'qbmyoptions' => 'Ngô-ke sién-hong',
'qbspecialpages' => 'Thi̍t-sû hong-mien',
'faq' => 'Sòng-kien mun-thì kié-tap',
'qbbrowse' => 'דפדוף',
'qbedit' => 'עריכה',
'qbpageoptions' => 'אפשרויות דף',
-'qbpageinfo' => 'מידע על הדף',
'qbmyoptions' => 'האפשרויות שלי',
'qbspecialpages' => 'דפים מיוחדים',
'faq' => 'שאלות ותשובות',
'acct_creation_throttle_hit' => 'מבקרים באתר זה דרך כתובת ה־IP שלכם כבר יצרו {{PLURAL:$1|חשבון אחד|$1 חשבונות}} ביום האחרון. זהו המקסימום המותר בתקופה זו.
לפיכך, מבקרים דרך כתובת ה־IP הזו לא יכולים ליצור חשבונות נוספים ברגע זה.',
'emailauthenticated' => 'כתובת הדוא"ל שלך אומתה ב־$3, $2.',
-'emailnotauthenticated' => 'כתובת הדוא"ל שלכם <strong>עדיין לא אושרה</strong> - שירותי הדוא"ל הבאים אינם פעילים.',
+'emailnotauthenticated' => 'כתובת הדוא"ל שלכם עדיין לא אושרה.
+לא יישלח אליכם דוא"ל עבור אף אחת מהאפשרויות הבאות.',
'noemailprefs' => 'אנא ציינו כתובת דוא"ל בהעדפות שלכם כדי שתכונות אלה יעבדו.',
'emailconfirmlink' => 'אישור כתובת הדוא"ל שלך',
'invalidemailaddress' => 'כתובת הדוא"ל אינה מתקבלת כיוון שנראה שהיא בפורמט לא נכון.
'shared-repo' => 'מקום איחסון משותף',
'shared-repo-name-wikimediacommons' => 'ויקישיתוף',
'filepage.css' => '/* הסגנונות הנכתבים כאן יוכללו בדף תיאור הקובץ, כולל באתרי ויקי זרים */',
-'upload-disallowed-here' => '×\9c×\9eר×\91×\94 ×\94צער, ×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 ×\9c×\94×¢×\9c×\95ת ×\92רס×\94 ×\90×\97רת ש×\9c ×\94ת×\9e×\95× ×\94 ×\94×\96×\90ת.',
+'upload-disallowed-here' => '×\90×\99×\9f ×\91×\90פשר×\95ת×\9b×\9d ×\9c×\93ר×\95ס ×\90ת ×\94ק×\95×\91×¥ ×\94×\96×\94.',
# File reversion
'filerevert' => 'שחזור $1',
'emailuser-title-notarget' => 'שליחת דוא"ל למשתמש',
'emailpage' => 'שליחת דואר למשתמש',
'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני למשתמש זה.
-×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ש×\9bת×\91ת×\9d ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ש×\9c×\9b×\9d]] ת×\95פ×\99×¢ ×\9b×\9bת×\95×\91ת ×\9e×\9e× ×\94 × ×©×\9c×\97×\94 ×\94×\94×\95×\93×¢×\94, ×\9b×\93×\99 ×\9c×\90פשר ת×\92×\95×\91×\94 ×\99ש×\99ר×\94 ×\9c×\9e×\9bת×\91.',
+×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ש×\9bת×\91ת×\9d ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ש×\9c×\9b×\9d]] ת×\95פ×\99×¢ ×\9b×\9bת×\95×\91ת ש×\94×\94×\95×\93×¢×\94 × ×©×\9c×\97×\94 ×\9e×\9e× ×\94, ×\9b×\93×\99 ×\9c×\90פשר ת×\92×\95×\91×\94 ×\99ש×\99ר×\94.',
'usermailererror' => 'אובייקט הדואר החזיר שגיאה:',
'defemailsubject' => 'דוא"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש "$1"',
'usermaildisabled' => 'שליחת דוא"ל למשתמשים מבוטלת',
# Info page
'pageinfo-title' => 'מידע על "$1"',
+'pageinfo-not-current' => 'המידע יכול להיות מוצג רק עבור הגרסה הנוכחית.',
'pageinfo-header-basic' => 'מידע בסיסי',
'pageinfo-header-edits' => 'היסטוריית עריכות',
'pageinfo-header-restrictions' => 'הגנה על הדף',
'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות}} ($1)',
'pageinfo-toolboxlink' => 'מידע על הדף',
+'pageinfo-redirectsto' => 'מפנה אל',
+'pageinfo-redirectsto-info' => 'מידע',
+'pageinfo-contentpage' => 'נספר כדף תוכן',
+'pageinfo-contentpage-yes' => 'כן',
+'pageinfo-protect-cascading' => 'מופעלת הגנה מדורגת מכאן',
+'pageinfo-protect-cascading-yes' => 'כן',
+'pageinfo-protect-cascading-from' => 'דף זה מוגן בגלל הגנה מדורגת על',
# Skin names
'skinname-standard' => 'קלאסי',
'qbbrowse' => 'ब्राउज़',
'qbedit' => 'बदलें',
'qbpageoptions' => 'यह पृष्ठ',
-'qbpageinfo' => 'पृष्ठ जानकारी',
'qbmyoptions' => 'मेरे पृष्ठ',
'qbspecialpages' => 'विशेष पृष्ठ',
'faq' => 'बहुधा पूछित प्रश्न',
'qbbrowse' => 'Browse karo',
'qbedit' => 'Badlo',
'qbpageoptions' => 'Ii panna',
-'qbpageinfo' => 'Vishay',
'qbmyoptions' => 'Hamar panna',
'qbspecialpages' => 'Khaas panna',
'faq' => 'Sab time puchhe waala sawal',
'qbbrowse' => 'Pregledaj',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'O stranici',
'qbmyoptions' => 'Moje stranice',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'Najčešća pitanja',
'qbbrowse' => 'Přepytować',
'qbedit' => 'Wobdźěłać',
'qbpageoptions' => 'Tuta strona',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Moje strony',
'qbspecialpages' => 'Specialne strony',
'faq' => 'Husto stajene prašenja (FAQ)',
'uploadnewversion-linktext' => 'nowu wersiju tuteje dataje nahrać',
'shared-repo-from' => 'z $1',
'shared-repo' => 'zhromadny repozitorij',
-'upload-disallowed-here' => 'Bohužel njemóžeš tutón wobraz přepisać.',
+'upload-disallowed-here' => 'Njemóžeš tutu dataju přepisać.',
# File reversion
'filerevert' => 'Wersiju $1 cofnyć',
# Info page
'pageinfo-title' => 'Informacije za stronu "$1"',
+'pageinfo-not-current' => 'Informacije hodźa so jenož za aktualnu wersiju zwobraznić.',
'pageinfo-header-basic' => 'Zakładne informacije',
'pageinfo-header-edits' => 'Stawizny wobdźěłać',
'pageinfo-header-restrictions' => 'Škit strony',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Zapřijata předłoha|Zapřijatej předłoze|Zapřijate předłohi|Zapřijate předłohi}} ($1)',
'pageinfo-toolboxlink' => 'Informacije wo stronje',
+'pageinfo-redirectsto' => 'Sposrědkuje k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'Liči so jako wobsahowa strona',
+'pageinfo-contentpage-yes' => 'Haj',
+'pageinfo-protect-cascading' => 'Kaskadowy škit wottud',
+'pageinfo-protect-cascading-yes' => 'Haj',
+'pageinfo-protect-cascading-from' => 'Kaskadowy škit wot',
# Skin names
'skinname-standard' => 'Klasiski',
'qbbrowse' => 'Böngészés',
'qbedit' => 'Szerkesztés',
'qbpageoptions' => 'Lapbeállítások',
-'qbpageinfo' => 'Lapinformáció',
'qbmyoptions' => 'Lapjaim',
'qbspecialpages' => 'Speciális lapok',
'faq' => 'GyIK',
'qbbrowse' => 'Թերթել',
'qbedit' => 'Խմբագրել',
'qbpageoptions' => 'Այս էջը',
-'qbpageinfo' => 'Հոդվածի մասին',
'qbmyoptions' => 'Իմ էջերը',
'qbspecialpages' => 'Սպասարկող էջեր',
'faq' => 'ՀՏՀ',
'qbbrowse' => 'Foliar',
'qbedit' => 'Modificar',
'qbpageoptions' => 'Iste pagina',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Mi paginas',
'qbspecialpages' => 'Paginas special',
'faq' => 'FAQ',
Tu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente],
o [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificar iste pagina]</span>.',
-'noarticletext-nopermission' => 'Al momento il non ha texto in iste pagina.
+'noarticletext-nopermission' => 'In iste momento il non ha texto in iste pagina.
Tu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,
-o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente].</span>',
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente], ma tu non ha le permission de crear iste pagina.</span>',
'missing-revision' => 'Le version №$1 del pagina nominate "{{PAGENAME}}" non existe.
Isto es generalmente causate per sequer un ligamine de historia obsolete a un pagina que ha essite delite.
Illo existe ja.',
'defaultmessagetext' => 'Texto predefinite del message',
'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
+'invalid-content-data' => 'Datos de contento invalide',
+'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexto',
+'content-model-text' => 'texto simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.
'revdelete-only-restricted' => 'Error de celar le entrata del $1 a $2: tu non pote render entratas invisibile a administratores sin seliger tamben un del altere optiones de visibilitate.',
'revdelete-reason-dropdown' => '*Motivos commun pro deletion
** Violation de copyright
-** Information personal inappropriate',
+** Information personal o commento inappropriate
+** Nomine de usator inappropriate
+** Information que pote esser diffamatori',
'revdelete-otherreason' => 'Altere/additional motivo:',
'revdelete-reasonotherlist' => 'Altere motivo',
'revdelete-edit-reasonlist' => 'Modificar motivos pro deletion',
'timezoneregion-indian' => 'Oceano Indian',
'timezoneregion-pacific' => 'Oceano Pacific',
'allowemail' => 'Activar reception de e-mail de altere usatores',
-'prefs-searchoptions' => 'Optiones de recerca',
+'prefs-searchoptions' => 'Recerca',
'prefs-namespaces' => 'Spatios de nomines',
'defaultns' => 'Alteremente cercar in iste spatios de nomines:',
'default' => 'predefinite',
'backend-fail-internal' => 'Un error incognite occurreva in le systema de immagazinage "$1".',
'backend-fail-contenttype' => 'Non poteva determinar le typo de contento del file a immagazinar in "$1".',
'backend-fail-batchsize' => 'Le systema de immagazinage ha recipite un lot de $1 {{PLURAL:$1|operation|operationes}} de file; le limite es $2 {{PLURAL:$2|operation|operationes}}.',
-'backend-fail-usable' => 'Non poteva scriber le file $1 a causa de permissiones insufficiente o directorios/contentores mancante.',
+'backend-fail-usable' => 'Non poteva leger o scriber le file "$1" a causa de permissiones insufficiente o directorios/contentores mancante.',
# File journal errors
'filejournal-fail-dbconnect' => 'Non poteva connecter al base de datos de jornal pro le systema de immagazinage "$1".',
'uploadnewversion-linktext' => 'Incargar un nove version de iste file',
'shared-repo-from' => 'ab $1',
'shared-repo' => 'un repositorio partite',
-'upload-disallowed-here' => 'Infortunatemente tu non pote superscriber iste imagine.',
+'upload-disallowed-here' => 'Tu non pote superscriber iste file.',
# File reversion
'filerevert' => 'Reverter $1',
'undeletedrevisions' => '{{PLURAL:$1|1 version|$1 versiones}} restaurate',
'undeletedrevisions-files' => '{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate',
'undeletedfiles' => '$1 {{PLURAL:$1|archivo|archivos}} restaurate',
-'cannotundelete' => 'Le restauration ha fallite;
-es possibile que un altere persona ha ja restaurate le pagina.',
+'cannotundelete' => 'Le restauration ha fallite:
+$1',
'undeletedpage' => "'''$1 ha essite restaurate'''
Consulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
'immobile-target-namespace-iw' => 'Un ligamine interwiki non es un destination valide pro le renomination de un pagina.',
'immobile-source-page' => 'Iste pagina non es renominabile.',
'immobile-target-page' => 'Non pote renominar a iste titulo de destination.',
+'bad-target-model' => 'Le destination desirate usa un altere modello de contento. Non es possibile converter de $1 a $2.',
'imagenocrossnamespace' => 'Impossibile renominar un file verso un spatio de nomines non-file',
'nonfile-cannot-move-to-file' => 'Impossibile renominar un non-file verso le spatio de nomines file',
'imagetypemismatch' => 'Le nove extension del nomine del file non corresponde al typo del file',
# Info page
'pageinfo-title' => 'Informationes pro "$1"',
+'pageinfo-not-current' => 'Information pote esser monstrate solmente pro le version actual.',
'pageinfo-header-basic' => 'Information de base',
'pageinfo-header-edits' => 'Historia de modificationes',
'pageinfo-header-restrictions' => 'Protection del pagina',
'pageinfo-magic-words' => '{{PLURAL:$1|Parola|Parolas}} magic ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria|Categorias}} celate ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Patrono|Patronos}} transcludite ($1)',
+'pageinfo-toolboxlink' => 'Information sur le pagina',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Contate como pagina de contento',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protection in cascada a partir de hic',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protection in cascada a partir de',
# Skin names
'skinname-standard' => 'Classic',
# Scary transclusion
'scarytranscludedisabled' => '[Le transclusion interwiki es disactivate]',
'scarytranscludefailed' => '[Falleva de obtener le patrono pro $1]',
+'scarytranscludefailed-httpstatus' => '[Obtention de patrono fallite pro $1: HTTP $2]',
'scarytranscludetoolong' => '[URL es troppo longe]',
# Delete conflict
'qbbrowse' => 'Navigasi',
'qbedit' => 'Sunting',
'qbpageoptions' => 'Halaman ini',
-'qbpageinfo' => 'Konteks halaman',
'qbmyoptions' => 'Halaman saya',
'qbspecialpages' => 'Halaman istimewa',
'faq' => 'FAQ',
'qbbrowse' => 'Agbasabasa',
'qbedit' => 'Urnosen',
'qbpageoptions' => 'Daytoy a panid',
-'qbpageinfo' => 'Linaon',
'qbmyoptions' => 'Pampanidko',
'qbspecialpages' => 'Espesial a pampanid',
'faq' => 'FAQ',
'qbbrowse' => 'Flakka',
'qbedit' => 'Breyta',
'qbpageoptions' => 'Þessi síða',
-'qbpageinfo' => 'Samhengi',
'qbmyoptions' => 'Mínar síður',
'qbspecialpages' => 'Kerfissíður',
'faq' => 'Algengar spurningar',
'qbbrowse' => 'Sfoglia',
'qbedit' => 'Modifica',
'qbpageoptions' => 'Opzioni pagina',
-'qbpageinfo' => 'Informazioni sulla pagina',
'qbmyoptions' => 'Le mie pagine',
'qbspecialpages' => 'Pagine speciali',
'faq' => 'Domande frequenti',
'shared-repo-from' => 'da $1',
'shared-repo' => 'un archivio condiviso',
'filepage.css' => '/* Il CSS messo qui viene incluso nella pagina di descrizione del file, inclusa anche su wiki client esterni */',
-'upload-disallowed-here' => 'Impossibile sovrascrivere questa immagine.',
+'upload-disallowed-here' => 'Impossibile sovrascrivere questo file.',
# File reversion
'filerevert' => 'Ripristina $1',
# Info page
'pageinfo-title' => 'Informazioni per "$1"',
+'pageinfo-not-current' => 'Le informazioni possono essere visualizzate solo per la versione corrente.',
'pageinfo-header-basic' => 'Informazioni di base',
'pageinfo-header-edits' => 'Cronologia delle modifiche',
'pageinfo-header-restrictions' => 'Protezione della pagina',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria nascosta|Categorie nascoste}} ($1)',
'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}} ($1)',
'pageinfo-toolboxlink' => 'Informazioni sulla pagina',
+'pageinfo-redirectsto' => 'Reindirizza a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Conteggiata come una pagina di contenuto',
+'pageinfo-contentpage-yes' => 'Sì',
+'pageinfo-protect-cascading' => 'Protezione ricorsiva da qui',
+'pageinfo-protect-cascading-yes' => 'Sì',
+'pageinfo-protect-cascading-from' => 'Protezione ricorsiva ereditata da',
# Patrolling
'markaspatrolleddiff' => 'Segna la modifica come verificata',
'qbbrowse' => '閲覧',
'qbedit' => '編集',
'qbpageoptions' => 'このページについて',
-'qbpageinfo' => '関連情報',
'qbmyoptions' => '自分のページ',
'qbspecialpages' => '特別ページ',
'faq' => 'よくある質問と回答',
'nologin' => '登録がまだの場合、$1。',
'nologinlink' => 'アカウントを作成してください',
'createaccount' => 'アカウント作成',
-'gotaccount' => '既にアカウントを持っている場合、$1。',
+'gotaccount' => 'アカウントを既に持っている場合、$1。',
'gotaccountlink' => 'ログインしてください',
'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
'createaccountmail' => 'メールで送信',
'loginreqtitle' => 'ログインが必要',
'loginreqlink' => 'ログイン',
'loginreqpagetext' => '他のページを閲覧するには$1する必要があります。',
-'accmailtitle' => 'パスワードを送信しました。',
+'accmailtitle' => 'パスワードをお送りしました。',
'accmailtext' => "[[User talk:$1|$1]]のために無作為に生成したパスワードを、$2に送信しました。
この新アカウントのパスワードは、ログインした際に''[[Special:ChangePassword|パスワード変更]]''ページで変更できます。",
'edit-already-exists' => '新しいページを作成できませんでした。
そのページは既に存在しています。',
'defaultmessagetext' => '既定のメッセージ文',
-'content-failed-to-parse' => '$2 の本文を$1モデルとして構文解析できませんでした。',
+'content-failed-to-parse' => '$2 の本文を$1モデルとして構文解析できませんでした: $3',
'invalid-content-data' => '本文データが無効です',
'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
'revdelete-hide-comment' => '編集の要約を隠す',
'revdelete-hide-user' => '投稿者の利用者名またはIPを隠す',
'revdelete-hide-restricted' => '他の利用者と同様に管理者からもデータを隠す',
-'revdelete-radio-same' => '(変更しない)',
+'revdelete-radio-same' => '(変更しない)',
'revdelete-radio-set' => 'はい',
'revdelete-radio-unset' => 'いいえ',
'revdelete-suppress' => '他の利用者と同様に管理者からもデータを隠す',
'search-suggest' => 'もしかして:$1',
'search-interwiki-caption' => '姉妹プロジェクト',
'search-interwiki-default' => '$1の結果:',
-'search-interwiki-more' => '(続き)',
+'search-interwiki-more' => '(続き)',
'search-relatedarticle' => '関連',
'mwsuggest-disable' => 'Ajaxによる検索候補の提示を無効にする',
'searcheverything-enable' => 'すべての名前空間を検索',
'shared-repo' => '共有リポジトリ',
'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
-'upload-disallowed-here' => '残念ながらこの画像には上書きできません。',
+'upload-disallowed-here' => 'このファイルには上書きできません。',
# File reversion
'filerevert' => '$1を差し戻す',
'deadendpagestext' => '以下のページは、{{SITENAME}}の他のページにリンクしていません。',
'protectedpages' => '保護されているページ',
'protectedpages-indef' => '無期限保護のみ',
-'protectedpages-cascade' => '連続保護のみ',
+'protectedpages-cascade' => 'カスケード保護のみ',
'protectedpagestext' => '以下のページは移動や編集が禁止されています',
'protectedpagesempty' => '指定した条件で保護中のページは現在ありません。',
'protectedtitles' => '作成保護されているページ名',
'booksources-isbn' => 'ISBN:',
'booksources-go' => '検索',
'booksources-text' => 'お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:',
-'booksources-invalid-isbn' => '指定したISBN番号は有効ではないようです。情報源から写し間違えていないか確認してください。',
+'booksources-invalid-isbn' => '指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。',
# Special:Log
'specialloguserlabel' => '実行者:',
'protect-fallback' => '「$1」権限が必要',
'protect-level-autoconfirmed' => '新規利用者と匿名利用者を禁止',
'protect-level-sysop' => '管理者のみ',
-'protect-summary-cascade' => '連続',
+'protect-summary-cascade' => 'カスケード',
'protect-expiring' => '$1(UTC)で自動的に解除',
'protect-expiring-local' => '期限 $1',
'protect-expiry-indefinite' => '無期限',
# Namespace form on various pages
'namespace' => '名前空間:',
-'invert' => '名前空間の選択を反転',
+'invert' => '選択したものを除く',
'tooltip-invert' => '選択した名前空間 (チェックを入れている場合は、関連付けられた名前空間も含む) のページの変更を非表示にするには、このボックスにチェックを入れる',
'namespace_association' => '関連付けられた名前空間も含める',
'tooltip-namespace_association' => '選択した名前空間に関連付けられたトークページ (逆にトークページの名前空間を選択した場合も同様) の名前空間も含めるには、このボックスにチェックを入れる',
'ipb-blocklist' => '現在有効なブロックを表示',
'ipb-blocklist-contribs' => '$1の投稿の一覧',
'unblockip' => 'ブロックを解除',
-'unblockiptext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92使ç\94¨ã\81\97ã\81¦ã\80\81以å\89\8dã\83\96ã\83ã\83\83ã\82¯ã\81\97ã\81\9fIPã\82¢ã\83\89ã\83¬ã\82¹ã\81¾ã\81\9fã\81¯å\88©ç\94¨è\80\85ã\81\8bã\82\89ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\82¢ã\82¯ã\82»ã\82¹ã\82\92ã\83\96ã\83ã\83\83ã\82¯解除できます。',
+'unblockiptext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81§å\88©ç\94¨è\80\85ã\81¾ã\81\9fã\81¯IPã\82¢ã\83\89ã\83¬ã\82¹ã\81®ã\83\96ã\83ã\83\83ã\82¯ã\82\92解除できます。',
'ipusubmit' => 'このブロックを解除',
'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
'unblocked-range' => '$1のブロックは解除されています',
# Info page
'pageinfo-title' => '「$1」の情報',
+'pageinfo-not-current' => '現在のバージョンの情報のみが表示される可能性があります。',
'pageinfo-header-basic' => '基本情報',
'pageinfo-header-edits' => '編集履歴',
'pageinfo-header-restrictions' => 'ページの保護',
'pageinfo-hidden-categories' => '隠し{{PLURAL:$1|カテゴリ}} ($1)',
'pageinfo-templates' => '参照読み込みされた{{PLURAL:$1|テンプレート}} ($1)',
'pageinfo-toolboxlink' => 'ページ情報',
+'pageinfo-redirectsto' => '転送先',
+'pageinfo-redirectsto-info' => '情報',
+'pageinfo-contentpage' => '本文ページとして数える',
+'pageinfo-contentpage-yes' => 'はい',
+'pageinfo-protect-cascading' => 'カスケード保護されている',
+'pageinfo-protect-cascading-yes' => 'はい',
+'pageinfo-protect-cascading-from' => 'カスケード保護の起点',
# Skin names
'skinname-standard' => 'クラシック',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1、 $2 × $3',
+'seconds-abbrev' => '$1 s',
+'hours-abbrev' => '$1 h',
+'days-abbrev' => '$1 d',
'seconds' => '{{PLURAL:$1|$1 秒}}',
'minutes' => '{{PLURAL:$1|$1 分}}',
'hours' => '{{PLURAL:$1|$1 時間}}',
'qbbrowse' => 'Navigasi',
'qbedit' => 'Sunting',
'qbpageoptions' => 'Kaca iki',
-'qbpageinfo' => 'Kontèks kaca',
'qbmyoptions' => 'Opsiku',
'qbspecialpages' => 'Kaca-kaca astaméwa',
'faq' => 'FAQ (Pitakonan sing kerep diajokaké)',
'qbbrowse' => 'გადახედე',
'qbedit' => 'რედაქტირება',
'qbpageoptions' => 'ეს გვერდი',
-'qbpageinfo' => 'კონტექსტი',
'qbmyoptions' => 'ჩემი გვერდები',
'qbspecialpages' => 'სპეციალური გვერდები',
'faq' => 'ხშირი შეკითხვები',
'vector-action-protect' => 'დაცვა',
'vector-action-undelete' => 'აღდგენა',
'vector-action-unprotect' => 'დაცვის დონის შეცვლა',
-'vector-simplesearch-preference' => 'á\83«á\83\94á\83\91á\83\9cá\83\98á\83¡ á\83\92á\83\90á\83¤á\83\90á\83 á\83\97á\83\9dá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\9bá\83\98á\83\9cá\83\98á\83¨á\83\9cá\83\94á\83\91á\83\94á\83\91ის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
+'vector-simplesearch-preference' => 'á\83«á\83\94á\83\91á\83\9cá\83\98á\83¡ á\83\92á\83\90á\83¤á\83\90á\83 á\83\97á\83\9dá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\95á\83\94á\83\9aის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
'vector-view-create' => 'შექმნა',
'vector-view-edit' => 'რედაქტირება',
'vector-view-history' => 'ისტორია',
'edit-already-exists' => 'ახალი გვერდის შექმნა არ მოხერხდა.
ის უკვე არსებობს.',
'defaultmessagetext' => 'შეტყობინების სტანდარტული ტექსტი',
+'content-failed-to-parse' => '$2-ის შინაარსი არ შეესაბამება $1-ის ტიპს: $3.',
+'invalid-content-data' => 'დაუშვებელი მონაცემები',
+'content-not-allowed-here' => '„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე',
# Content models
'content-model-wikitext' => 'ვიკიტექსტი',
'shared-repo-from' => ' $1-დან',
'shared-repo' => 'საერთო საცავიდან',
'shared-repo-name-wikimediacommons' => 'ვიკისაწყობი',
-'upload-disallowed-here' => 'á\83¡á\83\90á\83\9bá\83¬á\83£á\83®á\83\90á\83 á\83\9dá\83\93, á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83 á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83¡á\83£á\83 á\83\90á\83\97ზე გადაწერა.',
+'upload-disallowed-here' => 'á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83 á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83¤á\83\90á\83\98á\83\9aზე გადაწერა.',
# File reversion
'filerevert' => 'დააბრუნე $1',
'immobile-target-namespace-iw' => 'ინტერვიკის ბმული შეუძლებელია გამოყენებული იქნას გადარქმევისთვის.',
'immobile-source-page' => 'ამ გვეერდის გადატანა შეუძლებელია.',
'immobile-target-page' => 'შეუძლებელია მოცემულ სახელზე გადატანა.',
+'bad-target-model' => 'შეუძლებელია $1-ის გარდაქმნა $2-ზე: მონაცემების შეუსაბამო მოდელი.',
'imagenocrossnamespace' => 'შეუძლებელია ფაილს მიეცეს სახელი სახელთა სხვა სივრციდან',
'nonfile-cannot-move-to-file' => 'შეუძლებელია არაფაილების გადატანა ფაილის სახელთა სივრცეში',
'imagetypemismatch' => 'ფაილს ახალი გაფართოება არ შეესაბამება მის ტიპს',
# Info page
'pageinfo-title' => 'ინფორმაცია „$1“-თვის',
+'pageinfo-not-current' => 'მონაცემები წარმოდგენილია მხოლოდ მიმდინარე რედაქტირებისათვის.',
'pageinfo-header-basic' => 'საბაზისო ინფორმაცია',
'pageinfo-header-edits' => 'რედაქტირების ისტორია',
'pageinfo-header-restrictions' => 'გვერდის დაცვა',
# Scary transclusion
'scarytranscludedisabled' => '[«Interwiki transcluding» გათიშულია]',
'scarytranscludefailed' => '[$1-თან დაკავშირების შეცდომა]',
+'scarytranscludefailed-httpstatus' => '[ვერ მოხერხდა თარგის ჩატვირთვა $1-თვის: HTTP $2]',
'scarytranscludetoolong' => '[URL ძალიან გრძელია]',
# Delete conflict
* @author Azwaw
* @author Mmistmurt
* @author MoubarikBelkasim
+ * @author Salem333
* @author Teak
* @author Urhixidur
*/
'qbbrowse' => 'Ẓer isebtar',
'qbedit' => 'Beddel',
'qbpageoptions' => 'Asebter-agi',
-'qbpageinfo' => 'Asatal',
'qbmyoptions' => 'isebtar inu',
'qbspecialpages' => 'isebtar usligen',
'faq' => 'Isteqsiyen',
'edit-already-exists' => 'Asebter amaynut ur d yesnufu ara.
Yella yakan.',
'defaultmessagetext' => 'Izen s lexṣas',
+'content-failed-to-parse' => 'Tasleṭ n ugbur n $2 i talɣa $1 texseṛ : $3',
+'invalid-content-data' => 'Isefka n ugbur ur ɣbelen ara',
+'content-not-allowed-here' => 'Agbur "$1" ur yesɛa ara turagt ɣef usebter [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiaḍris',
+'content-model-text' => 'aḍris afraray',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Ɣur-wet :''' Asebter agi yesɛa aṭas n tiɣriwin ar tiseɣnin ɣlayen n umsisleḍ taseddast.
'prefs-labs' => 'Tiseɣnin « labs »',
'prefs-user-pages' => 'Isebtar n useqdac',
'prefs-personal' => 'Profile n wemseqdac',
-'prefs-rc' => 'Ibeddlen imaynuten',
+'prefs-rc' => 'Ibeddilen imaynuten',
'prefs-watchlist' => 'Umuɣ n uɛessi',
'prefs-watchlist-days' => 'Amḍan n ussan i ubeqqeḍ deg umuɣ n uɛassi :',
'prefs-watchlist-days-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
'right-upload_by_url' => 'Kter afaylu seg tansa URL',
'right-purge' => 'Senger tazarkatut n isebtar war asuter n uragag',
'right-autoconfirmed' => 'Beddel isebtar azinsegdelen',
+'right-bot' => 'Ad yilli yesniret am ukala yeswurmen',
'right-nominornewtalk' => 'Ur ndeḥ ara tazmilt n inzan imaynuten ma neseqdac abeddel amectuḥ ɣef usebtar n umeslay n yiwen useqdac',
'right-apihighlimits' => 'Seqdec tilisa tid ɛlayen deg tuttriwin API',
'right-writeapi' => 'Seqdec API n ubeddel',
'right-deletedtext' => 'Ẓeṛ aḍris yemḥan d timeẓliwin gar ileqman yemḥan',
'right-browsearchive' => 'Nadi ɣef isebtar yettumḥan',
'right-undelete' => 'Erred asebter yemḥan',
+'right-suppressrevision' => 'Ssekyed dɣa erred ileqman yefren i inedbalen',
'right-suppressionlog' => 'Ẓeṛ iɣmisen usligen',
'right-block' => 'Kyef deg tira iseqdacen nniḍen',
'right-blockemail' => 'Sḍiqqef aceggaɛ n tira (e-mail) i yiwen useqdac',
'right-hideuser' => 'Kyef aseqdac s tuffra n isem-is ar udem n uzayez',
+'right-ipblock-exempt' => 'Zizdew tansiwin IP yekyefen, ikyafen iwurmanen d ikyafen n tagrummiwin IP',
+'right-proxyunbannable' => 'Zizdew ikyafen iwurmanen n iqeddacen proxy',
+'right-unblockself' => 'Ad ekkesen akyaf imanen nsen',
'right-protect' => 'Beddel aswir n umesten n isebtar dɣa beddel isebtar i gdelen',
'right-editprotected' => 'Beddel isebtar i gdelen (war asegdel s uceṛcuṛ)',
'right-editinterface' => 'Beddel agrudem n useqdac',
'right-editusercssjs' => 'Beddel ifuyla CSS d JavaScript n iseqdacen nniḍen',
'right-editusercss' => 'Beddel ifuyla CSS n iseqdacen nniḍen',
'right-edituserjs' => 'Beddel ifuyla JavaScript n iseqdacen nniḍen',
+'right-rollback' => 'Ekkes s urured ibeddilen n umedraw aneggaru deg yiwen asebter',
+'right-markbotedits' => 'Creḍ ibeddilen yetwekkesen am aken d aṛubut i tni beddelen.',
+'right-noratelimit' => 'Ur i tilli ara yeswaɣ sɣur tilisa n utug',
'right-import' => 'Kter ifuyla seg iWikiyen nniḍen',
'right-importupload' => 'Azen isebtar seg ufaylu',
+'right-patrol' => 'Creḍ ibeddilen n wiyaḍ nniḍen am aken selkenen',
+'right-autopatrol' => 'Ad i sɛu ibeddilen is creḍen s uwurman am aken ɛessan',
+'right-patrolmarks' => 'Ẓeṛ ticraḍ n uɛassi deg ibeddilen imaynuten',
'right-unwatchedpages' => 'Ẓeṛ umuɣ n isebtar ur sɛan ara iɛssasen',
'right-mergehistory' => 'Sdukel amezruy n isebtar',
'right-userrights' => 'Beddel akkw izerfan n yiwen aseqdac',
'right-userrights-interwiki' => 'Beddel izerfan n iseqdacen yellan deg awiki nniḍen',
'right-siteadmin' => 'Sekkweṛ naɣ kkes aseḍru i taffa n isefka',
+'right-override-export-depth' => 'Sifeḍ isebtar akkw d isebtar iqqenen alama tadrut n 5 iswiren',
'right-sendemail' => 'Ceggaɛ tirawt i iseqdacen nniḍen',
+'right-passwordreset' => 'Ẓeṛ tira n uwennez n awalen uɛaddi',
# User rights log
'rightslog' => 'Aɣmis n yizerfan n wemseqdac',
'rightslogtext' => 'Wagi d aɣmis n yibeddlen n yizerfan n wemseqdac',
'rightslogentry' => 'Yettubeddel izerfan n wemseqdac $1 seg $2 ar $3',
+'rightslogentry-autopromote' => 'yesnerna s uwurman seg $2 ar $3',
'rightsnone' => '(ulaḥedd)',
# Associated actions - in the sentence "You do not have permission to X"
'action-movefile' => 'beddel isem n ufaylu agi',
'action-upload' => 'Azen afaylu agi',
'action-reupload' => 'Sefxes afaylu yellan',
+'action-reupload-shared' => 'fel deg udigan afaylu agi yellan ɣef azadur azduklan',
'action-upload_by_url' => 'Azen afaylu agi seg tansa URL',
'action-writeapi' => 'seqdec API n tira',
'action-delete' => 'mḥu asebter-agi',
'action-deletedhistory' => 'ẓeṛ amezruy yemḥan n usebter agi',
'action-browsearchive' => 'nadi ɣef isebtar yettumḥan',
'action-undelete' => 'erred asebter agi',
+'action-suppressrevision' => 'sekyed dɣa uɣaled ar lqem agi yetwekkesen',
'action-suppressionlog' => 'ẓeṛ aɣmis agi uslig',
'action-block' => 'Kyef deg tira aseqdac agi',
'action-protect' => 'beddel iswiren n umesten i usebter agi',
+'action-rollback' => 'ekkes s urured ibeddilen n umedraw aneggaru yebeddelen yiwen usebter',
'action-import' => 'Kter asebter agi seg wiki nniḍen',
'action-importupload' => 'Kter asebter agi seg ufaylu n wezdam (upload)',
+'action-patrol' => 'Creḍ abeddel n wiyaḍ nniḍen am aken tesɛa tacaggart',
+'action-autopatrol' => 'ad sɛuḍ tacaggart i ubeddil ik',
'action-unwatchedpages' => 'Sken-d tabdart n isebtaren ur yettwalan ara.',
'action-mergehistory' => 'Sdukel amezruy n usebtar agi',
'action-userrights' => 'Ẓreg izerfan n imseqdacen yark',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|Abeddel|Ibeddlen}}',
-'recentchanges' => 'Ibeddlen imaynuten',
+'recentchanges' => 'Ibeddilen imaynuten',
'recentchanges-legend' => 'Tifranin n ibeddilen imaynuten',
'recentchanges-summary' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
'recentchanges-feed-description' => 'Ḍfer ibeddilen imaynuten n wiki-yagi deg usuddem-agi.',
'upload_directory_missing' => 'Akaram n taktert n ufaylu ($1) ulac-it dɣa ur d-yesnulfa ara sɣur aqeddac web.',
'upload_directory_read_only' => 'Weserver/serveur Web ur yezmir ara ad yaru deg ($1).',
'uploaderror' => 'Agul deg usekcam',
+'upload-recreate-warning' => "'''Ɣur-wet : Afaylu s isem agi yetwekkes naɣ yetembiwel.'''
+Aɣmis n tukksiwin d win n ittembiwilen n usebter agi beqqeḍen d-agi i tilɣa :",
'uploadtext' => "Sseqdec tiferkit agi iwakken ad ktereḍ ifuyla ɣef uqeddac.
Iwakken ad ẓṛeḍ naɣ ad nadiḍ tugniwin i ktren uqbel, ẓeṛ [[Special:FileList|umuɣ n tugniwin]]. Taktert tella daɣen deg [[Special:Log/upload|aɣmis n taktert n ifuyla]], dɣa inuzal deg [[Special:Log/delete|aɣmis n inuzal]].
'filetype-mime-mismatch' => 'Asiɣzef n ufaylu « .$1 » ur yesɛa ara tuqqna s tawsit MIME id n-ufa deg ufaylu ($2).',
'filetype-badmime' => 'Ur tettalaseḍ ara ad tazneḍ ufayluwen n anaw n MIME "$1".',
'filetype-bad-ie-mime' => 'Afaylu ur yezmer ara ad yetwekter acku yetwaf am « $1 » sɣur Internet Explorer. Tawsit agi d tazanbagt acku d tamihawt.',
+'filetype-unwanted-type' => "'''« .$1 »''' d amasal n ufaylu azanbag.
+Ilaq ad seqdeceḍ {{PLURAL:$3|amasal|imusal}} $2.",
+'filetype-banned-type' => "''' « .$1 » '''mačči d {{PLURAL:$4|amasal yesɛan turagt|imusal yesɛan turagt}}.
+{{PLURAL:$3|Amasal yesɛan turagt d-wagi :|Imusal yesɛan turagt d-wigi :}} $2.",
'filetype-missing' => 'Afaylu ur yesɛi ara taseggiwit (am ".jpg").',
'empty-file' => 'Afaylu id cegɛeḍ d-ilem.',
'file-too-large' => 'Afaylu id cegɛed d-ameqqṛan aṭas.',
'windows-nonascii-filename' => 'Wiki agi ur yebra ara isemawen n ifuyla s isekkilen usligen.',
'fileexists' => 'Afaylu s yisem-agi yewǧed yagi, ssenqed <strong>[[:$1]]</strong> ma telliḍ mačči meḍmun akken a t-tbeddleḍ.
[[$1|thumb]]',
+'filepageexists' => 'Asebter n uglam i ufaylu agi yesnulfad yakan d-agi <strong>[[:$1]]</strong>, maca ulac asebter s isem agi.
+Agzul ad efkeḍ tura ur d yettban ara ɣef asebter n uglam.
+Ma tebɣiḍ ad yeban, ilaq ad beddeleḍ s awfus asebter. [[$1|thumb]]',
'fileexists-extension' => 'Afaylu s yisem yecban wagi yella : [[$2|thumb]]
* Isem n ufaylu i tezneḍ: <strong>[[:$1]]</strong>
* Isem n ufaylu i yellan: <strong>[[:$2]]</strong>
Ma tebɣiḍ ad azeneḍ afaylu inek/inem, ilaq ad uɣaleḍ ar deffir dɣa ad as efkeḍ isem amaynut.
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Afaylu agi d-asleg n {{PLURAL:$1|ufaylu agi|ifuyla agi}} :',
+'file-deleted-duplicate' => 'Afaylu am wagi ([[:$1]]) yetwekkes yakan. Ilaq ad selkeneḍ aɣmis n tukksiwin n ufaylu agi uqbel atid ktereḍ tikkelt nniḍen.',
'uploadwarning' => 'Aɣtal deg wazan n ufayluwen',
'uploadwarning-text' => 'Beddel aglam n ufaylu dɣa ɛreḍ tikkelt nniḍen',
'savefile' => 'Smekti afaylu',
'upload-options' => 'Tixtiṛiyin n taktert ifuyla',
'watchthisupload' => 'Ɛass asebter agi',
'filewasdeleted' => 'Afaylu s yisem-agi yettwazen umbeɛd yettumḥa. Ssenqed $1 qbel ad tazniḍ tikelt nniḍen.',
+'filename-bad-prefix' => "Isem n ufaylu yezwer s '''« $1 »''', wagi d isem i sedgeren s uwurman sɣur timsakenwin tumḍinin.
+Xteṛ isem n ufaylu agelmaw.",
'upload-success-subj' => 'Azen yekfa',
'upload-success-msg' => 'Taktert inek/inem seg [$2] yesmures. Af-it d-agi : [[:{{ns:file}}:$1]]',
'upload-failure-subj' => 'Ugur n taktert',
'lockmanager-fail-svr-release' => 'Ulamek an bru izekṛunen ɣef uqeddac $1.',
# ZipDirectoryReader
+'zip-file-open-error' => 'Yella agul mi d neldi afaylu i senqeden ifuyla zip.',
'zip-wrong-format' => 'Afaylu agi mačči d afaylu n weɣbaṛ ZIP.',
+'zip-bad' => 'Afaylu agi d afaylu n weɣbaṛ ameggafsu naɣ ur nezmer ara an ɣaṛ deg-es.
+Ur nezmer ara aten selken i taɣellist.',
+'zip-unsupported' => 'Afaylu agi d afaylu n weɣbaṛ i seqdacen tiɣariwin ur yeḥemmel ara MediaWiki.
+Taɣellist ines ur tezmer ara at illi teseklen.',
# Special:UploadStash
'uploadstash' => 'Tazarkatut n taktert',
+'uploadstash-summary' => 'Asebter agi yetefk addaf i ifuyla yekteren (naɣ yesɛan taktert tanazzalt), maca mazal i beqqeḍen deg wiki. Ifuyla agi mazal id banen, ḥaca i useqdac i tni kteren.',
'uploadstash-clear' => 'Sfeḍ ifuyla deg tazarkatut',
'uploadstash-nofiles' => 'Ur tesɛiḍ ara ifuyla deg tazarkatut n taktert',
+'uploadstash-badtoken' => 'Aselkem n tigawt agi yexseṛ, ahat acku tilɣa inek/inem n usulu gweḍent ar tasewti nsent. Ɛreḍ tikkelt nniḍen.',
'uploadstash-errclear' => 'Asfeḍ n ifuyla yefkad taruẓi',
'uploadstash-refresh' => 'Mucceḍ umuɣ n ifuyla',
'invalid-chunk-offset' => 'Tiggit n iɣil ur teɣbel ara',
# img_auth script messages
'img-auth-accessdenied' => 'Addaf yugwi',
+'img-auth-nopathinfo' => 'Yexus BATH_INFU.
+Aqeddac inek/inem ur yeseɣwer ara iwakken ad i ɛeddi talɣut agi.
+Ahat i lḥu s CGI dɣa ur s-yezmer ara i img_auth.
+Ẓeṛ https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
'img-auth-notindir' => 'Abrid yesuteren mačči d akaram n taktert yellan deg tawila.',
'img-auth-badtitle' => 'Ulamek an ssali azwel i ɣbelen seg « $1 ».',
'img-auth-nologinnWL' => 'Ur teqqneḍ ara dɣa « $1 » ur yella ara deg umuɣ amellal.',
'img-auth-isdir' => 'Tɛerdeḍ ad ldiḍ akaram « $1 ».
Tzemreḍ kan ad ldiḍ ifuyla.',
'img-auth-streaming' => 'Taɣuri tamaɣlalt n « $1 ».',
+'img-auth-public' => 'Tasɣent n img_auth.php tella i ubeqqeḍ n ifuyla n yiwen wiki uslig.
+Wiki agi yesɣwer am wiki azayez.
+I taɣellist tameqqṛant, img_auth.php yensa.',
'img-auth-noread' => 'Aseqdac ur yesɛa ara azref deg taɣuri ɣef « $1 ».',
'img-auth-bad-query-string' => 'URL tesɛa azrar n tuttra ur i ɣbelen ara.',
'upload_source_file' => ' (afaylu deg uselkim inek)',
# Special:ListFiles
+'listfiles-summary' => 'Asebter agi uslig i εemmed ad yefk umu n akkw ifuyla i kteren.
+Ma aseqdac as yernu tastayt, ala ifuyla s lqem taneggarut id yekter aseqdac nni ad beqqeḍen.',
'listfiles_search_for' => 'Nadi ɣef yisem n tugna:',
'imgfile' => 'afaylu',
'listfiles' => 'Umuɣ n tugniwin',
'uploadnewversion-linktext' => 'tazneḍ tasiwelt tamaynut n ufaylu-yagi',
'shared-repo-from' => 'seg : $1',
'shared-repo' => 'azadur azduklan',
-'upload-disallowed-here' => 'Ur tzemreḍ ara ad semselsiḍ tugna agi.',
+'upload-disallowed-here' => 'Ur tzemreḍ ara ad semselsiḍ afaylu agi.',
# File reversion
'filerevert' => 'Erred $1',
# Random redirect
'randomredirect' => 'Asemmimeḍ menwala',
+'randomredirect-nopages' => 'Ulac asebter n alsanamad deg tallunt n isemawen « $1 ».',
# Statistics
'statistics' => 'Tisnaddanin',
'statistics-edits' => 'Ibeddilen n isebtar seg aserkeb n {{SITENAME}}',
'statistics-edits-average' => 'Amḍan allal n ibeddilen sɣur asebter',
'statistics-views-total' => 'Iskanen',
+'statistics-views-total-desc' => 'Timuɣliwin n isebtar ur llan ara dɣa d isebtar usligen ur sseddant ara',
+'statistics-views-peredit' => 'Tizra s ubeddel',
+'statistics-users' => '[[Special:ListUsers|Iseqdacen]] i siggezen',
+'statistics-users-active' => 'Iseqdacen urmiden',
+'statistics-users-active-desc' => 'Iseqdacen yesɛan xersum yiwet tigawt seg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}',
'statistics-mostpopular' => 'isebtar mmeẓren aṭṭas',
'disambiguations' => 'Isebtar yesɛan izdayen ɣer isebtar n tiynisemt',
'doubleredirects' => 'Asemmimeḍ yeḍra snat tikwal',
'doubleredirectstext' => 'Mkull ajerriḍ yesɛa azday ɣer asmimeḍ amezwaru akk d wis sin, ajerriḍ amezwaru n uḍris n usebter wis sin daɣen, iwumi yefkan asmimeḍ ṣaḥiḥ i yessefk ad sɛan isebtar azday ɣur-s.',
+'double-redirect-fixed-move' => 'Alsanamud agi, ɣef ayed asaḍas [[$1]] yetwebeddel isem, yetawi tura ɣer [[$2]].',
+'double-redirect-fixed-maintenance' => 'Yetseɣtu alsanamud aslag seg [[$1]] ɣer [[$2]].',
+'double-redirect-fixer' => 'Aseɣtay n aslanamud',
'brokenredirects' => 'Isemmimḍen imerẓa',
'brokenredirectstext' => 'Isemmimḍen-agi sɛan izdayen ar isebtar ulac-iten :',
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|byte/octet|bytes/octets}}',
'ncategories' => '$1 {{PLURAL:$1|Taggayt|Taggayin}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
'nlinks' => '$1 {{PLURAL:$1|azday|izdayen}}',
'nmembers' => '$1 {{PLURAL:$1|amaslad|imasladen}}',
'nrevisions' => '$1 {{PLURAL:$1|tasiwelt|tisiwal}}',
'nviews' => '$1 {{PLURAL:$1|timeẓriwt|tuẓrin}}',
+'nimagelinks' => 'Yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}',
+'ntransclusions' => 'yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}',
'specialpage-empty' => 'Asebter-agi d ilem.',
'lonelypages' => 'isebtar igujilen',
'lonelypagestext' => 'Isebtar agi ur sweṛen, ur llan deg isebtar nniḍen n {{SITENAME}}.',
'popularpages' => 'Isebtar iɣerfanen',
'wantedcategories' => 'Taggayin mmebɣant',
'wantedpages' => 'Isebtar mmebɣan',
+'wantedpages-badtitle' => 'Azwel ur yeɣbel ara deg igmad : $1',
'wantedfiles' => 'Ifuyla yettwasutren s waṭas.',
+'wantedfiletext-cat' => 'Ifuyla agi tseqdacen, maca ulac iten. Ifuyla n izudar agwemmad zemren ad illin deg umuɣ xas llan. Akkw ufrir imkerku ad <del>yetjerreḍ</del>. Isebtar yesɛan ifuyla ur llan ara, ur d-tebanen ara deg [[:$1]].',
+'wantedfiletext-nocat' => 'Ifuyla agi tseqdacen, maca ulac iten. Ifuyla n izudar agwemmad zemren ad illin deg umuɣ xas llan. Akkw ufrir imkerku ad <del>yetjerreḍ</del>.',
'wantedtemplates' => 'Talɣiwin yetsuteren',
'mostlinked' => 'Isebtar myezdin aṭas',
'mostlinkedcategories' => 'Taggayin myezdint aṭas',
'allpages-hide-redirects' => 'Ffer isemmimḍen',
# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Tetwaliḍ lqem n usebter agi yellan deg tazarkatut, lqem agi yezmer ad i sɛu alama d $1.',
+'cachedspecial-viewing-cached-ts' => 'Tetwaliḍ lqem n usebter agi yellan deg tazarkatut, ahat ur yemucceḍ ara.',
'cachedspecial-refresh-now' => 'Ẓeṛ aneggaru.',
# Special:Categories
Ẓeṛ daɣen [[Special:WantedCategories|taggayin yetwesuteren]].',
'categoriesfrom' => 'Ssken taggayin seg :',
'special-categories-sort-count' => 'Afran s amḍan n iferdisen',
-'special-categories-sort-abc' => 'Afran s ugemmay',
+'special-categories-sort-abc' => 'afran s ugemmay',
# Special:DeletedContributions
'deletedcontributions' => 'Isekcam yemḥan',
'linksearch-pat' => 'Anadi n tanfalit :',
'linksearch-ns' => 'Talluntin n isemawen :',
'linksearch-ok' => 'Nadi',
+'linksearch-text' => 'Tzemreḍ ad seqdeceḍ isekkilen imeẓliyen am « *.wikipedia.org ».
+Ilaq-asen deg udday taɣult n uswir imineg, am amedya « *.org ».<br />
+Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
'linksearch-line' => '$1 yeqqen seg $2',
# Special:ListUsers
'listusersfrom' => 'Ssken imseqdacen seg:',
'listusers-submit' => 'Ssken',
'listusers-noresult' => 'Ur yufi ḥedd (amseqdac).',
+'listusers-blocked' => '(yekyef)',
# Special:ActiveUsers
+'activeusers' => 'Umuɣ n iseqdacen urmiden',
+'activeusers-intro' => 'Wagi d umuɣ n iseqdacen yexedmen armud deg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|abeddel n ussan agi ineggura|ibeddilen n ussan agi ineggura}} deg {{PLURAL:$3|ass aneggaru|$3 ussan ineggura}}',
'activeusers-from' => 'Ssken iseqdacen seg :',
+'activeusers-hidebots' => 'Ffer iṛubuten',
+'activeusers-hidesysops' => 'Ffer inedbalen',
'activeusers-noresult' => 'Ur yufi aseqdac.',
# Special:Log/newusers
'newuserlogpage' => 'Aɣmis n isnulfan n imiḍanen n imseqdacen',
+'newuserlogpagetext' => 'Asebter agi yebeqqeḍ amezruy n usnulfu n imiḍanen n iseqdacen.',
# Special:ListGroupRights
+'listgrouprights' => 'Izerfan n igrawen n iseqdacen',
'listgrouprights-group' => 'Agraw',
'listgrouprights-rights' => 'Izerfan',
'listgrouprights-helppage' => 'Help:Izerfan n igrawen',
'unwatch' => 'Fakk aɛassi',
'unwatchthispage' => 'Fakk aɛassi',
'notanarticle' => 'Mačči d amagrad',
+'notvisiblerev' => 'Lqem tetwemḥa',
'watchnochange' => 'Ulaḥedd n yiferdas n wumuɣ n uɛessi inek ma yettubeddel deg tawala i textareḍ.',
'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
'wlheader-enotif' => '* Yeǧǧa Email n talɣut.',
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Ad iɛass...',
'unwatching' => 'Ad ifukk aɛessi...',
+'watcherrortext' => 'Yella anezri imi tebeddeleḍ iɣewwaren n umuɣ inek/inem n uɛassi i « $1 ».',
'enotif_mailer' => 'Email n talɣut n {{SITENAME}}',
'enotif_reset' => 'Rcem akk isebtar mmeẓren',
'enotif_subject' => 'Asebter $PAGETITLE n {{SITENAME}} $CHANGEDORCREATED sɣur $PAGEEDITOR',
'enotif_lastvisited' => 'Ẓer $1 i akk ibeddlen segwasmi tkecmeḍ tikelt taneggarut.',
'enotif_lastdiff' => 'Ẓer $1 akken ad tmuqleḍ abeddel.',
+'enotif_anon_editor' => 'aseqdac ur i siggezen ara $1',
'enotif_body' => 'Ay $WATCHINGUSERNAME,
Asebter « $PAGETITLE » n {{SITENAME}} $CHANGEDORCREATED ass n $PAGEEDITDATE sɣur « $PAGEEDITOR », ẓeṛ $PAGETITLE_URL iwakken ad ẓṛeḍ lqem n tura.
'delete-edit-reasonlist' => 'Beddel tiɣẓinin n umḥu n usebter',
# Rollback
+'rollback' => 'Semmet ibeddilen',
'rollback_short' => 'Semmet',
'rollbacklink' => 'semmet',
'rollbacklinkcount' => 'semmet $1 {{PLURAL:$1|abeddel|ibeddilen}}',
+'rollbacklinkcount-morethan' => 'semmet ugar n $1 {{PLURAL:$1|abeddel|ibeddilen}}',
+'rollbackfailed' => 'Asemmet yexseṛ',
'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
# Edit tokens
+'sessionfailure-title' => 'Anezri n tɣimit',
'sessionfailure' => 'Yella ugul akk d takmect inek;
Axdam-agi yebṭel axaṭer waqila yella wemdan nniḍen i yeddem isem n wemseqdac inek.
G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek, umbeɛd wekki ɣef "Actualiser/reload" akk ad tɛerḍeḍ tikelt nniḍen.',
# Protect
'protectlogpage' => 'Aɣmis n wemḥay',
'protectedarticle' => '"[[$1]]" yettwaḥrez',
-'protect-title' => 'Ad yeḥrez "$1"',
+'modifiedarticleprotection' => 'yebeddel aswir n usegdel n « [[$1]] »',
+'unprotectedarticle' => 'yekkes asegdel n « [[$1]] »',
+'movedarticleprotection' => 'yesiweḍ iɣewwaren n usegdel seg « [[$2]] » ɣer « [[$1]] »',
+'protect-title' => 'Beddel aswir n usegdel i "$1"',
+'protect-title-notallowed' => 'Ẓeṛ aswir n usegdel n « $1 »',
'prot_1movedto2' => '[[$1]] yettusmimeḍ ar [[$2]]',
+'protect-badnamespace-title' => 'Tallunt n isemawen ur nezmer ara an segdel',
+'protect-badnamespace-text' => 'Isebtar deg tallunt agi n isemawen ur zemren ara ad sɛun asegdel.',
'protect-legend' => 'Sentem tiḥḥerzi',
'protectcomment' => 'Taɣẓint :',
+'protectexpiry' => 'Azmez n tasewti :',
+'protect_expiry_invalid' => 'Azmez n tasewti ur yeɣbel ara.',
+'protect_expiry_old' => 'Azmez n tasewti i ɛedda.',
+'protect-unchain-permissions' => 'Kkes aseḍru i aṭas n tixtiṛiyin n usegdel',
'protect-default' => '(ameslugen)',
+'protect-fallback' => 'Yeḥweǧ atrug « $1 »',
'protect-level-sysop' => 'Inedbalen kan',
'protect-summary-cascade' => 'acercur',
'protect-expiring' => 'yemmut deg $1 (UTC)',
+'protect-expiring-local' => 'ad i neffeṛ ass n $1',
+'protect-expiry-indefinite' => 'ifeḍ',
+'protect-othertime' => 'Azmez nniḍen n tasewti :',
+'protect-othertime-op' => 'azmez nniḍen n tasewti',
+'protect-existing-expiry' => 'Yella azmez n tasewti : $2 af $3',
'protect-otherreason' => 'Taɣẓint nniḍen / taɣzint tamarnant :',
'protect-otherreason-op' => 'Taɣẓint nniḍen',
'protect-edit-reasonlist' => 'Beddel tiɣẓinin n usegdel',
'protect-expiry-options' => '1 asrag:1 hour,1 ass:1 day,1 imalas:1 week,2 imalasen:2 weeks,1 aggur:1 month,3 agguren:3 months,6 agguren:6 months,1 assegwas:1 year,adfi:infinite',
'restriction-type' => 'Turagt',
+'restriction-level' => 'Aswir n ukrif :',
'minimum-size' => 'Tiddi minimum',
+'maximum-size' => 'Tiddi tafellayt',
+'pagesize' => '(atamḍan)',
# Restrictions (nouns)
'restriction-edit' => 'Beddel',
'restriction-move' => 'Smimeḍ',
'restriction-create' => 'Snulfu',
+'restriction-upload' => 'Taktert n ifuyla',
# Restriction levels
+'restriction-level-sysop' => 'asegdel ummid',
'restriction-level-autoconfirmed' => 'adu-asegdel',
+'restriction-level-all' => 'akkw aswir',
# Undelete
'undelete' => 'Ẓer isebtar yettumḥan',
'undeletepagetitle' => "'''Umuɣ agi yesɛa ileqman yetwekkesen n [[:$1|$1]]'''.",
'viewdeletedpage' => 'Ẓer isebtar yettumḥan',
'undelete-fieldset-title' => 'Erred ileqman',
+'undeleterevisions' => '$1 {{PLURAL:$1|lqem i ɣbeṛen|ileqman i ɣbeṛen}}',
'undeletelink' => 'ẓeṛ/uɣaled',
'undeleteviewlink' => 'ẓeṛ',
+'undeleteinvert' => 'Snegdam ayen textareḍ',
'undeletecomment' => 'Taɣẓint :',
'undelete-header' => 'Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.',
+'undelete-search-title' => 'Nadi ɣef isebtar yettumḥan',
'undelete-search-box' => 'Nadi ɣef isebtar yettumḥan',
'undelete-search-prefix' => 'Ssken isebtar i yebdan s:',
'undelete-search-submit' => 'Nadi',
'undelete-no-results' => 'Ur yufi ara ulaḥedd n wawalen i tnadiḍ ɣef isebtar deg iɣbaren.',
+'undelete-show-file-confirm' => 'Tebɣriḍ ad ẓṛeḍ lqem yemḥan n ufaylu « <nowiki>$1</nowiki> » n $2 af $3 ?',
+'undelete-show-file-submit' => 'Ih',
# Namespace form on various pages
'namespace' => 'Talluntin n isemawen :',
'sp-contributions-newbies' => 'Ssken tikkin n yimseqdacen imaynuten kan',
'sp-contributions-newbies-sub' => 'I yisem yimseqdacen imaynuten',
'sp-contributions-blocklog' => 'Aɣmis n uɛeṭṭil',
+'sp-contributions-deleted' => 'isekcam yemḥan',
'sp-contributions-uploads' => 'izdamen',
'sp-contributions-logs' => 'iɣmisen',
'sp-contributions-talk' => 'Mmeslay',
'sp-contributions-userrights' => 'Laɛej iserfan n umseqdac',
+'sp-contributions-blocked-notice' => 'Aseqdac agi yekyef.
+Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
+'sp-contributions-blocked-notice-anon' => 'Tansa IP agi tekyef.
+Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
'sp-contributions-search' => 'Nadi i tikkin',
'sp-contributions-username' => 'Tansa IP neɣ isem n wemseqdac:',
'sp-contributions-toponly' => 'Sekned kan imagraden i beddeleɣ nekk d-aneggaru',
'whatlinkshere-filters' => 'Tistaytin',
# Block/unblock
-'blockip' => 'Ɛekkel amseqdac',
+'block' => 'Ɛekkel aseqdac',
+'blockip' => 'Ɛekkel aseqdac',
+'blockip-title' => 'Ɛekkel aseqdac',
+'blockip-legend' => 'Ɛekkel aseqdac',
'ipadressorusername' => 'Tansa IP neɣ isem n wemseqdac',
'ipbreason' => 'Ayɣer',
'ipbsubmit' => 'Ɛekkel amseqdac-agi',
'export-submit' => 'Ssufeɣ',
'export-addcattext' => 'Rnu isebtar seg taggayt:',
'export-addcat' => 'Rnu',
+'export-addnstext' => 'Rnu isebtar deg tallunt n isemawen :',
+'export-addns' => 'Rnu',
+'export-download' => 'Ḥrez deg ufaylu',
+'export-templates' => 'Sekcem tiɣlatin',
# Namespace 8 related
'allmessages' => 'Izen n system',
'allmessagestext' => 'Wagi d-umuɣ n inzan yestufan deg tallunt MediaWiki.
Ẓeṛ [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] dɣa [//translatewiki.net translatewiki.net] ma tebɣiḍ ad ɛiweneḍ i usideg imcettel n MediaWiki.',
'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' ut yezmir ara ad yettuseqdac axaṭer '''\$wgUseDatabaseMessages''' yettwakkes.",
+'allmessages-filter-legend' => 'Tastayt',
+'allmessages-filter-unmodified' => 'Ur yebeqqeḍ ara',
+'allmessages-filter-all' => 'Akkw',
+'allmessages-filter-modified' => 'Yebeddel',
+'allmessages-prefix' => 'Tastayt s adat :',
'allmessages-language' => 'Tutlayt :',
'allmessages-filter-submit' => 'Ruḥ',
'thumbnail-more' => 'Ssemɣer',
'filemissing' => 'Afaylu ulac-it',
'thumbnail_error' => 'Agul asmi yexleq tugna tamecṭuḥt: $1',
+'djvu_page_error' => 'Asebter DjVu yeffeɣ seg tilisa',
# Special:Import
'import' => 'Ssekcem isebtar',
'qbbrowse' => 'شولۋ',
'qbedit' => 'وڭدەۋ',
'qbpageoptions' => 'بۇل بەت',
-'qbpageinfo' => 'اينالا',
'qbmyoptions' => 'بەتتەرىم',
'qbspecialpages' => 'ارنايى بەتتەر',
'faq' => 'ٴجىيى قويىلعان ساۋالدار',
'qbbrowse' => 'Шолу',
'qbedit' => 'Өңдеу',
'qbpageoptions' => 'Бұл бет',
-'qbpageinfo' => 'Айнала',
'qbmyoptions' => 'Беттерім',
'qbspecialpages' => 'Арнайы беттер',
'faq' => 'Жиі қойылған сауалдар',
'qbbrowse' => 'Şolw',
'qbedit' => 'Öñdew',
'qbpageoptions' => 'Bul bet',
-'qbpageinfo' => 'Aýnala',
'qbmyoptions' => 'Betterim',
'qbspecialpages' => 'Arnaýı better',
'faq' => 'Jïi qoýılğan sawaldar',
'qbbrowse' => 'រាវរក',
'qbedit' => 'កែប្រែ',
'qbpageoptions' => 'ទំព័រនេះ',
-'qbpageinfo' => 'ព័ត៌មានទំព័រ',
'qbmyoptions' => 'ទំព័ររបស់ខ្ញុំ',
'qbspecialpages' => 'ទំព័រពិសេសៗ',
'faq' => 'សំណួរដែលសួរញឹកញាប់',
'qbbrowse' => 'ವಿಹರಿಸು',
'qbedit' => 'ಸಂಪಾದಿಸು',
'qbpageoptions' => 'ಈ ಪುಟ',
-'qbpageinfo' => 'ಸನ್ನಿವೇಶ',
'qbmyoptions' => 'ನನ್ನ ಪುಟಗಳು',
'qbspecialpages' => 'ವಿಶೇಷ ಪುಟಗಳು',
'faq' => 'ಸಾಮಾನ್ಯವಾಗಿ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು',
'createaccount' => 'ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ',
'gotaccount' => "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
'gotaccountlink' => 'ಲಾಗ್ ಇನ್',
+'userlogin-resetlink' => 'ನಿಮ್ಮ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಮರೆತಿದ್ದೀರಾ?',
'createaccountmail' => 'ಇ-ಅಂಚೆಯ ಮೂಲಕ',
'createaccountreason' => 'ಕಾರಣ:',
'badretype' => 'ನೀವು ಕೊಟ್ಟ ಪ್ರವೇಶಪದಗಳು ಬೇರೆಬೇರೆಯಾಗಿವೆ.',
'nextn-title' => 'ಮುಂದಿನ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}}',
'shown-title' => 'ಪ್ರತಿ ಪುಟದಲ್ಲಿಯೂ $1 {{PLURAL:$1|result|results}} ತೋರಿಸು',
'viewprevnext' => 'ವೀಕ್ಷಿಸು ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''\"[[:\$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
'searchmenu-new' => "'''''[[:$1]]'' ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!'''",
'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
'searchprofile-articles' => 'ಲೇಖನ ಪುಟ',
'recentchanges-legend' => 'ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳ ಆಯ್ಕೆಗಳು',
'recentchanges-summary' => 'ವಿಕಿಗೆ ಮಾಡಲ್ಪಟ್ಟ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಪುಟದಲ್ಲಿ ನೀವು ಕಾಣಬಹುದು.',
'recentchanges-feed-description' => 'ವಿಕಿಯಲ್ಲಿ ಆಗುವ ಹೊಸ ಬದಲಾವಣೆಗಳ ಮೇಲೆ ನಿಗ ಇಡಲು ಉಪಯೋಗವಾಗುವ ಫೀಡು.',
+'recentchanges-label-newpage' => 'ಈ ಸಂಪಾದನೆ ಹೊಸ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಿದೆ',
'recentchanges-label-minor' => 'ಇದು ಚುಟುಕಾದ ಬದಲಾವಣೆ',
+'recentchanges-label-bot' => 'ಈ ಸಂಪಾದನೆಯನ್ನು ಒಂದು ಬಾಟ್ ಮಾಡಿದೆ',
+'recentchanges-label-unpatrolled' => 'ಈ ಸಂಪಾದನೆಯನ್ನು ಇನ್ನೂ ಪರೀಕ್ಷೆಗೆ ಒಳಪಡಿಸಿಲ್ಲ',
'rcnote' => "$5, $4 ವರೆಗೆ ಹಿಂದಿನ {{PLURAL:$2|ದಿನದಲ್ಲಿ|'''$2''' ದಿನಗಳಲ್ಲಿ}} ಮಾಡಲಾಗಿರುವ {{PLURAL:$1|'''೧''' ಬದಲಾವಣೆ|'''$1''' ಬದಲಾವಣೆಗಳು}} ಕೆಳಗಿವೆ.",
'rcnotefrom' => "'''$2''' ಇಂದ ಆಗಿರುವ ಬದಲಾವಣೆಗಳು ಕೆಳಗಿವೆ (ಕೊನೆಯ '''$1'''ರವರೆಗೆ ತೋರಿಸಲಾಗಿದೆ).",
'rclistfrom' => '$1 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ',
ಈ URL ಸರಿಯಿದೆ ಮತ್ತು ಆ ತಾಣ ಕಾರ್ಯ ಮಾಡುತ್ತಿದೆ ಎಂದು ಮತ್ತೊಮ್ಮೆ ಪರೀಕ್ಷಿಸಿ.',
'upload-curl-error28' => 'ಅಪ್ಲೋಡ್ ಕಾಲಾವಧಿ ಮೀರಿದೆ',
+'license' => 'ಪರವಾನಗಿ:',
'license-header' => 'ಪರವಾನಗಿ',
'upload_source_url' => ' (ಒಂದು ಮನ್ನಿತ, ಸಾರ್ವಜನಿಕವಾಗಿ ಎಟಕುವ URL)',
'upload_source_file' => ' (ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿರುವ ಒಂದು ಫೈಲು)',
'linksearch' => 'ಹೊರಗಿನ ಸಂಪರ್ಕಗಳು',
'linksearch-ns' => 'ನಾಮವರ್ಗ:',
'linksearch-ok' => 'ಹುಡುಕು',
+'linksearch-line' => '$1 ನ್ನು $2 ರಿಂದ ಜೋಡಿಸಲಾಗಿದೆ',
# Special:ListUsers
'listusersfrom' => 'ಇದರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಬಳಕೆದಾರರನ್ನು ತೋರಿಸು:',
# Watchlist
'watchlist' => 'ವೀಕ್ಷಣಾ ಪಟ್ಟಿ',
'mywatchlist' => 'ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿ',
+'watchlistfor2' => '$1 ($2) ಗೆ',
'nowatchlist' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಯಾವುದೇ ಪುಟಗಳಿಲ್ಲ',
'watchlistanontext' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು ನೋಡಲು ಅಥವ ಸಂಪಾದಿಸಲು ದಯವಿಟ್ಟು $1 ಮಾಡಿ.',
'watchnologin' => 'ಲಾಗಿನ್ ಆಗಿಲ್ಲ',
'confirmdeletetext' => 'ಒಂದು ಪುಟವನ್ನು ಮತ್ತು ಅದರ ಸಂಪೂರ್ಣ ಇತಿಹಾಸವನ್ನು ನೀವು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಿಹಾಕುತ್ತಿರುವಿರಿ.
ಇದನ್ನು ನೀವು ಮಾಡಬಯಸುವಿರಿ, ಇದರ ಪರಿಣಾಮಗಳನ್ನು ಬಲ್ಲಿರಿ, ಮತ್ತು [[{{MediaWiki:Policy-url}}|ಕಾರ್ಯನೀತಿಗಳ]] ಅನುಸಾರ ಇದನ್ನು ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂದು ದೃಢಪಡಿಸಿ.',
'actioncomplete' => 'ಕಾರ್ಯ ಸಂಪೂರ್ಣ',
+'actionfailed' => 'ಕ್ರಿಯೆ ವಿಫಲವಾಗಿದೆ',
'deletedtext' => '"$1" ಅನ್ನು ಅಳಿಸಲಾಯಿತು.
ಇತ್ತೀಚೆಗಿನ ಅಳಿಸುವಿಕೆಗಳ ಪಟ್ಟಿಗಾಗಿ $2 ಅನ್ನು ನೋಡಿ.',
'dellogpage' => 'ಅಳಿಸುವಿಕೆ ದಾಖಲೆ',
'sp-contributions-newbies' => 'ಹೊಸ ಖಾತೆಗಳ ಕಾಣಿಕೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು',
'sp-contributions-newbies-sub' => 'ಹೊಸ ಖಾತೆಗಳಿಗೆ',
'sp-contributions-blocklog' => 'ತಡೆಹಿಡಿಯುವಿಕೆ ದಾಖಲೆ',
+'sp-contributions-uploads' => 'ಅಪ್ಲೋಡುಗಳು',
'sp-contributions-logs' => 'ದಾಖಲೆಗಳು',
'sp-contributions-talk' => 'ಚರ್ಚೆ',
'sp-contributions-userrights' => 'ಬಳಕೆದಾರ ಹಕ್ಕುಗಳ ನಿರ್ವಹಣೆ',
'sp-contributions-search' => 'ಸಂಪಾದನೆಗಳನ್ನು ಹುಡುಕು',
'sp-contributions-username' => 'IP ವಿಳಾಸ ಅಥವ ಬಳಕೆಯ ಹೆಸರು:',
+'sp-contributions-toponly' => 'ಕೇವಲ ಇತ್ತೀಚಿನ ಪರಿಷ್ಕರಣೆಗೆ ಸಂಬಂಧಿಸಿದ ಸಂಪಾದನೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು',
'sp-contributions-submit' => 'ಹುಡುಕು',
# What links here
'whatlinkshere-hideredirs' => '$1 ಪುನರ್ನಿರ್ದೇಶನಗಳು',
'whatlinkshere-hidetrans' => '$1 ಸೇರಿಸುವಿಕೆಗಳು',
'whatlinkshere-hidelinks' => '$1 ಕೊಂಡಿಗಳು',
+'whatlinkshere-hideimages' => '$1 ಚಿತ್ರ ಕೊಂಡಿಗಳು',
'whatlinkshere-filters' => 'ಶೋಧಕಗಳು',
# Block/unblock
'metadata-collapse' => 'ವಿಸ್ತಾರವಾದ ವಿವರಗಳನ್ನು ಅಡಗಿಸು',
'metadata-fields' => 'ಈ ಸಂದೇಶದಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿರುವ EXIF ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ ಚಿತ್ರ ಪುಟದಲ್ಲಿ ಸೇರಿಸಲಾಗುತ್ತದೆ. ಪುಟದಲ್ಲಿ ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ ಪಟ್ಟಿಯನ್ನು ತೆರೆದಾಗ ಇವು ಕಾಣುತ್ತದೆ.
ಉಳಿದವುಗಳು ಮೂಲಸ್ಥಿತಿಯಲ್ಲಿ ಅಗೋಚರವಾಗಿರುತ್ತವೆ.
-* ಸೃಷ್ಟಿ
-* ಮಾದರಿ
-* ಮೂಲಸಮಯದಿನಾಂಕ
-* ಅನಾವರಣಸಮಯ
+* make
+* model
+* datetimeoriginal
+* exposuretime
* fnumber
* isospeedratings
* focallength
-* ಕಲಾವಿದ
-* ಕೃತಿಸ್ವಾಮ್ಯ
+* artist
+* copyright
* imagedescription
* gpslatitude
* gpslongitude
'qbbrowse' => '탐색',
'qbedit' => '편집',
'qbpageoptions' => '문서 기능',
-'qbpageinfo' => '문서 정보',
'qbmyoptions' => '내 사용자 문서',
'qbspecialpages' => '특수 문서',
'faq' => '자주 묻는 질문',
'searcharticle' => '가기',
'history' => '문서 역사',
'history_short' => '역사',
-'updatedmarker' => '마지막으로 읽은 뒤 바뀌었음',
+'updatedmarker' => '마지막으로 방문한 뒤 바뀜',
'printableversion' => '인쇄용 문서',
'permalink' => '고유링크',
'print' => '인쇄',
이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.
모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
'sqlhidden' => '(SQL 쿼리 숨겨짐)',
-'cascadeprotected' => '이 문서는 연쇄 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다. 연쇄 보호된 문서:
+'cascadeprotected' => '이 문서는 다음 "연쇄적" 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다:
$2',
'namespaceprotected' => "'''$1''' 이름공간을 편집할 수 있는 권한이 없습니다.",
'customcssprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.',
'shared-repo' => '공용 저장소',
'shared-repo-name-wikimediacommons' => '위키미디어 공용',
'filepage.css' => '/* 이 CSS 설정은 파일 설명 문서에 포함되며, 또한 해외 클라이언트 위키에 포함됩니다 */',
-'upload-disallowed-here' => 'ì£\84ì\86¡í\95\98ì§\80ë§\8c ì\9d´ 그림ì\9d\84 ë\8d®ì\96´ 쓸 수 없습니다.',
+'upload-disallowed-here' => 'ì\9d´ í\8c\8cì\9d¼ì\9d\84 ë\8d®ì\96´쓸 수 없습니다.',
# File reversion
'filerevert' => '$1 되돌리기',
# Info page
'pageinfo-title' => '"$1" 문서에 대한 정보',
+'pageinfo-not-current' => '정보는 현재 판만을 보여줄 수 있습니다.',
'pageinfo-header-basic' => '기본 정보',
'pageinfo-header-edits' => '편집 역사',
'pageinfo-header-restrictions' => '문서 보호',
'pageinfo-lasttime' => '최근 편집 날짜',
'pageinfo-edits' => '총 편집 수',
'pageinfo-authors' => '총 서로 다른 편집자 수',
-'pageinfo-recent-edits' => '최근 편집 수 (지난 $1일 이내)',
+'pageinfo-recent-edits' => '최근 편집 수 (지난 $1 이내)',
'pageinfo-recent-authors' => '최근 기여자 수',
'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
'pageinfo-toolboxlink' => '문서 정보',
+'pageinfo-redirectsto' => '넘겨주기 대상',
+'pageinfo-redirectsto-info' => '정보',
+'pageinfo-contentpage' => '내용 문서로 집계',
+'pageinfo-contentpage-yes' => '예',
+'pageinfo-protect-cascading' => '여기서의 연쇄적 보호',
+'pageinfo-protect-cascading-yes' => '예',
+'pageinfo-protect-cascading-from' => '연쇄적 보호한 기점',
# Skin names
'skinname-standard' => '클래식',
'qbbrowse' => 'Къарау',
'qbedit' => 'Тюрлендир',
'qbpageoptions' => 'Бу бет',
-'qbpageinfo' => 'Бетни юсюнден',
'qbmyoptions' => 'Бетлерим',
'qbspecialpages' => 'Къуллукъчу бетле',
'faq' => 'FAQ',
'qbbrowse' => 'Aanluure',
'qbedit' => 'Ändere',
'qbpageoptions' => 'Sigge Enstellunge',
-'qbpageinfo' => 'Üvver de Sigg',
'qbmyoptions' => 'Ming Sigge',
'qbspecialpages' => 'Spezial Sigge',
'faq' => 'FAQ',
'edit-no-change' => 'Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.',
'edit-already-exists' => 'Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.',
'defaultmessagetext' => 'Dä standaadmäßije Tex',
+'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
+'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
+'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+
+# Content models
+'content-model-wikitext' => 'Wikitäx',
+'content-model-text' => 'Eijnfache Tex',
+'content-model-javascript' => 'JavaSkrepp',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Opjepaß:''' Die Sigg heh määt zovill Opwand met Paaser-Funkßjohne.
'backend-fail-internal' => 'Ene onklohre Fähler es opjetrodde met däm Schpeischersysteem „$1“.',
'backend-fail-contenttype' => 'Mer kunnte de Zoot Enhalt nit eruß krijje, di en dä Dattei „$1“ faßjehallde wääde sull.',
'backend-fail-batchsize' => 'Dat Schpeischersysteem hät ene Pöngel met {{PLURAL:$1|einem Befähl|$1 Befähle|keinem Befähl}} krääje, ävver et kann bloß {{PLURAL:$2|eine Befähl|$2 Befähle|keine Befähl}} op eijmohl.',
-'backend-fail-usable' => 'Mer kunnte di Dattei $1 nit schrieve, weil e Verzeischnes udder ene container fählt, udder et Rääsch, dren ze schrieve.',
+'backend-fail-usable' => 'Mer kunnte di Dattei $1 nit lässe udder schrieve, weil e Verzeischnes udder ene container fählt, udder et Rääsch, dren ze lässe udder ze schrieve.',
# File journal errors
'filejournal-fail-dbconnect' => 'Mer kunnte kein Verbendong opnämme met dä Daatebangk för et Logbooch vum Schpeischersysteem „$1“.',
'shared-repo-from' => 'uß $1',
'shared-repo' => 'ene jemeinsame Beshtand',
'filepage.css' => '/* Heh dat CSS küdd op Sigge övver Dateije, och di vun ander Wikis jehollt woode sin. */',
-'upload-disallowed-here' => 'Onjlöklescherwies kanns De heh dat Beld nit övverschriive.',
+'upload-disallowed-here' => 'Do kanns heh di Dattei nit övverschriive.',
# File reversion
'filerevert' => '„$1“ zerök holle',
'undeletedrevisions' => '{{PLURAL:$1|ein Version|$1 Versione}} zeröckjehollt',
'undeletedrevisions-files' => 'Zesammejenomme {{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} vun {{PLURAL:$2|eine Datei|<strong>$2</strong> Dateie|<strong>nix</strong>}} zeröckjehollt',
'undeletedfiles' => '{{PLURAL:$1|Ein Datei|<strong>$1</strong> Dateie|<strong>Kein</strong> Dateie}} zeröckjehollt',
-'cannotundelete' => '<strong>Dä.</strong> Dat Zeröckholle jing donevve. Mach sinn, dat ene andere Metmaacher flöcker wor, un et ald et eets jedon hät, un jetz es die Sigg ald widder do jewäse.',
+'cannotundelete' => '<strong>Dä.</strong> Et Zeröckholle jing donevve. Maach sinn, dat ene andere Metmaacher flöcker wor, un et et eets jedon hät, un jetz es die Sigg ald widder do jewäse.',
'undeletedpage' => '<strong>De Sigg „$1“ es jetz widder do</strong>
Luur Der et [[Special:Log/delete|Logboch met de fottjeschmesse Sigge]] aan, do häs De de Neuste fottjeschmesse
un widder herjehollte Sigge.',
'immobile-target-namespace-iw' => 'Ene Ingerwikilink es nix, woh mer en Sigg hen ömnenne künnt!',
'immobile-source-page' => 'Di Sigg kann nit ömjenannt wääde.',
'immobile-target-page' => 'Op dä Tittel kann kei Sigg ömjenannt wääde.',
+'bad-target-model' => 'De Zielsigg moß uß en ander Zoot Daate beschtonn, un vun „$1“ noh „$2“ künne mer nit ömwandele.',
'imagenocrossnamespace' => 'Dateije kam_mer nor in et Appachtemang „{{ns:file}}“ donn, noh woanders hen kam_mer se och nit ömnemme!',
'nonfile-cannot-move-to-file' => 'Mer kann nix uußer Datteije esu ömnänne, dat et em Appachtemang „{{ns:file}}“ landt',
'imagetypemismatch' => 'De neu Datei-Endong moß met däm Datei-Tüp zesamme passe',
# Info page
'pageinfo-title' => 'Övver di Sigg: „$1“',
+'pageinfo-not-current' => 'Esu en Aanjaabe künne mer bloß övver de Neuste Version vun dä Sigg maache.',
'pageinfo-header-basic' => 'Jrundlääje Aanjabe',
'pageinfo-header-edits' => 'De Änderonge',
'pageinfo-header-restrictions' => 'Siggeschoz',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Ein verstoche Saachjropp|$1 verstoche Saachjroppe|Kein verstoche Saachjropp}}',
'pageinfo-templates' => '{{PLURAL:$1|Ein Schablohn|$1 Schablohne|Kein Schablohn}} opjerohfe',
'pageinfo-toolboxlink' => 'Övver heh di Sigg',
+'pageinfo-redirectsto' => 'Leidt öm op',
+'pageinfo-redirectsto-info' => 'Aanjaabe övver di Sigg',
+'pageinfo-contentpage' => 'Zällt als en Sigg vom Enhalld vum Wiki',
+'pageinfo-contentpage-yes' => 'Joh',
+'pageinfo-protect-cascading' => 'Ene Siggeschoz weed vun heh verärf',
+'pageinfo-protect-cascading-yes' => 'Joh',
+'pageinfo-protect-cascading-from' => 'Ene Siggeschoz weed jeärf vun',
# Skin names
'skinname-standard' => 'Klassesch',
'duration-minutes' => '{{PLURAL:$1|ein Menutt|$1 Menutte|kein Menutt}}',
'duration-hours' => '{{PLURAL:$1|en Stund|$1 Stunde|kein Shtund}}',
'duration-days' => '{{PLURAL:$1|ene Daach|$1 Dääsch|keine Daach}}',
-'duration-weeks' => '{{PLURAL: $1|en Woch|§1 Woche|kein Woch}}',
+'duration-weeks' => '{{PLURAL: $1|en Woch|$1 Woche|kein Woch}}',
'duration-years' => '{{PLURAL:$1|e Johr|$1 Johre|kei Johr}}',
'duration-decades' => '{{PLURAL:$1|zehn Johre|$1 Johrzehnte|kei Johrzehnt}}',
'duration-centuries' => '{{PLURAL:$1|e Johrhondert|$1 Johrhonderte|kei Johrhondert}}',
'qbbrowse' => 'Bigere',
'qbedit' => 'Biguherîne',
'qbpageoptions' => 'Ev rûpel',
-'qbpageinfo' => 'Naverok',
'qbmyoptions' => 'Rûpelên min',
'qbspecialpages' => 'Rûpelên taybet',
'faq' => 'PGP',
'categorypage' => 'Li rûpela kategoriyê binêre',
'viewtalkpage' => 'Li gotûbêjê binêre',
'otherlanguages' => 'Zimanên din',
-'redirectedfrom' => '(ji $1 hate beralîkirin)',
+'redirectedfrom' => '(Ji $1 hate beralîkirin)',
'redirectpagesub' => 'Rûpelê beralî bike',
'lastmodifiedat' => 'Ev rûpel cara dawî di $2, $1 de hate guherandin.',
'viewcount' => 'Ev rûpel {{PLURAL:$1|carekê|caran}} tê xwestin.',
# Auto-summaries
'autosumm-blank' => 'Rûpel hate vala kirin',
'autosumm-replace' => "'$1' ket şûna rûpelê.",
-'autoredircomment' => 'ji bo [[$1]] hate beralîkirin',
+'autoredircomment' => 'Ji bo [[$1]] hate beralîkirin',
'autosumm-new' => 'Rûpela nû: "$1"',
# Live preview
'qbbrowse' => 'Perspicere',
'qbedit' => 'Recensere',
'qbpageoptions' => 'Optiones paginae',
-'qbpageinfo' => 'Contextus',
'qbmyoptions' => 'Paginae meae',
'qbspecialpages' => 'Paginae speciales',
'faq' => 'Quaestiones frequentes',
'qbbrowse' => 'Duerchsichen',
'qbedit' => 'Änneren',
'qbpageoptions' => 'Säitenoptiounen',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Meng Säiten',
'qbspecialpages' => 'Spezialsäiten',
'faq' => 'FAQ',
'edit-no-change' => 'Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.',
'edit-already-exists' => 'Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.',
'defaultmessagetext' => 'Standardtext',
+'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
# Content models
'content-model-wikitext' => 'Wikitext',
'parser-template-loop-warning' => 'Endlos Schleef an der Schabloun: [[$1]] entdeckt',
'parser-template-recursion-depth-warning' => "D'Limit vun der Zuel vun de Verschachtelunge vu Schabloune gouf iwwerschratt ($1)",
'language-converter-depth-warning' => "D'Limite vun der déift vun der Sproochëmwandlung gouf iwwerschratt ($1)",
+'parser-unstrip-loop-warning' => 'Endlos Schleef entdeckt',
'converter-manual-rule-error' => 'An der Regel iwwer déi manuell Ëmwandlung vun der Sprooch gouf e Feeler fonnt',
# "Undo" feature
'shared-repo-from' => 'vu(n) $1',
'shared-repo' => 'e gemeinsam genotzte Medienarchiv',
'shared-repo-name-wikimediacommons' => 'Wikimedia-Commons',
-'upload-disallowed-here' => 'Leider kënnt Dir dëst Bild net iwwerschreiwen.',
+'upload-disallowed-here' => 'Dir kënnt Dir dëse Fichier net iwwerschreiwen.',
# File reversion
'filerevert' => '"$1" zrécksetzen',
'import-error-invalid' => 'D\'Säit "$1" gouf net importéiert well hiren Numm net valabel ass.',
'import-options-wrong' => 'Falsch {{PLURAL:$2|Optioun|Optiounen}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Déi Basis-Säit déi Dir uginn hutt ass kee valabelen Titel.',
+'import-rootpage-nosubpage' => 'Am Nummraum "$1" vun der Basis-Säit si keng Ënnersäiten erlaabt.',
# Import log
'importlogpage' => 'Lëscht vun den Säitenimporten',
# Info page
'pageinfo-title' => 'Informatioun iwwer "$1"',
+'pageinfo-not-current' => 'Dës Informatioune kënnen nëmme fir dës Versioun gewise ginn.',
'pageinfo-header-basic' => 'Basisinformatiounen',
'pageinfo-header-edits' => 'Historique vun den Ännerungen',
'pageinfo-header-restrictions' => 'Spär vun der Säit',
'pageinfo-hidden-categories' => 'Verstoppte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
'pageinfo-templates' => 'Agebonne {{PLURAL:$1|Schabloun|Schabloune}} ($1)',
'pageinfo-toolboxlink' => "Informatiounen iwwert d'Säit",
+'pageinfo-redirectsto' => 'Viruleedung op',
+'pageinfo-redirectsto-info' => 'Informatioun',
+'pageinfo-contentpage' => 'Als Säit mat Inhalt gezielt',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading-yes' => 'Jo',
# Skin names
'skinname-standard' => 'Klassesch',
'qbbrowse' => 'Bladere',
'qbedit' => 'Bewirke',
'qbpageoptions' => 'Pagina-opties',
-'qbpageinfo' => 'Pagina-informatie',
'qbmyoptions' => 'mien opties',
'qbspecialpages' => "Speciaal pagina's",
'faq' => 'FAQ (väölgesjtèlde vraoge)',
'qbfind' => 'Attrêuva',
'qbedit' => 'Cangia',
'qbpageoptions' => "Opsioîn de 'sta paggina",
-'qbpageinfo' => 'Informassion inscia paggina',
'qbmyoptions' => 'E mæ paggine',
'qbspecialpages' => 'Pagine speçiä',
'faq' => 'Domande frequenti',
'qbbrowse' => 'Naršymas',
'qbedit' => 'Taisyti',
'qbpageoptions' => 'Šis puslapis',
-'qbpageinfo' => 'Kontekstas',
'qbmyoptions' => 'Mano puslapiai',
'qbspecialpages' => 'Specialieji puslapiai',
'faq' => 'DUK',
'qbbrowse' => 'Fangvêl rawh',
'qbedit' => 'Siamţhatna',
'qbpageoptions' => 'He phêk hi',
-'qbpageinfo' => 'Thukhawchang',
'qbmyoptions' => 'Ka phêkte',
'qbspecialpages' => 'Phêk vohbîkte',
'faq' => 'Zawhzin',
Ahnuaih hian {{PLURAL:$1|zawmtu hmasa ber|zawmtu hmasa $1-te}} kan rawn tlar chhuak e.
Zawmtu zawng zawng [[Special:WhatLinksHere/$2|tlarchhuahna hetah hian a awm]] e.',
'nolinkstoimage' => 'He taksa zawmtu/hmanna phêk pakhat mah a awm lo.',
-'morelinkstoimage' => 'Hemi taksa zawmpui dang [[Special:WhatLinksHere/$1|enna}}.',
+'morelinkstoimage' => 'Hemi taksa zawmpui dang [[Special:WhatLinksHere/$1|enna]].',
'linkstoimage-redirect' => '$1 (taksa hruailuhna) $2',
'duplicatesoffile' => 'A hnuaia taksa{{PLURAL:$1||te}} khu hë taksa nihpui{{PLURAL:$1||te}} a{{PLURAL:$1||n}} ni ([[Special:FileDuplicateSearch/$2|chanchin kimchang]]):',
'sharedupload' => 'Hë taksa hi $1-a mi a ni a, hna-hmachhawp dangin a hmang vè mai thei.',
'qbbrowse' => 'Navigācija',
'qbedit' => 'Izmainīšana',
'qbpageoptions' => 'Šī lapa',
-'qbpageinfo' => 'Konteksts',
'qbmyoptions' => 'Manas lapas',
'qbspecialpages' => 'Īpašās lapas',
'faq' => 'BUJ',
'qbbrowse' => '覽',
'qbedit' => '纂',
'qbpageoptions' => '此頁',
-'qbpageinfo' => '內文',
'qbmyoptions' => '吾好',
'qbspecialpages' => '非凡',
'faq' => '頻答問',
'qbbrowse' => 'गवेषण करू',
'qbedit' => 'सम्पादन करू',
'qbpageoptions' => 'ई पन्ना',
-'qbpageinfo' => 'विषय',
'qbmyoptions' => 'हमर पन्ना सभ',
'qbspecialpages' => 'विशेष पन्ना सभ',
'faq' => 'त्वरित प्रश्नोत्तरी',
'qbbrowse' => 'Ванондома',
'qbedit' => 'Петнема',
'qbpageoptions' => 'Тя лопась',
-'qbpageinfo' => 'Контекстсь',
'qbmyoptions' => 'Монь лопане',
'qbspecialpages' => 'Башка тевонь лопат',
'faq' => 'Сидеста Кеподеви Кизефксне',
'qbbrowse' => 'Tadiavina',
'qbedit' => 'Hanova',
'qbpageoptions' => 'Ity pejy ity',
-'qbpageinfo' => 'Pejy fanoroana',
'qbmyoptions' => 'Ny pejiko',
'qbspecialpages' => 'Pejy manokana',
'faq' => 'FMM',
'filehist-dimensions' => 'Кугытшо',
'filehist-filesize' => 'Файлын кугытшо',
'filehist-comment' => 'Файл нерген:',
-'imagelinks' => 'Файл деке кылвер-влак',
+'imagelinks' => 'Файлым кучылтмаш',
'linkstoimage' => 'Тиде {{PLURAL:$1|$1 лаштык саде файл дене кылдалтын|$1 лаштык-влак саде файл дене кылдалтыныт}}:',
'nolinkstoimage' => 'Тиде файл дене кылдалтше ик лаштыкат уке.',
'sharedupload' => 'Тиде файлын верже: $1, туге гынат, тудым моло веренат кучылташ лиеш.',
'shortpages' => 'Кӱчык лаштык-влак',
'longpages' => 'Кужу лаштык-влак',
'protectedpages' => 'Тӧрлатымаш деч аралыме лаштык-влак',
+'usercreated' => '$1, $2 шагатлан {{GENDER:$3|регистрацийым эртен|регистрацийым эртен}}',
'newpages' => 'У лаштык-влак',
'newpages-username' => 'Пайдаланышын лӱмжӧ:',
'move' => 'Кусараш',
'whatlinkshere-hideredirs' => 'вес вере колтымаш-влакым $1',
'whatlinkshere-hidetrans' => 'пуртымашым $1',
'whatlinkshere-hidelinks' => 'кылвер-влакым $1',
+'whatlinkshere-hideimages' => 'сӱрет деке кылвер-влакым $1',
'whatlinkshere-filters' => 'Фильтр-влак',
# Block/unblock
'export' => 'Лаштык-влакым келыштараш',
# Namespace 8 related
+'allmessagesname' => 'Лӱм',
'allmessages-filter-all' => 'Чыла',
# Thumbnails
'qbbrowse' => 'Прелистај',
'qbedit' => 'Уреди',
'qbpageoptions' => 'Оваа страница',
-'qbpageinfo' => 'Содржина на страница',
'qbmyoptions' => 'Мои страници',
'qbspecialpages' => 'Специјални страници',
'faq' => 'ЧПП',
'lastmodifiedat' => 'Оваа страница последен пат е изменета на $1 во $2 ч.',
'viewcount' => 'Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.',
'protectedpage' => 'Заштитена страница',
-'jumpto' => 'Скокни на:',
+'jumpto' => 'Ð\9fÑ\80еÑ\98ди на:',
'jumptonavigation' => 'содржини',
'jumptosearch' => 'барај',
'view-pool-error' => 'За жал во моментов опслужувачите се преоптоварени.
'shared-repo' => 'заедничко складиште',
'shared-repo-name-wikimediacommons' => 'Заедничката Ризница',
'filepage.css' => '/* Тука поставените каскадни стилски страници (CSS) се вклучени во страницата за опис на податотеката, како и на клиентските викија */',
-'upload-disallowed-here' => 'Нажалост, не можете да ја замените сликава со нова.',
+'upload-disallowed-here' => 'Нажалост, не можете да презапишете врз сликава.',
# File reversion
'filerevert' => 'Врати $1',
# Info page
'pageinfo-title' => 'Информации за „$1“',
+'pageinfo-not-current' => 'Информациите може да се прикажат само за тековната ревизија.',
'pageinfo-header-basic' => 'Основни информации',
'pageinfo-header-edits' => 'Историја на уредувања',
'pageinfo-header-restrictions' => 'Заштита на страницата',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Скриена категорија|Скриени категории}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Превметнат шаблон|Превметнати шаблони}} ($1)',
'pageinfo-toolboxlink' => 'Информации за страницата',
+'pageinfo-redirectsto' => 'Пренасочува кон',
+'pageinfo-redirectsto-info' => 'инфо',
+'pageinfo-contentpage' => 'Се вбројува во содржински страници',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'Каскадната заштита на страниците важи од тука',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'Страници со каскадна заштита од',
# Skin names
'skinname-standard' => 'Класично',
'qbbrowse' => 'ബ്രൗസ്',
'qbedit' => 'തിരുത്തുക',
'qbpageoptions' => 'ഈ താൾ',
-'qbpageinfo' => 'സന്ദർഭം',
'qbmyoptions' => 'എന്റെ താളുകൾ',
'qbspecialpages' => 'പ്രത്യേക താളുകൾ',
'faq' => 'പതിവുചോദ്യങ്ങൾ',
'shared-repo' => 'ഒരു പങ്കുവെക്കപ്പെട്ട സംഭരണി',
'shared-repo-name-wikimediacommons' => 'വിക്കിമീഡിയ കോമൺസ്',
'filepage.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. പ്രമാണ വിവരണ താളുകളിൽ ഉൾപ്പെടുത്തപ്പെടുന്നതായിരിക്കും, ബാഹ്യ ക്ലൈന്റ് വിക്കികളിലും അത് ലഭ്യമായിരിക്കും */',
-'upload-disallowed-here' => 'നിർà´à´¾à´\97àµ\8dയവശാൽ à´\88 à´\9aà´¿à´¤àµ\8dà´°à´¤àµ\8dതിനàµ\81 à´®àµ\81à´\95ളിൽ മറàµ\8dà´±àµ\8aà´°àµ\81 à´\9aà´¿à´¤àµ\8dà´°ം ചേർക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
+'upload-disallowed-here' => 'à´\88 à´ªàµ\8dരമാണതàµ\8dതിനàµ\81 à´®àµ\81à´\95ളിൽ മറàµ\8dà´±àµ\8aà´°àµ\81 à´ªàµ\8dരമാണം ചേർക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
# File reversion
'filerevert' => '$1 തിരസ്ക്കരിക്കുക',
# Info page
'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
+'pageinfo-not-current' => 'ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിൽ മാത്രമേ വിവരങ്ങൾ പ്രദർശിപ്പിക്കപ്പെടാനിടയുള്ളു.',
'pageinfo-header-basic' => 'അടിസ്ഥാനവിവരങ്ങൾ',
'pageinfo-header-edits' => 'തിരുത്തൽചരിത്രം',
'pageinfo-header-restrictions' => 'സംരക്ഷണം',
'pageinfo-hidden-categories' => 'മറഞ്ഞിരിക്കുന്ന {{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}} ($1)',
'pageinfo-templates' => 'ഉൾപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}} ($1)',
'pageinfo-toolboxlink' => 'താളിന്റെ വിവരങ്ങൾ',
+'pageinfo-redirectsto' => 'തിരിച്ചുവിടുന്നു',
+'pageinfo-redirectsto-info' => 'വിവരം',
+'pageinfo-contentpage' => 'ഉള്ളടക്ക താളായി എണ്ണുന്നവ',
+'pageinfo-contentpage-yes' => 'അതെ',
# Skin names
'skinname-standard' => 'സാർവത്രികം',
'qbbrowse' => 'Дэлгэх',
'qbedit' => 'Засварлах',
'qbpageoptions' => 'Энэ хуудас',
-'qbpageinfo' => 'Агуулга',
'qbmyoptions' => 'Миний хуудсууд',
'qbspecialpages' => 'Тусгай хуудсууд',
'faq' => 'Тогтмол тавигддаг асуултууд',
'qbbrowse' => 'न्याहाळा',
'qbedit' => 'संपादन',
'qbpageoptions' => 'हे पान',
-'qbpageinfo' => 'सामग्री',
'qbmyoptions' => 'माझी पाने',
'qbspecialpages' => 'विशेष पाने',
'faq' => 'नेहमीची प्रश्नावली',
'qbbrowse' => 'Semak imbas',
'qbedit' => 'Sunting',
'qbpageoptions' => 'Laman ini',
-'qbpageinfo' => 'Konteks',
'qbmyoptions' => 'Laman-laman saya',
'qbspecialpages' => 'Laman khas',
'faq' => 'Soalan Lazim',
'qbbrowse' => 'Qalleb',
'qbedit' => 'Immodifika',
'qbpageoptions' => 'Din il-paġna',
-'qbpageinfo' => 'Kuntest',
'qbmyoptions' => 'Il-paġni tiegħi',
'qbspecialpages' => 'Paġni speċjali',
'faq' => 'Mistoqsijiet komuni',
* @author Boivie
* @author Brik
* @author Byrial
+ * @author Cocu
* @author Danmichaelo
* @author Dittaeva
* @author Eirik
'qbbrowse' => 'Bla gjennom',
'qbedit' => 'Rediger',
'qbpageoptions' => 'Sideinnstillinger',
-'qbpageinfo' => 'Sideinformasjon',
'qbmyoptions' => 'Egne innstillinger',
'qbspecialpages' => 'Spesialsider',
'faq' => 'Ofte stilte spørsmål',
'uploadnewversion-linktext' => 'Last opp en ny versjon av denne filen',
'shared-repo-from' => 'fra $1',
'shared-repo' => 'et delt fillager',
-'upload-disallowed-here' => 'Beklageligvis kan du ikke overskrive dette bildet.',
+'upload-disallowed-here' => 'Du kan ikke overskrive denne filen.',
# File reversion
'filerevert' => 'Tilbakestill $1',
# Info page
'pageinfo-title' => 'Informasjon om «$1»',
+'pageinfo-not-current' => 'Informasjonen vises kanskje bare for den gjeldende revisjonen.',
'pageinfo-header-basic' => 'Grunnleggende informasjon',
'pageinfo-header-edits' => 'Redigeringshistorikk',
'pageinfo-header-restrictions' => 'Sidebeskyttelse',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
'pageinfo-templates' => 'Transkludert {{PLURAL:$1|mal|maler}} ($1)',
'pageinfo-toolboxlink' => 'Sideinformasjon',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som innholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Dypbeskyttelse starter herfra',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Dypbeskyttelse fra',
# Skin names
'skinname-standard' => 'Standard',
'qbbrowse' => 'Blädern',
'qbedit' => 'Ännern',
'qbpageoptions' => 'Disse Sied',
-'qbpageinfo' => 'Sietendaten',
'qbmyoptions' => 'Instellen',
'qbspecialpages' => 'Spezialsieten',
'faq' => 'Faken stellte Fragen',
'qbbrowse' => 'Blaojen',
'qbedit' => 'Bewark',
'qbpageoptions' => 'Disse zied',
-'qbpageinfo' => 'Ziedinformasie',
'qbmyoptions' => 'Veurkeuren',
'qbspecialpages' => 'Spesiale ziejen',
'faq' => 'Vragen die vake esteld wörden',
'qbbrowse' => 'ब्राउज गर्ने',
'qbedit' => 'सम्पादन गर्ने',
'qbpageoptions' => 'यो पेज',
-'qbpageinfo' => 'सन्दर्भ',
'qbmyoptions' => 'मेरो पेज',
'qbspecialpages' => 'विशेष पृष्ठहरु',
'faq' => 'धैरै सोधिएका प्रश्नहरु',
'qbbrowse' => 'Bladeren',
'qbedit' => 'Bewerken',
'qbpageoptions' => 'Deze pagina',
-'qbpageinfo' => 'Pagina-informatie',
'qbmyoptions' => "Mijn pagina's",
'qbspecialpages' => 'Speciale pagina’s',
'faq' => 'Veel gestelde vragen',
'viewsourcetext' => 'U kunt de brontekst van deze pagina bekijken en kopiëren:',
'viewyourtext' => "U kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
'protectedinterface' => "Deze pagina bevat tekst voor berichten van de software op deze wiki en is beveiligd om misbruik te voorkomen.
-Om vertalingen voor alle wiki's toe te voegen of te wijzigen, gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki.",
+Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen voor alle wiki's toe te voegen of te wijzigen.",
'editinginterface' => "'''Waarschuwing:''' u bewerkt een pagina die interfacetekst voor de software bevat.
Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.
Om vertalingen toe te voegen of te wijzigen voor alle wiki's, gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki.",
'edit-already-exists' => 'De pagina is niet aangemaakt.
Deze bestaat al.',
'defaultmessagetext' => 'Standaardinhoud',
+'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
+'invalid-content-data' => 'Ongeldige inhoudsgegevens',
+'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
# Content models
'content-model-wikitext' => 'wikitekst',
'shared-repo' => 'een gedeelde mediadatabank',
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
'filepage.css' => "/ * De CSS die hier geplaatst wordt, wordt opgenomen in de bestandsbeschrijvingspagina en wordt ook opgenomen op externe wiki's (via externe repositories) * /",
-'upload-disallowed-here' => 'U kunt deze afbeelding helaas niet overschrijven.',
+'upload-disallowed-here' => 'U kunt dit bestand niet overschrijven.',
# File reversion
'filerevert' => '$1 terugdraaien',
'immobile-target-namespace-iw' => 'Een interwikiverwijzing is geen geldige bestemming voor het hernoemen van een pagina.',
'immobile-source-page' => 'Deze pagina kan niet hernoemd worden.',
'immobile-target-page' => 'Het is niet mogelijk te hernoemen naar die paginanaam.',
+'bad-target-model' => 'De gewenste bestemming gebruikt een ander inhoudsmodel. Het is niet mogelijk om te zetten van $1 naar $2.',
'imagenocrossnamespace' => 'Een mediabestand kan niet naar een andere naamruimte verplaatst worden',
'nonfile-cannot-move-to-file' => 'Het is niet mogelijk te hernoemen van en naar de bestandsnaamruimte',
'imagetypemismatch' => 'De nieuwe bestandsextensie is niet gelijk aan het bestandstype',
# Info page
'pageinfo-title' => 'Informatie over "$1"',
+'pageinfo-not-current' => 'Gegegevens worden mogelijk alleen weergegeven voor de huidige versie.',
'pageinfo-header-basic' => 'Basisgegevens',
'pageinfo-header-edits' => 'Bewerkingsgeschiedenis',
'pageinfo-header-restrictions' => 'Paginabeveiliging',
'pageinfo-hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Gebruikt sjabloon|Gebruikte sjablonen}} ($1)',
'pageinfo-toolboxlink' => 'Paginagegevens',
+'pageinfo-redirectsto' => 'Verwijst door naar',
+'pageinfo-redirectsto-info' => 'informatie',
+'pageinfo-contentpage' => 'Geteld als pagina met inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Beveiligingen werken vanaf hier door',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Pagina is beveiligd vanuit een andere pagina',
# Skin names
'skinname-standard' => 'Klassiek',
* @file
*
* @author Boivie
+ * @author Cocu
* @author Dittaeva
* @author Diupwijk
* @author Eirik
'qbbrowse' => 'Bla gjennom',
'qbedit' => 'Endre',
'qbpageoptions' => 'Denne sida',
-'qbpageinfo' => 'Samanheng',
'qbmyoptions' => 'Sidene mine',
'qbspecialpages' => 'Spesialsider',
'faq' => 'OSS',
'upload-too-many-redirects' => 'URL-en inneheldt for mange omdirigeringar',
'upload-unknown-size' => 'Ukjend storleik',
'upload-http-error' => 'Ein HTTP-feil oppstod: $1',
+'upload-copy-upload-invalid-domain' => 'Kopiopplastingar er ikkje tilgjengelege frå dette domenet.',
# File backend
'backend-fail-stream' => 'Kunne ikkje strøyma fila «$1».',
'backend-fail-backup' => 'Kunne ikkje tryggingskopiera fila «$1».',
'backend-fail-notexists' => 'Fila $1 finst ikkje.',
+'backend-fail-hashes' => 'Kunne ikkje henta filnummer for samanlikning.',
'backend-fail-notsame' => 'Ein ikkje-identisk fil finst alt på «$1».',
'backend-fail-invalidpath' => '$1 er ikkje ein gyldig lagringsstig.',
'backend-fail-delete' => 'Kunne ikkje sletta fila «$1».',
'backend-fail-closetemp' => 'Kunne ikkje lata att mellombels fil.',
'backend-fail-read' => 'Kunne ikkje lesa fila «$1».',
'backend-fail-create' => 'Kunne ikkje oppretta fila «$1».',
+'backend-fail-maxsize' => 'Kunne ikkje skriva fila «$1» av di ho er større enn {{PLURAL:$2|éin byte|$2 byte}}.',
+'backend-fail-readonly' => "Largingsbaksystemet «$1» er for tida skriveverna. Oppgjeven grunn er: «''$2''»",
+'backend-fail-synced' => 'Fila «$1» er i ei inkonsistent stode i dei interne lagringsbaksystema',
+'backend-fail-connect' => 'Kunne ikkje kopla til filbaksystemet «$1».',
+'backend-fail-internal' => 'Ein ukjend feil oppstod i lagringsbaksystemet «$1».',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Kunne ikkje kopla til journaldatabasen for lagringsbaksystemet «$1».',
+'filejournal-fail-dbquery' => 'Kunne ikkje oppdatera journaldatabasen for lagringsbaksystemet «$1».',
# Lock manager
+'lockmanager-notlocked' => 'Kunne ikkje låsa opp «$1» av di han ikkje er låst',
+'lockmanager-fail-closelock' => 'Kunne ikkje lata att låsefila for «$1».',
+'lockmanager-fail-deletelock' => 'Kunne ikkje sletta låsefila for «$1».',
+'lockmanager-fail-acquirelock' => 'Kunne ikkje henta lås for «$1».',
+'lockmanager-fail-openlock' => 'Kunne ikkje opna låsefila for «$1».',
'lockmanager-fail-releaselock' => 'Kunne ikkje løysa låsen for «$1».',
+'lockmanager-fail-db-bucket' => 'Kunne ikkje kontakta nok låsedatabasar i bytta $1.',
+'lockmanager-fail-db-release' => 'Kunne ikkje løysa låsane på databasen $1.',
+'lockmanager-fail-svr-acquire' => 'Kunne ikkje henta låsane på tenaren $1.',
+'lockmanager-fail-svr-release' => 'Kunne ikkje løysa låsane på tenaren $1.',
# ZipDirectoryReader
'zip-wrong-format' => 'Den oppgjevne fila var ikkje ei ZIP-fil',
Ho kan ikkje tryggingskontrollerast.',
# Special:UploadStash
+'uploadstash-errclear' => 'Fjerning av filene var mislykka.',
'uploadstash-refresh' => 'Oppdater fillista',
# img_auth script messages
'uploadnewversion-linktext' => 'Last opp ny versjon av denne fila',
'shared-repo-from' => 'frå $1',
'shared-repo' => 'eit sams fillager',
-'upload-disallowed-here' => 'Diverre kan du ikkje overskriva dette biletet.',
+'upload-disallowed-here' => 'Du kan ikkje overskriva denne fila.',
# File reversion
'filerevert' => 'Rulla attende $1',
'undeletedrevisions' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} attoppretta.',
'undeletedrevisions-files' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} og {{PLURAL:$2|éi fil|$2 filer}} er attoppretta',
'undeletedfiles' => '{{PLURAL:$1|Éi fil|$1 filer}} er attoppretta',
-'cannotundelete' => 'Feil ved attoppretting, andre kan allereie ha attoppretta sida.',
+'cannotundelete' => 'Attopprettinga gjekk ikkje:
+$1',
'undeletedpage' => "'''$1 er attoppretta'''
Sjå [[Special:Log/delete|sletteloggen]] for eit oversyn over sider som nyleg er sletta eller attoppretta.",
'pageinfo-magic-words' => '{{PLURAL:$1|Trylleord}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Løynd kategori|Løynde kategoriar}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Inkludert mal|Inkluderte malar}} ($1)',
+'pageinfo-contentpage' => 'Tald som ei innhaldsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Djupvern byrjar her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Djupvern byrjar i',
# Skin names
'skinname-standard' => 'Klassisk',
'exif-headline' => 'Overskrift',
'exif-credit' => 'Opphavrettseigar/filgjevar',
'exif-source' => 'Kjelde',
+'exif-editstatus' => 'Den redaksjonelle stoda til biletet',
'exif-urgency' => 'Prioritet',
'exif-objectcycle' => 'Tid på dagen mediet er meint for',
'exif-contact' => 'Kontaktinformasjon',
'exif-datetimeexpires' => 'Skal ikkje nyttast etter',
'exif-datetimereleased' => 'Frigjeve',
'exif-lens' => 'Objektiv',
+'exif-serialnumber' => 'Serienummeret på kameraet',
'exif-cameraownername' => 'Eigar av kameraet',
'exif-label' => 'Merkelapp',
+'exif-nickname' => 'Det uformelle namnet på biletet',
'exif-rating' => 'Vurdering (av 5)',
'exif-copyrighted' => 'Opphavsrettsstode',
'exif-copyrightowner' => 'Opphavsrettseigar',
'exif-usageterms' => 'Bruksvilkår',
+'exif-originaldocumentid' => 'Unik ID til originaldokumentet',
+'exif-licenseurl' => 'URL for opphavsrettsløyve',
+'exif-morepermissionsurl' => 'Alternativ løyveinformasjon',
+'exif-attributionurl' => 'Når dette verket vert nytta, lenkja til',
+'exif-preferredattributionname' => 'Når dette verket vert nytta, godskriv',
'exif-pngfilecomment' => 'PNG-filkommentar',
'exif-disclaimer' => 'Atterhald',
'exif-contentwarning' => 'Innholdsåtvaring',
$5
+Denne stadfestingskoden vert forelda $4.',
+'confirmemail_body_changed' => 'Nokon, truleg deg, frå IP-adressa $1, har endra e-postadressa til kontoen «$2» på {{SITENAME}} til denne e-postadressa.
+
+For å stadfesta at denne kontoen faktisk høyrer til deg, og for å slå på
+funksjonar knytte til e-post på {{SITENAME}}, opna denne lenkja i nettlesaren din:
+
+$3
+
+Om brukarkontoen *ikkje* høyrer til deg, fylg denne lenkja for å bryta av stadfestinga av e-postadressa:
+
+$5
+
+Denne stadfestingskoden vert forelda $4.',
+'confirmemail_body_set' => 'Nokon, truleg deg, frå IP-adressa $1, har sett e-postadressa til kontoen «$2» på {{SITENAME}} til denne e-postadressa.
+
+For å stadfesta at denne kontoen faktisk høyrer til deg, og for å slå på
+funksjonar knytte til e-post på {{SITENAME}}, opna denne lenkja i nettlesaren din:
+
+$3
+
+Om brukarkontoen *ikkje* høyrer til deg, fylg denne lenkja for å bryta av stadfestinga av e-postadressa:
+
+$5
+
Denne stadfestingskoden vert forelda $4.',
'confirmemail_invalidated' => 'Stadfestinga av e-postadresse er avbrote',
'invalidateemail' => 'Avbryt stadfestinga av e-postadressa',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-tilkopling er slått av]',
'scarytranscludefailed' => '[Henting av mal for $1 gjekk ikkje]',
+'scarytranscludefailed-httpstatus' => '[Henting av mal for $1 gjekk ikkje: HTTP $2]',
'scarytranscludetoolong' => '[URL-en er for lang]',
# Delete conflict
* @author Fryed-peach
* @author Jfblanc
* @author Kaganer
+ * @author McDutchie
* @author Spacebirdy
* @author Горан Анђелковић
* @author לערי ריינהארט
'qbbrowse' => 'Far desfilar',
'qbedit' => 'Modificar',
'qbpageoptions' => 'Opcions de la pagina',
-'qbpageinfo' => 'Pagina d’entresenhas',
'qbmyoptions' => 'Mas opcions',
'qbspecialpages' => 'Paginas especialas',
'faq' => 'FAQ',
'timezoneregion-indian' => 'Ocean Indian',
'timezoneregion-pacific' => 'Ocean Pacific',
'allowemail' => 'Autorizar lo mandadís de corrièr electronic venent d’autres utilizaires',
-'prefs-searchoptions' => 'Opcions de recèrca',
+'prefs-searchoptions' => 'Recèrca',
'prefs-namespaces' => 'Noms d’espacis',
'defaultns' => 'Autrament recercar dins aquestes espacis de noms :',
'default' => 'defaut',
'qbbrowse' => 'ଖୋଜିବା',
'qbedit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
'qbpageoptions' => 'ଏହି ପୃଷ୍ଠାଟି',
-'qbpageinfo' => 'ଭିତର ଚିଜ',
'qbmyoptions' => 'ମୋ ପୃଷ୍ଠାଗୁଡ଼ିକ',
'qbspecialpages' => 'ବିଶେଷ ପୃଷ୍ଠା',
'faq' => 'ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନ',
ଆପଣ [[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}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି],
-କିମ୍ବା [{{fullurl:{{FULLPAGENAME}}|action=edit}} ଏହି ପୃଷ୍ଠାଟିକୁ ବଦଳାଇ ପାରନ୍ତି]</span> ।',
+'noarticletext-nopermission' => 'à¬\8fବà\87 à¬\8fହି ପà\83ଷà\8dଠାà¬\9fିରà\87 à¬\95ିà¬\9bି ବି ଲà\87à¬\96ା ନାହିà¬\81 ।
+ଆପଣ [[Special:Search/{{PAGENAME}}|ଏହି ଲେଖାଟିର ନାଆଁ]] ବାକି ପୃଷ୍ଠାମାନଙ୍କରେ ଖୋଜି ପାରନ୍ତି, କିମ୍ବା
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି]
+</span>, କିନ୍ତୁ ଏହି ପୃଷ୍ଠାଟିକୁ ଆପଣ ତିଆରି କରିପାରିବେ ନାହିଁ ।',
'missing-revision' => '"{{PAGENAME}}" ନାମରେ ଥିବା ପୃଷ୍ଠାଟିର #$1 ପୁନରାବୃତ୍ତି ନାହିଁ ।
ପୁରୁଣା ହୋଇଯାଇଥିବା ଇତିହାସ ଲିଙ୍କ ଯାହା ଏକ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାକୁ ଦିଆଯାଇଥିବାରୁ ଏହା ସାଧାରଣତଃ ହୋଇଥାଏ ।
ଏହା ଅଗରୁ ଅଛି ।',
'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
+# Content models
+'content-model-wikitext' => 'ଉଇକିଟେକ୍ସଟ',
+
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ଚେତାବନୀ:''' ଏହି ପୃଷ୍ଠାରେ ଅନେକ ଗୁଡ଼ିଏ ମୂଲ୍ୟବାନ ପାର୍ସର ଫଙ୍କସନ କଲ ଅଛି ।
# Info page
'pageinfo-title' => '"$1"ର ବିବରଣୀ',
+'pageinfo-header-basic' => 'ସାଧାରଣ ଜାଣିବା କଥା',
'pageinfo-header-edits' => 'ବଦଳସବୁ',
'pageinfo-article-id' => 'ପୃଷ୍ଠା ଆଇଡ଼ି',
'pageinfo-views' => 'ଦେଖଣା ସଂଖ୍ୟା',
'pageinfo-watchers' => 'ଦେଖଣାହାରି ସଂଖ୍ୟା',
-'pageinfo-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା:',
+'pageinfo-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା',
'pageinfo-authors' => 'ନିଆରା ଲେଖକଙ୍କ ସଂଖ୍ୟା',
# Patrolling
'file-info-size-pages' => '$1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3, MIME ପ୍ରକାର: $4, $5 ଗୋଟି {{PLURAL:$5|ପୃଷ୍ଠା|ପୃଷ୍ଠା}}',
'file-nohires' => 'ବଡ଼ ରେଜୋଲୁସନ ନାହିଁ ।',
'svg-long-desc' => 'SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3',
+'svg-long-desc-animated' => 'Animated SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3',
'show-big-image' => 'ପୁରା ବଡ଼ ଆକାରରେ',
'show-big-image-preview' => 'ଏହି ଦେଖଣାର ଆକାର: $1 ।',
'show-big-image-other' => 'ବାକି {{PLURAL:$2|ରେଜୋଲୁସନ|ରେଜୋଲୁସନ}}: $1.',
# Search suggestions
'searchsuggest-search' => 'ଖୋଜିବା',
+'searchsuggest-containing' => 'ଧାରଣ ହେଉଛି...',
# API errors
'api-error-badaccess-groups' => 'ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।',
'duration-days' => '$1 {{PLURAL:$1|ଦିନ|ଦିନଗୁଡିକ}}',
'duration-weeks' => '$1 {{PLURAL: $1|ସପ୍ତାହ|ସପ୍ତାହଗୁଡିକ}}',
'duration-years' => '$1 {{PLURAL:$1|year|years}}',
-'duration-decades' => '$1 {{PLURAL:$1|decade|decades}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decades}}',
'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
'qbbrowse' => 'Фен',
'qbedit' => 'Ивын',
'qbpageoptions' => 'Ацы фарс',
-'qbpageinfo' => 'Фарсы контекст',
'qbmyoptions' => 'Мæ фæрстæ',
'qbspecialpages' => 'Сæрмагонд фæрстæ',
'faq' => 'FAQ',
'badtitletext' => 'Æрдомд фарсы ном уыд рæдыдимæ кæнæ афтид кæнæ та йæ æхсæн-æвзаг æви йæ интервики æрвитæн раст нæ уыд.
Гæнæн ис Номы ис ахæм дамгъæтæ, кæдон уым æвæрын нæй гæнæн.',
'perfcached' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ гæнæн ис базæронд сты. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$1|иу фæстиуæг|$1 фæстиуæджы}}.',
-'perfcachedts' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ фæстаг хатт нæуæггонд æрцыдысты $1. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$1|иу фæстиуæг|$1 фæстиуæджы}}.',
+'perfcachedts' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ фæстаг хатт нæуæггонд æрцыдысты $1. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$4|иу фæстиуæг|$4 фæстиуæджы}}.',
'querypage-no-updates' => 'Ацы фарсы нæуæгкæнын ныртæккæ хицæн у.
Цы рардтæ дзы ис, уыдон нæуæг нæ кæндзысты.',
'wrong_wfQuery_params' => 'Рæдыд параметртæ wfQuery() функцийæн<br />
'qbbrowse' => 'Bation (browse)',
'qbedit' => 'Mag-edit',
'qbpageoptions' => 'Ining bulung',
-'qbpageinfo' => 'Kontekstu/kabilian',
'qbmyoptions' => 'Deng kakung bulung',
'qbspecialpages' => 'Bulung a makabukud',
'faq' => 'Maralas a Kukutang (MAK)',
'qbbrowse' => 'Trifouille',
'qbedit' => 'Editer',
'qbpageoptions' => 'Chol pache-lo',
-'qbpageinfo' => 'Conteske',
'qbmyoptions' => 'Mes paches',
'qbspecialpages' => 'Espéciales paches',
'faq' => 'FAQ',
'qbbrowse' => 'Przeglądanie',
'qbedit' => 'Edycja',
'qbpageoptions' => 'Ta strona',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Moje strony',
'qbspecialpages' => 'strony specjalne',
'faq' => 'FAQ',
'qbbrowse' => 'Sfeuja',
'qbedit' => 'Modìfica',
'qbpageoptions' => 'Opsion dla pàgina',
-'qbpageinfo' => 'Anformassion rësguard a la pàgina',
'qbmyoptions' => 'Mie opsion',
'qbspecialpages' => 'Pàgine speciaj',
'faq' => 'Chestion frequente',
'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
'invalid-content-data' => 'Dat dël contnù pa bon',
-'content-not-allowed-here' => 'Contnù ëd "$1" pa përmëttù an sla pagina [[$2]]',
+'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
# Content models
'content-model-wikitext' => 'test wiki',
'shared-repo-from' => 'da $1',
'shared-repo' => "n'archivi condivis",
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
-'upload-disallowed-here' => 'Për maleur a peul pa rampiassé sta figura.',
+'upload-disallowed-here' => 'A peul pa rampiassé sto archivi.',
# File reversion
'filerevert' => "Buté torna $1 tanme ch'a l'era",
'immobile-target-namespace-iw' => "Na liura interwiki a l'é pa na destinassion vàlida për tramudé na pàgina.",
'immobile-source-page' => 'Sta pàgina-sì as peul pa tramudesse.',
'immobile-target-page' => 'As peul pa tramudesse vers cost tìtol ëd destinassion.',
-'bad-target-model' => 'La destinassion vorsùa a dòvra un model ëd contnù diferent. As peul pa convertisse da $1 a $2.',
+'bad-target-model' => 'La destinassion vorsùa a deuvra un model ëd contnù diferent. As peul pa convertisse da $1 a $2.',
'imagenocrossnamespace' => "As peul pa tramudesse n'archivi a në spassi nominal diferent",
'nonfile-cannot-move-to-file' => "As peul nen tramudesse lòn ch'a l'é pa n'archivi a lë spassi nominal dj'archivi",
'imagetypemismatch' => "La neuva estension ëd l'archivi a corispond pa a sò tipo",
# Info page
'pageinfo-title' => 'Anformassion për «$1»',
+'pageinfo-not-current' => "L'anformassion a peul mach esse mostà për la revision corenta.",
'pageinfo-header-basic' => 'Anformassion ëd base',
'pageinfo-header-edits' => 'Modìfiche',
'pageinfo-header-restrictions' => 'Protession ëd la pàgina',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
'pageinfo-templates' => '{{PLURAL:$1|stamp contnù|stamp contnù}} ($1)',
'pageinfo-toolboxlink' => 'Anformassion an sla pàgina',
+'pageinfo-redirectsto' => 'Ridiression-a a',
+'pageinfo-redirectsto-info' => 'anformassion',
+'pageinfo-contentpage' => 'Contà com na pagina ëd contnù',
+'pageinfo-contentpage-yes' => 'É!',
+'pageinfo-protect-cascading' => 'Le protession a son a cascada da sì',
+'pageinfo-protect-cascading-yes' => 'É!',
+'pageinfo-protect-cascading-from' => 'Le protession a son a cascada da',
# Patrolling
'markaspatrolleddiff' => 'Marché coma verificà',
'exif-orientation-4' => 'Arvirà dzor-sota',
'exif-orientation-5' => 'Arvirà dzor-sota e ëd 90° contramostra',
'exif-orientation-6' => 'Arvirà ëd 90° contramostra',
-'exif-orientation-7' => 'Arvirà dzorsota e ëd 90° ant ël sens dla mostra',
+'exif-orientation-7' => 'Arvirà dzor-sota e ëd 90° ant ël sens dla mostra',
'exif-orientation-8' => 'Arvirà ëd 90° ant ël sens dla mostra',
-'exif-planarconfiguration-1' => 'për blòch (chunky)',
+'exif-planarconfiguration-1' => 'dàit a blòch',
'exif-planarconfiguration-2' => 'an planar',
'exif-xyresolution-i' => '$1 pont për pòles (dpi)',
'exif-exposureprogram-2' => 'Programa normal',
'exif-exposureprogram-3' => 'Priorità ëd temp',
'exif-exposureprogram-4' => 'Priorità ëd diaframa',
-'exif-exposureprogram-5' => "Programa creativ (coregiù për avej pì ëd profondità 'd camp)",
-'exif-exposureprogram-6' => "Programa d'assion (coregiù për avej ël temp pì curt che as peul)",
-'exif-exposureprogram-7' => 'Programa ritrat (për fotografìe pijaite da davsin, con lë sfond fòra feu)',
+'exif-exposureprogram-5' => "Programa creativ (coregiù për avèj pì ëd profondità 'd camp)",
+'exif-exposureprogram-6' => "Programa d'assion (coregiù për avèj ël temp pì curt che as peul)",
+'exif-exposureprogram-7' => 'Programa ritrat (për fotografìe pijàite da davzin, con lë sfond fòra feu)',
'exif-exposureprogram-8' => 'Panorama (sogèt lontan e con lë sfond a feu)',
'exif-subjectdistance-value' => '$1 méter',
-'exif-meteringmode-0' => 'Pa conossù',
+'exif-meteringmode-0' => 'Dësconossù',
'exif-meteringmode-1' => 'Media',
'exif-meteringmode-2' => 'Media centrà',
-'exif-meteringmode-3' => 'Quadrèt (Spot)',
-'exif-meteringmode-4' => 'Vàire quadrèt (MultiSpot)',
-'exif-meteringmode-5' => 'Schema (Pattern)',
+'exif-meteringmode-3' => 'Quadrèt',
+'exif-meteringmode-4' => 'Vàire quadrèt',
+'exif-meteringmode-5' => 'Schema',
'exif-meteringmode-6' => 'Parsial',
'exif-meteringmode-255' => "n'àutr",
'qbbrowse' => 'لبو',
'qbedit' => 'لکھو',
'qbpageoptions' => 'اے صفہ',
-'qbpageinfo' => 'محول',
'qbmyoptions' => 'میرے صفے',
'qbspecialpages' => 'خاص صفے',
'faq' => 'FAQ',
'qbbrowse' => 'Pradirēis',
'qbedit' => 'Redigīs',
'qbpageoptions' => 'Šin pāusan',
-'qbpageinfo' => 'Kōnteksts',
'qbmyoptions' => 'Majāi pāusai',
'qbspecialpages' => 'Speciālai pāusai',
'faq' => 'Ukadeznai prasīsenei',
'qbbrowse' => 'سپړل',
'qbedit' => 'سمول',
'qbpageoptions' => 'همدا مخ',
-'qbpageinfo' => 'متن',
'qbmyoptions' => 'زما پاڼې',
'qbspecialpages' => 'ځانګړي مخونه',
'faq' => 'ډ-ځ-پ',
په ټولو ويکي ګانو کې د ژباړې د ورګډولو او يا هم د ژباړې د سمون او بدلون لپاره د مېډياويکي د ځايتابه پروژه [//translatewiki.net/ translatewiki.net] وکاروۍ.',
'editinginterface' => "'''ګواښنه:''' تاسو په يوه داسې مخ کې بدلون راولی کوم چې د يوې پوستکالی د ليدنمخ متن په توګه کارېږي.
په همدې مخ کې بدلون راوستل به د نورو کارنانو د ليدنمخ بڼه اغېزمنه کړي.
-د ژباړې لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده او د همدې پر کارولو غور وکړی.",
+د ژباړې د ورګډولو او بدلون لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده.",
'sqlhidden' => '(د SQL پوښتن پټ دی)',
'namespaceprotected' => "تاسې د '''$1''' په نوم-تشيال کې د مخونو د سمولو اجازه نه لرۍ.",
'customcssprotected' => 'تاسې د دې CSS مخ د سمولو اجازه نه لرۍ، دا ځکه چې دا مخ د بل کارن شخصي امستنې لري.',
'upload' => 'دوتنه پورته کول',
'uploadbtn' => 'دوتنه پورته کول',
'uploadnologin' => 'غونډال کې نه ياست ننوتي',
-'uploadnologintext' => 'د دوتنو د پورته کولو لپاره بايد غونډال کې [[Special:Userlogin|ننوځۍ]].',
+'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
'uploaderror' => 'د پورته کولو ستونزه',
'uploadtext' => "د دوتنې د پورته کېدو لپاره لاندينی چوکاټ وکاروۍ.
که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنګېدو يادښتونه]] هم کتلای شی.
'wlheader-showupdated' => "* هغه مخونه چې وروستی ځل ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک نښه شوي.",
'watchlistcontains' => 'ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.',
'iteminvalidname' => "د '$1' توکي سره ستونزه، ناسم نوم ...",
-'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر يوه ساعت|تېرو '''$2''' ساعتونو}} کې تر $4 نېټې او $5 بجو پېښ شوي.",
+'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
'wlshowlast' => 'وروستي $1 ساعتونه $2 ورځې $3 ښکاره کړه',
'watchlist-options' => 'د کتنلړ خوښنې',
# Info page
'pageinfo-title' => 'د "$1" مالومات',
+'pageinfo-header-basic' => 'بنسټيز مالومات',
'pageinfo-header-edits' => 'د سمون پېښليک',
+'pageinfo-header-restrictions' => 'مخ ژغورنه',
+'pageinfo-header-properties' => 'د مخ ځانتياوې',
+'pageinfo-display-title' => 'ښکارېدونکی سرليک',
+'pageinfo-article-id' => 'د مخ پېژند',
+'pageinfo-robot-index' => 'ليکلړوړ',
+'pageinfo-robot-noindex' => 'ليکلړوړ نه',
'pageinfo-views' => 'د کتنو شمېر',
'pageinfo-watchers' => 'د مخ د کتونکو شمېر',
+'pageinfo-redirects-name' => 'دې مخ ته ورګرځونې',
+'pageinfo-subpages-name' => 'دې مخ ته څېرمه مخونه',
+'pageinfo-firstuser' => 'مخ جوړونکی',
'pageinfo-edits' => 'د ټولو سمونونو شمېر',
# Skin names
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Minhas páginas',
'qbspecialpages' => 'Páginas especiais',
'faq' => 'FAQ',
'vector-action-protect' => 'Proteger',
'vector-action-undelete' => 'Restaurar',
'vector-action-unprotect' => 'Alterar protecção',
-'vector-simplesearch-preference' => 'Activar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Activar barra de buscas simplificada (apenas no tema Vector)',
'vector-view-create' => 'Criar',
'vector-view-edit' => 'Editar',
'vector-view-history' => 'Ver histórico',
$messages = array(
# User preference toggles
-'tog-underline' => 'Sublinhar ligação:',
+'tog-underline' => 'Sublinhar links:',
'tog-justify' => 'Justificar parágrafos',
'tog-hideminor' => 'Ocultar edições menores nas mudanças recentes',
'tog-hidepatrolled' => 'Ocultar edições patrulhadas nas mudanças recentes',
'tog-numberheadings' => 'Auto-numerar cabeçalhos',
'tog-showtoolbar' => 'Mostrar barra de edição (JavaScript)',
'tog-editondblclick' => 'Editar páginas quando houver clique duplo (JavaScript)',
-'tog-editsection' => 'Habilitar edição de seção via ligações [editar]',
+'tog-editsection' => 'Ativar a edição de seções com links [editar]',
'tog-editsectiononrightclick' => 'Habilitar edição de seção por clique com o botão direito no título da seção (JavaScript)',
'tog-showtoc' => 'Mostrar Tabela de Conteúdos (para páginas com mais de três cabeçalhos)',
'tog-rememberpassword' => 'Recordar os meus dados neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
'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-oldsig' => 'Assinatura existente:',
-'tog-fancysig' => 'Tratar assinatura como wikitexto (sem ligação automática)',
+'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar ligações de acessibilidade "ir para"',
+'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
'tog-watchlisthideown' => 'Ocultar as minhas edições da lista de páginas vigiadas',
'listingcontinuesabbrev' => 'cont.',
'index-category' => 'Páginas indexadas',
'noindex-category' => 'Páginas não indexadas',
-'broken-file-category' => 'Páginas com ligações quebradas para arquivos',
+'broken-file-category' => 'Páginas com links inválidos para arquivos',
'about' => 'Sobre',
'article' => 'Página de conteúdo',
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Minhas páginas',
'qbspecialpages' => 'Páginas especiais',
'faq' => 'FAQ',
'vector-action-protect' => 'Proteger',
'vector-action-undelete' => 'Restaurar',
'vector-action-unprotect' => 'Alterar a proteção',
-'vector-simplesearch-preference' => 'Ativar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Ativar barra simplificada de buscas (apenas no skin Vector)',
'vector-view-create' => 'Criar',
'vector-view-edit' => 'Editar',
'vector-view-history' => 'Ver histórico',
'history_short' => 'Histórico',
'updatedmarker' => 'atualizado desde a minha última visita',
'printableversion' => 'Versão para impressão',
-'permalink' => 'Ligação permanente',
+'permalink' => 'Link permanente',
'print' => 'Imprimir',
'view' => 'Ver',
'edit' => 'Editar',
# Main script and global functions
'nosuchaction' => 'Ação inexistente',
'nosuchactiontext' => 'A ação especificada pela URL é inválida.
-Você deve ter se enganado ao digitar a URL, ou seguiu uma ligação incorreta.
+Você deve ter se enganado ao digitar a URL, ou acessou um link incorreto.
Isso também pode indicar um erro no software usado no sítio {{SITENAME}}.',
'nosuchspecialpage' => 'Esta página especial não existe',
'nospecialpagetext' => '<strong>Você requisitou uma página especial inválida.</strong>
# General errors
'error' => 'Erro',
'databaseerror' => 'Erro no banco de dados',
-'dberrortext' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
-Isto pode indicar um problema com o \'\'software\'\'.
+'dberrortext' => 'Ocorreu um erro de sintaxe na busca no banco de dados.
+Isto pode indicar um bug no software.
A última tentativa de busca no banco de dados foi:
-<blockquote><tt>$1</tt></blockquote>
-na função "<tt>$2</tt>".
-O banco de dados retornou o erro "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+na função "<code>$2</code>".
+O banco de dados retornou o erro "<samp>$3: $4</samp>".',
'dberrortextcl' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
A última tentativa de busca no banco de dados foi:
"$1"
Quem fez o bloqueio oferece a seguinte explicação: $1',
'missing-article' => 'O banco de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome "$1" $2.
-Isso normalmente é causado ao acessar uma ligação de diferença (diff) desatualizada ou para o histórico de uma página que foi apagada.
+Isso normalmente é causado ao acessar um link de diferença (dif) desatualizado ou para o histórico de uma página que foi apagada.
-Se não for este o caso, você pode ter encontrado um defeito (bug) no software.
-Anote o URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].',
+Se este não for o caso, você pode ter encontrado um defeito (bug) no software.
+Anote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].',
'missingarticle-rev' => '(revisão#: $1)',
'missingarticle-diff' => '(Dif.: $1, $2)',
'readonly_lag' => 'O banco de dados foi automaticamente bloqueado enquanto os servidores secundários se sincronizam com o principal',
'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o usuário.',
'passwordreset-email' => 'Endereço de e-mail:',
'passwordreset-emailtitle' => 'Detalhes da conta em {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, do endereço IP $1) solicitou um lembrete do seu detalhes de conta para {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
+'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, a partir do endereço IP $1)
+solicitou um lembrete dos seus detalhes de conta para {{SITENAME}} ($4).
+{{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
$2
-{{PLURAL:$3|Esta senha temporária |Essas senhas temporárias}} vão expirar em {{PLURAL:$5|um dia|$5 dias}}.
-Você deve efetuar login e escolher uma nova senha agora. Se você conseguir lembrar da senha, ignore este e-mail e continue usando sua senha anterior, do contrário, prossiga com as instruções clicando na ligação.',
+{{PLURAL:$3|Esta senha temporária vai|Essas senhas temporárias vão}} expirar em {{PLURAL:$5|um dia|$5 dias}}.
+Você deve efetuar login e escolher uma nova senha agora.
+Se você conseguir lembrar da senha, ignore este e-mail e continue
+usando sua senha anterior. Caso contrário, prossiga com as instruções
+disponíveis no link.',
'passwordreset-emailtext-user' => 'O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
$2
'bold_tip' => 'Texto em negrito',
'italic_sample' => 'Texto em itálico',
'italic_tip' => 'Texto em itálico',
-'link_sample' => 'Título da ligação',
-'link_tip' => 'Ligação interna',
-'extlink_sample' => 'http://www.example.com título da ligação',
-'extlink_tip' => 'Ligação externa (lembre-se do prefixo http://)',
+'link_sample' => 'Título do link',
+'link_tip' => 'Link interno',
+'extlink_sample' => 'http://www.example.com título do link',
+'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
'headline_sample' => 'Conteúdo do cabeçalho',
'headline_tip' => 'Seção de nível 2',
'nowiki_sample' => 'Inserir texto não-formatado aqui',
'image_sample' => 'Exemplo.jpg',
'image_tip' => 'Arquivo embutido',
'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Ligação para o arquivo',
+'media_tip' => 'Link para o arquivo',
'sig_tip' => 'Sua assinatura, com hora e data',
'hr_tip' => 'Linha horizontal (use de forma moderada)',
A senha para esta nova conta pode ser alterada na página ''[[Special:ChangePassword|de troca de senha]]'', após a autenticação.",
'newarticle' => '(Nova)',
-'newarticletext' => "Você seguiu uma ligação para uma página que ainda não existe.
+'newarticletext' => "Você seguiu um link para uma página que ainda não existe.
Para criá-la, comece escrevendo na caixa abaixo (veja [[{{MediaWiki:Helppage}}|a página de ajuda]] para mais informações).
Se você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.",
'anontalkpagetext' => "---- ''Esta é a página de discussão para um usuário anônimo que ainda não criou uma conta ou que não a usa, de forma que temos de utilizar o endereço de IP para identificá-lo(a). Tal endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha que comentários irrelevantes foram direcionados a você, por gentileza, [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]], a fim de evitar futuras confusões com outros usuários anônimos.''",
ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página]</span>.',
'noarticletext-nopermission' => 'No momento, não há conteúdo nesta página
Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas,
-ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>.',
+ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>. Note que, no entanto, você não tem permissão para criar esta página.',
'missing-revision' => 'A revisão #$1 da página denominada "{{PAGENAME}}" não existe.
Isto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.
'timezoneregion-indian' => 'Oceano Índico',
'timezoneregion-pacific' => 'Oceano Pacífico',
'allowemail' => 'Permitir que outros usuários me enviem e-mails',
-'prefs-searchoptions' => 'Opções de busca',
+'prefs-searchoptions' => 'Busca',
'prefs-namespaces' => 'Espaços nominais',
'defaultns' => 'Caso contrário pesquisar nestes espaços nominais:',
'default' => 'padrão',
'protect-text' => 'Intro of the protection interface. See [[meta:Protect]] for more information.',
'protect-default' => '{{Identical|Default}}',
'protect-fallback' => 'This message is used as an option in the protection form on wikis were extra protection levels have been configured.',
-'protect-summary-cascade' => 'Used in edit summary when cascade protecting a page.',
+'protect-summary-cascade' => 'Used in edit summary when cascade protecting a page. Appears in protection log. See [[Special:Log]] and [[m:Special:Log]].
+
+Also used in [[Special:ProtectedPages]] when a page is cascade protected. See example: [[m:Special:ProtectedPages]].<br />
+See also:
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}',
'protect-expiring' => 'Used in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
* $1 is a date and time
* $2 is a date (optional)
{{Identical|Create}}',
# Restriction levels
-'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.",
-'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.",
-'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.",
+'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
+'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
+'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
# Undelete
'undelete' => 'Name of special page for admins as displayed in [[Special:SpecialPages]].
# Info page
'pageinfo-title' => 'Page title for action=info. Parameters:
* $1 is the page name',
-'pageinfo-not-current' => 'Error message displayed when information for an old revision is requested.',
+'pageinfo-not-current' => 'Error message displayed when information for an old revision is requested. Example: [{{fullurl:Project:News|oldid=4266597&action=info}}]',
'pageinfo-header-basic' => 'Table section header in action=info.',
'pageinfo-header-edits' => 'Table section header in action=info.',
'pageinfo-header-restrictions' => 'Table section header in action=info.',
'pageinfo-templates' => 'The list of templates transcluded within the page. Parameters:
* $1 is the number of templates transcluded within the page.',
'pageinfo-toolboxlink' => "Information link for the page (like 'What links here', but to action=info for the current page instead)",
+'pageinfo-redirectsto' => 'Key for the row shown if this page is a redirect.',
+'pageinfo-redirectsto-info' => 'Text to put in parentheses for the link to the action=info of the redirect target.',
+'pageinfo-contentpage' => 'Key for the row shown on [{{fullurl:News|action=info}} action=info] if this page is [[mw:Manual:Article count|counted as a content page]]',
+'pageinfo-contentpage-yes' => 'Yes, this page is a content page',
+'pageinfo-protect-cascading' => 'Key for the row which shows whether this page has cascading protection enabled
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-yes' => 'Yes, protections are cascading from here
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-from' => 'Key for a list of pages where protections are cascading from',
# Skin names
'skinname-standard' => '{{optional}}
'qbbrowse' => 'Maskapuy',
'qbedit' => "Llamk'apuy",
'qbpageoptions' => "P'anqap akllanankuna",
-'qbpageinfo' => "P'anqamanta willay",
'qbmyoptions' => 'Akllanaykuna',
'qbspecialpages' => "Sapaq p'anqakuna",
'faq' => 'Pasaq tapuykuna',
'qbbrowse' => 'Răsfoiește',
'qbedit' => 'Modificare',
'qbpageoptions' => 'Opțiuni ale paginii',
-'qbpageinfo' => 'Informații ale paginii',
'qbmyoptions' => 'Paginile mele',
'qbspecialpages' => 'Pagini speciale',
'faq' => 'Întrebări frecvente',
'right-rollback' => 'Revocarea rapidă a modificărilor ultimului utilizator care a modificat o pagină particulară',
'right-markbotedits' => 'Marchează revenirea ca modificare efectuată de robot',
'right-noratelimit' => 'Neafectat de limitele raportului',
-'right-import' => 'Importă pagini de la alte wiki',
+'right-import' => 'Importă pagini de la alte wikiuri',
'right-importupload' => 'Importă pagini dintr-o încărcare de fișier',
'right-patrol' => 'Marchează modificările altora ca patrulate',
'right-autopatrol' => 'Modificările proprii marcate ca patrulate',
'uploadnewversion-linktext' => 'Încarcă o versiune nouă a acestui fișier',
'shared-repo-from' => 'de la $1',
'shared-repo' => 'un depozit partajat',
-'upload-disallowed-here' => 'Din păcate, nu puteți suprascrie această imagine.',
+'upload-disallowed-here' => 'Nu puteți suprascrie acest fișier.',
# File reversion
'filerevert' => 'Revenire $1',
# Info page
'pageinfo-title' => 'Informații pentru „$1”',
+'pageinfo-not-current' => 'Informațiile se pot afișa doar pentru versiunea curentă.',
'pageinfo-header-basic' => 'Informații de bază',
'pageinfo-header-edits' => 'Istoric modificări',
'pageinfo-header-restrictions' => 'Protecție pagină',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Format inclus|Formate incluse}} ($1)',
'pageinfo-toolboxlink' => 'Informații despre pagină',
+'pageinfo-redirectsto' => 'Redirecționează către',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Numărată ca pagină cu conținut',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Protecțiile provin în cascadă de aici',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Protecțiile provin în cascadă de la',
# Skin names
'skinname-standard' => 'Clasic',
'qbbrowse' => 'Sfoglie',
'qbedit' => 'Cange',
'qbpageoptions' => 'Pàgene currende',
-'qbpageinfo' => 'Condeste',
'qbmyoptions' => 'Pàggene mije',
'qbspecialpages' => 'Pàggene speciale',
'faq' => 'FAQ',
* @author HalanTul
* @author Huuchin
* @author Illusion
+ * @author Incnis Mrsi
* @author Iniquity
* @author Innv
* @author Jackie
* @author Sagan
* @author Shirayuki
* @author Sk
+ * @author Spider
* @author TarzanASG
* @author Temuri rajavi
* @author Vago
'qbbrowse' => 'Просмотреть',
'qbedit' => 'Править',
'qbpageoptions' => 'Настройки страницы',
-'qbpageinfo' => 'Сведения о странице',
'qbmyoptions' => 'Ваши настройки',
'qbspecialpages' => 'Специальные страницы',
'faq' => 'ЧаВО',
'vector-action-protect' => 'Защитить',
'vector-action-undelete' => 'Восстановить',
'vector-action-unprotect' => 'Изменить защиту',
-'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80аÑ\81Ñ\88иÑ\80еннÑ\8bе поиÑ\81ковÑ\8bе подÑ\81казки (только для оформления «Векторное»)',
+'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83пÑ\80оÑ\89Ñ\91ннÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80окÑ\83 поиÑ\81ка (только для оформления «Векторное»)',
'vector-view-create' => 'Создание',
'vector-view-edit' => 'Правка',
'vector-view-history' => 'История',
'edit-already-exists' => 'Невозможно создать новую страницу.
Она уже существует.',
'defaultmessagetext' => 'Текст по умолчанию',
+'content-failed-to-parse' => 'Содержимое $2 не соответствует типу $1: $3.',
+'invalid-content-data' => 'Недопустимые данные',
+'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекст',
+'content-model-text' => 'обычный текст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Внимание. Эта страница содержит слишком много вызовов ресурсоёмких функций.
'shared-repo-from' => 'из $1',
'shared-repo' => 'общего хранилища',
'shared-repo-name-wikimediacommons' => 'Викисклада',
-'upload-disallowed-here' => 'Ð\9a Ñ\81ожалениÑ\8e, вÑ\8b не можеÑ\82е пеÑ\80езапиÑ\81аÑ\82Ñ\8c Ñ\8dÑ\82о изобÑ\80ажение.',
+'upload-disallowed-here' => 'Ð\92Ñ\8b не можеÑ\82е пеÑ\80езапиÑ\81аÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 Ñ\84айл.',
# File reversion
'filerevert' => 'Возврат к старой версии $1',
'undeletedrevisions' => '$1 {{PLURAL:$1|изменение|изменения|изменений}} восстановлено',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}} восстановлено',
'undeletedfiles' => '$1 {{PLURAL:$1|файл восстановлен|файла восстановлено|файлов восстановлено}}',
-'cannotundelete' => 'Ошибка восстановления. Возможно, кто-то другой уже восстановил страницу.',
+'cannotundelete' => 'Ошибка восстановления:
+$1',
'undeletedpage' => "'''Страница «$1» была восстановлена.'''
Для просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
'immobile-target-namespace-iw' => 'Ссылка интервики не может быть использована для переименования.',
'immobile-source-page' => 'Эту страницу нельзя переименовать.',
'immobile-target-page' => 'Нельзя присвоить странице это имя.',
+'bad-target-model' => 'Невозможно преобразовать $1 в $2: несовместимые модели данных.',
'imagenocrossnamespace' => 'Невозможно дать файлу имя из другого пространства имён',
'nonfile-cannot-move-to-file' => 'Невозможно переименовывать страницы в файлы',
'imagetypemismatch' => 'Новое расширение файла не соответствует его типу',
# Info page
'pageinfo-title' => 'Сведения по «$1»',
+'pageinfo-not-current' => 'Данные предоставляются только для текущей правки.',
'pageinfo-header-basic' => 'Основные сведения',
'pageinfo-header-edits' => 'История изменений',
'pageinfo-header-restrictions' => 'Защита страницы',
'pageinfo-magic-words' => '{{PLURAL:$1|Магическое слово|Магические слова}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрытая категория|Скрытых категорий}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Шаблон|Шаблонов}} ($1)',
+'pageinfo-toolboxlink' => 'Сведения о странице',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading-yes' => 'Да',
# Skin names
'skinname-standard' => 'Классическое',
# Scary transclusion
'scarytranscludedisabled' => '[Интервики-включение отключено]',
'scarytranscludefailed' => '[Ошибка обращения к шаблону $1]',
+'scarytranscludefailed-httpstatus' => '[Не удалось загрузить шаблон для $1: HTTP $2]',
'scarytranscludetoolong' => '[Слишком длинный URL]',
# Delete conflict
'sqlite-no-fts' => '$1 без поддержки полнотекстового поиска',
# New logging system
-'logentry-delete-delete' => '$1 удалил страницу $3',
+'logentry-delete-delete' => '$1 {{GENDER:$1|удалил|удалила}} страницу $3',
'logentry-delete-restore' => '$1 восстановил страницу $3',
'logentry-delete-event' => '$1 изменил видимость {{PLURAL:$5|$5 записи журнала|$5 записей журнала|$5 записей журнала}} на $3: $4',
'logentry-delete-revision' => '$1 изменил видимость {{PLURAL:$5|$5 версии|$5 версий|$5 версий}} на странице $3: $4',
'qbbrowse' => 'Переглядати',
'qbedit' => 'Едітовати',
'qbpageoptions' => 'Тота сторінка',
-'qbpageinfo' => 'Контекст',
'qbmyoptions' => 'Мої сторінкы',
'qbspecialpages' => 'Шпеціалны сторінкы',
'faq' => 'Часты звідованя',
'qbbrowse' => 'ब्राउस् इत्येतत् करोतु।',
'qbedit' => 'सम्पाद्यताम्',
'qbpageoptions' => 'इदं पृष्ठम्',
-'qbpageinfo' => 'प्रसंगः',
'qbmyoptions' => 'मम पृष्ठानि',
'qbspecialpages' => 'विशेषपृष्ठानि',
'faq' => 'बहुधा पृच्छ्यमानाः प्रश्नाः',
'qbbrowse' => 'Көр',
'qbedit' => 'Уларыт',
'qbpageoptions' => 'Бу сирэй',
-'qbpageinfo' => 'Ис хоһооно',
'qbmyoptions' => 'Мин сирэйдэрим',
'qbspecialpages' => 'Аналлаах сирэйдэр',
'faq' => 'FAQ',
'qbbrowse' => 'Sendra',
'qbedit' => 'Tońge',
'qbpageoptions' => 'Noa sakam',
-'qbpageinfo' => 'Sakam reaḱ thuti',
'qbmyoptions' => 'In̕anḱ sakamko',
'qbspecialpages' => 'Asokay teaḱ sakamko',
'faq' => 'Baḍae kupuliko',
'last' => 'Laha renaḱ',
'page_first' => 'Pahilaḱ',
'page_last' => 'Mucạt́aḱ',
-'histlegend' => "Farak bachao: oka nãwã aroeko tulạoem menet́kan, onako cinhạ em kate boloḱ se latar baṭon linmẽ.<br/>
+'histlegend' => "Farak bachao: oka nãwã aroeko tulạoem menet́kan, onako cinhạ em kate boloḱ se latar baṭon linmẽ.<br />
Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:last}})''' = laha reaḱ nãwã aroe sãote tulạo, '''{{int:minoreditletter}}''' = huḍiń sompadon.",
'history-fieldset-title' => 'Sendray jaṛ',
'history-show-deleted' => 'khạli get giḍiyaḱ koge',
'qbbrowse' => 'Sfogghia',
'qbedit' => 'Cancia',
'qbpageoptions' => 'Opzioni pàggina',
-'qbpageinfo' => 'Nfurmazzioni supra la pàggina',
'qbmyoptions' => 'Li mè pàggini',
'qbspecialpages' => 'Pàggini spiciali',
'faq' => 'Dumanni cumuni',
'qbbrowse' => 'Brouse',
'qbedit' => 'Edit',
'qbpageoptions' => 'This page',
-'qbpageinfo' => 'Context',
'qbmyoptions' => 'Ma pages',
'qbspecialpages' => 'Byordinar pages',
'faq' => 'ASQ',
'qbbrowse' => 'Iffuglia',
'qbedit' => 'Mudifigga',
'qbpageoptions' => 'Prifirenzi pàgina',
-'qbpageinfo' => "Infuimmazioni i' la pàgina",
'qbmyoptions' => "Li me' pàgini",
'qbspecialpages' => 'Pàgini ippiziari',
'faq' => 'FAQ (infuimmazioni e aggiuddu)',
'qbbrowse' => 'Bláđe',
'qbedit' => 'Rievdat',
'qbpageoptions' => 'Siidoásahusat',
-'qbpageinfo' => 'Siiddu dieđut',
'qbmyoptions' => 'Ásahusat',
'qbspecialpages' => 'Doaibmasiiddut',
'qbbrowse' => 'Prelistajte',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
'qbmyoptions' => 'Moje opcije',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'ČPP',
'qbbrowse' => 'පිරික්සන්න',
'qbedit' => 'සංස්කරණය',
'qbpageoptions' => 'මෙම පිටුව',
-'qbpageinfo' => 'සන්දර්භය',
'qbmyoptions' => 'මගේ පිටු',
'qbspecialpages' => 'විශේෂ පිටු',
'faq' => 'නිවිප්ර',
'qbbrowse' => 'Prehliadať',
'qbedit' => 'Upraviť',
'qbpageoptions' => 'Táto stránka',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Moje stránky',
'qbspecialpages' => 'Špeciálne stránky',
'faq' => 'Často kladené otázky',
'qbbrowse' => 'Prebrskaj',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Možnosti strani',
-'qbpageinfo' => 'Podatki o strani',
'qbmyoptions' => 'Moje možnosti',
'qbspecialpages' => 'Posebne strani',
'faq' => 'Najpogostejša vprašanja',
Prosimo, preverite delovanje strani, počakajte kratek čas in poskusite ponovno.
Morda želite poskusiti ob času manjše zasedenosti.',
-'license' => 'Licenca:',
+'license' => 'Licenciranje:',
'license-header' => 'Licenca',
'nolicense' => 'Nobeno',
'license-nopreview' => '(Predogled ni na voljo)',
'shared-repo-from' => 'iz $1',
'shared-repo' => 'skupno skladišče',
'shared-repo-name-wikimediacommons' => 'Wikimedijina Zbirka',
-'upload-disallowed-here' => 'Slike žal ne morete prepisati.',
+'upload-disallowed-here' => 'Datoteke žal ne morete prepisati.',
# File reversion
'filerevert' => 'Vrni $1',
'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'''.",
+'wlheader-showupdated' => "* Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
'watchmethod-recent' => 'med nedavnimi urejanji iščem spremljane strani',
'watchmethod-list' => 'med spremljanimi stranmi iščem nedavna urejanja',
'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
'dellogpage' => 'Dnevnik brisanja',
'dellogpagetext' => 'Spodaj je prikazan seznam nedavnih brisanj.',
'deletionlog' => 'dnevnik brisanja',
-'reverted' => 'Vrnjeno na prejšnjo redakcijo.',
+'reverted' => 'Vrnjeno na prejšnje urejanje.',
'deletecomment' => 'Razlog:',
'deleteotherreason' => 'Drugi/dodatni razlogi:',
'deletereasonotherlist' => 'Drug razlog',
'qbfind' => 'Fenda',
'qbedit' => 'Ändern',
'qbpageoptions' => 'Seytaoptiona',
-'qbpageinfo' => 'Seytadata',
'qbmyoptions' => 'Menne Seyta',
'qbspecialpages' => 'Spezialseyta',
'faq' => 'FAQ',
'qbbrowse' => 'Ka soo raadi',
'qbedit' => 'Wax ka bedel',
'qbpageoptions' => 'Boggaan',
-'qbpageinfo' => 'isku xiran',
'qbmyoptions' => 'Boggageyga',
'qbspecialpages' => 'Bogaga qaaska ah',
'faq' => 'SIL',
'qbbrowse' => 'Shfletoni',
'qbedit' => 'Redaktoni',
'qbpageoptions' => 'Kjo faqe',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Faqet e mia',
'qbspecialpages' => 'Faqet speciale',
'faq' => 'Pyetje që bëhen shpesh',
'qbbrowse' => 'Потражи',
'qbedit' => 'Уреди',
'qbpageoptions' => 'Поставке странице',
-'qbpageinfo' => 'Садржај странице',
'qbmyoptions' => 'Моје странице',
'qbspecialpages' => 'Посебне странице',
'faq' => 'НПП',
'vector-action-protect' => 'Заштити',
'vector-action-undelete' => 'Врати',
'vector-action-unprotect' => 'Промени заштиту',
-'vector-simplesearch-preference' => 'Ð\9fобоÑ\99Ñ\88ани пÑ\80едлози пÑ\80еÑ\82Ñ\80аге (само за тему „Векторско“)',
+'vector-simplesearch-preference' => 'УпÑ\80оÑ\88Ñ\9bено поÑ\99е за пÑ\80еÑ\82Ñ\80агÑ\83 (само за тему „Векторско“)',
'vector-view-create' => 'Направи',
'vector-view-edit' => 'Уреди',
'vector-view-history' => 'Историја',
'edit-already-exists' => 'Не могу да направим страницу.
Изгледа да она већ постоји.',
'defaultmessagetext' => 'Подразумевани текст поруке',
+'content-failed-to-parse' => 'Не могу да рашчланим садржај типа $2 за модел $1: $3',
+'invalid-content-data' => 'Неисправни подаци садржаја',
+'content-not-allowed-here' => 'Садржај модела „$1“ није дозвољен на страници [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекст',
+'content-model-text' => 'чист текст',
+'content-model-javascript' => 'јаваскрипт',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Упозорење:''' ова страница садржи превише позива за рашчлањивање.
'shared-repo' => 'заједничко складиште',
'shared-repo-name-wikimediacommons' => 'Викимедијина остава',
'filepage.css' => '/* CSS који је постављен овде се налази на страницама за опис датотека, као и на страним викијима */',
-'upload-disallowed-here' => 'Ð\9dажалоÑ\81Ñ\82, не можеÑ\82е да замениÑ\82е овÑ\83 Ñ\81лику.',
+'upload-disallowed-here' => 'Ð\9dе можеÑ\82е да замениÑ\82е овÑ\83 даÑ\82оÑ\82еку.',
# File reversion
'filerevert' => 'Врати $1',
'undeletedrevisions' => '{{PLURAL:$1|Измена је враћена|$1 измене су враћене|$1 измена је враћено}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека|датотеке|датотека}} је враћено',
'undeletedfiles' => '{{PLURAL:$1|Датотека је враћена|$1 датотеке су враћене|$1 датотека је враћено}}',
-'cannotundelete' => 'Неуспешно враћање. Неко други је то урадио пре вас.',
+'cannotundelete' => 'Враћање није успело:
+$1',
'undeletedpage' => "'''Страница $1 је враћена'''
Погледајте [[Special:Log/delete|историју брисања]] за записе о скорашњим брисањима и враћањима.",
'immobile-target-namespace-iw' => 'Међувики веза није исправно одредиште за премештање странице.',
'immobile-source-page' => 'Ова страница се не може преместити.',
'immobile-target-page' => 'Не могу да преместим на жељени наслов.',
+'bad-target-model' => 'Жељено одредиште користи другачији модел садржаја. Не могу да претворим из $1 у $2.',
'imagenocrossnamespace' => 'Датотека се не може преместити у именски простор који не припада датотекама.',
'nonfile-cannot-move-to-file' => 'Не-датотеке не можете преместити у именски простор за датотеке',
'imagetypemismatch' => 'Екстензија нове датотеке се не поклапа с њеном врстом',
# Info page
'pageinfo-title' => 'Подаци о „$1“',
+'pageinfo-not-current' => 'Подаци могу бити приказани само за текућу измену.',
'pageinfo-header-basic' => 'Основни подаци',
'pageinfo-header-edits' => 'Историја измена',
'pageinfo-header-restrictions' => 'Заштита странице',
'pageinfo-magic-words' => '{{PLURAL:$1|Магична реч|Магичне речи}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Укључени шаблон|Укључени шаблони}} ($1)',
+'pageinfo-toolboxlink' => 'Подаци о страници',
+'pageinfo-redirectsto' => 'Преусмерава на',
+'pageinfo-redirectsto-info' => 'подаци',
+'pageinfo-contentpage' => 'Рачуна се као страница са садржајем',
+'pageinfo-contentpage-yes' => 'Да',
# Skin names
'skinname-standard' => 'Класично',
# Scary transclusion
'scarytranscludedisabled' => '[Међувики укључивање шаблона је онемогућено]',
'scarytranscludefailed' => '[Добављање шаблона за $1 није успело]',
+'scarytranscludefailed-httpstatus' => '[Не могу да преузмем шаблон $1: HTTP $2]',
'scarytranscludetoolong' => '[URL адреса је предугачка]',
# Delete conflict
'qbbrowse' => 'Potraži',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'Sadržaj stranice',
'qbmyoptions' => 'Moje stranice',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'NPP',
'vector-action-protect' => 'Zaštiti',
'vector-action-undelete' => 'Vrati',
'vector-action-unprotect' => 'Promeni zaštitu',
-'vector-simplesearch-preference' => 'Poboljšani predlozi pretrage (samo za temu „Vektorsko“)',
+'vector-simplesearch-preference' => 'Uprošćeno polje za pretragu (samo za temu „Vektorsko“)',
'vector-view-create' => 'Napravi',
'vector-view-edit' => 'Uredi',
'vector-view-history' => 'Istorija',
'edit-already-exists' => 'Ne mogu da napravim stranicu.
Izgleda da ona već postoji.',
'defaultmessagetext' => 'Podrazumevani tekst poruke',
+'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
+'invalid-content-data' => 'Neispravni podaci sadržaja',
+'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'vikitekst',
+'content-model-text' => 'čist tekst',
+'content-model-javascript' => 'javaskript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Upozorenje:''' ova stranica sadrži previše poziva za raščlanjivanje.
'shared-repo' => 'zajedničko skladište',
'shared-repo-name-wikimediacommons' => 'Vikimedijina ostava',
'filepage.css' => '/* CSS koji je postavljen ovde se nalazi na stranicama za opis datoteka, kao i na stranim vikijima */',
-'upload-disallowed-here' => 'Nažalost, ne možete da zamenite ovu sliku.',
+'upload-disallowed-here' => 'Ne možete da zamenite ovu datoteku.',
# File reversion
'filerevert' => 'Vrati $1',
'undeletedrevisions' => '{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka|datoteke|datoteka}} je vraćeno',
'undeletedfiles' => '{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}',
-'cannotundelete' => 'Neuspešno vraćanje. Neko drugi je to uradio pre vas.',
+'cannotundelete' => 'Vraćanje nije uspelo:
+$1',
'undeletedpage' => "'''Stranica $1 je vraćena'''
Pogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
'immobile-target-namespace-iw' => 'Međuviki veza nije ispravno odredište za premeštanje stranice.',
'immobile-source-page' => 'Ova stranica se ne može premestiti.',
'immobile-target-page' => 'Ne mogu da premestim na željeni naslov.',
+'bad-target-model' => 'Željeno odredište koristi drugačiji model sadržaja. Ne mogu da pretvorim iz $1 u $2.',
'imagenocrossnamespace' => 'Datoteka se ne može premestiti u imenski prostor koji ne pripada datotekama.',
'nonfile-cannot-move-to-file' => 'Ne-datoteke ne možete premestiti u imenski prostor za datoteke',
'imagetypemismatch' => 'Ekstenzija nove datoteke se ne poklapa s njenom vrstom',
# Info page
'pageinfo-title' => 'Podaci o „$1“',
+'pageinfo-not-current' => 'Podaci mogu biti prikazani samo za tekuću izmenu.',
'pageinfo-header-basic' => 'Osnovni podaci',
'pageinfo-header-edits' => 'Istorija izmena',
'pageinfo-header-restrictions' => 'Zaštita stranice',
'pageinfo-magic-words' => '{{PLURAL:$1|Magična reč|Magične reči}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
+'pageinfo-toolboxlink' => 'Podaci o stranici',
+'pageinfo-redirectsto' => 'Preusmerava na',
+'pageinfo-redirectsto-info' => 'podaci',
+'pageinfo-contentpage' => 'Računa se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
# Skin names
'skinname-standard' => 'Klasično',
# Scary transclusion
'scarytranscludedisabled' => '[Međuviki uključivanje šablona je onemogućeno]',
'scarytranscludefailed' => '[Dobavljanje šablona za $1 nije uspelo]',
+'scarytranscludefailed-httpstatus' => '[Ne mogu da preuzmem šablon $1: HTTP $2]',
'scarytranscludetoolong' => '[URL adresa je predugačka]',
# Delete conflict
'qbbrowse' => 'Bleederje',
'qbedit' => 'Annerje',
'qbpageoptions' => 'Disse Siede',
-'qbpageinfo' => 'Siedendoatäie',
'qbmyoptions' => 'Mien Sieden',
'qbspecialpages' => 'Spezialsieden',
'faq' => 'Oafte stoalde Froagen',
'qbbrowse' => 'Sungsi',
'qbedit' => 'Édit',
'qbpageoptions' => 'Kaca ieu',
-'qbpageinfo' => 'Kontéks',
'qbmyoptions' => 'Kaca kuring',
'qbspecialpages' => 'Kaca husus',
'faq' => 'NLD',
'qbbrowse' => 'Bläddra igenom',
'qbedit' => 'Redigera',
'qbpageoptions' => 'Denna sida',
-'qbpageinfo' => 'Sidinformation',
'qbmyoptions' => 'Mina inställningar',
'qbspecialpages' => 'Specialsidor',
'faq' => 'FAQ',
'qbbrowse' => 'Vinjari',
'qbedit' => 'Hariri',
'qbpageoptions' => 'Ukurasa huu',
-'qbpageinfo' => 'Muktadha',
'qbmyoptions' => 'Kurasa zangu',
'qbspecialpages' => 'Kurasa za pekee',
'faq' => 'Maswali ya kawaida',
'qbbrowse' => 'Uoglůndańy',
'qbedit' => 'Sprowjej',
'qbpageoptions' => 'Ta zajta',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Moje zajty',
'qbspecialpages' => 'Szpecyjalne zajty',
'faq' => 'FAQ',
'qbbrowse' => 'உலவு',
'qbedit' => 'தொகு',
'qbpageoptions' => 'பக்க விருப்பத் தேர்வுகள்',
-'qbpageinfo' => 'பக்கத் தகவல்கள்',
'qbmyoptions' => 'என் விருப்பத்தேர்வுகள்',
'qbspecialpages' => 'சிறப்புப் பக்கங்கள்',
'faq' => 'அடிக்கடி கேட்கப்படும் கேள்விகள்',
'qbbrowse' => 'విహరించు',
'qbedit' => 'సవరించు',
'qbpageoptions' => 'ఈ పేజీ',
-'qbpageinfo' => 'సందర్భం',
'qbmyoptions' => 'నా పేజీలు',
'qbspecialpages' => 'ప్రత్యేక పేజీలు',
'faq' => 'తరచూ అడిగే ప్రశ్నలు',
'qbbrowse' => 'Мурур',
'qbedit' => 'Вироиш',
'qbpageoptions' => 'Ин саҳифа',
-'qbpageinfo' => 'Бофт',
'qbmyoptions' => 'Саҳифаҳои ман',
'qbspecialpages' => 'Саҳифаҳои вижа',
'faq' => 'Саволҳои тез-тез пурсидашуда',
'qbbrowse' => 'Murur',
'qbedit' => 'Viroiş',
'qbpageoptions' => 'In sahifa',
-'qbpageinfo' => 'Boft',
'qbmyoptions' => 'Sahifahoi man',
'qbspecialpages' => 'Sahifahoi viƶa',
'faq' => 'Savolhoi tez-tez pursidaşuda',
'qbbrowse' => 'สืบค้น',
'qbedit' => 'แก้ไข',
'qbpageoptions' => 'หน้านี้',
-'qbpageinfo' => 'บริบท',
'qbmyoptions' => 'หน้าของฉัน',
'qbspecialpages' => 'หน้าพิเศษ',
'faq' => 'คำถามถามบ่อย',
'qbbrowse' => 'Göz aýla',
'qbedit' => 'Redaktirle',
'qbpageoptions' => 'Bu sahypa',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Meniň sahypalarym',
'qbspecialpages' => 'Ýörite sahypalar',
'faq' => 'KSS',
'qbbrowse' => 'Basa-basahin',
'qbedit' => 'Baguhin',
'qbpageoptions' => 'Itong pahina',
-'qbpageinfo' => 'Konteksto',
'qbmyoptions' => 'Mga pahina ko',
'qbspecialpages' => 'Mga natatanging pahina',
'faq' => "Mga karaniwang itinatanong (''FAQ'')",
'qbbrowse' => 'Tara',
'qbedit' => 'Değiştir',
'qbpageoptions' => 'Bu sayfa',
-'qbpageinfo' => 'Bağlam',
'qbmyoptions' => 'Sayfalarım',
'qbspecialpages' => 'Özel sayfalar',
'faq' => 'SSS',
'qbbrowse' => 'كۆز يۈگۈرت',
'qbedit' => 'تەھرىر',
'qbpageoptions' => 'بۇ بەت',
-'qbpageinfo' => 'كونتېكست',
'qbmyoptions' => 'بەتلەرىم',
'qbspecialpages' => 'ئالاھىدە بەتلەر',
'faq' => 'كۆپ كۆرۈلىدىغان مەسىلىلەر',
'qbbrowse' => 'Переглянути',
'qbedit' => 'Редагувати',
'qbpageoptions' => 'Налаштування сторінки',
-'qbpageinfo' => 'Інформація про сторінку',
'qbmyoptions' => 'Мої налаштування',
'qbspecialpages' => 'Спеціальні сторінки',
'faq' => 'Часті питання',
'qbbrowse' => "Ko'rish",
'qbedit' => 'Tahrirlash',
'qbpageoptions' => 'Ushbu sahifa',
-'qbpageinfo' => "Sahifa haqida ma'lumot",
'qbmyoptions' => 'Mening sahifalarim',
'qbspecialpages' => 'Maxsus sahifalar',
'faq' => 'TSS',
'qbbrowse' => 'Sfoja',
'qbedit' => 'Canbia',
'qbpageoptions' => 'Opsion pajina',
-'qbpageinfo' => 'Informasion so ła pajina',
'qbmyoptions' => 'Łe me pajine',
'qbspecialpages' => 'Pagine speciali',
'faq' => 'Domande frequenti',
'qbbrowse' => 'Kacelta',
'qbedit' => 'Redaktiruida',
'qbpageoptions' => 'Necen lehtpolen järgendused',
-'qbpageinfo' => 'Andmused lehtpoles',
'qbmyoptions' => 'Minun järgendused',
'qbspecialpages' => 'Specialižed lehtpoled',
'faq' => 'PPK',
'qbbrowse' => 'Duyệt',
'qbedit' => 'Sửa đổi',
'qbpageoptions' => 'Trang này',
-'qbpageinfo' => 'Ngữ cảnh',
'qbmyoptions' => 'Trang cá nhân',
'qbspecialpages' => 'Trang đặc biệt',
'faq' => 'Câu hỏi thường gặp',
# Info page
'pageinfo-title' => 'Thông tin về “$1”',
+'pageinfo-not-current' => 'Thông tin được hiển thị có thể chỉ có liên quan đến phiên bản hiện hành.',
'pageinfo-header-basic' => 'Thông tin cơ bản',
'pageinfo-header-edits' => 'Lịch sử sửa đổi',
'pageinfo-header-restrictions' => 'Mức khóa trang',
'qbbrowse' => 'Padön',
'qbedit' => 'Redakön',
'qbpageoptions' => 'Pad at',
-'qbpageinfo' => 'Yumed',
'qbmyoptions' => 'Pads obik',
'qbspecialpages' => 'Pads patik',
'faq' => 'Säks suvo pasäköls',
# Groups
'group-user' => 'Сäüttijäd',
'group-sysop' => 'Praviťeľad',
-'group-all' => '{kõik)',
+'group-all' => '(kõik)',
'group-user-member' => 'cäüttijä',
'qbbrowse' => 'Kaeq',
'qbedit' => 'Toimõndaq',
'qbpageoptions' => 'Leheküle säädmine',
-'qbpageinfo' => 'Leheküle teedüs',
'qbmyoptions' => 'Mu säädmiseq',
'qbspecialpages' => 'Tallitusleheküleq',
'faq' => 'Sagõhõhe küsüdüq küsümiseq',
'qbbrowse' => 'Foyter',
'qbedit' => 'Candjî',
'qbpageoptions' => 'Cisse pådje ci',
-'qbpageinfo' => 'Contecse',
'qbmyoptions' => 'Mes pådjes',
'qbspecialpages' => 'Pådjes sipeciåles',
'qbbrowse' => 'Igdalikyat',
'qbedit' => 'Igliwat',
'qbpageoptions' => 'Ini nga pakli',
-'qbpageinfo' => 'Kontexto',
'qbmyoptions' => 'Akon mga pakli',
'qbspecialpages' => 'Mga pinaurog nga pakli',
'faq' => 'AGG',
Alayon paghulat makadali san-o ka inmutro pagsulod hin nga pakli utro.
$1',
+'pool-timeout' => 'An pagpaundang-hin-oras in naghuhulat hin trangka',
'pool-queuefull' => 'Puno an katitirok nga pila',
'pool-errorunknown' => 'Waray kasabti nga kasaypanan',
'protectedpagetext' => 'Ini nga pakli in pinasaliporan para mapugngan an mga pagliwat.',
'viewsourcetext' => 'Puydi ka kinmita ngan kinmopya han gintikangan han pakli:',
'viewyourtext' => "Puydi nim makit-an ngan makopya an tinikangan han '''imo mga pagliwat''' ha dinhi nga pakli:",
+'protectedinterface' => 'Ini nga pakli in nahatag hin teksto hit interface para han software han hin nga wiki, ngan in pinasasaliporan para makalikay hit pag-abuso.
+Para makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an kanan MediaWiki proyekto hin lokalisasyon.',
'sqlhidden' => '(nakatago an SQL query)',
'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
'customcssprotected' => 'Diri ka gintutugotan pagliwat hini nga CSS nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
'newpassword' => 'Bag-o nga tigaman-pagsulod:',
'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
+'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
'resetpass-submit-cancel' => 'Pasagdi',
'resetpass-temp-password' => 'Temporaryo nga tigaman-pagsakob:',
# Special:PasswordReset
+'passwordreset' => 'igreset an tigaman-hit-pagsulod',
+'passwordreset-text' => 'Kompletoha ini nga porma para makakarawat hin email hin pahinumdom han detalye han akawnt.',
'passwordreset-username' => 'Agnay hiton gumaramit:',
'passwordreset-domain' => 'Dominyo:',
+'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
'passwordreset-email' => 'E-mail adres:',
'passwordreset-emailtitle' => 'Mga detalye han akawnt ha {{SITENAME}}',
'passwordreset-emailelement' => 'Agnay han gumaramit: $1
'note' => "'''Pahibaro:'''",
'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas pa la ini.'''
¡Waray pa katipig an imo mga ginbag-o!",
+'continue-editing' => 'Padayon pagliwat',
'editing' => 'Ginliliwat an $1',
'creating' => 'Ginhihimo an $1',
'editingsection' => 'Ginliliwat an $1 (bahin)',
# History pages
'viewpagelogs' => 'Kitaa an mga log para hini nga pakli',
+'nohistory' => 'Waray kaagi hin pagliwat hin nga pakli.',
'currentrev' => 'Giurhii nga pagliwat',
'currentrev-asof' => 'Giuurhii nga pagliwat han $1',
'revisionasof' => 'Pagbabag-o han $1',
'history-show-deleted' => 'Ginpara la',
'histfirst' => 'Giunhani',
'histlast' => 'Giurhii',
+'historysize' => '({{PLURAL:$1|1 nga byte|$1 ka mga byte}})',
'historyempty' => '(waray sulod)',
# Revision feed
'timezoneregion-pacific' => 'Kalawdan Pasipiko',
'prefs-searchoptions' => 'Pamilnga',
'prefs-namespaces' => "Ngaran-lat'ang",
+'default' => 'aada-nga-daan',
'prefs-files' => 'Mga paypay',
'youremail' => 'E-mail:',
'username' => 'Agnay hiton gumaramit:',
'userrights-user-editname' => 'Igbutang an agnay han gumaramit:',
'editusergroup' => 'Igliwat han mga hugpo han gumaramit',
'editinguser' => "Igliliwat an mga katungod han gumaramit han gumaramit '''[[Gumaramit:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Igliwat an mga hugpo hin gumaramit',
+'saveusergroups' => 'Igtipig an mga hugpo han gumaramit',
'userrights-groupsmember' => 'Api han:',
'userrights-reason' => 'Katadungan:',
'userrights-no-interwiki' => '
'action-createpage' => 'pahimo hin mga pakli',
'action-minoredit' => 'butanga hin tigaman hinin nga pagliwat komo gutiay',
'action-move' => 'balhina ini nga pakli',
+'action-movefile' => 'igbalhin ini nga paypay',
+'action-upload' => 'igkarga-pasaka ini nga paypay',
+'action-reupload' => 'igsapaw ini nga aanhi nga paypay',
'action-delete' => 'paraa ini nga pakli',
'action-deleterevision' => 'igpara ini nga pagbag-o',
# Upload
'upload' => 'Pagkarga hin file',
'uploadbtn' => 'Igkarga an file',
+'uploadnologin' => 'Diri nakalog-in',
'upload-recreate-warning' => "'''Pahimatngon: An fayl nga may-ada hiton nga ngaran in ginpara o ginbalhin.'''
An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
+'uploadlog' => 'Talaan hin ginkarga-pasaka',
'uploadlogpage' => 'Talaan han mga ginkarga-paigbaw',
'filename' => 'Ngaran han fayl',
'filedesc' => 'Dalikyat nga pulong',
'filereuploadsummary' => 'Mga pagbal-iw ha fayl:',
'filesource' => 'Tinikangan:',
'ignorewarning' => 'Pabay-i an pahimatngon ngan igtipig la ngahaw',
+'filename-toolong' => 'Iton ngaran hin paypay in diri puyde na mas lapos pa ha 240 ka mga byte.',
+'badfilename' => 'An ngaran-han-paypay in ginliwat ngada ha "$1".',
'filename-tooshort' => 'An ngaran han fayl in halipot hin duro.',
+'filetype-banned' => 'Ini nga klase nga paypay in gindidire.',
'illegal-filename' => 'An ngaran han fayl in diri gintutugutan.',
'unknown-error' => 'Nahitabo an waray kasasabti nga sayop.',
+'tmp-create-error' => 'Diri makakahimo hin temporaryo nga paypay.',
+'tmp-write-error' => 'Sayop ha pagsurat hin temporaryo nga paypay.',
+'largefileserver' => 'Ini nga paypay in durudako kaysa ha ginpapakarawat han serbidor.',
'uploadwarning' => 'Pahimatngon han pagkarga paigbaw',
'savefile' => 'Igtipig an paypay',
'uploadedimage' => 'ginkarga-paigbaw "[[$1]]"',
'qbbrowse' => 'Lemmi',
'qbedit' => 'Soppi',
'qbpageoptions' => 'Xëtuw tànneef',
-'qbpageinfo' => 'Xëtuw xibaar',
'qbmyoptions' => 'Samay tànneef',
'qbspecialpages' => 'Xëti jagleel',
'faq' => 'Laaj yi ëpp',
'qbbrowse' => 'בלעטערט',
'qbedit' => 'ענדערן',
'qbpageoptions' => 'דער בלאט',
-'qbpageinfo' => 'קאנטעקסט',
'qbmyoptions' => 'מיינע בלעטער',
'qbspecialpages' => 'ספעציעלע בלעטער',
'faq' => 'מערסטע געפרעגטע פראגעס',
'file-too-large' => 'די טעקע וואָס איר האט אײַנגעגעבן איז צו גרויס.',
'filename-tooshort' => 'דער טעקענאמען איז צו קורץ',
'filetype-banned' => 'דער טיפ טעקע איז געאַסרט',
+'verification-error' => 'די טעקע איז נישט אדורכגעגאנגען טעקע פרואוואונג.',
+'hookaborted' => 'די מאדיפיצירונג איר האט פרובירט קען נישט ווערן דורכגעפירט צוליב א פארברייטערונג.',
'illegal-filename' => 'דער טעקע־נאָמען איז נישט ערלויבט',
'overwrite' => 'מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.',
'unknown-error' => 'אַן אומבאַקאַנט טעות איז פֿארגעקומען.',
'imageinvalidfilename' => 'דער ציל טעקע נאָמען איז נישט גילטיק.',
'fix-double-redirects' => 'דערהײַנטיקן ווײַטערפֿירונגען צום ארגינעלן טיטל',
'move-leave-redirect' => 'איבערלאזן א ווײַטערפֿירונג',
+'move-over-sharedrepo' => '== טעקע עקזיסטירט ==
+[[:$1]] עקזיסטירט אויף א געטיילטן רעפאזיטאריום. ווען מען באוועגט א טעקע צו דעם טיטל וועט דאס איבערשרייבן די געטיילטע טעקע.',
'file-exists-sharedrepo' => "ס'איז שוין פאראן א טעקע מיטן געקליבענעם נאמען אויף א געמיינזאם רעפאזיטאריום.
זייט אזוי גוט קלייבט אן אנדער נאמען.",
'import-interwiki-templates' => 'איינשילסן אלע מוסטערן',
'import-interwiki-submit' => 'אימפארט',
'import-interwiki-namespace' => 'ציל נאמענטייל:',
+'import-interwiki-rootpage' => 'ציל שטאמבלאט (אפציאנאל):',
'import-upload-filename' => 'טעקע נאמען:',
'import-comment' => 'הערה:',
'importtext' => 'ביטע עקספארטירט די טעקע פון דער מקור וויקי ניצנדיג דאס [[Special:Export|עקספארט הילפמיטל]], שפייכלט אײַן אויף אײַער קאמפיוטער און לאדט אַרויף דא.',
'import-error-interwiki' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל זיין נאמען איז רעזערווירט פאר דרויסנדיקער פארבינדונג (אינטערוויקי).',
'import-error-special' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל ער געהערט צו א באזונדערן נאמענטייל וואס אנטהאלט נישט קיין בלעטער.',
'import-error-invalid' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל זיין נאמען איז אומגילטיק.',
+'import-options-wrong' => '{{PLURAL:$2|פאלשער אויסקלייב|פאלשע אויסקלייבן}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'געגעבענער שטאמבלאט איז אן אומגילטיקער טיטל.',
'import-rootpage-nosubpage' => 'נאמענטייל "$1" פונעם שטאמבלאט ערלויבט נישט קיין אונטערבלעטער.',
# Import log
'qbbrowse' => 'Ìṣíwò',
'qbedit' => 'Àtúnṣe',
'qbpageoptions' => 'Ojúewé yi',
-'qbpageinfo' => 'Àjọwípọ̀',
'qbmyoptions' => 'Àwọn ojúewé mi',
'qbspecialpages' => 'Àwọn ojúewé pàtàkì',
'faq' => 'FAQ',
'qbbrowse' => '瀏覽',
'qbedit' => '編輯',
'qbpageoptions' => '呢一頁',
-'qbpageinfo' => '附近文字',
'qbmyoptions' => '我嘅選項',
'qbspecialpages' => '特別頁',
'faq' => 'FAQ',
'qbbrowse' => 'Blaeren',
'qbedit' => 'Bewerk',
'qbpageoptions' => 'Paginaopties',
-'qbpageinfo' => 'Pagina-informaotie',
'qbmyoptions' => 'Mien opties',
'qbspecialpages' => 'Speciaole pahina’s',
'faq' => 'FAQ (veehestelde vraehen)',
'qbbrowse' => '浏览',
'qbedit' => '编辑',
'qbpageoptions' => '页面选项',
-'qbpageinfo' => '页面信息',
'qbmyoptions' => '我的选项',
'qbspecialpages' => '特殊页面',
'faq' => '常见问题',
'shared-repo-from' => '出自$1',
'shared-repo' => '一个共用文件库',
'shared-repo-name-wikimediacommons' => '维基共享资源',
-'upload-disallowed-here' => '您不可以覆盖此图像',
+'upload-disallowed-here' => '您不可以覆盖此文件。',
# File reversion
'filerevert' => '恢复$1',
'qbbrowse' => '瀏覽',
'qbedit' => '編輯',
'qbpageoptions' => '頁面選項',
-'qbpageinfo' => '頁面訊息',
'qbmyoptions' => '我的選項',
'qbspecialpages' => '特殊頁面',
'faq' => '常見問題解答',
'shared-repo-from' => '出自$1',
'shared-repo' => '一個共用檔案庫',
'shared-repo-name-wikimediacommons' => '維基共享資源',
-'upload-disallowed-here' => '您不可以覆蓋此圖像。',
+'upload-disallowed-here' => '您不可以覆蓋此檔案。',
# File reversion
'filerevert' => '恢復$1',
# Info page
'pageinfo-title' => '“$1”的信息',
+'pageinfo-not-current' => '資訊可能只顯示在當前的修訂版本。',
'pageinfo-header-basic' => '基本資料',
'pageinfo-header-edits' => '編輯歷史',
'pageinfo-header-restrictions' => '保護頁面',
'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}} ( $1 )',
'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}} ( $1 )',
'pageinfo-toolboxlink' => '頁面資訊',
+'pageinfo-redirectsto' => '重定向到',
+'pageinfo-redirectsto-info' => '資訊',
+'pageinfo-contentpage' => '計算為內容頁',
+'pageinfo-contentpage-yes' => '是',
+'pageinfo-protect-cascading' => '從此開始連鎖保護',
+'pageinfo-protect-cascading-yes' => '是',
+'pageinfo-protect-cascading-from' => '從此連鎖保護',
# Skin names
'skinname-standard' => '標準',
importDump.php
XML dump importer
-
+
importImages.php
Import images into the wiki
-
+
importTextFile.php
Import the contents of a text file into a wiki page
moveBatch.php
- Move a batch of pages
+ Move a batch of pages
namespaceDupes.php
Check articles name to see if they conflict with new/existing namespaces
-- Adds a user,timestamp index to the archive table
-- Used for browsing deleted contributions and renames
-ALTER TABLE /*$wgDBprefix*/archive
+ALTER TABLE /*$wgDBprefix*/archive
ADD INDEX usertext_timestamp ( ar_user_text , ar_timestamp );
---
+--
-- patch-backlinkindexes.sql
---
+--
-- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440
--
-- Improve performance of the "what links here"-type queries
---
+--
ALTER TABLE /*$wgDBprefix*/pagelinks
DROP INDEX pl_namespace,
ALTER TABLE /*$wgDBprefix*/templatelinks
DROP INDEX tl_namespace,
ADD INDEX tl_namespace(tl_namespace, tl_title, tl_from);
-
+
ALTER TABLE /*$wgDBprefix*/imagelinks
DROP INDEX il_to,
ADD INDEX il_to(il_to, il_from);
cat_files int signed NOT NULL default 0,
cat_hidden tinyint(1) unsigned NOT NULL default 0,
-
+
PRIMARY KEY (cat_id),
UNIQUE KEY (cat_title),
CREATE TABLE /*$wgDBprefix*/categorylinks (
-- Key to page_id of the page defined as a category member.
cl_from int unsigned NOT NULL default '0',
-
+
-- Name of the category.
-- This is also the page_title of the category's description page;
-- all such pages are in namespace 14 (NS_CATEGORY).
-- isn't always ideal, but collations seem to be an exciting
-- and dangerous new world in MySQL...
--
- -- Truncate so that the cl_sortkey key fits in 1000 bytes
+ -- Truncate so that the cl_sortkey key fits in 1000 bytes
-- (MyISAM 5 with server_character_set=utf8)
cl_sortkey varchar(70) binary NOT NULL default '',
-
+
-- This isn't really used at present. Provided for an optional
-- sorting method by approximate addition time.
cl_timestamp timestamp NOT NULL,
-
+
UNIQUE KEY cl_from(cl_from,cl_to),
-
+
-- This key is trouble. It's incomplete, AND it's too big
-- when collation is set to UTF-8. Bleeeacch!
KEY cl_sortkey(cl_to,cl_sortkey),
-
+
-- Not really used?
KEY cl_timestamp(cl_to,cl_timestamp)
---
+--
-- patch-categorylinksindex.sql
---
+--
-- Per bug 10280 / http://bugzilla.wikimedia.org/show_bug.cgi?id=10280
--
-- Improve enum continuation performance of the what pages belong to a category query
---
+--
ALTER TABLE /*$wgDBprefix*/categorylinks
DROP INDEX cl_sortkey,
el_from int(8) unsigned NOT NULL default '0',
el_to blob NOT NULL,
el_index blob NOT NULL,
-
+
KEY (el_from, el_to(40)),
KEY (el_to(60), el_from),
KEY (el_index(60))
-- Adding fa_deleted field for additional content suppression
-ALTER TABLE /*$wgDBprefix*/filearchive
+ALTER TABLE /*$wgDBprefix*/filearchive
ADD fa_deleted tinyint unsigned NOT NULL default '0';
-- Adding index to sort by uploader
-ALTER TABLE /*$wgDBprefix*/filearchive
+ALTER TABLE /*$wgDBprefix*/filearchive
ADD INDEX fa_user_timestamp (fa_user_text,fa_timestamp),
-- Remove useless, incomplete index
DROP INDEX fa_deleted_user;
CREATE TABLE /*$wgDBprefix*/filearchive (
-- Unique row id
fa_id int not null auto_increment,
-
+
-- Original base filename; key to image.img_name, page.page_title, etc
fa_name varchar(255) binary NOT NULL default '',
-
+
-- Filename of archived file, if an old revision
fa_archive_name varchar(255) binary default '',
-
+
-- Which storage bin (directory tree or object store) the file data
-- is stored in. Should be 'deleted' for files that have been deleted;
-- any other bin is not yet in use.
fa_storage_group varbinary(16),
-
+
-- SHA-1 of the file contents plus extension, used as a key for storage.
-- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
--
-- If NULL, the file was missing at deletion time or has been purged
-- from the archival storage.
fa_storage_key varbinary(64) default '',
-
+
-- Deletion information, if this file is deleted.
fa_deleted_user int,
fa_deleted_timestamp binary(14) default '',
fa_deleted_reason text,
-
+
-- Duped fields from image
fa_size int unsigned default '0',
fa_width int default '0',
fa_user int unsigned default '0',
fa_user_text varchar(255) binary default '',
fa_timestamp binary(14) default '',
-
+
PRIMARY KEY (fa_id),
INDEX (fa_name, fa_timestamp), -- pick out by image name
INDEX (fa_storage_group, fa_storage_key), -- pick out dupe files
--
--- hitcounter table is used to buffer page hits before they are periodically
+-- hitcounter table is used to buffer page hits before they are periodically
-- counted and added to the cur_counter column in the cur table.
-- December 2003
--
---
+--
-- image-user-index.sql
---
+--
-- Add user/timestamp index to current image versions
---
+--
ALTER TABLE /*$wgDBprefix*/image
ADD INDEX img_usertext_timestamp (img_user_text,img_timestamp);
ALTER TABLE /*$wgDBprefix*/image ADD (
-- Media type as defined by the MEDIATYPE_xxx constants
img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-
+
-- major part of a MIME media type as defined by IANA
-- see http://www.iana.org/assignments/media-types/
img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
-
+
-- minor part of a MIME media type as defined by IANA
-- the minor parts are not required to adher to any standard
-- but should be consistent throughout the database
---
+--
-- patch-indexes.sql
---
+--
-- Fix up table indexes; new to stable release in November 2003
---
+--
ALTER TABLE IF EXISTS /*$wgDBprefix*/links
DROP INDEX l_from,
CREATE TABLE /*$wgDBprefix*/interwiki (
-- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
iw_prefix varchar(32) NOT NULL,
-
+
-- The URL of the wiki, with "$1" as a placeholder for an article name.
-- Any spaces in the name will be transformed to underscores before
-- insertion.
iw_url blob NOT NULL,
-
+
-- A boolean value indicating whether the wiki is in this project
-- (used, for example, to detect redirect loops)
iw_local BOOL NOT NULL,
-
+
UNIQUE KEY iw_prefix (iw_prefix)
) /*$wgDBTableOptions*/;
--- Add extra option fields to the ipblocks table, add some extra indexes,
--- convert infinity values in ipb_expiry to something that sorts better,
--- extend ipb_address and range fields, add a unique index for block conflict
+-- Add extra option fields to the ipblocks table, add some extra indexes,
+-- convert infinity values in ipb_expiry to something that sorts better,
+-- extend ipb_address and range fields, add a unique index for block conflict
-- detection.
--- Conflicts in the new unique index can be handled by creating a new
+-- Conflicts in the new unique index can be handled by creating a new
-- table and inserting into it instead of doing an ALTER TABLE.
ipb_expiry varbinary(14) NOT NULL default '',
ipb_range_start tinyblob NOT NULL,
ipb_range_end tinyblob NOT NULL,
-
+
PRIMARY KEY ipb_id (ipb_id),
UNIQUE INDEX ipb_address_unique (ipb_address(255), ipb_user, ipb_auto),
INDEX ipb_user (ipb_user),
) /*$wgDBTableOptions*/;
-INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique
- (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account)
+INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique
+ (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account)
SELECT ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, 0 , ipb_user=0
FROM /*$wgDBprefix*/ipblocks;
ALTER TABLE /*$wgDBprefix*/ipblocks
ADD ipb_by_text varchar(255) binary NOT NULL default '';
-UPDATE /*$wgDBprefix*/ipblocks
+UPDATE /*$wgDBprefix*/ipblocks
JOIN /*$wgDBprefix*/user ON ipb_by = user_id
SET ipb_by_text = user_name
WHERE ipb_by != 0;
\ No newline at end of file
-- Adding ipb_deleted field for hiding usernames
-ALTER TABLE /*$wgDBprefix*/ipblocks
+ALTER TABLE /*$wgDBprefix*/ipblocks
ADD ipb_deleted bool NOT NULL default 0;
-- Add the range handling fields
-ALTER TABLE /*$wgDBprefix*/ipblocks
+ALTER TABLE /*$wgDBprefix*/ipblocks
ADD ipb_range_start tinyblob NOT NULL default '',
ADD ipb_range_end tinyblob NOT NULL default '',
ADD INDEX ipb_range (ipb_range_start(8), ipb_range_end(8));
-- Initialise fields
-- Only range blocks match ipb_address LIKE '%/%', this fact is used in the code already
-UPDATE /*$wgDBprefix*/ipblocks
- SET
- ipb_range_start = LPAD(HEX(
+UPDATE /*$wgDBprefix*/ipblocks
+ SET
+ ipb_range_start = LPAD(HEX(
(SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '/', 1), '.', -1)) ), 8, '0' ),
- ipb_range_end = LPAD(HEX(
+ ipb_range_end = LPAD(HEX(
(SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
---
+--
-- Track inline interwiki links
--
CREATE TABLE /*_*/iwlinks (
-- page_id of the referring page
iwl_from int unsigned NOT NULL default 0,
-
+
-- Interwiki prefix code of the target
iwl_prefix varbinary(20) NOT NULL default '',
-- Jobs performed by parallel apache threads or a command-line daemon
CREATE TABLE /*_*/job (
job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Command name
-- Limited to 60 to prevent key length overflow
job_cmd varbinary(60) NOT NULL default '',
--- /dev/null
+ALTER TABLE /*_*/job
+ ADD COLUMN job_random integer unsigned NOT NULL default 0,
+ ADD COLUMN job_token varbinary(32) NOT NULL default '',
+ ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL,
+ ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
CREATE TABLE /*$wgDBprefix*/langlinks (
-- page_id of the referring page
ll_from int unsigned NOT NULL default '0',
-
+
-- Language code of the target
ll_lang varbinary(20) NOT NULL default '',
CREATE TABLE /*$wgDBprefix*/links (
-- Key to the page_id of the page containing the link.
l_from int unsigned NOT NULL default '0',
-
+
-- Key to the page_id of the link target.
-- An unfortunate consequence of this is that rename
-- operations require changing the links entries for
-- all links to the moved page.
l_to int unsigned NOT NULL default '0',
-
+
UNIQUE KEY l_from(l_from,l_to),
KEY (l_to)
CREATE TABLE /*$wgDBprefix*/brokenlinks (
-- Key to the page_id of the page containing the link.
bl_from int unsigned NOT NULL default '0',
-
+
-- Text of the target page title ("namesapce:title").
-- Unfortunately this doesn't split the namespace index
-- key and therefore can't easily be joined to anything.
CREATE TABLE /*$wgDBprefix*/imagelinks (
-- Key to page_id of the page containing the image / media link.
il_from int unsigned NOT NULL default '0',
-
+
-- Filename of target image.
-- This is also the page_title of the file's description page;
-- all such pages are in namespace 6 (NS_FILE).
il_to varchar(255) binary NOT NULL default '',
-
+
UNIQUE KEY il_from(il_from,il_to),
KEY (il_to)
-- Rename the primary unique index from PRIMARY to ls_field_val
-- This is for MySQL only and is necessary only for databases which were updated
-- between MW 1.16 development revisions r50567 and r51465.
-ALTER TABLE /*_*/log_search
- DROP PRIMARY KEY,
+ALTER TABLE /*_*/log_search
+ DROP PRIMARY KEY,
ADD UNIQUE INDEX ls_field_val (ls_field,ls_value,ls_log_id);
-ALTER TABLE /*$wgDBprefix*/logging
+ALTER TABLE /*$wgDBprefix*/logging
ADD log_user_text varchar(255) binary NOT NULL default '',
ADD log_page int unsigned NULL,
CHANGE log_type log_type varbinary(32) NOT NULL,
---
+--
-- patch-logging-times-index.sql
---
+--
-- Add a very humble index on logging times
---
+--
ALTER TABLE /*$wgDBprefix*/logging
ADD INDEX times (log_timestamp);
-- action field, but only the type controls categorization.
log_type varbinary(10) NOT NULL default '',
log_action varbinary(10) NOT NULL default '',
-
+
-- Timestamp. Duh.
log_timestamp binary(14) NOT NULL default '19700101000000',
-
+
-- The user who performed this action; key to user_id
log_user int unsigned NOT NULL default 0,
-
+
-- Key to the page affected. Where a user is the target,
-- this will point to the user page.
log_namespace int NOT NULL default 0,
log_title varchar(255) binary NOT NULL default '',
-
+
-- Freeform text. Interpreted as edit history comments.
log_comment varchar(255) NOT NULL default '',
-
+
-- LF separated list of miscellaneous parameters
log_params blob NOT NULL,
ALTER TABLE /*_*/image
MODIFY COLUMN img_minor_mime varbinary(100) NOT NULL default "unknown";
-
+
ALTER TABLE /*_*/oldimage
MODIFY COLUMN oi_minor_mime varbinary(100) NOT NULL default "unknown";
-
+
INSERT INTO /*_*/updatelog(ul_key) VALUES ('mime_minor_length');
CREATE TABLE /*_*/msg_resource (
-- Resource name
mr_resource varbinary(255) NOT NULL,
- -- Language code
+ -- Language code
mr_lang varbinary(32) NOT NULL,
-- JSON blob. This is an incomplete JSON object, i.e. without the wrapping {}
mr_blob mediumblob NOT NULL,
---
+--
-- patch-oi_metadata.sql
---
+--
-- Add data to allow for direct reference to old images
-- Some re-indexing here.
-- Old images can be included into pages effeciently now.
---
+--
ALTER TABLE /*$wgDBprefix*/oldimage
DROP INDEX oi_name,
---
+--
-- oldimage-user-index.sql
---
+--
-- Add user/timestamp index to old image versions
---
+--
ALTER TABLE /*$wgDBprefix*/oldimage
ADD INDEX oi_usertext_timestamp (oi_user_text,oi_timestamp);
--
-- Create the new pagelinks table to merge links and brokenlinks data,
-- and populate it.
---
+--
-- Unlike the old links and brokenlinks, these records will not need to be
-- altered when target pages are created, deleted, or renamed. This should
-- reduce the amount of severe database frustration that happens when widely-
CREATE TABLE /*$wgDBprefix*/pagelinks (
-- Key to the page_id of the page containing the link.
pl_from int unsigned NOT NULL default '0',
-
+
-- Key to page_namespace/page_title of the target page.
-- The target page may or may not exist, and due to renames
-- and deletions may refer to different page records as time
-- goes by.
pl_namespace int NOT NULL default '0',
pl_title varchar(255) binary NOT NULL default '',
-
+
UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
KEY (pl_namespace,pl_title)
--
--- parsercache table, for cacheing complete parsed articles
+-- parsercache table, for cacheing complete parsed articles
-- before they are imbedded in the skin.
--
---
+--
-- patch-pl-tl-il-unique-index.sql
---
+--
-- Make reorderings of UNIQUE indices UNIQUE as well
DROP INDEX /*i*/pl_namespace ON /*_*/pagelinks;
CREATE TABLE /*$wgDBprefix*/querycache (
-- A key name, generally the base name of of the special page.
qc_type varbinary(32) NOT NULL,
-
+
-- Some sort of stored value. Sizes, counts...
qc_value int unsigned NOT NULL default '0',
-
+
-- Target namespace+title
qc_namespace int NOT NULL default '0',
qc_title varchar(255) binary NOT NULL default '',
-
+
KEY (qc_type,qc_value)
) /*$wgDBTableOptions*/;
CREATE TABLE /*$wgDBprefix*/querycachetwo (
-- A key name, generally the base name of of the special page.
qcc_type varbinary(32) NOT NULL,
-
+
-- Some sort of stored value. Sizes, counts...
qcc_value int unsigned NOT NULL default '0',
-
+
-- Target namespace+title
qcc_namespace int NOT NULL default '0',
qcc_title varchar(255) binary NOT NULL default '',
-
+
-- Target namespace+title2
qcc_namespacetwo int NOT NULL default '0',
qcc_titletwo varchar(255) binary NOT NULL default '',
-- Adding rc_deleted field for revisiondelete
-- Add rc_logid to match log_id
-ALTER TABLE /*$wgDBprefix*/recentchanges
+ALTER TABLE /*$wgDBprefix*/recentchanges
ADD rc_deleted tinyint unsigned NOT NULL default '0',
ADD rc_logid int unsigned NOT NULL default '0',
ADD rc_log_type varbinary(255) NULL default NULL,
-- Primary key in recentchanges
-ALTER TABLE /*$wgDBprefix*/recentchanges
+ALTER TABLE /*$wgDBprefix*/recentchanges
ADD rc_id int NOT NULL auto_increment,
ADD PRIMARY KEY rc_id (rc_id);
-- Adding the rc_ip field for logging of IP addresses in recentchanges
-ALTER TABLE /*$wgDBprefix*/recentchanges
+ALTER TABLE /*$wgDBprefix*/recentchanges
ADD rc_ip varbinary(40) NOT NULL default '',
ADD INDEX rc_ip (rc_ip);
--
-- Create the new redirect table.
-- For each redirect, this table contains exactly one row defining its target
---
+--
CREATE TABLE /*$wgDBprefix*/redirect (
-- Key to the page_id of the redirect page
rd_from int unsigned NOT NULL default '0',
---
+--
-- Recreates the iwl_prefix index for the iwlinks table
--
CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
rev_minor_edit tinyint unsigned NOT NULL default '0',
rev_deleted tinyint unsigned NOT NULL default '0',
-
PRIMARY KEY rev_page_id (rev_page, rev_id),
UNIQUE INDEX rev_id (rev_id),
INDEX rev_timestamp (rev_timestamp),
-- old_id int(8) unsigned NOT NULL auto_increment,
-- old_text mediumtext NOT NULL,
-- old_flags tinyblob NOT NULL,
---
+--
-- PRIMARY KEY old_id (old_id)
-- );
CREATE TABLE /*$wgDBprefix*/searchindex (
-- Key to page_id
si_page int unsigned NOT NULL,
-
+
-- Munged version of title
si_title varchar(255) NOT NULL default '',
-
+
-- Munged version of body text
si_text mediumtext NOT NULL,
-
+
UNIQUE KEY (si_page)
) ENGINE=MyISAM;
CREATE TABLE /*$wgDBprefix*/templatelinks (
-- Key to the page_id of the page containing the link.
tl_from int unsigned NOT NULL default '0',
-
+
-- Key to page_namespace/page_title of the target page.
-- The target page may or may not exist, and due to renames
-- and deletions may refer to different page records as time
-- goes by.
tl_namespace int NOT NULL default '0',
tl_title varchar(255) binary NOT NULL default '',
-
+
UNIQUE KEY tl_from(tl_from,tl_namespace,tl_title),
KEY (tl_namespace,tl_title)
-
) /*$wgDBTableOptions*/;
create table /*$wgDBprefix*/testrun (
tr_id int not null auto_increment,
-
+
tr_date char(14) binary,
tr_mw_version blob,
tr_php_version blob,
tr_db_version blob,
tr_uname blob,
-
+
primary key (tr_id)
) engine=InnoDB;
ti_run int not null,
ti_name varchar(255),
ti_success bool,
-
+
unique key (ti_run, ti_name),
key (ti_run, ti_success),
-
+
foreign key (ti_run) references /*$wgDBprefix*/testrun(tr_id)
on delete cascade
) engine=InnoDB;
--
--- Store information about newly uploaded files before they're
+-- Store information about newly uploaded files before they're
-- moved into the actual filestore
--
CREATE TABLE /*_*/uploadstash (
us_id int unsigned NOT NULL PRIMARY KEY auto_increment,
-
+
-- the user who uploaded the file.
us_user int unsigned NOT NULL,
-- the original path
us_orig_path varchar(255) NOT NULL,
-
+
-- the temporary path at which the file is actually stored
us_path varchar(255) NOT NULL,
-
+
-- which type of upload the file came from (sometimes)
us_source_type varchar(50),
-
+
-- the date/time on which the file was added
us_timestamp varbinary(14) not null,
-
+
us_status varchar(50) not null,
-- file properties from File::getPropsFromPath. these may prove unnecessary.
us_image_width int unsigned,
us_image_height int unsigned,
us_image_bits smallint unsigned
-
) /*$wgDBTableOptions*/;
-- sometimes there's a delete for all of a user's stuff.
-- Add a 'real name' field where users can specify the name they want
-- used for author attribution or other places that real names matter.
-ALTER TABLE user
+ALTER TABLE user
ADD (user_real_name varchar(255) binary NOT NULL default '');
--- Stores the groups the user has once belonged to.
+-- Stores the groups the user has once belonged to.
-- The user may still belong these groups. Check user_groups.
CREATE TABLE /*_*/user_former_groups (
-- Key to user_id
CREATE TABLE /*$wgDBprefix*/user_groups (
-- Key to user_id
ug_user int unsigned NOT NULL default '0',
-
+
-- Group names are short symbolic string keys.
-- The set of group names is open-ended, though in practice
-- only some predefined ones are likely to be used.
-- permissions of any group they're explicitly in, plus
-- the implicit '*' and 'user' groups.
ug_group varbinary(16) NOT NULL default '',
-
+
PRIMARY KEY (ug_user,ug_group),
KEY (ug_group)
) /*$wgDBTableOptions*/;
CREATE TABLE /*_*/user_properties(
-- Foreign key to user.user_id
up_user int not null,
-
+
-- Name of the option being saved. This is indexed for bulk lookup.
up_property varbinary(32) not null,
-
+
-- Property value as a string.
up_value blob
) /*$wgDBTableOptions*/;
CREATE TABLE /*$wgDBprefix*/user_rights (
-- Key to user_id
ur_user int unsigned NOT NULL,
-
+
-- Comma-separated list of permission keys
ur_rights tinyblob NOT NULL,
-
+
UNIQUE KEY ur_user (ur_user)
) /*$wgDBTableOptions*/;
CSSJanus is CSS parser utility designed to aid the conversion of a website's
layout from left-to-right(LTR) to right-to-left(RTL). The script was born out of
-a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
+a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
CSSJanus will change most of the obvious CSS property names and their values as
-well as some not-so-obvious ones (cursor, background-position %, etc...).
-The script is designed to offer flexibility to account for cases when you do
+well as some not-so-obvious ones (cursor, background-position %, etc...).
+The script is designed to offer flexibility to account for cases when you do
not want to change certain rules which exist to account for bidirectional text
display bugs, as well as situations where you may or may not want to flip annotations inside of the background url string.
-Note that you can disable CSSJanus from running on an entire class or any
+Note that you can disable CSSJanus from running on an entire class or any
rule within a class by prepending a /* @noflip */ comment before the rule(s)
you want CSSJanus to ignore.
CSSJanus itself is not always enough to make a website that works in a LTR
-language context work in a RTL language all the way, but it is a start.
+language context work in a RTL language all the way, but it is a start.
==Getting the code==
{{{
$ svn checkout http://cssjanus.googlecode.com/svn/trunk/ cssjanus
-}}}
+}}}
==Using==
--swap_left_right_in_url: Fixes "left"/"right" string within urls.
Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css
--swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.
- Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
-
+ Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
+
If you'd like to make use of the webapp version of cssjanus, you'll need to
download the Google App Engine SDK
http://code.google.com/appengine/downloads.html
and also drop a "django" directory into this directory, with the latest svn
-from django. You should be good to go with that setup. Please let me know
+from django. You should be good to go with that setup. Please let me know
otherwise.
==Bugs, Patches==
{{{
Copyright 2008 Google Inc. All Rights Reserved.
-
+
Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#!/usr/bin/hphpi -f
+#!/usr/bin/hphpi -f
<?php
define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
unlink( "$buildDir/source" );
}
- # With the CentOS RPMs, you just get g++44, no g++, so we have to
+ # With the CentOS RPMs, you just get g++44, no g++, so we have to
# use the environment
if ( isset( $_ENV['CXX'] ) ) {
$cxx = $_ENV['CXX'];
$cxx = 'g++';
}
- # Create a function that provides the HipHop compiler version, and
+ # Create a function that provides the HipHop compiler version, and
# doesn't exist when MediaWiki is invoked in interpreter mode.
$version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) );
file_put_contents(
$this->checkVolatileClasses( $outDir );
# Copy the generated C++ files into the source directory for cmake
- $iter = new RecursiveIteratorIterator(
+ $iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator( $outDir ),
RecursiveIteratorIterator::SELF_FIRST );
$sourceFiles = array();
}
# Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken.
- # HipHop's RELEASE mode seems to be stuck always on, so symbols get
- # stripped. Also we will try keeping the generated .o files instead of
+ # HipHop's RELEASE mode seems to be stuck always on, so symbols get
+ # stripped. Also we will try keeping the generated .o files instead of
# throwing away hours of CPU time every time you make a typo.
chdir( $persistentDir );
if ( $regenerateMakefile ) {
- copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
+ copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
"$persistentDir/CMakeLists.txt" );
if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) {
$cmd = 'cmake' .
" -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) .
' -D PROGRAM_NAME:string=mediawiki-hphp';
-
+
if ( file_exists( '/usr/bin/ccache' ) ) {
$cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' .
' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx );
# Determine appropriate make concurrency
# Compilation can take a lot of memory, let's assume that that is limiting.
$procs = $this->getNumProcs();
-
+
# Run make. This is the slow step.
passthru( 'make -j' . wfEscapeShellArg( $procs ) );
$sourceBase = realpath( "$IP/.." );
}
- passthru(
+ passthru(
'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
- wfEscapeShellArg(
+ wfEscapeShellArg(
"$buildDir/persistent/mediawiki-hphp",
'-c', "$thisDir/server.conf",
'-v', "Server.SourceRoot=$sourceBase",
cl_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE CASCADE,
cl_to VARCHAR(255) NOT NULL,
- -- cl_sortkey has to be at least 86 wide
+ -- cl_sortkey has to be at least 86 wide
-- in order to be compatible with the old MySQL schema from MW 1.10
--cl_sortkey VARCHAR(86),
cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL ,
CREATE TABLE user_properties (
-- Foreign key to user.user_id
up_user BIGINT NOT NULL,
-
+
-- Name of the option being saved. This is indexed for bulk lookup.
up_property VARCHAR(32) FOR BIT DATA NOT NULL,
-
+
-- Property value as a string.
up_value CLOB(64K) INLINE LENGTH 4096
);
-- This is read and executed by the install script; you should
-- not have to run it by itself unless doing a manual install.
--- Notes:
+-- Notes:
-- * DB2 will convert all table and column names to all caps internally.
-- * DB2 has a 32k limit on SQL filesize, so it may be necessary
-- to split this into two files soon.
-- REFERENCES page (page_id) ON DELETE CASCADE,
pp_propname VARCHAR(255) NOT NULL,
pp_value CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- PRIMARY KEY (pp_page, pp_propname)
+ PRIMARY KEY (pp_page, pp_propname)
);
CREATE INDEX page_props_propname
ON page_props (pp_propname);
pl_namespace SMALLINT NOT NULL,
pl_title VARCHAR(255) NOT NULL
);
-CREATE UNIQUE INDEX pagelink_unique
+CREATE UNIQUE INDEX pagelink_unique
ON pagelinks (pl_from, pl_namespace, pl_title);
cl_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE CASCADE,
cl_to VARCHAR(255) NOT NULL,
- -- cl_sortkey has to be at least 86 wide
+ -- cl_sortkey has to be at least 86 wide
-- in order to be compatible with the old MySQL schema from MW 1.10
--cl_sortkey VARCHAR(86),
cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL,
);
CREATE INDEX ipb_address
ON ipblocks (ipb_address);
-CREATE INDEX ipb_user
+CREATE INDEX ipb_user
ON ipblocks (ipb_user);
CREATE INDEX ipb_range
ON ipblocks (ipb_range_start, ipb_range_end);
rc_log_type VARCHAR(255),
rc_log_action VARCHAR(255),
rc_params CLOB(64K) INLINE LENGTH 4096
-
);
CREATE INDEX rc_timestamp
ON recentchanges (rc_timestamp);
--
--- Store information about newly uploaded files before they're
+-- Store information about newly uploaded files before they're
-- moved into the actual filestore
--
CREATE TABLE uploadstash (
--- Stores the groups the user has once belonged to.
+-- Stores the groups the user has once belonged to.
-- The user may still belong these groups. Check user_groups.
CREATE TABLE user_former_groups (
ufg_user BIGINT NOT NULL DEFAULT 0,
'qbbrowse',
'qbedit',
'qbpageoptions',
- 'qbpageinfo',
'qbmyoptions',
'qbspecialpages',
'faq',
'pageinfo-templates',
'pageinfo-footer',
'pageinfo-toolboxlink',
+ 'pageinfo-redirectsto',
+ 'pageinfo-redirectsto-info',
+ 'pageinfo-contentpage',
+ 'pageinfo-contentpage-yes',
+ 'pageinfo-protect-cascading',
+ 'pageinfo-protect-cascading-yes',
+ 'pageinfo-protect-cascading-from',
),
'skin' => array(
'skinname-standard',
CREATE INDEX /*$wgDBprefix*/user_group_id ON /*$wgDBprefix*/user_newtalk([user_id]);
CREATE INDEX /*$wgDBprefix*/user_ip ON /*$wgDBprefix*/user_newtalk(user_ip);
---
+--
-- User preferences and other fun stuff
-- replaces old user.user_options BLOB
---
+--
CREATE TABLE /*$wgDBprefix*/user_properties (
up_user INT NOT NULL,
up_property NVARCHAR(32) NOT NULL,
-- The fields generally correspond to the page, revision, and text
-- fields, with several caveats.
-- Cannot reasonably create views on this table, due to the presence of TEXT
--- columns.
+-- columns.
CREATE TABLE /*$wgDBprefix*/archive (
ar_namespace SMALLINT NOT NULL DEFAULT 0,
ar_title NVARCHAR(255) NOT NULL DEFAULT '',
CREATE INDEX /*$wgDBprefix*/cl_timestamp ON /*$wgDBprefix*/categorylinks(cl_to,cl_timestamp);
--;
---
+--
-- Track all existing categories. Something is a category if 1) it has an en-
-- try somewhere in categorylinks, or 2) it once did. Categories might not
-- have corresponding pages, so they need to be tracked separately.
vt_tag varchar(255) NOT NULL PRIMARY KEY
);
---
+--
-- Table for storing localisation data
---
+--
CREATE TABLE /*$wgDBprefix*/l10n_cache (
-- language code
lc_lang NVARCHAR(32) NOT NULL,
-
+
-- cache key
lc_key NVARCHAR(255) NOT NULL,
-
+
-- Value
lc_value TEXT NOT NULL DEFAULT '',
);
-- Maximum key length ON SQL Server is 900 bytes
CREATE INDEX /*$wgDBprefix*/externallinks_index ON /*$wgDBprefix*/externallinks(el_index);
---
+--
-- Track external user accounts, if ExternalAuth is used
---
+--
CREATE TABLE /*$wgDBprefix*/external_user (
-- Foreign key to user_id
eu_local_id INT NOT NULL PRIMARY KEY,
);
CREATE UNIQUE INDEX /*$wgDBprefix*/langlinks_reverse_key ON /*$wgDBprefix*/langlinks(ll_lang,ll_title);
---
+--
-- Track inline interwiki links
---
+--
CREATE TABLE /*$wgDBprefix*/iwlinks (
-- page_id of the referring page
iwl_from INT NOT NULL DEFAULT 0,
-
+
-- Interwiki prefix code of the target
iwl_prefix NVARCHAR(20) NOT NULL DEFAULT '',
-
+
-- Title of the target, including namespace
iwl_title NVARCHAR(255) NOT NULL DEFAULT '',
);
PRIMARY KEY (ul_key)
);
--- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
+-- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
-- AND assign a password for the FDHOST process to run under
-- Once you have assigned a password to that account, you need to run the following stored procedure
-- replacing XXXXX with the password you used.
ON &mw_prefix.testrun
BEGIN
SELECT testrun_tr_id_seq.NEXTVAL into :NEW.tr_id FROM dual;
-END;
+END;
CREATE TABLE /*$wgDBprefix*/testitem (
ti_run NUMBER NOT NULL REFERENCES &mw_prefix.testrun (tr_id) ON DELETE CASCADE,
ti_run INTEGER NOT NULL REFERENCES testrun(tr_id) ON DELETE CASCADE,
ti_name TEXT NOT NULL,
ti_success SMALLINT NOT NULL
-);
+);
CREATE UNIQUE INDEX testitem_uniq ON testitem(ti_run, ti_name);
fa_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
fa_user_text TEXT NOT NULL,
fa_timestamp TIMESTAMPTZ,
- fa_deleted SMALLINT NOT NULL DEFAULT 0
+ fa_deleted SMALLINT NOT NULL DEFAULT 0,
+ fa_sha1 TEXT NOT NULL DEFAULT ''
);
CREATE INDEX fa_name_time ON filearchive (fa_name, fa_timestamp);
CREATE INDEX fa_dupe ON filearchive (fa_storage_group, fa_storage_key);
CREATE INDEX fa_notime ON filearchive (fa_deleted_timestamp);
CREATE INDEX fa_nouser ON filearchive (fa_deleted_user);
+CREATE INDEX fa_sha1 ON filearchive (fa_sha1);
CREATE SEQUENCE uploadstash_us_id_seq;
CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE');
public function execute() {
global $wgTitle;
+
if ( $this->hasOption( 'procs' ) ) {
$procs = intval( $this->getOption( 'procs' ) );
if ( $procs < 1 || $procs > 1000 ) {
$dbw = wfGetDB( DB_MASTER );
$n = 0;
- if ( $type === false ) {
- $conds = Job::defaultQueueConditions( );
- } else {
- $conds = array( 'job_cmd' => $type );
- }
-
- while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
- $offset = 0;
- for ( ; ; ) {
- $job = !$type ? Job::pop( $offset ) : Job::pop_type( $type );
-
- if ( !$job ) {
- break;
- }
-
- wfWaitForSlaves();
+ $group = JobQueueGroup::singleton();
+ do {
+ $job = ( $type === false )
+ ? $group->pop() // job from any queue
+ : $group->get( $type )->pop(); // job from a single queue
+ if ( $job ) { // found a job
+ // Perform the job (logging success/failure and runtime)...
$t = microtime( true );
- $offset = $job->id;
$this->runJobsLog( $job->toString() . " STARTING" );
$status = $job->run();
+ $group->ack( $job ); // done
$t = microtime( true ) - $t;
$timeMs = intval( $t * 1000 );
if ( !$status ) {
} else {
$this->runJobsLog( $job->toString() . " t=$timeMs good" );
}
-
- if ( $maxJobs && ++$n > $maxJobs ) {
+ // Break out if we hit the job count or wall time limits...
+ if ( $maxJobs && ++$n >= $maxJobs ) {
break 2;
}
- if ( $maxTime && time() - $startTime > $maxTime ) {
+ if ( $maxTime && ( time() - $startTime ) > $maxTime ) {
break 2;
}
+ // Don't let any slaves/backups fall behind...
+ $group->get( $type )->waitForBackups();
}
- }
+ } while ( $job ); // stop when there are no jobs
}
/**
--- /dev/null
+ALTER TABLE /*_*/job ADD COLUMN job_random integer unsigned NOT NULL default 0;
+ALTER TABLE /*_*/job ADD COLUMN job_token varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL;
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
---
+--
-- Recreates the iwl_prefix for the iwlinks table
--
DROP INDEX IF EXISTS /*i*/iwl_prefix;
-- Patch that introduces fulltext search capabilities to SQLite schema
-- Requires that SQLite must be compiled with FTS3 module (comes with core amalgamation).
-- See http://sqlite.org/fts3.html for details of syntax.
--- Will fail if FTS3 is not present,
+-- Will fail if FTS3 is not present,
DROP TABLE IF EXISTS /*_*/searchindex;
CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
-- Key to page_id
-- Munged version of title
si_title,
-
+
-- Munged version of body text
si_text
);
-- Munged version of title
si_title TEXT,
-
+
-- Munged version of body text
si_text TEXT
);
fi
if [ -z $3 ]; then
table=blobs
-else
+else
table=$3
fi
echo "CREATE DATABASE $2" | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 && \
sed "s/blobs\>/$table/" blobs.sql | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 $2
-
-
-- Any other parameters to the command
-- Stored as a PHP serialized array, or an empty string if there are no parameters
- job_params blob NOT NULL
+ job_params blob NOT NULL,
+
+ -- Random, non-unique, number used for concurrent job acquisition
+ job_random integer unsigned NOT NULL default 0,
+
+ -- Field that conveys process locks on rows via process UUIDs
+ job_token varbinary(32) NOT NULL default '',
+
+ -- Timestamp when the job was locked
+ job_token_timestamp varbinary(14) NULL default NULL,
+
+ -- Base 36 SHA1 of the job parameters relevant to detecting duplicates
+ job_sha1 varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp);
'jquery' => array(
'scripts' => 'resources/jquery/jquery.js',
'debugRaw' => false,
+ 'targets' => array( 'desktop', 'mobile' ),
),
/* jQuery Plugins */
),
'jquery.collapsibleTabs' => array(
'scripts' => 'resources/jquery/jquery.collapsibleTabs.js',
+ 'dependencies' => 'jquery.delayedBind',
),
'jquery.color' => array(
'scripts' => 'resources/jquery/jquery.color.js',
),
'jquery.hidpi' => array(
'scripts' => 'resources/jquery/jquery.hidpi.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.highlightText' => array(
'scripts' => 'resources/jquery/jquery.highlightText.js',
'scripts' => 'resources/mediawiki/mediawiki.js',
'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
'debugRaw' => false,
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.api' => array(
'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
'dependencies' => array(
'jquery.hidpi',
),
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.htmlform' => array(
'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
/**
- * Plugin that automatically truncates the plain text contents of an element and adds an ellipsis
+ * Plugin that automatically truncates the plain text contents of an element
+ * and adds an ellipsis.
*/
( function ( $ ) {
var
// Cache ellipsed substrings for every string-width-position combination
- cache = { },
+ cache = {},
// Use a separate cache when match highlighting is enabled
- matchTextCache = { };
+ matchTextCache = {};
$.fn.autoEllipsis = function ( options ) {
options = $.extend( {
hasSpan: false,
matchText: null
}, options );
- $(this).each( function () {
- var $container, $trimmableText,
+
+ return this.each( function () {
+ var $trimmableText,
text, trimmableText, w, pw,
l, r, i, side, m,
- $el = $(this);
+ // container element - used for measuring against
+ $container = $(this);
+
if ( options.restoreText ) {
- if ( !$el.data( 'autoEllipsis.originalText' ) ) {
- $el.data( 'autoEllipsis.originalText', $el.text() );
+ if ( !$container.data( 'autoEllipsis.originalText' ) ) {
+ $container.data( 'autoEllipsis.originalText', $container.text() );
} else {
- $el.text( $el.data( 'autoEllipsis.originalText' ) );
+ $container.text( $container.data( 'autoEllipsis.originalText' ) );
}
}
- // container element - used for measuring against
- $container = $el;
-
// trimmable text element - only the text within this element will be trimmed
if ( options.hasSpan ) {
- $trimmableText = $el.children( options.selector );
+ $trimmableText = $container.children( options.selector );
} else {
$trimmableText = $( '<span>' )
.css( 'whiteSpace', 'nowrap' )
- .text( $el.text() );
- $el
+ .text( $container.text() );
+ $container
.empty()
.append( $trimmableText );
}
};
$.fn.highlightText = function ( matchString ) {
- return $( this ).each( function () {
+ return this.each( function () {
var $el = $( this );
$el.data( 'highlightText', { originalText: $el.text() } );
$.highlightText.splitAndHighlight( this, matchString );
* @example $( 'table' ).tablesorter();
* @desc Create a simple tablesorter interface.
*
+ * @example $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
+ * @desc Create a tablesorter interface initially sorting on the first and second column.
+ *
* @option String cssHeader ( optional ) A string of the class name to be appended
* to sortable tr elements in the thead of the table. Default value:
* "header"
* tablesorter should cancel selection of the table headers text.
* Default value: true
*
+ * @option Array sortList ( optional ) An array containing objects specifying sorting.
+ * By passing more than one object, multi-sorting will be applied. Object structure:
+ * { <Integer column index>: <String 'asc' or 'desc'> }
+ * Default value: []
+ *
* @option Boolean debug ( optional ) Boolean flag indicating if tablesorter
* should display debuging information usefull for development.
*
+ * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
+ *
* @type jQuery
*
* @name tablesorter
}
table.tBodies[0].appendChild( fragment );
+
+ $( table ).trigger( 'sortEnd.tablesorter' );
}
/**
}
function setHeadersCss( table, $headers, list, css, msg ) {
- // Remove all header information
- $headers.removeClass( css[0] ).removeClass( css[1] );
+ // Remove all header information and reset titles to default message
+ $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
var h = [];
$headers.each( function ( offset ) {
};
}
+ /**
+ * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
+ * structure [ [ Integer , Integer ], ... ]
+ *
+ * @param sortObjects {Array} List of sort objects.
+ * @return {Array} List of internal sort definitions.
+ */
+
+ function convertSortList( sortObjects ) {
+ var sortList = [];
+ $.each( sortObjects, function( i, sortObject ) {
+ $.each ( sortObject, function( columnIndex, order ) {
+ var orderIndex = ( order === 'desc' ) ? 1 : 0;
+ sortList.push( [columnIndex, orderIndex] );
+ } );
+ } );
+ return sortList;
+ }
+
/* Public scope */
$.tablesorter = {
// Declare and cache.
var $document, $headers, cache, config, sortOrder,
$table = $( table ),
- shiftDown = 0,
- firstTime = true;
+ shiftDown = 0;
// Quit if no tbody
if ( !table.tBodies ) {
}
$table.addClass( "jquery-tablesorter" );
+ // FIXME config should probably not be stored in the plain table node
// New config object.
table.config = {};
config = $.extend( table.config, $.tablesorter.defaultOptions, settings );
// Save the settings where they read
- $.data( table, 'tablesorter', config );
+ $.data( table, 'tablesorter', { config: config } );
// Get the CSS class names, could be done else where.
var sortCSS = [ config.cssDesc, config.cssAsc ];
// performance improvements in some browsers.
cacheRegexs();
+ // Legacy fix of .sortbottoms
+ // Wrap them inside inside a tfoot (because that's what they actually want to be) &
+ // and put the <tfoot> at the end of the <table>
+ var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
+ if ( $sortbottoms.length ) {
+ var $tfoot = $table.children( 'tfoot' );
+ if ( $tfoot.length ) {
+ $tfoot.eq(0).prepend( $sortbottoms );
+ } else {
+ $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
+ }
+ }
+
+ explodeRowspans( $table );
+
+ // try to auto detect column type, and store in tables config
+ table.config.parsers = buildParserCache( table, $headers );
+
+ // initially build the cache for the tbody cells (to be able to sort initially)
+ cache = buildCache( table );
+
// Apply event handling to headers
// this is too big, perhaps break it out?
- $headers.click( function ( e ) {
+ $headers.filter( ':not(.unsortable)' ).click( function ( e ) {
if ( e.target.nodeName.toLowerCase() === 'a' ) {
// The user clicked on a link inside a table header
// Do nothing and let the default link click action continue
return true;
}
- if ( firstTime ) {
- firstTime = false;
-
- // Legacy fix of .sortbottoms
- // Wrap them inside inside a tfoot (because that's what they actually want to be) &
- // and put the <tfoot> at the end of the <table>
- var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
- if ( $sortbottoms.length ) {
- var $tfoot = $table.children( 'tfoot' );
- if ( $tfoot.length ) {
- $tfoot.eq(0).prepend( $sortbottoms );
- } else {
- $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
- }
- }
-
- explodeRowspans( $table );
- // try to auto detect column type, and store in tables config
- table.config.parsers = buildParserCache( table, $headers );
- }
-
// Build the cache for the tbody cells
// to share between calculations for this sort action.
// Re-calculated each time a sort action is performed due to possiblity
return false;
}
} );
+
+ /**
+ * Sorts the table. If no sorting is specified by passing a list of sort
+ * objects, the table is sorted according to the initial sorting order.
+ * Passing an empty array will reset sorting (basically just reset the headers
+ * making the table appear unsorted).
+ *
+ * @param sortList {Array} (optional) List of sort objects.
+ */
+ $table.data( 'tablesorter' ).sort = function( sortList ) {
+
+ if ( sortList === undefined ) {
+ sortList = config.sortList;
+ } else if ( sortList.length > 0 ) {
+ sortList = convertSortList( sortList );
+ }
+
+ // re-build the cache for the tbody cells
+ cache = buildCache( table );
+
+ // set css for headers
+ setHeadersCss( table, $headers, sortList, sortCSS, sortMsg );
+
+ // sort the table and append it to the dom
+ appendToTable( table, multisort( table, sortList, cache ) );
+ };
+
+ // sort initially
+ if ( config.sortList.length > 0 ) {
+ explodeRowspans( $table );
+ config.sortList = convertSortList( config.sortList );
+ $table.data( 'tablesorter' ).sort();
+ }
+
} );
},
var jqXhr = $(this).data( 'request' );
// If the delay setting has caused the fetch to have not even happened
// yet, the jqXHR object will have never been set.
- if ( jqXhr && $.isFunction ( jqXhr.abort ) ) {
+ if ( jqXhr && $.isFunction( jqXhr.abort ) ) {
jqXhr.abort();
$(this).removeData( 'request' );
}
.append(
$( '<div>' )
.addClass( 'special-label' )
- .text( mw.msg( 'searchsuggest-containing' ) )
- )
- .append(
+ .text( mw.msg( 'searchsuggest-containing' ) ),
$( '<div>' )
.addClass( 'special-query' )
.text( query )
.show();
} else {
$el.find( '.special-query' )
- .empty()
.text( query )
.autoEllipsis();
}
* @return mixed Parameter value or null.
*/
getParamValue: function ( param, url ) {
- url = url || document.location.href;
+ if ( url === undefined ) {
+ url = document.location.href;
+ }
// Get last match, stop at hash
var re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
m = re.exec( url );
$out->addModuleStyles( 'mediawiki.legacy.oldshared' );
$out->addModuleStyles( 'skins.cologneblue' );
}
-
+
/**
* Override langlink formatting behavior not to uppercase the language names.
* See otherLanguages() in CologneBlueTemplate.
echo "\n</body></html>";
wfRestoreWarnings();
}
-
/**
* Language/charset variant links for classic-style skins
return $this->getSkin()->getLanguage()->pipeList( $s );
}
-
+
// @fixed
function otherLanguages() {
global $wgHideInterlanguageLinks;
function pageTitleLinks() {
$s = array();
$footlinks = $this->getFooterLinks();
-
+
foreach ( $footlinks['places'] as $item ) {
$s[] = $this->data[$item];
}
-
+
return $this->getSkin()->getLanguage()->pipeList( $s );
}
return $s;
}
-
+
/**
* @return string
- *
+ *
* @fixed
*/
function beforeContent() {
</a>
</p>
<p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p>
-
<div id="toplinks">
<p id="syslinks"><?php echo $this->sysLinks() ?></p>
<p id="variantlinks"><?php echo $this->variantLinks() ?></p>
<?php
$s = ob_get_contents();
ob_end_clean();
-
+
return $s;
}
/**
* @return string
- *
+ *
* @fixed
*/
function afterContent() {
// Page-related links
echo $this->bottomLinks();
echo "\n<br />";
-
+
// Footer and second searchbox
echo $this->getSkin()->getLanguage()->pipeList( array(
$this->getSkin()->mainPageLink(),
$this->searchForm( 'footer' )
) );
echo "\n<br />";
-
+
// Standard footer info
$footlinks = $this->getFooterLinks();
if ( $footlinks['info'] ) {
/**
* @return string
- *
+ *
* @fixed
*/
function sysLinks() {
return $this->getSkin()->getLanguage()->pipeList( $s );
}
-
-
-
/**
* @param $heading string
* @return string
- *
+ *
* @fixed
*/
function menuHead( $heading ) {
* @access private
*
* @return string
- *
+ *
* @fixed
*/
function quickBar(){
$s = "\n<div id='quickbar'>";
$sep = "<br />\n";
-
+
$plain_bar = $this->data['sidebar'];
$bar = array();
-
+
// Massage the sidebar
// We want to place SEARCH at the beginning and a lot of stuff before TOOLBOX (or at the end, if it's missing)
$additions_done = false;
while ( !$additions_done ) {
$bar = array(); // Empty it out
-
+
// Always display search on top
$bar['SEARCH'] = true;
-
+
foreach ( $plain_bar as $heading => $links ) {
if ( $heading == 'TOOLBOX' ) {
if( $links !== NULL ) {
// If this is not a toolbox prosthetic we inserted outselves, fill it out
$plain_bar['TOOLBOX'] = $this->getToolbox();
}
-
+
// And insert the stuff
-
+
// "This page" and "Edit" menus
// We need to do some massaging here... we reuse all of the items, except for $...['views']['view'],
// as $...['namespaces']['main'] and $...['namespaces']['talk'] together serve the same purpose.
);
$bar['qbedit'] = $qbedit;
$bar['qbpageoptions'] = $qbpageoptions;
-
+
// Personal tools ("My pages")
$bar['qbmyoptions'] = $this->getPersonalTools();
foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
- $bar['qbmyoptions'][$key] = false;
+ $bar['qbmyoptions'][$key] = null;
}
-
+
$additions_done = true;
}
-
+
// Re-insert current heading, unless it's SEARCH
if ( $heading != 'SEARCH' ) {
$bar[$heading] = $plain_bar[$heading];
}
}
-
+
// If TOOLBOX is missing, $additions_done is still false
if ( !$additions_done ) {
$plain_bar['TOOLBOX'] = false;
}
}
-
+
foreach ( $bar as $heading => $links ) {
if ( $heading == 'SEARCH' ) {
$s .= $this->menuHead( wfMessage( 'qbfind' )->text() );
$s .= $this->searchForm( 'sidebar' );
} elseif ( $heading == 'LANGUAGES' ) {
// discard these; we display languages below page content
- } else {
- if ( $links ) {
+ } elseif ( $links ) {
+ if ( is_array( $links ) ) {
// Use the navigation heading from standard sidebar as the "browse" section
if ( $heading == 'navigation' ) {
$heading = 'qbbrowse';
if ( $heading == 'TOOLBOX' ) {
$heading = 'toolbox';
}
-
+
$headingMsg = wfMessage( $heading );
$any_link = false;
$t = $this->menuHead( $headingMsg->exists() ? $headingMsg->text() : $heading );
-
+
foreach ( $links as $key => $link ) {
// Can be empty due to rampant sidebar massaging we're doing above
if ( $link ) {
$t .= $this->makeListItem( $key, $link, array( 'tag' => 'span' ) ) . $sep;
}
}
-
+
if ( $any_link ) {
$s .= $t;
}
+ } else {
+ // $links can be a HTML string
+ $s .= $links;
}
}
}
/**
* @param $label string
* @return string
- *
+ *
* @fixed
*/
function searchForm( $which ) {
. "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
if( $wgUseTwoButtonsSearchForm ) {
- $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'search' )->escaped() . "\" />\n";
+ $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
} else {
$s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
}
/**
* Adds classes to the body element.
- *
+ *
* @param $out OutputPage object
* @param &$bodyAttrs Array of attributes that will be set on the body element
*/
-/*
-** MediaWiki style sheet for general styles on complex content
-*/
+/**
+ * MediaWiki style sheet for general styles on complex content
+ *
+ * Styles for complex things which are a standard part of page content
+ * (ie: the CSS classing built into the system), like the TOC.
+ */
/* Table of Contents */
#toc,
/**
* MediaWiki style sheet for general styles on basic content elements
- * This style sheet is used by the monobook and vector skins
+ *
+ * Styles for basic elements: links, lists, etc...
+ *
+ * This style sheet is used by the Monobook and Vector skins.
*/
/* Links */
-/*
-** MediaWiki style sheet for common core styles on interfaces
-*/
+/**
+ * MediaWiki style sheet for common core styles on interfaces
+ *
+ * Styles for the Monobook/Vector pattern of laying out common interfaces.
+ * These ids/classes are not built into the system,
+ * they are outputted by the actual MonoBook/Vector code by convention.
+ */
/* Categories */
.catlinks {
{{{1}}}
!! endarticle
+!! article
+Template:echo_with_span
+!! text
+<span>{{{1}}}</span>
+!! endarticle
+
+!! article
+Template:echo_with_div
+!! text
+<div>{{{1}}}</div>
+!! endarticle
+
!! article
Template:attr_str
!! text
!!end
+!!test
+Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
+!!input
+{{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
+!!result
+<p><i>ab</i>c<i>d</i>e
+</p>
+!!end
+
+!!test
+Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
+(PHP parser generates misnested html)
+!! options
+disabled
+!!input
+{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
+!!result
+<p><span><i>a</i></span><i><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
+!!end
+
+!!test
+Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
+(PHP parser generates misnested html)
+!! options
+disabled
+!!input
+{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
+!!result
+<div><i>a</i></div>
+<div><i>b</i>c<i>d</i></div>
+<div>e</div>
+!!end
+
+!!test
+Templates: Ugly nesting: 4. Divs opened/closed across templates
+!!input
+a<div>b{{echo|c</div>d}}e
+!!result
+a<div>bc</div>de
+
+!!end
+
!!test
Parser Functions: 1. Simple example
!!input
<tag></tag>
!! result
<pre>
-string(0) ""
-array(0) {
-}
+''
+array (
+)
</pre>
!! end
!! result
<pre>
NULL
-array(0) {
-}
+array (
+)
</pre>
!! end
!! result
<pre>
NULL
-array(0) {
-}
+array (
+)
</pre>
!! end
<tag>input</tag>
!! result
<pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
</pre>
!! end
<TAG>input</TAG>
!! result
<pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
</pre>
!! end
<TaG>input</TAg>
!! result
<pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
</pre>
!! end
<tag><tag></tag></tag>
!! result
<pre>
-string(5) "<tag>"
-array(0) {
-}
+'<tag>'
+array (
+)
</pre></tag>
!! end
<tag width=200 height = "100" depth = '50' square></tag>
!! result
<pre>
-string(0) ""
-array(4) {
- ["width"]=>
- string(3) "200"
- ["height"]=>
- string(3) "100"
- ["depth"]=>
- string(2) "50"
- ["square"]=>
- string(6) "square"
-}
+''
+array (
+ 'width' => '200',
+ 'height' => '100',
+ 'depth' => '50',
+ 'square' => 'square',
+)
</pre>
!! end
<tag filename='/tmp/bla'></tag>
!! result
<pre>
-string(0) ""
-array(1) {
- ["filename"]=>
- string(8) "/tmp/bla"
-}
+''
+array (
+ 'filename' => '/tmp/bla',
+)
</pre>
!! end
!! result
<pre>
NULL
-array(1) {
- ["foo"]=>
- string(3) "bar"
-}
+array (
+ 'foo' => 'bar',
+)
</pre>text
!! end
!! result
<pre>
NULL
-array(4) {
- ["width"]=>
- string(3) "200"
- ["height"]=>
- string(3) "100"
- ["depth"]=>
- string(2) "50"
- ["square"]=>
- string(6) "square"
-}
+array (
+ 'width' => '200',
+ 'height' => '100',
+ 'depth' => '50',
+ 'square' => 'square',
+)
</pre>
<p>other stuff
</tag>
}
static function dumpHook( $in, $argv ) {
- ob_start();
- var_dump(
- $in,
- $argv
- );
- $ret = ob_get_clean();
-
- return "<pre>\n$ret</pre>";
+ return "<pre>\n" .
+ var_export( $in, true ) . "\n" .
+ var_export( $argv, true ) . "\n" .
+ "</pre>";
}
static function staticTagHook( $in, $argv, $parser ) {
return true;
}
+
+ /**
+ * Returns the ID of a namespace that defaults to Wikitext.
+ * Throws an MWException if there is none.
+ *
+ * @return int the ID of the wikitext Namespace
+ * @since 1.21
+ */
+ protected function getDefaultWikitextNS() {
+ global $wgNamespaceContentModels;
+
+ static $wikitextNS = null; // this is not going to change
+ if ( $wikitextNS !== null ) {
+ return $wikitextNS;
+ }
+
+ // quickly short out on most common case:
+ if ( !isset( $wgNamespaceContentModels[NS_MAIN] ) ) {
+ return NS_MAIN;
+ }
+
+ // NOTE: prefer content namespaces
+ $namespaces = array_unique( array_merge(
+ MWNamespace::getContentNamespaces(),
+ array( NS_MAIN, NS_HELP, NS_PROJECT ), // prefer these
+ MWNamespace::getValidNamespaces()
+ ) );
+
+ $namespaces = array_diff( $namespaces, array(
+ NS_FILE, NS_CATEGORY, NS_MEDIAWIKI, NS_USER // don't mess with magic namespaces
+ ));
+
+ $talk = array_filter( $namespaces, function ( $ns ) {
+ return MWNamespace::isTalk( $ns );
+ } );
+
+ // prefer non-talk pages
+ $namespaces = array_diff( $namespaces, $talk );
+ $namespaces = array_merge( $namespaces, $talk );
+
+ // check default content model of each namespace
+ foreach ( $namespaces as $ns ) {
+ if ( !isset( $wgNamespaceContentModels[$ns] ) ||
+ $wgNamespaceContentModels[$ns] === CONTENT_MODEL_WIKITEXT ) {
+
+ $wikitextNS = $ns;
+ return $wikitextNS;
+ }
+ }
+
+ // give up
+ // @todo: Inside a test, we could skip the test as incomplete.
+ // But frequently, this is used in fixture setup.
+ throw new MWException( "No namespace defaults to wikitext!" );
+ }
}
public function dataGetParserOutput() {
return array(
- array("MediaWiki:Test.css", null, "hello <world>\n",
- "<pre class=\"mw-code mw-css\" dir=\"ltr\">\nhello <world>\n\n</pre>"),
+ array(
+ "MediaWiki:Test.css",
+ null,
+ "hello <world>\n",
+ "<pre class=\"mw-code mw-css\" dir=\"ltr\">\nhello <world>\n\n</pre>" ),
+
+ array(
+ "MediaWiki:Test.css",
+ null,
+ "/* hello [[world]] */\n",
+ "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n/* hello [[world]] */\n\n</pre>",
+ array( 'Links' => array( // NOTE: assumes default settings for $wgTextModelsToParse
+ array( 'World' => 0 ) ) ) ),
+
// @todo: more...?
);
}
}
}
-
-
+
+
function testDebugFunctionTest() {
-
+
global $wgDebugLogFile, $wgDebugTimestamps;
-
+
$old_log_file = $wgDebugLogFile;
$wgDebugLogFile = tempnam( wfTempDir(), 'mw-' );
- # @todo FIXME: This setting should be tested
+ # @todo FIXME: $wgDebugTimestamps should be tested
+ $old_wgDebugTimestamps = $wgDebugTimestamps;
$wgDebugTimestamps = false;
-
-
-
+
+
wfDebug( "This is a normal string" );
$this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
unlink( $wgDebugLogFile );
-
-
+
wfDebug( "This is nöt an ASCII string" );
$this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
unlink( $wgDebugLogFile );
-
-
+
+
wfDebug( "\00305This has böth UTF and control chars\003" );
$this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
unlink( $wgDebugLogFile );
wfDebugMem();
$this->assertGreaterThan( 5000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
unlink( $wgDebugLogFile );
-
+
wfDebugMem(true);
$this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
unlink( $wgDebugLogFile );
-
-
-
+
+
$wgDebugLogFile = $old_log_file;
-
+ $wgDebugTimestamps = $old_wgDebugTimestamps;
}
-
+
function testClientAcceptsGzipTest() {
$settings = array(
public function dataGetParserOutput() {
return array(
- array("MediaWiki:Test.js", null, "hello <world>\n",
- "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello <world>\n\n</pre>"),
+ array(
+ "MediaWiki:Test.js",
+ null,
+ "hello <world>\n",
+ "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello <world>\n\n</pre>" ),
+
+ array(
+ "MediaWiki:Test.js",
+ null,
+ "hello(); // [[world]]\n",
+ "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello(); // [[world]]\n\n</pre>",
+ array( 'Links' => array( // NOTE: assumes default settings for $wgTextModelsToParse
+ array( 'World' => 0 ) ) ) ),
+
// @todo: more...?
);
}
array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
),
+ array( " Foo \n ",
+ " Foo",
+ ),
);
}
}
protected function createPage( $page, $text, $model = null ) {
- if ( is_string( $page ) ) $page = Title::newFromText( $page );
- if ( $page instanceof Title ) $page = new WikiPage( $page );
+ if ( is_string( $page ) ) {
+ if ( !preg_match( '/:/', $page ) &&
+ ( $model === null || $model === CONTENT_MODEL_WIKITEXT ) ) {
+
+ $ns = $this->getDefaultWikitextNS();
+ $page = MWNamespace::getCanonicalName( $ns ) . ':' . $page;
+ }
+
+ $page = Title::newFromText( $page );
+ }
+
+ if ( $page instanceof Title ) {
+ $page = new WikiPage( $page );
+ }
if ( $page->exists() ) {
$page->doDeleteArticle( "done" );
'missing rev_content_model in list of fields');
$this->assertTrue( in_array( 'rev_content_format', $fields ),
'missing rev_content_format in list of fields');
- } else {
- $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
}
}
$userB = \User::createNew( $userB->getName() );
}
+ $ns = $this->getDefaultWikitextNS();
+
$dbw = wfGetDB( DB_MASTER );
$revisions = array();
// create revisions -----------------------------
- $page = WikiPage::factory( Title::newFromText( 'RevisionStorageTest_testUserWasLastToEdit' ) );
+ $page = WikiPage::factory( Title::newFromText(
+ 'RevisionStorageTest_testUserWasLastToEdit', $ns ) );
# zero
$revisions[0] = new Revision( array(
/**
* @covers Revision::selectFields
*/
- public function testSelectFields()
- {
+ public function testSelectFields() {
$fields = Revision::selectFields();
$this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
/**
* @covers Revision::getContentModel
*/
- public function testGetContentModel()
- {
- $orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
- $rev = Revision::newFromId( $orig->getId() );
-
- //NOTE: database fields for the content_model are disabled, so the model name is not retained.
- // We expect to get the default here instead of what was suppleid when creating the revision.
- $this->assertEquals( CONTENT_MODEL_WIKITEXT, $rev->getContentModel() );
+ public function testGetContentModel() {
+ try {
+ $this->makeRevision( array( 'text' => 'hello hello.',
+ 'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
+
+ $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+ . "\$wgContentHandlerUseDB disabled" );
+ } catch ( MWException $ex ) {
+ $this->assertTrue( true ); // ok
+ }
}
/**
* @covers Revision::getContentFormat
*/
- public function testGetContentFormat()
- {
- $orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT, 'content_format' => 'text/javascript' ) );
- $rev = Revision::newFromId( $orig->getId() );
-
- $this->assertEquals( CONTENT_FORMAT_WIKITEXT, $rev->getContentFormat() );
+ public function testGetContentFormat() {
+ try {
+ //@todo: change this to test failure on using a non-standard (but supported) format
+ // for a content model supported in the given location. As of 1.21, there are
+ // no alternative formats for any of the standard content models that could be
+ // used for this though.
+
+ $this->makeRevision( array( 'text' => 'hello hello.',
+ 'content_model' => CONTENT_MODEL_JAVASCRIPT,
+ 'content_format' => 'text/javascript' ) );
+
+ $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+ . "\$wgContentHandlerUseDB disabled" );
+ } catch ( MWException $ex ) {
+ $this->assertTrue( true ); // ok
+ }
}
}
public function dataGetParserOutput() {
return array(
- array("TextContentTest_testGetParserOutput", CONTENT_MODEL_TEXT, "hello ''world'' & stuff\n", "hello ''world'' & stuff"),
+ array(
+ "TextContentTest_testGetParserOutput",
+ CONTENT_MODEL_TEXT,
+ "hello ''world'' & [[stuff]]\n", "hello ''world'' & [[stuff]]",
+ array( 'Links' => array() ) ),
// @todo: more...?
);
}
/**
* @dataProvider dataGetParserOutput
*/
- public function testGetParserOutput( $title, $model, $text, $expectedHtml ) {
+ public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
$title = Title::newFromText( $title );
$content = ContentHandler::makeContent( $text, $title, $model );
$html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
$this->assertEquals( $expectedHtml, trim( $html ) );
+
+ if ( $expectedFields ) {
+ foreach ( $expectedFields as $field => $exp ) {
+ $f = 'get' . ucfirst( $field );
+ $v = call_user_func( array( $po, $f ) );
+
+ if ( is_array( $exp ) ) {
+ $this->assertArrayEquals( $exp, $v );
+ } else {
+ $this->assertEquals( $exp, $v );
+ }
+ }
+ }
+
// @todo: assert more properties
}
public function dataPreSaveTransform() {
return array(
- array( 'hello this is ~~~',
- "hello this is ~~~",
+ array( #0: no signature resolution
+ "hello this is ~~~",
+ "hello this is ~~~",
+ ),
+ array( #1: rtrim
+ " Foo \n ",
+ " Foo",
),
);
}
'wgNamespaceProtection' => array(
NS_MEDIAWIKI => 'editinterface',
),
- 'wgUser' => null,
) );
$this->userName = 'Useruser';
}
function setUser( $userName = null ) {
- global $wgUser;
-
if ( $userName === 'anon' ) {
$this->user = $this->anonUser;
} elseif ( $userName === null || $userName === $this->userName ) {
} else {
$this->user = $this->altUser;
}
-
- $wgUser = $this->user;
}
function testQuickPermissions() {
array( array( 'badaccess-group0' ), array( 'protect-cantedit' ) ),
array( array( 'protect-cantedit' ) ), false ),
'' => array( array( ), array( ), array( ), true ) );
- global $wgUser;
- $wgUser = $this->user;
+
foreach ( array( "edit", "protect", "" ) as $action ) {
$this->setUserPerm( null );
$this->assertEquals( $check[$action][0],
$this->setUserPerm( $action );
$this->assertEquals( $check[$action][3],
- $this->title->userCan( $action, true ) );
+ $this->title->userCan( $action, $this->user, true ) );
$this->assertEquals( $check[$action][3],
- $this->title->quickUserCan( $action ) );
+ $this->title->quickUserCan( $action, $this->user ) );
# count( User::getGroupsWithPermissions( $action ) ) < 1
}
$this->assertEquals( array( ),
$this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
$this->assertEquals( true,
- $this->title->userCan( 'bogus' ) );
+ $this->title->userCan( 'bogus', $this->user ) );
$this->setUserPerm( '' );
$this->assertEquals( array( array( 'badaccess-group0' ) ),
$this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
$this->assertEquals( false,
- $this->title->userCan( 'bogus' ) );
+ $this->title->userCan( 'bogus', $this->user ) );
}
function testCssAndJavascriptPermissions() {
}
function testPageRestrictions() {
- global $wgUser, $wgContLang;
+ global $wgContLang;
$prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
- $wgUser = $this->user;
$this->setTitle( NS_MAIN );
$this->title->mRestrictionsLoaded = true;
$this->setUserPerm( "edit" );
$this->user ) );
$this->assertEquals( true,
- $this->title->quickUserCan( 'edit' ) );
+ $this->title->quickUserCan( 'edit', $this->user ) );
$this->title->mRestrictions = array( "edit" => array( 'bogus', "sysop", "protect", "" ),
"bogus" => array( 'bogus', "sysop", "protect", "" ) );
$this->user ) );
$this->title->mCascadeRestriction = true;
$this->assertEquals( false,
- $this->title->quickUserCan( 'bogus' ) );
+ $this->title->quickUserCan( 'bogus', $this->user ) );
$this->assertEquals( false,
- $this->title->quickUserCan( 'edit' ) );
+ $this->title->quickUserCan( 'edit', $this->user ) );
$this->assertEquals( array( array( 'badaccess-group0' ),
array( 'protectedpagetext', 'bogus' ),
array( 'protectedpagetext', 'protect' ),
}
function testCascadingSourcesRestrictions() {
- global $wgUser;
- $wgUser = $this->user;
$this->setTitle( NS_MAIN, "test page" );
$this->setUserPerm( array( "edit", "bogus" ) );
$this->title->mCascadingRestrictions = array( "bogus" => array( 'bogus', "sysop", "protect", "" ) );
$this->assertEquals( false,
- $this->title->userCan( 'bogus' ) );
+ $this->title->userCan( 'bogus', $this->user ) );
$this->assertEquals( array( array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ) ),
$this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
$this->assertEquals( true,
- $this->title->userCan( 'edit' ) );
+ $this->title->userCan( 'edit', $this->user ) );
$this->assertEquals( array( ),
$this->title->getUserPermissionsErrors( 'edit', $this->user ) );
}
function testActionPermissions() {
- global $wgUser;
- $wgUser = $this->user;
-
$this->setUserPerm( array( "createpage" ) );
$this->setTitle( NS_MAIN, "test page" );
$this->title->mTitleProtection['pt_create_perm'] = '';
$this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
$this->title->getUserPermissionsErrors( 'create', $this->user ) );
$this->assertEquals( false,
- $this->title->userCan( 'create' ) );
+ $this->title->userCan( 'create', $this->user ) );
$this->title->mTitleProtection['pt_create_perm'] = 'sysop';
$this->setUserPerm( array( 'createpage', 'protect' ) );
$this->assertEquals( array( ),
$this->title->getUserPermissionsErrors( 'create', $this->user ) );
$this->assertEquals( true,
- $this->title->userCan( 'create' ) );
+ $this->title->userCan( 'create', $this->user ) );
$this->setUserPerm( array( 'createpage' ) );
$this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
$this->title->getUserPermissionsErrors( 'create', $this->user ) );
$this->assertEquals( false,
- $this->title->userCan( 'create' ) );
+ $this->title->userCan( 'create', $this->user ) );
$this->setTitle( NS_MEDIA, "test page" );
$this->setUserPerm( array( "move" ) );
$this->assertEquals( false,
- $this->title->userCan( 'move' ) );
+ $this->title->userCan( 'move', $this->user ) );
$this->assertEquals( array( array( 'immobile-source-namespace', 'Media' ) ),
$this->title->getUserPermissionsErrors( 'move', $this->user ) );
$this->assertEquals( array( ),
$this->title->getUserPermissionsErrors( 'move', $this->user ) );
$this->assertEquals( true,
- $this->title->userCan( 'move' ) );
+ $this->title->userCan( 'move', $this->user ) );
$this->title->mInterwiki = "no";
$this->assertEquals( array( array( 'immobile-source-page' ) ),
$this->title->getUserPermissionsErrors( 'move', $this->user ) );
$this->assertEquals( false,
- $this->title->userCan( 'move' ) );
+ $this->title->userCan( 'move', $this->user ) );
$this->setTitle( NS_MEDIA, "test page" );
$this->assertEquals( false,
- $this->title->userCan( 'move-target' ) );
+ $this->title->userCan( 'move-target', $this->user ) );
$this->assertEquals( array( array( 'immobile-target-namespace', 'Media' ) ),
$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
$this->assertEquals( array( ),
$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
$this->assertEquals( true,
- $this->title->userCan( 'move-target' ) );
+ $this->title->userCan( 'move-target', $this->user ) );
$this->title->mInterwiki = "no";
$this->assertEquals( array( array( 'immobile-target-page' ) ),
$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
$this->assertEquals( false,
- $this->title->userCan( 'move-target' ) );
+ $this->title->userCan( 'move-target', $this->user ) );
}
function testUserBlock() {
- global $wgUser, $wgEmailConfirmToEdit, $wgEmailAuthentication;
+ global $wgEmailConfirmToEdit, $wgEmailAuthentication;
$wgEmailConfirmToEdit = true;
$wgEmailAuthentication = true;
- $wgUser = $this->user;
$this->setUserPerm( array( "createpage", "move" ) );
$this->setTitle( NS_HELP, "test page" );
$this->assertEquals( array( array( 'confirmedittext' ) ),
$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
$wgEmailConfirmToEdit = false;
- $this->assertEquals( true, $this->title->userCan( 'move-target' ) );
+ $this->assertEquals( true, $this->title->userCan( 'move-target', $this->user ) );
# $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount'
$this->assertEquals( array( ),
$this->title->getUserPermissionsErrors( 'move-target',
$this->user ) );
- $this->assertEquals( false, $this->title->userCan( 'move-target' ) );
+ $this->assertEquals( false, $this->title->userCan( 'move-target', $this->user ) );
// quickUserCan should ignore user blocks
- $this->assertEquals( true, $this->title->quickUserCan( 'move-target' ) );
+ $this->assertEquals( true, $this->title->quickUserCan( 'move-target', $this->user ) );
global $wgLocalTZoffset;
$wgLocalTZoffset = -60;
'Each user rights (core/extensions) has a corresponding right- message.'
);
}
+
+ /**
+ * Test User::editCount
+ */
+ public function testEditCount() {
+ $user = User::newFromName( 'UnitTestUser' );
+ $user->loadDefaults();
+ $user->addToDatabase();
+
+ // let the user have a few (10) edits
+ $page = WikiPage::factory( Title::newFromText( 'UserTest_EditCount' ) );
+ for( $i = 0; $i < 10; $i++ ) {
+ $page->doEdit( (string) $i, 'test', 0, false, $user );
+ }
+
+ $user->clearInstanceCache();
+ $this->assertEquals( 10, $user->getEditCount(), 'After ten edits, the user edit count should be 10' );
+
+ // increase the edit count and clear the cache
+ $user->incEditCount();
+
+ $user->clearInstanceCache();
+ $this->assertEquals( 11, $user->getEditCount(), 'After increasing the edit count manually, the user edit count should be 11' );
+ }
}
return $po;
}
+ public function testGetParserOutput_nonexisting( ) {
+ static $count = 0;
+ $count ++;
+
+ $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
+
+ $opt = new ParserOptions();
+ $po = $page->getParserOutput( $opt );
+
+ $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
+ }
+
+ public function testGetParserOutput_badrev( ) {
+ $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
+
+ $opt = new ParserOptions();
+ $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
+
+ //@todo: would be neat to also test deleted revision
+
+ $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
+ }
+
static $sections =
"Intro
public function dataGetSecondaryDataUpdates() {
return array(
- array("WikitextContentTest_testGetSecondaryDataUpdates_1",
+ array( "WikitextContentTest_testGetSecondaryDataUpdates_1",
CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
array( 'LinksUpdate' => array( 'mRecursive' => true,
'mLinks' => array() ) )
),
- array("WikitextContentTest_testGetSecondaryDataUpdates_2",
+ array( "WikitextContentTest_testGetSecondaryDataUpdates_2",
CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
array( 'LinksUpdate' => array( 'mRecursive' => true,
'mLinks' => array( array( 'World_test_21344' => 0 ) ) ) )
array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
),
+ array( // rtrim
+ " Foo \n ",
+ " Foo",
+ ),
);
}
$this->assertEquals( $data, $page->getContent()->serialize() );
}
- function testEditAppend() {
- $this->markTestIncomplete( "not yet implemented" );
+ static function provideEditAppend() {
+ return array(
+ array( #0: append
+ 'foo', 'append', 'bar', "foobar"
+ ),
+ array( #1: prepend
+ 'foo', 'prepend', 'bar', "barfoo"
+ ),
+ array( #2: append to empty page
+ '', 'append', 'foo', "foo"
+ ),
+ array( #3: prepend to empty page
+ '', 'prepend', 'foo', "foo"
+ ),
+ array( #4: append to non-existing page
+ null, 'append', 'foo', "foo"
+ ),
+ array( #5: prepend to non-existing page
+ null, 'prepend', 'foo', "foo"
+ ),
+ );
}
- function testEditSection() {
- $this->markTestIncomplete( "not yet implemented" );
+ /**
+ * @dataProvider provideEditAppend
+ */
+ function testEditAppend( $text, $op, $append, $expected ) {
+ static $count = 0;
+ $count++;
+
+ // assume NS_HELP defaults to wikitext
+ $name = "Help:ApiEditPageTest_testEditAppend_$count";
+
+ // -- create page (or not) -----------------------------------------
+ if ( $text !== null ) {
+ if ( $text === '' ) {
+ // can't create an empty page, so create it with some content
+ list( $re,, ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => '(dummy)', ) );
+ }
+
+ list( $re,, ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => $text, ) );
+
+ $this->assertEquals( 'Success', $re['edit']['result'] ); // sanity
+ }
+
+ // -- try append/prepend --------------------------------------------
+ list( $re,, ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ $op . 'text' => $append, ) );
+
+ $this->assertEquals( 'Success', $re['edit']['result'] );
+
+ // -- validate -----------------------------------------------------
+ $page = new WikiPage( Title::newFromText( $name ) );
+ $content = $page->getContent();
+ $this->assertNotNull( $content, 'Page should have been created' );
+
+ $text = $content->getNativeData();
+
+ $this->assertEquals( $expected, $text );
}
- function testUndo() {
+ function testEditSection() {
$this->markTestIncomplete( "not yet implemented" );
}
- function testEditNonText() {
+ function testUndo() {
$this->markTestIncomplete( "not yet implemented" );
}
}
return $cases;
}
+ public function testGetLocalCopyAndReference404() {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestGetLocalCopyAndReference404();
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestGetLocalCopyAndReference404();
+ $this->tearDownFiles();
+ }
+
+ public function doTestGetLocalCopyAndReference404() {
+ $backendName = $this->backendClass();
+
+ $base = self::baseStorePath();
+
+ $tmpFile = $this->backend->getLocalCopy( array(
+ 'src' => "$base/unittest-cont1/not-there" ) );
+ $this->assertEquals( null, $tmpFile, "Local copy of not existing file is null ($backendName)." );
+
+ $tmpFile = $this->backend->getLocalReference( array(
+ 'src' => "$base/unittest-cont1/not-there" ) );
+ $this->assertEquals( null, $tmpFile, "Local ref of not existing file is null ($backendName)." );
+ }
+
/**
* @dataProvider provider_testPrepareAndClean
*/
*/
public function testHasGlobalId( $sites ) {
$this->assertFalse( $sites->hasSite( 'non-existing-global-id' ) );
- $this->assertFalse( $sites->hasInternalId( 72010101010 ) );
+ $this->assertFalse( $sites->hasInternalId( 720101010 ) );
if ( !$sites->isEmpty() ) {
/**
array(
9.45,
array(),
- '9.5s',
+ '9.5 s',
'formatTimePeriod() rounding (<10s)'
),
array(
array(
9.95,
array(),
- '10s',
+ '10 s',
'formatTimePeriod() rounding (<10s)'
),
array(
array(
59.55,
array(),
- '1m 0s',
+ '1 min 0 s',
'formatTimePeriod() rounding (<60s)'
),
array(
array(
119.55,
array(),
- '2m 0s',
+ '2 min 0 s',
'formatTimePeriod() rounding (<1h)'
),
array(
array(
3599.55,
array(),
- '1h 0m 0s',
+ '1 h 0 min 0 s',
'formatTimePeriod() rounding (<1h)'
),
array(
array(
7199.55,
array(),
- '2h 0m 0s',
+ '2 h 0 min 0 s',
'formatTimePeriod() rounding (>=1h)'
),
array(
array(
7199.55,
'avoidseconds',
- '2h 0m',
+ '2 h 0 min',
'formatTimePeriod() rounding (>=1h), avoidseconds'
),
array(
array(
7199.55,
'avoidminutes',
- '2h 0m',
+ '2 h 0 min',
'formatTimePeriod() rounding (>=1h), avoidminutes'
),
array(
array(
172799.55,
'avoidseconds',
- '48h 0m',
+ '48 h 0 min',
'formatTimePeriod() rounding (=48h), avoidseconds'
),
array(
array(
259199.55,
'avoidminutes',
- '3d 0h',
+ '3 d 0 h',
'formatTimePeriod() rounding (>48h), avoidminutes'
),
array(
array(
176399.55,
'avoidseconds',
- '2d 1h 0m',
+ '2 d 1 h 0 min',
'formatTimePeriod() rounding (>48h), avoidseconds'
),
array(
array(
176399.55,
'avoidminutes',
- '2d 1h',
+ '2 d 1 h',
'formatTimePeriod() rounding (>48h), avoidminutes'
),
array(
array(
259199.55,
'avoidseconds',
- '3d 0h 0m',
+ '3 d 0 h 0 min',
'formatTimePeriod() rounding (>48h), avoidseconds'
),
array(
array(
172801.55,
'avoidseconds',
- '2d 0h 0m',
+ '2 d 0 h 0 min',
'formatTimePeriod() rounding, (>48h), avoidseconds'
),
array(
array(
176460.55,
array(),
- '2d 1h 1m 1s',
+ '2 d 1 h 1 min 1 s',
'formatTimePeriod() rounding, recursion, (>48h)'
),
array(
$this->tablesUsed[] = 'revision';
$this->tablesUsed[] = 'text';
+ $ns = $this->getDefaultWikitextNS();
+
try {
// Simple page
- $title = Title::newFromText( 'BackupDumperTestP1' );
+ $title = Title::newFromText( 'BackupDumperTestP1', $ns );
$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' );
+ $title = Title::newFromText( 'BackupDumperTestP2', $ns );
$page = WikiPage::factory( $title );
list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
"BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
$this->pageId2 = $page->getId();
// Deleted page.
- $title = Title::newFromText( 'BackupDumperTestP3' );
+ $title = Title::newFromText( 'BackupDumperTestP3', $ns );
$page = WikiPage::factory( $title );
list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
"BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
$page->doDeleteArticle( "Testing ;)" );
// Page from non-default namespace
+
+ if ( $ns === NS_TALK ) {
+ //@todo: work around this.
+ throw new MWException( "The default wikitext namespace is the talk namespace. "
+ . " We can't currently deal with that.");
+ }
+
$title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
$page = WikiPage::factory( $title );
list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
// We'll add several pages, revision and texts. The following variables hold the
// corresponding ids.
private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+ private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4, $pageTitle5;
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;
+ private $namespace, $talk_namespace;
function addDBData() {
$this->tablesUsed[] = 'page';
$this->tablesUsed[] = 'text';
try {
- $title = Title::newFromText( 'BackupDumperTestP1' );
- $page = WikiPage::factory( $title );
+ $this->namespace = $this->getDefaultWikitextNS();
+ $this->talk_namespace = NS_TALK;
+
+ if ( $this->namespace === $this->talk_namespace ) {
+ //@todo: work around this.
+ throw new MWException( "The default wikitext namespace is the talk namespace. "
+ . " We can't currently deal with that.");
+ }
+
+ $this->pageTitle1 = Title::newFromText( 'BackupDumperTestP1', $this->namespace );
+ $page = WikiPage::factory( $this->pageTitle1 );
list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
"BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
$this->pageId1 = $page->getId();
- $title = Title::newFromText( 'BackupDumperTestP2' );
- $page = WikiPage::factory( $title );
+ $this->pageTitle2 = Title::newFromText( 'BackupDumperTestP2', $this->namespace );
+ $page = WikiPage::factory( $this->pageTitle2 );
list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
"BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
"BackupDumperTestP2Summary4 extra " );
$this->pageId2 = $page->getId();
- $title = Title::newFromText( 'BackupDumperTestP3' );
- $page = WikiPage::factory( $title );
+ $this->pageTitle3 = Title::newFromText( 'BackupDumperTestP3', $this->namespace );
+ $page = WikiPage::factory( $this->pageTitle3 );
list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
"BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
$this->pageId3 = $page->getId();
$page->doDeleteArticle( "Testing ;)" );
- $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
- $page = WikiPage::factory( $title );
+ $this->pageTitle4 = Title::newFromText( 'BackupDumperTestP1', $this->talk_namespace );
+ $page = WikiPage::factory( $this->pageTitle4 );
list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
"Talk about BackupDumperTestP1 Text1",
"Talk BackupDumperTestP1 Summary1" );
$this->assertDumpStart( $fname );
// Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
$this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
$this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
"BackupDumperTestP1Text1" );
$this->assertPageEnd();
// Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
$this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
$this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
"BackupDumperTestP2Text1" );
// -> Page is marked deleted. Hence not visible
// Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
$this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
$this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
"Talk about BackupDumperTestP1 Text1" );
$this->assertDumpStart( $fname );
// Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
$this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
$this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
$this->assertPageEnd();
// Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
$this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
$this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
$this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
// -> Page is marked deleted. Hence not visible
// Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
$this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
$this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
$this->assertPageEnd();
$this->assertDumpStart( $fname );
// Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
$this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
$this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
$this->assertPageEnd();
// Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
$this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
$this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
$this->assertPageEnd();
// -> Page is marked deleted. Hence not visible
// Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
$this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
$this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
$this->assertPageEnd();
$this->assertDumpStart( $fname );
// Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
$this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
$this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
$this->assertPageEnd();
// Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
$this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
$this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
$this->assertPageEnd();
// -> Page is marked deleted. Hence not visible
// Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
$this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
$this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
$this->assertPageEnd();
$this->assertDumpStart( $fnameMetaHistory );
// Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
$this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
$this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
$this->assertPageEnd();
// Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
$this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
$this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
$this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
// -> Page is marked deleted. Hence not visible
// Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
$this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
$this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
$this->assertPageEnd();
$this->assertDumpStart( $fnameMetaCurrent );
// Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
$this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
$this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
$this->assertPageEnd();
// Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
$this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
$this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
$this->assertPageEnd();
// -> Page is marked deleted. Hence not visible
// Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
$this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
$this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
$this->assertPageEnd();
$this->assertDumpStart( $fnameArticles );
// Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+ $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
$this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
$this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
$this->assertPageEnd();
// Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+ $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
$this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
$this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
$this->assertPageEnd();
// -> Page is marked deleted. Hence not visible
// Page 4
- // -> Page is not in NS_MAIN. Hence not visible
+ // -> Page is not in $this->namespace. Hence not visible
$this->assertDumpEnd();
$this->tablesUsed[] = 'revision';
$this->tablesUsed[] = 'text';
+ $wikitextNamespace = $this->getDefaultWikitextNS();
+
try {
- $title = Title::newFromText( 'FetchTextTestPage1' );
+ $title = Title::newFromText( 'FetchTextTestPage1', $wikitextNamespace );
$page = WikiPage::factory( $title );
$this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
- $title = Title::newFromText( 'FetchTextTestPage2' );
+ $title = Title::newFromText( 'FetchTextTestPage2', $wikitextNamespace );
$page = WikiPage::factory( $title );
$this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
$this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
var ascendingName = [earth, jupiter, mars, mercury, saturn, venus];
var ascendingRadius = [mercury, mars, venus, earth, saturn, jupiter];
+tableTest(
+ 'Basic planet table: sorting initially - ascending by name',
+ header,
+ planets,
+ ascendingName,
+ function ( $table ) {
+ $table.tablesorter( { sortList: [ { 0: 'asc' } ] } );
+ }
+);
+tableTest(
+ 'Basic planet table: sorting initially - descending by radius',
+ header,
+ planets,
+ reversed(ascendingRadius),
+ function ( $table ) {
+ $table.tablesorter( { sortList: [ { 1: 'desc' } ] } );
+ }
+);
tableTest(
'Basic planet table: ascending by name',
header,
}
);
+// Sample data set to test multiple column sorting
+var header = [ 'column1' , 'column2'],
+ a1 = [ 'A', '1' ],
+ a2 = [ 'A', '2' ],
+ a3 = [ 'A', '3' ],
+ b1 = [ 'B', '1' ],
+ b2 = [ 'B', '2' ],
+ b3 = [ 'B', '3' ];
+var initial = [a2, b3, a1, a3, b2, b1];
+var asc = [a1, a2, a3, b1, b2, b3];
+var descasc = [b1, b2, b3, a1, a2, a3];
+
+tableTest(
+ 'Sorting multiple columns by passing sort list',
+ header,
+ initial,
+ asc,
+ function ( $table ) {
+ $table.tablesorter(
+ { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+ );
+ }
+);
+tableTest(
+ 'Sorting multiple columns by programmatically triggering sort()',
+ header,
+ initial,
+ descasc,
+ function ( $table ) {
+ $table.tablesorter();
+ $table.data( 'tablesorter' ).sort(
+ [ { 0: 'desc' }, { 1: 'asc' } ]
+ );
+ }
+);
+tableTest(
+ 'Reset to initial sorting by triggering sort() without any parameters',
+ header,
+ initial,
+ asc,
+ function ( $table ) {
+ $table.tablesorter(
+ { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+ );
+ $table.data( 'tablesorter' ).sort(
+ [ { 0: 'desc' }, { 1: 'asc' } ]
+ );
+ $table.data( 'tablesorter' ).sort();
+ }
+);
+QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
+ var $table = tableCreate( header, initial );
+ $table.tablesorter(
+ { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] }
+ );
+ $table.data( 'tablesorter' ).sort( [] );
+
+ assert.equal(
+ $table.find( 'th.headerSortUp' ).length + $table.find( 'th.headerSortDown' ).length,
+ 0,
+ 'No sort specific sort classes addign to header cells'
+ );
+
+ assert.equal(
+ $table.find( 'th' ).first().attr( 'title' ),
+ mw.msg( 'sort-ascending' ),
+ 'First header cell has default title'
+ );
+
+ assert.equal(
+ $table.find( 'th' ).first().attr( 'title' ),
+ $table.find( 'th' ).last().attr( 'title' ),
+ 'Both header cells\' titles match'
+ );
+} );
// Regression tests!
tableTest(
planets,
planetsRowspan,
function ( $table ) {
- // Modify the table to have a multiuple-row-spanning cell:
+ // Modify the table to have a multiple-row-spanning cell:
// - Remove 2nd cell of 4th row, and, 2nd cell or 5th row.
$table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
// - Set rowspan for 2nd cell of 3rd row to 3.
$table.find( '.headerSort:eq(0)' ).click();
}
);
+tableTest(
+ 'Basic planet table: same value for multiple rows via rowspan (sorting initially)',
+ header,
+ planets,
+ planetsRowspan,
+ function ( $table ) {
+ // Modify the table to have a multiple-row-spanning cell:
+ // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row.
+ $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
+ // - Set rowspan for 2nd cell of 3rd row to 3.
+ // This covers the removed cell in the 4th and 5th row.
+ $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+
+ $table.tablesorter( { sortList: [ { 0: 'asc' } ] } );
+ }
+);
tableTest(
'Basic planet table: Same value for multiple rows via rowspan II',
header,
planets,
planetsRowspanII,
function ( $table ) {
- // Modify the table to have a multiuple-row-spanning cell:
+ // Modify the table to have a multiple-row-spanning cell:
// - Remove 1st cell of 4th row, and, 1st cell or 5th row.
$table.find( 'tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)' ).remove();
// - Set rowspan for 1st cell of 3rd row to 3.
}
);
+QUnit.test( 'Test detection routine', function ( assert ) {
+ var $table;
+ $table = $(
+ '<table class="sortable">' +
+ '<caption>CAPTION</caption>' +
+ '<tr><th>THEAD</th></tr>' +
+ '<tr><td>1</td></tr>' +
+ '<tr class="sortbottom"><td>text</td></tr>' +
+ '</table>'
+ );
+ $table.tablesorter();
+
+ assert.equal(
+ $table.data( 'tablesorter' ).config.parsers[0].id,
+ 'number',
+ 'Correctly detected column content skipping sortbottom'
+ );
+} );
/** FIXME: the diff output is not very readeable. */
QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {