actually sorted.
* (bug 2865) User interface HTML elements don't use lang attribute
(completed the fix by adding the lang attribute to firstHeading)
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
=== API changes in 1.21 ===
* prop=revisions can now report the contentmodel and contentformat, see docs/contenthandler.txt
* Otherwise it will use $wgHTTPProxy (if set)
* Otherwise it will use the environment variable "http_proxy" (if set)
* - noProxy Don't use any proxy at all. Takes precedence over proxy value(s).
- * - sslVerifyHost (curl only) Verify hostname against certificate
+ * - sslVerifyHost (curl only) Set to 2 to verify hostname against certificate
+ * Setting to 1 (or true) will NOT verify the host name. It will
+ * only check its existence. Setting to 0 (or false) disables entirely.
* - sslVerifyCert (curl only) Verify SSL certificate
* - caInfo (curl only) Provide CA information
* - maxRedirects Maximum number of redirects to follow (defaults to 5)
protected $postData = null;
protected $proxy = null;
protected $noProxy = false;
- protected $sslVerifyHost = true;
+ /**
+ * Parameter passed to Curl that specifies whether
+ * to validate SSL certificates.
+ *
+ * Setting to 0 disables entirely. Setting to 1 checks
+ * the existence of a CN, but doesn't verify it. Setting
+ * to 2 (the default) actually verifies the host.
+ */
+ protected $sslVerifyHost = 2;
protected $sslVerifyCert = true;
protected $caInfo = null;
protected $method = "GET";
* @param $interface Boolean: whether it is an interface message
* (for example disables conversion)
*/
- public function addWikiTextTitle( $text, &$title, $linestart, $tidy = false, $interface = false ) {
+ public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
global $wgParser;
wfProfileIn( __METHOD__ );
/**
* Is this the mainpage?
- * @note Title::newFromText seams to be sufficiently optimized by the title
+ * @note Title::newFromText seems to be sufficiently optimized by the title
* cache that we don't need to over-optimize by doing direct comparisons and
* acidentally creating new bugs where $title->equals( Title::newFromText() )
* ends up reporting something differently than $title->isMainPage();
$block['reason'] = $row->ipb_reason;
}
if ( $fld_range && !$row->ipb_auto ) {
- $block['rangestart'] = IP::hexToQuad( $row->ipb_range_start );
- $block['rangeend'] = IP::hexToQuad( $row->ipb_range_end );
+ $block['rangestart'] = IP::formatHex( $row->ipb_range_start );
+ $block['rangeend'] = IP::formatHex( $row->ipb_range_end );
}
if ( $fld_flags ) {
// For clarity, these flags use the same names as their action=block counterparts
$vals['user'] = $row->user_name;
}
- if ( isset( $prop['user'] ) ) {
+ if ( isset( $prop['userid'] ) || /*B/C*/isset( $prop['user'] ) ) {
$vals['userid'] = $row->pt_user;
}
),
'userid' => 'integer'
),
+ 'userid' => array(
+ 'userid' => 'integer'
+ ),
'comment' => array(
'comment' => 'string'
),
if ( $text === null ) {
$format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat();
+ $model = $content->getModel();
if ( !$content->isSupportedFormat( $format ) ) {
- $model = $content->getModel();
$name = $title->getPrefixedDBkey();
$this->dieUsage( "The requested format {$this->contentFormat} is not supported ".
}
$text = $content->serialize( $format );
+
+ // always include format and model.
+ // Format is needed to deserialize, model is needed to interpret.
$vals['contentformat'] = $format;
+ $vals['contentmodel'] = $model;
}
if ( $text !== false ) {
ApiBase::PROP_NULLABLE => true
),
'texthidden' => 'boolean'
- )
+ ),
+ 'contentmodel' => array(
+ 'contentmodel' => 'string'
+ ),
);
self::addTokenProperties( $props, $this->getTokenFunctions() );
/**
* @since 1.20
- * @var array of callable
+ * @var array of Closure
*/
- protected $trxIdleCallbacks = array();
+ protected $mTrxIdleCallbacks = array();
protected $mTablePrefix;
protected $mFlags;
return $this->mDoneWrites;
}
+ /**
+ * Returns true if there is a transaction open with possible write
+ * queries or transaction idle callbacks waiting on it to finish.
+ *
+ * @return bool
+ */
+ public function writesOrCallbacksPending() {
+ return $this->mTrxLevel && ( $this->mTrxDoneWrites || $this->mTrxIdleCallbacks );
+ }
+
/**
* Is a connection to the database open?
* @return Boolean
* @return Bool operation success. true if already closed.
*/
public function close() {
+ if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
+ throw new MWException( "Transaction idle callbacks still pending." );
+ }
$this->mOpened = false;
if ( $this->mConn ) {
if ( $this->trxLevel() ) {
if ( false === $ret && $this->wasErrorReissuable() ) {
# Transaction is gone, like it or not
$this->mTrxLevel = 0;
- $this->trxIdleCallbacks = array(); // cancel
+ $this->mTrxIdleCallbacks = array(); // cancel
wfDebug( "Connection lost, reconnecting...\n" );
if ( $this->ping() ) {
*/
final public function onTransactionIdle( Closure $callback ) {
if ( $this->mTrxLevel ) {
- $this->trxIdleCallbacks[] = $callback;
+ $this->mTrxIdleCallbacks[] = $callback;
} else {
$callback();
}
* @since 1.20
*/
protected function runOnTransactionIdleCallbacks() {
+ $autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled?
+
$e = null; // last exception
do { // callbacks may add callbacks :)
- $callbacks = $this->trxIdleCallbacks;
- $this->trxIdleCallbacks = array(); // recursion guard
+ $callbacks = $this->mTrxIdleCallbacks;
+ $this->mTrxIdleCallbacks = array(); // recursion guard
foreach ( $callbacks as $callback ) {
try {
+ $this->clearFlag( DBO_TRX ); // make each query its own transaction
$callback();
+ $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
} catch ( Exception $e ) {}
}
- } while ( count( $this->trxIdleCallbacks ) );
+ } while ( count( $this->mTrxIdleCallbacks ) );
if ( $e instanceof Exception ) {
throw $e; // re-throw any last exception
wfWarn( "$fname: No transaction to rollback, something got out of sync!" );
}
$this->doRollback( $fname );
- $this->trxIdleCallbacks = array(); // cancel
+ $this->mTrxIdleCallbacks = array(); // cancel
}
/**
public function __toString() {
return (string)$this->mConn;
}
+
+ public function __destruct() {
+ if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
+ trigger_error( "Transaction idle callbacks still pending." );
+ }
+ }
}
continue;
}
foreach ( $conns2[$masterIndex] as $conn ) {
- if ( $conn->trxLevel() && $conn->doneWrites() ) {
+ if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
$conn->commit( __METHOD__, 'flush' );
}
}
return $ok;
}
+ /**
+ * @see FileBackendStore::doCreateInternal()
+ * @return Status
+ */
+ protected function doCreateInternal( array $params ) {
+ $status = Status::newGood();
+
+ $dest = $this->resolveToFSPath( $params['dst'] );
+ if ( $dest === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ if ( !empty( $params['async'] ) ) { // deferred
+ $tempFile = TempFSFile::factory( 'create_', 'tmp' );
+ if ( !$tempFile ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ return $status;
+ }
+ $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
+ if ( $bytes === false ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ return $status;
+ }
+ $cmd = implode( ' ', array(
+ wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
+ wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
+ wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+ ) );
+ $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
+ $tempFile->bind( $status->value );
+ } else { // immediate write
+ $bytes = file_put_contents( $dest, $params['content'] );
+ if ( $bytes === false ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ return $status;
+ }
+ $this->chmod( $dest );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FSFileBackend::doExecuteOpHandlesInternal()
+ */
+ protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
+ if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+ }
+ }
+
/**
* @see FileBackendStore::doStoreInternal()
* @return Status
}
}
- /**
- * @see FileBackendStore::doCreateInternal()
- * @return Status
- */
- protected function doCreateInternal( array $params ) {
- $status = Status::newGood();
-
- $dest = $this->resolveToFSPath( $params['dst'] );
- if ( $dest === null ) {
- $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
- return $status;
- }
-
- if ( !empty( $params['async'] ) ) { // deferred
- $tempFile = TempFSFile::factory( 'create_', 'tmp' );
- if ( !$tempFile ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- return $status;
- }
- $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
- if ( $bytes === false ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- return $status;
- }
- $cmd = implode( ' ', array(
- wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
- wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
- wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
- ) );
- $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
- $tempFile->bind( $status->value );
- } else { // immediate write
- $bytes = file_put_contents( $dest, $params['content'] );
- if ( $bytes === false ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- return $status;
- }
- $this->chmod( $dest );
- }
-
- return $status;
- }
-
- /**
- * @see FSFileBackend::doExecuteOpHandlesInternal()
- */
- protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
- if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
- }
- }
-
/**
* @see FileBackendStore::doPrepareInternal()
* @return Status
}
/**
- * Store a file into the backend from a file on the file system.
+ * Create a file in the backend with the given content.
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
-class StoreFileOp extends FileOp {
- /**
- * @return array
- */
+class CreateFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'src', 'dst' ),
+ return array( array( 'content', 'dst' ),
array( 'overwrite', 'overwriteSame', 'disposition' ) );
}
- /**
- * @param $predicates array
- * @return Status
- */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
- // Check if the source file exists on the file system
- if ( !is_file( $this->params['src'] ) ) {
- $status->fatal( 'backend-fail-notexists', $this->params['src'] );
- return $status;
- // Check if the source file is too big
- } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
+ // Check if the source data is too big
+ if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
$status->fatal( 'backend-fail-maxsize',
$this->params['dst'], $this->backend->maxFileSizeInternal() );
- $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+ $status->fatal( 'backend-fail-create', $this->params['dst'] );
return $status;
// Check if a file can be placed/changed at the destination
} elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
$status->fatal( 'backend-fail-usable', $this->params['dst'] );
- $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+ $status->fatal( 'backend-fail-create', $this->params['dst'] );
return $status;
}
// Check if destination file exists
* @return Status
*/
protected function doAttempt() {
- // Store the file at the destination
if ( !$this->destSameAsSource ) {
- return $this->backend->storeInternal( $this->setFlags( $this->params ) );
+ // Create the file at the destination
+ return $this->backend->createInternal( $this->setFlags( $this->params ) );
}
return Status::newGood();
}
/**
- * @return bool|string
+ * @return bool|String
*/
protected function getSourceSha1Base36() {
- wfSuppressWarnings();
- $hash = sha1_file( $this->params['src'] );
- wfRestoreWarnings();
- if ( $hash !== false ) {
- $hash = wfBaseConvert( $hash, 16, 36, 31 );
- }
- return $hash;
+ return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
}
+ /**
+ * @return array
+ */
public function storagePathsChanged() {
return array( $this->params['dst'] );
}
}
/**
- * Create a file in the backend with the given content.
+ * Store a file into the backend from a file on the file system.
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
-class CreateFileOp extends FileOp {
+class StoreFileOp extends FileOp {
+ /**
+ * @return array
+ */
protected function allowedParams() {
- return array( array( 'content', 'dst' ),
+ return array( array( 'src', 'dst' ),
array( 'overwrite', 'overwriteSame', 'disposition' ) );
}
+ /**
+ * @param $predicates array
+ * @return Status
+ */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
- // Check if the source data is too big
- if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
+ // Check if the source file exists on the file system
+ if ( !is_file( $this->params['src'] ) ) {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ // Check if the source file is too big
+ } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
$status->fatal( 'backend-fail-maxsize',
$this->params['dst'], $this->backend->maxFileSizeInternal() );
- $status->fatal( 'backend-fail-create', $this->params['dst'] );
+ $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
return $status;
// Check if a file can be placed/changed at the destination
} elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
$status->fatal( 'backend-fail-usable', $this->params['dst'] );
- $status->fatal( 'backend-fail-create', $this->params['dst'] );
+ $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
return $status;
}
// Check if destination file exists
* @return Status
*/
protected function doAttempt() {
+ // Store the file at the destination
if ( !$this->destSameAsSource ) {
- // Create the file at the destination
- return $this->backend->createInternal( $this->setFlags( $this->params ) );
+ return $this->backend->storeInternal( $this->setFlags( $this->params ) );
}
return Status::newGood();
}
/**
- * @return bool|String
+ * @return bool|string
*/
protected function getSourceSha1Base36() {
- return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+ wfSuppressWarnings();
+ $hash = sha1_file( $this->params['src'] );
+ wfRestoreWarnings();
+ if ( $hash !== false ) {
+ $hash = wfBaseConvert( $hash, 16, 36, 31 );
+ }
+ return $hash;
}
- /**
- * @return array
- */
public function storagePathsChanged() {
return array( $this->params['dst'] );
}
* @param $exp Integer: (optional) Expiration time. This can be a number of seconds
* to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
* longer must be the timestamp of the time at which the mapping should expire. It
- * is safe to use timestamps in all cases, regardless of exipration
+ * is safe to use timestamps in all cases, regardless of expiration
* eg: strtotime("+3 hour")
*
* @return Boolean
parent::__construct( $name );
$this->requestedNamespace = NS_CATEGORY;
}
+
+ /**
+ * Formats the result
+ * @param $skin The current skin
+ * @param $result The query result
+ * @return string The category link
+ */
+ function formatResult ( $skin, $result ) {
+ $title = Title::makeTitle( NS_CATEGORY, $result->title );
+ $text = $title->getText();
+
+ return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+ }
}
<?php
-/** زَوُن ( زَوُن)
+/** Arabic, Tunisian Spoken (تونسي)
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
* @author Csisc
*/
+$fallback = 'ar';
+
+$rtl = true;
+
$messages = array(
# User preference toggles
'tog-underline' => 'ضع خطا تحت الوصلات:',
'showdiff' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ',
'anoneditwarning' => "'''ܙܘܗܪܐ:''' ܠܐ ܐܝܬܝܟ ܥܠܝܠܐ.
ܐܝ ܦܝ (IP) ܕܝܠܟ ܢܬܟܬܒ ܒܬܫܥܝܬܐ ܕܦܐܬܐ.",
-'anonpreviewwarning' => '"Ü Ü\90 Ü\90Ü\9dܬÜ\9dÜ\9f Ü¥Ü Ü\9dÜ Ü\90. Ü\90Ü¢ Ü Ü\92Ü\9f ܦÜ\90ܬÜ\90 Ü\90ܢܬ Ü\90Ü\9d ܦÜ\9d (IP) Ü\95Ü\9dÜ Ü\9f ܢܬÜ\9fܬÜ\92 ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ."',
+'anonpreviewwarning' => '"Ü Ü\90 Ü\90Ü\9dܬÜ\9dÜ\9f Ü¥Ü Ü\9dÜ Ü\90. Ü Ü\92Ü\9fܬÜ\90 Ü\95ܦÜ\90ܬÜ\90 ܢܬÜ\9fܬÜ\92 Ü\90Ü\9d ܦÜ\9d (IP) Ü\95Ü\9dÜ Ü\9f ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ."',
'summary-preview' => 'ܚܝܪܐ ܩܕܡܝܐ ܕܦܣܝܩܬ̈ܐ :',
'blockedtitle' => 'ܡܦܠܚܢܐ ܗܘ ܡܚܪܡܐ',
'blockednoreason' => 'ܠܝܬ ܥܠܬܐ ܝܗܝܒܬܐ',
$fallback = 'ar';
+$rtl = true;
+
$namespaceNames = array(
NS_MEDIA => 'ميديا',
NS_SPECIAL => 'خاص',
$fallback = 'fa';
+$rtl = true;
+
$namespaceNames = array(
NS_MEDIA => 'مدیا',
NS_SPECIAL => 'حاص',
'tooltip-n-currentevents' => 'Атрымаць інфармацыю пра актуальныя падзеі',
'tooltip-n-recentchanges' => 'Сьпіс апошніх зьменаў у {{GRAMMAR:месны|{{SITENAME}}}}.',
'tooltip-n-randompage' => 'Паказаць выпадковую старонку',
-'tooltip-n-help' => 'Месца, каб пра ўсё даведацца.',
+'tooltip-n-help' => 'Месца, каб пра ўсё даведацца',
'tooltip-t-whatlinkshere' => 'Сьпіс усіх старонак, якія спасылаюцца на гэтую',
'tooltip-t-recentchangeslinked' => 'Апошнія зьмены ў старонках, на якія спасылаецца гэтая старонка',
'tooltip-feed-rss' => 'RSS-стужка для гэтай старонкі',
'markedaspatrollederror' => 'Немагчыма пазначыць як «патруляваную»',
'markedaspatrollederrortext' => 'Вы мусіце абраць вэрсію, каб пазначыць яе «патруляванай».',
'markedaspatrollederror-noautopatrol' => 'Вам не дазволена пазначаць Вашыя ўласныя зьмены як «патруляваныя».',
+'markedaspatrollednotify' => 'Гэтая зьмена ў «$1» была пазначаная як патруляваная.',
+'markedaspatrollederrornotify' => 'Не атрымалася адпатруляваць старонку.',
# Patrol log
'patrol-log-page' => 'Журнал патруляваньняў',
# Bad image list
'bad_image_list' => 'Фармат наступны:
-Разглядаюцца толькі элемэнты сьпісу (радкі, якія пачынаюцца з *). Першая спасылка ў радку мусіць быць спасылкай на кепскую выяву. Усе наступныя спасылкі ў тым жа радку будуць разглядацца як выключэньні, напрыклад, старонкі, дзе можа зьяўляцца выява.',
+Разглядаюцца толькі элемэнты сьпісу (радкі, якія пачынаюцца з *).
+Першая спасылка ў радку мусіць быць спасылкай на кепскую выяву.
+Усе наступныя спасылкі ў тым жа радку будуць разглядацца як выключэньні, напрыклад, старонкі, дзе можа зьяўляцца выява.',
# Metadata
'metadata' => 'Мэтазьвесткі',
*
* @author Freeyak
* @author Jason (on bo.wikipedia.org)
+ * @author YeshiTuhden
*/
$digitTransformTable = array(
'disclaimerpage' => 'Project:སྤྱིའི་དགག་བྱ།',
'edithelp' => 'རྩོམ་སྒྲིག་རོགས་རམ།',
'edithelppage' => 'Help:རྩོམ་སྒྲིག',
+'helppage' => 'Help:ནང་དོན་',
'mainpage' => 'གཙོ་ངོས།',
'mainpage-description' => 'གཙོ་ངོས།',
'policy-url' => 'Project: སྒྲིག་གཞི།',
'templatesused' => 'ཤོག་ངོས་འདིར་སྤྱད་པའི་ {{PLURAL:$1|དཔེ་པང་།|དཔེ་པང་།}}',
'template-protected' => 'སྲུང་སྐྱོབ་འོག་ཡོད་པ།',
'nocreate-loggedin' => 'ཤོག་ངོས་གསར་བཟོའི་ཆོག་མཆན་མི་འདུག',
+'recreate-moveddeleted-warn' => "'''ཉེན་བརྡ་:རང་གིས་སུབ་ཚར་བའི་ཤོག་ལེ་ཞིག་བསྐྱར་བཟོ་བྱེད་ཀྱི་འདུག་ '''
+ཁྱེད་རང་གལ་སྲིད་མུ་མཐུད་ཤོག་ལེ་འདི་བཟོ་ཅོས་བྱེད་འདོད་ན་སྟབས་བདེ་ཞིག་ལ་ང་ཚོས་སུབ་བཟིན་པའི་ཤོག་ལེ་འདིར་ཉར་ཡོད།",
# History pages
'viewpagelogs' => 'ཤོག་ངོས་འདིའི་ཉིན་ཐོ་ལ་ལྟ་བ།',
'nextn' => 'རྗེས་མ་{{PLURAL:$1|$1}}',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)ལ་ལྟ་བ།',
'searchmenu-legend' => 'འཚོལ་ཞིབ་འདེམས་ཚན།',
+'searchmenu-new' => 'ལྦེ་ཁེ་སྟེང་ལ་ཤོག་ལེ་ [[:$1]]བཟོས།',
+'searchprofile-project' => 'རོགས་རམ་དང་འཆར་གཞིའི་ཤོག་ངོས་',
+'searchprofile-everything' => 'ཚང་མ་',
+'searchprofile-advanced' => 'མཐོ་རིམ་',
'searchprofile-articles-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
'searchprofile-project-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
'searchprofile-images-tooltip' => 'ཡིག་ཆ་འཚོལ་བ།',
+'searchprofile-everything-tooltip' => 'བརྗོད་དོན་ཚང་མ་འཚོལ་གཞིབ་བྱེད་(གྲོས་མེས་ཤོག་ངོས་ཡང་འཚུད་པ་)',
'search-result-size' => '$1({{PLURAL:$2|1 word|$2 words}})',
'search-redirect' => '($1རིམ་འགྲེམ།)',
'search-section' => '(ཚན་པ $1)',
'search-interwiki-more' => '(དེ་ལས་མང་བ།)',
'search-relatedarticle' => 'འབྲེལ་ཡོད།',
'searchall' => 'ཚང་མ།',
+'search-nonefound' => 'ཁྱེད་ཀྱི་འདྲི་ཞིབ་དང་མཐུན་པའི་ལན་མི་འདུག་',
'powersearch' => 'ཞིབ་ཏུ་འཚོལ་བ།',
'powersearch-legend' => 'ཞིབ་ཏུ་འཚོལ་བ།',
'powersearch-ns' => 'མིང་གནས་ནང་འཚོལ་བ།',
# Undelete
'undeletelink' => 'ལྟ་བ། / བསྐྱར་འདྲེན།',
+'undeleteviewlink' => 'ལྟ་བ་',
'undelete-search-submit' => 'འཚོལ།',
# Namespace form on various pages
# Namespace 8 related
'allmessages' => 'མ་ལག་གི་སྐད་ཆ།',
+'allmessagesname' => 'མིང་',
# Thumbnails
'thumbnail-more' => 'ཆེ་རུ་གཏོང་བ།',
'tooltip-save' => 'བཟོ་བཅོས་ཉར་ཚགས་བྱོས།',
'tooltip-preview' => 'ཉར་ཚགས་ཀྱི་སྔོན་དུ་བཟོ་བཅོས་ལ་བསྐྱར་ཞིབ་གནང་རོགས།',
'tooltip-diff' => 'གང་ལ་བཟོ་བཅོས་བྱས་པའི་ཡིག་འབྲུ་སྟོན་པ།',
+'tooltip-summary' => 'ཕྱོགས་བསྡོམས་ཐུང་ངུ་ཞིག་འབྲིས་',
# Browsing diffs
'previousdiff' => '← རྩོམ་སྒྲིག་རྙིང་བ།',
$fallback = 'fa';
+$rtl = true;
+
$messages = array(
# User preference toggles
'tog-underline' => 'لینکهای خط به زیر',
'rcshowhidebots' => 'بۆتەکان $1',
'rcshowhideliu' => 'بەکارھێنەرە تۆمارکراوەکان $1',
'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
-'rcshowhidepatr' => 'Ú¯Û\86راÙ\86کارÛ\8cÛ\8cÛ\95 Ú©Û\86Ù\86ترÛ\86Úµکراوەکان $1',
+'rcshowhidepatr' => 'Ú¯Û\86راÙ\86کارÛ\8cÛ\8cÛ\95 Ú\86اÙ\88دÛ\8eرÛ\8cکراوەکان $1',
'rcshowhidemine' => 'دەستکارییەکانی من $1',
'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
'diff' => 'جیاوازی',
'newsectionsummary' => '/* $1 */ بەشی نوێ',
'rc-enhanced-expand' => 'وردەکارییەکان پیشان بدە (پێویستی بە جاڤاسکریپتە)',
'rc-enhanced-hide' => 'وردەکارییەکان بشارەوە',
+'rc-old-title' => 'بە ناوی سەرەکیی «$1» دروست کراوە',
# Recent changes linked
'recentchangeslinked' => 'گۆڕانکارییە پەیوەندیدارەکان',
'markedaspatrollederror' => 'Nelze označit za prověřené',
'markedaspatrollederrortext' => 'Musíte zvolit revizi, která má být označena jako prověřená.',
'markedaspatrollederror-noautopatrol' => 'Nemáte dovoleno označovat vlastní editace jako prověřené.',
+'markedaspatrollednotify' => 'Tato změna stránky $1 byla označena jako prověřená.',
+'markedaspatrollederrornotify' => 'Nepodařilo se označit jako prověřené.',
# Patrol log
'patrol-log-page' => 'Kniha prověřených editací',
'markedaspatrollederror' => 'Markering som „kontrolleret“ ikke mulig.',
'markedaspatrollederrortext' => 'Du skal vælge en sideændring.',
'markedaspatrollederror-noautopatrol' => 'Du må ikke markere dine egne ændringer som kontrolleret.',
+'markedaspatrollednotify' => 'Denne ændring af $1 er blevet markeret som patruljeret.',
+'markedaspatrollederrornotify' => 'Markering som patruljeret mislykkedes.',
# Patrol log
'patrol-log-page' => 'Kontrollog',
'vector-view-view' => 'Bıwane',
'vector-view-viewsource' => 'Çımey bıvêne',
'actions' => 'Kerdışi',
-'namespaces' => 'Cayê namey',
+'namespaces' => 'Cayê namam',
'variants' => 'Varyanti',
'errorpagetitle' => 'Xırab',
'timezoneregion-pacific' => 'Okyanuso Pasifik',
'allowemail' => 'Karberê bini wa bışê mı rê e-posta bırışê.',
'prefs-searchoptions' => 'Cı geyre',
-'prefs-namespaces' => 'Caê namey',
+'prefs-namespaces' => 'Cayê namam',
'defaultns' => 'Eke heni, enê cayanê namey de cı geyre (sae ke):',
'default' => 'qısur',
'prefs-files' => 'Dosyey',
'markedaspatrollederror' => 'Nişan nibeno ke devriye biyo',
'markedaspatrollederrortext' => 'Ti gani revizyon işaret bike ke Nişanê devriye biyo',
'markedaspatrollederror-noautopatrol' => 'Ti nieşkeno ke vurnayişê xo nişan bike ke devriye biyê.',
+'markedaspatrollednotify' => 'Na vurnayışa dewriye deye $1 nışan biyo.',
+'markedaspatrollederrornotify' => 'Nışan kerdışê dewriyey nêbı',
# Patrol log
'patrol-log-page' => 'Logê devriye',
'markedaspatrollederror' => 'Markěrowanje ako "kontrolěrowane" njejo móžne.',
'markedaspatrollederrortext' => 'Musyš wersiju wuzwóliś.',
'markedaspatrollederror-noautopatrol' => 'Njesmějoš swóje změny ako kontrolěrowane markěrowaś.',
+'markedaspatrollednotify' => 'Toś ta změna do $1 jo se ako doglědowana markěrowała.',
+'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane jo se njeraźiło.',
# Patrol log
'patrol-log-page' => 'Protokol kontrolow',
$fallback = 'fa';
+$rtl = true;
+
$messages = array(
'moredotdotdot' => 'ویشتر...',
'mypage' => 'می هنهشر',
'youhavenewmessages' => 'તમારા માટે $1 ($2).',
'newmessageslink' => 'નવીન સંદેશ',
'newmessagesdifflink' => 'છેલ્લો ફેરફાર',
-'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્યના|$3 અન્ય સભ્યોના}} $1 છે. ($2).',
+'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).',
'youhavenewmessagesmanyusers' => 'આપને માટે $1 છે. ($2)',
-'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશ|નવાં સંદેશાઓ}}',
+'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશો|નવા સંદેશા}}',
'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
'editsection' => 'ફેરફાર કરો',
'markedaspatrollederrortext' => '巡回済みにするには、版を指定する必要があります。',
'markedaspatrollederror-noautopatrol' => '自分の編集を巡回済みにする権限がありません。',
'markedaspatrollednotify' => '$1 へのこの変更は巡回済みになりました。',
+'markedaspatrollederrornotify' => '巡回済みにするのに失敗しました。',
# Patrol log
'patrol-log-page' => '巡回記録',
* @author Marmzok
*/
-$rtl = true;
-
$fallback = 'ckb';
+$rtl = true;
+
$digitTransformTable = array(
'0' => '٠', # ٠
'1' => '١', # ١
$messages = array(
# User preference toggles
-'tog-hideminor' => 'Kudha chanjyow bian en chanjyow a-dhiwedhes',
-'tog-watchcreations' => "Keworra folednow gwruthys genev dhe'm rol golyas",
-'tog-watchdefault' => "Keworra folednow chanjys genev dhe'm rol golyas",
-'tog-watchmoves' => "Keworra folednow gwayes genev dhe'm rol golyas",
+'tog-hideminor' => 'Cudha chanjyow bian yn chanjyow a-dhiwedhes',
+'tog-watchcreations' => "Keworra folennow gwruthys genev ha restrennow ughkergys genev dhe'm rol golyas",
+'tog-watchdefault' => "Keworra folennow ha restrennow chanjys genev dhe'm rol golyas",
+'tog-watchmoves' => "Keworra folennow ha restrennow gwayys genev dhe'm rol golyas",
'tog-watchdeletion' => "Keworra folednow dileys genev dhe'm rol golyas",
-'underline-always' => 'Pub pres',
-'underline-never' => 'Nevra',
-'underline-default' => 'Defowt an beurel',
+'underline-always' => 'Puppres',
+'underline-never' => 'Jammes',
+'underline-default' => 'Defowt an beurel po an grohen',
# Font style option in Special:Preferences
'editfont-default' => 'Defowt an beurel',
'category-media-header' => 'Media y\'n class "$1"',
'category-empty' => "''Nyns eus na folennow na media y'n class-ma.''",
'hidden-categories' => '{{PLURAL:$1|Class cudhys|Classys cudhys}}',
-'hidden-category-category' => 'Klassys kovys',
+'hidden-category-category' => 'Classys cudhys',
'category-subcat-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an isglass a sew.|Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew, dhyworth somm a $2.}}",
-'category-subcat-count-limited' => "Yma dhe'n klass-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew.",
+'category-subcat-count-limited' => "Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew.",
'category-article-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folennow}} a sew y'n class-ma, dhyworth somm a $2.}}",
-'category-article-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew e'n klass-ma.",
+'category-article-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
'category-file-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma, dhyworth somm a $2.}}",
-'category-file-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew e'n klass-ma.",
+'category-file-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
'listingcontinuesabbrev' => 'pes.',
'about' => 'A-dro dhe',
'newwindow' => '(y whra egery yn fenester noweth)',
'cancel' => 'Hedhy',
'moredotdotdot' => 'Moy...',
-'mypage' => 'Ow folen',
+'mypage' => 'Folen',
'mytalk' => 'Kescows',
-'anontalk' => 'Keskows rag an drigva IP-ma',
+'anontalk' => 'Kescows rag an drigva IP-ma',
'navigation' => 'Lewyans',
'and' => ' ha(g)',
# Cologne Blue skin
-'qbfind' => 'Kavos',
-'qbbrowse' => 'Peuri',
+'qbfind' => 'Cavos',
+'qbbrowse' => 'Peury',
'qbedit' => 'Chanjya',
'qbpageoptions' => 'An folen-ma',
-'qbmyoptions' => 'Ow folednow',
-'qbspecialpages' => 'Folednow arbednek',
+'qbmyoptions' => 'Ow folennow',
+'qbspecialpages' => 'Folennow arbennek',
'faq' => 'FAQ',
# Vector skin
'create-this-page' => 'Gwruthyl an folen-ma',
'delete' => 'Dilea',
'deletethispage' => 'Dilea an folen-ma',
-'undelete_short' => 'Disdhilea {{PLURAL:$1|udn janj|$1 chanj}}',
-'viewdeleted_short' => 'Gweles {{PLURAL:$1|udn janj diles|$1 chanj diles}}',
+'undelete_short' => 'Disdhilea {{PLURAL:$1|unn janj|$1 chanj}}',
+'viewdeleted_short' => 'Gweles {{PLURAL:$1|unn janj diles|$1 chanj diles}}',
'protect' => 'Difres',
'protect_change' => 'chanjya',
'protectthispage' => 'Difres an folen-ma',
'newpage' => 'Folen noweth',
'talkpage' => "Dadhelva a-dro dhe'n folen-ma",
'talkpagelinktext' => 'Kescows',
-'specialpage' => 'Folen arbednek',
+'specialpage' => 'Folen arbennek',
'personaltools' => 'Toulys personel',
-'postcomment' => 'Radn nowyth',
+'postcomment' => 'Rann noweth',
'talk' => 'Kescows',
'views' => 'Gwelow',
'toolbox' => 'Box toulys',
'projectpage' => 'Folen meta',
'imagepage' => 'Gweles folen an restren',
'mediawikipage' => 'Gweles folen an messajys',
-'templatepage' => 'Gweles folen an skantlyn',
+'templatepage' => 'Gweles folen an scantlyn',
'viewhelppage' => 'Gweles an folen gweres',
-'categorypage' => 'Gweles folen an klass',
-'viewtalkpage' => 'Gweles an keskows',
+'categorypage' => 'Gweles folen an class',
+'viewtalkpage' => 'Gweles an kescows',
'otherlanguages' => 'Yn yethow erel',
'redirectedfrom' => '(Daswedyes dhyworth $1)',
'redirectpagesub' => 'Folen daswedyans',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'aboutsite' => 'A-dro dhe {{SITENAME}}',
'aboutpage' => 'Project:Kedhlow',
-'copyright' => 'Kavadow yw an dalgh en-dadn $1.',
+'copyright' => 'Cavadow yw an dalgh yn-dann $1.',
'copyrightpage' => '{{ns:project}}:Gwirbryntyansow',
'currentevents' => 'Darvosow a-lemmyn',
'currentevents-url' => 'Project:Darvosow a-lemmyn',
'helppage' => 'Help:Gweres',
'mainpage' => 'Folen dre',
'mainpage-description' => 'Folen dre',
-'policy-url' => 'Project:Polici',
+'policy-url' => 'Project:Policy',
'portal' => 'Porth an gemeneth',
'portal-url' => 'Project:Porth an gemeneth',
'privacy' => 'Policy privetter',
'privacypage' => 'Project:Policy privetter',
-'badaccess' => 'Gwall kubmyes',
+'badaccess' => 'Gwall cummyes',
'ok' => 'Sur',
'retrievedfrom' => 'Daskevys dhyworth "$1"',
'youhavenewmessages' => 'Yma $1 genowgh ($2).',
'newmessageslink' => 'messajys noweth',
'newmessagesdifflink' => 'chanj diwettha',
-'youhavenewmessagesmulti' => 'Yma messajys nowyth genowgh war $1',
+'youhavenewmessagesmulti' => 'Yma messajys noweth genowgh war $1',
'editsection' => 'chanjya',
'editold' => 'chanjya',
'viewsourceold' => 'gweles an bennfenten',
'viewsourcelink' => 'gweles an bennfenten',
'editsectionhint' => 'Chanjya an rann: $1',
'toc' => 'Rol an folen',
-'showtoc' => 'diskwedhes',
-'hidetoc' => 'kudha',
-'collapsible-expand' => 'Efani',
+'showtoc' => 'disqwedhes',
+'hidetoc' => 'cudha',
+'collapsible-expand' => 'Efany',
'thisisdeleted' => 'Gweles po restorya $1?',
'viewdeleted' => 'Gweles $1?',
-'restorelink' => '{{PLURAL:$1|udn janj diles|$1 chanj diles}}',
+'restorelink' => '{{PLURAL:$1|unn janj diles|$1 chanj diles}}',
'feedlinks' => 'Feed:',
'site-rss-feed' => '$1 RSS feed',
'site-atom-feed' => '$1 Atom feed',
# General errors
'error' => 'Gwall',
'databaseerror' => 'Gwall database',
-'readonly' => 'Alhwedhys yw an database',
+'readonly' => 'Alwhedhys yw an database',
'missingarticle-rev' => '(amendyans#: $1)',
'missingarticle-diff' => '(Dyffrans: $1, $2)',
'internalerror' => 'Gwall a-bervedh',
'internalerror_info' => 'Gwall a-bervedh: $1',
-'filecopyerror' => 'Ny ylles kopia an restren "$1" war-tu "$2".',
-'filerenameerror' => 'Ny ylles dashenwel an restren "$1" dhe "$2".',
-'filedeleteerror' => 'Ny ylles dilea an restren "$1".',
-'filenotfound' => 'Ny ylles kavos an restren "$1".',
+'filecopyerror' => 'Ny veu possybyl copia an restren "$1" dhe "$2".',
+'filerenameerror' => 'Ny veu possybyl dashenwel an restren "$1" dhe "$2".',
+'filedeleteerror' => 'Ny veu possybyl dilea an restren "$1".',
+'filenotfound' => 'Ny veu kevys an restren "$1".',
'badtitle' => 'Titel drog',
'viewsource' => 'Gweles an bennfenten',
# Login and logout pages
'welcomecreation' => '== Dynnargh, $1! ==
-Gwruthys yw agas akont.
-Na wrewgh ankevi dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
+Gwruthys yw agas acont.
+Na wrewgh ankevy dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
'yourname' => 'Hanow usyer:',
'yourpassword' => 'Ger tremena:',
'yourpasswordagain' => 'Jynnscrifowgh agas ger tremena arta:',
'remembermypassword' => "Perthy cov a'm ger tremena war'n jynn amontya-ma (rag $1 {{PLURAL:$1|dedh|dedh}} dhe'n moyha)",
-'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmi',
+'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmy',
'yourdomainname' => 'Agas tiredh:',
'login' => 'Omgelmy',
'nav-login-createaccount' => 'Omgelmy / Formya acont noweth',
'loginprompt' => 'Res yw dhywgh galosegy cookies rag omgelmy orth {{SITENAME}}.',
'userlogin' => 'Omgelmy / formya acont noweth',
-'userloginnocreate' => 'Omgelmi',
-'logout' => 'Digelmi',
+'userloginnocreate' => 'Omgelmy',
+'logout' => 'Digelmy',
'userlogout' => 'Digelmy',
'notloggedin' => 'Digelmys',
'nologin' => "A nyns eus acont dhywgh? '''$1'''.",
'gotaccountlink' => 'Omgelmy',
'userlogin-resetlink' => 'Eus ankevys genowgh agas manylyon omgelmy?',
'createaccountmail' => 'der e-bost',
-'createaccountreason' => 'Cheson:',
-'badretype' => 'Ny wra parya an geryow-tremena an eyl gans y gila.',
+'createaccountreason' => 'Acheson:',
+'badretype' => 'Ny wra omdhesedhes an geryow-tremena entrys genowgh.',
'userexists' => "Yma'n hanow usyer entrys genowgh ow pos usys seulabres.
Dowisowgh hanow aral mar pleg.",
-'loginerror' => 'Gwall omgelmi',
-'createaccounterror' => 'Ny ylles formya an akont: $1',
-'nocookiesnew' => 'An akont yw formys, mes nyns owgh hwi omgelmys.
-Yma {{SITENAME}} owth usya cookies rag omgelmi devnydhyoryon.
+'loginerror' => 'Gwall omgelmy',
+'createaccounterror' => 'Ny veu possybyl formya an acont: $1',
+'nocookiesnew' => 'Formys yw an acont, mes nyns owgh why omgelmys.
+Yma {{SITENAME}} owth usya cookies rag omgelmy devnydhyoryon.
Dialosegys yw cookies war agas jynn amontya.
-Gwrewgh aga galosegi, hag omgelmi dre usya agas hanow usyer ha ger tremena nowyth.',
+Gwrewgh aga galosegy, hag omgelmowgh dre usya agas hanow usyer ha ger tremena noweth.',
'nocookieslogin' => 'Yma {{SITENAME}} owth usya cookies rag omgelmi devnydhyoryon.
Dialosegys yw cookies war agas jynn amontya.
Gwrewgh aga galosegi hag assaya arta.',
-'noname' => 'Ny wrussowgh hwi ri hanow usyer da.',
-'loginsuccess' => "'''Omgelmys owgh hwi lebmyn orth {{SITENAME}} avel \"\$1\".'''",
-'nouserspecified' => 'Res yw dhewgh ri hanow usyer.',
-'wrongpassword' => 'Kabm o an ger tremena.
+'noname' => 'Ny wrussowgh why ry hanow usyer da.',
+'loginsuccess' => "'''Omgelmys owgh why lemmyn orth {{SITENAME}} avel \"\$1\".'''",
+'nouserspecified' => 'Res yw dhywgh ry hanow usyer.',
+'wrongpassword' => 'Camm o an ger tremena.
Assayowgh arta mar pleg.',
'wrongpasswordempty' => 'Gwag o an ger-tremena res. Assayowgh arta mar pleg.',
'mailmypassword' => 'E-bostya ger tremena noweth',
-'noemailcreate' => 'Res yw dhewgh ri trigva ebost da',
-'accountcreated' => 'Formys yw an akont',
-'accountcreatedtext' => 'Formys yw an akont rag $1.',
+'noemailcreate' => 'Res yw dhewgh ry trigva ebost da',
+'accountcreated' => 'Acont formys',
+'accountcreatedtext' => 'Formys re beu an acont rag $1.',
'loginlanguagelabel' => 'Yeth: $1',
# Change password dialog
'resetpass' => 'Chanjya ger-tremena',
-'resetpass_header' => 'Chanjya ger tremena an akont',
-'oldpassword' => 'Ger tremena koth:',
-'newpassword' => 'Ger tremena nowyth:',
+'resetpass_header' => 'Chanjya ger tremena an acont',
+'oldpassword' => 'Ger tremena coth:',
+'newpassword' => 'Ger tremena noweth:',
'resetpass-submit-loggedin' => 'Chanjya an ger-tremena',
'resetpass-submit-cancel' => 'Hedhi',
'thursday' => 'Kamih',
'friday' => 'Jumek',
'saturday' => 'Sabtu',
-'sun' => 'Aha',
+'sun' => 'Min',
'mon' => 'Sin',
'tue' => 'Sal',
'wed' => 'Rab',
'thu' => 'Kam',
'fri' => 'Jum',
-'sat' => 'Sab',
+'sat' => 'Sat',
'january' => 'Januari',
-'february' => 'Februari',
+'february' => 'Pebruari',
'march' => 'Maret',
'april' => 'April',
-'may_long' => 'Mei',
+'may_long' => 'Mai',
'june' => 'Juni',
'july' => 'Juli',
'august' => 'Agustus',
'november' => 'November',
'december' => 'Desember',
'january-gen' => 'Januari',
-'february-gen' => 'Februari',
+'february-gen' => 'Pebruari',
'march-gen' => 'Maret',
'april-gen' => 'April',
-'may-gen' => 'Mei',
+'may-gen' => 'Mai',
'june-gen' => 'Juni',
'july-gen' => 'Juli',
'august-gen' => 'Agustus',
'november-gen' => 'November',
'december-gen' => 'Desember',
'jan' => 'Jan',
-'feb' => 'Feb',
+'feb' => 'Peb',
'mar' => 'Mar',
'apr' => 'Apr',
-'may' => 'Mei',
+'may' => 'Mai',
'jun' => 'Jun',
'jul' => 'Jul',
'aug' => 'Agu',
'cancel' => 'Batalkan',
'moredotdotdot' => 'Lainnyo...',
'mypage' => 'Laman ambo',
-'mytalk' => 'Ota denai',
+'mytalk' => 'Maota',
'anontalk' => 'Ota IP iko',
-'navigation' => 'Navigasi',
+'navigation' => 'Pinteh',
'and' => ' jo',
# Cologne Blue skin
'vector-simplesearch-preference' => 'Aktifkan pancarian saran nan disampurnokan (hanyo kulik Vector)',
'vector-view-create' => 'Buek',
'vector-view-edit' => 'Suntiang',
-'vector-view-history' => 'Caliak riwayat nan lalu',
+'vector-view-history' => 'Caliak riwayaik nan lalu',
'vector-view-view' => 'Baco',
'vector-view-viewsource' => 'Caliak sumber',
'actions' => 'Tindakan',
'go' => 'Tuju',
'searcharticle' => 'Tuju',
'history' => 'Riwayat halaman',
-'history_short' => 'Riwayat',
+'history_short' => 'Riwayaik',
'updatedmarker' => 'diubah sajak kunjuangan tarakhir ambo',
'printableversion' => 'Versi cetak',
-'permalink' => 'Pranala permanen',
+'permalink' => 'Pranala parmanen',
'print' => 'Cetak',
'view' => 'Tampilkan',
'edit' => 'Suntiang',
'talkpage' => 'Musyawarahkan laman ko',
'talkpagelinktext' => 'Maota',
'specialpage' => 'Laman istimewa',
-'personaltools' => 'Peralatan pribadi',
+'personaltools' => 'Pakakeh paribadi',
'postcomment' => 'Bagian baru',
'articlepage' => 'Liek isi laman',
-'talk' => 'Ota',
-'views' => 'Tampilan',
+'talk' => 'Rundiang',
+'views' => 'Caliak',
'toolbox' => 'Kotak pakakeh',
'userpage' => 'Liek laman pangguno',
'projectpage' => 'Caliak laman proyek',
'otherlanguages' => 'Dalam baso lain',
'redirectedfrom' => '(Dialiahkan dari $1)',
'redirectpagesub' => 'Laman pengalihan',
-'lastmodifiedat' => 'Laman ko tarakhir diubah pado $1, maso $2.',
+'lastmodifiedat' => 'Laman ko tarakhir diubah pado $2, $1.',
'viewcount' => 'Laman iko alah diakses sabanyak {{PLURAL:$1|ciek kali|$1 kali}}.<br />',
'protectedpage' => 'Laman nan dilindungi',
'jumpto' => 'Lompek ka:',
-'jumptonavigation' => 'navigasi',
+'jumptonavigation' => 'pinteh',
'jumptosearch' => 'cari',
'view-pool-error' => 'Maaf, server sadang sibuak pado kini ko.
Talalu banyak pangguno barusaho mancaliak laman iko.
'pool-errorunknown' => 'Kasalahan nan indak dikatahui',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Tentang {{SITENAME}}',
-'aboutpage' => 'Project:Perihal',
+'aboutsite' => 'Tantang {{SITENAME}}',
+'aboutpage' => 'Project:Tantang',
'copyright' => 'Kandungan tasadio dalam $1',
'copyrightpage' => '{{ns:project}}:Hak cipta',
-'currentevents' => 'Paristiwa takini',
-'currentevents-url' => 'Project:Paristiwa takini',
-'disclaimers' => 'Penyangkalan',
-'disclaimerpage' => 'Project:Penyangkalan umum',
+'currentevents' => 'Kajadian kini ko',
+'currentevents-url' => 'Project:Kajadian kini ko',
+'disclaimers' => 'Sanggah',
+'disclaimerpage' => 'Project:Sanggahan umum',
'edithelp' => 'Bantuan suntingan',
'edithelppage' => 'Help:Suntingan',
-'helppage' => 'Help:Kandungan',
-'mainpage' => 'Halaman Utamo',
-'mainpage-description' => 'Laman Utamo',
+'helppage' => 'Help:Takadia',
+'mainpage' => 'Laman Utamo',
+'mainpage-description' => 'Laman utamo',
'policy-url' => 'Project:Kabijakan',
'portal' => 'Portal komunitas',
'portal-url' => 'Project:Portal komunitas',
-'privacy' => 'Kebijakan privasi',
-'privacypage' => 'Project:Kebijakan privasi',
+'privacy' => 'Kecipehan privasi',
+'privacypage' => 'Project:Kecipehan privasi',
'badaccess' => 'Kesalahan hak akses',
'badaccess-group0' => 'Sanak indak diizinkan untuak malakukan tindakan nan Sanak minta.',
'versionrequiredtext' => 'MediaWiki versi $1 dibutuahkan untuak manggunokan laman ijo. Caliak [[Special:Version|laman versi]]',
'ok' => 'OK',
-'retrievedfrom' => 'Diperoleh dari "$1"',
+'retrievedfrom' => 'Didapek dari "$1"',
'youhavenewmessages' => 'Awak punyo $1 ($2).',
'newmessageslink' => 'pasan baru',
'newmessagesdifflink' => 'parubahan terakhir',
'editold' => 'suntiang',
'viewsourceold' => 'Caliak sumber',
'editlink' => 'suntiang',
-'viewsourcelink' => 'Lihek sumber',
+'viewsourcelink' => 'Caliak sumber',
'editsectionhint' => 'Suntiang bagian: $1',
-'toc' => 'Kandungan',
+'toc' => 'Daftar isi',
'showtoc' => 'tampilkan',
'hidetoc' => 'suruakkan',
'collapsible-collapse' => 'Ketekan',
'feed-invalid' => 'Tipe pamintaan umpan indak tapek.',
'feed-unavailable' => 'Umpan sindikasi indak tasadio',
'site-rss-feed' => '$1 RSS Umpan',
-'site-atom-feed' => '$1 umpan Atom',
+'site-atom-feed' => 'Umpan Atom $1',
'page-rss-feed' => 'Umpan RSS "$1"',
'page-atom-feed' => '"$1" umpan Atom',
-'red-link-title' => '$1 (halaman alun babuek)',
+'red-link-title' => '$1 (laman indak ado)',
'sort-descending' => 'Urutkan manurun',
'sort-ascending' => 'Urutkan manaik',
# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Halaman',
+'nstab-main' => 'Laman',
'nstab-user' => 'Laman pangguno',
'nstab-media' => 'Laman Media',
'nstab-special' => 'Laman istimewa',
'readonly' => 'Basis data dikunci',
'enterlockreason' => 'Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka',
'readonlytext' => 'Basis data sadang dikunci tahadok masuakan baru. Panguruih nan malakukan panguncian mamberikan panjalehan sabagai berikut: <p>$1',
-'missing-article' => 'Basis data indak dapek manamukan teks dari laman yang seharusnyo ado, namo "$1" $2.
+'missing-article' => 'Basis data indak dapek manamukan teks dari laman nan saharuihnyo ado, yaitu "$1" $2.
-Hal ko biasonyo disebabkan dek pranala usang ka riwayat terdahulu dari laman yang lah dihapuih.
+Hal ko biasonyo disababkan dek pranala usang ka pabaikkan tadahulu laman nan alah dihapuih.
-Jiko bukan iko penyebabnyo, awak mungkin lah manamukan sabuah bug dalam perangkat lunak ko.
-Sila laporkan ka [[Special:ListUsers/sysop|Pengurus]], dengan manandokan alamat URL nan dituju.',
+Jikok bukan iko panyababnyo, Sanak mungkin alah manamukan sabuah bug dalam pakakeh lunak.
+Silakan laporkan hal iko ka [[Special:ListUsers/sysop|Pangurus]], dangan manyabuikkan alamaik URL nan dituju.',
'missingarticle-rev' => '(revisi#: $1)',
'missingarticle-diff' => '(Bedo: $1, $2)',
'readonly_lag' => 'Basis data alah dikunci otomatis salagi basis data sakunder malakukan sinkronisasi jo basis data utamo',
'perfcachedts' => 'Data barikut iko diambiak dari singgahan dan tarakhir dipabaharui pado $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Pamutakhiran dari laman iko sadang dimatian. Data nan ado di siko saat iko indak akan dimuaik ulang.',
'wrong_wfQuery_params' => 'Parameter salah ka wfQuery()<br />Fungsi: $1<br />Pamintaan: $2',
-'viewsource' => 'Lihek sumber',
+'viewsource' => 'Caliak sumber',
'viewsource-title' => 'Caliak sumber untuak $1',
'actionthrottled' => 'Tindakan dibatasi',
'actionthrottledtext' => 'Anda dibatasi untuak malakuan tindakan iko talalu banyak dalam waktu singkek. Sila mancubo laik satalah bara menit.',
'anontalkpagetext' => "----''Iko adolah laman pambicaraan saurang pangguno anonim nan alun mambuek akun atau indak manggunoannyo.
Jadi, kami tapaso harus mamakai alamat IP nan basangkutan untuak maidentifikasikannyo.
Jikok Sanak adolah saurang pangguno anonim dan marasa mandapekkan komentar-komentar nan indak relevan nan ditujuan langsung kapado Sanak, sila [[Special:UserLogin/signup|mambuek akun]] atau [[Special:UserLogin|masuak log]] untuak mahindari karancuan jo pangguno anonim lainnya di lain wakatu.''",
-'noarticletext' => 'Kini ko indak ado teks dalam laman ko.
-Awak dapek [[Special:Search/{{PAGENAME}}|mancari judul laman ko]] pado laman lain,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log nan bakaik],
-atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} suntiang laman ko]</span>.',
+'noarticletext' => 'Kini ko indak ada teks di laman iko.
+Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancarian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
'noarticletext-nopermission' => 'Kini ko indak ado teks dalam laman iko.
-Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancaharian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancahari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
+
+Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancahari untuak judul laman iko]] di laman lain, atau <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancahari log takaik] </span>, tapi Sanak indak punyo izin untuak mambuek laman iko.',
'missing-revision' => 'Revisi $1 di halaman ko nan banamo "{{PAGENAME}}" indak ado.
Hal iko biasonyo disababkan dek pranala sajarah nan alah kadaluarsa ka halaman ko nan alah dihapuih.
'userinvalidcssjstitle' => "'''Paringatan:''' Kulik \"\$1\" indak ditamuan. Harap diingek bahawa laman .css dan .js manggunokan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannyo {{ns:user}}:Foo/Vector.css.",
'updated' => '(Dipabaharui)',
'note' => "'''Catatan:'''",
-'previewnote' => "'''Iko hanyo tampilan pratonton.'''
-Parubahan yang awak lakukan alun disimpan!",
+'previewnote' => "'''Ingek bahasonyo iko hanyo pratonton'''
+Parubahan Sanak alun disimpan!",
'continue-editing' => 'Pai ka area mangedit.',
'previewconflict' => 'Pratayang iko mancaminan teks pado bagian ateh kotak suntiangan teks sabagaimano akan taliek bilo Sanak manyimpannyo.',
'session_fail_preview' => "'''Maaf, kami ndak dapek mangolah suntiangan Sanak akibat tahapuihnyo data sesi.
# History pages
'viewpagelogs' => 'Lihek log untuak laman ko',
'currentrev-asof' => 'Revisi terkini pado $1',
-'revisionasof' => 'Revisi per $1',
+'revisionasof' => 'Pabaikkan per $1',
'revision-info' => 'Revisi sajak $1 dek $2',
-'previousrevision' => '← Revisi sabalunnyo',
+'previousrevision' => '← Pabaikkan sabalunnyo',
'nextrevision' => 'Revisi selanjutnyo →',
'currentrevisionlink' => 'Revisi terkini',
'cur' => 'kini',
# Revision deletion
'rev-delundel' => 'tampilkan/suruakkan',
'revdel-restore' => 'Ganti tampilan',
-'revdel-restore-deleted' => 'revisi nan lah tahapuih',
+'revdel-restore-deleted' => 'suntiangan nan alah dihapuih',
'revdel-restore-visible' => 'tampilan revisi',
# Merge log
-'revertmerge' => 'Batal bergabung',
+'revertmerge' => 'Bata bagabuang',
# Diffs
-'history-title' => 'Riwayat revisi dari "$1"',
+'history-title' => 'Riwayaik pabaiakkan dari "$1"',
'lineno' => 'Barih $1:',
'compareselectedversions' => 'Bandingkan revisi pilihan',
-'editundo' => 'batalkan',
+'editundo' => 'batalan',
'diff-multi' => '({{PLURAL:$1|ciek |$1 revisi antaro}} oleh {{PLURAL:$2|ciek|$2 pangguno}} indak ditampilkan)',
# Search results
'searchsubtitleinvalid' => "Awak mancari '''$1'''",
'notitlematches' => 'Indak ado judul nan pas',
'notextmatches' => 'Indak ado judul nan pas',
-'prevn' => 'sabalunnyo {{PLURAL:$1|$1}}',
-'nextn' => 'salanjuiknyo {{PLURAL:$1|$1}}',
-'prevn-title' => 'Sabalunnyo $1 {{PLURAL:$1|hasil|hasil}}',
-'nextn-title' => 'Barikuiknyo $1 {{PLURAL:$1|hasil|hasil}}',
-'shown-title' => '↓ Tampilkan $1 {{PLURAL:$1|hasil|hasil}} per lama',
-'viewprevnext' => 'Tampilkan ($1 {{int:pipe-separator}} $2) ($3)',
+'prevn' => '{{PLURAL:$1|$1}} sabalunnyo',
+'nextn' => '{{PLURAL:$1|$1}} salanjuknyo',
+'prevn-title' => '$1 {{PLURAL:$1|hasil|hasil}} sabalunnyo',
+'nextn-title' => '$1 {{PLURAL:$1|hasil|hasil}} salanjuknyo',
+'shown-title' => 'Caliakkan $1 {{PLURAL:$1|hasil|hasil}} per laman',
+'viewprevnext' => 'Caliakkan ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
-'searchprofile-articles' => 'Artikel',
-'searchprofile-project' => '↓ Laman Bantuan dan Proyek',
-'searchprofile-images' => '↓ Multimedia',
-'searchprofile-everything' => '↓ Sadonyo',
-'searchprofile-advanced' => 'Lanjuikan',
-'searchprofile-articles-tooltip' => '↓ Cari di $1',
+'searchprofile-articles' => 'Laman isi',
+'searchprofile-project' => 'Laman Bantuan jo Proyek',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Sadonyo',
+'searchprofile-advanced' => 'Lanjukkan',
+'searchprofile-articles-tooltip' => 'Cari di $1',
'searchprofile-project-tooltip' => 'Cari di $1',
-'searchprofile-images-tooltip' => '↓ Cari untuak berkas',
-'searchprofile-everything-tooltip' => '↓ Cari sadoalahnyo (tamasuak laman maota)',
-'searchprofile-advanced-tooltip' => 'Pacaharian di ruang namo tatantu',
+'searchprofile-images-tooltip' => 'Cari untuak berkas',
+'searchprofile-everything-tooltip' => 'Cari sadoalahnyo (tamasuak laman maota)',
+'searchprofile-advanced-tooltip' => 'Pacarian di ruang namo tatantu',
'search-result-size' => '$1 ({{PLURAL:$2|1 kato|$2 kato}})',
'search-result-category-size' => '{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})',
-'search-redirect' => '(pengalihan $1)',
+'search-redirect' => '(pangaliahan $1)',
'search-section' => '(bagian $1)',
'search-suggest' => 'Mungkin maksud awak: $1',
'search-interwiki-caption' => 'Proyek badunsanak',
'search-interwiki-default' => 'Hasil $1:',
'search-interwiki-more' => '(selanjutnyo)',
'searchrelated' => 'bakaitan',
-'searchall' => 'Sadonyo',
+'searchall' => 'sado',
'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1''' dari '''$3'''|Hasil '''$1 - $2''' dari '''$3'''}} untuak '''$4'''",
'nonefound' => "'''Catatan''': hanyo babarapo ruangnamo yang dicari sacaro default.
Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasuak laman ota, templat, dll), atau gunoan ruangnamo yang diinginkan sabagai awalan.",
# Preferences page
'preferences' => 'Preferensi',
-'mypreferences' => 'Preferensi den',
+'mypreferences' => 'Preferensi',
'prefs-beta' => 'Corak Beta',
'prefs-labs' => 'Corak Uji',
'youremail' => 'Surek Elektronik:',
'rcshowhidepatr' => '$1 suntiangan nan tajago',
'rcshowhidemine' => '$1 suntingan denai',
'rclinks' => 'Tampilkan $1 parubahan baru dalam $2 hari terakhir<br />$3',
-'diff' => 'beda',
-'hist' => 'versi',
+'diff' => 'bedo',
+'hist' => 'sajarah',
'hide' => 'Suruakkan',
'show' => 'Tampilkan',
'minoreditletter' => 'k',
# Recent changes linked
'recentchangeslinked' => 'Parubahan takaik',
-'recentchangeslinked-toolbox' => '↓ Parubahan takaik',
+'recentchangeslinked-toolbox' => 'Parubahan takaik',
'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
-'recentchangeslinked-summary' => "Iko adolah senarai parubahan terakhir pado laman yang takaik jo laman tartantu (atau pado kalompok kategori tartantu).
-Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
+'recentchangeslinked-summary' => "Iko adolah daftar parubahan tarakhir pado laman nan tahubuang dari laman tatantu (atau anggota dari suatu kategori tatantu).
+Halaman pada [[Special:Watchlist|your watchlist]] ditondai dangan '''cetak taba''",
'recentchangeslinked-page' => 'Namo laman:',
'recentchangeslinked-to' => 'Tampilkan parubahan dari laman yang takaik jo laman yang disajikan',
# Upload
-'upload' => 'Unggah berkas',
+'upload' => 'Muek berkas',
'uploadlogpage' => 'Log unggah',
'filedesc' => 'Ringkasan',
'uploadedimage' => 'unggah "[[$1]]"',
# File description page
'file-anchor-link' => 'Berkas',
-'filehist' => 'Riwayat berkas',
+'filehist' => 'Riwayaik berkas',
'filehist-help' => 'Klik pado tanggal/waktu untuak malihek berkas pado maso tu',
'filehist-revert' => 'kembalikan',
'filehist-current' => 'kini ko',
'filehist-user' => 'Pangguno',
'filehist-dimensions' => 'Dimensi',
'filehist-comment' => 'Ulasan',
-'imagelinks' => 'Pranala berkas',
+'imagelinks' => 'Panggunoan berkas',
'linkstoimage' => 'Berikut ko ado {{PLURAL:$1|laman nan takaik|$1 laman nan takaik}} jo berkas ko:',
'nolinkstoimage' => 'Indak ado laman nan ado batauik ka berkas ko.',
'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan oleh berbagai proyek lain.',
'uploadnewversion-linktext' => 'Unggah versi baru dari berkas ko',
# Random page
-'randompage' => '↓ Laman sumbarang',
+'randompage' => 'Laman sambarangan',
# Statistics
'statistics' => 'Statistik',
'nbytes' => '$1 {{PLURAL:$1|bait|bait}}',
'nmembers' => '$1 {{PLURAL:$1|anggota|anggota}}',
'prefixindex' => 'Semua laman jo awalan',
-'usercreated' => 'Dibuek pado $1 waktu $2',
+'usercreated' => '{{GENDER:$3|Dibuek}} pado $1 pukua $2',
'newpages' => 'Laman baru',
'move' => 'Pindahkan',
'movethispage' => 'Pindahkan laman ko',
# Watchlist
'watchlist' => 'Senarai pantauan denai',
-'mywatchlist' => 'Senarai pantauan den',
+'mywatchlist' => 'Daftar pantauan denai',
'watchlistfor2' => 'Untuak $1 $2',
'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|senarai pantauan awak]].
Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba''' pado [[Special:RecentChanges|senarai parubahan]] agar lebih mudah manjagonyo.",
'restriction-level' => 'Tingkek larangan:',
# Undelete
-'undeletelink' => 'tampilkan/pulihkan',
-'undeleteviewlink' => 'liek',
+'undeletelink' => 'caliak/cegakkan',
+'undeleteviewlink' => 'caliak',
# Namespace form on various pages
'namespace' => 'Ruangnamo:',
'whatlinkshere-hideredirs' => '$1 pengalihan',
'whatlinkshere-hidetrans' => '$1 transklusi',
'whatlinkshere-hidelinks' => '$1 pranala',
-'whatlinkshere-hideimages' => '$1 pahubuang gambar',
+'whatlinkshere-hideimages' => '$1 pahubuang berkas',
'whatlinkshere-filters' => 'Penapis',
# Block/unblock
'blockip' => 'Blokir pangguno',
'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,salamonyo:infinite',
'ipblocklist' => 'Pangguno tablokir',
-'blocklink' => 'blokir',
-'unblocklink' => 'hilangkan blokir',
-'change-blocklink' => 'ubah blokir',
-'contribslink' => 'kontrib',
+'blocklink' => 'balokir',
+'unblocklink' => 'hilangkan balokir',
+'change-blocklink' => 'ubah balokir',
+'contribslink' => 'jariah',
'blocklogpage' => 'Log pemblokiran',
'blocklogentry' => 'memblokir [[$1]] dalam maso berlaku $2 $3',
'unblocklogentry' => 'mahilangkan blokir $1',
'movetalk' => 'Pindahkan laman ota yang takaik',
'movelogpage' => 'Log pemindahan',
'movereason' => 'Alasan:',
-'revertmove' => 'kembalikan',
+'revertmove' => 'baliakkan',
# Export
'export' => 'Ekspor laman',
'thumbnail_error' => 'Gagal mambuek thumbnail : $1',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Halaman pangguno awak',
-'tooltip-pt-mytalk' => 'Halaman ota awak',
+'tooltip-pt-userpage' => 'Laman pangguno sanak',
+'tooltip-pt-mytalk' => 'Laman ota sanak',
'tooltip-pt-preferences' => 'Preferensi denai',
-'tooltip-pt-watchlist' => 'Senarai laman nan denai pantau',
-'tooltip-pt-mycontris' => 'Senarai jariah denai',
-'tooltip-pt-login' => 'Awak disarankan untuak masuak log; meskipun, hal tu indak diwajibkan',
+'tooltip-pt-watchlist' => 'Daftar laman nan denai pantau.',
+'tooltip-pt-mycontris' => 'Daftar jariah Sanak',
+'tooltip-pt-login' => 'Sanak disarankan untuak masuak log; musiki, hal tu indak diwajibkan',
'tooltip-pt-logout' => 'Kalua log',
-'tooltip-ca-talk' => 'Pembicaraan tentang isi halaman',
-'tooltip-ca-edit' => 'Awak buliah suntiang laman ko. Gunokan tombol pratonton sabalun manyimpan',
+'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
+'tooltip-ca-edit' => 'Sanak dapek manyuntiang laman iko. Silakan gunokan tombol pratonton sabalun manyimpan',
'tooltip-ca-addsection' => 'Mulai bagian baru',
'tooltip-ca-viewsource' => 'Laman ko dilinduangi.
-Awak hanyo buliah lihek sumber se',
-'tooltip-ca-history' => 'Revisi sabalunnyo laman ko',
+Sanak hanyo buliah lihek sumbernyo sajo',
+'tooltip-ca-history' => 'Pabaiakkan sabalunnyo dari laman ko',
'tooltip-ca-protect' => 'Lindungi laman ko',
'tooltip-ca-delete' => 'Hapuih laman iko',
'tooltip-ca-move' => 'Pindahkan laman ko',
-'tooltip-ca-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
+'tooltip-ca-watch' => 'Tambahkan laman ko ka daftar pantauan sanak',
'tooltip-ca-unwatch' => 'Kaluaan laman ko dari senarai pantauan awak',
'tooltip-search' => 'Cari {{SITENAME}}',
'tooltip-search-go' => 'Cari suatu laman dengan namo yang samo jiko tasadio',
-'tooltip-search-fulltext' => 'Cari halaman nan mamuek teks ko',
-'tooltip-p-logo' => '↓ Kunjungi laman utamo',
-'tooltip-n-mainpage' => 'Kunjungi Halaman Utamo',
-'tooltip-n-mainpage-description' => 'Kunjungi halaman utamo',
-'tooltip-n-portal' => 'Tentang proyek, apo yang dapek awak lakukan, di mano mancari sasuatu',
-'tooltip-n-currentevents' => 'Temukan informasi latar dari peristiwa kini ko',
+'tooltip-search-fulltext' => 'Cari laman untuak teks iko',
+'tooltip-p-logo' => 'Kunjuangi laman utamo',
+'tooltip-n-mainpage' => 'Kunjuangi laman Utamo',
+'tooltip-n-mainpage-description' => 'Kunjuangi laman utamo',
+'tooltip-n-portal' => 'Tantang proyek, apa nan dapek Sanak lakukan, dima untuak manamukan sasuatu',
+'tooltip-n-currentevents' => 'Tamukan informasi manganai latar balakang kajadian kini ko',
'tooltip-n-recentchanges' => 'Daftar panyuntiangan baru dalam wiki',
-'tooltip-n-randompage' => 'Tampilkan sembarang halaman',
+'tooltip-n-randompage' => 'Muek sambarang laman',
'tooltip-n-help' => 'Tampek mancari bantuan',
-'tooltip-t-whatlinkshere' => 'Senarai sado halaman wiki yang punyo pranala ka halaman ko',
+'tooltip-t-whatlinkshere' => 'Daftar dari kasado laman wiki nan tahubuang kasiko',
'tooltip-t-recentchangeslinked' => 'Parubahan baru halaman nan bakaik jo laman ko',
'tooltip-feed-rss' => 'Umpan RSS untuak laman ko',
'tooltip-feed-atom' => 'Umpan Atom untuak laman ko',
'tooltip-t-contributions' => 'Lihek senarai jariah pangguno ko',
'tooltip-t-emailuser' => 'Kirimkan e-mail ka pangguno ko',
-'tooltip-t-upload' => 'Unggah berkas',
-'tooltip-t-specialpages' => 'Sadoalah halaman istimewa',
-'tooltip-t-print' => 'Versi cetak halaman ko',
-'tooltip-t-permalink' => 'Pranala permanen untuak revisi laman ko',
-'tooltip-ca-nstab-main' => 'Lihek isi laman',
+'tooltip-t-upload' => 'Muek berkas',
+'tooltip-t-specialpages' => 'Daftar dari kasado laman istimewa',
+'tooltip-t-print' => 'Versi cetak dari laman ko',
+'tooltip-t-permalink' => 'Pranala parmanen untuak pabaiakkan laman ko',
+'tooltip-ca-nstab-main' => 'Caliak isi laman',
'tooltip-ca-nstab-user' => 'Caliak laman pangguno',
'tooltip-ca-nstab-special' => 'Iko adolah laman istimewa, awak indak buliah manyuntiangnyo',
'tooltip-ca-nstab-project' => 'Lihek laman proyek',
'tooltip-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
'tooltip-recreate' => 'Buek baliak laman walaupun sabananyo pernah dihapuih',
'tooltip-upload' => 'Mulai mamuek',
-'tooltip-rollback' => '"Baliakkan" baraliah suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
-'tooltip-undo' => '"Indak jadi" suntiangan ko dibaliakkan dan mambuka kotak suntiang dalam mode pratonton. Alasan dapek ditambah pado kotak ringkasan.',
+'tooltip-rollback' => '"Baliakkan" uruangkan suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
+'tooltip-undo' => '"Batalan" uruangkan panyuntiangan iko jo mambukak bantuak suntiang dalam bantuak pratonton. Hal ko mamungkinkan manambahkan alasan pado kotak ringkasan.',
'tooltip-preferences-save' => 'Simpan preferensi',
'tooltip-summary' => 'Masuakan sabuah ringkasan pendek',
'show-big-image' => 'Resolusi penuh',
# Bad image list
-'bad_image_list' => 'Formatnyo sabagai berikut:
+'bad_image_list' => 'Ukurannyo adolah sabagai barikuik:
-Hanyo butir senarai (barih diawali jo tando *) yang dihituang.
-Pranala partamo pado barih tu mesti bakaik ka berkas nan buruak.
-Pranala-pranala salanjuiknyo pado barih nan samo dianggap sabagai pengecualian, yaitu laman nan dapek manampilkan berkas tu.',
+Hanyo daftar butia (barih nan dimulai jo tando *) nan dianggap.
+Pranala patamo pado barih musiti pranala ka berkas buruak.
+Satiok pranala salanjuiknyo pado barih nan samo dianggap pangacualian, yaitu laman dima berkas tasabuik bisa tajadi sajajar.',
# Metadata
'metadata' => 'Metadata',
'newwindow' => '(Motlapoāz cē yancuīc tlanexillōtl)',
'cancel' => 'Ticcuepāz',
'moredotdotdot' => 'Huehca ōmpa...',
-'mypage' => 'Nozāzanil',
+'mypage' => 'Noāmauh',
'mytalk' => 'Notēixnāmiquiliz',
'anontalk' => 'Inīn IP ītēixnāmiquiliz',
'navigation' => 'Nènemòwalistli',
'revdelete-radio-set' => 'Quēmah',
'revdelete-radio-unset' => 'Ahmo',
'revdel-restore' => 'Ticpatlāz tlattaliztli',
+'revdel-restore-deleted' => 'tlapohpolōlli tlaceppahuilīztli',
+'revdel-restore-visible' => 'ittaloni tlaceppahuilīztli',
'pagehist' => 'Zāzanilli tlahcuilōlloh',
'deletedhist' => 'Ōtlapolo tlahcuilōlloh',
'revdelete-edit-reasonlist' => 'Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa',
# Search results
'searchresults' => 'Tlatēmoliztli',
+'searchresults-title' => '«$1» tlatēmōliztli īmochīhualiz',
'searchsubtitle' => 'Ōtictēmōz \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|mochīntīn zāzaniltin mopēhua īca "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|mochīntīn zāzaniltin tzonhuilia "$1" īhuīc]])',
'searchsubtitleinvalid' => "Ōtictēmo '''$1'''",
'prevn' => '{{PLURAL:$1|$1}} achtopa',
'nextn' => 'niman {{PLURAL:$1|$1}}',
+'shown-title' => 'Quinēxiltīz $1 {{PLURAL:$|mochīhualiztli}} cece āmac',
'viewprevnext' => 'Xiquintta ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Ye ia zāzanilli ītōca \"[[\$1]]\" inīn huiquipan'''",
'searchmenu-new' => "'''Tihuelīti ticchīhuāz zāzanilli ītōca \"[[:\$1]]\" inīn huiquipan'''",
'recentchanges' => 'Yancuīc tlapatlaliztli',
'recentchanges-legend' => 'Yancuīc tlapatlaliztechcopa tlanequiliztli',
'recentchanges-summary' => 'Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.',
+'recentchanges-label-newpage' => 'Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl',
+'recentchanges-label-minor' => 'Inīn tlapatlaliztli tepitōn',
'rcnote' => "Nicān {{PLURAL:$1|cah '''1''' tlapatlaliaztli|cateh in xōcoyōc '''$1''' tlapatlaliztli}} īpan xōcoyōc {{PLURAL:$2|tōnalli|'''$2''' tōnaltin}} īhuīcpa $5, $4.",
'rclistfrom' => 'Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1',
'rcshowhideminor' => '$1 tlapatlalitzintli',
'linksearch' => 'Calān tzonhuiliztli tlatemoliztli',
'linksearch-ns' => 'Tōcātzin:',
'linksearch-ok' => 'Tictēmōz',
+'linksearch-line' => '$1 tzonhuīlo īxquichca $2',
# Special:ListUsers
'listusers-submit' => 'Tiquittāz',
'ipb-unblock-addr' => 'Ahtiquitzacuilīz $1',
'ipb-unblock' => 'Ahtiquitzacuilīz IP nozo tlatequitiltilīlli',
'unblockip' => 'Ahtiquitzacuilīz tlatequitiltilīlli',
+'ipblocklist' => 'Tlatequitiltilīltzacualli',
'ipblocklist-submit' => 'Tlatēmōz',
'infiniteblock' => 'ahtlamic',
'expiringblock' => 'tlami īpan $1 īpan $2',
'anononlyblock' => 'zan ahtōcā',
'blocklink' => 'tiquitzacuilīz',
'unblocklink' => 'ahtiquitzacuilīz',
+'change-blocklink' => 'Ticpatlaz tlatzacualli',
'contribslink' => 'tlapatlaliztli',
'blocklogpage' => 'Tlatequitiltilīlli ōmotzacuili',
'blockme' => 'Timitzcuilīz',
'tooltip-ca-unwatch' => 'Ahtictlachiyāz inīn zāzanilli',
'tooltip-search' => 'Tlatēmōz īpan {{SITENAME}}',
'tooltip-search-go' => 'Tiyaz in zāzanilhuīc īca inīn huel melāhuac tōcaitl intlā yez',
+'tooltip-search-fulltext' => 'Tictemōz inīn tlahcuilōlli in āmac',
'tooltip-p-logo' => 'Calīxatl',
'tooltip-n-mainpage' => 'Tiquittaz in calīxatl',
'tooltip-n-mainpage-description' => 'Tiquittaz in calīxatl',
'tooltip-compareselectedversions' => 'Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.',
'tooltip-watch' => 'Ticcēntilīz inīn zāzanilli motlachiyalizhuīc',
'tooltip-upload' => 'Ticpēhua quetzaliztli',
+'tooltip-summary' => 'Xicaquilia tepitōn tlahcuilōltōntli',
# Attribution
'anonymous' => 'Ahtōcāitl {{PLURAL:$1|tlatequitiltilīlli|tlatequitiltilīlli}} īpan {{SITENAME}}',
'markedaspatrollederrortext' => 'A venta che a spessìfica che version che a veul marchè coma verificà.',
'markedaspatrollederror-noautopatrol' => "A l'ha nen ël përmess dë marchesse soe modìfiche coma «controlà».",
'markedaspatrollednotify' => "Ës cambi a $1 a l'é stàit marcà com verificà.",
-'markedaspatrollederrornotify' => 'Marcagi com verificà falì.',
+'markedaspatrollederrornotify' => 'Marcadura com verificà falìa.',
# Patrol log
'patrol-log-page' => 'Registr dij contròj',
# Multipage image navigation
'imgmultipageprev' => '← pàgina andré',
'imgmultipagenext' => 'pàgina anans →',
-'imgmultigo' => 'Va',
-'imgmultigoto' => 'Và a la pàgina $1',
+'imgmultigo' => 'Andé!',
+'imgmultigoto' => 'Andé a la pàgina $1',
# Table pager
'ascending_abbrev' => 'a chërse',
* @author Umherirrender
*/
+$rtl = true;
+
$namespaceNames = array(
NS_MEDIA => 'رسنۍ',
NS_SPECIAL => 'ځانګړی',
'protectionlevel' => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
);
-$rtl = true;
-
$messages = array(
# User preference toggles
'tog-underline' => 'کرښنې تړنې:',
'markedaspatrollederror' => 'Неможливо позначити як перевірену',
'markedaspatrollederrortext' => 'Ви повинні зазначити версію, яка буде позначена як перевірена.',
'markedaspatrollederror-noautopatrol' => 'Вам не дозволено позначати власні редагування як перевірені.',
+'markedaspatrollednotify' => 'Цю зміну у «$1» було позначено як відпатрульовану.',
+'markedaspatrollederrornotify' => 'Не вдалося поставити позначку про патрулювання.',
# Patrol log
'patrol-log-page' => 'Журнал патрулювання',
'duration-centuries' => '$1 {{PLURAL:$1|століття|століття|століть}}',
'duration-millennia' => '$1 {{PLURAL:$1|тисячоліття|тисячоліття|тисячоліть}}',
+# Unknown messages
+'mytalk-parenthetical' => 'обговорення',
);
'listingcontinuesabbrev' => '续',
'index-category' => '允许索引的页面',
'noindex-category' => '禁止索引的页面',
-'broken-file-category' => '损坏的文件的链接的页面',
+'broken-file-category' => '包含损坏的文件链接的页面',
'about' => '关于',
'article' => '内容页面',
'mostlinkedtemplates' => '最多链接模板',
'mostcategories' => '最多分类页面',
'mostimages' => '最多链接文件',
-'mostinterwikis' => '跨语言链接最多的页面',
+'mostinterwikis' => '最多跨语言链接页面',
'mostrevisions' => '最多版本页面',
'prefixindex' => '所有有前缀的页面',
'prefixindex-namespace' => '所有有前缀的页面($1名字空间)',
'listingcontinuesabbrev' => '續',
'index-category' => '已做索引的頁面',
'noindex-category' => '未做索引的頁面',
-'broken-file-category' => '有連結至已損壞檔案頁的連結之頁面',
+'broken-file-category' => '包含損壞的檔案連結的頁面',
'about' => '關於',
'article' => '內容頁面',
-<?php\r
-/**\r
- * Remove hidden preferences from the database.\r
- *\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License along\r
- * with this program; if not, write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- * http://www.gnu.org/copyleft/gpl.html\r
- *\r
- * @file\r
- * @author TyA <tya.wiki@gmail.com>\r
- * @see [[bugzilla:30976]]\r
- * @ingroup Maintenance\r
- */\r
-\r
-require_once( __DIR__ . '/Maintenance.php' );\r
-\r
-/**\r
- * Maintenance script that removes hidden preferences from the database.\r
- *\r
- * @ingroup Maintenance\r
- */\r
-class CleanupPreferences extends Maintenance {\r
- public function execute() {\r
- global $wgHiddenPrefs;\r
-\r
- $dbw = wfGetDB( DB_MASTER );\r
- $dbw->begin();\r
- foreach( $wgHiddenPrefs as $item ) {\r
- $dbw->delete(\r
- 'user_properties',\r
- array( 'up_property' => $item ),\r
- __METHOD__\r
- );\r
- };\r
- $dbw->commit();\r
- $this->output( "Finished!\n" );\r
- }\r
-}\r
-\r
-$maintClass = 'CleanupPreferences'; // Tells it to run the class\r
-require_once( RUN_MAINTENANCE_IF_MAIN );\r
+<?php
+/**
+ * Remove hidden preferences from the database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author TyA <tya.wiki@gmail.com>
+ * @see [[bugzilla:30976]]
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that removes hidden preferences from the database.
+ *
+ * @ingroup Maintenance
+ */
+class CleanupPreferences extends Maintenance {
+ public function execute() {
+ global $wgHiddenPrefs;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin();
+ foreach( $wgHiddenPrefs as $item ) {
+ $dbw->delete(
+ 'user_properties',
+ array( 'up_property' => $item ),
+ __METHOD__
+ );
+ };
+ $dbw->commit();
+ $this->output( "Finished!\n" );
+ }
+}
+
+$maintClass = 'CleanupPreferences'; // Tells it to run the class
+require_once( RUN_MAINTENANCE_IF_MAIN );
$candidates = array_values( $candidates );
$db = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
if ( !$this->checkJob( $type, $db ) ) {
- // This job is not available in the current database. Remove it from
- // the cache.
if ( $type === false ) {
+ // There are no jobs available in the current database
foreach ( $pendingDBs as $type2 => $dbs ) {
$pendingDBs[$type2] = array_diff( $pendingDBs[$type2], array( $db ) );
}
} else {
+ // There are no jobs of this type available in the current database
$pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
}
-
- $wgMemc->set( $memcKey, $pendingDBs, 300 );
+ // Update the cache to remove the outdated information
+ $pendingDbInfo['pendingDBs'] = $pendingDBs;
+ // @TODO: fix race condition with these updates
+ $wgMemc->set( $memcKey, $pendingDbInfo );
$again = true;
}
} while ( $again );
// This is a side-effect of limiting after the fact.
if ( res.trimmed === true ) {
this.value = res.newVal;
- prevSafeVal = res.newVal;
}
+ // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
+ // trimValForByteLength to compare the new value to an empty string instead of the
+ // old value, resulting in trimming always from the end (bug 40850).
+ prevSafeVal = res.newVal;
} );
} );
};
</pre>
!! end
+!! test
+Ident preformatting with inline content
+!! input
+ a
+ ''b''
+!! result
+<pre>a
+<i>b</i>
+</pre>
+!! end
+
!! test
<pre> with <nowiki> inside (compatibility with 1.6 and earlier)
!! input
!! end
+!! test
+Table with row followed by newlines and table heading
+!! input
+{|
+|-
+
+! foo
+|}
+!! result
+<table>
+
+
+<tr>
+<th> foo
+</th></tr></table>
+
+!! end
+
+# FIXME: Preserve the attribute properly (with an empty string as value) in
+# the PHP parser. Parsoid implements the behavior below.
+!! test
+Table attributes with empty value
+!! options
+disabled
+!! input
+{|
+| style=| hello
+|}
+!! result
+<table>
+<tr>
+<td style=""> hello
+</td></tr></table>
+
+!! end
+
###
### Internal links
###
!!end
+# FIXME: produce empty string instead of "class" in the PHP parser, following
+# the HTML5 spec.
+!! test
+div with empty attribute value, space before equals
+!! options
+disabled
+!! input
+<div class =>HTML rocks</div>
+!! result
+<div class="">HTML rocks</div>
+
+!! end
+
+# This it very inconsistent in the PHP parser: it returns
+# class="class" if there is a space between the name and the equal sign (see
+# 'div with empty attribute value, space before equals'), but strips the
+# attribute completely if the space is missing. We hope that not much content
+# depends on this, so are implementing the behavior below in Parsoid for
+# consistencies' sake. Disabled for the PHP parser.
+# FIXME: fix this behavior in the PHP parser?
+!! test
+div with empty attribute value, no space before equals
+!! options
+disabled
+!! input
+<div class=>HTML rocks</div>
+!! result
+<div class="">HTML rocks</div>
+
+!! end
+
!! test
HTML multiple attributes correction
!! input
function testUndo() {
$this->markTestIncomplete( "not yet implemented" );
}
+
+ function testEditConflict() {
+ static $count = 0;
+ $count++;
+
+ // assume NS_HELP defaults to wikitext
+ $name = "Help:ApiEditPageTest_testEditConflict_$count";
+ $title = Title::newFromText( $name );
+
+ $page = WikiPage::factory( $title );
+
+ // base edit
+ $page->doEditContent( new WikitextContent( "Foo" ),
+ "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+ $this->forceRevisionDate( $page, '20120101000000' );
+ $baseTime = $page->getRevision()->getTimestamp();
+
+ // conflicting edit
+ $page->doEditContent( new WikitextContent( "Foo bar" ),
+ "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+ $this->forceRevisionDate( $page, '20120101020202' );
+
+ // try to save edit, expect conflict
+ try {
+ list( $re,, ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'nix bar!',
+ 'basetimestamp' => $baseTime,
+ ), null, self::$users['sysop']->user );
+
+ $this->fail( 'edit conflict expected' );
+ } catch ( UsageException $ex ) {
+ $this->assertEquals( 'editconflict', $ex->getCodeString() );
+ }
+ }
+
+ function testEditConflict_redirect() {
+ static $count = 0;
+ $count++;
+
+ // assume NS_HELP defaults to wikitext
+ $name = "Help:ApiEditPageTest_testEditConflict_redirect_$count";
+ $title = Title::newFromText( $name );
+ $page = WikiPage::factory( $title );
+
+ $rname = "Help:ApiEditPageTest_testEditConflict_redirect_r$count";
+ $rtitle = Title::newFromText( $rname );
+ $rpage = WikiPage::factory( $rtitle );
+
+ // base edit for content
+ $page->doEditContent( new WikitextContent( "Foo" ),
+ "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+ $this->forceRevisionDate( $page, '20120101000000' );
+ $baseTime = $page->getRevision()->getTimestamp();
+
+ // base edit for redirect
+ $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+ "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+ $this->forceRevisionDate( $rpage, '20120101000000' );
+
+ // conflicting edit to redirect
+ $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]\n\n[[Category:Test]]" ),
+ "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+ $this->forceRevisionDate( $rpage, '20120101020202' );
+
+ // try to save edit; should work, because we follow the redirect
+ list( $re,, ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $rname,
+ 'text' => 'nix bar!',
+ 'basetimestamp' => $baseTime,
+ 'redirect' => true,
+ ), null, self::$users['sysop']->user );
+
+ $this->assertEquals( 'Success', $re['edit']['result'],
+ "no edit conflict expected when following redirect" );
+
+ // try again, without following the redirect. Should fail.
+ try {
+ list( $re,, ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $rname,
+ 'text' => 'nix bar!',
+ 'basetimestamp' => $baseTime,
+ ), null, self::$users['sysop']->user );
+
+ $this->fail( 'edit conflict expected' );
+ } catch ( UsageException $ex ) {
+ $this->assertEquals( 'editconflict', $ex->getCodeString() );
+ }
+ }
+
+ function testEditConflict_bug41990() {
+ static $count = 0;
+ $count++;
+
+ /*
+ * bug 41990: if the target page has a newer revision than the redirect, then editing the
+ * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erronously
+ * caused an edit conflict to be detected.
+ */
+
+ // assume NS_HELP defaults to wikitext
+ $name = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_$count";
+ $title = Title::newFromText( $name );
+ $page = WikiPage::factory( $title );
+
+ $rname = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_r$count";
+ $rtitle = Title::newFromText( $rname );
+ $rpage = WikiPage::factory( $rtitle );
+
+ // base edit for content
+ $page->doEditContent( new WikitextContent( "Foo" ),
+ "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+ $this->forceRevisionDate( $page, '20120101000000' );
+
+ // base edit for redirect
+ $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+ "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+ $this->forceRevisionDate( $rpage, '20120101000000' );
+ $baseTime = $rpage->getRevision()->getTimestamp();
+
+ // new edit to content
+ $page->doEditContent( new WikitextContent( "Foo bar" ),
+ "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+ $this->forceRevisionDate( $rpage, '20120101020202' );
+
+ // try to save edit; should work, following the redirect.
+ list( $re,, ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $rname,
+ 'text' => 'nix bar!',
+ 'redirect' => true,
+ ), null, self::$users['sysop']->user );
+
+ $this->assertEquals( 'Success', $re['edit']['result'],
+ "no edit conflict expected here" );
+ }
+
+ protected function forceRevisionDate( WikiPage $page, $timestamp ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ $dbw->update( 'revision',
+ array( 'rev_timestamp' => $timestamp ),
+ array( 'rev_id' => $page->getLatest() ) );
+
+ $page->clear();
+ }
}
--- /dev/null
+<?php
+
+/**
+ * @group API
+ * @group Database
+ */
+class ApiQueryRevisionsTest extends ApiTestCase {
+
+ /**
+ * @group medium
+ */
+ function testContentComesWithContentModelAndFormat() {
+
+ $pageName = 'Help:' . __METHOD__ ;
+ $title = Title::newFromText( $pageName );
+ $page = WikiPage::factory( $title );
+ $page->doEdit( 'Some text', 'inserting content' );
+
+ $apiResult = $this->doApiRequest( array(
+ 'action' => 'query',
+ 'prop' => 'revisions',
+ 'titles' => $pageName,
+ 'rvprop' => 'content',
+ ) );
+ $this->assertArrayHasKey( 'query', $apiResult[0] );
+ $this->assertArrayHasKey( 'pages', $apiResult[0]['query'] );
+ foreach( $apiResult[0]['query']['pages'] as $page ) {
+ $this->assertArrayHasKey( 'revisions', $page );
+ foreach( $page['revisions'] as $revision ) {
+ $this->assertArrayHasKey( 'contentformat', $revision,
+ 'contentformat should be included when asking content so'
+ . ' client knows how to interpretate it'
+ );
+ $this->assertArrayHasKey( 'contentmodel', $revision,
+ 'contentmodel should be included when asking content so'
+ . ' client knows how to interpretate it'
+ );
+ }
+ }
+ }
+}
* @group Database
* ^--- needed, because we do need the database to test link updates
*/
-class TextContentTest extends MediaWikiTestCase {
+class TextContentTest extends MediaWikiLangTestCase {
protected $context;
protected function setUp() {
test_stuff BLOB NOT NULL,
test_moarstuff BLOB NOT NULL,
test_time varbinary(14) NOT NULL
- );'
+ );',
+ __METHOD__
);
}
+ protected function tearDown() {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->dropTable( 'orm_test', __METHOD__ );
+
+ parent::tearDown();
+ }
+
public function constructorTestProvider() {
return array(
array(
* @group Search
* @group Database
*/
-class SearchEngineTest extends MediaWikiTestCase {
+class SearchEngineTest extends MediaWikiLangTestCase {
protected $search, $pageList;
/**
*/
protected function setUp() {
parent::setUp();
+
// Search tests require MySQL or SQLite with FTS
# Get database type and version
$dbType = $this->db->getType();
$el.byteLimit();
});
+ QUnit.test( 'Trim from insertion when limit exceeded', 2, function ( assert ) {
+ var $el;
+
+ // Use a new <input /> because the bug only occurs on the first time
+ // the limit it reached (bug 40850)
+ $el = $( '<input type="text"/>' )
+ .appendTo( '#qunit-fixture' )
+ .byteLimit( 3 )
+ .val( 'abc' ).trigger( 'change' )
+ .val( 'zabc' ).trigger( 'change' );
+
+ assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 0), not the end' );
+
+ $el = $( '<input type="text"/>' )
+ .appendTo( '#qunit-fixture' )
+ .byteLimit( 3 )
+ .val( 'abc' ).trigger( 'change' )
+ .val( 'azbc' ).trigger( 'change' );
+
+ assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 1), not the end' );
+ });
+
}( jQuery, mediaWiki ) );
// Called from thumb_handler.php via 404; extract params from the URI...
wfThumbHandle404();
} else {
- // Called directly, use $_REQUEST params
+ // Called directly, use $_GET params
wfThumbHandleRequest();
}
*/
function wfThumbHandleRequest() {
$params = get_magic_quotes_gpc()
- ? array_map( 'stripslashes', $_REQUEST )
- : $_REQUEST;
+ ? array_map( 'stripslashes', $_GET )
+ : $_GET;
wfStreamThumb( $params ); // stream the thumbnail
}
*/
function wfStreamThumb( array $params ) {
global $wgVaryOnXFP;
+
wfProfileIn( __METHOD__ );
$headers = array(); // HTTP headers to send
wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
wfProfileOut( __METHOD__ );
return;
- }
- $sourcePath = $img->getPath();
- if ( $sourcePath === false ) {
+ } elseif ( $img->getPath() === false ) {
wfThumbError( 500, 'The source file is not locally accessible.' );
wfProfileOut( __METHOD__ );
return;
wfSuppressWarnings();
$imsUnix = strtotime( $imsString );
wfRestoreWarnings();
- $sourceTsUnix = wfTimestamp( TS_UNIX, $img->getTimestamp() );
- if ( $sourceTsUnix <= $imsUnix ) {
+ if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
header( 'HTTP/1.1 304 Not Modified' );
wfProfileOut( __METHOD__ );
return;
}
}
- $thumbName = $img->thumbName( $params );
- if ( !strlen( $thumbName ) ) { // invalid params?
- wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+ // Get the normalized thumbnail name from the parameters...
+ try {
+ $thumbName = $img->thumbName( $params );
+ if ( !strlen( $thumbName ) ) { // invalid params?
+ wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+ $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
+ } catch ( MWException $e ) {
+ wfThumbError( 500, $e->getHTML() );
wfProfileOut( __METHOD__ );
return;
}
- $disposition = $img->getThumbDisposition( $thumbName );
- $headers[] = "Content-Disposition: $disposition";
-
- // Stream the file if it exists already...
- try {
- $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
- // For 404 handled thumbnails, we only use the the base name of the URI
- // for the thumb params and the parent directory for the source file name.
- // Check that the zone relative path matches up so squid caches won't pick
- // up thumbs that would not be purged on source file deletion (bug 34231).
- if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
- if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
- // Request for the canonical thumbnail name
- } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
- // Request for the "long" thumbnail name; redirect to canonical name
- $response = RequestContext::getMain()->getRequest()->response();
- $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
- $response->header( 'Location: ' . wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
- $response->header( 'Expires: ' .
- gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
- if ( $wgVaryOnXFP ) {
- $varyHeader[] = 'X-Forwarded-Proto';
- }
- if ( count( $varyHeader ) ) {
- $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
- }
- wfProfileOut( __METHOD__ );
- return;
- } else {
- wfThumbError( 404, 'The given path of the specified thumbnail is incorrect.' );
- wfProfileOut( __METHOD__ );
- return;
+ // For 404 handled thumbnails, we only use the the base name of the URI
+ // for the thumb params and the parent directory for the source file name.
+ // Check that the zone relative path matches up so squid caches won't pick
+ // up thumbs that would not be purged on source file deletion (bug 34231).
+ if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
+ if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+ // Request for the canonical thumbnail name
+ } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+ // Request for the "long" thumbnail name; redirect to canonical name
+ $response = RequestContext::getMain()->getRequest()->response();
+ $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+ $response->header( 'Location: ' .
+ wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
+ $response->header( 'Expires: ' .
+ gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
+ if ( $wgVaryOnXFP ) {
+ $varyHeader[] = 'X-Forwarded-Proto';
}
- }
- $thumbPath = $img->getThumbPath( $thumbName );
- if ( $img->getRepo()->fileExists( $thumbPath ) ) {
if ( count( $varyHeader ) ) {
- $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
+ $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
}
- $img->getRepo()->streamFile( $thumbPath, $headers );
+ wfProfileOut( __METHOD__ );
+ return;
+ } else {
+ wfThumbError( 404, 'The given path of the specified thumbnail is incorrect.' );
wfProfileOut( __METHOD__ );
return;
}
- } catch ( MWException $e ) {
- wfThumbError( 500, $e->getHTML() );
- wfProfileOut( __METHOD__ );
- return;
}
+ // Suggest a good name for users downloading this thumbnail
+ $headers[] = "Content-Disposition: {$img->getThumbDisposition( $thumbName )}";
+
if ( count( $varyHeader ) ) {
$headers[] = 'Vary: ' . implode( ', ', $varyHeader );
}
+ // Stream the file if it exists already...
+ $thumbPath = $img->getThumbPath( $thumbName );
+ if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+ $img->getRepo()->streamFile( $thumbPath, $headers );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
// Thumbnail isn't already there, so create the new thumbnail...
try {
$thumb = $img->transform( $params, File::RENDER_NOW );