and 'subcats'
* (bug 38362) Make Special:Listuser includeable on wiki pages.
* Added support in jquery.localize for placeholder attributes.
+* (bug 38151) Implemented mw.user.getRights for getting and caching the current
+ user's user rights.
+* Implemented mw.user.getGroups for getting and caching user groups.
+* (bug 37830) Added $wgRequirePasswordforEmailChange to control whether password
+ confirmation is required for changing an email address or not.
+* HTMLForm mutators can now be chained (they return $this)
=== Bug fixes in 1.20 ===
* (bug 30245) Use the correct way to construct a log page title.
* (bug 38093) Gender of changed user groups missing in Special:Log/rights
* (bug 35893) Special:Block needs to load mediawiki.special.block.js.
* (bug 37331) ResourceLoader modules sometimes execute twice in Firefox
+* (bug 31644) GlobalUsage, CentralAuth and AbuseLog extensions should not use
+ insecure links to foreign wikis in the WikiMap.
+* (bug 36073) Avoid duplicate element IDs on File pages
+* (bug 25095) Special:Categories should also include the first relevant item
+ when "from" is filled.
+* (bug 35526) jquery.tablesorter now uses a stable sort.
+* (bug 38953) --memory-limit switch not working for runJobs.php.
=== API changes in 1.20 ===
* (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
* (bug 38190) Add "required" flag to some token params for hint in api docs.
* (bug 27567) Add file repo support to prop=duplicatefiles.
* (bug 27610) Add archivename for non-latest image version to list=filearchive
+* (bug 38231) Add xml parse tree to action=parse.
+* Watchlist notification timestamp may be queried by page and may be updated via the API.
+* (bug 38904) prop=revisions&rvstart=... no longer blows up when continuing.
=== Languages updated in 1.20 ===
and only applies to MyISAM or similar DBs. Those should only be used
for archived sites anyway. We can't get edit conflicts on such sites,
so the WikiPage code wasn't useful there either.
+* Deprecated mw.user.name in favour of mw.user.getName.
+* Deprecated mw.user.anonymous in favour of mw.user.isAnon.
== Compatibility ==
&$title: Title object of the image
&$file: File object, or false if it doesn't exist
&$frameParams: Various parameters with special meanings; see documentation in
- includes/Linker.php for Linker::makeImageLink2
+ includes/Linker.php for Linker::makeImageLink
&$handlerParams: Various parameters with special meanings; see documentation in
- includes/Linker.php for Linker::makeImageLink2
+ includes/Linker.php for Linker::makeImageLink
&$time: Timestamp of file in 'YYYYMMDDHHIISS' string form, or false for current
&$res: Final HTML output, used if you return false
// @todo FIXME: i18n issue/patchwork message
$this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
wfMsgExt( 'historywarning', array( 'parseinline' ), $this->getContext()->getLanguage()->formatNum( $revisions ) ) .
- wfMsgHtml( 'word-separator' ) . Linker::link( $title,
+ wfMsgHtml( 'word-separator' ) . Linker::linkKnown( $title,
wfMsgHtml( 'history' ),
array( 'rel' => 'archives' ),
array( 'action' => 'history' ) ) .
'UserArray' => 'includes/UserArray.php',
'UserArrayFromResult' => 'includes/UserArray.php',
'UserBlockedError' => 'includes/Exception.php',
+ 'UserNotLoggedIn' => 'includes/Exception.php',
'UserMailer' => 'includes/UserMailer.php',
'UserRightsProxy' => 'includes/UserRightsProxy.php',
'ViewCountUpdate' => 'includes/ViewCountUpdate.php',
'ApiResult' => 'includes/api/ApiResult.php',
'ApiRollback' => 'includes/api/ApiRollback.php',
'ApiRsd' => 'includes/api/ApiRsd.php',
+ 'ApiSetNotificationTimestamp' => 'includes/api/ApiSetNotificationTimestamp.php',
'ApiTokens' => 'includes/api/ApiTokens.php',
'ApiUnblock' => 'includes/api/ApiUnblock.php',
'ApiUndelete' => 'includes/api/ApiUndelete.php',
*/
$wgSend404Code = true;
+
+/**
+ * The $wgShowRollbackEditCount variable is used to show how many edits will be
+ * rollback. The numeric value of the varible are the limit up to are counted.
+ * If the value is false or 0, the edits are not counted.
+ */
+$wgShowRollbackEditCount = 10;
+
/** @} */ # End of output format settings }
/*************************************************************************//**
$wgDBtestuser = ''; //db user that has permission to create and drop the test databases only
$wgDBtestpassword = '';
+/**
+ * Whether the user must enter their password to change their e-mail address
+ */
+$wgRequirePasswordforEmailChange = true;
+
/**
* For really cool vim folding this needs to be at the end:
* vim: foldmarker=@{,@} foldmethod=marker
* Exception class which takes an HTML error message, and does not
* produce a backtrace. Replacement for OutputPage::fatalError().
*
+ * @since 1.7
* @ingroup Exception
*/
class FatalError extends MWException {
/**
* An error page which can definitely be safely rendered using the OutputPage.
*
+ * @since 1.7
* @ingroup Exception
*/
class ErrorPageError extends MWException {
* Similar to ErrorPage, but emit a 400 HTTP error code to let mobile
* browser it is not really a valid content.
*
+ * @since 1.19
* @ingroup Exception
*/
class BadTitleError extends ErrorPageError {
* Show an error when a user tries to do something they do not have the necessary
* permissions for.
*
+ * @since 1.18
* @ingroup Exception
*/
class PermissionsError extends ErrorPageError {
* Show an error when the wiki is locked/read-only and the user tries to do
* something that requires write access.
*
+ * @since 1.18
* @ingroup Exception
*/
class ReadOnlyError extends ErrorPageError {
/**
* Show an error when the user hits a rate limit.
*
+ * @since 1.18
* @ingroup Exception
*/
class ThrottledError extends ErrorPageError {
/**
* Show an error when the user tries to do something whilst blocked.
*
+ * @since 1.18
* @ingroup Exception
*/
class UserBlockedError extends ErrorPageError {
* This is essentially an ErrorPageError exception which by default use the
* 'exception-nologin' as a title and 'exception-nologin-text' for the message.
* @see bug 37627
+ * @since 1.20
*
* @par Example:
* @code
* Show an error that looks like an HTTP server error.
* Replacement for wfHttpError().
*
+ * @since 1.19
* @ingroup Exception
*/
class HttpError extends MWException {
* object, and typically implement at least getInputHTML, which generates
* the HTML for the input field to be placed in the table.
*
+ * You can find extensive documentation on the www.mediawiki.org wiki:
+ * - http://www.mediawiki.org/wiki/HTMLForm
+ * - http://www.mediawiki.org/wiki/HTMLForm/tutorial
+ *
* The constructor input is an associative array of $fieldname => $info,
* where $info is an Associative Array with any of the following:
*
* (eg one without the "wp" prefix), specify it here and
* it will be used without modification.
*
+ * Since 1.20, you can chain mutators to ease the form generation:
+ * @par Example:
+ * @code
+ * $form = new HTMLForm( $someFields );
+ * $form->setMethod( 'get' )
+ * ->setWrapperLegendMsg( 'message-key' )
+ * ->suppressReset()
+ * ->prepareForm()
+ * ->displayForm();
+ * @endcode
+ * Note that you will have prepareForm and displayForm at the end. Other
+ * methods call done after that would simply not be part of the form :(
+ *
* TODO: Document 'section' / 'subsection' stuff
*/
class HTMLForm extends ContextSource {
* @param $format String the name of the format to use, must be one of
* $this->availableDisplayFormats
* @since 1.20
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setDisplayFormat( $format ) {
if ( !in_array( $format, $this->availableDisplayFormats ) ) {
throw new MWException ( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
}
$this->displayFormat = $format;
+ return $this;
}
/**
}
/**
- * Prepare form for submission
+ * Prepare form for submission.
+ *
+ * @attention When doing method chaining, that should be the very last
+ * method call before displayForm().
+ *
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function prepareForm() {
# Check if we have the info we need
# Load data from the request.
$this->loadData();
+ return $this;
}
/**
* the output from HTMLForm::filterDataForSubmit, and must
* return Bool true on success, Bool false if no submission
* was attempted, or String HTML output to display on error.
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setSubmitCallback( $cb ) {
$this->mSubmitCallback = $cb;
+ return $this;
}
/**
* Set a message to display on a validation error.
* @param $msg Mixed String or Array of valid inputs to wfMsgExt()
* (so each entry can be either a String or Array)
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setValidationErrorMessage( $msg ) {
$this->mValidationErrorMessage = $msg;
+ return $this;
}
/**
* Set the introductory message, overwriting any existing message.
* @param $msg String complete text of message to display
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setIntro( $msg ) {
$this->setPreText( $msg );
+ return $this;
}
/**
* Set the introductory message, overwriting any existing message.
* @since 1.19
* @param $msg String complete text of message to display
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
- function setPreText( $msg ) { $this->mPre = $msg; }
+ function setPreText( $msg ) {
+ $this->mPre = $msg;
+ return $this;
+ }
/**
* Add introductory text.
* @param $msg String complete text of message to display
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
- function addPreText( $msg ) { $this->mPre .= $msg; }
+ function addPreText( $msg ) {
+ $this->mPre .= $msg;
+ return $this;
+ }
/**
* Add header text, inside the form.
* @param $msg String complete text of message to display
* @param $section string The section to add the header to
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function addHeaderText( $msg, $section = null ) {
if ( is_null( $section ) ) {
}
$this->mSectionHeaders[$section] .= $msg;
}
+ return $this;
}
/**
* @since 1.19
* @param $msg String complete text of message to display
* @param $section The section to add the header to
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setHeaderText( $msg, $section = null ) {
if ( is_null( $section ) ) {
} else {
$this->mSectionHeaders[$section] = $msg;
}
+ return $this;
}
/**
* Add footer text, inside the form.
* @param $msg String complete text of message to display
* @param $section string The section to add the footer text to
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function addFooterText( $msg, $section = null ) {
if ( is_null( $section ) ) {
}
$this->mSectionFooters[$section] .= $msg;
}
+ return $this;
}
/**
* @since 1.19
* @param $msg String complete text of message to display
* @param $section string The section to add the footer text to
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setFooterText( $msg, $section = null ) {
if ( is_null( $section ) ) {
} else {
$this->mSectionFooters[$section] = $msg;
}
+ return $this;
}
/**
* Add text to the end of the display.
* @param $msg String complete text of message to display
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
- function addPostText( $msg ) { $this->mPost .= $msg; }
+ function addPostText( $msg ) {
+ $this->mPost .= $msg;
+ return $this;
+ }
/**
* Set text at the end of the display.
* @param $msg String complete text of message to display
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
- function setPostText( $msg ) { $this->mPost = $msg; }
+ function setPostText( $msg ) {
+ $this->mPost = $msg;
+ return $this;
+ }
/**
* Add a hidden field to the output
* @param $name String field name. This will be used exactly as entered
* @param $value String field value
* @param $attribs Array
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
public function addHiddenField( $name, $value, $attribs = array() ) {
$attribs += array( 'name' => $name );
$this->mHiddenFields[] = array( $value, $attribs );
+ return $this;
}
+ /**
+ * Add a button to the form
+ * @param $name String field name.
+ * @param $value String field value
+ * @param $id String DOM id for the button (default: null)
+ * @param $attribs Array
+ * @return HTMLForm $this for chaining calls (since 1.20)
+ */
public function addButton( $name, $value, $id = null, $attribs = null ) {
$this->mButtons[] = compact( 'name', 'value', 'id', 'attribs' );
+ return $this;
}
/**
* Display the form (sending to $wgOut), with an appropriate error
* message or stack of messages, and any validation errors, etc.
+ *
+ * @attention You should call prepareForm() before calling this function.
+ * Moreover, when doing method chaining this should be the very last method
+ * call just after prepareForm().
+ *
* @param $submitResult Mixed output from HTMLForm::trySubmit()
+ * @return Nothing, should be last call
*/
function displayForm( $submitResult ) {
$this->getOutput()->addHTML( $this->getHTML( $submitResult ) );
/**
* Set the text for the submit button
* @param $t String plaintext.
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setSubmitText( $t ) {
$this->mSubmitText = $t;
+ return $this;
}
/**
* Set the text for the submit button to a message
* @since 1.19
* @param $msg String message key
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setSubmitTextMsg( $msg ) {
$this->setSubmitText( $this->msg( $msg )->text() );
+ return $this;
}
/**
: wfMsg( 'htmlform-submit' );
}
+ /**
+ * @param $name String Submit button name
+ * @return HTMLForm $this for chaining calls (since 1.20)
+ */
public function setSubmitName( $name ) {
$this->mSubmitName = $name;
+ return $this;
}
+ /**
+ * @param $name String Tooltip for the submit button
+ * @return HTMLForm $this for chaining calls (since 1.20)
+ */
public function setSubmitTooltip( $name ) {
$this->mSubmitTooltip = $name;
+ return $this;
}
/**
* Set the id for the submit button.
* @param $t String.
* @todo FIXME: Integrity of $t is *not* validated
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setSubmitID( $t ) {
$this->mSubmitID = $t;
+ return $this;
}
+ /**
+ * @param $id String DOM id for the form
+ * @return HTMLForm $this for chaining calls (since 1.20)
+ */
public function setId( $id ) {
$this->mId = $id;
+ return $this;
}
/**
* Prompt the whole form to be wrapped in a "<fieldset>", with
* this text as its "<legend>" element.
* @param $legend String HTML to go inside the "<legend>" element.
* Will be escaped
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
- public function setWrapperLegend( $legend ) { $this->mWrapperLegend = $legend; }
+ public function setWrapperLegend( $legend ) {
+ $this->mWrapperLegend = $legend;
+ return $this;
+ }
/**
* Prompt the whole form to be wrapped in a "<fieldset>", with
* this message as its "<legend>" element.
* @since 1.19
* @param $msg String message key
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setWrapperLegendMsg( $msg ) {
$this->setWrapperLegend( $this->msg( $msg )->escaped() );
+ return $this;
}
/**
* @todo currently only used for the "<fieldset>" legend on forms
* with multiple sections; should be used elsewhre?
* @param $p String
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setMessagePrefix( $p ) {
$this->mMessagePrefix = $p;
+ return $this;
}
/**
* Set the title for form submission
* @param $t Title of page the form is on/should be posted to
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function setTitle( $t ) {
$this->mTitle = $t;
+ return $this;
}
/**
/**
* Set the method used to submit the form
* @param $method String
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setMethod( $method = 'post' ) {
$this->mMethod = $method;
+ return $this;
}
public function getMethod() {
* Stop a reset button being shown for this form
* @param $suppressReset Bool set to false to re-enable the
* button again
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
function suppressReset( $suppressReset = true ) {
$this->mShowReset = !$suppressReset;
+ return $this;
}
/**
* @since 1.19
*
* @param string|bool $action
+ * @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setAction( $action ) {
$this->mAction = $action;
+ return $this;
}
}
$link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
$ul .= Html::rawElement(
'li',
- array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+ array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
$link2
) . "\n";
}
}
$out->addHTML( Html::rawElement(
'li',
- array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+ array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
$liContents
) . "\n"
);
* Given parameters derived from [[Image:Foo|options...]], generate the
* HTML that that syntax inserts in the page.
*
- * @param $title Title object
+ * @param $parser Parser object
+ * @param $title Title object of the file (not the currently viewed page)
* @param $file File object, or false if it doesn't exist
* @param $frameParams Array: associative array of parameters external to the media handler.
* Boolean parameters are indicated by presence or absence, the value is arbitrary and
* @param $time String: timestamp of the file, set as false for current
* @param $query String: query params for desc url
* @param $widthOption: Used by the parser to remember the user preference thumbnailsize
+ * @since 1.20
* @return String: HTML for an image, with links, wrappers, etc.
*/
- public static function makeImageLink2( Title $title, $file, $frameParams = array(),
+ public static function makeImageLink( /*Parser*/ $parser, Title $title, $file, $frameParams = array(),
$handlerParams = array(), $time = false, $query = "", $widthOption = null )
{
$res = null;
}
if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) ) {
- global $wgContLang;
- # Create a thumbnail. Alignment depends on language
- # writing direction, # right aligned for left-to-right-
- # languages ("Western languages"), left-aligned
- # for right-to-left-languages ("Semitic languages")
+ # Create a thumbnail. Alignment depends on the writing direction of
+ # the page content language (right-aligned for LTR languages,
+ # left-aligned for RTL languages)
#
- # If thumbnail width has not been provided, it is set
+ # If a thumbnail width has not been provided, it is set
# to the default user option as specified in Language*.php
if ( $fp['align'] == '' ) {
- $fp['align'] = $wgContLang->alignEnd();
+ if( $parser instanceof Parser ) {
+ $fp['align'] = $parser->getTargetLanguage()->alignEnd();
+ } else {
+ # backwards compatibility, remove with makeImageLink2()
+ global $wgContLang;
+ $fp['align'] = $wgContLang->alignEnd();
+ }
}
return $prefix . self::makeThumbLink2( $title, $file, $fp, $hp, $time, $query ) . $postfix;
}
return str_replace( "\n", ' ', $prefix . $s . $postfix );
}
+ /**
+ * See makeImageLink()
+ * When this function is removed, remove if( $parser instanceof Parser ) check there too
+ * @deprecated since 1.20
+ */
+ public static function makeImageLink2( Title $title, $file, $frameParams = array(),
+ $handlerParams = array(), $time = false, $query = "", $widthOption = null ) {
+ return self::makeImageLink( null, $title, $file, $frameParams,
+ $handlerParams, $time, $query, $widthOption );
+ }
+
/**
* Get the link parameters for MediaTransformOutput::toHtml() from given
* frame parameters supplied by the Parser.
* @return String: HTML fragment
*/
public static function buildRollbackLink( $rev, IContextSource $context = null ) {
+ global $wgShowRollbackEditCount, $wgMiserMode;
+
+ // To config which pages are effected by miser mode
+ $disableRollbackEditCountSpecialPage = array( 'Recentchanges', 'Watchlist' );
+
if ( $context === null ) {
$context = RequestContext::getMain();
}
$query['bot'] = '1';
$query['hidediff'] = '1'; // bug 15999
}
- return self::link(
- $title,
- $context->msg( 'rollbacklink' )->escaped(),
- array( 'title' => $context->msg( 'tooltip-rollback' )->text() ),
- $query,
- array( 'known', 'noclasses' )
- );
+
+ $disableRollbackEditCount = false;
+ if( $wgMiserMode ) {
+ foreach( $disableRollbackEditCountSpecialPage as $specialPage ) {
+ if( $context->getTitle()->isSpecial( $specialPage ) ) {
+ $disableRollbackEditCount = true;
+ break;
+ }
+ }
+ }
+
+ if( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
+ $dbr = wfGetDB( DB_SLAVE );
+
+ // Up to the value of $wgShowRollbackEditCount revisions are counted
+ $res = $dbr->select( 'revision',
+ array( 'rev_id', 'rev_user_text' ),
+ // $rev->getPage() returns null sometimes
+ array( 'rev_page' => $rev->getTitle()->getArticleID() ),
+ __METHOD__,
+ array( 'USE INDEX' => 'page_timestamp',
+ 'ORDER BY' => 'rev_timestamp DESC',
+ 'LIMIT' => $wgShowRollbackEditCount + 1 )
+ );
+
+ $editCount = 0;
+ while( $row = $dbr->fetchObject( $res ) ) {
+ if( $rev->getUserText() != $row->rev_user_text ) {
+ break;
+ }
+ $editCount++;
+ }
+
+ if( $editCount > $wgShowRollbackEditCount ) {
+ $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )->numParams( $wgShowRollbackEditCount )->parse();
+ } else {
+ $editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
+ }
+
+ return self::link(
+ $title,
+ $editCount_output,
+ array( 'title' => $context->msg( 'tooltip-rollback' )->text() ),
+ $query,
+ array( 'known', 'noclasses' )
+ );
+ } else {
+ return self::link(
+ $title,
+ $context->msg( 'rollbacklink' )->escaped(),
+ array( 'title' => $context->msg( 'tooltip-rollback' )->text() ),
+ $query,
+ array( 'known', 'noclasses' )
+ );
+ }
}
/**
*
* First implemented with MediaWiki 1.17, the Message class is intented to
* replace the old wfMsg* functions that over time grew unusable.
- * @see https://www.mediawiki.org/wiki/New_messages_API for equivalences
+ * @see https://www.mediawiki.org/wiki/Manual:Messages_API for equivalences
* between old and new functions.
*
* You should use the wfMessage() global function which acts as a wrapper for
protected $mLastShown, $mFirstShown, $mPastTheEndIndex, $mDefaultQuery, $mNavigationBar;
+ /**
+ * Whether to include the offset in the query
+ */
+ protected $mIncludeOffset = false;
+
/**
* Result object for the query. Warning: seek before use.
*
$this->mLimit = $limit;
}
+ /**
+ * Set whether a row matching exactly the offset should be also included
+ * in the result or not. By default this is not the case, but when the
+ * offset is user-supplied this might be wanted.
+ *
+ * @param $include bool
+ */
+ public function setIncludeOffset( $include ) {
+ $this->mIncludeOffset = $include;
+ }
+
/**
* Extract some useful data from the result object for use by
* the navigation bar, put it into $this
$sortColumns = array_merge( array( $this->mIndexField ), $this->mExtraSortFields );
if ( $descending ) {
$options['ORDER BY'] = $sortColumns;
- $operator = '>';
+ $operator = $this->mIncludeOffset ? '>=' : '>';
} else {
$orderBy = array();
foreach ( $sortColumns as $col ) {
$orderBy[] = $col . ' DESC';
}
$options['ORDER BY'] = $orderBy;
- $operator = '<';
+ $operator = $this->mIncludeOffset ? '<=' : '<';
}
if ( $offset != '' ) {
$conds[] = $this->mIndexField . $operator . $this->mDb->addQuotes( $offset );
$ipList = gethostbynamel( $host );
if( $ipList ) {
- wfDebug( "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
+ wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
$found = true;
break;
} else {
- wfDebug( "Requested $host, not found in $base.\n" );
+ wfDebugLog( 'dnsblacklist', "Requested $host, not found in $base.\n" );
}
}
}
$wiki = WikiMap::getWiki( $wikiID );
if ( $wiki ) {
- return $wiki->getUrl( $page );
+ return $wiki->getFullUrl( $page );
}
return false;
// Write modules
'purge' => 'ApiPurge',
+ 'setnotificationtimestamp' => 'ApiSetNotificationTimestamp',
'rollback' => 'ApiRollback',
'delete' => 'ApiDelete',
'undelete' => 'ApiUndelete',
*/
protected function handleCORS() {
global $wgCrossSiteAJAXdomains, $wgCrossSiteAJAXdomainExceptions;
- $response = $this->getRequest()->response();
+
$originParam = $this->getParameter( 'origin' ); // defaults to null
if ( $originParam === null ) {
// No origin parameter, nothing to do
return true;
}
+
+ $request = $this->getRequest();
+ $response = $request->response();
// Origin: header is a space-separated list of origins, check all of them
- $originHeader = isset( $_SERVER['HTTP_ORIGIN'] ) ? $_SERVER['HTTP_ORIGIN'] : '';
- $origins = explode( ' ', $originHeader );
+ $originHeader = $request->getHeader( 'Origin' );
+ if ( $originHeader === false ) {
+ $origins = array();
+ } else {
+ $origins = explode( ' ', $originHeader );
+ }
if ( !in_array( $originParam, $origins ) ) {
// origin parameter set but incorrect
// Send a 403 response
$result_array['properties'] = $this->formatProperties( $p_result->getProperties() );
}
+ if ( $params['generatexml'] ) {
+ $wgParser->startExternalParse( $titleObj, $popts, OT_PREPROCESS );
+ $dom = $wgParser->preprocessToDom( $this->text );
+ if ( is_callable( array( $dom, 'saveXML' ) ) ) {
+ $xml = $dom->saveXML();
+ } else {
+ $xml = $dom->__toString();
+ }
+ $result_array['parsetree'] = array();
+ $result->setContent( $result_array['parsetree'], $xml );
+ }
+
$result_mapping = array(
'redirects' => 'r',
'langlinks' => 'll',
'uselang' => null,
'section' => null,
'disablepp' => false,
+ 'generatexml' => false,
);
}
'uselang' => 'Which language to parse the request in',
'section' => 'Only retrieve the content of this section number',
'disablepp' => 'Disable the PP Report from the parser output',
+ 'generatexml' => 'Generate XML parse tree',
);
}
}
}
- $files = RepoGroup::singleton()->findFiles( array_keys( $images ) );
+ $filesToFind = array_keys( $images );
+ if( $params['localonly'] ) {
+ $files = RepoGroup::singleton()->getLocalRepo()->findFiles( $filesToFind );
+ } else {
+ $files = RepoGroup::singleton()->findFiles( $filesToFind );
+ }
$fit = true;
$count = 0;
}
// find all files with the hashes, result format is: array( hash => array( dup1, dup2 ), hash1 => ... )
- $filesBySha1s = RepoGroup::singleton()->findBySha1s( array_unique( array_values( $sha1s ) ) );
+ $filesToFindBySha1s = array_unique( array_values( $sha1s ) );
+ if( $params['localonly'] ) {
+ $filesBySha1s = RepoGroup::singleton()->getLocalRepo()->findBySha1s( $filesToFindBySha1s );
+ } else {
+ $filesBySha1s = RepoGroup::singleton()->findBySha1s( $filesToFindBySha1s );
+ }
// iterate over $images to handle continue param correct
foreach( $images as $image => $pageId ) {
'descending'
)
),
+ 'localonly' => false,
);
}
'limit' => 'How many duplicate files to return',
'continue' => 'When more results are available, use this to continue',
'dir' => 'The direction in which to list',
+ 'localonly' => 'Look only for files in the local repository',
);
}
}
$result = $this->getResult();
- $images = RepoGroup::singleton()->findFiles( $titles );
+ //search only inside the local repo
+ if( $params['localonly'] ) {
+ $images = RepoGroup::singleton()->getLocalRepo()->findFiles( $titles );
+ } else {
+ $images = RepoGroup::singleton()->findFiles( $titles );
+ }
foreach ( $images as $img ) {
// Skip redirects
if ( $img->getOriginalTitle()->isRedirect() ) {
ApiBase::PARAM_TYPE => 'string',
),
'continue' => null,
+ 'localonly' => false,
);
}
'end' => 'Timestamp to stop listing at',
'metadataversion' => array( "Version of metadata to use. if 'latest' is specified, use latest version.",
"Defaults to '1' for backwards compatibility" ),
- 'continue' => 'If the query response includes a continue value, use it here to get another page of results'
+ 'continue' => 'If the query response includes a continue value, use it here to get another page of results',
+ 'localonly' => 'Look only for files in the local repository',
);
}
private $fld_protection = false, $fld_talkid = false,
$fld_subjectid = false, $fld_url = false,
- $fld_readable = false, $fld_watched = false,
+ $fld_readable = false, $fld_watched = false, $fld_notificationtimestamp = false,
$fld_preload = false, $fld_displaytitle = false;
private $params, $titles, $missing, $everything, $pageCounter;
private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
$pageLatest, $pageLength;
- private $protections, $watched, $talkids, $subjectids, $displaytitles;
+ private $protections, $watched, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
private $tokenFunctions;
$prop = array_flip( $this->params['prop'] );
$this->fld_protection = isset( $prop['protection'] );
$this->fld_watched = isset( $prop['watched'] );
+ $this->fld_notificationtimestamp = isset( $prop['notificationtimestamp'] );
$this->fld_talkid = isset( $prop['talkid'] );
$this->fld_subjectid = isset( $prop['subjectid'] );
$this->fld_url = isset( $prop['url'] );
$this->getProtectionInfo();
}
- if ( $this->fld_watched ) {
+ if ( $this->fld_watched || $this->fld_notificationtimestamp ) {
$this->getWatchedInfo();
}
$pageInfo['watched'] = '';
}
+ if ( $this->fld_notificationtimestamp ) {
+ $pageInfo['notificationtimestamp'] = '';
+ if ( isset( $this->notificationtimestamps[$ns][$dbkey] ) ) {
+ $pageInfo['notificationtimestamp'] = wfTimestamp( TS_ISO_8601, $this->notificationtimestamps[$ns][$dbkey] );
+ }
+ }
+
if ( $this->fld_talkid && isset( $this->talkids[$ns][$dbkey] ) ) {
$pageInfo['talkid'] = $this->talkids[$ns][$dbkey];
}
/**
* Get information about watched status and put it in $this->watched
+ * and $this->notificationtimestamps
*/
private function getWatchedInfo() {
$user = $this->getUser();
}
$this->watched = array();
+ $this->notificationtimestamps = array();
$db = $this->getDB();
$lb = new LinkBatch( $this->everything );
$this->resetQueryParams();
$this->addTables( array( 'watchlist' ) );
$this->addFields( array( 'wl_title', 'wl_namespace' ) );
+ $this->addFieldsIf( 'wl_notificationtimestamp', $this->fld_notificationtimestamp );
$this->addWhere( array(
$lb->constructSet( 'wl', $db ),
'wl_user' => $user->getID()
$res = $this->select( __METHOD__ );
foreach ( $res as $row ) {
- $this->watched[$row->wl_namespace][$row->wl_title] = true;
+ if ( $this->fld_watched ) {
+ $this->watched[$row->wl_namespace][$row->wl_title] = true;
+ }
+ if ( $this->fld_notificationtimestamp ) {
+ $this->notificationtimestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+ }
}
}
'protection',
'talkid',
'watched', # private
+ 'notificationtimestamp', # private
'subjectid',
'url',
'readable', # private
return array(
'prop' => array(
'Which additional properties to get:',
- ' protection - List the protection level of each page',
- ' talkid - The page ID of the talk page for each non-talk page',
- ' watched - List the watched status of each page',
- ' subjectid - The page ID of the parent page for each talk page',
- ' url - Gives a full URL to the page, and also an edit URL',
- ' readable - Whether the user can read this page',
- ' preload - Gives the text returned by EditFormPreloadText',
- ' displaytitle - Gives the way the page title is actually displayed',
+ ' protection - List the protection level of each page',
+ ' talkid - The page ID of the talk page for each non-talk page',
+ ' watched - List the watched status of each page',
+ ' notificationtimestamp - The watchlist notification timestamp of each page',
+ ' subjectid - The page ID of the parent page for each talk page',
+ ' url - Gives a full URL to the page, and also an edit URL',
+ ' readable - Whether the user can read this page',
+ ' preload - Gives the text returned by EditFormPreloadText',
+ ' displaytitle - Gives the way the page title is actually displayed',
),
'token' => 'Request a token to perform a data-modifying action on a page',
'continue' => 'When more results are available, use this to continue',
'watched' => array(
'watched' => 'boolean'
),
+ 'notificationtimestamp' => array(
+ 'notificationtimestamp' => array(
+ ApiBase::PROP_TYPE => 'timestamp',
+ ApiBase::PROP_NULLABLE => true
+ )
+ ),
'talkid' => array(
'talkid' => array(
ApiBase::PROP_TYPE => 'integer',
$this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
}
+ // Continuing effectively uses startid. But we can't use rvstartid
+ // directly, because there is no way to tell the client to ''not''
+ // send rvstart if it sent it in the original query. So instead we
+ // send the continuation startid as rvcontinue, and ignore both
+ // rvstart and rvstartid when that is supplied.
+ if ( !is_null( $params['continue'] ) ) {
+ $params['startid'] = $params['continue'];
+ unset( $params['start'] );
+ }
+
// This code makes an assumption that sorting by rev_id and rev_timestamp produces
// the same result. This way users may request revisions starting at a given time,
// but to page through results use the rev_id returned after each page.
if ( !$enumRevMode ) {
ApiBase::dieDebug( __METHOD__, 'Got more rows then expected' ); // bug report
}
- $this->setContinueEnumParameter( 'startid', intval( $row->rev_id ) );
+ $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
break;
}
$fit = $this->addPageSubItem( $row->rev_page, $this->extractRowInfo( $row ), 'rev' );
if ( !$fit ) {
if ( $enumRevMode ) {
- $this->setContinueEnumParameter( 'startid', intval( $row->rev_id ) );
+ $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
} elseif ( $revCount > 0 ) {
$this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
} else {
* @return array
*/
public static function getAutoGroups( $user ) {
+ // FIXME this logic is duplicated from User::getEffectiveGroups(), centralize this
$groups = array();
$groups[] = '*';
if ( !$user->isAnon() ) {
$groups[] = 'user';
+ $groups = array_merge( $groups, Autopromote::getAutopromoteGroups( $user ) );
}
- return array_merge( $groups, Autopromote::getAutopromoteGroups( $user ) );
+ return $groups;
}
public function getCacheMode( $params ) {
--- /dev/null
+<?php
+
+/**
+ * API for MediaWiki 1.14+
+ *
+ * Created on Jun 18, 2012
+ *
+ * Copyright © 2012 Brad Jorsch
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * API interface for setting the wl_notificationtimestamp field
+ * @ingroup API
+ */
+class ApiSetNotificationTimestamp extends ApiBase {
+
+ public function __construct( $main, $action ) {
+ parent::__construct( $main, $action );
+ }
+
+ public function execute() {
+ $user = $this->getUser();
+
+ if ( $user->isAnon() ) {
+ $this->dieUsage( 'Anonymous users cannot use watchlist change notifications', 'notloggedin' );
+ }
+
+ $params = $this->extractRequestParams();
+ $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
+
+ $pageSet = new ApiPageSet( $this );
+ $args = array_merge( array( $params, 'entirewatchlist' ), array_keys( $pageSet->getAllowedParams() ) );
+ call_user_func_array( array( $this, 'requireOnlyOneParameter' ), $args );
+
+ $db = $this->getDB();
+ $dbw = $this->getDB( DB_MASTER );
+
+ $timestamp = null;
+ if ( isset( $params['timestamp'] ) ) {
+ $timestamp = $dbw->timestamp( $params['timestamp'] );
+ }
+
+ if ( !$params['entirewatchlist'] ) {
+ $pageSet->execute();
+ }
+
+ if ( isset( $params['torevid'] ) ) {
+ if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
+ $this->dieUsage( 'torevid may only be used with a single page', 'multpages' );
+ }
+ $title = reset( $pageSet->getGoodTitles() );
+ $timestamp = Revision::getTimestampFromId( $title, $params['torevid'] );
+ if ( $timestamp ) {
+ $timestamp = $dbw->timestamp( $timestamp );
+ } else {
+ $timestamp = null;
+ }
+ } elseif ( isset( $params['newerthanrevid'] ) ) {
+ if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
+ $this->dieUsage( 'newerthanrevid may only be used with a single page', 'multpages' );
+ }
+ $title = reset( $pageSet->getGoodTitles() );
+ $revid = $title->getNextRevisionID( $params['newerthanrevid'] );
+ if ( $revid ) {
+ $timestamp = $dbw->timestamp( Revision::getTimestampFromId( $title, $revid ) );
+ } else {
+ $timestamp = null;
+ }
+ }
+
+ $apiResult = $this->getResult();
+ $result = array();
+ if ( $params['entirewatchlist'] ) {
+ // Entire watchlist mode: Just update the thing and return a success indicator
+ $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $timestamp ),
+ array( 'wl_user' => $user->getID() ),
+ __METHOD__
+ );
+
+ $result['notificationtimestamp'] = ( is_null( $timestamp ) ? '' : wfTimestamp( TS_ISO_8601, $timestamp ) );
+ } else {
+ // First, log the invalid titles
+ foreach( $pageSet->getInvalidTitles() as $title ) {
+ $r = array();
+ $r['title'] = $title;
+ $r['invalid'] = '';
+ $result[] = $r;
+ }
+ foreach( $pageSet->getMissingPageIDs() as $p ) {
+ $page = array();
+ $page['pageid'] = $p;
+ $page['missing'] = '';
+ $page['notwatched'] = '';
+ $result[] = $page;
+ }
+ foreach( $pageSet->getMissingRevisionIDs() as $r ) {
+ $rev = array();
+ $rev['revid'] = $r;
+ $rev['missing'] = '';
+ $rev['notwatched'] = '';
+ $result[] = $rev;
+ }
+
+ // Now process the valid titles
+ $lb = new LinkBatch( $pageSet->getTitles() );
+ $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $timestamp ),
+ array( 'wl_user' => $user->getID(), $lb->constructSet( 'wl', $dbw ) ),
+ __METHOD__
+ );
+
+ // Query the results of our update
+ $timestamps = array();
+ $res = $dbw->select( 'watchlist', array( 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ),
+ array( 'wl_user' => $user->getID(), $lb->constructSet( 'wl', $dbw ) ),
+ __METHOD__
+ );
+ foreach ( $res as $row ) {
+ $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+ }
+
+ // Now, put the valid titles into the result
+ $pages = array();
+ foreach ( $pageSet->getTitles() as $title ) {
+ $ns = $title->getNamespace();
+ $dbkey = $title->getDBkey();
+ $r = array(
+ 'ns' => intval( $ns ),
+ 'title' => $title->getPrefixedText(),
+ );
+ if ( !$title->exists() ) {
+ $r['missing'] = '';
+ }
+ if ( isset( $timestamps[$ns] ) && array_key_exists( $dbkey, $timestamps[$ns] ) ) {
+ $r['notificationtimestamp'] = '';
+ if ( $timestamps[$ns][$dbkey] !== null ) {
+ $r['notificationtimestamp'] = wfTimestamp( TS_ISO_8601, $timestamps[$ns][$dbkey] );
+ }
+ } else {
+ $r['notwatched'] = '';
+ }
+ $result[] = $r;
+ }
+
+ $apiResult->setIndexedTagName( $result, 'page' );
+ }
+ $apiResult->addValue( null, $this->getModuleName(), $result );
+ }
+
+ public function mustBePosted() {
+ return true;
+ }
+
+ public function isWriteMode() {
+ return true;
+ }
+
+ public function needsToken() {
+ return true;
+ }
+
+ public function getTokenSalt() {
+ return '';
+ }
+
+ public function getAllowedParams() {
+ $psModule = new ApiPageSet( $this );
+ return $psModule->getAllowedParams() + array(
+ 'entirewatchlist' => array(
+ ApiBase::PARAM_TYPE => 'boolean'
+ ),
+ 'token' => null,
+ 'timestamp' => array(
+ ApiBase::PARAM_TYPE => 'timestamp'
+ ),
+ 'torevid' => array(
+ ApiBase::PARAM_TYPE => 'integer'
+ ),
+ 'newerthanrevid' => array(
+ ApiBase::PARAM_TYPE => 'integer'
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ $psModule = new ApiPageSet( $this );
+ return $psModule->getParamDescription() + array(
+ 'entirewatchlist' => 'Work on all watched pages',
+ 'timestamp' => 'Timestamp to which to set the notification timestamp',
+ 'torevid' => 'Revision to set the notification timestamp to (one page only)',
+ 'newerthanrevid' => 'Revision to set the notification timestamp newer than (one page only)',
+ 'token' => 'A token previously acquired via prop=info',
+ );
+ }
+
+ public function getResultProperties() {
+ return array(
+ ApiBase::PROP_LIST => true,
+ ApiBase::PROP_ROOT => array(
+ 'notificationtimestamp' => array(
+ ApiBase::PROP_TYPE => 'timestamp',
+ ApiBase::PROP_NULLABLE => true
+ )
+ ),
+ '' => array(
+ 'ns' => array(
+ ApiBase::PROP_TYPE => 'namespace',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ 'title' => array(
+ ApiBase::PROP_TYPE => 'string',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ 'pageid' => array(
+ ApiBase::PROP_TYPE => 'integer',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ 'revid' => array(
+ ApiBase::PROP_TYPE => 'integer',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ 'invalid' => 'boolean',
+ 'missing' => 'boolean',
+ 'notwatched' => 'boolean',
+ 'notificationtimestamp' => array(
+ ApiBase::PROP_TYPE => 'timestamp',
+ ApiBase::PROP_NULLABLE => true
+ )
+ )
+ );
+ }
+
+ public function getDescription() {
+ return array( 'Update the notification timestamp for watched pages.',
+ 'This affects the highlighting of changed pages in the watchlist and history,',
+ 'and the sending of email when the "E-mail me when a page on my watchlist is',
+ 'changed" preference is enabled.'
+ );
+ }
+
+ public function getPossibleErrors() {
+ $psModule = new ApiPageSet( $this );
+ return array_merge(
+ parent::getPossibleErrors(),
+ $psModule->getPossibleErrors(),
+ $this->getRequireMaxOneParameterErrorMessages( array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
+ $this->getRequireOnlyOneParameterErrorMessages( array_merge( array( 'entirewatchlist' ), array_keys( $psModule->getAllowedParams() ) ) ),
+ array(
+ array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot use watchlist change notifications' ),
+ array( 'code' => 'multpages', 'info' => 'torevid may only be used with a single page' ),
+ array( 'code' => 'multpages', 'info' => 'newerthanrevid may only be used with a single page' ),
+ )
+ );
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=setnotificationtimestamp&entirewatchlist=&token=ABC123' => 'Reset the notification status for the entire watchlist',
+ 'api.php?action=setnotificationtimestamp&titles=Main_page&token=ABC123' => 'Reset the notification status for "Main page"',
+ 'api.php?action=setnotificationtimestamp&titles=Main_page×tamp=2012-01-01T00:00:00Z&token=ABC123' => 'Set the notification timestamp for "Main page" so all edits since 1 January 2012 are unviewed',
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:SetNotificationTimestamp';
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id$';
+ }
+}
*/
private function getContextResult(){
$warnings = $this->getApiWarnings();
- if ( $warnings ) {
+ if ( $warnings && !$this->mParams['ignorewarnings'] ) {
// Get warnings formated in result array format
return $this->getWarningsResult( $warnings );
} elseif ( $this->mParams['chunk'] ) {
// Add chunk, and get result
- return $this->getChunkResult();
+ return $this->getChunkResult( $warnings );
} elseif ( $this->mParams['stash'] ) {
// Stash the file and get stash result
- return $this->getStashResult();
+ return $this->getStashResult( $warnings );
}
// This is the most common case -- a normal upload with no warnings
// performUpload will return a formatted properly for the API with status
- return $this->performUpload();
+ return $this->performUpload( $warnings );
}
/**
* Get Stash Result, throws an expetion if the file could not be stashed.
+ * @param $warnings array Array of Api upload warnings
* @return array
*/
- private function getStashResult(){
+ private function getStashResult( $warnings ){
$result = array ();
// Some uploads can request they be stashed, so as not to publish them immediately.
// In this case, a failure to stash ought to be fatal
$result['result'] = 'Success';
$result['filekey'] = $this->performStash();
$result['sessionkey'] = $result['filekey']; // backwards compatibility
+ if ( $warnings && count( $warnings ) > 0 ) {
+ $result['warnings'] = $warnings;
+ }
} catch ( MWException $e ) {
$this->dieUsage( $e->getMessage(), 'stashfailed' );
}
}
/**
* Get Warnings Result
- * @param $warnings Array of Api upload warnings
+ * @param $warnings array Array of Api upload warnings
* @return array
*/
private function getWarningsResult( $warnings ){
}
/**
* Get the result of a chunk upload.
+ * @param $warnings array Array of Api upload warnings
* @return array
*/
- private function getChunkResult(){
+ private function getChunkResult( $warnings ){
$result = array();
$result['result'] = 'Continue';
+ if ( $warnings && count( $warnings ) > 0 ) {
+ $result['warnings'] = $warnings;
+ }
$request = $this->getMain()->getRequest();
$chunkPath = $request->getFileTempname( 'chunk' );
$chunkSize = $request->getUpload( 'chunk' )->getSize();
/**
- * Check warnings if ignorewarnings is not set.
+ * Check warnings.
* Returns a suitable array for inclusion into API results if there were warnings
* Returns the empty array if there were no warnings
*
protected function getApiWarnings() {
$warnings = array();
- if ( !$this->mParams['ignorewarnings'] ) {
- $warnings = $this->mUpload->checkWarnings();
- }
+ $warnings = $this->mUpload->checkWarnings();
+
return $this->transformWarnings( $warnings );
}
* Perform the actual upload. Returns a suitable result array on success;
* dies on failure.
*
+ * @param $warnings array Array of Api upload warnings
* @return array
*/
- protected function performUpload() {
+ protected function performUpload( $warnings ) {
// Use comment as initial page text by default
if ( is_null( $this->mParams['text'] ) ) {
$this->mParams['text'] = $this->mParams['comment'];
$result['result'] = 'Success';
$result['filename'] = $file->getName();
+ if ( $warnings && count( $warnings ) > 0 ) {
+ $result['warnings'] = $warnings;
+ }
return $result;
}
public function delete( array $conditions, $functionName = null ) {
return wfGetDB( DB_MASTER )->delete(
$this->getName(),
- $this->getPrefixedValues( $conditions ),
+ $conditions === array() ? '*' : $this->getPrefixedValues( $conditions ),
$functionName
) !== false; // DatabaseBase::delete does not always return true for success as documented...
}
public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
$this->setReadDb( DB_MASTER );
- foreach ( $this->select( null, $conditions ) as /* IORMRow */ $item ) {
+ /**
+ * @var IORMRow $item
+ */
+ foreach ( $this->select( null, $conditions ) as $item ) {
$item->loadSummaryFields( $summaryFields );
$item->setSummaryMode( true );
$item->save();
$obj->set_etag( md5( $params['content'] ) );
// Use the same content type as StreamFile for security
$obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
+ if ( !strlen( $obj->content_type ) ) { // special case
+ $obj->content_type = 'unknown/unknown';
+ }
if ( !empty( $params['async'] ) ) { // deferred
$handle = $obj->write_async( $params['content'] );
$status->value = new SwiftFileOpHandle( $this, $params, 'Create', $handle );
$obj->set_etag( md5_file( $params['src'] ) );
// Use the same content type as StreamFile for security
$obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
+ if ( !strlen( $obj->content_type ) ) { // special case
+ $obj->content_type = 'unknown/unknown';
+ }
if ( !empty( $params['async'] ) ) { // deferred
wfSuppressWarnings();
$fp = fopen( $params['src'], 'rb' );
}
/**
- * Callback for usort() to do file sorts by title
+ * Callback for usort() to do file sorts by name
*
* @param $a File
* @param $b File
*
- * @return Integer: result of title comparison
+ * @return Integer: result of name comparison
*/
public static function compare( File $a, File $b ) {
- return Title::compare( $a->getTitle(), $b->getTitle() );
+ return strcmp( $a->getName(), $b->getName() );
}
/**
*
* @param $command String: Job command
* @param $title Title: Associated title
- * @param $params Array: Job parameters
+ * @param $params Array|bool: Job parameters
* @param $id Int: Job identifier
+ * @throws MWException
* @return Job
*/
static function factory( $command, Title $title, $params = false, $id = 0 ) {
/**
* @param $command
* @param $title
- * @param $params array
- * @param int $id
+ * @param $params array|bool
+ * @param $id int
*/
function __construct( $command, $title, $params = false, $id = 0 ) {
$this->command = $command;
function _load_items( $sock, &$ret ) {
while ( 1 ) {
$decl = fgets( $sock );
- if ( $decl == "END\r\n" ) {
+ if( $decl === false ) {
+ $this->_debugprint( "Error reading socket for a memcached response\n" );
+ return 0;
+ } elseif ( $decl == "END\r\n" ) {
return true;
} elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+)\r\n$/', $decl, $match ) ) {
list( $rkey, $flags, $len ) = array( $match[1], $match[2], $match[3] );
}
} else {
- $this->_debugprint( "Error parsing memcached response\n" );
+ $peer = stream_socket_get_name( $sock, true /** remote **/ );
+ $this->_debugprint( "Error parsing memcached response from [{$peer}]\n" );
return 0;
}
}
# Linker does the rest
$time = isset( $options['time'] ) ? $options['time'] : false;
- $ret = Linker::makeImageLink2( $title, $file, $params['frame'], $params['handler'],
+ $ret = Linker::makeImageLink( $this, $title, $file, $params['frame'], $params['handler'],
$time, $descQuery, $this->mOptions->getThumbSize() );
# Give the handler a chance to modify the parser object
'tabindex' => '2',
'options' => self::getSuggestedDurations(),
'other' => $this->msg( 'ipbother' )->text(),
+ 'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
),
'Reason' => array(
'type' => 'selectandother',
}
if( $block->mExpiry == 'infinity' ) {
- $fields['Expiry']['default'] = 'indefinite';
+ $fields['Expiry']['default'] = 'infinite';
} else {
$fields['Expiry']['default'] = wfTimestamp( TS_RFC2822, $block->mExpiry );
}
$from = str_replace( ' ', '_', $from );
if( $from !== '' ) {
$from = Title::capitalize( $from, NS_CATEGORY );
- $this->mOffset = $from;
+ $this->setOffset( $from );
+ $this->setIncludeOffset( true );
}
}
* @ingroup SpecialPage
*/
class SpecialChangeEmail extends UnlistedSpecialPage {
+
+ /**
+ * Users password
+ * @var string
+ */
+ protected $mPassword;
+
+ /**
+ * Users new email address
+ * @var string
+ */
+ protected $mNewEmail;
+
public function __construct() {
parent::__construct( 'ChangeEmail' );
}
+ /**
+ * @return Bool
+ */
function isListed() {
global $wgAuth;
return $wgAuth->allowPropChange( 'emailaddress' );
$this->showForm();
}
+ /**
+ * @param $type string
+ */
protected function doReturnTo( $type = 'hard' ) {
$titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) );
if ( !$titleObj instanceof Title ) {
}
}
+ /**
+ * @param $msg string
+ */
protected function error( $msg ) {
$this->getOutput()->wrapWikiMsg( "<p class='error'>\n$1\n</p>", $msg );
}
protected function showForm() {
+ global $wgRequirePasswordforEmailChange;
$user = $this->getUser();
$oldEmailText = $user->getEmail()
Html::hidden( 'token', $user->getEditToken() ) . "\n" .
Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
$this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
- Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n" .
- $this->pretty( array(
- array( 'wpName', 'username', 'text', $user->getName() ),
- array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
- array( 'wpNewEmail', 'changeemail-newemail', 'input', $this->mNewEmail ),
- array( 'wpPassword', 'yourpassword', 'password', $this->mPassword ),
- ) ) . "\n" .
+ Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
+ );
+ $items = array(
+ array( 'wpName', 'username', 'text', $user->getName() ),
+ array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
+ array( 'wpNewEmail', 'changeemail-newemail', 'input', $this->mNewEmail ),
+ );
+ if ( $wgRequirePasswordforEmailChange ) {
+ $items[] = array( 'wpPassword', 'yourpassword', 'password', $this->mPassword );
+ }
+
+ $this->getOutput()->addHTML(
+ $this->pretty( $items ) .
+ "\n" .
"<tr>\n" .
"<td></td>\n" .
'<td class="mw-input">' .
);
}
+ /**
+ * @param $fields array
+ * @return string
+ */
protected function pretty( $fields ) {
$out = '';
foreach ( $fields as $list ) {
}
/**
+ * @param $user User
+ * @param $pass string
+ * @param $newaddr string
* @return bool|string true or string on success, false on failure
*/
protected function attemptChange( User $user, $pass, $newaddr ) {
return false;
}
- if ( !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
+ global $wgRequirePasswordforEmailChange;
+ if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
$this->error( 'wrongpassword' );
return false;
}
* @param $res ResultWrapper
*/
public function preprocessResults( $db, $res ) {
+ if ( !$res->numRows() ) {
+ return;
+ }
+
$batch = new LinkBatch();
foreach ( $res as $row ) {
$batch->add( $row->namespace, $row->title );
}
$batch->execute();
- if( $db->numRows( $res ) > 0 )
- $db->dataSeek( $res, 0 );
+
+ $res->seek( 0 );
}
/**
* @return String
*/
public function formatResult( $skin, $result ) {
- $title = Title::makeTitle( $result->namespace, $result->title );
+ $title = Title::makeTitleSafe( $result->namespace, $result->title );
+ if ( !$title ) {
+ return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+ }
return $this->getLanguage()->specialList(
Linker::link( $title ),
}
function getPageHeader() {
- global $wgScript, $wgMiserMode;
+ global $wgScript;
- # Do not show useless input form if wiki is running in misermode
- if( $wgMiserMode ) {
+ # Do not show useless input form if special page is cached
+ if( $this->isCached() ) {
return '';
}
'shi',
'sr',
'tg',
+ 'uz',
'zh',
);
'tog-editsection' => 'مكن تعديل الأقسام عن طريق وصلات [عدل]',
'tog-editsectiononrightclick' => 'فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)',
'tog-showtoc' => 'اعرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
-'tog-rememberpassword' => 'تذÙ\83ر دخÙ\88Ù\84Ù\8a عÙ\84Ù\89 Ù\87ذا اÙ\84Ù\85تصÙ\81Ø (Ø¥Ù\84Ù\89 {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88اØد|Ù\8aÙ\88Ù\85Ù\8aÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85Ù\8bا|$1 Ù\8aÙ\88Ù\85}} Ù\83Øد Ø£Ù\82صÙ\89)',
+'tog-rememberpassword' => 'تذÙ\83ر دخÙ\88Ù\84Ù\8a بÙ\87ذا اÙ\84Ù\85تصÙ\81Ø (Ù\84Ù\85دة Ø£Ù\82صاÙ\87ا {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88اØد|Ù\8aÙ\88Ù\85اÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85ا|$1 Ù\8aÙ\88Ù\85}})',
'tog-watchcreations' => 'أضف الصفحات التي أنشئها والملفات التي أرفعها إلى قائمة مراقبتي.',
'tog-watchdefault' => '!!أضف الصفحات والملفات التي أعدلها إلى قائمة مراقبتي',
'tog-watchmoves' => 'أضف الصفحات والملفات التي أنقلها إلى قائمة مراقبتي',
'yourname' => 'اسم المستخدم:',
'yourpassword' => 'كلمة السر:',
'yourpasswordagain' => 'أعد كتابة كلمة السر:',
-'remembermypassword' => 'تذÙ\83ر دخÙ\88Ù\84Ù\8a عÙ\84Ù\89 Ù\87ذا اÙ\84ØاسÙ\88ب (Ø¥Ù\84Ù\89 {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88اØد|Ù\8aÙ\88Ù\85Ù\8aÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85Ù\8bا|$1 Ù\8aÙ\88Ù\85}} Ù\83Øد Ø£Ù\82صÙ\89)',
+'remembermypassword' => 'تذÙ\83ر دخÙ\88Ù\84Ù\8a بÙ\87ذا اÙ\84Ù\85تصÙ\81Ø (Ù\84Ù\85دة Ø£Ù\82صاÙ\87ا {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88اØد|Ù\8aÙ\88Ù\85اÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85ا|$1 Ù\8aÙ\88Ù\85}})',
'securelogin-stick-https' => 'ابقَ في اتصال HTTPS بعد الدخول.',
'yourdomainname' => 'نطاقك:',
'externaldberror' => 'هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
'logout' => 'اخرج',
'userlogout' => 'اخرج',
'notloggedin' => 'غير مسجل الدخول',
-'nologin' => "ألا تمتلك حسابا؟ '''$1'''.",
+'nologin' => "ليس لديك حساب؟ '''$1'''.",
'nologinlink' => 'أنشئ حسابا',
'createaccount' => 'أنشئ حسابا',
-'gotaccount' => "تمتلك حسابا بالفعل؟ '''$1'''.",
+'gotaccount' => "لديك حساب؟ '''$1'''.",
'gotaccountlink' => 'لُج',
-'userlogin-resetlink' => 'أنسيت بيانات الولوج؟',
+'userlogin-resetlink' => 'نسيت تفاصيل الدخول؟',
'createaccountmail' => 'بواسطة البريد الإلكتروني',
'createaccountreason' => 'السبب:',
'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
'filedelete-reason-otherlist' => 'Başqa səbəb',
'filedelete-reason-dropdown' => '*Əsas silmə səbəbi
** Müəllif hüququ pozuntusu
-** Dublikat fayl',
+** Dublikat fayl
+** Keyfiyyətsiz şəkil
+** İstifadəsiz fayl
+** Qeyri-ensiklopedik şəxs
+** Lisenziyasız fayl',
'filedelete-edit-reasonlist' => 'Silmə səbəblərini redaktə et',
# MIME search
'tog-hidepatrolled' => 'Скриване на патрулираните редакции от списъка с последните промени',
'tog-newpageshidepatrolled' => 'Скриване на патрулираните редакции от списъка на новите страници',
'tog-extendwatchlist' => 'Разширяване на списъка, така че да показва всички промени, не само най-скорошните',
-'tog-usenewrc' => 'Групиране по страници на последни промени и списък с наблюдение.
-Подобряване на последните промени (изисква Джаваскрипт)',
+'tog-usenewrc' => 'Групиране на последните промени и списъка за наблюдение по страници (изисква Джаваскрипт)',
'tog-numberheadings' => 'Номериране на заглавията',
'tog-showtoolbar' => 'Помощна лента за редактиране (изисква Джаваскрипт)',
'tog-editondblclick' => 'Редактиране при двойно щракване (изисква Джаваскрипт)',
'tog-showtoc' => 'Показване на съдържание (за страници с повече от три раздела)',
'tog-rememberpassword' => 'Запомяне на паролата ми в този браузър (за не повече от $1 {{PLURAL:$1|ден|дни}})',
'tog-watchcreations' => 'Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение',
-'tog-watchdefault' => 'Ð\94обавÑ\8fне на Ñ\80едакÑ\82иÑ\80аниÑ\82е оÑ\82 мен Ñ\81Ñ\82Ñ\80аниÑ\86и кÑ\8aм списъка ми за наблюдение',
+'tog-watchdefault' => 'Ð\94обавÑ\8fне на Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е, коиÑ\82о Ñ\80едакÑ\82иÑ\80ам, в списъка ми за наблюдение',
'tog-watchmoves' => 'Добавяне на преместените от мен страници към списъка ми за наблюдение',
'tog-watchdeletion' => 'Добавяне на изтритите от мен страници към списъка ми за наблюдение',
'tog-minordefault' => 'Отбелязване на всички промени като малки по подразбиране',
# Diffs
'history-title' => 'Преглед на историята на „$1“',
'difference-title' => 'Разлика между версии на „$1“',
-'difference-title-multipage' => 'Ð\9fоказване на Ñ\80азликаÑ\82а междÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е "$1" и "$2"',
+'difference-title-multipage' => 'Разлики междÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е â\80\9e$1â\80\9c и â\80\9e$2â\80\9c',
'difference-multipage' => '(Разлики между страниците)',
'lineno' => 'Ред $1:',
'compareselectedversions' => 'Сравнение на избраните версии',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|една версия|$1 версии}} на $2 бяха внесени',
# JavaScriptTest
-'javascripttest-disabled' => 'Тази функция не е достъпна в това уики.',
+'javascripttest-disabled' => 'Тази функционалност не е активирана в това уики.',
'javascripttest-pagetext-noframework' => 'Тази страница е запазена за изпълнение на Джаваскрипт тестове.',
'javascripttest-qunit-intro' => 'Вижте [$1 тестовата документация] на mediawiki.org.',
'rollback' => 'Vrátit zpět editace',
'rollback_short' => 'Vrátit zpět',
'rollbacklink' => 'vrácení zpět',
+'rollbacklinkcount' => 'vrácení $1 {{PLURAL:$1|editace|editací}} zpět',
+'rollbacklinkcount-morethan' => 'vrácení více než $1 {{PLURAL:$1|editace|editací}} zpět',
'rollbackfailed' => 'Nešlo vrátit zpět',
'cantrollback' => 'Nelze vrátit zpět poslední editaci, neboť poslední přispěvatel je jediným autorem této stránky.',
'alreadyrolled' => 'Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.
'rollback' => 'Zurücksetzen der Änderungen',
'rollback_short' => 'Zurücksetzen',
'rollbacklink' => 'Zurücksetzen',
+'rollbacklinkcount' => '{{PLURAL:$1|Eine Version|$1 Versionen}} zurücksetzen',
+'rollbacklinkcount-morethan' => 'Mehr als {{PLURAL:$1|eine Version|$1 Versionen}} zurücksetzen',
'rollbackfailed' => 'Zurücksetzen gescheitert',
'cantrollback' => 'Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.',
'alreadyrolled' => 'Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da in der Zwischenzeit ein anderer Benutzer die Seite geändert hat.
'about' => 'Heqa',
'article' => 'Wesiqe',
-'newwindow' => '(zerrey pençereyê dê newey de beno a)',
+'newwindow' => '(Teqa da newi de abêno)',
'cancel' => 'Bıterkne',
'moredotdotdot' => 'Vêşêri...',
'mypage' => 'Pela mı',
'thisisdeleted' => 'Bıvêne ya zi $1 peyser bia?',
'viewdeleted' => '$1 bıvêne?',
'restorelink' => '{{PLURAL:$1|yew vurnayışo esterıte|$1 vurnayışê esterıtey}}',
-'feedlinks' => 'Cı resne:',
+'feedlinks' => 'Warikerdış:',
'feed-invalid' => 'Qeydey cıresnayışê beğşi nêvêreno.',
'feed-unavailable' => 'Cıresnayışê şebekey çıniyê',
'site-rss-feed' => '$1 Cıresnayışê RSSi',
'subject' => 'Mewzu/serrêze:',
'minoredit' => 'Vurnayışo qıckeko',
'watchthis' => 'Ena pele seyr ke',
-'savearticle' => 'Ena pele qeyd ke',
+'savearticle' => 'Peler qeyd ke',
'preview' => 'Verqayt',
-'showpreview' => 'Verqayti bımocne',
+'showpreview' => 'Verqayti bıvin',
'showlivepreview' => 'Verqayto cıwın',
-'showdiff' => 'Vurnayışan bımocne',
+'showdiff' => 'Vurnayışa bıvin',
'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.
'rollback' => 'vurnayişan tepiya bıger',
'rollback_short' => 'Peyser bia',
'rollbacklink' => 'peyser bia',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti',
+'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot',
'rollbackfailed' => 'Peyserardış nêbi',
'cantrollback' => 'karbero peyin têna paşt dayo, no semedi ra vuriyayiş tepiya nêgeriyeni.',
'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra pelê ıney[[:$1]] de vurnayiş biyo u no vurnayiş tepiya nêgeriyeno;
'rollback' => 'Wobźěłanja slědk wześ',
'rollback_short' => 'anulěrowaś',
'rollbacklink' => 'anulěrowaś',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|změnu|změnje|změny|změnow}} slědk wześ',
+'rollbacklinkcount-morethan' => 'wěcej ako $1 {{PLURAL:$1|změnu|změnje|změny|změnow}} slědk wześ',
'rollbackfailed' => 'Slědkwześe njejo se raźiło.',
'cantrollback' => 'Njejo móžno změnu slědk wześ, slědny pśinosowaŕ jo jadnučki awtor boka.',
'alreadyrolled' => 'Njejo móžno slědnu změnu w nastawku [[:$1]] wót [[User:$2|$2]] ([[User talk:$2|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) slědk wześ; drugi wužywaŕ jo mjaztym bok změnił abo južo slědk stajił .
'remembermypassword' => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
'securelogin-stick-https' => 'Stay connected to HTTPS after login',
'yourdomainname' => 'Your domain:',
+'password-change-forbidden' => 'You cannot change passwords on this wiki.',
'externaldberror' => 'There was either an authentication database error or you are not allowed to update your external account.',
'login' => 'Log in',
'nav-login-createaccount' => 'Log in / create account',
'rollback' => 'Roll back edits',
'rollback_short' => 'Rollback',
'rollbacklink' => 'rollback',
+'rollbacklinkcount' => 'rollback $1 {{PLURAL:$1|edit|edits}}',
+'rollbacklinkcount-morethan' => 'rollback more than $1 {{PLURAL:$1|edit|edits}}',
'rollbackfailed' => 'Rollback failed',
'cantrollback' => 'Cannot revert edit;
last contributor is only author of this page.',
Since you do not have the hideuser right, you cannot see or edit the user's block.",
'ipbblocked' => 'You cannot block or unblock other users, because you are yourself blocked',
'ipbnounblockself' => 'You are not allowed to unblock yourself',
+'ipb-default-expiry' => '', # empty so the default is unchanged from previous versions of MediaWiki
# Developer tools
'lockdb' => 'Lock database',
'tog-editsectiononrightclick' => 'Habilitar la edición de secciones presionando el botón de la derecha 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' => 'Vigilar las páginas que yo cree',
-'tog-watchdefault' => 'Vigilar las páginas que yo modifique',
-'tog-watchmoves' => 'Vigilar las páginas que renombre',
-'tog-watchdeletion' => 'Vigilar las páginas que borre',
+'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-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-nocache' => 'Desactivar la caché de páginas del navegador',
'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando se modifique una página o un archivo de mi lista de seguimiento',
'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando se modifique mi página de discusión',
-'tog-enotifminoredits' => 'Notificarme también los cambios menores de páginas',
+'tog-enotifminoredits' => 'Notificarme también por correo electrónico los cambios menores de las páginas y archivos',
'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:',
'right-writeapi' => 'Hacer uso del API para escribir',
'right-delete' => 'Borrar páginas',
'right-bigdelete' => 'Borrar páginas con historiales grandes',
+'right-deletelogentry' => 'Borrar y recuperar entradas de registro específicas',
'right-deleterevision' => 'Borrar y restaurar revisiones específicas de páginas',
'right-deletedhistory' => 'Ver el historial de páginas borradas, sin el texto asociado',
'right-deletedtext' => 'Ver texto borrado y cambios entre revisiones borradas',
'lockmanager-fail-releaselock' => 'No se pudo liberar el bloqueo de "$1".',
'lockmanager-fail-db-bucket' => 'No se pudo contactar con las suficientes bases de datos del conjunto $1.',
'lockmanager-fail-db-release' => 'No se pudieron liberar los bloqueos registrados en la base de datos $1.',
+'lockmanager-fail-svr-acquire' => 'No se pudieron obtener bloqueos en el servidor $1.',
'lockmanager-fail-svr-release' => 'No se pudieron liberar los bloqueos registrados en el servidor $1.',
# ZipDirectoryReader
'rollback' => 'Revertir ediciones',
'rollback_short' => 'Revertir',
'rollbacklink' => 'revertir',
+'rollbacklinkcount' => 'revertir $1 {{PLURAL:$1|edición|ediciones}}',
+'rollbacklinkcount-morethan' => 'revertir más de $1 {{PLURAL:$1|edición|ediciones}}',
'rollbackfailed' => 'No se pudo revertir',
'cantrollback' => 'No se puede revertir la edición;
el último colaborador es el único autor de esta página.',
'duration-centuries' => '$1 {{PLURAL:$1|siglo|siglos}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
-# Unknown messages
-'lockmanager-fail-svr-acquire' => 'No se pudieron obtener bloqueos en el servidor $1.',
);
'rollback' => 'Tühista muudatused',
'rollback_short' => 'Tühista',
'rollbacklink' => 'tühista',
+'rollbacklinkcount' => 'tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}',
+'rollbacklinkcount-morethan' => 'tühista üle {{PLURAL:$1|ühe muudatuse|10 muudatuse}}',
'rollbackfailed' => 'Muudatuste tühistamine ebaõnnestus',
'cantrollback' => 'Ei saa muudatusi eemaldada, sest viimane kaastööline on artikli ainus autor.',
'alreadyrolled' => 'Muudatust, mille tegi lehele [[:$1]] kasutaja [[User:$2|$2]] ([[User talk:$2|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), ei saa tühistada, sest keegi teine on seda lehte vahepeal muutnud.
'pagecategories' => '{{PLURAL:$1|Luokka|Luokat}}',
'category_header' => "Luokan ''$1'' sisältämät sivut",
'subcategories' => 'Alaluokat',
-'category-media-header' => 'Luokan ”$1” sisältämät tiedostot',
+'category-media-header' => 'Tiedostot, jotka ovat luokassa $1',
'category-empty' => "''Tässä luokassa ei ole sivuja eikä tiedostoja.''",
'hidden-categories' => '{{PLURAL:$1|Piilotettu luokka|Piilotetut luokat}}',
'hidden-category-category' => 'Piilotetut luokat',
'tog-watchmoves' => 'Apondre les pâges et los fichiérs que renomo a ma lista de survelyence',
'tog-watchdeletion' => 'Apondre les pâges et los fichiérs que suprimo a ma lista de survelyence',
'tog-minordefault' => 'Marcar per dèfôt tôs los changements coment petiôts',
-'tog-previewontop' => 'Fâre vêre la prèvisualisacion en-dessus de la zona de changement',
+'tog-previewontop' => 'Fâre vêre la prèvisualisacion d’amont la zona de changement',
'tog-previewonfirst' => 'Fâre vêre la prèvisualisacion pendent lo premiér changement',
'tog-nocache' => 'Dèsactivar lo cacho de les pâges per lo navigator',
'tog-enotifwatchlistpages' => 'Mè mandar un mèssâjo quand na pâge ou ben un fichiér de ma lista de survelyence est changiê(ye)',
'aboutsite' => 'A propôs de {{SITENAME}}',
'aboutpage' => 'Project:A propôs',
'copyright' => 'Lo contegnu est disponiblo desot licence $1.',
-'copyrightpage' => '{{ns:project}}:Drêts a ôtor',
+'copyrightpage' => '{{ns:project}}:Drêts d’ôtor',
'currentevents' => 'Novèles',
'currentevents-url' => 'Project:Novèles',
'disclaimers' => 'Avèrtissements',
'badaccess' => 'Fôta de pèrmission',
'badaccess-group0' => 'Vos avéd pas los drêts sufisents por rèalisar l’accion demandâye.',
-'badaccess-groups' => 'L’accion que vos tâchiéd de rèalisar est accèssibla ren qu’ux utilisators a {{PLURAL:$2|la tropa|les tropes}} : $1.',
+'badaccess-groups' => 'L’accion que vos tâchiéd de rèalisar est accèssibla ren qu’ux utilisators de {{PLURAL:$2|la tropa|les tropes}} : $1.',
'versionrequired' => 'Vèrsion $1 de MediaWiki nècèssèra',
'versionrequiredtext' => 'La vèrsion $1 de MediaWiki est nècèssèra por empleyér ceta pâge.
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Pâge',
'nstab-user' => 'Pâge utilisator',
-'nstab-media' => 'Pâge de mèdia',
+'nstab-media' => 'Fichiér mèdia',
'nstab-special' => 'Pâge spèciâla',
'nstab-project' => 'Pâge du projèt',
'nstab-image' => 'Fichiér',
La bâsa de donâs at retornâ la fôta « $3 : $4 ».',
'laggedslavemode' => "'''Atencion :''' cela pâge pôt pas contegnir tôs los dèrriérs changements fêts.",
'readonly' => 'Bâsa de donâs vèrrolyêye',
-'enterlockreason' => 'Balyéd la rêson du vèrroly et pués un’èstimacion de la sina durâ',
+'enterlockreason' => 'Balyéd la rêson du vèrroly et pués n’èstimacion de la sina durâ',
'readonlytext' => 'Ora, la bâsa de donâs est vèrrolyêye por les entrâs novèles et los ôtros changements, probâblament por pèrmetre la sina mantegnence, dês cen tot tornerat en ôrdre.
L’administrator que l’at vèrrolyê at balyê cet’èxplicacion : $1',
'fileexistserror' => 'Empossiblo d’ècrire lo fichiér « $1 » : lo fichiér ègziste.',
'unexpected' => 'Valor emprèvua : « $1 » = « $2 ».',
'formerror' => 'Fôta : empossiblo de sometre lo formulèro.',
-'badarticleerror' => 'Cela accion pôt pas étre fêta sur ceta pâge.',
+'badarticleerror' => 'Cel’accion pôt pas étre fêta sur ceta pâge.',
'cannotdelete' => 'Empossiblo de suprimar la pâge ou ben lo fichiér « $1 ».
Pôt-étre la suprèssion est ja étâye fêta per quârqu’un d’ôtro.',
'cannotdelete-title' => 'Empossiblo de suprimar la pâge « $1 »',
'viewsource' => 'Vêre lo tèxto sôrsa',
'viewsource-title' => 'Vêre lo tèxto sôrsa de $1',
'actionthrottled' => 'Accion limitâye',
-'actionthrottledtext' => 'Por combatre lo spame, la frèquence d’ègzécucion de cela accion est limitâ dens un moment prod côrt, et vos éd dèpassâ ceta limita.
-Volyéd tornar èprovar dens doux-três menutes.',
-'protectedpagetext' => 'Ceta pâge at étâ protègiê por empachiér son changement.',
-'viewsourcetext' => 'Vos pouede vêre et copiyér lo tèxto sôrsa de la pâge :',
-'viewyourtext' => "Vos pouede vêre et copiyér lo contegnu de '''voutros changements''' a ceta pâge :",
-'protectedinterface' => 'Ceta pâge fât de tèxto d’entèrface por la programeria et est protègiê por èvitar los abus.',
+'actionthrottledtext' => 'Por combatre lo spame, l’usâjo de cel’accion est limitâ a doux-três côps dens un moment prod côrt. S’acomplét que vos éd dèpassâ ceta limita.
+Volyéd tornar èprovar dens un tôrn.',
+'protectedpagetext' => 'Ceta pâge est étâye protègiêye por empachiér son changement.',
+'viewsourcetext' => 'Vos pouede vêre et pués copiyér lo tèxto sôrsa de ceta pâge :',
+'viewyourtext' => "Vos pouede vêre et pués copiyér lo tèxto sôrsa de '''voutros changements''' a ceta pâge :",
+'protectedinterface' => 'Ceta pâge balye de tèxto d’entèrface por la programeria et est protègiêye por èvitar los abus.',
'editinginterface' => "'''Atencion :''' vos éte aprés changiér una pâge utilisâ por fâre lo tèxto d’entèrface por la programeria.
Los changements sè cognetront, d’aprés lo contèxto, sur totes ou ben quârques pâges visibles per los ôtros usanciérs.
Por les traduccions, nos vos envitens a utilisar lo seto [//translatewiki.net/wiki/Main_Page?setlang=frp translatewiki.net], lo projèt de localisacion de MediaWiki.",
'rollback' => 'Reverter as edicións',
'rollback_short' => 'Reverter',
'rollbacklink' => 'reverter',
+'rollbacklinkcount' => 'reverter $1 {{PLURAL:$1|edición|edicións}}',
+'rollbacklinkcount-morethan' => 'reverter máis de $1 {{PLURAL:$1|edición|edicións}}',
'rollbackfailed' => 'Houbo un fallo ao reverter as edicións',
'cantrollback' => 'Non se pode desfacer a edición; o último colaborador é o único autor desta páxina.',
'alreadyrolled' => 'Non se pode desfacer a edición en "[[:$1]]" feita por [[User:$2|$2]] ([[User talk:$2|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); alguén máis editou ou desfixo os cambios desta páxina.
'rollback' => 'שחזור עריכות',
'rollback_short' => 'שחזור',
'rollbacklink' => 'שחזור',
+'rollbacklinkcount' => 'שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}',
+'rollbacklinkcount-morethan' => 'שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}',
'rollbackfailed' => 'השחזור נכשל',
'cantrollback' => 'לא ניתן לשחזר את העריכה;
התורם האחרון הוא היחיד שכתב בדף זה.',
* @author Kguirnela
* @author Oxyzen
* @author Tagimata
+ * @author Taylortheturtle
*/
$messages = array(
'tooltip-rollback' => '"Panumbalik" ginabalik ang (mga) na-islan sa sini nga pahina sa pinaka ulihi nga kontributor sa isa lang ka klik',
'tooltip-undo' => '"Indi pag-obrahon" ginabalik ang gin-islan kag gabukas sa isaln form sa may prebyu mode.
Gapasugot sa pagdugang sang rason sa kabilugan.',
+'tooltip-summary' => 'Maghatag sing diutay nga eksplikasyon',
# Browsing diffs
'previousdiff' => '← Mas daan nga na-islan',
'rollback' => 'Změny cofnyć',
'rollback_short' => 'Cofnyć',
'rollbacklink' => 'Cofnyć',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć',
+'rollbacklinkcount-morethan' => 'přez $1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć',
'rollbackfailed' => 'Cofnjenje njeporadźiło',
'cantrollback' => 'Njemóžno změnu cofnyć; strona nima druhich awtorow.',
'alreadyrolled' => 'Njemóžno poslednu změnu [[:$1]] přez wužiwarja [[User:$2|$2]] ([[User talk:$2|Diskusija]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) cofnyć; něchtó druhi je stronu wobdźěłał abo změnu hižo cofnył.
'right-writeapi' => 'Uso del API pro modificar le wiki',
'right-delete' => 'Deler paginas',
'right-bigdelete' => 'Deler paginas con historias longe',
+'right-deletelogentry' => 'Deler e restaurar specific entratas del registro',
'right-deleterevision' => 'Deler e restaurar versiones specific de paginas',
'right-deletedhistory' => 'Vider entratas de historia delite, sin lor texto associate',
'right-deletedtext' => 'Vider texto delite e differentias inter versiones delite',
'lockmanager-fail-releaselock' => 'Non poteva liberar le file de serratura pro "$1".',
'lockmanager-fail-db-bucket' => 'Non poteva contactar sufficiente bases de datos de serratura in situla $1.',
'lockmanager-fail-db-release' => 'Non poteva liberar le serraturas sur le base de datos $1.',
+'lockmanager-fail-svr-acquire' => 'Non poteva acquirer le serraturas sur le servitor $1.',
'lockmanager-fail-svr-release' => 'Non poteva liberar le serraturas sur le servitor $1.',
# ZipDirectoryReader
'rollback' => 'Revocar modificationes',
'rollback_short' => 'Revocar',
'rollbacklink' => 'revocar',
+'rollbacklinkcount' => 'revocar $1 {{PLURAL:$1|modification|modificationes}}',
+'rollbacklinkcount-morethan' => 'revocar plus de $1 {{PLURAL:$1|modification|modificationes}}',
'rollbackfailed' => 'Revocation fallite',
'cantrollback' => 'Impossibile revocar le modification;
le ultime contributor es le sol autor de iste pagina.',
'duration-centuries' => '$1 {{PLURAL:$1|seculo|seculos}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennio|millennios}}',
-# Unknown messages
-'lockmanager-fail-svr-acquire' => 'Non poteva acquirer le serraturas sur le servitor $1.',
);
'tog-editsectiononrightclick' => 'Virkja hlutabreytingu með því að hægrismella á hlutafyrirsagnir (JavaScript)',
'tog-showtoc' => 'Sýna efnisyfirlit (fyrir síður með meira en 3 fyrirsagnir)',
'tog-rememberpassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
-'tog-watchcreations' => 'Bæta síðum sem ég bý til á vaktlistann minn',
-'tog-watchdefault' => 'Bæta síðum sem ég breyti á vaktlistann minn',
-'tog-watchmoves' => 'Bæta síðum sem ég færi á vaktlistann minn',
-'tog-watchdeletion' => 'Bæta síðum sem ég eyði á vaktlistann minn',
+'tog-watchcreations' => 'Bæta síðum sem ég bý til og skrám sem ég hleð inn á vaktlistann minn',
+'tog-watchdefault' => 'Bæta síðum og skrám sem ég breyti á vaktlistann minn',
+'tog-watchmoves' => 'Bæta síðum og skrám sem ég færi á vaktlistann minn',
+'tog-watchdeletion' => 'Bæta síðum og skrám sem ég eyði á vaktlistann minn',
'tog-minordefault' => 'Merkja allar breytingar sem minniháttar sjálfgefið',
'tog-previewontop' => 'Sýna forskoðun á undan breytingarkassanum',
'tog-previewonfirst' => 'Sýna forskoðun með fyrstu breytingu',
'tog-nocache' => 'Slökkva á flýtiminni vafrans',
-'tog-enotifwatchlistpages' => 'Senda mér tölvupóst þegar síðu á vaktlistanum mínu er breytt',
+'tog-enotifwatchlistpages' => 'Senda mér tölvupóst þegar síðu eða skrá á vaktlistanum mínu er breytt',
'tog-enotifusertalkpages' => 'Senda mér tölvupóst þegar notandaspjallinu mínu er breytt',
'tog-enotifminoredits' => 'Senda mér einnig tölvupóst vegna minniháttar breytinga á síðum',
'tog-enotifrevealaddr' => 'Gefa upp netfang mitt í tilkynningarpóstum',
'filereadonlyerror' => 'Ekki var hægt að breyta skránni "$1" því skráin í skráarsafninu "$2" er engöngu hægt að lesa.
Möppudýrið sem læsti skránni gaf þessa ástæðu: "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Ógildur titill í nafnrými "$2" og með textann "$3"',
+'invalidtitle-unknownnamespace' => 'Ógildur titill með óþekkt nafnrými númer $1 og texta "$2"',
+'exception-nologin' => 'Óinnskráð(ur)',
+'exception-nologin-text' => 'Þessi síða eða aðgerð krefst þess að þú sért skráður inn á þessum wiki.',
# Virus scanner
'virus-badscanner' => "Slæm stilling: óþekktur veiruskannari: ''$1''",
'edit-no-change' => 'Breyting þín var hunsuð, því engin breyting var á textanum.',
'edit-already-exists' => 'Gat ekki skapað nýja síðu.
Hún er nú þegar til.',
+'defaultmessagetext' => 'Sjálfgefinn skilaboða texti',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Viðvörun:''' Þessi síða inniheldur of mörg vinnslufrek aðgerðar þáttunar köll.
'prefs-beta' => 'Stillingar á prufustigi',
'prefs-datetime' => 'Tímasnið og tímabelti',
'prefs-labs' => 'Stillingar á tilraunastigi',
+'prefs-user-pages' => 'Notendasíður',
'prefs-personal' => 'Notandaupplýsingar',
'prefs-rc' => 'Nýlegar breytingar',
'prefs-watchlist' => 'Vaktlistinn',
'right-writeapi' => 'Nota API skrifun',
'right-delete' => 'Eyða síðum',
'right-bigdelete' => 'Eyða síðum með stórum breytingaskrám',
+'right-deletelogentry' => 'Eyða og endurvekja sérstakar aðgerða færslur',
'right-deleterevision' => 'Eyða og endurvekja sérstaka breytignar á síðum',
'right-deletedhistory' => 'Skoða eyddar færslur úr breytingarskrá, án efnis þeirra',
'right-deletedtext' => 'Sjá eyddan texta og breytingar á milli eyddra útgáfna',
'backend-fail-writetemp' => 'Gat ekki skrifað í tímabundna skrá.',
'backend-fail-closetemp' => 'Mistókst að loka tímabundinni skrá.',
'backend-fail-read' => 'Mistókst að lesa skrá $1.',
-'backend-fail-create' => 'Mistókst að búa til skrá $1.',
-'backend-fail-maxsize' => 'Mistókst að búa til skránna $1 því hún er stærri en {{PLURAL:$2|eitt bæti|$2 bæti}}.',
+'backend-fail-create' => 'Mistókst að skrifa skrá $1.',
+'backend-fail-maxsize' => 'Mistókst að skrifa skránna $1 því hún er stærri en {{PLURAL:$2|eitt bæti|$2 bæti}}.',
'backend-fail-readonly' => 'Gagnabankann "$1" er engöngu hægt að lesa í augnablikinu. Ástæðan sem var gefin er: "\'\'$2\'\'"',
'backend-fail-connect' => 'Mistókst að tengjast gagnabankanum "$1".',
'backend-fail-internal' => 'Óþekkt villa átti sér stað í gagnabankanum "$1".',
Þú getur takmarkað listann með því að velja tegund aðgerðaskráar, notandanafn, eða síðu.',
'logempty' => 'Engin slík aðgerð fannst.',
'log-title-wildcard' => 'Leita að titlum sem byrja á þessum texta',
+'showhideselectedlogentries' => 'Sýna/fela valdar aðgerða færslur',
# Special:AllPages
'allpages' => 'Allar síður',
'allpages-bad-ns' => '{{SITENAME}} hefur ekki nafnrými „$1“.',
'allpages-hide-redirects' => 'Fela tilvísanir',
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Þú ert að skoða útgáfu síðunnar úr skyndiminni, sem getur verið allt að $1 gömul.',
+'cachedspecial-refresh-now' => 'Skoða síðustu',
+
# Special:Categories
'categories' => 'Flokkar',
'categoriespagetext' => 'Eftirfarandi {{PLURAL:$1|flokkur inniheldur|flokkar innihalda}} síður eða skrár.
Sjá einnig [[Special:WantedCategories|eftirsótta flokka]].',
'categoriesfrom' => 'Sýna flokka frá:',
'special-categories-sort-count' => 'raða eftir fjölda',
-'special-categories-sort-abc' => 'raða eftir stafrófinu',
+'special-categories-sort-abc' => 'raða í stafrófsröð',
# Special:DeletedContributions
'deletedcontributions' => 'Eyddar breytingar notanda',
'rollback' => 'Taka aftur breytingar',
'rollback_short' => 'Taka aftur',
'rollbacklink' => 'taka aftur',
+'rollbacklinkcount' => 'taka aftur $1 {{PLURAL:$1|breytingu|breytingar}}',
+'rollbacklinkcount-morethan' => 'taka aftur fleiri en $1 {{PLURAL:$1|breytingu|breytingar}}',
'rollbackfailed' => 'Mistókst að taka aftur',
'cantrollback' => 'Ekki hægt að taka aftur breytingu, síðasti höfundur er eini höfundur þessarar síðu.',
'alreadyrolled' => 'Ekki var hægt að taka síðustu breytingu [[:$1]] eftir [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) til baka;
** Breytingarstríð
** Síða með margar heimsóknir',
'protect-edit-reasonlist' => 'Breyta verndarástæðum',
-'protect-expiry-options' => '1 tím:1 hour,1 dag:1 day,1 viku:1 week,2 vikur:2 weeks,1 mánuð:1 month,3 mánuði:3 months,6 mánuði:6 months,1 ár:1 year,aldrei:infinite',
+'protect-expiry-options' => '1 tími:1 hour,1 dag:1 day,1 viku:1 week,2 vikur:2 weeks,1 mánuð:1 month,3 mánuði:3 months,6 mánuði:6 months,1 ár:1 year,aldrei:infinite',
'restriction-type' => 'Réttindi:',
'restriction-level' => 'Takmarkaði við:',
'minimum-size' => 'Lágmarksstærð',
'badipaddress' => 'Ógilt vistfang',
'blockipsuccesssub' => 'Bann tókst',
'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] hefur verið bannaður/bönnuð.<br />
-Sjá [[Special:BlockList|bannaðar notendur og vistföng]] fyrir yfirlit yfir núverandi bönn.',
+Sjá [[Special:BlockList|bannaðir notendur og vistföng]] fyrir yfirlit yfir núverandi bönn.',
'ipb-blockingself' => 'Þú ert í þann mund að banna sjálfan þig! Ertu viss um að þú viljir gera það?',
'ipb-confirmhideuser' => 'Þú ert í þann mund að banna notenda sem er falinn. Notendanafn hans mun ekki birtast í listum og aðgerðarskrám. Ertu viss um að þú viljir gera það?',
'ipb-edit-dropdown' => 'Breyta ástæðu fyrir banni',
# Namespace 8 related
'allmessages' => 'Meldingar',
'allmessagesname' => 'Titill',
-'allmessagesdefault' => 'Sjálfgefinn texti',
+'allmessagesdefault' => 'Sjálfgefinn skilaboða texti',
'allmessagescurrent' => 'Núverandi texti',
'allmessagestext' => 'Þetta er listi yfir kerfismeldingar í Melding-nafnrýminu.
Gjörðu svo vel og heimsæktu [//www.mediawiki.org/wiki/Localisation MediaWiki-staðfæringuna] og [//translatewiki.net translatewiki.net] ef þú vilt taka þátt í almennri MediaWiki-staðfæringu.',
'import-invalid-interwiki' => 'Get ekki flutt inn frá þessum wiki.',
'import-error-edit' => 'Síðan "$1" var ekki flutt inn því þú hefur ekki réttindi til að breyta henni.',
'import-error-create' => 'Síðan "$1" var ekki flutt inn því þú hefur ekki réttindi til að stofna hana.',
+'import-error-interwiki' => 'Síðan "$1" var ekki flutt inn því nafn hennar er frátekið fyrir ytri tengla (tungumálatengla).',
+'import-error-special' => 'Síðan "$1" var ekki flutt inn því hún tilheyrir ákveðnu nafnrými sem leyfir ekki síður.',
+'import-error-invalid' => 'Síðan "$1" var ekki flutt inn því nafn hennar er ógilt.',
# Import log
'importlogpage' => 'Innflutningsskrá',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|breyting|breytingar}} frá $2',
# JavaScriptTest
+'javascripttest' => 'JavaScript prófun',
+'javascripttest-disabled' => 'Þessi möguleiki hefur ekki verið virkjaður á þessum wiki.',
'javascripttest-pagetext-skins' => 'Veldu þema sem á að keyra prófanirnar á:',
# Tooltip help for the actions
'api-error-duplicate-archive-popup-title' => 'Eins {{PLURAL:$1|skrá|skrár}} sem {{PLURAL:$1|hefur|hafa}} þegar verið eytt.',
'api-error-duplicate-popup-title' => '{{PLURAL:$1|Afrituð skrá|Afritaðar skrár}}',
'api-error-empty-file' => 'Skráin sem þú valdir er tóm.',
+'api-error-emptypage' => 'Stofnun nýrra, tómra síðna er óheimil.',
'api-error-fetchfileerror' => 'Innri villa: Mistókst að sækja skránna.',
+'api-error-fileexists-forbidden' => 'Skrá með nafninu "$1" er þegar til og ekki er hægt að yfirskrifa hana.',
'api-error-file-too-large' => 'Skráin sem þú valdir er of stór.',
'api-error-filename-tooshort' => 'Skráarnafnið er of stutt',
'api-error-filetype-banned' => 'Þessi gerð skráar er bönnuð.',
'api-error-unknown-code' => 'Óþekkt villa: "$1"',
'api-error-unknown-error' => 'Innri villa: Eitthvað fór úrskeiðis þegar að skráinni þinni var hlaðið inn.',
'api-error-unknown-warning' => 'Óþekkt viðvörun: $1',
+'api-error-unknownerror' => 'Óþekkt villa: "$1".',
'api-error-uploaddisabled' => 'Ekki er leyft að hlaða inn á þessum wiki.',
'api-error-verification-error' => 'Þessi skrá gæti verið skemmd, eða með vitlausa skráarendingu.',
'duration-years' => '$1 {{PLURAL:$1|ár|ár}}',
'duration-decades' => '$1 {{PLURAL:$1|áratugur|áratugir}}',
'duration-centuries' => '$1 {{PLURAL:$1|öld|aldir}}',
+'duration-millennia' => '$1 {{PLURAL:$1|árþúsund}}',
);
'rollback' => 'Annulla le modifiche',
'rollback_short' => 'Rollback',
'rollbacklink' => 'rollback',
+'rollbacklinkcount' => 'rollback di {{PLURAL:$1|una modifica|$1 modifiche}}',
+'rollbacklinkcount-morethan' => 'rollback di più di {{PLURAL:$1|una modifica|$1 modifiche}}',
'rollbackfailed' => 'Rollback fallito',
'cantrollback' => "Impossibile annullare le modifiche; l'utente che le ha effettuate è l'unico ad aver contribuito alla pagina.",
'alreadyrolled' => 'Non è possibile annullare le modifiche apportate alla pagina [[:$1]] da parte di [[User:$2|$2]] ([[User talk:$2|discussione]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); un altro utente ha già modificato la pagina oppure ha effettuato il rollback.
* @ingroup Language
* @file
*
+ * @author 2nd-player
* @author Akaniji
* @author Alexsh
* @author Ant176
'filereadonlyerror' => 'ファイルリポジトリ「$2」が読み取り専用の状態にあるため、ファイル「$1」を変更できません。
読み取り専用に設定した管理者からの説明:「$3」',
+'exception-nologin' => 'ログインしていません',
# Virus scanner
'virus-badscanner' => "環境設定が不適合です:不明なウイルス検知ソフトウェア:''$1''",
'right-writeapi' => 'API-ს გამოყენება ჩაწერისთვის',
'right-delete' => 'გვერდების წაშლა',
'right-bigdelete' => 'გრძელი ისტორიის გვერდების წაშლა',
+'right-deletelogentry' => 'ჟურნალის კონკრეტული ჩანაწერების წაშლა და აღდგენა',
'right-deleterevision' => 'გვერდის კონკრეტული ვერსიების წაშლა და აღდგენა',
'right-deletedhistory' => 'წაშლილი გვერდების ხილავა წაშლილ ტექსთან ურთიერთობის გარეშე',
'right-deletedtext' => 'წაშლილი ტექსტის და განსხვავებების ხილვა.',
'rollback' => 'რცვლილებების გაუქმება',
'rollback_short' => 'სწრაფი გაუქმება',
'rollbacklink' => 'სწრაფი გაუქმება',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|ცვლილების|ცვლილების}} დაბრუნება',
+'rollbacklinkcount-morethan' => '$1-ზე მეტი {{PLURAL:$1|ცვლილების|ცვლილების}} დაბრუნება',
'rollbackfailed' => 'შეცდომა გაუქმებისას',
'cantrollback' => 'შეუძლებელია უწინდელი რედაქციის აღდგენა; ის, ვინც უკანასკნელი ცვლილებები შეიტანა, ამ სტატიის ერთადერთი ავტორია.',
'alreadyrolled' => 'შეუძლებელია ბოლო ცვლილების გაუქმება [[:$1]], გაკეებული [[User:$2|$2]] ([[User talk:$2|განხილვა]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
'prefs-files' => '파일',
'prefs-custom-css' => '사용자 CSS',
'prefs-custom-js' => '사용자 자바스크립트',
-'prefs-common-css-js' => '모든 스킨에 적용되는 공통 CSS/자바스크립트:',
+'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/JavaScript:',
'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 되돌릴 수 있습니다.
복구할 수 없습니다.',
'prefs-emailconfirm-label' => '이메일 인증:',
'linksearch' => '외부 링크 찾기',
'linksearch-pat' => '검색 패턴:',
'linksearch-ns' => '이름공간:',
-'linksearch-ok' => '검색',
+'linksearch-ok' => '찾기',
'linksearch-text' => '"*.wikipedia.org"와 같이 와일드카드를 사용할 수 있습니다.
적어도 "*.org"와 같이 최상위 도메인을 입력해야 합니다.<br />
지원하는 프로토콜 목록: <tt>$1</tt> (검색할 때 이것을 추가하지 마세요)',
'rollback' => '편집 되돌리기',
'rollback_short' => '되돌리기',
'rollbacklink' => '되돌리기',
+'rollbacklinkcount' => '되돌리기 편집 $1회',
+'rollbacklinkcount-morethan' => '되돌리기 편집 $1회 이상',
'rollbackfailed' => '되돌리기 실패',
'cantrollback' => '편집을 되돌릴 수 없습니다.
문서를 편집한 사용자가 한명뿐입니다.',
'undeletedfiles' => '파일 $1개를 복구했습니다',
'cannotundelete' => '복구에 실패했습니다.
다른 사용자가 이미 복구했을 수도 있습니다.',
-'undeletedpage' => "'''$1 문서ê°\80 복구ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.'''
+'undeletedpage' => "'''$1 문서를 복구í\96\88ì\8aµë\8b\88ë\8b¤.'''
[[Special:Log/delete|삭제 기록]]에서 최근의 삭제와 복구 기록을 볼 수 있습니다.",
'undelete-header' => '최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.',
'userpage-userdoesnotexist' => 'Usor "<nowiki>$1</nowiki>" non est. Visne re vera hanc paginam creare vel recensere?',
'updated' => '(Novata)',
'note' => "'''Nota:'''",
-'previewnote' => "'''Memento hanc paginam solum praevisum esse, neque iam servatam!'''",
+'previewnote' => "'''Memento hanc paginam solum praevisam esse, neque iam servatam!'''",
'editing' => 'Recensio paginae "$1"',
'creating' => 'Creans $1',
'editingsection' => 'Recensens $1 (partem)',
'compareselectedversions' => 'Conferre emendationes selectas',
'showhideselectedversions' => 'Monstrare/celare emendationes selectas',
'editundo' => 'abrogare',
+'diff-multi' => '(Inter has {{PLURAL:$1|una emendatio|$1 emendationes}} ab {{PLURAL:$2|uno usore|$2 usoribus}} {{PLURAL:$1|facta|factae}} non {{PLURAL:$1|videtur|videntur}})',
# Search results
'searchresults' => 'Eventum investigationis',
'upload-unknown-size' => 'Magnitudo ignota',
'license' => 'Typus permissionis:',
-'license-header' => 'Typus permissionis:',
+'license-header' => 'Potestas usoris',
'nolicense' => 'Nulla selecta',
'license-nopreview' => '(Praevisum monstrari non potest)',
'missingarticle-rev' => '(nº. de revisión: $1)',
'missingarticle-diff' => '(Dif.: $1, $2)',
'filecopyerror' => 'No se pudo copiar el arxiv "$1" a "$2".',
+'badtitle' => 'Titolo malo',
'badtitletext' => 'El título de la hoja demandada está vazío, no es valible, o es un link interlingua o interwiki incorrecto.
Puede ser que contiene uno o más caracteres que no se pueden usar en los títulos.',
'viewsource' => 'Ver su manadero',
# Login and logout pages
'yourname' => 'Su nombre de usuario',
'yourpassword' => 'Parola',
+'yourpasswordagain' => 'Entra de muevo la parola',
'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
'login' => 'Entrar',
'nav-login-createaccount' => 'Entrar / Crîar un cuento',
+'loginprompt' => 'Kale tener "cookies" aktivadas enel navegador para enrejistrarse en {{SITENAME}}',
'userlogin' => 'Entrar / Registrarse',
'logout' => 'Salir',
'userlogout' => 'Salir',
'createaccount' => 'Crea un nuevo cuento',
'gotaccount' => "¿Ya tienes un cuento? '''$1'''.",
'gotaccountlink' => 'Entrar',
+'userlogin-resetlink' => 'Olvidates tus detalyos de akseso?',
'createaccountmail' => 'por una letra electrónica',
'userexists' => 'El nombre que entrates ya se usa.
Si puede ser, escoge un otro nombre.',
o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rejistros relasyonados]</span>.',
'userpage-userdoesnotexist-view' => 'El cuento del usador $1 no está enrejistrado.',
'note' => "'''Nota:'''",
-'previewnote' => "'¡Acórdate que esto es sólo una previsualización y daínda no se registró!'''",
+'previewnote' => "¡Akórdate ke esto es sólo una previsualizasion i aínda no se enrejistró!'''
+Los tus trokamientos no se tienen guadrados!",
'editing' => 'Trocando $1',
'editingsection' => 'Trocando $1 (sección)',
'editingcomment' => 'Trocando $1 (kapítůlo)',
'hiddencategories' => 'Esta hoja es un miembro de {{PLURAL:$1|1 kateggoría escondida|$1 kateggorías escondidas}}:',
'nocreate-loggedin' => 'No tienes el permisso de creas hojas nuevas.',
'permissionserrorstext-withaction' => 'No tienes el permiso para $2, por las {{PLURAL:$1|razón|razones}} venideras:',
+'moveddeleted-notice' => "Esta ója fue efassada.
+El ''log'' de efassado i taxireado de la ója es amostrado abasho para dar referensia.",
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''Avizo:''' La contenencia de xablon está muy grande.
'currentrev' => "Enderechamiento d'al cavo",
'currentrev-asof' => 'Enderechamiento de alcavo á las $1',
'revisionasof' => 'Enderechamiento á las $1',
+'revision-info' => 'Revision en data $1 por $2',
'previousrevision' => '← Enderechamiento de antes',
'nextrevision' => 'Rêvisión venidera →',
'currentrevisionlink' => 'Revisión actual',
# Revision feed
'history-feed-title' => 'Îstoria de nderechamientos',
+'history-feed-item-nocomment' => '$1 en $2',
# Revision deletion
'rev-delundel' => 'mostra/esconde',
'revertmerge' => 'Apartar',
# Diffs
-'history-title' => 'Istoria de revisiones para «$1»',
+'history-title' => 'Istorya de trokamientos para «$1»',
'lineno' => 'Shurá $1:',
'compareselectedversions' => 'Comparar versiones escogidas',
'editundo' => 'deshaze',
'search-interwiki-more' => '(más)',
'search-mwsuggest-enabled' => 'con consejos',
'search-mwsuggest-disabled' => 'no ay consejos',
+'searchrelated' => 'lisionado',
'searchall' => 'todos',
'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} para '''$4'''",
'nonefound' => "'''Nota''': Por defecto sólo se busca en algunos espacios de nombre.
'recentchanges-legend' => 'Opciones encima de los trocamientos frescos',
'recentchanges-summary' => 'Perseguid en esta hoja, los trocamientos de alcabo realizados en la Viki.',
'recentchanges-feed-description' => 'Perseguir los trocamientos más nuevos en el viki en este feed.',
+'recentchanges-label-newpage' => 'Este trokamiento krio una mueva ója',
'recentchanges-label-minor' => 'Esta es un trocamiento chiquitico',
+'recentchanges-label-bot' => 'Este trokamiento fue echo por un bot',
+'recentchanges-label-unpatrolled' => 'Estre trokamiento no esta akavidado',
'rcnote' => "Debaxo {{PLURAL:$1|ay '''1''' trocamiento realizado|están los dal cabo '''$1''' trocamientos realizados}} en {{PLURAL:$2|el dal cabo día|los dal cabo '''$2''' días}}, hasta el $4, $5.",
'rclistfrom' => 'Mostra los trocamientos nuevos empeçando desde $1',
'rcshowhideminor' => '$1 trocamientos chiquiticos',
'rcshowhidebots' => '$1 bots',
'rcshowhideliu' => '$1 empleadores enrējjistrados',
'rcshowhideanons' => '$1 empleadores anonimes',
+'rcshowhidepatr' => '$1 trokamientos akavidados',
'rcshowhidemine' => '$1 mis ediciones',
'rclinks' => 'Ver los dal cabo $1 trocamientos en los dal cabo $2 días.<br />$3',
'diff' => 'dif',
'recentchangeslinked-feed' => 'Trocamientos conectados',
'recentchangeslinked-toolbox' => 'Trocamientos relatados',
'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
+'recentchangeslinked-noresult' => 'Sin trokamientos en las ójas atadas en la data demandada',
'recentchangeslinked-summary' => "Esto es la lista de los trocamientos de alcavo de las hojas que relatan á una hoja spēcifik (ou de los miembros de la katēggoría spēcifikada).
Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con letras grexas'''.",
'recentchangeslinked-page' => 'Nombre de la hoja',
'filedesc' => 'Somario',
'uploadedimage' => 'subió «[[$1]]»',
+'license' => 'Lesensia:',
+'license-header' => 'Lesensiamyénto',
+
# Special:ListFiles
'listfiles_name' => 'Nombre',
'listfiles_user' => 'Usuario',
'filehist-comment' => 'Comentario',
'imagelinks' => 'El uso del dosya',
'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a este arxivo:',
+'nolinkstoimage' => 'Dinguna ója tiene atamientos a esta imej',
'sharedupload' => 'Este arxivo es de $1 i puede ser usado por otros proyectos.',
'sharedupload-desc-here' => 'Esta hoja es de $1 y puede ser usado por otros projetos.
La descripción en su [$2 hoja de descripción del arxivo] está amostrada debaxo.',
# Special:LinkSearch
'linksearch' => 'Linkes eksternos',
+'linksearch-line' => 'Atamiento para $1 en la ója $2',
# Special:Log/newusers
'newuserlogpage' => 'Registro de creación de usuarios',
# Watchlist
'watchlist' => 'Mi lista de escogidas',
'mywatchlist' => 'Mi lista de akavidamientos',
+'watchlistfor2' => 'Para $1 $2',
'addedwatchtext' => "La hoja «[[:$1]]» fue ajustada a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta hoja i en tu hoja de diskussión associada se van indicar aí, i la hoja va aparecer '''gordo''' en la hoja de [[Special:RecentChanges|trocamientos freskos]] para hazerla más kolay de detektar.
Cuando queres eliminar la hoja de tu lista de escogidas, piza «Dexar de cudiar» en el menú.",
Si puede ser, confirma que de verdad queres hazer esto, que estás entendiendo las
resultados, i que lo estás haziendo de acorddo con las [[{{MediaWiki:Policy-url}}|Políticas]].',
'actioncomplete' => 'Aksion kompleta',
+'actionfailed' => 'Aksiyon sin reushitá',
'deletedtext' => '"$1" fue efassado.
Mira $2 para un registro de los efassados nuevos.',
'dellogpage' => 'Registro de efassados',
'sp-contributions-newbies' => 'Mostrar solo las ajustamientos de los usuarios nuevos',
'sp-contributions-blocklog' => 'registro de bloqueos',
-'sp-contributions-talk' => 'Diścutir',
+'sp-contributions-uploads' => 'suvidas',
+'sp-contributions-talk' => 'Diskusyón',
'sp-contributions-search' => 'Buscar ajustamientos',
'sp-contributions-username' => 'Dirección IP o nombre de usuario:',
+'sp-contributions-toponly' => "Amostrar solo revisiones d'alkavo",
'sp-contributions-submit' => 'Buscar',
# What links here
'whatlinkshere-title' => 'Hojas que dan link a "$1"',
'whatlinkshere-page' => 'Hoja:',
'linkshere' => "Las hojas venideras dan link a '''[[:$1]]''':",
+'nolinkshere' => "Dinguna ója tiene atamientos kon '''[[:$1]]'''",
'isredirect' => 'Hoja redirigida',
'istemplate' => 'inclusión',
-'isimage' => 'Link del image',
+'isimage' => 'Atamiento de la dossia',
'whatlinkshere-prev' => '{{PLURAL:$1|de antes|de antes $1}}',
'whatlinkshere-next' => '{{PLURAL:$1|venidera|venideras $1}}',
'whatlinkshere-links' => '← linkes',
'whatlinkshere-hideredirs' => '$1 redirecciones',
'whatlinkshere-hidetrans' => '$1 inclusiones',
'whatlinkshere-hidelinks' => '$1 linkes',
+'whatlinkshere-hideimages' => '$1 atamientos a imejes',
'whatlinkshere-filters' => 'Filtres',
# Block/unblock
# Thumbnails
'thumbnail-more' => 'Engrandece',
+'thumbnail_error' => 'Yerro kriando la imej chika: $1',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Tu hoja de usador',
'tog-hidepatrolled' => 'Gemarkeerde wieziginge verberge in recente wieziginge',
'tog-newpageshidepatrolled' => "Gemarkeerde pagina's verberge in de lies mit nuuj pagina's",
'tog-extendwatchlist' => 'Oetgebreide volglies gebroeke óm alle verangeringe te zeen en neet allein de lèste',
-'tog-usenewrc' => 'Oetgebreide recènte verangeringe (Javascript nudig)',
+'tog-usenewrc' => 'Tuun verangeringe per pagina in recènte verangeringe en volglies (Javascript nudig)',
'tog-numberheadings' => 'Köpkes automatisch nummere',
'tog-showtoolbar' => 'Laot edit toolbar zeen',
'tog-editondblclick' => "Bewirk pagina's bie 'ne dobbelklik (JavaScript)",
'tog-editsectiononrightclick' => "Secties bewirke mit 'ne rechtermoesklik op sectietitels (JavaScript nudig)",
'tog-showtoc' => "Inhaudsopgaaf veur pagina's mit mie es 3 köpkes",
'tog-rememberpassword' => 'Mien wachwaord onthouwe veur later sessies (hoegstens $1 {{PLURAL:$1|daag|daag}})',
-'tog-watchcreations' => "Pagina's die ich aanmaak automatisch volge",
-'tog-watchdefault' => "Voog pagina's die se bewirks toe aan dien volglies",
-'tog-watchmoves' => "Pagina's die ich verplaats automatisch volge",
-'tog-watchdeletion' => "Pagina's die ich ewegsjaf automatisch volge",
+'tog-watchcreations' => "Volg autematis pagina's die ich aanmaak en bestenj die ich upload",
+'tog-watchdefault' => "Voog pagina's em bestenj die se bewirks toe aan dien volglies",
+'tog-watchmoves' => "Volg autematis pagina's en bestenj die ich verplaats",
+'tog-watchdeletion' => "Volg autematis pagina's en bestenj die ich ewegsjaf",
'tog-minordefault' => 'Markeer sjtanderd alle bewirkinge es klein',
'tog-previewontop' => 'Veurvertuin baove bewèrkingsveld tuine',
'tog-previewonfirst' => 'Preview laote zien bie de ierste bewirking',
'tog-nocache' => 'Zèt de browserpaginacaching oet',
-'tog-enotifwatchlistpages' => "'ne E-mail nao mich versjikke bie bewirkinge van pagina's op mien volglies",
+'tog-enotifwatchlistpages' => "Versjik 'ne e-mail nao mich bie bewirkinge van pagina's en bestenj op mien volglies",
'tog-enotifusertalkpages' => "'ne E-mail nao mich versjikke es emes mien euverlèkpagina verangert",
-'tog-enotifminoredits' => "'ne E-mail nao mich versjikke bie klein bewirkinge op pagina's op mien volglies",
+'tog-enotifminoredits' => "Versjik mich 'ne e-mail bie klein bewirkinge op pagina's en bestenj op mien volglies",
'tog-enotifrevealaddr' => 'Mien e-mailadres tuine in e-mailberichte',
'tog-shownumberswatching' => "'t Aantal gebroekers tuine die dees pagina volg",
'tog-oldsig' => 'Bestaonde ongerteikening:',
'cannotdelete' => 'Kós de pagina of \'t besjtand "$1" neet ewegsjaffe.
Mesjiens haet emes angers det al gedaon.',
'cannotdelete-title' => 'Pagina "$1" kin neet gewösj waere',
+'delete-hook-aborted' => "'t Wösje is aafgebroke door 'ne 'hook'.
+D'r is gein toelichting besjikbaar.",
'badtitle' => 'Óngeljige paginatitel',
'badtitletext' => 'De opgevraogde pagina is neet besjikbaar of laeg.',
'perfcached' => "De gegaeves koume oet 'n cache en zeen mäögelik neet actueel. 't Geuf {{PLURAL:$1|maximaal ei rizzeltaot|maximaal $1 rizzeltaote}} inne cache.",
d\'n Opgegaeve raej vanne sloetendje admin waar "\'\'$3\'\'".',
'invalidtitle-knownnamespace' => 'Óngèljige titel mit naamruumdje "$2" en teks "$3"',
'invalidtitle-unknownnamespace' => 'Óngèljige titel mit ónbekèndj naamruumdenómmer $1 en teks "$2"',
+'exception-nologin' => 'Neet aangemèld',
+'exception-nologin-text' => 'Óm dees pagina te betrachte of dees hanjeling te kinne doon mós se aangemèldj zeen bie deze wiki.',
# Virus scanner
'virus-badscanner' => "Slechte configuratie: onbekenge virusscanner: ''$1''",
'right-writeapi' => 'Bewèrke via de API',
'right-delete' => "Pagina's verwijdere",
'right-bigdelete' => "Pagina's mit 'n grote gesjiedenis verwijdere",
+'right-deletelogentry' => 'Wösj of plaats trögk specifieke logbookregels',
'right-deleterevision' => "Versies van pagina's verberge",
'right-deletedhistory' => 'Verwijderde versies bekieke, zonder te kinne zeen wat verwijderd is',
'right-deletedtext' => 'Bekieke gewösjde teks en wieziginge tösse verwiedere versies',
'lockmanager-fail-releaselock' => 'Kós de vergrendeling veur "$1" neet opheffe.',
'lockmanager-fail-db-bucket' => 'Kós neet in kontak kómme mit genóg vergrendelingsdatabases in de bucket $1.',
'lockmanager-fail-db-release' => "'t Waar neet meugelik ómme vergrendeling veure database $1 óp tö höffe.",
+'lockmanager-fail-svr-acquire' => "'t Waar neet meugelik ómme vergrendeling oppe server $1 tö kriege.",
'lockmanager-fail-svr-release' => "'t Waar neet meugelik ómme vergrendeling veure server $1 óp tö höffe.",
# ZipDirectoryReader
'spambot_username' => 'MediaWiki spam opruming',
'spam_reverting' => 'Bezig mit trökdrèjje nao de letste versie die gein verwiezing haet nao $1',
'spam_blanking' => "Alle wieziginge mit 'ne link nao $1 waere verwiederd",
+'spam_deleting' => 'Alle wieziginge hawwe links nao $1, wuuertj gewösj',
# Info page
'pageinfo-title' => 'Informatie euver "$1"',
'api-error-empty-file' => 't Bestandj det se perbeers te uploade had gein inhald.',
'api-error-emptypage' => "Doe maags gein nuuj, laeg pagina's aanmake.",
'api-error-fetchfileerror' => "Intern fout: d'r is get fout gegange bie 't óphaole van 't bestandj.",
+'api-error-fileexists-forbidden' => 'd\'r Besteit al e bestandj mitte naam "$1" det neet euversjreve kin waere.',
+'api-error-fileexists-shared-forbidden' => 'd\'r Besteit al e bestandj mitte naam "$1" inne gedeildje repositoir det neet euversjreve kin waere.',
'api-error-file-too-large' => 't Bestandj det se perbeers te uploade waas te groet.',
'api-error-filename-tooshort' => "t Bestandj det se perbeers te uploade had 'ne te kórte bestandjsnaam.",
'api-error-filetype-banned' => 't Bestandj det se perbeers te uploade waas van e neet-toegelaote bestandjstype.',
NS_CATEGORY_TALK => 'Kategorijos_aptarimas',
);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'Naudotojas', 'female' => 'Naudotoja' ),
+ NS_USER_TALK => array( 'male' => 'Naudotojo_aptarimas', 'female' => 'Naudotojos_aptarimas' ),
+);
+
$specialPageAliases = array(
'Allmessages' => array( 'Visi_pranešimai' ),
'Allpages' => array( 'Visi_puslapiai' ),
'right-writeapi' => 'Можност за пишување на API',
'right-delete' => 'Бришење страници',
'right-bigdelete' => 'Бришење страници со долга историја',
+'right-deletelogentry' => 'Бришење и враќање на конкретни ставки во дневник',
'right-deleterevision' => 'Бришење и враќање на конкретни ревизии на страници',
'right-deletedhistory' => 'Прегледување на записи во историја на бришења, без придружниот текст',
'right-deletedtext' => 'Прегледување на избришан текст и промени помеѓу избришани ревизии',
'rollback' => 'Отповикај промени',
'rollback_short' => 'Отповикај',
'rollbacklink' => 'отповикај',
+'rollbacklinkcount' => 'отповикај $1 {{PLURAL:$1|уредување|уредувања}}',
+'rollbacklinkcount-morethan' => 'отповикај повеќе од $1 {{PLURAL:$1|уредување|уредувања}}',
'rollbackfailed' => 'Отповикувањето не успеа',
'cantrollback' => 'Уредувањето не може да се отповика.
Последниот уредник е воедно и единствениот автор на страницата.',
'import-interwiki-templates' => 'Вклучи ги сите шаблони',
'import-interwiki-submit' => 'Увези',
'import-interwiki-namespace' => 'Целен именски простор:',
-'import-upload-filename' => 'Ð\98ме на подаÑ\82оÑ\82екаÑ\82а:',
+'import-upload-filename' => 'Ð\9fодаÑ\82оÑ\82ека:',
'import-comment' => 'Коментар:',
'importtext' => 'Извезете ја податотеката од изворното вики користејќи ја [[Special:Export|алатката за извоз]].
Зачувајте ја на вашиот сметач и подигнете ја овде.',
'fileduplicatesearch' => 'Барање на дуплирани податотеки',
'fileduplicatesearch-summary' => 'Пребарување на дуплирани податотеки по тарабни вредности.',
'fileduplicatesearch-legend' => 'Барање на дупликат',
-'fileduplicatesearch-filename' => 'Ð\98ме на подаÑ\82оÑ\82екаÑ\82а:',
+'fileduplicatesearch-filename' => 'Ð\9fодаÑ\82оÑ\82ека:',
'fileduplicatesearch-submit' => 'Барај',
'fileduplicatesearch-info' => '$1 × $2 пиксели<br />Големина на податотеката: $3<br />MIME-тип: $4',
'fileduplicatesearch-result-1' => 'Податотеката „$1“ нема истоветни дупликати.',
'tog-editsectiononrightclick' => 'Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian (JavaScript)',
'tog-showtoc' => 'Tunjukkan isi kandungan (bagi rencana yang melebihi 3 tajuk)',
'tog-rememberpassword' => 'Ingat log masuk saya di pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
-'tog-watchcreations' => 'Tambahkan laman yang saya cipta ke dalam senarai pantau',
-'tog-watchdefault' => 'Tambahkan laman yang saya sunting ke dalam senarai pantau',
-'tog-watchmoves' => 'Tambahkan laman yang saya pindahkan ke dalam senarai pantau',
-'tog-watchdeletion' => 'Tambahkan laman yang saya hapuskan ke dalam senarai pantau',
+'tog-watchcreations' => 'Tambahkan halaman-halaman yang saya buat dan fail-fail yang saya muat naik ke dalam senarai pantau',
+'tog-watchdefault' => 'Tambahkan halaman-halaman dan fail-fail yang saya sunting ke dalam senarai pantau',
+'tog-watchmoves' => 'Tambahkan halaman-halaman dan fail-fail yang saya pindahkan ke dalam senarai pantau',
+'tog-watchdeletion' => 'Tambahkan halaman-halaman dan fail-fail yang saya hapuskan ke dalam senarai pantau',
'tog-minordefault' => 'Tandakan semua suntingan sebagai kecil secara asali',
'tog-previewontop' => 'Tunjukkan pralihat di atas kotak sunting',
'tog-previewonfirst' => 'Tunjukkan pralihat pada suntingan pertama',
'tog-nocache' => 'Lumpuhkan pengagregatan laman',
-'tog-enotifwatchlistpages' => 'E-melkan saya apabila berlaku perubahan pada laman yang dipantau',
+'tog-enotifwatchlistpages' => 'E-mel kepada saya tentang perubahan pada halaman-halaman dan fail-fail dalam senarai pantau saya',
'tog-enotifusertalkpages' => 'E-melkan saya apabila berlaku perubahan pada laman perbincangan saya',
-'tog-enotifminoredits' => 'Juga e-melkan saya apabila berlaku penyuntingan kecil',
+'tog-enotifminoredits' => 'Juga e-mel kepada saya tentang suntingan kecil pada halaman-halaman dan fail-fail',
'tog-enotifrevealaddr' => 'Serlahkan alamat e-mel saya dalam e-mel pemberitahuan',
'tog-shownumberswatching' => 'Tunjukkan bilangan pemantau',
'tog-oldsig' => 'Tanda tangan yang sedia ada:',
'right-writeapi' => 'Menggunakan API tulis',
'right-delete' => 'Menghapuskan laman',
'right-bigdelete' => 'Menghapuskan laman bersejarah',
+'right-deletelogentry' => 'Memadamkan dan memulihkan entri log tertentu',
'right-deleterevision' => 'Menghapuskan dan memulihkan semula mana-mana semakan bagi sesebuah laman',
'right-deletedhistory' => 'Melihat senarai entri sejarah yang telah dihapuskan, tetapi tanpa teks yang berkaitan',
'right-deletedtext' => 'Melihat teks yang telah dihapuskan dan perubahan antara semakan-semakan yang telah dihapuskan',
'lockmanager-fail-releaselock' => 'Kunci untuk "$1" tidak dapat dikeluarkan.',
'lockmanager-fail-db-bucket' => 'Di baldi $1 tidak dapat dihubungi pangkalan data selak yang secukupnya.',
'lockmanager-fail-db-release' => 'Selak-selak tidak dapat dikeluarkan di pangkalan data $1.',
+'lockmanager-fail-svr-acquire' => 'Selak-selak tidak dapat diperoleh di pelayan $1.',
'lockmanager-fail-svr-release' => 'Selak-selak tidak dapat dikeluarkan di pelayan $1.',
# ZipDirectoryReader
'rollback' => 'Undurkan suntingan.',
'rollback_short' => 'Undur',
'rollbacklink' => 'undur',
+'rollbacklinkcount' => 'mengundurkan $1 {{PLURAL:$1|suntingan}}',
+'rollbacklinkcount-morethan' => 'mengundurkan lebih daripada $1 {{PLURAL:$1|suntingan}}',
'rollbackfailed' => 'Pengunduran gagal',
'cantrollback' => 'Suntingan tersebut tidak dapat dibalikkan: penyumbang terakhir adalah satu-satunya pengarang bagi rencana ini.',
'alreadyrolled' => 'Suntingan terakhir bagi [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|Perbualan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tidak dapat dibalikkan; terdapat pengguna lain yang telah menyunting atau membalikkan laman itu.
'duration-centuries' => '$1 abad',
'duration-millennia' => '$1 alaf',
-# Unknown messages
-'lockmanager-fail-svr-acquire' => 'Selak-selak tidak dapat diperoleh di pelayan $1.',
);
'tog-watchmoves' => 'Legg til sider og filer jeg flytter til min overvåkingsliste',
'tog-watchdeletion' => 'Legg til sider og filer jeg sletter i min overvåkingsliste',
'tog-minordefault' => 'Merk i utgangspunktet alle redigeringer som mindre',
-'tog-previewontop' => 'Vis forhåndsvisningen ovenfor redigeringsboksen',
+'tog-previewontop' => 'Vis forhåndsvisningen over redigeringsboksen',
'tog-previewonfirst' => 'Vis forhåndsvisning når du begynner å redigere',
'tog-nocache' => 'Deaktiver nettlesermellomlagring av sider («caching»)',
'tog-enotifwatchlistpages' => 'Send meg en e-post når sider og filer på overvåkningslisten min blir endret',
Det siste loggelementet er oppgitt under som referanse:",
'semiprotectedpagewarning' => "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.
Det siste loggelementet er oppgitt under som referanse:",
-'cascadeprotectedwarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede sider:<!--{{PLURAL:$1}}-->",
+'cascadeprotectedwarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede {{PLURAL:$1|sider}}:",
'titleprotectedwarning' => "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|spesielle rettigheter]] kreves for å opprette den.'''
Det siste loggelementet er oppgitt under som referanse:",
'templatesused' => '{{PLURAL:$1|Mal|Maler}} som brukes på denne siden:',
'deletedhist' => 'Slettet historikk',
'revdelete-hide-current' => 'Feil under skjuling av objektet datert $2, $1: dette er den gjeldende revisjonen.
Den kan ikke skjules.',
-'revdelete-show-no-access' => 'Feil under visning av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
+'revdelete-show-no-access' => 'Feil under visning av objekt datert $2, $1: dette objektet har blitt markert «begrenset».
Du har ikke tilgang til det.',
-'revdelete-modify-no-access' => 'Feil under endring av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
+'revdelete-modify-no-access' => 'Feil under endring av objekt datert $2, $1: dette objektet har blitt markert «begrenset».
Du har ikke tilgang til det.',
'revdelete-modify-missing' => 'Feil under endring av objekt ID $1: det mangler i databasen!',
'revdelete-no-change' => "'''Advarsel:''' objektet datert $2 $1 hadde allerede synlighetsinnstillingene du forespurte.",
'lineno' => 'Linje $1:',
'compareselectedversions' => 'Sammenlign valgte revisjoner',
'showhideselectedversions' => 'Vis/skjul valgte versjoner',
-'editundo' => 'angre',
+'editundo' => 'fjern',
'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av {{PLURAL:$2|én bruker|$2 brukere}} vises ikke)',
'diff-multi-manyusers' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)',
# Search results
-'searchresults' => 'Søkeresultat',
-'searchresults-title' => 'Søkeresultat for «$1»',
+'searchresults' => 'Søkeresultater',
+'searchresults-title' => 'Søkeresultater for «$1»',
'searchresulttext' => 'For mer informasjon om søking i {{SITENAME}}, se [[{{MediaWiki:Helppage}}|{{int:help}}]].',
'searchsubtitle' => "Du søkte etter '''[[:$1]]''' ([[Special:Prefixindex/$1|alle sider som begynner med «$1»]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle sider som lenker til «$1»]])",
'searchsubtitleinvalid' => "Du søkte etter '''$1'''",
'search-redirect' => '(omdirigering $1)',
'search-section' => '(avsnitt $1)',
'search-suggest' => 'Mente du: $1',
-'search-interwiki-caption' => 'Søsterprosjekt',
-'search-interwiki-default' => '$1-resultat:',
+'search-interwiki-caption' => 'Søsterprosjekter',
+'search-interwiki-default' => '$1-resultater:',
'search-interwiki-more' => '(mer)',
'search-mwsuggest-enabled' => 'med forslag',
'search-mwsuggest-disabled' => 'ingen forslag',
'showingresultsheader' => "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
'nonefound' => "'''Merk''': Som standard søkes det kun i enkelte navnerom.
For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler, osv), eller bruk det ønskede navnerommet som prefiks.",
-'search-nonefound' => 'Det var ingen resultater som passet til søket.',
+'search-nonefound' => 'Ingen resultater passet til søket.',
'powersearch' => 'Avansert søk',
'powersearch-legend' => 'Avansert søk',
'powersearch-ns' => 'Søk i navnerom:',
'prefs-watchlist-days' => 'Dager som skal vises i overvåkningslisten:',
'prefs-watchlist-days-max' => 'Maksimalt $1 {{PLURAL:$1|dag|dager}}',
'prefs-watchlist-edits' => 'Antall redigeringer som skal vises i utvidet overvåkningsliste:',
-'prefs-watchlist-edits-max' => 'Maksimum antall: 1000',
+'prefs-watchlist-edits-max' => 'Maksimalt antall: 1000',
'prefs-watchlist-token' => 'Nøkkel for overvåkningsliste',
'prefs-misc' => 'Diverse',
'prefs-resetpass' => 'Endre passord',
'stub-threshold' => 'Grense for <span class="mw-stub-example">stubblenkeformatering</span>:',
'stub-threshold-disabled' => 'Deaktivert',
'recentchangesdays' => 'Antall dager som skal vises i siste endringer:',
-'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dag|dager}})',
+'recentchangesdays-max' => 'Maks $1 {{PLURAL:$1|dag|dager}}',
'recentchangescount' => 'Antall redigeringer som skal vises som standard:',
'prefs-help-recentchangescount' => 'Dette inkluderer nylige endringer, sidehistorikk og logger.',
'prefs-help-watchlist-token' => 'Om du fyller ut dette feltet med et hemmelig tall, vil det lages en RSS-liste for overvåkningslisten din.
'timezoneregion-asia' => 'Asia',
'timezoneregion-atlantic' => 'Atlanterhavet',
'timezoneregion-australia' => 'Australia',
-'timezoneregion-europe' => 'Europe',
-'timezoneregion-indian' => 'Det indiske hav',
+'timezoneregion-europe' => 'Europa',
+'timezoneregion-indian' => 'Indiahavet',
'timezoneregion-pacific' => 'Stillehavet',
'allowemail' => 'Tillat andre å sende meg e-post',
'prefs-searchoptions' => 'Søkealternativ',
'prefs-signature' => 'Signatur',
'prefs-dateformat' => 'Datoformat',
'prefs-timeoffset' => 'Tidsforskyvning',
-'prefs-advancedediting' => 'Avanserte alternativ',
+'prefs-advancedediting' => 'Avanserte alternativer',
'prefs-advancedrc' => 'Avanserte alternativ',
-'prefs-advancedrendering' => 'Avanserte alternativ',
-'prefs-advancedsearchoptions' => 'Avanserte alternativ',
-'prefs-advancedwatchlist' => 'Avanserte alternativ',
-'prefs-displayrc' => 'Visningsalternativ',
+'prefs-advancedrendering' => 'Avanserte alternativer',
+'prefs-advancedsearchoptions' => 'Avanserte alternativer',
+'prefs-advancedwatchlist' => 'Avanserte alternativer',
+'prefs-displayrc' => 'Visningsalternativer',
'prefs-displaysearchoptions' => 'Visningsalternativer',
'prefs-displaywatchlist' => 'Visningsalternativer',
'prefs-diffs' => 'Forskjeller',
'right-createpage' => 'Opprette sider (som ikke er diskusjonssider)',
'right-createtalk' => 'Opprette diskusjonssider',
'right-createaccount' => 'Opprette nye kontoer',
-'right-minoredit' => 'Marker endringer som mindre',
+'right-minoredit' => 'Markere endringer som mindre',
'right-move' => 'Flytte sider',
'right-move-subpages' => 'Flytte sider med undersider',
'right-move-rootuserpages' => 'Flytte hovedbrukersider',
'right-deletelogentry' => 'Slett og gjenopprett spesifikke loggoppføringer',
'right-deleterevision' => 'Slette og gjenopprette enkeltrevisjoner av sider',
'right-deletedhistory' => 'Se slettet sidehistorikk uten tilhørende sidetekst',
-'right-deletedtext' => 'Vis slettet tekst og endringer mellom slettede versjoner',
+'right-deletedtext' => 'Vise slettet tekst og endringer mellom slettede versjoner',
'right-browsearchive' => 'Søke i slettede sider',
'right-undelete' => 'Gjenopprette sider',
'right-suppressrevision' => 'Se og gjenopprette skjulte siderevisjoner',
'right-hideuser' => 'Blokkere et brukernavn og skjule det fra det offentlige',
'right-ipblock-exempt' => 'Kan redigere fra blokkerte IP-adresser',
'right-proxyunbannable' => 'Kan redigere fra blokkerte proxyer',
-'right-unblockself' => 'Fjern blokkering av seg selv',
+'right-unblockself' => 'Fjerne blokkering av seg selv',
'right-protect' => 'Endre beskyttelsesnivåer',
'right-editprotected' => 'Redigere beskyttede sider',
'right-editinterface' => 'Redigere brukergrensesnittet',
# User rights log
'rightslog' => 'Brukerrettighetslogg',
-'rightslogtext' => 'Dette er en logg over forandringer i brukerrettigheter.',
+'rightslogtext' => 'Dette er en logg over endringer av brukerrettigheter.',
'rightslogentry' => 'endret gruppe for $1 fra $2 til $3',
'rightslogentry-autopromote' => 'ble automatisk forfremmet fra $2 til $3',
'rightsnone' => '(ingen)',
'action-suppressionlog' => 'se denne private loggen',
'action-block' => 'blokkere denne brukeren fra å redigere',
'action-protect' => 'endre denne sidens beskyttelsesnivåer',
-'action-rollback' => 'tilbakestill raskt endringene til den siste brukeren som redigerte en bestemt side',
+'action-rollback' => 'raskt tilbakestille endringene til den siste brukeren som redigerte en bestemt side',
'action-import' => 'importere denne siden fra en annen wiki',
'action-importupload' => 'importere denne siden fra en opplastet fil',
'action-patrol' => 'merke andre brukeres redigeringer som patruljert',
'action-userrights' => 'redigere alle brukerrettigheter',
'action-userrights-interwiki' => 'endre brukerrettigheter for brukere på andre wikier',
'action-siteadmin' => 'låse eller låse opp databasen',
-'action-sendemail' => 'send e-post',
+'action-sendemail' => 'sende e-poster',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
'recentchanges' => 'Siste endringer',
-'recentchanges-legend' => 'Alternativ for siste endringer',
+'recentchanges-legend' => 'Alternativer for siste endringer',
'recentchanges-summary' => 'På denne siden vises de siste endringene i wikien.',
'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
'recentchanges-label-bot' => 'Denne redigeringen ble gjort av en bot',
'recentchanges-label-unpatrolled' => 'Denne redigeringen har ikke blitt patruljert ennå',
'rcnote' => "Nedenfor vises {{PLURAL:$1|'''1''' endring|de siste '''$1''' endringene}} fra {{PLURAL:$2|det siste døgnet|de siste '''$2''' døgnene}}, per $5 $4.",
-'rcnotefrom' => "Nedenfor er endringene fra '''$2''' (opp til '''$1''' vises).",
+'rcnotefrom' => "Nedenfor er endringene siden '''$2''' (opp til '''$1''' vises).",
'rclistfrom' => 'Vis nye endringer med start fra $1',
'rcshowhideminor' => '$1 mindre endringer',
'rcshowhidebots' => '$1 roboter',
'number_of_watching_users_pageview' => '[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]',
'rc_categories' => 'Begrens til kategorier (skilletegn: «|»)',
'rc_categories_any' => 'Alle',
-'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} etter endring',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} etter endring',
'newsectionsummary' => '/* $1 */ ny seksjon',
'rc-enhanced-expand' => 'Vis detaljer (krever JavaScript)',
'rc-enhanced-hide' => 'Skjul detaljer',
'rollback' => 'Fjern redigeringer',
'rollback_short' => 'Tilbakestill',
'rollbacklink' => 'tilbakestill',
+'rollbacklinkcount' => 'tilbakestill {{PLURAL:$1|én endring|$1 endringer}}',
+'rollbacklinkcount-morethan' => 'tilbakestill mer enn $1 {{PLURAL:$1|endring|endringer}}',
'rollbackfailed' => 'Kunne ikke tilbakestille',
'cantrollback' => 'Kan ikke fjerne redigering; den siste brukeren er den eneste forfatteren.',
'alreadyrolled' => 'Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); en annen har allerede redigert siden eller fjernet redigeringen.
'tog-editsectiononrightclick' => 'Bewerken van deelpagina’s mogelijk maken met een rechtermuisklik op een tussenkop (vereist JavaScript)',
'tog-showtoc' => 'Inhoudsopgave weergeven (voor pagina’s met minstens 3 tussenkoppen)',
'tog-rememberpassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
-'tog-watchcreations' => 'Pagina’s die ik aanmaak automatisch volgen',
-'tog-watchdefault' => 'Pagina’s die ik bewerk automatisch volgen',
-'tog-watchmoves' => 'Pagina’s die ik hernoem automatisch volgen',
-'tog-watchdeletion' => 'Pagina’s die ik verwijder automatisch volgen',
+'tog-watchcreations' => "Pagina's die ik aanmaak en bestanden die ik upload automatisch volgen",
+'tog-watchdefault' => 'Pagina’s en bestanden die ik bewerk automatisch volgen',
+'tog-watchmoves' => 'Pagina’s en bestanden die ik hernoem automatisch volgen',
+'tog-watchdeletion' => 'Pagina’s en bestanden die ik verwijder automatisch volgen',
'tog-minordefault' => 'Mijn bewerkingen als ‘klein’ markeren',
'tog-previewontop' => 'Voorvertoning boven bewerkingsveld weergeven',
'tog-previewonfirst' => 'Voorvertoning bij eerste bewerking weergeven',
'tog-nocache' => "Cachen van pagina's door de browser uitschakelen",
-'tog-enotifwatchlistpages' => 'Mij e-mailen bij bewerkingen van pagina’s op mijn volglijst',
+'tog-enotifwatchlistpages' => 'Mij e-mailen bij bewerkingen van pagina’s of bestanden op mijn volglijst',
'tog-enotifusertalkpages' => 'Mij e-mailen als iemand mijn overlegpagina wijzigt',
-'tog-enotifminoredits' => 'Mij e-mailen bij kleine bewerkingen van pagina’s op mijn volglijst',
+'tog-enotifminoredits' => 'Mij e-mailen bij kleine bewerkingen van pagina’s en bestanden op mijn volglijst',
'tog-enotifrevealaddr' => 'Mijn e-mailadres weergeven in e-mailberichten',
'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
'tog-oldsig' => 'Bestaande ondertekening:',
'vector-simplesearch-preference' => 'Verbeterde zoeksuggesties inschakelen (alleen voor het uiterlijk Vector)',
'vector-view-create' => 'Aanmaken',
'vector-view-edit' => 'Bewerken',
-'vector-view-history' => 'Geschiedenis bekijken',
+'vector-view-history' => 'Geschiedenis weergeven',
'vector-view-view' => 'Lezen',
'vector-view-viewsource' => 'Brontekst bekijken',
'actions' => 'Handelingen',
'cannotdelete' => 'De pagina of het bestand "$1" kon niet verwijderd worden.
Mogelijk is deze al door iemand anders verwijderd.',
'cannotdelete-title' => 'Pagina "$1" kan niet verwijderd worden',
-'delete-hook-aborted' => 't Vortdoon is aofebreuken deur n haak.
-Der is gien informasie over beschikbaor.',
+'delete-hook-aborted' => 'Het verwijderen is afgebroken door een hook.
+Er is geen toelichting beschikbaar.',
'badtitle' => 'Ongeldige paginanaam',
'badtitletext' => 'De naam van de opgevraagde pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikinaamverwijzing.
Wellicht bevat de paginanaam niet toegestane tekens.',
'right-writeapi' => 'Bewerken via de API',
'right-delete' => "Pagina's verwijderen",
'right-bigdelete' => "Pagina's met een grote geschiedenis verwijderen",
+'right-deletelogentry' => 'Specifieke logboekregels verwijderen en terugplaatsen',
'right-deleterevision' => "Versies van pagina's verbergen",
'right-deletedhistory' => 'Verwijderde versies bekijken, zonder te kunnen zien wat verwijderd is',
'right-deletedtext' => 'Verwijderde tekst en wijzigingen tussen verwijderde versies bekijken',
'lockmanager-fail-releaselock' => 'Het was niet mogelijk vergrendeling van "$1" op te heffen.',
'lockmanager-fail-db-bucket' => 'Het was niet mogelijk om in contact te komen met voldoende vergrendelingsdatabases in de bucket $1.',
'lockmanager-fail-db-release' => 'Het was niet mogelijk om de vergrendeling voor de database $1 op te heffen.',
+'lockmanager-fail-svr-acquire' => 'Het was niet mogelijk een vergrendeling te krijgen op server $1.',
'lockmanager-fail-svr-release' => 'Het was niet mogelijk om de vergrendeling voor de server $1 op te heffen.',
# ZipDirectoryReader
'rollback' => 'Wijzigingen ongedaan maken',
'rollback_short' => 'Terugdraaien',
'rollbacklink' => 'terugdraaien',
+'rollbacklinkcount' => '{{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien',
+'rollbacklinkcount-morethan' => 'Meer dan {{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien',
'rollbackfailed' => 'Ongedaan maken van wijzigingen mislukt.',
'cantrollback' => 'Ongedaan maken van wijzigingen onmogelijk: deze pagina heeft slechts 1 auteur.',
'alreadyrolled' => 'Het is niet mogelijk om de bewerking van de pagina [[:$1]] door [[User:$2|$2]] ([[User talk:$2|overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|bijdragen]]) ongedaan te maken.
'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
-# Unknown messages
-'lockmanager-fail-svr-acquire' => 'Het was niet mogelijk een vergrendeling te krijgen op server $1.',
);
'move-subpages' => 'Flytt undersider (opp til $1)',
'move-talk-subpages' => 'Flytt undersider av diskusjonssida (opp til $1)',
'movepage-page-exists' => 'Sida $1 finst alt og kan ikkje skrivast over automatisk.',
-'movepage-page-moved' => 'Sida $1 har blitt flytta til $2.',
+'movepage-page-moved' => 'Sida $1 er flytt til $2.',
'movepage-page-unmoved' => 'Sida $1 kunne ikkje flyttast til $2.',
'movepage-max-pages' => 'Grensa på {{PLURAL:$1|éi side|$1 sider}} er nådd; ingen fleire sider kjem til å verte flytta automatisk.',
'movelogpage' => 'Flyttelogg',
* @author Kaganer
* @author Sukh
* @author Surinder.wadhawan
+ * @author TariButtar
* @author Ævar Arnfjörð Bjarmason
* @author לערי ריינהארט
*/
'june' => 'ਜੂਨ',
'july' => 'ਜੁਲਾਈ',
'august' => 'ਅਗਸਤ',
-'september' => 'ਸਤੰਬਰ',
+'september' => 'ਸਿਤੰਬਰ',
'october' => 'ਅਕਤੂਬਰ',
'november' => 'ਨਵੰਬਰ',
-'december' => 'ਦਸੰਬਰ',
+'december' => 'ਦਿਸੰਬਰ',
'january-gen' => 'ਜਨਵਰੀ',
'february-gen' => 'ਫ਼ਰਵਰੀ',
'march-gen' => 'ਮਾਰਚ',
'june-gen' => 'ਜੂਨ',
'july-gen' => 'ਜੁਲਾਈ',
'august-gen' => 'ਅਗਸਤ',
-'september-gen' => 'ਸਤੰਬਰ',
+'september-gen' => 'ਸਿਤੰਬਰ',
'october-gen' => 'ਅਕਤੂਬਰ',
'november-gen' => 'ਨਵੰਬਰ',
-'december-gen' => 'ਦਸੰਬਰ',
-'jan' => 'ਜਨ',
-'feb' => 'ਫ਼ਰ',
-'mar' => 'ਮਾਰ',
-'apr' => 'ਅਪ',
+'december-gen' => 'ਦਿਸੰਬਰ',
+'jan' => 'ਜਨਵਰੀ',
+'feb' => 'ਫ਼ਰਵਰੀ',
+'mar' => 'ਮਾਰਚ',
+'apr' => 'ਅਪਰੈਲ',
'may' => 'ਮਈ',
'jun' => 'ਜੂਨ',
'jul' => 'ਜੁਲਾਈ',
-'aug' => 'ਅਗ',
-'sep' => 'ਸਤੰ',
-'oct' => 'ਅਕ',
-'nov' => 'ਨਵੰ',
-'dec' => 'ਦਸੰ',
+'aug' => 'ਅਗਸਤ',
+'sep' => 'ਸਿਤੰਬਰ',
+'oct' => 'ਅਕਤੂਬਰ',
+'nov' => 'ਨਵੰਬਰ',
+'dec' => 'ਦਿਸੰਬਰ',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ਕੈਟਾਗਰੀ|ਕੈਟਾਗਰੀਆਂ}}',
'qbpageinfo' => 'ਭਾਗ',
'qbmyoptions' => 'ਮੇਰੇ ਪੇਜ',
'qbspecialpages' => 'ਖਾਸ ਪੇਜ',
-'faq' => 'ਸਵਾਲ-à¨\9cਵਾਬ',
+'faq' => 'à¨\85à¨\95ਸਰ ਪà©\81ੱà¨\9bà©\87 à¨\9cਾਣ ਵਾਲ਼à©\87 ਸਵਾਲ',
'faqpage' => 'Project:ਸਵਾਲ-ਜਵਾਬ',
# Vector skin
'errorpagetitle' => 'ਗਲਤੀ',
'returnto' => '$1 ਤੇ ਵਾਪਸ ਜਾਓ',
'tagline' => '{{SITENAME}} ਤੋਂ',
-'help' => 'ਮੱਦਦ',
+'help' => 'ਮਦਦ',
'search' => 'ਖੋਜ',
'searchbutton' => 'ਖੋਜ',
'go' => 'ਜਾਓ',
'otherlanguages' => 'ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ',
'redirectedfrom' => '($1 ਤੋਂ ਰੀ-ਡਿਰੈਕਟ)',
'redirectpagesub' => 'ਰੀ-ਡਿਰੈਕਟ ਪੇਜ',
-'lastmodifiedat' => 'à¨\87ਹ ਪà©\87à¨\9c à¨\86à¨\96ਰà©\80 ਵਾਰ $2, $1 ਨà©\82à©° ਸੋਧਿਆ ਗਿਆ ਸੀ।',
+'lastmodifiedat' => 'à¨\87ਹ ਸਫ਼ਾ à¨\86à¨\96਼ਰà©\80 ਵਾਰ $1 ਨà©\82à©° $2 ਤà©\87 ਸੋਧਿਆ ਗਿਆ ਸੀ।',
'viewcount' => 'ਇਹ ਪੇਜ ਅਸੈੱਸ ਕੀਤਾ ਗਿਆ {{PLURAL:$1|ਇੱਕਵਾਰ|$1 ਵਾਰ}}.',
'protectedpage' => 'ਸੁਰੱਖਿਅਤ ਪੇਜ',
'jumpto' => 'ਜੰਪ ਕਰੋ:',
'edithelp' => 'ਮੱਦਦ ਐਡੀਟਿੰਗ',
'edithelppage' => 'Help:ਐਡਟਿੰਗ',
'helppage' => 'Help:ਸਮੱਗਰੀ',
-'mainpage' => 'ਮà©\81ੱà¨\96 ਪੰਨਾ',
-'mainpage-description' => 'ਮà©\81ੱà¨\96 ਪà©\87à¨\9c',
+'mainpage' => 'ਮà©\81ੱà¨\96 ਸਫ਼ਾ',
+'mainpage-description' => 'ਮà©\81ੱà¨\96 ਸਫ਼ਾ',
'policy-url' => 'Project:ਪਾਲਸੀ',
'portal' => 'ਕਮਿਊਨਟੀ ਪੋਰਟਲ',
'portal-url' => 'Project:ਕਮਿਊਨਟੀ ਪੋਰਟਲ',
'nstab-main' => 'ਲੇਖ',
'nstab-user' => 'ਯੂਜ਼ਰ ਪੇਜ',
'nstab-media' => 'ਮੀਡਿਆ ਪੇਜ',
-'nstab-special' => 'ਖਾਸ ਸਫ਼ਾ',
+'nstab-special' => 'à¨\96਼ਾਸ ਸਫ਼ਾ',
'nstab-project' => 'ਪਰੋਜੈਕਟ ਪੇਜ',
'nstab-image' => 'ਫਾਇਲ',
'nstab-mediawiki' => 'ਸੁਨੇਹਾ',
-'nstab-template' => 'ਟੈਪਲੇਟ',
+'nstab-template' => 'à¨\9fà©\88à¨\82ਪਲà©\87à¨\9f',
'nstab-help' => 'ਮੱਦਦ ਪੇਜ',
'nstab-category' => 'ਕੈਟਾਗਰੀ',
You can continue to use {{SITENAME}} anonymously, or you can log in again as the same or as a different user.
Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomecreation' => '== $1 ਜੀ ਆਇਆਂ ਨੂੰ! ==
+'welcomecreation' => '== ਜੀ ਆਇਆਂ ਨੂੰ! ==
-ਤà©\81ਹਾਡਾ à¨\85à¨\95ਾà¨\8aà¨\82à¨\9f ਬਣਾà¨\87à¨\86 à¨\97ਿà¨\86 ਹੈ। ਆਪਣੀ [[Special:ਪਸੰਦ|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।',
+ਤà©\81ਹਾਡਾ à¨\96਼ਾਤਾ ਬਣ à¨\9aà©\81ੱà¨\95ਾ ਹੈ। ਆਪਣੀ [[Special:ਪਸੰਦ|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।',
'yourname' => 'ਯੂਜ਼ਰ ਨਾਂ:',
'yourpassword' => 'ਪਾਸਵਰਡ:',
'yourpasswordagain' => 'ਪਾਸਵਰਡ ਮੁੜ-ਲਿਖੋ:',
'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
'yourdomainname' => 'ਤੁਹਾਡੀ ਡੋਮੇਨ:',
'login' => 'ਲਾਗ ਇਨ',
-'nav-login-createaccount' => 'ਲਾà¨\97 à¨\87ਨ / à¨\85à¨\95ਾà¨\8aà¨\82à¨\9f ਬਣਾਓ',
+'nav-login-createaccount' => 'ਲਾà¨\97 à¨\87ਨ / à¨\96਼ਾਤਾ ਬਣਾਓ',
'loginprompt' => 'ਤੁਹਾਨੂੰ {{SITENAME}} ਉੱਤੇ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਯੋਗ ਕਰਨੇ ਜ਼ਰੂਰੀ ਹਨ।',
'userlogin' => 'ਲਾਗ ਇਨ / ਅਕਾਊਂਟ ਬਣਾਓ',
'userloginnocreate' => 'ਲਾਗ ਇਨ',
'createaccountmail' => 'ਈਮੇਲ ਨਾਲ',
'createaccountreason' => 'ਕਾਰਨ:',
'badretype' => 'ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।',
-'userexists' => 'ਯੂਜ਼ਰ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਵਰਤੋਂ ਅਧੀਨ ਹੈ।
-ਵੱਖਰਾ ਯੂਜ਼ਰ ਨਾਂ ਵਰਤੋਂ ਜੀ।',
+'userexists' => 'ਇਹ ਮੈਂਬਰ-ਨਾਮ ਪਹਿਲਾਂ ਹੀ ਵਰਤੋਂ ’ਚ ਹੈ। ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਵੱਖਰਾ ਮੈਂਬਰ-ਨਾਮ ਵਰਤੋਂ।',
'loginerror' => 'ਲਾਗਇਨ ਗਲਤੀ',
'createaccounterror' => 'ਅਕਾਊਂਟ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: $1',
'nocookiesnew' => 'ਯੂਜ਼ਰ ਅਕਾਊਂਟ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਪਰ ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ।{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.',
'subject' => 'ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ:',
'minoredit' => 'ਇਹ ਛੋਟੀ ਸੋਧ ਹੈ',
'watchthis' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
-'savearticle' => 'ਪà©\87à¨\9c ਸੰà¨à¨¾à¨²ੋ',
+'savearticle' => 'ਸਫ਼ਾ ਸੰà¨à¨¾à¨²à¨¼ੋ',
'preview' => 'ਝਲਕ',
'showpreview' => 'ਝਲਕ ਵੇਖੋ',
'showlivepreview' => 'ਲਾਈਵ ਝਲਕ',
'newarticletext' => "ਤੁਸੀਂ ਕਿਸੇ ਐਸੇ ਲਿੰਕ ਰਾਹੀਂ ਉਸ ਪੰਨੇ ਤੇ ਪੁੱਜੇ ਹੋ ਜੋ ਅਜੇ ਬਣਾਇਆ ਨਹੀਂ ਗਿਆ।
ਪੰਨਾ ਬਨਾਉਣ ਲਈ ਹੇਠ ਦਿੱਤੇ ਖਾਨੇ ਵਿਚ ਪਾਠ ਲਿਖੋ।(ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ [[{{MediaWiki:Helppage}}|ਮੱਦਦ ਪੰਨਾ]] ਦੇਖੋ)
ਜੇ ਤੁਸੀਂ ਇੱਥੇ ਗਲਤੀ ਨਾਲ ਆਏ ਹੋ ਤਾਂ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਦੇ ਬੈਕ ('''back''') ਬਟਨ ਪਰ ਕਲਿਕ ਕਰੋ।",
-'noarticletext' => 'ਫਿਲਹਾਲ ਇਸ ਪੰਨੇ ਤੇ ਐਸਾ ਕੋਈ ਪਾਠ ਨਹੀਂ ਹੈ।ਤੁਸੀਂ ਦੂਸਰੇ ਪੰਨਿਆਂ ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਪਾਠ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ।,<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਸੰਭੰਧਿਤ ਖਾਤਿਆਂ ਵਿਚ ਖੋਜ ਸਕਦੇ ਹੋ],
-ਯਾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਨ ਕਰ ਸਕਦੇ ਹੋ]</span>।',
+'noarticletext' => 'ਫ਼ਿਲਹਾਲ ਇਸ ਸਫ਼ੇ ਤੇ ਕੋਈ ਲਿਖਤ ਨਹੀਂ ਹੈ।ਤੁਸੀਂ ਦੂਸਰੇ ਸਫ਼ਿਆਂ ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਸਿਰਲੇਖ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਸਬੰਧਿਤ ਚਿੱਠਿਆਂ ਦੀ ਖੋਜ ਸਕਦੇ ਹੋ] ਜਾਂ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਸਫ਼ੇ ਵਿਚ ਲਿਖ ਸਕਦੇ ਹੋ]</span>।',
'noarticletext-nopermission' => '↓
ਫਿਲਹਾਲ ਇਸ ਪੰਨੇ ਤੇ ਐਸਾ ਕੋਈ ਪਾਠ ਨਹੀਂ ਹੈ।ਤੁਸੀਂ ਦੂਸਰੇ ਪੰਨਿਆਂ ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਪਾਠ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ।,<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਸੰਬੰਧਿਤ ਖਾਤਿਆਂ ਵਿਚ ਖੋਜ ਸਕਦੇ ਹੋ],
ਯਾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਨ ਕਰ ਸਕਦੇ ਹੋ]</span>।',
ਪੰਨੇ ਦੇ ਹਟਾਣ ਯਾ ਜਗ੍ਹਾ ਬਦਲੀ ਦਾ ਚਿੱਠਾ,ਹਵਾਲੇ ਲਈ ਹੇਠ ਦਿੱਤਾ ਹੈ।',
# Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''ਖ਼ਬਰਦਾਰ: ਸੰਚੇ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਕੁਝ ਸੰਚੇ ਛੁਟ ਜਾਣਗੇ।",
-'post-expand-template-inclusion-category' => 'à¨\89ਹ ਪੰਨà©\87 à¨\9cਿਥà©\87 ਸੰà¨\9aਿà¨\86à¨\82 ਦਾ à¨\85à¨\95ਾਰ ਨਿਣਮਿਤ ਹੱਦ ਤà©\8cà¨\82 ਵੱਧ ਹà©\88।',
+'post-expand-template-inclusion-warning' => "'''ਖ਼ਬਰਦਾਰ:''' ਟੈਂਪਲੇਟਾਂ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਕੁਝ ਟੈਂਪਲੇਟ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋਣਗੇ।",
+'post-expand-template-inclusion-category' => 'à¨\93ਹ ਸਫ਼à©\87 à¨\9cਿੱਥà©\87 à¨\9fà©\88à¨\82ਪਲà©\87à¨\9fਾà¨\82 ਦà©\87 ਸ਼ਾਮਲ à¨\95ਰਨ ਦਾ à¨\85à¨\95ਾਰ ਹੱਦà©\8bà¨\82 ਵਧ à¨\97ਿà¨\86 ਹà©\88',
'post-expand-template-argument-warning' => "'''ਖ਼ਬਰਦਾਰ'''ਇਸ ਸਫ਼ੇ ਤੇ ਕਿਸੇ ਫ਼ਰਮੇ ਵਿਚ ਘੱਟੋ ਘੱਟ ਇਕ ਸਁਘਟਕ ਐਸਾ ਹੈ ਜਿਸ ਦਾ ਵਿਸਤ੍ਰਿਤ ਰੂਪ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਐਸੇ ਸਁਘਟਕਾਂ ਨੂਁ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
'post-expand-template-argument-category' => 'ਐਸੇ ਸਫ਼ੇ ਜਿਨ੍ਹਾਂ ਵਿਚ ਫ਼ਰਮੇ ਦੇ ਸਁਘਟਕ ਛੁੱਟ ਗਏ ਹਨ ।',
'currentrevisionlink' => 'ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ',
'cur' => 'ਮੌਜੂਦਾ',
'next' => 'ਅੱਗੇ',
-'last' => 'ਆਖਰੀ',
+'last' => 'à¨\86à¨\96਼ਰà©\80',
'page_first' => 'ਪਹਿਲਾਂ',
'page_last' => 'ਆਖਰੀ',
'history-fieldset-title' => 'ਇਤਿਹਾਸ ਤੇ ਇਕ ਨਜ਼ਰ ਮਾਰੋ ।',
'revdelete-log' => 'ਕਾਰਨ:',
'revdelete-submit' => 'ਚੁਣੇ ਰੀਵਿਜ਼ਨ ਉੱਤੇ ਲਾਗੂ ਕਰੋ',
'revdel-restore' => 'ਦਿੱਖ ਬਦਲੋ',
-'revdel-restore-deleted' => 'ਹਟਾਏ ਗਏ ਬਦਲਾਅ',
-'revdel-restore-visible' => 'ਦà©\8dਰਿਸ਼à¨\9f ਬਦਲਾਅ',
+'revdel-restore-deleted' => 'ਮਿਟਾਏ ਗਏ ਬਦਲਾਅ',
+'revdel-restore-visible' => 'ਦਿੱਸਣਯà©\8bà¨\97 ਬਦਲਾਅ',
'pagehist' => 'ਪੇਜ ਦਾ ਅਤੀਤ',
'deletedhist' => 'ਹਟਾਇਆ ਗਿਆ ਅਤੀਤ',
'revertmerge' => 'ਬਿਨ-ਮਿਲਾਨ',
# Diffs
-'history-title' => '"$1" ਦà©\80 ਸ਼à©\8bਧ ਤਵਾਰà©\80à¨\96',
+'history-title' => '"$1" ਦà©\87 ਬਦਲਾà¨\85 ਦਾ à¨\85ਤà©\80ਤ',
'lineno' => 'ਲਾਈਨ $1:',
'compareselectedversions' => 'ਚੁਣੇ ਵਰਜਨਾਂ ਦੀ ਤੁਲਨਾ',
'editundo' => 'ਵਾਪਸ(undo)',
'notitlematches' => 'ਕੋਈ ਪੇਜ ਟਾਇਟਲ ਨਹੀਂ ਮਿਲਦਾ',
'textmatches' => 'ਪੇਜ ਟੈਕਸਟ ਮਿਲਦਾ',
'notextmatches' => 'ਕੋਈ ਪੇਜ ਟੈਕਸਟ ਨਹੀਂ ਮਿਲਦਾ',
-'prevn' => 'ਪਿੱà¨\9bà©\87 {{PLURAL:$1|$1}}',
-'nextn' => 'à¨\85ੱà¨\97à©\87 {{PLURAL:$1|$1}}',
+'prevn' => 'ਪਿà¨\9bਲਾ {{PLURAL:$1|$1}}',
+'nextn' => 'à¨\85à¨\97ਲਾ {{PLURAL:$1|$1}}',
'prevn-title' => 'ਪਹਿਲਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
'nextn-title' => '↓
ਅਗਲਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
-'shown-title' => 'ਪà©\8dਰਤà©\80 ਪà©\87à¨\9c਼ $1 {{PLURAL:$1|ਨਤà©\80à¨\9cਾ|ਨਤà©\80à¨\9cà©\87}} ਵà©\87ਖਾਓ',
+'shown-title' => 'ਪà©\8dਰਤà©\80 ਸਫ਼ਾ $1 {{PLURAL:$1|ਨਤà©\80à¨\9cਾ|ਨਤà©\80à¨\9cà©\87}} ਵਿਖਾਓ',
'viewprevnext' => 'ਵੇਖੋ ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''ਇਸ ਵਿਕਿ ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਇਕ ਸਫ਼ਾ ਹੈ'''",
-'searchmenu-new' => "'''à¨\87ਸ ਵਿà¨\95ਿ ਪਰ \"[[:\$1]]\" ਨਾਮ ਨਾਲ ਪੰਨਾ ਬਣਾਓ!'''",
+'searchmenu-new' => "'''à¨\87ਸ ਵਿà¨\95à©\80 ਤà©\87 \"[[:\$1]]\" ਨਾਮ ਨਾਲ ਸਫ਼ਾ ਬਣਾਓ!'''",
'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
'searchprofile-articles' => 'ਸਮੱਗਰੀ ਪੇਜ',
'searchprofile-project' => 'ਮੱਦਦ ਅਤੇ ਪ੍ਰੋਜੈਕਟ ਸਫ਼ੇ',
'searchprofile-images' => 'ਮਲਟੀਮੀਡਿਆ',
-'searchprofile-everything' => 'ਹਰ à¨\9aà©\80à¨\9c਼',
+'searchprofile-everything' => 'ਸਠà¨\95à©\81à¨\9d',
'searchprofile-advanced' => 'ਤਕਨੀਕੀ',
'searchprofile-articles-tooltip' => "$1 'ਚ ਖੋਜ",
'searchprofile-project-tooltip' => "$1 'ਚ ਖੋਜ",
'search-mwsuggest-disabled' => 'ਕੋਈ ਸੁਝਾਅ ਨਹੀਂ',
'searchrelated' => 'ਸੰਬੰਧਿਤ',
'searchall' => 'ਸਭ',
-'search-nonefound' => 'ਤà©\81ਹਾਡà©\80 à¨\96à©\8bà¨\9c ਨਾਲ ਮà©\87ਲ à¨\96ਾà¨\82ਦà©\87 à¨\95à©\8bà¨\88 ਸਿੱà¨\9fੇ ਨਹੀਂ ਮਿਲੇ।',
+'search-nonefound' => 'ਤà©\81ਹਾਡà©\80 à¨\96à©\8bà¨\9c ਨਾਲ ਮà©\87ਲ à¨\96ਾà¨\82ਦà©\87 à¨\95à©\8bà¨\88 ਨਤà©\80à¨\9cੇ ਨਹੀਂ ਮਿਲੇ।',
'powersearch' => 'ਖੋਜ',
'powersearch-legend' => 'ਤਕਨੀਕੀ ਖੋਜ',
'powersearch-ns' => 'ਨੇਮ-ਸਪੇਸ ਵਿੱਚ ਖੋਜ:',
'rcshowhideanons' => '$1 ਅਗਿਆਤ ਯੂਜ਼ਰ',
'rcshowhidemine' => '$1 ਮੇਰਾ ਐਡਿਟ',
'rclinks' => 'ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿਚ ਹੋਏ $1 ਬਦਲਾਅ ਦਿਖਾਓ<br />$3',
-'diff' => 'à¨\85ੰਤਰ',
+'diff' => 'ਫ਼ਰà¨\95',
'hist' => 'ਅਤੀਤ',
-'hide' => 'à¨\93ਹਲà©\87',
+'hide' => 'à¨\9bà©\81ਪਾà¨\93',
'show' => 'ਵੇਖੋ',
'minoreditletter' => 'ਛ',
'newpageletter' => 'ਨ',
'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
'recentchangeslinked-title' => '"$1" ਨਾਲ ਸੰਬੰਧਿਤ ਬਦਲਾਅ',
'recentchangeslinked-noresult' => 'ਜੁੜੇ ਹੋਏ ਸਫਿਆਂ ਤੇ ,ਦਿੱਤੇ ਸਮੇਂ ਵਿਚ ਕੁਝ ਨਹੀਂ ਬਦਲਿਆ ।',
-'recentchangeslinked-summary' => 'à¨\87ਹ ਸà©\82à¨\9aà©\80 à¨\8aਨà©\8dਹਾà¨\82 ਪੰਨਿà¨\86à¨\82 ,à¨\9cà©\8b à¨\87à¨\95 à¨\96ਾਸ ਪੰਨà©\87 ਨਾਲ ਸੰਬੰਧਿਤ ਹਨ, (ਯਾ à¨\95ਿਸà©\87 à¨\96ਾਸ ਸ਼à©\8dਰà©\87ਣà©\80 ਦà©\87 ਮà©\88à¨\82ਬਰਾà¨\82) ਦà©\87 ਹਾਲ ਵਿà¨\9a ਹà©\8bà¨\8f ਬਦਲਾਵਾà¨\82 ਨà©\82à©° ਦਰਸ਼ਾà¨\82ਦà©\80 ਹà©\88 [[Special:Watchlist|ਤà©\81ਹਾਡà©\80 ਦà©\8dਰਿਸ਼à¨\9fà©\80 à¨\97à©\8bà¨\9aਰ ਸà©\82à¨\9aà©\80]] ਵਿà¨\9a ਮà©\8cà¨\9cà©\82ਦ ਪੰਨà©\87 ਮà©\8bà¨\9fà©\87 à¨\85ਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
+'recentchangeslinked-summary' => 'à¨\87ਹ ਲਿਸà¨\9f à¨\87à¨\95 à¨\96਼ਾਸ ਸਫ਼à©\87 ਨਾਲ ਸਬੰਧਿਤ ਸਫ਼ਿà¨\86à¨\82 à¨\9cਾà¨\82 à¨\95ਿਸà©\87 à¨\96਼ਾਸ ਸ਼à©\8dਰà©\87ਣà©\80 ਦà©\87 ਮà©\88à¨\82ਬਰਾà¨\82 ਦà©\87 ਹਾਲ ਵਿà¨\9a ਹà©\8bà¨\8f ਬਦਲਾਵਾà¨\82 ਨà©\82à©° ਦਰਸਾà¨\82à¨\89ਦà©\80 ਹà©\88। [[Special:Watchlist|ਤà©\81ਹਾਡà©\80 ਵਾà¨\9a-ਲਿਸà¨\9f]] ਵਿà¨\9a ਮà©\8cà¨\9cà©\82ਦ ਸਫ਼à©\87 ਮà©\8bà¨\9fà©\87 à¨\85ੱਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
'recentchangeslinked-page' => 'ਸਫ਼ਾ ਨਾਂ:',
'recentchangeslinked-to' => 'ਇਸ ਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
'filehist-filesize' => 'ਫਾਇਲ ਆਕਾਰ',
'filehist-comment' => 'ਟਿੱਪਣੀ',
'imagelinks' => 'ਫ਼ਾਈਲ ਦੀ ਵਰਤੌਂ',
-'linkstoimage' => 'ਹà©\87ਠਲਿà¨\96ਿਤ {{PLURAL:$1|ਪੰਨà©\87 ਦਾ ਹਵਾਲਾ ਹà©\88|$1 ਪੰਨà©\87 ਦà©\87 ਹਵਾਲà©\87 ਹਨ}} to this file:',
+'linkstoimage' => 'à¨\87ਹ {{PLURAL:$1|ਸਫ਼à©\87 ਦà©\87 ਲਿੰà¨\95|$1 ਸਫ਼à©\87}} à¨\87ਸ ਫ਼ਾà¨\88ਲ ਨਾਲ਼ à¨\9cà©\8bà©\9cਦà©\87 ਹਨà©\87:',
'nolinkstoimage' => 'ਇਸ ਮਿਸਲ ਨਾਲ ਕੋਈ ਵਿ ਸਫ਼ੇ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ ।',
-'sharedupload-desc-here' => 'à¨\87ਹ ਮਿਸਲ $1 ਦà©\80 ਹà©\88 à¨\85ਤà©\87 ਹà©\8bਰ ਪà©\8dਰਾà¨\9cà©\88à¨\95à¨\9fਾà¨\82 ਵਿà¨\9a ਵà©\80 ਵਰਤà©\80 à¨\9cਾ ਸà¨\95ਦà©\80 ਹà©\88 । à¨\87ਸ ਦà©\87 [$2 ਮਿਸਲ ਵਾਲà©\87 ਬà©\8dਰਿਤਾà¨\82ਤ ਪੰਨà©\87] ਵਿà¨\9a ਮà©\8cà¨\9cà©\82ਦ ਵਰਨਣ ਨਿਮਨ ਲਿà¨\96ਿਤ ਹੈ।',
+'sharedupload-desc-here' => 'à¨\87ਹ ਫ਼ਾà¨\88ਲ $1 ਦà©\80 ਹà©\88 à¨\85ਤà©\87 ਹà©\8bਰ ਪà©\8dਰਾà¨\9cà©\88à¨\95à¨\9fਾà¨\82 ਵਿà¨\9a ਵà©\80 ਵਰਤà©\80 à¨\9cਾ ਸà¨\95ਦà©\80 ਹà©\88 । à¨\87ਸ [$2 ਫ਼ਾà¨\88ਲ ਦà©\87 ਵà©\87ਰਵਾ ਸਫ਼à©\87] ਵਿà¨\9a ਮà©\8cà¨\9cà©\82ਦ ਵà©\87ਰਵਾ ਹà©\87ਠਦਿਸ ਰਿਹਾ ਹੈ।',
'uploadnewversion-linktext' => 'ਇਸ ਫਾਇਲ ਦਾ ਇੱਕ ਨਵਾਂ ਵਰਜਨ ਅੱਪਲੋਡ ਕਰੋ',
# File reversion
'mywatchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
'watchlistfor2' => '$1 $2 ਲਈ',
'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
-'watch' => 'ਵਾà¨\9a',
+'watch' => 'ਨਿà¨\97ਰਾਨà©\80 ਰੱà¨\96à©\8b',
'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
'unwatch' => 'ਅਣ-ਵਾਚ',
'wlshowlast' => 'ਆਖਰੀ $1 ਦਿਨ $2 ਘੰਟੇ $3 ਵੇਖੋ',
# Undelete
'undeletebtn' => 'ਰੀਸਟੋਰ',
-'undeletelink' => 'ਵà©\87à¨\96à©\8b/ਰà©\80ਸà¨\9fà©\8bਰ',
-'undeleteviewlink' => 'ਦੇਖੋ',
+'undeletelink' => 'ਵà©\87à¨\96à©\8b/ਵਾਪਸ ਲਿà¨\86à¨\93',
+'undeleteviewlink' => 'ਵੇਖੋ',
'undeletereset' => 'ਰੀ-ਸੈੱਟ',
'undeletecomment' => 'ਟਿੱਪਣੀ:',
'undelete-show-file-submit' => 'ਹਾਂ',
'sp-contributions-submit' => 'ਖੋਜ',
# What links here
-'whatlinkshere' => 'à¨\87ੱਥà©\87 à¨\95ਿਹà©\9cà©\87 ਲਿੰà¨\95',
+'whatlinkshere' => 'à¨\95ਿਹà©\9cà©\87 (ਸਫ਼à©\87) à¨\87ੱਥà©\87 à¨\9cà©\8bà©\9cਦà©\87 ਹਨ',
'whatlinkshere-title' => '$1 ਨਾਲ ਜੁੜੇ ਹੋਏ ਪੰਨੇ',
'whatlinkshere-page' => 'ਸਫਾ:',
'linkshere' => "ਹੇਠ ਦਿੱਤੇ ਪੰਨੇ '''[[:$1]]''' ਨਾਲ ਜੋੜਦੇ ਹਨ।",
'ipbreasonotherlist' => 'ਹੋਰ ਕਾਰਨ',
'ipbsubmit' => 'ਇਹ ਯੂਜ਼ਰ ਲਈ ਪਾਬੰਦੀ',
'ipbother' => 'ਹੋਰ ਟਾਈਮ:',
-'ipboptions' => '੨ à¨\98à¨\82à¨\9fà©\87:2 hours, ੧ ਦਿਨ:1 day, à©© ਦਿਨ:3 days, ੧ ਹਫà©\8dਤਾ:1 week, ੨ ਹਫà©\8dਤੇ:2 weeks, ੧ ਮਹੀਨਾ:1 month, ੩ ਮਹੀਨੇ:3 months, ੬ ਮਹੀਨੇ:6 months, ੧ ਸਾਲ:1 year, ਹਮੇਸ਼ਾ ਲਈ:infinite',
+'ipboptions' => '੨ à¨\98à©°à¨\9fà©\87:2 hours, ੧ ਦਿਨ:1 day, à©© ਦਿਨ:3 days, ੧ ਹਫ਼ਤਾ:1 week, ੨ ਹਫ਼ਤੇ:2 weeks, ੧ ਮਹੀਨਾ:1 month, ੩ ਮਹੀਨੇ:3 months, ੬ ਮਹੀਨੇ:6 months, ੧ ਸਾਲ:1 year, ਹਮੇਸ਼ਾ ਲਈ:infinite',
'ipbotheroption' => 'ਹੋਰ',
'ipbotherreason' => 'ਹੋਰ/ਆਮ ਕਾਰਨ:',
'badipaddress' => 'ਗਲਤ IP ਐਡਰੈੱਸ',
'expiringblock' => '$1 $2 ਮਿਆਦ ਖਤਮ',
'anononlyblock' => 'anon. ਹੀ',
'emailblock' => 'ਈਮੇਲ ਬਲਾਕ ਹੈ',
-'blocklink' => 'ਬਲਾà¨\95',
-'unblocklink' => 'à¨\85ਣ-ਬਲਾà¨\95',
+'blocklink' => 'ਰà©\8bà¨\95 ਲਾà¨\93',
+'unblocklink' => 'ਰà©\8bà¨\95 ਰੱਦ à¨\95ਰà©\8b',
'change-blocklink' => 'ਬਲਾਕ ਬਦਲੋ',
'contribslink' => 'ਯੋਗਦਾਨ',
'unblocklogentry' => '$1 ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਈ',
'movedto' => 'ਮੂਵ ਕੀਤਾ',
'movelogpage' => 'ਮੂਵ ਲਾਗ',
'movereason' => 'ਕਾਰਨ:',
-'revertmove' => 'ਰà©\80ਵਰà¨\9f',
+'revertmove' => 'ਰੱਦ à¨\95ਰà©\8b',
'delete_and_move' => 'ਹਟਾਓ ਅਤੇ ਮੂਵ ਕਰੋ',
# Export
'import-logentry-upload-detail' => '$1 ਰੀਵਿਜ਼ਨ',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'ਤà©\81ਹਾਡਾ ਯà©\82à¨\9c਼ਰ ਸਫ਼ਾ',
-'tooltip-pt-mytalk' => 'ਤà©\81ਹਾਡਾ à¨\9aਰà¨\9aਾ ਪà©\87à¨\9c',
+'tooltip-pt-userpage' => 'ਤà©\81ਹਾਡਾ ਮà©\88à¨\82ਬਰ ਸਫ਼ਾ',
+'tooltip-pt-mytalk' => 'ਤà©\81ਹਾਡਾ à¨\9aਰà¨\9aਾ ਸਫ਼ਾ',
'tooltip-pt-preferences' => 'ਮੇਰੀ ਪਸੰਦ',
-'tooltip-pt-watchlist' => 'ਤà©\81ਹਾਡà©\87 ਵਿà¨\9aਾਰ à¨\97à©\8bà¨\9aਰà©\87 ਰੱà¨\96à©\87 ਪੰਨਿà¨\86à¨\82 ਦਿ ਸà©\82à¨\9aà©\80।',
+'tooltip-pt-watchlist' => 'ਤà©\81ਹਾਡà©\87 ਵਿà¨\9aਾਰ à¨\97à©\8bà¨\9aਰà©\87 ਰੱà¨\96à©\87 ਸਫ਼ਿà¨\86à¨\82 ਦà©\80 ਲਿਸà¨\9f',
'tooltip-pt-mycontris' => 'ਮੇਰੇ ਯੋਗਦਾਨ ਦੀ ਲਿਸਟ',
'tooltip-pt-login' => 'ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਉਤਸ਼ਾਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਪਰ ਇਹ ਲਾਜ਼ਮੀ ਨਹੀਂ ਹੈ',
'tooltip-pt-logout' => 'ਲਾਗ ਆਉਟ',
'tooltip-ca-talk' => 'ਸਮਗੱਰੀ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ',
-'tooltip-ca-edit' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਹ ਸਫ਼ਾ ਸà©\8bਧ ਸà¨\95ਦà©\87 ਹà©\8b। ਸੰà¨à¨¾à¨²à¨£ ਤà©\8bà¨\82 ਪਹਿਲਾà¨\82 à¨\9dਲà¨\95 ਬà¨\9fਨ ਵਰਤ à¨\95à©\87 ਵà©\87à¨\96à©\8b à¨\9cà©\80',
+'tooltip-ca-edit' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਹ ਸਫ਼ਾ ਸà©\8bਧ ਸà¨\95ਦà©\87 ਹà©\8b। ਮਿਹਰਬਾਨà©\80 à¨\95ਰà¨\95à©\87 ਸੰà¨à¨¾à¨²à¨£ ਤà©\8bà¨\82 ਪਹਿਲਾà¨\82 à¨\9dਲà¨\95 ਬà¨\9fਨ ਵਰਤà©\8b।',
'tooltip-ca-addsection' => 'ਨਵਾਂ ਖੰਡ ਸ਼ੁ੍ਰੂ ਕਰੋ',
-'tooltip-ca-viewsource' => 'à¨\87ਹ ਪà©\87à¨\9c਼ ਸੁਰੱਖਿਅਤ ਹੈ।
-ਤੁਸੀਂ ਇਸ ਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।',
+'tooltip-ca-viewsource' => 'à¨\87ਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਹੈ।
+ਤੁਸੀਂ ਇਸਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।',
'tooltip-ca-history' => 'ਇਹ ਸਫ਼ੇ ਦਾ ਪਿਛਲਾ ਰੀਵਿਜ਼ਨ',
'tooltip-ca-protect' => 'ਇਹ ਪੇਜ ਸੁਰੱਖਿਅਤ ਬਣਾਓ',
'tooltip-ca-delete' => 'ਇਹ ਪੇਜ ਹਟਾਓ',
'tooltip-ca-move' => 'ਇਹ ਪੇਜ ਭੇਜੋ',
-'tooltip-ca-watch' => "ਇਹ ਸਫ਼ੇ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ 'ਚੋਂ ਹਟਾਓ",
+'tooltip-ca-watch' => 'ਇਹ ਸਫ਼ਾ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ ਵਿਚ ਸ਼ਾਮਲ ਕਰੋ',
'tooltip-ca-unwatch' => 'ਇਹ ਸਫ਼ਾ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ ਤੋਂ ਹਟਾਓ',
'tooltip-search' => 'ਖੋਜ {{SITENAME}}',
'tooltip-search-go' => 'ਠੀਕ ਇਹ ਨਾਂ ਵਾਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਉ, ਜੇ ਮੌਜੂਦ ਹੈ',
-'tooltip-search-fulltext' => 'à¨\87ਸ à¨\9fà©\88à¨\95ਸà¨\9f ਲਈ ਸਫ਼ਿਆਂ ਦੀ ਖੋਜ।',
-'tooltip-p-logo' => 'ਮà©\81ੱà¨\96 ਪà©\87à¨\9c',
-'tooltip-n-mainpage' => 'ਮà©\81ੱà¨\96 ਪà©\87à¨\9c ਖੋਲ੍ਹੋ',
+'tooltip-search-fulltext' => 'à¨\87ਸ ਲਿà¨\96ਤ ਲਈ ਸਫ਼ਿਆਂ ਦੀ ਖੋਜ।',
+'tooltip-p-logo' => 'ਮà©\81ੱà¨\96 ਸਫ਼ਾ',
+'tooltip-n-mainpage' => 'ਮà©\81ੱà¨\96 ਸਫ਼ਾ ਖੋਲ੍ਹੋ',
'tooltip-n-mainpage-description' => 'ਮੁੱਖ ਪੇਜ਼ ਉੱਤੇ ਜਾਓ',
'tooltip-n-portal' => 'ਪਰੋਜੈਕਟ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭ ਸਕਦੇ ਹੋ',
'tooltip-n-currentevents' => 'ਮੌਜੂਦਾ ਸਮਾਗਮ ਬਾਰੇ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਲੱਭੋ',
'tooltip-n-recentchanges' => 'ਵਿਕਿ ਵਿੱਚ ਤਾਜ਼ਾ ਬਦਲਾਅ ਦੀ ਲਿਸਟ',
'tooltip-n-randompage' => 'ਇੱਕ ਰਲਵਾਂ ਪੇਜ ਲੋਡ ਕਰੋ',
'tooltip-n-help' => 'ਖੋਜਣ ਲਈ ਥਾਂ',
-'tooltip-t-whatlinkshere' => 'ਸਠਵਿà¨\95ਿ ਸਫ਼ਿà¨\86à¨\82 ਦà©\80 ਲਿਸà¨\9f, à¨\9cà©\8b à¨\87ੱਥà©\87 ਲਿੰà¨\95 à¨\95à©\80ਤੇ ਹਨ',
-'tooltip-t-recentchangeslinked' => 'à¨\87ਹ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ ਵਿੱਚ ਤਾਜ਼ਾ ਬਦਲਾਅ',
-'tooltip-feed-atom' => 'à¨\87ਸ ਪੰਨੇ ਦੀ ਐਟਮ ਫ਼ੀਡ',
+'tooltip-t-whatlinkshere' => 'ਵਿà¨\95à©\80 ਦà©\87 ਸਾਰà©\87 ਸਫ਼ਿà¨\86à¨\82 ਦà©\80 ਲਿਸà¨\9f, à¨\9cà©\8b à¨\87ੱਥà©\87 à¨\9cà©\8bà©\9cਦੇ ਹਨ',
+'tooltip-t-recentchangeslinked' => 'à¨\87ਸ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ ਵਿੱਚ ਤਾਜ਼ਾ ਬਦਲਾਅ',
+'tooltip-feed-atom' => 'à¨\87ਸ ਸਫ਼ੇ ਦੀ ਐਟਮ ਫ਼ੀਡ',
'tooltip-t-contributions' => 'ਇਸ ਮੈਂਬਰ ਦਾ ਯੋਗਦਾਨ ਦਿਖਾਓ',
'tooltip-t-emailuser' => 'ਇਹ ਯੂਜ਼ਰ ਨੂੰ ਮੇਲ ਭੇਜੋ',
'tooltip-t-upload' => 'ਚਿੱਤਰ ਜਾਂ ਮੀਡਿਆ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ',
-'tooltip-t-specialpages' => 'ਸਠà¨\96ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ',
+'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96਼ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ',
'tooltip-t-print' => 'ਇਹ ਸਫ਼ੇ ਦਾ ਛਪਣਯੋਗ ਵਰਜਨ',
'tooltip-t-permalink' => 'ਸਫ਼ੇ ਦੇ ਇਹ ਰੀਵਿਜ਼ਨ ਲਈ ਪੱਕੇ ਲਿੰਕ',
-'tooltip-ca-nstab-main' => 'ਸਮà¨\97ੱਰà©\80 ਪà©\87à¨\9c ਵੇਖੋ',
+'tooltip-ca-nstab-main' => 'ਸਮੱà¨\97ਰà©\80 ਸਫ਼ਾ ਵੇਖੋ',
'tooltip-ca-nstab-user' => 'ਯੂਜ਼ਰ ਪੇਜ ਵੇਖੋ',
'tooltip-ca-nstab-media' => 'ਮੀਡਿਆ ਪੇਜ ਵੇਖੋ',
'tooltip-ca-nstab-special' => 'ਇਹ ਖਾਸ ਸਫ਼ਾ ਹੈ, ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਨੂੰ ਸੋਧ ਨਹੀਂ ਸਕਦੇ ਹੋ',
'tooltip-ca-nstab-help' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
'tooltip-ca-nstab-category' => 'ਕੈਟਾਗਰੀ ਪੇਜ ਵੇਖੋ',
'tooltip-minoredit' => 'ਇਸ ਤੇ ਛੋਟੇ ਬਦਲਾਅ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
-'tooltip-save' => 'ਆਪਣੇ ਬਦਲਾਅ ਸੰਭਾਲੋ',
+'tooltip-save' => 'à¨\86ਪਣà©\87 ਬਦਲਾà¨\85 ਸੰà¨à¨¾à¨²à¨¼à©\8b',
'tooltip-preview' => 'ਆਪਣੇ ਬਦਲਾਅ ਦੀ ਝਲਕ ਵੇਖੋ, ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ ਜੀ!',
'tooltip-diff' => 'ਇਸ ਪਾਠ ਵਿਚ ਆਪਣੇ ਕੀਤੇ ਹੋਏ ਬਦਲਾਅ ਦੇਖੋ',
'tooltip-compareselectedversions' => 'ਇਸ ਪੰਨੇ ਦੇ ਚੁਣੇ ਹੋਏ ਸ਼ੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਦੇਖੋ',
'tooltip-rollback' => "'' ਵਾਪਸ ਲੈ ਜਾਓ '' ਇਕ ਝਟਕੇ ਵਿਚ ਹੀ ਪਿਛਲੇ ਯੂਜ਼ਰ ਦੇ ਬਦਲਾਵਾਂ ਨੂੰ ਗਾਇਬ ਕਰ ਦੇਂਦਾ ਹੈ।",
'tooltip-undo' => '" ਪੁਰਾਣੀ ਹਾਲਤ ਵਿਚ ਪਰਤੋ " ਇਸ ਬਦਲਾਅ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੰਪਾਦਨ ਫਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਖਾਂਦਾ ਹੈ।
ਇਸ ਦਵਾਰਾ ਸਾਰ ਵਿਚ ਪੁਰਾਣੇ ਹਾਲਤ ਵਿਚ ਪਰਤਣ ਦਾ ਕਾਰਨ ਲਿਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।',
-'tooltip-summary' => 'ਇਕ ਸੰਖੇਪ ਖੁਲਾਸਾ ਦਰਜ ਕਰੋ',
+'tooltip-summary' => 'à¨\87à¨\95 ਸੰà¨\96à©\87ਪ à¨\96਼à©\81ਲਾਸਾ ਦਰà¨\9c à¨\95ਰà©\8b',
# Attribution
'others' => 'ਹੋਰ',
'version' => 'ਵਰਜਨ',
# Special:SpecialPages
-'specialpages' => 'à¨\96ਾਸ ਪà©\87à¨\9c',
+'specialpages' => 'à¨\96਼ਾਸ ਸਫ਼à©\87',
'specialpages-group-login' => 'ਲਾਗ ਇਨ / ਅਕਾਊਂਟ ਬਣਾਓ',
# Special:BlankPage
'remembermypassword' => 'A check box in [[Special:UserLogin]]
{{Identical|Remember my login on this computer}}',
+'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg|nav-login-createaccount}} is shown there).
'http-invalid-scheme' => 'The message appears in the Mediawiki code as follows:
if ( $this->parsedUrl[\'scheme\'] != \'http\' ) {
- $this->status->fatal( \'http-invalid-scheme\', $this->parsedUrl[\'scheme\'] );
+ $this->status->fatal( \'http-invalid-scheme\', $this->parsedUrl[\'scheme\'] );
}
Siebrand think this has to do with allowing MediaWiki to fetch remote URLs, and in that not allowing anything but "http://" request. So if this for example is "irc://" or "https://", $1 would be "irc" or "https" respectively.
'rollback_short' => '{{Identical|Rollback}}',
'rollbacklink' => '{{Identical|Rollback}}
This message has a tooltip {{msg-mw|tooltip-rollback}}',
+'rollbacklinkcount' => 'Text of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.
+* $1: the number of edits that will be rollbacked. If $1 is over the value of $wgShowRollbackEditCount (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.',
+'rollbacklinkcount-morethan' => 'Text of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.
+
+When the number of edits rolled back is smaller than [[mw:Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.',
'rollbackfailed' => '{{Identical|Rollback}}',
'cantrollback' => '{{Identical|Revert}}
{{Identical|Rollback}}',
'rollback' => 'Откатить изменения',
'rollback_short' => 'Откат',
'rollbacklink' => 'откатить',
+'rollbacklinkcount' => 'откатить $1 {{PLURAL:$1|правку|правки|правок}}',
+'rollbacklinkcount-morethan' => 'откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}',
'rollbackfailed' => 'Ошибка при совершении отката',
'cantrollback' => 'Невозможно откатить изменения. Последний, кто вносил изменения, является единственным автором этой страницы.',
'alreadyrolled' => 'Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),
सम्पर्कयतु एतम् [[Special:ListUsers/sysop|administrator]]',
'upload-misc-error' => 'अज्ञातः उत्तारणदोषः ।',
'upload-misc-error-text' => 'उत्तारणावसरे कश्चन अज्ञातदोषः उपगतः ।
-URL मान्यम् अभिगम्यं वेति परिशील्य पुनः यतताम् ।',
+URL मान्यम् अभिगम्यं वेति परिशील्य पुनः यतताम् ।[[Special:ListUsers/sysop|administrator]]',
'upload-too-many-redirects' => 'URL अधिकपुनर्निदेशान् अन्तर्गतम् ।',
'upload-unknown-size' => 'अज्ञात आकार',
'upload-http-error' => 'कश्चन HTTP दोषः उपगतः $1',
'backend-fail-connect' => '"$1" सङ्ग्राहागारन्ते सम्पर्कयितुं नैव शक्यते ।',
'backend-fail-internal' => '"$1"सङ्ग्रहागारन्ते अज्ञातदोषः उपगतः ।',
'backend-fail-contenttype' => '"$1"मध्ये सङ्ग्रहितुं सञ्चिकायाः प्रकारं निश्चिनोतुं नैव शक्यते ।',
+'backend-fail-batchsize' => '$1 संचिकायाः गणस्य निक्षेपावकाशः प्रदत्तः । {{PLURAL:$1|operation|operations}}; समयनिर्बन्धः $2 {{PLURAL:$2|operation|operations}}.',
+'backend-fail-usable' => 'अपर्यापानुमतिकारणेन अथवा निदेशिकायाः /आधानस्य अभावात् $1 सञ्चिकां लेखितुं न शक्यते ।',
+
+# File journal errors
+'filejournal-fail-dbconnect' => '"$1" निक्षेपार्थं मूलपाठपत्रिकां सम्पर्कयितुं न शक्यते ।',
+'filejournal-fail-dbquery' => '"$1"निक्षेपस्य कृते पत्रिकामूलपाठम् उन्नतीकर्तुं नैव शक्यते ।',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" इत्येतत् उद्घाटयितुं न शक्यते यतः एतत् कीलितं न ।',
+'lockmanager-fail-closelock' => '"$1" निमित्तं सञ्चिकाम् उद्घाटयितुं न शक्यते ।',
+'lockmanager-fail-deletelock' => '"$1"कृते कपाटितसञ्चिकाम् अपमर्जितुं न शक्यते ।',
+'lockmanager-fail-acquirelock' => '"$1"कपाटितुं न शक्यते ।',
+'lockmanager-fail-openlock' => '"$1" निमित्तं सञ्चिकाम् उद्घाटयितुं न शक्यते ।',
+'lockmanager-fail-releaselock' => '"$1"कपाटितुं न शक्यते ।',
+'lockmanager-fail-db-bucket' => ' $1 द्रेणपात्रे कपाटनीयमूलपाठाः अपर्याप्ताः सन्ति ।',
+'lockmanager-fail-db-release' => '$1 मूलपाठेषु कपाटिकाविमोचनं नैव शक्यते ।',
+'lockmanager-fail-svr-acquire' => '$1 वितारके कपाटिकायोजनं न शक्यते ।',
+'lockmanager-fail-svr-release' => '$1 मूलपाठेषु कपाटिकाविमोचनं नैव शक्यते ।',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'ZIP परिशीलनार्थम् उद्घाटनावसरे कश्चन दोषः सङ्गतः ।',
+'zip-wrong-format' => 'निश्चितसञ्चिका तु सञ्चिका ZIP नैव ।',
+'zip-bad' => 'ZIP सञ्चिका तु दूषिता अथवा अपठनीया अस्ति ।
+सुरक्षार्थं परिशीलयितुं न शक्यते ।',
+'zip-unsupported' => 'एषा सञिका तु मीडियाविकिना अननुमोदिता ZIP सञ्चिका अस्ति ।
+सुरक्षर्थं सम्यक् परिशील्या न भवति ।',
+
+# Special:UploadStash
+'uploadstash' => 'राशीः उत्तारयतु ।',
+'uploadstash-summary' => 'एतत्पुटम् उत्तारितसञ्चिकानां सम्पर्कं साधयति । विक्याम् एतानि प्रकाशितानि न । योजकः उत्तारितवानपि एताः सञ्चिकाः अदृश्याः सन्ति ।',
+'uploadstash-clear' => 'राशीकृतसञ्चिकाः विशदयतु ।',
+'uploadstash-nofiles' => 'भवान् सञ्चिकाः न राशीकृतवान् ।',
+'uploadstash-badtoken' => 'प्रक्रियाचरणं सफलम् । किन्तु प्रायः ते सम्पादनाधिकारः विनष्टः । पुनः यतताम् ।',
+'uploadstash-errclear' => 'सञ्चिकविशदनं सफलम् ।',
+'uploadstash-refresh' => 'सञ्चिकावलीं संस्करोतु ।',
+'invalid-chunk-offset' => 'अमान्यं चङ्क् आफ्सेट्',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'अभिगमनम् अपलपितम् ।',
+'img-auth-nopathinfo' => 'पथसूची विनष्टा ।
+ते वितारकः सूचनाः प्रेषयितुं संसिद्धः न ।
+एतत् CGI अवलम्बितं स्यात् अपि च img_auth अनुमोदनं न करोति ।
+See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => 'सुदृढितायाम् उत्तारणनिदेशिकायाम् अभ्यर्थितपथः नास्ति ।',
+'img-auth-badtitle' => '"$1"तः मान्यशीर्षिकां निर्मातुं न शक्यते ।',
+'img-auth-nologinnWL' => 'नामाभिलेखेन न प्रविष्टः अपिच $1 तु श्वेतावली न ।',
+'img-auth-nofile' => '"$1" इति सञ्चिका न वर्तते ।',
+'img-auth-isdir' => 'भवान् "$1"निदेशिकाम् अभिगन्तुं यतते ।
+सञ्चिकाभिगमनम् एव अनुमतम् ।',
+'img-auth-streaming' => '"$1"इत्यस्य प्रवाहिनी ।',
+'img-auth-public' => 'स्वायत्तविकितः सञ्चिकाः नेतुम् अयं कार्यक्रमः img_auth.php उपयुज्यते ।
+एषा विकिः सार्वजनिकविकिः इति दृढिता ।
+वैकल्पिकसुरक्षार्थं img_auth.php अपलपितः । ।',
+'img-auth-noread' => '"$1"पठने योजकस्य अभिगमनं नास्ति ।',
+'img-auth-bad-query-string' => ' URL मध्ये अमान्यं प्रश्नतन्तुः अस्ति ।',
+
+# HTTP errors
+'http-invalid-url' => ' $1 इति अमान्यम् URL ।',
+'http-invalid-scheme' => '"$1"योजनायुक्तं URLs नानुमोदितानि ।',
+'http-request-error' => ' अज्ञातदोषात् HTTP अभ्यर्थनं निष्पलम् ।',
+'http-read-error' => 'HTTP पठनदोषः।',
+'http-timed-out' => 'HTTP अभ्यर्थनं कालातीतम् ।',
+'http-curl-error' => 'दोषाहरणस्य URL: $1',
+'http-host-unreachable' => 'URL प्राप्तुं न शक्यते ।',
+'http-bad-status' => 'HTTP : $1 $2अभ्यर्थने समस्या आसीत् ।',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL प्राप्तुं न शक्यते ।',
+'upload-curl-error6-text' => 'उपपन्नं URL न प्राप्नोति ।
+द्विटङ्कनेन URLअदोषत्वं क्षेत्रं च परिशीलयतु ।',
+'upload-curl-error28' => 'उत्तारणस्य समयातीतः ।',
+'upload-curl-error28-text' => 'जालक्षेत्रेण प्रतिस्पन्दितुं दीर्घकालः आश्रितः ।
+जालक्षेत्रस्य जीवितं परिशीलयतु । अथवा कञ्चित्कालान्तरेण प्रयतताम् ।
+भवान् न्यूनकार्यव्यस्तकाले प्रयत्नं करोतु ।',
'license' => 'अनुमतिदानम्',
'license-header' => 'अनुमतिदानम्',
+'nolicense' => 'चियनं नास्ति ।',
+'license-nopreview' => 'पूर्वावलोकनं न मिलति ।',
+'upload_source_url' => '(मान्यं, प्रचारात्मकाभिगमनयुतं URL)',
+'upload_source_file' => ' (ते सङ्गणकस्य सञ्चिका)',
# Special:ListFiles
+'listfiles-summary' => 'एतद्विशेषपुटम् उत्तारितसञ्चिकाः प्रदर्शयति ।
+योजकेन शुद्धाः अतिनूतनं सञ्चिकाः केवलम् अत्र प्रदर्शयति ।',
+'listfiles_search_for' => 'माध्यमनामधेयार्थम् अन्विषतु ।',
'imgfile' => 'संचिका',
+'listfiles' => 'सञ्चिकावली ।',
+'listfiles_thumb' => 'अंगुष्ठनखाकारम् ।',
'listfiles_date' => 'दिनाङ्क',
'listfiles_name' => 'नामन्',
'listfiles_user' => 'योजक',
'file-anchor-link' => 'सञ्चिका',
'filehist' => 'सञ्चिकायाः इतिहासः',
'filehist-help' => 'सञ्चिका तत्समये कीदृशी आसीदिति द्रष्टुं दिनांकः/समयः नुद्यताम् ।',
+'filehist-deleteall' => 'सर्वान् परिमर्जतु ।',
'filehist-deleteone' => 'विलोप',
'filehist-revert' => 'प्रतिनिवर्त्यताम्',
'filehist-current' => 'सद्योजातम्',
'filehist-datetime' => 'दिनाङ्कः/समयः',
'filehist-thumb' => 'अंगुष्ठनखाकारम्',
'filehist-thumbtext' => '$1 समये विद्यमत्याः आवृत्तेः अंगुष्ठनखाकारम्',
+'filehist-nothumb' => 'अङ्गुष्टनखाकारकं नाश्ति ।',
'filehist-user' => 'योजकः',
'filehist-dimensions' => 'आयामाः',
+'filehist-filesize' => 'सञ्चिकाकारः ।',
'filehist-comment' => 'टिप्पणी',
+'filehist-missing' => 'सञ्चिका विनष्टा ।',
'imagelinks' => 'संचिका यत्र उपयुक्ता',
'linkstoimage' => '{{PLURAL:$1|अधोलिखितं पृष्ठं| अधोलिखितानि $1 पृष्ठाणि}} इदं संचिकां प्रति संबंधनं {{PLURAL:$1|करोति| कुर्वन्ति}}।',
+'linkstoimage-more' => '{{PLURAL:$1|$1}} तः अधिकपुटानि अस्यां सञ्चिकायां योज्यन्ते ।
+अधोनिदेशितसूची सञ्चिकाभिः योजनीयपुटानि पश्यति ।{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठ}}
+[[Special:WhatLinksHere/$2|पूर्णसूची]] अपि लभ्यते ।',
'nolinkstoimage' => 'एतद चित्रात् न पृष्ठा सम्बद्धं करोन्ति।',
+'morelinkstoimage' => ' [[Special:WhatLinksHere/$1|more links]] मध्ये सञ्चिकामवलोकयतु ।',
+'linkstoimage-redirect' => '$1 (सञ्चिका पुनर्निदेशिता) $2',
+'duplicatesoffile' => 'अधो निदेशितसञ्चिका द्विप्रतिः । {{PLURAL:$1|}} विशेषविवरणार्थम् अत्र प्रविशतु । [[Special:FileDuplicateSearch/$2|more details]]',
'sharedupload' => 'इयं संचिका $1 इत्यस्मादस्ति, एषा खलु अन्येष्वपि प्रकल्पेषु प्रयोक्तुं शक्यते।',
+'sharedupload-desc-there' => 'एषा सञ्चिका $1 तथा अन्यप्रकल्पेन च उपयुक्ता ।
+इत्योप्यतिशयसूचनार्थं $2 सञ्चिकाविवरणपुटं पश्यतु ।',
'sharedupload-desc-here' => 'एषा सञ्चिका $1 इत्यतः उद्धृता अन्यासु योजनासु उपयोगार्हा ।
अस्याः सञ्चिकायाः [$2 सञ्चिकाविवरणपृष्ठम्] इत्यत्र उपलभ्यमानं विवरणम् अधोलिखितं यथा ।',
+'sharedupload-desc-edit' => ' एषा सञ्चिका $1 इत्यतः उद्धृता अन्यासु योजनासु उपयोगार्हा ।
+अस्याः सञ्चिकायाः [$2 सञ्चिकाविवरणपृष्ठम्] इत्यत्र उपलभ्यमानं विवरणम् अधोलिखितं यथा ।',
+'sharedupload-desc-create' => 'एषा सञ्चिका $1 इत्यतः उद्धृता अन्यासु योजनासु उपयोगार्हा ।
+अस्याः सञ्चिकायाः [$2 सञ्चिकाविवरणपृष्ठम्] इत्यत्र उपलभ्यमानं विवरणम् अधोलिखितं यथा ।',
+'filepage-nofile' => 'अनेन नाम्ना कापि सञ्चिका न वर्तते ।',
+'filepage-nofile-link' => 'अनेन नाम्ना कापि सञ्चिका न वर्तते । $1 इत्येतत् उत्तारयितुं शक्नोति ।',
'uploadnewversion-linktext' => 'अस्य पृष्ठस्य नूतनाम् आवृत्तिं उद्भारयतु',
+'shared-repo-from' => '$1 इत्यस्मात् ।',
+'shared-repo' => 'विभक्तः कोशः ।',
# File reversion
+'filerevert' => '$1 अनुवर्तताम् ।',
+'filerevert-legend' => 'सञ्चिकाम् अनुवर्तताम् ।',
+'filerevert-intro' => "भवान् '''[[Media:$1|$1]]''' इति सञ्चिकायाः $4 इत्यवतरणं $3, $2 इति अनुवर्तमानः अस्ति ।",
'filerevert-comment' => 'कारणम् :',
+'filerevert-defaultcomment' => '$2 इत्येनं $1 समयस्य अवतरणम् अनुवृत्तम् ।',
+'filerevert-submit' => 'अनुवर्तताम् ।',
+'filerevert-success' => "'''[[Media:$1|$1]]''' इत्येनं $4 $2 को $3 समयावतरणम् अनुवृत्तम् ।",
+'filerevert-badversion' => 'दत्तसमये सन्देशदायिका सञ्चिका प्राचीनावतरणं नास्ति ।',
# File deletion
+'filedelete' => '$1 इत्येतत् अपमर्जतु ।',
+'filedelete-legend' => 'सञ्चिकाम् अपमर्जतु ।',
+'filedelete-intro' => "'''[[Media:$1|$1]]''' इति सञ्चिकायाः इतिहाससहितम् अपमर्जयन् अस्ति ।",
+'filedelete-intro-old' => "भवान्'''[[Media:$1|$1]]''' इत्यस्य [$4 $2 इत्येतयोः $3 कालस्य अवतरणम्] अपमार्जयन् अस्ति ।",
'filedelete-comment' => 'कारणम् :',
'filedelete-submit' => 'विलुप्यताम्',
+'filedelete-success' => "'''$1''' अपमर्जितम् ।",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' इत्यस्य $2 इत्येतत् $3 समयस्यावतरणम् अपमर्जितम् ।",
+'filedelete-nofile' => "'''$1''' न वर्तते ।",
+'filedelete-nofile-old' => "'''$1''' इत्यस्य भवता वर्णितविशेषतायुतम् अवतरणम् अत्र न वर्तते ।",
+'filedelete-otherreason' => 'अपरम्/अतिरिक्तं कारणम् :',
'filedelete-reason-otherlist' => 'अन्य कारणम्',
+'filedelete-reason-dropdown' => '* अपमर्जनस्य सामान्यं कारणम् ।
+** कृतिस्वाम्यस्य उल्लङ्घनम् ।
+** प्रतिकृता सञ्चिका ।',
+'filedelete-edit-reasonlist' => 'अपमार्जनकारणानि सम्पादयतु ।',
+'filedelete-maintenance' => 'सञ्चिकानाम् अपमर्जनम् अनमपमर्जनं च निर्वहणकाले तात्कालिकतया निष्क्रियौ ।',
+'filedelete-maintenance-title' => 'सञ्चिकाम् अपमर्जितुं न शक्यते ।',
# MIME search
+'mimesearch' => 'MIME अन्वेषणम् ।',
+'mimesearch-summary' => 'MIME-प्रकारानुसारं सञ्चिकान्वेषणार्थम् एतत्पुटम् उपयोक्तुं शाक्नोति ।
+इनपुट: सञ्चिकायाः प्रकारः/उपप्रकारः, उदाहरणम्. <tt>image/jpeg</tt>.',
+'mimetype' => 'MIME प्रकारः :',
'download' => 'डाउनलोड',
+# Unwatched pages
+'unwatchedpages' => 'अनवलोकितपुटानि ।',
+
+# List redirects
+'listredirects' => 'चालितानाम् अवली ।',
+
+# Unused templates
+'unusedtemplates' => 'अनुपयुक्ताः प्राकृतयः ।',
+'unusedtemplatestext' => 'अस्मिन् पुटे {{ns:template}} नामस्थानयुतानि सर्वपुटानि अन्तर्गतानि । यानि अन्यपुटेषु न सन्ति ।
+अस्य अपमर्जनात् पूर्वं सञ्चिकायाः अन्यानुबन्धान् परिशीलयतु ।',
+'unusedtemplateswlh' => 'अन्यानुबन्धाः ।',
+
# Random page
'randompage' => 'यादृच्छिकपृष्ठम्',
+'randompage-nopages' => 'अधोनिदेशितनामस्थाने पुटानि न सन्ति । {{PLURAL:$2| एतन्नमस्थाने}} नास्ति : $1।',
+
+# Random redirect
+'randomredirect' => 'यादृच्छिकचालनम् ।',
+'randomredirect-nopages' => '$1नामस्थाने चालनानि न सन्ति ।',
# Statistics
'statistics' => 'स्थितिगणितम्',
+'statistics-header-pages' => 'पुटसाङ्ख्यिकाः ।',
+'statistics-header-edits' => 'सङ्ख्यिकाः सम्पादयतु ।',
+'statistics-header-views' => 'साङ्ख्यिकाः अवलोकयतु ।',
+'statistics-header-users' => 'योजकसाङ्ख्यिकाः ।',
+'statistics-header-hooks' => 'अन्यसाङ्ख्यिकाः ।',
+'statistics-articles' => 'आधेयपुटानि ।',
'statistics-pages' => 'पृष्ठानि',
+'statistics-pages-desc' => 'अस्यां विक्यां तु सम्भाषाणपुटसहितानि अन्यसर्वपुटानि चालितानि ।',
'statistics-files' => 'उद्भारितसञ्चिकाः',
+'statistics-edits' => '{{SITENAME}} व्यवस्थापनपर्यन्तं पुटसम्पादनानि ।',
+'statistics-edits-average' => 'प्रतिपुटं माध्यसम्पादनानि ।',
+'statistics-views-total' => 'अवलोकनयोगः ।',
+'statistics-views-total-desc' => 'असंवृत्तपुटानाम् अवलोकनानि । अपि च विशेषपुटानि नान्तर्गतानि ।',
+'statistics-views-peredit' => 'प्रतिसम्पादनम् अवलोकनम् ।',
+'statistics-users' => 'पञ्जीकृतः [[Special:ListUsers|योजकः]]',
'statistics-users-active' => 'सक्रियाः सदस्याः',
+'statistics-users-active-desc' => 'गतेषु {{PLURAL:$1|day|$1 दिनेषु}} सक्रियाः योजकाः ।',
+'statistics-mostpopular' => 'अत्यवलोकितपुटानि ।',
+'disambiguations' => 'द्वैधीभावरहितपुटानाम् अनुबन्धितपुटानि ।',
'disambiguationspage' => 'Template:असन्दिग्धम्',
+'disambiguations-text' => 'अधो निदेशितपुटानि असन्धिग्धपुटेन अनुबन्धितानि ।
+एतानि यथार्थविषैः योजनीयानि । <br />
+यदि कोऽपि पुटेन प्रकृतिं प्रयोजयति यः [[MediaWiki:Disambiguationspage]] इत्यनेन अनुबद्धः ससन्दिग्धपुटम् इति उच्यते ।',
'doubleredirects' => 'दुगुनी-अनुप्रेषिते',
-
+'doubleredirectstext' => 'एतत्पुटं तेषां पुटानां सूची अस्ति यानि अन्यपुनर्निदेशितपुटानि प्रति पुनरिदेशितानि सन्ति ।
+प्रत्येकं पङ्क्तिः प्रथमद्वितीयपुनर्निदेशम् अन्तर्गता । द्वितीयपुनर्निदेशः लक्ष्यं यत् वास्तवं लक्ष्यपुटं प्रथमं प्रदर्शितम् ।
+अपि च प्रथमपुनर्निदेशः वास्तवेन एतदेवलक्षितं स्यात् । <del>काटी गई</del> प्रविष्टयः परिहृताः ।',
+'double-redirect-fixed-move' => '[[$1]] इत्यस्य स्थानं परिवर्तितम् ।
+इदानीम् [[$2]] इत्यस्य दिशि पुनर्निदिष्टम् अस्ति ।',
+'double-redirect-fixed-maintenance' => '[[$1]] तः [[$2]] पुनर्निदेशद्वयं निश्चिनोति ।',
+'double-redirect-fixer' => 'पुनर्निदेशस्य बन्धकः ।',
+
+'brokenredirects' => 'भग्नपुनर्निदेशाः ।',
+'brokenredirectstext' => 'अधो दत्तपुनर्निदेशाः अवृत्तपुटैः सह अनुबन्दं रक्षन्ति ।',
'brokenredirects-edit' => 'सम्पाद्यताम्',
'brokenredirects-delete' => 'विलुप्यताम्',
+'withoutinterwiki' => 'भाषानुबन्धरिहातानि पुटानि ।',
+'withoutinterwiki-summary' => 'अधस्थपुटानि अन्यभाषावतरणैः अनुबन्धं न कुर्वन्ति ।',
'withoutinterwiki-legend' => 'पूर्वोऽपपदम्',
'withoutinterwiki-submit' => 'दर्श्यताम्',
+'fewestrevisions' => 'न्यूनतमालोकनयुक्तपुटानि ।',
+
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|बैट्|बैट्स्}}',
+'ncategories' => '{{PLURAL:$1|वर्गः|वर्गाः }}',
+'nlinks' => '$1 {{PLURAL:$1|अनुबन्धः|अनुबन्धाः}}',
'nmembers' => '$1 {{PLURAL:$1|सदस्यः|सदस्याः}}',
+'nrevisions' => '$1 {{PLURAL:$1|पुनरावृत्तिः}}',
+'nviews' => '$1 {{PLURAL:$1|अनुबन्धः|अनुबन्धाः}}',
+'nimagelinks' => '$1 {{PLURAL:$1|पुटम्|पुटानि}} प्रयुक्तानि ।',
+'ntransclusions' => '$1 {{PLURAL:$1|पुटम्|पुटानि}} प्रयुक्तानि ।',
+'specialpage-empty' => 'अस्य वृत्तस्य परिणामः नास्ति ।',
+'lonelypages' => 'अनाथपुटानि ।',
+'lonelypagestext' => '{{SITENAME}} इत्यस्मिन् अधो निदेशितपुटानि नानुबद्धानि अथवा अन्तर्गतानि अन्यपुटेषु ।',
+'uncategorizedpages' => 'अवर्गीकृतपुटानि ।',
+'uncategorizedcategories' => 'अवर्गीकृताः वर्गाः ।',
+'uncategorizedimages' => 'अवर्गीकृताः सञ्चिकाः ।',
+'uncategorizedtemplates' => 'अवर्गीकृताः प्रकृतयः ।',
+'unusedcategories' => 'अनुपयुक्ताः वर्गाः ।',
+'unusedimages' => 'अनुपयुक्तानि पुटाणी ।',
+'popularpages' => 'प्रसिद्धानि पुटानि ।',
+'wantedcategories' => 'आवश्यकाः वर्गाः ।',
+'wantedpages' => 'आवश्यकपुटानि ।',
+'wantedpages-badtitle' => '$1 परिणामनिरूपणे अमान्यशीर्षकम् ।',
+'wantedfiles' => 'आवश्यकाः सञ्चिकाः ।',
+'wantedfiletext-cat' => 'अधो दत्तसञ्चिकाः उपयुक्ताः किन्तु न वर्तन्ते । बाह्यकोशानां सञ्चिकाः उपस्थिताः इति एताः सूच्यां स्युः । एतादृशः कोपि सदोषप्रवेशः<del> अवरुद्धः</del> भवति । अपि च यत्पुटं तादृश्याः अनुपस्थितसञ्चिकायाः प्रयोगं कुर्वन्ति तासं सूची [[:$1]] मध्ये अस्ति ।',
+'wantedfiletext-nocat' => 'अधो दत्ताः सञ्चिकाः उपयुक्ताः किन्तु न वर्तन्ते । बाह्यकोशस्य सञ्चिकाः उपस्थिताः इति एताः सूच्यां स्युः । तदृशः कोऽपि सदोषप्रवेशः<del>struck out</del>. अत्र स्यात् ।',
+'wantedtemplates' => 'आवश्यकाः प्राकृतयः ।',
+'mostlinked' => 'अत्यनुबद्धानि पुटानि ।',
+'mostlinkedcategories' => 'वर्गैः सह अत्यनुबद्धाः ।',
+'mostlinkedtemplates' => 'प्राकृतिभिः अत्यनुबद्धाः ।',
+'mostcategories' => 'बहुवर्गयुक्तपुटानि ।',
+'mostimages' => 'अत्यनुबद्धानि पुटानि ।',
+'mostrevisions' => 'सर्वाधिकपुनरावृत्तियुक्तानि पुटानि ।',
'prefixindex' => 'उपसर्गयुक्तानि सर्वाणि पृष्ठानि',
+'prefixindex-namespace' => 'उपसर्गैः युक्तानि सर्वपुटानि । ($1 नामस्थानम्)',
+'shortpages' => 'ह्रस्वपुटानि',
'longpages' => 'दीर्घाणि पृष्ठानि',
+'deadendpages' => 'अन्तिमपुटानि ।',
+'deadendpagestext' => 'अधो निदेशितपुटानि {{SITENAME}} इत्यस्मिन् अन्यपुटैः अनुबद्धानि न ।',
+'protectedpages' => 'सुरक्षितानि पुतानि ।',
+'protectedpages-indef' => 'अनिर्दिष्टसुरक्षा केवलम् ।',
'listusers' => 'योजक सूचि',
'usercreated' => '$1 दिने $2 समये रचितम् योजकनाम $3',
'newpages' => 'नवीनपृष्ठम्',
);
/**
- * Aliases from the fallback language 'lt' to avoid breakage of links
- */
-
+ * Aliases from the fallback language 'lt' to avoid breakage of links
+ */
$namespaceAliases = array(
'Specialus' => NS_SPECIAL,
'Aptarimas' => NS_TALK,
'Kategorijos_aptarimas' => NS_CATEGORY_TALK,
);
+$namespaceGenderAliases = array();
+
$messages = array(
# User preference toggles
'tog-underline' => 'Pabrauktė nūruodas:',
'right-writeapi' => 'Uporaba napisanega API-ja',
'right-delete' => 'Brisanje strani',
'right-bigdelete' => 'Brisanje strani z obsežno zgodovino',
+'right-deletelogentry' => 'Brisanje in obnavljanje izbranih dnevniških vnosov',
'right-deleterevision' => 'Brisanje in obnova posebnih redakcij strani',
'right-deletedhistory' => 'Ogled zgodovine brisanja, brez besedila izbrisanih strani',
'right-deletedtext' => 'Ogled izbrisanega besedila in primerjava med izbrisanimi redakcijami',
'lockmanager-fail-releaselock' => 'Ne morem sprostiti zaklepa »$1«.',
'lockmanager-fail-db-bucket' => 'Ne morem kontaktirati zadostnega števila zaklenitvenih zbirk podatkov v vedru $1.',
'lockmanager-fail-db-release' => 'Ne morem sprostiti zaklepov zbirke podatkov $1.',
+'lockmanager-fail-svr-acquire' => 'Ne morem pridobiti zaklepov na strežniku $1.',
'lockmanager-fail-svr-release' => 'Ne morem sprostiti zaklepov strežnika $1.',
# ZipDirectoryReader
'rollback' => 'Vrni spremembe',
'rollback_short' => 'Vrni',
'rollbacklink' => 'vrni',
+'rollbacklinkcount' => 'vrni $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
+'rollbacklinkcount-morethan' => 'vrni več kot $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
'rollbackfailed' => 'Vrnitev ni uspela',
'cantrollback' => 'Urejanja ne morem vrniti; zadnji urejevalec je hkrati edini.',
'alreadyrolled' => 'Zadnje spremembe [[:$1]] uporabnika [[User:$2|$2]] ([[User talk:$2|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ne morem vrniti;
'duration-centuries' => '$1 {{PLURAL:$1|stoletje|stoletji|stoletja|stoletij}}',
'duration-millennia' => '$1 {{PLURAL:$1|tisočletje|tisočletji|tisočletja|tisočletij}}',
-# Unknown messages
-'lockmanager-fail-svr-acquire' => 'Ne morem pridobiti zaklepov na strežniku $1.',
);
'lockmanager-fail-releaselock' => 'Не могу да ослободим катанац за „$1“.',
'lockmanager-fail-db-bucket' => 'Не могу да контактирам с довољно катанаца у канти $1.',
'lockmanager-fail-db-release' => 'Не могу да ослободим катанце у бази $1.',
+'lockmanager-fail-svr-acquire' => 'Не могу да добијем катанце на серверу $1.',
'lockmanager-fail-svr-release' => 'Не могу да ослободим катанце на серверу $1.',
# ZipDirectoryReader
# New logging system
'logentry-delete-delete' => '$1 {{GENDER:|је обрисао|је обрисала|је обрисао}} $3',
'logentry-delete-restore' => '$1 {{GENDER:|је вратио|је вратила|је вратио}} страницу $3',
-'logentry-delete-event' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост {{PLURAL:$5|догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4',
+'logentry-delete-event' => '$1 {{GENDER:$2|је променио|је променила|је променио}} видљивост {{PLURAL:$5|догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4',
'logentry-delete-revision' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост {{PLURAL:$5|измене|$5 измене|$5 измена}} на страници $3: $4',
'logentry-delete-event-legacy' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост догађајâ у дневнику на $3',
'logentry-delete-revision-legacy' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост изменâ на страници $3',
'duration-centuries' => '$1 {{PLURAL:$1|век|века|векова}}',
'duration-millennia' => '$1 {{PLURAL:$1|миленијум|миленијума|миленијума}}',
-# Unknown messages
-'lockmanager-fail-svr-acquire' => 'Не могу да добијем катанце на серверу $1.',
);
'rollback' => 'Rulla tillbaka ändringar',
'rollback_short' => 'Återställning',
'rollbacklink' => 'rulla tillbaka',
+'rollbacklinkcount' => 'rulla tillbaka $1 {{PLURAL:$1|redigering|redigeringar}}',
+'rollbacklinkcount-morethan' => 'rulla tillbaka mer än $1 {{PLURAL:$1|redigering|redigeringar}}',
'rollbackfailed' => 'Tillbakarullning misslyckades',
'cantrollback' => 'Det gick inte att rulla tillbaka, då sidan endast redigerats av en användare.',
'alreadyrolled' => 'Det gick inte att rulla tillbaka den senaste redigeringen av [[User:$2|$2]] ([[User talk:$2|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) på sidan [[:$1|$1]]. Någon annan har redan rullat tillbaka eller redigerat sidan.
'nlinks' => '$1 {{PLURAL:$1|ugnay|mga ugnay}}',
'nmembers' => '$1 {{PLURAL:$1|kasapi|mga kasapi}}',
'nrevisions' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
-'nviews' => '$1 {{PLURAL:$1|nakita|mga nakikita}}',
+'nviews' => '$1 {{PLURAL:$1|pagtingin|mga pagtingin}}',
'nimagelinks' => 'Ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}',
'ntransclusions' => 'ginamit sa $1 {{plural:$1|pahina|mga pahina}}',
'specialpage-empty' => 'Walang resulta para sa ulat na ito.',
'rollback' => 'Mga pagbabagong may kaugnayan sa pagpapagulong na pabalik sa (mas) dati',
'rollback_short' => 'Pagulunging pabalik sa (mas) dati',
'rollbacklink' => 'pagulunging pabalik sa (mas) dati',
+'rollbacklinkcount' => 'pagulunging pabalik ang $1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
+'rollbacklinkcount-morethan' => 'pagulunging pabalik ang mahigit sa $1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
'rollbackfailed' => 'Nabigo ang pagpapagulong na pabalik sa (mas) dati',
'cantrollback' => 'Hindi maibalik ang pagbabago; tanging ang may-akda lamang ng pahinang ito ang huling tagapagambag/tagapaglathala.',
'alreadyrolled' => 'Hindi mapagulong na pabalik sa dati ang huling pagbabago ng [[$1]] ni ([[User talk:$2|Usapan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
'tog-hidepatrolled' => 'Son değişikliklerde gözden geçirilen düzenlemeleri gizle',
'tog-newpageshidepatrolled' => 'Kontrol edilmiş sayfaları yeni sayfalar listesinde gizle',
'tog-extendwatchlist' => 'İzleme listesini sadece son değil, tüm değişiklikleri görmek için genişlet',
-'tog-usenewrc' => 'Gelişmiş son değişiklikleri kullan (JavaScript gerekir)',
+'tog-usenewrc' => 'Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri gruplandırma (JavaScript gerektirir)',
'tog-numberheadings' => 'Başlıkları otomatik numaralandır',
'tog-showtoolbar' => 'Düzenleme yaparken araç çubuğunu göster (JavaScript gerekir)',
'tog-editondblclick' => 'Çift tıklayarak sayfayı düzenle (JavaScript gerekir)',
'tog-editsectiononrightclick' => 'Bölümleri bölüm başlığına sağ tıklayarak değiştirebilme olanağı ver (JavaScript)',
'tog-showtoc' => 'İçindekiler tablosunu göster (3 taneden fazla başlığı olan sayfalar için)',
'tog-rememberpassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
-'tog-watchcreations' => 'Oluşturmuş olduğum sayfaları izleme listeme ekle',
-'tog-watchdefault' => 'Değişiklik yapılan sayfayı izleme listesine ekle',
-'tog-watchmoves' => 'Taşıdığım sayfaları izleme listeme ekle',
-'tog-watchdeletion' => 'Sildiğim sayfaları izleme listeme ekle',
+'tog-watchcreations' => 'Açtığım sayfaları ve yüklediğim dosyaları izleme listeme ekle',
+'tog-watchdefault' => 'Düzenleme yaptığım sayfaları ve dosyaları izleme listeme ekle',
+'tog-watchmoves' => 'Taşıdığım sayfaları ve dosyaları izleme listeme ekle',
+'tog-watchdeletion' => 'Sildiğim sayfaları ve dosyaları izleme listeme ekle',
'tog-minordefault' => "Değişikliği 'küçük değişiklik' olarak seçili getir",
'tog-previewontop' => 'Önizlemeyi yazma alanın üstünde göster',
'tog-previewonfirst' => 'Değiştirmede önizlemeyi göster',
'tog-nocache' => 'Tarayıcı sayfalarını bellekleme',
-'tog-enotifwatchlistpages' => 'Sayfa değişikliklerinde bana e-posta gönder',
+'tog-enotifwatchlistpages' => 'İzleme listemdeki bir sayfanın ya da dosyanın değiştirilmesi durumunda bana e-posta gönder',
'tog-enotifusertalkpages' => 'Kullanıcı sayfamda değişiklik olduğunda bana e-posta gönder',
-'tog-enotifminoredits' => 'Sayfalardaki küçük değişikliklerde de bana e-posta gönder',
+'tog-enotifminoredits' => 'Sayfalardaki ve dosyalardaki küçük değişikliklerde bana e-posta gönder',
'tog-enotifrevealaddr' => 'E-posta adresimi bildiri postalarımda göster.',
'tog-shownumberswatching' => 'İzleyen kullanıcı sayısını göster',
'tog-oldsig' => 'Mevcut imza:',
'edithelp' => 'Nasıl değiştirilir?',
'edithelppage' => 'Help:Sayfa nasıl değiştirilir',
'helppage' => 'Help:İçindekiler',
-'mainpage' => 'Ana sayfa',
+'mainpage' => 'Ana Sayfa',
'mainpage-description' => 'Ana sayfa',
'policy-url' => 'Project:Politika',
'portal' => 'Topluluk portali',
'viewsourceold' => 'kaynağı gör',
'editlink' => 'değiştir',
'viewsourcelink' => 'kaynağı gör',
-'editsectionhint' => '$1 bölümünü değiştir',
+'editsectionhint' => 'Değiştirilen bölüm: $1',
'toc' => 'Konu başlıkları',
'showtoc' => 'göster',
'hidetoc' => 'gizle',
'cannotdelete' => '"$1" sayfa ya da dosyası silinemedi.
Başka bir kullanıcı tarafından silinmiş olabilir.',
'cannotdelete-title' => '"$1" sayfasını silemezsiniz',
+'delete-hook-aborted' => 'Silme işlemi kanca tarafından durduruldu.
+Hiçbir açıklama yapılmadı.',
'badtitle' => 'Geçersiz başlık',
'badtitletext' => 'Girilen sayfa adı ya hatalı ya boş ya da diller arası bağlantı veya vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.',
'perfcached' => 'Veriler daha önceden hazırlanmış olabilir. Bu sebeple güncel olmayabilir! A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
# Login and logout pages
'logouttext' => "'''Oturumu kapattınız.'''
-Şimdi kimliğinizi belirtmeksizin {{SITENAME}} sitesini kullanmaya devam edebilirsiniz ya da aynı kullanıcı adıyla ya da ister başka bir kullanıcı adıyla [[Special:UserLogin|yeniden oturum açabilirsiniz]].
+Şimdi anonim olarak {{SITENAME}} sitesini kullanmaya devam edebilirsiniz ya da aynı kullanıcı adıyla ya da ister başka bir kullanıcı adıyla [[Special:UserLogin|yeniden oturum açabilirsiniz]].
Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ oturumunuz açıkmış gibi görünebilir.",
'welcomecreation' => '== Hoş geldin, $1! ==
Çerezlerin açık olduğundan emin olun ve bu sayfayı yeniden yükleyip tekrar deneyin.',
'noname' => 'Geçerli bir kullanıcı adı girmediniz.',
'loginsuccesstitle' => 'Oturum açıldı',
-'loginsuccess' => '{{SITENAME}} sitesinde "$1" kullanıcı adıyla oturum açmış bulunmaktasınız.',
+'loginsuccess' => "'''{{SITENAME}} üzerinde \"\$1\" kullanıcı adıyla oturum açtınız.'''",
'nosuchuser' => '"$1" adında bir kullanıcı bulunmamaktadır.
Kullanıcı adları büyük-küçük harf duyarlıdır.
Yazılışı kontrol edin veya [[Special:UserLogin/signup|yeni bir hesap açın]].',
'mailerror' => 'E-posta gönderim hatası: $1',
'acct_creation_throttle_hit' => 'Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son günde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.
Sonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.',
-'emailauthenticated' => 'E-posta adresiniz $2 $3 tarihinde doğrulanmıştı.',
+'emailauthenticated' => 'E-posta adresiniz $2 $3 tarihinde doğrulandı.',
'emailnotauthenticated' => 'E-posta adresiniz henüz onaylanmadı.
Aşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.',
'noemailprefs' => 'Bu özelliklerin çalışması için bir e-posta adresi belirtiniz.',
'invalidemailaddress' => 'Geçersiz bir formatta yazıldığından dolayı bu e-posta adresi kabul edilemez.
Lütfen geçerli bir formatta e-posta adresi yazın veya bu bölümü boş bırakın.',
'cannotchangeemail' => 'Hesabın e-posta adresi bu wiki üzerinden değiştirilemez.',
+'emaildisabled' => 'Bu siteden e-posta gönderemezsiniz.',
'accountcreated' => 'Hesap açıldı',
'accountcreatedtext' => '$1 için bir kullanıcı hesabı açıldı.',
'createaccount-title' => '{{SITENAME}} için yeni kullanıcı hesabı oluşturulması',
'prefs-beta' => 'Beta özellikleri',
'prefs-datetime' => 'Tarih ve saat',
'prefs-labs' => 'Lab özellikleri',
+'prefs-user-pages' => 'Kullanıcı sayfaları',
'prefs-personal' => 'Kullanıcı bilgileri',
'prefs-rc' => 'Son değişiklikler',
'prefs-watchlist' => 'İzleme listesi',
'prefs-help-watchlist-token' => 'Bu alanı gizli bir anahtarla doldurmak, izleme listeniz için bir RSS beslemesi oluşturur.
Bu alandaki anahtarı bilen herkes izleme listenizi okuyabilir, bu yüzden güvenli bir değer seçin.
Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
-'savedprefs' => 'Ayarlar kaydedildi.',
+'savedprefs' => 'Tercihleriniz kaydedildi.',
'timezonelegend' => 'Zaman dilimi:',
'localtime' => 'Yerel saat:',
'timezoneuseserverdefault' => 'Viki varsayılanını kullanın ($1)',
'backend-fail-opentemp' => 'Geçici dosya açılamadı.',
'backend-fail-closetemp' => 'Geçici dosya kapanamadı.',
'backend-fail-read' => '$1 dosyası okunamadı.',
-'backend-fail-create' => '$1 dosyası oluşturulamadı.',
+'backend-fail-create' => '$1 dosyası yazılamadı.',
# ZipDirectoryReader
'zip-file-open-error' => 'Dosya ZIP denetimleri için açılırken bir hata ile karşılaşıldı.',
'rollback' => 'Відкинути редагування',
'rollback_short' => 'Відкинути',
'rollbacklink' => 'відкинути',
+'rollbacklinkcount' => 'скасування $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
+'rollbacklinkcount-morethan' => 'скасування більш, ніж $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
'rollbackfailed' => 'Відкинути зміни не вдалося',
'cantrollback' => 'Неможливо відкинути редагування, останній, хто редагував, є єдиним автором цієї сторінки.',
'alreadyrolled' => 'Неможливо відкинути останні редагування [[:$1]], зроблені [[User:$2|$2]] ([[User talk:$2|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); хтось інший уже змінив чи відкинув редагування цієї статті.
'tog-editsectiononrightclick' => '启用右击段落标题编辑段落(需要JavaScript)',
'tog-showtoc' => '显示目录(对于有多于3个标题的页面)',
'tog-rememberpassword' => '在浏览器上记住我的登录状态(最长$1天)',
-'tog-watchcreations' => '添加我创建的页面至我的监视列表',
-'tog-watchdefault' => '添加我编辑的页面至我的监视列表',
+'tog-watchcreations' => '添加我创建的页面和上传的文件至我的监视列表',
+'tog-watchdefault' => '添加我编辑的页面和文件至我的监视列表',
'tog-watchmoves' => '将我移动的页面和文件添加到我的监视列表',
-'tog-watchdeletion' => '添加我删除的页面至我的监视列表',
+'tog-watchdeletion' => '添加我删除的页面和文件至我的监视列表',
'tog-minordefault' => '默认标记编辑为小编辑',
'tog-previewontop' => '在编辑框上方显示预览',
'tog-previewonfirst' => '首次编辑时显示预览',
'tog-nocache' => '停用浏览器页面缓存',
-'tog-enotifwatchlistpages' => '当我的监视列表中的页面更改时发送电子邮件通知我',
+'tog-enotifwatchlistpages' => 'å½\93æ\88\91ç\9a\84ç\9b\91è§\86å\88\97表ä¸ç\9a\84页é\9d¢æ\88\96æ\96\87件æ\9b´æ\94¹æ\97¶å\8f\91é\80\81ç\94µå\90é\82®ä»¶é\80\9aç\9f¥æ\88\91',
'tog-enotifusertalkpages' => '当我的讨论页更改时发送电子邮件通知我',
-'tog-enotifminoredits' => '当页面有小编辑时发送电子邮件通知我',
+'tog-enotifminoredits' => '当页面和文件有小编辑时发送电子邮件通知我',
'tog-enotifrevealaddr' => '在通知电子邮件中显示我的电子邮件地址',
'tog-shownumberswatching' => '显示监视用户数',
'tog-oldsig' => '当前签名:',
# Export
'export' => '导出页面',
-'exporttext' => '您可以将特定页面或一组页面的文本以及编辑历史以 XML 格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”页面导入到另一个运行 MediaWiki 的网站。
+'exporttext' => '您可以将特定页面或一组页面的文本以及编辑历史以XML格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”页面导入到另一个运行MediaWiki的网站。
-要导出页面,请在下面的文本框中输入页面标题,每行一个标题,
-并选择你是否需要导出带有页面历史的以前的修订本,
-或是只选择导出带有最后一次编辑信息的当前修订版本。
+要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择你是否需要导出带有页面历史的以前的修订本,或是只选择导出带有最后一次编辑信息的当前修订版本。
此外你还可以利用链接导出文件,例如你可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。',
'exportall' => '导出所有页面',
'rollback' => '恢復編輯',
'rollback_short' => '恢復',
'rollbacklink' => '恢復',
+'rollbacklinkcount' => '恢復 $1 次編輯',
+'rollbacklinkcount-morethan' => '恢復多過 $1 次編輯',
'rollbackfailed' => '無法恢復',
'cantrollback' => '無法恢復編輯;最後的貢獻者是本文的唯一作者。',
'alreadyrolled' => '無法回退由[[User:$2|$2]]([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]在[[:$1]]上的編輯;其他人已經編輯或者回退了該頁。
# Export
'export' => '匯出頁面',
-'exporttext' => '您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。
+'exporttext' => '您可以將特定頁面或一組頁面的文字以及編輯歷史以XML格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行MediaWiki的網站。
-要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,
-並選擇{{GENDER:|你|妳|你}}是否需要匯出帶有頁面歷史的以前的修訂版本,
-或是只選擇匯出帶有最後一次編輯訊息的目前修訂版本。
+要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,並選擇{{GENDER:|你|妳|你}}是否需要匯出帶有頁面歷史的以前的修訂版本,或是只選擇匯出帶有最後一次編輯訊息的目前修訂版本。
-此外{{GENDER:|你|妳|你}}還可以利用連結匯出檔案,例如{{GENDER:|你|妳|你}}可以使用 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 匯出「[[{{MediaWiki:Mainpage}}]]」頁面。',
+此外{{GENDER:|你|妳|你}}還可以利用連結匯出檔案,例如{{GENDER:|你|妳|你}}可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]匯出「[[{{MediaWiki:Mainpage}}]]」頁面。',
'exportall' => '導出所有頁面',
'exportcuronly' => '僅包含目前的修訂,而不是全部的歷史。',
'exportnohistory' => "----
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
-INPUT_FILTER =
+INPUT_FILTER = "{{INPUT_FILTER}}"
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
$fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
if ( !$fsFile ) {
$this->error( "Could not get local copy of $srcPath.", 1 ); // die
+ } elseif ( !$fsFile->exists() ) {
+ // FSFileBackends just return the path for getLocalReference() and paths with
+ // illegal slashes may get normalized to a different path. This can cause the
+ // local reference to not exist...skip these broken files.
+ $this->error( "Detected possible illegal path for $srcPath." );
+ continue;
}
$fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
// Note: prepare() is usually fast for key/value backends
__METHOD__,
array( 'FOR UPDATE' )
);
- if ( $path && file_exists( $path ) && !$inuse ) {
- if( unlink( $path ) ) { // delete
+ if ( $path && $repo->fileExists( $path ) && !$inuse ) {
+ if ( $repo->quickPurge( $path ) ) {
$count++;
$dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
} else {
'version-entrypoints-index-php',
'version-entrypoints-api-php',
'version-entrypoints-load-php',
+ 'ipb-default-expiry',
);
/** Optional messages, which may be translated only if changed in the target language. */
'remembermypassword',
'securelogin-stick-https',
'yourdomainname',
+ 'password-change-forbidden',
'externaldberror',
'login',
'nav-login-createaccount',
'rollback',
'rollback_short',
'rollbacklink',
+ 'rollbacklinkcount',
+ 'rollbacklinkcount-morethan',
'rollbackfailed',
'cantrollback',
'alreadyrolled',
'cant-see-hidden-user',
'ipbblocked',
'ipbnounblockself',
+ 'ipb-default-expiry',
),
'developertools' => array(
'lockdb',
--- /dev/null
+<?php
+# Original source code by Goran Rakic
+# http://blog.goranrakic.com/
+# http://stackoverflow.com/questions/4325224
+
+# Should be filled in doxygen INPUT_FILTER as "php mwdoc-filter.php"
+
+$source = file_get_contents( $argv[1] );
+$regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
+$replac = '${2} */ ${3} ${1} ${4}';
+$source = preg_replace($regexp, $replac, $source);
+
+echo $source;
/** doxygen configuration template for mediawiki */
$doxygenTemplate = $mwPath . 'maintenance/Doxyfile';
+/** doxygen input filter to tweak source file before they are parsed */
+$doxygenInputFilter = "php {$mwPath}maintenance/mwdoc-filter.php";
+
/** svnstat command, used to get the version of each file */
$svnstat = $mwPath . 'bin/svnstat';
* @return string
*/
function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude, $excludePatterns, $doxyGenerateMan ) {
+ global $doxygenInputFilter;
$template = file_get_contents( $doxygenTemplate );
-
// Replace template placeholders by correct values.
$replacements = array(
'{{OUTPUT_DIRECTORY}}' => $outputDirectory,
'{{EXCLUDE_PATTERNS}}' => $excludePatterns,
'{{HAVE_DOT}}' => `which dot` ? 'YES' : 'NO',
'{{GENERATE_MAN}}' => $doxyGenerateMan ? 'YES' : 'NO',
+ '{{INPUT_FILTER}}' => $doxygenInputFilter,
);
$tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
$tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
<?php
/**
- * CLI script to easily parse some wikitext.
+ * Parse some wikitext.
+ *
* Wikitext can be given by stdin or using a file. The wikitext will be parsed
* using 'CLIParser' as a title. This can be overriden with --title option.
*
* </p>$
* @endcode
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
* @ingroup Maintenance
* @author Antoine Musso <hashar at free dot fr>
* @license GNU General Public License 2.0 or later
*/
+
require_once( dirname(__FILE__) . '/Maintenance.php' );
+/**
+ * Maintenance script to parse some wikitext.
+ *
+ * @ingroup Maintenance
+ */
class CLIParser extends Maintenance {
protected $parser;
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+/**
+ * Maintenance script that manually runs an SQL patch outside of the general updaters.
+ *
+ * @ingroup Maintenance
+ */
class PatchSql extends Maintenance {
public function __construct() {
parent::__construct();
<?php
/**
- * Script to populate category table.
+ * Populate the category table.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-
+/**
+ * Mainteance script to populate the category table.
+ *
+ * @ingroup Maintenance
+ */
class PopulateCategory extends Maintenance {
const REPORTING_INTERVAL = 1000;
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+/**
+ * Maintenance script to populate the img_sha1 field.
+ *
+ * @ingroup Maintenance
+ */
class PopulateImageSha1 extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+/**
+ * Maintenance script that makes the required database updates for populating the
+ * log_search table retroactively
+ *
+ * @ingroup Maintenance
+ */
class PopulateLogSearch extends LoggedUpdateMaintenance {
static $tableMap = array( 'rev' => 'revision', 'fa' => 'filearchive', 'oi' => 'oldimage', 'ar' => 'archive' );
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+/**
+ * Maintenance script that makes the required database updates for
+ * Special:ProtectedPages to show all protected pages.
+ *
+ * @ingroup Maintenance
+ */
class PopulateLogUsertext extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+/**
+ * Maintenance script that makes the required database updates for rev_parent_id
+ * to be of any use.
+ *
+ * @ingroup Maintenance
+ */
class PopulateParentId extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+/**
+ * Maintenance script that populates the rev_len field for old revisions
+ * created before MW 1.10.
+ *
+ * @ingroup Maintenance
+ */
class PopulateRevisionLength extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+/**
+ * Maintenance script that fills the rev_sha1 and ar_sha1 columns of revision
+ * and archive tables for revisions created before MW 1.19.
+ *
+ * @ingroup Maintenance
+ */
class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
<?php
/**
* Take page text out of an XML dump file and preprocess it to obj.
- * It may be useful for getting preprocessor statistics or filling the
+ * It may be useful for getting preprocessor statistics or filling the
* preprocessor cache.
*
- * Copyright (C) 2011 Platonides - http://www.mediawiki.org/
+ * Copyright © 2011 Platonides - http://www.mediawiki.org/
*
* 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
require_once( dirname( __FILE__ ) . '/dumpIterator.php' );
+/**
+ * Maintenance script that takes page text out of an XML dump file and
+ * preprocesses it to obj.
+ *
+ * @ingroup Maintenance
+ */
class PreprocessDump extends DumpIterator {
/* Variables for dressing up as a parser */
}
public function memoryLimit() {
+ if ( $this->hasOption( 'memory-limit' ) ) {
+ return parent::memoryLimit();
+ }
return '1000M';
}
}
public function memoryLimit() {
+ if ( $this->hasOption( 'memory-limit' ) ) {
+ return parent::memoryLimit();
+ }
// Don't eat all memory on the machine if we get a bad job.
return "150M";
}
$wgTitle = Title::newFromText( 'RunJobs.php' );
$dbw = wfGetDB( DB_MASTER );
$n = 0;
- $conds = '';
+
if ( $type === false ) {
$conds = Job::defaultQueueConditions( );
} else {
- $conds = "job_cmd = " . $dbw->addQuotes( $type );
+ $conds = array( 'job_cmd' => $type );
}
while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
'scripts' => 'resources/mediawiki/mediawiki.user.js',
'dependencies' => array(
'jquery.cookie',
+ 'mediawiki.api',
),
),
'mediawiki.util' => array(
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; }
-button.ui-button-icons-only { width: 3.7em; }
+.ui-button-icons-only { width: 3.4em; }
+button.ui-button-icons-only { width: 3.7em; }
/*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4em; }
+.ui-button .ui-button-text { display: block; line-height: 1.4; }
.ui-button-text-only .ui-button-text { padding: 0.3em 1em 0.25em 1em; }
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: 0.3em; text-indent: -9999999px; }
.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 1em 0.25em 2.1em; }
.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 2.1em 0.25em 1em; }
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
-/* for older versions of jQuery UI */
-.ui-button-text-icon .ui-button-text { padding: 0.3em 1em 0.3em 2.1em; }
/* no icon support for input elements, provide padding by default */
input.ui-button { padding: 0.3em 1em; }
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
body .ui-button {
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
- margin: 0.5em 0 0.5em 0.4em !important;
+ margin: 0.5em 0 0.5em 0.4em;
border: 1px solid #a6a6a6 !important;
/* @embed */
background: #f2f2f2 url(images/button-off.png) repeat-x scroll 50% 100% !important;
width: auto;
overflow: visible;
}
+
+/* Corner radius */
+/* This is normally handled in jquery.ui.theme.css, but in our case, the corner
+ styling of our buttons doesn't match our default widget corner styling */
+.ui-button.ui-corner-all, .ui-button.ui-corner-top, .ui-button.ui-corner-left, .ui-button.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-button.ui-corner-all, .ui-button.ui-corner-top, .ui-button.ui-corner-right, .ui-button.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-button.ui-corner-all, .ui-button.ui-corner-bottom, .ui-button.ui-corner-left, .ui-button.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-button.ui-corner-all, .ui-button.ui-corner-bottom, .ui-button.ui-corner-right, .ui-button.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
body .ui-button:hover {
border-color: #6e7273;
/* @embed */
}
.mw-badge-inline {
- display: inline;
+ display: inline-block;
+ margin-left: 3px;
}
.mw-badge-overlay {
bottom: -1px;
right: -3px;
z-index: 50;
-}
\ No newline at end of file
+}
return ( (b < a) ? false : ((b > a) ? true : 0) );
}
- function checkSorting( array1, array2, sortList ) {
- var col, fn, ret;
- for ( var i = 0, len = sortList.length; i < len; i++ ) {
- col = sortList[i][0];
- fn = ( sortList[i][1] ) ? sortTextDesc : sortText;
- ret = fn.call( this, array1[col], array2[col] );
- if ( ret !== 0 ) {
- return ret;
- }
+ function multisort( table, sortList, cache ) {
+ var sortFn = [];
+ var len = sortList.length;
+ for ( var i = 0; i < len; i++ ) {
+ sortFn[i] = ( sortList[i][1] ) ? sortTextDesc : sortText;
}
- return ret;
- }
-
- // Merge sort algorithm
- // Based on http://en.literateprograms.org/Merge_sort_(JavaScript)
- function mergeSortHelper( array, begin, beginRight, end, sortList ) {
- for ( ; begin < beginRight; ++begin ) {
- if ( checkSorting( array[begin], array[beginRight], sortList ) ) {
- var v = array[begin];
- array[begin] = array[beginRight];
- var begin2 = beginRight;
- while ( begin2 + 1 < end && checkSorting( v, array[begin2 + 1], sortList ) ) {
- var tmp = array[begin2];
- array[begin2] = array[begin2 + 1];
- array[begin2 + 1] = tmp;
- ++begin2;
+ cache.normalized.sort( function ( array1, array2 ) {
+ var col, ret;
+ for ( var i = 0; i < len; i++ ) {
+ col = sortList[i][0];
+ ret = sortFn[i].call( this, array1[col], array2[col] );
+ if ( ret !== 0 ) {
+ return ret;
}
- array[begin2] = v;
}
- }
- }
-
- function mergeSort(array, begin, end, sortList) {
- var size = end - begin;
- if ( size < 2 ) {
- return;
- }
-
- var beginRight = begin + Math.floor(size / 2);
-
- mergeSort( array, begin, beginRight, sortList );
- mergeSort( array, beginRight, end, sortList );
- mergeSortHelper( array, begin, beginRight, end, sortList );
- }
-
- function multisort( table, sortList, cache ) {
- var i = sortList.length;
- mergeSort( cache.normalized, 0, cache.normalized.length, sortList );
-
+ // Fall back to index number column to ensure stable sort
+ return sortText.call( this, array1[array1.length - 1], array2[array2.length - 1] );
+ } );
return cache;
}
/* Private Members */
var that = this;
+ var api = new mw.Api();
+ var groupsDeferred;
+ var rightsDeferred;
/* Public Members */
*
* @return Mixed: User name string or null if users is anonymous
*/
- this.name = function() {
+ this.getName = function () {
return mw.config.get( 'wgUserName' );
};
+ /**
+ * @deprecated since 1.20 use mw.user.getName() instead
+ */
+ this.name = function () {
+ return this.getName();
+ };
+
/**
* Checks if the current user is anonymous.
*
* @return Boolean
*/
- this.anonymous = function() {
- return that.name() ? false : true;
+ this.isAnon = function () {
+ return that.getName() === null;
+ };
+
+ /**
+ * @deprecated since 1.20 use mw.user.isAnon() instead
+ */
+ this.anonymous = function () {
+ return that.isAnon();
};
/**
* @return String: User name or random session ID
*/
this.id = function() {
- var name = that.name();
+ var name = that.getName();
if ( name ) {
return name;
}
}
return bucket;
};
+
+ /**
+ * Gets the current user's groups.
+ */
+ this.getGroups = function ( callback ) {
+ if ( groupsDeferred ) {
+ groupsDeferred.always( callback );
+ return;
+ }
+
+ groupsDeferred = $.Deferred();
+ groupsDeferred.always( callback );
+ api.get( {
+ action: 'query',
+ meta: 'userinfo',
+ uiprop: 'groups'
+ } ).done( function ( data ) {
+ if ( data.query && data.query.userinfo && data.query.userinfo.groups ) {
+ groupsDeferred.resolve( data.query.userinfo.groups );
+ } else {
+ groupsDeferred.reject( [] );
+ }
+ } ).fail( function ( data ) {
+ groupsDeferred.reject( [] );
+ } );
+ };
+
+ /**
+ * Gets the current user's rights.
+ */
+ this.getRights = function ( callback ) {
+ if ( rightsDeferred ) {
+ rightsDeferred.always( callback );
+ return;
+ }
+
+ rightsDeferred = $.Deferred();
+ rightsDeferred.always( callback );
+ api.get( {
+ action: 'query',
+ meta: 'userinfo',
+ uiprop: 'rights'
+ } ).done( function ( data ) {
+ if ( data.query && data.query.userinfo && data.query.userinfo.rights ) {
+ rightsDeferred.resolve( data.query.userinfo.rights );
+ } else {
+ rightsDeferred.reject( [] );
+ }
+ } ).fail( function ( data ) {
+ rightsDeferred.reject( [] );
+ } );
+ };
}
// Extend the skeleton mw.user from mediawiki.js
border: 1px dashed #2f6fab;
color: black;
background-color: #f9f9f9;
-
- /*
- * Wrap properly.
- * - pre-wrap: causes the browser to naturally wrap by displaying
- * words on the next line if they don't fit on the same line
- * within the box (does not cut off words).
- * - break-word: forces the browser to wrap anywhere (even within
- * a word) if it is (still) too long for the line.
- * When only using break-word in a <pre>, the browser only uses
- * the force behavior and as a result almost always cuts half-way
- * a word. When only using pre-wrap, too-long words will still
- * cause the page layout to break. The combination is magic :).
- * See also https://bugzilla.wikimedia.org/show_bug.cgi?id=260#c20
- */
- white-space: pre-wrap;
- word-wrap: break-word;
}
/* Tables */
$data = $this->doApiRequest( array(
'action' => 'query',
'titles' => 'Main Page',
- 'intoken' => 'edit|delete|protect|move|block|unblock',
+ 'intoken' => 'edit|delete|protect|move|block|unblock|watch',
'prop' => 'info' ), $session, false, $user->user );
return $data;
}
}
function getTokens() {
- return $this->getTokenList( self::$users['sysop'] );
+ $data = $this->getTokenList( self::$users['sysop'] );
+
+ $keys = array_keys( $data[0]['query']['pages'] );
+ $key = array_pop( $keys );
+ $pageinfo = $data[0]['query']['pages'][$key];
+
+ return $pageinfo;
}
/**
- * @group Broken
*/
function testWatchEdit() {
-
- $data = $this->getTokens();
-
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
+ $pageinfo = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'edit',
'title' => 'UTPage',
'text' => 'new text',
'token' => $pageinfo['edittoken'],
- 'watchlist' => 'watch' ), $data );
+ 'watchlist' => 'watch' ) );
$this->assertArrayHasKey( 'edit', $data[0] );
$this->assertArrayHasKey( 'result', $data[0]['edit'] );
$this->assertEquals( 'Success', $data[0]['edit']['result'] );
/**
* @depends testWatchEdit
- * @group Broken
*/
function testWatchClear() {
+ $pageinfo = $this->getTokens();
+
$data = $this->doApiRequest( array(
'action' => 'query',
- 'list' => 'watchlist' ), $data );
+ 'list' => 'watchlist' ) );
if ( isset( $data[0]['query']['watchlist'] ) ) {
$wl = $data[0]['query']['watchlist'];
$data = $this->doApiRequest( array(
'action' => 'watch',
'title' => $page['title'],
- 'unwatch' => true ), $data );
+ 'unwatch' => true,
+ 'token' => $pageinfo['watchtoken'] ) );
}
}
$data = $this->doApiRequest( array(
}
/**
- * @group Broken
*/
function testWatchProtect() {
- $data = $this->getTokens();
-
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
+ $pageinfo = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'protect',
'token' => $pageinfo['protecttoken'],
'title' => 'UTPage',
'protections' => 'edit=sysop',
- 'watchlist' => 'unwatch' ), $data );
+ 'watchlist' => 'unwatch' ) );
$this->assertArrayHasKey( 'protect', $data[0] );
$this->assertArrayHasKey( 'protections', $data[0]['protect'] );
}
/**
- * @group Broken
*/
function testGetRollbackToken() {
- $data = $this->getTokens();
+ $pageinfo = $this->getTokens();
if ( !Title::newFromText( 'UTPage' )->exists() ) {
- $this->markTestIncomplete( "The article [[UTPage]] does not exist" );
+ $this->markTestSkipped( "The article [[UTPage]] does not exist" ); //TODO: just create it?
}
$data = $this->doApiRequest( array(
'action' => 'query',
'prop' => 'revisions',
'titles' => 'UTPage',
- 'rvtoken' => 'rollback' ), $data );
+ 'rvtoken' => 'rollback' ) );
$this->assertArrayHasKey( 'query', $data[0] );
$this->assertArrayHasKey( 'pages', $data[0]['query'] );
$key = array_pop( $keys );
if ( isset( $data[0]['query']['pages'][$key]['missing'] ) ) {
- $this->markTestIncomplete( "Target page (UTPage) doesn't exist" );
+ $this->markTestSkipped( "Target page (UTPage) doesn't exist" );
}
$this->assertArrayHasKey( 'pageid', $data[0]['query']['pages'][$key] );
}
/**
- * @depends testGetRollbackToken
* @group Broken
+ * Broken because there is currently no revision info in the $pageinfo
+ *
+ * @depends testGetRollbackToken
*/
function testWatchRollback( $data ) {
$keys = array_keys( $data[0]['query']['pages'] );
$key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key]['revisions'][0];
+ $pageinfo = $data[0]['query']['pages'][$key];
+ $revinfo = $pageinfo['revisions'][0];
try {
$data = $this->doApiRequest( array(
'action' => 'rollback',
'title' => 'UTPage',
- 'user' => $pageinfo['user'],
+ 'user' => $revinfo['user'],
'token' => $pageinfo['rollbacktoken'],
- 'watchlist' => 'watch' ), $data );
+ 'watchlist' => 'watch' ) );
+
+ $this->assertArrayHasKey( 'rollback', $data[0] );
+ $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
} catch( UsageException $ue ) {
if( $ue->getCodeString() == 'onlyauthor' ) {
$this->markTestIncomplete( "Only one author to 'UTPage', cannot test rollback" );
$this->fail( "Received error '" . $ue->getCodeString() . "'" );
}
}
-
- $this->assertArrayHasKey( 'rollback', $data[0] );
- $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
}
/**
- * @group Broken
*/
function testWatchDelete() {
-
- $data = $this->getTokens();
-
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
+ $pageinfo = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'delete',
'token' => $pageinfo['deletetoken'],
- 'title' => 'UTPage' ), $data );
+ 'title' => 'UTPage' ) );
$this->assertArrayHasKey( 'delete', $data[0] );
$this->assertArrayHasKey( 'title', $data[0]['delete'] );
$data = $this->doApiRequest( array(
'action' => 'query',
- 'list' => 'watchlist' ), $data );
+ 'list' => 'watchlist' ) );
$this->markTestIncomplete( 'This test needs to verify the deleted article was added to the users watchlist' );
}
--- /dev/null
+<?php
+/**
+ * Based on the test suite of the original Python
+ * CSSJanus libary:
+ * http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus_test.py
+ * Ported to PHP for ResourceLoader and has been extended since.
+ */
+class CSSJanusTest extends MediaWikiTestCase {
+ /**
+ * @dataProvider provideTransformCases
+ */
+ function testTransform( $cssA, $cssB = null ) {
+
+ if ( $cssB ) {
+ $transformedA = CSSJanus::transform( $cssA );
+ $this->assertEquals( $transformedA, $cssB, 'Test A-B transformation' );
+
+ $transformedB = CSSJanus::transform( $cssB );
+ $this->assertEquals( $transformedB, $cssA, 'Test B-A transformation' );
+
+ // If no B version is provided, it means
+ // the output should equal the input.
+ } else {
+ $transformedA = CSSJanus::transform( $cssA );
+ $this->assertEquals( $transformedA, $cssA, 'Nothing was flipped' );
+ }
+ }
+
+ /**
+ * @dataProvider provideTransformAdvancedCases
+ */
+ function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
+ $swapLtrRtlInURL = isset( $options['swapLtrRtlInURL'] ) ? $options['swapLtrRtlInURL'] : false;
+ $swapLeftRightInURL = isset( $options['swapLeftRightInURL'] ) ? $options['swapLeftRightInURL'] : false;
+
+ $flipped = CSSJanus::transform( $code, $swapLtrRtlInURL, $swapLeftRightInURL );
+
+ $this->assertEquals( $expectedOutput, $flipped,
+ 'Test flipping, options: url-ltr-rtl=' . ($swapLtrRtlInURL ? 'true' : 'false')
+ . ' url-left-right=' . ($swapLeftRightInURL ? 'true' : 'false')
+ );
+ }
+ /**
+ * @dataProvider provideTransformBrokenCases
+ * @group Broken
+ */
+ function testTransformBroken( $code, $expectedOutput ) {
+ $flipped = CSSJanus::transform( $code );
+
+ $this->assertEquals( $expectedOutput, $flipped, 'Test flipping' );
+ }
+
+ /**
+ * These transform cases are tested *in both directions*
+ * No need to declare a principle twice in both directions here.
+ */
+ function provideTransformCases() {
+ return array(
+ // Property keys
+ array(
+ '.foo { left: 0; }',
+ '.foo { right: 0; }'
+ ),
+ // Guard against partial keys
+ // (CSS currently doesn't have flippable properties
+ // that contain the direction as part of the key without
+ // dash separation)
+ array(
+ '.foo { alright: 0; }'
+ ),
+ array(
+ '.foo { balleft: 0; }'
+ ),
+
+ // Dashed property keys
+ array(
+ '.foo { padding-left: 0; }',
+ '.foo { padding-right: 0; }'
+ ),
+ array(
+ '.foo { margin-left: 0; }',
+ '.foo { margin-right: 0; }'
+ ),
+ array(
+ '.foo { border-left: 0; }',
+ '.foo { border-right: 0; }'
+ ),
+
+ // Double-dashed property keys
+ array(
+ '.foo { border-left-color: red; }',
+ '.foo { border-right-color: red; }'
+ ),
+ array(
+ // Includes unknown properties?
+ '.foo { x-left-y: 0; }',
+ '.foo { x-right-y: 0; }'
+ ),
+
+ // Multi-value properties
+ array(
+ '.foo { padding: 0; }'
+ ),
+ array(
+ '.foo { padding: 0 1px; }'
+ ),
+ array(
+ '.foo { padding: 0 1px 2px; }'
+ ),
+ array(
+ '.foo { padding: 0 1px 2px 3px; }',
+ '.foo { padding: 0 3px 2px 1px; }'
+ ),
+
+ // Shorthand / Four notation
+ array(
+ '.foo { padding: .25em 15px 0pt 0ex; }',
+ '.foo { padding: .25em 0ex 0pt 15px; }'
+ ),
+ array(
+ '.foo { margin: 1px -4px 3px 2px; }',
+ '.foo { margin: 1px 2px 3px -4px; }'
+ ),
+ array(
+ '.foo { padding: 0 15px .25em 0; }',
+ '.foo { padding: 0 0 .25em 15px; }'
+ ),
+ array(
+ '.foo { padding: 1px 4.1grad 3px 2%; }',
+ '.foo { padding: 1px 2% 3px 4.1grad; }'
+ ),
+ array(
+ '.foo { padding: 1px 2px 3px auto; }',
+ '.foo { padding: 1px auto 3px 2px; }'
+ ),
+ array(
+ '.foo { padding: 1px inherit 3px auto; }',
+ '.foo { padding: 1px auto 3px inherit; }'
+ ),
+ array(
+ '.foo { border-radius: .25em 15px 0pt 0ex; }',
+ '.foo { border-radius: .25em 0ex 0pt 15px; }'
+ ),
+ array(
+ '.foo { x-unknown: a b c d; }'
+ ),
+ array(
+ '.foo barpx 0 2% { opacity: 0; }'
+ ),
+ array(
+ '#settings td p strong'
+ ),
+ array(
+ # Not sure how 4+ values should behave,
+ # testing to make sure changes are detected
+ '.foo { x-unknown: 1 2 3 4 5; }',
+ '.foo { x-unknown: 1 4 3 2 5; }',
+ ),
+ array(
+ '.foo { x-unknown: 1 2 3 4 5 6; }',
+ '.foo { x-unknown: 1 4 3 2 5 6; }',
+ ),
+
+ // Shorthand / Three notation
+ array(
+ '.foo { margin: 1em 0 .25em; }'
+ ),
+ array(
+ '.foo { margin:-1.5em 0 -.75em; }'
+ ),
+
+ // Shorthand / Two notation
+ array(
+ '.foo { padding: 1px 2px; }'
+ ),
+
+ // Shorthand / One notation
+ array(
+ '.foo { padding: 1px; }'
+ ),
+
+ // Direction
+ // Note: This differs from the Python implementation,
+ // see also CSSJanus::fixDirection for more info.
+ array(
+ '.foo { direction: ltr; }',
+ '.foo { direction: rtl; }'
+ ),
+ array(
+ '.foo { direction: rtl; }',
+ '.foo { direction: ltr; }'
+ ),
+ array(
+ 'input { direction: ltr; }',
+ 'input { direction: rtl; }'
+ ),
+ array(
+ 'input { direction: rtl; }',
+ 'input { direction: ltr; }'
+ ),
+ array(
+ 'body { direction: ltr; }',
+ 'body { direction: rtl; }'
+ ),
+ array(
+ '.foo, body, input { direction: ltr; }',
+ '.foo, body, input { direction: rtl; }'
+ ),
+ array(
+ 'body { padding: 10px; direction: ltr; }',
+ 'body { padding: 10px; direction: rtl; }'
+ ),
+ array(
+ 'body { direction: ltr } .myClass { direction: ltr }',
+ 'body { direction: rtl } .myClass { direction: rtl }'
+ ),
+
+ // Left/right values
+ array(
+ '.foo { float: left; }',
+ '.foo { float: right; }'
+ ),
+ array(
+ '.foo { text-align: left; }',
+ '.foo { text-align: right; }'
+ ),
+ array(
+ '.foo { -x-unknown: left; }',
+ '.foo { -x-unknown: right; }'
+ ),
+ // Guard against selectors that look flippable
+ array(
+ '.column-left { width: 0; }'
+ ),
+ array(
+ 'a.left { width: 0; }'
+ ),
+ array(
+ 'a.leftification { width: 0; }'
+ ),
+ array(
+ 'a.ltr { width: 0; }'
+ ),
+ array(
+ # <div class="a-ltr png">
+ '.a-ltr.png { width: 0; }'
+ ),
+ array(
+ # <foo-ltr attr="x">
+ 'foo-ltr[attr="x"] { width: 0; }'
+ ),
+ array(
+ 'div.left > span.right+span.left { width: 0; }'
+ ),
+ array(
+ '.thisclass .left .myclass { width: 0; }'
+ ),
+ array(
+ '.thisclass .left .myclass #myid { width: 0; }'
+ ),
+
+ // Cursor values (east/west)
+ array(
+ '.foo { cursor: e-resize; }',
+ '.foo { cursor: w-resize; }'
+ ),
+ array(
+ '.foo { cursor: se-resize; }',
+ '.foo { cursor: sw-resize; }'
+ ),
+ array(
+ '.foo { cursor: ne-resize; }',
+ '.foo { cursor: nw-resize; }'
+ ),
+
+ // Background
+ array(
+ '.foo { background-position: top left; }',
+ '.foo { background-position: top right; }'
+ ),
+ array(
+ '.foo { background: url(/foo/bar.png) top left; }',
+ '.foo { background: url(/foo/bar.png) top right; }'
+ ),
+ array(
+ '.foo { background: url(/foo/bar.png) top left no-repeat; }',
+ '.foo { background: url(/foo/bar.png) top right no-repeat; }'
+ ),
+ array(
+ '.foo { background: url(/foo/bar.png) no-repeat top left; }',
+ '.foo { background: url(/foo/bar.png) no-repeat top right; }'
+ ),
+ array(
+ '.foo { background: #fff url(/foo/bar.png) no-repeat top left; }',
+ '.foo { background: #fff url(/foo/bar.png) no-repeat top right; }'
+ ),
+ array(
+ '.foo { background-position: 100% 40%; }',
+ '.foo { background-position: 0% 40%; }'
+ ),
+ array(
+ '.foo { background-position: 23% 0; }',
+ '.foo { background-position: 77% 0; }'
+ ),
+ array(
+ '.foo { background-position: 23% auto; }',
+ '.foo { background-position: 77% auto; }'
+ ),
+ array(
+ '.foo { background-position-x: 23%; }',
+ '.foo { background-position-x: 77%; }'
+ ),
+ array(
+ '.foo { background-position-y: 23%; }',
+ '.foo { background-position-y: 23%; }'
+ ),
+ array(
+ '.foo { background:url(../foo.png) no-repeat 75% 50%; }',
+ '.foo { background:url(../foo.png) no-repeat 25% 50%; }'
+ ),
+ array(
+ '.foo { background: 10% 20% } .bar { background: 40% 30% }',
+ '.foo { background: 90% 20% } .bar { background: 60% 30% }'
+ ),
+
+ // Multiple rules
+ array(
+ 'body { direction: rtl; float: right; } .foo { direction: ltr; float: right; }',
+ 'body { direction: ltr; float: left; } .foo { direction: rtl; float: left; }',
+ ),
+
+ // Duplicate properties
+ array(
+ '.foo { float: left; float: right; float: left; }',
+ '.foo { float: right; float: left; float: right; }',
+ ),
+
+ // Preserve comments
+ array(
+ '/* left /* right */left: 10px',
+ '/* left /* right */right: 10px'
+ ),
+ array(
+ '/*left*//*left*/left: 10px',
+ '/*left*//*left*/right: 10px'
+ ),
+ array(
+ '/* Going right is cool */ .foo { width: 0 }',
+ ),
+ array(
+ "/* padding-right 1 2 3 4 */\n#test { width: 0}\n/*right*/"
+ ),
+ array(
+ "/** Two line comment\n * left\n \*/\n#test {width: 0}"
+ ),
+
+ // @noflip annotation
+ array(
+ // before selector (single)
+ '/* @noflip */ div { float: left; }'
+ ),
+ array(
+ // before selector (multiple)
+ '/* @noflip */ div, .notme { float: left; }'
+ ),
+ array(
+ // inside selector
+ 'div, /* @noflip */ .foo { float: left; }'
+ ),
+ array(
+ // after selector
+ 'div, .notme /* @noflip */ { float: left; }'
+ ),
+ array(
+ // before multiple rules
+ '/* @noflip */ div { float: left; } .foo { float: left; }',
+ '/* @noflip */ div { float: left; } .foo { float: right; }'
+ ),
+ array(
+ // after multiple rules
+ '.foo { float: left; } /* @noflip */ div { float: left; }',
+ '.foo { float: right; } /* @noflip */ div { float: left; }'
+ ),
+ array(
+ // before multiple properties
+ 'div { /* @noflip */ float: left; text-align: left; }',
+ 'div { /* @noflip */ float: left; text-align: right; }'
+ ),
+ array(
+ // after multiple properties
+ 'div { float: left; /* @noflip */ text-align: left; }',
+ 'div { float: right; /* @noflip */ text-align: left; }'
+ ),
+
+ // Guard against css3 stuff
+ array(
+ 'background-image: -moz-linear-gradient(#326cc1, #234e8c);'
+ ),
+ array(
+ 'background-image: -webkit-gradient(linear, 100% 0%, 0% 0%, from(#666666), to(#ffffff));'
+ ),
+
+ // CSS syntax / white-space variations
+ // spaces, no spaces, tabs, new lines, omitting semi-colons
+ array(
+ ".foo { left: 0; }",
+ ".foo { right: 0; }"
+ ),
+ array(
+ ".foo{ left: 0; }",
+ ".foo{ right: 0; }"
+ ),
+ array(
+ ".foo{ left: 0 }",
+ ".foo{ right: 0 }"
+ ),
+ array(
+ ".foo{left:0 }",
+ ".foo{right:0 }"
+ ),
+ array(
+ ".foo{left:0}",
+ ".foo{right:0}"
+ ),
+ array(
+ ".foo { left : 0 ; }",
+ ".foo { right : 0 ; }"
+ ),
+ array(
+ ".foo\n { left : 0 ; }",
+ ".foo\n { right : 0 ; }"
+ ),
+ array(
+ ".foo\n { \nleft : 0 ; }",
+ ".foo\n { \nright : 0 ; }"
+ ),
+ array(
+ ".foo\n { \n left : 0 ; }",
+ ".foo\n { \n right : 0 ; }"
+ ),
+ array(
+ ".foo\n { \n left\n : 0; }",
+ ".foo\n { \n right\n : 0; }"
+ ),
+ array(
+ ".foo \n { \n left\n : 0; }",
+ ".foo \n { \n right\n : 0; }"
+ ),
+ array(
+ ".foo\n{\nleft\n:\n0;}",
+ ".foo\n{\nright\n:\n0;}"
+ ),
+ array(
+ ".foo\n.bar {\n\tleft: 0;\n}",
+ ".foo\n.bar {\n\tright: 0;\n}"
+ ),
+ array(
+ ".foo\t{\tleft\t:\t0;}",
+ ".foo\t{\tright\t:\t0;}"
+ ),
+ );
+ }
+
+ /**
+ * These cases are tested in one way only (format: actual, expected, msg).
+ * If both ways can be tested, either put both versions in here or move
+ * it to provideTransformCases().
+ */
+ function provideTransformAdvancedCases() {
+ $bgPairs = array(
+ # [ - _ . ] <-> [ left right ltr rtl ]
+ 'foo.jpg' => 'foo.jpg',
+ 'left.jpg' => 'right.jpg',
+ 'ltr.jpg' => 'rtl.jpg',
+
+ 'foo-left.png' => 'foo-right.png',
+ 'foo_left.png' => 'foo_right.png',
+ 'foo.left.png' => 'foo.right.png',
+
+ 'foo-ltr.png' => 'foo-rtl.png',
+ 'foo_ltr.png' => 'foo_rtl.png',
+ 'foo.ltr.png' => 'foo.rtl.png',
+
+ 'left-foo.png' => 'right-foo.png',
+ 'left_foo.png' => 'right_foo.png',
+ 'left.foo.png' => 'right.foo.png',
+
+ 'ltr-foo.png' => 'rtl-foo.png',
+ 'ltr_foo.png' => 'rtl_foo.png',
+ 'ltr.foo.png' => 'rtl.foo.png',
+
+ 'foo-ltr-left.gif' => 'foo-rtl-right.gif',
+ 'foo_ltr_left.gif' => 'foo_rtl_right.gif',
+ 'foo.ltr.left.gif' => 'foo.rtl.right.gif',
+ 'foo-ltr_left.gif' => 'foo-rtl_right.gif',
+ 'foo_ltr.left.gif' => 'foo_rtl.right.gif',
+ );
+ $provider = array();
+ foreach ( $bgPairs as $left => $right ) {
+ # By default '-rtl' and '-left' etc. are not touched,
+ # Only when the appropiate parameter is set.
+ $provider[] = array(
+ ".foo { background: url(images/$left); }",
+ ".foo { background: url(images/$left); }"
+ );
+ $provider[] = array(
+ ".foo { background: url(images/$right); }",
+ ".foo { background: url(images/$right); }"
+ );
+ $provider[] = array(
+ ".foo { background: url(images/$left); }",
+ ".foo { background: url(images/$right); }",
+ array(
+ 'swapLtrRtlInURL' => true,
+ 'swapLeftRightInURL' => true,
+ )
+ );
+ $provider[] = array(
+ ".foo { background: url(images/$right); }",
+ ".foo { background: url(images/$left); }",
+ array(
+ 'swapLtrRtlInURL' => true,
+ 'swapLeftRightInURL' => true,
+ )
+ );
+ }
+
+ return $provider;
+ }
+
+ /**
+ * Cases that are currently failing, but
+ * should be looked at in the future as enhancements and/or bug fix
+ */
+ function provideTransformBrokenCases() {
+ return array(
+ // Guard against partial keys
+ array(
+ '.foo { leftxx: 0; }',
+ '.foo { leftxx: 0; }'
+ ),
+ array(
+ '.foo { rightxx: 0; }',
+ '.foo { rightxx: 0; }'
+ ),
+
+ // Guard against selectors that look flippable
+ array(
+ # <foo-left-x attr="x">
+ 'foo-left-x[attr="x"] { width: 0; }',
+ 'foo-left-x[attr="x"] { width: 0; }'
+ ),
+ array(
+ # <div class="foo" data-left="x">
+ '.foo[data-left="x"] { width: 0; }',
+ '.foo[data-left="x"] { width: 0; }'
+ ),
+ );
+ }
+}
QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
-QUnit.test( 'Handle basic replacements', 3, function ( assert ) {
+QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
var html, $lc;
mw.messages.set( 'basic', 'Basic stuff' );
);
var planetsRowspan = [["Earth","6051.8"], jupiter, ["Mars","6051.8"], mercury, saturn, venus];
-var planetsRowspanII = [jupiter, mercury, saturn, ['Venus', '6371.0'], venus, ['Venus', '3390.0']];
+var planetsRowspanII = [jupiter, mercury, saturn, venus, ['Venus', '6371.0'], ['Venus', '3390.0']];
tableTest(
'Basic planet table: same value for multiple rows via rowspan',
assert.ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
});
-QUnit.test( 'User login status', 5, function ( assert ) {
+QUnit.test( 'user status', 9, function ( assert ) {
/**
* Tests can be run under three different conditions:
* 1) From tests/qunit/index.html, user will be anonymous.
*/
// Forge an anonymous user:
- mw.config.set( 'wgUserName', null);
+ mw.config.set( 'wgUserName', null );
- assert.strictEqual( mw.user.name(), null, 'user.name should return null when anonymous' );
- assert.ok( mw.user.anonymous(), 'user.anonymous should reutrn true when anonymous' );
+ assert.strictEqual( mw.user.getName(), null, 'user.getName() returns null when anonymous' );
+ assert.strictEqual( mw.user.name(), null, 'user.name() compatibility' );
+ assert.assertTrue( mw.user.isAnon(), 'user.isAnon() returns true when anonymous' );
+ assert.assertTrue( mw.user.anonymous(), 'user.anonymous() compatibility' );
// Not part of startUp module
mw.config.set( 'wgUserName', 'John' );
- assert.equal( mw.user.name(), 'John', 'user.name returns username when logged-in' );
- assert.ok( !mw.user.anonymous(), 'user.anonymous returns false when logged-in' );
+ assert.equal( mw.user.getName(), 'John', 'user.getName() returns username when logged-in' );
+ assert.equal( mw.user.name(), 'John', 'user.name() compatibility' );
+ assert.assertFalse( mw.user.isAnon(), 'user.isAnon() returns false when logged-in' );
+ assert.assertFalse( mw.user.anonymous(), 'user.anonymous() compatibility' );
assert.equal( mw.user.id(), 'John', 'user.id Returns username when logged-in' );
});
+QUnit.asyncTest( 'getGroups', 3, function ( assert ) {
+ mw.user.getGroups( function ( groups ) {
+ // First group should always be '*'
+ assert.equal( $.type( groups ), 'array', 'Callback gets an array' );
+ assert.equal( groups[0], '*', '"*"" is the first group' );
+ // Sort needed because of different methods if creating the arrays,
+ // only the content matters.
+ assert.deepEqual( groups.sort(), mw.config.get( 'wgUserGroups' ).sort(), 'Array contains all groups, just like wgUserGroups' );
+ QUnit.start();
+ });
+});
+
+QUnit.asyncTest( 'getRights', 1, function ( assert ) {
+ mw.user.getRights( function ( rights ) {
+ // First group should always be '*'
+ assert.equal( $.type( rights ), 'array', 'Callback gets an array' );
+ QUnit.start();
+ });
+});
+
}( mediaWiki ) );