run your wiki with $wgActorTableSchemaMigrationStage SCHEMA_COMPAT_READ_OLD,
note that log_search rows needed to find revision deletions by target user
were incorrectly deleted. See T215464 for details.
+* If revision deletions were performed when the wiki was configured with
+ $wgActorTableSchemaMigrationStage SCHEMA_COMPAT_WRITE_BOTH and without
+ migrateActors.php having been run, the log_search table may contain rows with
+ empty values for "target_author_actor" which will prevent log searches for
+ revision deletions by target user from finding those log entries. These rows
+ may be corrected by (re-)running migrateActors.php.
For notes on 1.32.x and older releases, see HISTORY.
Use ParserOutput::allCacheVaryingOptions instead.
* CdnCacheUpdate::newSimplePurge, deprecated in 1.27, has been removed.
Use CdnCacheUpdate::newFromTitles() instead.
+* Handling of multiple arguments by the Block constructor, deprecated in 1.26,
+ has been removed.
=== Deprecations in 1.33 ===
* The configuration option $wgUseESI has been deprecated, and is expected
"psy/psysh": "0.9.9",
"wikimedia/avro": "1.8.0",
"wikimedia/testing-access-wrapper": "~1.0",
- "wmde/hamcrest-html-matchers": "^0.1.0"
+ "wmde/hamcrest-html-matchers": "^0.1.0",
+ "mediawiki/mediawiki-phan-config": "0.3.0"
},
"replace": {
"symfony/polyfill-ctype": "1.99",
'sitewide' => true,
];
- if ( func_num_args() > 1 || !is_array( $options ) ) {
- $options = array_combine(
- array_slice( array_keys( $defaults ), 0, func_num_args() ),
- func_get_args()
- );
- wfDeprecated( __METHOD__ . ' with multiple arguments', '1.26' );
- }
-
$options += $defaults;
$this->setTarget( $options['address'] );
$attrs = [
'data-mw' => 'interface',
- 'title' => $context->msg( 'tooltip-rollback' )->text(),
- 'data-rollback-count' => (int)$editCount
+ 'title' => $context->msg( 'tooltip-rollback' )->text()
];
$options = [ 'known', 'noclasses' ];
$name = strtr( $name, '.', '_' );
if ( isset( $arr[$name] ) ) {
$data = $arr[$name];
- if ( isset( $_GET[$name] ) && !is_array( $data ) ) {
+ if ( isset( $_GET[$name] ) && is_string( $data ) ) {
# Check for alternate/legacy character encoding.
$contLang = MediaWikiServices::getInstance()->getContentLanguage();
- if ( $contLang ) {
- $data = $contLang->checkTitleEncoding( $data );
- }
+ $data = $contLang->checkTitleEncoding( $data );
}
$data = $this->normalizeUnicode( $data );
return $data;
"apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.",
"apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
"apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
- "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten <code><head></code> der Seite zurück.",
+ "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten doctype, offenes <code><html></code>, das Element <code><head></code> und offenes <code><body></code> der Seite aus.",
"apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus. Zur Anwendung verwende <code>mw.config.set()</code>.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.",
"apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.",
"apihelp-query+embeddedin-param-filterredir": "転送ページを絞り込む方法。",
"apihelp-query+embeddedin-param-limit": "返すページの総数。",
"apihelp-query+embeddedin-example-simple": "<kbd>Template:Stub</kbd> を参照読み込みしているページを表示する。",
- "apihelp-query+embeddedin-example-generator": "<kbd>Template:Stub</kbd> をトランスクルードしているページに関する情報を取得する。",
+ "apihelp-query+embeddedin-example-generator": "<kbd>Template:Stub</kbd> を参照読み込みしているページに関する情報を取得する。",
"apihelp-query+extlinks-summary": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。",
"apihelp-query+extlinks-param-limit": "返すリンクの数。",
"apihelp-query+extlinks-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ<var>$1query</var> が設定されている場合, protocol は <kbd>http</kbd> となります。すべての外部リンクを一覧表示するためにはこのパラメータと <var>$1query</var> の両方を空にしてください。",
"apihelp-query+transcludedin-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
"apihelp-query+transcludedin-param-limit": "返す数。",
"apihelp-query+transcludedin-example-simple": "<kbd>Main Page</kbd> をトランスクルードしているページの一覧を取得する。",
- "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
+ "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> を参照読み込みしているページに関する情報を取得する。",
"apihelp-query+usercontribs-summary": "利用者によるすべての編集を取得します。",
"apihelp-query+usercontribs-param-limit": "返す投稿記録の最大数。",
"apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。<var>$1userids</var> または <var>$1userprefix</var> とは同時に使用できません。",
$res = $dbr->select(
$revQuery['tables'],
$revQuery['fields'],
- array_merge( $conds, [ 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ) ] ),
+ array_merge( $conds, [
+ 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ),
+ 'page_latest = rev_id' // get the latest revision only
+ ] ),
__METHOD__ . "($code)-small",
[],
$revQuery['joins']
private $callback;
/**
- * @param IDatabase $dbw
+ * @param IDatabase $dbw DB handle; update aborts if a transaction now this rolls back
* @param string $fname Caller name (usually __METHOD__)
* @param callable $callback
+ * @param IDatabase[] $conns Abort if a transaction now on one of these rolls back [optional]
* @see IDatabase::doAtomicSection()
*/
- public function __construct( IDatabase $dbw, $fname, callable $callback ) {
+ public function __construct( IDatabase $dbw, $fname, callable $callback, array $conns = [] ) {
$this->dbw = $dbw;
$this->fname = $fname;
$this->callback = $callback;
-
- if ( $this->dbw->trxLevel() ) {
- $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ // Register DB connections for which uncommitted changes are related to this update
+ $conns[] = $dbw;
+ foreach ( $conns as $conn ) {
+ if ( $conn->trxLevel() ) {
+ $conn->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ }
}
}
}
}
+ /**
+ * @private This method is public so that it works with onTransactionResolution()
+ * @param int $trigger
+ */
public function cancelOnRollback( $trigger ) {
if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
$this->callback = null;
private $callback;
/**
- * @param IDatabase $dbw
+ * @param IDatabase $dbw DB handle; update aborts if a transaction now this rolls back
* @param string $fname Caller name (usually __METHOD__)
* @param callable $callback Callback that takes (IDatabase, method name string)
+ * @param IDatabase[] $conns Abort if a transaction now on one of these rolls back [optional]
*/
- public function __construct( IDatabase $dbw, $fname, callable $callback ) {
+ public function __construct( IDatabase $dbw, $fname, callable $callback, array $conns = [] ) {
$this->dbw = $dbw;
$this->fname = $fname;
$this->callback = $callback;
-
- if ( $this->dbw->trxLevel() ) {
- $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ // Register DB connections for which uncommitted changes are related to this update
+ $conns[] = $dbw;
+ foreach ( $conns as $conn ) {
+ if ( $conn->trxLevel() ) {
+ $conn->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ }
}
}
}
}
+ /**
+ * @private This method is public so that it works with onTransactionResolution()
+ * @param int $trigger
+ */
public function cancelOnRollback( $trigger ) {
if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
$this->callback = null;
}
}
+ /**
+ * @private This method is public so that it works with onTransactionResolution()
+ * @param int $trigger
+ */
public function cancelOnRollback( $trigger ) {
if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
$this->callback = null;
} elseif ( isset( $row->old_text ) ) {
// Raw text from the database may have invalid chars
$text = strval( Revision::getRevisionText( $row ) );
- $text = $content_handler->exportTransform( $text, $content_format );
+ try {
+ $text = $content_handler->exportTransform( $text, $content_format );
+ }
+ catch ( MWException $ex ) {
+ // leave text as is; that's the way it goes
+ }
$out .= " " . Xml::elementClean( 'text',
[ 'xml:space' => 'preserve', 'bytes' => intval( $row->rev_len ) ],
strval( $text ) ) . "\n";
$this->lock();
- $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName();
- $archiveRel = $this->getArchiveRel( $archiveName );
+ if ( $this->isOld() ) {
+ $archiveRel = $dstRel;
+ $archiveName = basename( $archiveRel );
+ } else {
+ $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName();
+ $archiveRel = $this->getArchiveRel( $archiveName );
+ }
if ( $repo->hasSha1Storage() ) {
$sha1 = FileRepo::isVirtualUrl( $srcPath )
"config-mod-security": "<strong>Предупреждение:</strong> [https://modsecurity.org/ mod_security]/mod_security2 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [https://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.",
"config-diff3-bad": "Инструментът за сравняване на текст GNU diff3 не беше намерен. Можете да игнорирате това за сега, но конфликтите при редактиране може да бъдат по-чести.",
"config-git": "Налична е системата за контрол на версиите Git: <code>$1</code>.",
- "config-git-bad": "Не е намерен софтуер за контрол на версиите Git.",
+ "config-git-bad": "Не е намерен софтуер за контрол на версиите Git. Може да игнорирате това. Забележете, че Специални:Версия няма да покаже хешове на къмит.",
"config-imagemagick": "Открит е ImageMagick: <code>$1</code>.\nПреоразмеряването на картинки ще бъде включено ако качването на файлове бъде разрешено.",
"config-gd": "Открита е вградена графичната библиотека GD.\nАко качването на файлове бъде включено, ще бъде включена възможността за преоразмеряване на картинки.",
"config-no-scaling": "Не са открити библиотеките GD или ImageMagick.\nПреоразмеряването на картинки ще бъде изключено.",
"config-using-32bit": "<strong>Внимание:</strong> изглежда, че системата Ви работи с 32-битови числа. Това [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не се препоръчва].",
"config-db-type": "Тип на базата от данни:",
"config-db-host": "Сървър на базата от данни:",
- "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
+ "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко се използва MySQL, използването на „localhost“ може да е неприемливо. В такива случаи се използва „127.0.0.1“ за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
"config-db-host-oracle": "TNS на базата от данни:",
"config-db-host-oracle-help": "Въведете валидно [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]. Файлът tnsnames.ora трябва да бъде видим за инсталацията.<br />Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
"config-db-wiki-settings": "Идентифициране на това уики",
"config-invalid-db-server-oracle": "Невалиден TNS на базата от данни „$1“.\nИзползвайте „TNS Name“ или „Easy Connect“ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи за именуване на Oracle])",
"config-invalid-db-name": "Невалидно име на базата от данни „$1“.\nИзползват се само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).",
"config-invalid-db-prefix": "Невалидна представка за базата от данни „$1“.\nПозволени са само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).",
- "config-connection-error": "$1.\n\nНеобходимо е да се проверят хостът, потребителското име и паролата, след което да се опита отново.",
+ "config-connection-error": "$1.\n\nНеобходимо е да се проверят хостът, потребителското име и паролата, след което да се опита отново. Ако използвате „localhost“ като хост на базата от данни, опитайте с „127.0.0.1“ вместо него (и обратно).",
"config-invalid-schema": "Невалидна схема за МедияУики „$1“.\nДопустими са само ASCII букви (a-z, A-Z), цифри (0-9) и долни черти (_).",
"config-db-sys-create-oracle": "Инсталаторът поддържа само сметка SYSDBA за създаване на нова сметка.",
"config-db-sys-user-exists-oracle": "Потребителската сметка „$1“ вече съществува. SYSDBA може да се използва само за създаване на нова сметка!",
"아라",
"Amire80",
"Macofe",
- "Seb35"
+ "Seb35",
+ "MaxSem"
]
},
"config-desc": "L'instalador për mediaWiki",
"config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
"config-no-cli-uploads-check": "'''Avis:''' Toa cartela predefinìa për j-amportassion (<code>$1</code>) a l'é nen controlà a propòsit ëd la vulnerabilità\nd'esecussion ëd senari arbitrari durant l'istalassion CLI.",
"config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([https://bugs.php.net/bug.php?id=45996 bigat archivià con PHP]).\nAnstalassion abortìa.",
- "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_lenght a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an LocalSettings.php .",
+ "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_length a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an LocalSettings.php .",
"config-db-type": "Sòrt ëd base ëd dàit:",
"config-db-host": "Ospitant ëd la base ëd dàit:",
"config-db-host-help": "Se sò servent ëd base ëd dàit a l'é su un servent diferent, ch'a anserissa ambelessì ël nòm dl'ospitant o l'adrëssa IP.\n\nS'a deuvra n'ospitalità partagià, sò fornidor d'ospitalità a dovrìa deje ël nòm dl'ospitant giust ant soa documentassion.\n\nSe a anstala su un servent Windows e a deuvra MySQL, dovré «localhost» a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva «127.0.0.1» com adrëssa IP local.\n\nS'a deuvra PostgresSQL, ch'a lassa sto camp bianch për coleghesse a travers un socket UNIX.",
}
protected function doGet( $key, $flags = 0 ) {
- return $this->getUnserialize(
- apc_fetch( $key . self::KEY_SUFFIX )
- );
+ return $this->unserialize( apc_fetch( $key . self::KEY_SUFFIX ) );
}
- protected function getUnserialize( $value ) {
- if ( is_string( $value ) && !$this->nativeSerialize ) {
- $value = $this->isInteger( $value )
- ? intval( $value )
- : unserialize( $value );
+ protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+ $casToken = null;
+
+ $blob = apc_fetch( $key . self::KEY_SUFFIX );
+ $value = $this->unserialize( $blob );
+ if ( $value !== false ) {
+ $casToken = $blob; // don't bother hashing this
}
+
return $value;
}
public function set( $key, $value, $exptime = 0, $flags = 0 ) {
apc_store(
$key . self::KEY_SUFFIX,
- $this->setSerialize( $value ),
+ $this->serialize( $value ),
$exptime
);
public function add( $key, $value, $exptime = 0, $flags = 0 ) {
return apc_add(
$key . self::KEY_SUFFIX,
- $this->setSerialize( $value ),
+ $this->serialize( $value ),
$exptime
);
}
- protected function setSerialize( $value ) {
- if ( !$this->nativeSerialize && !$this->isInteger( $value ) ) {
- $value = serialize( $value );
- }
- return $value;
- }
-
public function delete( $key, $flags = 0 ) {
apc_delete( $key . self::KEY_SUFFIX );
public function decr( $key, $value = 1 ) {
return apc_dec( $key . self::KEY_SUFFIX, $value );
}
+
+ public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+ return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
+ }
+
+ protected function serialize( $value ) {
+ if ( !$this->nativeSerialize && !$this->isInteger( $value ) ) {
+ $value = serialize( $value );
+ }
+ return $value;
+ }
+
+ protected function unserialize( $value ) {
+ if ( is_string( $value ) && !$this->nativeSerialize ) {
+ $value = $this->isInteger( $value )
+ ? intval( $value )
+ : unserialize( $value );
+ }
+ return $value;
+ }
}
}
protected function doGet( $key, $flags = 0 ) {
- return $this->getUnserialize(
- apcu_fetch( $key . self::KEY_SUFFIX )
- );
+ return $this->unserialize( apcu_fetch( $key . self::KEY_SUFFIX ) );
+ }
+
+ protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+ $casToken = null;
+
+ $blob = apcu_fetch( $key . self::KEY_SUFFIX );
+ $value = $this->unserialize( $blob );
+ if ( $value !== false ) {
+ $casToken = $blob; // don't bother hashing this
+ }
+
+ return $value;
}
public function set( $key, $value, $exptime = 0, $flags = 0 ) {
apcu_store(
$key . self::KEY_SUFFIX,
- $this->setSerialize( $value ),
+ $this->serialize( $value ),
$exptime
);
public function add( $key, $value, $exptime = 0, $flags = 0 ) {
return apcu_add(
$key . self::KEY_SUFFIX,
- $this->setSerialize( $value ),
+ $this->serialize( $value ),
$exptime
);
}
return false;
}
}
+
+ public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+ return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
+ }
}
/** @var int Max entries allowed */
protected $maxCacheKeys;
+ /** @var string CAS token prefix for this instance */
+ private $token;
+
+ /** @var int CAS token counter */
+ private static $casCounter = 0;
+
const KEY_VAL = 0;
const KEY_EXP = 1;
+ const KEY_CAS = 2;
/**
* @param array $params Additional parameters include:
function __construct( $params = [] ) {
parent::__construct( $params );
+ $this->token = microtime( true ) . ':' . mt_rand();
$this->maxCacheKeys = $params['maxKeys'] ?? INF;
if ( $this->maxCacheKeys <= 0 ) {
throw new InvalidArgumentException( '$maxKeys parameter must be above zero' );
}
}
- protected function expire( $key ) {
- $et = $this->bag[$key][self::KEY_EXP];
- if ( $et == self::TTL_INDEFINITE || $et > $this->getCurrentTime() ) {
- return false;
- }
-
- $this->delete( $key );
-
- return true;
- }
-
- /**
- * Does this bag have a non-null value for the given key?
- *
- * @param string $key
- * @return bool
- * @since 1.27
- */
- protected function hasKey( $key ) {
- return isset( $this->bag[$key] );
- }
-
protected function doGet( $key, $flags = 0 ) {
if ( !$this->hasKey( $key ) ) {
return false;
return $this->bag[$key][self::KEY_VAL];
}
+ protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+ $casToken = null;
+
+ $value = $this->doGet( $key );
+ if ( $value !== false ) {
+ $casToken = $this->bag[$key][self::KEY_CAS];
+ }
+
+ return $value;
+ }
+
public function set( $key, $value, $exptime = 0, $flags = 0 ) {
// Refresh key position for maxCacheKeys eviction
unset( $this->bag[$key] );
$this->bag[$key] = [
self::KEY_VAL => $value,
- self::KEY_EXP => $this->convertExpiry( $exptime )
+ self::KEY_EXP => $this->convertExpiry( $exptime ),
+ self::KEY_CAS => $this->token . ':' . ++self::$casCounter
];
if ( count( $this->bag ) > $this->maxCacheKeys ) {
return false;
}
+ public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+ return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
+ }
+
+ /**
+ * Clear all values in cache
+ */
public function clear() {
$this->bag = [];
}
+
+ /**
+ * @param string $key
+ * @return bool
+ */
+ protected function expire( $key ) {
+ $et = $this->bag[$key][self::KEY_EXP];
+ if ( $et == self::TTL_INDEFINITE || $et > $this->getCurrentTime() ) {
+ return false;
+ }
+
+ $this->delete( $key );
+
+ return true;
+ }
+
+ /**
+ * Does this bag have a non-null value for the given key?
+ *
+ * @param string $key
+ * @return bool
+ * @since 1.27
+ */
+ protected function hasKey( $key ) {
+ return isset( $this->bag[$key] );
+ }
}
* - tombAsOf: UNIX timestamp of the tombstone or null if the key is not tombstoned
* - lastCKPurge: UNIX timestamp of the highest check key or null if none provided
*
- * Othwerwise, $info will transform into the cached value timestamp.
+ * Otherwise, $info will transform into the cached value timestamp.
*
* @param string $key Cache key made from makeKey() or makeGlobalKey()
* @param mixed|null &$curTTL Approximate TTL left on the key if present/tombstoned [returned]
*/
class WinCacheBagOStuff extends BagOStuff {
protected function doGet( $key, $flags = 0 ) {
- $val = wincache_ucache_get( $key );
- if ( is_string( $val ) ) {
- $val = unserialize( $val );
+ $blob = wincache_ucache_get( $key );
+
+ return is_string( $blob ) ? unserialize( $blob ) : false;
+ }
+
+ protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+ $casToken = null;
+
+ $blob = wincache_ucache_get( $key );
+ if ( !is_string( $blob ) ) {
+ return false;
+ }
+
+ $value = unserialize( $blob );
+ if ( $value === false ) {
+ return false;
+ }
+
+ $casToken = $blob; // don't bother hashing this
+
+ return $value;
+ }
+
+ protected function cas( $casToken, $key, $value, $exptime = 0, $flags = 0 ) {
+ if ( !wincache_lock( $key ) ) { // optimize with FIFO lock
+ return false;
+ }
+
+ $curCasToken = null; // passed by reference
+ $this->getWithToken( $key, $curCasToken, self::READ_LATEST );
+ if ( $casToken === $curCasToken ) {
+ $success = $this->set( $key, $value, $exptime, $flags );
+ } else {
+ $this->logger->info(
+ __METHOD__ . ' failed due to race condition for {key}.',
+ [ 'key' => $key ]
+ );
+
+ $success = false; // mismatched or failed
}
- return $val;
+ wincache_unlock( $key );
+
+ return $success;
}
public function set( $key, $value, $expire = 0, $flags = 0 ) {
}
public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
- if ( wincache_lock( $key ) ) { // optimize with FIFO lock
- $ok = $this->mergeViaLock( $key, $callback, $exptime, $attempts, $flags );
- wincache_unlock( $key );
- } else {
- $ok = false;
- }
-
- return $ok;
+ return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
}
/**
* @return int|bool New value or false on failure
*/
public function incr( $key, $value = 1 ) {
- if ( !$this->lock( $key ) ) {
+ if ( !wincache_lock( $key ) ) { // optimize with FIFO lock
return false;
}
- $n = $this->get( $key );
- if ( $this->isInteger( $n ) ) { // key exists?
- $n += intval( $value );
+
+ $n = $this->doGet( $key );
+ if ( $this->isInteger( $n ) ) {
+ $n = max( $n + (int)$value, 0 );
$oldTTL = wincache_ucache_info( false, $key )["ucache_entries"][1]["ttl_seconds"];
- $this->set( $key, max( 0, $n ), $oldTTL );
+ $this->set( $key, $n, $oldTTL );
} else {
$n = false;
}
- $this->unlock( $key );
+
+ wincache_unlock( $key );
return $n;
}
}
public function tablePrefix( $prefix = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
+ if ( $this->conn === null && $prefix === null ) {
+ $domain = DatabaseDomain::newFromId( $this->params[self::FLD_DOMAIN] );
+ // Avoid triggering a database connection
+ return $domain->getTablePrefix();
+ } elseif ( $this->conn !== null && $prefix === null ) {
+ // This will just return the prefix
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+ // Disallow things that might confuse the LoadBalancer tracking
+ throw new DBUnexpectedError( $this, "Database selection is disallowed to enable reuse." );
}
public function dbSchema( $schema = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
+ if ( $this->conn === null && $schema === null ) {
+ $domain = DatabaseDomain::newFromId( $this->params[self::FLD_DOMAIN] );
+ // Avoid triggering a database connection
+ return $domain->getSchema();
+ } elseif ( $this->conn !== null && $schema === null ) {
+ // This will just return the schema
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+ // Disallow things that might confuse the LoadBalancer tracking
+ throw new DBUnexpectedError( $this, "Database selection is disallowed to enable reuse." );
}
public function getLBInfo( $name = null ) {
}
public function setLBInfo( $name, $value = null ) {
- return $this->__call( __FUNCTION__, func_get_args() );
+ // Disallow things that might confuse the LoadBalancer tracking
+ throw new DBUnexpectedError( $this, "Changing LB info is disallowed to enable reuse." );
}
public function setLazyMasterHandle( IDatabase $conn ) {
- return $this->__call( __FUNCTION__, func_get_args() );
+ // Disallow things that might confuse the LoadBalancer tracking
+ throw new DBUnexpectedError( $this, "Database injection is disallowed to enable reuse." );
}
public function implicitGroupby() {
}
public function close() {
- return $this->__call( __FUNCTION__, func_get_args() );
+ throw new DBUnexpectedError( $this->conn, 'Cannot close shared connection.' );
}
public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
}
public function getDBname() {
+ if ( $this->conn === null ) {
+ $domain = DatabaseDomain::newFromId( $this->params[self::FLD_DOMAIN] );
+ // Avoid triggering a database connection
+ return $domain->getDatabase();
+ }
+
return $this->__call( __FUNCTION__, func_get_args() );
}
abstract protected function mysqlError( $conn = null );
protected function wasQueryTimeout( $error, $errno ) {
- return $errno == 2062;
+ // https://dev.mysql.com/doc/refman/8.0/en/client-error-reference.html
+ // https://phabricator.wikimedia.org/T170638
+ return in_array( $errno, [ 2062, 3024 ] );
}
public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
}
// See https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
- return in_array( $errno, [ 1022, 1216, 1217, 1137, 1146, 1051, 1054 ], true );
+ return in_array( $errno, [ 1022, 1062, 1216, 1217, 1137, 1146, 1051, 1054 ], true );
}
/**
return [ $startOpts, $useIndex, $preLimitTail, $postLimitTail, $ignoreIndex ];
}
- public function getServer() {
- return $this->server;
- }
-
public function buildConcat( $stringList ) {
return implode( ' || ', $stringList );
}
public function setLocalDomainPrefix( $prefix ) {
$this->localDomain = new DatabaseDomain(
$this->localDomain->getDatabase(),
- null,
+ $this->localDomain->getSchema(),
$prefix
);
}
public function getAnyOpenConnection( $i, $flags = 0 ) {
+ $i = ( $i === self::DB_MASTER ) ? $this->getWriterIndex() : $i;
$autocommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT );
+
foreach ( $this->conns as $connsByServer ) {
- if ( !isset( $connsByServer[$i] ) ) {
- continue;
+ if ( $i === self::DB_REPLICA ) {
+ $indexes = array_keys( $connsByServer );
+ } else {
+ $indexes = isset( $connsByServer[$i] ) ? [ $i ] : [];
}
- foreach ( $connsByServer[$i] as $conn ) {
- if ( !$autocommit || $conn->getLBInfo( 'autoCommitOnly' ) ) {
- return $conn;
+ foreach ( $indexes as $index ) {
+ foreach ( $connsByServer[$index] as $conn ) {
+ if ( !$conn->isOpen() ) {
+ continue; // some sort of error occured?
+ }
+ if ( !$autocommit || $conn->getLBInfo( 'autoCommitOnly' ) ) {
+ return $conn;
+ }
}
}
}
} elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
$authorIPs[] = $item->getAuthorName();
}
- }
- if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) {
+ if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) {
+ $actorId = $item->getAuthorActor();
+ // During migration, the actor field might be empty. If so, populate
+ // it here.
+ if ( !$actorId ) {
+ if ( $item->getAuthorId() > 0 ) {
+ $user = User::newFromId( $item->getAuthorId() );
+ } else {
+ $user = User::newFromName( $item->getAuthorName(), false );
+ }
+ $actorId = $user->getActorId( $dbw );
+ }
+ $authorActors[] = $actorId;
+ }
+ } elseif ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) {
$authorActors[] = $item->getAuthorActor();
}
public function preventSessionsForUser( $username ) {
if ( !$this->canChangeUser() ) {
throw new \BadMethodCallException(
- __METHOD__ . ' must be implmented when canChangeUser() is false'
+ __METHOD__ . ' must be implemented when canChangeUser() is false'
);
}
}
return $languageLinks;
}
+ /**
+ * @return QuickTemplate
+ */
protected function setupTemplateForOutput() {
$request = $this->getRequest();
$user = $this->getUser();
if ( $out->isArticle() ) {
if ( $this->isRevisionCurrent() ) {
if ( $wgMaxCredits != 0 ) {
- $tpl->set( 'credits', Action::factory( 'credits', $this->getWikiPage(),
- $this->getContext() )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) );
+ /** @var CreditsAction $action */
+ $action = Action::factory(
+ 'credits', $this->getWikiPage(), $this->getContext() );
+ $tpl->set( 'credits',
+ $action->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) );
} else {
$tpl->set( 'lastmod', $this->lastModified() );
}
$html = '';
if ( $personalTools === null ) {
- $personalTools = $tpl->getPersonalTools();
+ $personalTools = ( $tpl instanceof BaseTemplate )
+ ? $tpl->getPersonalTools()
+ : [];
}
foreach ( $personalTools as $key => $item ) {
$tpl = $this->setupTemplateForOutput();
$tpl->set( 'personal_urls', $this->buildPersonalUrls() );
- return $tpl->getPersonalTools();
+ return ( $tpl instanceof BaseTemplate ) ? $tpl->getPersonalTools() : [];
}
/**
/**
* Get blocking information
- * @param bool $bFromReplica Whether to check the replica DB first.
+ * @param bool $fromReplica Whether to check the replica DB first.
* To improve performance, non-critical checks are done against replica DBs.
* Check when actually saving should be done against master.
*/
- private function getBlockedStatus( $bFromReplica = true ) {
+ private function getBlockedStatus( $fromReplica = true ) {
global $wgProxyWhitelist, $wgApplyIpBlocksToXff, $wgSoftBlockRanges;
if ( $this->mBlockedby != -1 ) {
# user is not immune to autoblocks/hardblocks, and they are the current user so we
# know which IP address they're actually coming from
$ip = null;
- if ( !$this->isAllowed( 'ipblock-exempt' ) ) {
- $sessionUser = RequestContext::getMain()->getUser();
- // the session user is set up towards the end of Setup.php. Until then,
- // assume it's a logged-out user.
- $globalUserName = $sessionUser->isSafeToLoad()
- ? $sessionUser->getName()
- : IP::sanitizeIP( $sessionUser->getRequest()->getIP() );
- if ( $this->getName() === $globalUserName ) {
- $ip = $this->getRequest()->getIP();
- }
+ $sessionUser = RequestContext::getMain()->getUser();
+ // the session user is set up towards the end of Setup.php. Until then,
+ // assume it's a logged-out user.
+ $globalUserName = $sessionUser->isSafeToLoad()
+ ? $sessionUser->getName()
+ : IP::sanitizeIP( $sessionUser->getRequest()->getIP() );
+ if ( $this->getName() === $globalUserName && !$this->isAllowed( 'ipblock-exempt' ) ) {
+ $ip = $this->getRequest()->getIP();
}
// User/IP blocking
- $block = Block::newFromTarget( $this, $ip, !$bFromReplica );
+ $block = Block::newFromTarget( $this, $ip, !$fromReplica );
// Cookie blocking
if ( !$block instanceof Block ) {
$xff = $this->getRequest()->getHeader( 'X-Forwarded-For' );
$xff = array_map( 'trim', explode( ',', $xff ) );
$xff = array_diff( $xff, [ $ip ] );
- $xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$bFromReplica );
+ $xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$fromReplica );
$block = Block::chooseBlock( $xffblocks, $xff );
if ( $block instanceof Block ) {
# Mangle the reason to alert the user that the block
/**
* Check if user is blocked
*
- * @param bool $bFromReplica Whether to check the replica DB instead of
+ * @param bool $fromReplica Whether to check the replica DB instead of
* the master. Hacked from false due to horrible probs on site.
* @return bool True if blocked, false otherwise
*/
- public function isBlocked( $bFromReplica = true ) {
- return $this->getBlock( $bFromReplica ) instanceof Block &&
+ public function isBlocked( $fromReplica = true ) {
+ return $this->getBlock( $fromReplica ) instanceof Block &&
$this->getBlock()->appliesToRight( 'edit' );
}
/**
* Get the block affecting the user, or null if the user is not blocked
*
- * @param bool $bFromReplica Whether to check the replica DB instead of the master
+ * @param bool $fromReplica Whether to check the replica DB instead of the master
* @return Block|null
*/
- public function getBlock( $bFromReplica = true ) {
- $this->getBlockedStatus( $bFromReplica );
+ public function getBlock( $fromReplica = true ) {
+ $this->getBlockedStatus( $fromReplica );
return $this->mBlock instanceof Block ? $this->mBlock : null;
}
"revertpage": "mapatiku tuway [[Special:Contributions/$2|$2]] ([[User talk:$2|sasukamu]]) a mikawaway-kalumyiti sazikuzay nay [[User:$1|$1]] amisumad nu ayaway a baziyong",
"revertpage-nouser": "mapatiku tu midimut misaungayay ku mikawaway-kalumyiti malasazikuz {{GENDER:$1|[[User:$1|$1]]}} masumad nu ayaway a baziyong",
"rollback-success": "mapatiku tuway {{GENDER:$3|$1}} mapasanga’ay a mikawaway-kalumyiti;\nmisumad tatiku nay {{GENDER:$4|$2}} masumad nu ayaway sazikuzay a baziyong.",
- "rollback-success-notify": "mapatiku $1 nikawawan mikawaway-kalumyiti;\nmisumad patiku ta $2 masumad nu ayaway a sazikuz cacay baziyong. [$3 paazih ku masumaday]",
"sessionfailure-title": "kasasiket mungangaw",
"sessionfailure": "kisu patalabu kasasiketan mahiza simunday,\nsaka pataayaw-milangat kasasiketan maalaw atu madebung, tina saungay mapalawpes tuway.\npitatiku ayaway a kasabelih, miliyaw maasip kya kasabelih pitaneng aca.",
"changecontentmodel": "misumad lacul tatudungen misanga’",
"revertpage": "استرجع تعديلات [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]]) حتى آخر مراجعة ل[[User:$1|$1]]",
"revertpage-nouser": "استرجع تعديلات مستخدم مخفي حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "تم استرجاع تعديلات {{GENDER:$3|$1}}، حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.",
- "rollback-success-notify": "تم استرجاع التعديلات بواسطة $1;\nتم التغيير إلى آخر مراجعة بواسطة $2. [$3 عرض التغييرات]",
"sessionfailure-title": "فشل في الجلسة",
"sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك أعد إرسال الاستمارة مرة أخرى.",
"changecontentmodel": "تغيير نموذج المحتوى لصفحة",
"revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]",
"revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
"sessionfailure-title": "Fallu de sesión",
"sessionfailure": "Paez qu'hai un problema col aniciu de sesión;\natayóse esta aición por precaución escontra secuestru de sesiones.\nUnvia'l formulariu otra vegada.",
"changecontentmodel": "Cambiar el modelu de conteníu d'una páxina",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|фекер алышыу]]) уҙгәртеүҙәре [[User:$1|$1]] өлгөһөнә ҡайтарылды",
"revertpage-nouser": "(Ҡатнашыусының исеме йәшерелгән) үҙгәртеүҙәре {{GENDER:$1|[[User:$1|$1]]}}өлгөһөнә ҡайтарылды",
"rollback-success": "{{GENDER:$3|$1}} үҙгәртеүҙәре кире алынды; {{GENDER:$4|$2}} версияһына ҡайтарылды.",
- "rollback-success-notify": "Төҙәтеүҙәр кире тейәлгән $1; һуңғы $2 версияға кире ҡайтыу. [$3 Үҙгәрештәрҙе күрһәтеү]",
"sessionfailure-title": "Сеанс хатаһы",
"sessionfailure": "Хәҙерге сеанста хаталар килеп сыҡҡан, булырға тейеш;\n\"сеансты баҫып алыу\"ға юл ҡуймау өсөн был ғәмәл үтәлмәне.\nАлдағы биткә кире ҡайтығыҙ, битте яңыртығыҙ һәм яңынан ҡабатлап ҡарағыҙ.",
"changecontentmodel": "Биттең контент моделен мөхәррирләү",
"revertpage": "Рэдагаваньні [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]]) скасаваныя да папярэдняй вэрсіі [[User:$1|$1]]",
"revertpage-nouser": "Рэдагаваньні схаванага ўдзельніка скасаваныя да папярэдняй вэрсіі {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Адмененыя рэдагаваньні {{GENDER:$3|$1}};\nвернутая папярэдняя вэрсія {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Адмененыя праўкі $1;\nвернутая папярэдняя вэрсія $2. [$3 Паказаць зьмены]",
"sessionfailure-title": "Памылка сэсіі",
"sessionfailure": "Магчыма ўзьніклі праблемы ў вашым цяперашнім сэансе працы;\nгэтае дзеяньне было скасаванае для прадухіленьня перахопу сэансу.\nКалі ласка, падайце форму яшчэ раз.",
"changecontentmodel": "Зьмена мадэлі зьместу старонкі",
"revertpage": "Праўкі аўтарства [[Special:Contributions/$2|$2]] ([[User talk:$2|размова]]) адкочаныя; вернута апошняя версія аўтарства [[User:$1|$1]]",
"revertpage-nouser": "Праўкі (імя ўдзельніка схавана) адкочаны да версіі {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Адкочаны праўкі {{GENDER:$3|$1}}; вернута апошняя версія {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Адкочаны праўкі $1;\nвернута апошняя версія $2. [$3 Паказаць змены]",
"sessionfailure-title": "Памылка сеансу",
"sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса.\n\nВярніцеся на папярэднюю старонку, перазагрузіце яе і тады паспрабуйце зноў.",
"changecontentmodel": "Змяніць мадэль змесціва старонкі",
"revertpage": "Премахване на [[Special:Contributions/$2|редакции на $2]] ([[User talk:$2|беседа]]); възвръщане към последната версия на [[User:$1|$1]]",
"revertpage-nouser": "Връщане на редакции на скрит потребител до последната версия на [[User:$1|$1]]",
"rollback-success": "Отменени редакции на {{GENDER:$3|$1}};\nвъзвръщане към последната версия на {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Премахнати редакции на $1;\nвръщане към последна версия на $2. [$3 Показване на промени]",
"sessionfailure-title": "Прекъсната сесия",
"sessionfailure": "Изглежда има проблем със сесията ви;\nдействието беше отказано като предпазна мярка срещу крадене на сесията.\nМоля, изпратете формуляра повторно.",
"changecontentmodel": "Промяна на модела на съдържанието на страница",
"expand_templates_input": "Входящ уикитекст:",
"expand_templates_output": "Резултат",
"expand_templates_xml_output": "Изход на XML",
- "expand_templates_html_output": "Суров HTML резултат",
+ "expand_templates_html_output": "Суров HTML изход",
"expand_templates_ok": "ОК",
"expand_templates_remove_comments": "Премахване на коментари",
"expand_templates_remove_nowiki": "Потискане на елементите <nowiki> в резултата",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত সংস্করণ হতে [[User:$1|$1]]-এর সম্পাদিত সর্বশেষ সংস্করণে ফেরত যাওয়া হয়েছে",
"revertpage-nouser": "একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক {{GENDER:$1|[[User:$1|$1]]}}-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে",
"rollback-success": "{{GENDER:$3|$1}}-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; {{GENDER:$4|$2}}-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
- "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
"sessionfailure-title": "সেশন পরিত্যক্ত",
"sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nদয়া করে ফরমটি পুনরায় জমা দিন।",
"changecontentmodel": "একটি পাতার বিষয়বস্তুর রূপ পরিবর্তন",
"revertpage": "Kemmoù distaolet gant [[Special:Contributions/$2|$2]] ([[User talk:$2|Kaozeal]]); adlakaet d'ar stumm diwezhañ a-gent gant [[User:$1|$1]]",
"revertpage-nouser": "Disteuler kemmoù un implijer kuzhet ha distreiñ d'ar stumm diwezhañ gant an {{GENDER:$1|[[implijer :$1|$1]]}}",
"rollback-success": "Nullet ar c'hemmoù gant {{GENDER:$3|$1}};\nadlakaet diouzh ar stumm diwezhañ gant {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Nullet ar c'hemmoù gant $1;\nadlakaet diouzh ar stumm diwezhañ gant $2. [$3 Diskouez ar c'hemmoù]",
"sessionfailure-title": "Fazi dalc'h",
"sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
"changecontentmodel": "Cheñch patrom danvez ur bajenn",
"revertpage": "Vraćene izmjene {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
"revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
"rollback-success": "Vraćene izmjene {{GENDER:$3|korisnika|korisnice}} $1 na posljednju verziju {{GENDER:$4|korisnika|korisnice}} $2.",
- "rollback-success-notify": "Vraćenje izmjene korisnika $1;\nvraćeno na posljednju izmjenu korisnika $2. [$3 Prikaži izmjene]",
"sessionfailure-title": "Greška u sesiji",
"sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
"changecontentmodel": "Promijeni model sadržaja stranice",
"confirmable-no": "No",
"thisisdeleted": "Voleu mostrar o restaurar $1?",
"viewdeleted": "Voleu mostrar $1?",
- "restorelink": "{{PLURAL:$1|una versió esborrada|$1 versions esborrades}}",
+ "restorelink": "{{PLURAL:$1|una versió suprimida|$1 versions suprimides}}",
"feedlinks": "Sindicació:",
"feed-invalid": "La subscripció no és vàlida pel tipus de sindicament.",
"feed-unavailable": "Els canals de sindicació no estan disponibles",
"page_last": "última",
"histlegend": "Simbologia: (act) = diferència amb la versió actual,\n(prev) = diferència amb la versió anterior, m = modificació menor",
"history-fieldset-title": "Cerca revisions",
- "history-show-deleted": "Només revisions esborrades",
+ "history-show-deleted": "Només revisions suprimides",
"histfirst": "les més antigues",
"histlast": "les més noves",
"historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
"right-deleterevision": "Esborrar i restaurar versions específiques de pàgines",
"right-deletedhistory": "Veure els historials esborrats sense consultar-ne el text",
"right-deletedtext": "Veure el text esborrat i els canvis entre revisions esborrades",
- "right-browsearchive": "Cercar pàgines esborrades",
- "right-undelete": "Restaurar pàgines esborrades",
+ "right-browsearchive": "Cercar pàgines suprimides",
+ "right-undelete": "Restaurar pàgines suprimides",
"right-suppressrevision": "Mostra, amaga i revela revisions específiques de pàgines d'un usuari",
"right-viewsuppressed": "Mostra les revisions amagades de qualsevol usuari",
"right-suppressionlog": "Veure registres privats",
"action-deletelogentry": "suprimeix les entrades de registre",
"action-deletedhistory": "mostra l'historial esborrat d'una pàgina",
"action-deletedtext": "mostra el text de la revisió eliminada",
- "action-browsearchive": "cercar pàgines esborrades",
+ "action-browsearchive": "cercar pàgines suprimides",
"action-undelete": "restaura les pàgines",
"action-suppressrevision": "revisa i restaura les revisions ocultes",
"action-suppressionlog": "visualitzar aquest registre privat",
"categories-submit": "Mostra",
"categoriespagetext": "{{PLURAL:$1|La següent categoria conté|Les següents categories contenen}} pàgines, o fitxers multimèdia.\n[[Special:UnusedCategories|Les categories no usades]] no s'hi mostren.\nVegeu també [[Special:WantedCategories|les categories sol·licitades]].",
"categoriesfrom": "Mostra les categories que comencen a:",
- "deletedcontributions": "Contribucions esborrades",
- "deletedcontributions-title": "Contribucions esborrades",
+ "deletedcontributions": "Contribucions suprimides",
+ "deletedcontributions-title": "Contribucions suprimides",
"sp-deletedcontributions-contribs": "contribucions",
"linksearch": "Cerca d'enllaços externs",
"linksearch-pat": "Patró de cerca:",
"deleteprotected": "No podeu eliminar la pàgina perquè ha estat protegida.",
"deleting-backlinks-warning": "<strong>Atenció:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen aquí o inclouen la pàgina que esteu a punt de suprimir.",
"rollback": "Reverteix edicions",
+ "rollback-confirmation-no": "Cancel·la",
"rollbacklink": "Reverteix",
"rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}",
"rollbacklinkcount-morethan": "reverteix més de $1 {{PLURAL:$1|edició|edicions}}",
"revertpage": "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
"revertpage-nouser": "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Revertides les edicions de {{GENDER:$3|$1}}; recuperant la darrera versió de {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Modificacions revertides per $1;\ns'ha revertit a la darrera versió de $2. [$3 Mostra els canvis]",
"sessionfailure-title": "Error de sessió",
"sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
"changecontentmodel": "Canvia el model de contingut d'una pàgina",
"restriction-level-autoconfirmed": "semiprotegida",
"restriction-level-all": "qualsevol nivell",
"undelete": "Restaura una pàgina esborrada",
- "undeletepage": "Mostra i restaura pàgines esborrades",
+ "undeletepage": "Mostra i restaura pàgines suprimides",
"undeletepagetitle": "'''A continuació teniu revisions eliminades de [[:$1]]'''.",
"viewdeletedpage": "Visualitza les pàgines eliminades",
"undeletepagetext": "{{PLURAL:$1|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.",
"cannotundelete": "Hi ha hagut un error en algunes o totes les restauracions:\n$1",
"undeletedpage": "'''S'ha restaurat «$1»'''\n\nConsulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
"undelete-header": "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.",
- "undelete-search-title": "Cerca de pàgines esborrades",
- "undelete-search-box": "Cerca pàgines esborrades",
+ "undelete-search-title": "Cerca de pàgines suprimides",
+ "undelete-search-box": "Cerca pàgines suprimides",
"undelete-search-prefix": "Mostra pàgines que comencin:",
"undelete-search-full": "Mostra títols de pàgines que continguin:",
"undelete-search-submit": "Cerca",
"sp-contributions-newbies-title": "Contribucions dels comptes d'usuari més nous",
"sp-contributions-blocklog": "Registre de blocatges",
"sp-contributions-suppresslog": "contribucions suprimides de {{GENDER:$1|l'usuari|la usuària}}",
- "sp-contributions-deleted": "Contribucions de {{GENDER:$1|l'usuari|la usuària}} esborrades",
+ "sp-contributions-deleted": "contribucions de {{GENDER:$1|l’usuari|la usuària}} suprimides",
"sp-contributions-uploads": "càrregues",
"sp-contributions-logs": "registres",
"sp-contributions-talk": "discussió",
"revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
"revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
"rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.",
- "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
"sessionfailure-title": "Chyba relace",
"sessionfailure": "Nastal problém s vaším přihlášením;\nvámi požadovaná činnost byla zrušena jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
"changecontentmodel": "Změnit model obsahu stránky",
"alreadyrolled": "Ni mòże copnąc slédny edicëji starnë [[:$1]], chtërny ùsôdzcą je [[User:$2|$2]] ([[User talk:$2|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nchtos jiny ju zeditowôł starnã abò copnął zmianë.\n\nSlédnym ùsódzcą starnë bëł [[User:$3|$3]] ([[User talk:$3|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"revertpage": "Edicje brëkòwnika [[Special:Contributions/$2|$2]] ([[User talk:$2|diskùsjô]]) òstałë òdrzucóné. Aùtorã przëwrócóny wersji je [[User:$1|$1]].",
"rollback-success": "Copniãto edicje {{GENDER:$3|brëkòwnika|brëkòwniczczi}} $1;\ndoprowadzóno nazôd slédną wersëjã ùsôdzcë {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Edicje brëkòwnika $1 òstałë òdrzucóné; \nòsta przëwrócónô òstatnô wersjô, aùtorã chtërny je $2. [$3 Pòkażë zjinaczi]",
"protectlogpage": "Zazychrowóné",
"protectedarticle": "zazychrowónô [[$1]]",
"modifiedarticleprotection": "zmienionô léga zazychrowaniô [[$1]]",
"revertpage": "Wedi gwrthdroi golygiadau gan [[Special:Contributions/$2|$2]] ([[User talk:$2|Sgwrs]]); wedi adfer y golygiad diweddaraf gan [[User:$1|$1]]",
"revertpage-nouser": "Wedi gwrthdroi golygiadau gan ddefnyddiwr cudd; wedi adfer y golygiad diweddaraf gan {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Gwrthdrowyd y golygiadau gan {{GENDER:$3|$1}};\nailosodwyd y golygiad olaf gan {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Gwrthdrowyd y golygiadau gan $1;\nailosodwyd y golygiad olaf gan $2. [$3 Dangoser y gwahaniaeth]",
"sessionfailure-title": "Sesiwn wedi methu",
"sessionfailure": "Mae'n debyg fod yna broblem gyda'ch sesiwn mewngofnodi; diddymwyd y weithred er mwyn diogelu'r sustem rhag ddefnyddwyr maleisus. Gwasgwch botwm 'nôl' eich porwr ac ail-lwythwch y dudalen honno, yna ceisiwch eto.",
"changecontentmodel-title-label": "Teitl y ddalen",
"deleting-backlinks-warning": "<strong>Warnung:</strong> Es verweisen noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere Seiten]] auf diese zu löschende Seite oder sie ist noch an anderer Stelle eingebunden.",
"deleting-subpages-warning": "<strong>Warnung:</strong> Die Seite, die du löschen möchtest, hat [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|eine Unterseite|$1 Unterseiten|51=über 50 Unterseiten}}]].",
"rollback": "Zurücksetzen der Änderungen",
+ "rollback-confirmation-confirm": "{{PLURAL:$1|0=Diese Bearbeitungen|Eine Bearbeitung|$1 Bearbeitungen}} zurücksetzen?",
+ "rollback-confirmation-yes": "Zurücksetzen",
+ "rollback-confirmation-no": "Abbrechen",
"rollbacklink": "Zurücksetzen",
"rollbacklinkcount": "{{PLURAL:$1|Eine Version|$1 Versionen}} zurücksetzen",
"rollbacklinkcount-morethan": "Mehr als {{PLURAL:$1|eine Version|$1 Versionen}} zurücksetzen",
"revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
"revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
"rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.",
- "rollback-success-notify": "Bearbeitungen von $1 rückgängig gemacht;\nzurückgeändert auf die letzte Version von $2. [$3 Änderungen zeigen]",
"sessionfailure-title": "Sitzungsfehler",
"sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte sende das Formular erneut ab.",
"changecontentmodel": "Inhaltsmodell einer Seite ändern",
"confirm-unwatch-top": "Diese Seite von der persönlichen Beobachtungsliste entfernen?",
"confirm-rollback-button": "Okay",
"confirm-rollback-top": "Bearbeitungen an dieser Seite zurücksetzen?",
+ "confirm-rollback-bottom": "Diese Aktion wird sofort die ausgewählten Änderungen an dieser Seite zurücksetzen.",
"confirm-mcrrestore-title": "Eine Version wiederherstellen",
"confirm-mcrundo-title": "Eine Änderung rückgängig machen",
"mcrundofailed": "Rückgängigmachung fehlgeschlagen",
"grant-basic": "Heqê basiti",
"grant-viewdeleted": "Besteryaya peran u dosyaya bıasne",
"grant-viewmywatchlist": "Lista serykerdışê xo bıvêne",
- "newuserlogpage": "Roceka karberanê newa",
+ "newuserlogpage": "Qeydê karberanê neweyan",
"newuserlogpagetext": "No yew qeydê afernayışanê karberio.",
"rightslog": "Qeydê heqanê karberi",
"rightslogtext": "Ena listeyê loganê ke heqqa karbaranî mucneno.",
"revertpage": "Ανάκληση των αλλαγών [[Special:Contributions/$2|$2]] ([[User talk:$2|συζήτηση]]) επιστροφή στην προηγούμενη αναθεώρηση [[User:$1|$1]]",
"revertpage-nouser": "Αναστράφηκαν οι επεξεργασίες από τον (όνομα χρήστη αφαιρέθηκε) στη τελευταία έκδοση από τον/την {{GENDER:$1|[[User:$1|$1]]}}φ",
"rollback-success": "Αναστροφή επεξεργασιών από {{GENDER:$3|τον|την}} $1, επιστροφή στην προηγούμενη έκδοση από {{GENDER:$4|τον|την}} $2.",
- "rollback-success-notify": "Αναίρεση επεξεργασιών από $1; επιστροφή στην τελευταία αναθεώρηση από $2.[$3 Εμφάνιση αλλαγών]",
"sessionfailure-title": "Η συνεδρία απέτυχε",
"sessionfailure": "Υπάρχει πρόβλημα με τη σύνδεσή σας -η ενέργεια αυτή ακυρώθηκε προληπτικά για την αντιμετώπιση τυχόν πειρατείας συνόδου (session hijacking). Παρακαλoύμε πατήστε \"Επιστροφή\", ξαναφορτώστε τη σελίδα από την οποία φθάσατε εδώ και προσπαθήστε ξανά.",
"changecontentmodel": "Αλλαγή μοντέλου περιεχομένου της σελίδας",
"deleting-backlinks-warning": "<strong>Warning:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
"deleting-subpages-warning": "<strong>Warning:</strong> The page you are about to delete has [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|a subpage|$1 subpages|51=over 50 subpages}}]].",
"rollback": "Roll back edits",
- "rollback-confirmation-confirm": "Rollback of {{PLURAL:$1|0=these edits|one edit|$1 edits}}?",
+ "rollback-confirmation-confirm": "Please confirm:",
"rollback-confirmation-yes": "Rollback",
"rollback-confirmation-no": "Cancel",
"rollbacklink": "rollback",
"revertpage": "Malfaris redaktojn de [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuto]]) al la lasta versio de [[User:$1|$1]]",
"revertpage-nouser": "Restarigis redaktojn de (salutnomo forigita) al lasta revizio de {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Restaris redaktojn de {{GENDER:$3|$1}}; ŝanĝis al lasta versio de {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Malfaritis redaktojn far $1;\nŝanĝis al la lasta reviziaĵo far $2. [$3 Prezenti ŝanĝojn]",
"sessionfailure-title": "Seanco malsukcesis",
"sessionfailure": "Ŝajnas, ke estas problemo kun via ensalutado;\nĈi ago estis nuligita por malhelpi fiensalutadon.\nBonvolu resendi la formularoj",
"changecontentmodel": "Ŝanĝi la enhavomodelon de paĝo",
"revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]",
"revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]",
"sessionfailure-title": "Error de sesión",
"sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nEnvía el formulario otra vez.",
"changecontentmodel": "Cambiar el modelo de contenido de una página",
"revertpage": "Tühistati kasutaja [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]]) tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
"revertpage-nouser": "Tühistati peidetud kasutaja muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
"rollback-success": "Tühistati muudatused, mille tegi {{GENDER:$3|$1}};\npöörduti tagasi viimasele muudatusele, mille tegi {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Tühistatud kasutaja $1 tehtud muudatused;\npöördutud tagasi kasutaja $2 viimase redaktsiooni juurde. [$3 Näita muudatusi]",
"sessionfailure-title": "Seansiviga",
"sessionfailure": "Näib, et sinu sisselogimisseanss on probleemne.\nSeansiärandamise vastase ettevaatusabinõuna on see toiming tühistatud.\nPalun saada vorm uuesti.",
"changecontentmodel": "Lehekülje sisumudeli muutmine",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) wikilariaren aldaketak deseginda, edukia [[User:$1|$1]] wikilariaren azken bertsiora itzuli da.",
"revertpage-nouser": "{{GENDER:$1|[[User:$1|$1]]}}-n azken berrikuspena ezkutatutako erabiltzaile batek egindako leheneraketa aldaketak.",
"rollback-success": "{{GENDER:$3|$1}}; wikilariaren aldaketak deseginda,\nedukia {{GENDER:$4|$2}} wikilariaren azken bertsiora itzuli da.",
- "rollback-success-notify": "$1k leheneratutako aldaketal;\nazkenengo berrikusketara aldatu da berriz $2ren eskutik. [$3 Erakutsi aldaketak]",
"sessionfailure-title": "Saio-akatsa",
"sessionfailure": "Badirudi saioarekin arazoren bat dagoela; ekintza hau ezeztatua izan da, saio bahiketa saihesteko neurri bezala. Mesedez, nabigatzaileko \"atzera\" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.",
"changecontentmodel": "Aldatu orri bateko eduki eredua",
"revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
"revertpage-nouser": "ویرایشهای انجامشده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
"rollback-success": "ویرایشهای {{GENDER:$3|$1}} واگردانی شد؛\nصفحه به آخرین ویرایش {{GENDER:$4|$2}} برگردانده شد.",
- "rollback-success-notify": "ویرایشهای توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]",
"sessionfailure-title": "خطای نشست کاربری",
"sessionfailure": "به نظر میرسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربودهشدن اطلاعات نشست کاربری، لغو شد.\nلطفاً فرم را از نو بارگذاری کنید.",
"changecontentmodel": "ویرایش نمونه محتوای یک صفحه",
"revertpage": "Käyttäjän [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.",
"revertpage-nouser": "Käyttäjän (käyttäjänimi poistettu) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän {{GENDER:$1|[[User:$1|$1]]}} tekemään versioon",
"rollback-success": "Käyttäjän {{GENDER:$3|$1}} tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän {{GENDER:$4|$2}} versioon.",
- "rollback-success-notify": "Kumottiin käyttäjän $1 muokkaukset; palautettiin viimeiseen käyttäjän $2 versioon. [$3 Näytä muutokset]",
"sessionfailure-title": "Istuntovirhe",
"sessionfailure": "Näyttää siltä, että tämänhetkisessä istunnossasi on jokin ongelma; \ntämä toiminto on peruutettu varotoimena istunnon kaappaamisen estämiseksi.\nLähetä lomake uudelleen.",
"changecontentmodel": "Muuta sivun sisältömallia",
"revertpage": "Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]",
"revertpage-nouser": "Révocation des modifications par un utilisateur masqué à la dernière version par {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Révocation des modifications effectuées par {{GENDER:$3|$1}} ;\nrétablissement de la dernière version par {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 Voir les changements]",
"sessionfailure-title": "Erreur de session",
"sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez soumettre le formulaire de nouveau.",
"changecontentmodel": "Modifier le modèle de contenu d’une page",
"default": "standert",
"prefs-files": "Bestannen",
"prefs-custom-js": "Persoanlik JS",
- "prefs-reset-intro": "Jo kinne dizze side brûke, en set jo ynstellings werom nei de websteestandert.\nDit kin net ûngedien makke wurde.",
+ "prefs-reset-intro": "Jo kinne dizze side brûke, en set jo ynstellings werom nei de websteestandert.\nDat kin net ûngedien makke wurde.",
"prefs-emailconfirm-label": "E-mailbefêstiging:",
"youremail": "E-mail:",
"username": "{{GENDER:$1|Meidochnamme}}:",
"upload-preferred": "Oanwiisde bestânstypen: $1.",
"upload-prohibited": "Ferbeane bestânstypen: $1.",
"uploadlogpage": "Oanbiedloch",
- "uploadlogpagetext": "List fan de lêst oanbeane bestannen. (Tiid oanjûn as UTC).",
+ "uploadlogpagetext": "Hjirûnder stiet in list fan 'e meast resint opladen bestannen.\nSjoch de [[Special:NewFiles|galery mei nije bestannen]] foar in fisueler oersjoch.",
"filename": "Bestânsnamme",
"filedesc": "Omskriuwing",
"fileuploadsummary": "Gearfetting:",
"show-big-image-size": "$1 × $2 pixels",
"newimages": "Nije ôfbylden",
"imagelisttext": "Dit is in list fan '''$1''' {{PLURAL:$1|bestân|bestannen}}, op $2.",
+ "newimages-summary": "Dizze bysûndere side lit de lêst opladen bestannen sjen.",
"newimages-legend": "Filter",
"noimages": "Neat te sjen.",
"ilsubmit": "Sykje",
"revertpage": "Deasachaidhean a chaidh a thilleadh leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
"revertpage-nouser": "Deasachaidhean a chaidh a thilleadh le cleachdaiche falaichte dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
"rollback-success": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2.",
- "rollback-success-notify": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2. [$3 Seall na h-atharraichean]",
"sessionfailure-title": "Trioblaid leis an t-seisean",
"sessionfailure": "Tha duilgheadas ann leis an seisean logaidh a-steach agad a-rèir coltais;\nchaidh sgur dhen ghnìomh seo a chum dìon o session hijacking.\nTill dhan duilleag roimhpe, ath-luchdaich an duilleag ud 's feuch ris a-rithist an uairsin.",
"logentry-contentmodel-change-revertlink": "till",
"revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
"revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Desfixéronse as edicións de {{GENDER:$3|$1}};\nvolveuse á última edición, feita por {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Revertéronse as edicións de $1;\nrestaurouse a última revisión de $2. [$3 Amosar os cambios]",
"sessionfailure-title": "Erro de sesión",
"sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPor favor, volva enviar o formulario.",
"changecontentmodel": "Cambiar o modelo de contido dunha páxina",
"revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
"revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "שוחזר מעריכות של {{GENDER:$3|$1}}\nלעריכה האחרונה של {{GENDER:$4|$2}}.",
- "rollback-success-notify": "שוחזר מעריכות של $1\nלעריכה האחרונה של $2. [$3 הצגת שינויים]",
"sessionfailure-title": "בעיה בחיבור",
"sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לשלוח מחדש את הטופס.",
"changecontentmodel": "שינוי מודל התוכן של דף",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) के संपादनों को हटाकर [[User:$1|$1]] के अन्तिम अवतरण को पूर्ववत किया",
"revertpage-nouser": "(सदस्य नाम हटाया गया है) के संपादनों को हटाकर {{GENDER:$1|[[User:$1|$1]]}} के अन्तिम अवतरण को पूर्ववत किया।",
"rollback-success": "{{GENDER:$3|$1}} के संपादन हटाए;\n{{GENDER:$4|$2}} द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।",
- "rollback-success-notify": "$1 के सम्पादन वापिस लौटाए;\n$2 द्वारा संपादित अंतिम संस्करण पुनर्स्थापित किया। [$3 बदलाव दिखाएँ]",
"sessionfailure-title": "सत्र विफलता",
"sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया प्रपत्र दोबारा जमा करें।",
"changecontentmodel": "पन्ने का सामग्री प्रारूप बदलें",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ke badlao ke [[User:$1|$1]] ke aakhri badlao ke jaise kar dewa gais hai.",
"revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.",
- "rollback-success-notify": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadlao ke $2 ke aakhri version kar dewa gais hai.[$3 Show changes]",
"sessionfailure-title": "Session fail hoe gais hae",
"sessionfailure": "Aap ke login session me kuch karrbarr hai.\niske cancel kar dewa gais hai jisse ki koi iisession ke hijack nai kar.\nMeharbani kar ke \"back\" ke press kar ke jon pana se aap aae rahaa ke fir se load karo, tab fir kosis karo.",
"changecontentmodel": "Panna ke content model ke badlo",
"revertpage": "uklonjena promjena {{GENDER:$2|suradnika|suradnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]), vraćeno na posljednju inačicu {{GENDER:$1|suradnika|suradnice}} [[User:$1|$1]]",
"revertpage-nouser": "Vraćene izmjene suradnika (suradničko ime uklonjeno) na posljednju inačicu suradnika [[User:$1|$1]]",
"rollback-success": "Uklonjeno uređivanje {{GENDER:$3|suradnika|suradnice}} $1; vraćeno na posljednju inačicu {{GENDER:$4|suradnika|suradnice}} $2.",
- "rollback-success-notify": "Uklonili ste izmjene suradnika $1;\nvraćeno na posljednju izmjenu suradnika $2. [$3 Prikaži izmjene]",
"sessionfailure-title": "Prekid sesije",
"sessionfailure": "Izgleda da postoji problem s Vašom prijavom; ta radnja otkazana je kao način sprječavanja zlouporabe. Molimo ponovno pošaljite obrazac.",
"changecontentmodel": "Promjena modela sadržaja stranice",
"revertpage": "Visszaállítottam a lap korábbi változatát [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]]) szerkesztéséről [[User:$1|$1]] szerkesztésére",
"revertpage-nouser": "Visszaállítottam a lap korábbi változatát (szerkesztőnév eltávolítva) szerkesztéséről [[User:$1|$1]] szerkesztésére",
"rollback-success": "{{GENDER:$3|$1}} szerkesztéseit visszaállítottam {{GENDER:$4|$2}} utolsó változatára.",
- "rollback-success-notify": "$1 szerkesztései visszaállítva;\nhelyreállítva $2 utolsó változata. [$3 Változtatások megtekintése]",
"sessionfailure-title": "Munkamenethiba",
"sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, küldd el újra az űrlapot.",
"changecontentmodel": "A lap tartalommodelljének megváltoztatása",
"revertpage": "Reverteva modificationes per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) al ultime version per [[User:$1|$1]]",
"revertpage-nouser": "Reverteva modificationes per un usator celate al ultime version per {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Revocava modificationes per {{GENDER:$3|$1}};\nretornava al version per {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Modificationes de $1 revertite;\nultime version de $2 restaurate. [$3 Monstrar cambiamentos]",
"sessionfailure-title": "Error de session",
"sessionfailure": "Il pare haber un problema con tu session;\niste action ha essite cancellate como precaution contra le robamento de sessiones.\nPer favor, resubmitte le formulario.",
"changecontentmodel": "Cambiar le modello de contento de un pagina",
"revertpage": "←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]",
"revertpage-nouser": "Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]",
"rollback-success": "Pembatalan suntingan oleh {{GENDER:$3|$1}}; dibatalkan ke versi terakhir oleh {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Mengembalikan suntingan oleh $1; rubah kembali untuk revisi terakhir oleh $2. [$3 Lihat perubahan]",
"sessionfailure-title": "Kegagalan sesi",
"sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan sebagai antisipasi untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.",
"changecontentmodel": "Ubah model isi sebuah halaman",
"revertpage": "Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli iti naudi a rebision babaen ni [[User:$1|$1]]",
"revertpage-nouser": "Naisubli dagiti inurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a rebision babaen ni {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Naibabawi dagiti panagurnos babaen ni {{GENDER:$3|$1}};\nnaisubli manen ti naudi a rebision babaen ni {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Naibabawi dagiti panagurnos babaen ni $1;\nisubli ti naudi a rebision babaen ni $2. [$3 Ipakita dagiti binaliwan]",
"sessionfailure-title": "Napaay ti sesion",
"sessionfailure": "Adda parikut ti sesion ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti sesion.\nPangngaasi nga ited manen ti porma.",
"changecontentmodel": "Baliwan ti modelo ti linaon ti panid",
"revertpage": "Tók aftur breytingar [[Special:Contributions/$2|$2]] ([[User talk:$2|spjall]]), breytt til síðustu útgáfu [[User:$1|$1]]",
"revertpage-nouser": "Tók aftur breytingar falins notanda til síðustu útgáfu {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Tók til baka breytingar eftir {{GENDER:$3|$1}};\nsetti yfir á síðustu útgáfu eftir {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Tók aftur breytingar $1;\nbreytti í síðustu útgafu $2. [$3 Sýna breytingar]",
"sessionfailure-title": "Mistök í setu",
"sessionfailure": "Líklega er vandamál með innskráningarsetuna þína;\nhætt hefur verið við þessa aðgerð sem vörn gegn mögulegu samskiptaráni setunar.\nReyndu að senda upplýsingarnar aftur inn.",
"changecontentmodel": "Breyta efnislíkani síðu",
"revertpage": "Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]",
"revertpage-nouser": "Annullate le modifiche di un utente nascosto, riportata alla versione precedente di {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Annullate le modifiche di {{GENDER:$3|$1}}; pagina riportata all'ultima versione di {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]",
"sessionfailure-title": "Sessione fallita",
"sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Invia nuovamente il modulo.",
"changecontentmodel": "Modifica il modello di contenuto di una pagina",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を [[User:$1|$1]] による直前の版へ差し戻しました",
"revertpage-nouser": "非表示の利用者による編集を {{GENDER:$1|[[User:$1|$1]]}} による直前の版へ差し戻しました",
"rollback-success": "{{GENDER:$3|$1}}による編集を差し戻しました。\n{{GENDER:$4|$2}}による直前の版へ変更されました。",
- "rollback-success-notify": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。[$3 変更を表示]",
"sessionfailure-title": "セッションの失敗",
"sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\nフォームを再送信してください。",
"changecontentmodel": "ページのコンテンツ・モデルの変更",
"revertpage": "[[Special:Contributions/$2|$2]]-ის რედაქტირება გაუქმდა; აღდგა ბოლოს [[User:$1|$1]]-ის მიერ რედაქტირებული ვერსია",
"revertpage-nouser": "მომხმარებლის (მომხმარებლის სახელი დამალულია) ცვლილებები დაბრუნებულია ვერსიაზე {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "გაუქმდა რედაქტირება {{GENDER:$3|$1}}-ის მიერ;\nდაბრუნდა ვერსიაზე, რომელიც განახორციელა {{GENDER:$4|$2}}-მ.",
- "rollback-success-notify": "გაუმქდა $1-ის მიერ განხორციელებული რედაქტირებები;\nდაბრუნდე ვერსიაზე, რომელიც განახორციელა $2-მ. [$3 ცვლილებების ნახვა]",
"sessionfailure-title": "სეანსის შეცდომა",
"sessionfailure": "ჩანს, რომ პრობლემაა თქვენი რეგისტრაციის სესიისათვის;\nეს მოქმედება შეჩერდა თქვენი სესიაში შემოჭრის თავიდან ასაცილებლად.\nგთხოვთ, დააწკაპუნოთ ღილაკს „უკან“ და თავიდან ჩართოთ გვერდი, რომლიდანაც შემოხვედით და სცადოთ განმეორებით.",
"changecontentmodel": "გვერდის კონტენტური მოდელის შეცვლა",
"revertpage": "[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])의 편집을 [[User:$1|$1]]의 마지막 판으로 되돌림",
"revertpage-nouser": "숨긴 사용자의 편집을 {{GENDER:$1|[[User:$1|$1]]}}의 마지막 판으로 되돌림",
"rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.",
- "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
"sessionfailure-title": "세션 실패",
"sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n양식을 다시 제출해 주십시오.",
"changecontentmodel": "문서의 콘텐츠 모델을 변경",
"revertpage": "Änderunge vun däm Metmaacher „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|däm sing Klaafsigg]]) fottjeschmeße, un doför de lätzde Väsjohn vum „[[User:$1|$1]]“ widder zeröckjehollt",
"revertpage-nouser": "Änderunge vun enem Metmaacher, däm singe Name vershtoche es, retuur jemaat op de letzte Version {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$1|$1]]",
"rollback-success": "De Änderungen vum $1 zeröckjenumme, un dobei de letzte Version vum $2 widder jehollt.",
- "rollback-success-notify": "Änderonge {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} „$1“ sin zerök jenumme un di Sigg es op der Schtand vun doför {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ jesaz. [$3 Belohr, wat derbeij veränndert wood]",
"sessionfailure-title": "Fähler met dä Daate vum Enlogge",
"sessionfailure": "Et jov wall e täschnesch Problehm met Dingem Login. Dröm ham_mer dat us Vörseesch jäz nix jemaht, domet mer nit velleich Ding Änderong däm verkihrte Metmaacher ongerjubele. Jangk zeröck un versöhk et noch ens.",
"changecontentmodel": "Et Modäll vum Ennhald vun ene Sigg verändere",
"revertpage": "Ännerunge vum [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]]) zréckgesat op déi lescht Versioun vum [[User:$1|$1]]",
"revertpage-nouser": "Zréckgesaten Ännerungen duerch e verstoppte Benotzer op déi lescht Versioun vum {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "D'Ännerunge vum {{GENDER:$3|$1}} goufen zréckgesat op déi lescht Versioun vum {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Zréckgesat Ännerunge vum $1:\nzréckgeännert op déi lescht Versioun vum $2. [$3 Ännerunge weisen]",
"sessionfailure-title": "Setzungsfeeler",
"sessionfailure": "Et schéngt e Problem mat Ärer Sessioun ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Sessioun piratéiert ka ginn.\nSchéckt de Formulaire w.e.g. nach eng Kéier.",
"changecontentmodel": "De Modell vum Inhalt vun enger Säit änneren",
"revertpage": "Editas par [[Special:Contributions/$2|$2]] ([[User talk:$2|discute]]) ia es reversada a la revisa la plu resente par [[User:$1|$1]]",
"revertpage-nouser": "Editas par un usor ascondeda ia es reversada a la revisa la plu resente par [[User:$1|$1]]",
"rollback-success": "Editas par {{GENDER:$3|$1}} ia es reversada e cambiada a la revisa la plu resente par {{GENDER:$4|$2}}",
- "rollback-success-notify": "Editas par $1 ia es reversada e cambiada a la revisa la plu resente par $2. [$3 Mostra cambias]",
"sessionfailure-title": "Fali de sesion",
"sessionfailure": "Lo pare ce tua sesion de autentici ave un problem; esta ata ia es canselada per proteje contra saisis de sesion. Reenvia la formulario, per favore.",
"changecontentmodel": "Cambia model de contenida de un paje",
"revertpage": "Wieziginge door [[Special:Contributions/$2|$2]] ([[User talk:$2|Euverlik]]) trukgedriejd tot de lètste versie door [[User:$1|$1]]",
"revertpage-nouser": "Verangeringe door 'ne verstaoke gebroeker trökgedrejd nao de litste versie van {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Verangeringe door {{GENDER:$3|$1}} trökgedrejd;\nlitste versie van {{GENDER:$4|$2}} herstèld.",
- "rollback-success-notify": "De verangeringe door $1 zint trökgedrejd;\nde litste versie van $2 is herstèld. [$3 Tuin verangeringe]",
"sessionfailure-title": "Sessiefout",
"sessionfailure": "'t Liek op det se e perbleem höbs mit dien aanmeldingssessie;\ndees hanjeling is aafgebraoke oet veurzörg taenge 'nen hack.\nVersjik estebleef 't formeleer.",
"changecontentmodel": "Bewirk inhawdsmodel van pagina",
"revertpage": "Annullou e modiffiche de [[Special:Contributions/$2|$2]] ([[User talk:$2|discuscion]]), riportâ a-a verscion precedente de [[User:$1|$1]]",
"revertpage-nouser": "Annullou e modiffiche de un utente ascoso, riportâ a-a verscion precedente de {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Annullou e modiffiche de {{GENDER:$3|$1}}; paggina riportâ a l'urtima verscion de {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Annullou e modiffiche de $1;\npaggina riportâ a l'urtima revixon de $2. [$3 Mostra e modiffiche]",
"sessionfailure-title": "Sescion fallia",
"sessionfailure": "S'è veificou un problema inta sescion ch'a l'identiffica l'accesso; o scistema o no l'ha eseguio o comando impartio pe precauçion. Torna a-a paggina precedente co-o tasto 'Inderê' do to browser, recarega a paggina e riproeuva.",
"changecontentmodel": "Cangia o modello de contegnuo de 'na paggina",
"revertpage": "Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta [[User:$1|$1]] versija",
"revertpage-nouser": "Atversti pakeitimai paslėpto vartotojo, grąžino prieš tai buvusią versiją {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Atmesti {{GENDER:$3|$1}} pakeitimai;\ngrąžinta prieš tai buvusi {{GENDER:$4|$2}} versija.",
- "rollback-success-notify": "Atmesti $1 pakeitimai;\ngrąžinta prieš tai buvusi $2 versija. [$3 Rodyti skirtumus]",
"sessionfailure-title": "Sesijos klaida",
"sessionfailure": "Atrodo yra problemų su jūsų prisijungimo sesija; šis veiksmas buvo atšauktas kaip atsargumo priemonė prieš sesijos vogimą.\nPrašome iš naujo pateikti formą.",
"changecontentmodel": "Keisti puslapio turinio modelį",
"delete-toobig": "Šai lapai ir liela izmaiņu hronoloģija, vairāk nekā $1 {{PLURAL:$1|versijas|versija|versijas}}.\nŠādu lapu dzēšana ir atslēgta, lai novērstu nejaušus traucējumus {{grammar:lokatīvs|{{SITENAME}}}}.",
"deleting-backlinks-warning": "'''Brīdinājums:''' uz lapu, ko grasies izdzēst, ved [[Special:WhatLinksHere/{{FULLPAGENAME}}|saites no citām lapām]].",
"rollback": "Novērst labojumus",
+ "rollback-confirmation-no": "Atcelt",
"rollbacklink": "novērst",
"rollbacklinkcount": "atcelt $1 {{PLURAL:$1|labojumus|labojumu|labojumus}}",
"rollbacklinkcount-morethan": "atcelt vairāk kā $1 {{PLURAL:$1|labojumus|labojumu|labojumus}}",
"revertpage": "सम्पादन आपस कएल गेल [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) सँ अन्तिम संशोधन धरि एकरा द्वारा [[User:$1|$1]]।",
"revertpage-nouser": "(प्रयोक्ताक नाम हटा देल गेल अछि) द्वारा केल गेल संपादनकेँ फेरसँ पुरान स्थितिमे आनि कऽ एकर पहिलुक [[User:$1|$1]] सँ बनल संस्करणकेँ फेरसँ ताजा संस्करण बनाऊ।",
"rollback-success": "{{GENDER:$3|$1}} क संपादन हटाबी;\n{{GENDER:$4|$2}} द्वारा संपादित अन्तिम अवतरण क पुनर्स्थापित करू।",
- "rollback-success-notify": "$1द्वारा पूर्ववत सम्पादन;\n$2द्वारा केल अन्तिम अवतरण पर वापस। [$3 परिवर्तन देखाबी]",
"sessionfailure-title": "सत्र विफल भ गेल",
"sessionfailure": "एहन लागैत अछि जे अहां के लागिन सत्र में कोनो त्रुटि अछि. सत्र अपहरण से बचाबय सं सावधानीक लेल अहां के अहि क्रियाकलाप क रद्द क देल गेल. अहां पाछां के पृष्ठ पर जौउ आ पृष्ठ के फेर सं लोड क दोबारा कोशिश करू.",
"changecontentmodel": "पृष्ठ सामग्री मोडल परिवर्तन करी",
"revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring versi pungkasan sekang [[User:$1|$1]]",
"revertpage-nouser": "Mbalekna suntingan sekang (jeneng panganggo dibusek) ming revisi pungkasan sekang [[User:$1|$1]]",
"rollback-success": "Mbalekna suntingane $1;\ndibalekna ming revisi pungkasan sekang $2.",
- "rollback-success-notify": "Mbalekna besutan sekang $1; owah mbalik nggo revisi mburi sekang $2. [$3 Deleng owahane]",
"sessionfailure-title": "Sèsi gagal",
"sessionfailure": "Ketone lagi ana masalah karo sesi log-e Rika;\nloge Rika wis dibatalna nggo nyegah pambajakan.\nMonggo mbalik ming kaca sedurunge, dibaleni gole muatna kaca (reload) lan jajal diunggahna maning.",
"protectlogpage": "Log pangreksan",
"deleting-backlinks-warning": "<strong>Предупредување:</strong> До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
"deleting-subpages-warning": "<strong>Предупредување:</strong> Страницата што сакате да ја избришете има [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|потстраница|$1 потстраници|51=преку 50 потстраници}}]].",
"rollback": "Отповикај промени",
+ "rollback-confirmation-confirm": "Да {{PLURAL:$1|0=ги отповикам овие уредувања|отповикам едно уредување|отповикам $1 уредувања}}?",
+ "rollback-confirmation-yes": "Отповикај",
+ "rollback-confirmation-no": "Откажи",
"rollbacklink": "отповикај",
"rollbacklinkcount": "отповикај $1 {{PLURAL:$1|уредување|уредувања}}",
"rollbacklinkcount-morethan": "отповикај повеќе од $1 {{PLURAL:$1|уредување|уредувања}}",
"revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
"revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Откажани уредувањата на {{GENDER:$3|$1}};\nвратено на последната верзија на {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]",
"sessionfailure-title": "Седницата не успеа",
"sessionfailure": "Се јави проблем со најавната седница;\nова дејство е откажано за да се спречи нејзина кражба.\nПоднесете го образецот повторно.",
"changecontentmodel": "Промена на содржинскиот модел на страница",
"confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?",
"confirm-rollback-button": "ОК",
"confirm-rollback-top": "Да ги отповикам уредувањата на страницава?",
+ "confirm-rollback-bottom": "Ова дејство веднаш ќе ги отповика избраните промени на страницава.",
"confirm-mcrrestore-title": "Поврати преработка",
"confirm-mcrundo-title": "Откажи промена",
"mcrundofailed": "Откажувањето не успеа",
"gotointerwiki": "Го напуштате {{SITENAME}}",
"gotointerwiki-invalid": "Укажаниот наслов е неважечки.",
"gotointerwiki-external": "Го напуштате {{SITENAME}} упатени кон [[$2]], кое е посебно мрежно место.\n\n'''[$1 Продолжете кон $1]'''",
- "undelete-cantedit": "Ð\9dе можеÑ\82е да Ñ\98а вÑ\80аÑ\82иÑ\82е избÑ\80иÑ\88анаÑ\82а страница бидејќи уредувањето на страницава не ви е дозволено.",
+ "undelete-cantedit": "Ð\9dе можеÑ\82е да Ñ\98а вÑ\80аÑ\82иÑ\82е оваа страница бидејќи уредувањето на страницава не ви е дозволено.",
"undelete-cantcreate": "Не можете да ја вратите страницава бидејќи не постои страница со таков назив и не ви е дозволено да ја создадете.",
"pagedata-title": "Податоци за страницата",
"pagedata-text": "Страницава дава посредник за податоци за страниците. Укажете го насловот на страницата во URL-то, користејќи ја синтаксата за потстраници.\n* Префрлањето на содржината се заснова на заглавието Прифати на вашиот клиент. Ова значи дека податоците за страницата ќе бидат ставени во форматот кој го претпочита вашиот клиент.",
"apisandbox-submit-invalid-fields-title": "ചില മണ്ഡലങ്ങൾ അസാധുവാണ്",
"apisandbox-results": "ഫലങ്ങൾ",
"apisandbox-request-url-label": "അഭ്യർത്ഥനാ യൂ.ആർ.എൽ.:",
- "apisandbox-request-json-label": "JSON നുവേണ്ടി അപേക്ഷിക്കുക:",
+ "apisandbox-request-json-label": "ജെസൺ അപേക്ഷിക്കുക:",
"apisandbox-request-time": "അഭ്യർത്ഥനയുടെ സമയം: {{PLURAL:$1|$1 മി.സെ.}}",
"apisandbox-results-fixtoken": "ചീട്ട് ശരിയാക്കിയ ശേഷം വീണ്ടും സമർപ്പിക്കുക",
- "apisandbox-results-fixtoken-fail": "\"$1\" à´\9fàµ\8bà´\95àµ\8dà´\95ൻ എടുക്കുന്നത് പരാജയപെട്ടു.",
+ "apisandbox-results-fixtoken-fail": "\"$1\" à´\9aàµ\80à´\9fàµ\8dà´\9fàµ\8d എടുക്കുന്നത് പരാജയപെട്ടു.",
"apisandbox-alert-page": "ഈ താളിലെ ഫീൽഡുകൾ അസാധുവാണ്.",
"apisandbox-continue": "തുടരുക",
"apisandbox-continue-clear": "ശൂന്യമാക്കുക",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) നടത്തിയ തിരുത്തലുകൾ നീക്കം ചെയ്തിരിക്കുന്നു; നിലവിലുള്ള പതിപ്പ് [[User:$1|$1]] സൃഷ്ടിച്ചതാണ്",
"revertpage-nouser": "മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് നടത്തിയ തിരുത്തലുകൾ {{GENDER:$1|[[User:$1|$1]]}} സൃഷ്ടിച്ച അവസാന പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്തിരിക്കുന്നു",
"rollback-success": "{{GENDER:$3|$1}} ചെയ്ത തിരുത്ത് തിരസ്ക്കരിച്ചിരിക്കുന്നു; {{GENDER:$4|$2}} ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു.",
- "rollback-success-notify": "$1 ചെയ്ത തിരുത്തുകൾ തിരസ്ക്കരിച്ചിരിക്കുന്നു; $2 ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു. [$3 മാറ്റങ്ങൾ കാണിക്കുക]",
"sessionfailure-title": "സെഷൻ പരാജയപ്പെട്ടിരിക്കുന്നു",
"sessionfailure": "താങ്കളുടെ ലോഗിൻ സെഷനിൽ പ്രശ്നങ്ങളുള്ളതായി കാണുന്നു;\nസെഷൻ തട്ടിയെടുക്കൽ ഒഴിവാക്കാനുള്ള മുൻകരുതലായി ഈ പ്രവൃത്തി റദ്ദാക്കിയിരിക്കുന്നു.\nദയവായി ഫോം വീണ്ടും സമർപ്പിക്കുക.",
"changecontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
"authmanager-provider-password": "രഹസ്യവാക്ക്-അധിഷ്ഠിത സാധൂകരണം",
"authmanager-provider-password-domain": "രഹസ്യവാക്ക്-ഡൊമൈൻ-അധിഷ്ഠിത സാധൂകരണം",
"authmanager-provider-temporarypassword": "താത്കാലിക രഹസ്യവാക്ക്",
- "authprovider-confirmlink-success-line": "$1: വിà´\9cà´¯à´\95രമായി ലിà´\99àµ\8dà´\95àµ\8d à´\9aàµ\86à´¯്തു.",
+ "authprovider-confirmlink-success-line": "$1: വിà´\9cà´¯à´\95രമായി à´\95à´£àµ\8dണി à´\9aàµ\87ർത്തു.",
"authprovider-resetpass-skip-label": "മറികടക്കുക",
- "authform-newtoken": "à´\9fàµ\8bà´\95àµ\8dà´\95ൺ കാണുന്നില്ല. $1",
- "authform-notoken": "à´\9fàµ\8bà´\95àµ\8dà´\95ൺ കാണുന്നില്ല",
- "authform-wrongtoken": "à´¤àµ\86à´±àµ\8dറായ à´\9fàµ\8bà´\95àµ\8dà´\95ൻ",
+ "authform-newtoken": "à´\9aàµ\80à´\9fàµ\8dà´\9fàµ\8d കാണുന്നില്ല. $1",
+ "authform-notoken": "à´\9aàµ\80à´\9fàµ\8dà´\9fàµ\8d കാണുന്നില്ല",
+ "authform-wrongtoken": "à´¤àµ\86à´±àµ\8dറായ à´\9aàµ\80à´\9fàµ\8dà´\9fàµ\8d",
"specialpage-securitylevel-not-allowed-title": "അനുവദിച്ചിട്ടില്ല",
"specialpage-securitylevel-not-allowed": "താങ്കളുടെ വ്യക്തിത്വം പരിശോധിക്കാൻ കഴിയാഞ്ഞതിനാൽ ഈ താൾ ഉപയോഗിക്കാൻ താങ്കളെ അനുവദിക്കാനാവില്ല.",
"authpage-cannot-login": "പ്രവേശനം തുടങ്ങാൻ സാധിക്കുന്നില്ല.",
"revertpage": "Cangiaje 'e cagnamiénte 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), cu â verzione 'e pprimma 'e [[User:$1|$1]]",
"revertpage-nouser": "Annullate 'e cagnamiente 'e n'utente annascunnuto, è stata ripigliata ll'urdema verzione 'e {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Cagnamiente annullate 'a {{GENDER:$3|$1}};\ns'è turnato arreto a l'urdema verzione 'e {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Cagnamiente annullate 'a $1;\ns'è turnat arreto a l'urdema verzione 'e $2. [$3 Fà vedé 'e cagnamiente]",
"sessionfailure-title": "Sessione fallita",
"sessionfailure": "Pare ca stanno probbleme cu 'a sessiona toja;\nst'azione è stata fermata pe' precauzione annanz' 'e cavall' 'e troia;\nPe' piacere turnate arreto, carrecate n'ata vota 'a paggena pe pruvate n'ata vota.",
"changecontentmodel": "Cagna 'o mudello 'e cuntenute 'e na paggena",
"revertpage": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] ([[User talk:$2|brukerdiskusjon]]) til siste versjon av [[User:$1|$1]]",
"revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Tilbakestilte endringer av $1;\nendret tilbake til siste revisjon av $2. [$3 Vis endringer]",
"sessionfailure-title": "Sesjonsfeil",
"sessionfailure": "Det ser ut til å være et problem med innloggingen din, og handlingen ble avbrutt av sikkerhetshensyn. Vennlgist prøv å sende skjemaet en gang til.",
"changecontentmodel": "Endre innholdsmodell for en side",
"revertpage": "Wijzigingen door [[Special:Contributions/$2|$2]] ([[User talk:$2|Overleg]]) hersteld tot de laatste versie door [[User:$1|$1]]",
"revertpage-nouser": "Wijzigingen door een verborgen gebruiker teruggedraaid naar de laatste versie door {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Wijzigingen door {{GENDER:$3|$1}} ongedaan gemaakt;\nlaatste versie van {{GENDER:$4|$2}} hersteld.",
- "rollback-success-notify": "De wijzigingen door $1 zijn teruggedraaid;\nde laatste versie van $2 is hersteld. [$3 Wijzigingen weergeven]",
"sessionfailure-title": "Sessiefout",
"sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nProbeer het formulier opnieuw te versturen.",
"changecontentmodel": "Inhoudsmodel van pagina bewerken",
"revertpage": "Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].",
"revertpage-nouser": "Wycofano edycje ukrytego użytkownika. Autor przywróconej wersji to {{GENDER:$1|[[User:$1|$1]]}}.",
"rollback-success": "Wycofano edycje {{GENDER:$3|użytkownika|użytkowniczki}} $1;\nprzywrócono ostatnią wersję autorstwa {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]",
"sessionfailure-title": "Błąd sesji",
"sessionfailure": "Wydaje się, że wystąpił błąd z Twoją sesją zalogowania;\nto działanie zostało anulowane, aby uniknąć przechwycenia sesji.\nPrześlij formularz jeszcze raz.",
"changecontentmodel": "Edycja modelu zawartości strony",
"enotif_lastvisited": "Consulte $1 para todas as alterações efetuadas desde a sua última visita.",
"enotif_lastdiff": "Acesse $1 para ver esta alteração.",
"enotif_anon_editor": "usuário anônimo $1",
- "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},\n\n$PAGEINTRO $NEWPAGE\n\nResumo do editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContate o editor:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté que visite esta página, você não receberá mais notificações das alterações futuras.\nVocê pode também reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências das notificações por correio electrônico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
+ "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},\n\n$PAGEINTRO $NEWPAGE\n\nResumo do editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContate o editor:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté que visite esta página, você não receberá mais notificações das alterações futuras.\nVocê pode também reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências das notificações por correio eletrônico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
"enotif_minoredit": "Esta é uma edição menor",
"created": "criada",
"changed": "alterada",
"deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|outras páginas]] ligam ou redirecionam para a página que você está prestes a eliminar.",
"deleting-subpages-warning": "<strong>Aviso:</strong> A página que você está prestes a excluir tem [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|uma subpágina|$1 subpáginas|51=mais de 50 subpáginas}}]].",
"rollback": "Reverter edições",
+ "rollback-confirmation-yes": "Reverter",
+ "rollback-confirmation-no": "Cancelar",
"rollbacklink": "reverter",
"rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
"rollbacklinkcount-morethan": "reverter mais de $1 {{PLURAL:$1|edição|edições}}",
"revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]",
"revertpage-nouser": "Revertidas as edições de um usuário oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Edições revertidas por {{GENDER:$3|$1}};\nalterado para a última revisão por {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
"sessionfailure-title": "Erro de sessão",
"sessionfailure": "Parece haver um problema com sua sessão de login;\nEsta ação foi cancelada como uma precaução contra o seqüestro de sessão.\nPor favor, reenvie o formulário.",
"changecontentmodel": "Alterar o modelo de conteúdo de uma página",
"confirm-unwatch-top": "Remover esta página das páginas vigiadas?",
"confirm-rollback-button": "OK",
"confirm-rollback-top": "Reverter edições nesta página?",
+ "confirm-rollback-bottom": "Essa ação reverterá instantaneamente as alterações selecionadas para esta página.",
"confirm-mcrrestore-title": "Restaurar uma revisão",
"confirm-mcrundo-title": "Desfazer uma mudança",
"mcrundofailed": "A reversão falhou",
"revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
"revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Foram revertidas as edições de {{GENDER:$3|$1}}; reposta a última edição de {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
"sessionfailure-title": "Erro de sessão",
"sessionfailure": "Foram detetados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a intercetação de sessões.\nReenvie o formulário, por favor.",
"changecontentmodel": "Alterar modelo de conteúdo de uma página",
"deleting-backlinks-warning": "A warning shown when a page that is being deleted has at least one link to it or is transcluded in at least one page.",
"deleting-subpages-warning": "A warning shown when a page that is being deleted has at least one subpage. $1 is the number of subpages of the page. For any number of subpages over 50, $1 will be 51.\nSee also:\n* {{msg-mw|Deleting-backlinks-warning}}",
"rollback": "{{Identical|Rollback}}",
- "rollback-confirmation-confirm": "Question shown to user to confirm that they want to proceed with the rollback.\n\nParameters:\n* $1 - number of edits that will be rolled back.",
+ "rollback-confirmation-confirm": "Prompt which asks the user to confirm that they want to really perform the rollback action after clicking on the rollback button.",
"rollback-confirmation-yes": "Button text to confirm that a rollback should be executed.",
"rollback-confirmation-no": "Button text to cancel a rollback instead of executing it.",
"rollbacklink": "{{Doc-actionlink}}\nThis link text appears on the recent changes page to users who have the \"rollback\" right.\nThis message has a tooltip {{msg-mw|tooltip-rollback}}\n{{Identical|Rollback}}",
"revertpage": "Anularea modificărilor efectuate de către [[Special:Contributions/$2|$2]] ([[User talk:$2|discuție]]) și revenire la ultima versiune de către [[User:$1|$1]]",
"revertpage-nouser": "Anularea modificărilor efectuate de un utilizator ascuns și revenirea la ultima modificare de către {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Modificările făcute de {{GENDER:$3|$1}} au fost anulate;\nam revenit la ultima versiune de {{GENDER:$4|$2}}.",
- "rollback-success-notify": "S-a revenit asupra schimbărilor făcute de $1;\nam revenit la ultima versiune de $2. [$3 Arată schimbările]",
"sessionfailure-title": "Eroare de sesiune",
"sessionfailure": "Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva furtului sesiunii. Vă rugăm să trimiteți formularul din nou.",
"changecontentmodel": "Modificare model de conținut al unei pagini",
"revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
"revertpage-nouser": "Откат правок (имя участника скрыто) к версии {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Откачены правки {{GENDER:$3|$1}}; возвращена последняя версия {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Откачены правки $1; возвращена последняя версия $2. [$3 Показать изменения]",
"sessionfailure-title": "Ошибка сеанса",
"sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\nПожалуйста, переотправьте форму.",
"changecontentmodel": "Редактирование контентной модели страницы",
"revertpage": "([[User talk:$2|Ырытыы]]) көннөрүүлэрэ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлэр",
"revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ: {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "{{GENDER:$3|$1}} көннөрүүтэ сотулунна; {{GENDER:$4|$2}} барылыгар төннөрүлүннэ.",
- "rollback-success-notify": "$1 уларытыылара сотулуннулар; \n$2 тиһэх торумугар төннөрүлүннэ. [$3 Уларытыыны көрдөр]",
"sessionfailure-title": "Сиэссийэ алҕаһа",
"sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
"changecontentmodel": "Сирэй ис тутулун киэбин уларытыы",
"editcomment": "Padėrbėma paāškėnėms bova: <em>$1</em>.",
"revertpage": "Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|aptarėms]]) pakeitėms; sogrōžints atmains, katron padėrba nauduotuos [[User:$1|$1]]",
"rollback-success": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains.",
- "rollback-success-notify": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains. [$3 ruodītė keitėmus]",
"sessionfailure-title": "Sesėjės klaida",
"sessionfailure": "Atruod ka īr biedū so Tamstas prėsėjongėmo; tas vēksmos bova grōžints kāp atsargoma prėimonė nu sesėjės vuogėma.\nPrašoum mīgtė „atgal“ ėr parkrautė poslapi ėš katruo atiejėt, ė pamieginkėt apent.",
"changecontentmodel-title-label": "Poslapė pavadėnėms",
"search-category": "(kategorija $1)",
"search-file-match": "(odgovara sadržaju datoteke)",
"search-suggest": "Da li ste mislili: $1",
- "search-rewritten": "Ishod iz $1. Umjesto toga pretraži $2.",
+ "search-rewritten": "Ishod iz $1. Ili potražite ga $2.",
"search-interwiki-caption": "Ishod s bratskih projekata",
"search-interwiki-default": "Rezultati od $1:",
"search-interwiki-more": "(više)",
"revertpage": "Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]",
"revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
"rollback-success": "Vraćene su izmjene korisnika {{GENDER:$3|$1}};\nvraćeno na posljednju verziju koju je snimio {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Vraćene izmjene korisnika $1;\nvraćeno na posljednju izmjenu korisnika $2. [$3 Pok. promjene]",
"sessionfailure-title": "Greška u sesiji",
"sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
"changecontentmodel": "Promijeni model sadržaja stranice",
"edit-error-short": "Greška: $1",
"edit-error-long": "Greške:\n\n$1",
"revid": "izmjena $1",
- "pageid": "ID stranice $1"
+ "pageid": "ID stranice $1",
+ "gotointerwiki": "Napuštate projekt {{SITENAME}}",
+ "gotointerwiki-invalid": "Navedeni naslov je nevalidan.",
+ "gotointerwiki-external": "Napuštate projekt {{SITENAME}} da biste posjetili zasebno mrežno mjesto [[$2]].\n\n<strong>[$1 Nastavljate na $1]</strong>",
+ "undelete-cantedit": "Ne možete vratiti ovu stranicu jer Vam nije dozvoljeno da je uređujete.",
+ "undelete-cantcreate": "Ne možete vratiti stranicu jer ne postoji stranica s tim nazivom i nije Vam dozvoljeno da je napravite.",
+ "pagedata-title": "Podaci o stranici",
+ "pagedata-text": "Stranica pruža posrednik za podaci za stranice. Navedite naslov stranice u URL-u pomoću sintakse podstranice.\n* Prebacivanje sadržaja temelji se na zaglavlju Prihvati vašeg klijenta. To znači da će podaci stranice biti stavljeni u formatu koji preferira vaš klijent.",
+ "pagedata-not-acceptable": "Nisam našao odgovarajući format. Podržane MIME-vrste: $1",
+ "pagedata-bad-title": "Nevalidan naslov: $1.",
+ "unregistered-user-config": "Iz bezbednosnih razloga JavaScript, CSS i JSON korisničke podstranice ne mogu biti učitane za neregistrovane korisnike.",
+ "passwordpolicies": "Pravila za lozinke",
+ "passwordpolicies-summary": "Ovo je popis djelotvornih pravila za zaporke za korisničke grupe određene na ovom wikiju.",
+ "passwordpolicies-group": "Grupa",
+ "passwordpolicies-policies": "Pravila",
+ "passwordpolicies-policy-minimalpasswordlength": "Lozinka mora da ima najmanje $1 {{PLURAL:$1|znak|znaka|znakova}}",
+ "passwordpolicies-policy-minimumpasswordlengthtologin": "Lozinka mora da ima najmanje $1 {{PLURAL:$1|znak|znaka|znakova}} da bi ste mogli da se prijavite",
+ "passwordpolicies-policy-passwordcannotmatchusername": "Lozinka ne može biti ista što i korisničko ime",
+ "passwordpolicies-policy-passwordcannotmatchblacklist": "Lozinka ne smije biti iz onih na crnom spisku",
+ "passwordpolicies-policy-maximalpasswordlength": "Lozinka ne mora biti više od $1 {{PLURAL:$1|znaka|znakova}}",
+ "passwordpolicies-policy-passwordcannotbepopular": "Lozinka ne može da bude {{PLURAL:$1|popularna|iz spiska $1 popularnih lozinki}}",
+ "passwordpolicies-policy-passwordnotinlargeblacklist": "Lozinka ne može biti na listi 100.000 najčešće korišćenih lozinki.",
+ "passwordpolicies-policyflag-forcechange": "mora se promjeniti pri prijavi",
+ "passwordpolicies-policyflag-suggestchangeonlogin": "predloži izmjenu pri prijavi",
+ "easydeflate-invaliddeflate": "Sadržaj nije ispravno pročišćen",
+ "unprotected-js": "JavaScript ne može da se učita sa nezaštićenih stranica iz bezbednosnih razloga. Samo napravite JavaScript u imenskom prostoru MediaWiki: ili kao korisničku podstranicu"
}
"revertpage": "Posledné úpravy používateľa [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusia]]) vrátené; bola obnovená posledná úprava $1",
"revertpage-nouser": "Vrátené úpravy od skrytého používateľa na poslednú revíziu od {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Úpravy $1 vrátené; obnovená posledná verzia od $2.",
- "rollback-success-notify": "Úpravy používateľa $1 boli vrátené;\nobnovená posledná revízia od používateľa $2. [$3 Zobraziť zmeny]",
"sessionfailure-title": "Chyba relácie",
"sessionfailure": "Zdá sa, že je problém s vašou prihlasovacou reláciou;\ntáto akcia bola zrušená ako prevencia proti zneužitiu relácie (session).\nProsím, stlačte \"naspäť\", obnovte stránku, z ktorej ste sa sem dostali, a skúste to znova.",
"changecontentmodel": "Zmeniť model obsahu stránky",
"revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
"revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
- "rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
"sessionfailure-title": "Neuspeh seje",
"sessionfailure": "Zdi se, da z vašo sejo prijave obstaja težava;\nto dejanje smo preklicali, da bi preprečili morebitno ugrabitev seje. Prosimo, ponovno potrdite obrazec.",
"changecontentmodel": "Spremeni model vsebine strani",
"revertpage": "Враћене измене {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
"revertpage-nouser": "Враћене измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
"rollback-success": "Враћене измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}} на последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Враћене измене корисника $1;\nвраћено на последњу измену корисника $2. [$3 Прикажи промене]",
"sessionfailure-title": "Сесија је окончана",
"sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nМолимо, поново пошаљите образац.",
"changecontentmodel": "Промена модела садржаја странице",
"revertpage": "Vraćene izmene {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
"revertpage-nouser": "Vraćene izmene skrivenog korisnika na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
"rollback-success": "Vraćene izmene {{GENDER:$1|korisnika|korisnice}} {{GENDER:$3|$1}} na poslednju izmenu {{GENDER:$2|korisnika|korisnice}} {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Vraćene izmene korisnika $1;\nvraćeno na poslednju izmenu korisnika $2. [$3 Prikaži promene]",
"sessionfailure-title": "Sesija je okončana",
"sessionfailure": "Izgleda da postoji problem s vašom sesijom;\nova radnja je otkazana da bi se izbegla zloupotreba.\nMolimo, ponovo pošaljite obrazac.",
"changecontentmodel": "Promena modela sadržaja stranice",
"revertpage": "Återställde redigeringar av [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]",
"revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]",
"sessionfailure-title": "Sessionsfel",
"sessionfailure": "Någonting med din inloggningssession är på tok;\ndin begärda åtgärd har avbrutits för att förhindra att någon kapar din session.\nSkicka formuläret igen.",
"changecontentmodel": "Ändra innehållsmodell för en sida",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు.",
"revertpage-nouser": "దాగి ఉన్న వాడుకరి చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు",
"rollback-success": "{{GENDER:$3|$1}} చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళారు; తిరిగి {{GENDER:$4|$2}} చేసిన చివరి కూర్పుకు మార్చారు.",
- "rollback-success-notify": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళారు;\nతిరిగి $2 చేసిన చివరి కూర్పుకు మార్చారు. [$3 మార్పులు చూపించు]",
"sessionfailure-title": "సెషను వైఫల్యం",
"sessionfailure": "మీ లాగిన్ సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\nఫారమును తిరిగి సమర్పించండి.",
"changecontentmodel": "పేజీ కంటెంటు మోడలును మార్చు",
"editcomment": "Хулосаи вироиш ин буд: <em>$1</em>.",
"revertpage": "Вироиши [[Special:Contributions/$2|$2]] ([[User talk:$2|Баҳс]]) вогардонида шуд ба охирин тағйире, ки [[User:$1|$1]] анҷом дода буд",
"rollback-success": "Вироишҳои $1 вогардонӣ шуд; саҳифа ба вироиши $2 баргардонида шуд.",
- "rollback-success-notify": "Вироишоти $1 вогардонида шуд ба охирин вироише, ки $2 анҷом дода буд. [$3 Намоиши тавофут]",
"sessionfailure": "Ба назар мерасад, мушкилие дар мавриди нишасти корбарии шумо вуҷуд дорад; амали дархостшуда ба унвони иқдоми пешгирона дар баробари рабуда шудани иттилооти нишасти корбарӣ, лағв шуд. Лутфан тугмаи \"бозгашт\"-ро дар мурургари худ пахш кунед ва саҳифае, ки аз он инҷо расидаед муҷаддадан фарохонӣ кунед, сипас муҷаддадан боз саъй кунед.",
"protectlogpage": "Гузориши муҳофизат",
"protectlogtext": "Дар зер феҳристи қуфл карданҳо ва аз қуфл озод шуданҳо омада аст. Барои иттилооти бештар ба [[Special:ProtectedPages|феҳристи саҳифаҳои муҳофизатшуда]] нигаред.",
"revertpage": "ย้อนการแก้ไขโดย [[Special:Contributions/$2|$2]] ([[User talk:$2|คุย]]) ไปยังรุ่นแก้ไขล่าสุดโดย [[User:$1|$1]]",
"revertpage-nouser": "ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นล่าสุดโดย {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "ย้อนการแก้ไขโดย $1; \nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2",
- "rollback-success-notify": "ย้อนการแก้ไขโดย $1;\nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2 [$3 แสดงการเปลี่ยนแปลง]",
"sessionfailure-title": "เซสชันล้มเหลว",
"sessionfailure": "ดูเหมือนมีปัญหากับเซสชันการเข้าสู่ระบบของคุณ\nการกระทำนี้ถูกยกเลิกเพื่อเป็นการป้องกันการลักลอบเซสชันไว้ก่อน \nกรุณากรอกแบบฟอร์มใหม่อีกครั้ง",
"changecontentmodel-title-label": "ชื่อหน้า:",
"revertpage": "Відкинуто редагування [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]]) до зробленого [[User:$1|$1]]",
"revertpage-nouser": "Відкинуто редагування прихованого користувача до останньої версії, зробленої {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.",
- "rollback-success-notify": "Відкинуті редагування користувача $1; \nповернено до останньої версії користувача $2. [$3 Показати зміни]",
"sessionfailure-title": "Помилка сеансу",
"sessionfailure": "Здається, виникли проблеми з поточним сеансом роботи;\nцю дію скасовано, щоб запобігти «захопленню сеансу».\nБудь ласка, надішліть форму ще раз.",
"changecontentmodel": "Змінити модель вмісту сторінки",
"revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|تبادلۂ خیال]]) کی ترامیم [[User:$1|$1]] کی گذشتہ ترمیم کی جانب واپس پھیر دی گئیں۔",
"revertpage-nouser": "(حذف شدہ صارف نام) کی ترامیم {{GENDER:$1|[[User:$1|$1]]}} کی گذشتہ ترمیم کی جانب واپس پھیر دی گئیں",
"rollback-success": "{{GENDER:$3|$1}} کی ترامیم واپس پھیر دی گئیں؛\nصفحہ واپس {{GENDER:$4|$2}} کی آخری ترمیم کی جانب منتقل کر دیا گیا۔",
- "rollback-success-notify": "$1 کی ترامیم واپس پھیر دی گئیں؛\nصفحہ واپس $2 کی آخری ترمیم کی جانب منتقل کر دیا گیا۔ [$3 تبدیلیاں دکھائیں]",
"sessionfailure-title": "نشست میں خامی",
"sessionfailure": "معلوم ہوتا ہے کہ آپ کی لاگ ان نشست میں کوئی مسئلہ درپیش ہے؛\nاس صورت میں نشست کے اغوا کا خدشہ ہوتا ہے، چنانچہ پیش بندی کے طور پر آپ کے اقدام کو مسترد کر دیا گیا ہے۔\nبراہ کرم دوبارہ کوشش کریں۔",
"changecontentmodel": "صفحہ کے مواد کے ماڈل میں تبدیلی کریں",
"revertpage": "Đã lùi lại sửa đổi của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]]) quay về phiên bản cuối của [[User:$1|$1]]",
"revertpage-nouser": "Đã lùi lại sửa đổi của người dùng ẩn quay về phiên bản cuối của {{GENDER:$1}}[[User:$1|$1]]",
"rollback-success": "Đã hủy sửa đổi của {{GENDER:$3}}$1;\nquay về phiên bản cuối của {{GENDER:$4}}$2.",
- "rollback-success-notify": "Đã hủy sửa đổi của $1;\nquay về phiên bản cuối của $2. [$3 Xem thay đổi]",
"sessionfailure-title": "Phiên thất bại",
"sessionfailure": "Dường như có trục trặc với phiên đăng nhập của bạn; thao tác này đã bị hủy để tránh việc cướp quyền đăng nhập. Xin hãy gửi lại biểu mẫu.",
"changecontentmodel": "Thay đổi kiểu nội dung của một trang",
"revertpage": "恢复[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的编辑至[[User:$1|$1]]的最后版本",
"revertpage-nouser": "恢复隐藏用户的编辑至{{GENDER:$1|[[User:$1|$1]]}}的最后版本",
"rollback-success": "已恢复{{GENDER:$3|$1}}的编辑;更改回{{GENDER:$4|$2}}的最后版本。",
- "rollback-success-notify": "已回退$1的编辑,更改回$2的最后版本。[$3 显示更改]",
"sessionfailure-title": "会话无效",
"sessionfailure": "似乎您的登录会话有问题;为了防止会话劫持,这个操作已经被取消。请重新提交表单。",
"changecontentmodel": "更改一个页面的内容模型",
"deleting-backlinks-warning": "<strong>警告:</strong>您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。",
"deleting-subpages-warning": "<strong>警告:</strong>您要刪除的頁面有[[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1個子頁面|51=超過50個子頁面}}]]。",
"rollback": "復原編輯",
+ "rollback-confirmation-confirm": "回退{{PLURAL:$1|0=這些編輯|1個編輯|$1個編輯}}?",
+ "rollback-confirmation-yes": "回退",
+ "rollback-confirmation-no": "取消",
"rollbacklink": "回退",
"rollbacklinkcount": "還原 $1 次編輯",
"rollbacklinkcount-morethan": "回退超過 $1 次{{PLURAL:$1|編輯}}",
"revertpage": "已還原[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯為最後由[[User:$1|$1]]所修訂的版本",
"revertpage-nouser": "已還原隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
"rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。",
- "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
"sessionfailure-title": "連線階段失敗",
"sessionfailure": "您的登入連線階段似乎有問題,為了預防連線階段受到劫持攻擊,此動作已經被取消。請重新提交表單。",
"changecontentmodel": "變更頁面的內容模型",
"confirm-unwatch-top": "從您的監視清單中移除此頁面?",
"confirm-rollback-button": "確定",
"confirm-rollback-top": "還原編輯到此頁面?",
+ "confirm-rollback-bottom": "此操作會立即回退對於此頁面的所選更改。",
"confirm-mcrrestore-title": "還原修訂",
"confirm-mcrundo-title": "還原變更",
"mcrundofailed": "還原失敗",
'user',
'page_restrictions'
];
- $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
+ $db->lockTables( $read, $write, __CLASS__ . '-searchIndexLock' );
}
/**
* @param IMaintainableDatabase &$db
*/
private function unlockSearchindex( $db ) {
- $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
+ $db->unlockTables( __CLASS__ . '-searchIndexLock' );
}
/**
* @ingroup Maintenance
*/
class MigrateActors extends LoggedUpdateMaintenance {
+
+ protected $tables = null;
+
public function __construct() {
parent::__construct();
$this->addDescription( 'Migrates actors from pre-1.31 columns to the \'actor\' table' );
+ $this->addOption( 'tables', 'List of tables to process, comma-separated', false, true );
$this->setBatchSize( 100 );
}
return __CLASS__;
}
+ protected function doTable( $table ) {
+ return $this->tables === null || in_array( $table, $this->tables, true );
+ }
+
protected function doDBUpdates() {
global $wgActorTableSchemaMigrationStage;
return false;
}
- $this->output( "Creating actor entries for all registered users\n" );
- $end = 0;
- $dbw = $this->getDB( DB_MASTER );
- $max = $dbw->selectField( 'user', 'MAX(user_id)', '', __METHOD__ );
- $count = 0;
- while ( $end < $max ) {
- $start = $end + 1;
- $end = min( $start + $this->mBatchSize, $max );
- $this->output( "... $start - $end\n" );
- $dbw->insertSelect(
- 'actor',
- 'user',
- [ 'actor_user' => 'user_id', 'actor_name' => 'user_name' ],
- [ "user_id >= $start", "user_id <= $end" ],
+ $tables = $this->getOption( 'tables' );
+ if ( $tables !== null ) {
+ $this->tables = explode( ',', $tables );
+ }
+
+ if ( $this->doTable( 'user' ) ) {
+ $this->output( "Creating actor entries for all registered users\n" );
+ $end = 0;
+ $dbw = $this->getDB( DB_MASTER );
+ $max = $dbw->selectField( 'user', 'MAX(user_id)', '', __METHOD__ );
+ $count = 0;
+ while ( $end < $max ) {
+ $start = $end + 1;
+ $end = min( $start + $this->mBatchSize, $max );
+ $this->output( "... $start - $end\n" );
+ $dbw->insertSelect(
+ 'actor',
+ 'user',
+ [ 'actor_user' => 'user_id', 'actor_name' => 'user_name' ],
+ [ "user_id >= $start", "user_id <= $end" ],
+ __METHOD__,
+ [ 'IGNORE' ],
+ [ 'ORDER BY' => [ 'user_id' ] ]
+ );
+ $count += $dbw->affectedRows();
+ wfWaitForSlaves();
+ }
+ $this->output( "Completed actor creation, added $count new actor(s)\n" );
+ } else {
+ $this->output( "Checking that actors exist for all registered users\n" );
+ $dbr = $this->getDB( DB_REPLICA, [ 'vslow' ] );
+ $anyMissing = $dbr->selectField(
+ [ 'user', 'actor' ],
+ '1',
+ [ 'actor_id' => null ],
__METHOD__,
- [ 'IGNORE' ],
- [ 'ORDER BY' => [ 'user_id' ] ]
+ [ 'LIMIT 1' ],
+ [ 'actor' => [ 'LEFT JOIN', 'actor_user = user_id' ] ]
);
- $count += $dbw->affectedRows();
- wfWaitForSlaves();
+ if ( $anyMissing ) {
+ $this->error( 'Some users lack actors; run without --tables or include `user` in --tables.' );
+ return false;
+ }
+ $this->output( "Ok, continuing.\n" );
}
- $this->output( "Completed actor creation, added $count new actor(s)\n" );
$errors = 0;
$errors += $this->migrateToTemp(
* @return int Number of errors
*/
protected function migrate( $table, $primaryKey, $userField, $nameField, $actorField ) {
+ if ( !$this->doTable( $table ) ) {
+ $this->output( "Skipping $table, not included in --tables\n" );
+ return 0;
+ }
+
$complainedAboutUsers = [];
$primaryKey = (array)$primaryKey;
protected function migrateToTemp(
$table, $primaryKey, $extra, $userField, $nameField, $newPrimaryKey, $actorField
) {
+ if ( !$this->doTable( $table ) ) {
+ $this->output( "Skipping $table, not included in --tables\n" );
+ return 0;
+ }
+
$complainedAboutUsers = [];
$newTable = $table . '_actor_temp';
* @return int Number of errors
*/
protected function migrateLogSearch() {
+ if ( !$this->doTable( 'log_search' ) ) {
+ $this->output( "Skipping log_search, not included in --tables\n" );
+ return 0;
+ }
+
$complainedAboutUsers = [];
$primaryKey = [ 'ls_value', 'ls_log_id' ];
$countActors = 0;
$countErrors = 0;
+ $anyBad = $dbw->selectField(
+ 'log_search',
+ 1,
+ [ 'ls_field' => 'target_author_actor', 'ls_value' => '' ],
+ __METHOD__,
+ [ 'LIMIT' => 1 ]
+ );
+ if ( $anyBad ) {
+ $this->output( "... Deleting bogus rows due to T21552\n" );
+ $dbw->delete(
+ 'log_search',
+ [ 'ls_field' => 'target_author_actor', 'ls_value' => '' ],
+ __METHOD__
+ );
+ $ct = $dbw->affectedRows();
+ $this->output( "... Deleted $ct bogus row(s) from T21552\n" );
+ wfWaitForSlaves();
+ }
+
$next = '1=1';
while ( true ) {
// Fetch the rows needing update
$form.appendTo( 'body' ).trigger( 'submit' );
};
- $( '.mw-rollback-link a' ).each( function () {
- $( this ).confirmable( {
- i18n: {
- confirm: mw.msg( 'rollback-confirmation-confirm', $( this ).data( 'rollback-count' ) ),
- yes: mw.msg( 'rollback-confirmation-yes' ),
- no: mw.msg( 'rollback-confirmation-no' )
- },
- handler: function ( e ) {
- e.preventDefault();
- postRollback( $( this ).attr( 'href' ) );
- }
- } );
+ $( '#mw-content-text' ).confirmable( {
+ i18n: {
+ confirm: mw.msg( 'rollback-confirmation-confirm' ),
+ yes: mw.msg( 'rollback-confirmation-yes' ),
+ no: mw.msg( 'rollback-confirmation-no' )
+ },
+ delegate: '.mw-rollback-link a[data-mw="interface"]',
+ handler: function ( e ) {
+ e.preventDefault();
+ postRollback( $( this ).attr( 'href' ) );
+ }
} );
}() );
/**
* Provides various methods needed for formatting dates and times. This
- * implementation implments the [Discordian calendar][1], mainly for testing with
+ * implementation implements the [Discordian calendar][1], mainly for testing with
* something very different from the usual Gregorian calendar.
*
* Being intended mainly for testing, niceties like i18n and better
<?php
-
-// If xdebug is enabled, we need to increase the nesting level for phan
-ini_set( 'xdebug.max_nesting_level', 1000 );
-
/**
- * This configuration will be read and overlayed on top of the
- * default configuration. Command line arguments will be applied
- * after this file is read.
- *
- * @see src/Phan/Config.php
- * See Config for all configurable options.
+ * 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.
*
- * A Note About Paths
- * ==================
+ * 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.
*
- * Files referenced from this file should be defined as
+ * 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
*
- * ```
- * Config::projectPath('relative_path/to/file')
- * ```
- *
- * where the relative path is relative to the root of the
- * project which is defined as either the working directory
- * of the phan executable or a path passed in via the CLI
- * '-d' flag.
+ * @file
*/
-return [
- /**
- * A list of individual files to include in analysis
- * with a path relative to the root directory of the
- * project. directory_list won't find .inc files so
- * we augment it here.
- */
- 'file_list' => array_merge(
- function_exists( 'register_postsend_function' ) ? [] : [ 'tests/phan/stubs/hhvm.php' ],
- function_exists( 'wikidiff2_do_diff' ) ? [] : [ 'tests/phan/stubs/wikidiff.php' ],
- function_exists( 'tideways_enable' ) ? [] : [ 'tests/phan/stubs/tideways.php' ],
- class_exists( PEAR::class ) ? [] : [ 'tests/phan/stubs/mail.php' ],
- class_exists( Memcached::class ) ? [] : [ 'tests/phan/stubs/memcached.php' ],
- // Per composer.json, PHPUnit 6 is used for PHP 7.0+, PHPUnit 4 otherwise.
- // Load the interface for the version of PHPUnit that isn't installed.
- // Phan only supports PHP 7.0+ (and not HHVM), so we only need to stub PHPUnit 4.
- class_exists( PHPUnit_TextUI_Command::class ) ? [] : [ 'tests/phan/stubs/phpunit4.php' ],
- class_exists( ProfilerExcimer::class ) ? [] : [ 'tests/phan/stubs/excimer.php' ],
- [
- 'maintenance/7zip.inc',
- 'maintenance/cleanupTable.inc',
- 'maintenance/CodeCleanerGlobalsPass.inc',
- 'maintenance/commandLine.inc',
- 'maintenance/sqlite.inc',
- 'maintenance/userDupes.inc',
- 'maintenance/language/checkLanguage.inc',
- 'maintenance/language/languages.inc',
- ]
- ),
-
- /**
- * A list of directories that should be parsed for class and
- * method information. After excluding the directories
- * defined in exclude_analysis_directory_list, the remaining
- * files will be statically analyzed for errors.
- *
- * Thus, both first-party and third-party code being used by
- * your application should be included in this list.
- */
- 'directory_list' => [
- 'includes/',
- 'languages/',
- 'maintenance/',
- 'mw-config/',
- 'resources/',
- 'vendor/',
- ],
-
- /**
- * A file list that defines files that will be excluded
- * from parsing and analysis and will not be read at all.
- *
- * This is useful for excluding hopelessly unanalyzable
- * files that can't be removed for whatever reason.
- */
- 'exclude_file_list' => [],
-
- /**
- * A list of directories holding code that we want
- * to parse, but not analyze. Also works for individual
- * files.
- */
- "exclude_analysis_directory_list" => [
- 'vendor/',
- 'tests/phan/stubs/',
- // The referenced classes are not available in vendor, only when
- // included from composer.
- 'includes/composer/',
- // Directly references classes that only exist in Translate extension
- 'maintenance/language/',
- // External class
- 'includes/libs/jsminplus.php',
- ],
-
- /**
- * Backwards Compatibility Checking. This is slow
- * and expensive, but you should consider running
- * it before upgrading your version of PHP to a
- * new version that has backward compatibility
- * breaks.
- */
- 'backward_compatibility_checks' => false,
-
- /**
- * A set of fully qualified class-names for which
- * a call to parent::__construct() is required
- */
- 'parent_constructor_required' => [
- ],
-
- /**
- * Run a quick version of checks that takes less
- * time at the cost of not running as thorough
- * an analysis. You should consider setting this
- * to true only when you wish you had more issues
- * to fix in your code base.
- *
- * In quick-mode the scanner doesn't rescan a function
- * or a method's code block every time a call is seen.
- * This means that the problem here won't be detected:
- *
- * ```php
- * <?php
- * function test($arg):int {
- * return $arg;
- * }
- * test("abc");
- * ```
- *
- * This would normally generate:
- *
- * ```sh
- * test.php:3 TypeError return string but `test()` is declared to return int
- * ```
- *
- * The initial scan of the function's code block has no
- * type information for `$arg`. It isn't until we see
- * the call and rescan test()'s code block that we can
- * detect that it is actually returning the passed in
- * `string` instead of an `int` as declared.
- */
- 'quick_mode' => false,
-
- /**
- * By default, Phan will not analyze all node types
- * in order to save time. If this config is set to true,
- * Phan will dig deeper into the AST tree and do an
- * analysis on all nodes, possibly finding more issues.
- *
- * See \Phan\Analysis::shouldVisit for the set of skipped
- * nodes.
- */
- 'should_visit_all_nodes' => true,
-
- /**
- * If enabled, check all methods that override a
- * parent method to make sure its signature is
- * compatible with the parent's. This check
- * can add quite a bit of time to the analysis.
- */
- 'analyze_signature_compatibility' => true,
-
- // Emit all issues. They are then suppressed via
- // suppress_issue_types, rather than a minimum
- // severity.
- "minimum_severity" => 0,
-
- /**
- * If true, missing properties will be created when
- * they are first seen. If false, we'll report an
- * error message if there is an attempt to write
- * to a class property that wasn't explicitly
- * defined.
- */
- 'allow_missing_properties' => false,
-
- /**
- * Allow null to be cast as any type and for any
- * type to be cast to null. Setting this to false
- * will cut down on false positives.
- */
- 'null_casts_as_any_type' => true,
-
- /**
- * If enabled, scalars (int, float, bool, string, null)
- * are treated as if they can cast to each other.
- *
- * MediaWiki is pretty lax and uses many scalar
- * types interchangably.
- */
- 'scalar_implicit_cast' => true,
-
- /**
- * If true, seemingly undeclared variables in the global
- * scope will be ignored. This is useful for projects
- * with complicated cross-file globals that you have no
- * hope of fixing.
- */
- 'ignore_undeclared_variables_in_global_scope' => true,
- /**
- * Set to true in order to attempt to detect dead
- * (unreferenced) code. Keep in mind that the
- * results will only be a guess given that classes,
- * properties, constants and methods can be referenced
- * as variables (like `$class->$property` or
- * `$class->$method()`) in ways that we're unable
- * to make sense of.
- */
- 'dead_code_detection' => false,
-
- /**
- * If true, the dead code detection rig will
- * prefer false negatives (not report dead code) to
- * false positives (report dead code that is not
- * actually dead) which is to say that the graph of
- * references will create too many edges rather than
- * too few edges when guesses have to be made about
- * what references what.
- */
- 'dead_code_detection_prefer_false_negative' => true,
-
- /**
- * If disabled, Phan will not read docblock type
- * annotation comments (such as for @return, @param,
- * @var, @suppress, @deprecated) and only rely on
- * types expressed in code.
- */
- 'read_type_annotations' => true,
-
- /**
- * If a file path is given, the code base will be
- * read from and written to the given location in
- * order to attempt to save some work from being
- * done. Only changed files will get analyzed if
- * the file is read
- */
- 'stored_state_file_path' => null,
-
- /**
- * Set to true in order to ignore issue suppression.
- * This is useful for testing the state of your code, but
- * unlikely to be useful outside of that.
- */
- 'disable_suppression' => false,
-
- /**
- * If set to true, we'll dump the AST instead of
- * analyzing files
- */
- 'dump_ast' => false,
-
- /**
- * If set to a string, we'll dump the fully qualified lowercase
- * function and method signatures instead of analyzing files.
- */
- 'dump_signatures_file' => null,
-
- /**
- * If true (and if stored_state_file_path is set) we'll
- * look at the list of files passed in and expand the list
- * to include files that depend on the given files
- */
- 'expand_file_list' => false,
-
- // Include a progress bar in the output
- 'progress_bar' => false,
-
- /**
- * The probability of actually emitting any progress
- * bar update. Setting this to something very low
- * is good for reducing network IO and filling up
- * your terminal's buffer when running phan on a
- * remote host.
- */
- 'progress_bar_sample_rate' => 0.005,
-
- /**
- * The number of processes to fork off during the analysis
- * phase.
- */
- 'processes' => 1,
-
- /**
- * Add any issue types (such as 'PhanUndeclaredMethod')
- * to this black-list to inhibit them from being reported.
- */
- 'suppress_issue_types' => [
- // approximate error count: 29
- "PhanCommentParamOnEmptyParamList",
- // approximate error count: 33
- "PhanCommentParamWithoutRealParam",
- // approximate error count: 8
- "PhanDeprecatedClass",
- // approximate error count: 415
- "PhanDeprecatedFunction",
- // approximate error count: 25
- "PhanDeprecatedProperty",
- // approximate error count: 17
- "PhanNonClassMethodCall",
- // approximate error count: 888
- "PhanParamSignatureMismatch",
- // approximate error count: 7
- "PhanParamSignatureMismatchInternal",
- // approximate error count: 1
- "PhanParamSignatureRealMismatchTooFewParameters",
- // approximate error count: 125
- "PhanParamTooMany",
- // approximate error count: 3
- "PhanParamTooManyInternal",
- // approximate error count: 2
- "PhanTraitParentReference",
- // approximate error count: 3
- "PhanTypeComparisonFromArray",
- // approximate error count: 2
- "PhanTypeComparisonToArray",
- // approximate error count: 218
- "PhanTypeMismatchArgument",
- // approximate error count: 13
- "PhanTypeMismatchArgumentInternal",
- // approximate error count: 5
- "PhanTypeMismatchDimAssignment",
- // approximate error count: 2
- "PhanTypeMismatchDimEmpty",
- // approximate error count: 1
- "PhanTypeMismatchDimFetch",
- // approximate error count: 14
- "PhanTypeMismatchForeach",
- // approximate error count: 56
- "PhanTypeMismatchProperty",
- // approximate error count: 74
- "PhanTypeMismatchReturn",
- // approximate error count: 5
- "PhanTypeNonVarPassByRef",
- // approximate error count: 32
- "PhanUndeclaredConstant",
- // approximate error count: 233
- "PhanUndeclaredMethod",
- // approximate error count: 1224
- "PhanUndeclaredProperty",
- // approximate error count: 58
- "PhanUndeclaredVariableDim",
- ],
-
- /**
- * If empty, no filter against issues types will be applied.
- * If this white-list is non-empty, only issues within the list
- * will be emitted by Phan.
- */
- 'whitelist_issue_types' => [
- // 'PhanAccessMethodPrivate',
- // 'PhanAccessMethodProtected',
- // 'PhanAccessNonStaticToStatic',
- // 'PhanAccessPropertyPrivate',
- // 'PhanAccessPropertyProtected',
- // 'PhanAccessSignatureMismatch',
- // 'PhanAccessSignatureMismatchInternal',
- // 'PhanAccessStaticToNonStatic',
- // 'PhanCompatibleExpressionPHP7',
- // 'PhanCompatiblePHP7',
- // 'PhanContextNotObject',
- // 'PhanDeprecatedClass',
- // 'PhanDeprecatedFunction',
- // 'PhanDeprecatedProperty',
- // 'PhanEmptyFile',
- // 'PhanNonClassMethodCall',
- // 'PhanNoopArray',
- // 'PhanNoopClosure',
- // 'PhanNoopConstant',
- // 'PhanNoopProperty',
- // 'PhanNoopVariable',
- // 'PhanParamRedefined',
- // 'PhanParamReqAfterOpt',
- // 'PhanParamSignatureMismatch',
- // 'PhanParamSignatureMismatchInternal',
- // 'PhanParamSpecial1',
- // 'PhanParamSpecial2',
- // 'PhanParamSpecial3',
- // 'PhanParamSpecial4',
- // 'PhanParamTooFew',
- // 'PhanParamTooFewInternal',
- // 'PhanParamTooMany',
- // 'PhanParamTooManyInternal',
- // 'PhanParamTypeMismatch',
- // 'PhanParentlessClass',
- // 'PhanRedefineClass',
- // 'PhanRedefineClassInternal',
- // 'PhanRedefineFunction',
- // 'PhanRedefineFunctionInternal',
- // 'PhanStaticCallToNonStatic',
- // 'PhanSyntaxError',
- // 'PhanTraitParentReference',
- // 'PhanTypeArrayOperator',
- // 'PhanTypeArraySuspicious',
- // 'PhanTypeComparisonFromArray',
- // 'PhanTypeComparisonToArray',
- // 'PhanTypeConversionFromArray',
- // 'PhanTypeInstantiateAbstract',
- // 'PhanTypeInstantiateInterface',
- // 'PhanTypeInvalidLeftOperand',
- // 'PhanTypeInvalidRightOperand',
- // 'PhanTypeMismatchArgument',
- // 'PhanTypeMismatchArgumentInternal',
- // 'PhanTypeMismatchDefault',
- // 'PhanTypeMismatchForeach',
- // 'PhanTypeMismatchProperty',
- // 'PhanTypeMismatchReturn',
- // 'PhanTypeMissingReturn',
- // 'PhanTypeNonVarPassByRef',
- // 'PhanTypeParentConstructorCalled',
- // 'PhanTypeVoidAssignment',
- // 'PhanUnanalyzable',
- // 'PhanUndeclaredClass',
- // 'PhanUndeclaredClassCatch',
- // 'PhanUndeclaredClassConstant',
- // 'PhanUndeclaredClassInstanceof',
- // 'PhanUndeclaredClassMethod',
- // 'PhanUndeclaredClassReference',
- // 'PhanUndeclaredConstant',
- // 'PhanUndeclaredExtendedClass',
- // 'PhanUndeclaredFunction',
- // 'PhanUndeclaredInterface',
- // 'PhanUndeclaredMethod',
- // 'PhanUndeclaredProperty',
- // 'PhanUndeclaredStaticMethod',
- // 'PhanUndeclaredStaticProperty',
- // 'PhanUndeclaredTrait',
- // 'PhanUndeclaredTypeParameter',
- // 'PhanUndeclaredTypeProperty',
- // 'PhanUndeclaredVariable',
- // 'PhanUnreferencedClass',
- // 'PhanUnreferencedConstant',
- // 'PhanUnreferencedMethod',
- // 'PhanUnreferencedProperty',
- // 'PhanVariableUseClause',
- ],
-
- /**
- * Override to hardcode existence and types of (non-builtin) globals in the global scope.
- * Class names must be prefixed with '\\'.
- * (E.g. ['_FOO' => '\\FooClass', 'page' => '\\PageClass', 'userId' => 'int'])
- */
- 'globals_type_map' => [
- 'IP' => 'string',
- ],
-
- // Emit issue messages with markdown formatting
- 'markdown_issue_messages' => false,
-
- /**
- * Enable or disable support for generic templated
- * class types.
- */
- 'generic_types_enabled' => true,
+$cfg = require __DIR__ . '/../../vendor/mediawiki/mediawiki-phan-config/src/config.php';
+
+$cfg['file_list'] = array_merge(
+ $cfg['file_list'],
+ function_exists( 'register_postsend_function' ) ? [] : [ 'tests/phan/stubs/hhvm.php' ],
+ function_exists( 'wikidiff2_do_diff' ) ? [] : [ 'tests/phan/stubs/wikidiff.php' ],
+ function_exists( 'tideways_enable' ) ? [] : [ 'tests/phan/stubs/tideways.php' ],
+ class_exists( PEAR::class ) ? [] : [ 'tests/phan/stubs/mail.php' ],
+ class_exists( Memcached::class ) ? [] : [ 'tests/phan/stubs/memcached.php' ],
+ // Per composer.json, PHPUnit 6 is used for PHP 7.0+, PHPUnit 4 otherwise.
+ // Load the interface for the version of PHPUnit that isn't installed.
+ // Phan only supports PHP 7.0+ (and not HHVM), so we only need to stub PHPUnit 4.
+ class_exists( PHPUnit_TextUI_Command::class ) ? [] : [ 'tests/phan/stubs/phpunit4.php' ],
+ class_exists( ProfilerExcimer::class ) ? [] : [ 'tests/phan/stubs/excimer.php' ],
+ [
+ 'maintenance/7zip.inc',
+ 'maintenance/cleanupTable.inc',
+ 'maintenance/CodeCleanerGlobalsPass.inc',
+ 'maintenance/commandLine.inc',
+ 'maintenance/sqlite.inc',
+ 'maintenance/userDupes.inc',
+ 'maintenance/language/checkLanguage.inc',
+ 'maintenance/language/languages.inc',
+ ]
+);
+
+$cfg['directory_list'] = [
+ 'includes/',
+ 'languages/',
+ 'maintenance/',
+ 'mw-config/',
+ 'resources/',
+ 'vendor/',
+];
- // A list of plugin files to execute
- 'plugins' => [
- ],
+$cfg['exclude_analysis_directory_list'] = [
+ 'vendor/',
+ 'tests/phan/stubs/',
+ // The referenced classes are not available in vendor, only when
+ // included from composer.
+ 'includes/composer/',
+ // Directly references classes that only exist in Translate extension
+ 'maintenance/language/',
+ // External class
+ 'includes/libs/jsminplus.php',
];
+
+$cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
+ // approximate error count: 29
+ "PhanCommentParamOnEmptyParamList",
+ // approximate error count: 33
+ "PhanCommentParamWithoutRealParam",
+ // approximate error count: 17
+ "PhanNonClassMethodCall",
+ // approximate error count: 888
+ "PhanParamSignatureMismatch",
+ // approximate error count: 7
+ "PhanParamSignatureMismatchInternal",
+ // approximate error count: 1
+ "PhanParamSignatureRealMismatchTooFewParameters",
+ // approximate error count: 125
+ "PhanParamTooMany",
+ // approximate error count: 3
+ "PhanParamTooManyInternal",
+ // approximate error count: 2
+ "PhanTraitParentReference",
+ // approximate error count: 3
+ "PhanTypeComparisonFromArray",
+ // approximate error count: 2
+ "PhanTypeComparisonToArray",
+ // approximate error count: 218
+ "PhanTypeMismatchArgument",
+ // approximate error count: 13
+ "PhanTypeMismatchArgumentInternal",
+ // approximate error count: 5
+ "PhanTypeMismatchDimAssignment",
+ // approximate error count: 2
+ "PhanTypeMismatchDimEmpty",
+ // approximate error count: 1
+ "PhanTypeMismatchDimFetch",
+ // approximate error count: 14
+ "PhanTypeMismatchForeach",
+ // approximate error count: 56
+ "PhanTypeMismatchProperty",
+ // approximate error count: 74
+ "PhanTypeMismatchReturn",
+ // approximate error count: 5
+ "PhanTypeNonVarPassByRef",
+ // approximate error count: 32
+ "PhanUndeclaredConstant",
+ // approximate error count: 233
+ "PhanUndeclaredMethod",
+ // approximate error count: 1224
+ "PhanUndeclaredProperty",
+ // approximate error count: 58
+ "PhanUndeclaredVariableDim",
+] );
+
+$cfg['ignore_undeclared_variables_in_global_scope'] = true;
+$cfg['globals_type_map']['IP'] = 'string';
+
+return $cfg;
$this->assertEquals( $exResult, $block->mReason, 'Correct block type for XFF header ' . $xff );
}
- /**
- * @covers Block::__construct
- */
- public function testDeprecatedConstructor() {
- $this->hideDeprecated( 'Block::__construct with multiple arguments' );
- $username = 'UnthinkablySecretRandomUsername';
- $reason = 'being irrational';
-
- # Set up the target
- $u = User::newFromName( $username );
- if ( $u->getId() == 0 ) {
- $u->addToDatabase();
- TestUser::setPasswordForUser( $u, 'TotallyObvious' );
- }
- unset( $u );
-
- # Make sure the user isn't blocked
- $this->assertNull(
- Block::newFromTarget( $username ),
- "$username should not be blocked"
- );
-
- # Perform the block
- $block = new Block(
- /* address */ $username,
- /* user */ 0,
- /* by */ $this->getTestSysop()->getUser()->getId(),
- /* reason */ $reason,
- /* timestamp */ 0,
- /* auto */ false,
- /* expiry */ 0
- );
- $block->insert();
-
- # Check target
- $this->assertEquals(
- $block->getTarget()->getName(),
- $username,
- "Target should be set properly"
- );
-
- # Check supplied parameter
- $this->assertEquals(
- $block->mReason,
- $reason,
- "Reason should be non-default"
- );
-
- # Check default parameter
- $this->assertFalse(
- (bool)$block->appliesToRight( 'createaccount' ),
- "Account creation should not be blocked by default"
- );
- }
-
/**
* @covers Block::getSystemBlockType
* @covers Block::insert
);
}
- public static function provideEquals() {
- return [
- [ 'Main Page', 'Main Page', true ],
- [ 'Main Page', 'Not The Main Page', false ],
- [ 'Main Page', 'Project:Main Page', false ],
- [ 'File:Example.png', 'Image:Example.png', true ],
- [ 'Special:Version', 'Special:Version', true ],
- [ 'Special:Version', 'Special:Recentchanges', false ],
- [ 'Special:Version', 'Main Page', false ],
- ];
- }
-
- /**
- * @dataProvider provideEquals
- * @covers Title::equals
- */
- public function testEquals( $titleA, $titleB, $expectedBool ) {
- $titleA = Title::newFromText( $titleA );
- $titleB = Title::newFromText( $titleB );
-
- $this->assertEquals( $expectedBool, $titleA->equals( $titleB ) );
- $this->assertEquals( $expectedBool, $titleB->equals( $titleA ) );
- }
-
public static function provideInNamespace() {
return [
[ 'Main Page', NS_MAIN, true ],
[ 'Main Page', false ],
];
}
+
+ public function provideEquals() {
+ yield [
+ Title::newFromText( 'Main Page' ),
+ Title::newFromText( 'Main Page' ),
+ true
+ ];
+ yield [
+ Title::newFromText( 'Main Page' ),
+ Title::newFromText( 'Not The Main Page' ),
+ false
+ ];
+ yield [
+ Title::newFromText( 'Main Page' ),
+ Title::newFromText( 'Project:Main Page' ),
+ false
+ ];
+ yield [
+ Title::newFromText( 'File:Example.png' ),
+ Title::newFromText( 'Image:Example.png' ),
+ true
+ ];
+ yield [
+ Title::newFromText( 'Special:Version' ),
+ Title::newFromText( 'Special:Version' ),
+ true
+ ];
+ yield [
+ Title::newFromText( 'Special:Version' ),
+ Title::newFromText( 'Special:Recentchanges' ),
+ false
+ ];
+ yield [
+ Title::newFromText( 'Special:Version' ),
+ Title::newFromText( 'Main Page' ),
+ false
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
+ Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
+ true
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
+ Title::makeTitle( NS_MAIN, 'Bar', '', '' ),
+ false
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
+ Title::makeTitle( NS_TALK, 'Foo', '', '' ),
+ false
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
+ Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
+ true
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
+ Title::makeTitle( NS_MAIN, 'Foo', 'Baz', '' ),
+ true
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', 'Bar', '' ),
+ Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
+ true
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', '', 'baz' ),
+ Title::makeTitle( NS_MAIN, 'Foo', '', 'baz' ),
+ true
+ ];
+ yield [
+ Title::makeTitle( NS_MAIN, 'Foo', '', '' ),
+ Title::makeTitle( NS_MAIN, 'Foo', '', 'baz' ),
+ false
+ ];
+ }
+
+ /**
+ * @covers Title::equals
+ * @dataProvider provideEquals
+ */
+ public function testEquals( Title $firstValue, /* LinkTarget */ $secondValue, $expectedSame ) {
+ $this->assertSame(
+ $expectedSame,
+ $firstValue->equals( $secondValue )
+ );
+ }
}
<?php
use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
/**
* @group Database
* @param string $title Title of page to be created
* @param string $lang Language and content of the created page
* @param string|null $content Content of the created page, or null for a generic string
+ *
+ * @return Revision
*/
protected function makePage( $title, $lang, $content = null ) {
if ( $content === null ) {
$title = Title::newFromText( $title, NS_MEDIAWIKI );
$wikiPage = new WikiPage( $title );
$contentHandler = ContentHandler::makeContent( $content, $title );
- $wikiPage->doEditContent( $contentHandler, "$lang translation test case" );
+ $status = $wikiPage->doEditContent( $contentHandler, "$lang translation test case" );
+
+ // sanity
+ $this->assertTrue( $status->isOK(), 'Create page ' . $title->getPrefixedDBkey() );
+ return $status->value['revision'];
}
/**
$this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries" );
}
+
+ /**
+ * Regression test for T218918
+ */
+ public function testLoadFromDB_fetchLatestRevision() {
+ // Create three revisions of the same message page.
+ // Must be an existing message key.
+ $key = 'Log';
+ $this->makePage( $key, 'de', 'Test eins' );
+ $this->makePage( $key, 'de', 'Test zwei' );
+ $r3 = $this->makePage( $key, 'de', 'Test drei' );
+
+ // Create an out-of-sequence revision by importing a
+ // revision with an old timestamp. Hacky.
+ $importRevision = new WikiRevision( new HashConfig() );
+ $importRevision->setTitle( $r3->getTitle() );
+ $importRevision->setComment( 'Imported edit' );
+ $importRevision->setTimestamp( '19991122334455' );
+ $importRevision->setText( 'IMPORTED OLD TEST' );
+ $importRevision->setUsername( 'Alan Smithee' );
+
+ $importer = MediaWikiServices::getInstance()->getWikiRevisionOldRevisionImporterNoUpdates();
+ $importer->import( $importRevision );
+
+ // Now, load the message from the wiki page
+ MessageCache::destroyInstance();
+ $messageCache = MessageCache::singleton();
+ $messageCache->enable();
+ $messageCache = TestingAccessWrapper::newFromObject( $messageCache );
+
+ $cache = $messageCache->loadFromDB( 'de' );
+
+ $this->assertArrayHasKey( $key, $cache );
+
+ // Text in the cache has an extra space in front!
+ $this->assertSame( ' ' . 'Test drei', $cache[$key] );
+ }
+
}
->disableOriginalConstructor()
->getMock();
- $db->method( 'select' )->willReturn( new FakeResultWrapper( [] ) );
+ $open = true;
+ $db->method( 'select' )->willReturnCallback( function () use ( &$open ) {
+ if ( !$open ) {
+ throw new LogicException( "Not open" );
+ }
+
+ return new FakeResultWrapper( [] );
+ } );
+ $db->method( 'close' )->willReturnCallback( function () use ( &$open ) {
+ $open = false;
+
+ return true;
+ } );
+ $db->method( 'isOpen' )->willReturnCallback( function () use ( &$open ) {
+ return $open;
+ } );
+ $db->method( 'open' )->willReturnCallback( function () use ( &$open ) {
+ $open = true;
+
+ return $open;
+ } );
$db->method( '__toString' )->willReturn( 'MOCK_DB' );
return $db;
$this->assertSame( 'dummy', $ref->getDomainID() );
}
+ /**
+ * @covers Wikimedia\Rdbms\DBConnRef::select
+ */
public function testSelect() {
// select should get passed through normally
$ref = $this->getDBConnRef();
$this->assertInternalType( 'string', $ref->__toString() );
}
+ /**
+ * @covers Wikimedia\Rdbms\DBConnRef::close
+ * @expectedException \Wikimedia\Rdbms\DBUnexpectedError
+ */
+ public function testClose() {
+ $lb = $this->getLoadBalancerMock();
+ $ref = new DBConnRef( $lb, [ DB_REPLICA, [], 'dummy', 0 ] );
+ $ref->close();
+ }
}
$this->fail( 'Expected exception not thrown' );
} catch ( \BadMethodCallException $ex ) {
$this->assertSame(
- 'MediaWiki\\Session\\SessionProvider::preventSessionsForUser must be implmented ' .
+ 'MediaWiki\\Session\\SessionProvider::preventSessionsForUser must be implemented ' .
'when canChangeUser() is false',
$ex->getMessage()
);
HistoryPage.rollback.click();
- assert.strictEqual( HistoryPage.rollbackConfirmable.getText(), 'Rollback of one edit?' );
+ assert.strictEqual( HistoryPage.rollbackConfirmable.getText(), 'Please confirm:' );
assert.strictEqual( HistoryPage.rollbackConfirmableYes.getText(), 'Rollback' );
assert.strictEqual( HistoryPage.rollbackConfirmableNo.getText(), 'Cancel' );
} );