uz, vi.
* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
* (bug 33186) Add image rotation api "imagerotate"
* (bug 34040) Add "User rights management" link on user page toolbox.
* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
structual equality of HTML (ignoring insignificant differences like
quotmarks, order and whitespace in the attribute list).
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+ correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+ is now non-significant and not preserved in the HTML output.
=== Bug fixes in 1.21 ===
* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+* WDDX formatted output will actually be formatted (and normal output will no
+ longer be), and will no longer choke on booleans.
=== API changes in 1.21 ===
* prop=revisions can now report the contentmodel and contentformat.
'PoolCounter' => 'includes/PoolCounter.php',
'PoolCounter_Stub' => 'includes/PoolCounter.php',
'PoolCounterWork' => 'includes/PoolCounter.php',
+ 'PoolCounterWorkViaCallback' => 'includes/PoolCounter.php',
'PoolWorkArticleView' => 'includes/WikiPage.php',
'Preferences' => 'includes/Preferences.php',
'PreferencesForm' => 'includes/Preferences.php',
// bug 27975 - Don't try to wait for slaves if there are none
// Prevents permission error when getting master position
if ( $lb->getServerCount() > 1 ) {
- $dbw = $lb->getConnection( DB_MASTER );
+ $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
$pos = $dbw->getMasterPos();
$lb->waitForAll( $pos );
}
}
/**
- * Handy class for dealing with PoolCounters using class members instead of callbacks.
+ * Class for dealing with PoolCounters using class members
*/
abstract class PoolCounterWork {
protected $cacheable = false; //Does this override getCachedWork() ?
}
}
}
+
+/**
+ * Convenience class for dealing with PoolCounters using callbacks
+ * @since 1.22
+ */
+class PoolCounterWorkViaCallback extends PoolCounterWork {
+ /** @var callable */
+ protected $doWork;
+ /** @var callable|null */
+ protected $doCachedWork;
+ /** @var callable|null */
+ protected $fallback;
+ /** @var callable|null */
+ protected $error;
+
+ /**
+ * Build a PoolCounterWork class from a type, key, and callback map.
+ *
+ * The callback map must at least have a callback for the 'doWork' method.
+ * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback',
+ * and 'error' methods. Methods without callbacks will be no-ops that return false.
+ * If a 'doCachedWork' callback is provided, then execute() may wait for any prior
+ * process in the pool to finish and reuse its cached result.
+ *
+ * @param string $type
+ * @param string $key
+ * @param array $callbacks Map of callbacks
+ * @throws MWException
+ */
+ public function __construct( $type, $key, array $callbacks ) {
+ parent::__construct( $type, $key );
+ foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) {
+ if ( isset( $callbacks[$name] ) ) {
+ if ( !is_callable( $callbacks[$name] ) ) {
+ throw new MWException( "Invalid callback provided for '$name' function." );
+ }
+ $this->$name = $callbacks[$name];
+ }
+ }
+ if ( !isset( $this->doWork ) ) {
+ throw new MWException( "No callback provided for 'doWork' function." );
+ }
+ $this->cacheable = isset( $this->doCachedWork );
+ }
+
+ public function doWork() {
+ return call_user_func_array( $this->doWork, array() );
+ }
+
+ public function getCachedWork() {
+ if ( $this->doCachedWork ) {
+ return call_user_func_array( $this->doCachedWork, array() );
+ }
+ return false;
+ }
+
+ function fallback() {
+ if ( $this->fallback ) {
+ return call_user_func_array( $this->fallback, array() );
+ }
+ return false;
+ }
+
+ function error( $status ) {
+ if ( $this->error ) {
+ return call_user_func_array( $this->error, array( $status ) );
+ }
+ return false;
+ }
+}
$this->resetArticleID( 0 );
$nt->resetArticleID( $oldid );
+ $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
$newpage->updateRevisionOn( $dbw, $nullRevision );
WikiPage::onArticleDelete( $this );
} else {
$redirectArticle = WikiPage::factory( $this );
+ $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
$newid = $redirectArticle->insertOn( $dbw );
if ( $newid ) { // sanity
$redirectRevision = new Revision( array(
} else {
// Don't do newlines and indentation if we weren't asked
// for pretty output
- $nl = ( $this->getIsHtml() ? '' : "\n" );
+ $nl = ( $this->getIsHtml() ? "\n" : '' );
$indstr = ' ';
$this->printText( "<?xml version=\"1.0\"?>$nl" );
$this->printText( "<wddxPacket version=\"1.0\">$nl" );
* @param $indent int
*/
function slowWddxPrinter( $elemValue, $indent = 0 ) {
- $indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
- $indstr2 = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent + 2 ) );
- $nl = ( $this->getIsHtml() ? '' : "\n" );
+ $indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
+ $indstr2 = ( $this->getIsHtml() ? str_repeat( ' ', $indent + 2 ) : '' );
+ $nl = ( $this->getIsHtml() ? "\n" : '' );
if ( is_array( $elemValue ) ) {
// Check whether we've got an associative array (<struct>)
// or a regular array (<array>)
$this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
} elseif ( is_string( $elemValue ) ) {
$this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
+ } elseif ( is_bool( $elemValue ) ) {
+ $this->printText( $indstr . Xml::element( 'boolean',
+ array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
+ );
} else {
ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
}
return $this->mResolveRedirects;
}
+ /**
+ * Return the parameter name that is the source of data for this PageSet
+ *
+ * If multiple source parameters are specified (e.g. titles and pageids),
+ * one will be named arbitrarily.
+ *
+ * @return string|null
+ */
+ public function getDataSource() {
+ if ( $this->mAllowGenerator && isset( $this->mParams['generator'] ) ) {
+ return 'generator';
+ }
+ if ( isset( $this->mParams['titles'] ) ) {
+ return 'titles';
+ }
+ if ( isset( $this->mParams['pageids'] ) ) {
+ return 'pageids';
+ }
+ if ( isset( $this->mParams['revids'] ) ) {
+ return 'revids';
+ }
+ return null;
+ }
+
/**
* Request an additional field from the page table.
* Must be called before execute()
$this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
$pageSet = $this->getPageSet();
- $args = array_merge( array( $params, 'entirewatchlist' ), array_keys( $pageSet->getAllowedParams() ) );
- call_user_func_array( array( $this, 'requireOnlyOneParameter' ), $args );
+ if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
+ $this->dieUsage( "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'", 'multisource' );
+ }
$dbw = wfGetDB( DB_MASTER, 'api' );
wfDebug( __METHOD__ . ": no connection open\n" );
return false;
} else {
- $conn = $this->openConnection( $index );
+ $conn = $this->openConnection( $index, '' );
if ( !$conn ) {
wfDebug( __METHOD__ . ": failed to open connection\n" );
return false;
* @return String
*/
public function getReadableName() {
+ // Give grep a chance to find the usages:
+ // config-type-mysql, config-type-postgres, config-type-sqlite, config-type-oracle
return wfMessage( 'config-type-' . $this->getName() )->text();
}
'config-upgrade-done-no-regenerate' => "Upgrade complete.
You can now [$1 start using your wiki].",
- 'config-regenerate' => 'Regenerate <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerate LocalSettings.php →',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code> query failed!',
'config-unknown-collation' => "'''Warning:''' Database is using unrecognized collation.",
'config-db-web-account' => 'Database account for web access',
$allNames = array();
+ // Give grep a chance to find the usages:
+ // config-type-mysql, config-type-postgres, config-type-oracle, config-type-sqlite
foreach ( self::getDBTypes() as $name ) {
$allNames[] = wfMessage( "config-type-$name" )->text();
}
}
if ( count( $engines ) >= 2 ) {
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-mysql-innodb, config-mysql-myisam
$s .= $this->getRadioSet( array(
'var' => '_MysqlEngine',
'label' => 'config-mysql-engine',
// Do charset selector
if ( count( $charsets ) >= 2 ) {
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-mysql-binary, config-mysql-utf8
$s .= $this->getRadioSet( array(
'var' => '_MysqlCharset',
'label' => 'config-mysql-charset',
if ( $continue ) {
// Fake submit button for enter keypress (bug 26267)
+ // Give grep a chance to find the usages: config-continue
$s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
array( 'name' => "enter-$continue", 'style' =>
'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
}
if ( $back ) {
+ // Give grep a chance to find the usages: config-back
$s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
array(
'name' => "submit-$back",
}
if ( $continue ) {
+ // Give grep a chance to find the usages: config-continue
$s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
array(
'name' => "submit-$continue",
$settings = '';
$defaultType = $this->getVar( 'wgDBtype' );
+ // Give grep a chance to find the usages:
+ // config-support-mysql, config-support-postgres, config-support-oracle, config-support-sqlite
$dbSupport = '';
foreach( $this->parent->getDBTypes() as $type ) {
$link = DatabaseBase::factory( $type )->getSoftwareLink();
) .
"</li>\n";
+ // Give grep a chance to find the usages:
+ // config-header-mysql, config-header-postgres, config-header-oracle, config-header-sqlite
$settings .=
Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
'class' => 'dbWrapper' ) ) .
'label' => 'config-site-name',
'help' => $this->parent->getHelpBox( 'config-site-name-help' )
) ) .
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-ns-site-name, config-ns-generic, config-ns-other
$this->parent->getRadioSet( array(
'var' => '_NamespaceType',
'label' => 'config-project-namespace',
) ) .
$this->getFieldSetEnd() .
$this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-optional-continue, config-optional-skip
$this->parent->getRadioSet( array(
'var' => '_SkipOptional',
'itemLabelPrefix' => 'config-optional-',
$this->startForm();
$this->addHTML(
# User Rights
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-profile-wiki, config-profile-no-anon, config-profile-fishbowl, config-profile-private
$this->parent->getRadioSet( array(
'var' => '_RightsProfile',
'label' => 'config-profile',
$this->parent->getInfoBox( wfMessage( 'config-profile-help' )->plain() ) .
# Licensing
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+ // config-license-cc-0, config-license-pd, config-license-gfdl,
+ // config-license-none, config-license-cc-choose
$this->parent->getRadioSet( array(
'var' => '_LicenseCode',
'label' => 'config-license',
# Advanced settings
$this->getFieldSetStart( 'config-advanced-settings' ) .
# Object cache settings
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-cache-none, config-cache-accel, config-cache-memcached
$this->parent->getRadioSet( array(
'var' => 'wgMainCacheType',
'label' => 'config-cache-options',
return false;
}
} elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
+ // Give grep a chance to find the usages:
+ // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+ // config-license-cc-0, config-license-pd, config-license-gfdl,
+ // config-license-none, config-license-cc-choose
$entry = $this->parent->licenses[$code];
if ( isset( $entry['text'] ) ) {
$this->setVar( 'wgRightsText', $entry['text'] );
return $this->params;
}
+ /**
+ * @return integer|null UNIX timestamp to delay running this job until, otherwise null
+ * @since 1.22
+ */
+ public function getReleaseTimestamp() {
+ return isset( $this->params['jobReleaseTimestamp'] )
+ ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
+ : null;
+ }
+
/**
* @return bool Whether only one of each identical set of jobs should be run
*/
protected $order; // string; job priority for pop()
protected $claimTTL; // integer; seconds
protected $maxTries; // integer; maximum number of times to try a job
+ protected $checkDelay; // boolean; allow delayed jobs
const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
if ( !in_array( $this->order, $this->supportedOrders() ) ) {
throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
}
+ $this->checkDelay = !empty( $params['checkDelay'] );
+ if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
+ throw new MWException( __CLASS__ . " does not support delayed jobs." );
+ }
}
/**
* Get a job queue object of the specified type.
* $params includes:
- * - class : What job class to use (determines job type)
- * - wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
- * - type : The name of the job types this queue handles
- * - order : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
- * If "fifo" is used, the queue will effectively be FIFO. Note that
- * job completion will not appear to be exactly FIFO if there are multiple
- * job runners since jobs can take different times to finish once popped.
- * If "timestamp" is used, the queue will at least be loosely ordered
- * by timestamp, allowing for some jobs to be popped off out of order.
- * If "random" is used, pop() will pick jobs in random order.
- * Note that it may only be weakly random (e.g. a lottery of the oldest X).
- * If "any" is choosen, the queue will use whatever order is the fastest.
- * This might be useful for improving concurrency for job acquisition.
- * - claimTTL : If supported, the queue will recycle jobs that have been popped
- * but not acknowledged as completed after this many seconds. Recycling
- * of jobs simple means re-inserting them into the queue. Jobs can be
- * attempted up to three times before being discarded.
+ * - class : What job class to use (determines job type)
+ * - wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
+ * - type : The name of the job types this queue handles
+ * - order : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+ * If "fifo" is used, the queue will effectively be FIFO. Note that job
+ * completion will not appear to be exactly FIFO if there are multiple
+ * job runners since jobs can take different times to finish once popped.
+ * If "timestamp" is used, the queue will at least be loosely ordered
+ * by timestamp, allowing for some jobs to be popped off out of order.
+ * If "random" is used, pop() will pick jobs in random order.
+ * Note that it may only be weakly random (e.g. a lottery of the oldest X).
+ * If "any" is choosen, the queue will use whatever order is the fastest.
+ * This might be useful for improving concurrency for job acquisition.
+ * - claimTTL : If supported, the queue will recycle jobs that have been popped
+ * but not acknowledged as completed after this many seconds. Recycling
+ * of jobs simple means re-inserting them into the queue. Jobs can be
+ * attempted up to three times before being discarded.
+ * - checkDelay : If supported, respect Job::getReleaseTimestamp() in the push functions.
+ * This lets delayed jobs wait in a staging area until a given timestamp is
+ * reached, at which point they will enter the queue. If this is not enabled
+ * or not supported, an exception will be thrown on delayed job insertion.
*
* Queue classes should throw an exception if they do not support the options given.
*
abstract protected function optimalOrder();
/**
- * Quickly check if the queue is empty (has no available jobs).
+ * @return boolean Whether delayed jobs are supported
+ */
+ protected function supportsDelayedJobs() {
+ return false; // not implemented
+ }
+
+ /**
+ * Quickly check if the queue has no available (unacquired, non-delayed) jobs.
* Queue classes should use caching if they are any slower without memcached.
*
* If caching is used, this might return false when there are actually no jobs.
abstract protected function doIsEmpty();
/**
- * Get the number of available (unacquired) jobs in the queue.
+ * Get the number of available (unacquired, non-delayed) jobs in the queue.
* Queue classes should use caching if they are any slower without memcached.
*
* If caching is used, this number might be out of date for a minute.
*/
abstract protected function doGetAcquiredCount();
+ /**
+ * Get the number of delayed jobs (these are temporarily out of the queue).
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return integer
+ * @throws MWException
+ * @since 1.22
+ */
+ final public function getDelayedCount() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetDelayedCount();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getDelayedCount()
+ * @return integer
+ */
+ protected function doGetDelayedCount() {
+ return 0; // not implemented
+ }
+
/**
* Push a single jobs into the queue.
* This does not require $wgJobClasses to be set for the given job type.
foreach ( $jobs as $job ) {
if ( $job->getType() !== $this->type ) {
- throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ throw new MWException(
+ "Got '{$job->getType()}' job; expected a '{$this->type}' job." );
+ } elseif ( $job->getReleaseTimestamp() && !$this->checkDelay ) {
+ throw new MWException(
+ "Got delayed '{$job->getType()}' job; delays are not supported." );
}
}
protected function doFlushCaches() {}
/**
- * Get an iterator to traverse over all of the jobs in this queue.
- * This does not include jobs that are current acquired. In general,
- * this should only be called on a queue that is no longer being popped.
+ * Get an iterator to traverse over all available jobs in this queue.
+ * This does not include jobs that are currently acquired or delayed.
+ * This should only be called on a queue that is no longer being popped.
*
* @return Iterator|Traversable|Array
* @throws MWException
*/
abstract public function getAllQueuedJobs();
+ /**
+ * Get an iterator to traverse over all delayed jobs in this queue.
+ * This should only be called on a queue that is no longer being popped.
+ *
+ * @return Iterator|Traversable|Array
+ * @throws MWException
+ * @since 1.22
+ */
+ public function getAllDelayedJobs() {
+ return array(); // not implemented
+ }
+
/**
* Namespace the queue with a key to isolate it for testing
*
* This is faster, less resource intensive, queue that JobQueueDB.
* All data for a queue using this class is placed into one redis server.
*
- * There are seven main redis keys used to track jobs:
- * - l-unclaimed : A list of job IDs used for push/pop
+ * There are eight main redis keys used to track jobs:
+ * - l-unclaimed : A list of job IDs used for ready unclaimed jobs
* - z-claimed : A sorted set of (job ID, UNIX timestamp as score) used for job retries
* - z-abandoned : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
+ * - z-delayed : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
* - h-idBySha1 : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
* - h-sha1Byid : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
* - h-attempts : A hash of (job ID => attempt count) used for job claiming/retries
* - h-data : A hash of (job ID => serialized blobs) for job storage
- * Any given job ID can be in only one of l-unclaimed, z-claimed, and z-abandoned.
+ * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
* If an ID appears in any of those lists, it should have a h-data entry for its ID.
- * If a job has a non-empty SHA1 de-duplication value and its ID is in l-unclaimed,
- * then there should be no other such jobs. Every h-idBySha1 entry has an h-sha1Byid
+ * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
+ * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1Byid
* entry and every h-sha1Byid must refer to an ID that is l-unclaimed. If a job has its
* ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
*
- * Additionally, "rootjob:* keys to track "root jobs" used for additional de-duplication.
+ * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
* Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
* All the keys are prefixed with the relevant wiki ID information.
*
return 'fifo';
}
+ protected function supportsDelayedJobs() {
+ return true;
+ }
+
/**
* @see JobQueue::doIsEmpty()
* @return bool
}
}
+ /**
+ * @see JobQueue::doGetDelayedCount()
+ * @return integer
+ * @throws MWException
+ */
+ protected function doGetDelayedCount() {
+ if ( !$this->checkDelay ) {
+ return 0; // no delayed jobs
+ }
+ $conn = $this->getConnection();
+ try {
+ return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
/**
* @see JobQueue::doBatchPush()
* @param array $jobs
$items[$item['uuid']] = $item;
}
}
- // Convert the field maps into serialized blobs
- $tuples = array();
- foreach ( $items as $item ) {
- $tuples[] = array( $item['uuid'], $item['sha1'], serialize( $item ) );
- }
- if ( !count( $tuples ) ) {
+ if ( !count( $items ) ) {
return true; // nothing to do
}
try {
// Actually push the non-duplicate jobs into the queue...
if ( $flags & self::QoS_Atomic ) {
- $batches = array( $tuples ); // all or nothing
+ $batches = array( $items ); // all or nothing
} else {
- $batches = array_chunk( $tuples, 500 ); // avoid tying up the server
+ $batches = array_chunk( $items, 500 ); // avoid tying up the server
}
$failed = 0;
$pushed = 0;
- foreach ( $batches as $tupleBatch ) {
- $added = $this->pushBlobs( $conn, $tupleBatch );
+ foreach ( $batches as $itemBatch ) {
+ $added = $this->pushBlobs( $conn, $itemBatch );
if ( is_int( $added ) ) {
$pushed += $added;
} else {
- $failed += count( $tupleBatch );
+ $failed += count( $itemBatch );
}
}
if ( $failed > 0 ) {
wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
return false;
}
- wfIncrStats( 'job-insert', count( $tuples ) );
- wfIncrStats( 'job-insert-duplicate', count( $tuples ) - $failed - $pushed );
+ wfIncrStats( 'job-insert', count( $items ) );
+ wfIncrStats( 'job-insert-duplicate', count( $items ) - $failed - $pushed );
} catch ( RedisException $e ) {
$this->throwRedisException( $this->server, $conn, $e );
}
/**
* @param RedisConnRef $conn
- * @param array $tuples List of tuples of (job ID, job SHA1 or '', serialized blob)
+ * @param array $items List of results from JobQueueRedis::getNewJobFields()
* @return integer Number of jobs inserted (duplicates are ignored)
* @throws RedisException
*/
- protected function pushBlobs( RedisConnRef $conn, array $tuples ) {
+ protected function pushBlobs( RedisConnRef $conn, array $items ) {
$args = array(); // ([id, sha1, blob [, id, sha1, blob ... ] ] )
- foreach ( $tuples as $tuple ) {
- $args[] = $tuple[0]; // id
- $args[] = $tuple[1]; // sha1
- $args[] = $tuple[2]; // blob
+ foreach ( $items as $item ) {
+ $args[] = (string)$item['uuid'];
+ $args[] = (string)$item['sha1'];
+ $args[] = (string)$item['rtimestamp'];
+ $args[] = (string)serialize( $item );
}
static $script =
<<<LUA
- if #ARGV % 3 ~= 0 then return redis.error_reply('Unmatched arguments') end
+ if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
local pushed = 0
- for i = 1,#ARGV,3 do
- local id,sha1,blob = ARGV[i],ARGV[i+1],ARGV[i+2]
+ for i = 1,#ARGV,4 do
+ local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
if sha1 == '' or redis.call('hExists',KEYS[3],sha1) == 0 then
- redis.call('lPush',KEYS[1],id)
+ if 1*rtimestamp > 0 then
+ -- Insert into delayed queue (release time as score)
+ redis.call('zAdd',KEYS[4],rtimestamp,id)
+ else
+ -- Insert into unclaimed queue
+ redis.call('lPush',KEYS[1],id)
+ end
if sha1 ~= '' then
redis.call('hSet',KEYS[2],id,sha1)
redis.call('hSet',KEYS[3],sha1,id)
end
- redis.call('hSet',KEYS[4],id,blob)
+ redis.call('hSet',KEYS[5],id,blob)
pushed = pushed + 1
end
end
$this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
$this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
$this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
- $this->getQueueKey( 'h-data' ), # KEYS[4]
+ $this->getQueueKey( 'z-delayed' ), # KEYS[4]
+ $this->getQueueKey( 'h-data' ), # KEYS[5]
),
$args
),
- 4 # number of first argument(s) that are keys
+ 5 # number of first argument(s) that are keys
);
}
protected function doPop() {
$job = false;
+ // Push ready delayed jobs into the queue every 10 jobs to spread the load.
+ // This is also done as a periodic task, but we don't want too much done at once.
+ if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
+ $this->releaseReadyDelayedJobs();
+ }
+
$conn = $this->getConnection();
try {
do {
}
/**
- * This function should not be called outside RedisJobQueue
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllDelayedJobs() {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ throw new MWException( "Unable to connect to redis server." );
+ }
+ try {
+ $that = $this;
+ return new MappedIterator( // delayed jobs
+ $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
+ function( $uid ) use ( $that, $conn ) {
+ return $that->getJobFromUidInternal( $uid, $conn );
+ }
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * This function should not be called outside JobQueueRedis
*
* @param $uid string
* @param $conn RedisConnRef
}
}
+ /**
+ * Release any ready delayed jobs into the queue
+ *
+ * @return integer Number of jobs released
+ * @throws MWException
+ */
+ public function releaseReadyDelayedJobs() {
+ $count = 0;
+
+ $conn = $this->getConnection();
+ try {
+ static $script =
+<<<LUA
+ -- Get the list of ready delayed jobs, sorted by readiness
+ local ids = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+ -- Migrate the jobs from the "delayed" set to the "unclaimed" list
+ for k,id in ipairs(ids) do
+ redis.call('lPush',KEYS[2],id)
+ redis.call('zRem',KEYS[1],id)
+ end
+ return #ids
+LUA;
+ $count += (int)$this->redisEval( $conn, $script,
+ array(
+ $this->getQueueKey( 'z-delayed' ), // KEYS[1]
+ $this->getQueueKey( 'l-unclaimed' ), // KEYS[2]
+ time() // ARGV[1]; max "delay until" UNIX timestamp
+ ),
+ 2 # first two arguments are keys
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+
+ return $count;
+ }
+
/**
* Recycle or destroy any jobs that have been claimed for too long
*
* @return Array
*/
protected function doGetPeriodicTasks() {
+ $tasks = array();
if ( $this->claimTTL > 0 ) {
- return array(
- 'recycleAndDeleteStaleJobs' => array(
- 'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
- 'period' => ceil( $this->claimTTL / 2 )
- )
+ $tasks['recycleAndDeleteStaleJobs'] = array(
+ 'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+ 'period' => ceil( $this->claimTTL / 2 )
);
- } else {
- return array();
}
+ if ( $this->checkDelay ) {
+ $tasks['releaseReadyDelayedJobs'] = array(
+ 'callback' => array( $this, 'releaseReadyDelayedJobs' ),
+ 'period' => 300 // 5 minutes
+ );
+ }
+ return $tasks;
}
/**
* @return mixed
*/
protected function redisEval( RedisConnRef $conn, $script, array $params, $numKeys ) {
- $res = $conn->evalSha( sha1( $script ), $params, $numKeys );
- if ( $res === false && $conn->getLastError() != '' ) { // not in script cache?
- wfDebugLog( 'JobQueueRedis', "Lua script error: " . $conn->getLastError() );
+ $sha1 = sha1( $script ); // 40 char hex
+
+ // Try to run the server-side cached copy of the script
+ $conn->clearLastError();
+ $res = $conn->evalSha( $sha1, $params, $numKeys );
+ // If the script is not in cache, use eval() to retry and cache it
+ if ( $conn->getLastError() && $conn->script( 'exists', $sha1 ) === array( 0 ) ) {
+ $conn->clearLastError();
$res = $conn->eval( $script, $params, $numKeys );
+ wfDebugLog( 'JobQueueRedis', "Used eval() for Lua script $sha1." );
}
+
+ if ( $conn->getLastError() ) { // script bug?
+ wfDebugLog( 'JobQueueRedis', "Lua script error: " . $conn->getLastError() );
+ }
+
return $res;
}
protected function getNewJobFields( Job $job ) {
return array(
// Fields that describe the nature of the job
- 'type' => $job->getType(),
- 'namespace' => $job->getTitle()->getNamespace(),
- 'title' => $job->getTitle()->getDBkey(),
- 'params' => $job->getParams(),
+ 'type' => $job->getType(),
+ 'namespace' => $job->getTitle()->getNamespace(),
+ 'title' => $job->getTitle()->getDBkey(),
+ 'params' => $job->getParams(),
+ // Some jobs cannot run until a "release timestamp"
+ 'rtimestamp' => $job->getReleaseTimestamp() ?: 0,
// Additional job metadata
- 'uuid' => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
- 'sha1' => $job->ignoreDuplicates()
+ 'uuid' => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
+ 'sha1' => $job->ignoreDuplicates()
? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
: '',
- 'timestamp' => time() // UNIX timestamp
+ 'timestamp' => time() // UNIX timestamp
);
}
# Get all headlines for numbering them and adding funky stuff like [edit]
# links - this is for later, but we need the number of headlines right now
$matches = array();
- $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)(?P<header>.*?)<\/H[1-6] *>/i', $text, $matches );
+ $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
# if there are fewer than 4 headlines in the article, do not show TOC
# unless it's been explicitly enabled.
$serial = $markerMatches[1];
list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
$isTemplate = ( $titleText != $baseTitleText );
- $headline = preg_replace( "/^$markerRegex/", "", $headline );
+ $headline = preg_replace( "/^$markerRegex\\s*/", "", $headline );
}
if ( $toclevel ) {
}
# split up and insert constructed headlines
- $blocks = preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text );
+ $blocks = preg_split( '/<H[1-6].*?' . '>[\s\S]*?<\/H[1-6]>/i', $text );
$i = 0;
// build an array of document sections
'edit' => 'ܫܚܠܦ',
'create' => 'ܒܪܝ',
'editthispage' => 'ܫܚܠܦ ܦܐܬܐ ܗܕܐ',
-'create-this-page' => 'Ü\92ܪÜ\9d ܦܐܬܐ ܗܕܐ',
+'create-this-page' => 'Ü£Ü\9dÜ¡ ܦܐܬܐ ܗܕܐ',
'delete' => 'ܫܘܦ',
'deletethispage' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
'undelete_short' => 'ܠܐ ܫܘܦ {{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ|$1 ܫܘܚܠܦ̈ܐ}}',
'viewprevnext' => 'ܚܘܝ ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'ܓܒܝܬ̈ܐ ܕܒܨܝܐ',
'searchmenu-exists' => "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
-'searchmenu-new' => "'''Ü\92ܪÜ\9d ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
+'searchmenu-new' => "'''Ü£Ü\9dÜ¡ ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
'searchhelp-url' => 'Help:ܚܒܝܫܬ̈ܐ',
'searchprofile-articles' => 'ܦܐܬܬ̈ܐ ܕܚܒܝܫܬ̈ܐ',
'searchprofile-project' => 'ܦܐܬܬ̈ܐ ܕܬܪ̈ܡܝܬܐ ܘܕܥܘܕܪܢܐ',
'upload_source_file' => ' (ܠܦܦܐ ܥܠ ܚܫܘܒܬܐ ܕܝܠܟ)',
# Special:ListFiles
+'listfiles_search_for' => 'ܒܨܝ ܥܠ ܫܡܐ ܕܡܝܕܝܐ:',
'imgfile' => 'ܠܦܦܐ',
'listfiles' => 'ܡܟܬܒܘܬܐ ܕܠܦܦ̈ܐ',
'listfiles_thumb' => 'ܙܘܥܪܐ',
'blocked-mailpassword' => 'Ta bloquiada la edición dende la to direición IP, polo que pa evitar abusos nun se pue usar la función de recuperación de clave.',
'eauthentsent' => "Unvióse un corréu electrónicu de confirmación a la direición indicada.
Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu pa confirmar que la cuenta ye de to.",
-'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
-Pa evitar abusos, namái s'unviará un recordatoriu cada {{PLURAL:$1|hora|$1 hores}}.",
+'throttled-mailpassword' => "Yá s'unvió un corréu de reaniciu la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
+Pa evitar abusos, namái s'unviará un corréu de reaniciu cada {{PLURAL:$1|hora|$1 hores}}.",
'mailerror' => 'Fallu al unviar el corréu: $1',
'acct_creation_throttle_hit' => "Los visitantes d'esta wiki qu'usen la to direición IP yá crearon güei {{PLURAL:$1|1 cuenta|$1 cuentes}}, que ye'l máximu almitíu nesti periodu de tiempu.
Poro, los visitantes qu'usen esta direición IP nun puen crear más cuentes de momentu.",
# Special:PasswordReset
'passwordreset' => 'Reaniciar clave',
-'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu electrónicu que te recuerde los detalles de la to cuenta.',
+'passwordreset-text' => 'Complete esti formulariu pa reaniciar la contraseña.',
'passwordreset-legend' => 'Reaniciar clave',
'passwordreset-disabled' => 'Los reanicios de clave tán desactivaos nesta wiki.',
'passwordreset-pretext' => "{{PLURAL:$1||Escribi ún de los elementos de los datos d'abaxo}}",
'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola clave provisional) amás d'unvialu al usuariu.",
'passwordreset-email' => 'Direición de corréu electrónicu:',
'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Daquién (seique tu, dende la direición IP $1)solicitó un recordatoriu de los
-detalles de la to cuenta de {{SITENAME}} ($4).
+'passwordreset-emailtext-ip' => "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).
{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
a esta direición de corréu electrónicu:
$2
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nún día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona,
-o si recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir
-usando la to clave antigua.",
-'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un recordatoriu de los detalles de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
-a esta direición de corréu electrónicu:
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,
+o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir
+usando la contraseña antigua.",
+'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un reaniciu de la so contraseña de {{SITENAME}} ($4). {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}} con esta direición de corréu electrónicu:
$2
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona, o si
-recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir usando
-la to clave antigua.",
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona, o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir usando la contraseña antigua.",
'passwordreset-emailelement' => "Nome d'usuariu: $1
Clave provisional: $2",
-'passwordreset-emailsent' => 'Unvióse un corréu electrónicu de recordatoriu.',
-'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu de recordatoriu, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu de recordatoriu, que s'amuesa abaxo, pero falló'l so unviu al usuariu: $1",
+'passwordreset-emailsent' => 'Unvióse un corréu electrónicu pa reaniciar la contraseña.',
+'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
+'passwordreset-emailerror-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu al usuariu: $1",
# Special:ChangeEmail
'changeemail' => 'Camudar la direición de corréu electrónicu',
'loginreqtitle' => 'Necesítase identificación',
'loginreqlink' => 'identificate',
'loginreqpagetext' => 'Has $1 pa ver otres páxines.',
-'accmailtitle' => 'Clave unviada.',
+'accmailtitle' => 'Clave unviada',
'accmailtext' => "Unvióse a $2 una clave xenerada al debalu pal usuariu [[User talk:$1|$1]].
La clave d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar clave]]'' depués d'identificate.",
'newarticletext' => "Siguisti un enllaz a un artículu qu'inda nun esiste.
Pa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
-'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.
+'anontalkpagetext' => "----
+''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''
Pola mor d'ello ha usase la direición numbérica IP pa identificalu/la.
Tala IP pue ser compartida por varios usuarios.
-Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.''",
+Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
'noarticletext' => 'Nestos momentos nun hai testu nesta páxina.
Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos],
# Email user
'mailnologin' => "Ensin direición d'unviu",
-'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
-y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
-pa poder unviar correos a otros usuarios.',
+'mailnologintext' => 'Has tener [[Special:UserLogin|sesión aniciada]] y una direición de corréu válida nes tos [[Special:Preferences|preferencies]] pa poder unviar correos a otros usuarios.',
'emailuser' => 'Manda-y un corréu a esti usuariu',
'emailuser-title-target' => 'Unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}',
'emailuser-title-notarget' => 'Unviar un corréu electrónicu a un usuariu',
'emailccme' => 'Unviame per corréu una copia del mio mensaxe.',
'emailccsubject' => 'Copia del to mensaxe a $1: $2',
'emailsent' => 'Corréu unviáu',
-'emailsenttext' => 'El to corréu foi unviáu.',
+'emailsenttext' => "Unviose'l to mensaxe de corréu.",
'emailuserfooter' => 'Esti corréu electrónicu unviolu $1 a $2 per aciu de la función "Manda-y un corréu a un usuariu" de {{SITENAME}}.',
# User Messenger
'unblockip' => 'Desbloquiar usuariu',
'unblockiptext' => "Usa'l formulariu d'abaxo pa restablecer l'accesu d'escritura a una direicion IP o a un nome d'usuariu previamente bloquiáu.",
'ipusubmit' => 'Desaniciar esti bloquéu',
-'unblocked' => '[[User:$1|$1]] foi desbloquiáu',
+'unblocked' => '[[User:$1|$1]] desbloquióse.',
'unblocked-range' => '$1 se desbloquió',
-'unblocked-id' => 'El bloquéu $1 foi elimináu',
+'unblocked-id' => "Desaniciose'l bloquéu $1.",
'blocklist' => 'Usuarios bloquiaos',
'ipblocklist' => 'Usuarios bloquiaos',
'ipblocklist-legend' => 'Atopar un usuariu bloquiáu',
'anononlyblock' => 'namái anón.',
'noautoblockblock' => 'bloquéu automáticu desactiváu',
'createaccountblock' => 'bloquiada la creación de cuentes',
-'emailblock' => 'corréu electrónicu bloquiáu',
+'emailblock' => 'corréu electrónicu desactiváu',
'blocklist-nousertalk' => "nun pue editar la so páxina d'alderique",
'ipblocklist-empty' => 'La llista de bloqueos ta vacia.',
'ipblocklist-no-results' => "La direición IP o nome d'usuariu solicitáu nun ta bloquiáu.",
'block-log-flags-anononly' => 'namái usuarios anónimos',
'block-log-flags-nocreate' => 'creación de cuentes desactivada',
'block-log-flags-noautoblock' => 'bloquéu automáticu deshabilitáu',
-'block-log-flags-noemail' => 'corréu electrónicu bloquiáu',
+'block-log-flags-noemail' => 'corréu electrónicu desactiváu',
'block-log-flags-nousertalk' => "nun pue editar la páxina d'alderique propia",
'block-log-flags-angry-autoblock' => 'autobloquéu ameyoráu activáu',
'block-log-flags-hiddenname' => "nome d'usuariu anubríu",
# Email address confirmation
'confirmemail' => 'Confirmar direición de corréu',
'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
-funcionalidaes de mensaxes. Da-y al botón que tienes equí embaxo pa unviar un avisu de
-confirmación a la to direición. Esti avisu va incluyir un enllaz con un códigu; carga
-l'enllaz nel to navegador pa confirmar la to direición de corréu electrónicu.",
+'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les carauterístiques de corréu.
+Da-y al botón que tienes equí embaxo pa unviar un corréu de confirmación a la to direición.
+El corréu va incluyir un enllaz con un códigu; carga l'enllaz nel to navegador pa confirmar que la to direición de corréu electrónicu ye válida.",
'confirmemail_pending' => "Yá s'unvió un códigu de confirmación a la to direición de corréu; si creasti hai poco la to cuenta, pues esperar dellos minutos a que-y de tiempu a llegar enantes de pidir otru códigu nuevu.",
'confirmemail_send' => 'Unviar códigu de confirmación',
'confirmemail_sent' => 'Corréu de confirmación unviáu.',
'confirmemail_oncreate' => "Unvióse un códigu de confirmación a la to direición de corréu.
-Esti códigu nun se necesita pa identificase, pero tendrás que lu conseñar enantes
-d'activar cualesquier funcionalidá de la wiki que tea rellacionada col corréu.",
+Esti códigu nun se necesita p'aniciar sesión, pero tendrás que conseñalu enantes d'activar cualesquier carauterística de la wiki que tea rellacionada col corréu.",
'confirmemail_sendfailed' => '{{SITENAME}} nun pudo unviar el to corréu de confirmación.
Por favor comprueba que nun punxeras carauteres non válidos na to direición de corréu.
'confirmemail_loggedin' => 'Quedó confirmada la to direición de corréu.',
'confirmemail_error' => 'Hebo un problema al guardar la to confirmación.',
'confirmemail_subject' => 'Confirmación de la direición de corréu de {{SITENAME}}',
-'confirmemail_body' => 'Daquién, seique tu dende la IP $1, rexistró la cuenta "$2" con
+'confirmemail_body' => 'Daquién, seique tu, dende la IP $1, rexistró la cuenta "$2" con
esta direición de corréu en {{SITENAME}}.
-Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les funcionalidaes
+Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les carauterístiques
de corréu en {{SITENAME}}, abri esti enllaz nel to navegador:
$3
-Si *nun* rexistrasti tu la cuenta, da-y a esti enllaz pa cancelar
+Si *nun* rexistrasti tu la cuenta, sigui esti enllaz pa encaboxar
la confirmación de la direición de corréu electrónicu:
$5
$5
Esti códigu de confirmación caduca\'l $4.',
-'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu cancelada',
-'invalidateemail' => 'Cancelar confirmación de corréu electrónicu',
+'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu encaboxada',
+'invalidateemail' => 'Encaboxar confirmación de corréu electrónicu',
# Scary transclusion
'scarytranscludedisabled' => '[La tresclusión interwiki ta desactivada]',
'scarytranscludetoolong' => '[La URL ye demasiao llarga]',
# Delete conflict
-'deletedwhileediting' => "'''Avisu''': ¡Esta páxina foi esborrada depués de qu'entamaras a editala!",
+'deletedwhileediting' => "'''Avisu''': ¡Esta páxina desanicióse depués de qu'entamaras a editala!",
'confirmrecreate' => "L'usuariu [[User:$1|$1]] ([[User talk:$1|alderique]]) esborró esta páxina depués de qu'empecipiaras a editala pol siguiente motivu:
: ''$2''
Por favor confirma que daveres quies volver a crear esta páxina.",
'sqlite-no-fts' => '$1 ensin sofitu pa gueta en testu completu',
# New logging system
-'logentry-delete-delete' => '$1 desanició la páxina $3',
-'logentry-delete-restore' => '$1 restauró la páxina $3',
-'logentry-delete-event' => "$1 camudó la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-delete-revision' => "$1 camudó la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-delete-event-legacy' => '$1 camudó la visibilidá de los socesos del rexistru en $3',
-'logentry-delete-revision-legacy' => '$1 camudó la visibilidá de les revisiones na páxina $3',
-'logentry-suppress-delete' => '$1 suprimió la páxina $3',
-'logentry-suppress-event' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-suppress-revision' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-suppress-event-legacy' => '$1 camudó en secretu la visibilidá de los socesos del rexistru en $3',
-'logentry-suppress-revision-legacy' => '$1 camudó en secretu la visibilidá de les revisiones na páxina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|desanició}} la páxina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restauró}} la páxina $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de los socesos del rexistru en $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de les revisiones na páxina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimió}} la páxina $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de los socesos del rexistru en $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de les revisiones na páxina $3',
'revdelete-content-hid' => 'conteníu tapecíu',
'revdelete-summary-hid' => "resume d'edición tapecíu",
'revdelete-uname-hid' => "nome d'usuariu anubríu",
'revdelete-uname-unhid' => "nome d'usuariu non anubríu",
'revdelete-restricted' => 'aplicaes les restricciones a los alministradores',
'revdelete-unrestricted' => 'eliminaes les restricciones a los alministradores',
-'logentry-move-move' => '$1 treslladó la páxina "$3" a "$4"',
-'logentry-move-move-noredirect' => '$1 treslladó la páxina "$3" a "$4" ensin dexar una redireición',
-'logentry-move-move_redir' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición',
-'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
-'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
-'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
-'logentry-newusers-newusers' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create2' => "$1 creó la cuenta d'usuariu $3",
-'logentry-newusers-byemail' => "$1 creó la cuenta d'usuariu $3 y la contraseña uviose per corréu electrónicu",
-'logentry-newusers-autocreate' => 'La cuenta $1 creóse automáticamente',
-'logentry-rights-rights' => '$1 camudó la pertenencia a grupos de $3 dende $4 a $5',
-'logentry-rights-rights-legacy' => '$1 camudó la pertenencia a grupos de $3',
-'logentry-rights-autopromote' => '$1 promocionó automáticamente de $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" ensin dexar una redireición',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcó}} la revisión $4 de la páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcó}} automáticamente la revisión $4 de la páxina "$3" como patrullada',
+'logentry-newusers-newusers' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create2' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3",
+'logentry-newusers-byemail' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3 y la contraseña unvióse per corréu electrónicu",
+'logentry-newusers-autocreate' => 'La cuenta $1 {{GENDER:$2|creóse}} automáticamente',
+'logentry-rights-rights' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5',
'rightsnone' => '(nengún)',
# Feedback
{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.
Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.',
-'passwordreset-emailtext-user' => 'Ð\9fоÑ\82Ñ\80ебиÑ\82ел $1 оÑ\82 {{SITENAME}} поиÑ\81ка напомнÑ\8fне за данниÑ\82е оÑ\82 сметката в {{SITENAME}}
+'passwordreset-emailtext-user' => 'Ð\9fоÑ\82Ñ\80ебиÑ\82ел $1 оÑ\82 {{SITENAME}} поиÑ\81ка вÑ\8aзÑ\81Ñ\82ановÑ\8fване на паÑ\80олаÑ\82а за сметката в {{SITENAME}}
($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:
$2
{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.
-Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена
+Сега би трябвало да влезете в системата и да изберете нова парола. Ако заявката е направена
от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете
това съобщение и да продължите да използвате старата си парола.',
'passwordreset-emailelement' => 'Потребителско име: $1
Временна парола: $2',
'passwordreset-emailsent' => 'На електронната поща беше испратено писмо за възстановяване на паролата.',
-'passwordreset-emailsent-capture' => 'Ð\9fо-долÑ\83 е показано елекÑ\82Ñ\80онноÑ\82о пиÑ\81мо за напомнÑ\8fне, което беше изпратено.',
-'passwordreset-emailerror-capture' => 'Ð\9fо-долÑ\83 е показано Ñ\81Ñ\8aздадено елекÑ\82Ñ\80онно пиÑ\81мо за напомнÑ\8fне, което не беше изпратено на потребителя: $1',
+'passwordreset-emailsent-capture' => 'Ð\9fо-долÑ\83 е показано елекÑ\82Ñ\80онноÑ\82о пиÑ\81мо за вÑ\8aзÑ\81Ñ\82ановÑ\8fване на паÑ\80олаÑ\82а, което беше изпратено.',
+'passwordreset-emailerror-capture' => 'Ð\9fо-долÑ\83 е показано Ñ\81Ñ\8aздадено елекÑ\82Ñ\80онно пиÑ\81мо за вÑ\8aзÑ\81Ñ\82ановÑ\8fване на паÑ\80олаÑ\82а, което не беше изпратено на потребителя: $1',
# Special:ChangeEmail
'changeemail' => 'Промяна на адреса за е-поща',
'enotif_mailer' => 'Известяване по пощата на {{SITENAME}}',
'enotif_reset' => 'Отбелязване на всички страници като посетени',
'enotif_impersonal_salutation' => 'Потребител на {{SITENAME}}',
+'enotif_body_intro_deleted' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} на $PAGEEDITDATE от $2. Вижте $3.',
+'enotif_body_intro_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|създадена}} на $PAGEEDITDATE от $2. За текущата версия, вижте $3',
'enotif_lastvisited' => 'Преглед на всички промени след последното ви посещение: $1.',
'enotif_lastdiff' => 'Преглед на тази промяна: $1.',
'enotif_anon_editor' => 'анонимен потребител $1',
'enotif_body' => 'Уважаеми(а) $WATCHINGUSERNAME,
-Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED на $PAGEEDITDATE от $PAGEEDITOR. За текущата версия на страницата, вижте $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Резюме на редакцията: $PAGESUMMARY $PAGEMINOREDIT
Няма да получавате други известия за последващи промени, докато не посетите страницата.
Можете да актуализиране настройките си за този вид известия за всички страници от вашия списък за наблюдение.
- Системата за известяване на {{SITENAME}}
+Системата за известяване на {{SITENAME}}
--
-Ð\97а да пÑ\80омениÑ\82е наÑ\81Ñ\82Ñ\80ойкиÑ\82е Ñ\81и за извеÑ\81Ñ\82Ñ\8fваниÑ\8f Ñ\87Ñ\80ез елекÑ\82Ñ\80онна поÑ\89а, поÑ\81еÑ\82еÑ\82е
+Ð\9fÑ\80омÑ\8fна на наÑ\81Ñ\82Ñ\80ойкиÑ\82е за извеÑ\81Ñ\82Ñ\8fваниÑ\8f Ñ\87Ñ\80ез елекÑ\82Ñ\80онна поÑ\89а може да Ñ\81е извÑ\8aÑ\80Ñ\88и на
{{canonicalurl:{{#special:Preferences}}}}
-Ð\97а да пÑ\80омениÑ\82е наÑ\81Ñ\82Ñ\80ойкиÑ\82е на Ñ\81пиÑ\81Ñ\8aка Ñ\81и за наблÑ\8eдение, поÑ\81еÑ\82еÑ\82е
+Ð\9fÑ\80омÑ\8fна на наÑ\81Ñ\82Ñ\80ойкиÑ\82е на Ñ\81пиÑ\81Ñ\8aка за наблÑ\8eдение Ñ\81е извÑ\8aÑ\80Ñ\88ва на
{{canonicalurl:{{#special:EditWatchlist}}}}
-Ð\97а да изÑ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а оÑ\82 Ñ\81пиÑ\81Ñ\8aка Ñ\81и за наблÑ\8eдение, поÑ\81еÑ\82еÑ\82е
+Ð\98зÑ\82Ñ\80иванеÑ\82о на Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а оÑ\82 Ñ\81пиÑ\81Ñ\8aка за наблÑ\8eдение Ñ\81Ñ\82ава Ñ\87Ñ\80ез
$UNWATCHURL
За обратна връзка и помощ:
'pageinfo-header-basic' => 'Основна информация',
'pageinfo-header-edits' => 'История на редакциите',
'pageinfo-header-restrictions' => 'Защита на страницата',
+'pageinfo-default-sort' => 'Ключ за сортиране по подразбиране',
'pageinfo-article-id' => 'Номер на страницата',
'pageinfo-views' => 'Брой прегледи',
'pageinfo-watchers' => 'Брой наблюдаващи страницата',
'yournick' => 'واژووی نوێ:',
'prefs-help-signature' => 'بۆچوونەکان لە لاپەڕەکانی وتووێژدا دەبێ بە "<nowiki>~~~~</nowiki>" دیاری بکرێن، کە دواتر خۆکار دەگۆڕێ بە واژۆکەت و مۆری کاتی.',
'badsig' => 'ئیمزاكه ههڵهیه، تهماشای كۆدی HTML بكه',
-'badsiglength' => 'واژۆکەت زۆر درێژە.
-واژۆ نابێ لە $1 {{PLURAL:$1|نووسە|نووسە}} درێژتر بێت.',
+'badsiglength' => 'واژووەکەت زۆر درێژە.
+واژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.',
'yourgender' => 'زایەند:',
'gender-unknown' => 'ئاشکرا نەکراو',
'gender-male' => 'پیاو',
'prefs-help-email-required' => 'ناونیشانی ئیمەیل پێویستە.',
'prefs-info' => 'زانیاریی سەرەتایی',
'prefs-i18n' => 'نێونەتەویی کردن',
-'prefs-signature' => 'واژۆ',
+'prefs-signature' => 'واژوو',
'prefs-dateformat' => 'ڕازاندنەوەی ڕێکەوت',
'prefs-timeoffset' => 'قەرەبووکەری کات',
'prefs-advancedediting' => 'ھەڵبژاردەکانی پێشکەوتوو',
'nchanges' => '$1 {{PLURAL:$1|денъиштирме}}',
'recentchanges' => 'Сонъки денъиштирмелер',
'recentchanges-legend' => 'Сонъки денъиштирмелер сазламалары',
-'recentchanges-summary' => 'Япылгъан энъ сонъки денъишикликлерни бу саифеде корип оласынъыз.',
+'recentchanges-summary' => 'Япылгъан энъ сонъки денъиштирмелерни бу саифеде корип оласынъыз.',
'recentchanges-feed-description' => 'Бу лента вастасынен викиде сонъки денъиштирмелерни козет.',
'recentchanges-label-newpage' => 'Бу денъиштирме янъы бир саифе яратты',
'recentchanges-label-minor' => 'Бу, кичик бир денъиштирме',
'nchanges' => '$1 {{PLURAL:$1|deñiştirme}}',
'recentchanges' => 'Soñki deñiştirmeler',
'recentchanges-legend' => 'Soñki deñiştirmeler sazlamaları',
-'recentchanges-summary' => 'Yapılğan eñ soñki deñişikliklerni bu saifede körip olasıñız.',
+'recentchanges-summary' => 'Yapılğan eñ soñki deñişitirmelerni bu saifede körip olasıñız.',
'recentchanges-feed-description' => 'Bu lenta vastasınen vikide soñki deñiştirmelerni közet.',
'recentchanges-label-newpage' => 'Bu deñiştirme yañı bir saife yarattı',
'recentchanges-label-minor' => 'Bu, kiçik bir deñiştirme',
'tog-justify' => 'Unioni paragraffau',
'tog-hideminor' => 'Cuddio golygiadau bychain yn rhestr y newidiadau diweddar',
'tog-hidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar',
-'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag y rhestr dudalennau newydd',
+'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag rhestr y tudalennau newydd',
'tog-extendwatchlist' => "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
'tog-usenewrc' => "Yn dangos newidiadau i un dudalen gyda'i gilydd - ar 'newidiadau diweddar' a'r 'rhestr wylio' (angen JavaScript)",
'tog-numberheadings' => "Rhifo penawdau'n awtomatig",
'blocked-mailpassword' => 'Gan fod eich cyfeiriad IP wedi ei atal rhag golygu, ni ellir adfer y cyfrinair.',
'eauthentsent' => 'Anfonwyd e-bost o gadarnhâd at y cyfeiriad a benwyd.
Cyn y gellir anfon unrhywbeth arall at y cyfeiriad hwnnw rhaid i chi ddilyn y cyfarwyddiadau yn yr e-bost hwnnw er mwyn cadarnhau bod y cyfeiriad yn un dilys.',
-'throttled-mailpassword' => "Anfonwyd e-bost atoch i'ch atgoffa o'ch cyfrinair eisoes, yn ystod y $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}} diwethaf.
-Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}}.",
+'throttled-mailpassword' => "Anfonwyd e-bost atoch eisoes i'ch atgoffa o'ch cyfrinair, a hynny yn ystod y $1 {{PLURAL:$1|awr}} diwethaf.
+Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr}}.",
'mailerror' => 'Gwall wrth ddanfon yr e-bost: $1',
'acct_creation_throttle_hit' => "Mae ymwelwyr sy'n defnyddio'ch cyfeiriad IP wedi creu $1 {{PLURAL:$1|cyfrif|cyfrif|gyfrif|chyfrif|chyfrif|cyfrif}} yn ystod y diwrnod diwethaf, sef y mwyafswm a ganiateir mewn diwrnod.
Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfrifon ar hyn o bryd.",
# Special:PasswordReset
'passwordreset' => 'Ailosod cyfrinair',
-'passwordreset-text' => "Cwblhewch y ffurflen hon er mwyn derbyn e-bost i'ch atgoffa o fanylion eich cyfrif.",
+'passwordreset-text' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
'passwordreset-legend' => 'Ailosod y cyfrinair',
'passwordreset-disabled' => 'Analluogwyd ailosod cyfrineiriau ar y wici hwn.',
'passwordreset-pretext' => "{{PLURAL:$1|||Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod}}",
'passwordreset-capture-help' => "Os y ticiwch y blwch hwn, bydd yr e-bost (gyda'r cyfrinair dros dro) yn cael ei ddangos i chi yn ogystal a chael ei anfon at y defnyddiwr.",
'passwordreset-email' => 'Eich cyfeiriad e-bost:',
'passwordreset-emailtitle' => 'Manylion eich cyfrif ar {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am nodyn atgoffa o fanylion eich cyfrif ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am ailosod eich cyfrinair ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
$2
-Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
-'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ei atgoffa o fanylion eich cyfrif ar {{SITENAME}}
-($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
+'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ailosod ei gyfrinair ar {{SITENAME}}
+($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
$2
-Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau|cyfrineiriau|cyfrineiriau|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}.
+Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod}}.
Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
'passwordreset-emailelement' => "Enw'r defnyddiwr: $1
Y cyfrinair dros dro: $2",
-'passwordreset-emailsent' => 'Anfonwyd nodyn atgoffa drwy e-bost.',
-'passwordreset-emailsent-capture' => 'Anfonwyd e-bost atgoffa, a ddangosir isod.',
-'passwordreset-emailerror-capture' => "Lluniwyd e-bost atgoffa fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+'passwordreset-emailsent' => 'Anfonwyd e-bost i ailosod eich cyfrinair atoch.',
+'passwordreset-emailsent-capture' => "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
+'passwordreset-emailerror-capture' => "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
# Special:ChangeEmail
'changeemail' => 'Newid y cyfeiriad e-bost',
'logentry-delete-delete' => 'Dileodd $1 y dudalen $3',
'logentry-delete-restore' => 'Adferodd $1 y dudalen $3',
'logentry-delete-event' => 'Newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
'logentry-delete-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3',
'logentry-delete-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3",
'logentry-suppress-delete' => 'Cuddiodd $1 y dudalen $3',
'logentry-suppress-event' => 'Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
'logentry-suppress-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3, yn y dirgel',
'logentry-suppress-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
'revdelete-content-hid' => 'cuddiwyd y cynnwys',
'revdelete-uname-unhid' => 'datguddiwyd yr enw defnyddiwr',
'revdelete-restricted' => 'cyfyngwyd ar allu gweinyddwyr i weld',
'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
-'logentry-move-move' => 'Symudwyd y dudalen $3 i $4 gan $1',
-'logentry-move-move-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 heb adael dolen ailgyfeirio',
+'logentry-move-move' => 'Symudodd $1 y dudalen $3 i $4',
+'logentry-move-move-noredirect' => 'Symudodd $1 y dudalen $3 i $4 heb adael dolen ailgyfeirio',
'logentry-move-move_redir' => 'Symudwyd y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
'namespace' => 'Cayê namey:',
'invert' => 'Weçinıtışo peyserki',
'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan zerrekan nımtışi re ena dore tesdiqi nışan kerê',
-'namespace_association' => 'Cayê nameyanê eleqedaran',
+'namespace_association' => 'Cayê nameyanê elaqedaran',
'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
'blanknamespace' => '(Ser)',
'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
'logentry-move-move' => "Karber $1' pelay $3' berd $4",
'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
-'logentry-move-move_redir' => '$1 pela $3 pela da $4 sera hetenayış ra ahulnê',
+'logentry-move-move_redir' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da $3 ahulnê $4 sero hetenayış vıraşt',
'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol ke",
'protect-locked-access' => "Din brükerkonto ferfäiget ai ouer da nüsie ruchte tu jü änring foon e sideschüts. Heer san da aktuäle sideschütsönjstalinge fon jü sid '''„$1“:'''",
'protect-cascadeon' => 'Jüdeer sid as nütutids diilj foon e kaskaadenspäre. Jü as önj {{PLURAL:$1|jü füliende sid|da füliende side}} önjbünen, huk döör jü kaskaadenspäropsjoon schütsed {{PLURAL:$1|as|san}}. Di sideschütsstatus koon for jüdeer sid änred wårde, dåtdeer heet ouers nån influs aw jü kaskaadenspäre:',
'protect-default' => 'Åle brükere',
-'protect-fallback' => 'Jü "$1"-beruchtiging as nüsi.',
-'protect-level-autoconfirmed' => 'Späring for naie än ai registriirde brükere',
-'protect-level-sysop' => 'Bloot administratoore',
+'protect-fallback' => 'Ferloof bluas för brükern mä "$1"-rochten.',
+'protect-level-autoconfirmed' => 'Ferloof bluas för registriaret brükern.',
+'protect-level-sysop' => 'Ferloof bluas för administratooren.',
'protect-summary-cascade' => 'kaskadiirend',
'protect-expiring' => 'bit $2, am e klook $3 (UTC)',
'protect-cascade' => 'Kaskadiirende späre - åle önj jüdeer sid önjbünene forlååge wårde uk spärd.',
Dü bast deerfor feroontuurdlik, dåt links fortönj ap dåt koräkt muul wise.
Jü sid wårt '''ai''' ferschääwen, wan dåt ål en sid ma di seelew noome jeeft,
-süwid jüdeer ai lääsi unti en widerliidjing suner färsjoonshistoori as. Dåtdeer bedjüset,
+süwid jüdeer ai bloots en widerliidjing suner färsjoonshistoori as. Dåtdeer bedjüset,
dåt dü jü sid tubääg ferschüwe koost, wan dü en fäägel mååged heest. Dü koost
deeriinj niinj sid ouerschriwe.
'history' => 'Stare izmjene',
'history_short' => 'Stare izmjene',
'updatedmarker' => 'obnovljeno od zadnjeg posjeta',
-'printableversion' => 'Verzija za ispis',
+'printableversion' => 'Inačica za ispis',
'permalink' => 'Trajna poveznica',
'print' => 'Ispiši',
'view' => 'Vidi',
'filedelete-success' => "Datoteka '''$1''' je izbrisana.",
'filedelete-success-old' => "Inačica datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
'filedelete-nofile' => "'''$1''' ne postoji.",
-'filedelete-nofile-old' => "Nema arhivirane verzije datoteke '''$1''' s zadanim parametrima.",
+'filedelete-nofile-old' => "Nema arhivirane inačice datoteke '''$1''' sa zadanim parametrima.",
'filedelete-otherreason' => 'Drugi/dodatni razlog:',
'filedelete-reason-otherlist' => 'Drugi razlog',
'filedelete-reason-dropdown' => '*Česti razlozi brisanja
# Export
'export' => 'Izvezi stranice',
-'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u XML kod. U budućim verzijama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna verzija to još ne podržava.
+'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u kȏd XML. U budućim inačicama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna inačica to još ne podržava.
Za izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutačnu inačicu zajedno sa svim prijašnjima, ili samo trenutačnu inačicu s informacijom o zadnjoj promjeni.
* @author 欅
* @author 蝋燭α
* @author 青子守歌
+ * @author 아라
*/
$datePreferences = array(
この申請をしたのが他人の場合、あるいはパスワードを思い出してパスワード変更が不要になった場合は、
このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
'noemail' => '利用者「$1」のメールアドレスは登録されていません。',
-'noemailcreate' => '有効なメールアドレスを入力する必要があります',
+'noemailcreate' => '有効なメールアドレスを入力する必要があります。',
'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスにお送りしました。
メールが届いたら、再度ログインしてください。',
'blocked-mailpassword' => 'ご使用中のIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
'index-category' => 'ទំព័រដែលមានលិបិក្រម',
'noindex-category' => 'ទំព័រដែលគ្មានលិបិក្រម',
'broken-file-category' => 'ទំព័រទាំងឡាយដែលដាច់តំណភ្ជាប់',
+'categoryviewer-pagedlinks' => '($1) ($2)',
+
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
'about' => 'អំពី',
'article' => 'មាតិកាអត្ថបទ',
'ok' => 'យល់ព្រម',
'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
'retrievedfrom' => 'បានពី "$1"',
'youhavenewmessages' => 'អ្នកមាន $1 ($2)។',
'newmessageslink' => 'សារថ្មីៗ',
'newmessagesdifflinkplural' => '{{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}ចុងក្រោយ',
'youhavenewmessagesmulti' => 'អ្នកមានសារថ្មីៗនៅ $1',
'editsection' => 'កែប្រែ',
+'editsection-brackets' => '[$1]',
'editold' => 'កែប្រែ',
'viewsourceold' => 'មើលកូដ',
'editlink' => 'កែប្រែ',
'site-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ $1',
'page-rss-feed' => 'បម្រែបម្រួល RSS Feed នៃ "$1"',
'page-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ "$1"',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
'red-link-title' => '$1 (ទំព័រនេះមិនទាន់មាននៅឡើយទេ)',
'sort-descending' => 'តម្រៀបតាមលំដាប់ចុះ',
'sort-ascending' => 'តម្រៀបតាមលំដាប់ឡើង',
អ្នកបានជ្រើសមិនប្រើខូឃី។
សូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
'noname' => 'អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។',
'loginsuccesstitle' => 'កត់ឈ្មោះចូលបានសំរេច',
'loginsuccess' => "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"\$1\"។'''",
# Special:PasswordReset
'passwordreset' => 'កំណត់ពាក្យសម្ងាត់សាឡើងវិញ',
'passwordreset-text' => 'បំពេញសំណុំបែបបទនេះដើម្បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីព័ត៌មានលំអិតរបស់គណនីរបស់អ្នក។',
-'passwordreset-legend' => 'á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9e¾á\9e\98',
+'passwordreset-legend' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e¶á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89',
'passwordreset-disabled' => 'មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្នន័យខាងក្រោម}}',
'passwordreset-username' => 'អត្តនាម៖',
'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
'prefs-personal' => 'ប្រវត្តិរូប',
-'prefs-rc' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
+'prefs-rc' => 'á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
'prefs-watchlist' => 'បញ្ជីតាមដាន',
'prefs-watchlist-days' => 'ចំនួនថ្ងៃត្រូវបង្ហាញក្នុងបញ្ជីតាមដាន៖',
'prefs-watchlist-days-max' => 'អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
'enotif_reset' => 'កត់សម្គាល់រាល់គ្រប់ទំព័រដែលបានចូលមើល',
'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
'enotif_lastvisited' => 'ពិនិត្យ $1 សម្រាប់គ្រប់បន្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយ។',
-'enotif_lastdiff' => 'សូមពិនិត្យ$1ដើម្បីមើលបន្លាស់ប្តូរនេះ។',
+'enotif_lastdiff' => 'សូមពិនិត្យ $1 ដើម្បីមើលបំលាស់ប្តូរនេះ។',
'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
'enotif_body' => 'ជូនចំពោះ $WATCHINGUSERNAME ជាទីរាប់អាន,
'tog-editsection' => '[편집] 링크로 부분 편집하기',
'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 부분 편집하기 (자바스크립트 필요)',
'tog-showtoc' => '문서의 차례 보여주기 (머릿글이 4개 이상인 경우)',
-'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1일)',
+'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
'tog-watchcreations' => '내가 만드는 문서와 내가 올린 파일을 주시문서 목록에 추가',
'tog-watchdefault' => '내가 편집하는 문서와 파일을 주시문서 목록에 추가',
'tog-watchmoves' => '내가 이동하는 문서와 파일을 주시문서 목록에 추가',
'category-empty' => '이 분류에 속하는 문서나 자료가 없습니다.',
'hidden-categories' => '{{PLURAL:$1|숨은 분류}}',
'hidden-category-category' => '숨은 분류',
-'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 하위 분류 $2개 가운데 $1개입니다.}}',
-'category-subcat-count-limited' => '이 분류에 하위 분류 $1개가 있습니다.',
-'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 문서 $2개 가운데 $1개입니다.}}',
-'category-article-count-limited' => '이 분류에 문서 $1개가 있습니다.',
-'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 파일 $2개 가운데 $1개입니다.}}',
-'category-file-count-limited' => '이 분류에 파일 $1개가 있습니다.',
+'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|하위 분류}} $2개 가운데 $1개입니다.}}',
+'category-subcat-count-limited' => '이 분류에 {{PLURAL:$1|하위 분류}} $1개가 있습니다.',
+'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|문서}} $2개 가운데 $1개입니다.}}',
+'category-article-count-limited' => '이 분류에 {{PLURAL:$1|문서}} $1개가 있습니다.',
+'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|파일}} $2개 가운데 $1개입니다.}}',
+'category-file-count-limited' => '이 분류에 {{PLURAL:$1|파일}} $1개가 있습니다.',
'listingcontinuesabbrev' => '(계속)',
'index-category' => '색인된 문서',
'noindex-category' => '색인에서 제외되는 문서',
'create-this-page' => '이 문서 만들기',
'delete' => '삭제',
'deletethispage' => '이 문서 삭제하기',
-'undelete_short' => '편집 $1개 되살리기',
-'viewdeleted_short' => '삭제된 편집 $1개 보기',
+'undelete_short' => '{{PLURAL:$1|편집 $1개}} 되살리기',
+'viewdeleted_short' => '{{PLURAL:$1|삭제된 편집 $1개}} 보기',
'protect' => '보호',
'protect_change' => '보호 수준 바꾸기',
'protectthispage' => '이 문서 보호하기',
'redirectedfrom' => '($1에서 넘어옴)',
'redirectpagesub' => '넘겨주기 문서',
'lastmodifiedat' => '이 문서는 $1 $2에 마지막으로 바뀌었습니다.',
-'viewcount' => '이 문서는 $1번 읽혔습니다.',
+'viewcount' => '이 문서는 {{PLURAL:$1|$1번}} 읽혔습니다.',
'protectedpage' => '보호된 문서',
'jumpto' => '이동:',
'jumptonavigation' => '둘러보기',
$1',
'pool-timeout' => '잠금 대기 중 타임아웃',
-'pool-queuefull' => '풀 큐가 가득 찼습니다.',
+'pool-queuefull' => '풀 큐가 가득 찼습니다',
'pool-errorunknown' => '알 수 없는 오류',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'ok' => '확인',
'retrievedfrom' => '원본 주소 "$1"',
-'youhavenewmessages' => '다른 사용자가 $1란에 글을 남겼습니다. ($2)',
+'youhavenewmessages' => '다른 사용자가 $1에 글을 남겼습니다. ($2)',
'newmessageslink' => '사용자 토론',
'newmessagesdifflink' => '마지막 바뀐 내용',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1란에 글을 남겼습니다. ($2)',
-'youhavenewmessagesmanyusers' => '여러 사용자가 $1란에 글을 남겼습니다. ($2)',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1에 글을 남겼습니다. ($2)',
+'youhavenewmessagesmanyusers' => '여러 사용자가 $1에 글을 남겼습니다. ($2)',
'newmessageslinkplural' => '{{PLURAL:$1|사용자 토론}}',
'newmessagesdifflinkplural' => '마지막 {{PLURAL:$1|바뀐 내용}}',
-'youhavenewmessagesmulti' => '다른 사용자가 $1란에 글을 남겼습니다.',
+'youhavenewmessagesmulti' => '다른 사용자가 $1에 글을 남겼습니다',
'editsection' => '편집',
'editold' => '편집',
'viewsourceold' => '내용 보기',
'collapsible-expand' => '펼치기',
'thisisdeleted' => '$1을 보거나 되살리겠습니까?',
'viewdeleted' => '$1을 보겠습니까?',
-'restorelink' => '삭제된 편집 $1개',
+'restorelink' => '{{PLURAL:$1|삭제된 편집 $1개}}',
'feedlinks' => '피드:',
'feed-invalid' => '잘못된 구독 피드 방식입니다.',
'feed-unavailable' => '피드 서비스는 제공하지 않습니다',
'yourname' => '사용자 이름:',
'yourpassword' => '비밀번호:',
'yourpasswordagain' => '비밀번호 다시 입력:',
-'remembermypassword' => '이 컴퓨터에서 로그인 상태를 저장하기 (최대 $1일)',
+'remembermypassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
'yourdomainname' => '도메인 이름:',
'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
'loginsuccesstitle' => '로그인 성공',
'loginsuccess' => "'''{{SITENAME}}에 \"\$1\" 계정으로 로그인했습니다.'''",
'nosuchuser' => '"$1" 사용자가 존재하지 않습니다.
-사용자 이름은 대소문자를 구별합니다. 철자가 맞는지 확인해주세요.
-[[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
+사용자 이름은 대소문자를 구별합니다.
+철자가 맞는지 확인해주세요. [[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
'nosuchusershort' => '이름이 "$1"인 사용자는 없습니다.
철자가 맞는지 확인하세요.',
'nouserspecified' => '사용자 이름을 입력하지 않았습니다.',
다시 시도하세요.',
'wrongpasswordempty' => '비밀번호를 입력하지 않았습니다.
다시 시도하세요.',
-'passwordtooshort' => '비밀번호는 $1 문자 이상이어야 합니다.',
+'passwordtooshort' => '비밀번호는 {{PLURAL:$1|$1 글자}} 이상이어야 합니다.',
'password-name-match' => '비밀번호는 사용자 이름과 반드시 달라야 합니다.',
'password-login-forbidden' => '이 사용자 이름과 비밀번호는 사용할 수 없습니다.',
'mailmypassword' => '새 비밀번호를 이메일로 보내기',
'passwordremindertext' => '$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.
"$2" 사용자의 임시 비밀번호는 "$3"로 설정되었습니다. 이것이 자신이 의도한 바라면
지금 로그인하여 새로운 비밀번호를 만드세요.
-임시 비밀번호는 $5일 후에 만료됩니다.
+임시 비밀번호는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면
이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.',
'noemail' => '"$1" 사용자는 이메일 주소를 등록하지 않았습니다.',
-'noemailcreate' => '바른 이메일 주소를 제공해야 합니다.',
+'noemailcreate' => '올바른 이메일 주소를 제공해야 합니다.',
'passwordsent' => '"$1" 계정의 새로운 비밀번호를 이메일로 보냈습니다.
비밀번호를 받고 다시 로그인해 주세요.',
'blocked-mailpassword' => '당신의 IP 주소는 편집을 할 수 없게 차단되어 있어서 악용하지 못하도록 비밀번호 되살리기 기능 사용이 금지됩니다.',
'throttled-mailpassword' => '비밀번호 재설정 이메일을 이미 최근 {{PLURAL:$1|$1시간}} 안에 보냈습니다.
악용을 방지하기 위해 비밀번호 재설정 메일은 {{PLURAL:$1|$1시간}}마다 오직 하나씩만 보낼 수 있습니다.',
'mailerror' => '메일 보내기 오류: $1',
-'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 만들어, 계정 만들기 한도를 초과하였습니다.
+'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 {{PLURAL:$1|계정 $1개}}를 만들어, 계정 만들기 한도를 초과하였습니다.
따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.',
'emailauthenticated' => '이메일 주소는 $2 $3에 인증되었습니다.',
'emailnotauthenticated' => '이메일 주소를 인증하지 않았습니다.
지금 로그인하여 비밀번호를 바꾸십시오.
실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.',
-'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다.',
+'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다',
'login-throttled' => '로그인에 연속으로 실패하였습니다.
잠시 후에 다시 시도해주세요.',
'login-abort-generic' => '로그인에 실패했습니다 - 중지됨',
$2
-이 {{PLURAL:$3|임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
+{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,
원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고
이전의 비밀번호를 계속 사용할 수 있습니다.',
'link_sample' => '링크 제목',
'link_tip' => '안쪽 링크',
'extlink_sample' => 'http://www.example.com 사이트 이름',
-'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다.)',
+'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다)',
'headline_sample' => '제목',
'headline_tip' => '2단계 문단 제목',
'nowiki_sample' => '여기에 위키 문법을 사용하지 않을 글을 적어 주세요',
'loginreqtitle' => '로그인 필요',
'loginreqlink' => '로그인',
'loginreqpagetext' => '다른 문서를 보기 위해서는 $1해야 합니다.',
-'accmailtitle' => '비밀번호를 보냈습니다.',
+'accmailtitle' => '비밀번호를 보냈습니다',
'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2로 전송되었습니다.
새 비밀번호는 로그인한 후 [[Special:ChangePassword|비밀번호를 바꿀]] 수 있습니다.',
'''아직 저장하지 않았습니다!'''",
'userjspreview' => "'''사용자 자바스크립트 미리 보기입니다.'''
'''아직 저장하지 않았습니다!'''",
-'sitecsspreview' => "'''ì\9d´ CSSì\9d\98 미리 보기ì\9d¼ ë¿\90ì\9e\85ë\8b\88ë\8b¤.'''
+'sitecsspreview' => "'''이 CSS의 미리 보기입니다.'''
'''아직 저장하지 않았습니다!'''",
-'sitejspreview' => "'''ì\9d´ ì\9e\90ë°\94ì\8a¤í\81¬ë¦½í\8a¸ ì½\94ë\93\9cì\9d\98 미리 보기ì\9d¼ ë¿\90ì\9e\85ë\8b\88ë\8b¤.'''
+'sitejspreview' => "'''이 자바스크립트 코드의 미리 보기입니다.'''
'''아직 저장하지 않았습니다!'''",
'userinvalidcssjstitle' => "'''경고''': \"\$1\" 스킨은 없습니다.
.css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
'templatesusedsection' => '이 문단에서 사용하고 있는 {{PLURAL:$1|틀}}:',
'template-protected' => '(보호됨)',
'template-semiprotected' => '(준보호됨)',
-'hiddencategories' => '이 문서는 다음 숨은 분류 $1개에 속해 있습니다:',
+'hiddencategories' => '이 문서는 다음 {{PLURAL:$1|숨은 분류 1개|숨은 분류 $1개}}에 속해 있습니다:',
'edittools' => '<!-- 이 문서는 편집 창과 파일 올리기 창에 출력됩니다. -->',
'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 만드는 것은 제한되어 있습니다.
이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들 수 있습니다]].',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''경고:''' 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.
-$2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
+$2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개를 쓰고 있습니다}}.",
'expensive-parserfunction-category' => '느린 파서 함수 호출을 너무 많이 하는 문서',
'post-expand-template-inclusion-warning' => "'''경고:''' 틀 포함 크기가 너무 큽니다.
일부 틀은 포함되지 않을 수 있습니다.",
# "Undo" feature
'undo-success' => '편집을 되돌릴 수 있습니다.
-í\8e¸ì§\91 ë\90\98ë\8f\8c리기를 ì\99\84ë£\8cí\95\98ë ¤ë©´ ì\9d´ í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8cë¦¬ë ¤ë©´ ì\95\84ë\9e\98ì\9d\98 ë°\94ë\80\9c ì\82¬í\95을 확인한 후 저장해주세요.',
+í\8e¸ì§\91 ë\90\98ë\8f\8c리기를 ì\99\84ë£\8cí\95\98ë ¤ë©´ ì\9d´ í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8cë¦¬ë ¤ë©´ ì\95\84ë\9e\98ì\9d\98 ë°\94ë\80\90 ë\82´ì\9a©을 확인한 후 저장해주세요.',
'undo-failure' => '중간의 다른 편집과 충돌하여 이 편집을 되돌릴 수 없습니다.',
'undo-norev' => '문서가 없거나 삭제되었기 때문에 편집을 되돌릴 수 없습니다.',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]]) 의 $1판 편집을 되돌림',
'history-show-deleted' => '삭제된 것만',
'histfirst' => '처음',
'histlast' => '마지막',
-'historysize' => '($1 바이트)',
+'historysize' => '({{PLURAL:$1|1 바이트|$1 바이트}})',
'historyempty' => '(비었음)',
# Revision feed
숨겨진 판과 이 판의 편집 비교를 할 수 있습니다. 자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 해당 숨김 기록]에서 찾아볼 수 있습니다.",
'rev-delundel' => '보이기/숨기기',
'rev-showdeleted' => '보이기',
-'revisiondelete' => 'í\8c\90 ì\82ì \9c/복구',
+'revisiondelete' => 'í\8c\90 ì\82ì \9c/ë\90\98ì\82´ë¦¬ê¸°',
'revdelete-nooldid-title' => '대상 판이 잘못되었습니다.',
'revdelete-nooldid-text' => '이 기능을 수행할 특정 판을 제시하지 않았거나 해당 판이 없습니다. 또는 현재 판을 숨기려 하고 있을 수도 있습니다.',
'revdelete-nologtype-title' => '기록의 종류가 제시되지 않았습니다.',
'revdelete-selected' => "'''[[:$1]]의 {{PLURAL:$2|선택한 판}}:'''",
'logdelete-selected' => "'''{{PLURAL:$1|선택한 기록}}:'''",
'revdelete-text' => "'''삭제된 판과 기록은 문서 역사와 기록에 계속 나타나지만, 내용은 공개되지 않을 것입니다.'''
-{{SITENAME}}ì\9d\98 ë\8b¤ë¥¸ ê´\80리ì\9e\90ë\8a\94 ë\8b¤ë¥¸ ì \9cí\95\9cì\9d´ ì\84¤ì \95ë\90\98ì\96´ ì\9e\88ì§\80 ì\95\8aë\8a\94 í\95\9c, ì\88¨ê²¨ì§\84 ë\82´ì\9a©ì\9d\84 ë³¼ ì\88\98 ì\9e\88ê³ , ê°\99ì\9d\80 ë\8f\84구를 ì\9d´ì\9a©í\95´ 복구í\95 수 있습니다.",
+{{SITENAME}}ì\9d\98 ë\8b¤ë¥¸ ê´\80리ì\9e\90ë\8a\94 ë\8b¤ë¥¸ ì \9cí\95\9cì\9d´ ì\84¤ì \95ë\90\98ì\96´ ì\9e\88ì§\80 ì\95\8aë\8a\94 í\95\9c, ì\88¨ê²¨ì§\84 ë\82´ì\9a©ì\9d\84 ë³¼ ì\88\98 ì\9e\88ê³ , ê°\99ì\9d\80 ë\8f\84구를 ì\9d´ì\9a©í\95´ ë\90\98ì\82´ë¦´ 수 있습니다.",
'revdelete-confirm' => '이 작업을 수행하는 것의 결과를 알고 있으며, [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지 확인해주세요.',
'revdelete-suppress-text' => "숨기기는 '''다음 경우에만''' 사용되어야 합니다:
* 잠재적인 비방 정보
'revdelete-radio-set' => '예',
'revdelete-radio-unset' => '아니오',
'revdelete-suppress' => '문서 내용을 관리자에게도 보이지 않게 숨기기',
-'revdelete-unsuppress' => '복구ë\90\9c 판에 대한 제한을 해제',
+'revdelete-unsuppress' => 'ë\90\98ì\82´ë¦° 판에 대한 제한을 해제',
'revdelete-log' => '이유:',
'revdelete-submit' => '선택한 {{PLURAL:$1|판}}에 적용',
'revdelete-success' => "'''판의 보이기 설정을 성공적으로 바꾸었습니다.'''",
'mergehistory-go' => '합칠 수 있는 편집 보기',
'mergehistory-submit' => '문서 역사 합치기',
'mergehistory-empty' => '합칠 수 있는 판이 없습니다.',
-'mergehistory-success' => '[[:$1]] 문서의 판 $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
+'mergehistory-success' => '[[:$1]] 문서의 {{PLURAL:$3|판}} $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
'mergehistory-fail' => '문서 역사 합치기 명령을 수행할 수 없습니다. 문서와 시간 변수를 다시 확인하십시오.',
'mergehistory-no-source' => '원본인 $1 문서가 존재하지 않습니다.',
'mergehistory-no-destination' => '대상인 $1 문서가 존재하지 않습니다.',
'compareselectedversions' => '선택한 판을 비교하기',
'showhideselectedversions' => '선택한 판을 보이기/숨기기',
'editundo' => '편집 취소',
-'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} 중간의 편집 $1개 숨겨짐)',
-'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} 중간의 편집 $1개 숨겨짐)',
-'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 없습니다.
+'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
+'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
+'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.
이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.
자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.',
'notitlematches' => '해당하는 제목 없음',
'textmatches' => '문서 내용 일치',
'notextmatches' => '해당하는 문서 없음',
-'prevn' => '이전 $1개',
-'nextn' => '다음 $1개',
-'prevn-title' => '이전 결과 $1개',
-'nextn-title' => '다음 결과 $1개',
-'shown-title' => '쪽마다 ê²°ê³¼ $1ê°\9cì\94© ë³´ì\9d´ê¸°',
+'prevn' => '이전 {{PLURAL:$1|$1개}}',
+'nextn' => '다음 {{PLURAL:$1|$1개}}',
+'prevn-title' => '이전 {{PLURAL:$1|결과}} $1개',
+'nextn-title' => '다음 {{PLURAL:$1|결과}} $1개',
+'shown-title' => '쪽마다 {{PLURAL:$1|ê²°ê³¼}} $1ê°\9cì\94© 보기',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) 보기',
'searchmenu-legend' => '찾기 설정',
'searchmenu-exists' => "'''이 위키에 \"[[:\$1]]\"의 이름을 가진 문서가 있습니다.'''",
'searchprofile-images-tooltip' => '파일 찾기',
'searchprofile-everything-tooltip' => '토론 문서를 포함한 모든 문서 찾기',
'searchprofile-advanced-tooltip' => '다음 설정한 이름공간에서 찾기',
-'search-result-size' => '$1 ($2 단어)',
-'search-result-category-size' => '문서 {{PLURAL:$1|1|$1}}개, 하위 분류 {{PLURAL:$2|1|$2}}개, 파일 {{PLURAL:$3|1|$3}}',
+'search-result-size' => '$1 ({{PLURAL:$2|1 단어|$2 단어}})',
+'search-result-category-size' => '{{PLURAL:$1|문서 1개|문서 $1개}}, {{PLURAL:$2|하위 분류 1개|하위 분류 $2개}}, {{PLURAL:$3|파일 1개|파일 $3개}}',
'search-result-score' => '유사도: $1%',
'search-redirect' => '($1에서 넘어옴)',
'search-section' => '($1 문단)',
'searcheverything-enable' => '모든 이름공간에서 찾기',
'searchrelated' => '관련',
'searchall' => '모두',
-'showingresults' => '<strong>$2</strong>번 부터의 <strong>결과 $1개</strong>입니다.',
-'showingresultsnum' => "'''$2'''번 부터의 '''결과 $3개''' 입니다.",
-'showingresultsheader' => "'''$4''' 검색어에 대하여 결과 '''$3'''개 중 {{PLURAL:$5|'''$1'''개|'''$1 - $2'''번째}}를 보여 주고 있습니다.",
+'showingresults' => "'''$2'''번 부터의 {{PLURAL:$1|결과 '''1'''개|결과 '''$1'''개}}입니다.",
+'showingresultsnum' => "'''$2'''번 부터의 {{PLURAL:$3|결과 '''1'''개|결과 '''$3'''개}} 입니다.",
+'showingresultsheader' => "'''$4''' 검색어에 대하여 {{PLURAL:$5|결과 '''$3'''개 중 '''$1'''개|결과 '''$3'''개 중 '''$1 - $2'''번째}}를 보여 주고 있습니다",
'nonefound' => "'''참고''': 몇개의 이름공간만 기본 찾을 범위입니다. 토론이나 틀 등의 모든 자료를 찾하기 위해서는 접두어로 '''all:''' 어떤 이름공간을 위해서는 접두어로 그 이름공간을 쓸 수 있습니다.",
'search-nonefound' => '찾기 결과가 없습니다.',
'powersearch' => '고급 찾기',
'powersearch-redir' => '넘겨주기 목록',
'powersearch-field' => '찾기',
'powersearch-togglelabel' => '확인:',
-'powersearch-toggleall' => '모두 선택',
+'powersearch-toggleall' => '모두',
'powersearch-togglenone' => '없음',
'search-external' => '바깥 찾기',
'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
'stub-threshold' => '링크를 <a href="#" class="stub">토막글</a> 형식으로 보여줄 문서 크기 (바이트 수):',
'stub-threshold-disabled' => '비활성화됨',
'recentchangesdays' => '최근 바뀜에 보여줄 날짜 수:',
-'recentchangesdays-max' => '최대 $1일',
+'recentchangesdays-max' => '최대 $1{{PLURAL:$1|일}}',
'recentchangescount' => '기본으로 보여줄 편집 수:',
'prefs-help-recentchangescount' => '이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.',
'prefs-help-watchlist-token' => '아래에 비밀 값을 넣으면 주시문서 목록에 대한 RSS 피드가 만들어집니다.
'prefs-custom-js' => '사용자 자바스크립트',
'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/자바스크립트:',
'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 되돌릴 수 있습니다.
-복구í\95 수 없습니다.',
+ë\90\98ë\8f\8c릴 수 없습니다.',
'prefs-emailconfirm-label' => '이메일 인증:',
'prefs-textboxsize' => '편집창의 크기',
'youremail' => '이메일:',
'badsig' => '서명이 잘못되었습니다.
HTML 태그를 확인하세요.',
'badsiglength' => '서명이 너무 깁니다.
-서명은 $1자보다 짧아야 합니다.',
+서명은 $1 {{PLURAL:$1|글자}}보다 짧아야 합니다.',
'yourgender' => '성별:',
'gender-unknown' => '무응답',
'gender-male' => '남성',
'right-writeapi' => 'API 작성',
'right-delete' => '문서 삭제',
'right-bigdelete' => '문서 역사가 긴 문서를 삭제',
-'right-deletelogentry' => '특정 기록 항목을 삭제 및 복구',
-'right-deleterevision' => '문서의 특정 판을 삭제 및 복구',
+'right-deletelogentry' => '특정 기록 항목을 삭제하고 되살리기',
+'right-deleterevision' => '문서의 특정 판을 삭제하고 되살리기',
'right-deletedhistory' => '삭제된 문서의 내용을 제외한 역사를 보기',
'right-deletedtext' => '삭제된 문서의 내용과 편집상의 차이를 보기',
'right-browsearchive' => '삭제된 문서 찾기',
-'right-undelete' => 'ì\82ì \9cë\90\9c 문ì\84\9c 복구',
-'right-suppressrevision' => 'ê´\80리ì\9e\90ë\8f\84 ë³´ì§\80 못í\95\98ë\8f\84ë¡\9d ì\88¨ê²¨ì§\84 í\8c\90ì\9d\98 í\99\95ì\9d¸ ë°\8f 복구',
+'right-undelete' => 'ì\82ì \9cë\90\9c 문ì\84\9c ë\90\98ì\82´ë¦¬ê¸°',
+'right-suppressrevision' => 'ê´\80리ì\9e\90ë\8f\84 ë³´ì§\80 못í\95\98ë\8f\84ë¡\9d ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³ ë\90\98ì\82´ë¦¬ê¸°',
'right-suppressionlog' => '숨겨진 기록을 보기',
'right-block' => '다른 사용자를 편집을 못하도록 차단',
'right-blockemail' => '다른 사용자가 이메일을 보내지 못하도록 차단',
'action-deleterevision' => '이 판을 삭제',
'action-deletedhistory' => '이 문서의 삭제된 기여의 역사 보기',
'action-browsearchive' => '삭제된 문서 찾기',
-'action-undelete' => 'ì\9d´ 문ì\84\9c를 복구í\95\98기',
-'action-suppressrevision' => 'ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³ ë³µêµ¬í\95 ',
+'action-undelete' => 'ì\9d´ 문ì\84\9c를 ë\90\98ì\82´ë¦¬기',
+'action-suppressrevision' => 'ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³ ë\90\98ì\82´ë¦´',
'action-suppressionlog' => '비공개 기록 보기',
'action-block' => '이 사용자를 편집하지 못하도록 차단',
'action-protect' => '이 문서의 보호 설정을 바꾸기',
'minoreditletter' => '잔글',
'newpageletter' => '새글',
'boteditletter' => '봇',
-'number_of_watching_users_pageview' => '[$1명이 주시하고 있음]',
+'number_of_watching_users_pageview' => '[{{PLURAL:$1|사용자}} $1명이 주시하고 있음]',
'rc_categories' => '다음 분류로 제한 ("|"로 구분)',
'rc_categories_any' => '모두',
'rc-change-size-new' => '바꾼 후 $1 {{PLURAL:$1|바이트}}',
'filetype-bad-ie-mime' => '인터넷 익스플로러가 잠재적으로 위험한 파일 형식으로 판단되어 사용이 금지된 "$1"로 인식할 수 있기 때문에 이 파일을 올릴 수 없습니다.',
'filetype-unwanted-type' => "'''\".\$1\"''' 확장자는 추천하지 않습니다.
추천하는 {{PLURAL:\$3|파일 확장자}}는 \$2입니다.",
-'filetype-banned-type' => '{{PLURAL:$3$4}}\'\'\'".$1"\'\'\' 형식의 파일은 올릴 수 없습니다.
-$2 형식만 사용할 수 있습니다.',
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|형식의 파일은 올릴 수 없습니다}}.
+$2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
'filetype-missing' => '파일에 확장자(".jpg" 등)가 없습니다.',
'empty-file' => '올린 파일이 비어 있습니다.',
'file-too-large' => '올리려는 파일이 너무 큽니다.',
'backend-fail-connect' => '"$1" 저장 백엔드에 접속하지 못했습니다.',
'backend-fail-internal' => '"$1" 저장 백엔드에 알 수 없는 오류가 발생했습니다.',
'backend-fail-contenttype' => '"$1"에 저장하기 위한 파일의 내용 유형을 판별하지 못했습니다.',
-'backend-fail-batchsize' => 'ì \80ì\9e¥ ë°±ì\97\94ë\93\9cì\97\90ì\84\9c í\8c\8cì\9d¼ {{PLURAL:$1|ì\9e\91ì\97\85}} $1ê°\9cê°\80 ì\8c\93ì\97¬ ì\9e\88ì\8aµë\8b\88ë\8b¤. í\95\9cê³\84ë\8a\94 $2개입니다.',
+'backend-fail-batchsize' => 'ì \80ì\9e¥ ë°±ì\97\94ë\93\9cì\97\90ì\84\9c í\8c\8cì\9d¼ {{PLURAL:$1|ì\9e\91ì\97\85}} $1ê°\9cê°\80 ì\8c\93ì\98\80ì\8aµë\8b\88ë\8b¤. í\95\9cê³\84ë\8a\94 {{PLURAL:$2|ì\9e\91ì\97\85}} $2개입니다.',
'backend-fail-usable' => '파일 읽기/쓰기 권한이 없거나 저장 위치가 빠졌기 때문에 "$1" 파일을 읽거나 쓸 수 없습니다.',
# File journal errors
'filehist-comment' => '내용',
'filehist-missing' => '파일을 찾을 수 없음',
'imagelinks' => '이 파일을 사용하는 문서',
-'linkstoimage' => '다음 문서 $1개가 이 파일을 사용하고 있습니다:',
-'linkstoimage-more' => '$1개 이상의 문서가 이 파일을 가리키고 있습니다.
-다음 목록은 이 파일을 가리키는 처음 $1개 문서만 보여주고 있습니다.
-이 파일을 가리키는 모ë\93 문ì\84\9c를 ë³´ë ¤ë©´ [[Special:WhatLinksHere/$2|ì\97¬ê¸°]]를 ì°¸ê³ í\95´ 주ì\8bì\8b\9cì\98¤.',
+'linkstoimage' => '다음 {{PLURAL:$1|문서 $1개}}가 이 파일을 가리키고 있습니다:',
+'linkstoimage-more' => '$1개 이상의 {{PLURAL:$1|문서}}가 이 파일을 가리키고 있습니다.
+다음 목록은 이 파일을 {{PLURAL:$1|가리키는 처음 문서 $1개}}만 보여주고 있습니다.
+이 파일을 가리키는 [[Special:WhatLinksHere/$2|모ë\93 문ì\84\9c 목ë¡\9d]]ì\9d\84 ë³¼ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
'nolinkstoimage' => '이 파일을 사용하는 문서가 없습니다.',
'morelinkstoimage' => '이 파일이 쓰이고 있는 문서 목록 [[Special:WhatLinksHere/$1|더 보기]].',
'linkstoimage-redirect' => '$1 (파일 넘겨주기) $2',
-'duplicatesoffile' => '다음 파일 $1개가 이 파일과 중복됩니다 ([[Special:FileDuplicateSearch/$2|자세한 정보]]):',
+'duplicatesoffile' => '다음 {{PLURAL:$1|파일 $1개}}가 이 파일과 중복됩니다 ([[Special:FileDuplicateSearch/$2|자세한 정보]]):',
'sharedupload' => '이 파일은 $1으로부터 왔고, 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.',
'sharedupload-desc-there' => '이 파일은 $1에 있으며, 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.
[$2 해당 파일]에 대한 자세한 정보를 확인해주세요.',
** 저작권 침해
** 중복된 파일',
'filedelete-edit-reasonlist' => '삭제 이유 편집',
-'filedelete-maintenance' => 'ì \90ê²\80 ì¤\91ì\97\90ë\8a\94 ì\9e\84ì\8b\9cì \81ì\9c¼ë¡\9c ì\82ì \9cì\99\80 복구를 할 수 없습니다.',
+'filedelete-maintenance' => 'ì \90ê²\80 ì¤\91ì\97\90ë\8a\94 ì\9e\84ì\8b\9cì \81ì\9c¼ë¡\9c ì\82ì \9cì\99\80 ë\90\98ì\82´ë¦¬ê¸°를 할 수 없습니다.',
'filedelete-maintenance-title' => '파일을 삭제할 수 없습니다',
# MIME search
'statistics-views-peredit' => '편집당 방문 횟수',
'statistics-users' => '등록된 [[Special:ListUsers|사용자]]',
'statistics-users-active' => '활동적인 사용자',
-'statistics-users-active-desc' => '최근 $1일 동안 활동한 사용자',
+'statistics-users-active-desc' => '최근 {{PLURAL:$1|$1일}} 동안 활동한 사용자',
'statistics-mostpopular' => '가장 많이 읽힌 문서',
'disambiguations' => '동음이의 문서를 가리키는 문서 목록',
'fewestrevisions' => '편집 역사가 짧은 문서 목록',
# Miscellaneous special pages
-'nbytes' => '$1 바이트',
-'ncategories' => '분류 $1개',
+'nbytes' => '$1 {{PLURAL:$1|바이트}}',
+'ncategories' => '{{PLURAL:$1|분류}} $1개',
'ninterwikis' => '{{PLURAL:$1|인터위키}} $1개',
-'nlinks' => '링크 $1개',
-'nmembers' => '문서 $1개',
-'nrevisions' => '편집 $1개',
-'nviews' => '$1회 읽음',
-'nimagelinks' => '문서 $1개에서 사용 중',
-'ntransclusions' => '문서 $1개에서 사용 중',
+'nlinks' => '{{PLURAL:$1|링크}} $1개',
+'nmembers' => '{{PLURAL:$1|문서}} $1개',
+'nrevisions' => '{{PLURAL:$1|판}} $1개',
+'nviews' => '$1번 {{PLURAL:$1|읽음}}',
+'nimagelinks' => '{{PLURAL:$1|문서}} $1개에서 사용 중',
+'ntransclusions' => '{{PLURAL:$1|문서}} $1개에서 사용 중',
'specialpage-empty' => '명령에 대한 결과가 없습니다.',
'lonelypages' => '외톨이 문서 목록',
'lonelypagestext' => '{{SITENAME}}에서 다른 모든 문서에서 링크되거나 틀로 포함되지 않은 문서의 목록입니다.',
'listusers' => '사용자 목록',
'listusers-editsonly' => '기여가 있는 사용자만 보기',
'listusers-creationsort' => '계정 등록일 순으로 정렬',
-'usereditcount' => '편집 $1회',
+'usereditcount' => '{{PLURAL:$1|편집}} $1회',
'usercreated' => '$1 $2에 계정 {{GENDER:$3|만들어짐}}',
'newpages' => '새 문서 목록',
'newpages-username' => '사용자 이름:',
'notargettext' => '기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.',
'nopagetitle' => '해당 문서 없음',
'nopagetext' => '찾는 문서가 존재하지 않습니다.',
-'pager-newer-n' => '이전 $1개',
-'pager-older-n' => '다음 $1개',
+'pager-newer-n' => '{{PLURAL:$1|다음 1개|다음 $1개}}',
+'pager-older-n' => '{{PLURAL:$1|이전 1개|이전 $1개}}',
'suppress' => '오버사이트',
'querypage-disabled' => '이 특수 문서는 성능상의 이유로 비활성화되었습니다.',
# Special:Categories
'categories' => '분류 목록',
-'categoriespagetext' => '{{PLURAL:$1}}문서나 자료를 담고 있는 분류 목록입니다.
+'categoriespagetext' => '문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.
[[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.
[[Special:WantedCategories|필요한 분류]]도 참고하세요.',
'categoriesfrom' => '다음으로 시작하는 분류를 보여주기:',
# Special:ActiveUsers
'activeusers' => '활동적인 사용자 목록',
-'activeusers-intro' => '다음은 최근 $1일 동안 활동한 사용자의 목록입니다.',
-'activeusers-count' => '최근 {{PLURAL:$3|1일|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
+'activeusers-intro' => '다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.',
+'activeusers-count' => '최근 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
'activeusers-from' => '다음으로 시작하는 사용자를 보기:',
'activeusers-hidebots' => '봇을 숨기기',
'activeusers-hidesysops' => '관리자를 숨기기',
'notanarticle' => '문서가 아님',
'notvisiblerev' => '이 판은 삭제되었습니다.',
'watchnochange' => '주어진 기간 중에 바뀐 주시문서가 없습니다.',
-'watchlist-details' => '토론을 제외하고 문서 $1개를 주시하고 있습니다.',
+'watchlist-details' => '토론을 제외하고 {{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
'wlheader-enotif' => '* 이메일 알림 기능이 활성화되었습니다.',
'wlheader-showupdated' => "* 마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
'watchmethod-recent' => '주시된 문서를 확인하고자 최근 편집을 확인',
'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
-'watchlistcontains' => '문서 $1개를 주시하고 있습니다.',
+'watchlistcontains' => '{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
'iteminvalidname' => "'$1' 항목에 문제가 발생했습니다. 이름이 잘못되었습니다...",
-'wlnote' => "다음은 최근 '''$2'''시간 동안 바뀐 문서 '''$1'''개 입니다. ($3 $4 기준)",
+'wlnote' => "다음은 최근 {{PLURAL:$2|'''$2'''시간}} 동안 {{PLURAL:$1|바뀐 문서 '''$1'''개 입니다}}. ($3 $4 기준)",
'wlshowlast' => '최근 $1시간 $2일 또는 $3 동안에 바뀐 문서',
'watchlist-options' => '주시문서 목록 설정',
'enotif_mailer' => '{{SITENAME}} 자동 알림 메일',
'enotif_reset' => '모든 문서를 방문한 것으로 표시하기',
'enotif_impersonal_salutation' => '{{SITENAME}} 사용자',
-'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 삭제했습니다',
-'enotif_subject_created' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 만들었습니다',
-'enotif_subject_moved' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 옮겼습니다',
-'enotif_subject_restored' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 복구했습니다',
-'enotif_subject_changed' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 바꾸었습니다',
-'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 삭제했습니다. $3 에서 볼 수 있습니다.',
-'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 만들었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 옮겼습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 복구했습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 바꾸었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜 사항을 보려면 $1 을 보세요.',
-'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\90 ë\82´ì\9a©을 보려면 $1 을 보세요.',
+'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|삭제했습니다}}',
+'enotif_subject_created' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|만들었습니다}}',
+'enotif_subject_moved' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|옮겼습니다}}',
+'enotif_subject_restored' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|되살렸습니다}}',
+'enotif_subject_changed' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|바꾸었습니다}}',
+'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.',
+'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|옮겼으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1 을 보세요.',
+'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\9c을 보려면 $1 을 보세요.',
'enotif_anon_editor' => '익명 사용자 $1',
'enotif_body' => '$WATCHINGUSERNAME님,
'exblank' => '빈 문서',
'delete-confirm' => '"$1" 삭제',
'delete-legend' => '삭제',
-'historywarning' => "'''경고:''' 삭제하려는 문서에 과거 편집 내역 약 $1개가 있습니다:",
+'historywarning' => "'''경고:''' 삭제하려는 문서에 이전 {{PLURAL:$1|편집 역사}} 약 $1개가 있습니다:",
'confirmdeletetext' => '문서와 문서 역사를 삭제하려고 합니다.
삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.',
'actioncomplete' => '명령 완료',
** 저작권 침해
** 훼손 행위',
'delete-edit-reasonlist' => '삭제 이유 편집',
-'delete-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
+'delete-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
편집 역사가 긴 문서를 삭제하면 {{SITENAME}}에 큰 혼란을 줄 수 있기 때문에 삭제할 수 없습니다.',
-'delete-warning-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
+'delete-warning-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
주의해 주세요.',
'rollback' => '편집 되돌리기',
'rollback_short' => '되돌리기',
'rollbacklink' => '되돌리기',
-'rollbacklinkcount' => '편집 $1회 되돌리기',
-'rollbacklinkcount-morethan' => '편집 $1회 이상 되돌리기',
+'rollbacklinkcount' => '{{PLURAL:$1|편집}} $1회 되돌리기',
+'rollbacklinkcount-morethan' => '{{PLURAL:$1|편집}} $1회 이상 되돌리기',
'rollbackfailed' => '되돌리기 실패',
'cantrollback' => '편집을 되돌릴 수 없습니다.
문서를 편집한 사용자가 한명뿐입니다.',
# Protect
'protectlogpage' => '문서 보호 기록',
-'protectlogtext' => '아래의 목록은 문서 보호에 관한 바뀜 사항에 대한 기록입니다.
+'protectlogtext' => '아래의 목록은 문서 보호에 관한 바뀜에 대한 기록입니다.
현재 보호된 문서의 목록에 대해서는 [[Special:ProtectedPages|보호된 문서 목록]]을 참고하세요.',
'protectedarticle' => '사용자가 "[[$1]]" 문서를 보호했습니다',
'modifiedarticleprotection' => '사용자가 "[[$1]]" 문서의 보호 설정을 바꿨습니다',
'viewdeletedpage' => '삭제된 문서 보기',
'undeletepagetext' => '다음 {{PLURAL:$1|문서는|문서 $1개는}} 삭제되었지만 아직 보관되어 있고 되살릴 수 있습니다.
보관된 문서는 주기적으로 삭제될 것입니다.',
-'undelete-fieldset-title' => '문ì\84\9c 복구',
-'undeleteextrahelp' => "문ì\84\9c ì\97ì\82¬ ì \84체를 복구í\95\98려면 모든 체크박스의 선택을 해제하고 '''{{int:undeletebtn}}'''를 누르세요.
-í\8a¹ì \95í\95\9c ë²\84ì \84ë§\8c 복구í\95\98ë ¤ë©´ 복구í\95\98려는 버전을 선택하고 '''{{int:undeletebtn}}'''를 누르세요.",
-'undeleterevisions' => '판 $1개 보관중',
-'undeletehistory' => '문서를 되살리면 모든 역사가 같이 복구됩니다.
-문ì\84\9cê°\80 ì\82ì \9cë\90\9c ë\92¤ ê°\99ì\9d\80 ì\9d´ë¦\84ì\9d\98 문ì\84\9cê°\80 ë§\8cë\93¤ì\96´ì¡\8cë\8b¤ë©´, 복구ë\90\98ë\8a\94 ì\97ì\82¬ë\8a\94 ì§\80ê¸\88 ì\97ì\82¬ì\9d\98 과거 부분에 나타날 것입니다.',
-'undeleterevdel' => '복구í\95\98ë ¤ë\8a\94 문ì\84\9cì\9d\98 ìµ\9cì\8b í\8c\90ì\9d´ ì\82ì \9cë\90\98ì\96´ ì\9e\88ë\8a\94 ê²½ì\9a° 문ì\84\9c를 복구ì\8b\9cí\82¬ 수 없습니다.
+'undelete-fieldset-title' => '문ì\84\9c ë\90\98ì\82´ë¦¬ê¸°',
+'undeleteextrahelp' => "문ì\84\9c ì\97ì\82¬ ì \84체를 ë\90\98ì\82´ë¦¬려면 모든 체크박스의 선택을 해제하고 '''{{int:undeletebtn}}'''를 누르세요.
+í\8a¹ì \95í\95\9c ë²\84ì \84ë§\8c ë\90\98ì\82´ë¦¬ë ¤ë©´ ë\90\98ì\82´ë¦¬려는 버전을 선택하고 '''{{int:undeletebtn}}'''를 누르세요.",
+'undeleterevisions' => '{{PLURAL:$1|판}} $1개 보관 중',
+'undeletehistory' => '문서를 되살리면 모든 역사를 같이 되살립니다.
+문ì\84\9cê°\80 ì\82ì \9cë\90\9c ë\92¤ ê°\99ì\9d\80 ì\9d´ë¦\84ì\9d\98 문ì\84\9cê°\80 ë§\8cë\93¤ì\96´ì¡\8cë\8b¤ë©´, ë\90\98ì\82´ë\90\98ë\8a\94 ì\97ì\82¬ë\8a\94 ì§\80ê¸\88 ì\97ì\82¬ì\9d\98 ì\9d´ì \84 부분에 나타날 것입니다.',
+'undeleterevdel' => 'ë\90\98ì\82´ë¦¬ë ¤ë\8a\94 문ì\84\9cì\9d\98 ìµ\9cì\8b í\8c\90ì\9d´ ì\82ì \9cë\90\98ì\96´ ì\9e\88ë\8a\94 ê²½ì\9a° 문ì\84\9c를 ë\90\98ì\82´ë¦´ 수 없습니다.
이러한 경우 삭제된 최신판 문서의 확인 상자를 선택 해제하거나 숨김을 해제해야 합니다.',
'undeletehistorynoadmin' => '이 문서는 삭제되었습니다.
삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자가 아래에 나와 있습니다.
삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.',
'undelete-revision' => '삭제된 $1 문서의 $4 $5 버전 (기여자 $3):',
'undeleterevision-missing' => '해당 판이 잘못되었거나 존재하지 않습니다.
-ì\9e\98못ë\90\9c ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ì\99\94ê±°ë\82\98, í\8a¹ì \95 í\8c\90ì\9d´ ì\9d´ë¯¸ 복구ë\90\98거나 데이터베이스에서 제거되었을 수도 있습니다.',
+ì\9e\98못ë\90\9c ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ì\99\94ê±°ë\82\98, í\8a¹ì \95 í\8c\90ì\9d´ ì\9d´ë¯¸ ë\90\98ì\82´ë ¸거나 데이터베이스에서 제거되었을 수도 있습니다.',
'undelete-nodiff' => '이전의 판이 없습니다.',
-'undeletebtn' => '복구',
+'undeletebtn' => 'ë\90\98ì\82´ë¦¬ê¸°',
'undeletelink' => '보기/되살리기',
'undeleteviewlink' => '보기',
'undeletereset' => '초기화',
'undeleteinvert' => '선택 반전',
'undeletecomment' => '이유:',
-'undeletedrevisions' => '판 $1개를 복구했습니다',
-'undeletedrevisions-files' => '판 $1개와 파일 $2개를 복구했습니다.',
-'undeletedfiles' => '파일 $1개를 복구했습니다',
-'cannotundelete' => '복구í\95\98는 데 실패했습니다:
+'undeletedrevisions' => '{{PLURAL:$1|판 1개|판 $1개}}를 되살렸습니다',
+'undeletedrevisions-files' => '{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다',
+'undeletedfiles' => '{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다',
+'cannotundelete' => 'ë\90\98ì\82´ë¦¬는 데 실패했습니다:
$1',
-'undeletedpage' => "'''$1 문ì\84\9c를 복구í\96\88습니다.'''
+'undeletedpage' => "'''$1 문ì\84\9c를 ë\90\98ì\82´ë ¸습니다.'''
-[[Special:Log/delete|ì\82ì \9c 기ë¡\9d]]ì\97\90ì\84\9c ìµ\9cê·¼ì\9d\98 ì\82ì \9cì\99\80 복구 기록을 볼 수 있습니다.",
+[[Special:Log/delete|ì\82ì \9c 기ë¡\9d]]ì\97\90ì\84\9c ìµ\9cê·¼ì\9d\98 ì\82ì \9cì\99\80 ë\90\98ì\82´ë¦¬ê¸° 기록을 볼 수 있습니다.",
'undelete-header' => '최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.',
'undelete-search-title' => '삭제된 문서 찾기',
'undelete-search-box' => '삭제된 문서 찾기',
'undelete-search-prefix' => '다음으로 시작하는 문서 보기:',
'undelete-search-submit' => '찾기',
'undelete-no-results' => '삭제된 문서 보존 자료에서 입력한 값에 맞는 문서가 없습니다.',
-'undelete-filename-mismatch' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 복구í\95 수 없습니다: 파일 이름이 일치하지 않습니다.',
-'undelete-bad-store-key' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 복구í\95 수 없습니다: 파일이 삭제되기 전에 사라졌습니다.',
+'undelete-filename-mismatch' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다: 파일 이름이 일치하지 않습니다.',
+'undelete-bad-store-key' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다: 파일이 삭제되기 전에 사라졌습니다.',
'undelete-cleanup-error' => '사용되지 않는 보존된 파일 "$1"을 삭제하는 데 오류가 발생했습니다.',
-'undelete-missing-filearchive' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8a기 ë\95\8c문ì\97\90 í\8c\8cì\9d¼ ë³´ì¡´ IDê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\84 복구í\95 수 없습니다.
-ì\9d´ë¯¸ 복구ë\90\98ì\97\88을 수 있습니다.',
-'undelete-error' => '문서 복구 중 오류',
-'undelete-error-short' => '파일 복구 오류: $1',
-'undelete-error-long' => 'í\8c\8cì\9d¼ì\9d\84 복구í\95\98는 동안 오류가 발생했습니다:
+'undelete-missing-filearchive' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8a기 ë\95\8c문ì\97\90 í\8c\8cì\9d¼ ë³´ì¡´ IDê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다.
+ì\9d´ë¯¸ ë\90\98ì\82´ë ¸을 수 있습니다.',
+'undelete-error' => '문서를 되살리는 동안 오류',
+'undelete-error-short' => '파일을 되살리는 동안 오류: $1',
+'undelete-error-long' => 'í\8c\8cì\9d¼ì\9d\84 ë\90\98ì\82´ë¦¬는 동안 오류가 발생했습니다:
$1',
'undelete-show-file-confirm' => '정말 "<nowiki>$1</nowiki>" 파일의 삭제된 $2 $3 버전을 보시겠습니까?',
'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
[[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
-'unblocklogentry' => '사용자가 $1 사용자를 차단 해제했습니다.',
+'unblocklogentry' => '사용자가 $1 사용자를 차단 해제했습니다',
'block-log-flags-anononly' => 'IP만 막음',
'block-log-flags-nocreate' => '계정 만들기 금지됨',
'block-log-flags-noautoblock' => '자동 차단 비활성화됨',
'lockfilenotwritable' => '데이터베이스 잠금 파일에 쓰기 권한이 없습니다.
데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.',
'databasenotlocked' => '데이터베이스가 잠겨 있지 않습니다.',
-'lockedbyandtime' => '($1이 $2 $3에 잠금)',
+'lockedbyandtime' => '({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)',
# Move page
'move-page' => '$1 이동',
'movepage-page-exists' => '이동할 수 없습니다. "$1" 문서가 이미 존재합니다.',
'movepage-page-moved' => '"$1" 문서를 "$2" 문서로 이동했습니다.',
'movepage-page-unmoved' => '"$1" 문서를 "$2" 문서로 이동할 수 없습니다.',
-'movepage-max-pages' => '문서를 최대 $1개 이동했습니다. 나머지 문서는 자동 이동하지 않습니다.',
+'movepage-max-pages' => '{{PLURAL:$1|문서}}를 최대 $1개 이동했습니다. 나머지 문서는 자동 이동하지 않습니다.',
'movelogpage' => '이동 기록',
'movelogpagetext' => '아래는 이동한 문서의 목록입니다.',
'movesubpage' => '{{PLURAL:$1|하위 문서}}',
-'movesubpagetext' => '이 문서에는 다음 하위 문서 $1개가 있습니다.',
+'movesubpagetext' => '이 문서에는 다음 {{PLURAL:$1|하위 문서}} $1개가 있습니다.',
'movenosubpage' => '이 문서에는 하위 문서가 존재하지 않습니다.',
'movereason' => '이유:',
'revertmove' => '되돌리기',
'importtext' => '원본 위키에서 [[Special:Export|내보내기]] 기능을 사용해 파일을 내려받으세요.
그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.',
'importstart' => '문서를 가져오는 중...',
-'import-revision-count' => '판 $1개',
+'import-revision-count' => '{{PLURAL:$1|판}} $1개',
'importnopages' => '가져올 문서가 없습니다.',
-'imported-log-entries' => '기록 항목 $1개를 가져왔습니다.',
+'imported-log-entries' => '{{PLURAL:$1|기록 항목}} $1개를 가져왔습니다.',
'importfailed' => '가져오기 실패: <nowiki>$1</nowiki>',
'importunknownsource' => '알 수 없는 가져오기 자료 유형',
'importcantopen' => '파일을 열 수 없습니다.',
# Import log
'importlogpage' => '가져오기 기록',
'importlogpagetext' => '다른 위키에서 가져온 문서 기록입니다.',
-'import-logentry-upload' => '사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다.',
-'import-logentry-upload-detail' => '판 $1개',
-'import-logentry-interwiki' => '$1 문서를 다른 위키에서 가져왔습니다.',
-'import-logentry-interwiki-detail' => '$2에서 판 $1개를 가져옴',
+'import-logentry-upload' => '사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다',
+'import-logentry-upload-detail' => '{{PLURAL:$1|판}} $1개',
+'import-logentry-interwiki' => '$1 문서를 다른 위키에서 가져왔습니다',
+'import-logentry-interwiki-detail' => '$2에서 {{PLURAL:$1|판}} $1개를 가져왔습니다',
# JavaScriptTest
'javascripttest' => '자바스크립트 테스트',
'tooltip-ca-protect' => '문서 보호하기',
'tooltip-ca-unprotect' => '이 문서의 보호 설정을 바꾸기',
'tooltip-ca-delete' => '문서 삭제하기',
-'tooltip-ca-undelete' => 'ì\82ì \9cë\90\98기 ì \84ì\97\90 ì\9d´ 문ì\84\9cì\9d\98 ì\99\84ë£\8cí\95\9c í\8e¸ì§\91 복구í\95\98기',
+'tooltip-ca-undelete' => 'ì\82ì \9cë\90\98기 ì \84ì\97\90 ì\9d´ 문ì\84\9cì\9d\98 ì\99\84ë£\8cí\95\9c í\8e¸ì§\91 ë\90\98ì\82´ë¦¬기',
'tooltip-ca-move' => '문서 이동하기',
'tooltip-ca-watch' => '이 문서를 주시문서 목록에 추가합니다.',
'tooltip-ca-unwatch' => '이 문서를 주시문서 목록에서 제거합니다.',
파일을 실행하면 컴퓨터에 문제가 생길 가능성이 있습니다.",
'imagemaxsize' => '그림 최대 크기:<br />(파일 문서에 적용되는 기능)',
'thumbsize' => '섬네일 크기:',
-'widthheightpage' => '$1 × $2, $3페이지',
+'widthheightpage' => '$1 × $2, $3{{PLURAL:$3|쪽}}',
'file-info' => '파일 크기: $1, MIME 종류: $2',
'file-info-size' => '$1 × $2 픽셀, 파일 크기: $3, MIME 종류: $4',
'file-info-size-pages' => '$1 × $2 픽셀, 파일 크기: $3, MIME 형식: $4, $5{{PLURAL:$5|쪽}}',
'show-big-image-other' => '다른 {{PLURAL:$2|해상도}}: $1',
'show-big-image-size' => '$1 × $2 픽셀',
'file-info-gif-looped' => '반복됨',
-'file-info-gif-frames' => '$1 프레임',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|프레임}}',
'file-info-png-looped' => '반복됨',
'file-info-png-repeat' => '$1{{PLURAL:$1|번}} 재생됨',
-'file-info-png-frames' => '$1 프레임',
+'file-info-png-frames' => '$1 {{PLURAL:$1|프레임}}',
'file-no-thumb-animation' => "'''참고: 기술적인 제한으로 인해 이 파일의 섬네일은 애니메이션을 지원하지 않습니다.'''",
'file-no-thumb-animation-gif' => "'''참고: 기술적인 제한으로 인해 고해상도 GIF 그림 섬네일은 애니메이션을 지원하지 않습니다.'''",
# Special:NewFiles
'newimages' => '새 파일 목록',
-'imagelisttext' => "파일 '''$1'''개를 $2 순으로 정렬한 목록입니다.",
+'imagelisttext' => "{{PLURAL:$1|파일}} '''$1'''개를 $2 순으로 정렬한 목록입니다.",
'newimages-summary' => '이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.',
'newimages-legend' => '필터',
'newimages-label' => '파일 이름 (또는 그 일부분):',
'exif-gpslongitude-w' => '서경',
# Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '해발 $1미터',
-'exif-gpsaltitude-below-sealevel' => '해저 $1미터',
+'exif-gpsaltitude-above-sealevel' => '해발 $1{{PLURAL:$1|미터}}',
+'exif-gpsaltitude-below-sealevel' => '해저 $1{{PLURAL:$1|미터}}',
'exif-gpsstatus-a' => '측정 중',
'exif-gpsstatus-v' => '인터랙티브 측정',
일반 미리 보기를 이용하세요.',
# Friendlier slave lag warnings
-'lag-warn-normal' => '최근 $1초 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
-'lag-warn-high' => '데이터베이스 서버의 과도한 부하 때문에 최근 $1초 안에 바뀐 문서 목록은 보여지지 않을 수 있습니다.',
+'lag-warn-normal' => '최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
+'lag-warn-high' => '데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서 목록은 보여지지 않을 수 있습니다.',
# Watchlist editor
-'watchlistedit-numitems' => '토론 문서를 제외하고 문서 $1개를 주시하고 있습니다.',
+'watchlistedit-numitems' => '토론 문서를 제외하고 {{PLURAL:$1|문서 1개|문서 $1개}}를 주시하고 있습니다.',
'watchlistedit-noitems' => '주시문서 목록이 비어 있습니다.',
'watchlistedit-normal-title' => '주시문서 목록 편집하기',
'watchlistedit-normal-legend' => '주시문서 목록에서 문서 제거하기',
-'watchlistedit-normal-explain' => '주ì\8b\9c문ì\84\9c 목ë¡\9dì\97\90 ì\9e\88ë\8a\94 문ì\84\9cì\9d\98 ì \9c목ì\9d´ ì\95\84ë\9e\98ì\97\90 ë\82\98ì\97´ë\90\98ì\96´ 있습니다.
+'watchlistedit-normal-explain' => '주ì\8b\9c문ì\84\9c 목ë¡\9dì\97\90 ì\9e\88ë\8a\94 문ì\84\9cì\9d\98 ì \9c목ì\9d´ ì\95\84ë\9e\98ì\97\90 ë\82\98ì\99\80 있습니다.
주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.',
'watchlistedit-normal-submit' => '항목 삭제',
-'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목}}을 주시하지 않습니다:',
+'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목 $1개}}를 제거했습니다:',
'watchlistedit-raw-title' => '주시문서 목록 직접 편집하기',
'watchlistedit-raw-legend' => '주시문서 목록 직접 편집하기',
'watchlistedit-raw-explain' => '주시문서 목록의 각 항목이 나와 있습니다. 필요한 항목을 직접 추가하거나 제거할 수 있습니다.
'watchlistedit-raw-titles' => '목록:',
'watchlistedit-raw-submit' => '주시문서 목록 새로 고침',
'watchlistedit-raw-done' => '주시문서 목록을 새로 고쳤습니다.',
-'watchlistedit-raw-added' => '문서 $1개를 추가했습니다:',
-'watchlistedit-raw-removed' => '문서 $1개를 제거했습니다:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|문서 $1개}}를 추가했습니다:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|문서 $1개}}를 제거했습니다:',
# Watchlist editing tools
'watchlisttools-view' => '주시문서 최근 바뀜',
'fileduplicatesearch-submit' => '찾기',
'fileduplicatesearch-info' => '$1 × $2 픽셀<br />파일 크기: $3<br />MIME 유형: $4',
'fileduplicatesearch-result-1' => '"$1" 파일과 중복된 파일이 없습니다.',
-'fileduplicatesearch-result-n' => '"$1" 파일은 중복 파일이 $2개 있습니다.',
+'fileduplicatesearch-result-n' => '"$1" 파일은 {{PLURAL:$2|중복 파일이 $2개}} 있습니다.',
'fileduplicatesearch-noresults' => '"$1"이라는 이름을 가진 파일이 없습니다.',
# Special:SpecialPages
'sqlite-no-fts' => '$1 (본문은 찾기에서 제외)',
# New logging system
-'logentry-delete-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}.',
-'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 문ì\84\9c를 {{GENDER:$2|복구í\96\88ì\8aµë\8b\88ë\8b¤}}.',
-'logentry-delete-event' => '$1 사용자가 $3의 기록 $5개에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 바꾸었습니다: $4',
-'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 바꾸었습니다.',
-'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 보이기 설정을 바꾸었습니다.',
-'logentry-suppress-delete' => '$1 사용자가 $3 문서를 숨겼습니다.',
-'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 보이기 설정을 바꾸었습니다.',
-'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 바꾸었습니다.',
+'logentry-delete-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}',
+'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 문ì\84\9c를 {{GENDER:$2|ë\90\98ì\82´ë ¸ì\8aµë\8b\88ë\8b¤}}',
+'logentry-delete-event' => '$1 사용자가 $3의 {{PLURAL:$1|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|숨겼습니다}}',
+'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
'revdelete-content-hid' => '내용 숨겨짐',
'revdelete-summary-hid' => '편집 요약 숨겨짐',
'revdelete-uname-hid' => '사용자 이름 숨겨짐',
'revdelete-uname-unhid' => '사용자 이름 숨김 해제됨',
'revdelete-restricted' => '관리자에게 제한을 적용함',
'revdelete-unrestricted' => '관리자에 대한 제한을 해제함',
-'logentry-move-move' => '$1 사용자가 $3 문서를 $4 문서로 옮겼습니다.',
-'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 옮겼습니다.',
-'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4 문서로 옮기면서 넘겨주기를 덮어썼습니다.',
-'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 옮기면서 옮길 대상에 있던 넘겨주기를 덮어썼습니다.',
-'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-newusers-newusers' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create2' => '$1 사용자가 $3 사용자 계정을 만들었습니다.',
-'logentry-newusers-byemail' => '$3 사용자 계정이 $1에 만들어졌고 비밀번호는 이메일로 보냈습니다',
-'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 만들었습니다.',
-'logentry-rights-rights' => '$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 바꾸었습니다.',
-'logentry-rights-rights-legacy' => '$1 사용자가 $3 사용자의 권한을 바꾸었습니다.',
-'logentry-rights-autopromote' => '$1 ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d´ ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $4ì\97\90ì\84\9c $5ì\9c¼ë¡\9c ë°\94ë\80\8cì\97\88ì\8aµë\8b\88ë\8b¤.',
+'logentry-move-move' => '$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮기면서}} 넘겨주기를 덮어썼습니다',
+'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 {{GENDER:$2|옮기면서}} 옮길 대상에 있던 넘겨주기를 덮어썼습니다',
+'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-newusers-newusers' => '$1 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create' => '$1 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create2' => '$1 사용자가 $3 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-byemail' => '$3 사용자 계정이 $1에 {{GENDER:$2|만들어졌고}} 비밀번호는 이메일로 보냈습니다',
+'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 {{GENDER:$2|만들었습니다}}',
+'logentry-rights-rights' => '$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-rights-legacy' => '$1 사용자가 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-autopromote' => '$1 ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d\84 ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $4ì\97\90ì\84\9c $5ì\9c¼ë¡\9c {{GENDER:$2|ë°\94꾸ì\97\88ì\8aµë\8b\88ë\8b¤}}',
'rightsnone' => '(없음)',
# Feedback
'blocked-mailpassword' => "Déi vun Iech benotzten IP-Adress ass fir d'Ännere vu Säite gespaart. Fir Mëssbrauch ze verhënneren, gouf d'Méiglechkeet fir een neit Passwuert unzefroen och gespaart.",
'eauthentsent' => "Eng Confirmatiouns-E-Mail gouf un déi Adress geschéckt déi Dir uginn hutt.<br />
Ier iergendeng E-Mail vun anere Benotzer op dee Kont geschéckt ka ginn, musst Dir als éischt d'Instructiounen an der Confirmatiouns-E-Mail befollegen, fir ze bestätegen datt de Kont wierklech Ären eegenen ass.",
-'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} gouf eng Erënenrung un d'Passwuert verschéckt.
-Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Erënnerung verschéckt ginn.",
+'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} eng E-Mail verschéckt fir d'Passwuert zréckzesetzen.
+Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Mail verschéckt ginn.",
'mailerror' => 'Feeler beim Schécke vun der E-Mail: $1',
'acct_creation_throttle_hit' => 'Visiteure vun dëser Wiki déi Är IP-Adress hu {{PLURAL:$1|schonn $1 Benotzerkont|scho(nn) $1 Benotzerkonten}} an de leschten Deeg opgemaach, dëst ass déi maximal Zuel déi an dësem Zäitraum erlaabt ass.
Dofir kënne Visiteure déi dës IP-Adress benotzen den Ament keng Benotzerkonten opmaachen.',
Dir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
'passwordreset-emailelement' => 'Benotzernumm: $1
Temporärt Passwuert: $2',
-'passwordreset-emailsent' => 'Eng Erënnerungs-Mail gouf geschéckt.',
-'passwordreset-emailsent-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt.",
-'passwordreset-emailerror-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt, awer de Benotzer konnt se net kréien: $1",
+'passwordreset-emailsent' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt.",
+'passwordreset-emailsent-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
+'passwordreset-emailerror-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de Benotzer konnt se net kréien: $1",
# Special:ChangeEmail
'changeemail' => 'Mailadress änneren',
'sqlite-no-fts' => "$1 ënnerstëtzt d'Volltextsich net",
# New logging system
-'logentry-delete-delete' => "$1 huet d'Säit $3 geläscht",
-'logentry-delete-restore' => "$1 huet d'Säit $3 restauréiert",
+'logentry-delete-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
+'logentry-delete-restore' => "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 geännert",
'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 geännert",
'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 geännert",
-'logentry-suppress-delete' => "$1 huet d'Säit $3 ewechgeholl",
-'logentry-suppress-event-legacy' => "$1 huet diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
+'logentry-suppress-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 ewechgeholl",
+'logentry-suppress-event-legacy' => "$1 {{GENDER:$2|huet}} diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 geännert",
'revdelete-content-hid' => 'Inhalt verstoppt',
'revdelete-summary-hid' => 'Resumé vun der Ännerung verstoppt',
'revdelete-uname-unhid' => 'Benotzernumm net verstoppt',
'revdelete-restricted' => 'Limitatioune fir Administrateuren ageschalt',
'revdelete-unrestricted' => 'Limitatioune fir Administrateuren opgehuewen',
-'logentry-move-move' => "$1 huet d'Säit $3 op $4 geréckelt",
+'logentry-move-move' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}}",
'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt ouni eng Viruleedung unzeleeën",
'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen",
-'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
-'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt markéiert",
+'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
+'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt {{GENDER:$2|markéiert}}",
'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt {{GENDER:$2|markéiert}}",
'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
-'logentry-newusers-create' => 'De Benotzerkont $1 gouf ugeluecht',
-'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 ugeluecht',
-'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 ugeluecht an d'Passwuert gouf per E-Mail geschéckt.",
-'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch ugeluecht',
-'logentry-rights-autopromote' => "De Benotzer $1 huet d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
+'logentry-newusers-create' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}} an d'Passwuert gouf per E-Mail geschéckt.",
+'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch {{GENDER:$2|ugeluecht}}',
+'logentry-rights-autopromote' => "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
'rightsnone' => '(keen)',
# Feedback
'brokenredirects-edit' => 'labot',
'brokenredirects-delete' => 'dzēst',
-'withoutinterwiki' => 'Lapas bez interwiki',
+'withoutinterwiki' => 'Lapas bez starpviki saitēm',
'withoutinterwiki-summary' => "Šajās lapās nav saišu uz citu valodu projektiem (''interwiki''):",
'withoutinterwiki-legend' => 'Prefikss',
'withoutinterwiki-submit' => 'Rādīt',
'createaccount' => 'Ticchīhuāz cē cuentah',
'gotaccount' => "¿Ye ticpiya cē cuentah? '''$1'''.",
'gotaccountlink' => 'Ximocalaqui',
-'createaccountmail' => 'e-mailcopa',
+'createaccountmail' => 'Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō moēhualtīz in maltzinteyōtl netitlanizyeyāntli',
'createaccountreason' => 'Tlèka:',
'badretype' => 'Ahneneuhqui motlahtōlichtacāyo.',
'userexists' => 'In tlatequitiltilīltōcāitl in ōquipehpen ye ia.
'listgrouprights-group' => 'Olōlli',
'listgrouprights-rights' => 'Huelītiliztli',
-# E-mail user
+# Email user
'emailuser' => 'Tiquēhualtlīz maltzinteyōtl netitlaniztli inīn tlatequitiltilīlli',
'defemailsubject' => '{{SITENAME}} correo tlatequitiltilīlhuīc $1',
'emailfrom' => 'Īhuīcpa:',
'monthsall' => '(mochīntīn)',
'limitall' => 'mochi',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Ticchicāhuāz e-mail',
'confirmemail_needlogin' => 'Tihuīquilia $1 ic ticchicāhua mo e-mail.',
'confirmemail_success' => 'Mocorreo ōmotlahtōlneltilih
'editlink' => 'ସମ୍ପାଦନା',
'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
-'toc' => 'à¬à¬¿à¬¤à¬° à¬\9aିà¬\9c',
+'toc' => 'ବିଷà\9fସà\82à¬\9aà\80',
'showtoc' => 'ଦେଖାଇବେ',
'hidetoc' => 'ଲୁଚାନ୍ତୁ',
'collapsible-collapse' => 'ଚାପିଦେବେ',
a powinny odwoływać się bezpośrednio do stron treści.<br />
Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany przez stronę [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Strony z właściwościami',
+'pageswithprop-legend' => 'Strony z właściwościami',
+'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
+
'doubleredirects' => 'Podwójne przekierowania',
'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.
* @author RmSilva
* @author Rodrigo Calanca Nishino
* @author SandroHc
+ * @author Sarilho1
* @author Sir Lestaty de Lioncourt
* @author Sérgio Ribeiro
* @author Teles
# Special:PasswordReset
'passwordreset' => 'Repor palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta por correio electrónico.',
+'passwordreset-text' => 'Preencha este formulário para repor a sua palavra-passe.',
'passwordreset-legend' => 'Reiniciar a palavra-chave',
'passwordreset-disabled' => 'O reinício da palavra-chave foi impossibilitado nesta wiki.',
'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
* @author Haffman
* @author HalanTul
* @author Huuchin
+ * @author Ignatus
* @author Illusion
* @author Iltever
* @author Incnis Mrsi
'hidden-category-category' => 'Скрытые категории',
'category-subcat-count' => '{{PLURAL:$2|Эта категория содержит только следующую подкатегорию.|Эта категория содержит $1 {{PLURAL:$1|подкатегорию|подкатегории}} из $2 всего.}}',
'category-subcat-count-limited' => 'В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.',
-'category-article-count' => '{{PLURAL:$2|Эта категория содержит только следующую страницу.|В этой категории показан{{PLURAL:$1|а $1 страница|ы $1 страницы|о $1 страниц}} из $2.}}',
+'category-article-count' => '{{#ifeq:$2|1|Эта категория содержит только следующую страницу.|Эта категория содержит следующ{{PLURAL:$1|ую $1 страницу|ие $1 страницы|ие $1 страниц}} из $2.}}',
'category-article-count-limited' => 'В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц}}.',
'category-file-count' => '{{PLURAL:$2|Эта категория содержит только один файл.|В этой категории {{PLURAL:$1|показан $1 файл|показано $1 файла|показано $1 файлов}} из $2 {{PLURAL:$2|имеющейся|имеющихся}}.}}',
'category-file-count-limited' => 'В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов}}.',
'logentry-newusers-autocreate' => 'Автоматически создана учётная запись $1',
'logentry-rights-rights' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3 с $4 на $5',
'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3',
-'logentry-rights-autopromote' => 'Учётная запись «$1» была автоматически переведена из $4 в $5',
+'logentry-rights-autopromote' => '$1 был{{GENDER:$2||а}} автоматически переведен{{GENDER:$2||а}} из $4 в $5',
'rightsnone' => '(нет)',
# Feedback
'duration-centuries' => '$1 {{PLURAL:$1|век|века|веков}}',
'duration-millennia' => '$1 {{PLURAL:$1|тысячелетие|тысячелетия|тысячелетий}}',
+# Image rotation
+'rotate-comment' => 'Изображение повернуто на $1 градус{{PLURAL:$1||а|ов}} по часовой стрелке',
+
);
* @author M.M.S.
* @author MagnusA
* @author Micke
+ * @author Mikez
* @author NH
* @author Najami
* @author Nghtwlkr
'exportcuronly' => 'Inkludera endast den nuvarande versionen, inte hela historiken',
'exportnohistory' => "----
'''OBS:''' export av fullständig sidhistorik med hjälp av detta formulär har stängts av på grund av prestandaskäl.",
-'exportlistauthors' => 'Innehålla en fullständig lista över bidragsgivare för varje sida',
+'exportlistauthors' => 'Inkludera en fullständig lista över bidragsgivare för varje sida',
'export-submit' => 'Exportera',
'export-addcattext' => 'Lägg till sidor från kategori:',
'export-addcat' => 'Lägg till',
'sqlite-no-fts' => '$1 utan stöd för fulltextsökning',
# New logging system
-'logentry-delete-delete' => '$1 raderade sidan $3',
-'logentry-delete-restore' => '$1 återställde sidan $3',
-'logentry-delete-event' => '$1 ändrade synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-delete-revision' => '$1 ändrade synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-delete-event-legacy' => '$1 ändrade synligheten för logghändelser på $3',
-'logentry-delete-revision-legacy' => '$1 ändrade synligheten för versioner på sidan $3',
-'logentry-suppress-delete' => '$1 gömde sidan $3',
-'logentry-suppress-event' => '$1 ändrade i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-suppress-revision' => '$1 ändrade synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-suppress-event-legacy' => '$1 ändrade synligheten i hemlighet för logghändelser på $3',
-'logentry-suppress-revision-legacy' => '$1 ändrade synligheten i hemlighet för versioner på sidan $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|raderade}} sidan $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|återställde}} sidan $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för versioner på sidan $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|gömde}} sidan $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|ändrade}} i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för logghändelser på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för versioner på sidan $3',
'revdelete-content-hid' => 'innehåll dolt',
'revdelete-summary-hid' => 'redigeringssammanfattning dold',
'revdelete-uname-hid' => 'användarnamn dolt',
'revdelete-uname-unhid' => 'användarnamn synligt',
'revdelete-restricted' => 'satte begränsningar för administratörer',
'revdelete-unrestricted' => 'tog bort begränsningar för administratörer',
-'logentry-move-move' => '$1 flyttade sidan $3 till $4',
-'logentry-move-move-noredirect' => '$1 flyttade sidan $3 till $4 utan att lämna en omdirigering',
-'logentry-move-move_redir' => '$1 flyttade sidan $3 till $4 över en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttade sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 utan att lämna en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerade}} versionen $4 av sidan $3 som patrullerad',
'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerade}} automatiskt versionen $4 av sidan $3 som patrullerad',
'logentry-newusers-newusers' => 'Användarkonto $1 har {{GENDER:$2|skapats}}',
'unblockip' => 'ปลดบล็อกผู้ใช้',
'unblockiptext' => 'ใช้แบบด้านล่างเพื่อคืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
'ipusubmit' => 'ยกเลิกการบล็อกนี้',
-'unblocked' => '[[User:$1|$1]] ถูกปลดบล็อก',
+'unblocked' => '[[User:$1|$1]] ถูกปลดบล็อกแล้ว',
'unblocked-range' => '$1 ถูกปลดบล็อกแล้ว',
'unblocked-id' => 'เลิกบล็อก $1',
'blocklist' => 'ผู้ใช้ที่ถูกบล็อก',
'passwordsent' => 'Mật khẩu mới đã được gửi tới thư điện tử của thành viên “$1”. Xin đăng nhập lại sau khi nhận thư.',
'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh lạm dụng.',
'eauthentsent' => 'Thư xác nhận đã được gửi. Trước khi dùng chức năng nhận thư, bạn cần thực hiện hướng dẫn trong thư xác nhận, để đảm bảo tài khoản thuộc về bạn.',
-'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ một lần.',
+'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu $1 giờ đồng hồ một lần.',
'mailerror' => 'Lỗi gửi thư : $1',
'acct_creation_throttle_hit' => 'Ai đó cùng [[địa chỉ IP]] với bạn đã mở {{PLURAL:$1|một tài khoản|$1 tài khoản}} ở đây trong vòng 24 giờ. Vì quy định hạn chế số tài khoản mở trên một địa chỉ IP nên bạn hiện không thể mở thêm được nữa dùng địa chỉ IP này.',
'emailauthenticated' => 'Địa chỉ thư điện tử của bạn được xác nhận vào lúc $3 $2.',
'sqlite-no-fts' => '$1 không có hỗ trợ tìm kiếm toàn văn',
# New logging system
-'logentry-delete-delete' => '$1 đã xóa trang “$3”',
-'logentry-delete-restore' => '$1 đã phục hồi trang “$3”',
-'logentry-delete-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
-'logentry-delete-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
-'logentry-delete-event-legacy' => '$1 đã thay đổi mức hiển thị của các mục nhật trình về $3',
-'logentry-delete-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3',
-'logentry-suppress-delete' => '$1 đã ẩn trang $3',
-'logentry-suppress-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
-'logentry-suppress-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
-'logentry-suppress-event-legacy' => '$1 đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
-'logentry-suppress-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
+'logentry-delete-delete' => '$1 {{GENDER:$2}}đã xóa trang “$3”',
+'logentry-delete-restore' => '$1 {{GENDER:$2}}đã phục hồi trang “$3”',
+'logentry-delete-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các mục nhật trình về $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}}đã ẩn trang $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
'revdelete-content-hid' => 'đã ẩn nội dung',
'revdelete-summary-hid' => 'đã ẩn tóm lược sửa đổi',
'revdelete-uname-hid' => 'đã ẩn tên người dùng',
'revdelete-uname-unhid' => 'đã hiện tên người dùng',
'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
'revdelete-unrestricted' => 'đã gỡ bỏ hạn chế cho bảo quản viên',
-'logentry-move-move' => '$1 đã đổi $3 thành $4',
-'logentry-move-move-noredirect' => '$1 đã đổi $3 thành $4 (đã tắt đổi hướng)',
-'logentry-move-move_redir' => '$1 đã đổi $3 thành $4 qua đổi hướng',
-'logentry-move-move_redir-noredirect' => '$1 đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
-'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-newusers-newusers' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create2' => '$1 đã mở tài khoản người dùng $3',
-'logentry-newusers-byemail' => '$1 đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử',
-'logentry-newusers-autocreate' => 'Tài khoản $1 đã được mở tự động',
-'logentry-rights-rights' => '$1 đã đổi các nhóm liên kết của $3 từ $4 đến $5',
-'logentry-rights-rights-legacy' => '$1 đã đổi các nhóm liên kết của $3',
-'logentry-rights-autopromote' => '$1 đã được tự động phong cấp từ $4 đến $5',
+'logentry-move-move' => '$1 {{GENDER:$2}}đã đổi $3 thành $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 (đã tắt đổi hướng)',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2}}đã đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2}}đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-newusers-newusers' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'logentry-newusers-create' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2}}đã mở tài khoản người dùng $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2}}đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử',
+'logentry-newusers-autocreate' => 'Tài khoản $1 {{GENDER:$2}}đã được mở tự động',
+'logentry-rights-rights' => '$1 {{GENDER:$2}}đã đổi các nhóm bao gồm $3 từ $4 đến $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$2}}$1 đã đổi các nhóm bao gồm $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2}}đã được tự động phong cấp từ $4 đến $5',
'rightsnone' => '(không có)',
# Feedback
'uploadstash' => 'אַרויפֿלאָד רעזערוו',
'uploadstash-clear' => 'אויסמעקן טעקעס פון זאפאס',
'uploadstash-nofiles' => 'איר האט נישט קיין טעקעס אין זאפאס.',
+'uploadstash-errclear' => 'אוועקנעמען די טעקעס דורכגעפאלן.',
'uploadstash-refresh' => 'דערפֿרישן די רשימה פון טעקעס',
# img_auth script messages
'sqlite-no-fts' => '$1 אָן פֿולן-טעקסט זוכן שטיץ',
# New logging system
-'logentry-delete-delete' => '$1 האט אויסגעמעקט בלאט $3',
-'logentry-delete-restore' => '$1 האט צוריקגעשטעלט בלאט $3',
-'logentry-delete-event' => '$1 האט געענדערט די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
-'logentry-delete-revision' => '$1 האט געענדערט די זעבארקייט פון {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
-'logentry-delete-event-legacy' => '$1 האט געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
-'logentry-delete-revision-legacy' => '$1 האט געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
-'logentry-suppress-delete' => '$1 האט אונטערדריקט בלאט $3',
-'logentry-suppress-event' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
-'logentry-suppress-revision' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
-'logentry-suppress-event-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
-'logentry-suppress-revision-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|האט אויסגעמעקט}} בלאט $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|האט צוריקגעשטעלט }} בלאט $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון רעוויזיעס אויף בלאט $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|האט אונטערדריקט}} בלאט $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}} די זעבארקייט פון {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}} די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
+'logentry-suppress-revision-legacy' => '!$1 {{GENDER:$2|האט געהיימלעך געענדערט}} די זעבארקייט פון רעוויזיעס אויף בלאט $3',
'revdelete-content-hid' => 'אינהאלט פארהוילן',
'revdelete-summary-hid' => 'רעדאקטירונג קאנספעקט פארהוילן',
'revdelete-uname-hid' => 'באניצער־נאמען פארהוילן',
'revdelete-uname-unhid' => 'באַניצער נאָמען ארויסגעגעבן',
'revdelete-restricted' => 'צוגעלייגט באגרעניצונגען פאר סיסאפן',
'revdelete-unrestricted' => 'אוועקגענומען באגרעניצונגען פאר סיסאפן',
-'logentry-move-move' => '$1 האט באוועגט בלאט $3 צו $4',
-'logentry-move-move-noredirect' => '$1 האט באוועגט בלאט $3 צו $4 אן לאזן א ווייטערפירונג',
-'logentry-move-move_redir' => '$1 האט באוועגט $3 צו $4 אריבער ווייטערפירונג',
-'logentry-move-move_redir-noredirect' => '$1 האט באוועגט $3 צו $4 אריבער א ווייטערפירונג אן לאזן א ווייטערפירונג',
-'logentry-patrol-patrol' => '$1 האט מארקירט רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
-'logentry-patrol-patrol-auto' => '$1 האט אויטאמאטיש מארקירט רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
-'logentry-newusers-newusers' => 'באניצער קאנטע $1 געשאפן געווארן',
-'logentry-newusers-create' => 'באניצער קאנטע $1 געשאפן געווארן',
-'logentry-newusers-create2' => 'באניצער קאנטע $1 געשאפן געווארן דורך $3',
-'logentry-newusers-autocreate' => 'קאנטע $1 באשאפן אויטאמאטיש',
-'logentry-rights-rights' => '$1 האט געביטן גרופע מיטגלידערשאַפֿט פֿאַר $3 פֿון $4 אויף $5',
-'logentry-rights-rights-legacy' => '$1 האט געביטן גרופע מיטגלידערשאפט פאר $3',
-'logentry-rights-autopromote' => '$1 אויטאמאטיש פראמאווירט פון $4 צו $5',
+'logentry-move-move' => '$1 {{GENDER:$2|האט באוועגט}} בלאט $3 צו $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|האט באוועגט}} בלאט $3 צו $4 אן לאזן א ווייטערפירונג',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|האט באוועגט}} $3 צו $4 אריבער ווייטערפירונג',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|האט באוועגט}} $3 צו $4 אריבער א ווייטערפירונג אן לאזן א ווייטערפירונג',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|האט מארקירט}} רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|האט אויטאמאטיש מארקירט}} רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
+'logentry-newusers-newusers' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}}',
+'logentry-newusers-create' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}}',
+'logentry-newusers-create2' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}} דורך $3',
+'logentry-newusers-byemail' => 'באניצער קאנטע $3 איז {{GENDER:$2|געשאפן געווארן}} דורך $1 און דאס פאסווארט איז געשיקט געווארט דורך ע־פאסט',
+'logentry-newusers-autocreate' => 'באַניצער קאנטע $1 {{GENDER:$2|געשאפן}} אויטאמאטיש',
+'logentry-rights-rights' => '$1 האט {{GENDER:$2|געביטן}} גרופע מיטגלידערשאַפֿט פֿאַר $3 פֿון $4 אויף $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|האט געביטן}} גרופע מיטגלידערשאפט פאר $3',
+'logentry-rights-autopromote' => '$1 אויטאמאטיש {{GENDER:$2|פראמאווירט}} פון $4 צו $5',
'rightsnone' => '(גארנישט)',
# Feedback
'api-error-ok-but-empty' => 'אינערלעכער גרײַז: קיין ענטפֿער פֿון סערווירער.',
'api-error-overwrite' => 'מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.',
'api-error-stashfailed' => 'אינערלעכער גרײַז: סערווירער האט נישט געקענט אײַנשפייכלערן צייַטווייַליקע טעקע.',
+'api-error-publishfailed' => 'אינערלעכער גרײַז: סערווירער האט נישט געזדאנזשעט פארעפנטלעכן צייַטווייַליקע טעקע.',
'api-error-timeout' => 'דער סערווירער האט ניט געענטפֿערט אינערהאַלב דער דערוואַרטעטער צייַט.',
'api-error-unclassified' => 'אַן אומבאַקאַנט טעות איז פֿארגעקומען.',
'api-error-unknown-code' => 'אומבאַקאַנט טעות: " $1 "',
'duration-centuries' => '$1 {{PLURAL:$1|יארהונדערט|יארהונדערטער}}',
'duration-millennia' => '$1 {{PLURAL:$1|יארטויזנט|יארטויזנטער}}',
+# Image rotation
+'rotate-comment' => 'בילד געדרייט דורך $1 {{PLURAL:$1|גראד}} זייגערווייז',
+
);
--- /dev/null
+ænglisc
+ævar
+&add
+&
+&bar
+&sim
+&url
+ABNF
+API
+Aacute
+Aborted
+Abuse
+Account
+Accum
+Acirc
+Action
+Activity
+Agrave
+All
+Allocations
+Ancientpages
+Anim
+Api
+Apitestsysop
+Apitestuser
+Aring
+Article
+As
+Atilde
+Auml
+Autopromote
+BACKCOMPAT
+Backlinks
+Blacklist
+Block
+Blocked
+Blocks
+Bodytext
+Broken
+COMPUTERNAME
+CRLF
+CURLOPT
+Campaign
+Capture
+Categories
+Category
+Ccedil
+Central
+Changes
+Check
+Click
+Client
+Clientfor
+Colorer
+Compare
+Config
+Console
+Continue
+Contribs
+Contributions
+Conversiontable
+Coordinates
+Create
+Creation
+Cview
+DDLMODE
+DWIM
+DWIMD
+Daily
+Dbkeyform
+Deadendpages
+Debugtext
+Delete
+Deletedrevs
+Denied
+Dfile
+Disambiguations
+Double
+Duplicate
+EAGAIN
+EBML
+ECMA
+EDITFILTERMERGED
+EINPROGRESS
+EINTR
+EOCDR
+ETAG
+Eacute
+Ecirc
+Edit
+Editor
+Education
+Egrave
+Ehcache
+Elig
+Email
+Empty
+End
+English
+Enlist
+Euml
+Eval
+Events
+Exists
+Expand
+Expression
+Ext
+External
+Extracts
+Extraneous
+FFFD
+FOLLOWLOCATION
+Failure
+Featured
+Feed
+Feedback
+Feedbackv
+Feeds
+Fewestrevisions
+Ffile
+File
+Filearchive
+Filedelete
+Files
+Filter
+Filters
+Flag
+Flagged
+GI
+GRAPHEME
+Gadget
+Gadgets
+Geo
+Get
+Global
+Groups
+HEA
+HTM
+Hardblock
+Help
+Helpful
+ID
+IPTC
+IWBacklinks
+IWLinks
+Iacute
+Icirc
+Igrave
+Illegal
+Image
+Images
+Implict
+Import
+Info
+Invalidateemail
+Isarticle
+Item
+Iuml
+LOCALISATIONCACHE
+Lang
+Lastmod
+Links
+Linktags
+List
+Listredirects
+Living
+Log
+Login
+Logout
+Logs
+Lonelypages
+Longpages
+Love
+Ltitle
+MSVC
+Mark
+Match
+Matrix
+Members
+Mesg
+Messages
+Metatags
+Mobile
+Mostcategories
+Mostimages
+Mostinterwikis
+Mostlinked
+Mostlinkedcategories
+Mostlinkedtemplates
+Mostrevisions
+Move
+Mssql
+Mwstore
+Myuploads
+NEWPAGE
+NOTIC
+Name
+Need
+No
+Noscript
+Not
+Notalk
+Notice
+Notification
+Ntilde
+Oacute
+Ocirc
+Ograve
+Oldreviewedpages
+Open
+Options
+Oslash
+Otilde
+Ouml
+PAGEEDITDATE
+PAGEEDITOR
+PAGEEDITTIME
+PAGEINTRO
+PAGEMINOREDIT
+PAGESUMMARY
+PARSEHUGE
+PARSERFIRSTCALLINIT
+PHPTAL
+PMID
+Page
+Pages
+Param
+Parse
+Parsers
+Pass
+Passpass
+Patrol
+People
+Plugin
+Possible
+Program
+Props
+Protect
+Protected
+Protectexpiry
+Protectother
+Protectreason
+Protectreasonother
+Purge
+Query
+Queued
+Random
+Rapid
+Ratings
+Raw
+Recent
+Redirects
+Redis
+Referer
+Refresh
+Regexlike
+Replacer
+Reset
+Resursive
+Revert
+Review
+Revisions
+Rollback
+Rsd
+SEGSIZE
+STDERR
+SYSDBA
+Scaron
+Scribunto
+Search
+Section
+Set
+Shortpages
+Site
+Siteinfo
+Solr
+Stabilize
+Stash
+Stats
+Status
+Success
+Syntax
+TMPDIR
+TOOLBOXEND
+TRANSLIT
+Tagging
+Tags
+Template
+Templates
+Textform
+Tfile
+Throttled
+Timestamp
+Title
+Titles
+Token
+Tokens
+Tracking
+Transcode
+Triage
+UNWATCHURL
+Uacute
+Ucirc
+Ugrave
+Unblock
+Uncategorizedcategories
+Uncategorizedimages
+Uncategorizedpages
+Uncategorizedtemplates
+Undelete
+Unusedcategories
+Unusedimages
+Unusedtemplates
+Unwatchedpages
+Upload
+Urlform
+Usage
+User
+Usercreate
+Userdir
+Userlang
+Userrights
+Users
+Useruser
+Ustart
+Uuml
+Value
+Video
+View
+Visual
+WATCHINGUSERNAME
+WEBPVP
+Wantedcategories
+Wantedfiles
+Wantedpages
+Wantedtemplates
+Warning
+Watch
+Watchingusers
+Watchlist
+Wiki
+Wikibase
+Withoutinterwiki
+Wrong
+XX
+Xml
+YYYY
+YYYYMMDDHHMMSS
+Yacute
+Yuml
+\
+a
+aa
+aacute
+abbrv
+abcdefghijklmnopqrstuvwxyz
+abf
+aboutpage
+aboutsite
+abusefilter
+abusefiltercheckmatch
+abusefilterchecksyntax
+abusefilterevalexpression
+abusefilters
+abusefilterunblockautopromote
+abuselog
+abusive
+ac
+acad
+accel
+acceptlang
+accessdenied
+accesskey
+accesskeycache
+accesskeys
+accessors
+acchits
+account
+accountcreator
+accum
+acirc
+aclimit
+acprefix
+action
+actioncomplete
+actionhidden
+actions
+actiontext
+actionthrottled
+actionthrottledtext
+actiontoken
+activeusers
+activity
+acuxvalidate
+add
+addablegroups
+addbegin
+addedline
+addedwatchtext
+addergroup
+addergroups
+addin
+adding
+additional
+addr
+address
+addresses
+addsection
+addstudent
+admin
+administrator
+adnum
+adrelid
+adsrc
+advancedediting
+advancedrc
+advancedrendering
+advancedsearchoptions
+advancedwatchlist
+aelig
+af
+afl
+aft
+afttest
+afvf
+age
+aggregators
+agrave
+ahandler
+ahttp
+ai
+aifc
+aiff
+aiprop
+ajaxwatch
+al
+alefsym
+algo
+algos
+all
+all's
+allcategories
+alldata
+alle
+allexamples
+allhidden
+allimages
+allimit
+alllinks
+alllogstext
+allmessages
+allmonths
+allowedctypes
+allowedonly
+allowemail
+allowsduplicates
+allowusertalk
+allpages
+allpagesbadtitle
+allpagesprefix
+allpagesredirect
+allpagessubmit
+allrev
+alltitles
+alltransclusions
+allusers
+aloption
+alprefix
+alreadyblocked
+alreadydone
+alreadyexists
+alreadyrolled
+alunique
+am
+anchor
+anchorclose
+anchorencode
+and
+andconvert
+andtitle
+anon
+anoneditwarning
+anonlogin
+anonnotice
+anononly
+anonpreviewwarning
+anontalk
+anontalkpagetext
+anontoken
+anonuserpage
+anonymous
+anti
+antispoof
+antivirus
+anymap
+ap
+apcond
+apdir
+api
+api's
+apibase
+apihelp
+apihighlimits
+apis
+aplimit
+apnamespace
+apng
+apos
+appendnotsupported
+appendtext
+apprefix
+approve
+aprops
+aqbt
+aqct
+archivename
+aren
+args
+argsarams
+aring
+arnfjörð
+article
+articleexists
+articlefeedbackv
+articleid
+articlelink
+articlepage
+articlepath
+articles
+aryeh
+asc
+ascending
+asctime
+asdf
+aspx
+assert
+astriks
+asymp
+async
+asynccopyuploaddisabled
+asyncdownload
+at
+atend
+atext
+atid
+atilde
+atime
+atlimit
+atoi
+atom
+atprefix
+atthasdef
+attibs
+attibute
+attlen
+attname
+attnum
+attrdef
+attrelid
+attrib
+attribs
+attributename
+attrs
+atttypid
+atunique
+au
+auml
+authplugins
+autoaccount
+autobiography
+autoblock
+autoblocked
+autoblockedtext
+autoblocker
+autoblockid
+autoblocking
+autoblockip
+autoblocks
+autocad
+autocomment
+autocomments
+autocomplete
+autoconfirm
+autoconfirmed
+autocreate
+autocreated
+autocreation
+autodetection
+autoflag
+autofocus
+autogen
+autogenerated
+autohide
+autoload
+autoloader
+autoloaders
+autoloading
+automagically
+automatic
+autonym
+autopatrol
+autoplay
+autopromote
+autopromoted
+autopromotion
+autoreview
+autoreviewer
+autoreviewrestore
+autosumm
+autosummaries
+autosummary
+axto
+azərbaycanca
+backends
+backlink
+backlinks
+backlinksubtitle
+backported
+backslashed
+backtraces
+bad
+badaccess
+badarticleerror
+badcontinue
+baddiff
+bademail
+badfilename
+badformat
+badgenerator
+badhookmsg
+badinterwiki
+badip
+badipaddress
+badkey
+badmd
+badmime
+badminpassword
+badminuser
+badnamespace
+badoption
+badparams
+badport
+badretype
+badrevids
+badsig
+badsiglength
+badsyntax
+badtag
+badtimestamp
+badtitle
+badtitletext
+badtoken
+badtype
+badupload
+baduser
+badversion
+balancer
+balancers
+banjar
+barstein
+base
+basefont
+basename
+basepagename
+basepagenamee
+basetimestamp
+bashkir
+bashpid
+bcancel
+bceffd
+bcmath
+bcompress
+bcpio
+bdop
+bdquo
+becampus
+beinstructor
+belarusian
+beonline
+bereviewer
+berror
+bestq
+besttype
+bg
+bgcolor
+bgzip
+bidi
+bigdelete
+binhex
+bitdepth
+bitfield
+bitfields
+bitmask
+bjarmason
+bk
+bkey
+bkinvalidparammix
+bkmissingparam
+bkusers
+bl
+blanking
+blanknamespace
+blankpage
+blegh
+bleh
+blinvalidparammix
+blksize
+blmissingparam
+block
+blockable
+blocked
+blockedasrange
+blockedby
+blockedbyid
+blockedemailuser
+blockedexpiry
+blockedfrommail
+blockednoreason
+blockedreason
+blockedtext
+blockedtitle
+blockemail
+blockexpiry
+blockid
+blockinfo
+blockip
+blocklink
+blocklogentry
+blocklogpage
+blocklogtext
+blockme
+blockquote
+blockreason
+blocks
+blocktoken
+bloggs
+blogs
+blogspot
+bltitle
+bluelink
+bluelinks
+bmwschema
+bmysql
+bname
+bodycontent
+boldening
+bolding
+booksources
+bool
+boolean
+borderhack
+bot
+botedit
+boteditletter
+bots
+bottom
+bottomscripts
+bpassword
+bpatch
+bpchar
+bport
+bprefix
+broeck
+brokenlibxml
+brokenredirects
+brokenredirectstext
+browsearchive
+brvbar
+bserver
+bservers
+bssl
+btestpassword
+btestuser
+btype
+bucket
+bucketcount
+bugfix
+bugfixes
+buglist
+bugzilla
+buildpath
+buildpathentry
+bulgakov
+bulkdelcourses
+bulkdelorgs
+bureaucrat
+buser
+by
+byemail
+byid
+bytea
+bytesleft
+bytesread
+bytevalue
+cacheable
+cached
+cachedcount
+cachedsidebar
+cachedspecial
+cachedtimestamp
+calimit
+callargs
+campaign
+campus
+cancelto
+cannotdelete
+cannotundelete
+canonicalised
+canonicalization
+canonicalize
+canonicalizes
+canonicalizing
+canremember
+canreset
+cansecurelogin
+cantblock
+cantcreate
+cantdelete
+cantedit
+cantexecute
+canthide
+cantimport
+cantmove
+cantmovefile
+cantopenfile
+cantoverwrite
+cantrollback
+cantsend
+cantunblock
+cantundelete
+capitalizeallnouns
+captchaid
+captchas
+captchaword
+cascade
+cascadeable
+cascadeon
+cascadeprotected
+cascadeprotectedwarning
+cascading
+cascadingness
+categories
+categories's
+categorieshtml
+category
+categoryfinder
+categoryinfo
+categorylinks
+categorymembers
+categorypage
+categoryviewer
+catids
+catlinks
+catpage
+catrope
+cattitles
+ccedil
+ccme
+ccmeonemails
+cdab
+cdel
+cdlink
+cedil
+ceebc
+cellpadding
+cellspacing
+central
+centralauth
+centralnotice
+centralnoticeallocations
+centralnoticelogs
+centralnoticequerycampaign
+cgroup
+cgroups
+change
+change's
+changeablegroups
+changed
+changedby
+changedorcreated
+changeemail
+changelog
+changeslist
+changing
+characters
+chardiff
+charoff
+chars
+checkfreq
+checkmatrix
+checkstatus
+checkuser
+checkuserlog
+chgrp
+childs
+chillu
+chmoding
+choicesstring
+chrs
+chunk
+chunked
+chunking
+ci
+cidr
+cidrtoobroad
+circ
+citeseer
+ckers
+ckey
+cl
+clamav
+clamscan
+classname
+clcategorie
+cldir
+cldr
+clear
+clearable
+clearyourcache
+clfrom
+clickjacking
+clicktracking
+clientfor
+clientpool
+cllimit
+clober
+closed
+clto
+cm
+cminvalidparammix
+cmmissingparam
+cmnamespace
+cmtitle
+co
+code
+codemap
+codepoint
+codestr
+coi
+colgroup
+collapsable
+collectionsaveascommunitypage
+collectionsaveasuserpage
+colname
+cologneblue
+colonseparator
+colorer
+colspan
+commafy
+commafying
+comment
+commentedit
+commenthidden
+comments
+commitdiff
+commoncssjs
+compactpro
+compare
+compat
+complete
+cond
+condcomment
+condeferrable
+condeferred
+conds
+config
+confirmdeletetext
+confirmed
+confirmedittext
+confirmemail
+confirmrecreate
+conflimit
+confstr
+conkey
+conname
+conrelid
+console
+content
+contentformat
+contenthandler
+contentlanguage
+contentless
+contentmodel
+contenttoobig
+continue
+contribs
+contribslink
+conttitle
+contype
+conv
+converttitles
+convmv
+cookieprefix
+cooltalk
+coord
+coordinates
+copyrightico
+copyrightpage
+copyrightwarning
+copyuploadbaddomain
+copyuploaddisabled
+copyvio
+copywarn
+cors
+couldn
+counter
+countmsg
+country
+course
+courseid
+cpio
+cprefs
+cprotected
+crarr
+crashbug
+create
+createaccount
+createonly
+createpage
+createtalk
+creationsort
+creativecommons
+creditspage
+crocker
+cryptrand
+csize
+csrf
+css
+cssclass
+csslinks
+cssprefs
+cta
+ctime
+ctor
+ctype
+cu
+cul
+curation
+curdiff
+curid
+curlink
+curren
+currentarticle
+currentbrowser
+currentday
+currentdayname
+currentdow
+currenthour
+currentmonth
+currentmonthabbrev
+currentmonthname
+currentmonthnamegen
+currentrev
+currentrevisionlink
+currenttime
+currenttimestamp
+currentversion
+currentweek
+currentyear
+customcssprotected
+customised
+customjsprotected
+cut
+cyber
+cygwin
+cyrl
+d'oh
+dadedad
+dairiki
+danga
+danielc
+darr
+datalen
+dataset
+datasets
+datasize
+datatable
+datatype
+datedefault
+dateformat
+dateheader
+dateopts
+daysago
+dbcnt
+dbconnect
+dberrortext
+dbg
+dbgfm
+dbkey
+dbkeys
+dbks
+dbname
+dbrepllag
+dbsettings
+dbtype
+dbversion
+ddjvu
+de
+deadend
+deadendpagestext
+deadenpages
+dealies
+debughtml
+decline
+declined
+decls
+decr
+decrease
+default
+defaultcontentmodel
+defaultmessagetext
+defaultmissing
+defaultns
+defaultsort
+defaultval
+deferr
+definite
+deflimit
+defs
+deja
+delete
+deleteall
+deletecomment
+deleteconfirm
+deleted
+deletedhistory
+deletedline
+deletedonly
+deletedrevision
+deletedrevs
+deletedtext
+deletedwhileediting
+deleteeducation
+deleteglobalaccount
+deletelogentry
+deleteone
+deleteotherreason
+deletepage
+deletereason
+deletereasonotherlist
+deleterevision
+deleteset
+deletethispage
+deletetoken
+deletion
+deletionlog
+delim
+dellogpage
+dellogpagetext
+delundel
+deprecated
+deps
+depth
+dequeue
+dequeued
+dequeueing
+dequeues
+derivatives
+desc
+descending
+description
+descriptionmsg
+descriptionmsgparams
+descriptionurl
+deserialization
+deserialize
+dest
+detail
+details
+devangari
+devel
+df
+dflt
+dhtml
+diams
+didn
+diff
+diff's
+diffchange
+diffhist
+difflink
+diffonly
+difftext
+diffto
+difftocontent
+difftotext
+dim
+dimensions
+dir
+direction
+directionmark
+directorycreateerror
+directorynotreadableerror
+directoryreadonlyerror
+dirmark
+dirname
+disabled
+disabledtranscode
+disablemail
+disablepp
+disablesuggest
+disclaimerpage
+diskussion
+displayname
+displayrc
+displaysearchoptions
+displaytitle
+displaytitles
+displaywatchlist
+distclean
+distro
+djava
+djob
+djvu
+djvudump
+djvulibre
+djvutoxml
+djvutxt
+djvuxml
+djvuzone
+dkjsagfjsgashfajsh
+dlen
+dltk
+dmoz
+dnsbl
+dnsblacklist
+dnumber
+docm
+docroot
+doctype
+doctypes
+docx
+dodiff
+doesn
+domain
+domainnames
+domainpart
+domainparts
+domas
+doms
+dotdotcount
+dotm
+dotsc
+dotsi
+dotsm
+dotso
+dotwise
+dotx
+doubleclick
+doublequote
+doxygen
+dpos
+dr
+dropdown
+dump
+dumpfm
+dupfunc
+duplicatefiles
+duplicatesoffile
+dvips
+dwfx
+dwhitelist
+e
+eacute
+earth
+eauth
+ecirc
+ecmascript
+edit
+editbutton
+editconflict
+editconflicts
+editcount
+editfont
+editform
+edithelp
+edithelppage
+edithelpurl
+editingcomment
+editinginterface
+editingold
+editingsection
+editinterface
+editintro
+edititis
+editlink
+editnotice
+editnotsupported
+editondblclick
+editor
+editownusertalk
+editpage
+editprotected
+editreasons
+editredlink
+editrestriction
+edits
+editsection
+editsectionhint
+editsectiononrightclick
+editsonly
+editthispage
+edittime
+edittoken
+edittools
+editurl
+editusercss
+editusercssjs
+edituserjs
+edoe
+egrave
+ehcache
+ei
+eich
+eiinvalidparammix
+eimissingparam
+eititle
+el
+elapsedreal
+elemname
+elink
+eltitle
+email
+emailable
+emailaddress
+emailauthenticated
+emailauthentication
+emailauthenticationclass
+emailcapture
+emailconfirm
+emailconfirmed
+emailconfirmlink
+emaildisabled
+emailling
+emaillink
+emailnotauthenticated
+emailtoken
+emailuser
+embeddedin
+empty
+emptyfile
+emptynewsection
+emptypage
+emsenhuber
+emsp
+en
+enabled
+enabledonly
+enableparser
+encapsed
+enctype
+end
+endcode
+endcond
+endian
+endid
+endl
+endsortkey
+endsortkeyprefix
+endtime
+endverbatim
+enhancedchanges
+enlist
+enotif
+enotifminoredits
+enotifrevealaddr
+enotifusertalkpages
+enotifwatchlistpages
+enqueueing
+enroll
+ensp
+entirewatchlist
+entityid
+envcmd
+enwiki
+eocdr
+ep
+eparticle
+epcampus
+epcoordinator
+epinstructor
+eponline
+erevoke
+errno
+error
+errorbox
+errormessage
+errorpagetitle
+errors
+errorstr
+errortext
+errorunknown
+errstr
+es
+escapenoentities
+escapeshellarg
+esearch
+español
+española
+etag
+eu
+euml
+event
+eventid
+ex
+exampleextension
+examples
+excludegroup
+excludepage
+excludeuser
+executables
+exempt
+existingwiki
+exists
+exiv
+expandtab
+expandtemplates
+expandurl
+experiment
+expertise
+expiry
+expiryarray
+explainconflict
+export
+exportnowrap
+exportxml
+expression
+exptime
+extauth
+extendwatchlist
+extensionname
+extensions
+extensiontags
+external
+externaldberror
+externaldiff
+externaledit
+externaleditor
+externallinks
+externalstore
+extet
+extiw
+extlink
+extlinks
+extracts
+extradata
+extrafields
+extraq
+extratags
+exturlusage
+extuser
+exxaammppllee
+fa
+facto
+failback
+failover
+failsafe
+fallbacks
+false
+falsy
+fancysig
+fastcgi
+faux
+favicon
+fclose
+fdef
+fdff
+feature
+featured
+featuredfeed
+feed
+feed's
+feedback
+feedbackid
+feedcontributions
+feedformat
+feeditems
+feedlink
+feedlinks
+feedurl
+feedwatchlist
+feff
+female
+fetchfileerror
+fffe
+ffff
+fffff
+ffffff
+fieldname
+fieldset
+fieldsets
+file
+filearchive
+filebackend
+filecache
+filecopyerror
+filedelete
+filedeleteerror
+fileexists
+fileextensions
+filehidden
+filehist
+filehistory
+fileinfo
+filejournal
+filekey
+filelinks
+filemissing
+filemover
+filemtime
+filename
+filenames
+filenotfound
+filepage
+filepath
+filerenameerror
+filerepo
+filerevert
+filerevisions
+files
+filesize
+filesort
+filesorts
+filesystem's
+filesystems
+filetoc
+filetoobig
+filetype
+filetypemismatch
+fileversions
+filter
+filterbots
+filteriw
+filterlanglinks
+filterlocal
+filterredir
+filterwatched
+findnext
+finfo
+firefox
+firstname
+firstrev
+firsttime
+fishbowl
+fixme
+fixup
+flac
+flag
+flagconfig
+flagged
+flags
+flagtype
+flatlist
+flds
+float
+fmttime
+fname
+fnof
+foldmarker
+foldmethod
+followpolicy
+footericon
+footericons
+footerlinks
+fopen
+for
+forall
+forbidden
+forcearticlepath
+forcebot
+forceditsummary
+forceeditsummary
+forcelinkupdate
+forcetoc
+forcontent
+formaction
+format
+formatmodules
+formatted
+formatters
+formatting
+formedness
+formenctype
+formnovalidate
+formtype
+forupdate
+found
+founder
+fr
+frac
+frameless
+framesets
+frasl
+fread
+freedomdefined
+freeform
+freenode
+frickin
+from
+fromdb
+fromdbmaster
+fromid
+fromrev
+fromrevid
+fromtitle
+frontends
+fseek
+fsockopen
+fsync
+ftp
+fullhistory
+fullpagename
+fullpagenamee
+fulluri
+fullurl
+funcname
+functionhooks
+functionname
+futuresplash
+fvalue
+ga
+gack
+gadgetcategories
+gadgets
+gaid
+gaifilterredir
+gallerybox
+gallerycaption
+gallerytext
+gapdir
+gapfilterredir
+gaplimit
+gapprefix
+garber
+gblblock
+gblock
+gblrights
+gc
+gcldir
+gcllimit
+gender
+general
+generatexml
+generator
+geocoordinate
+geosearch
+gerrit
+getcookie
+getenv
+getheader
+getimagesize
+getlink
+getmac
+getmarkashelpfulitem
+getmypid
+getrusage
+gettimeofday
+gettingstarted
+gettoken
+getuid
+gfdl
+ggp
+ghostscript
+gimpbaseenums
+git
+gitdir
+github
+gitweb
+global
+globalauth
+globalblock
+globalblocks
+globalgroupmembership
+globalgrouppermissions
+globalgroups
+globalsettings
+globalunblock
+globalusage
+globaluserinfo
+globe
+gmail
+gmdate
+goodtitle
+gopher
+graymap
+grayscale
+greant
+greymap
+group
+groupcounts
+groupless
+groupmember
+grouppage
+groupperms
+groupprms
+groups
+growinglink
+grxml
+gs
+gtar
+gu
+guesstimezone
+gui
+guid
+gunblock
+guser
+gwicke
+gzcompress
+gzdeflate
+gzencode
+gzhandler
+gzip
+gzipped
+gzipping
+hacky
+hansm
+hant
+hardblocks
+hardcode
+hardcoding
+harr
+hash
+hashar
+hashcheckfailed
+hashsearchdisabled
+hashtable
+hashtables
+hasmatch
+hasmsg
+hasn
+hasrelated
+headelement
+headerpos
+headhtml
+headitems
+headlinks
+headscripts
+height
+hellip
+help
+helpful
+helppage
+helptext
+helpurl
+helpurls
+helpwindow
+hexdump
+hexstring
+hidden
+hiddencat
+hiddencategories
+hiddencats
+hide
+hideanons
+hidebots
+hidediff
+hideliu
+hideminor
+hidemyself
+hidename
+hidepatrolled
+hideredirects
+hiderevision
+hideuser
+hidpi
+highlimit
+highmax
+highuse
+hilfe
+hiphop
+histfirst
+histlast
+historyempty
+historysubmit
+historywarning
+hit
+hitcount
+hitcounter
+hits
+hmac
+hmtl
+hobby
+homelink
+hookaborted
+horohoe
+hostnames
+hours
+hphp
+hplist
+hpos
+hreflang
+hslots
+htaccess
+htcp
+html
+htmlelements
+htmlescaped
+htmlform
+htmlish
+htmllist
+htmlnest
+htmlpair
+htmlpairs
+htmlsingle
+htmlsingleallowed
+htmlsingleonly
+htmlspecialchars
+htmltidy
+http
+httpaccept
+httpbl
+https
+i
+ia
+iabn
+iacute
+icirc
+icononly
+iconv
+icubench
+icutest
+id
+idanduser
+ids
+ie's
+ieinternals
+ietf
+iexcl
+ifconfig
+iframe
+igbinary
+iges
+ignorewarnings
+igrave
+ii
+iicontinue
+iiprop
+iiurlparam
+iiurlwidth
+iker
+ilfrom
+ilto
+im
+image
+imagegetsize
+imageinfo
+imageinvalidfilename
+imagelinks
+imagemagick
+imagemaxsize
+imagenocrossnamespace
+imagepage
+imagerepository
+imagerotate
+images
+imagesize
+imagetype
+imagetypemismatch
+imageusage
+imagick
+imgmultigo
+imgmultigoto
+imgmultipagenext
+imgmultipageprev
+imgs
+imgserv
+immobilenamespace
+implicitgroups
+import
+importbadinterwiki
+importcantopen
+importlogpage
+importlogpagetext
+importnofile
+importtoken
+importupload
+importuploaderrorpartial
+importuploaderrorsize
+importuploaderrortemp
+in
+iname
+inbound
+includable
+include
+includecomments
+includelocal
+includeonly
+includexmlnamespace
+incr
+increase
+indefinite
+index
+indexfield
+indexpageids
+indexpolicy
+indstr
+infin
+infinite
+infiniteblock
+info
+infoaction
+infobox
+infoline
+infomsg
+ingroups
+injectjs
+inkscape
+inlanguagecode
+inlined
+inno
+inputneeded
+insb
+inser
+instantcommons
+institution
+instructor
+int
+integer
+integeroutofrange
+intentionallyblankpage
+interlang
+interlangs
+interlanguage
+internal
+internaledit
+internalerror
+interwiki
+interwikimap
+interwikipage
+interwikis
+interwikisource
+intnull
+intoken
+intra
+intro
+intrw
+ints
+intval
+invalid
+invalidaction
+invalidations
+invalidcategory
+invaliddomain
+invalidemail
+invalidemailaddress
+invalidexpiry
+invalidip
+invalidlang
+invalidlevel
+invalidmode
+invalidoldimage
+invalidpage
+invalidpageid
+invalidparameter
+invalidparammix
+invalidpath
+invalidrange
+invalidsection
+invalidsessiondata
+invalidsha
+invalidspecialpage
+invalidtags
+invalidtime
+invalidtitle
+invalidtoken
+invaliduser
+invalue
+iorm
+ip
+ipbblocked
+ipblock
+ipblocks
+ipbnounblockself
+ipchain
+ipedits
+iphash
+ipinrange
+ipusers
+iquest
+irc
+ircs
+isam
+isapi
+isbot
+isconnected
+iscur
+isin
+isip
+ismap
+isminor
+ismodsince
+ismulti
+isnew
+ispermalink
+isself
+isset
+istainted
+istalk
+iswatch
+it
+item
+itemid
+itemprop
+itemref
+itemscope
+itemtype
+iter
+iu
+iuinvalidparammix
+iumissingparam
+iuml
+iw
+iwbacklinks
+iwbl
+iwlfrom
+iwlinks
+iwlprefix
+iwltitle
+iwprefix
+iwtitle
+iwurl
+javascript
+javascripttest
+jbartsh
+jconds
+jdk's
+jhtml
+jimbo
+joaat
+jobqueue
+jointype
+jorsch
+journaling
+jpeg
+jpegtran
+jslint
+jsmimetype
+jsminplus
+json
+jsonfm
+jsparse
+jstext
+jsvarurl
+justthis
+kabardian
+kangxi
+kashubia
+kattouw
+kblength
+kernowek
+key
+keygen
+keylen
+keyname
+keynames
+keytype
+khash
+kludgy
+knownnamespace
+konqueror
+kpos
+kuza
+labarga
+labelmsg
+laggedslavemode
+laggy
+lang
+langbacklinks
+langcode
+langcodes
+langconversion
+langlinks
+langprop
+langs
+language
+languagelinks
+languages
+languageshtml
+laquo
+large
+larr
+last
+lastdiff
+lastdot
+lastedit
+lasteditor
+lastedittime
+lastlink
+lastmod
+lastmodifiedat
+lastname
+lastrevid
+lastvisited
+latgalian
+laxström
+lbase
+lbl
+lcattrib
+lceil
+lcomments
+lcount
+lcrocker
+ldquo
+le
+leavemessage
+len
+length
+leprop
+lesque
+lettercase
+level
+lfloor
+lg
+lgname
+lgpassword
+lgpl
+lgtoken
+lguserid
+lgusername
+libcurl
+libel
+libgimpbase
+libketama
+libmemcached
+libre
+libtidy
+ligabue
+lighttpd
+limit
+limitable
+line
+linenumber
+linestart
+link
+linkarr
+linkcolour
+linkprefix
+links
+linkstoimage
+linktbl
+linktext
+linktodiffs
+linktrail
+linktype
+linkupdate
+list
+listable
+listadmins
+listbots
+listfiles
+listgrouprights
+listinfo
+listingcontinuesabbrev
+listoutput
+listresult
+lists
+listtags
+listuser
+listusers
+listusersfrom
+livepreview
+ll
+llfrom
+lllang
+lltitle
+lnumber
+local
+localday
+localdayname
+localdow
+locale
+localhour
+localmonth
+localmonthabbrev
+localmonthname
+localmonthnamegen
+localname
+localonly
+localsettings
+localtimezone
+localweek
+localyear
+lock
+lockandhid
+lockdb
+lockdir
+locked
+lockmanager
+log
+logaction
+logentry
+logevent
+logevents
+logextract
+loggedin
+logid
+login
+loginend
+loginerror
+loginfo
+loginlanguagelinks
+loginlink
+loginprompt
+loginreqlink
+loginreqpagetext
+loginreqtitle
+logins
+loginstart
+logitem
+loglink
+loglist
+logname
+logonly
+logopath
+logourl
+logout
+logpage
+logtext
+logtitle
+logtype
+longpage
+longpageerror
+lookie
+lookups
+loopback
+lossless
+lossy
+lowast
+lowercaps
+lowercased
+lowlimit
+lsaquo
+lsquo
+ltags
+ltitle
+ltrimmed
+lurl
+lysator
+möller
+macr
+magicarr
+magicfile
+magick
+magicword
+magicwordkey
+magicwords
+magnus
+mahaction
+mailerror
+mailmypassword
+mailnologin
+mailparts
+mailpassword
+mailtext
+mailto
+mainmodule
+mainpage
+maintainership
+makesafe
+male
+malloc
+manske
+manualthumb
+mark
+markashelpful
+markaspatrolledlink
+markaspatrolledtext
+markbot
+markbotedits
+markedaspatrollederror
+markpatrolled
+masse
+match
+matchcount
+mathml
+mathtt
+matrixes
+matroska
+max
+maxage
+maxdim
+maxlag
+maxlength
+maxlifetime
+maxqueue
+maxresults
+maxsize
+maxuploadsize
+maxwidth
+mazeland
+mbresponse
+mbstring
+mckey
+mcklmqw
+mcrypt
+mcvalue
+md
+mdash
+medialink
+mediaqueries
+mediatype
+mediawarning
+mediawiki's
+mediawikipage
+megapixels
+member
+memberingroups
+members
+memc
+memcache
+memcached
+memlimit
+memoryp
+memsw
+merge
+mergeable
+merged
+mergehistory
+mergelog
+mergelogpagetext
+message
+messagekey
+messagename
+messagepattern
+messages
+messagetype
+meta
+metacharacters
+metachars
+metadata
+metadataversion
+metafile
+mhash
+mhtml
+micrblogging
+microdata
+microsyntaxes
+microtime
+middot
+migurski
+millitime
+mime
+mimer
+mimesearchdisabled
+mimetype
+min
+minangkabau
+minh
+minification
+minified
+minifier
+minifies
+minify
+minifying
+minimal
+minor
+minordefault
+minoredit
+minoreditletter
+minsize
+misconfigured
+misermode
+mismatch
+misresolved
+missing
+missingcommentheader
+missingcommenttext
+missingdata
+missingparam
+missingpermission
+missingresult
+missingrev
+missingsummary
+missingtext
+missingtitle
+missinguser
+mituzas
+mixedapproval
+mkdir
+mms
+mobile
+mobileformat
+mobileview
+modified
+modifiedarticleprotection
+modify
+modsecurity
+modsince
+module
+moduledisabled
+modulename
+modules
+monitor
+monobook
+monospace
+monospaced
+month
+monthsall
+moodbar
+moredotdotdot
+morelinkstoimage
+morethan
+move
+movedarticleprotection
+moveddeleted
+movedto
+movefile
+movelogpage
+movelogpagetext
+movenologintext
+movenotallowed
+movenotallowedfile
+moveonly
+moveoverredirect
+movepage
+moves
+movestable
+movesubpages
+movetalk
+movethispage
+movetoken
+mozilla
+mpeg
+mpegurl
+mpga
+mplink
+mptitle
+msdn
+msdownload
+msec
+msexcel
+msgid
+msgkey
+msgs
+msgsize
+msgsmall
+msgtext
+msie
+msmetafile
+mssql
+msvideo
+msword
+mtime
+mtype
+mullane
+multi
+multibyte
+multicast
+multipage
+multipageimage
+multipageimagenavbox
+multipart
+multiselect
+multisource
+multithreaded
+multival
+multivalue
+multpages
+munge
+musso
+mustbeloggedin
+mustbeposted
+mutator
+mutators
+muxers
+mwdumper
+mwfile
+mwstore
+mwsuggest
+mwuser
+mxircecho
+mycontributions
+mycontris
+myext
+myextension
+myisam
+mykey
+mypage
+mypreferences
+mysqldump
+mytalk
+mytext
+mywatchlist
+nabla
+name
+namehidden
+nameinlowercase
+names
+namespace
+namespacealiases
+namespacebanner
+namespacee
+namespacenotice
+namespacenumber
+namespaceoptions
+namespaceprotected
+namespaces
+namespacesall
+namespaceselector
+namespacing
+nassert
+nbase
+nbsp
+nbytes
+nchanges
+ncount
+ndash
+nearmatch
+nedersaksies
+nedersaksisch
+needreblock
+needservers
+needtoken
+netcdf
+netware
+never
+new
+newaddr
+newarticletext
+newarticletextanon
+newer
+newerthanrevid
+newgroups
+newheader
+newid
+newimages
+newlen
+newmessagesdifflink
+newmessagesdifflinkplural
+newmessageslink
+newmessageslinkplural
+newname
+newnames
+newnamespace
+newpage
+newpageletter
+newpages
+newpageshidepatrolled
+newparams
+newpass
+newpassword
+newpos
+newquery
+newrevid
+news
+newsectionlink
+newsectionsummary
+newset
+newsfeed
+newsize
+newtalk
+newtalks
+newtalkseparator
+newtext
+newtimestamp
+newtitle
+newuser
+newuserlogpage
+newuserlogpagetext
+newusers
+newwidth
+newwindow
+nextdiff
+nextid
+nextlink
+nextn
+nextpage
+nextredirect
+nextrevision
+nextval
+nfkc
+nginx
+nheight
+niklas
+nlink
+nlinks
+nmime
+nnnn
+nntp
+no
+noanimatethumb
+noanontoken
+noapiwrite
+noarchivename
+noarticle
+noarticletext
+noarticletextanon
+noautopatrol
+noblock
+nobots
+nobucket
+nobuffer
+nochange
+nochanges
+noclasses
+nocode
+nocomment
+nocomplete
+nocontent
+nocontentconvert
+nocontinue
+noconvertlink
+nocookiesfornew
+nocopyright
+nocourseid
+nocreate
+nocreatetext
+nocredits
+nocta
+nodata
+nodatabase
+nodb
+nodefault
+nodeid
+nodeleteablefile
+nodeletion
+nodelist
+nodename
+nodirection
+nodotdot
+noedit
+noeditsection
+noemail
+noemailprefs
+noemailtitle
+noeventid
+noexec
+noexpertise
+noexpression
+nofeed
+nofeedbackid
+nofile
+nofilekey
+nofilename
+nofilter
+noflagtype
+noflip
+nofollow
+nofound
+nogallery
+nogomatch
+nogroup
+noheader
+noheadings
+nohires
+noids
+noimage
+noimageredirect
+noimages
+noinclude
+noindex
+noindexing
+nointerwikipage
+nointerwikiuserrights
+noitem
+nojs
+nolabel
+nolang
+nolicense
+nolimit
+nolink
+nolinkstoimage
+nologging
+nologin
+nomahaction
+nominornewtalk
+nomodule
+non
+noname
+nonamespacenumber
+nonascii
+noncascading
+nondefaults
+none
+nonewsectionlink
+nonexistent
+nonfile
+nonfilenamespace
+nonincludable
+noninfringement
+noninitial
+nonlocal
+nonote
+nonredirects
+nonsense
+nonunicodebrowser
+noobjective
+noofexpiries
+noofprotections
+noop
+nooptions
+nooverride
+nopaction
+nopage
+nopageid
+nopagetext
+nopagetitle
+noparser
+nopathinfo
+nopermission
+noport
+noprefix
+noproject
+noprop
+noprotections
+noquestion
+noradius
+noratelimit
+norating
+norcid
+noread
+noreason
+noredir
+noredirect
+norequest
+norestrictiontypes
+noresult
+noreturnto
+norev
+norevid
+noreviewed
+normalizedtitle
+norole
+norollbackdiff
+noscale
+noschema
+noscript
+nosearch
+nosectiontitle
+nosession
+noshade
+noskipnotif
+noslash
+nosniff
+nosort
+nosortdirection
+nosource
+nospecialpagetext
+nost
+nosubaction
+nosubject
+nosubpage
+nosubpages
+nosuccess
+nosuchaction
+nosuchactiontext
+nosuchdatabase
+nosuchlogid
+nosuchpageid
+nosuchrcid
+nosuchrevid
+nosuchsection
+nosuchsectiontext
+nosuchsectiontitle
+nosuchspecialpage
+nosuchuser
+nosuchusershort
+nosummary
+notacceptable
+notag
+notaglist
+notalk
+notallowed
+notanarticle
+notarget
+notcached
+notdeleted
+note
+notempdir
+notemplate
+notext
+nothumb
+notif
+notificationtimestamp
+notificationtimestamps
+notin
+notitle
+notitleconvert
+notloggedin
+notminor
+noto
+notoc
+notoggle
+notoken
+notransform
+notreviewable
+notrustworthy
+notspecialpage
+notsuspended
+notvisiblerev
+notwatched
+notwikitext
+notype
+noudp
+noupdates
+nouploadmodule
+nouser
+nouserid
+nousername
+nouserspecified
+novalues
+noview
+nowatchlist
+nowellwritten
+nowiki
+nowlocal
+nowserver
+nparsing
+ns
+nsassociated
+nsfrom
+nsinvert
+nslinks
+nslist
+nsname
+nsnum
+nspname
+nsselect
+nstab
+nsub
+ntfs
+ntilde
+ntitle
+nuke
+null
+nullable
+numauthors
+number
+numberheadings
+numberingroup
+numberof
+numberofactiveusers
+numberofadmins
+numberofarticles
+numberofedits
+numberoffiles
+numberofpages
+numberofusers
+numberofviews
+numberofwatchingusers
+numedits
+numentries
+numericized
+numgroups
+numtalkauthors
+numtalkedits
+numwatchers
+nwidth
+oacute
+objectcache
+objective
+ocirc
+ocount
+oelig
+of
+officedocument
+offset
+offsite
+ofname
+ogevents
+ogghandler
+ograve
+old
+oldaddr
+oldcountable
+older
+olderror
+oldfile
+oldgroups
+oldid
+oldimage
+oldlen
+oldnamespace
+oldquery
+oldrev
+oldrevid
+oldreviewedpages
+oldshared
+oldsig
+oldsize
+oldtext
+oldtitle
+oldtitlemsg
+oline
+oname
+onkeyup
+online
+onload
+onlyauthor
+onlyinclude
+onlypst
+onlyquery
+onsubmit
+onthisday
+ontop
+openbasedir
+opendoc
+opendocument
+opensearch
+opensearchdescription
+openssl's
+openxml
+openxmlformats
+oplus
+oppositedm
+optgroup
+optgroups
+optionname
+options
+optionstoken
+optionvalue
+optstack
+or
+ordertype
+ordf
+ordm
+org
+origcategory
+ortime
+oslash
+other
+otherlanguages
+otherlist
+otheroption
+otherreason
+othertime
+otilde
+otimes
+otitle
+ouml
+outparam
+outputter
+outputtype
+outreachwiki
+over
+overridable
+override
+oversight
+oversighted
+oversighter
+overwrite
+overwroteimage
+own
+owner
+paction
+page
+pagecannotexist
+pagecategories
+pagecategorieslink
+pageclass
+pagecontent
+pagecount
+pagecss
+pagedeleted
+pagedlinks
+pageid
+pageids
+pageimages
+pageinfo
+pagelink
+pagelinks
+pagemerge
+pagename
+pagenamee
+pagenames
+pagenum
+pageoffset
+pagepropnames
+pageprops
+pagerestrictions
+pages
+pageselector
+pageset
+pagesetmodule
+pagesincategory
+pagesinnamespace
+pageswithprop
+pagetextmsg
+pagetitle
+pagetools
+pagetriage
+pagetriageaction
+pagetriagelist
+pagetriagestats
+pagetriagetagging
+pagetriagetemplate
+pageurl
+pageview
+param
+parameters
+paraminfo
+paramlist
+paramname
+params
+paren
+parens
+parentid
+parenttree
+parms
+parse
+parsedcomment
+parseddescription
+parsedsummary
+parseerror
+parseinline
+parsemag
+parser
+parsercache
+parserfuncs
+parserfunctions
+parserhook
+parserrender
+parsetree
+parsevalue
+parsoid
+partialupload
+partname
+pass's
+passthru
+password
+passwordfor
+passwordreset
+passwordtooshort
+paste
+pastexpiry
+pathchar
+pathinfo
+pathname
+patrol
+patroldisabled
+patrolled
+patrollink
+patrolmarks
+patroltoken
+pattern
+pcache
+pcntl
+pcomment
+pdbk
+pdf's
+pendingdelta
+perc
+perfcached
+perfcachedts
+perm
+perma
+permalink
+permdenied
+permil
+permissiondenied
+permissionerror
+permissionserrors
+permissionserrorstext
+permissiontype
+perp
+perrow
+pgsql
+photoshop
+php
+php's
+phpfm
+phps
+phpsapi
+phpunit
+phpversion
+phpwiki
+phrasewise
+phtml
+pi
+pipermail
+pixmap
+pkey
+pkuk
+pl
+plain
+plainlink
+plainlinks
+plaintext
+plfrom
+plink
+pllimit
+plns
+plpgsql
+pltitle
+pltitles
+plusminus
+plusmn
+pname
+pnmtojpeg
+pnmtopng
+poolcounter
+popts
+popularpages
+portlet
+portlets
+posplus
+possible
+postcomment
+postgre
+postsep
+potd
+potm
+potx
+poweredby
+poweredbyico
+powersearch
+pp
+ppam
+ppsm
+ppsx
+pptm
+pptx
+precaching
+precompiled
+preferences
+preferencestoken
+prefill
+prefilled
+prefix
+prefixindex
+prefixsearchdisabled
+prefs
+prefsection
+prefsnologin
+prefsnologintext
+prefsubmit
+preload
+preloads
+preloadtitle
+prepending
+prependtext
+preprocess
+preprocessing
+preprocessors
+presentationml
+presep
+prevchar
+prevdiff
+previd
+previewconflict
+previewhead
+previewheader
+previewnote
+previewonfirst
+previewontop
+previewtext
+previousrevision
+prevlink
+prevn
+prexpiry
+prfiltercascade
+prfx
+primary
+printableversion
+printfooter
+printurl
+privacypage
+private
+privs
+prlevel
+probabalistically
+probs
+proc
+processings
+procs
+prodromou
+profession
+profileinfo
+programmatically
+project
+projectpage
+promotion
+prop
+properties
+property
+propname
+props
+prot
+protect
+protectcomment
+protectedarticle
+protectedinterface
+protectednamespace
+protectedpage
+protectedpages
+protectedpagetext
+protectedpagewarning
+protectedtitle
+protectedtitles
+protection
+protections
+protectlevel
+protectlogpage
+protectlogtext
+protectthispage
+protecttoken
+proto
+protocol
+protocols
+protos
+proxied
+proxyblocker
+proxyblockreason
+proxyunbannable
+prtype
+psir
+pst
+psttext
+psychedelix
+pt
+ptext
+ptool
+pubdate
+publicsuffix
+publishfailed
+punycode
+purge
+purged
+qabardjajəbza
+qbar
+qbsettings
+qmoicj
+qp
+quasit
+query
+querycache
+querycachetwo
+querycur
+querydiff
+querykey
+querymodule
+querymodules
+querypage
+querypages
+querystring
+querytype
+question
+queuefull
+quickbar
+quicktemplate
+quicktime
+qunit
+quux
+qvalues
+rabdiff
+radic
+radius
+raggett
+raii
+raimond
+random
+randompage
+randomredirect
+randstr
+range
+rangeblock
+rangeblocks
+rangedisabled
+rangeend
+rangestart
+raquo
+rarr
+rarticle
+rasterizations
+rasterize
+rasterized
+rasterizer
+ratelimited
+ratelimits
+rating
+ratings
+raw
+rawfm
+rawrow
+rbspan
+rc
+rcdays
+rceil
+rcfeed
+rcid
+rcids
+rclimit
+rcoptions
+rcpatroldisabled
+rctitle
+rctoken
+rdev
+rdfa
+rdfrom
+rdftype
+rdquo
+read
+readable
+readapidenied
+readarray
+reader
+readline
+readonlyreason
+readonlytext
+readonlywarning
+readrequired
+readrights
+realaudio
+realllly
+realname
+realpath
+reason
+reasonlist
+reasonstr
+reblock
+rebuildtextindex
+recache
+recached
+recaching
+recalc
+recentchange
+recentchanges
+recentchangescount
+recentchangesdays
+recentchangeslinked
+recentchangestext
+recenteditcount
+recentedits
+recip
+recips
+recreate
+recurse
+recurses
+redir
+redirect
+redirectable
+redirectcreated
+redirectedfrom
+redirections
+redirectpagesub
+redirectparams
+redirects
+redirectsnippet
+redirectstofile
+redirecttitle
+redirectto
+redirid
+redirlinks
+redirs
+redis
+redlink
+redlinks
+redocument
+reedyboy
+reenables
+reencode
+reference
+refetch
+refresheducation
+refreshlinks
+regexes
+regexlike
+region
+registered
+registration
+registrationdate
+reimport
+reindexation
+reindexed
+releasenotes
+relevance
+relevant
+relicense
+relimit
+relkind
+relname
+relnamespace
+remarticle
+remembermypassword
+rememberpassword
+removablegroups
+removal
+remove
+removed
+removedwatchtext
+removetags
+remreviewer
+remstudent
+renameuser
+renaming
+renderable
+renormalized
+repeating
+repl
+replaceafter
+replacer
+replacers
+replag
+replyto
+reporttime
+repos
+request
+requested
+requestid
+requeue
+required
+rerender
+rerendered
+rescnt
+researcher
+resends
+reset
+resetkinds
+resetlink
+resetpass
+resized
+resolutioninfo
+resolutionunit
+resolve
+resolved
+resourceloader
+responsecode
+restore
+restorelink
+restoreprefs
+restricted
+result
+resultset
+resultsperpage
+retrievedfrom
+returnto
+returntoquery
+retval
+reupload
+revalidate
+revalidation
+revdel
+revdelete
+revdelete'd
+revdelundel
+revert
+reverting
+revertpage
+reverts
+revid
+revids
+review
+reviewactivity
+reviewed
+reviewer
+reviewing
+revision
+revisionasof
+revisionday
+revisiondelete
+revisionid
+revisionmonth
+revisions
+revisiontext
+revisiontimestamp
+revisionuser
+revisionyear
+revlink
+revwrongpage
+rfloor
+rgba
+richtext
+rights
+rightscode
+rightsinfo
+rightslog
+rightslogtext
+rked
+rmdir
+rn
+rnlimit
+robotstxt
+roff
+role
+rollback
+rollbacker
+rollbacklink
+rollbacklinkcount
+rollbacktoken
+rootpage
+rootuserpages
+rowcount
+rown
+rownum
+rowsarr
+rowset
+rowspan
+rowspans
+rsaquo
+rsargs
+rsd
+rsdf
+rsquo
+rss
+rsvg
+ruleset
+rulesets
+rusyn
+rv
+rvcontinue
+rvdiffto
+rvlimit
+rvparse
+rvprop
+rvstart
+rvstartid
+rvtoken
+sabino
+safemode
+safesubst
+sais
+sameorigin
+samp
+sansserif
+save
+savearticle
+savedprefs
+saveprefs
+saveusergroups
+sawfish
+sbin
+sbquo
+scaler
+scalers
+scaron
+score
+screensize
+scribunto
+scriptable
+scriptbuilder
+scriptpath
+scrolltop
+sdot
+search
+search's
+searchaction
+searcharticle
+searchboxes
+searchbutton
+searcheverything
+searchform
+searchindex
+searchinfo
+searchlimit
+searchmenu
+searchnamespaces
+searchoptions
+searchresulttext
+searchstring
+searchtitle
+secondary
+section
+sectionanchor
+sectionedit
+sectioneditnotsupported
+sectionformat
+sectionnumber
+sectionprop
+sections
+sectionsnippet
+sectionsnotsupported
+sectiontitle
+securelogin
+seiten
+selectandother
+selectorother
+self
+selflink
+selfmove
+semiglobal
+semiprotected
+semiprotectedpagewarning
+sendemail
+sendmail
+sentences
+serialize
+servedby
+servername
+servertime
+serverurl
+sess
+session
+sessionfailure
+sessionid
+sessionkey
+setchange
+setcookie
+setemail
+setext
+setglobalaccountstatus
+setnewtype
+setnotificationtimestamp
+setopt
+setrename
+setrlimit
+setstatus
+sha
+shar
+sharding
+shared
+shareddescriptionfollows
+sharedfile
+sharedrepo
+sharedupload
+shellscript
+shiftwidth
+shockwave
+short
+shorturl
+shouldn
+shouting
+show
+showalldb
+showbots
+showdeleted
+showdiff
+showdifflinks
+showfilename
+showhiddencats
+showhideminor
+showhooks
+showingresults
+showinitializer
+showjumplinks
+showlinkedto
+showme
+showmeta
+shownavigation
+shownumberswatching
+showpreview
+showredirs
+showreviewed
+showsizediff
+showtoc
+showtoolbar
+showunreviewed
+shtml
+si
+siebrand
+sighhhh
+sigkill
+sigmaf
+signup
+sigsegv
+sigterm
+sii
+siit
+siiurlwidth
+simplesearch
+singlegroup
+singularthey
+sinumberingroup
+siprop
+site
+siteadmin
+sitecsspreview
+sitedir
+siteinfo
+sitejspreview
+sitemap
+sitemaps
+sitematrix
+sitename
+sitenotice
+siteprop
+sitesearch
+sitestats
+sitestatsupdate
+siteuser
+sitewide
+size
+sizediff
+sizediffdisabled
+sizes
+skey
+skinclass
+skinkey
+skinname
+skinnameclass
+skins
+skipcache
+skipcaptcha
+skipnotif
+skname
+sktemplate
+slideshow
+sm
+smaxage
+smil
+smtp
+snippet
+sodipodi
+softtabstop
+solaris
+somecontent
+somefeed
+someuser
+sorani
+sorbs
+sorbsreason
+sort
+sortdirection
+sortkey
+sortkeyprefix
+sortkeys
+source
+soxred
+spam
+spamdetected
+spamprotected
+spamprotectionmatch
+spamprotectiontext
+spamprotectiontitle
+spcontent
+special
+specialpage
+specialpagealiases
+specialpageattributes
+specialpagegroup
+specialpages
+specialprotected
+speedtip
+speedy
+speex
+spekking
+spellcheck
+spezial
+spoofable
+spreadsheetml
+sprefs
+sprintf
+sprotected
+sql's
+sqlite
+sqltotal
+sr
+srchres
+srcset
+srgs
+srprop
+srwhat
+stabilize
+stable
+stablesettings
+stansvik
+start
+startid
+startime
+startsortkey
+startsortkeyprefix
+starttime
+starttimestamp
+stash
+stashfailed
+stashimageinfo
+state
+staticredirect
+statistics
+statline
+status
+statuskey
+stdclass
+stdout
+steward
+stopwords
+storedversion
+strcasecmp
+strcmp
+string
+stripos
+stripslashes
+strlen
+strpos
+strrpos
+strtime
+strtok
+strtolower
+strtotime
+strtr
+struct
+strval
+stubthreshold
+student
+studies
+stuffit
+stxt
+stylename
+stylepath
+styleversion
+subaction
+subarray
+subcat
+subcats
+subclassing
+subcond
+subconds
+subdir
+subdomain
+subdomains
+sube
+subelement
+subelements
+subfunction
+subfunctions
+subimages
+subitem
+subitems
+subject
+subjectid
+subjectids
+subjectpagename
+subjectpagenamee
+subjectspace
+subjectspacee
+subkey
+subkeys
+sublevels
+submatch
+submodule
+submodule's
+submodules
+subnet
+subpage
+subpagename
+subpagenamee
+subpages
+subpagestr
+subparents
+subprocesses
+subsql
+substr
+succ
+success
+successbox
+suckage
+suggest
+suggestion
+suhosin
+suhosin's
+summ
+summary
+summarymissed
+summaryrequired
+supe
+superdomain
+superglobals
+superset
+suppress
+suppressed
+suppressedredirect
+suppressionlog
+suppressionlogtext
+suppressredirect
+suppressrevision
+svgs
+svn
+svnroot
+sybase
+symlinked
+syms
+sysinfo
+sysop
+system
+systemnachrichten
+szdiff
+szlig
+szymon
+t
+tabindex
+tablealign
+tablecell
+tablename
+tablesorter
+tablestack
+tabletags
+tabletype
+tabstop
+tag
+tagfilter
+tagline
+taglist
+tags
+tagset
+tagstack
+tailorings
+talk
+talkable
+talkfrom
+talkid
+talkids
+talkmove
+talkmoveoverredirect
+talkpage
+talkpageheader
+talkpagelinktext
+talkpagename
+talkpagenamee
+talkpagetext
+talkspace
+talkspacee
+talkto
+taraškievica
+tarask
+target
+tb
+tbase
+tbody
+tboverride
+tcount
+tcsh
+tddate
+tdtime
+teardown
+telnet
+temp
+tempdir
+template
+templatelinks
+templatepage
+templates
+templatesused
+templatesusedpreview
+templatesusedsection
+tempname
+tempout
+test
+testclean
+testdata
+testmailuser
+testpass
+testrunner
+testswarm
+testuser
+testutf
+texi
+texinfo
+text
+textarea
+textareas
+textares
+textbox
+textboxsize
+texthidden
+textid
+textlink
+textmissing
+textoverride
+textsf
+textsize
+textvector
+texvc
+tfoot
+tful
+tg
+that'll
+thead
+thelink
+theora
+thetasym
+thinsp
+thisisdeleted
+thispage
+thumbborder
+thumbcaption
+thumberror
+thumbheight
+thumbhtml
+thumbimage
+thumbinner
+thumbmime
+thumbnail
+thumbnailing
+thumbnailsize
+thumbname
+thumbsize
+thumbtext
+thumburl
+thumbwidth
+timeago
+timeanddate
+timecond
+timecorrection
+timeframe
+timekey
+timeoffset
+timep
+timespans
+timestamp
+timestamps
+timestamptz
+timezonelegend
+timezoneregion
+timezoneuseoffset
+timezoneuseserverdefault
+tino
+title
+titleblacklist
+titleconversion
+titleexists
+titlemsg
+titleprefixeddbkey
+titleprotected
+titleprotectedwarning
+titles
+titlesnippet
+titletext
+titlevector
+tl
+tllimit
+tltemplates
+tmpfile
+to
+toclevel
+tocline
+tocnumber
+tocsection
+toctext
+toctitle
+tofragment
+toggle
+toid
+token
+tokenname
+tokens
+tolang
+tongminh
+toobig
+toofewexpiries
+toohigh
+toolarray
+toolbarparent
+toolboxend
+toolboxlink
+toolong
+toolow
+tooltiponly
+tooshort
+top
+toparse
+topbar
+toplevel
+toplinks
+toponly
+torev
+torevid
+tornevall
+torunblocked
+totalcnt
+totalcount
+totalhits
+totalmemory
+totaltime
+totitle
+touched
+tplarg
+transcludable
+transclude
+transcluded
+transcluding
+transclusion
+transclusions
+transcode
+transcodekey
+transcoder
+transcodereset
+transcodestatus
+transcoding
+translatewiki
+transstat
+transwiki
+troff
+true
+truespeed
+trustworthy
+truthy
+tsearch
+tsquery
+tuple
+tweakblogs
+tweakers
+txt
+txtfm
+type
+typemustmatch
+typeof
+typname
+tzstring
+uacute
+uarr
+uc
+ucfirst
+ucirc
+udpprofile
+ufffd
+ugrave
+ui
+uint
+ulimit
+ulink
+ulinks
+uname
+unanchored
+unapprove
+unary
+unattached
+unauthenticate
+unavailable
+unblock
+unblocklogentry
+unblockself
+unblocktoken
+unbuffered
+uncacheable
+uncached
+uncategorized
+unclosable
+uncompress
+undel
+undelete
+undeleted
+undeletion
+undo
+undoafter
+undofailure
+undorev
+unescape
+unescaped
+unfeature
+unfeatured
+unflag
+ungrouped
+unhelpful
+unhidden
+unhide
+unidata
+unindent
+unindexed
+uniq
+unique
+universaleditbutton
+unixtime
+unknown
+unknownerror
+unknownnamespace
+unlock
+unlockdb
+unlogged
+unmakesafe
+unmark
+unmerge
+unmodified
+unoversight
+unoversighted
+unpadded
+unpatrolled
+unpatrolledletter
+unprefixed
+unprintables
+unprotect
+unprotectedarticle
+unprotection
+unprotectthispage
+unredacted
+unrequest
+unrequested
+unresolve
+unresolved
+unreviewed
+unreviewedpages
+unsanitized
+unseed
+unserialization
+unserialize
+unserialized
+unserializing
+unsetting
+unstub
+unstubbed
+unstubbing
+unstubs
+unsupportednamespace
+unsupportedrepo
+untaint
+untracked
+untrustworthiness
+unused
+unusual
+unversioned
+unviewable
+unviewed
+unwatch
+unwatched
+unwatchedpages
+unwatching
+unwatchthispage
+unwikified
+unwritable
+upconvert
+updateddate
+updatedtime
+updatelog
+upgradedoc
+upgrader
+upload
+upload's
+uploaddisabled
+uploadedimage
+uploadjava
+uploadlogpage
+uploadlogpagetext
+uploadnewversion
+uploadnologintext
+uploadpage
+uploadscripted
+uploadsource
+uploadstash
+uploadvirus
+uppercased
+upsih
+urandom
+url
+url's
+urlaction
+urldecode
+urldecoded
+urlencode
+urlencoded
+urlheight
+urlparam
+urlparm
+urlpath
+urlvar
+urlwidth
+ursh
+us
+usedomain
+useemail
+uselang
+uselivepreview
+usemod
+usemsgcache
+usenewrc
+user
+useragent
+useragents
+userblock
+usercan
+usercontribs
+usercreate
+usercreated
+usercss
+usercsspreview
+usercssyoucanpreview
+userdailycontribs
+userdir
+userdoesnotexist
+usereditcount
+useredits
+useremail
+userexists
+usergroup
+usergroups
+userhidden
+userid
+userinfo
+userinvalidcssjstitle
+userips
+userjs
+userjsprev
+userjspreview
+userjsyoucanpreview
+userlang
+userlangattributes
+userlink
+userlinks
+userlogin
+userloginlink
+userloginprompt
+userlogout
+usermaildisabled
+usermessage
+username
+usernameless
+usernames
+userpage
+userpages
+userpageurl
+userprefix
+userrights
+userrightstoken
+users
+usersbody
+userspace
+usertalk
+usertalklink
+usertext
+usertoollinks
+useskin
+useto
+usort
+ustar
+ustoken
+utfnormal
+uuml
+validate
+validationbuilder
+valign
+vals
+value
+values
+vandal
+vandalism
+variables
+variant
+variantarticlepath
+varlang
+varname
+vars
+varval
+vasiliev
+vasilvv
+vbase
+vbscript
+vcount
+vcsize
+venema's
+verbosify
+version
+versioning
+versionlink
+versionlog
+versionrequired
+versionrequiredtext
+very
+vhost
+vi
+vibber
+videoinfo
+view
+viewcount
+viewdeleted
+viewhelppage
+viewprevnext
+viewsource
+viewsourcelink
+viewsourcetext
+viewvc
+viewyourtext
+visible
+visualeditor
+viurlwidth
+voff
+vofp
+voicexml
+vorbis
+vpad
+vrml
+vslow
+vvcv
+vxml
+wais
+wait
+wakeup
+walltime
+warmup
+warning
+wasdeleted
+wasn
+watch
+watchcreations
+watchdefault
+watchdeletion
+watched
+watchlist
+watchlistdays
+watchlisthideanons
+watchlisthidebots
+watchlisthideliu
+watchlisthideminor
+watchlisthideown
+watchlisthidepatrolled
+watchlistraw
+watchlists
+watchlisttoken
+watchmoves
+watchthis
+watchthispage
+watchtoken
+watchuser
+wb
+wbmp
+wbxml
+wddx
+wddxfm
+weblog
+webm
+webp
+webrequest
+webserver
+weeks
+weierp
+weight
+wellwritten
+werdna
+wget
+what
+whatlinkshere
+whatwg
+wheely
+wheter
+whitelist
+whitelisted
+whitelistedittext
+whitelisting
+whois
+wicke
+width
+widthx
+wierkosz
+wietse
+wiki
+wiki'd
+wiki's
+wikia
+wikiadmin
+wikibase
+wikibits
+wikibooks
+wikidb
+wikifarm
+wikiid
+wikilink
+wikilinks
+wikilove
+wikiloveimagelog
+wikimedia
+wikimediacommons
+wikipage
+wikipedia
+wikipedian
+wikipedias
+wikiprintable
+wikis
+wikisyntax
+wikitable
+wikitables
+wikitech
+wikitext
+wikiuser
+wiktionary
+wincache
+wininet
+withaccess
+withaction
+witheditsonly
+withlanglinks
+withoutlanglinks
+wl
+wlallrev
+wldir
+wlend
+wlexcludeuser
+wllimit
+wlowner
+wlprop
+wltoken
+wmf's
+wml
+wmlc
+wmls
+wmlsc
+wmlscript
+wmlscriptc
+wordcount
+wordprocessingml
+wordwg
+workalike
+worldwind
+wouldn
+wr
+writeapi
+writeapidenied
+writedisabled
+writerequired
+writerights
+wrongpassword
+x
+xbitmap
+xcache
+xcancel
+xdebug
+xdiff
+xdomain
+xdomains
+xff
+xhtmldefaultnamespace
+xhtmlnamespaces
+xiff
+xlam
+xlsb
+xlsm
+xlsx
+xltm
+xltx
+xml
+xmldoublequote
+xmlfm
+xmlimport
+xmlns
+xmlsafe
+xmlselect
+xor
+xpinstall
+xpixmap
+xpsdocument
+xtended
+xwindowdump
+xxxx
+xxxxx
+yacute
+yaml
+yamlfm
+year
+yes
+youhavenewmessages
+youhavenewmessagesfromusers
+youhavenewmessagesmanyusers
+youhavenewmessagesmulti
+yourdiff
+yourdomainname
+youremail
+yourgender
+yourinternal
+yourlanguage
+yourname
+yournick
+yourpassword
+yourrealname
+yourtext
+yourvariant
+yourwiki
+yuml
+yyyymmddhhiiss
+zhdaemon
+zhengzhu
+zhtable
+zijdel
+zlib
+zoffset
+zwnj
<ul><li><ul><li> bar
</li></ul>
</li></ul>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading">A heading</span></h2>
<ul><li> Another list item
</li></ul>
</p>
!! end
+!! test
+Case-sensitive magic words, when cased differently, should just be template transclusions
+!! input
+{{CurrentMonth}}
+{{currentday}}
+{{cURreNTweEK}}
+{{currentHour}}
+!! result
+<p><a href="/index.php?title=Template:CurrentMonth&action=edit&redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a>
+<a href="/index.php?title=Template:Currentday&action=edit&redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a>
+<a href="/index.php?title=Template:CURreNTweEK&action=edit&redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a>
+<a href="/index.php?title=Template:CurrentHour&action=edit&redlink=1" class="new" title="Template:CurrentHour (page does not exist)">Template:CurrentHour</a>
+</p>
+!! end
+
+!! test
+Case-insensitive magic words should still work with weird casing.
+!! input
+{{sErVeRNaMe}}
+{{LCFirst:AOEU}}
+{{ucFIRST:aoeu}}
+{{SERver}}
+!! result
+<p>example.org
+aOEU
+Aoeu
+<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
+</p>
+!! end
+
!! test
Namespace 1 {{ns:1}}
!! input
===Smaller headline===
Blah blah
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1">Headline 1</span></h2>
<p>Some text
</p>
<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
</li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1">Headline 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1">Subheadline 1</span></h3>
+<h5><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level">Skipping a level</span></h5>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span></h6>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
<p>Some text
</p>
<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
</li>
</ul>
</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading">Level 1 Heading</span></h1>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span></h4>
+<h5><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span></h5>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span></h6>
<h6><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
<h6><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
<h6><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
</li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1">title 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1">title 1.1</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1">title 1.1.1</span></h4>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2">title 1.2</span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2">title 2</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1">title 2.1</span></h3>
!! end
</li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1">title 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1">title 1.1</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1">title 1.1.1</span></h4>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2">title 1.2</span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2">title 2</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1">title 2.1</span></h3>
!! end
== Foo bar ==
== Foo bar ==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar">Foo bar</span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2">Foo bar</span></h2>
!! end
== Foo bar ==
== Foo Bar ==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar">Foo bar</span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2">Foo Bar</span></h2>
!! end
<li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1">title 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1">title 1.1</span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2">title 2</span></h2>
!! end
<li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text > text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text">text > text</span></h2>
<p>section 1
</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: text < text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text < text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: text < text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text">text < text</span></h2>
<p>section 2
</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: text & text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text & text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: text & text">edit</a>]</span> <span class="mw-headline" id="text_.26_text">text & text</span></h2>
<p>section 3
</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text">text ' text</span></h2>
<p>section 4
</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: text " text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: text " text">edit</a>]</span> <span class="mw-headline" id="text_.22_text">text " text</span></h2>
<p>section 5
</p>
!! end
!! end
+!! test
+HTML headers vs TOC (bug 23393)
+(__NOEDITSECTION__ for clearer output, doesn't matter here)
+!! input
+<h1>Header 1</h1>
+== Header 1.1 ==
+== Header 1.2 ==
+
+<h1>Header 2
+</h1>
+== Header 2.1 ==
+== Header 2.2 ==
+__NOEDITSECTION__
+!! result
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-1"><a href="#Header_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Header 1.1</span></a></li>
+<li class="toclevel-2 tocsection-2"><a href="#Header_1.2"><span class="tocnumber">1.2</span> <span class="toctext">Header 1.2</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Header_2"><span class="tocnumber">2</span> <span class="toctext">Header 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-3"><a href="#Header_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Header 2.1</span></a></li>
+<li class="toclevel-2 tocsection-4"><a href="#Header_2.2"><span class="tocnumber">2.2</span> <span class="toctext">Header 2.2</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h1> <span class="mw-headline" id="Header_1">Header 1</span></h1>
+<h2> <span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
+<h2> <span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
+<h1> <span class="mw-headline" id="Header_2">Header 2</span></h1>
+<h2> <span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
+<h2> <span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
+
+!! end
+
!! test
BUG 1219 URL next to image (broken)
!! input
== onmouseover= ==
http://__TOC__
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D">onmouseover=</span></h2>
http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
{{anchorencode: _ +:.3A%3A&&]] }}
__NOEDITSECTION__
!! result
-<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&&]] </span></h3>
+<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&&]]</span></h3>
<p>.2B:.3A.253A.26.26.5D.5D
</p>
!! end
!! input
== -{Naslov}- ==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-">Naslov</span></h2>
!! end
<li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span></h2>
!! end
<li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span></h2>
!! end
<li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span></h2>
!! end
<li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span></h2>
!! end
<li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 < 3</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Proof: 2 < 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 < 3 </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Proof: 2 < 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3">Proof: 2 < 3</span></h2>
<p><small>Hanc marginis exiguitas non caperet.</small>
QED
</p>
<li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span></h2>
!! end
<li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b">Evilbye</sup></span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: b">Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b">Evilbye</sup> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: b">Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"><sup> b">Evilbye</sup></span></h2>
!! end
<li class="toclevel-1 tocsection-5"><a href="#Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">5</span> <span class="toctext"><span dir="ltr">Attributes after dir on these span tags must be deleted from the TOC</span></span></a></li>
</ul>
</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"> <span dir="ltr">C++</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: זבנג!">edit</a>]</span> <span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"> <span dir="rtl">זבנג!</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"><span dir="ltr">C++</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: זבנג!">edit</a>]</span> <span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"><span dir="rtl">זבנג!</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span></h2>
!! end
!! input
{{int:Bug32057}}
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text">Headline text</span></h2>
!! end
* cleanSig() should do nothing if disabled
*/
function testCleanSigDisabled() {
- global $wgCleanSignatures;
- $wgCleanSignatures = false;
+ $this->setMwGlobals( 'wgCleanSignatures', false );
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
$this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
}
- function provideMakeUrlIndexes() {
+ public static function provideMakeUrlIndexes() {
return array(
array(
// just a regular :)
$this->assertEquals( $expected, $actual, $description );
}
- function provideWfMatchesDomainList() {
+ public static function provideWfMatchesDomainList() {
$a = array();
$protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
foreach ( $protocols as $pDesc => $p ) {
$this->assertEquals( $expected, $actual, $description );
}
- function provideWfShellMaintenanceCmdList() {
+ public static function provideWfShellMaintenanceCmdList() {
global $wgPhpCli;
return array(
array( 'eval.php', array( '--help', '--test' ), array(),
$this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
}
- function provideWfIsBadImageList() {
+ public static function provideWfIsBadImageList() {
$blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
return array(
array( 'Bad.jpg', false, $blacklist, true,
/**
* Array format is ($code, $expected)
*/
- function provideLanguageCodes() {
+ public static function provideLanguageCodes() {
return array(
// Extracted from BCP47 (list not exhaustive)
# 2.1.1
"wfBaseName('$fullpath') => '$basename'" );
}
- function providePaths() {
+ public static function providePaths() {
return array(
array( '', '' ),
array( '/', '' ),
/** @dataProvider provideExpandableUrls */
public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
// Fake $wgServer and $wgCanonicalServer
- global $wgServer, $wgCanonicalServer;
- $oldServer = $wgServer;
- $oldCanServer = $wgCanonicalServer;
- $wgServer = $server;
- $wgCanonicalServer = $canServer;
+ $this->setMwGlobals( array(
+ 'wgServer' => $server,
+ 'wgCanonicalServer' => $canServer,
+ ) );
// Fake $_SERVER['HTTPS'] if needed
if ( $httpsMode ) {
}
$this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
-
- // Restore $wgServer and $wgCanonicalServer
- $wgServer = $oldServer;
- $wgCanonicalServer = $oldCanServer;
}
/**
);
}
- function provideABunchOfShorthands() {
+ public static function provideABunchOfShorthands() {
return array(
array( '', -1, 'Empty string' ),
array( ' ', -1, 'String of spaces' ),
$this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
}
- function provideNormalTimestamps() {
+ public static function provideNormalTimestamps() {
$t = gmmktime( 12, 34, 56, 1, 15, 2001 );
return array(
// TS_UNIX
$this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
}
- function provideOldTimestamps() {
+ public static function provideOldTimestamps() {
return array(
array( '19011213204554', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:54 GMT', 'Earliest time according to php documentation' ),
array( '20380119031407', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:07 GMT', 'Latest 32 bit time' ),
$this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
}
- function provideHttpDates() {
+ public static function provideHttpDates() {
return array(
array( 'Sun, 06 Nov 1994 08:49:37 GMT', '19941106084937', 'RFC 822 date' ),
array( 'Sunday, 06-Nov-94 08:49:37 GMT', '19941106084937', 'RFC 850 date' ),
}
public function testElementBasics() {
- global $wgWellFormedXml;
-
$this->assertEquals(
'<img>',
Html::element( 'img', null, '' ),
'Close tag for empty element (array, string)'
);
- $wgWellFormedXml = true;
+ $this->setMwGlobals( 'wgWellFormedXml', true );
$this->assertEquals(
'<img />',
}
public function testExpandAttributesForBooleans() {
- global $wgHtml5, $wgWellFormedXml;
-
$this->assertEquals(
'',
Html::expandAttributes( array( 'selected' => false ) ),
'Boolean attributes have no value when value is true (passed as numerical array)'
);
- $wgWellFormedXml = true;
+ $this->setMwGlobals( 'wgWellFormedXml', true );
$this->assertEquals(
' selected=""',
'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
);
- $wgHtml5 = false;
+ $this->setMwGlobals( 'wgHtml5', false );
$this->assertEquals(
' selected="selected"',
* Please note it output a string prefixed with a space!
*/
public function testExpandAttributesVariousExpansions() {
- global $wgWellFormedXml;
-
### NOT EMPTY ####
$this->assertEquals(
' empty_string=""',
'Number 0 value needs no quotes'
);
- $wgWellFormedXml = true;
+ $this->setMwGlobals( 'wgWellFormedXml', true );
$this->assertEquals(
' empty_string=""',
* List of input element types values introduced by HTML5
* Full list at http://www.w3.org/TR/html-markup/input.html
*/
- function provideHtml5InputTypes() {
+ public static function provideHtml5InputTypes() {
$types = array(
'datetime',
'datetime-local',
);
}
- function provideCasesForUserLink() {
+ public static function provideCasesForUserLink() {
# Format:
# - expected
# - userid
$this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
}
- function testInContentLanguage() {
- global $wgLang, $wgForceUIMsgAsContentMsg;
- $wgLang = Language::factory( 'fr' );
+ function testInContentLanguageDisabled() {
+ $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
- $wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
+ }
+
+ function testInContentLanguageEnabled() {
+ $this->setMwGlobals( array(
+ 'wgLang' => Language::factory( 'fr' ),
+ 'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
+ ) );
+
$this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
}
* ^--- important, causes temporary tables to be used instead of the real database
*/
class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
- var $saveContentHandlerNoDB = null;
function setUp() {
- global $wgContentHandlerUseDB;
-
- $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
- $wgContentHandlerUseDB = false;
+ $this->setMwGlobals( 'wgContentHandlerUseDB', false );
$dbw = wfGetDB( DB_MASTER );
parent::setUp();
}
- function tearDown() {
- global $wgContentHandlerUseDB;
-
- parent::tearDown();
-
- $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
- }
-
/**
* @covers Revision::selectFields
*/
function testCompressRevisionTextUtf8Gzip() {
$this->checkPHPExtension( 'zlib' );
-
- global $wgCompressRevisions;
- $wgCompressRevisions = true;
+ $this->setMwGlobals( 'wgCompressRevisions', true );
$row = new stdClass;
$row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
/**
* Provide HTML5 tags
*/
- function provideHtml5Tags() {
+ public static function provideHtml5Tags() {
$ESCAPED = true; # We want tag to be escaped
$VERBATIM = false; # We want to keep the tag
return array(
);
}
- function provideTagAttributesToDecode() {
+ public static function provideTagAttributesToDecode() {
return array(
array( array( 'foo' => 'bar' ), 'foo=bar', 'Unquoted attribute' ),
array( array( 'foo' => 'bar' ), ' foo = bar ', 'Spaced attribute' ),
/**
* Test for support or lack of support for specific attributes in the attribute whitelist.
*/
- function provideAttributeSupport() {
+ public static function provideAttributeSupport() {
/** array( <attributes>, <expected>, <message> ) */
return array(
array( 'div', ' role="presentation"', ' role="presentation"', 'Support for WAI-ARIA\'s role="presentation".' ),
$seleniumSettings = array();
$seleniumBrowsers = array();
$seleniumTestSuites = array();
- global $wgSeleniumConfigFile;
- $wgSeleniumConfigFile = '';
+ $this->setMwGlobals( 'wgSeleniumConfigFile', '' );
+
SeleniumConfig::getSeleniumSettings( $seleniumSettings,
$seleniumBrowsers,
$seleniumTestSuites );
$seleniumSettings = array();
$seleniumBrowsers = array();
$seleniumTestSuites = array();
- global $wgSeleniumConfigFile;
$this->writeToTempFile( $this->testConfig0 );
- $wgSeleniumConfigFile = $this->tempFileName;
+ $this->setMwGlobals( 'wgSeleniumConfigFile', $this->tempFileName );
+
SeleniumConfig::getSeleniumSettings( $seleniumSettings,
$seleniumBrowsers,
$seleniumTestSuites );
* Markus Kuhn:
* http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
*/
- function provideStringsForIsUtf8Check() {
+ public static function provideStringsForIsUtf8Check() {
// Expected return values for StringUtils::isUtf8()
$PASS = true;
$FAIL = false;
);
}
- function provideCasesForGetpageviewlanguage() {
+ public static function provideCasesForGetpageviewlanguage() {
# Format:
# - expected
# - Title name
);
}
- function provideBaseTitleCases() {
+ public static function provideBaseTitleCases() {
return array(
# Title, expected base, optional message
array( 'User:John_Doe/subOne/subTwo', 'John Doe/subOne' ),
);
}
- function provideSubpageTitleCases() {
+ public static function provideSubpageTitleCases() {
return array(
# Title, expected base, optional message
array( 'User:John_Doe/subOne/subTwo', 'subTwo' ),
* @dataProvider provideGetIP
*/
function testGetIP( $expected, $input, $squid, $private, $description ) {
- global $wgSquidServersNoPurge, $wgUsePrivateIPs;
$_SERVER = $input;
- $wgSquidServersNoPurge = $squid;
- $wgUsePrivateIPs = $private;
+ $this->setMwGlobals( array(
+ 'wgSquidServersNoPurge' => $squid,
+ 'wgUsePrivateIPs' => $private,
+ ) );
+
$request = new WebRequest();
$result = $request->getIP();
$this->assertEquals( $expected, $result, $description );
* ^--- important, causes temporary tables to be used instead of the real database
*/
class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
- var $saveContentHandlerNoDB = null;
function setUp() {
- global $wgContentHandlerUseDB;
-
parent::setUp();
-
- $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
- $wgContentHandlerUseDB = false;
+ $this->setMwGlobals( 'wgContentHandlerUseDB', false );
$dbw = wfGetDB( DB_MASTER );
}
}
- function tearDown() {
- global $wgContentHandlerUseDB;
-
- $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-
- parent::tearDown();
- }
-
public function testGetContentModel() {
$page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
/**
* Just provide the 'block' and 'unblock' action to test both API calls
*/
- function provideBlockUnblockAction() {
+ public static function provideBlockUnblockAction() {
return array(
array( 'block' ),
array( 'unblock' ),
$this->assertEquals( $data, $page->getContent()->serialize() );
}
- static function provideEditAppend() {
+ public static function provideEditAppend() {
return array(
array( #0: append
'foo', 'append', 'bar', "foobar"
$this->assertEquals( $expectedContent, $result, "Message fallback failed." );
}
- function provideMessagesForFallback() {
+ public static function provideMessagesForFallback() {
return array(
array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
$this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
}
- function provideMessagesForFullKeys() {
+ public static function provideMessagesForFullKeys() {
return array(
array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
* @group Database
*/
public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
- global $wgArticleCountMethod;
-
- $old = $wgArticleCountMethod;
- $wgArticleCountMethod = $mode;
+ $this->setMwGlobals( 'wgArticleCountMethod', $mode );
$content = $this->newContent( $text );
$v = $content->isCountable( $hasLinks, $this->context->getTitle() );
- $wgArticleCountMethod = $old;
$this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
. ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
. ( $this->db->getType() == 'postgres' ? '()' : '' )
);
}
+
+ function testUnknownTableCorruptsResults() {
+ $res = $this->db->select( 'page', '*', array( 'page_id' => 1 ) );
+ $this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
+ $this->assertInternalType( 'int', $res->numRows() );
+ }
}
"FileBackend::isStoragePath on path '$path'" );
}
- function provider_testIsStoragePath() {
+ public static function provider_testIsStoragePath() {
return array(
array( 'mwstore://', true ),
array( 'mwstore://backend', true ),
"FileBackend::splitStoragePath on path '$path'" );
}
- function provider_testSplitStoragePath() {
+ public static function provider_testSplitStoragePath() {
return array(
array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
"FileBackend::normalizeStoragePath on path '$path'" );
}
- function provider_normalizeStoragePath() {
+ public static function provider_normalizeStoragePath() {
return array(
array( 'mwstore://backend/container', 'mwstore://backend/container' ),
array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
"FileBackend::parentStoragePath on path '$path'" );
}
- function provider_testParentStoragePath() {
+ public static function provider_testParentStoragePath() {
return array(
array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
}
}
- function provider_testConcatenate() {
+ public static function provider_testConcatenate() {
$cases = array();
$rand = mt_rand( 0, 2000000000 ) . time();
}
}
- function provider_testGetFileStat() {
+ public static function provider_testGetFileStat() {
$cases = array();
$base = self::baseStorePath();
}
}
- function provider_testGetFileContents() {
+ public static function provider_testGetFileContents() {
$cases = array();
$base = self::baseStorePath();
$tmpFile->bind( $obj );
}
- function provider_testGetLocalCopy() {
+ public static function provider_testGetLocalCopy() {
$cases = array();
$base = self::baseStorePath();
}
}
- function provider_testGetLocalReference() {
+ public static function provider_testGetLocalReference() {
$cases = array();
$base = self::baseStorePath();
}
}
- function provider_testGetFileHttpUrl() {
+ public static function provider_testGetFileHttpUrl() {
$cases = array();
$base = self::baseStorePath();
$this->tearDownFiles();
}
- function provider_testPrepareAndClean() {
+ public static function provider_testPrepareAndClean() {
$base = self::baseStorePath();
return array(
array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
/**
* Provider for testFormat()
*/
- function provideDocFormattingTests() {
+ public static function provideDocFormattingTests() {
# Format: (expected string, unformattedText string, optional message)
return array(
# Escape some wikitext
class JobQueueTest extends MediaWikiTestCase {
protected $key;
protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
- protected $old = array();
function __construct( $name = null, array $data = array(), $dataName = '' ) {
parent::__construct( $name, $data, $dataName );
}
protected function setUp() {
- global $wgMemc, $wgJobTypeConf;
+ global $wgJobTypeConf;
parent::setUp();
- $this->old['wgMemc'] = $wgMemc;
- $wgMemc = new HashBagOStuff();
+
+ $this->setMwGlobals( 'wgMemc', new HashBagOStuff() );
+
if ( $this->getCliArg( 'use-jobqueue=' ) ) {
$name = $this->getCliArg( 'use-jobqueue=' );
if ( !isset( $wgJobTypeConf[$name] ) ) {
}
protected function tearDown() {
- global $wgMemc;
parent::tearDown();
foreach ( array(
'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
}
$this->$q = null;
}
- $wgMemc = $this->old['wgMemc'];
}
/**
$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
}
- function provider_queueLists() {
+ public static function provider_queueLists() {
return array(
array( 'queueRand', false, 'Random queue without ack()' ),
array( 'queueRandTTL', true, 'Random queue with ack()' ),
);
}
- function provider_fifoQueueLists() {
+ public static function provider_fifoQueueLists() {
return array(
array( 'queueFifo', false, 'Ordered queue without ack()' ),
array( 'queueFifoTTL', true, 'Ordered queue with ack()' )
}
}
- function provideValuesToEncode() {
+ public static function provideValuesToEncode() {
$obj = new stdClass();
$obj->property = 'value';
$obj->property2 = null;
);
}
- function provideValuesToDecode() {
+ public static function provideValuesToDecode() {
return array(
array( '1', 'basic integer' ),
array( '-1', 'negative integer' ),
* These transform cases are tested *in both directions*
* No need to declare a principle twice in both directions here.
*/
- function provideTransformCases() {
+ public static function provideTransformCases() {
return array(
// Property keys
array(
* If both ways can be tested, either put both versions in here or move
* it to provideTransformCases().
*/
- function provideTransformAdvancedCases() {
+ public static function provideTransformAdvancedCases() {
$bgPairs = array(
# [ - _ . ] <-> [ left right ltr rtl ]
'foo.jpg' => 'foo.jpg',
* Cases that are currently failing, but
* should be looked at in the future as enhancements and/or bug fix
*/
- function provideTransformBrokenCases() {
+ public static function provideTransformBrokenCases() {
return array(
// Guard against selectors that look flippable
array(
$this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
}
- function provideMinifyCases() {
+ public static function provideMinifyCases() {
return array(
// Whitespace
array( "\r\t\f \v\n\r", "" ),
$this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
}
- function provideRemapCases() {
+ public static function provideRemapCases() {
// Parameter signature:
// CSSMin::remap( $code, $local, $remote, $embedData = true )
return array(
$this->testMinifyOutput( $code, $expectedOutput );
}
- function provideStringCases() {
+ public static function provideStringCases() {
return array(
// String values should be respected
// - More than one space in a string value
class JavaScriptMinifierTest extends MediaWikiTestCase {
- function provideCases() {
+ public static function provideCases() {
return array(
// Basic whitespace and comments that should be stripped entirely
$this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
}
- function provideBug32548() {
+ public static function provideBug32548() {
return array(
array(
// This one gets interpreted all together by the prior code;
* translation (to en) where XMP should win.
*/
public function testMultilingualCascade() {
- global $wgShowEXIF;
-
if ( !wfDl( 'exif' ) ) {
$this->markTestSkipped( "This test needs the exif extension." );
}
$this->markTestSkipped( "This test needs the xml extension." );
}
- $wgShowEXIF = true;
+ $this->setMwGlobals( 'wgShowEXIF', true );
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'/Xmp-exif-multilingual_test.jpg' );
$this->assertEquals( $expectedParams, $params, $msg );
}
- function provideNormaliseParams() {
+ public static function provideNormaliseParams() {
return array(
/* Regular resize operations */
array(
if ( !wfDl( 'exif' ) ) {
$this->markTestSkipped( "This test needs the exif extension." );
}
- global $wgShowEXIF;
- $this->show = $wgShowEXIF;
- $wgShowEXIF = true;
- global $wgEnableAutoRotation;
- $this->oldAuto = $wgEnableAutoRotation;
- $wgEnableAutoRotation = true;
- }
-
- protected function tearDown() {
- global $wgShowEXIF, $wgEnableAutoRotation;
- $wgShowEXIF = $this->show;
- $wgEnableAutoRotation = $this->oldAuto;
-
- parent::tearDown();
+ $this->setMwGlobals( array(
+ 'wgShowEXIF' => true,
+ 'wgEnableAutoRotation' => true,
+ ) );
}
/**
* @dataProvider provideFilesNoAutoRotate
*/
function testMetadataNoAutoRotate( $name, $type, $info ) {
- global $wgEnableAutoRotation;
- $wgEnableAutoRotation = false;
+ $this->setMwGlobals( 'wgEnableAutoRotation', false );
$file = $this->dataFile( $name, $type );
$this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
$this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
-
- $wgEnableAutoRotation = true;
}
/**
* @dataProvider provideFilesNoAutoRotate
*/
function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
- global $wgEnableAutoRotation;
- $wgEnableAutoRotation = false;
+ $this->setMwGlobals( 'wgEnableAutoRotation', false );
foreach ( $thumbs as $size => $out ) {
if ( preg_match( '/^(\d+)px$/', $size, $matches ) ) {
$this->assertEquals( $out[1], $gis[1], "$name: thumb actual height check for $size" );
}
}
- $wgEnableAutoRotation = true;
}
public static function provideFilesNoAutoRotate() {
$this->assertEquals( $expected, $result );
}
- function provideBitmapExtractPreRotationDimensions() {
+ public static function provideBitmapExtractPreRotationDimensions() {
return array(
array(
0,
* Rough tests for {{SERVERNAME}} magic word
* Bug 31176
* @group Database
+ * @dataProvider dataServernameFromDifferentProtocols
*/
- function testServernameFromDifferentProtocols() {
- global $wgServer;
- $saved_wgServer = $wgServer;
+ function testServernameFromDifferentProtocols( $server ) {
+ $this->setMwGlobals( 'wgServer', $server );
- $wgServer = 'http://localhost/';
- $this->assertMagic( 'localhost', 'servername' );
- $wgServer = 'https://localhost/';
- $this->assertMagic( 'localhost', 'servername' );
- $wgServer = '//localhost/'; # bug 31176
$this->assertMagic( 'localhost', 'servername' );
+ }
- $wgServer = $saved_wgServer;
+ function dataServernameFromDifferentProtocols() {
+ return array(
+ array( 'http://localhost/' ),
+ array( 'https://localhost/' ),
+ array( '//localhost/' ), # bug 31176
+ );
}
############### HELPERS ############################################
return array( 'gallery', 'display map' /* Used by Maps, see r80025 CR */, '/foo' );
}
- function provideCases() {
+ public static function provideCases() {
return array(
array( "Foo", "<root>Foo</root>" ),
array( "<!-- Foo -->", "<root><comment><!-- Foo --></comment></root>" ),
/**
* These are more complex test cases taken out of wiki articles.
*/
- function provideFiles() {
+ public static function provideFiles() {
return array(
array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC-BY-SA by Striver
array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC-BY-SA by Polonium
/**
* Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
*/
- function provideHeadings() {
+ public static function provideHeadings() {
return array( /* These should become headings: */
array( "== h ==<!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==<comment><!--c1--></comment></h></root>" ),
array( "== h == <!--c1-->", "<root><h level=\"2\" i=\"1\">== h == <comment><!--c1--></comment></h></root>" ),
$this->assertEquals( $expected, $site->getFileUrl( $pathArgument ) );
}
- public function provideGetPageUrl() {
+ public static function provideGetPageUrl() {
return array(
// path, page, expected substring
array( 'http://acme.test/wiki/$1', 'Berlin', '/wiki/Berlin' ),
$this->assertEquals( '', $site->getProtocol() );
}
- public function provideGetPageUrl() {
+ public static function provideGetPageUrl() {
//NOTE: the assumption that the URL is built by replacing $1
// with the urlencoded version of $page
// is true for Site but not guaranteed for subclasses.
}
- function provideSearchOptionsTests() {
+ public static function provideSearchOptionsTests() {
$defaultNS = SearchEngine::defaultNamespaces();
$EMPTY_REQUEST = array();
$NO_USER_PREF = null;
class UploadFromUrlTest extends ApiTestCase {
protected function setUp() {
- global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
parent::setUp();
- $wgEnableUploads = true;
- $wgAllowCopyUploads = true;
- $wgAllowAsyncCopyUploads = true;
+ $this->setMwGlobals( array(
+ 'wgEnableUploads' => true,
+ 'wgAllowCopyUploads' => true,
+ 'wgAllowAsyncCopyUploads' => true,
+ ) );
wfSetupSession();
if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
}
public function testBug29408() {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
+ $this->setMwGlobals( 'wgUser', self::$users['uploader']->user );
$repo = RepoGroup::singleton()->getLocalRepo();
$stash = new UploadStash( $repo );
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
}
- function providerSprintfDate() {
+ public static function providerSprintfDate() {
return array(
array(
'xg "vs" g',
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'zero', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'one', 1 ),
array( 'many', 11 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 1 ),
array( 'many', 11 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
array( 'other', 11 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'many', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'zero', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ public static function providerPlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralExplicit() {
+ public static function providerPluralExplicit() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'Form 4', 0 ),
array( 'Form 2', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
// The comments in the beginning of the line help avoid RTL problems
// with text editors.
- function provideGrammar() {
+ public static function provideGrammar() {
return array (
array(
/* result */ 'וויקיפדיה',
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'many', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'zero', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array (
array( 'one', 1 ),
array( 'other', 2 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'zero', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
}
- function providerFormatNum() {
+ public static function providerFormatNum() {
return array(
array( '12,34,567', '1234567' ),
array( '12,345', '12345' ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'few', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'few', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralTwoForms() {
+ public static function providerPluralTwoForms() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'many', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralTwoForms() {
+ public static function providerPluralTwoForms() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'few', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 1 ),
array( 'many', 11 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
array( 'other', 11 ),
$this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
}
- function providerGrammar() {
+ public static function providerGrammar() {
return array(
array(
'Википедии',
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralTwoForms() {
+ public static function providerPluralTwoForms() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePluralAllForms() {
+ public static function providePluralAllForms() {
return array(
array( 'few', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'many', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providerPlural() {
+ public static function providerPlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralTwoForms() {
+ public static function providerPluralTwoForms() {
return array (
array( 'other', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 1 ),
array( 'many', 11 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
array( 'other', 11 ),
$this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
}
- function provideFormattableTimes() {
+ public static function provideFormattableTimes() {
return array(
array(
9.45,
/**
* Array format is ($len, $ellipsis, $input, $expected)
*/
- function provideHTMLTruncateData() {
+ public static function provideHTMLTruncateData() {
return array(
array( 0, 'XXX', "1234567890", "XXX" ),
array( 8, 'XXX', "1234567890", "12345XXX" ),
* and distributed as free software, under the GNU General Public Licence.
* http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
*/
- function provideWellFormedLanguageTags() {
+ public static function provideWellFormedLanguageTags() {
return array(
array( 'fr', 'two-letter code' ),
array( 'fr-latn', 'two-letter code with lower case script code' ),
* and distributed as free software, under the GNU General Public Licence.
* http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
*/
- function provideMalformedLanguageTags() {
+ public static function provideMalformedLanguageTags() {
return array(
array( 'f', 'language too short' ),
array( 'f-Latn', 'language too short with script' ),
);
}
- function provideLanguageCodes() {
+ public static function provideLanguageCodes() {
return array(
array( 'fr', 'Two letters, minor case' ),
array( 'EN', 'Two letters, upper case' ),
);
}
- function provideKnownLanguageTags() {
+ public static function provideKnownLanguageTags() {
return array(
array( 'fr', 'simple code' ),
array( 'bat-smg', 'an MW legacy tag' ),
);
}
- function provideUnknownLanguageTags() {
+ public static function provideUnknownLanguageTags() {
return array(
array( 'mw', 'non-existent two-letter code' ),
);
date_default_timezone_set( $oldTZ );
}
- function provideSprintfDateSamples() {
+ public static function provideSprintfDateSamples() {
return array(
array(
'xiY',
);
}
- function provideFormatSizes() {
+ public static function provideFormatSizes() {
return array(
array(
0,
);
}
- function provideFormatBitrate() {
+ public static function provideFormatBitrate() {
return array(
array(
0,
);
}
- function provideFormatDuration() {
+ public static function provideFormatDuration() {
return array(
array(
0,
);
}
- function provideCheckTitleEncodingData() {
+ public static function provideCheckTitleEncodingData() {
return array(
array( "" ),
array( "United States of America" ), // 7bit ASCII
);
}
- function provideRomanNumeralsData() {
+ public static function provideRomanNumeralsData() {
return array(
array( 1, 'I' ),
array( 2, 'II' ),
$this->assertEquals( $expected, $chosen );
}
- function providePluralData() {
+ public static function providePluralData() {
// Params are: [expected text, number given, [the plural forms]]
return array(
array( 'plural', 0, array(
$this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
}
- function provideTranslateBlockExpiry() {
+ public static function provideTranslateBlockExpiry() {
return array(
array( '2 hours', '2 hours', 'simple data from ipboptions' ),
array( 'indefinite', 'infinite', 'infinite from ipboptions' ),
);
}
- function provideCommafyData() {
+ public static function provideCommafyData() {
return array(
array( 1, '1' ),
array( 10, '10' ),
$this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
}
- static function provideIsSupportedLanguage() {
+ public static function provideIsSupportedLanguage() {
return array(
array( 'en', true, 'is supported language' ),
array( 'fi', true, 'is supported language' ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 0 ),
array( 'one', 1 ),
$this->assertEquals( $expected, $res, $msg );
}
- function provideDottedAndDotlessI() {
+ public static function provideDottedAndDotlessI() {
return array(
# function, input, input case, expected
# Case changed:
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 1 ),
array( 'many', 11 ),
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
array( 'other', 11 ),
$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function providePlural() {
+ public static function providePlural() {
return array (
array( 'one', 0 ),
array( 'one', 1 ),
* Clears $wgUser, and reports errors from addDBData to PHPUnit
*/
protected function setUp() {
- global $wgUser;
-
parent::setUp();
// Check if any Exception is stored for rethrowing from addDBData
throw $this->exceptionFromAddDBData;
}
- $wgUser = new User();
+ $this->setMwGlobals( 'wgUser', new User() );
}
/**
/**
* Simple test to verify our helper assertAttribs() is functional
- * Please note this assume MediaWiki default settings:
- * $wgNoFollowLinks = true
- * $wgExternalLinkTarget = false
*/
function testTestAttributesAssertionHelper() {
+ $this->setMwGlobals( array(
+ 'wgNoFollowLinks' => true,
+ 'wgExternalLinkTarget' => false,
+ ) );
$attribs = $this->getAttribs();
$this->assertArrayHasKey( 'rel', $attribs );
* Test $wgNoFollowLinks in sidebar
*/
function testRespectWgnofollowlinks() {
- global $wgNoFollowLinks;
- $saved = $wgNoFollowLinks;
- $wgNoFollowLinks = false;
+ $this->setMwGlobals( 'wgNoFollowLinks', false );
$attribs = $this->getAttribs();
$this->assertArrayNotHasKey( 'rel', $attribs,
'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
);
-
- // Restore global
- $wgNoFollowLinks = $saved;
}
/**
* Test $wgExternaLinkTarget in sidebar
+ * @dataProvider dataRespectExternallinktarget
*/
- function testRespectExternallinktarget() {
- global $wgExternalLinkTarget;
- $saved = $wgExternalLinkTarget;
-
- $wgExternalLinkTarget = '_blank';
- $attribs = $this->getAttribs();
- $this->assertArrayHasKey( 'target', $attribs );
- $this->assertEquals( $attribs['target'], '_blank' );
+ function testRespectExternallinktarget( $externalLinkTarget ) {
+ $this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
- $wgExternalLinkTarget = '_self';
$attribs = $this->getAttribs();
$this->assertArrayHasKey( 'target', $attribs );
- $this->assertEquals( $attribs['target'], '_self' );
-
- // Restore global
- $wgExternalLinkTarget = $saved;
+ $this->assertEquals( $attribs['target'], $externalLinkTarget );
}
+ function dataRespectExternallinktarget() {
+ return array(
+ array( '_blank' ),
+ array( '_self' ),
+ );
+ }
}